Class: ReVIEW::HTMLBuilder

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

Direct Known Subclasses

EPUBBuilder

Constant Summary

Constants inherited from Builder

Builder::CAPTION_TITLES

Instance Attribute Summary

Attributes inherited from Builder

#doc_status, #location

Attributes included from Loggable

#logger

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?, #detab, #join_lines_to_paragraph, #split_paragraph

Methods inherited from Builder

#beginchild, #bind, #caption_top?, #check_nest, #check_nested_minicolumn, #check_printendnotes, #compile_inline, #detab, #embed, #endchild, #endnote, #escape, #extract_chapter_id, #firstlinenum, #get_chap, #graph, #graph_aafigure, #graph_blockdiag, #graph_gnuplot, #graph_graphviz, #graph_mermaid, #graph_plantuml, #highlight?, #image, #in_minicolumn?, #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, #minicolumn_block_name?, #over_secnolevel?, #parse_metric, #parse_table_rows, #previous_list_type, #print, #printendnotes, #puts, #raw, #system_graph, #table_row_separator_regexp, #table_rows, #target_name, #tsize

Methods included from Loggable

#app_error, #debug, #error, #error!, #warn

Constructor Details

This class inherits a constructor from ReVIEW::Builder

Instance Method Details

#best(lines, caption = nil) ⇒ Object



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

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

#bibpaper(lines, id, caption) ⇒ Object



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

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



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

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

#bibpaper_header(id, caption) ⇒ Object



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

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



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

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

#box(lines, caption = nil) ⇒ Object



342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
# File 'lib/review/htmlbuilder.rb', line 342

def box(lines, caption = nil)
  captionstr = nil
  if caption.present?
    captionstr = %Q(<p class="caption">#{compile_inline(caption)}</p>)
  end
  puts %Q(<div class="syntax">)

  if caption_top?('list') && caption.present?
    puts captionstr
  end

  print %Q(<pre class="syntax">)
  lines.each do |line|
    puts detab(line)
  end
  puts '</pre>'

  if !caption_top?('list') && caption.present?
    puts captionstr
  end
  puts '</div>'
end

#bpo(lines) ⇒ Object



899
900
901
902
903
904
905
# File 'lib/review/htmlbuilder.rb', line 899

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

#captionblock(type, lines, caption) ⇒ Object



283
284
285
286
287
288
289
290
291
292
# File 'lib/review/htmlbuilder.rb', line 283

def captionblock(type, lines, caption)
  check_nested_minicolumn
  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



322
323
324
# File 'lib/review/htmlbuilder.rb', line 322

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

#centering(lines) ⇒ Object



1330
1331
1332
# File 'lib/review/htmlbuilder.rb', line 1330

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

#close_sectionsObject



109
110
111
# File 'lib/review/htmlbuilder.rb', line 109

def close_sections
  "</section>\n" * @section_stack.size
end

#cmd(lines, caption = nil) ⇒ Object



577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
# File 'lib/review/htmlbuilder.rb', line 577

def cmd(lines, caption = nil)
  puts %Q(<div class="cmd-code">)
  if caption_top?('list') && 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>'

  if !caption_top?('list') && caption.present?
    puts %Q(<p class="caption">#{compile_inline(caption)}</p>)
  end

  puts '</div>'
end

#column_begin(level, label, caption) ⇒ Object



236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
# File 'lib/review/htmlbuilder.rb', line 236

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



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

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

#comment(lines, comment = nil) ⇒ Object



808
809
810
811
812
813
814
815
# File 'lib/review/htmlbuilder.rb', line 808

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



1318
1319
1320
1321
1322
1323
1324
# File 'lib/review/htmlbuilder.rb', line 1318

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



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

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

#compile_ruby(base, ruby) ⇒ Object



969
970
971
972
973
974
975
# File 'lib/review/htmlbuilder.rb', line 969

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



428
429
430
# File 'lib/review/htmlbuilder.rb', line 428

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

#dl_beginObject



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

def dl_begin
  puts '<dl>'
end

#dl_endObject



432
433
434
# File 'lib/review/htmlbuilder.rb', line 432

def dl_end
  puts '</dl>'
end

#doorquote(lines, ref) ⇒ Object



610
611
612
613
614
615
616
# File 'lib/review/htmlbuilder.rb', line 610

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



424
425
426
# File 'lib/review/htmlbuilder.rb', line 424

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

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



527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
# File 'lib/review/htmlbuilder.rb', line 527

def emlist(lines, caption = nil, lang = nil)
  puts %Q(<div class="emlist-code">)
  if caption_top?('list') && 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>'
  if !caption_top?('list') && caption.present?
    puts %Q(<p class="caption">#{compile_inline(caption)}</p>)
  end
  puts '</div>'
end

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



546
547
548
549
550
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
# File 'lib/review/htmlbuilder.rb', line 546

def emlistnum(lines, caption = nil, lang = nil)
  puts %Q(<div class="emlistnum-code">)
  if caption_top?('list') && 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

  if !caption_top?('list') && caption.present?
    puts %Q(<p class="caption">#{compile_inline(caption)}</p>)
  end

  puts '</div>'
end

#emtable(lines, caption = nil) ⇒ Object



804
805
806
# File 'lib/review/htmlbuilder.rb', line 804

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

#endnote_beginObject



830
831
832
# File 'lib/review/htmlbuilder.rb', line 830

def endnote_begin
  puts %Q(<div class="endnotes">)
end

#endnote_endObject



834
835
836
# File 'lib/review/htmlbuilder.rb', line 834

def endnote_end
  puts %Q(</div>)
end

#endnote_item(id) ⇒ Object



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

def endnote_item(id)
  back = ''
  if @book.config['epubmaker'] && @book.config['epubmaker']['back_footnote']
    back = %Q(<a href="#endnoteb-#{normalize_id(id)}">#{I18n.t('html_footnote_backmark')}</a>)
  end
  puts %Q(<div class="endnote" id="endnote-#{normalize_id(id)}"><p class="endnote">#{back}#{I18n.t('html_endnote_textmark', @chapter.endnote(id).number)}#{compile_inline(@chapter.endnote(id).content)}</p></div>)
end

#extnameObject



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

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

#flushright(lines) ⇒ Object



1326
1327
1328
# File 'lib/review/htmlbuilder.rb', line 1326

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

#footnote(id, str) ⇒ Object



817
818
819
820
821
822
823
824
825
826
827
828
# File 'lib/review/htmlbuilder.rb', line 817

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



680
681
682
683
684
685
686
687
# File 'lib/review/htmlbuilder.rb', line 680

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



165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
# File 'lib/review/htmlbuilder.rb', line 165

def headline(level, label, caption)
  if use_section?
    print open_section(level)
  end
  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



883
884
885
# File 'lib/review/htmlbuilder.rb', line 883

def hr
  puts '<hr />'
end

#image_dummy(id, caption, lines) ⇒ Object



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

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

#image_extObject



1334
1335
1336
# File 'lib/review/htmlbuilder.rb', line 1334

def image_ext
  'png'
end

#image_header(id, caption) ⇒ Object



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

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



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

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

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



774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
# File 'lib/review/htmlbuilder.rb', line 774

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

  puts %Q(<div id="#{normalize_id(id)}" class="imgtable image">)
  begin
    if caption_top?('table') && caption.present?
      table_header(id, caption)
    end

    imgtable_image(id, caption, metric)

    if !caption_top?('table') && caption.present?
      table_header(id, caption)
    end
  rescue KeyError
    app_error "no such table: #{id}"
  end

  puts '</div>'
end

#imgtable_image(id, caption, metric) ⇒ Object



799
800
801
802
# File 'lib/review/htmlbuilder.rb', line 799

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



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

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

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



846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
# File 'lib/review/htmlbuilder.rb', line 846

def indepimage(lines, id, caption = '', metric = nil)
  metrics = parse_metric('html', metric)
  caption = '' unless caption.present?
  caption_str = nil
  if caption.present?
    caption_str = <<-EOS
<p class="caption">
#{I18n.t('numberless_image')}#{I18n.t('caption_prefix')}#{compile_inline(caption)}
</p>
EOS
  end

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

  if !caption_top?('image') && caption.present?
    puts caption_str
  end
  puts '</div>'
end

#info(lines, caption = nil) ⇒ Object



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

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

#inline_abbr(str) ⇒ Object



1200
1201
1202
# File 'lib/review/htmlbuilder.rb', line 1200

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

#inline_acronym(str) ⇒ Object



1204
1205
1206
# File 'lib/review/htmlbuilder.rb', line 1204

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

#inline_ami(str) ⇒ Object



995
996
997
# File 'lib/review/htmlbuilder.rb', line 995

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

#inline_asis(str, tag) ⇒ Object



1196
1197
1198
# File 'lib/review/htmlbuilder.rb', line 1196

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

#inline_b(str) ⇒ Object



991
992
993
# File 'lib/review/htmlbuilder.rb', line 991

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

#inline_balloon(str) ⇒ Object



1306
1307
1308
# File 'lib/review/htmlbuilder.rb', line 1306

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

#inline_bib(id) ⇒ Object



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

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
  app_error "unknown bib: #{id}"
end

#inline_big(str) ⇒ Object



1236
1237
1238
# File 'lib/review/htmlbuilder.rb', line 1236

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

#inline_bou(str) ⇒ Object



999
1000
1001
# File 'lib/review/htmlbuilder.rb', line 999

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

#inline_br(_str) ⇒ Object



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

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

#inline_chap(id) ⇒ Object



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

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
  app_error "unknown chapter: #{id}"
end

#inline_chapref(id) ⇒ Object



921
922
923
924
925
926
927
928
929
930
# File 'lib/review/htmlbuilder.rb', line 921

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

#inline_cite(str) ⇒ Object



1208
1209
1210
# File 'lib/review/htmlbuilder.rb', line 1208

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

#inline_code(str) ⇒ Object



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

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



1146
1147
1148
1149
1150
1151
1152
1153
1154
# File 'lib/review/htmlbuilder.rb', line 1146

def inline_column_chap(chapter, id)
  if @book.config['chapterlink']
    %Q(<a href="#{chapter.id}#{extname}##{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
  app_error "unknown column: #{id}"
end

#inline_comment(str) ⇒ Object



1289
1290
1291
1292
1293
1294
1295
# File 'lib/review/htmlbuilder.rb', line 1289

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

#inline_del(str) ⇒ Object



1260
1261
1262
# File 'lib/review/htmlbuilder.rb', line 1260

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

#inline_dfn(str) ⇒ Object



1212
1213
1214
# File 'lib/review/htmlbuilder.rb', line 1212

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

#inline_dtp(str) ⇒ Object



1019
1020
1021
# File 'lib/review/htmlbuilder.rb', line 1019

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

#inline_em(str) ⇒ Object



1216
1217
1218
# File 'lib/review/htmlbuilder.rb', line 1216

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

#inline_endnote(id) ⇒ Object



963
964
965
966
967
# File 'lib/review/htmlbuilder.rb', line 963

def inline_endnote(id)
  %Q(<a id="endnoteb-#{normalize_id(id)}" href="#endnote-#{normalize_id(id)}" class="noteref" epub:type="noteref">#{I18n.t('html_endnote_refmark', @chapter.endnote(id).number)}</a>)
rescue KeyError
  app_error "unknown endnote: #{id}"
end

#inline_eq(id) ⇒ Object



1186
1187
1188
1189
1190
1191
1192
1193
1194
# File 'lib/review/htmlbuilder.rb', line 1186

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



953
954
955
956
957
958
959
960
961
# File 'lib/review/htmlbuilder.rb', line 953

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
  app_error "unknown footnote: #{id}"
end

#inline_hd_chap(chap, id) ⇒ Object



1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
# File 'lib/review/htmlbuilder.rb', line 1098

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

#inline_hidx(str) ⇒ Object



1035
1036
1037
# File 'lib/review/htmlbuilder.rb', line 1035

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

#inline_i(str) ⇒ Object



987
988
989
# File 'lib/review/htmlbuilder.rb', line 987

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

#inline_icon(id) ⇒ Object



1276
1277
1278
1279
1280
1281
1282
1283
# File 'lib/review/htmlbuilder.rb', line 1276

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

#inline_idx(str) ⇒ Object



1031
1032
1033
# File 'lib/review/htmlbuilder.rb', line 1031

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

#inline_img(id) ⇒ Object



1176
1177
1178
1179
1180
1181
1182
1183
1184
# File 'lib/review/htmlbuilder.rb', line 1176

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



1264
1265
1266
# File 'lib/review/htmlbuilder.rb', line 1264

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

#inline_kbd(str) ⇒ Object



1220
1221
1222
# File 'lib/review/htmlbuilder.rb', line 1220

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

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



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

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

#inline_list(id) ⇒ Object



1156
1157
1158
1159
1160
1161
1162
1163
1164
# File 'lib/review/htmlbuilder.rb', line 1156

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



1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
# File 'lib/review/htmlbuilder.rb', line 1043

def inline_m(str)
  if @book.config['math_format'] == 'mathml'
    begin
      require 'math_ml'
      require 'math_ml/symbol/character_reference'
    rescue LoadError
      app_error 'not found math_ml'
    end
    parser = MathML::LaTeX::Parser.new(symbol: MathML::Symbol::CharacterReference)
    %Q(<span class="equation">#{parser.parse(str, nil)}</span>)
  elsif @book.config['math_format'] == 'mathjax'
    %Q(<span class="equation">\\( #{str.gsub('<', '\lt{}').gsub('>', '\gt{}').gsub('&', '&amp;')} \\)</span>)
  elsif @book.config['math_format'] == 'imgmath'
    math_str = '$' + str + '$'
    key = Digest::SHA256.hexdigest(str)
    if @book.config.check_version('2', exception: false)
      img_path = @img_math.make_math_image(math_str, key)
      %Q(<span class="equation"><img src="#{img_path}" /></span>)
    else
      img_path = @img_math.defer_math_image(math_str, 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



917
918
919
# File 'lib/review/htmlbuilder.rb', line 917

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

#inline_raw(str) ⇒ Object

rubocop:disable Lint/UselessMethodDefinition



1310
1311
1312
# File 'lib/review/htmlbuilder.rb', line 1310

def inline_raw(str) # rubocop:disable Lint/UselessMethodDefinition
  super(str)
end

#inline_recipe(str) ⇒ Object



1272
1273
1274
# File 'lib/review/htmlbuilder.rb', line 1272

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

#inline_samp(str) ⇒ Object



1224
1225
1226
# File 'lib/review/htmlbuilder.rb', line 1224

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

#inline_sec(id) ⇒ Object



1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
# File 'lib/review/htmlbuilder.rb', line 1115

def inline_sec(id)
  if @book.config['chapterlink']
    chap, id2 = extract_chapter_id(id)
    n = chap.headline_index.number(id2)
    anchor = 'h' + n.tr('.', '-')
    %Q(<a href="#{chap.id}#{extname}##{anchor}">#{super(id)}</a>)
  else
    super(id)
  end
rescue KeyError
  app_error "unknown headline: #{id}"
end

#inline_sectitle(id) ⇒ Object



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

def inline_sectitle(id)
  if @book.config['chapterlink']
    chap, id2 = extract_chapter_id(id)
    anchor = 'h' + chap.headline_index.number(id2).tr('.', '-')
    %Q(<a href="#{chap.id}#{extname}##{anchor}">#{super(id)}</a>)
  else
    super(id)
  end
rescue KeyError
  app_error "unknown headline: #{id}"
end

#inline_small(str) ⇒ Object



1240
1241
1242
# File 'lib/review/htmlbuilder.rb', line 1240

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

#inline_strong(str) ⇒ Object



1228
1229
1230
# File 'lib/review/htmlbuilder.rb', line 1228

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

#inline_sub(str) ⇒ Object



1244
1245
1246
# File 'lib/review/htmlbuilder.rb', line 1244

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

#inline_sup(str) ⇒ Object



1248
1249
1250
# File 'lib/review/htmlbuilder.rb', line 1248

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

#inline_table(id) ⇒ Object



1166
1167
1168
1169
1170
1171
1172
1173
1174
# File 'lib/review/htmlbuilder.rb', line 1166

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



1297
1298
1299
1300
1301
1302
1303
1304
# File 'lib/review/htmlbuilder.rb', line 1297

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



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

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

#inline_tt(str) ⇒ Object



1252
1253
1254
1255
1256
1257
1258
# File 'lib/review/htmlbuilder.rb', line 1252

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



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

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



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

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



1268
1269
1270
# File 'lib/review/htmlbuilder.rb', line 1268

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

#inline_uchar(str) ⇒ Object



1285
1286
1287
# File 'lib/review/htmlbuilder.rb', line 1285

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

#inline_var(str) ⇒ Object



1232
1233
1234
# File 'lib/review/htmlbuilder.rb', line 1232

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

#label(id) ⇒ Object



887
888
889
# File 'lib/review/htmlbuilder.rb', line 887

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

#layoutfileObject



62
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 62

def layoutfile
  if @book.config.maker == 'webmaker'
    htmldir = 'web/html'
    localfilename = 'layout-web.html.erb'
  else
    htmldir = 'html'
    localfilename = 'layout.html.erb'
  end
  htmlfilename = if @book.htmlversion == 5
                   File.join(htmldir, 'layout-html5.html.erb')
                 else
                   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.), location: location
      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



456
457
458
459
460
# File 'lib/review/htmlbuilder.rb', line 456

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



470
471
472
473
474
475
476
477
478
479
# File 'lib/review/htmlbuilder.rb', line 470

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



462
463
464
465
466
467
468
# File 'lib/review/htmlbuilder.rb', line 462

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



501
502
503
504
505
# File 'lib/review/htmlbuilder.rb', line 501

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



507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
# File 'lib/review/htmlbuilder.rb', line 507

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

#memo(lines, caption = nil) ⇒ Object



294
295
296
# File 'lib/review/htmlbuilder.rb', line 294

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

#nodisp_begin(level, label, caption) ⇒ Object



220
221
222
223
224
225
226
227
228
229
230
231
# File 'lib/review/htmlbuilder.rb', line 220

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



233
234
# File 'lib/review/htmlbuilder.rb', line 233

def nodisp_end(level)
end

#nofunc_text(str) ⇒ Object



1314
1315
1316
# File 'lib/review/htmlbuilder.rb', line 1314

def nofunc_text(str)
  escape(str)
end

#noindentObject



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

def noindent
  @noindent = true
end

#nonum_begin(level, label, caption) ⇒ Object



188
189
190
191
192
193
194
195
196
197
198
199
# File 'lib/review/htmlbuilder.rb', line 188

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



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

def nonum_end(level)
end

#note(lines, caption = nil) ⇒ Object



365
366
367
# File 'lib/review/htmlbuilder.rb', line 365

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

#notice(lines, caption = nil) ⇒ Object



326
327
328
# File 'lib/review/htmlbuilder.rb', line 326

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

#notoc_begin(level, label, caption) ⇒ Object



204
205
206
207
208
209
210
211
212
213
214
215
# File 'lib/review/htmlbuilder.rb', line 204

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



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

def notoc_end(level)
end

#ol_beginObject



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

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



416
417
418
# File 'lib/review/htmlbuilder.rb', line 416

def ol_end
  puts '</ol>'
end

#ol_item(lines, _num) ⇒ Object



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

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

#olnum(num) ⇒ Object



1338
1339
1340
# File 'lib/review/htmlbuilder.rb', line 1338

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

#open_section(level) ⇒ Object



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

def open_section(level)
  result = []

  while @section_stack.size > 0 && level <= @section_stack[-1]
    result << '</section>'
    @section_stack.pop
  end
  @section_stack.push(level)
  result << %Q(<section class="level#{level}">)

  return result.join("\n")
end

#pagebreakObject



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

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

#paragraph(lines) ⇒ Object



436
437
438
439
440
441
442
443
# File 'lib/review/htmlbuilder.rb', line 436

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



445
446
447
# File 'lib/review/htmlbuilder.rb', line 445

def parasep
  puts '<br />'
end

#planning(lines, caption = nil) ⇒ Object



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

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

#point(lines, caption = nil) ⇒ Object



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

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



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

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

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



449
450
451
452
# File 'lib/review/htmlbuilder.rb', line 449

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



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

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

#ref_end(_level) ⇒ Object



270
271
272
# File 'lib/review/htmlbuilder.rb', line 270

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

#resultObject



113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
# File 'lib/review/htmlbuilder.rb', line 113

def result
  check_printendnotes

  # flush all `</section>`
  if use_section?
    print close_sections
  end

  # default XHTML header/footer
  @title = strip_html(compile_inline(@chapter.title))
  @body = solve_nest(@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

  if @book.config['math_format'] == 'mathjax'
    @javascripts.push(%Q(<script>MathJax = { tex: { inlineMath: [['\\\\(', '\\\\)']] }, svg: { fontCache: 'global' } };</script>))
    @javascripts.push(%Q(<script type="text/javascript" id="MathJax-script" async="true" src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js"></script>))
  end

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

#result_metric(array) ⇒ Object



689
690
691
692
693
694
695
696
697
698
699
700
# File 'lib/review/htmlbuilder.rb', line 689

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



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

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

#shoot(lines, caption = nil) ⇒ Object



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

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

#solve_nest(s) ⇒ Object



143
144
145
146
147
148
149
150
151
152
153
154
155
# File 'lib/review/htmlbuilder.rb', line 143

def solve_nest(s)
  check_nest
  s.gsub("</dd>\n</dl>\n\x01→dl←\x01", '').
    gsub("\x01→/dl←\x01", "</dd>\n</dl>←END\x01").
    gsub("</li>\n</ul>\n\x01→ul←\x01", '').
    gsub("\x01→/ul←\x01", "</li>\n</ul>←END\x01").
    gsub("</li>\n</ol>\n\x01→ol←\x01", '').
    gsub("\x01→/ol←\x01", "</li>\n</ol>←END\x01").
    gsub("</dl>←END\x01\n<dl>", '').
    gsub("</ul>←END\x01\n<ul>", '').
    gsub("</ol>←END\x01\n<ol>", '').
    gsub("←END\x01", '')
end

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



481
482
483
484
485
# File 'lib/review/htmlbuilder.rb', line 481

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



493
494
495
496
497
498
499
# File 'lib/review/htmlbuilder.rb', line 493

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



487
488
489
490
491
# File 'lib/review/htmlbuilder.rb', line 487

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

#sup_begin(level, label, caption) ⇒ Object



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

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

#sup_end(_level) ⇒ Object



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

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

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



734
735
736
737
738
739
740
741
742
# File 'lib/review/htmlbuilder.rb', line 734

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



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

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

#table_endObject



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

def table_end
  puts '</table>'
end

#table_header(id, caption) ⇒ Object



744
745
746
747
748
749
750
751
752
# File 'lib/review/htmlbuilder.rb', line 744

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



618
619
620
621
622
623
# File 'lib/review/htmlbuilder.rb', line 618

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

#td(str) ⇒ Object



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

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

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



625
626
627
628
629
630
631
632
633
634
635
636
637
# File 'lib/review/htmlbuilder.rb', line 625

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

  texequation_body(lines)

  if id
    texequation_header(id, caption) unless caption_top?('equation')
    puts '</div>'
  end
end

#texequation_body(lines) ⇒ Object



647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
# File 'lib/review/htmlbuilder.rb', line 647

def texequation_body(lines)
  puts %Q(<div class="equation">)
  if @book.config['math_format'] == 'mathml'
    begin
      require 'math_ml'
      require 'math_ml/symbol/character_reference'
    rescue LoadError
      app_error 'not found math_ml'
    end
    p = MathML::LaTeX::Parser.new(symbol: MathML::Symbol::CharacterReference)
    print p.parse(lines.join("\n") + "\n", true)
  elsif @book.config['math_format'] == 'mathjax'
    puts "$$#{lines.join("\n").gsub('<', '\lt{}').gsub('>', '\gt{}').gsub('&', '&amp;')}$$"
  elsif @book.config['math_format'] == '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)
    if @book.config.check_version('2', exception: false)
      img_path = @img_math.make_math_image(math_str, key)
      puts %Q(<img src="#{img_path}" />)
    else
      img_path = @img_math.defer_math_image(math_str, 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



639
640
641
642
643
644
645
# File 'lib/review/htmlbuilder.rb', line 639

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



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

def text(str)
  str
end

#th(str) ⇒ Object



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

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

#tip(lines, caption = nil) ⇒ Object



298
299
300
# File 'lib/review/htmlbuilder.rb', line 298

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

#tr(rows) ⇒ Object



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

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

#ul_beginObject



387
388
389
# File 'lib/review/htmlbuilder.rb', line 387

def ul_begin
  puts '<ul>'
end

#ul_endObject



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

def ul_end
  puts '</ul>'
end

#ul_item_begin(lines) ⇒ Object



391
392
393
# File 'lib/review/htmlbuilder.rb', line 391

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

#ul_item_endObject



395
396
397
# File 'lib/review/htmlbuilder.rb', line 395

def ul_item_end
  puts '</li>'
end

#use_section?Boolean

Returns:

  • (Boolean)


92
93
94
# File 'lib/review/htmlbuilder.rb', line 92

def use_section?
  @use_section
end

#warning(lines, caption = nil) ⇒ Object



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

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

#xcolumn_begin(level, label, caption) ⇒ Object



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

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

#xcolumn_end(_level) ⇒ Object



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

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

#xmlns_ops_prefixObject



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

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