図中テキストの font-family(§5.1・案 1)。本書の見出しフォントを先頭に、
リーダー標準の和文 sans フォールバックを併記する(epub_heading_font_family と同型)。
設定未ロード(プロジェクト外・単体テスト)では nil(mmdc 既定フォント)。
156
157
158
159
160
161
162
163
164
165
166
167
# File 'lib/vivlio_starter/cli/pre_process/mermaid_transformer.rb', line 156defconfigured_font_familyreturnnilunlessCommon.configured?book=Common::CONFIG.typography.heading.font.to_s.stripstack=[]stack<<"'#{book}'"unlessbook.empty?stack.concat(["'Hiragino Sans'","'Hiragino Kaku Gothic ProN'","'Noto Sans JP'","'Noto Sans CJK JP'",'sans-serif'])stack.join(', ')rescueStandardErrornilend
.default_renderer ⇒ Object
既定のレンダラ(mmdc)。プロセス内で 1 つを共有する。
207
# File 'lib/vivlio_starter/cli/pre_process/mermaid_transformer.rb', line 207defdefault_renderer=(@default_renderer||=MermaidRenderer.new)
.embed_label_font(svg) ⇒ Object
図中に出る字だけを絞った @font-face を SVG 自身へ持たせる。
この SVG は <img> から参照される独立文書なので、configured_font_family が
名指しした書体は解決されず OS の既定和文フォントへ落ち、Chromium がそれを
Type 3 で埋め込む(入稿で不可)。SVG 側は既に書体名を書いているため、
同名の @font-face を注ぐだけで解決する(font-family の書き換えは不要)。
詳細は type3-font-embedding-notes.md。
# File 'lib/vivlio_starter/cli/pre_process/mermaid_transformer.rb', line 186defescape_attr(str)str.to_s.gsub('&','&').gsub('<','<').gsub('>','>').gsub('"','"')end
# File 'lib/vivlio_starter/cli/pre_process/mermaid_transformer.rb', line 102defgenerate_pair!(source,font_family,renderer,cache_dir,key)svg=renderer.render(source,format::svg,font_family:)png=renderer.render(source,format::png,font_family:)returnfalseunlesssvg&&pngsvg=embed_label_font(svg)File.write(File.join(cache_dir,"#{key}.svg"),svg,encoding:'utf-8')File.binwrite(File.join(cache_dir,"#{key}.png"),png)trueend
# File 'lib/vivlio_starter/cli/pre_process/mermaid_transformer.rb', line 129defmermaid_block?(block)first=block.lines.first.to_s.lstripmarker=first[/\A(?:`{3,}|~{3,})/]returnfalseunlessmarkerfirst.delete_prefix(marker).strip.casecmp?('mermaid')end
# File 'lib/vivlio_starter/cli/pre_process/mermaid_transformer.rb', line 84defrender_block(source,lineno,chapter_slug:,source_filename:,renderer:)font_family=configured_font_familykey=cache_key(source,font_family,renderer)out_dir=File.join(Common::BUILD_HTML_DIR,'images',REL_BASE,chapter_slug)ok=GeneratedAssetCache.fetch(REL_BASE,["#{key}.svg","#{key}.png"],out_dir:)do|cache_dir|generate_pair!(source,font_family,renderer,cache_dir,key)endunlessokwarn_render_failed(source_filename,lineno)returnnilendrel_dir="images/#{REL_BASE}/#{chapter_slug}"figure("#{rel_dir}/#{key}.svg","#{rel_dir}/#{key}.png",alt_text(source))end
renderer(#available?, #render, #version)(defaults to: default_renderer)
—
mmdc レンダラ(テスト差し替え用)
Returns:
(String)
—
置換後の本文
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
# File 'lib/vivlio_starter/cli/pre_process/mermaid_transformer.rb', line 66deftransform(content,chapter_slug:,source_filename:,renderer:default_renderer)returncontentunlesscontent.match?(OPENER_HINT)warned=falseMasking.replace_top_level_fences(content)do|block,lineno|nextnilunlessmermaid_block?(block)unlessrenderer.available?warn_renderer_missing(source_filename)unlesswarnedwarned=truenextnilendrender_block(block_source(block),lineno,chapter_slug:,source_filename:,renderer:)endend