Class: VivlioStarter::CLI::IndexCommands::IndexLibrary
- Inherits:
-
Object
- Object
- VivlioStarter::CLI::IndexCommands::IndexLibrary
- 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
-
.resolve_path(arg) ⇒ Object
export/import の対象パスを解決する。 book.yml には置かない——パスを変えたいのは「今回だけ別名で書き出す」ときで、 それは vs index:export mybook.yml のように引数で言うほうが早い。.
Instance Method Summary collapse
- #author_touched?(term) ⇒ Boolean
- #blank_yomi?(term) ⇒ Boolean
-
#export!(path) ⇒ Object
現プロジェクトの用語集[g]・reject をライブラリファイルへ書き出す。.
-
#export_glossary ⇒ Object
用語集[g]を term 昇順で term/yomi/definition のみ抽出する(固有情報は落とす)。.
-
#export_reject ⇒ Object
reject 一覧を term 昇順で term(+reason) のみ抽出する。.
-
#export_yomi ⇒ Object
読みの個人辞書(term => yomi)を term 昇順で抽出する。 作者由来の語(用語集[g]・手動マークアップ)の実読みと、これまでに 蓄積した overrides をまとめる(作者の語の読みを優先)。.
-
#import!(path, prefer_import: false) ⇒ Object
ライブラリファイルを現プロジェクトへ取り込む(追記マージ・既定は既存優先)。.
-
#initialize(terms_manager: UnifiedTermsManager.new, queue_manager: ReviewQueueManager.new) ⇒ IndexLibrary
constructor
A new instance of IndexLibrary.
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 のように引数で言うほうが早い。
45 46 47 48 49 |
# File 'lib/vivlio_starter/cli/index/index_library.rb', line 45 def self.resolve_path(arg) return File.(arg) if arg && !arg.to_s.empty? File.(DEFAULT_PATH) end |
Instance Method Details
#author_touched?(term) ⇒ Boolean
112 113 114 |
# File 'lib/vivlio_starter/cli/index/index_library.rb', line 112 def (term) term['flags'].to_s.include?('g') || term['source'] == 'manual_markup' end |
#blank_yomi?(term) ⇒ 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_glossary ⇒ Object
用語集[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_reject ⇒ Object
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_yomi ⇒ Object
読みの個人辞書(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 { (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
ライブラリファイルを現プロジェクトへ取り込む(追記マージ・既定は既存優先)。
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 |