metanorma-jis 0.0.2 → 0.0.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/html2doc/lists.rb +41 -6
- data/lib/isodoc/jis/base_convert.rb +38 -0
- data/lib/isodoc/jis/html/isodoc.css +19 -33
- data/lib/isodoc/jis/html/isodoc.scss +16 -32
- 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 +37 -109
- data/lib/isodoc/jis/html/wordstyle.scss +48 -132
- data/lib/isodoc/jis/html_convert.rb +11 -0
- data/lib/isodoc/jis/i18n-ja.yaml +5 -0
- data/lib/isodoc/jis/jis.international-standard.xsl +11095 -0
- data/lib/isodoc/jis/presentation_xml_convert.rb +88 -0
- data/lib/isodoc/jis/word_cleanup.rb +143 -0
- data/lib/isodoc/jis/word_convert.rb +222 -90
- data/lib/isodoc/jis/xref.rb +7 -0
- data/lib/metanorma/jis/cleanup.rb +42 -0
- data/lib/metanorma/jis/converter.rb +9 -15
- data/lib/metanorma/jis/front.rb +25 -0
- data/lib/metanorma/jis/processor.rb +1 -1
- 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
- metadata +6 -2
@@ -4,6 +4,94 @@ 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.split("").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 block(docxml)
|
37
|
+
super
|
38
|
+
dl docxml
|
39
|
+
end
|
40
|
+
|
41
|
+
def dl(docxml)
|
42
|
+
docxml.xpath(ns("//table//dl | //figure//dl")).each do |l|
|
43
|
+
l.at(ns("./dl")) || l.at("./ancestor::xmlns:dl") and next
|
44
|
+
dl_to_para(l)
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
def dt_dd?(node)
|
49
|
+
%w{dt dd}.include? node.name
|
50
|
+
end
|
51
|
+
|
52
|
+
def dl_to_para(node)
|
53
|
+
ret = ""
|
54
|
+
e = node.at(ns("./name")) and
|
55
|
+
ret += "<p class='ListTitle' id='#{dlist['id']}'>" \
|
56
|
+
"#{e.children.to_xml}</p>"
|
57
|
+
node.elements.select { |n| dt_dd?(n) }.each_slice(2) do |dt, dd|
|
58
|
+
term = dt.children.to_xml.gsub(%r{</?p( [^>]*)>}, "")
|
59
|
+
defn = dd.children.to_xml.gsub(%r{</?p( [^>]*)>}, "")
|
60
|
+
ret += "<p id='#{dt['id']}'>#{term}: " \
|
61
|
+
"<bookmark id='#{dd['id']}'/>#{defn}</p>"
|
62
|
+
end
|
63
|
+
node.elements.each do |x|
|
64
|
+
%w(dt dd name).include?(x.name) and next
|
65
|
+
ret += x.to_xml
|
66
|
+
end
|
67
|
+
node.replace(ret.gsub(/ id=''/, ""))
|
68
|
+
end
|
69
|
+
|
70
|
+
def table1(node)
|
71
|
+
super
|
72
|
+
cols = 0
|
73
|
+
node.at(ns(".//tr")).xpath(ns("./td | ./th")).each do |x|
|
74
|
+
cols += x["colspan"]&.to_i || 1
|
75
|
+
end
|
76
|
+
name = node.at(ns("./name"))
|
77
|
+
h = node.at(ns("./thead")) || name.after("<thead> </thead>").next
|
78
|
+
unit_note = node.at(ns(".//note[@type = 'units']"))&.remove
|
79
|
+
unit_note and h.children.first.previous = full_row(cols, unit_row.to_xml)
|
80
|
+
name and h.children.first.previous =
|
81
|
+
full_row(cols, "<p class='TableTitle' style='text-align:center;'>#{name.remove.children.to_xml}</p>")
|
82
|
+
end
|
83
|
+
|
84
|
+
def full_row(cols, elem)
|
85
|
+
"<tr><td border='0' colspan='#{cols}'>#{elem}</td></tr>"
|
86
|
+
end
|
87
|
+
|
88
|
+
def annex1(elem)
|
89
|
+
lbl = @xrefs.anchor(elem["id"], :label)
|
90
|
+
if t = elem.at(ns("./title"))
|
91
|
+
t.children = "<strong>#{to_xml(t.children)}</strong>"
|
92
|
+
end
|
93
|
+
prefix_name(elem, "<br/>", lbl, "title")
|
94
|
+
end
|
7
95
|
|
8
96
|
include Init
|
9
97
|
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)
|
25
|
+
source = docxml.at("//div[@type = 'contributors']")
|
26
|
+
dest = docxml.at("//div[@id = 'boilerplate-contributors']")
|
27
|
+
source && dest and dest.replace(source)
|
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.xpath("../div/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 |p|
|
131
|
+
p.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,7 @@
|
|
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
5
|
|
6
6
|
module IsoDoc
|
7
7
|
module JIS
|
@@ -14,6 +14,11 @@ module IsoDoc
|
|
14
14
|
|
15
15
|
def init_dis(opt); end
|
16
16
|
|
17
|
+
def clause_attrs(node)
|
18
|
+
# capture the type of clause
|
19
|
+
{ id: node["id"], type: node["type"] }
|
20
|
+
end
|
21
|
+
|
17
22
|
def convert(input_filename, file = nil, debug = false,
|
18
23
|
output_filename = nil)
|
19
24
|
file = File.read(input_filename, encoding: "utf-8") if file.nil?
|
@@ -56,85 +61,10 @@ module IsoDoc
|
|
56
61
|
olstyle: "l8" }
|
57
62
|
end
|
58
63
|
|
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
64
|
def norm_ref(isoxml, out, num)
|
135
65
|
(f = isoxml.at(ns(norm_ref_xpath)) and f["hidden"] != "true") or
|
136
66
|
return num
|
137
|
-
out.div class: "
|
67
|
+
out.div class: "normref_div" do |div|
|
138
68
|
num += 1
|
139
69
|
clause_name(f, f.at(ns("./title")), div, nil)
|
140
70
|
if f.name == "clause"
|
@@ -167,26 +97,228 @@ module IsoDoc
|
|
167
97
|
end
|
168
98
|
end
|
169
99
|
|
170
|
-
def
|
171
|
-
|
172
|
-
|
173
|
-
|
100
|
+
def preface(isoxml, out)
|
101
|
+
isoxml.xpath(ns("//preface/clause | //preface/references | " \
|
102
|
+
"//preface/definitions | //preface/terms")).each do |f|
|
103
|
+
out.div **attr_code(class: "Section3", id: f["id"],
|
104
|
+
type: f["type"]) do |div|
|
105
|
+
clause_name(f, f&.at(ns("./title")), div, { class: "IntroTitle" })
|
106
|
+
f.elements.each do |e|
|
107
|
+
parse(e, div) unless e.name == "title"
|
108
|
+
end
|
109
|
+
end
|
110
|
+
end
|
111
|
+
end
|
112
|
+
|
113
|
+
def introduction(isoxml, out)
|
114
|
+
f = isoxml.at(ns("//introduction")) || return
|
115
|
+
out.div class: "Section3", id: f["id"] do |div|
|
116
|
+
clause_name(f, f.at(ns("./title")), div, { class: "IntroTitle" })
|
117
|
+
f.elements.each do |e|
|
118
|
+
parse(e, div) unless e.name == "title"
|
119
|
+
end
|
120
|
+
end
|
121
|
+
end
|
122
|
+
|
123
|
+
def make_body2(body, docxml)
|
124
|
+
body.div class: "WordSection2" do |div2|
|
125
|
+
boilerplate docxml, div2
|
126
|
+
preface_block docxml, div2
|
127
|
+
abstract docxml, div2
|
128
|
+
foreword docxml, div2
|
129
|
+
preface docxml, div2
|
130
|
+
acknowledgements docxml, div2
|
131
|
+
div2.p { |p| p << " " } # placeholder
|
132
|
+
end
|
133
|
+
section_break(body)
|
134
|
+
end
|
135
|
+
|
136
|
+
def middle(isoxml, out)
|
137
|
+
middle_title(isoxml, out)
|
138
|
+
middle_admonitions(isoxml, out)
|
139
|
+
introduction isoxml, out
|
140
|
+
scope isoxml, out, 0
|
141
|
+
norm_ref isoxml, out, 0
|
142
|
+
terms_defs isoxml, out, 0
|
143
|
+
symbols_abbrevs isoxml, out, 0
|
144
|
+
clause isoxml, out
|
145
|
+
annex isoxml, out
|
146
|
+
bibliography isoxml, out
|
147
|
+
# colophon isoxml, out
|
148
|
+
end
|
149
|
+
|
150
|
+
def figure_attrs(node)
|
151
|
+
attr_code(id: node["id"], class: "MsoTableGrid",
|
152
|
+
style: "border-collapse:collapse;" \
|
153
|
+
"border:none;mso-padding-alt: " \
|
154
|
+
"0cm 5.4pt 0cm 5.4pt;mso-border-insideh:none;" \
|
155
|
+
"mso-border-insidev:none;#{keep_style(node)}",
|
156
|
+
border: 0, cellspacing: 0, cellpadding: 0)
|
157
|
+
end
|
158
|
+
|
159
|
+
def figure_components(node)
|
160
|
+
{ units: node.at(ns("./note[@type = 'units']/p")),
|
161
|
+
notes_etc: figure_notes_examples_paras(node
|
162
|
+
.xpath(ns("./note[not(@type = 'units')] | ./example | ./p"))),
|
163
|
+
name: node.at(ns("./name")),
|
164
|
+
key: node.at(ns("./dl")),
|
165
|
+
img: node.at(ns("./image")),
|
166
|
+
aside: node.at(ns("./aside")),
|
167
|
+
subfigs: node.xpath(ns("./figure")).map { |n| figure_components(n) } }
|
168
|
+
end
|
169
|
+
|
170
|
+
def figure_notes_examples_paras(xpath)
|
171
|
+
xpath.empty? and return nil
|
172
|
+
curr = ""
|
173
|
+
xpath.each_with_object([]) do |e, m|
|
174
|
+
e.name == curr or m << []
|
175
|
+
curr = e.name
|
176
|
+
m[-1] << e
|
177
|
+
end
|
178
|
+
end
|
179
|
+
|
180
|
+
def figure_parse1(node, out)
|
181
|
+
c = figure_components(node)
|
182
|
+
out.table **figure_attrs(node) do |div|
|
183
|
+
%i(units img subfigs key notes_etc aside name).each do |key|
|
184
|
+
case key
|
185
|
+
when :subfigs
|
186
|
+
c[key].each do |n|
|
187
|
+
n[:subname] = n[:name]
|
188
|
+
figure_row(node, div, n, :img)
|
189
|
+
figure_row(node, div, n, :subname)
|
190
|
+
end
|
191
|
+
when :notes_etc
|
192
|
+
c[key].each do |n|
|
193
|
+
figure_row(node, div, n, :notes_etc)
|
194
|
+
end
|
195
|
+
else figure_row(node, div, c, key)
|
196
|
+
end
|
197
|
+
end
|
198
|
+
end
|
199
|
+
end
|
200
|
+
|
201
|
+
def figure_name_parse(_node, div, name)
|
202
|
+
name.nil? and return
|
203
|
+
div.p class: "Tabletitle", style: "text-align:center;" do |p|
|
204
|
+
name.children.each { |n| parse(n, p) }
|
205
|
+
end
|
206
|
+
end
|
207
|
+
|
208
|
+
def figure_row(node, table, hash, key)
|
209
|
+
key != :notes_etc && (
|
210
|
+
hash[key].nil? || (hash[key].is_a?(Array) && hash[key].empty?)) and
|
211
|
+
return
|
212
|
+
table.tr do |r|
|
213
|
+
r.td valign: "top", style: "padding:0cm 5.4pt 0cm 5.4pt" do |d|
|
214
|
+
figure_row1(node, d, hash, key)
|
215
|
+
end
|
216
|
+
end
|
217
|
+
end
|
218
|
+
|
219
|
+
def fig_para(klass, row, nodes)
|
220
|
+
row.td valign: "top", style: "padding:0cm 5.4pt 0cm 5.4pt" do |d|
|
221
|
+
d.p class: klass do |p|
|
222
|
+
nodes.each { |n| parse(n, p) }
|
223
|
+
end
|
224
|
+
end
|
225
|
+
end
|
226
|
+
|
227
|
+
def figure_row1(node, cell, hash, key)
|
228
|
+
case key
|
229
|
+
when :units
|
230
|
+
cell.p class: "UnitStatement" do |p|
|
231
|
+
hash[key].children.each { |n| parse(n, p) }
|
232
|
+
end
|
233
|
+
when :key
|
234
|
+
figure_key(cell)
|
235
|
+
parse(hash[key], cell)
|
236
|
+
when :notes_etc, :aside
|
237
|
+
hash.each { |n| parse(n, cell) }
|
238
|
+
when :name then figure_name_parse(node, cell, hash[key])
|
239
|
+
when :img
|
240
|
+
cell.p class: "Figure" do |p|
|
241
|
+
parse(hash[key], p)
|
242
|
+
end
|
243
|
+
when :subname
|
244
|
+
cell.p class: "SubfigureCaption" do |p|
|
245
|
+
hash[key].children.each { |n| parse(n, p) }
|
246
|
+
end
|
247
|
+
end
|
174
248
|
end
|
175
249
|
|
176
|
-
def
|
177
|
-
|
178
|
-
|
179
|
-
|
250
|
+
def footnote_parse(node, out)
|
251
|
+
return table_footnote_parse(node, out) if @in_table || @in_figure # &&
|
252
|
+
|
253
|
+
# !node.ancestors.map(&:name).include?("name")
|
254
|
+
|
255
|
+
fn = node["reference"] || UUIDTools::UUID.random_create.to_s
|
256
|
+
return seen_footnote_parse(node, out, fn) if @seen_footnote.include?(fn)
|
257
|
+
|
258
|
+
@fn_bookmarks[fn] = bookmarkid
|
259
|
+
out.span style: "mso-bookmark:_Ref#{@fn_bookmarks[fn]}" do |s|
|
260
|
+
s.a class: "FootnoteRef", "epub:type": "footnote",
|
261
|
+
href: "#ftn#{fn}" do |a|
|
262
|
+
a.sup { |sup| sup << fn }
|
263
|
+
end
|
180
264
|
end
|
265
|
+
@in_footnote = true
|
266
|
+
@footnotes << make_generic_footnote_text(node, fn)
|
267
|
+
@in_footnote = false
|
268
|
+
@seen_footnote << fn
|
181
269
|
end
|
182
270
|
|
183
|
-
def
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
271
|
+
def make_table_footnote_target(out, fnid, fnref)
|
272
|
+
attrs = { id: fnid, class: "TableFootnoteRef" }
|
273
|
+
out.span do |s|
|
274
|
+
s << @i18n.table_footnote
|
275
|
+
out.span **attrs do |a|
|
276
|
+
a << "#{fnref})"
|
188
277
|
end
|
278
|
+
insert_tab(s, 1)
|
279
|
+
end
|
280
|
+
end
|
281
|
+
|
282
|
+
def table_title_parse(node, out); end
|
283
|
+
|
284
|
+
def table_attrs(node)
|
285
|
+
{ id: node["id"], title: node["alt"],
|
286
|
+
summary: node["summary"], width: node["width"],
|
287
|
+
class: (node.text.length > 4000 ? "MsoTableGridBig" : "MsoTableGrid"),
|
288
|
+
style: "border-collapse:collapse;" \
|
289
|
+
"mso-table-anchor-horizontal:column;mso-table-overlap:never;" \
|
290
|
+
"border:none;mso-padding-alt: " \
|
291
|
+
"0cm 5.4pt 0cm 5.4pt;mso-border-insideh:none;" \
|
292
|
+
"mso-border-insidev:none;#{keep_style(node)}",
|
293
|
+
border: 0, cellspacing: 0, cellpadding: 0 }
|
294
|
+
end
|
295
|
+
|
296
|
+
def make_tr_attr_style(cell, row, rowmax, totalrows, opt)
|
297
|
+
top = row.zero? ? "#{SW1} 1.5pt;" : "none;"
|
298
|
+
bottom = "#{SW1} #{rowmax >= totalrows ? '1.5' : '1.0'}pt;"
|
299
|
+
ret = <<~STYLE.gsub(/\n/, "")
|
300
|
+
border-top:#{top}mso-border-top-alt:#{top}
|
301
|
+
border-left:#{bottom}mso-border-top-alt:#{bottom}
|
302
|
+
border-right:#{bottom}mso-border-top-alt:#{bottom}
|
303
|
+
border-bottom:#{bottom}mso-border-bottom-alt:#{bottom}
|
304
|
+
STYLE
|
305
|
+
opt[:bordered] or ret = ""
|
306
|
+
pb = keep_rows_together(cell, rowmax, totalrows, opt) ? "avoid" : "auto"
|
307
|
+
"#{ret}page-break-after:#{pb};"
|
308
|
+
end
|
309
|
+
|
310
|
+
def new_fullcolspan_row(table, tfoot)
|
311
|
+
# how many columns in the table?
|
312
|
+
cols = 0
|
313
|
+
table.at(".//tr").xpath("./td | ./th").each do |td|
|
314
|
+
cols += (td["colspan"] ? td["colspan"].to_i : 1)
|
189
315
|
end
|
316
|
+
style = "border-top:0pt;mso-border-top-alt:0pt;" \
|
317
|
+
"border-bottom:#{SW1} 1.5pt;mso-border-bottom-alt:#{SW1} 1.5pt;" \
|
318
|
+
"border-left:#{SW1} 1.5pt;mso-border-left-alt:#{SW1} 1.5pt;" \
|
319
|
+
"border-right:#{SW1} 1.5pt;mso-border-right-alt:#{SW1} 1.5pt;"
|
320
|
+
tfoot.add_child("<tr><td colspan='#{cols}' style='#{style}'/></tr>")
|
321
|
+
tfoot.xpath(".//td").last
|
190
322
|
end
|
191
323
|
|
192
324
|
include BaseConvert
|
data/lib/isodoc/jis/xref.rb
CHANGED
@@ -1,6 +1,13 @@
|
|
1
1
|
module IsoDoc
|
2
2
|
module JIS
|
3
3
|
class Xref < IsoDoc::Iso::Xref
|
4
|
+
def annex_name_lbl(clause, num)
|
5
|
+
obl = l10n("(#{@labels['inform_annex']})")
|
6
|
+
clause["obligation"] == "normative" and
|
7
|
+
obl = l10n("(#{@labels['norm_annex']})")
|
8
|
+
title = Common::case_with_markup(@labels["annex"], "capital", @script)
|
9
|
+
l10n("#{title} #{num}<br/>#{obl}")
|
10
|
+
end
|
4
11
|
end
|
5
12
|
end
|
6
13
|
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
module Metanorma
|
2
|
+
module JIS
|
3
|
+
class Converter < ISO::Converter
|
4
|
+
def norm_ref_preface(ref)
|
5
|
+
if ref.at("./note[@type = 'boilerplate']")
|
6
|
+
unwrap_boilerplate_clauses(ref, ".")
|
7
|
+
else
|
8
|
+
pref = if ref_empty?(ref) then @i18n.norm_empty_pref
|
9
|
+
else @i18n.get[ref_dated(ref)]
|
10
|
+
end
|
11
|
+
ref.at("./title").next = "<p>#{pref}</p>"
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
def ref_empty?(ref)
|
16
|
+
ref.xpath(".//bibitem").empty?
|
17
|
+
end
|
18
|
+
|
19
|
+
def ref_dated(ref)
|
20
|
+
refs = ref.xpath("./bibitem").each_with_object({}) do |e, m|
|
21
|
+
if e.at("./date") then m[:dated] = true
|
22
|
+
else m[:undated] = true
|
23
|
+
end
|
24
|
+
end
|
25
|
+
refs[:dated] && refs[:undated] and return "norm_with_refs_pref"
|
26
|
+
refs[:dated] and return "norm_with_refs_pref_all_dated"
|
27
|
+
"norm_with_refs_pref_none_dated"
|
28
|
+
end
|
29
|
+
|
30
|
+
def table_footnote_renumber(xmldoc)
|
31
|
+
xmldoc.xpath("//table | //figure").each do |t|
|
32
|
+
seen = {}
|
33
|
+
i = 0
|
34
|
+
#t.xpath(".//fn[not(ancestor::name)]").each do |fn|
|
35
|
+
t.xpath(".//fn").each do |fn|
|
36
|
+
i, seen = table_footnote_renumber1(fn, i, seen)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
@@ -1,6 +1,8 @@
|
|
1
1
|
require "asciidoctor"
|
2
2
|
require "metanorma-iso"
|
3
3
|
require_relative "./front"
|
4
|
+
require_relative "./validate"
|
5
|
+
require_relative "./cleanup"
|
4
6
|
|
5
7
|
module Metanorma
|
6
8
|
module JIS
|
@@ -16,6 +18,13 @@ module Metanorma
|
|
16
18
|
super
|
17
19
|
end
|
18
20
|
|
21
|
+
def doctype(node)
|
22
|
+
ret = node.attr("doctype")&.gsub(/\s+/, "-")&.downcase ||
|
23
|
+
"japanese-industrial-standard"
|
24
|
+
ret = "japanese-industrial-standard" if ret == "article"
|
25
|
+
ret
|
26
|
+
end
|
27
|
+
|
19
28
|
def boilerplate_file(_x_orig)
|
20
29
|
File.join(@libdir, "jis_intro_jp.xml")
|
21
30
|
end
|
@@ -39,8 +48,6 @@ module Metanorma
|
|
39
48
|
def pdf_converter(node)
|
40
49
|
return if node.attr("no-pdf")
|
41
50
|
|
42
|
-
return
|
43
|
-
|
44
51
|
if node.nil?
|
45
52
|
IsoDoc::JIS::PdfConvert.new({})
|
46
53
|
else
|
@@ -55,19 +62,6 @@ module Metanorma
|
|
55
62
|
IsoDoc::JIS::PresentationXMLConvert.new(doc_extract_attributes(node))
|
56
63
|
end
|
57
64
|
end
|
58
|
-
|
59
|
-
def script_validate(xmldoc)
|
60
|
-
script = xmldoc&.at("//bibdata/script")&.text
|
61
|
-
%w(Jpan Latn).include?(script) or
|
62
|
-
@log.add("Document Attributes", nil,
|
63
|
-
"#{script} is not a recognised script")
|
64
|
-
end
|
65
|
-
|
66
|
-
def validate(doc)
|
67
|
-
content_validate(doc)
|
68
|
-
schema_validate(formattedstr_strip(doc.dup),
|
69
|
-
File.join(File.dirname(__FILE__), "jis.rng"))
|
70
|
-
end
|
71
65
|
end
|
72
66
|
end
|
73
67
|
end
|