« 「翻訳に活かすSimplyTerms」(翻訳フォーラム・レッスンシリーズ#5) | トップページ | トランスクリエーション? »

2017年2月16日 (木)

和暦を西暦に変換する秀丸マクロ

ブログ「翻訳のサロン」に「計算して置換 和暦西暦の換算」という記事を書いたとSNSの翻訳者コミュニティに書かれたのを読み、そういえば似たようなものを大昔に作ったような……と思って使わなくなったマクロの置き場をあさったら、やはり、ありました。

年月日、年月、月日、年のみに対応、年は昭和・平成の両対応とそれなりに高機能なのですが、もともとの形式がh3/8/1のような形式でなければなりません。また、カーソルが入力した日付の最後にある状態で走らせる必要があります。20年も前に作ったもので、日付も手入力することが前提となっているからです。原稿がまだ紙でしか提供されない時代でしたし、日本語のOCRは使い物にならず日英はすべて手で入力が前提でしたので。

「年月日」の漢字対応にすれば、検索して一気にということも可能ですね。このマクロのようなスラッシュだと日付以外にもいろいろありえるため、検索して自動的にすべてを処理してしまうのは誤訳につながりそうで怖いと思いますけど。

スクリプトをアップロードしておきますので、適宜切り出して利用するなり、全体を改造して使うなり、ご自由にどうぞ。私はもう長いこと使っていないマクロなのですが、まだ需要があるのであれば。

----------------------------------------

cnv_date.mac

//
// 日付変換マクロ Ver 2.00
//               1997/08/21     井口  耕二
//
// ・日付を英語表記に変換する。
// ・下記のように日付を記入し、カーソルが入力した日付の最後にある状態で
//  マクロを走らせる(選択は不要)。
//
// ・年または日は省略可能(その際、はじの"/"も省略可)。
// ・年のみも変換する。
// ・昭和は"s"または"S"、平成は"h"または"H"と表記する。
// ・西暦の年は4桁入力すること。
// ・変換例:h3/8/1  → August 1, 1991
//      1991/8  → August, 1991
//      8/1     → August 1
//      s56     → 1981

//#FEP=imestate;
//if (#FEP==1) imeswitch;        //漢字ONなら、いったん解除
main:

//    変数初期化
    ##return  = 0x0D;
    ##slsh_locat = 0;                //"/"の位置を格納する変数
    $$str_wo_prd = "";                //中黒を取り除いた単語

//    変換元日付をテキストから取得する。
    beginsel;
    left;
    while (code != ascii(" ") && code != ##return) left;
    right;
    call set_area;
    $$str_org = gettext(#beginx, #beginy, #endx, #endy);
    moveto #beginx, #beginy; beginsel; moveto #endx, #endy;
    delete;

//    年月日切り出し
//    年切り出し
    ##slsh_locat = strstr ($$str_org, "/");
    if (##slsh_locat == -1){    //年しか入力されていない。"/"なし。
        $$year  = $$str_org;
        $$month = "";
        $$day   = "";
    } else {
        $$year = leftstr($$str_org, ##slsh_locat);
        $$str_org  = rightstr($$str_org, strlen($$str_org)-##slsh_locat-1);
//        月切り出し
        if (leftstr($$year,1) != "s" && leftstr($$year, 1) != "S" &&
        leftstr($$year,1) != "h" && leftstr($$year, 1) != "H" &&
        $$year != "" && val($$year) <= 12) {    //最初の"/"省略と見なす
            $$month = $$year;
            $$year = "";
        } else {
            ##slsh_locat = strstr ($$str_org, "/");
            if (##slsh_locat == -1){
                $$month = $$str_org;
                $$str_org  = "";
            } else {
                $$month = leftstr($$str_org, ##slsh_locat);
                $$str_org  = rightstr($$str_org, strlen($$str_org)-##slsh_locat-1);
            }
        }
//        日切り出し
        ##slsh_locat = strstr ($$str_org, "/");
        if (##slsh_locat == -1) {
            $$day = $$str_org;
        } else {
            $$day = leftstr($$str_org, ##slsh_locat);
        }
        ##return_locat = strstr($$day, str(##return));
        if (##return_locat != -1){
            $$day = leftstr($$str_org, ##return_locat-1);
        }
    }

//    年の変換
    if (leftstr ($$year, 1) == "s" || leftstr ($$year, 1) == "S"){
        $$year = rightstr($$year, strlen($$year)-1);
        $$year = str(val($$year) + 1925);
    } else if (strstr ($$year, "h") == 0 || strstr ($$year, "H") == 0){
        $$year = rightstr($$year, strlen($$year)-1);
        $$year = str(val($$year) + 1988);
    }
//    月の変換
    if ($$month == "1") $$month = "January";
    else if ($$month == "2") $$month = "February";
    else if ($$month == "3") $$month = "March";
    else if ($$month == "4") $$month = "April";
    else if ($$month == "5") $$month = "May";
    else if ($$month == "6") $$month = "June";
    else if ($$month == "7") $$month = "July";
    else if ($$month == "8") $$month = "August";
    else if ($$month == "9") $$month = "September";
    else if ($$month == "10") $$month = "October";
    else if ($$month == "11") $$month = "November";
    else if ($$month == "12") $$month = "December";
    else if ($$month == "") $$month = "";
    else $$month = "エラー";

    if ($$year != "" && $$month != "") $$year = ", " + $$year;

//    日の変換
    if ($$day != "") $$day = " " + $$day;

//    変換結果(英語表記の年月日)の書き込み
    insert $$month + $$day + $$year;

//    終了処理
macroend:
//    if (#FEP==1) imeswitch;        //漢字に戻す
    endmacro;

//
//    選択範囲の上位側を#beginx, #beginy、下位側を#endx, #endyにセットする
//    サブルーチン
//
set_area:
    #beginx = seltopx; #beginy = seltopy;
    #endx   = selendx; #endy   = selendy;
    escape;
    if ((#beginy > #endy) || ((#beginy == #endy) && (#beginx > #endx))){
        ##tempx = #beginx; ##tempy = #beginy;
        #beginx = #endx;   #beginy = #endy;
        #endx   = ##tempx; #endy   = ##tempy;
    }
    return;

|

« 「翻訳に活かすSimplyTerms」(翻訳フォーラム・レッスンシリーズ#5) | トップページ | トランスクリエーション? »

翻訳-ツール(自作もの)」カテゴリの記事

コメント

コメントを書く



(ウェブ上には掲載しません)




トラックバック


この記事へのトラックバック一覧です: 和暦を西暦に変換する秀丸マクロ:

« 「翻訳に活かすSimplyTerms」(翻訳フォーラム・レッスンシリーズ#5) | トップページ | トランスクリエーション? »