Class: ReVIEW::HTMLBuilder

Inherits:
Builder show all
Includes:
HTMLUtils, TextUtils
Defined in:
lib/review/htmlbuilder.rb

Direct Known Subclasses

EPUBBuilder

Constant Summary

Constants included from HTMLUtils

ReVIEW::HTMLUtils::ESC

Constants inherited from Builder

Builder::CAPTION_TITLES

Instance Attribute Summary

Attributes inherited from Builder

#doc_status

Instance Method Summary collapse

Methods included from HTMLUtils

#escape, #escape_comment, #highlight, #highlight?, #highlight_pygments, #highlight_rouge, #normalize_id, #strip_html, #unescape

Methods included from TextUtils

#add_space?, #defer_math_image, #detab, #join_lines_to_paragraph, #split_paragraph

Methods inherited from Builder

#bind, #compile_inline, #detab, #embed, #error, #escape, #extract_chapter_id, #firstlinenum, #get_chap, #graph, #graph_aafigure, #graph_blockdiag, #graph_gnuplot, #graph_graphviz, #graph_plantuml, #highlight?, #image, #initialize, #inline_column, #inline_embed, #inline_hd, #inline_href, #inline_imgref, #inline_include, #inline_kw, #inline_ruby, #inline_w, #inline_wb, #line_num, #load_words, #over_secnolevel?, #parse_metric, #parse_table_rows, #print, #puts, #raw, #system_graph, #table_rows, #target_name, #tsize, #warn

Constructor Details

This class inherits a constructor from ReVIEW::Builder

Instance Method Details

#best(lines, caption = nil) ⇒ Object



256
257
258
# File 'lib/review/htmlbuilder.rb', line 256

def best(lines, caption = nil)
  captionblock('best', lines, caption)
end

#bibpaper(lines, id, caption) ⇒ Object



943
944
945
946
947
948
# File 'lib/review/htmlbuilder.rb', line 943

def bibpaper(lines, id, caption)
  puts %Q(<div class="bibpaper">)
  bibpaper_header(id, caption)
  bibpaper_bibpaper(id, caption, lines) unless lines.empty?
  puts '</div>'
end

#bibpaper_bibpaper(_id, _caption, lines) ⇒ Object



957
958
959
# File 'lib/review/htmlbuilder.rb', line 957

def bibpaper_bibpaper(_id, _caption, lines)
  print split_paragraph(lines).join
end

#bibpaper_header(id, caption) ⇒ Object



950
951
952
953
954
955
# File 'lib/review/htmlbuilder.rb', line 950

def bibpaper_header(id, caption)
  print %Q(<a id="bib-#{normalize_id(id)}">)
  print "[#{@chapter.bibpaper(id).number}]"
  print '</a>'
  puts " #{compile_inline(caption)}"
end

#blanklineObject



770
771
772
# File 'lib/review/htmlbuilder.rb', line 770

def blankline
  puts '<p><br /></p>'
end

#box(lines, caption = nil) ⇒ Object



288
289
290
291
292
293
294
295
296
297
298
299
# File 'lib/review/htmlbuilder.rb', line 288

def box(lines, caption = nil)
  puts %Q(<div class="syntax">)
  if caption.present?
    puts %Q(<p class="caption">#{compile_inline(caption)}</p>)
  end
  print %Q(<pre class="syntax">)
  lines.each do |line|
    puts detab(line)
  end
  puts '</pre>'
  puts '</div>'
end

#bpo(lines) ⇒ Object



778
779
780
781
782
783
784
# File 'lib/review/htmlbuilder.rb', line 778

def bpo(lines)
  puts '<bpo>'
  lines.each do |line|
    puts detab(line)
  end
  puts '</bpo>'
end

#captionblock(type, lines, caption) ⇒ Object



230
231
232
233
234
235
236
237
238
# File 'lib/review/htmlbuilder.rb', line 230

def captionblock(type, lines, caption)
  puts %Q(<div class="#{type}">)
  if caption.present?
    puts %Q(<p class="caption">#{compile_inline(caption)}</p>)
  end
  blocked_lines = split_paragraph(lines)
  puts blocked_lines.join("\n")
  puts '</div>'
end

#caution(lines, caption = nil) ⇒ Object



268
269
270
# File 'lib/review/htmlbuilder.rb', line 268

def caution(lines, caption = nil)
  captionblock('caution', lines, caption)
end

#centering(lines) ⇒ Object



1174
1175
1176
# File 'lib/review/htmlbuilder.rb', line 1174

def centering(lines)
  puts split_paragraph(lines).join("\n").gsub('<p>', %Q(<p class="center">))
end

#cmd(lines, caption = nil) ⇒ Object



499
500
501
502
503
504
505
506
507
508
509
510
# File 'lib/review/htmlbuilder.rb', line 499

def cmd(lines, caption = nil)
  puts %Q(<div class="cmd-code">)
  if caption.present?
    puts %Q(<p class="caption">#{compile_inline(caption)}</p>)
  end
  print %Q(<pre class="cmd">)
  body = lines.inject('') { |i, j| i + detab(j) + "\n" }
  lexer = 'shell-session'
  puts highlight(body: body, lexer: lexer, format: 'html')
  puts '</pre>'
  puts '</div>'
end

#column_begin(level, label, caption) ⇒ Object



183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
# File 'lib/review/htmlbuilder.rb', line 183

def column_begin(level, label, caption)
  puts %Q(<div class="column">)

  @column += 1
  puts if level > 1
  a_id = %Q(<a id="column-#{@column}"></a>)

  if caption.empty?
    puts a_id if label
  elsif label
    puts %Q(<h#{level} id="#{normalize_id(label)}">#{a_id}#{compile_inline(caption)}</h#{level}>)
  else
    puts %Q(<h#{level}>#{a_id}#{compile_inline(caption)}</h#{level}>)
  end
end

#column_end(_level) ⇒ Object



199
200
201
# File 'lib/review/htmlbuilder.rb', line 199

def column_end(_level)
  puts '</div>'
end

#comment(lines, comment = nil) ⇒ Object



714
715
716
717
718
719
720
# File 'lib/review/htmlbuilder.rb', line 714

def comment(lines, comment = nil)
  return unless @book.config['draft']
  lines ||= []
  lines.unshift(escape(comment)) unless comment.blank?
  str = lines.join('<br />')
  puts %Q(<div class="draft-comment">#{str}</div>)
end

#compile_href(url, label) ⇒ Object



1162
1163
1164
1165
1166
1167
1168
# File 'lib/review/htmlbuilder.rb', line 1162

def compile_href(url, label)
  if @book.config['externallink']
    %Q(<a href="#{escape(url)}" class="link">#{label.nil? ? escape(url) : escape(label)}</a>)
  else
    label.nil? ? escape(url) : I18n.t('external_link', [escape(label), escape(url)])
  end
end

#compile_kw(word, alt) ⇒ Object



850
851
852
853
854
855
856
857
# File 'lib/review/htmlbuilder.rb', line 850

def compile_kw(word, alt)
  %Q(<b class="kw">) +
    if alt
    then escape(word + " (#{alt.strip})")
    else escape(word)
    end +
    "</b><!-- IDX:#{escape_comment(escape(word))} -->"
end

#compile_ruby(base, ruby) ⇒ Object



842
843
844
845
846
847
848
# File 'lib/review/htmlbuilder.rb', line 842

def compile_ruby(base, ruby)
  if @book.htmlversion == 5
    %Q(<ruby>#{escape(base)}<rp>#{I18n.t('ruby_prefix')}</rp><rt>#{escape(ruby)}</rt><rp>#{I18n.t('ruby_postfix')}</rp></ruby>)
  else
    %Q(<ruby><rb>#{escape(base)}</rb><rp>#{I18n.t('ruby_prefix')}</rp><rt>#{ruby}</rt><rp>#{I18n.t('ruby_postfix')}</rp></ruby>)
  end
end

#dd(lines) ⇒ Object



346
347
348
# File 'lib/review/htmlbuilder.rb', line 346

def dd(lines)
  puts "<dd>#{join_lines_to_paragraph(lines)}</dd>"
end

#dl_beginObject



338
339
340
# File 'lib/review/htmlbuilder.rb', line 338

def dl_begin
  puts '<dl>'
end

#dl_endObject



350
351
352
# File 'lib/review/htmlbuilder.rb', line 350

def dl_end
  puts '</dl>'
end

#doorquote(lines, ref) ⇒ Object



526
527
528
529
530
531
532
# File 'lib/review/htmlbuilder.rb', line 526

def doorquote(lines, ref)
  blocked_lines = split_paragraph(lines)
  puts %Q(<blockquote style="text-align:right;">)
  puts blocked_lines.join("\n")
  puts %Q(<p>#{ref}より</p>)
  puts '</blockquote>'
end

#dt(line) ⇒ Object



342
343
344
# File 'lib/review/htmlbuilder.rb', line 342

def dt(line)
  puts "<dt>#{line}</dt>"
end

#emlist(lines, caption = nil, lang = nil) ⇒ Object



456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
# File 'lib/review/htmlbuilder.rb', line 456

def emlist(lines, caption = nil, lang = nil)
  puts %Q(<div class="emlist-code">)
  if caption.present?
    puts %Q(<p class="caption">#{compile_inline(caption)}</p>)
  end
  class_names = ['emlist']
  class_names.push("language-#{lang}") unless lang.blank?
  class_names.push('highlight') if highlight?
  print %Q(<pre class="#{class_names.join(' ')}">)
  body = lines.inject('') { |i, j| i + detab(j) + "\n" }
  lexer = lang
  puts highlight(body: body, lexer: lexer, format: 'html')
  puts '</pre>'
  puts '</div>'
end

#emlistnum(lines, caption = nil, lang = nil) ⇒ Object



472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
# File 'lib/review/htmlbuilder.rb', line 472

def emlistnum(lines, caption = nil, lang = nil)
  puts %Q(<div class="emlistnum-code">)
  if caption.present?
    puts %Q(<p class="caption">#{compile_inline(caption)}</p>)
  end

  body = lines.inject('') { |i, j| i + detab(j) + "\n" }
  lexer = lang
  first_line_number = line_num
  hs = highlight(body: body, lexer: lexer, format: 'html', linenum: true,
                 options: { linenostart: first_line_number })
  if highlight?
    puts hs
  else
    class_names = ['emlist']
    class_names.push("language-#{lang}") unless lang.blank?
    class_names.push('highlight') if highlight?
    print %Q(<pre class="#{class_names.join(' ')}">)
    hs.split("\n").each_with_index do |line, i|
      puts detab((i + first_line_number).to_s.rjust(2) + ': ' + line)
    end
    puts '</pre>'
  end

  puts '</div>'
end

#emtable(lines, caption = nil) ⇒ Object



710
711
712
# File 'lib/review/htmlbuilder.rb', line 710

def emtable(lines, caption = nil)
  table(lines, nil, caption)
end

#extnameObject



40
41
42
# File 'lib/review/htmlbuilder.rb', line 40

def extname
  ".#{@book.config['htmlext']}"
end

#flushright(lines) ⇒ Object



1170
1171
1172
# File 'lib/review/htmlbuilder.rb', line 1170

def flushright(lines)
  puts split_paragraph(lines).join("\n").gsub('<p>', %Q(<p class="flushright">))
end

#footnote(id, str) ⇒ Object



722
723
724
725
726
727
728
729
730
731
732
733
# File 'lib/review/htmlbuilder.rb', line 722

def footnote(id, str)
  if @book.config['epubversion'].to_i == 3
    back = ''
    if @book.config['epubmaker'] && @book.config['epubmaker']['back_footnote']
      back = %Q(<a href="#fnb-#{normalize_id(id)}">#{I18n.t('html_footnote_backmark')}</a>)
    end
    # XXX: back link must be located at first of p for Kindle.
    puts %Q(<div class="footnote" epub:type="footnote" id="fn-#{normalize_id(id)}"><p class="footnote">#{back}#{I18n.t('html_footnote_textmark', @chapter.footnote(id).number)}#{compile_inline(str)}</p></div>)
  else
    puts %Q(<div class="footnote" id="fn-#{normalize_id(id)}"><p class="footnote">[<a href="#fnb-#{normalize_id(id)}">*#{@chapter.footnote(id).number}</a>] #{compile_inline(str)}</p></div>)
  end
end

#handle_metric(str) ⇒ Object



592
593
594
595
596
597
598
599
# File 'lib/review/htmlbuilder.rb', line 592

def handle_metric(str)
  if str =~ /\Ascale=([\d.]+)\Z/
    return { 'class' => sprintf('width-%03dper', ($1.to_f * 100).round) }
  end

  k, v = str.split('=', 2)
  { k => v.sub(/\A["']/, '').sub(/["']\Z/, '') }
end

#headline(level, label, caption) ⇒ Object



118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
# File 'lib/review/htmlbuilder.rb', line 118

def headline(level, label, caption)
  prefix, anchor = headline_prefix(level)
  if prefix
    prefix = %Q(<span class="secno">#{prefix}</span>)
  end
  puts '' if level > 1
  a_id = ''
  if anchor
    a_id = %Q(<a id="h#{anchor}"></a>)
  end

  if caption.empty?
    puts a_id if label
  elsif label
    puts %Q(<h#{level} id="#{normalize_id(label)}">#{a_id}#{prefix}#{compile_inline(caption)}</h#{level}>)
  else
    puts %Q(<h#{level}>#{a_id}#{prefix}#{compile_inline(caption)}</h#{level}>)
  end
end

#hrObject



762
763
764
# File 'lib/review/htmlbuilder.rb', line 762

def hr
  puts '<hr />'
end

#image_dummy(id, caption, lines) ⇒ Object



622
623
624
625
626
627
628
629
630
631
632
# File 'lib/review/htmlbuilder.rb', line 622

def image_dummy(id, caption, lines)
  warn "image not bound: #{id}"
  puts %Q(<div id="#{normalize_id(id)}" class="image">)
  puts %Q(<pre class="dummyimage">)
  lines.each do |line|
    puts detab(line)
  end
  puts '</pre>'
  image_header(id, caption)
  puts '</div>'
end

#image_extObject



1178
1179
1180
# File 'lib/review/htmlbuilder.rb', line 1178

def image_ext
  'png'
end

#image_header(id, caption) ⇒ Object



634
635
636
637
638
639
640
641
642
# File 'lib/review/htmlbuilder.rb', line 634

def image_header(id, caption)
  puts %Q(<p class="caption">)
  if get_chap
    puts %Q(#{I18n.t('image')}#{I18n.t('format_number_header', [get_chap, @chapter.image(id).number])}#{I18n.t('caption_prefix')}#{compile_inline(caption)})
  else
    puts %Q(#{I18n.t('image')}#{I18n.t('format_number_header_without_chapter', [@chapter.image(id).number])}#{I18n.t('caption_prefix')}#{compile_inline(caption)})
  end
  puts '</p>'
end

#image_image(id, caption, metric) ⇒ Object



614
615
616
617
618
619
620
# File 'lib/review/htmlbuilder.rb', line 614

def image_image(id, caption, metric)
  metrics = parse_metric('html', metric)
  puts %Q(<div id="#{normalize_id(id)}" class="image">)
  puts %Q(<img src="#{@chapter.image(id).path.sub(%r{\A\./}, '')}" alt="#{escape(compile_inline(caption))}"#{metrics} />)
  image_header(id, caption)
  puts '</div>'
end

#imgtable(lines, id, caption = nil, metric = nil) ⇒ Object



684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
# File 'lib/review/htmlbuilder.rb', line 684

def imgtable(lines, id, caption = nil, metric = nil)
  unless @chapter.image_bound?(id)
    warn "image not bound: #{id}"
    image_dummy(id, caption, lines)
    return
  end

  puts %Q(<div id="#{normalize_id(id)}" class="imgtable image">)
  begin
    if caption.present?
      table_header(id, caption)
    end
  rescue KeyError
    error "no such table: #{id}"
  end

  imgtable_image(id, caption, metric)

  puts '</div>'
end

#imgtable_image(id, caption, metric) ⇒ Object



705
706
707
708
# File 'lib/review/htmlbuilder.rb', line 705

def imgtable_image(id, caption, metric)
  metrics = parse_metric('html', metric)
  puts %Q(<img src="#{@chapter.image(id).path.sub(%r{\A\./}, '')}" alt="#{escape(compile_inline(caption))}"#{metrics} />)
end

#important(lines, caption = nil) ⇒ Object



260
261
262
# File 'lib/review/htmlbuilder.rb', line 260

def important(lines, caption = nil)
  captionblock('important', lines, caption)
end

#indepimage(lines, id, caption = '', metric = nil) ⇒ Object Also known as: numberlessimage



735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
# File 'lib/review/htmlbuilder.rb', line 735

def indepimage(lines, id, caption = '', metric = nil)
  metrics = parse_metric('html', metric)
  caption = '' unless caption.present?
  puts %Q(<div id="#{normalize_id(id)}" class="image">)
  begin
    puts %Q(<img src="#{@chapter.image(id).path.sub(%r{\A\./}, '')}" alt="#{escape(compile_inline(caption))}"#{metrics} />)
  rescue
    warn "image not bound: #{id}"
    if lines
      puts %Q(<pre class="dummyimage">)
      lines.each do |line|
        puts detab(line)
      end
      puts '</pre>'
    end
  end

  if caption.present?
    puts %Q(<p class="caption">)
    puts %Q(#{I18n.t('numberless_image')}#{I18n.t('caption_prefix')}#{compile_inline(caption)})
    puts '</p>'
  end
  puts '</div>'
end

#info(lines, caption = nil) ⇒ Object



248
249
250
# File 'lib/review/htmlbuilder.rb', line 248

def info(lines, caption = nil)
  captionblock('info', lines, caption)
end

#inline_abbr(str) ⇒ Object



1044
1045
1046
# File 'lib/review/htmlbuilder.rb', line 1044

def inline_abbr(str)
  inline_asis(str, 'abbr')
end

#inline_acronym(str) ⇒ Object



1048
1049
1050
# File 'lib/review/htmlbuilder.rb', line 1048

def inline_acronym(str)
  inline_asis(str, 'acronym')
end

#inline_ami(str) ⇒ Object



867
868
869
# File 'lib/review/htmlbuilder.rb', line 867

def inline_ami(str)
  %Q(<span class="ami">#{escape(str)}</span>)
end

#inline_asis(str, tag) ⇒ Object



1040
1041
1042
# File 'lib/review/htmlbuilder.rb', line 1040

def inline_asis(str, tag)
  %Q(<#{tag}>#{escape(str)}</#{tag}>)
end

#inline_b(str) ⇒ Object



863
864
865
# File 'lib/review/htmlbuilder.rb', line 863

def inline_b(str)
  %Q(<b>#{escape(str)}</b>)
end

#inline_balloon(str) ⇒ Object



1150
1151
1152
# File 'lib/review/htmlbuilder.rb', line 1150

def inline_balloon(str)
  %Q(<span class="balloon">#{escape_html(str)}</span>)
end

#inline_bib(id) ⇒ Object



961
962
963
964
965
# File 'lib/review/htmlbuilder.rb', line 961

def inline_bib(id)
  %Q(<a href="#{@book.bib_file.gsub(/\.re\Z/, ".#{@book.config['htmlext']}")}#bib-#{normalize_id(id)}">[#{@chapter.bibpaper(id).number}]</a>)
rescue KeyError
  error "unknown bib: #{id}"
end

#inline_big(str) ⇒ Object



1080
1081
1082
# File 'lib/review/htmlbuilder.rb', line 1080

def inline_big(str)
  inline_asis(str, 'big')
end

#inline_bou(str) ⇒ Object



871
872
873
# File 'lib/review/htmlbuilder.rb', line 871

def inline_bou(str)
  %Q(<span class="bou">#{escape(str)}</span>)
end

#inline_br(_str) ⇒ Object



911
912
913
# File 'lib/review/htmlbuilder.rb', line 911

def inline_br(_str)
  '<br />'
end

#inline_chap(id) ⇒ Object



811
812
813
814
815
816
817
818
819
# File 'lib/review/htmlbuilder.rb', line 811

def inline_chap(id)
  if @book.config['chapterlink']
    %Q(<a href="./#{id}#{extname}">#{@book.chapter_index.number(id)}</a>)
  else
    @book.chapter_index.number(id)
  end
rescue KeyError
  error "unknown chapter: #{id}"
end

#inline_chapref(id) ⇒ Object



800
801
802
803
804
805
806
807
808
809
# File 'lib/review/htmlbuilder.rb', line 800

def inline_chapref(id)
  title = super
  if @book.config['chapterlink']
    %Q(<a href="./#{id}#{extname}">#{title}</a>)
  else
    title
  end
rescue KeyError
  error "unknown chapter: #{id}"
end

#inline_cite(str) ⇒ Object



1052
1053
1054
# File 'lib/review/htmlbuilder.rb', line 1052

def inline_cite(str)
  inline_asis(str, 'cite')
end

#inline_code(str) ⇒ Object



895
896
897
898
899
900
901
# File 'lib/review/htmlbuilder.rb', line 895

def inline_code(str)
  if @book.htmlversion == 5
    %Q(<code class="inline-code tt">#{escape(str)}</code>)
  else
    %Q(<tt class="inline-code">#{escape(str)}</tt>)
  end
end

#inline_column_chap(chapter, id) ⇒ Object



990
991
992
993
994
995
996
997
998
# File 'lib/review/htmlbuilder.rb', line 990

def inline_column_chap(chapter, id)
  if @book.config['chapterlink']
    %Q(<a href="\##{column_label(id, chapter)}" class="columnref">#{I18n.t('column', compile_inline(chapter.column(id).caption))}</a>)
  else
    I18n.t('column', compile_inline(chapter.column(id).caption))
  end
rescue KeyError
  error "unknown column: #{id}"
end

#inline_comment(str) ⇒ Object



1133
1134
1135
1136
1137
1138
1139
# File 'lib/review/htmlbuilder.rb', line 1133

def inline_comment(str)
  if @book.config['draft']
    %Q(<span class="draft-comment">#{escape(str)}</span>)
  else
    ''
  end
end

#inline_del(str) ⇒ Object



1104
1105
1106
# File 'lib/review/htmlbuilder.rb', line 1104

def inline_del(str)
  inline_asis(str, 'del')
end

#inline_dfn(str) ⇒ Object



1056
1057
1058
# File 'lib/review/htmlbuilder.rb', line 1056

def inline_dfn(str)
  inline_asis(str, 'dfn')
end

#inline_dtp(str) ⇒ Object



891
892
893
# File 'lib/review/htmlbuilder.rb', line 891

def inline_dtp(str)
  "<?dtp #{str} ?>"
end

#inline_em(str) ⇒ Object



1060
1061
1062
# File 'lib/review/htmlbuilder.rb', line 1060

def inline_em(str)
  inline_asis(str, 'em')
end

#inline_eq(id) ⇒ Object



1030
1031
1032
1033
1034
1035
1036
1037
1038
# File 'lib/review/htmlbuilder.rb', line 1030

def inline_eq(id)
  str = super(id)
  chapter, id = extract_chapter_id(id)
  if @book.config['chapterlink']
    %Q(<span class="eqref"><a href="./#{chapter.id}#{extname}##{normalize_id(id)}">#{str}</a></span>)
  else
    %Q(<span class="eqref">#{str}</span>)
  end
end

#inline_fn(id) ⇒ Object



832
833
834
835
836
837
838
839
840
# File 'lib/review/htmlbuilder.rb', line 832

def inline_fn(id)
  if @book.config['epubversion'].to_i == 3
    %Q(<a id="fnb-#{normalize_id(id)}" href="#fn-#{normalize_id(id)}" class="noteref" epub:type="noteref">#{I18n.t('html_footnote_refmark', @chapter.footnote(id).number)}</a>)
  else
    %Q(<a id="fnb-#{normalize_id(id)}" href="#fn-#{normalize_id(id)}" class="noteref">*#{@chapter.footnote(id).number}</a>)
  end
rescue KeyError
  error "unknown footnote: #{id}"
end

#inline_hd_chap(chap, id) ⇒ Object



967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
# File 'lib/review/htmlbuilder.rb', line 967

def inline_hd_chap(chap, id)
  n = chap.headline_index.number(id)
  if n.present? && chap.number && over_secnolevel?(n)
    str = I18n.t('hd_quote', [n, compile_inline(chap.headline(id).caption)])
  else
    str = I18n.t('hd_quote_without_number', compile_inline(chap.headline(id).caption))
  end
  if @book.config['chapterlink']
    anchor = 'h' + n.gsub('.', '-')
    %Q(<a href="#{chap.id}#{extname}##{anchor}">#{str}</a>)
  else
    str
  end
rescue KeyError
  error "unknown headline: #{id}"
end

#inline_hidx(str) ⇒ Object



907
908
909
# File 'lib/review/htmlbuilder.rb', line 907

def inline_hidx(str)
  %Q(<!-- IDX:#{escape_comment(escape(str))} -->)
end

#inline_i(str) ⇒ Object



859
860
861
# File 'lib/review/htmlbuilder.rb', line 859

def inline_i(str)
  %Q(<i>#{escape(str)}</i>)
end

#inline_icon(id) ⇒ Object



1120
1121
1122
1123
1124
1125
1126
1127
# File 'lib/review/htmlbuilder.rb', line 1120

def inline_icon(id)
  begin
    %Q(<img src="#{@chapter.image(id).path.sub(%r{\A\./}, '')}" alt="[#{id}]" />)
  rescue
    warn "image not bound: #{id}"
    %Q(<pre>missing image: #{id}</pre>)
  end
end

#inline_idx(str) ⇒ Object



903
904
905
# File 'lib/review/htmlbuilder.rb', line 903

def inline_idx(str)
  %Q(#{escape(str)}<!-- IDX:#{escape_comment(escape(str))} -->)
end

#inline_img(id) ⇒ Object



1020
1021
1022
1023
1024
1025
1026
1027
1028
# File 'lib/review/htmlbuilder.rb', line 1020

def inline_img(id)
  str = super(id)
  chapter, id = extract_chapter_id(id)
  if @book.config['chapterlink']
    %Q(<span class="imgref"><a href="./#{chapter.id}#{extname}##{normalize_id(id)}">#{str}</a></span>)
  else
    %Q(<span class="imgref">#{str}</span>)
  end
end

#inline_ins(str) ⇒ Object



1108
1109
1110
# File 'lib/review/htmlbuilder.rb', line 1108

def inline_ins(str)
  inline_asis(str, 'ins')
end

#inline_kbd(str) ⇒ Object



1064
1065
1066
# File 'lib/review/htmlbuilder.rb', line 1064

def inline_kbd(str)
  inline_asis(str, 'kbd')
end

#inline_labelref(idref) ⇒ Object Also known as: inline_ref



790
791
792
# File 'lib/review/htmlbuilder.rb', line 790

def inline_labelref(idref)
  %Q(<a target='#{escape(idref)}'>「#{I18n.t('label_marker')}#{escape(idref)}」</a>)
end

#inline_list(id) ⇒ Object



1000
1001
1002
1003
1004
1005
1006
1007
1008
# File 'lib/review/htmlbuilder.rb', line 1000

def inline_list(id)
  str = super(id)
  chapter, id = extract_chapter_id(id)
  if @book.config['chapterlink']
    %Q(<span class="listref"><a href="./#{chapter.id}#{extname}##{normalize_id(id)}">#{str}</a></span>)
  else
    %Q(<span class="listref">#{str}</span>)
  end
end

#inline_m(str) ⇒ Object



915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
# File 'lib/review/htmlbuilder.rb', line 915

def inline_m(str)
  if @book.config['mathml']
    require 'math_ml'
    require 'math_ml/symbol/character_reference'
    parser = MathML::LaTeX::Parser.new(symbol: MathML::Symbol::CharacterReference)
    %Q(<span class="equation">#{parser.parse(str, nil)}</span>)
  elsif @book.config['imgmath']
    math_str = '$' + str + '$'
    key = Digest::SHA256.hexdigest(str)
    math_dir = File.join(@book.config['imagedir'], '_review_math')
    Dir.mkdir(math_dir) unless Dir.exist?(math_dir)
    img_path = File.join(math_dir, "_gen_#{key}.#{@book.config['imgmath_options']['format']}")
    if @book.config.check_version('2', exception: false)
      make_math_image(math_str, img_path)
      %Q(<span class="equation"><img src="#{img_path}" /></span>)
    else
      defer_math_image(math_str, img_path, key)
      %Q(<span class="equation"><img src="#{img_path}" class="math_gen_#{key}" alt="#{escape(str)}" /></span>)
    end
  else
    %Q(<span class="equation">#{escape(str)}</span>)
  end
end

#inline_pageref(id) ⇒ Object



796
797
798
# File 'lib/review/htmlbuilder.rb', line 796

def inline_pageref(id)
  error "pageref op is unsupported on this builder: #{id}"
end

#inline_raw(str) ⇒ Object



1154
1155
1156
# File 'lib/review/htmlbuilder.rb', line 1154

def inline_raw(str)
  super(str)
end

#inline_recipe(str) ⇒ Object



1116
1117
1118
# File 'lib/review/htmlbuilder.rb', line 1116

def inline_recipe(str)
  %Q(<span class="recipe">「#{escape(str)}」</span>)
end

#inline_samp(str) ⇒ Object



1068
1069
1070
# File 'lib/review/htmlbuilder.rb', line 1068

def inline_samp(str)
  inline_asis(str, 'samp')
end

#inline_small(str) ⇒ Object



1084
1085
1086
# File 'lib/review/htmlbuilder.rb', line 1084

def inline_small(str)
  inline_asis(str, 'small')
end

#inline_strong(str) ⇒ Object



1072
1073
1074
# File 'lib/review/htmlbuilder.rb', line 1072

def inline_strong(str)
  inline_asis(str, 'strong')
end

#inline_sub(str) ⇒ Object



1088
1089
1090
# File 'lib/review/htmlbuilder.rb', line 1088

def inline_sub(str)
  inline_asis(str, 'sub')
end

#inline_sup(str) ⇒ Object



1092
1093
1094
# File 'lib/review/htmlbuilder.rb', line 1092

def inline_sup(str)
  inline_asis(str, 'sup')
end

#inline_table(id) ⇒ Object



1010
1011
1012
1013
1014
1015
1016
1017
1018
# File 'lib/review/htmlbuilder.rb', line 1010

def inline_table(id)
  str = super(id)
  chapter, id = extract_chapter_id(id)
  if @book.config['chapterlink']
    %Q(<span class="tableref"><a href="./#{chapter.id}#{extname}##{normalize_id(id)}">#{str}</a></span>)
  else
    %Q(<span class="tableref">#{str}</span>)
  end
end

#inline_tcy(str) ⇒ Object



1141
1142
1143
1144
1145
1146
1147
1148
# File 'lib/review/htmlbuilder.rb', line 1141

def inline_tcy(str)
  # 縦中横用のtcy、uprightのCSSスタイルについては電書協ガイドラインを参照
  style = 'tcy'
  if str.size == 1 && str.match(/[[:ascii:]]/)
    style = 'upright'
  end
  %Q(<span class="#{style}">#{escape(str)}</span>)
end

#inline_title(id) ⇒ Object



821
822
823
824
825
826
827
828
829
830
# File 'lib/review/htmlbuilder.rb', line 821

def inline_title(id)
  title = super
  if @book.config['chapterlink']
    %Q(<a href="./#{id}#{extname}">#{title}</a>)
  else
    title
  end
rescue KeyError
  error "unknown chapter: #{id}"
end

#inline_tt(str) ⇒ Object



1096
1097
1098
1099
1100
1101
1102
# File 'lib/review/htmlbuilder.rb', line 1096

def inline_tt(str)
  if @book.htmlversion == 5
    %Q(<code class="tt">#{escape(str)}</code>)
  else
    %Q(<tt>#{escape(str)}</tt>)
  end
end

#inline_ttb(str) ⇒ Object



883
884
885
886
887
888
889
# File 'lib/review/htmlbuilder.rb', line 883

def inline_ttb(str)
  if @book.htmlversion == 5
    %Q(<code class="tt"><b>#{escape(str)}</b></code>)
  else
    %Q(<tt><b>#{escape(str)}</b></tt>)
  end
end

#inline_tti(str) ⇒ Object



875
876
877
878
879
880
881
# File 'lib/review/htmlbuilder.rb', line 875

def inline_tti(str)
  if @book.htmlversion == 5
    %Q(<code class="tt"><i>#{escape(str)}</i></code>)
  else
    %Q(<tt><i>#{escape(str)}</i></tt>)
  end
end

#inline_u(str) ⇒ Object



1112
1113
1114
# File 'lib/review/htmlbuilder.rb', line 1112

def inline_u(str)
  %Q(<u>#{escape(str)}</u>)
end

#inline_uchar(str) ⇒ Object



1129
1130
1131
# File 'lib/review/htmlbuilder.rb', line 1129

def inline_uchar(str)
  %Q(&#x#{str};)
end

#inline_var(str) ⇒ Object



1076
1077
1078
# File 'lib/review/htmlbuilder.rb', line 1076

def inline_var(str)
  inline_asis(str, 'var')
end

#label(id) ⇒ Object



766
767
768
# File 'lib/review/htmlbuilder.rb', line 766

def label(id)
  puts %Q(<a id="#{normalize_id(id)}"></a>)
end

#layoutfileObject



63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
# File 'lib/review/htmlbuilder.rb', line 63

def layoutfile
  if @book.config.maker == 'webmaker'
    htmldir = 'web/html'
    localfilename = 'layout-web.html.erb'
  else
    htmldir = 'html'
    localfilename = 'layout.html.erb'
  end
  if @book.htmlversion == 5
    htmlfilename = File.join(htmldir, 'layout-html5.html.erb')
  else
    htmlfilename = File.join(htmldir, 'layout-xhtml1.html.erb')
  end

  layout_file = File.join(@book.basedir, 'layouts', localfilename)
  if !File.exist?(layout_file) && File.exist?(File.join(@book.basedir, 'layouts', 'layout.erb'))
    raise ReVIEW::ConfigError, 'layout.erb is obsoleted. Please use layout.html.erb.'
  end
  if File.exist?(layout_file)
    if ENV['REVIEW_SAFE_MODE'].to_i & 4 > 0
      warn %Q(user's layout is prohibited in safe mode. ignored.)
      layout_file = File.expand_path(htmlfilename, ReVIEW::Template::TEMPLATE_DIR)
    end
  else
    layout_file = File.expand_path(htmlfilename, ReVIEW::Template::TEMPLATE_DIR)
  end
  layout_file
end

#list(lines, id, caption, lang = nil) ⇒ Object



374
375
376
377
378
379
380
381
382
383
# File 'lib/review/htmlbuilder.rb', line 374

def list(lines, id, caption, lang = nil)
  puts %Q(<div id="#{normalize_id(id)}" class="caption-code">)
  begin
    list_header(id, caption, lang)
  rescue KeyError
    error "no such list: #{id}"
  end
  list_body(id, lines, lang)
  puts '</div>'
end

#list_body(_id, lines, lang) ⇒ Object



393
394
395
396
397
398
399
400
401
402
# File 'lib/review/htmlbuilder.rb', line 393

def list_body(_id, lines, lang)
  class_names = ['list']
  lexer = lang
  class_names.push("language-#{lexer}") unless lexer.blank?
  class_names.push('highlight') if highlight?
  print %Q(<pre class="#{class_names.join(' ')}">)
  body = lines.inject('') { |i, j| i + detab(j) + "\n" }
  puts highlight(body: body, lexer: lexer, format: 'html')
  puts '</pre>'
end

#list_header(id, caption, _lang) ⇒ Object



385
386
387
388
389
390
391
# File 'lib/review/htmlbuilder.rb', line 385

def list_header(id, caption, _lang)
  if get_chap
    puts %Q(<p class="caption">#{I18n.t('list')}#{I18n.t('format_number_header', [get_chap, @chapter.list(id).number])}#{I18n.t('caption_prefix')}#{compile_inline(caption)}</p>)
  else
    puts %Q(<p class="caption">#{I18n.t('list')}#{I18n.t('format_number_header_without_chapter', [@chapter.list(id).number])}#{I18n.t('caption_prefix')}#{compile_inline(caption)}</p>)
  end
end

#listnum(lines, id, caption, lang = nil) ⇒ Object



425
426
427
428
429
430
431
432
433
434
# File 'lib/review/htmlbuilder.rb', line 425

def listnum(lines, id, caption, lang = nil)
  puts %Q(<div id="#{normalize_id(id)}" class="code">)
  begin
    list_header(id, caption, lang)
  rescue KeyError
    error "no such list: #{id}"
  end
  listnum_body(lines, lang)
  puts '</div>'
end

#listnum_body(lines, lang) ⇒ Object



436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
# File 'lib/review/htmlbuilder.rb', line 436

def listnum_body(lines, lang)
  body = lines.inject('') { |i, j| i + detab(j) + "\n" }
  lexer = lang
  first_line_number = line_num
  hs = highlight(body: body, lexer: lexer, format: 'html', linenum: true,
                 options: { linenostart: first_line_number })

  if highlight?
    puts hs
  else
    class_names = ['list']
    class_names.push("language-#{lang}") unless lang.blank?
    print %Q(<pre class="#{class_names.join(' ')}">)
    hs.split("\n").each_with_index do |line, i|
      puts detab((i + first_line_number).to_s.rjust(2) + ': ' + line)
    end
    puts '</pre>'
  end
end

#make_math_image(str, path, fontsize = 12) ⇒ Object



1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
# File 'lib/review/htmlbuilder.rb', line 1186

def make_math_image(str, path, fontsize = 12)
  # Re:VIEW 2 compatibility
  fontsize2 = (fontsize * 1.2).round.to_i
  texsrc = <<-EOB
\\documentclass[12pt]{article}
\\usepackage[utf8]{inputenc}
\\usepackage{amsmath}
\\usepackage{amsthm}
\\usepackage{amssymb}
\\usepackage{amsfonts}
\\usepackage{anyfontsize}
\\usepackage{bm}
\\pagestyle{empty}

\\begin{document}
\\fontsize{#{fontsize}}{#{fontsize2}}\\selectfont #{str}
\\end{document}
  EOB
  Dir.mktmpdir do |tmpdir|
    tex_path = File.join(tmpdir, 'tmpmath.tex')
    dvi_path = File.join(tmpdir, 'tmpmath.dvi')
    File.write(tex_path, texsrc)
    cmd = "latex --interaction=nonstopmode --output-directory=#{tmpdir} #{tex_path} && dvipng -T tight -z9 -o #{path} #{dvi_path}"
    out, status = Open3.capture2e(cmd)
    unless status.success?
      error "latex compile error\n\nError log:\n" + out
    end
  end
end

#memo(lines, caption = nil) ⇒ Object



240
241
242
# File 'lib/review/htmlbuilder.rb', line 240

def memo(lines, caption = nil)
  captionblock('memo', lines, caption)
end

#nodisp_begin(level, label, caption) ⇒ Object



168
169
170
171
172
173
174
175
176
177
178
# File 'lib/review/htmlbuilder.rb', line 168

def nodisp_begin(level, label, caption)
  @nonum_counter += 1
  puts '' if level > 1
  return unless caption.present?
  if label
    puts %Q(<a id="#{normalize_id(label)}" /><h#{level} id="#{normalize_id(label)}" hidden="true">#{compile_inline(caption)}</h#{level}>)
  else
    id = normalize_id("#{@chapter.name}_nonum#{@nonum_counter}")
    puts %Q(<a id="#{id}" /><h#{level} id="#{id}" hidden="true">#{compile_inline(caption)}</h#{level}>)
  end
end

#nodisp_end(level) ⇒ Object



180
181
# File 'lib/review/htmlbuilder.rb', line 180

def nodisp_end(level)
end

#nofunc_text(str) ⇒ Object



1158
1159
1160
# File 'lib/review/htmlbuilder.rb', line 1158

def nofunc_text(str)
  escape(str)
end

#noindentObject



786
787
788
# File 'lib/review/htmlbuilder.rb', line 786

def noindent
  @noindent = true
end

#nonum_begin(level, label, caption) ⇒ Object



138
139
140
141
142
143
144
145
146
147
148
# File 'lib/review/htmlbuilder.rb', line 138

def nonum_begin(level, label, caption)
  @nonum_counter += 1
  puts if level > 1
  return unless caption.present?
  if label
    puts %Q(<h#{level} id="#{normalize_id(label)}">#{compile_inline(caption)}</h#{level}>)
  else
    id = normalize_id("#{@chapter.name}_nonum#{@nonum_counter}")
    puts %Q(<h#{level} id="#{id}">#{compile_inline(caption)}</h#{level}>)
  end
end

#nonum_end(level) ⇒ Object



150
151
# File 'lib/review/htmlbuilder.rb', line 150

def nonum_end(level)
end

#note(lines, caption = nil) ⇒ Object



301
302
303
# File 'lib/review/htmlbuilder.rb', line 301

def note(lines, caption = nil)
  captionblock('note', lines, caption)
end

#notice(lines, caption = nil) ⇒ Object



272
273
274
# File 'lib/review/htmlbuilder.rb', line 272

def notice(lines, caption = nil)
  captionblock('notice', lines, caption)
end

#notoc_begin(level, label, caption) ⇒ Object



153
154
155
156
157
158
159
160
161
162
163
# File 'lib/review/htmlbuilder.rb', line 153

def notoc_begin(level, label, caption)
  @nonum_counter += 1
  puts if level > 1
  return unless caption.present?
  if label
    puts %Q(<h#{level} id="#{normalize_id(label)}" notoc="true">#{compile_inline(caption)}</h#{level}>)
  else
    id = normalize_id("#{@chapter.name}_nonum#{@nonum_counter}")
    puts %Q(<h#{level} id="#{id}" notoc="true">#{compile_inline(caption)}</h#{level}>)
  end
end

#notoc_end(level) ⇒ Object



165
166
# File 'lib/review/htmlbuilder.rb', line 165

def notoc_end(level)
end

#ol_beginObject



321
322
323
324
325
326
327
328
# File 'lib/review/htmlbuilder.rb', line 321

def ol_begin
  if @ol_num
    puts %Q(<ol start="#{@ol_num}">) # it's OK in HTML5, but not OK in XHTML1.1
    @ol_num = nil
  else
    puts '<ol>'
  end
end

#ol_endObject



334
335
336
# File 'lib/review/htmlbuilder.rb', line 334

def ol_end
  puts '</ol>'
end

#ol_item(lines, _num) ⇒ Object



330
331
332
# File 'lib/review/htmlbuilder.rb', line 330

def ol_item(lines, _num)
  puts "<li>#{join_lines_to_paragraph(lines)}</li>"
end

#olnum(num) ⇒ Object



1182
1183
1184
# File 'lib/review/htmlbuilder.rb', line 1182

def olnum(num)
  @ol_num = num.to_i
end

#pagebreakObject



774
775
776
# File 'lib/review/htmlbuilder.rb', line 774

def pagebreak
  puts %Q(<br class="pagebreak" />)
end

#paragraph(lines) ⇒ Object



354
355
356
357
358
359
360
361
# File 'lib/review/htmlbuilder.rb', line 354

def paragraph(lines)
  if @noindent
    puts %Q(<p class="noindent">#{join_lines_to_paragraph(lines)}</p>)
    @noindent = nil
  else
    puts "<p>#{join_lines_to_paragraph(lines)}</p>"
  end
end

#parasepObject



363
364
365
# File 'lib/review/htmlbuilder.rb', line 363

def parasep
  puts '<br />'
end

#planning(lines, caption = nil) ⇒ Object



252
253
254
# File 'lib/review/htmlbuilder.rb', line 252

def planning(lines, caption = nil)
  captionblock('planning', lines, caption)
end

#point(lines, caption = nil) ⇒ Object



280
281
282
# File 'lib/review/htmlbuilder.rb', line 280

def point(lines, caption = nil)
  captionblock('point', lines, caption)
end

#post_paragraphObject



36
37
38
# File 'lib/review/htmlbuilder.rb', line 36

def post_paragraph
  '</p>'
end

#pre_paragraphObject



32
33
34
# File 'lib/review/htmlbuilder.rb', line 32

def pre_paragraph
  '<p>'
end

#quote(lines) ⇒ Object



521
522
523
524
# File 'lib/review/htmlbuilder.rb', line 521

def quote(lines)
  blocked_lines = split_paragraph(lines)
  puts %Q(<blockquote>#{blocked_lines.join("\n")}</blockquote>)
end

#read(lines) ⇒ Object Also known as: lead



367
368
369
370
# File 'lib/review/htmlbuilder.rb', line 367

def read(lines)
  blocked_lines = split_paragraph(lines)
  puts %Q(<div class="lead">\n#{blocked_lines.join("\n")}\n</div>)
end

#ref_begin(level, label, caption) ⇒ Object



212
213
214
215
# File 'lib/review/htmlbuilder.rb', line 212

def ref_begin(level, label, caption)
  print %Q(<div class="reference">)
  headline(level, label, caption)
end

#ref_end(_level) ⇒ Object



217
218
219
# File 'lib/review/htmlbuilder.rb', line 217

def ref_end(_level)
  puts '</div>'
end

#resultObject



92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
# File 'lib/review/htmlbuilder.rb', line 92

def result
  # default XHTML header/footer
  @title = strip_html(compile_inline(@chapter.title))
  @body = @output.string
  @language = @book.config['language']
  @stylesheets = @book.config['stylesheet']
  @next = @chapter.next_chapter
  @prev = @chapter.prev_chapter
  @next_title = @next ? compile_inline(@next.title) : ''
  @prev_title = @prev ? compile_inline(@prev.title) : ''

  if @book.config.maker == 'webmaker'
    @toc = ReVIEW::WEBTOCPrinter.book_to_string(@book)
  end

  ReVIEW::Template.load(layoutfile).result(binding)
end

#result_metric(array) ⇒ Object



601
602
603
604
605
606
607
608
609
610
611
612
# File 'lib/review/htmlbuilder.rb', line 601

def result_metric(array)
  attrs = {}
  array.each do |item|
    k = item.keys[0]
    if attrs[k]
      attrs[k] << item[k]
    else
      attrs[k] = [item[k]]
    end
  end
  ' ' + attrs.map { |k, v| %Q(#{k}="#{v.join(' ')}") }.join(' ')
end

#security(lines, caption = nil) ⇒ Object



264
265
266
# File 'lib/review/htmlbuilder.rb', line 264

def security(lines, caption = nil)
  captionblock('security', lines, caption)
end

#shoot(lines, caption = nil) ⇒ Object



284
285
286
# File 'lib/review/htmlbuilder.rb', line 284

def shoot(lines, caption = nil)
  captionblock('shoot', lines, caption)
end

#source(lines, caption = nil, lang = nil) ⇒ Object



404
405
406
407
408
409
# File 'lib/review/htmlbuilder.rb', line 404

def source(lines, caption = nil, lang = nil)
  puts %Q(<div class="source-code">)
  source_header(caption)
  source_body(caption, lines, lang)
  puts '</div>'
end

#source_body(_id, lines, lang) ⇒ Object



417
418
419
420
421
422
423
# File 'lib/review/htmlbuilder.rb', line 417

def source_body(_id, lines, lang)
  print %Q(<pre class="source">)
  body = lines.inject('') { |i, j| i + detab(j) + "\n" }
  lexer = lang
  puts highlight(body: body, lexer: lexer, format: 'html')
  puts '</pre>'
end

#source_header(caption) ⇒ Object



411
412
413
414
415
# File 'lib/review/htmlbuilder.rb', line 411

def source_header(caption)
  if caption.present?
    puts %Q(<p class="caption">#{compile_inline(caption)}</p>)
  end
end

#sup_begin(level, label, caption) ⇒ Object



221
222
223
224
# File 'lib/review/htmlbuilder.rb', line 221

def sup_begin(level, label, caption)
  print %Q(<div class="supplement">)
  headline(level, label, caption)
end

#sup_end(_level) ⇒ Object



226
227
228
# File 'lib/review/htmlbuilder.rb', line 226

def sup_end(_level)
  puts '</div>'
end

#table(lines, id = nil, caption = nil) ⇒ Object



644
645
646
647
648
649
650
651
652
# File 'lib/review/htmlbuilder.rb', line 644

def table(lines, id = nil, caption = nil)
  if id
    puts %Q(<div id="#{normalize_id(id)}" class="table">)
  else
    puts %Q(<div class="table">)
  end
  super(lines, id, caption)
  puts '</div>'
end

#table_begin(_ncols) ⇒ Object



664
665
666
# File 'lib/review/htmlbuilder.rb', line 664

def table_begin(_ncols)
  puts '<table>'
end

#table_endObject



680
681
682
# File 'lib/review/htmlbuilder.rb', line 680

def table_end
  puts '</table>'
end

#table_header(id, caption) ⇒ Object



654
655
656
657
658
659
660
661
662
# File 'lib/review/htmlbuilder.rb', line 654

def table_header(id, caption)
  if id.nil?
    puts %Q(<p class="caption">#{compile_inline(caption)}</p>)
  elsif get_chap
    puts %Q(<p class="caption">#{I18n.t('table')}#{I18n.t('format_number_header', [get_chap, @chapter.table(id).number])}#{I18n.t('caption_prefix')}#{compile_inline(caption)}</p>)
  else
    puts %Q(<p class="caption">#{I18n.t('table')}#{I18n.t('format_number_header_without_chapter', [@chapter.table(id).number])}#{I18n.t('caption_prefix')}#{compile_inline(caption)}</p>)
  end
end

#talk(lines) ⇒ Object



534
535
536
537
538
539
# File 'lib/review/htmlbuilder.rb', line 534

def talk(lines)
  puts %Q(<div class="talk">)
  blocked_lines = split_paragraph(lines)
  puts blocked_lines.join("\n")
  puts '</div>'
end

#td(str) ⇒ Object



676
677
678
# File 'lib/review/htmlbuilder.rb', line 676

def td(str)
  "<td>#{str}</td>"
end

#texequation(lines, id = nil, caption = '') ⇒ Object



541
542
543
544
545
546
547
548
549
550
551
552
# File 'lib/review/htmlbuilder.rb', line 541

def texequation(lines, id = nil, caption = '')
  if id
    puts %Q(<div id="#{normalize_id(id)}" class="caption-equation">)
    texequation_header(id, caption)
  end

  texequation_body(lines)

  if id
    puts '</div>'
  end
end

#texequation_body(lines) ⇒ Object



562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
# File 'lib/review/htmlbuilder.rb', line 562

def texequation_body(lines)
  puts %Q(<div class="equation">)
  if @book.config['mathml']
    require 'math_ml'
    require 'math_ml/symbol/character_reference'
    p = MathML::LaTeX::Parser.new(symbol: MathML::Symbol::CharacterReference)
    print p.parse(lines.join("\n") + "\n", true)
  elsif @book.config['imgmath']
    fontsize = @book.config['imgmath_options']['fontsize'].to_f
    lineheight = @book.config['imgmath_options']['lineheight'].to_f
    math_str = "\\begin{equation*}\n\\fontsize{#{fontsize}}{#{lineheight}}\\selectfont\n#{lines.join("\n")}\n\\end{equation*}\n"
    key = Digest::SHA256.hexdigest(math_str)
    math_dir = File.join(@book.config['imagedir'], '_review_math')
    Dir.mkdir(math_dir) unless Dir.exist?(math_dir)
    img_path = File.join(math_dir, "_gen_#{key}.#{@book.config['imgmath_options']['format']}")
    if @book.config.check_version('2', exception: false)
      make_math_image(math_str, img_path)
      puts %Q(<img src="#{img_path}" />)
    else
      defer_math_image(math_str, img_path, key)
      puts %Q(<img src="#{img_path}" class="math_gen_#{key}" alt="#{escape(lines.join(' '))}" />)
    end
  else
    print '<pre>'
    puts escape(lines.join("\n"))
    puts '</pre>'
  end
  puts '</div>'
end

#texequation_header(id, caption) ⇒ Object



554
555
556
557
558
559
560
# File 'lib/review/htmlbuilder.rb', line 554

def texequation_header(id, caption)
  if get_chap
    puts %Q(<p class="caption">#{I18n.t('equation')}#{I18n.t('format_number_header', [get_chap, @chapter.equation(id).number])}#{I18n.t('caption_prefix')}#{compile_inline(caption)}</p>)
  else
    puts %Q(<p class="caption">#{I18n.t('equation')}#{I18n.t('format_number_header_without_chapter', [@chapter.equation(id).number])}#{I18n.t('caption_prefix')}#{compile_inline(caption)}</p>)
  end
end

#text(str) ⇒ Object



939
940
941
# File 'lib/review/htmlbuilder.rb', line 939

def text(str)
  str
end

#th(str) ⇒ Object



672
673
674
# File 'lib/review/htmlbuilder.rb', line 672

def th(str)
  "<th>#{str}</th>"
end

#tip(lines, caption = nil) ⇒ Object



244
245
246
# File 'lib/review/htmlbuilder.rb', line 244

def tip(lines, caption = nil)
  captionblock('tip', lines, caption)
end

#tr(rows) ⇒ Object



668
669
670
# File 'lib/review/htmlbuilder.rb', line 668

def tr(rows)
  puts "<tr>#{rows.join}</tr>"
end

#ul_beginObject



305
306
307
# File 'lib/review/htmlbuilder.rb', line 305

def ul_begin
  puts '<ul>'
end

#ul_endObject



317
318
319
# File 'lib/review/htmlbuilder.rb', line 317

def ul_end
  puts '</ul>'
end

#ul_item_begin(lines) ⇒ Object



309
310
311
# File 'lib/review/htmlbuilder.rb', line 309

def ul_item_begin(lines)
  print "<li>#{join_lines_to_paragraph(lines)}"
end

#ul_item_endObject



313
314
315
# File 'lib/review/htmlbuilder.rb', line 313

def ul_item_end
  puts '</li>'
end

#warning(lines, caption = nil) ⇒ Object



276
277
278
# File 'lib/review/htmlbuilder.rb', line 276

def warning(lines, caption = nil)
  captionblock('warning', lines, caption)
end

#xcolumn_begin(level, label, caption) ⇒ Object



203
204
205
206
# File 'lib/review/htmlbuilder.rb', line 203

def xcolumn_begin(level, label, caption)
  puts %Q(<div class="xcolumn">)
  headline(level, label, caption)
end

#xcolumn_end(_level) ⇒ Object



208
209
210
# File 'lib/review/htmlbuilder.rb', line 208

def xcolumn_end(_level)
  puts '</div>'
end

#xmlns_ops_prefixObject



110
111
112
113
114
115
116
# File 'lib/review/htmlbuilder.rb', line 110

def xmlns_ops_prefix
  if @book.config['epubversion'].to_i == 3
    'epub'
  else
    'ops'
  end
end