ラベル perl の投稿を表示しています。 すべての投稿を表示
ラベル perl の投稿を表示しています。 すべての投稿を表示

2017年2月6日

ちょいスクリプト:12時制を24時制に書き換える

「午後4:05」→「16時5分」、「午前8時半」→「8時30分」という具合に12時制の時刻を24時制の「hh時mm分」の形式に書き換える。

ただし、「午後12時」は本来「夜中の0時」のはずだけど、「昼の12時15分」のつもりで「午後12時15分」と書く人もいるので、「午後12時」については疑問出しをするようにした。

perl

#!/usr/bin/perl
use utf8;
binmode STDOUT, ':utf8';
binmode STDERR, ':utf8';
binmode STDIN, ':utf8';

while (<>) {
        y/1234567890:/1234567890:/;
        s/(\d+):(\d+)/\1時\2分/g;
        s/(?<=時)半/30分/g;
        s/00分//g;
        s/午後0/12/g;
        s/午後10/22/g;
        s/午後11/23/g;
        s/午後12(?=時\d+分)/昼?夜?0/g;
        s/午後12(?!時\d+分)/0/g;
        s/午後1/13/g;
        s/午後2/14/g;
        s/午後3/15/g;
        s/午後4/16/g;
        s/午後5/17/g;
        s/午後6/18/g;
        s/午後7/19/g;
        s/午後8/20/g;
        s/午後9/21/g;
        s/午前(?=\d+)//g;
    print $_;
}

javascript

var mySel = app.activeDocument.selection;
var myStr = mySel[0].contents;
myStr = myStr.replace(/0/g, "0");
myStr = myStr.replace(/1/g, "1");
myStr = myStr.replace(/2/g, "2");
myStr = myStr.replace(/3/g, "3");
myStr = myStr.replace(/4/g, "4");
myStr = myStr.replace(/5/g, "5");
myStr = myStr.replace(/6/g, "6");
myStr = myStr.replace(/7/g, "7");
myStr = myStr.replace(/8/g, "8");
myStr = myStr.replace(/9/g, "9");
myStr = myStr.replace(/:/g, ":");
myStr = myStr.replace(/(\d+):(\d+)/g,  "$1"+"時"+"$2"+"分");
myStr = myStr.replace(/(?<=時)半/g, "30分");
myStr = myStr.replace(/00分/g, "");
myStr = myStr.replace(/午後0/g, "12");
myStr = myStr.replace(/午後10/g, "22");
myStr = myStr.replace(/午後11/g, "23");
myStr = myStr.replace(/午後12(?=時\d+分)/g, "昼?夜?0");
myStr = myStr.replace(/午後12(?!時\d+分)/g, "0");
myStr = myStr.replace(/午後1/g, "13");
myStr = myStr.replace(/午後2/g, "14");
myStr = myStr.replace(/午後3/g, "15");
myStr = myStr.replace(/午後4/g, "16");
myStr = myStr.replace(/午後5/g, "17");
myStr = myStr.replace(/午後6/g, "18");
myStr = myStr.replace(/午後7/g, "19");
myStr = myStr.replace(/午後8/g, "20");
myStr = myStr.replace(/午後9/g, "21");
myStr = myStr.replace(/午前(?=\d+)/g, "");
mySel[0].contents = myStr;


2015年5月22日

書体見本を自動生成する

大阪DTPの勉強会の隔週勉強会で「書体見本を自動生成する」という宿題が出た。
それを今日、発表することになってしまった。そのためのレジュメ代わり。
(22日21:36 いろいろ修正しました)

書体見本の自動生成

処理の方針:


タブ区切りのフォントリストから、タグ付きテキストを作り、それをInDesingに配置する。自分のコンピュータで使えるすべてのフォントをふくむリストの作り方はこの記事の末尾に書いておきましたが、ここではフォントリスト(サンプルのダウンロード )ができているとして、それからタグ付きテキストを作る方法を紹介します。

スタート:フォントのファミリー名とスタイル名がタブで区切られているリストから、
小塚明朝 Pr6N R
游ゴシック体 ミディアム
……
……
ゴール:次のようなInDesignの「タグ付き」テキストを作る。
<UNICODE-MAC>
<vsn:9.3><fset:InDesign-Japanese>
<pstyle:><cf:小塚明朝 Pr6N><ct:R>小塚明朝 Pr6N R
Lorem ipsum dolor sit amet, consectetur adipisicing elit,
あのイーハトーヴォのすきとおった風、夏でも底に冷たさをもつ青いそら、うつくしい森で飾られたモーリオ市、郊外のぎらぎらひかる草の波。
祇辻飴葛蛸鯖鰯噌庖箸
Lorem ipsum dolor sit amet,
1234567890
12234567890
<ct:><cf:>
<pstyle:><cf:游ゴシック体><ct:ミディアム>游ゴシック体 ミディアム
Lorem ipsum dolor sit amet, consectetur adipisicing elit,
あのイーハトーヴォのすきとおった風、夏でも底に冷たさをもつ青いそら、うつくしい森で飾られたモーリオ市、郊外のぎらぎらひかる草の波。
祇辻飴葛蛸鯖鰯噌庖箸
Lorem ipsum dolor sit amet,
1234567890
12234567890
<ct:><cf:>
……
……

処理の実際:


1)最初に1回だけ、ファイル開始タグを書き出す。
<UNICODE-MAC>
<vsn:9.3><fset:InDesign-Japanese>
2)フォントリストの1行ずつについて次の操作を繰り返す。
2-1)ファミリー名を変数$1に、スタイル名を変数$2に読み込む。
2-2)雛形の$1、$2にファミリー名、スタイル名を代入して出力する。

雛形:
<pstyle:><cf:$1><ct:$2>$1 $2
Lorem ipsum dolor sit amet, consectetur adipisicing elit,
あのイーハトーヴォのすきとおった風、夏でも底に冷たさをもつ青いそら、うつくしい森で飾られたモーリオ市、郊外のぎらぎらひかる草の波。
祇辻飴葛蛸鯖鰯噌庖箸
Lorem ipsum dolor sit amet,
1234567890
12234567890
<ct:><cf:>

これをPerlやAWKスクリプトで実現すると次のようになる。

Perlスクリプト (ダウンロード)
use utf8;
binmode STDOUT, ':utf8';
binmode STDERR, ':utf8';
binmode STDIN, ':utf8';
print "<UNICODE-MAC>\n<vsn:9.3><fset:InDesign-Japanese>\n";
#print "<UNICODE-WIN>\n<vsn:9.3><fset:InDesign-Japanese>\n";
while (<>) {
 /([^\t]+)\t(.+)/;
 print "<pstyle:><cf:$1><ct:$2>$1 $2\
Lorem ipsum dolor sit amet, consectetur adipisicing elit, \
あのイーハトーヴォのすきとおった風、夏でも底に冷たさをもつ青いそら、うつくしい森で飾られたモーリオ市、郊外のぎらぎらひかる草の波。\
祇辻飴葛蛸鯖鰯噌庖箸とか\
Lorem ipsum dolor sit amet,\
1234567890とか\
12234567890\
<ct:><cf:>";
}

実行例:$ perl -f addtag.pl < fontlist.txt | iconv -t utf-16le > fontsample.txt

AWKスクリプト (ダウンロード)
BEGIN {
 FS = "\t"
 print "<UNICODE-MAC>\n<vsn:9.3><fset:InDesign-Japanese>"
}
{ print \
"<pstyle:><cf:" $1 "><ct:" $2 ">" $1 " " $2 "\n\
Lorem ipsum dolor sit amet, consectetur adipisicing elit, \n\
あのイーハトーヴォのすきとおった風、夏でも底に冷たさをもつ青いそら、うつくしい森で飾られたモーリオ市、郊外のぎらぎらひかる草の波。\n\
祇辻飴葛蛸鯖鰯噌庖箸\n\
Lorem ipsum dolor sit amet,\n\
1234567890\n\
12234567890\
<ct:><cf:>"
}

実行例:$ awk -f addtag.pl < fontlist.txt | iconv -t utf-16le > fontsample.txt

留意点:


(ア)ファイル開始タグと改行コードの組み合わせ:
<UNICODE-MAC>とした場合は改行コードをLFに、
<UNICODE-WIN>とした場合は改行コードをCRLFに。
(イ)途中の処理はUTF-8で行っているので、配置する前にUTF-16 (LE BOM付) に変換しておく。
上の実行例ではiconvコマンドを使って変換した。
(ウ)配置する際、「グリッドフォーマットの適用」のチェックを外しておく。


もうちょっとPerlらしいスクリプト (ダウンロード)
use utf8;
binmode STDOUT, ':utf8';
binmode STDERR, ':utf8';
binmode STDIN, ':utf8';
print "<UNICODE-MAC>\n<vsn:9.3><fset:InDesign-Japanese>\n";
while (<>) {
 chop;
 ($family, $style) = split(/\t/, $_);
 print "<pstyle:><cf:$family><ct:$style>$family $style\
Lorem ipsum dolor sit amet, consectetur adipisicing elit, \
あのイーハトーヴォのすきとおった風、夏でも底に冷たさをもつ青いそら、うつくしい森で飾られたモーリオ市、郊外のぎらぎらひかる草の波。\
祇辻飴葛蛸鯖鰯噌庖箸\
Lorem ipsum dolor sit amet,\
1234567890\
12234567890\
<ct:><cf:>";
}

資料集:


PerlとAWK

OS Xには両方とも最初から入ってます。
Windowsにはどちらも入っていません。Perlなら下のサイトからインストールできます。
ActivePerl:http://www.activestate.com/activeperl

『ADOBE INDESIGN CS5 タグ付きテキストユーザーガイド』

http://www.adobe.com/go/learn_id_taggedtext_cs5_jp
(実際には次のURLへリダイレクトされる)
http://help.adobe.com/ja_JP/indesign/cs/taggedtext/indesign_cs5_taggedtext.pdf

Adobe製品のjavascript入門編

古籏一浩さんの「OpenSpace」 http://www.openspc2.org

利用できるフォント(書体)の名前をテキストフレームに書き出す
CC2014用:http://www.openspc2.org/book/InDesignCC2014/easy/font/002/index.html
CC用:http://www.openspc2.org/book/InDesignCC/easy/font/002/index.html
CS6用:http://www.openspc2.org/book/InDesignCS6/easy/font/002/index.html
これで書き出したフォントのリスト(タブ区切りテキスト):fontlist.txt


フォントリストの作り方:

自分のコンピュータで使えるフォントのリストを作るには前項、古籏氏作の「利用できるフォント(書体)の名前をテキストフレームに書き出す」javascriptが便利です。javascriptの実行の仕方も古籏氏の「OpenSpace」のInDesign自動化の項に詳しく書いてあります。

実行すると、InDesign文書上にファミリー名とスタイル名の一覧が現れますので、
  1. テキストを全て選択
  2. ファイル→書き出し
  3. 形式「テキストのみ」
  4. エンコーディング「UTF-8」
  5. fontlist.txtなど適当な名前で保存
以上です。



2014年6月22日

漢数字を無思慮に洋数字に変える

縦組みだからとせっかく漢数字に直したけど、Blogで公開するときは横組み。漢数字のままでもいいんだけど、世間に迎合して洋数字に書き換えよう。

ということで、またまたperlスクリプトを書いてみた。ただ単純に置換しているだけだから、数字の入った漢字熟語まで無思慮に変換してしまうのでご注意を。

(『すぐわかるPerl』『すぐわかる オブジェクト指向 Perl』『文字コード「超」研究』の著者・深沢千尋さんがご自身のBlog「イジハピ!」に、このスクリプトの“すぐわかる”解説を書いてくれました。うれしい!  http://blog.query1000.com/archives/39051213.html )


#!/usr/bin/perl

use utf8;
binmode STDOUT, ':utf8'; 
binmode STDERR, ':utf8'; 
binmode STDIN, ':utf8';

while(<>) {
  # 単位語の前に数字がない場合「一」を補う
    s/(?<![一二三四五六七八九千百十])(?=[兆億万])/一/g;
    s/(?<![一二三四五六七八九])(?=[千百十])/一/g;
  # 欠けている桁をゼロとして復活させる
    s/(?<=兆)(?![一二三四五六七八九][十百千万]?億)/〇億/g;
    s/(?<=億)(?![一二三四五六七八九][十百千]?万)/〇万/g;
    s/(?<=[兆億万])(?![一二三四五六七八九]千)/〇千/g;
    s/(?<=千)(?![一二三四五六七八九]百)/〇百/g;
    s/(?<=百)(?![一二三四五六七八九]十)/〇十/g;
    s/(?<=十)(?![〇一二三四五六七八九])/〇/g;
  # 単位語のうち千百十を消す
    s/[千百十]//g;
  # 億万でゼロを整理
    s/〇〇〇〇[億万]//g;
    s/(?<=[兆億万])〇+//g;
  # 洋数字に変換
    y/〇一二三四五六七八九/0123456789/;
  # 3桁毎にコンマを挿入
    s/(?<=\d)(?=(\d\d\d)+(?!\d))/,/g;

    print $_;
}


*7月7日訂正:次の赤字部分を付け加えました。これがないと「二億二百万」などで4桁余分の0が入ってしまいます。

  # 欠けている桁をゼロとして復活させる
    s/(?<=兆)(?![一二三四五六七八九][十百千万]?億)/〇億/g;
    s/(?<=億)(?![一二三四五六七八九][十百千]?万)/〇万/g;

*7月8日補正:単位語のうち兆億万は残して、ゼロの羅列を減らしました。

*7月9日訂正:億万でゼロを整理のところの2行目で洋数字の0は間違いで漢数字の〇にしないといけませんでした。
  # 億万でゼロを整理
    s/〇〇〇〇[億万]//g;
#   s/(?<=[兆億万])0+//g; #誤
    s/(?<=[兆億万])〇+//g; #正

2014年6月19日

洋数字を単位語入りの漢数字に変換するぞ

縦組みで数字はやはり漢数字で書きたい。でも原稿はたいてい洋数字で書いてくる。

いちいち書き換えるのは面倒だし、間違えやすい。そこは計算機に任せよう。

perlの先後読み正規表現を使って、単位語を入れる位置を指定すれば、意外に簡単かも。ちゃんと動くかな?


#!/usr/bin/perl

# utf-8テキストを扱うまじない
use utf8;
binmode STDOUT, ':utf8'; 
binmode STDERR, ':utf8'; 
binmode STDIN, ':utf8';

while (<>) {
  # 数字は半角にそろえておく
    y/1234567890/1234567890/;
  # 単独の0は「ゼロ」に書き換える
    s/(?<!\d)0(?!\d)/ゼロ/g; 
  # 桁区切りのコンマを取っておく
    s/(?<=\d),(?=(\d\d\d)+(?!\d))//g;
  # 4桁ごとに区切って万億兆を挿入
    s/(?<=\d)(?=\d\d\d\d(?!\d))/万/g;
    s/(?<=\d)(?=\d\d\d\d(?=万))/億/g;
    s/(?<=\d)(?=\d\d\d\d(?=億))/兆/g;
  # 下から1桁ずつ十百千を挿入
    s/(?<=\d)(?=\d(?!\d))/十/g;
    s/(?<=\d)(?=\d(?!\d))/百/g;
    s/(?<=\d)(?=\d(?!\d))/千/g;
  # 0になってる桁を削除
    s/0[十百千]//g;
    s/億0万/億/g;
    s/兆0億/兆/g;
    s/0//g;
  # 十百には1をつけない
    s/1([十百])/\1/g;
  # 各桁を漢数字に書き換え
    y/123456789/一二三四五六七八九/;

    print $_;
}


6月25日 修正:「0万」「0億」が消えてしまってはよくない場合があるので、「億0万」「兆0億」の場合だけ消えるようにした。
7月10日 改訂:もとの洋数字がコンマ区切りでも変換でるように、コンマ消去の処理を最初に付け加えた。ただしく3桁ごとに区切ってないとうまく変換できないけど、後にコンマが残るので、もとの桁区切りがおかしかったことがわかっていいかな。
10月13日 修正:「海抜0m地帯」なども0が消えてはいけないし、こういったものは縦書きだと「ゼロ」と書くことが多いので、そんな場合に対応できるようにした。



未来の自分のためにちょっとメモ:

(?<=\d)(?=\d\d\d\d(?!\d))は、

《後読み》
後ろをちょっと振り返えれば (?<= )
数字\dがひとつは見えて (?<=\d)

《先読みと否定先読み》
先を望めば (?= )
数字がよっつ見えて \d\d\d\d
さらにその先は数字じゃない (?!\d) (←もちろん、文字がなくてもかまわない)
(?=\d\d\d\d(?!\d))

そういう場所。
文字じゃなくて場所だってところが味噌。
組版的には字間かな。