Module: VivlioStarter::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

Class Method Details

.extract_chapter_numbers(entries_or_keep) ⇒ Array<Integer>

Entry 配列または basename 配列から章番号配列を抽出

Parameters:

Returns:

  • (Array<Integer>)

    章番号配列



83
84
85
86
87
88
89
90
91
92
93
# File 'lib/vivlio_starter/cli/build/toc_generator.rb', line 83

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_html!(base_dir = '.', entries_or_keep = nil) ⇒ Object

Step 6: TOC HTML を生成する(pdf / print_pdf 共通)。 見出しメタ(PDF アウトライン用)まで付与した _toc.html を生成する。

Parameters:

  • base_dir (String) (defaults to: '.')

    ベースディレクトリ

  • entries_or_keep (Array<TokenResolver::Entry>, Array<String>, nil) (defaults to: nil)


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
# File 'lib/vivlio_starter/cli/build/toc_generator.rb', line 48

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