metanorma-standoc 1.9.0 → 1.9.1
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/asciidoctor/standoc/base.rb +28 -35
- data/lib/asciidoctor/standoc/blocks.rb +7 -6
- data/lib/asciidoctor/standoc/blocks_notes.rb +20 -14
- data/lib/asciidoctor/standoc/cleanup.rb +32 -78
- data/lib/asciidoctor/standoc/cleanup_block.rb +44 -84
- data/lib/asciidoctor/standoc/cleanup_boilerplate.rb +9 -7
- data/lib/asciidoctor/standoc/cleanup_footnotes.rb +1 -0
- data/lib/asciidoctor/standoc/cleanup_image.rb +71 -0
- data/lib/asciidoctor/standoc/cleanup_maths.rb +36 -27
- data/lib/asciidoctor/standoc/cleanup_ref.rb +21 -13
- data/lib/asciidoctor/standoc/cleanup_ref_dl.rb +1 -1
- data/lib/asciidoctor/standoc/cleanup_reqt.rb +47 -0
- data/lib/asciidoctor/standoc/cleanup_section.rb +5 -0
- data/lib/asciidoctor/standoc/front.rb +35 -18
- data/lib/asciidoctor/standoc/front_contributor.rb +5 -5
- data/lib/asciidoctor/standoc/lists.rb +4 -2
- data/lib/asciidoctor/standoc/ref.rb +87 -112
- data/lib/asciidoctor/standoc/ref_date_id.rb +62 -0
- data/lib/asciidoctor/standoc/utils.rb +32 -6
- data/lib/asciidoctor/standoc/validate.rb +12 -12
- data/lib/metanorma/standoc/version.rb +1 -1
- data/metanorma-standoc.gemspec +1 -1
- data/spec/asciidoctor/base_spec.rb +60 -7
- data/spec/asciidoctor/cleanup_spec.rb +2 -6
- data/spec/asciidoctor/refs_spec.rb +1 -1
- data/spec/spec_helper.rb +11 -9
- metadata +9 -6
@@ -38,17 +38,19 @@ module Asciidoctor
|
|
38
38
|
end
|
39
39
|
end
|
40
40
|
|
41
|
-
def norm_ref_preface(
|
42
|
-
refs =
|
43
|
-
|
41
|
+
def norm_ref_preface(ref)
|
42
|
+
refs = ref.elements.select do |e|
|
43
|
+
%w(references bibitem).include? e.name
|
44
44
|
end
|
45
|
-
|
46
|
-
|
45
|
+
pref = refs.empty? ? @i18n.norm_empty_pref : @i18n.norm_with_refs_pref
|
46
|
+
ref.at("./title").next = "<p>#{pref}</p>"
|
47
47
|
end
|
48
48
|
|
49
|
-
TERM_CLAUSE = "//sections/terms |
|
49
|
+
TERM_CLAUSE = "//sections/terms | "\
|
50
|
+
"//sections/clause[descendant::terms]".freeze
|
50
51
|
|
51
|
-
NORM_REF = "//bibliography/references[@normative = 'true']"
|
52
|
+
NORM_REF = "//bibliography/references[@normative = 'true'] | "\
|
53
|
+
"//bibliography/clause[.//references[@normative = 'true']]".freeze
|
52
54
|
|
53
55
|
def boilerplate_isodoc(xmldoc)
|
54
56
|
x = xmldoc.dup
|
@@ -0,0 +1,71 @@
|
|
1
|
+
module Asciidoctor
|
2
|
+
module Standoc
|
3
|
+
module Cleanup
|
4
|
+
def svgmap_cleanup(xmldoc)
|
5
|
+
svgmap_moveattrs(xmldoc)
|
6
|
+
svgmap_populate(xmldoc)
|
7
|
+
Metanorma::Utils::svgmap_rewrite(xmldoc, @localdir)
|
8
|
+
end
|
9
|
+
|
10
|
+
def guid?(str)
|
11
|
+
/^_[0-9A-F]{8}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{12}$/i
|
12
|
+
.match(str)
|
13
|
+
end
|
14
|
+
|
15
|
+
def svgmap_moveattrs(xmldoc)
|
16
|
+
xmldoc.xpath("//svgmap").each do |s|
|
17
|
+
f = s.at(".//figure") or next
|
18
|
+
if (t = s.at("./name")) && !f.at("./name")
|
19
|
+
f.children.first.previous = t.remove
|
20
|
+
end
|
21
|
+
if s["id"] && guid?(f["id"])
|
22
|
+
f["id"] = s["id"]
|
23
|
+
s.delete("id")
|
24
|
+
end
|
25
|
+
svgmap_moveattrs1(s, f)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
def svgmap_moveattrs1(s, f)
|
30
|
+
%w(unnumbered number subsequence keep-with-next
|
31
|
+
keep-lines-together).each do |a|
|
32
|
+
next if f[a] || !s[a]
|
33
|
+
|
34
|
+
f[a] = s[a]
|
35
|
+
s.delete(a)
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
def svgmap_populate(xmldoc)
|
40
|
+
xmldoc.xpath("//svgmap").each do |s|
|
41
|
+
s1 = s.dup
|
42
|
+
s.children.remove
|
43
|
+
f = s1.at(".//figure") and s << f
|
44
|
+
s1.xpath(".//li").each do |li|
|
45
|
+
t = li&.at(".//eref | .//link | .//xref") or next
|
46
|
+
href = t.xpath("./following-sibling::node()")
|
47
|
+
href.empty? or
|
48
|
+
s << %[<target href="#{svgmap_target(href)}">#{t.to_xml}</target>]
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
def svgmap_target(nodeset)
|
54
|
+
nodeset.each do |n|
|
55
|
+
next unless n.name == "link"
|
56
|
+
|
57
|
+
n.children = n["target"]
|
58
|
+
end
|
59
|
+
nodeset.text.sub(/^[,; ]/, "").strip
|
60
|
+
end
|
61
|
+
|
62
|
+
def img_cleanup(xmldoc)
|
63
|
+
return xmldoc unless @datauriimage
|
64
|
+
|
65
|
+
xmldoc.xpath("//image").each do |i|
|
66
|
+
i["src"] = Metanorma::Utils::datauri(i["src"], @localdir)
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
@@ -3,36 +3,39 @@ require "pathname"
|
|
3
3
|
require "open-uri"
|
4
4
|
require "html2doc"
|
5
5
|
require "asciimath2unitsml"
|
6
|
-
require_relative "./cleanup_block
|
7
|
-
require_relative "./cleanup_footnotes
|
8
|
-
require_relative "./cleanup_ref
|
9
|
-
require_relative "./cleanup_ref_dl
|
10
|
-
require_relative "./cleanup_boilerplate
|
11
|
-
require_relative "./cleanup_section
|
12
|
-
require_relative "./cleanup_terms
|
13
|
-
require_relative "./cleanup_inline
|
14
|
-
require_relative "./cleanup_amend
|
6
|
+
require_relative "./cleanup_block"
|
7
|
+
require_relative "./cleanup_footnotes"
|
8
|
+
require_relative "./cleanup_ref"
|
9
|
+
require_relative "./cleanup_ref_dl"
|
10
|
+
require_relative "./cleanup_boilerplate"
|
11
|
+
require_relative "./cleanup_section"
|
12
|
+
require_relative "./cleanup_terms"
|
13
|
+
require_relative "./cleanup_inline"
|
14
|
+
require_relative "./cleanup_amend"
|
15
15
|
require "relaton_iev"
|
16
16
|
|
17
17
|
module Asciidoctor
|
18
18
|
module Standoc
|
19
19
|
module Cleanup
|
20
20
|
def asciimath2mathml(text)
|
21
|
-
text = text.gsub(%r{<stem type="AsciiMath">(.+?)</stem>}m) do
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
21
|
+
text = text.gsub(%r{<stem type="AsciiMath">(.+?)</stem>}m) do
|
22
|
+
"<amathstem>#{HTMLEntities.new.decode($1)}</amathstem>"
|
23
|
+
end
|
24
|
+
text = Html2Doc.asciimath_to_mathml(text,
|
25
|
+
["<amathstem>", "</amathstem>"])
|
26
|
+
x = Nokogiri::XML(text)
|
27
|
+
x.xpath("//*[local-name() = 'math'][not(parent::stem)]").each do |y|
|
28
|
+
y.wrap("<stem type='MathML'></stem>")
|
29
|
+
end
|
30
|
+
x.to_xml
|
30
31
|
end
|
31
32
|
|
32
33
|
def xml_unescape_mathml(x)
|
33
34
|
return if x.children.any? { |y| y.element? }
|
34
|
-
|
35
|
-
|
35
|
+
|
36
|
+
math = x.text.gsub(/</, "<").gsub(/>/, ">")
|
37
|
+
.gsub(/"/, '"').gsub(/'/, "'").gsub(/&/, "&")
|
38
|
+
.gsub(/<[^: \r\n\t\/]+:/, "<").gsub(/<\/[^ \r\n\t:]+:/, "</")
|
36
39
|
x.children = math
|
37
40
|
end
|
38
41
|
|
@@ -40,12 +43,13 @@ module Asciidoctor
|
|
40
43
|
|
41
44
|
def mathml_preserve_space(m)
|
42
45
|
m.xpath(".//m:mtext", "m" => MATHML_NS).each do |x|
|
43
|
-
x.children = x.children.to_xml
|
46
|
+
x.children = x.children.to_xml
|
47
|
+
.gsub(/^\s/, " ").gsub(/\s$/, " ")
|
44
48
|
end
|
45
49
|
end
|
46
50
|
|
47
51
|
def mathml_namespace(stem)
|
48
|
-
stem.xpath("./math"
|
52
|
+
stem.xpath("./math").each { |x| x.default_namespace = MATHML_NS }
|
49
53
|
end
|
50
54
|
|
51
55
|
def mathml_mi_italics
|
@@ -55,7 +59,8 @@ module Asciidoctor
|
|
55
59
|
|
56
60
|
# presuppose multichar mi upright, singlechar mi MathML default italic
|
57
61
|
def mathml_italicise(x)
|
58
|
-
x.xpath(".//m:mi[not(ancestor::*[@mathvariant])]",
|
62
|
+
x.xpath(".//m:mi[not(ancestor::*[@mathvariant])]",
|
63
|
+
"m" => MATHML_NS).each do |i|
|
59
64
|
char = HTMLEntities.new.decode(i.text)
|
60
65
|
i["mathvariant"] = "normal" if mi_italicise?(char)
|
61
66
|
end
|
@@ -63,10 +68,11 @@ module Asciidoctor
|
|
63
68
|
|
64
69
|
def mi_italicise?(c)
|
65
70
|
return false if c.length > 1
|
66
|
-
|
71
|
+
|
72
|
+
if /\p{Greek}/.match?(c)
|
67
73
|
/\p{Lower}/.match(c) && !mathml_mi_italics[:lowergreek] ||
|
68
74
|
/\p{Upper}/.match(c) && !mathml_mi_italics[:uppergreek]
|
69
|
-
elsif /\p{Latin}/.match(c)
|
75
|
+
elsif /\p{Latin}/.match?(c)
|
70
76
|
/\p{Lower}/.match(c) && !mathml_mi_italics[:lowerroman] ||
|
71
77
|
/\p{Upper}/.match(c) && !mathml_mi_italics[:upperroman]
|
72
78
|
else
|
@@ -87,6 +93,7 @@ module Asciidoctor
|
|
87
93
|
|
88
94
|
def mathml_unitsML(xmldoc)
|
89
95
|
return unless xmldoc.at(".//m:*", "m" => UNITSML_NS)
|
96
|
+
|
90
97
|
misc = add_misc_container(xmldoc)
|
91
98
|
unitsml = misc.add_child("<UnitsML xmlns='#{UNITSML_NS}'/>").first
|
92
99
|
%w(Unit CountedItem Quantity Dimension Prefix).each do |t|
|
@@ -95,12 +102,14 @@ module Asciidoctor
|
|
95
102
|
end
|
96
103
|
|
97
104
|
def gather_unitsml(unitsml, xmldoc, t)
|
98
|
-
tags = xmldoc.xpath(".//m:#{t}", "m" => UNITSML_NS)
|
105
|
+
tags = xmldoc.xpath(".//m:#{t}", "m" => UNITSML_NS)
|
106
|
+
.each_with_object({}) do |x, m|
|
99
107
|
m[x["id"]] = x.remove
|
100
108
|
end
|
101
109
|
return if tags.empty?
|
110
|
+
|
102
111
|
set = unitsml.add_child("<#{t}Set/>").first
|
103
|
-
tags.
|
112
|
+
tags.each_value { |v| set << v }
|
104
113
|
end
|
105
114
|
|
106
115
|
def asciimath2unitsml_options
|
@@ -14,9 +14,10 @@ module Asciidoctor
|
|
14
14
|
fold_notes_into_biblio(refs)
|
15
15
|
bib = sort_biblio(refs.xpath("./bibitem"))
|
16
16
|
insert = refs&.at("./bibitem")&.previous_element
|
17
|
-
refs.xpath("./bibitem").each
|
17
|
+
refs.xpath("./bibitem").each(&:remove)
|
18
18
|
bib.reverse.each do |b|
|
19
|
-
insert and insert.next = b.to_xml or
|
19
|
+
insert and insert.next = b.to_xml or
|
20
|
+
refs.children.first.add_previous_sibling b.to_xml
|
20
21
|
end
|
21
22
|
extract_notes_from_biblio(refs)
|
22
23
|
refs.xpath("./references").each { |r| biblio_reorder1(r) }
|
@@ -24,7 +25,7 @@ module Asciidoctor
|
|
24
25
|
|
25
26
|
def fold_notes_into_biblio(refs)
|
26
27
|
refs.xpath("./bibitem").each do |r|
|
27
|
-
while r&.next_element&.name == "note"
|
28
|
+
while r&.next_element&.name == "note"
|
28
29
|
r.next_element["appended"] = true
|
29
30
|
r << r.next_element.remove
|
30
31
|
end
|
@@ -49,12 +50,15 @@ module Asciidoctor
|
|
49
50
|
# only numeric references are renumbered
|
50
51
|
def biblio_renumber(xmldoc)
|
51
52
|
i = 0
|
52
|
-
xmldoc.xpath("//bibliography//references | //clause//references |
|
53
|
+
xmldoc.xpath("//bibliography//references | //clause//references | "\
|
54
|
+
"//annex//references").each do |r|
|
53
55
|
next if r["normative"] == "true"
|
56
|
+
|
54
57
|
r.xpath("./bibitem").each do |b|
|
55
58
|
i += 1
|
56
59
|
next unless docid = b.at("./docidentifier[@type = 'metanorma']")
|
57
|
-
next unless
|
60
|
+
next unless /^\[\d+\]$/.match?(docid.text)
|
61
|
+
|
58
62
|
docid.children = "[#{i}]"
|
59
63
|
end
|
60
64
|
end
|
@@ -72,7 +76,7 @@ module Asciidoctor
|
|
72
76
|
r = xmldoc.at(self.class::NORM_REF) || return
|
73
77
|
preface = r.xpath("./title/following-sibling::*") & # intersection
|
74
78
|
r.xpath("./bibitem[1]/preceding-sibling::*")
|
75
|
-
preface.each
|
79
|
+
preface.each(&:remove)
|
76
80
|
end
|
77
81
|
|
78
82
|
def biblio_cleanup(xmldoc)
|
@@ -92,6 +96,7 @@ module Asciidoctor
|
|
92
96
|
def format_ref(ref, type)
|
93
97
|
return @isodoc.docid_prefix(type, ref) if type != "metanorma"
|
94
98
|
return "[#{ref}]" if /^\d+$/.match(ref) && !/^\[.*\]$/.match(ref)
|
99
|
+
|
95
100
|
ref
|
96
101
|
end
|
97
102
|
|
@@ -103,7 +108,7 @@ module Asciidoctor
|
|
103
108
|
|
104
109
|
def reference_names(xmldoc)
|
105
110
|
xmldoc.xpath("//bibitem[not(ancestor::bibitem)]").each do |ref|
|
106
|
-
isopub = ref.at(ISO_PUBLISHER_XPATH)
|
111
|
+
# isopub = ref.at(ISO_PUBLISHER_XPATH)
|
107
112
|
docid = ref.at("./docidentifier[@type = 'metanorma']") ||
|
108
113
|
ref.at("./docidentifier[not(@type = 'DOI')]") or next
|
109
114
|
reference = format_ref(docid.text, docid["type"])
|
@@ -111,18 +116,20 @@ module Asciidoctor
|
|
111
116
|
end
|
112
117
|
end
|
113
118
|
|
114
|
-
def fetch_termbase(
|
119
|
+
def fetch_termbase(_termbase, _id)
|
115
120
|
""
|
116
121
|
end
|
117
122
|
|
118
123
|
def read_local_bibitem(uri)
|
119
|
-
return nil if %r{^
|
120
|
-
|
121
|
-
|
124
|
+
return nil if %r{^https?://}.match?(uri)
|
125
|
+
|
126
|
+
file = "#{@localdir}#{uri}.rxl"
|
127
|
+
File.file?(file) or file = "#{@localdir}#{uri}.xml"
|
122
128
|
File.file?(file) or return nil
|
123
129
|
xml = Nokogiri::XML(File.read(file, encoding: "utf-8"))
|
124
130
|
ret = xml.at("//*[local-name() = 'bibdata']") or return nil
|
125
|
-
ret = Nokogiri::XML(ret.to_xml
|
131
|
+
ret = Nokogiri::XML(ret.to_xml
|
132
|
+
.sub(%r{(<bibdata[^>]*?) xmlns=("[^"]+"|'[^']+')}, "\\1")).root
|
126
133
|
ret.name = "bibitem"
|
127
134
|
ins = ret.at("./*[local-name() = 'docidentifier']") or return nil
|
128
135
|
ins.previous = %{<uri type="citation">#{uri}</uri>}
|
@@ -132,7 +139,8 @@ module Asciidoctor
|
|
132
139
|
|
133
140
|
# if citation uri points to local file, get bibitem from it
|
134
141
|
def fetch_local_bibitem(xmldoc)
|
135
|
-
xmldoc.xpath("//bibitem[formattedref][uri[@type = 'citation']]")
|
142
|
+
xmldoc.xpath("//bibitem[formattedref][uri[@type = 'citation']]")
|
143
|
+
.each do |b|
|
136
144
|
uri = b&.at("./uri[@type = 'citation']")&.text
|
137
145
|
bibitem = read_local_bibitem(uri) or next
|
138
146
|
bibitem["id"] = b["id"]
|
@@ -8,7 +8,7 @@ module Asciidoctor
|
|
8
8
|
xmldoc.xpath("//clause[@bibitem = 'true']").each do |c|
|
9
9
|
bib = dl_bib_extract(c) or next
|
10
10
|
validate_ref_dl(bib, c)
|
11
|
-
bibitemxml = RelatonBib::BibliographicItem.
|
11
|
+
bibitemxml = RelatonBib::BibliographicItem.from_hash(bib).to_xml or next
|
12
12
|
bibitem = Nokogiri::XML(bibitemxml)
|
13
13
|
bibitem.root["id"] = c["id"] if c["id"] && !/^_/.match(c["id"])
|
14
14
|
c.replace(bibitem.root)
|
@@ -0,0 +1,47 @@
|
|
1
|
+
module Asciidoctor
|
2
|
+
module Standoc
|
3
|
+
module Cleanup
|
4
|
+
def requirement_cleanup(reqt)
|
5
|
+
requirement_descriptions(reqt)
|
6
|
+
requirement_inherit(reqt)
|
7
|
+
end
|
8
|
+
|
9
|
+
def requirement_inherit(reqt)
|
10
|
+
reqt.xpath("//requirement | //recommendation | //permission")
|
11
|
+
.each do |r|
|
12
|
+
ins = r.at("./classification") ||
|
13
|
+
r.at("./description | ./measurementtarget | ./specification | "\
|
14
|
+
"./verification | ./import | ./description | ./requirement | "\
|
15
|
+
"./recommendation | ./permission")
|
16
|
+
r.xpath("./*//inherit").each { |i| ins.previous = i }
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def requirement_descriptions(reqt)
|
21
|
+
reqt.xpath("//requirement | //recommendation | //permission")
|
22
|
+
.each do |r|
|
23
|
+
r.children.each do |e|
|
24
|
+
unless e.element? && (reqt_subpart(e.name) ||
|
25
|
+
%w(requirement recommendation permission).include?(e.name))
|
26
|
+
t = Nokogiri::XML::Element.new("description", reqt)
|
27
|
+
e.before(t)
|
28
|
+
t.children = e.remove
|
29
|
+
end
|
30
|
+
end
|
31
|
+
requirement_cleanup1(r)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
def requirement_cleanup1(reqt)
|
36
|
+
while d = reqt.at("./description[following-sibling::*[1]"\
|
37
|
+
"[self::description]]")
|
38
|
+
n = d.next.remove
|
39
|
+
d << n.children
|
40
|
+
end
|
41
|
+
reqt.xpath("./description[normalize-space(.)='']").each do |r|
|
42
|
+
r.replace("\n")
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
@@ -78,6 +78,7 @@ module Asciidoctor
|
|
78
78
|
x.xpath("//*[@annex]").each do |y|
|
79
79
|
y.delete("annex")
|
80
80
|
next if y.name == "annex" || !y.ancestors("annex").empty?
|
81
|
+
|
81
82
|
y.wrap("<annex/>")
|
82
83
|
y.parent["id"] = "_#{UUIDTools::UUID.random_create}"
|
83
84
|
y.parent["obligation"] = y["obligation"]
|
@@ -97,6 +98,7 @@ module Asciidoctor
|
|
97
98
|
def sections_level_cleanup(x)
|
98
99
|
m = maxlevel(x)
|
99
100
|
return if m < 6
|
101
|
+
|
100
102
|
m.downto(6).each do |l|
|
101
103
|
x.xpath("//clause[@level = '#{l}']").each do |c|
|
102
104
|
c.delete("level")
|
@@ -150,6 +152,7 @@ module Asciidoctor
|
|
150
152
|
|
151
153
|
def preface_clausebefore_cleanup(xmldoc)
|
152
154
|
return unless xmldoc.at("//preface")
|
155
|
+
|
153
156
|
unless ins = xmldoc.at("//preface").children.first
|
154
157
|
xmldoc.at("//preface") << " "
|
155
158
|
ins = xmldoc.at("//preface").children.first
|
@@ -162,6 +165,7 @@ module Asciidoctor
|
|
162
165
|
|
163
166
|
def sections_clausebefore_cleanup(xmldoc)
|
164
167
|
return unless xmldoc.at("//sections")
|
168
|
+
|
165
169
|
unless ins = xmldoc.at("//sections").children.first
|
166
170
|
xmldoc.at("//sections") << " "
|
167
171
|
ins = xmldoc.at("//sections").children.first
|
@@ -188,6 +192,7 @@ module Asciidoctor
|
|
188
192
|
|
189
193
|
doc.xpath(xpath).each_with_index do |node, i|
|
190
194
|
next if first && !i.zero?
|
195
|
+
|
191
196
|
title = get_or_make_title(node)
|
192
197
|
fn = title.xpath("./fn")
|
193
198
|
fn.each { |n| n.remove }
|
@@ -3,7 +3,7 @@ require "nokogiri"
|
|
3
3
|
require "htmlentities"
|
4
4
|
require "pathname"
|
5
5
|
require "open-uri"
|
6
|
-
require_relative "./front_contributor
|
6
|
+
require_relative "./front_contributor"
|
7
7
|
|
8
8
|
module Asciidoctor
|
9
9
|
module Standoc
|
@@ -40,6 +40,7 @@ module Asciidoctor
|
|
40
40
|
|
41
41
|
def metadata_committee(node, xml)
|
42
42
|
return unless node.attr("technical-committee")
|
43
|
+
|
43
44
|
xml.editorialgroup do |a|
|
44
45
|
committee_component("technical-committee", node, a)
|
45
46
|
end
|
@@ -47,8 +48,8 @@ module Asciidoctor
|
|
47
48
|
|
48
49
|
def metadata_ics(node, xml)
|
49
50
|
ics = node.attr("library-ics")
|
50
|
-
ics
|
51
|
-
xml.ics { |
|
51
|
+
ics&.split(/,\s*/)&.each do |i|
|
52
|
+
xml.ics { |elem| elem.code i }
|
52
53
|
end
|
53
54
|
end
|
54
55
|
|
@@ -71,15 +72,15 @@ module Asciidoctor
|
|
71
72
|
|
72
73
|
def datetypes
|
73
74
|
%w{ published accessed created implemented obsoleted
|
74
|
-
confirmed updated issued circulated unchanged received
|
75
|
-
vote-started vote-ended
|
76
|
-
}
|
75
|
+
confirmed updated issued circulated unchanged received
|
76
|
+
vote-started vote-ended }
|
77
77
|
end
|
78
78
|
|
79
79
|
def metadata_date(node, xml)
|
80
80
|
datetypes.each { |t| metadata_date1(node, xml, t) }
|
81
|
-
node.attributes.
|
81
|
+
node.attributes.each_key do |a|
|
82
82
|
next unless a == "date" || /^date_\d+$/.match(a)
|
83
|
+
|
83
84
|
type, date = node.attr(a).split(/ /, 2)
|
84
85
|
type or next
|
85
86
|
xml.date **{ type: type } do |d|
|
@@ -93,7 +94,8 @@ module Asciidoctor
|
|
93
94
|
end
|
94
95
|
|
95
96
|
def metadata_script(node, xml)
|
96
|
-
xml.script (node.attr("script") ||
|
97
|
+
xml.script (node.attr("script") ||
|
98
|
+
default_script(node.attr("language")))
|
97
99
|
end
|
98
100
|
|
99
101
|
def relaton_relations
|
@@ -114,8 +116,8 @@ module Asciidoctor
|
|
114
116
|
end
|
115
117
|
|
116
118
|
def relation_normalise(type)
|
117
|
-
type.sub(/-by$/, "By").sub(/-of$/, "Of").sub(/-from$/, "From")
|
118
|
-
sub(/-in$/, "In")
|
119
|
+
type.sub(/-by$/, "By").sub(/-of$/, "Of").sub(/-from$/, "From")
|
120
|
+
.sub(/-in$/, "In")
|
119
121
|
end
|
120
122
|
|
121
123
|
def metadata_getrelation(node, xml, type, desc = nil)
|
@@ -124,8 +126,8 @@ module Asciidoctor
|
|
124
126
|
id = d.split(/,\s*/)
|
125
127
|
xml.relation **{ type: relation_normalise(type) } do |r|
|
126
128
|
desc.nil? or r.description relation_normalise(desc)
|
127
|
-
fetch_ref(r, d, nil, {}) or r.bibitem do |b|
|
128
|
-
b.title id[1]
|
129
|
+
fetch_ref(r, d, nil, **{}) or r.bibitem do |b|
|
130
|
+
b.title id[1] || "--"
|
129
131
|
b.docidentifier id[0]
|
130
132
|
end
|
131
133
|
end
|
@@ -134,11 +136,20 @@ module Asciidoctor
|
|
134
136
|
|
135
137
|
def metadata_keywords(node, xml)
|
136
138
|
return unless node.attr("keywords")
|
137
|
-
|
139
|
+
|
140
|
+
node.attr("keywords").split(/,\s*/).each do |kw|
|
138
141
|
xml.keyword kw
|
139
142
|
end
|
140
143
|
end
|
141
144
|
|
145
|
+
def metadata_classifications(node, xml)
|
146
|
+
csv_split(node.attr("classification"), ",")&.each do |c|
|
147
|
+
vals = c.split(/:/, 2)
|
148
|
+
vals.size == 1 and vals = ["default", vals[0]]
|
149
|
+
xml.classification vals[1], type: vals[0]
|
150
|
+
end
|
151
|
+
end
|
152
|
+
|
142
153
|
def metadata(node, xml)
|
143
154
|
title node, xml
|
144
155
|
metadata_source(node, xml)
|
@@ -155,14 +166,16 @@ module Asciidoctor
|
|
155
166
|
metadata_copyright(node, xml)
|
156
167
|
metadata_relations(node, xml)
|
157
168
|
metadata_series(node, xml)
|
169
|
+
metadata_classifications(node, xml)
|
158
170
|
metadata_keywords(node, xml)
|
159
|
-
xml.ext do
|
171
|
+
xml.ext do
|
160
172
|
metadata_ext(node, xml)
|
161
173
|
end
|
162
174
|
end
|
163
175
|
|
164
176
|
def metadata_ext(node, ext)
|
165
177
|
metadata_doctype(node, ext)
|
178
|
+
metadata_subdoctype(node, ext)
|
166
179
|
metadata_committee(node, ext)
|
167
180
|
metadata_ics(node, ext)
|
168
181
|
end
|
@@ -171,11 +184,13 @@ module Asciidoctor
|
|
171
184
|
xml.doctype doctype(node)
|
172
185
|
end
|
173
186
|
|
174
|
-
def
|
187
|
+
def metadata_subdoctype(node, xml)
|
188
|
+
s = node.attr("docsubtype") and xml.subdoctype s
|
175
189
|
end
|
176
190
|
|
177
|
-
def
|
178
|
-
|
191
|
+
def metadata_note(node, xml); end
|
192
|
+
|
193
|
+
def metadata_series(node, xml); end
|
179
194
|
|
180
195
|
def title(node, xml)
|
181
196
|
title_english(node, xml)
|
@@ -187,7 +202,8 @@ module Asciidoctor
|
|
187
202
|
at = { language: lang, format: "text/plain" }
|
188
203
|
xml.title **attr_code(at) do |t|
|
189
204
|
t << (Metanorma::Utils::asciidoc_sub(node.attr("title") ||
|
190
|
-
|
205
|
+
node.attr("title-en")) ||
|
206
|
+
node.title)
|
191
207
|
end
|
192
208
|
end
|
193
209
|
end
|
@@ -196,6 +212,7 @@ module Asciidoctor
|
|
196
212
|
node.attributes.each do |k, v|
|
197
213
|
next unless /^title-(?<titlelang>.+)$/ =~ k
|
198
214
|
next if titlelang == "en"
|
215
|
+
|
199
216
|
xml.title v, { language: titlelang, format: "text/plain" }
|
200
217
|
end
|
201
218
|
end
|