metanorma-ieee 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/isodoc/ieee/html/header_amd.html +105 -0
- data/lib/isodoc/ieee/html/html_ieee_titlepage.html +11 -12
- data/lib/isodoc/ieee/html/ieee.css +23 -15
- data/lib/isodoc/ieee/html/ieee.scss +24 -15
- data/lib/isodoc/ieee/html/word_ieee_titlepage.html +12 -1
- data/lib/isodoc/ieee/i18n-en.yaml +1 -0
- data/lib/isodoc/ieee/ieee.amendment.xsl +370 -184
- data/lib/isodoc/ieee/ieee.standard.xsl +370 -184
- data/lib/isodoc/ieee/metadata.rb +25 -47
- data/lib/isodoc/ieee/pdf_convert.rb +2 -2
- data/lib/isodoc/ieee/presentation_ref.rb +70 -0
- data/lib/isodoc/ieee/presentation_terms.rb +67 -20
- data/lib/isodoc/ieee/presentation_xml_convert.rb +97 -63
- data/lib/isodoc/ieee/word_authority.rb +5 -3
- data/lib/isodoc/ieee/word_convert.rb +12 -0
- data/lib/metanorma/ieee/boilerplate.xml +68 -19
- data/lib/metanorma/ieee/cleanup.rb +96 -33
- data/lib/metanorma/ieee/cleanup_ref.rb +1 -0
- data/lib/metanorma/ieee/converter.rb +7 -0
- data/lib/metanorma/ieee/front.rb +40 -53
- data/lib/metanorma/ieee/ieee.rng +32 -2
- data/lib/metanorma/ieee/isodoc.rng +10 -0
- data/lib/metanorma/ieee/term_lookup_cleanup.rb +11 -0
- data/lib/metanorma/ieee/validate.rb +57 -53
- data/lib/metanorma/ieee/validate_style.rb +53 -0
- data/lib/metanorma/ieee/version.rb +1 -1
- metadata +5 -2
data/lib/isodoc/ieee/metadata.rb
CHANGED
@@ -6,11 +6,13 @@ module IsoDoc
|
|
6
6
|
class Metadata < IsoDoc::Metadata
|
7
7
|
def initialize(lang, script, i18n, fonts_options = {})
|
8
8
|
super
|
9
|
-
@metadata[:
|
9
|
+
@metadata[:issueddate] = "<Date Approved>"
|
10
10
|
end
|
11
11
|
|
12
12
|
def bibdate(isoxml, _out)
|
13
|
-
|
13
|
+
isoxml.xpath(ns("//bibdata/date[@format = 'ddMMMyyyy']")).each do |d|
|
14
|
+
set("#{d['type'].gsub(/-/, '_')}date".to_sym, Common::date_range(d))
|
15
|
+
end
|
14
16
|
draft = isoxml.at(ns("//bibdata/date[@type = 'issued']")) ||
|
15
17
|
isoxml.at(ns("//bibdata/date[@type = 'circulated']")) ||
|
16
18
|
isoxml.at(ns("//bibdata/date[@type = 'created']")) ||
|
@@ -25,8 +27,10 @@ module IsoDoc
|
|
25
27
|
b = isoxml.at(ns("//bibdata/ext/doctype"))&.text or return
|
26
28
|
set(:doctype, b.split(/[- ]/).map(&:capitalize).join(" "))
|
27
29
|
set(:doctype_abbrev, @labels["doctype_abbrev"][b])
|
28
|
-
s = isoxml.at(ns("//bibdata/ext/
|
30
|
+
s = isoxml.at(ns("//bibdata/ext/subdoctype"))&.text and
|
29
31
|
set(:docsubtype, s.split(/[- ]/).map(&:capitalize).join(" "))
|
32
|
+
s = isoxml.at(ns("//bibdata/ext/trial-use"))&.text and s == "true" and
|
33
|
+
set(:trial_use, true)
|
30
34
|
end
|
31
35
|
|
32
36
|
def author(xml, _out)
|
@@ -35,7 +39,6 @@ module IsoDoc
|
|
35
39
|
tc(xml)
|
36
40
|
wg(xml)
|
37
41
|
bg(xml)
|
38
|
-
std_group(xml)
|
39
42
|
end
|
40
43
|
|
41
44
|
def society(xml)
|
@@ -50,59 +53,17 @@ module IsoDoc
|
|
50
53
|
set(:technical_committee, tc)
|
51
54
|
end
|
52
55
|
|
53
|
-
def editor_names(xml, role)
|
54
|
-
xml.xpath(ns("//bibdata/contributor[role/@type = 'editor']"\
|
55
|
-
"[role = '#{role}']/person/name/completename"))
|
56
|
-
&.each&.map(&:text)
|
57
|
-
end
|
58
|
-
|
59
|
-
def editor_name(xml, role)
|
60
|
-
editor_names(xml, role)&.first
|
61
|
-
end
|
62
|
-
|
63
56
|
def wg(xml)
|
64
57
|
wg = xml.at(ns("//bibdata/ext/editorialgroup/"\
|
65
58
|
"working-group")) or return nil
|
66
59
|
set(:working_group, wg.text)
|
67
|
-
m = {}
|
68
|
-
["Chair", "Vice-Chair", "Secretary"].each do |r|
|
69
|
-
a = editor_name(xml, "Working Group #{r}") and
|
70
|
-
m[r.downcase.gsub(/ /, "-")] = a
|
71
|
-
end
|
72
|
-
wg_members(xml, m)
|
73
|
-
end
|
74
|
-
|
75
|
-
def wg_members(xml, members)
|
76
|
-
a = editor_names(xml, "Working Group Member") and members["members"] = a
|
77
|
-
members["members"].empty? and (1..9).each do |i|
|
78
|
-
members["members"] << "Participant#{i}"
|
79
|
-
end
|
80
|
-
set(:wg_members, members)
|
81
60
|
end
|
82
61
|
|
83
62
|
def bg(xml)
|
84
63
|
bg = xml.at(ns("//bibdata/ext/editorialgroup/"\
|
85
64
|
"balloting-group")) or return nil
|
86
65
|
set(:balloting_group, bg.text)
|
87
|
-
|
88
|
-
m["members"] = editor_names(xml, "Balloting Group Member")
|
89
|
-
m["members"].empty? and (1..9).each do |i|
|
90
|
-
m["members"] << "Balloter#{i}"
|
91
|
-
end
|
92
|
-
set(:balloting_group_members, m["members"])
|
93
|
-
end
|
94
|
-
|
95
|
-
def std_group(xml)
|
96
|
-
m = {}
|
97
|
-
["Chair", "Vice-Chair", "Past Chair", "Secretary"].each do |r|
|
98
|
-
m[r.downcase.gsub(/ /, "-")] =
|
99
|
-
editor_name(xml, "Standards Board #{r}") || "<Name>"
|
100
|
-
end
|
101
|
-
m["members"] = editor_names(xml, "Standards Board Member")
|
102
|
-
m["members"].empty? and (1..9).each do |i|
|
103
|
-
m["members"] << "SBMember#{i}"
|
104
|
-
end
|
105
|
-
set(:std_board, m)
|
66
|
+
set(:balloting_group_type, bg["type"])
|
106
67
|
end
|
107
68
|
|
108
69
|
def otherid(isoxml, _out)
|
@@ -120,6 +81,10 @@ module IsoDoc
|
|
120
81
|
set(:stdid_pdf, dn&.text || "STDXXXXX")
|
121
82
|
dn = isoxml.at(ns("//#{id}[@scope = 'print']"))
|
122
83
|
set(:stdid_print, dn&.text || "STDPDXXXXX")
|
84
|
+
dn = isoxml.at(ns("//bibdata/ext/structuredidentifier/amendment")) and
|
85
|
+
set(:amd, dn.text)
|
86
|
+
dn = isoxml.at(ns("//bibdata/ext/structuredidentifier/corrigendum")) and
|
87
|
+
set(:corr, dn.text)
|
123
88
|
end
|
124
89
|
|
125
90
|
def title(isoxml, _out)
|
@@ -152,6 +117,19 @@ module IsoDoc
|
|
152
117
|
end
|
153
118
|
set(type.to_sym, ret)
|
154
119
|
end
|
120
|
+
|
121
|
+
def ddMMMyyyy(isodate)
|
122
|
+
return nil if isodate.nil?
|
123
|
+
|
124
|
+
arr = isodate.split("-")
|
125
|
+
if arr.size == 1 && (/^\d+$/.match isodate)
|
126
|
+
Date.new(*arr.map(&:to_i)).strftime("%Y")
|
127
|
+
elsif arr.size == 2
|
128
|
+
Date.new(*arr.map(&:to_i)).strftime("%b %Y")
|
129
|
+
else
|
130
|
+
Date.parse(isodate).strftime("%d %b %Y")
|
131
|
+
end
|
132
|
+
end
|
155
133
|
end
|
156
134
|
end
|
157
135
|
end
|
@@ -12,8 +12,8 @@ module IsoDoc
|
|
12
12
|
end
|
13
13
|
|
14
14
|
def pdf_stylesheet(docxml)
|
15
|
-
doctype = docxml&.at(ns("//bibdata/ext/
|
16
|
-
if
|
15
|
+
doctype = docxml&.at(ns("//bibdata/ext/subdoctype"))&.text
|
16
|
+
if %w(amendment corrigendum erratum).include?(doctype)
|
17
17
|
"ieee.amendment.xsl"
|
18
18
|
else
|
19
19
|
"ieee.standard.xsl"
|
@@ -0,0 +1,70 @@
|
|
1
|
+
module IsoDoc
|
2
|
+
module IEEE
|
3
|
+
class PresentationXMLConvert < IsoDoc::PresentationXMLConvert
|
4
|
+
# Style manual 19
|
5
|
+
def anchor_linkend(node, linkend)
|
6
|
+
@bibanchors ||= biblio_ids_titles(node.document)
|
7
|
+
if node["citeas"] && i = @bibanchors[node["bibitemid"]]
|
8
|
+
biblio_anchor_linkend(node, i)
|
9
|
+
else super
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
def biblio_anchor_linkend(node, bib)
|
14
|
+
if %w(techreport standard).include?(bib[:type])
|
15
|
+
node["citeas"] + " #{bib[:ord]}"
|
16
|
+
else
|
17
|
+
"#{bib[:title]} " + node["citeas"]
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def biblio_ids_titles(xmldoc)
|
22
|
+
xmldoc.xpath(ns("//references[@normative = 'false']/bibitem"))
|
23
|
+
.each_with_object({}) do |b, m|
|
24
|
+
m[b["id"]] =
|
25
|
+
{ docid: pref_ref_code(b), type: b["type"],
|
26
|
+
title: b.at(ns("./title"))&.text ||
|
27
|
+
b.at(ns("./formattedref"))&.text,
|
28
|
+
ord: b.at(ns("./docidentifier[@type = 'metanorma' or "\
|
29
|
+
"@type = 'metanorma-ordinal']")).text }
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
def bibrenderer
|
34
|
+
::Relaton::Render::IEEE::General.new(language: @lang,
|
35
|
+
i18nhash: @i18n.get)
|
36
|
+
end
|
37
|
+
|
38
|
+
def bibrender_relaton(xml)
|
39
|
+
bib = xml.dup
|
40
|
+
bib["suppress_identifier"] == true and
|
41
|
+
bib.xpath(ns("./docidentifier")).each(&:remove)
|
42
|
+
xml.children =
|
43
|
+
"#{bibrenderer.render(bib.to_xml)}"\
|
44
|
+
"#{xml.xpath(ns('./docidentifier | ./uri | ./note | ./title')).to_xml}"
|
45
|
+
end
|
46
|
+
|
47
|
+
def creatornames(bibitem)
|
48
|
+
::Relaton::Render::IEEE::General
|
49
|
+
.new(language: @lang, i18nhash: @i18n.get,
|
50
|
+
template: { (bibitem["type"] || "misc").to_sym =>
|
51
|
+
"{{ creatornames }}" })
|
52
|
+
.parse1(RelatonBib::XMLParser.from_xml(bibitem.to_xml))
|
53
|
+
end
|
54
|
+
|
55
|
+
def bibliography_bibitem_number1(bibitem, idx)
|
56
|
+
if mn = bibitem.at(ns(".//docidentifier[@type = 'metanorma']"))
|
57
|
+
/^\[?\d\]?$/.match?(mn&.text) and
|
58
|
+
idx = mn.text.sub(/^\[B?/, "").sub(/\]$/, "").to_i
|
59
|
+
end
|
60
|
+
unless bibliography_bibitem_number_skip(bibitem)
|
61
|
+
|
62
|
+
idx += 1
|
63
|
+
bibitem.at(ns(".//docidentifier")).previous =
|
64
|
+
"<docidentifier type='metanorma-ordinal'>[B#{idx}]</docidentifier>"
|
65
|
+
end
|
66
|
+
idx
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
@@ -12,7 +12,8 @@ module IsoDoc
|
|
12
12
|
c = IsoDoc::XrefGen::Counter.new("@")
|
13
13
|
elem.xpath(ns("./definition")).each do |d|
|
14
14
|
c.increment(d)
|
15
|
-
d.elements.first.previous =
|
15
|
+
d.elements.first.children.first.previous =
|
16
|
+
"<strong>(#{c.print})</strong> "
|
16
17
|
end
|
17
18
|
end
|
18
19
|
|
@@ -20,9 +21,20 @@ module IsoDoc
|
|
20
21
|
ins = elem.at(ns("./definition")).previous_element
|
21
22
|
coll = elem.xpath(ns("./definition"))
|
22
23
|
coll.each(&:remove)
|
23
|
-
ins.next = "<definition>#{coll
|
24
|
-
|
25
|
-
|
24
|
+
ins.next = "<definition>#{unwrap_multidef(coll)}</definition>"
|
25
|
+
end
|
26
|
+
|
27
|
+
def unwrap_multidef(coll)
|
28
|
+
if coll.all? do |c|
|
29
|
+
c.elements.size == 1 && c.elements.first.name == "p"
|
30
|
+
end
|
31
|
+
ret = coll.map do |c|
|
32
|
+
c.elements.first.children.to_xml
|
33
|
+
end
|
34
|
+
"<p>#{ret.join}</p>"
|
35
|
+
else
|
36
|
+
coll.map { |c| c.children.to_xml }.join
|
37
|
+
end
|
26
38
|
end
|
27
39
|
|
28
40
|
def unwrap_definition(docxml)
|
@@ -60,10 +72,10 @@ module IsoDoc
|
|
60
72
|
|
61
73
|
def sort_terms_key(term)
|
62
74
|
d = term.at(ns("./preferred/expression/name | "\
|
63
|
-
"./preferred/letter-
|
75
|
+
"./preferred/letter-symbol/name | "\
|
64
76
|
"./preferred/graphical-symbol/figure/name | "\
|
65
77
|
"./preferred/graphical-symbol/figure/@id"))
|
66
|
-
d&.text&.downcase
|
78
|
+
HTMLEntities.new.decode(d&.text&.strip&.downcase) || "ZZZ"
|
67
79
|
end
|
68
80
|
|
69
81
|
def term_related_reorder(coll)
|
@@ -99,21 +111,47 @@ module IsoDoc
|
|
99
111
|
|
100
112
|
def admitted_to_related(docxml)
|
101
113
|
docxml.xpath(ns("//term/admitted")).each do |a|
|
102
|
-
a
|
103
|
-
a.name = "related"
|
104
|
-
a.children = "<preferred>#{a.children.to_xml}</preferred>"
|
114
|
+
admitted_to_related1(a, a.parent.at(ns("./preferred")))
|
105
115
|
end
|
116
|
+
term_reorder(docxml)
|
106
117
|
end
|
107
118
|
|
108
|
-
def
|
109
|
-
|
110
|
-
|
119
|
+
def admitted_to_related1(adm, pref)
|
120
|
+
new = adm.dup
|
121
|
+
adm["type"] = "equivalent"
|
122
|
+
adm.name = "related"
|
123
|
+
adm.children = "<preferred>#{adm.children.to_xml}</preferred>"
|
124
|
+
adm.parent.next = <<~TERM
|
125
|
+
<term><preferred>#{new.children.to_xml}</preferred>
|
126
|
+
<related type='see'><preferred>#{pref.children.to_xml}</preferred></related></term>
|
127
|
+
TERM
|
128
|
+
end
|
129
|
+
|
130
|
+
def term_reorder(xmldoc)
|
131
|
+
xmldoc.xpath(ns("//terms")).each { |t| term_reorder1(t) }
|
132
|
+
end
|
133
|
+
|
134
|
+
def term_reorder1(terms)
|
135
|
+
ins = terms.at(ns("./term"))&.previous_element or return
|
136
|
+
coll = terms.xpath(ns("./term"))
|
137
|
+
ret = sort_terms(coll)
|
138
|
+
coll.each(&:remove)
|
139
|
+
ret.reverse.each { |t| ins.next = t }
|
140
|
+
end
|
141
|
+
|
142
|
+
def sort_terms(terms)
|
143
|
+
terms.sort do |a, b|
|
144
|
+
sort_terms_key(a) <=> sort_terms_key(b)
|
111
145
|
end
|
112
146
|
end
|
113
147
|
|
148
|
+
def collapse_term(docxml)
|
149
|
+
docxml.xpath(ns("//term")).each { |t| collapse_term1(t) }
|
150
|
+
end
|
151
|
+
|
114
152
|
def collapse_term1(term)
|
115
153
|
ret = collapse_term_template(
|
116
|
-
pref: term.at(ns("./preferred"))
|
154
|
+
pref: term.at(ns("./preferred"))&.remove,
|
117
155
|
def: term.at(ns("./definition")),
|
118
156
|
rels: term.xpath(ns("./related")).map(&:remove),
|
119
157
|
source: term.at(ns("./termsource")),
|
@@ -124,8 +162,9 @@ module IsoDoc
|
|
124
162
|
|
125
163
|
def collapse_term_related(rels)
|
126
164
|
ret = rels.map do |r|
|
165
|
+
p = r.at(ns("./preferred"))
|
127
166
|
"<em>#{@i18n.relatedterms[r['type']]}:</em> "\
|
128
|
-
"#{
|
167
|
+
"#{p&.children&.to_xml || '**RELATED TERM NOT FOUND**'}"
|
129
168
|
end.join(". ")
|
130
169
|
ret += "." unless ret.empty?
|
131
170
|
ret
|
@@ -136,7 +175,7 @@ module IsoDoc
|
|
136
175
|
src = nil
|
137
176
|
opt[:source] and src = "(#{opt[:source].remove.children.to_xml.strip})"
|
138
177
|
<<~TERM
|
139
|
-
<p>#{opt[:pref]
|
178
|
+
<p>#{opt[:pref]&.children&.to_xml || '**TERM NOT FOUND**'}: #{defn}
|
140
179
|
#{collapse_term_related(opt[:rels])}
|
141
180
|
#{src}</p>
|
142
181
|
TERM
|
@@ -158,6 +197,14 @@ module IsoDoc
|
|
158
197
|
while elem&.next_element&.name == "termsource"
|
159
198
|
elem << "; #{elem.next_element.remove.children.to_xml}"
|
160
199
|
end
|
200
|
+
adapt = termsource_adapt(elem["status"]) and
|
201
|
+
elem.children = l10n("#{adapt}#{elem.children.to_xml.strip}")
|
202
|
+
end
|
203
|
+
|
204
|
+
def termsource_adapt(status)
|
205
|
+
case status
|
206
|
+
when "adapted" then @i18n.adapted_from
|
207
|
+
end
|
161
208
|
end
|
162
209
|
|
163
210
|
def designation_field(desgn, name)
|
@@ -170,12 +217,12 @@ module IsoDoc
|
|
170
217
|
end
|
171
218
|
|
172
219
|
def merge_second_preferred(term)
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
end
|
220
|
+
prefs = term.xpath(ns("./preferred[expression/name]"))
|
221
|
+
prefs.size > 1 or return
|
222
|
+
alts = prefs[1..-1].map do |p|
|
223
|
+
p.remove.at(ns("./expression/name")).children.to_xml.strip
|
178
224
|
end
|
225
|
+
prefs.first.at(ns("./expression/name")) << " (#{alts.join(', ')})"
|
179
226
|
end
|
180
227
|
|
181
228
|
def termnote1(elem)
|
@@ -1,5 +1,6 @@
|
|
1
1
|
require_relative "init"
|
2
2
|
require_relative "presentation_terms"
|
3
|
+
require_relative "presentation_ref"
|
3
4
|
require "isodoc"
|
4
5
|
|
5
6
|
module IsoDoc
|
@@ -53,35 +54,6 @@ module IsoDoc
|
|
53
54
|
l10n(ret)
|
54
55
|
end
|
55
56
|
|
56
|
-
# Style manual 19
|
57
|
-
def anchor_linkend(node, linkend)
|
58
|
-
@bibanchors ||= biblio_ids_titles(node.document)
|
59
|
-
if node["citeas"] && i = @bibanchors[node["bibitemid"]]
|
60
|
-
biblio_anchor_linkend(node, i)
|
61
|
-
else super
|
62
|
-
end
|
63
|
-
end
|
64
|
-
|
65
|
-
def biblio_anchor_linkend(node, bib)
|
66
|
-
if %w(techreport standard).include?(bib[:type])
|
67
|
-
node["citeas"] + " #{bib[:ord]}"
|
68
|
-
else
|
69
|
-
"#{bib[:title]} " + node["citeas"]
|
70
|
-
end
|
71
|
-
end
|
72
|
-
|
73
|
-
def biblio_ids_titles(xmldoc)
|
74
|
-
xmldoc.xpath(ns("//references[@normative = 'false']/bibitem"))
|
75
|
-
.each_with_object({}) do |b, m|
|
76
|
-
m[b["id"]] =
|
77
|
-
{ docid: pref_ref_code(b), type: b["type"],
|
78
|
-
title: b.at(ns("./title"))&.text ||
|
79
|
-
b.at(ns("./formattedref"))&.text,
|
80
|
-
ord: b.at(ns("./docidentifier[@type = 'metanorma' or "\
|
81
|
-
"@type = 'metanorma-ordinal']")).text }
|
82
|
-
end
|
83
|
-
end
|
84
|
-
|
85
57
|
def anchor_linkend1(node)
|
86
58
|
linkend = @xrefs.anchor(node["target"], :xref)
|
87
59
|
@xrefs.anchor(node["target"], :type) == "clause" &&
|
@@ -102,10 +74,8 @@ module IsoDoc
|
|
102
74
|
return if elem.parent.name == "bibitem" || elem["notag"] == "true"
|
103
75
|
|
104
76
|
n = @xrefs.get[elem["id"]]
|
105
|
-
lbl = if n.nil? || n[:label].nil? || n[:label].empty?
|
106
|
-
|
107
|
-
else
|
108
|
-
l10n("#{@i18n.note} #{n[:label]}")
|
77
|
+
lbl = if n.nil? || n[:label].nil? || n[:label].empty? then @i18n.note
|
78
|
+
else l10n("#{@i18n.note} #{n[:label]}")
|
109
79
|
end
|
110
80
|
prefix_name(elem, block_delim, lbl, "name")
|
111
81
|
end
|
@@ -124,48 +94,112 @@ module IsoDoc
|
|
124
94
|
display_order_xpath(docxml, "//indexsect", i)
|
125
95
|
end
|
126
96
|
|
127
|
-
def
|
128
|
-
|
129
|
-
|
97
|
+
def annex1(elem)
|
98
|
+
lbl = @xrefs.anchor(elem["id"], :label)
|
99
|
+
if t = elem.at(ns("./title"))
|
100
|
+
t.children = "<strong>#{t.children.to_xml}</strong>"
|
101
|
+
end
|
102
|
+
prefix_name(elem, "<br/>", lbl, "title")
|
130
103
|
end
|
131
104
|
|
132
|
-
def
|
133
|
-
|
134
|
-
bib
|
135
|
-
bib.xpath(ns("./docidentifier")).each(&:remove)
|
136
|
-
xml.children =
|
137
|
-
"#{bibrenderer.render(bib.to_xml)}"\
|
138
|
-
"#{xml.xpath(ns('./docidentifier | ./uri | ./note | ./title')).to_xml}"
|
105
|
+
def bibdata_i18n(bib)
|
106
|
+
super
|
107
|
+
bibdata_dates(bib)
|
139
108
|
end
|
140
109
|
|
141
|
-
def
|
142
|
-
|
143
|
-
.
|
144
|
-
|
145
|
-
|
146
|
-
|
110
|
+
def bibdata_dates(bib)
|
111
|
+
bib.xpath(ns("./date")).each do |d|
|
112
|
+
d.next = d.dup
|
113
|
+
d.next["format"] = "ddMMMyyyy"
|
114
|
+
d.next.xpath(ns("./from | ./to | ./on")).each do |x|
|
115
|
+
x.children = ddMMMyyyy(x.text)
|
116
|
+
end
|
117
|
+
end
|
147
118
|
end
|
148
119
|
|
149
|
-
def
|
150
|
-
|
151
|
-
|
152
|
-
|
120
|
+
def ddMMMyyyy(isodate)
|
121
|
+
return nil if isodate.nil?
|
122
|
+
|
123
|
+
arr = isodate.split("-")
|
124
|
+
if arr.size == 1 && (/^\d+$/.match isodate)
|
125
|
+
Date.new(*arr.map(&:to_i)).strftime("%Y")
|
126
|
+
elsif arr.size == 2
|
127
|
+
Date.new(*arr.map(&:to_i)).strftime("%b %Y")
|
128
|
+
else
|
129
|
+
Date.parse(isodate).strftime("%d %b %Y")
|
153
130
|
end
|
154
|
-
|
131
|
+
end
|
155
132
|
|
156
|
-
|
157
|
-
|
158
|
-
|
133
|
+
def amend1(elem)
|
134
|
+
elem.xpath(ns("./description/p")).each do |p|
|
135
|
+
p.children = p.children.to_xml.strip
|
136
|
+
amend_format(p)
|
159
137
|
end
|
160
|
-
|
138
|
+
super
|
161
139
|
end
|
162
140
|
|
163
|
-
def
|
164
|
-
|
165
|
-
|
166
|
-
|
141
|
+
def amend_format(para)
|
142
|
+
2.times do
|
143
|
+
para.children.size == 1 &&
|
144
|
+
%(em strong).include?(para.children.first.name) and
|
145
|
+
para.children = para.elements.first.children
|
167
146
|
end
|
168
|
-
|
147
|
+
para.children = "<strong><em>#{para.children.to_xml}</em></strong>"
|
148
|
+
end
|
149
|
+
|
150
|
+
def section(docxml)
|
151
|
+
boilerplate(docxml)
|
152
|
+
super
|
153
|
+
end
|
154
|
+
|
155
|
+
def boilerplate(docxml)
|
156
|
+
docxml.xpath(ns("//clause[@id = 'boilerplate-participants']/"\
|
157
|
+
"clause/title")).each(&:remove)
|
158
|
+
docxml.xpath(ns("//clause[@id = 'boilerplate-participants']/clause"))
|
159
|
+
.each do |clause|
|
160
|
+
participants(clause)
|
161
|
+
end
|
162
|
+
end
|
163
|
+
|
164
|
+
def participants(clause)
|
165
|
+
clause.xpath(ns(".//ul")).each_with_index do |ulist, idx|
|
166
|
+
ulist.xpath(ns("./li")).each { |list| participants1(list, idx) }
|
167
|
+
ulist.replace(ulist.children)
|
168
|
+
end
|
169
|
+
end
|
170
|
+
|
171
|
+
def participants1(list, idx)
|
172
|
+
key = ""
|
173
|
+
map = list.xpath(ns(".//dt | .//dd")).each_with_object({}) do |dtd, m|
|
174
|
+
(dtd.name == "dt" and key = dtd.text) or
|
175
|
+
m[key] = dtd.text.strip
|
176
|
+
end
|
177
|
+
list.replace(participant_para(map, idx))
|
178
|
+
end
|
179
|
+
|
180
|
+
def participant_para(map, idx)
|
181
|
+
name = participant_name(map)
|
182
|
+
if map["role"]&.casecmp("member")&.zero?
|
183
|
+
participant_member_para(map, name, idx)
|
184
|
+
else
|
185
|
+
participant_officeholder_para(map, name, idx)
|
186
|
+
end
|
187
|
+
end
|
188
|
+
|
189
|
+
def participant_member_para(map, name, _idx)
|
190
|
+
(map["company"] and "<p type='officeorgmember'>#{name}</p>") or
|
191
|
+
"<p type='officemember'>#{name}</p>"
|
192
|
+
end
|
193
|
+
|
194
|
+
def participant_officeholder_para(map, name, idx)
|
195
|
+
name = "<strong>#{name}</strong>" if idx.zero?
|
196
|
+
br = map["role"].size > 30 ? "<br/>" : ""
|
197
|
+
"<p type='officeholder' align='center'>#{name}, #{br}"\
|
198
|
+
"<em>#{map['role']}</em></p>"
|
199
|
+
end
|
200
|
+
|
201
|
+
def participant_name(map)
|
202
|
+
map["company"] || map["name"] || "#{map['given']} #{map['surname']}"
|
169
203
|
end
|
170
204
|
|
171
205
|
include Init
|
@@ -53,9 +53,9 @@ module IsoDoc
|
|
53
53
|
def officeholder_style(para)
|
54
54
|
n = para.next_element
|
55
55
|
p = para.previous_element
|
56
|
-
n && n.name == "p" && n["type"]
|
56
|
+
n && n.name == "p" && n["type"] != "officeholder" and
|
57
57
|
klass = "IEEEStdsNamesCtrCxSpLast"
|
58
|
-
p && p.name == "p" && p["type"]
|
58
|
+
p && p.name == "p" && p["type"] != "officeholder" and
|
59
59
|
klass = "IEEEStdsNamesCtrCxSpFirst"
|
60
60
|
para["class"] = klass || "IEEEStdsNamesCtrCxSpMiddle"
|
61
61
|
end
|
@@ -68,7 +68,8 @@ module IsoDoc
|
|
68
68
|
BREAK
|
69
69
|
|
70
70
|
def officemember_style(docxml)
|
71
|
-
docxml.xpath("//p[@type = 'officemember']")
|
71
|
+
docxml.xpath("//p[@type = 'officemember' or @type = 'officeorgmember']")
|
72
|
+
.each do |p|
|
72
73
|
p["class"] = "IEEEStdsNamesList"
|
73
74
|
end
|
74
75
|
docxml.xpath("//p[@type = 'emeritus_sign']").each do |p|
|
@@ -85,6 +86,7 @@ module IsoDoc
|
|
85
86
|
|
86
87
|
def three_column_officemembers_split(div)
|
87
88
|
prev = false
|
89
|
+
div.xpath(".//div").each { |d| d.replace(d.children) }
|
88
90
|
div.elements.each_with_object([[]]) do |e, m|
|
89
91
|
member = e.name == "p" && e["type"] == "officemember"
|
90
92
|
(prev == member and m[-1] << e.to_xml) or m << [e.to_xml]
|
@@ -12,6 +12,14 @@ module IsoDoc
|
|
12
12
|
super
|
13
13
|
end
|
14
14
|
|
15
|
+
def convert1(docxml, filename, dir)
|
16
|
+
doctype = docxml.at(ns("//bibdata/ext/doctype"))
|
17
|
+
if %w(amendment corrigendum).include?(doctype&.text)
|
18
|
+
@header = html_doc_path("header_amd.html")
|
19
|
+
end
|
20
|
+
super
|
21
|
+
end
|
22
|
+
|
15
23
|
def default_fonts(options)
|
16
24
|
{ bodyfont: (if options[:script] == "Hans"
|
17
25
|
'"Source Han Sans",serif'
|
@@ -65,6 +73,10 @@ module IsoDoc
|
|
65
73
|
def middle_title_ieee(_docxml, out)
|
66
74
|
out.p(**{ class: "IEEEStdsTitle", style: "margin-top:70.0pt" }) do |p|
|
67
75
|
p << @meta.get[:full_doctitle]
|
76
|
+
@meta.get[:amd] || @meta.get[:corr] and p << "<br/>"
|
77
|
+
@meta.get[:amd] and p << "Amendment #{@meta.get[:amd]}"
|
78
|
+
@meta.get[:amd] && @meta.get[:corr] and p << " "
|
79
|
+
@meta.get[:corr] and p << "Corrigenda #{@meta.get[:corr]}"
|
68
80
|
end
|
69
81
|
end
|
70
82
|
|