Class: IsoDoc::JIS::PresentationXMLConvert

Inherits:
Iso::PresentationXMLConvert
  • Object
show all
Includes:
Init
Defined in:
lib/isodoc/jis/presentation_section.rb,
lib/isodoc/jis/presentation_xml_convert.rb

Constant Summary collapse

JPAN =
"\\p{Hiragana}\\p{Katakana}\\p{Han}".freeze
JPAN_BOLD =
"<span style='font-family:\"MS Gothic\"'>".freeze

Instance Method Summary collapse

Methods included from Init

#i18n_init, #metadata_init, #omit_docid_prefix, #std_docid_semantic, #xref_init

Instance Method Details

#admits(elem) ⇒ Object



43
44
45
# File 'lib/isodoc/jis/presentation_xml_convert.rb', line 43

def admits(elem)
  elem.children.first.previous = @i18n.l10n("#{@i18n.admitted}: ")
end

#annex(docxml) ⇒ Object



16
17
18
19
# File 'lib/isodoc/jis/presentation_section.rb', line 16

def annex(docxml)
  super
  move_commentaries_to_end(docxml)
end

#annex1(elem) ⇒ Object



7
8
9
10
11
12
13
14
# File 'lib/isodoc/jis/presentation_section.rb', line 7

def annex1(elem)
  elem["commentary"] == "true" and return commentary(elem)
  lbl = @xrefs.anchor(elem["id"], :label)
  if t = elem.at(ns("./title"))
    t.children = "<strong>#{to_xml(t.children)}</strong>"
  end
  prefix_name(elem, "<br/>", lbl, "title")
end

#bibdata_i18n(bibdata) ⇒ Object



137
138
139
140
# File 'lib/isodoc/jis/presentation_xml_convert.rb', line 137

def bibdata_i18n(bibdata)
  super
  @lang == "ja" and date_translate(bibdata)
end

#block(docxml) ⇒ Object



47
48
49
50
# File 'lib/isodoc/jis/presentation_xml_convert.rb', line 47

def block(docxml)
  super
  dl docxml
end

#commentary(elem) ⇒ Object



30
31
32
33
34
# File 'lib/isodoc/jis/presentation_section.rb', line 30

def commentary(elem)
  t = elem.elements.first
  commentary_title_hdr(t)
  middle_title_main(t, "CommentaryStandardName")
end

#commentary_title_hdr(elem) ⇒ Object



36
37
38
39
40
41
42
43
# File 'lib/isodoc/jis/presentation_section.rb', line 36

def commentary_title_hdr(elem)
  ret = <<~COMMENTARY
    <p class="CommentaryStandardNumber">JIS #{@meta.get[:docnumber_undated]}
  COMMENTARY
  yr = @meta.get[:docyear] and
    ret += ": <span class='CommentaryEffectiveYear'>#{yr}</span>"
  elem.previous = ret
end

#date_translate(bibdata) ⇒ Object



142
143
144
145
146
# File 'lib/isodoc/jis/presentation_xml_convert.rb', line 142

def date_translate(bibdata)
  bibdata.xpath(ns("./date")).each do |d|
    d.children = @i18n.japanese_date(d.text.strip)
  end
end

#dl(docxml) ⇒ Object



52
53
54
55
56
57
# File 'lib/isodoc/jis/presentation_xml_convert.rb', line 52

def dl(docxml)
  docxml.xpath(ns("//table//dl | //figure//dl")).each do |l|
    l.at(ns("./dl")) || l.at("./ancestor::xmlns:dl") and next
    dl_to_para(l)
  end
end

#dl_id_insert(node, ret) ⇒ Object



72
73
74
75
76
77
# File 'lib/isodoc/jis/presentation_xml_convert.rb', line 72

def dl_id_insert(node, ret)
  a = node.replace(ret)
  p = a.at("./descendant-or-self::xmlns:p")
  node["id"] and p << "<bookmark id='#{node['id']}'/>"
  a.xpath("./descendant-or-self::*[@id = '']").each { |x| x.delete("id") }
end

#dl_to_para(node) ⇒ Object



63
64
65
66
67
68
69
70
# File 'lib/isodoc/jis/presentation_xml_convert.rb', line 63

def dl_to_para(node)
  ret = dl_to_para_name(node)
  ret += dl_to_para_terms(node)
  node.elements.reject { |n| %w(dt dd name).include?(n.name) }.each do |x|
    ret += x.to_xml
  end
  dl_id_insert(node, ret)
end

#dl_to_para_name(node) ⇒ Object



79
80
81
82
# File 'lib/isodoc/jis/presentation_xml_convert.rb', line 79

def dl_to_para_name(node)
  e = node.at(ns("./name"))
  "<p class='ListTitle'>#{e&.children&.to_xml || @i18n.key}</p>"
end

#dl_to_para_terms(node) ⇒ Object



84
85
86
87
88
89
90
91
92
93
# File 'lib/isodoc/jis/presentation_xml_convert.rb', line 84

def dl_to_para_terms(node)
  ret = ""
  node.elements.select { |n| dt_dd?(n) }.each_slice(2) do |dt, dd|
    term = strip_para(dt)
    defn = strip_para(dd)
    bkmk = dd["id"] ? "<bookmark id='#{dd['id']}'/>" : ""
    ret += "<p class='dl' id='#{dt['id']}'>#{term}: #{bkmk}#{defn}</p>"
  end
  ret
end

#dt_dd?(node) ⇒ Boolean

Returns:

  • (Boolean)


59
60
61
# File 'lib/isodoc/jis/presentation_xml_convert.rb', line 59

def dt_dd?(node)
  %w{dt dd}.include? node.name
end

#full_row(cols, elem) ⇒ Object



126
127
128
# File 'lib/isodoc/jis/presentation_xml_convert.rb', line 126

def full_row(cols, elem)
  "<tr><td border='0' colspan='#{cols}'>#{elem}</td></tr>"
end

#inline(docxml) ⇒ Object



8
9
10
11
# File 'lib/isodoc/jis/presentation_xml_convert.rb', line 8

def inline(docxml)
  super
  strong(docxml)
end

#middle_subtitle_main(out, style) ⇒ Object



101
102
103
104
105
106
107
108
109
110
111
112
# File 'lib/isodoc/jis/presentation_section.rb', line 101

def middle_subtitle_main(out, style)
  t = @meta.get[:docsubtitlemain]
  (t && !t.empty?) or return
  ret = middle_title_para(style, :docsubtitleintro, :docsubtitlemain,
                          :docsubtitlepart)
  if a = @meta.get[:docsubtitlepart]
    ret += "<p class='zzSTDTitle2'>"
    b = @meta.get[:docsubtitlepartlabel] and ret += "#{b}: "
    ret += "<br/><strong>#{a}</strong></p>"
  end
  out.previous = ret
end

#middle_title(docxml) ⇒ Object



66
67
68
69
70
71
72
73
# File 'lib/isodoc/jis/presentation_section.rb', line 66

def middle_title(docxml)
  s = docxml.at(ns("//sections")) or return
  elem = s.children.first
  middle_title_hdr(elem)
  middle_title_main(elem, "zzSTDTitle1")
  middle_subtitle_main(elem, "zzSTDTitle2")
  # middle_title_amd(s.children.first)
end

#middle_title_hdr(out) ⇒ Object



75
76
77
78
79
80
81
82
83
84
85
86
# File 'lib/isodoc/jis/presentation_section.rb', line 75

def middle_title_hdr(out)
  ret = "<p class='JapaneseIndustrialStandard'>#{@i18n.jis}"
  @meta.get[:unpublished] and ret += @i18n.l10n("(#{@i18n.draft_label})")
  ret += ("<tab/>" * 7)
  ret += "<span class='JIS'>JIS</span></p>"
  ret += "<p class='StandardNumber'><tab/>#{@meta.get[:docnumber_undated]}"
  if yr = @meta.get[:docyear]
    ret += ": <span class='EffectiveYear'>#{yr}</span>"
  end
  ret += "</p><p class='IDT'/>"
  out.previous = ret
end

#middle_title_main(out, style) ⇒ Object



88
89
90
91
92
93
94
95
96
97
98
99
# File 'lib/isodoc/jis/presentation_section.rb', line 88

def middle_title_main(out, style)
  t = @meta.get[:doctitlemain]
  (t && !t.empty?) or return
  ret =
    middle_title_para(style, :doctitleintro, :doctitlemain, :doctitlepart)
  if a = @meta.get[:doctitlepart]
    ret += "<p class='zzSTDTitle1'>"
    b = @meta.get[:doctitlepartlabel] and ret += "#{b}: "
    ret += "<br/><strong>#{a}</strong></p>"
  end
  out.previous = ret
end

#middle_title_para(style, intro, main, part) ⇒ Object



114
115
116
117
118
119
120
121
# File 'lib/isodoc/jis/presentation_section.rb', line 114

def middle_title_para(style, intro, main, part)
  ret = "<p class='#{style}'>#{@meta.get[intro]}"
  ret += " &#x2014; " if @meta.get[intro] && @meta.get[main]
  ret += @meta.get[main]
  ret += " &#x2014; " if @meta.get[main] && @meta.get[part]
  ret += "</p>"
  ret
end

#move_commentaries_to_end(docxml) ⇒ Object



21
22
23
24
25
26
27
28
# File 'lib/isodoc/jis/presentation_section.rb', line 21

def move_commentaries_to_end(docxml)
  docxml.at(ns("//annex[@commentary = 'true']")) or return
  b = docxml.at(ns("//bibliography")) ||
    docxml.at(ns("//annex[last()]")).after(" ").next
  docxml.xpath(ns("//annex[@commentary = 'true']")).reverse.each do |x|
    b.next = x.remove
  end
end

#move_introduction(doc) ⇒ Object



58
59
60
61
62
63
64
# File 'lib/isodoc/jis/presentation_section.rb', line 58

def move_introduction(doc)
  source = doc.at(ns("//preface/introduction")) or return
  dest = doc.at(ns("//sections")) ||
    doc.at(ns("//preface")).after("<sections> </sections>").next_element
  dest.children.empty? and dest.children = " "
  dest.children.first.next = source
end

#ol_depth(node) ⇒ Object



37
38
39
40
41
# File 'lib/isodoc/jis/presentation_xml_convert.rb', line 37

def ol_depth(node)
  depth = node.ancestors("ol").size + 1
  depth == 1 and return :alphabetic
  :arabic
end

#preface_rearrange(doc) ⇒ Object



53
54
55
56
# File 'lib/isodoc/jis/presentation_section.rb', line 53

def preface_rearrange(doc)
  move_introduction(doc)
  super
end

#strip_para(node) ⇒ Object



95
96
97
# File 'lib/isodoc/jis/presentation_xml_convert.rb', line 95

def strip_para(node)
  node.children.to_xml.gsub(%r{</?p( [^>]*)?>}, "")
end

#strong(docxml) ⇒ Object



16
17
18
19
20
21
# File 'lib/isodoc/jis/presentation_xml_convert.rb', line 16

def strong(docxml)
  docxml.xpath(ns("//strong")).each do |x|
    (x.children.size == 1 && x.children.first.text?) or next # too hard
    x.replace(strong1(x.text))
  end
end

#strong1(text) ⇒ Object



23
24
25
26
27
28
29
30
31
32
33
34
35
# File 'lib/isodoc/jis/presentation_xml_convert.rb', line 23

def strong1(text)
  jpan = /^[#{JPAN}]/o.match?(text[0])
  ret = jpan ? JPAN_BOLD : "<strong>"
  text.chars.each do |n|
    new = /^[#{JPAN}]/o.match?(n)
    jpan && !new and ret += "</span><strong>"
    !jpan && new and ret += "</strong>#{JPAN_BOLD}"
    ret += n
    jpan = new
  end
  ret += /[#{JPAN}]/o.match?(text[-1]) ? "</span>" : "</strong>"
  ret
end

#table1(node) ⇒ Object



99
100
101
102
103
104
105
# File 'lib/isodoc/jis/presentation_xml_convert.rb', line 99

def table1(node)
  super
  cols = table_cols_count(node)
  name = node.at(ns("./name"))
  thead = table_thead_pt(node, name)
  table_unit_note(node, thead, cols)
end

#table_cols_count(node) ⇒ Object



113
114
115
116
117
118
119
# File 'lib/isodoc/jis/presentation_xml_convert.rb', line 113

def table_cols_count(node)
  cols = 0
  node.at(ns(".//tr")).xpath(ns("./td | ./th")).each do |x|
    cols += x["colspan"]&.to_i || 1
  end
  cols
end

#table_thead_pt(node, name) ⇒ Object



107
108
109
110
111
# File 'lib/isodoc/jis/presentation_xml_convert.rb', line 107

def table_thead_pt(node, name)
  node.at(ns("./thead")) ||
    name&.after("<thead> </thead>")&.next ||
    node.elements.first.before("<thead> </thead>").previous
end

#table_unit_note(node, thead, cols) ⇒ Object



121
122
123
124
# File 'lib/isodoc/jis/presentation_xml_convert.rb', line 121

def table_unit_note(node, thead, cols)
  unit_note = node.at(ns(".//note[@type = 'units']")) or return
  thead.children.first.previous = full_row(cols, unit_note.remove.to_xml)
end

#tablesource(elem) ⇒ Object



130
131
132
133
134
135
# File 'lib/isodoc/jis/presentation_xml_convert.rb', line 130

def tablesource(elem)
  while elem&.next_element&.name == "source"
    elem << "; #{to_xml(elem.next_element.remove.children)}"
  end
  elem.children = l10n("#{@i18n.source}: #{to_xml(elem.children).strip}")
end

#toc_title_insert_pt(docxml) ⇒ Object



45
46
47
48
49
50
51
# File 'lib/isodoc/jis/presentation_section.rb', line 45

def toc_title_insert_pt(docxml)
  ins = docxml.at(ns("//preface")) ||
    docxml.at(ns("//sections | //annex | //bibliography"))
      &.before("<preface> </preface>")
      &.previous_element or return nil
  ins.children.last.after(" ").next
end