解説

1.必要情報の初期設定

対応箇所ソースは以下の通り。


#変更可能範囲ここから---------------------------------------------

#(1)対象ファイルのあるディレクトリパス

$filePth="対象ファイルのあるディレクトリ"


#(2)対象ファイル名(拡張子抜き)

$fileNm="拡張子、つまり「.docx」を抜いたファイル名"


#(3)使用フォント

$fntNm='使用するフォント名(ワードで選択する時の名前「MS 明朝」とかをコピペしてください)'


#(4)振るルビのサイズ(×2)

#4ptで振るなら8をセット、5ptなら10……で反映されるはず、たぶん

#初期値4として4×2で8をセット

$rbFntsz='8'


#(5)ルビ振る文字のサイズ(×2)

#4ptで振るなら8をセット、5ptなら10……で反映されるはず、たぶん

#初期値16として16×2で32をセット

$rbBsFntsz='32'


#(6)最大傍点文字数

#初期値として30にしてあるので、傍点のつく最大文字数に書き直してください

$tnMax = 30


#変更可能範囲ここまで---------------------------------------------


#正規表現用意する----------------------------------------------------------------

#基本的な文字は大丈夫なのだが、通常使用範囲じゃない文字とかは無視される文字が出てきたりするのでそれはアフターケアでカバーする


#始点設定アリのルビ

$rbKkym = '([.\w\s]+)([.\w\s]+)'


#傍点記法用 文字種はルビ側と合わせる

$tnKkym1 = '《《'

$tnKkym2 = '([.\w\s]{1})'

$tnKkym3 = '》》'


#始点無設定のルビ=ルビ対象文字漢字用

$rbNKkym = '([\p{IsCJKUnifiedIdeographs}々〇]+)《([.\w\s]+)》'


#ワード用XML変換後ルビ(長いのは仕様)

#フォント種類やサイズはアフターケアも可能

#ルビ全般対応

$rbWd = '</w:t></w:r><w:r><w:ruby><w:rubyPr><w:rubyAlign w:val="distributeSpace"/><w:hps w:val="'+$rbFntsz+'"/><w:hpsRaise w:val="18"/><w:hpsBaseText w:val="'+$rbBFntSz+'"/><w:lid w:val="ja-JP"/></w:rubyPr><w:rt><w:r w:rsidR="00E95970" w:rsidRPr="00E95970"><w:rPr><w:rFonts w:ascii="'+$fntNm+'" w:eastAsia="'+$fntNm+'" w:hAnsi="'+$fntNm+'" w:hint="eastAsia"/><w:sz w:val="'+$rbFntsz+'"/><w:szCs w:val="'+$rbBsFntsz+'"/></w:rPr><w:t>$2</w:t></w:r></w:rt><w:rubyBase><w:r w:rsidR="00E95970"><w:rPr><w:rFonts w:hint="eastAsia"/><w:sz w:val="'+$rbBsFntsz+'"/><w:szCs w:val="'+$rbBsFntsz+'"/></w:rPr><w:t>$1</w:t></w:r></w:rubyBase></w:ruby></w:r><w:r><w:rPr><w:rFonts w:hint="eastAsia"/></w:rPr><w:t>'


#傍点対応用(部品として三分割)

$tnWd1 = '</w:t></w:r><w:r><w:ruby><w:rubyPr><w:rubyAlign w:val="distributeSpace"/><w:hps w:val="'+$rbFntsz+'"/><w:hpsRaise w:val="18"/><w:hpsBaseText w:val="'+$rbBFntSz+'"/><w:lid w:val="ja-JP"/></w:rubyPr><w:rt><w:r w:rsidR="00E95970" w:rsidRPr="00E95970"><w:rPr><w:rFonts w:ascii="'+$fntNm+'" w:eastAsia="'+$fntNm+'" w:hAnsi="'+$fntNm+'" w:hint="eastAsia"/><w:sz w:val="'+$rbFntsz+'"/><w:szCs w:val="'+$rbBsFntsz+'"/></w:rPr><w:t>'

$tnWd2 = '</w:t></w:r></w:rt><w:rubyBase><w:r w:rsidR="00E95970"><w:rPr><w:rFonts w:hint="eastAsia"/><w:sz w:val="'+$rbBsFntsz+'"/><w:szCs w:val="'+$rbBsFntsz+'"/></w:rPr><w:t>'

$tnWd3 = '</w:t></w:r></w:rubyBase></w:ruby></w:r><w:r><w:rPr><w:rFonts w:hint="eastAsia"/><w:sz w:val="'+$rbBsFntsz+'"/><w:szCs w:val="'+$rbBsFntsz+'"/></w:rPr><w:t>'

#正規表現用意終了----------------------------------------------------------------


ソースここまで。


変更可能範囲については、適宜利用時に変更してもらうところです。


そして正規表現側はカクヨム記法発見用の正規表現は簡単なのですが……いやXMLだからタグの嵐になっちゃって長くなるのは仕方ないんだ、本当。

さて、主に多用されている正規表現「[.\w\s]+」は「.」と「\w」が「何かしらの文字」、「\s」が「スペース系文字全般」を指し、それを「[~]」の中に入れて後ろに「+」くっつけてるので、「.、\w、\sに該当する文字の1回以上の繰り返し」を指します。

傍点対応の後ろについている「{1}」は「.、\w、\sに該当する文字の1回の繰り返し」となります。

「{1}」の「1」を任意の数字nにすると「.、\w、\sに該当する文字のn回の繰り返し」になりますが、変な行で均等割り付けにならないよう、一字単位で「・」を振るため、ここは「1」にしておきます。

……ここまでやってるのに抜けが出るのでこいつは頭を抱えています、原因がわかりません。

で、始点無設定の場合のルビで使われている「\p{IsCJKUnifiedIdeographs}」というのは文字体系的に漢字を指せる正規表現……にはなります(これでも抜けるので????になる人)

そしてこのくくりの中に「々」と「〇」が含まれてないので、「[]」でグループ化して追記。

さて、これらを「()」で囲っているのは、「()」で囲うことで、変換後の文字列に埋め込みを行うことができるためです。

XMLが長すぎて目立ちませんが、$rbWdに格納している文字の中に「$2」と「$1」が入っている箇所があります。

この「$n」が、変換指定文字の「()」の何番目か、を指しています。

つまり、

 変換対象になる文字列

  「|一番目のカッコに該当《二番目のカッコに該当》」

 検索する正規表現

  「|([.\w\s]+)《([.\w\s]+)》」

 正規表現に合致した内容を置換するルール

  「$2→$1」

とすると、「変換対象になる文字列」である「|一番目のカッコに該当《二番目のカッコに該当》」は「検索する正規表現」の「|([.\w\s]+)《([.\w\s]+)》」に照らすと、書いてある通り、「|」から「《」までの間が最初の「([.\w\s]+)」、「《」から「》」までの間が二つ目の「([.\w\s]+)」に該当します。

そして「正規表現に合致した内容を置換するルール」は「$2→$1」なので、【「《」から「》」までの間が二つ目の「([.\w\s]+)」→「|」から「《」までの間が最初の「([.\w\s]+)」】という風に置換されて、

 置換後文字列

  「二番目のカッコに該当→一番目のカッコに該当」

という風になります。

これによって、「正規表現に合致した内容」を「変更させずに順番を変えるなど置換する」ことが可能になります。


  • Xで共有
  • Facebookで共有
  • はてなブックマークでブックマーク

作者を応援しよう!

ハートをクリックで、簡単に応援の気持ちを伝えられます。(ログインが必要です)

応援したユーザー

応援すると応援コメントも書けます

新規登録で充実の読書を

マイページ
読書の状況から作品を自動で分類して簡単に管理できる
小説の未読話数がひと目でわかり前回の続きから読める
フォローしたユーザーの活動を追える
通知
小説の更新や作者の新作の情報を受け取れる
閲覧履歴
以前読んだ小説が一覧で見つけやすい
新規ユーザー登録無料

アカウントをお持ちの方はログイン

カクヨムで可能な読書体験をくわしく知る