isodoc 2.12.0 → 2.12.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/isodoc.gemspec +2 -2
- data/lib/isodoc/convert.rb +0 -21
- data/lib/isodoc/function/blocks.rb +19 -48
- data/lib/isodoc/function/blocks_example_note.rb +75 -29
- data/lib/isodoc/function/cleanup.rb +3 -40
- data/lib/isodoc/function/inline.rb +39 -9
- data/lib/isodoc/function/lists.rb +5 -5
- data/lib/isodoc/function/references.rb +9 -133
- data/lib/isodoc/function/reqt.rb +2 -2
- data/lib/isodoc/function/section.rb +25 -28
- data/lib/isodoc/function/section_titles.rb +16 -13
- data/lib/isodoc/function/table.rb +3 -3
- data/lib/isodoc/function/terms.rb +21 -20
- data/lib/isodoc/function/to_word_html.rb +8 -5
- data/lib/isodoc/function/utils.rb +1 -1
- data/lib/isodoc/html_function/footnotes.rb +2 -1
- data/lib/isodoc/html_function/html.rb +1 -5
- data/lib/isodoc/init.rb +31 -0
- data/lib/isodoc/metadata.rb +9 -0
- data/lib/isodoc/metadata_contributor.rb +1 -1
- data/lib/isodoc/metadata_date.rb +1 -1
- data/lib/isodoc/presentation_function/autonum.rb +139 -0
- data/lib/isodoc/presentation_function/block.rb +95 -36
- data/lib/isodoc/presentation_function/docid.rb +78 -0
- data/lib/isodoc/presentation_function/erefs.rb +6 -4
- data/lib/isodoc/presentation_function/image.rb +52 -13
- data/lib/isodoc/presentation_function/inline.rb +6 -6
- data/lib/isodoc/presentation_function/math.rb +0 -14
- data/lib/isodoc/presentation_function/metadata.rb +0 -62
- data/lib/isodoc/presentation_function/refs.rb +44 -14
- data/lib/isodoc/presentation_function/reqt.rb +1 -1
- data/lib/isodoc/presentation_function/section.rb +46 -121
- data/lib/isodoc/presentation_function/sourcecode.rb +7 -4
- data/lib/isodoc/presentation_function/terms.rb +27 -2
- data/lib/isodoc/presentation_function/title.rb +107 -0
- data/lib/isodoc/presentation_function/xrefs.rb +17 -10
- data/lib/isodoc/presentation_xml_convert.rb +6 -2
- data/lib/isodoc/version.rb +1 -1
- data/lib/isodoc/word_function/body.rb +8 -36
- data/lib/isodoc/word_function/footnotes.rb +1 -1
- data/lib/isodoc/word_function/lists.rb +12 -10
- data/lib/isodoc/word_function/postprocess_cover.rb +0 -2
- data/lib/isodoc/word_function/postprocess_table.rb +1 -1
- data/lib/isodoc/word_function/table.rb +2 -2
- data/lib/isodoc/xref/clause_order.rb +2 -2
- data/lib/isodoc/xref/xref_anchor.rb +31 -16
- data/lib/isodoc/xref/xref_counter_types.rb +3 -2
- data/lib/isodoc/xref/xref_gen.rb +57 -33
- data/lib/isodoc/xref/xref_gen_seq.rb +145 -56
- data/lib/isodoc/xref/xref_sect_gen.rb +64 -47
- data/lib/isodoc/xref/xref_util.rb +49 -1
- data/lib/isodoc/xref.rb +3 -0
- data/lib/isodoc-yaml/i18n-ar.yaml +9 -9
- data/lib/isodoc-yaml/i18n-de.yaml +9 -9
- data/lib/isodoc-yaml/i18n-en.yaml +9 -9
- data/lib/isodoc-yaml/i18n-es.yaml +9 -9
- data/lib/isodoc-yaml/i18n-fr.yaml +9 -9
- data/lib/isodoc-yaml/i18n-ja.yaml +10 -10
- data/lib/isodoc-yaml/i18n-ru.yaml +9 -9
- data/lib/isodoc-yaml/i18n-zh-Hans.yaml +9 -9
- data/lib/nokogiri/xml/node.rb +1 -0
- metadata +9 -6
@@ -4,7 +4,6 @@ module IsoDoc
|
|
4
4
|
toc_metadata(docxml)
|
5
5
|
fonts_metadata(docxml)
|
6
6
|
attachments_extract(docxml)
|
7
|
-
preprocess_xslt_insert(docxml)
|
8
7
|
localized_strings(docxml)
|
9
8
|
a = docxml.at(ns("//metanorma-extension")) or return
|
10
9
|
a.elements.empty? and a.remove
|
@@ -83,67 +82,6 @@ module IsoDoc
|
|
83
82
|
"</presentation-metadata>"
|
84
83
|
end
|
85
84
|
|
86
|
-
def preprocess_xslt_insert(docxml)
|
87
|
-
content = ""
|
88
|
-
p = passthrough_xslt and content += p
|
89
|
-
p = preprocess_xslt_read and content += File.read(p)
|
90
|
-
content.empty? and return
|
91
|
-
ins = extension_insert(docxml, %w(render))
|
92
|
-
ins << content
|
93
|
-
end
|
94
|
-
|
95
|
-
COPY_XSLT =
|
96
|
-
'<xsl:copy><xsl:apply-templates select="@* | node()"/></xsl:copy>'.freeze
|
97
|
-
COPY_CHILDREN_XSLT =
|
98
|
-
'<xsl:apply-templates select="node()"/>'.freeze
|
99
|
-
|
100
|
-
def xslt_template(content)
|
101
|
-
<<~XSLT
|
102
|
-
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/1999/xhtml" version="1.0">
|
103
|
-
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="no"/>
|
104
|
-
<xsl:template match="@* | node()">#{COPY_XSLT}</xsl:template>
|
105
|
-
#{content}
|
106
|
-
</xsl:stylesheet>
|
107
|
-
XSLT
|
108
|
-
end
|
109
|
-
|
110
|
-
def passthrough_xslt
|
111
|
-
@output_formats.nil? and return nil
|
112
|
-
@output_formats.empty? and return nil
|
113
|
-
@output_formats.each_key.with_object([]) do |k, m|
|
114
|
-
m << <<~XSLT
|
115
|
-
<preprocess-xslt format="#{k}">
|
116
|
-
#{xslt_template(<<~XSLT1)
|
117
|
-
<xsl:template match="*[local-name() = 'passthrough']">
|
118
|
-
<xsl:if test="contains(@formats,',#{k},')"> <!-- delimited -->
|
119
|
-
#{COPY_XSLT}
|
120
|
-
</xsl:if>
|
121
|
-
</xsl:template>
|
122
|
-
XSLT1
|
123
|
-
}
|
124
|
-
</preprocess-xslt>
|
125
|
-
XSLT
|
126
|
-
m << <<~XSLT
|
127
|
-
<preprocess-xslt format="#{k}">
|
128
|
-
#{xslt_template(<<~XSLT1)
|
129
|
-
<xsl:template match="*[local-name() = 'math-with-linebreak']">
|
130
|
-
#{k == 'pdf' ? COPY_CHILDREN_XSLT : ''}
|
131
|
-
</xsl:template>
|
132
|
-
<xsl:template match="*[local-name() = 'math-no-linebreak']">
|
133
|
-
#{k == 'pdf' ? '' : COPY_CHILDREN_XSLT}
|
134
|
-
</xsl:template>
|
135
|
-
XSLT1
|
136
|
-
}
|
137
|
-
</preprocess-xslt>
|
138
|
-
XSLT
|
139
|
-
end.join("\n")
|
140
|
-
end
|
141
|
-
|
142
|
-
# read in from file, but with `<preprocess-xslt @format="">` wrapper
|
143
|
-
def preprocess_xslt_read
|
144
|
-
html_doc_path("preprocess.xslt")
|
145
|
-
end
|
146
|
-
|
147
85
|
def i18n_tag(key, value)
|
148
86
|
"<localized-string key='#{key}' language='#{@lang}'>#{value}" \
|
149
87
|
"</localized-string>"
|
@@ -1,3 +1,5 @@
|
|
1
|
+
require_relative "docid"
|
2
|
+
|
1
3
|
module IsoDoc
|
2
4
|
class PresentationXMLConvert < ::IsoDoc::Convert
|
3
5
|
def references(docxml)
|
@@ -5,10 +7,24 @@ module IsoDoc
|
|
5
7
|
renderings = references_render(docxml)
|
6
8
|
docxml.xpath(ns("//references/bibitem")).each do |x|
|
7
9
|
bibitem(x, renderings)
|
10
|
+
reference_name(x)
|
8
11
|
end
|
9
12
|
hidden_items(docxml)
|
10
13
|
move_norm_ref_to_sections(docxml)
|
11
|
-
|
14
|
+
end
|
15
|
+
|
16
|
+
def reference_names(docxml)
|
17
|
+
docxml.xpath(ns("//bibitem[not(ancestor::bibitem)]")).each do |ref|
|
18
|
+
reference_name(ref)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def reference_name(ref)
|
23
|
+
ids = bibitem_ref_code(ref)
|
24
|
+
identifiers = render_identifier(ids)
|
25
|
+
reference = docid_l10n(identifiers[:metanorma] || identifiers[:sdo] ||
|
26
|
+
identifiers[:ordinal] || identifiers[:doi])
|
27
|
+
@xrefs.get[ref["id"]] = { xref: reference }
|
12
28
|
end
|
13
29
|
|
14
30
|
def move_norm_ref_to_sections(docxml)
|
@@ -56,7 +72,7 @@ module IsoDoc
|
|
56
72
|
end
|
57
73
|
|
58
74
|
def bibitem(xml, renderings)
|
59
|
-
|
75
|
+
implicit_reference(xml) and xml["hidden"] = "true"
|
60
76
|
bibrender_item(xml, renderings)
|
61
77
|
end
|
62
78
|
|
@@ -81,7 +97,7 @@ module IsoDoc
|
|
81
97
|
end
|
82
98
|
|
83
99
|
def bibliography_bibitem_number_skip(bibitem)
|
84
|
-
|
100
|
+
implicit_reference(bibitem) ||
|
85
101
|
bibitem.at(ns(".//docidentifier[@type = 'metanorma']")) ||
|
86
102
|
bibitem.at(ns(".//docidentifier[@type = 'metanorma-ordinal']")) ||
|
87
103
|
bibitem["hidden"] == "true" || bibitem.parent["hidden"] == "true"
|
@@ -92,7 +108,7 @@ module IsoDoc
|
|
92
108
|
docxml.xpath(ns("//references[@normative = 'false']/bibitem")).each do |b|
|
93
109
|
i = bibliography_bibitem_number1(b, i)
|
94
110
|
end
|
95
|
-
|
111
|
+
reference_names docxml
|
96
112
|
bibliography_bibitem_tag(docxml)
|
97
113
|
end
|
98
114
|
|
@@ -122,12 +138,6 @@ module IsoDoc
|
|
122
138
|
ins
|
123
139
|
end
|
124
140
|
|
125
|
-
def docid_prefixes(docxml)
|
126
|
-
docxml.xpath(ns("//references/bibitem/docidentifier")).each do |i|
|
127
|
-
i.children = @xrefs.klass.docid_prefix(i["type"], to_xml(i.children))
|
128
|
-
end
|
129
|
-
end
|
130
|
-
|
131
141
|
def bibliography_bibitem_tag(docxml)
|
132
142
|
[true, false].each do |norm|
|
133
143
|
i = 0
|
@@ -139,17 +149,17 @@ module IsoDoc
|
|
139
149
|
|
140
150
|
def bibliography_bibitem_tag1(ref, idx, norm)
|
141
151
|
ref.xpath(ns("./bibitem")).each do |b|
|
142
|
-
|
152
|
+
implicit_reference(b) and next
|
143
153
|
idx += 1 unless b["hidden"]
|
144
|
-
insert_biblio_tag(b, idx, !norm,
|
154
|
+
insert_biblio_tag(b, idx, !norm, standard?(b))
|
145
155
|
end
|
146
156
|
idx
|
147
157
|
end
|
148
158
|
|
149
159
|
def insert_biblio_tag(bib, ordinal, biblio, standard)
|
150
160
|
datefn = date_note_process(bib)
|
151
|
-
ids =
|
152
|
-
idents =
|
161
|
+
ids = bibitem_ref_code(bib)
|
162
|
+
idents = render_identifier(ids)
|
153
163
|
ret = if biblio then biblio_ref_entry_code(ordinal, idents, ids,
|
154
164
|
standard, datefn, bib)
|
155
165
|
else norm_ref_entry_code(ordinal, idents, ids, standard, datefn,
|
@@ -199,5 +209,25 @@ module IsoDoc
|
|
199
209
|
ret = bib.at(ns("./docidentifier//fn")) or return ""
|
200
210
|
to_xml(ret.remove)
|
201
211
|
end
|
212
|
+
|
213
|
+
# reference not to be rendered because it is deemed implicit
|
214
|
+
# in the standards environment
|
215
|
+
def implicit_reference(bib)
|
216
|
+
bib["hidden"] == "true"
|
217
|
+
end
|
218
|
+
|
219
|
+
SKIP_DOCID = <<~XPATH.strip.freeze
|
220
|
+
@type = 'DOI' or @type = 'doi' or @type = 'ISSN' or @type = 'issn' or @type = 'ISBN' or @type = 'isbn' or starts-with(@type, 'ISSN.') or starts-with(@type, 'ISBN.') or starts-with(@type, 'issn.') or starts-with(@type, 'isbn.')
|
221
|
+
XPATH
|
222
|
+
|
223
|
+
def standard?(bib)
|
224
|
+
ret = false
|
225
|
+
bib.xpath(ns("./docidentifier")).each do |id|
|
226
|
+
id["type"].nil? ||
|
227
|
+
id.at(".//self::*[#{SKIP_DOCID} or @type = 'metanorma']") and next
|
228
|
+
ret = true
|
229
|
+
end
|
230
|
+
ret
|
231
|
+
end
|
202
232
|
end
|
203
233
|
end
|
@@ -24,7 +24,7 @@ module IsoDoc
|
|
24
24
|
def recommendation1(elem, type)
|
25
25
|
lbl = @reqt_models.model(elem["model"])
|
26
26
|
.recommendation_label(elem, type, xrefs)
|
27
|
-
prefix_name(elem,
|
27
|
+
prefix_name(elem, {}, l10n(lbl), "name")
|
28
28
|
end
|
29
29
|
|
30
30
|
def requirement_render_preprocessing(docxml); end
|
@@ -1,17 +1,12 @@
|
|
1
1
|
require_relative "refs"
|
2
|
+
require_relative "title"
|
2
3
|
|
3
4
|
module IsoDoc
|
4
5
|
class PresentationXMLConvert < ::IsoDoc::Convert
|
5
|
-
def middle_title(docxml)
|
6
|
-
s = docxml.at(ns("//sections")) or return
|
7
|
-
t = @meta.get[:doctitle]
|
8
|
-
t.nil? || t.empty? and return
|
9
|
-
s.add_first_child "<p class='zzSTDTitle1'>#{t}</p>"
|
10
|
-
end
|
11
|
-
|
12
6
|
def clause(docxml)
|
13
|
-
docxml.xpath(ns("//clause | " \
|
14
|
-
"//
|
7
|
+
docxml.xpath(ns("//clause | //terms | //definitions | //references | " \
|
8
|
+
"//introduction | //foreword | //preface/abstract | " \
|
9
|
+
"//acknowledgements | //colophon | //indexsect "))
|
15
10
|
.each do |f|
|
16
11
|
f.parent.name == "annex" &&
|
17
12
|
@xrefs.klass.single_term_clause?(f.parent) and next
|
@@ -25,32 +20,23 @@ module IsoDoc
|
|
25
20
|
elem.at("./ancestor::*[@unnumbered = 'true']")
|
26
21
|
end
|
27
22
|
|
23
|
+
def clausedelim
|
24
|
+
ret = super
|
25
|
+
ret && !ret.empty? or return ret
|
26
|
+
"<span class='fmt-autonum-delim'>#{ret}</span>"
|
27
|
+
end
|
28
|
+
|
28
29
|
def clause1(elem)
|
29
30
|
level = @xrefs.anchor(elem["id"], :level, false) ||
|
30
31
|
(elem.ancestors("clause, annex").size + 1)
|
31
|
-
|
32
|
-
unnumbered_clause?(elem)
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
def floattitle(docxml)
|
39
|
-
p = "//clause | //annex | //appendix | //introduction | //foreword | " \
|
40
|
-
"//preface/abstract | //acknowledgements | //terms | " \
|
41
|
-
"//definitions | //references | //colophon | //indexsect"
|
42
|
-
docxml.xpath(ns(p)).each { |f| floattitle1(f) }
|
43
|
-
# top-level
|
44
|
-
docxml.xpath(ns("//sections | //preface | //colophon"))
|
45
|
-
.each { |f| floattitle1(f) }
|
46
|
-
end
|
47
|
-
|
48
|
-
# TODO not currently doing anything with the @depth attribute of floating-title
|
49
|
-
def floattitle1(elem)
|
50
|
-
elem.xpath(ns(".//floating-title")).each do |p|
|
51
|
-
p.name = "p"
|
52
|
-
p["type"] = "floating-title"
|
32
|
+
lbl = @xrefs.anchor(elem["id"], :label, elem.parent.name != "sections")
|
33
|
+
if unnumbered_clause?(elem) || !lbl
|
34
|
+
prefix_name(elem, {}, nil, "title")
|
35
|
+
else
|
36
|
+
prefix_name(elem, { caption: "<tab/>" }, "#{lbl}#{clausedelim}",
|
37
|
+
"title")
|
53
38
|
end
|
39
|
+
t = elem.at(ns("./fmt-title")) and t["depth"] = level
|
54
40
|
end
|
55
41
|
|
56
42
|
def annex(docxml)
|
@@ -64,10 +50,18 @@ module IsoDoc
|
|
64
50
|
|
65
51
|
def annex1(elem)
|
66
52
|
lbl = @xrefs.anchor(elem["id"], :label)
|
53
|
+
# TODO: do not alter title, alter semx/@element = title
|
67
54
|
t = elem.at(ns("./title")) and
|
68
55
|
t.children = "<strong>#{to_xml(t.children)}</strong>"
|
69
|
-
unnumbered_clause?(elem)
|
70
|
-
|
56
|
+
if unnumbered_clause?(elem)
|
57
|
+
prefix_name(elem, {}, nil, "title")
|
58
|
+
else
|
59
|
+
prefix_name(elem, { caption: annex_delim(elem) }, lbl, "title")
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
def annex_delim(_elem)
|
64
|
+
"<br/><br/>"
|
71
65
|
end
|
72
66
|
|
73
67
|
def single_term_clause_retitle(elem)
|
@@ -82,28 +76,22 @@ module IsoDoc
|
|
82
76
|
t = elem.at(ns("./terms | ./definitions | ./references"))
|
83
77
|
t.xpath(ns(".//clause | .//terms | .//definitions | .//references"))
|
84
78
|
.each do |c|
|
85
|
-
tit = c.at(ns("./title")) or
|
79
|
+
tit = c.at(ns("./fmt-title")) or next
|
86
80
|
tit["depth"] = tit["depth"].to_i - 1 unless tit["depth"] == "1"
|
87
81
|
end
|
88
82
|
end
|
89
83
|
|
90
|
-
def term(docxml)
|
91
|
-
docxml.xpath(ns("//term")).each do |f|
|
92
|
-
term1(f)
|
93
|
-
end
|
94
|
-
end
|
95
|
-
|
96
|
-
def term1(elem)
|
97
|
-
lbl = @xrefs.anchor(elem["id"], :label) or return
|
98
|
-
prefix_name(elem, "", "#{lbl}#{clausedelim}", "name")
|
99
|
-
end
|
100
|
-
|
101
84
|
def index(docxml)
|
102
85
|
docxml.xpath(ns("//index | //index-xref | //indexsect")).each(&:remove)
|
103
86
|
end
|
104
87
|
|
88
|
+
def skip_display_order?(node)
|
89
|
+
node.name == "floating-title"
|
90
|
+
end
|
91
|
+
|
105
92
|
def display_order_at(docxml, xpath, idx)
|
106
93
|
c = docxml.at(ns(xpath)) or return idx
|
94
|
+
skip_display_order?(c) and return idx
|
107
95
|
idx += 1
|
108
96
|
idx = preceding_floating_titles(c, idx)
|
109
97
|
c["displayorder"] = idx
|
@@ -112,6 +100,7 @@ module IsoDoc
|
|
112
100
|
|
113
101
|
def display_order_xpath(docxml, xpath, idx)
|
114
102
|
docxml.xpath(ns(xpath)).each do |c|
|
103
|
+
skip_display_order?(c) and next
|
115
104
|
idx += 1
|
116
105
|
idx = preceding_floating_titles(c, idx)
|
117
106
|
c["displayorder"] = idx
|
@@ -119,19 +108,6 @@ module IsoDoc
|
|
119
108
|
idx
|
120
109
|
end
|
121
110
|
|
122
|
-
def preceding_floating_titles(node, idx)
|
123
|
-
out = node.xpath("./preceding-sibling::*")
|
124
|
-
.reverse.each_with_object([]) do |p, m|
|
125
|
-
%w(note admonition p).include?(p.name) or break m
|
126
|
-
m << p
|
127
|
-
end
|
128
|
-
out.reject { |c| c["displayorder"] }.reverse_each do |c|
|
129
|
-
c["displayorder"] = idx
|
130
|
-
idx += 1
|
131
|
-
end
|
132
|
-
idx
|
133
|
-
end
|
134
|
-
|
135
111
|
def display_order(docxml)
|
136
112
|
i = 0
|
137
113
|
d = @xrefs.clause_order(docxml)
|
@@ -145,46 +121,26 @@ module IsoDoc
|
|
145
121
|
end
|
146
122
|
end
|
147
123
|
|
148
|
-
def clausetitle(docxml)
|
149
|
-
cjk_extended_title(docxml)
|
150
|
-
end
|
151
|
-
|
152
|
-
def cjk_search
|
153
|
-
lang = %w(zh ja ko).map { |x| "@language = '#{x}'" }.join(" or ")
|
154
|
-
%(Hans Hant Jpan Hang Kore).include?(@script) and
|
155
|
-
lang += " or not(@language)"
|
156
|
-
lang
|
157
|
-
end
|
158
|
-
|
159
|
-
def cjk_extended_title(docxml)
|
160
|
-
l = cjk_search
|
161
|
-
docxml.xpath(ns("//bibdata/title[#{l}] | //floating-title[#{l}] | " \
|
162
|
-
"//title[@depth = '1' or not(@depth)][#{l}]")).each do |t|
|
163
|
-
t.text.size < 4 or next
|
164
|
-
t.elements.empty? or next # can't be bothered
|
165
|
-
t.children = @i18n.cjk_extend(t.text)
|
166
|
-
end
|
167
|
-
end
|
168
|
-
|
169
124
|
def preface_rearrange(doc)
|
170
|
-
preface_move(doc.
|
125
|
+
preface_move(doc.xpath(ns("//preface/abstract")),
|
171
126
|
%w(foreword introduction clause acknowledgements), doc)
|
172
|
-
preface_move(doc.
|
127
|
+
preface_move(doc.xpath(ns("//preface/foreword")),
|
173
128
|
%w(introduction clause acknowledgements), doc)
|
174
|
-
preface_move(doc.
|
129
|
+
preface_move(doc.xpath(ns("//preface/introduction")),
|
175
130
|
%w(clause acknowledgements), doc)
|
176
|
-
preface_move(doc.
|
131
|
+
preface_move(doc.xpath(ns("//preface/acknowledgements")),
|
177
132
|
%w(), doc)
|
178
133
|
end
|
179
134
|
|
180
|
-
def preface_move(
|
181
|
-
|
182
|
-
preface =
|
135
|
+
def preface_move(clauses, after, _doc)
|
136
|
+
clauses.empty? and return
|
137
|
+
preface = clauses.first.parent
|
138
|
+
clauses.each do |clause|
|
183
139
|
float = preceding_floats(clause)
|
184
|
-
prev = nil
|
185
140
|
xpath = after.map { |n| "./self::xmlns:#{n}" }.join(" | ")
|
186
141
|
xpath.empty? and xpath = "./self::*[not(following-sibling::*)]"
|
187
|
-
preface_move1(clause, preface, float,
|
142
|
+
preface_move1(clause, preface, float, nil, xpath)
|
143
|
+
end
|
188
144
|
end
|
189
145
|
|
190
146
|
def preface_move1(clause, preface, float, prev, xpath)
|
@@ -194,48 +150,17 @@ module IsoDoc
|
|
194
150
|
x.at(xpath) or next
|
195
151
|
clause == prev and break
|
196
152
|
prev ||= preface.children.first
|
197
|
-
|
153
|
+
prev.next = clause
|
198
154
|
float.each { |n| prev.next = n }
|
199
155
|
break
|
200
156
|
end
|
201
157
|
end
|
202
158
|
|
203
|
-
def preceding_floats(clause)
|
204
|
-
ret = []
|
205
|
-
p = clause
|
206
|
-
while prev = p.previous_element
|
207
|
-
if prev.name == "floating-title"
|
208
|
-
ret << prev
|
209
|
-
p = prev
|
210
|
-
else break
|
211
|
-
end
|
212
|
-
end
|
213
|
-
ret
|
214
|
-
end
|
215
|
-
|
216
159
|
def rearrange_clauses(docxml)
|
217
160
|
preface_rearrange(docxml) # feeds toc_title
|
218
161
|
toc_title(docxml)
|
219
162
|
end
|
220
163
|
|
221
|
-
def toc_title(docxml)
|
222
|
-
docxml.at(ns("//preface/clause[@type = 'toc']")) and return
|
223
|
-
ins = toc_title_insert_pt(docxml) or return
|
224
|
-
id = UUIDTools::UUID.random_create.to_s
|
225
|
-
ins.previous = <<~CLAUSE
|
226
|
-
<clause type = 'toc' id='_#{id}'><title depth='1'>#{@i18n.table_of_contents}</title></clause>
|
227
|
-
CLAUSE
|
228
|
-
end
|
229
|
-
|
230
|
-
def toc_title_insert_pt(docxml)
|
231
|
-
ins = docxml.at(ns("//preface")) ||
|
232
|
-
docxml.at(ns("//sections | //annex | //bibliography"))
|
233
|
-
&.before("<preface> </preface>")
|
234
|
-
&.previous_element or return nil
|
235
|
-
ins.children.empty? and ins << " "
|
236
|
-
ins.children.first
|
237
|
-
end
|
238
|
-
|
239
164
|
def toc(docxml)
|
240
165
|
toc_refs(docxml)
|
241
166
|
end
|
@@ -243,7 +168,7 @@ module IsoDoc
|
|
243
168
|
def toc_refs(docxml)
|
244
169
|
docxml.xpath(ns("//toc//xref[text()]")).each do |x|
|
245
170
|
lbl = @xrefs.anchor(x["target"], :label) or next
|
246
|
-
x.add_first_child "#{lbl}<tab
|
171
|
+
x.add_first_child "#{lbl}<span class='fmt-caption-delim'><tab/></span>"
|
247
172
|
end
|
248
173
|
end
|
249
174
|
end
|
@@ -150,10 +150,13 @@ module IsoDoc
|
|
150
150
|
end
|
151
151
|
|
152
152
|
def source_label(elem)
|
153
|
-
labelled_ancestor(elem)
|
154
|
-
|
155
|
-
|
156
|
-
|
153
|
+
if !labelled_ancestor(elem) && # do not number if labelled_ancestor
|
154
|
+
lbl = @xrefs.anchor(elem["id"], :label, false)
|
155
|
+
#a = autonum(elem["id"], lbl)
|
156
|
+
#s = "<span class='fmt-element-name'>#{lower2cap @i18n.figure}</span> #{a}"
|
157
|
+
s = labelled_autonum(lower2cap(@i18n.figure), elem["id"], lbl)&.strip
|
158
|
+
end
|
159
|
+
prefix_name(elem, { caption: block_delim }, s, "name")
|
157
160
|
end
|
158
161
|
end
|
159
162
|
end
|
@@ -109,9 +109,17 @@ module IsoDoc
|
|
109
109
|
docxml.xpath(ns("//termnote")).each { |f| termnote1(f) }
|
110
110
|
end
|
111
111
|
|
112
|
+
def termnote_delim(_elem)
|
113
|
+
l10n(": ")
|
114
|
+
end
|
115
|
+
|
112
116
|
def termnote1(elem)
|
113
|
-
lbl =
|
114
|
-
prefix_name(elem,
|
117
|
+
lbl = termnote_label(elem)
|
118
|
+
prefix_name(elem, { label: termnote_delim(elem) }, lower2cap(lbl), "name")
|
119
|
+
end
|
120
|
+
|
121
|
+
def termnote_label(elem)
|
122
|
+
@xrefs.anchor(elem["id"], :label) || "???"
|
115
123
|
end
|
116
124
|
|
117
125
|
def termdefinition(docxml)
|
@@ -123,6 +131,7 @@ module IsoDoc
|
|
123
131
|
def termdefinition1(elem)
|
124
132
|
unwrap_definition(elem)
|
125
133
|
multidef(elem) if elem.xpath(ns("./definition")).size > 1
|
134
|
+
termdomain(elem)
|
126
135
|
end
|
127
136
|
|
128
137
|
def multidef(elem)
|
@@ -144,6 +153,13 @@ module IsoDoc
|
|
144
153
|
end
|
145
154
|
end
|
146
155
|
|
156
|
+
def termdomain(elem)
|
157
|
+
d = elem.at(ns(".//domain")) or return
|
158
|
+
p = elem.at(ns(".//definition//p")) or return
|
159
|
+
p.add_first_child "<#{d.to_xml}> "
|
160
|
+
d["hidden"] = true
|
161
|
+
end
|
162
|
+
|
147
163
|
def termsource(docxml)
|
148
164
|
docxml.xpath(ns("//termsource")).each { |f| termsource_modification(f) }
|
149
165
|
docxml.xpath(ns("//termsource")).each { |f| termsource1(f) }
|
@@ -176,5 +192,14 @@ module IsoDoc
|
|
176
192
|
when "adapted" then @i18n.adapted
|
177
193
|
end
|
178
194
|
end
|
195
|
+
|
196
|
+
def term(docxml)
|
197
|
+
docxml.xpath(ns("//term")).each { |f| term1(f) }
|
198
|
+
end
|
199
|
+
|
200
|
+
def term1(elem)
|
201
|
+
lbl = @xrefs.anchor(elem["id"], :label) or return
|
202
|
+
prefix_name(elem, {}, "#{lbl}#{clausedelim}", "name")
|
203
|
+
end
|
179
204
|
end
|
180
205
|
end
|
@@ -0,0 +1,107 @@
|
|
1
|
+
require_relative "refs"
|
2
|
+
|
3
|
+
module IsoDoc
|
4
|
+
class PresentationXMLConvert < ::IsoDoc::Convert
|
5
|
+
def middle_title(docxml)
|
6
|
+
s = docxml.at(ns("//sections")) or return
|
7
|
+
t = @meta.get[:doctitle]
|
8
|
+
t.nil? || t.empty? and return
|
9
|
+
s.add_first_child "<p class='zzSTDTitle1'>#{t}</p>"
|
10
|
+
end
|
11
|
+
|
12
|
+
def missing_title(docxml)
|
13
|
+
docxml.xpath(ns("//definitions[not(./title)]")).each do |d|
|
14
|
+
# should only be happening for subclauses
|
15
|
+
d.add_first_child "<title>#{@i18n.symbols}</title>"
|
16
|
+
end
|
17
|
+
docxml.xpath(ns("//foreword[not(./title)]")).each do |d|
|
18
|
+
d.add_first_child "<title>#{@i18n.foreword}</title>"
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def floattitle(docxml)
|
23
|
+
docxml.xpath(ns(".//floating-title")).each { |f| floattitle1(f) }
|
24
|
+
end
|
25
|
+
|
26
|
+
# TODO not currently doing anything with the @depth attribute of floating-title
|
27
|
+
def floattitle1(elem)
|
28
|
+
elem["id"] ||= "_#{UUIDTools::UUID.random_create}"
|
29
|
+
p = elem.dup
|
30
|
+
p.children = "<semx element='floating-title' source='#{elem['id']}'>" \
|
31
|
+
"#{to_xml(p.children)}</semx>"
|
32
|
+
elem.next = p
|
33
|
+
p.name = "p"
|
34
|
+
p["type"] = "floating-title"
|
35
|
+
transfer_id(elem, p)
|
36
|
+
end
|
37
|
+
|
38
|
+
def preceding_floating_titles(node, idx)
|
39
|
+
out = node.xpath("./preceding-sibling::*")
|
40
|
+
.reverse.each_with_object([]) do |p, m|
|
41
|
+
%w(note admonition p floating-title).include?(p.name) or break m
|
42
|
+
m << p
|
43
|
+
end
|
44
|
+
#require 'debug'; out.empty? or binding.b
|
45
|
+
out.reject { |c| c["displayorder"] }.reverse_each do |c|
|
46
|
+
skip_display_order?(c) and next
|
47
|
+
c["displayorder"] = idx
|
48
|
+
idx += 1
|
49
|
+
end
|
50
|
+
idx
|
51
|
+
end
|
52
|
+
|
53
|
+
def clausetitle(docxml)
|
54
|
+
cjk_extended_title(docxml)
|
55
|
+
end
|
56
|
+
|
57
|
+
def cjk_search
|
58
|
+
lang = %w(zh ja ko).map { |x| "@language = '#{x}'" }.join(" or ")
|
59
|
+
%(Hans Hant Jpan Hang Kore).include?(@script) and
|
60
|
+
lang += " or not(@language)"
|
61
|
+
lang
|
62
|
+
end
|
63
|
+
|
64
|
+
def cjk_extended_title(doc)
|
65
|
+
l = cjk_search
|
66
|
+
doc.xpath(ns("//bibdata/title[#{l}] | //floating-title[#{l}] | " \
|
67
|
+
"//fmt-title[@depth = '1' or not(@depth)][#{l}]"))
|
68
|
+
.each do |t|
|
69
|
+
t.text.size < 4 or next
|
70
|
+
t.traverse do |n|
|
71
|
+
n.text? or next
|
72
|
+
n.replace(@i18n.cjk_extend(n.text))
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
def preceding_floats(clause)
|
78
|
+
ret = []
|
79
|
+
p = clause
|
80
|
+
while prev = p.previous_element
|
81
|
+
if prev.name == "floating-title"
|
82
|
+
ret << prev
|
83
|
+
p = prev
|
84
|
+
else break end
|
85
|
+
end
|
86
|
+
ret
|
87
|
+
end
|
88
|
+
|
89
|
+
def toc_title(docxml)
|
90
|
+
docxml.at(ns("//preface/clause[@type = 'toc']")) and return
|
91
|
+
ins = toc_title_insert_pt(docxml) or return
|
92
|
+
id = UUIDTools::UUID.random_create.to_s
|
93
|
+
ins.previous = <<~CLAUSE
|
94
|
+
<clause type = 'toc' id='_#{id}'><fmt-title depth='1'>#{@i18n.table_of_contents}</fmt-title></clause>
|
95
|
+
CLAUSE
|
96
|
+
end
|
97
|
+
|
98
|
+
def toc_title_insert_pt(docxml)
|
99
|
+
ins = docxml.at(ns("//preface")) ||
|
100
|
+
docxml.at(ns("//sections | //annex | //bibliography"))
|
101
|
+
&.before("<preface> </preface>")
|
102
|
+
&.previous_element or return nil
|
103
|
+
ins.children.empty? and ins << " "
|
104
|
+
ins.children.first
|
105
|
+
end
|
106
|
+
end
|
107
|
+
end
|