Class: VivlioStarter::CLI::IndexCommands::IndexLibrary

Inherits:
Object
  • Object
show all
Defined in:
lib/vivlio_starter/cli/index/index_library.rb

Defined Under Namespace

Classes: ImportResult

Constant Summary collapse

SCHEMA_VERSION =
1
DEFAULT_PATH =
'index_library.yml'

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(terms_manager: UnifiedTermsManager.new, queue_manager: ReviewQueueManager.new) ⇒ IndexLibrary

Returns a new instance of IndexLibrary.



36
37
38
39
# File 'lib/vivlio_starter/cli/index/index_library.rb', line 36

def initialize(terms_manager: UnifiedTermsManager.new, queue_manager: ReviewQueueManager.new)
  @terms_manager = terms_manager
  @queue_manager = queue_manager
end

Class Method Details

.resolve_path(arg) ⇒ Object

export/import の対象パスを解決する。 book.yml には置かない——パスを変えたいのは「今回だけ別名で書き出す」ときで、 それは vs index:export mybook.yml のように引数で言うほうが早い。

Parameters:

  • arg (String, nil)

    コマンド引数のパス



45
46
47
48
49
# File 'lib/vivlio_starter/cli/index/index_library.rb', line 45

def self.resolve_path(arg)
  return File.expand_path(arg) if arg && !arg.to_s.empty?

  File.expand_path(DEFAULT_PATH)
end

Instance Method Details

#author_touched?(term) ⇒ Boolean

Returns:

  • (Boolean)


112
113
114
# File 'lib/vivlio_starter/cli/index/index_library.rb', line 112

def author_touched?(term)
  term['flags'].to_s.include?('g') || term['source'] == 'manual_markup'
end

#blank_yomi?(term) ⇒ Boolean

Returns:

  • (Boolean)


116
117
118
119
# File 'lib/vivlio_starter/cli/index/index_library.rb', line 116

def blank_yomi?(term)
  yomi = term['yomi'].to_s
  yomi.empty? || yomi == term['term'].to_s
end

#export!(path) ⇒ Object

現プロジェクトの用語集[g]・reject をライブラリファイルへ書き出す。



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
# File 'lib/vivlio_starter/cli/index/index_library.rb', line 54

def export!(path)
  glossary = export_glossary
  reject = export_reject
  yomi = export_yomi

  if glossary.empty? && reject.empty? && yomi.empty?
    Common.log_warn('書き出す用語集[g]・reject・読みがありません(ライブラリは作成しませんでした)')
    return false
  end

  library = {
    'version' => SCHEMA_VERSION,
    'exported_at' => Time.now.strftime('%Y-%m-%d %H:%M:%S'),
    'glossary' => glossary,
    'reject' => reject,
    'yomi' => yomi
  }

  dir = File.dirname(path)
  FileUtils.mkdir_p(dir) unless dir == '.'
  File.write(path, library.to_yaml, encoding: 'utf-8')
  Common.log_result(
    "索引ライブラリを書き出しました: #{path}" \
    "(用語集 #{glossary.size} 件 / reject #{reject.size} 件 / 読み #{yomi.size} 件)",
    status: :success
  )
  true
end

#export_glossaryObject

用語集[g]を term 昇順で term/yomi/definition のみ抽出する(固有情報は落とす)。



84
85
86
87
88
# File 'lib/vivlio_starter/cli/index/index_library.rb', line 84

def export_glossary
  @terms_manager.glossary_terms
                .sort_by { it['term'].to_s }
                .map { { 'term' => it['term'], 'yomi' => it['yomi'], 'definition' => it['definition'].to_s } }
end

#export_rejectObject

reject 一覧を term 昇順で term(+reason) のみ抽出する。



91
92
93
94
95
96
97
98
99
# File 'lib/vivlio_starter/cli/index/index_library.rb', line 91

def export_reject
  @queue_manager.
                .sort_by { it['term'].to_s }
                .map do |rejected|
    entry = { 'term' => rejected['term'] }
    entry['reason'] = rejected['reason'] if rejected['reason']
    entry
  end
end

#export_yomiObject

読みの個人辞書(term => yomi)を term 昇順で抽出する。 作者由来の語(用語集[g]・手動マークアップ)の実読みと、これまでに 蓄積した overrides をまとめる(作者の語の読みを優先)。



104
105
106
107
108
109
110
# File 'lib/vivlio_starter/cli/index/index_library.rb', line 104

def export_yomi
  from_terms = @terms_manager.load_terms
                             .select { author_touched?(it) }
                             .reject { blank_yomi?(it) }
                             .to_h { [it['term'], it['yomi']] }
  YomiOverrides.load.merge(from_terms).sort.to_h
end

#import!(path, prefer_import: false) ⇒ Object

ライブラリファイルを現プロジェクトへ取り込む(追記マージ・既定は既存優先)。

Parameters:

  • prefer_import (Boolean) (defaults to: false)

    既存語をライブラリ側で上書きするか



125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
# File 'lib/vivlio_starter/cli/index/index_library.rb', line 125

def import!(path, prefer_import: false)
  data = load_library(path)
  return nil unless data

  unless data['version'] == SCHEMA_VERSION
    Common.log_warn("未知のライブラリ version: #{data['version'].inspect}(想定 #{SCHEMA_VERSION})。可能な範囲で取り込みます")
  end

  glossary_added, glossary_skipped = import_glossary(data['glossary'] || [], prefer_import:)
  reject_added, reject_skipped = import_reject(data['reject'] || [])
  yomi_added, yomi_skipped = YomiOverrides.merge!(data['yomi'] || {}, prefer_import:)

  Common.log_result(
    "索引ライブラリを取り込みました: 用語集 +#{glossary_added}(スキップ #{glossary_skipped}) / " \
    "reject +#{reject_added}(スキップ #{reject_skipped}) / " \
    "読み +#{yomi_added}(スキップ #{yomi_skipped}",
    status: :success
  )
  ImportResult.new(glossary_added:, glossary_skipped:, reject_added:, reject_skipped:,
                   yomi_added:, yomi_skipped:)
end