metanorma-jis 0.0.2 → 0.0.3
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 +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
|