Module: Vivlio::Starter::CLI::Build::TocGenerator
- Defined in:
- lib/vivlio/starter/cli/build/toc_generator.rb
Overview
目次生成モジュール
Constant Summary collapse
- PREFACE_RANGE =
章レンジ(定数)- 新仕様に合わせて更新
(0..0)
- MAIN_RANGE =
01..89 本文
(1..89)
- APPX_RANGE =
90..98 付録
(90..98)
- POSTFACE_RANGE =
99-postface
(99..99)
Class Method Summary collapse
-
.extract_chapter_numbers(entries_or_keep) ⇒ Array<Integer>
Entry 配列または basename 配列から章番号配列を抽出.
-
.generate_toc_and_pdf!(base_dir = '.', entries_or_keep = nil) ⇒ Object
Step 6: TOC 生成(_toc.html, _toc.pdf).
-
.generate_toc_html!(base_dir = '.', entries_or_keep = nil) ⇒ Object
Step 6 (print_pdf only): TOC HTML のみ生成(_toc.pdf ビルドをスキップ).
Class Method Details
.extract_chapter_numbers(entries_or_keep) ⇒ Array<Integer>
Entry 配列または basename 配列から章番号配列を抽出
122 123 124 125 126 127 128 129 130 131 132 |
# File 'lib/vivlio/starter/cli/build/toc_generator.rb', line 122 def extract_chapter_numbers(entries_or_keep) raw = Array(entries_or_keep).compact return [] if raw.empty? if raw.first.respond_to?(:number) raw.filter_map { it.number&.to_i } else resolver = TokenResolver::Resolver.new raw.filter_map { resolver.resolve_file(it).number&.to_i } end end |
.generate_toc_and_pdf!(base_dir = '.', entries_or_keep = nil) ⇒ Object
Step 6: TOC 生成(_toc.html, _toc.pdf)
44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 |
# File 'lib/vivlio/starter/cli/build/toc_generator.rb', line 44 def generate_toc_and_pdf!(base_dir = '.', entries_or_keep = nil) keep_numbers_main = Build::Utilities.chapter_numbers_for_book(entries_or_keep) # 前書き、付録、後書きの keep を抽出 keep_numbers_preface = nil keep_numbers_appx = nil keep_numbers_post = nil if entries_or_keep&.any? chapter_numbers = extract_chapter_numbers(entries_or_keep) keep_numbers_preface = chapter_numbers.select { |n| PREFACE_RANGE.include?(n) } keep_numbers_appx = chapter_numbers.select { |n| APPX_RANGE.include?(n) } keep_numbers_post = chapter_numbers.select { |n| POSTFACE_RANGE.include?(n) } end # base_dir 内の HTML から前書き(00) + 本文(01..89) + 付録(90..98) + 後書き(99) を抽出 chapter_htmls_preface = Build::ChapterConfig.htmls_for_range(base_dir, PREFACE_RANGE, keep_numbers_preface) chapter_htmls_main = Build::ChapterConfig.htmls_for_range(base_dir, MAIN_RANGE, keep_numbers_main) chapter_htmls_appx = Build::ChapterConfig.htmls_for_range(base_dir, APPX_RANGE, keep_numbers_appx) chapter_htmls_post = Build::ChapterConfig.htmls_for_range(base_dir, POSTFACE_RANGE, keep_numbers_post) targets_for_toc = (chapter_htmls_preface + chapter_htmls_main + chapter_htmls_appx + chapter_htmls_post).uniq.sort if targets_for_toc.empty? Common.log_warn('[Step 5] 対象HTMLが見つかりません。スキップします。') return end Common.log_info("[Step 5] 対象: #{targets_for_toc.map { |p| File.basename(p) }.join(', ')}") TocCommands.execute_toc({}, targets_for_toc) toc_html = File.join(base_dir, '_toc.html') unless File.exist?(toc_html) Common.log_warn('[Step 5] _toc.html が見つかりません。TOC の PDF 生成をスキップします。') return end # TOC も post_process を適用して見出しメタを付与(PDFアウトライン用) PostProcessCommands.execute_post_process({}, ['_toc']) Common.log_info('[Step 5] _toc.html に post_process を適用しました(見出しメタ付与)') EntriesCommands.execute_entries({}, ['_toc']) # 改良された pdf コマンドに出力ファイル名を渡してリネームも一括処理 PdfCommands.execute_pdf({}, '_toc.pdf') Common.log_success('[Step 5] _toc.pdf を生成しました') if File.exist?('_toc.pdf') end |
.generate_toc_html!(base_dir = '.', entries_or_keep = nil) ⇒ Object
Step 6 (print_pdf only): TOC HTML のみ生成(_toc.pdf ビルドをスキップ)
87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 |
# File 'lib/vivlio/starter/cli/build/toc_generator.rb', line 87 def generate_toc_html!(base_dir = '.', entries_or_keep = nil) keep_numbers_main = Build::Utilities.chapter_numbers_for_book(entries_or_keep) keep_numbers_preface = nil keep_numbers_appx = nil keep_numbers_post = nil if entries_or_keep&.any? chapter_numbers = extract_chapter_numbers(entries_or_keep) keep_numbers_preface = chapter_numbers.select { |n| PREFACE_RANGE.include?(n) } keep_numbers_appx = chapter_numbers.select { |n| APPX_RANGE.include?(n) } keep_numbers_post = chapter_numbers.select { |n| POSTFACE_RANGE.include?(n) } end chapter_htmls_preface = Build::ChapterConfig.htmls_for_range(base_dir, PREFACE_RANGE, keep_numbers_preface) chapter_htmls_main = Build::ChapterConfig.htmls_for_range(base_dir, MAIN_RANGE, keep_numbers_main) chapter_htmls_appx = Build::ChapterConfig.htmls_for_range(base_dir, APPX_RANGE, keep_numbers_appx) chapter_htmls_post = Build::ChapterConfig.htmls_for_range(base_dir, POSTFACE_RANGE, keep_numbers_post) targets_for_toc = (chapter_htmls_preface + chapter_htmls_main + chapter_htmls_appx + chapter_htmls_post).uniq.sort if targets_for_toc.empty? Common.log_warn('[Step 6] 対象HTMLが見つかりません。スキップします。') return end TocCommands.execute_toc({}, targets_for_toc) toc_html = File.join(base_dir, '_toc.html') unless File.exist?(toc_html) Common.log_warn('[Step 6] _toc.html が見つかりません。') return end PostProcessCommands.execute_post_process({}, ['_toc']) Common.log_success('[Step 6] _toc.html を生成しました(PDF ビルドはスキップ)') end |