‘未分類’ カテゴリーのアーカイブ

PerlでXHTMLのテキスト内容だけを置換する

2017/10/20

 まあ仕事でEPUBを作っていると恒常的にXHTMLに触ることにはなるのですが、検索で文章中の欧文の部分などを引っかけて修正する時にXHTMLのタグ部分も引っかかってしまって、これこのまま間違えてここも修正しちゃったらエラー直行だよなみたいなケースが時々あります。なのでテキスト部分だけを検索置換対象にできれば便利かなと思って作ってみました。

 XML::LibXMLでXHTMLをパースしてテキストノードだけ選別して置換処理をループで回してるだけです。置換用ファイルは別ファイルにPerlの置換式書いたヤツを読み込む感じで。

 Macのターミナルで

perl コードのファイル.pl 置換対象.xhtml 外部読み込み置換式.pl

 のような感じで実行すれば置換対象のxhtmlを置換して上書きします。

 外部置換用ファイルは以下のような感じ。

 いやあ長年作りたかったんですよこういうの。こないだやっとパーサーモジュールでDOM飼い慣らせたんで作れましたよ。うれしい。

(2017.10.20)

JLREQとCSS(5)

2017/10/19

 こちらのエントリは、JAGAT XMLパブリッシング準研究会で今期の研究テーマとして、W3C文書「日本語組版処理の要件」(JLREQ)と、これに関連してVivliostyleの村上真雄さんたちが提出したW3Cメンバーサブミッション「Web技術を用いた日本語組版の現状」を取り扱っていることに伴い、会員以外の方の意見を広く求めるとともに、記録を残しておく目的で議事録をベースに補足したものを公開するものです。

 間違い、補足などございましたらご意見いただければ幸いです。なお、当ブログはコメント許可制を取っているため、反映に時間がかかります。あらかじめご理解ください。
 方針としましてはW3C文書「日本語組版処理の要件」(JLREQ)を先頭から読んでいき、各要素に対応するCSSが存在するのか、存在するとして実用段階なのか、InDesignなどの組版ソフトではどういった形で機能を実現しているのか(いないのか)、などについて見ています。なお全体に対しての包括的な説明の部分に関しては、細かな部分は次回以降にその部分の説明が出てきた時に掘り下げる、としてスルーしている箇所があります。

 なお、こちらで取り上げております各CSSプロパティはまだドラフト仕様の段階のものも多いため、今現在すぐに使えるものばかりではありません。Webブラウザで使用出来るかどうかはこちらなどでご確認ください。また、電子書籍のRSで使用出来るかどうかは、現在広範に調査した資料がありません。いずれ当研究会の活動として調査を行いたく考えていますが、しばらく時間はかかるかと思います。

JLREQ 3.3 ルビと圏点処理

JLREQ 3.3.1 ルビの使用

 ルビの組版処理の方法として、モノルビグループルビ熟語ルビの3種類がある。
 また、ルビの意味合いとしては、ひらがなのルビで漢字の読みを示すもの、カタカナのルビで意味を示す別な言葉を付けるもの、(「避難所」に「アジール」のルビなど)、親文字である欧文の単語の読み方又は意味を示す言葉をルビとして付けるもの、親文字であるひらがな等にルビとして漢字等を付ける(振り漢字)ものなどがある。
 また、熟語にルビを付ける際にまとめて訓読みのルビを付けるケースがある(「紫陽花」に「あじさい」など)。こういったケースを熟字訓と呼ぶ。

JLREQ 3.3.2 ルビの付け方

 出てくる漢字等のすべてにルビを付ける総ルビと、読み方がむずかしい一部の漢字等のみにルビを付けるパラルビがある。

JLREQ 3.3.3 ルビの文字サイズ

 「ルビの文字サイズは、原則として親文字の文字サイズの1/2とする」(児童書などでは3文字つける例もある)。
※ルビでの小書きの仮名(拗促音を本文同様に小書きで書くこと。活版の時代には技術的問題や可読性からルビでの仮名の拗促音小書き表記は使われていなかったが、現在では十分な可読性が維持できるため使われるようになってきている)について、過去にCSSドラフト仕様のText Transformで小書きの仮名を表示上大書きのものに変換するFull Size Kanaというプロパティがあったが、なくなってしまった模様(2011年のドラフトにはあった)。

JLREQ 3.3.4 親文字のどちら側にルビを付けるか

 両側ルビは社会科の教科書など教育系コンテンツで見られる。

CSS:ルビをつける位置(例えば縦組みで親文字の左右どちらにルビをつけるかの指定)
CSS Ruby Layout Module Level1 4.1. Ruby Positioning: the ruby-position propertyでルビ位置を規定している。プロパティとしてoverunderがある。デフォルトはover。inter-characterというプロパティもあるが、これは中国語のピンインに使うためのもの。
なお、ruby-position指定はブラウザベースでもまだ使えないケースが多い模様。使えてもベンダープリフィックスを付けることが必要だったり、古いドラフトの用語で指定する必要があったりする。

JLREQ 3.3.5 モノルビの親文字に対する配置位置

 縦組みで親文字1文字に付く平仮名のルビ文字が1字の場合の配置位置として、親文字の天地中央とルビ文字の天地中央をそろえて配置する中付きと、親文字の上端とルビ文字の上端をそろえて配置する肩付きがある。横組みでは肩付きでの配置は行われない。

CSS:ルビの親文字に対しての配置位置
CSS Ruby Layout Module Level1 4.3. Ruby Text Distribution: the ruby-align property
start:肩付きの指定。CSSとしては肩付きは縦書き専用という規約はない。
center:中付きの指定。
space-around:ルビ文字間にスペースを空けて中央配置。これはいわゆるJISの1-2-1ルール。
space-between:space-aroundに近いが、ルビ文字列の方が長いときの親文字の配置位置に違いがある。図参照。

なお、OpenTypeフォントが持っているルビ字形は、「font-feature-settings: “ruby” 1」の指定で明示的に呼び出すことができる。
参考として、InDesignは組版アプリなのでより詳細なルビのプロパティの指定が可能。ただし両側にルビは付けられない。Wordも中付き、肩付きの指定はできる模様。

JLREQ 3.3.6 グループルビの親文字に対する配置位置

 注に「親文字の文字列の長さに比べ,ルビ文字の文字列の長さが極端に短い場合」の規約がある。ただこれは機械処理でどうにかできるのか疑問。

JLREQ 3.3.7 熟語ルビの親文字に対する配置位置

 熟語ルビは「熟語を構成するそれぞれの漢字等に付くルビ文字がそれぞれ2文字以下の場合,それぞれの親文字の漢字等とルビ文字を対応させ,3.3.5 モノルビの親文字に対する配置位置で述べた方法で配置する」「熟語を構成するそれぞれの漢字等の中で,1字でもそれに対応するルビ文字が3字以上のものがある場合,熟語全体とルビ文字の文字列を対応させて配置する」その上で「熟語ルビは,それぞれの漢字等とそれに対応するルビ文字を単位として2行に分割してもよい」という話になる。分割した場合はそれぞれがモノルビとして処理される。複雑な処理であり、InDesignもまだ熟語ルビには対応していない。
※図133 熟語ルビを2行に分割して配置した例 の図はちょっと行頭行末に親文字が付いていなくて気になる。

CSS:熟語ルビ
CSS Ruby Layout Module Level1 4.2. Sharing Annotation Space: the ruby-merge property
これはまだブラウザでの実装はない。
separate:熟語ルビのマークアップでもモノルビのように扱う。
collapse:熟語ルビのマークアップでもグループルビのように扱う。
auto:いわゆる熟語ルビの挙動になるように表示をユーザーエージェントにまかせる。

JLREQ 3.3.8 ルビが親文字よりはみ出した場合の処理

 ルビ文字の文字列が親文字の文字列より長い場合、前又は後ろにくる漢字にはルビをかけないようにし、平仮名、片仮名、長音記号又は小書きの仮名には最大でルビ文字サイズの全角までルビ文字を掛ける形で組版処理を行う。例外として、前後の文字にかかるルビ文字が繋がってしまう場合は、誤読を避ける意味で親文字の字間を空けて繋がらないようにする。またJIS X 4051では片仮名は漢字と同じ文字クラスに含まれているため、片仮名についてはルビ文字をかけないようにする。

CSS:ルビ文字列が親文字より長い場合
CSS Ruby Layout Module Level1 5.1. Overhanging Rubyに記述がある。また、5.2. Line-edge Alignmentに行頭行末処理の記述もあるが、どちらもJLREQを参照している。

JLREQ 3.3.9 圏点の処理

 「圏点(傍点ともいう)は,漢字等や平仮名などの文字列に付け,その文字列を強調する役割を果たす.」「慣行として,圏点は,句点類,読点類,始め括弧類,終わり括弧類などには付けない.」

CSS:圏点
CSS Text Decoration Module Level3 3. Emphasis Marksで圏点の規定がされている。dot/circle/double-circle/triangle/sesameのそれぞれに対してfilled(塗りつぶす)、open(塗りつぶさない)の指定ができる。また任意の記号の指定もできる。
InDesignでもこれと同じ種類の圏点を指定して付加することができる。
中国語では下に圏点を付けるのが標準であるため、ちょっとGitHubで議論になっている。

3.4. Emphasis Mark Position: the text-emphasis-position propertyで圏点を付ける位置を指定できる。CSS Text Decoration Module Level 3の Appendix Bに各言語ごとの付ける位置の参照情報、デフォルトスタイルシートがある。

なお、圏点、ルビともに日本語組版ではそれによって行間が変動したりはしない。
圏点、ルビを付けた場合の行間についてはCSS Ruby Module の 3.5 Line Spacingに規定がある。行間が十分に広ければ問題にならないが、行間が狭すぎた場合はその限りではなく、自動で行間を広げて処理する形になる。
余談だが同じline-height絡みの話では、現状Webには文字の一部のサイズを大きくした際に行間が広がってしまう挙動の問題があり、今後の課題となっている。

3.4 割注処理

 ここはまあCSS的に当面期待もできないので省略。

今回はここまで。次回はJLREQ 3.5から。

(2017.10.19)

WindowsでXojoからPerlを呼び出して使う

2017/09/25

 Xojoはクロスプラットフォーム開発環境なわけですが、Xojo単体内部でコードが完結してるならともかく、外部のPerlやらなんやらに処理を投げようとするといろいろプラットフォーム環境に依存して面倒なわけです。Macは根っこがBSDUnixなのでデフォルトでいろいろ入ってて面倒がないんですけどね。ということでどうにかこうにかWindowsでXojoからPerlに処理を投げることに成功したのでメモです。@kmutoさん、いろいろと助言ありがとうございました。助かりました。

StrawberryPerlをインストールして環境を構築

 まず、無料のPerl環境、StrawberryPerlをインストールして環境を構築しました。当初Windows10のBash on Ubuntu on Windowsに処理を投げようとしたり、ActivePerl使おうとしたりで四苦八苦しましたが、Bash on Ubuntu on WindowsだとXojo内からシェル経由でコマンド投げようとするといろいろ支障が出てきて動かなかったり(一応このあたりに知見はあるようなんですが手に負えず)、ActivePerlはXMLパーサーモジュールのインストールこれどうすりゃいいのよだったりして結局StrawberryPerlに落ち着きました。これ素晴らしいです。インストーラ普通にあるしCPAN普通に使えるし。セットアップはこのあたりを参考に。

実行ファイルと同じフォルダにPerlのファイルをコピーする指定

 Macではアプリ自体実はフォルダなので、アプリ内のフォルダにPerlのスクリプトをコピーしていたのですが、Winではそういう扱いにならないようなので実行ファイルと同じ階層にコピーする指定をします。で配布時には親フォルダごと渡す。まあ一般的なやつですね。ビルド設定のWindowsのところでビルドステップに「ファイルのコピー」を追加してやり、ウィンドウにコピーするファイルをドラッグアンドドロップしてコピー先に「Contents Folder」を指定すればいいようです。なおサブディレクトリ作ってそこにコピーする指定もできる模様。

XojoからPerlにシェル経由で処理を投げて実行

 あとはXojoからPerlにシェル経由で処理を投げるだけですが、Macとはフォルダの階層が異なるのと、StrawberryPerlの場合はBashではなくコマンドプロンプトに処理を投げることになるためパスやパイプ(コマンド連続実行)の記法が異なることに注意が必要なようです。具体的にはパスはシングルクォートではなくダブルクォートで囲まないとエラーになりますし、パイプに使う記号は「;」ではなく「&」です。なおXojo内でFolderItemのパスを「.NativePath」でString値として取得するとシングルクォートで囲まれた形でパスの文字列が返ってきてしまうので、変換してやらないと処理が通りません。ということでコードは以下のような感じ。

 シングルクォートをダブルクォートに変換するメソッドは以下のような感じ。なお引数pathStringをString型で定義していて、戻り値もString型で返す感じ。

 ここもうちょいスマートな感じで処理できればなと思うんですけどね。正規表現でゴリゴリ変換ってすごく泥臭い。

(2017.9.25)

プロフィール
Jun Tajima

こちらにて、電子書籍&Web制作を担当しています。
このブログは、EPUB3をはじめとした電子書籍制作担当オペレータからの、「電子書籍の制作時にたとえばこんな問題が出てきていますよ」的な「現地レポート」です。少しでも早い段階で快適な電子書籍閲覧・制作環境が整うことを願って、現場からの声を発信していこうと目論んでおります。

当ブログ内の記事・資料は、私の所属しております組織の許諾を得て掲載していますが、内容は私個人の見解に基づくものであり、所属する組織の見解を代表するものではありません。また、本ブログの情報・ツールを利用したことにより、直接的あるいは間接的に損害や債務が発生した場合でも、私および私の所属する組織は一切の責任を負いかねます。