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_row_separator_regexp, #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



932
933
934
935
936
937
# File 'lib/review/htmlbuilder.rb', line 932

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



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

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

#bibpaper_header(id, caption) ⇒ Object



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

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



759
760
761
# File 'lib/review/htmlbuilder.rb', line 759

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



767
768
769
770
771
772
773
# File 'lib/review/htmlbuilder.rb', line 767

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



1163
1164
1165
# File 'lib/review/htmlbuilder.rb', line 1163

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

#cmd(lines, caption = nil) ⇒ Object



488
489
490
491
492
493
494
495
496
497
498
499
# File 'lib/review/htmlbuilder.rb', line 488

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



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

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



1151
1152
1153
1154
1155
1156
1157
# File 'lib/review/htmlbuilder.rb', line 1151

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



839
840
841
842
843
844
845
846
# File 'lib/review/htmlbuilder.rb', line 839

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



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

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



515
516
517
518
519
520
521
# File 'lib/review/htmlbuilder.rb', line 515

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



445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
# File 'lib/review/htmlbuilder.rb', line 445

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



461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
# File 'lib/review/htmlbuilder.rb', line 461

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



699
700
701
# File 'lib/review/htmlbuilder.rb', line 699

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



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

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

#footnote(id, str) ⇒ Object



711
712
713
714
715
716
717
718
719
720
721
722
# File 'lib/review/htmlbuilder.rb', line 711

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



581
582
583
584
585
586
587
588
# File 'lib/review/htmlbuilder.rb', line 581

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



751
752
753
# File 'lib/review/htmlbuilder.rb', line 751

def hr
  puts '<hr />'
end

#image_dummy(id, caption, lines) ⇒ Object



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

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



1167
1168
1169
# File 'lib/review/htmlbuilder.rb', line 1167

def image_ext
  'png'
end

#image_header(id, caption) ⇒ Object



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

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



603
604
605
606
607
608
609
# File 'lib/review/htmlbuilder.rb', line 603

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



673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
# File 'lib/review/htmlbuilder.rb', line 673

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



694
695
696
697
# File 'lib/review/htmlbuilder.rb', line 694

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



724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
# File 'lib/review/htmlbuilder.rb', line 724

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



1033
1034
1035
# File 'lib/review/htmlbuilder.rb', line 1033

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

#inline_acronym(str) ⇒ Object



1037
1038
1039
# File 'lib/review/htmlbuilder.rb', line 1037

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

#inline_ami(str) ⇒ Object



856
857
858
# File 'lib/review/htmlbuilder.rb', line 856

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

#inline_asis(str, tag) ⇒ Object



1029
1030
1031
# File 'lib/review/htmlbuilder.rb', line 1029

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

#inline_b(str) ⇒ Object



852
853
854
# File 'lib/review/htmlbuilder.rb', line 852

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

#inline_balloon(str) ⇒ Object



1139
1140
1141
# File 'lib/review/htmlbuilder.rb', line 1139

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

#inline_bib(id) ⇒ Object



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

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



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

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

#inline_bou(str) ⇒ Object



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

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

#inline_br(_str) ⇒ Object



900
901
902
# File 'lib/review/htmlbuilder.rb', line 900

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

#inline_chap(id) ⇒ Object



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

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



789
790
791
792
793
794
795
796
797
798
# File 'lib/review/htmlbuilder.rb', line 789

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



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

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

#inline_code(str) ⇒ Object



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

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



979
980
981
982
983
984
985
986
987
# File 'lib/review/htmlbuilder.rb', line 979

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



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

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

#inline_del(str) ⇒ Object



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

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

#inline_dfn(str) ⇒ Object



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

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

#inline_dtp(str) ⇒ Object



880
881
882
# File 'lib/review/htmlbuilder.rb', line 880

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

#inline_em(str) ⇒ Object



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

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

#inline_eq(id) ⇒ Object



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

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



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

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



956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
# File 'lib/review/htmlbuilder.rb', line 956

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



896
897
898
# File 'lib/review/htmlbuilder.rb', line 896

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

#inline_i(str) ⇒ Object



848
849
850
# File 'lib/review/htmlbuilder.rb', line 848

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

#inline_icon(id) ⇒ Object



1109
1110
1111
1112
1113
1114
1115
1116
# File 'lib/review/htmlbuilder.rb', line 1109

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



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

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

#inline_img(id) ⇒ Object



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

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



1097
1098
1099
# File 'lib/review/htmlbuilder.rb', line 1097

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

#inline_kbd(str) ⇒ Object



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

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

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



779
780
781
# File 'lib/review/htmlbuilder.rb', line 779

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

#inline_list(id) ⇒ Object



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

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



904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
# File 'lib/review/htmlbuilder.rb', line 904

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



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

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

#inline_raw(str) ⇒ Object



1143
1144
1145
# File 'lib/review/htmlbuilder.rb', line 1143

def inline_raw(str)
  super(str)
end

#inline_recipe(str) ⇒ Object



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

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

#inline_samp(str) ⇒ Object



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

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

#inline_small(str) ⇒ Object



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

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

#inline_strong(str) ⇒ Object



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

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

#inline_sub(str) ⇒ Object



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

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

#inline_sup(str) ⇒ Object



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

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

#inline_table(id) ⇒ Object



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

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



1130
1131
1132
1133
1134
1135
1136
1137
# File 'lib/review/htmlbuilder.rb', line 1130

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



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

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



1085
1086
1087
1088
1089
1090
1091
# File 'lib/review/htmlbuilder.rb', line 1085

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



872
873
874
875
876
877
878
# File 'lib/review/htmlbuilder.rb', line 872

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



864
865
866
867
868
869
870
# File 'lib/review/htmlbuilder.rb', line 864

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



1101
1102
1103
# File 'lib/review/htmlbuilder.rb', line 1101

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

#inline_uchar(str) ⇒ Object



1118
1119
1120
# File 'lib/review/htmlbuilder.rb', line 1118

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

#inline_var(str) ⇒ Object



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

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

#label(id) ⇒ Object



755
756
757
# File 'lib/review/htmlbuilder.rb', line 755

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
# File 'lib/review/htmlbuilder.rb', line 374

def list(lines, id, caption, lang = nil)
  puts %Q(<div id="#{normalize_id(id)}" class="caption-code">)
  super(lines, id, caption, lang)
  puts '</div>'
end

#list_body(_id, lines, lang) ⇒ Object



388
389
390
391
392
393
394
395
396
397
# File 'lib/review/htmlbuilder.rb', line 388

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



380
381
382
383
384
385
386
# File 'lib/review/htmlbuilder.rb', line 380

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



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

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

#listnum_body(lines, lang) ⇒ Object



425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
# File 'lib/review/htmlbuilder.rb', line 425

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



1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
# File 'lib/review/htmlbuilder.rb', line 1175

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



1147
1148
1149
# File 'lib/review/htmlbuilder.rb', line 1147

def nofunc_text(str)
  escape(str)
end

#noindentObject



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

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



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

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

#pagebreakObject



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

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



510
511
512
513
# File 'lib/review/htmlbuilder.rb', line 510

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



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

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



399
400
401
402
403
# File 'lib/review/htmlbuilder.rb', line 399

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

#source_body(lines, lang) ⇒ Object



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

def source_body(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



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

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



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

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



653
654
655
# File 'lib/review/htmlbuilder.rb', line 653

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

#table_endObject



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

def table_end
  puts '</table>'
end

#table_header(id, caption) ⇒ Object



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

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



523
524
525
526
527
528
# File 'lib/review/htmlbuilder.rb', line 523

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

#td(str) ⇒ Object



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

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

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



530
531
532
533
534
535
536
537
538
539
540
541
# File 'lib/review/htmlbuilder.rb', line 530

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



551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
# File 'lib/review/htmlbuilder.rb', line 551

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



543
544
545
546
547
548
549
# File 'lib/review/htmlbuilder.rb', line 543

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



928
929
930
# File 'lib/review/htmlbuilder.rb', line 928

def text(str)
  str
end

#th(str) ⇒ Object



661
662
663
# File 'lib/review/htmlbuilder.rb', line 661

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



657
658
659
# File 'lib/review/htmlbuilder.rb', line 657

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