metanorma-jis 0.0.2 → 0.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/html2doc/lists.rb +43 -52
- data/lib/isodoc/jis/base_convert.rb +108 -3
- data/lib/isodoc/jis/figure.rb +99 -0
- data/lib/isodoc/jis/html/header.html +210 -818
- data/lib/isodoc/jis/html/isodoc.css +27 -70
- data/lib/isodoc/jis/html/isodoc.scss +24 -68
- data/lib/isodoc/jis/html/word_jis_intro.html +4 -3
- data/lib/isodoc/jis/html/word_jis_titlepage.html +6 -0
- data/lib/isodoc/jis/html/wordstyle.css +91 -109
- data/lib/isodoc/jis/html/wordstyle.scss +99 -132
- data/lib/isodoc/jis/html_convert.rb +11 -0
- data/lib/isodoc/jis/i18n-en.yaml +6 -0
- data/lib/isodoc/jis/i18n-ja.yaml +12 -0
- data/lib/isodoc/jis/jis.international-standard.xsl +11290 -0
- data/lib/isodoc/jis/metadata.rb +7 -0
- data/lib/isodoc/jis/presentation_xml_convert.rb +169 -0
- data/lib/isodoc/jis/table.rb +58 -0
- data/lib/isodoc/jis/word_cleanup.rb +143 -0
- data/lib/isodoc/jis/word_convert.rb +101 -89
- data/lib/isodoc/jis/xref.rb +52 -0
- data/lib/metanorma/jis/cleanup.rb +43 -0
- data/lib/metanorma/jis/converter.rb +19 -15
- data/lib/metanorma/jis/front.rb +67 -0
- data/lib/metanorma/jis/isodoc.rng +29 -7
- data/lib/metanorma/jis/jis.rng +10 -0
- data/lib/metanorma/jis/processor.rb +3 -3
- data/lib/metanorma/jis/relaton-jis.rng +3 -109
- data/lib/metanorma/jis/validate.rb +26 -0
- data/lib/metanorma/jis/version.rb +1 -1
- data/metanorma-jis.gemspec +2 -2
- metadata +11 -5
data/lib/isodoc/jis/metadata.rb
CHANGED
@@ -49,6 +49,13 @@ module IsoDoc
|
|
49
49
|
end
|
50
50
|
|
51
51
|
PART_LABEL = { en: "Part", ja: "その" }.freeze
|
52
|
+
|
53
|
+
def docid(isoxml, _out)
|
54
|
+
id = isoxml.at(ns("//bibdata/docidentifier[@type = 'JIS']"))&.text or
|
55
|
+
return
|
56
|
+
set(:docnumber, id)
|
57
|
+
set(:docnumber_undated, id.sub(/:\d{4}$/, ""))
|
58
|
+
end
|
52
59
|
end
|
53
60
|
end
|
54
61
|
end
|
@@ -4,6 +4,175 @@ require "isodoc"
|
|
4
4
|
module IsoDoc
|
5
5
|
module JIS
|
6
6
|
class PresentationXMLConvert < IsoDoc::Iso::PresentationXMLConvert
|
7
|
+
def inline(docxml)
|
8
|
+
super
|
9
|
+
strong(docxml)
|
10
|
+
end
|
11
|
+
|
12
|
+
JPAN = "\\p{Hiragana}\\p{Katakana}\\p{Han}".freeze
|
13
|
+
JPAN_BOLD = "<span style='font-family:\"MS Gothic\"'>".freeze
|
14
|
+
|
15
|
+
def strong(docxml)
|
16
|
+
docxml.xpath(ns("//strong")).each do |x|
|
17
|
+
(x.children.size == 1 && x.children.first.text?) or next # too hard
|
18
|
+
x.replace(strong1(x.text))
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def strong1(text)
|
23
|
+
jpan = /^[#{JPAN}]/o.match?(text[0])
|
24
|
+
ret = jpan ? JPAN_BOLD : "<strong>"
|
25
|
+
text.chars.each do |n|
|
26
|
+
new = /^[#{JPAN}]/o.match?(n)
|
27
|
+
jpan && !new and ret += "</span><strong>"
|
28
|
+
!jpan && new and ret += "</strong>#{JPAN_BOLD}"
|
29
|
+
ret += n
|
30
|
+
jpan = new
|
31
|
+
end
|
32
|
+
ret += /[#{JPAN}]/o.match?(text[-1]) ? "</span>" : "</strong>"
|
33
|
+
ret
|
34
|
+
end
|
35
|
+
|
36
|
+
def admits(elem)
|
37
|
+
elem.children.first.previous = @i18n.l10n("#{@i18n.admitted}: ")
|
38
|
+
end
|
39
|
+
|
40
|
+
def block(docxml)
|
41
|
+
super
|
42
|
+
dl docxml
|
43
|
+
end
|
44
|
+
|
45
|
+
def dl(docxml)
|
46
|
+
docxml.xpath(ns("//table//dl | //figure//dl")).each do |l|
|
47
|
+
l.at(ns("./dl")) || l.at("./ancestor::xmlns:dl") and next
|
48
|
+
dl_to_para(l)
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
def dt_dd?(node)
|
53
|
+
%w{dt dd}.include? node.name
|
54
|
+
end
|
55
|
+
|
56
|
+
def dl_to_para(node)
|
57
|
+
ret = dl_to_para_name(node)
|
58
|
+
ret += dl_to_para_terms(node)
|
59
|
+
node.elements.reject { |n| %w(dt dd name).include?(n.name) }.each do |x|
|
60
|
+
ret += x.to_xml
|
61
|
+
end
|
62
|
+
dl_id_insert(node, ret)
|
63
|
+
end
|
64
|
+
|
65
|
+
def dl_id_insert(node, ret)
|
66
|
+
a = node.replace(ret)
|
67
|
+
p = a.at("./descendant-or-self::xmlns:p")
|
68
|
+
node["id"] and p << "<bookmark id='#{node['id']}'/>"
|
69
|
+
a.xpath("./descendant-or-self::*[@id = '']").each { |x| x.delete("id") }
|
70
|
+
end
|
71
|
+
|
72
|
+
def dl_to_para_name(node)
|
73
|
+
e = node.at(ns("./name"))
|
74
|
+
"<p class='ListTitle'>#{e&.children&.to_xml || @i18n.key}</p>"
|
75
|
+
end
|
76
|
+
|
77
|
+
def dl_to_para_terms(node)
|
78
|
+
ret = ""
|
79
|
+
node.elements.select { |n| dt_dd?(n) }.each_slice(2) do |dt, dd|
|
80
|
+
term = strip_para(dt)
|
81
|
+
defn = strip_para(dd)
|
82
|
+
bkmk = dd["id"] ? "<bookmark id='#{dd['id']}'/>" : ""
|
83
|
+
ret += "<p class='dl' id='#{dt['id']}'>#{term}: #{bkmk}#{defn}</p>"
|
84
|
+
end
|
85
|
+
ret
|
86
|
+
end
|
87
|
+
|
88
|
+
def strip_para(node)
|
89
|
+
node.children.to_xml.gsub(%r{</?p( [^>]*)?>}, "")
|
90
|
+
end
|
91
|
+
|
92
|
+
def table1(node)
|
93
|
+
super
|
94
|
+
cols = table_cols_count(node)
|
95
|
+
name = node.at(ns("./name"))
|
96
|
+
thead = table_thead_pt(node, name)
|
97
|
+
table_unit_note(node, thead, cols)
|
98
|
+
table_name(name, thead, cols)
|
99
|
+
end
|
100
|
+
|
101
|
+
def table_thead_pt(node, name)
|
102
|
+
node.at(ns("./thead")) ||
|
103
|
+
name&.after("<thead> </thead>")&.next ||
|
104
|
+
node.elements.first.before("<thead> </thead>").previous
|
105
|
+
end
|
106
|
+
|
107
|
+
def table_cols_count(node)
|
108
|
+
cols = 0
|
109
|
+
node.at(ns(".//tr")).xpath(ns("./td | ./th")).each do |x|
|
110
|
+
cols += x["colspan"]&.to_i || 1
|
111
|
+
end
|
112
|
+
cols
|
113
|
+
end
|
114
|
+
|
115
|
+
def table_unit_note(node, thead, cols)
|
116
|
+
unit_note = node.at(ns(".//note[@type = 'units']")) or return
|
117
|
+
thead.children.first.previous = full_row(cols, unit_note.remove.to_xml)
|
118
|
+
end
|
119
|
+
|
120
|
+
def table_name(name, thead, cols)
|
121
|
+
name or return
|
122
|
+
thead.children.first.previous =
|
123
|
+
full_row(cols, "<p class='TableTitle' style='text-align:center;'> " \
|
124
|
+
"#{name.remove.children.to_xml}</p>")
|
125
|
+
end
|
126
|
+
|
127
|
+
def full_row(cols, elem)
|
128
|
+
"<tr><td border='0' colspan='#{cols}'>#{elem}</td></tr>"
|
129
|
+
end
|
130
|
+
|
131
|
+
def annex1(elem)
|
132
|
+
elem["commentary"] == "true" and return
|
133
|
+
lbl = @xrefs.anchor(elem["id"], :label)
|
134
|
+
if t = elem.at(ns("./title"))
|
135
|
+
t.children = "<strong>#{to_xml(t.children)}</strong>"
|
136
|
+
end
|
137
|
+
prefix_name(elem, "<br/>", lbl, "title")
|
138
|
+
end
|
139
|
+
|
140
|
+
def annex(docxml)
|
141
|
+
super
|
142
|
+
move_commentaries_to_end(docxml)
|
143
|
+
end
|
144
|
+
|
145
|
+
def move_commentaries_to_end(docxml)
|
146
|
+
docxml.at(ns("//annex[@commentary = 'true']")) or return
|
147
|
+
b = docxml.at(ns("//bibliography")) ||
|
148
|
+
docxml.at(ns("//annex[last()]")).after(" ").next
|
149
|
+
docxml.xpath(ns("//annex[@commentary = 'true']")).reverse.each do |x|
|
150
|
+
b.next = x.remove
|
151
|
+
end
|
152
|
+
end
|
153
|
+
|
154
|
+
def display_order(docxml)
|
155
|
+
i = 0
|
156
|
+
i = display_order_xpath(docxml, "//preface/*", i)
|
157
|
+
i = display_order_at(docxml, "//clause[@type = 'scope']", i)
|
158
|
+
i = display_order_at(docxml, @xrefs.klass.norm_ref_xpath, i)
|
159
|
+
i = display_order_at(docxml, "//sections/terms | " \
|
160
|
+
"//sections/clause[descendant::terms]", i)
|
161
|
+
i = display_order_at(docxml, "//sections/definitions", i)
|
162
|
+
i = display_order_xpath(docxml, @xrefs.klass.middle_clause(docxml), i)
|
163
|
+
i = display_order_xpath(docxml, "//annex[not(@commentary = 'true')]", i)
|
164
|
+
i = display_order_xpath(docxml, @xrefs.klass.bibliography_xpath, i)
|
165
|
+
i = display_order_xpath(docxml, "//annex[@commentary = 'true']", i)
|
166
|
+
i = display_order_xpath(docxml, "//indexsect", i)
|
167
|
+
display_order_xpath(docxml, "//colophon/*", i)
|
168
|
+
end
|
169
|
+
|
170
|
+
def tablesource(elem)
|
171
|
+
while elem&.next_element&.name == "source"
|
172
|
+
elem << "; #{to_xml(elem.next_element.remove.children)}"
|
173
|
+
end
|
174
|
+
elem.children = l10n("#{@i18n.source}: #{to_xml(elem.children).strip}")
|
175
|
+
end
|
7
176
|
|
8
177
|
include Init
|
9
178
|
end
|
@@ -0,0 +1,58 @@
|
|
1
|
+
module IsoDoc
|
2
|
+
module JIS
|
3
|
+
class WordConvert < IsoDoc::Iso::WordConvert
|
4
|
+
def make_table_footnote_target(out, fnid, fnref)
|
5
|
+
attrs = { id: fnid, class: "TableFootnoteRef" }
|
6
|
+
out.span do |s|
|
7
|
+
s << @i18n.table_footnote
|
8
|
+
out.span **attrs do |a|
|
9
|
+
a << "#{fnref})"
|
10
|
+
end
|
11
|
+
insert_tab(s, 1)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
def table_title_parse(node, out); end
|
16
|
+
|
17
|
+
def table_attrs(node)
|
18
|
+
{ id: node["id"], title: node["alt"],
|
19
|
+
summary: node["summary"], width: node["width"],
|
20
|
+
class: (node.text.length > 4000 ? "MsoTableGridBig" : "MsoTableGrid"),
|
21
|
+
style: "border-collapse:collapse;" \
|
22
|
+
"mso-table-anchor-horizontal:column;mso-table-overlap:never;" \
|
23
|
+
"border:none;mso-padding-alt: " \
|
24
|
+
"0cm 5.4pt 0cm 5.4pt;mso-border-insideh:none;" \
|
25
|
+
"mso-border-insidev:none;#{keep_style(node)}",
|
26
|
+
border: 0, cellspacing: 0, cellpadding: 0 }
|
27
|
+
end
|
28
|
+
|
29
|
+
def make_tr_attr_style(cell, row, rowmax, totalrows, opt)
|
30
|
+
top = row.zero? ? "#{SW1} 1.5pt;" : "none;"
|
31
|
+
bottom = "#{SW1} #{rowmax >= totalrows ? '1.5' : '1.0'}pt;"
|
32
|
+
ret = <<~STYLE.gsub(/\n/, "")
|
33
|
+
border-top:#{top}mso-border-top-alt:#{top}
|
34
|
+
border-left:#{bottom}mso-border-top-alt:#{bottom}
|
35
|
+
border-right:#{bottom}mso-border-top-alt:#{bottom}
|
36
|
+
border-bottom:#{bottom}mso-border-bottom-alt:#{bottom}
|
37
|
+
STYLE
|
38
|
+
opt[:bordered] or ret = ""
|
39
|
+
pb = keep_rows_together(cell, rowmax, totalrows, opt) ? "avoid" : "auto"
|
40
|
+
"#{ret}page-break-after:#{pb};"
|
41
|
+
end
|
42
|
+
|
43
|
+
def new_fullcolspan_row(table, tfoot)
|
44
|
+
# how many columns in the table?
|
45
|
+
cols = 0
|
46
|
+
table.at(".//tr").xpath("./td | ./th").each do |td|
|
47
|
+
cols += (td["colspan"] ? td["colspan"].to_i : 1)
|
48
|
+
end
|
49
|
+
style = "border-top:0pt;mso-border-top-alt:0pt;" \
|
50
|
+
"border-bottom:#{SW1} 1.5pt;mso-border-bottom-alt:#{SW1} 1.5pt;" \
|
51
|
+
"border-left:#{SW1} 1.5pt;mso-border-left-alt:#{SW1} 1.5pt;" \
|
52
|
+
"border-right:#{SW1} 1.5pt;mso-border-right-alt:#{SW1} 1.5pt;"
|
53
|
+
tfoot.add_child("<tr><td colspan='#{cols}' style='#{style}'/></tr>")
|
54
|
+
tfoot.xpath(".//td").last
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
@@ -0,0 +1,143 @@
|
|
1
|
+
require_relative "../../html2doc/lists"
|
2
|
+
|
3
|
+
module IsoDoc
|
4
|
+
module JIS
|
5
|
+
class WordConvert < IsoDoc::Iso::WordConvert
|
6
|
+
def postprocess(result, filename, dir)
|
7
|
+
filename = filename.sub(/\.doc$/, "")
|
8
|
+
header = generate_header(filename, dir)
|
9
|
+
result = from_xhtml(cleanup(to_xhtml(textcleanup(result))))
|
10
|
+
toWord(result, filename, dir, header)
|
11
|
+
@files_to_delete.each { |f| FileUtils.rm_f f }
|
12
|
+
end
|
13
|
+
|
14
|
+
def word_cleanup(docxml)
|
15
|
+
word_note_cleanup(docxml)
|
16
|
+
boldface(docxml)
|
17
|
+
super
|
18
|
+
move_to_inner_cover(docxml)
|
19
|
+
end
|
20
|
+
|
21
|
+
def move_to_inner_cover(docxml)
|
22
|
+
source = docxml.at("//div[@type = 'inner-cover-note']")
|
23
|
+
dest = docxml.at("//div[@id = 'boilerplate-inner-cover-note']")
|
24
|
+
source && dest and dest.replace(source.remove)
|
25
|
+
source = docxml.at("//div[@type = 'contributors']")
|
26
|
+
dest = docxml.at("//div[@id = 'boilerplate-contributors']")
|
27
|
+
source && dest and dest.replace(source.remove)
|
28
|
+
docxml
|
29
|
+
end
|
30
|
+
|
31
|
+
def word_intro(docxml, level)
|
32
|
+
intro = insert_toc(File.read(@wordintropage, encoding: "UTF-8"),
|
33
|
+
docxml, level)
|
34
|
+
intro = populate_template(intro, :word)
|
35
|
+
introxml = to_word_xhtml_fragment(intro)
|
36
|
+
docxml.at('//div[@class="WordSection2"]') << introxml
|
37
|
+
.to_xml(encoding: "US-ASCII")
|
38
|
+
end
|
39
|
+
|
40
|
+
def word_note_cleanup(docxml)
|
41
|
+
docxml.xpath("//p[@class = 'Note']").each do |p|
|
42
|
+
p.xpath("//following-sibling::p").each do |p2|
|
43
|
+
p2["class"] == "Note" and
|
44
|
+
p2["class"] = "NoteCont"
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
def boldface(docxml)
|
50
|
+
docxml.xpath("//b").each do |b|
|
51
|
+
b.name = "span"
|
52
|
+
b["class"] = "Strong"
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
def toWord(result, filename, dir, header)
|
57
|
+
result = word_split(word_cleanup(to_xhtml(result)))
|
58
|
+
@wordstylesheet = wordstylesheet_update
|
59
|
+
result.each do |k, v|
|
60
|
+
to_word1(v, "#{filename}#{k}", dir, header)
|
61
|
+
end
|
62
|
+
header&.unlink
|
63
|
+
@wordstylesheet.unlink if @wordstylesheet.is_a?(Tempfile)
|
64
|
+
end
|
65
|
+
|
66
|
+
def to_word1(result, filename, dir, header)
|
67
|
+
result or return
|
68
|
+
result = from_xhtml(result).gsub(/-DOUBLE_HYPHEN_ESCAPE-/, "--")
|
69
|
+
::Html2Doc::JIS.new(
|
70
|
+
filename: filename, imagedir: @localdir,
|
71
|
+
stylesheet: @wordstylesheet&.path,
|
72
|
+
header_file: header&.path, dir: dir,
|
73
|
+
asciimathdelims: [@openmathdelim, @closemathdelim],
|
74
|
+
liststyles: { ul: @ulstyle, ol: @olstyle }
|
75
|
+
).process(result)
|
76
|
+
end
|
77
|
+
|
78
|
+
def word_split(xml)
|
79
|
+
b = xml.dup
|
80
|
+
{ _cover: cover_split(xml), "": main_split(b) }
|
81
|
+
end
|
82
|
+
|
83
|
+
def cover_split(xml)
|
84
|
+
xml.at("//body").elements.each do |e|
|
85
|
+
e.name == "div" && e["class"] == "WordSection1" and next
|
86
|
+
e.remove
|
87
|
+
end
|
88
|
+
xml
|
89
|
+
end
|
90
|
+
|
91
|
+
def main_split(xml)
|
92
|
+
c = xml.at("//div[@class = 'WordSection1']")
|
93
|
+
c.next_element&.remove
|
94
|
+
c.remove
|
95
|
+
c = xml.at("//div[@class = 'WordSection2']")
|
96
|
+
c.elements.first.at("./br") and c.elements.first.remove
|
97
|
+
xml
|
98
|
+
end
|
99
|
+
|
100
|
+
STYLESMAP = {}.freeze
|
101
|
+
|
102
|
+
def style_cleanup(docxml)
|
103
|
+
new_styles(docxml)
|
104
|
+
index_cleanup(docxml)
|
105
|
+
end
|
106
|
+
|
107
|
+
def new_styles(docxml)
|
108
|
+
super
|
109
|
+
biblio_paras(docxml)
|
110
|
+
heading_to_para(docxml)
|
111
|
+
end
|
112
|
+
|
113
|
+
def biblio_paras(docxml)
|
114
|
+
docxml.xpath("//div[@class = 'normref_div']//" \
|
115
|
+
"p[not(@class) or @class = 'MsoNormal']").each do |p|
|
116
|
+
p["class"] = "NormRefText"
|
117
|
+
end
|
118
|
+
end
|
119
|
+
|
120
|
+
def heading_to_para(docxml)
|
121
|
+
docxml.xpath("//h1[@class = 'ForewordTitle']").each do |p|
|
122
|
+
p.name = "p"
|
123
|
+
p.parent.xpath("./p[not(@class) or @class = 'MsoNormal']").each do |n|
|
124
|
+
n["class"] = "ForewordText"
|
125
|
+
end
|
126
|
+
end
|
127
|
+
docxml.xpath("//h1[@class = 'IntroTitle'] | //h1[@class = 'Annex'] | " \
|
128
|
+
"//h2[@class = 'Terms'] | " \
|
129
|
+
"//h3[@class = 'Terms'] | //h4[@class = 'Terms'] | " \
|
130
|
+
"//h5[@class = 'Terms'] | //h6[@class = 'Terms']").each do |n|
|
131
|
+
n.name = "p"
|
132
|
+
end
|
133
|
+
end
|
134
|
+
|
135
|
+
def word_annex_cleanup1(docxml, lvl)
|
136
|
+
docxml.xpath("//h#{lvl}[ancestor::*[@class = 'Section3']]").each do |h2|
|
137
|
+
h2.name = "p"
|
138
|
+
h2["class"] = "h#{lvl}Annex"
|
139
|
+
end
|
140
|
+
end
|
141
|
+
end
|
142
|
+
end
|
143
|
+
end
|
@@ -1,7 +1,9 @@
|
|
1
|
-
require_relative "../../html2doc/lists"
|
2
1
|
require_relative "base_convert"
|
3
2
|
require "isodoc"
|
4
3
|
require_relative "init"
|
4
|
+
require_relative "word_cleanup"
|
5
|
+
require_relative "figure"
|
6
|
+
require_relative "table"
|
5
7
|
|
6
8
|
module IsoDoc
|
7
9
|
module JIS
|
@@ -14,6 +16,11 @@ module IsoDoc
|
|
14
16
|
|
15
17
|
def init_dis(opt); end
|
16
18
|
|
19
|
+
def clause_attrs(node)
|
20
|
+
# capture the type of clause
|
21
|
+
{ id: node["id"], type: node["type"] }
|
22
|
+
end
|
23
|
+
|
17
24
|
def convert(input_filename, file = nil, debug = false,
|
18
25
|
output_filename = nil)
|
19
26
|
file = File.read(input_filename, encoding: "utf-8") if file.nil?
|
@@ -56,85 +63,10 @@ module IsoDoc
|
|
56
63
|
olstyle: "l8" }
|
57
64
|
end
|
58
65
|
|
59
|
-
def postprocess(result, filename, dir)
|
60
|
-
filename = filename.sub(/\.doc$/, "")
|
61
|
-
header = generate_header(filename, dir)
|
62
|
-
result = from_xhtml(cleanup(to_xhtml(textcleanup(result))))
|
63
|
-
toWord(result, filename, dir, header)
|
64
|
-
@files_to_delete.each { |f| FileUtils.rm_f f }
|
65
|
-
end
|
66
|
-
|
67
|
-
def word_cleanup(docxml)
|
68
|
-
word_note_cleanup(docxml)
|
69
|
-
boldface(docxml)
|
70
|
-
super
|
71
|
-
end
|
72
|
-
|
73
|
-
def word_note_cleanup(docxml)
|
74
|
-
docxml.xpath("//p[@class = 'Note']").each do |p|
|
75
|
-
p.xpath("//following-sibling::p").each do |p2|
|
76
|
-
p2["class"] == "Note" and
|
77
|
-
p2["class"] = "NoteCont"
|
78
|
-
end
|
79
|
-
end
|
80
|
-
end
|
81
|
-
|
82
|
-
def boldface(docxml)
|
83
|
-
docxml.xpath("//h1 | h2 | h3 | h4 | h5 | h6").each do |h|
|
84
|
-
h.children = "<b>#{to_xml(h.children)}</b>"
|
85
|
-
end
|
86
|
-
docxml.xpath("//b").each do |b|
|
87
|
-
b.name = "span"
|
88
|
-
b["class"] = "Strong"
|
89
|
-
end
|
90
|
-
end
|
91
|
-
|
92
|
-
def toWord(result, filename, dir, header)
|
93
|
-
result = word_split(word_cleanup(to_xhtml(result)))
|
94
|
-
@wordstylesheet = wordstylesheet_update
|
95
|
-
result.each do |k, v|
|
96
|
-
to_word1(v, "#{filename}#{k}", dir, header)
|
97
|
-
end
|
98
|
-
header&.unlink
|
99
|
-
@wordstylesheet.unlink if @wordstylesheet.is_a?(Tempfile)
|
100
|
-
end
|
101
|
-
|
102
|
-
def to_word1(result, filename, dir, header)
|
103
|
-
result or return
|
104
|
-
result = from_xhtml(result).gsub(/-DOUBLE_HYPHEN_ESCAPE-/, "--")
|
105
|
-
::Html2Doc::JIS.new(
|
106
|
-
filename: filename, imagedir: @localdir,
|
107
|
-
stylesheet: @wordstylesheet&.path,
|
108
|
-
header_file: header&.path, dir: dir,
|
109
|
-
asciimathdelims: [@openmathdelim, @closemathdelim],
|
110
|
-
liststyles: { ul: @ulstyle, ol: @olstyle }
|
111
|
-
).process(result)
|
112
|
-
end
|
113
|
-
|
114
|
-
def word_split(xml)
|
115
|
-
b = xml.dup
|
116
|
-
{ _cover: cover_split(xml), "": main_split(b) }
|
117
|
-
end
|
118
|
-
|
119
|
-
def cover_split(xml)
|
120
|
-
xml.at("//body").elements.each do |e|
|
121
|
-
e.name == "div" && e["class"] == "WordSection1" and next
|
122
|
-
e.remove
|
123
|
-
end
|
124
|
-
xml
|
125
|
-
end
|
126
|
-
|
127
|
-
def main_split(xml)
|
128
|
-
c = xml.at("//div[@class = 'WordSection1']")
|
129
|
-
c.next_element&.remove
|
130
|
-
c.remove
|
131
|
-
xml
|
132
|
-
end
|
133
|
-
|
134
66
|
def norm_ref(isoxml, out, num)
|
135
67
|
(f = isoxml.at(ns(norm_ref_xpath)) and f["hidden"] != "true") or
|
136
68
|
return num
|
137
|
-
out.div class: "
|
69
|
+
out.div class: "normref_div" do |div|
|
138
70
|
num += 1
|
139
71
|
clause_name(f, f.at(ns("./title")), div, nil)
|
140
72
|
if f.name == "clause"
|
@@ -167,24 +99,104 @@ module IsoDoc
|
|
167
99
|
end
|
168
100
|
end
|
169
101
|
|
170
|
-
def
|
102
|
+
def preface(isoxml, out)
|
103
|
+
isoxml.xpath(ns("//preface/clause | //preface/references | " \
|
104
|
+
"//preface/definitions | //preface/terms")).each do |f|
|
105
|
+
out.div **attr_code(class: "Section3", id: f["id"],
|
106
|
+
type: f["type"]) do |div|
|
107
|
+
clause_name(f, f&.at(ns("./title")), div, { class: "IntroTitle" })
|
108
|
+
f.elements.each do |e|
|
109
|
+
parse(e, div) unless e.name == "title"
|
110
|
+
end
|
111
|
+
end
|
112
|
+
end
|
113
|
+
end
|
114
|
+
|
115
|
+
def introduction(isoxml, out)
|
116
|
+
f = isoxml.at(ns("//introduction")) || return
|
117
|
+
out.div class: "Section3", id: f["id"] do |div|
|
118
|
+
clause_name(f, f.at(ns("./title")), div, { class: "IntroTitle" })
|
119
|
+
f.elements.each do |e|
|
120
|
+
parse(e, div) unless e.name == "title"
|
121
|
+
end
|
122
|
+
end
|
123
|
+
end
|
124
|
+
|
125
|
+
def make_body2(body, docxml)
|
126
|
+
body.div class: "WordSection2" do |div2|
|
127
|
+
boilerplate docxml, div2
|
128
|
+
preface_block docxml, div2
|
129
|
+
abstract docxml, div2
|
130
|
+
foreword docxml, div2
|
131
|
+
preface docxml, div2
|
132
|
+
acknowledgements docxml, div2
|
133
|
+
div2.p { |p| p << " " } # placeholder
|
134
|
+
end
|
135
|
+
section_break(body)
|
136
|
+
end
|
137
|
+
|
138
|
+
def middle(isoxml, out)
|
139
|
+
middle_title(isoxml, out)
|
140
|
+
middle_admonitions(isoxml, out)
|
141
|
+
introduction isoxml, out
|
142
|
+
scope isoxml, out, 0
|
143
|
+
norm_ref isoxml, out, 0
|
144
|
+
clause_etc isoxml, out, 0
|
145
|
+
annex isoxml, out
|
146
|
+
bibliography isoxml, out
|
147
|
+
end
|
148
|
+
|
149
|
+
def make_body3(body, docxml)
|
171
150
|
super
|
172
|
-
|
173
|
-
|
151
|
+
commentary docxml, body
|
152
|
+
end
|
153
|
+
|
154
|
+
def footnote_parse(node, out)
|
155
|
+
return table_footnote_parse(node, out) if @in_table || @in_figure # &&
|
156
|
+
|
157
|
+
# !node.ancestors.map(&:name).include?("name")
|
158
|
+
|
159
|
+
fn = node["reference"] || UUIDTools::UUID.random_create.to_s
|
160
|
+
return seen_footnote_parse(node, out, fn) if @seen_footnote.include?(fn)
|
161
|
+
|
162
|
+
@fn_bookmarks[fn] = bookmarkid
|
163
|
+
out.span style: "mso-bookmark:_Ref#{@fn_bookmarks[fn]}" do |s|
|
164
|
+
s.a class: "FootnoteRef", "epub:type": "footnote",
|
165
|
+
href: "#ftn#{fn}" do |a|
|
166
|
+
a.sup { |sup| sup << fn }
|
167
|
+
end
|
168
|
+
end
|
169
|
+
@in_footnote = true
|
170
|
+
@footnotes << make_generic_footnote_text(node, fn)
|
171
|
+
@in_footnote = false
|
172
|
+
@seen_footnote << fn
|
173
|
+
end
|
174
|
+
|
175
|
+
def annex(isoxml, out)
|
176
|
+
amd(isoxml) and @suppressheadingnumbers = @oldsuppressheadingnumbers
|
177
|
+
isoxml.xpath(ns("//annex[not(@commentary = 'true')]")).each do |c|
|
178
|
+
page_break(out)
|
179
|
+
render_annex(out, c)
|
180
|
+
end
|
181
|
+
amd(isoxml) and @suppressheadingnumbers = true
|
174
182
|
end
|
175
183
|
|
176
|
-
def
|
177
|
-
|
178
|
-
|
179
|
-
|
184
|
+
def commentary(isoxml, out)
|
185
|
+
isoxml.xpath(ns("//annex[@commentary = 'true']")).each do |c|
|
186
|
+
section_break(out)
|
187
|
+
out.div class: "WordSectionCommentary" do |div|
|
188
|
+
commentary_title(isoxml, div)
|
189
|
+
render_annex(div, c)
|
190
|
+
end
|
180
191
|
end
|
181
192
|
end
|
182
193
|
|
183
|
-
def
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
194
|
+
def render_annex(out, clause)
|
195
|
+
out.div **attr_code(annex_attrs(clause)) do |s|
|
196
|
+
clause.elements.each do |c1|
|
197
|
+
if c1.name == "title" then annex_name(clause, c1, s)
|
198
|
+
else parse(c1, s)
|
199
|
+
end
|
188
200
|
end
|
189
201
|
end
|
190
202
|
end
|
data/lib/isodoc/jis/xref.rb
CHANGED
@@ -1,6 +1,58 @@
|
|
1
1
|
module IsoDoc
|
2
2
|
module JIS
|
3
|
+
class Counter < IsoDoc::XrefGen::Counter
|
4
|
+
end
|
5
|
+
|
3
6
|
class Xref < IsoDoc::Iso::Xref
|
7
|
+
def annex_name_lbl(clause, num)
|
8
|
+
obl = l10n("(#{@labels['inform_annex']})")
|
9
|
+
clause["obligation"] == "normative" and
|
10
|
+
obl = l10n("(#{@labels['norm_annex']})")
|
11
|
+
title = Common::case_with_markup(@labels["annex"], "capital", @script)
|
12
|
+
l10n("#{title} #{num}<br/>#{obl}")
|
13
|
+
end
|
14
|
+
|
15
|
+
def back_anchor_names(xml)
|
16
|
+
if @parse_settings.empty? || @parse_settings[:clauses]
|
17
|
+
i = Counter.new("@")
|
18
|
+
xml.xpath(ns("//annex")).each do |c|
|
19
|
+
if c["commentary"] == "true"
|
20
|
+
commentary_names(c)
|
21
|
+
else
|
22
|
+
annex_names(c, i.increment(c).print)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
xml.xpath(ns(@klass.bibliography_xpath)).each do |b|
|
26
|
+
preface_names(b)
|
27
|
+
end
|
28
|
+
xml.xpath(ns("//colophon/clause")).each { |b| preface_names(b) }
|
29
|
+
xml.xpath(ns("//indexsect")).each { |b| preface_names(b) }
|
30
|
+
end
|
31
|
+
references(xml) if @parse_settings.empty? || @parse_settings[:refs]
|
32
|
+
end
|
33
|
+
|
34
|
+
def commentary_names(clause)
|
35
|
+
preface_name_anchors(clause, 1, clause_title(clause))
|
36
|
+
clause.xpath(ns(SUBCLAUSES)).each_with_object(Counter.new) do |c, i|
|
37
|
+
commentary_names1(c, clause["id"], i.increment(c).print, 2)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
def commentary_names1(clause, root, num, level)
|
42
|
+
commentary_name_anchors(clause, num, root, level)
|
43
|
+
clause.xpath(ns(SUBCLAUSES)).each_with_object(Counter.new) do |c, i|
|
44
|
+
commentary_names1(c, root, "#{num}.#{i.increment(c).print}",
|
45
|
+
level + 1)
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
def commentary_name_anchors(clause, num, root, level)
|
50
|
+
@anchors[clause["id"]] =
|
51
|
+
{ label: num, xref: l10n("#{@labels['clause']} #{num}"),
|
52
|
+
container: root,
|
53
|
+
title: clause_title(clause), level: level, type: "clause",
|
54
|
+
elem: @labels["clause"] }
|
55
|
+
end
|
4
56
|
end
|
5
57
|
end
|
6
58
|
end
|