metanorma-itu 2.4.6 → 2.4.8

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,4 +1,5 @@
1
1
  require "twitter_cldr"
2
+ require_relative "metadata_date"
2
3
 
3
4
  module IsoDoc
4
5
  module ITU
@@ -35,20 +36,20 @@ module IsoDoc
35
36
  slogantitle: "//bibdata/title[@type='slogan']",
36
37
  positiontitle: "//bibdata/title[@type='position-sp']" }.freeze
37
38
 
38
- def title(isoxml, _out)
39
+ def title(xml, _out)
39
40
  TITLE_XPATHS.each do |k, v|
40
- titleset(isoxml, k, v.sub("@_lang", @lang))
41
+ titleset(xml, k, v.sub("@_lang", @lang))
41
42
  end
42
- titleset(isoxml, :doctitle_en,
43
+ titleset(xml, :doctitle_en,
43
44
  "//bibdata/title[@language='en'][@type = 'main']") or
44
- titleset(isoxml, :doctitle_en,
45
+ titleset(xml, :doctitle_en,
45
46
  "//bibdata/title[@language='#{@lang}'][@type = 'main']")
46
47
  end
47
48
 
48
- def titleset(isoxml, key, xpath)
49
- value = isoxml.at(ns(xpath)) or return
50
- out = @isodoc.noko do |xml|
51
- xml.span do |s|
49
+ def titleset(xml, key, xpath)
50
+ value = xml.at(ns(xpath)) or return
51
+ out = @isodoc.noko do |x|
52
+ x.span do |s|
52
53
  value.children.each { |c| @isodoc.parse(c, s) }
53
54
  end
54
55
  end.join
@@ -56,7 +57,7 @@ module IsoDoc
56
57
  true
57
58
  end
58
59
 
59
- def subtitle(_isoxml, _out)
60
+ def subtitle(_xml, _out)
60
61
  nil
61
62
  end
62
63
 
@@ -101,12 +102,11 @@ module IsoDoc
101
102
  @metadata[key] << value
102
103
  end
103
104
 
104
- PERSON_ATTRS = { affiliations: "./affiliation/organization/name",
105
- addresses: "./affiliation/organization/address/" \
106
- "formattedAddress",
107
- emails: "./email",
108
- faxes: "./phone[@type = 'fax']",
109
- phones: "./phone[not(@type = 'fax')]" }.freeze
105
+ PERSON_ATTRS =
106
+ { affiliations: "./affiliation/organization/name",
107
+ addresses: "./affiliation/organization/address/formattedAddress",
108
+ emails: "./email", faxes: "./phone[@type = 'fax']",
109
+ phones: "./phone[not(@type = 'fax')]" }.freeze
110
110
 
111
111
  def person_attributes(authors)
112
112
  PERSON_ATTRS.each_key { |k| set(k, []) }
@@ -117,21 +117,21 @@ module IsoDoc
117
117
  end
118
118
  end
119
119
 
120
- def docid(isoxml, _out)
120
+ def docid(xml, _out)
121
121
  { docnumber: "ITU", recommendationnumber: "ITU-Recommendation",
122
122
  docnumber_lang: "ITU-lang", docnumber_td: "ITU-TemporaryDocument",
123
123
  docnumber_provisional: "ITU-provisional" }
124
124
  .each do |k, v|
125
- dn = isoxml.at(ns("//bibdata/docidentifier[@type = '#{v}']")) and
125
+ dn = xml.at(ns("//bibdata/docidentifier[@type = '#{v}']")) and
126
126
  set(k, dn.text)
127
127
  end
128
- dn = isoxml.at(ns("//bibdata/ext/structuredidentifier/annexid"))
129
- oblig = isoxml.at(ns("//annex/@obligation"))&.text
128
+ dn = xml.at(ns("//bibdata/ext/structuredidentifier/annexid"))
129
+ oblig = xml.at(ns("//annex/@obligation"))&.text
130
130
  lbl = oblig == "informative" ? @labels["appendix"] : @labels["annex"]
131
131
  dn and set(:annexid, @i18n.l10n("#{lbl} #{dn.text}"))
132
- dn = isoxml.at(ns("//bibdata/ext/structuredidentifier/amendment")) and
132
+ dn = xml.at(ns("//bibdata/ext/structuredidentifier/amendment")) and
133
133
  set(:amendmentid, @i18n.l10n("#{@labels['amendment']} #{dn.text}"))
134
- dn = isoxml.at(ns("//bibdata/ext/structuredidentifier/corrigendum")) and
134
+ dn = xml.at(ns("//bibdata/ext/structuredidentifier/corrigendum")) and
135
135
  set(:corrigendumid,
136
136
  @i18n.l10n("#{@labels['corrigendum']} #{dn.text}"))
137
137
  end
@@ -140,36 +140,27 @@ module IsoDoc
140
140
  %w(in-force-prepublished draft).include? status.downcase
141
141
  end
142
142
 
143
- def bibdate(isoxml, _out)
144
- pubdate = isoxml.at(ns("//bibdata/date[not(@format)][@type = 'published']"))
145
- pubdate and set(:pubdate_monthyear, monthyr(pubdate.text))
146
- pubdate = isoxml.at(ns("//bibdata/date[@format = 'ddMMMyyyy'][@type = 'published']"))
147
- pubdate and set(:pubdate_ddMMMyyyy, monthyr(pubdate.text))
148
- pubdate = isoxml.at(ns("//bibdata/date[not(@format)][@type = 'published']")) ||
149
- isoxml.at(ns("//bibdata/copyright/from"))
150
- pubdate and
151
- set(:placedate_year,
152
- @labels["placedate"]
153
- .sub("%", pubdate.text.sub(/^(\d\d\d\d).*$/, "\\1")))
143
+ def bibdate(xml, _out)
144
+ d = xml.at(ns("//bibdata/date[not(@format)][@type = 'published']"))
145
+ d and set(:pubdate_monthyear, monthyr(d.text))
146
+ d = xml.at(ns("//bibdata/date[@format = 'ddMMMyyyy'][@type = 'published']"))
147
+ d and set(:pubdate_ddMMMyyyy, monthyr(d.text))
148
+ d = xml.at(ns("//bibdata/date[not(@format)][@type = 'published']")) ||
149
+ xml.at(ns("//bibdata/copyright/from"))
150
+ d and set(:placedate_year, @labels["placedate"]
151
+ .sub("%", d.text.sub(/^(\d\d\d\d).*$/, "\\1")))
154
152
  end
155
153
 
156
- def monthyr(isodate)
157
- m = /(?<yr>\d\d\d\d)-(?<mo>\d\d)/.match isodate
158
- return isodate unless m && m[:yr] && m[:mo]
159
-
160
- "#{m[:mo]}/#{m[:yr]}"
161
- end
162
-
163
- def keywords(isoxml, _out)
154
+ def keywords(xml, _out)
164
155
  super
165
156
  set(:keywords, get[:keywords].sort)
166
- q = isoxml.xpath(ns("//bibdata/ext/question/identifier"))
157
+ q = xml.xpath(ns("//bibdata/ext/question/identifier"))
167
158
  q.empty? or set(:questions,
168
159
  q.map { |x| x.text.sub(/^Q/, "") }.join(", "))
169
160
  end
170
161
 
171
- def doctype(isoxml, _out)
172
- d = isoxml&.at(ns("//bibdata/ext/doctype"))&.text
162
+ def doctype(xml, _out)
163
+ d = xml&.at(ns("//bibdata/ext/doctype"))&.text
173
164
  set(:doctype_original, d)
174
165
  set(:doctype_abbreviated, @labels.dig("doctype_abbrev", d))
175
166
  if d == "recommendation-annex"
@@ -181,69 +172,40 @@ module IsoDoc
181
172
  set(:draft_new_doctype, @labels["draft_new"].sub("%", d))
182
173
  end
183
174
 
184
- def ip_notice_received(isoxml, _out)
185
- received = isoxml.at(ns("//bibdata/ext/ip-notice-received"))&.text ||
175
+ def ip_notice_received(xml, _out)
176
+ received = xml.at(ns("//bibdata/ext/ip-notice-received"))&.text ||
186
177
  "false"
187
178
  set(:ip_notice_received, received)
188
179
  end
189
180
 
190
- def ddMMMYYYY(isodate)
191
- m = /(?<yr>\d\d\d\d)-(?<mo>\d\d)-(?<dd>\d\d)/.match isodate
192
- return isodate unless m && m[:yr] && m[:mo] && m[:dd]
193
-
194
- mmm = DateTime.parse(isodate).localize(@lang.to_sym)
195
- .to_additional_s("yMMM")
196
- @i18n.l10n("#{m[:dd]} #{mmm}")
197
- end
198
-
199
- def ddMMMMYYYY(date1, date2)
200
- m1 = /(?<yr>\d\d\d\d)-(?<mo>\d\d)-(?<dd>\d\d)/.match date1
201
- m2 = /(?<yr>\d\d\d\d)-(?<mo>\d\d)-(?<dd>\d\d)/.match date2
202
- if m1 && m1[:yr] && m1[:mo] && m1[:dd]
203
- dd1 = m1[:dd].sub(/^0/, "")
204
- if m2 && m2[:yr] && m2[:mo] && m2[:dd]
205
- dd2 = m2[:dd].sub(/^0/, "")
206
- if m1[:yr] == m2[:yr]
207
- if m1[:mo] == m2[:mo]
208
- @i18n.l10n("#{dd1}&#x2013;#{dd2} #{months[m1[:mo].to_sym]} #{m1[:yr]}")
209
- else
210
- @i18n.l10n("#{dd1} #{months[m1[:mo].to_sym]} &#x2013; " \
211
- "#{dd2} #{months[m2[:mo].to_sym]} #{m1[:yr]}")
212
- end
213
- else
214
- @i18n.l10n("#{dd1} #{months[m1[:mo].to_sym]} #{m1[:yr]} &#x2013; " \
215
- "#{dd2} #{months[m2[:mo].to_sym]} #{m2[:yr]}")
216
- end
217
- else
218
- date2.nil? ? @i18n.l10n("#{dd1} #{months[m1[:mo].to_sym]} #{m1[:yr]}") : "#{date1}/#{date2}"
219
- end
220
- else
221
- date2.nil? ? date1 : "#{date1}/#{date2}"
222
- end
181
+ def contribution(xml, _out)
182
+ a = xml.at(ns("//bibdata/ext/timing")) and set(:timing, a.text)
183
+ a = xml.at(ns("//bibdata/ext/recommendationstatus/approvalstage/@process")) and
184
+ set(:approval_process, a.text)
223
185
  end
224
186
 
225
- def techreport(isoxml, _out)
226
- if a = isoxml.at(ns("//bibdata/ext/meeting"))&.text
187
+ def techreport(xml, _out)
188
+ if a = xml.at(ns("//bibdata/ext/meeting"))&.text
227
189
  set(:meeting, a)
228
190
  set(:meeting_acronym, a)
229
191
  end
230
- a = isoxml.at(ns("//bibdata/ext/meeting/@acronym"))&.text and
192
+ a = xml.at(ns("//bibdata/ext/meeting/@acronym"))&.text and
231
193
  set(:meeting_acronym, a)
232
- a = isoxml.at(ns("//bibdata/ext/meeting-place"))&.text and
194
+ a = xml.at(ns("//bibdata/ext/meeting-place"))&.text and
233
195
  set(:meeting_place, a)
234
- a = isoxml.at(ns("//bibdata/ext/intended-type"))&.text and
196
+ a = xml.at(ns("//bibdata/ext/intended-type"))&.text and
235
197
  set(:intended_type, a)
236
- a = isoxml.at(ns("//bibdata/ext/source"))&.text and set(:source, a)
237
- meeting(isoxml)
198
+ a = xml.at(ns("//bibdata/ext/source"))&.text and set(:source, a)
199
+ meeting(xml)
238
200
  end
239
201
 
240
- def meeting(isoxml)
202
+ def meeting(xml)
241
203
  resolution =
242
- isoxml.at(ns("//bibdata/ext/doctype"))&.text == "resolution"
243
- if o = isoxml.at(ns("//bibdata/ext/meeting-date/on"))&.text
204
+ xml.at(ns("//bibdata/ext/doctype"))&.text == "resolution"
205
+ if o = xml.at(ns("//bibdata/ext/meeting-date/on"))&.text
244
206
  set(:meeting_date, resolution ? ddMMMMYYYY(o, nil) : ddMMMYYYY(o))
245
- elsif f = isoxml.at(ns("//bibdata/ext/meeting-date/from"))&.text
246
- t = isoxml.at(ns("//bibdata/ext/meeting-date/to"))&.text
207
+ elsif f = xml.at(ns("//bibdata/ext/meeting-date/from"))&.text
208
+ t = xml.at(ns("//bibdata/ext/meeting-date/to"))&.text
247
209
  set(:meeting_date,
248
210
  resolution ? ddMMMMYYYY(f, t) : "#{ddMMMYYYY(f)}/#{ddMMMYYYY(t)}")
249
211
  end
@@ -0,0 +1,45 @@
1
+ module IsoDoc
2
+ module ITU
3
+ class Metadata < IsoDoc::Metadata
4
+ def monthyr(isodate)
5
+ m = /(?<yr>\d\d\d\d)-(?<mo>\d\d)/.match isodate
6
+ m && m[:yr] && m[:mo] or return isodate
7
+ "#{m[:mo]}/#{m[:yr]}"
8
+ end
9
+
10
+ def ddMMMYYYY(isodate)
11
+ m = /(?<yr>\d\d\d\d)-(?<mo>\d\d)-(?<dd>\d\d)/.match isodate
12
+ m && m[:yr] && m[:mo] && m[:dd] or return isodate
13
+ mmm = DateTime.parse(isodate).localize(@lang.to_sym)
14
+ .to_additional_s("yMMM")
15
+ @i18n.l10n("#{m[:dd]} #{mmm}")
16
+ end
17
+
18
+ def ddMMMMYYYY(date1, date2)
19
+ m1 = /(?<yr>\d\d\d\d)-(?<mo>\d\d)-(?<dd>\d\d)/.match date1
20
+ m2 = /(?<yr>\d\d\d\d)-(?<mo>\d\d)-(?<dd>\d\d)/.match date2
21
+ if m1 && m1[:yr] && m1[:mo] && m1[:dd]
22
+ dd1 = m1[:dd].sub(/^0/, "")
23
+ if m2 && m2[:yr] && m2[:mo] && m2[:dd]
24
+ dd2 = m2[:dd].sub(/^0/, "")
25
+ if m1[:yr] == m2[:yr]
26
+ if m1[:mo] == m2[:mo]
27
+ @i18n.l10n("#{dd1}&#x2013;#{dd2} #{months[m1[:mo].to_sym]} #{m1[:yr]}")
28
+ else
29
+ @i18n.l10n("#{dd1} #{months[m1[:mo].to_sym]} &#x2013; " \
30
+ "#{dd2} #{months[m2[:mo].to_sym]} #{m1[:yr]}")
31
+ end
32
+ else
33
+ @i18n.l10n("#{dd1} #{months[m1[:mo].to_sym]} #{m1[:yr]} &#x2013; " \
34
+ "#{dd2} #{months[m2[:mo].to_sym]} #{m2[:yr]}")
35
+ end
36
+ else
37
+ date2.nil? ? @i18n.l10n("#{dd1} #{months[m1[:mo].to_sym]} #{m1[:yr]}") : "#{date1}/#{date2}"
38
+ end
39
+ else
40
+ date2.nil? ? date1 : "#{date1}/#{date2}"
41
+ end
42
+ end
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,153 @@
1
+ module IsoDoc
2
+ module ITU
3
+ class PresentationXMLConvert < IsoDoc::PresentationXMLConvert
4
+ def contribution_table_insert_pt(docxml)
5
+ docxml.at(ns("//preface")) || docxml.at(ns("//sections"))
6
+ .add_previous_sibling("<preface> </preface>").first
7
+ docxml.at(ns("//preface")).children.first.before(" ").previous
8
+ end
9
+
10
+ def contribution_table(_doc)
11
+ @doctype == "contribution" or return
12
+ bureau = bold_and_upcase(@meta.get[:bureau_full])
13
+ <<~TABLE
14
+ <clause unnumbered="true" type="contribution-metadata">
15
+ <table class="contribution-metadata" unnumbered="true" width="100%">
16
+ <colgroup><col width="11.8%"/><col width="41.2%"/><col width="47.0%"/></colgroup>
17
+ <thead>
18
+ <tr><th rowspan="3"><image height="56" width="56" src="#{@meta.get[:logo_small]}"/></th>
19
+ <td rowspan="3"><p style="font-size:8pt;margin-top:6pt;margin-bottom:0pt;">#{@i18n.international_telecommunication_union.upcase}</p>
20
+ <p class="bureau_big" style="font-size:13pt;margin-top:6pt;margin-bottom:0pt;">#{bureau}</p>
21
+ <p style="font-size:10pt;margin-top:6pt;margin-bottom:0pt;">#{@i18n.studyperiod.sub('%', @meta.get[:study_group_period]).upcase}</p></th>
22
+ <th align="right"><p style="font-size:16pt;">#{@meta.get[:docnumber]}</p></th></tr>
23
+ <tr><th align="right"><p style="font-size:14pt;">#{@meta.get[:group].upcase}</p></th></tr>
24
+ <tr>
25
+ <th align="right"><p style="font-size:14pt;">#{@i18n.l10n("#{@i18n.original}: #{@i18n.current_language}")}</p></th>
26
+ </tr></thead>
27
+ <tbody>
28
+ <tr><th align="left" width="95">#{colon_i18n(@i18n.questions)}</th><td>#{@meta.get[:questions]}</td>
29
+ <td align="right">#{@i18n.l10n("#{@meta.get[:meeting_place]}, #{@meta.get[:meeting_date]}")}</td></tr>
30
+ <tr><th align="center" colspan="3">#{@i18n.get['doctype_dict']['contribution'].upcase}</th></tr>
31
+ <tr><th align="left" width="95">#{colon_i18n(@i18n.document_source)}</th><td colspan="2">#{@meta.get[:source]}</td></tr>
32
+ <tr><th align="left" width="95">#{colon_i18n(@i18n.title)}</th><td colspan="2">#{@meta.get[:doctitle_en]}</td></tr>
33
+ #{contribution_table_contacts}
34
+ </tbody></table>
35
+ </clause>
36
+ TABLE
37
+ end
38
+
39
+ def colon_i18n(text)
40
+ @i18n.l10n("#{text}:")
41
+ end
42
+
43
+ def bold_and_upcase(xml)
44
+ x = Nokogiri::XML("<root>#{xml}</root>")
45
+ x.traverse do |e|
46
+ e.text? or next
47
+ e.replace("<strong>#{e.text.upcase}</strong>")
48
+ end
49
+ x.root.children.to_xml
50
+ end
51
+
52
+ def contribution_table_contacts
53
+ n = (0..@meta.get[:authors]&.size).each_with_object([]) do |i, ret|
54
+ ret << contribution_table_contact(i)
55
+ end
56
+ n.map do |x|
57
+ lbl = colon_i18n(@i18n.contact)
58
+ "<tr><th align='left' width='95'>#{lbl}</th>#{x}</tr>"
59
+ end.join("\n")
60
+ end
61
+
62
+ def contribution_table_contact(idx)
63
+ @meta.get[:emails][idx] and
64
+ e = "<br/>#{@i18n.email}<tab/>#{@meta.get[:emails][idx]}"
65
+ <<~CELL
66
+ <td>#{@meta.get[:authors][idx]}<br/>
67
+ #{@meta.get[:affiliations][idx]}<br/>
68
+ #{@meta.get[:addresses][idx]}</td>
69
+ <td>#{@i18n.tel_abbrev}<tab/>#{@meta.get[:phones][idx]}#{e}</td>
70
+ CELL
71
+ end
72
+
73
+ def extract_clause_data(clause, type)
74
+ x = clause.at(ns("./clause[@type = '#{type}']")) or return
75
+ ret = x.dup
76
+ ret.at(ns("./title"))&.remove
77
+ ret.children.to_xml
78
+ end
79
+
80
+ def contribution_justification_contact(idx)
81
+ @meta.get[:emails][idx] and
82
+ e = ", #{@i18n.email}<tab/>#{@meta.get[:emails][idx]}"
83
+ <<~CELL
84
+ #{@meta.get[:authors][idx]}<br/>
85
+ #{@meta.get[:affiliations][idx]}<br/>
86
+ #{@meta.get[:addresses][idx]}#{e}
87
+ CELL
88
+ end
89
+
90
+ def contrib_justification_contacts
91
+ (0..@meta.get[:authors]&.size).each_with_object([]) do |i, ret|
92
+ ret << contribution_justification_contact(i)
93
+ end
94
+ end
95
+
96
+ def contribution_justification_title(_doc)
97
+ n = @meta.get[:docnumber]
98
+ if @meta.get[:subdoctype] == "recommendation"
99
+ "A.1 justification for proposed draft new Recommendation #{n}"
100
+ else
101
+ s = @meta.get[:subdoctype]
102
+ "A.13 justification for proposed draft new #{s} "\
103
+ "#{n} “#{@meta.get[:doctitle_en]}”"
104
+ end
105
+ end
106
+
107
+ def contribution_justification_auths
108
+ auths = contrib_justification_contacts
109
+ auths_tail = auths[1..auths.size].map do |x|
110
+ "<tr><td colspan='2'>#{x}</td></td>"
111
+ end.join("\n")
112
+ [auths, auths_tail]
113
+ end
114
+
115
+ def contribution_justification(doc)
116
+ @doctype == "contribution" or return
117
+ annex = doc.at(ns("//annex[@type = 'justification']")) or return
118
+ auths, auths_tail = contribution_justification_auths
119
+ annex.children = <<~TABLE
120
+ <title>#{contribution_justification_title(doc)}</title>
121
+ <table class="contribution-metadata" unnumbered="true" width="100%">
122
+ <colgroup><col width="15.9%"/><col width="6.1%"/><col width="45.5%"/><col width="17.4%"/><col width="15.1%"/></colgroup>
123
+ <tbody>
124
+ <tr>
125
+ <th align="left">#{colon_i18n(@i18n.questions)}</th><td>#{@meta.get[:questions]}</td>
126
+ <th align="left">Proposed new ITU-T #{@meta.get[:subdoctype]}</th>
127
+ <td colspan="2">#{@i18n.l10n("#{@meta.get[:meeting_place]}, #{@meta.get[:meeting_date]}")}</td>
128
+ </tr>
129
+ <tr><th align="left">Reference and title:</th>
130
+ <td colspan="4">Draft new #{@meta.get[:subdoctype]} on “#{@meta.get[:doctitle_en]}”</td>
131
+ </tr>
132
+ <tr>
133
+ <th align="left">Base text:</th><td colspan="2">#{extract_clause_data(annex, 'basetext')}</td>
134
+ <th align="left">Timing:</th><td>#{@meta.get[:timing]}</td>
135
+ </tr>
136
+ <tr><th align="left" rowspan="#{auths.size - 1}">Editor(s):</th>
137
+ <td colspan="2">#{auths[0]}</td>
138
+ <th align="left" rowspan="#{auths.size - 1}">Approval process:</th>
139
+ <td rowspan="#{auths.size - 1}">#{@meta.get[:approval_process]}</td>
140
+ </tr>
141
+ #{auths_tail}
142
+ <tr><td colspan="5"><p><strong>Scope</strong> (defines the intent or object of the Recommendation and the aspects covered, thereby indicating the limits of its applicability):</p>#{extract_clause_data(annex, 'scope')}</td></tr>
143
+ <tr><td colspan="5"><p><strong>Summary</strong> (provides a brief overview of the purpose and contents of the Recommendation, thus permitting readers to judge its usefulness for their work):</p>#{extract_clause_data(annex, 'summary')}</td></tr>
144
+ <tr><td colspan="5"><p><strong>Relations to ITU-T Recommendations or to other standards</strong> (approved or under development):</p>#{extract_clause_data(annex, 'relatedstandards')}</td></tr>
145
+ <tr><td colspan="5"><p><strong>Liaisons with other study groups or with other standards bodies:</strong></p>#{extract_clause_data(annex, 'liaisons')}</td></tr>
146
+ <tr><td colspan="5"><p><strong>Supporting members that are committing to contributing actively to the work item:</strong></p>#{extract_clause_data(annex, 'supportingmembers')}</td></tr>
147
+ </tbody>
148
+ </table>
149
+ TABLE
150
+ end
151
+ end
152
+ end
153
+ end
@@ -3,6 +3,7 @@ module IsoDoc
3
3
  class PresentationXMLConvert < IsoDoc::PresentationXMLConvert
4
4
  def insert_preface_sections(docxml)
5
5
  if @doctype == "contribution"
6
+ contribution_justification(docxml)
6
7
  x = contribution_table(docxml) and
7
8
  contribution_table_insert_pt(docxml).next = x
8
9
  else
@@ -18,74 +19,6 @@ module IsoDoc
18
19
  docxml.at(ns("//preface")).children[-1]
19
20
  end
20
21
 
21
- def contribution_table_insert_pt(docxml)
22
- docxml.at(ns("//preface")) || docxml.at(ns("//sections"))
23
- .add_previous_sibling("<preface> </preface>").first
24
- docxml.at(ns("//preface")).children.first.before(" ").previous
25
- end
26
-
27
- def contribution_table(_doc)
28
- @doctype == "contribution" or return
29
- bureau = bold_and_upcase(@meta.get[:bureau_full])
30
- <<~TABLE
31
- <clause unnumbered="true" type="contribution-metadata">
32
- <table class="contribution-metadata" unnumbered="true" width="100%">
33
- <colgroup><col width="11.8%"/><col width="41.2%"/><col width="47.0%"/></colgroup>
34
- <thead>
35
- <tr><th rowspan="3"><image height="56" width="56" src="#{@meta.get[:logo_small]}"/></th>
36
- <td rowspan="3"><p style="font-size:8pt;margin-top:6pt;margin-bottom:0pt;">#{@i18n.international_telecommunication_union.upcase}</p>
37
- <p class="bureau_big" style="font-size:13pt;margin-top:6pt;margin-bottom:0pt;">#{bureau}</p>
38
- <p style="font-size:10pt;margin-top:6pt;margin-bottom:0pt;">#{@i18n.studyperiod.sub('%', @meta.get[:study_group_period]).upcase}</p></th>
39
- <th align="right"><p style="font-size:16pt;">#{@meta.get[:docnumber]}</p></th></tr>
40
- <tr><th align="right"><p style="font-size:14pt;">#{@meta.get[:group].upcase}</p></th></tr>
41
- <tr>
42
- <th align="right"><p style="font-size:14pt;">#{@i18n.l10n("#{@i18n.original}: #{@i18n.current_language}")}</p></th>
43
- </tr></thead>
44
- <tbody>
45
- <tr><th align="left" width="95">#{colon_i18n(@i18n.questions)}</th><td>#{@meta.get[:questions]}</td>
46
- <td align="right">#{@i18n.l10n("#{@meta.get[:meeting_place]}, #{@meta.get[:meeting_date]}")}</td></tr>
47
- <tr><th align="center" colspan="3">#{@i18n.get['doctype_dict']['contribution'].upcase}</th></tr>
48
- <tr><th align="left" width="95">#{colon_i18n(@i18n.document_source)}</th><td colspan="2">#{@meta.get[:source]}</td></tr>
49
- <tr><th align="left" width="95">#{colon_i18n(@i18n.title)}</th><td colspan="2">#{@meta.get[:doctitle_en]}</td></tr>
50
- #{contribution_table_contacts}
51
- </tbody></table>
52
- </clause>
53
- TABLE
54
- end
55
-
56
- def colon_i18n(text)
57
- @i18n.l10n("#{text}:")
58
- end
59
-
60
- def bold_and_upcase(xml)
61
- x = Nokogiri::XML("<root>#{xml}</root>")
62
- x.traverse do |e|
63
- e.text? or next
64
- e.replace("<strong>#{e.text.upcase}</strong>")
65
- end
66
- x.root.children.to_xml
67
- end
68
-
69
- def contribution_table_contacts
70
- n = (0..@meta.get[:authors]&.size).each_with_object([]) do |i, ret|
71
- ret << contribution_table_contact(i)
72
- end
73
- n.map do |x|
74
- lbl = colon_i18n(@i18n.contact)
75
- "<tr><th align='left' width='95'>#{lbl}</th>#{x}</tr>"
76
- end.join("\n")
77
- end
78
-
79
- def contribution_table_contact(idx)
80
- <<~CELL
81
- <td>#{@meta.get[:authors][idx]}<br/>
82
- #{@meta.get[:affiliations][idx]}<br/>
83
- #{@meta.get[:addresses][idx]}</td>
84
- <td>#{@i18n.tel_abbrev}<tab/>#{@meta.get[:phones][idx]}<br/>
85
- #{@i18n.email}<tab/>#{@meta.get[:emails][idx]}</td>
86
- CELL
87
- end
88
-
89
22
  def insert_editors_clause(doc)
90
23
  ret = extract_editors(doc) or return
91
24
  eds = ret[:names].each_with_object([]).with_index do |(_x, acc), i|
@@ -140,15 +73,16 @@ module IsoDoc
140
73
 
141
74
  def keywords_abstract_swap(abstract, keywords, docxml)
142
75
  @doctype == "contribution" and return
143
- keywords or return
144
- if abstract then abstract.next = keywords
76
+ k = keywords or return
77
+ if abstract then abstract.next = k
145
78
  else
146
79
  p = contribution_table_insert_pt(docxml)
147
- p.next = keywords
80
+ p.next = k
148
81
  end
149
82
  end
150
83
 
151
84
  def abstract_render(abstract)
85
+ abstract or return
152
86
  @doctype == "contribution" or return
153
87
  abstract.at(ns("./title"))&.remove
154
88
  abstract.children = <<~TABLE
@@ -5,6 +5,7 @@ require_relative "../../relaton/render/general"
5
5
  require_relative "presentation_bibdata"
6
6
  require_relative "presentation_preface"
7
7
  require_relative "presentation_ref"
8
+ require_relative "presentation_contribution"
8
9
 
9
10
  module Nokogiri
10
11
  module XML
@@ -127,12 +128,6 @@ module IsoDoc
127
128
  type
128
129
  end
129
130
 
130
- def info(isoxml, out)
131
- @meta.ip_notice_received isoxml, out
132
- @meta.techreport isoxml, out
133
- super
134
- end
135
-
136
131
  def middle_title(isoxml)
137
132
  s = isoxml.at(ns("//sections")) or return
138
133
  titfn = isoxml.at(ns("//note[@type = 'title-footnote']"))