8-1.処理 3-2.見出し出力 前編
解説対象は以下の長い処理です。
#見出しチェック
if($sctnFlg -eq 1){
#取得したタイトル名と目次配列の値(タイトル置換)が一致していなければ見出し出力処理
while($titleName -ne ($sctnArr[$sctnCnt] -replace $rpRgx)){
#大見出しかチェック(正規表現で判定)
if($sctnArr[$sctnCnt] -match $bSctRgx){
#大見出しの出力実行(正規表現で不要部分を置換)
Write-Output ($bSct+($sctnArr[$sctnCnt] -replace $rpRgx)) | Add-content -Path $otptPth -Encoding utf8
#目次配列のカウンタ+1
$sctnCnt=$sctnCnt+1
continue
}
#小見出しかチェック(正規表現で判定)
if($sctnArr[$sctnCnt] -match $sSctRgx){
#小見出しの出力実行(正規表現で不要部分を置換)
Write-Output ($sSct+($sctnArr[$sctnCnt] -replace $rpRgx)) | Add-content -Path $otptPth -Encoding utf8
#目次配列のカウンタ+1
$sctnCnt=$sctnCnt+1
continue
}
}
#目次配列のカウンタ+1
$sctnCnt=$sctnCnt+1
}
最初のif文は目次配列の取得の時と一緒で「変数sctnFlg(見出し出力フラグ)が1の時」ですね。
見出し出力する時しか、ここのwhile文内の処理はしなくていいのです。
で、while文はなんぞやというと、ループです。
foreach以外にもループあんの?というとあります。
while文は「()」内に書いた条件文を満たしている間、ループします。
じゃあ、今回の条件はというと、
$titleName -ne ($sctnArr[$sctnCnt] -replace $rpRgx)
です。
「-ne」は「≠」、つまり「一致しない」という条件なので、「$titleName」と「($sctnArr[$sctnCnt] -replace $rpRgx)」が「一致しない」間、ループするとなります。
「$titleName」は「変数titleName」で、エピソードファイルから取得したエピソードタイトルが格納されています。
じゃあ、それと比較している「($sctnArr[$sctnCnt] -replace $rpRgx)」ですが、これは目次配列の一部屋の内容を置換した結果になります。
なので、これをちょっと分解していきます。
まず、
$sctnArr[$sctnCnt]
$sctnArr、「変数sctnArr」は前の処理で取得した目次配列です。
その後ろに「[$sctnCnt]」とありますが、これ、実は配列の部屋指定を行う時には変数を使うことが可能です。
なので、ここでは「変数sctnCntに入っている内容を部屋番号として、変数sctnArrの部屋を参照する」という処理をしてます。
その後ろの「-replace $rpRgx」は「変数rpRgxに合致する文字を置換する」、で「変数rpRgx」は「^(§ | § |( )*[0-9]+\. )」となっているので、目次配列の一行から不要な記号と連番を削除して、タイトル部分だけを抜き出しています。
というのも、見出しのある場合のabout.txtの目次は
【目次】
§大見出しタイトル1
§小見出しタイトル1
1. エピソードタイトル1
§小見出しタイトル2
2. エピソードタイトル2
3. エピソードタイトル3
となっているからです(仕様上全角スペースでインデントしてますが、実際は全角スペース1=半角スペース×2です)
さて、で、条件の目次のタイトルと一致してなかったらどうなのよって話なわけですが、この目次を目次配列$sctnArrに格納すると、改行区切りなのでこうなります。
$sctnArr[0]←§大見出しタイトル1
$sctnArr[1]← §小見出しタイトル1
$sctnArr[2]← 1. エピソードタイトル1
$sctnArr[3]← §小見出しタイトル2
$sctnArr[4]← 2. エピソードタイトル2
$sctnArr[5]← 3. エピソードタイトル3
となります。
しかし、この場合、エピソードファイル自体は「エピソードタイトル1」と「エピソードタイトル2」、「エピソードタイトル3」の3つしかありません。
で、取得したエピソードファイルのファイルオブジェクト配列$itemListは
$itemList[0]←エピソードタイトル1のファイルオブジェクト
$itemList[1]←エピソードタイトル2のファイルオブジェクト
$itemList[2]←エピソードタイトル3のファイルオブジェクト
となります。
さて、目次配列を見るとわかる通り、見出しがある場合、必ずエピソードタイトル前に見出しタイトルが来るわけです。
そして見出しタイトルがない限り、エピソードタイトルは連続します。
処理の中では見出しを出す設定がされていても、本当にその小説に見出しがあるかどうかはわかりません。
しかし、「見出しがある場合、必ずエピソードタイトル前に見出しタイトルが来る」、「見出しタイトルがない限り、エピソードタイトルは連続する」を組み合わせると、「ファイルオブジェクトのエピソードタイトルと目次配列の取得したタイトルが一致していなければ、その目次配列側のタイトルは見出しタイトルである」、「その目次配列側のタイトルとファイルオブジェクトのエピソードタイトルが一致するまでは、見出しタイトルが続いている」となります。
なので、ループ=繰り返す条件は「エピソードファイルから取得したタイトルが目次配列から取得したタイトルと一致しない間」になります。
長くなったのでループ内処理は次に。
新規登録で充実の読書を
- マイページ
- 読書の状況から作品を自動で分類して簡単に管理できる
- 小説の未読話数がひと目でわかり前回の続きから読める
- フォローしたユーザーの活動を追える
- 通知
- 小説の更新や作者の新作の情報を受け取れる
- 閲覧履歴
- 以前読んだ小説が一覧で見つけやすい
アカウントをお持ちの方はログイン
ビューワー設定
文字サイズ
背景色
フォント
組み方向
機能をオンにすると、画面の下部をタップする度に自動的にスクロールして読み進められます。
応援すると応援コメントも書けます