isodoc 1.2.2 → 1.2.7

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.
Files changed (53) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/rake.yml +64 -0
  3. data/isodoc.gemspec +3 -1
  4. data/lib/isodoc-yaml/i18n-fr.yaml +1 -1
  5. data/lib/isodoc/base_style/all.css +5 -1
  6. data/lib/isodoc/base_style/metanorma_word.css +6 -0
  7. data/lib/isodoc/base_style/metanorma_word.scss +6 -0
  8. data/lib/isodoc/base_style/reset.css +5 -1
  9. data/lib/isodoc/base_style/reset.scss +6 -1
  10. data/lib/isodoc/convert.rb +1 -14
  11. data/lib/isodoc/function/blocks.rb +1 -0
  12. data/lib/isodoc/function/cleanup.rb +1 -1
  13. data/lib/isodoc/function/references.rb +4 -2
  14. data/lib/isodoc/function/section.rb +13 -1
  15. data/lib/isodoc/function/table.rb +1 -0
  16. data/lib/isodoc/function/to_word_html.rb +4 -0
  17. data/lib/isodoc/function/utils.rb +1 -1
  18. data/lib/isodoc/html_function/html.rb +1 -0
  19. data/lib/isodoc/i18n.rb +8 -50
  20. data/lib/isodoc/metadata.rb +44 -111
  21. data/lib/isodoc/metadata_contributor.rb +90 -0
  22. data/lib/isodoc/metadata_date.rb +11 -0
  23. data/lib/isodoc/presentation_function/bibdata.rb +96 -0
  24. data/lib/isodoc/presentation_function/block.rb +14 -0
  25. data/lib/isodoc/presentation_function/inline.rb +27 -14
  26. data/lib/isodoc/presentation_xml_convert.rb +4 -0
  27. data/lib/isodoc/version.rb +1 -1
  28. data/lib/isodoc/word_function/body.rb +1 -0
  29. data/lib/isodoc/word_function/postprocess.rb +2 -2
  30. data/lib/isodoc/word_function/table.rb +3 -2
  31. data/lib/isodoc/xref.rb +1 -0
  32. data/lib/isodoc/xref/xref_anchor.rb +8 -3
  33. data/lib/isodoc/xref/xref_counter.rb +21 -7
  34. data/lib/isodoc/xref/xref_gen.rb +29 -6
  35. data/lib/isodoc/xref/xref_sect_gen.rb +1 -1
  36. data/lib/isodoc/xslfo_convert.rb +6 -1
  37. data/spec/assets/i18n.yaml +16 -0
  38. data/spec/isodoc/blocks_spec.rb +330 -215
  39. data/spec/isodoc/cleanup_spec.rb +3 -1
  40. data/spec/isodoc/i18n_spec.rb +68 -16
  41. data/spec/isodoc/inline_spec.rb +47 -5
  42. data/spec/isodoc/metadata_spec.rb +69 -19
  43. data/spec/isodoc/postproc_spec.rb +39 -3
  44. data/spec/isodoc/ref_spec.rb +3 -3
  45. data/spec/isodoc/section_spec.rb +134 -10
  46. data/spec/isodoc/table_spec.rb +306 -207
  47. data/spec/isodoc/terms_spec.rb +1 -1
  48. data/spec/isodoc/xref_spec.rb +46 -18
  49. data/spec/spec_helper.rb +6 -0
  50. metadata +35 -7
  51. data/.github/workflows/macos.yml +0 -42
  52. data/.github/workflows/ubuntu.yml +0 -62
  53. data/.github/workflows/windows.yml +0 -44
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: ae2344f96c7d3a7ca351c911b175bdfcd37e645473398772e736184e4b1efc46
4
- data.tar.gz: e0c0d19b58f5fcbe662f737389760119958afa7582ae68c9bc0c5c4dd1539674
3
+ metadata.gz: c1a16a6af5cb8621eb1dd8e14a2680e7858476d5ffc1007e45566928e9ebaef7
4
+ data.tar.gz: ef5696d693f602b825457939bfab6f1ccfd827a9f24cbfa975ee6120c603b264
5
5
  SHA512:
6
- metadata.gz: '0049d33cb7b840af705590e2a7253c8f3bebd6a7fc1dcabb17e61fbfbbcaeab4db2aa741245325bf1e7b5472e166682461e0ad944d75ab079de9f03826bab08b'
7
- data.tar.gz: df5c3ac115b0e2493e1c84bf5e51943fd7e22bb2dea6c39d67a310b9873cd719785c4b1987e84d92614d741ae75e6712830d536629c9ab261f27bcd97ec922cd
6
+ metadata.gz: f3f8718e404915ce3d9d7ad8de1b4f6c0eb6442c930ced3e05c6f1db25ee23324de1783c3fe96e41e86d765a705b7b41df78bd159ff1333f3809ed2682188cc6
7
+ data.tar.gz: 0ba52d047fb5b1119d1cf485eea60511066f5fec0152222123cedea05f346a7f2276a9ac90aede713d6ae14b3a2be4c5e41267ffdb4ccdff285b5d13350cd26c
@@ -0,0 +1,64 @@
1
+ # Auto-generated by Cimas: Do not edit it manually!
2
+ # See https://github.com/metanorma/cimas
3
+ name: rake
4
+
5
+ on:
6
+ push:
7
+ branches: [ master ]
8
+ pull_request:
9
+
10
+ jobs:
11
+ rake:
12
+ name: Test on Ruby ${{ matrix.ruby }} ${{ matrix.os }}
13
+ runs-on: ${{ matrix.os }}
14
+ continue-on-error: ${{ matrix.experimental }}
15
+ strategy:
16
+ fail-fast: false
17
+ matrix:
18
+ ruby: [ '2.6', '2.5', '2.4' ]
19
+ os: [ ubuntu-latest, windows-latest, macos-latest ]
20
+ experimental: [ false ]
21
+ include:
22
+ - ruby: '2.7'
23
+ os: 'ubuntu-latest'
24
+ experimental: true
25
+ - ruby: '2.7'
26
+ os: 'windows-latest'
27
+ experimental: true
28
+ - ruby: '2.7'
29
+ os: 'macos-latest'
30
+ experimental: true
31
+ steps:
32
+ - uses: actions/checkout@master
33
+
34
+ - name: Use Ruby
35
+ uses: ruby/setup-ruby@v1
36
+ with:
37
+ ruby-version: ${{ matrix.ruby }}
38
+ bundler-cache: true
39
+
40
+ - name: Install Inkscape macOS
41
+ if: matrix.os == 'macos-latest'
42
+ run: |
43
+ brew cask install inkscape
44
+ inkscape --version
45
+
46
+ - name: Install Inkscape Ubuntu
47
+ if: matrix.os == 'ubuntu-latest'
48
+ run: |
49
+ sudo add-apt-repository ppa:inkscape.dev/stable
50
+ sudo apt update
51
+ sudo apt install inkscape
52
+ inkscape --version
53
+
54
+ - name: Install Inkscape Windows
55
+ if: matrix.os == 'windows-latest'
56
+ run: |
57
+ choco install --no-progress -y inkscape
58
+ inkscape --version
59
+
60
+ - name: Update gems
61
+ run: bundle install --jobs 4 --retry 3
62
+
63
+ - name: Run specs
64
+ run: bundle exec rake
@@ -36,7 +36,9 @@ Gem::Specification.new do |spec|
36
36
  spec.add_dependency "html2doc", "~> 1.0.0"
37
37
  spec.add_dependency "liquid"
38
38
  spec.add_dependency "roman-numerals"
39
- spec.add_dependency "metanorma", "~> 1.1.0"
39
+ spec.add_dependency "metanorma", "~> 1.2.0"
40
+ spec.add_dependency "relaton-cli"
41
+ spec.add_dependency "gyoku", "~> 1.3"
40
42
 
41
43
  spec.add_development_dependency "rake", "~> 13.0"
42
44
  spec.add_development_dependency "byebug", "~> 9.1"
@@ -1,6 +1,6 @@
1
1
  term_def_boilerplate:
2
2
  scope: Domaine d'application
3
- symbolabbrev: Symboles et termes abrégés
3
+ symbolsabbrev: Symboles et termes abrégés
4
4
  abbrev: Termes abrégés
5
5
  symbols: Symboles
6
6
  table_of_contents: Sommaire
@@ -9,7 +9,7 @@ fieldset, form, label, legend,
9
9
  table, caption, tbody, tfoot, thead, tr, th, td,
10
10
  article, aside, canvas, details, embed,
11
11
  figure, figcaption, footer, header, hgroup,
12
- menu, nav, output, ruby, section, summary,
12
+ menu, output, ruby, section, summary,
13
13
  time, mark, audio, video {
14
14
  margin: 0;
15
15
  padding: 0; }
@@ -104,6 +104,10 @@ b, strong {
104
104
  div.document-stage-band, div.document-type-band {
105
105
  background-color: #333333; }
106
106
 
107
+ a.FootnoteRef + a.FootnoteRef:before {
108
+ content: ", ";
109
+ vertical-align: super; }
110
+
107
111
  #standard-band {
108
112
  background-color: #0AC442; }
109
113
 
@@ -16,6 +16,12 @@ td {
16
16
  tr {
17
17
  page-break-after: avoid; }
18
18
 
19
+ table.MsoISOTableBig tr {
20
+ page-break-inside: auto; }
21
+
22
+ table.MsoISOTableBig td {
23
+ page-break-inside: auto; }
24
+
19
25
  span.stem {
20
26
  font-family: "Cambria Math",serif;
21
27
  mso-ascii-font-family: "Cambria Math";
@@ -13,6 +13,12 @@ table.MsoISOTable tr
13
13
  td { page-break-inside:avoid; }
14
14
  tr { page-break-after:avoid; }
15
15
 
16
+ table.MsoISOTableBig tr
17
+ {page-break-inside:auto;}
18
+
19
+ table.MsoISOTableBig td
20
+ {page-break-inside:auto;}
21
+
16
22
  span.stem
17
23
  {font-family:"Cambria Math",serif;
18
24
  mso-ascii-font-family:"Cambria Math";
@@ -9,7 +9,7 @@ fieldset, form, label, legend,
9
9
  table, caption, tbody, tfoot, thead, tr, th, td,
10
10
  article, aside, canvas, details, embed,
11
11
  figure, figcaption, footer, header, hgroup,
12
- menu, nav, output, ruby, section, summary,
12
+ menu, output, ruby, section, summary,
13
13
  time, mark, audio, video {
14
14
  margin: 0;
15
15
  padding: 0; }
@@ -103,3 +103,7 @@ b, strong {
103
103
 
104
104
  div.document-stage-band, div.document-type-band {
105
105
  background-color: #333333; }
106
+
107
+ a.FootnoteRef + a.FootnoteRef:before {
108
+ content: ", ";
109
+ vertical-align: super; }
@@ -9,7 +9,7 @@ fieldset, form, label, legend,
9
9
  table, caption, tbody, tfoot, thead, tr, th, td,
10
10
  article, aside, canvas, details, embed,
11
11
  figure, figcaption, footer, header, hgroup,
12
- menu, nav, output, ruby, section, summary,
12
+ menu, output, ruby, section, summary,
13
13
  time, mark, audio, video {
14
14
  margin: 0;
15
15
  padding: 0;
@@ -127,3 +127,8 @@ b, strong {
127
127
  div.document-stage-band, div.document-type-band {
128
128
  background-color: #333333;
129
129
  }
130
+
131
+ a.FootnoteRef + a.FootnoteRef:before {
132
+ content: ", ";
133
+ vertical-align: super;
134
+ }
@@ -116,20 +116,7 @@ module IsoDoc
116
116
  end
117
117
 
118
118
  # none for this parent gem, but will be populated in child gems
119
- # which have access to stylesheets &c; e.g.
120
- # {
121
- # htmlstylesheet: html_doc_path("htmlstyle.scss"),
122
- # htmlcoverpage: html_doc_path("html_rsd_titlepage.html"),
123
- # htmlintropage: html_doc_path("html_rsd_intro.html"),
124
- # scripts: html_doc_path("scripts.html"),
125
- # wordstylesheet: html_doc_path("wordstyle.scss"),
126
- # standardstylesheet: html_doc_path("rsd.scss"),
127
- # header: html_doc_path("header.html"),
128
- # wordcoverpage: html_doc_path("word_rsd_titlepage.html"),
129
- # wordintropage: html_doc_path("word_rsd_intro.html"),
130
- # ulstyle: l3
131
- # olstyle: l2
132
- # }
119
+ # which have access to stylesheets &c
133
120
  def default_file_locations(_options)
134
121
  {}
135
122
  end
@@ -181,6 +181,7 @@ module IsoDoc::Function
181
181
  def quote_attribution(node, out)
182
182
  author = node.at(ns("./author"))
183
183
  source = node.at(ns("./source"))
184
+ return if author.nil? && source.nil?
184
185
  out.p **{ class: "QuoteAttribution" } do |p|
185
186
  p << "&mdash; #{author.text}" if author
186
187
  p << ", " if author && source
@@ -6,9 +6,9 @@ module IsoDoc::Function
6
6
 
7
7
  def termref_cleanup(docxml)
8
8
  docxml.
9
+ gsub(/\s*\[MODIFICATION\]\s*\[\/TERMREF\]/, l10n(", #{@i18n.modified} [/TERMREF]")).
9
10
  gsub(%r{\s*\[/TERMREF\]\s*</p>\s*<p>\s*\[TERMREF\]}, "; ").
10
11
  gsub(/\[TERMREF\]\s*/, l10n("[#{@i18n.source}: ")).
11
- gsub(/\s*\[MODIFICATION\]\s*\[\/TERMREF\]/, l10n(", #{@i18n.modified} [/TERMREF]")).
12
12
  gsub(%r{\s*\[\/TERMREF\]\s*}, l10n("]")).
13
13
  gsub(/\s*\[MODIFICATION\]/, l10n(", #{@i18n.modified} &mdash; "))
14
14
  end
@@ -54,7 +54,8 @@ module IsoDoc::Function
54
54
  def bibitem_ref_code(b)
55
55
  id = b.at(ns("./docidentifier[@type = 'metanorma']"))
56
56
  id1 = pref_ref_code(b)
57
- id2 = b.at(ns("./docidentifier[@type = 'DOI' or @type = 'ISSN' or @type = 'ISBN']"))
57
+ id2 = b.at(ns("./docidentifier[@type = 'DOI' or @type = 'ISSN' or "\
58
+ "@type = 'ISBN']"))
58
59
  return [id, id1, id2] if id || id1 || id2
59
60
  id = Nokogiri::XML::Node.new("docidentifier", b.document)
60
61
  id << "(NO ID)"
@@ -193,7 +194,8 @@ module IsoDoc::Function
193
194
  def bibliography_parse(node, out)
194
195
  title = node&.at(ns("./title"))&.text || ""
195
196
  out.div do |div|
196
- clause_parse_title(node, div, node.at(ns("./title")), out, { class: "Section3" })
197
+ clause_parse_title(node, div, node.at(ns("./title")), out,
198
+ { class: "Section3" })
197
199
  biblio_list(node, div, true)
198
200
  end
199
201
  end
@@ -182,7 +182,6 @@ module IsoDoc::Function
182
182
  page_break(out)
183
183
  out.div **attr_code(id: f["id"]) do |s|
184
184
  clause_name(nil, f.at(ns("./title")), s, { class: "AbstractTitle" })
185
- #s.h1(**{ class: "AbstractTitle" }) { |h1| h1 << @i18n.abstract }
186
185
  f.elements.each { |e| parse(e, s) unless e.name == "title" }
187
186
  end
188
187
  end
@@ -201,6 +200,19 @@ module IsoDoc::Function
201
200
  end
202
201
  end
203
202
 
203
+ def is_clause?(name)
204
+ %w(clause references definitions terms foreword introduction abstract
205
+ acknowledgements).include? name
206
+ end
207
+
208
+ def preface_block(isoxml, out)
209
+ p = isoxml.at(ns("//preface")) or return
210
+ p.elements.each do |e|
211
+ next if is_clause?(e.name)
212
+ parse(e, out)
213
+ end
214
+ end
215
+
204
216
  def copyright_parse(node, out)
205
217
  out.div **{class: "boilerplate-copyright"} do |div|
206
218
  node.children.each { |n| parse(n, div) }
@@ -82,6 +82,7 @@ module IsoDoc::Function
82
82
  def make_tr_attr(td, row, totalrows, header)
83
83
  style = td.name == "th" ? "font-weight:bold;" : ""
84
84
  td["align"] and style += "text-align:#{td['align']};"
85
+ td["valign"] and style += "vertical-align:#{td['valign']};"
85
86
  rowmax = td["rowspan"] ? row + td["rowspan"].to_i - 1 : row
86
87
  style += <<~STYLE
87
88
  border-top:#{row.zero? ? "#{SW} 1.5pt;" : 'none;'}
@@ -80,6 +80,7 @@ module IsoDoc::Function
80
80
  def make_body3(body, docxml)
81
81
  body.div **{ class: "main-section" } do |div3|
82
82
  boilerplate docxml, div3
83
+ preface_block docxml, div3
83
84
  abstract docxml, div3
84
85
  foreword docxml, div3
85
86
  introduction docxml, div3
@@ -95,6 +96,7 @@ module IsoDoc::Function
95
96
  @meta.subtitle isoxml, out
96
97
  @meta.docstatus isoxml, out
97
98
  @meta.docid isoxml, out
99
+ @meta.otherid isoxml, out
98
100
  @meta.docnumeric isoxml, out
99
101
  @meta.doctype isoxml, out
100
102
  @meta.author isoxml, out
@@ -103,6 +105,7 @@ module IsoDoc::Function
103
105
  @meta.version isoxml, out
104
106
  @meta.url isoxml, out
105
107
  @meta.keywords isoxml, out
108
+ @meta.note isoxml, out
106
109
  @meta.get
107
110
  end
108
111
 
@@ -220,6 +223,7 @@ module IsoDoc::Function
220
223
  when "feedback-statement" then feedback_parse(node, out)
221
224
  when "passthrough" then passthrough_parse(node, out)
222
225
  when "variant" then variant_parse(node, out)
226
+ when "amend" then amend_parse(node, out)
223
227
  when "tab" then clausedelimspace(out) # in Presentation XML only
224
228
  else
225
229
  error_parse(node, out)
@@ -184,7 +184,7 @@ module IsoDoc::Function
184
184
 
185
185
  def labelled_ancestor(node)
186
186
  !node.ancestors('example, requirement, recommendation, permission, '\
187
- 'table, figure, sourcecode').empty?
187
+ 'note, table, figure, sourcecode').empty?
188
188
  end
189
189
  end
190
190
  end
@@ -31,6 +31,7 @@ module IsoDoc::HtmlFunction
31
31
  def make_body3(body, docxml)
32
32
  body.div **{ class: "main-section" } do |div3|
33
33
  boilerplate docxml, div3
34
+ preface_block docxml, div3
34
35
  abstract docxml, div3
35
36
  foreword docxml, div3
36
37
  introduction docxml, div3
@@ -1,6 +1,5 @@
1
1
  require "yaml"
2
2
 
3
- # TODO: Cleanup and generalize
4
3
  module IsoDoc
5
4
  class I18n
6
5
  def load_yaml(lang, script, i18nyaml = nil)
@@ -43,55 +42,6 @@ module IsoDoc
43
42
  @labels.each do |k, v|
44
43
  self.class.send(:define_method, k.downcase) { v }
45
44
  end
46
- =begin
47
- @term_def_boilerplate = y["term_def_boilerplate"]
48
- @scope_lbl = y["scope"]
49
- @symbols_lbl = y["symbols"]
50
- @table_of_contents_lbl = y["table_of_contents"]
51
- @introduction_lbl = y["introduction"]
52
- @foreword_lbl = y["foreword"]
53
- @abstract_lbl = y["abstract"]
54
- @termsdef_lbl = y["termsdef"]
55
- @termsdefsymbols_lbl = y["termsdefsymbols"]
56
- @normref_lbl = y["normref"]
57
- @bibliography_lbl = y["bibliography"]
58
- @clause_lbl = y["clause"]
59
- @annex_lbl = y["annex"]
60
- @appendix_lbl = y["appendix"]
61
- @no_terms_boilerplate = y["no_terms_boilerplate"]
62
- @internal_terms_boilerplate = y["internal_terms_boilerplate"]
63
- @norm_with_refs_pref = y["norm_with_refs_pref"]
64
- @norm_empty_pref = y["norm_empty_pref"]
65
- @external_terms_boilerplate = y["external_terms_boilerplate"]
66
- @internal_external_terms_boilerplate =
67
- y["internal_external_terms_boilerplate"]
68
- @note_lbl = y["note"]
69
- @note_xref_lbl = y["note_xref"]
70
- @termnote_lbl = y["termnote"]
71
- @figure_lbl = y["figure"]
72
- @list_lbl = y["list"]
73
- @formula_lbl = y["formula"]
74
- @inequality_lbl = y["inequality"]
75
- @table_lbl = y["table"]
76
- @key_lbl = y["key"]
77
- @example_lbl = y["example"]
78
- @example_xref_lbl = y["example_xref"]
79
- @where_lbl = y["where"]
80
- @wholeoftext_lbl = y["wholeoftext"]
81
- @draft_lbl = y["draft_label"]
82
- @inform_annex_lbl = y["inform_annex"]
83
- @norm_annex_lbl = y["norm_annex"]
84
- @modified_lbl = y["modified"]
85
- @deprecated_lbl = y["deprecated"]
86
- @source_lbl = y["source"]
87
- @and_lbl = y["and"]
88
- @all_parts_lbl = y["all_parts"]
89
- @permission_lbl = y["permission"]
90
- @recommendation_lbl = y["recommendation"]
91
- @requirement_lbl = y["requirement"]
92
- @locality = y["locality"]
93
- @admonition = y["admonition"]
94
- =end
95
45
  end
96
46
 
97
47
  def self.l10n(x, lang = @lang, script = @script)
@@ -116,6 +66,14 @@ module IsoDoc
116
66
  end
117
67
  end
118
68
 
69
+ def multiple_and(names, andword)
70
+ return '' if names.empty?
71
+ return names[0] if names.length == 1
72
+ (names.length == 2) &&
73
+ (return l10n("#{names[0]} #{andword} #{names[1]}", @lang, @script))
74
+ l10n(names[0..-2].join(', ') + " #{andword} #{names[-1]}", @lang, @script)
75
+ end
76
+
119
77
  #module_function :l10n
120
78
 
121
79
  end
@@ -1,14 +1,10 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require_relative './metadata_date'
4
+ require_relative './metadata_contributor'
4
5
 
5
6
  module IsoDoc
6
7
  class Metadata
7
- DATETYPES = %w{published accessed created implemented obsoleted confirmed
8
- updated issued received transmitted copied unchanged
9
- circulated vote-started
10
- vote-ended}.freeze
11
-
12
8
  attr_accessor :fonts_options
13
9
 
14
10
  def ns(xpath)
@@ -20,7 +16,7 @@ module IsoDoc
20
16
  end
21
17
 
22
18
  def initialize(lang, script, i18n, fonts_options = {})
23
- @metadata = {}
19
+ @metadata = { lang: lang, script: script }
24
20
  DATETYPES.each { |w| @metadata["#{w.gsub(/-/, '_')}date".to_sym] = 'XXX' }
25
21
  @lang = lang
26
22
  @script = script
@@ -42,113 +38,37 @@ module IsoDoc
42
38
  @metadata[key] = value
43
39
  end
44
40
 
45
- def extract_person_names(authors)
46
- authors.reduce([]) do |ret, a|
47
- if a.at(ns('./name/completename'))
48
- ret << a.at(ns('./name/completename')).text
49
- else
50
- fn = []
51
- forenames = a.xpath(ns('./name/forename'))
52
- forenames.each { |f| fn << f.text }
53
- surname = a&.at(ns('./name/surname'))&.text
54
- ret << fn.join(' ') + ' ' + surname
55
- end
56
- end
57
- end
41
+ NOLANG = "[not(@language) or @language = '']".freeze
58
42
 
59
- def extract_person_affiliations(authors)
60
- authors.reduce([]) do |m, a|
61
- name = a&.at(ns('./affiliation/organization/name'))&.text
62
- location = a&.at(ns('./affiliation/organization/address/'\
63
- 'formattedAddress'))&.text
64
- m << (!name.nil? && !location.nil? ? "#{name}, #{location}" :
65
- (name || location || ''))
66
- m
67
- end
68
- end
69
-
70
- def extract_person_names_affiliations(authors)
71
- names = extract_person_names(authors)
72
- affils = extract_person_affiliations(authors)
73
- ret = {}
74
- affils.each_with_index do |a, i|
75
- ret[a] ||= []
76
- ret[a] << names[i]
77
- end
78
- ret
79
- end
80
-
81
- def personal_authors(isoxml)
82
- authors = isoxml.xpath(ns("//bibdata/contributor[role/@type = 'author' "\
83
- "or xmlns:role/@type = 'editor']/person"))
84
- set(:authors, extract_person_names(authors))
85
- set(:authors_affiliations, extract_person_names_affiliations(authors))
86
- end
87
-
88
- def author(xml, _out)
89
- personal_authors(xml)
90
- agency(xml)
91
- end
92
-
93
- def bibdate(isoxml, _out)
94
- isoxml.xpath(ns('//bibdata/date')).each do |d|
95
- set("#{d['type'].gsub(/-/, '_')}date".to_sym, Common::date_range(d))
96
- end
43
+ def currlang
44
+ "[@language = '#{@lang}']"
97
45
  end
98
46
 
99
47
  def doctype(isoxml, _out)
100
- b = isoxml&.at(ns('//bibdata/ext/doctype'))&.text || return
101
- t = b.split(/[- ]/).map(&:capitalize).join(' ')
102
- set(:doctype, t)
103
- end
104
-
105
- def iso?(org)
106
- name = org&.at(ns('./name'))&.text
107
- abbrev = org&.at(ns('./abbreviation'))&.text
108
- (abbrev == 'ISO' ||
109
- name == 'International Organization for Standardization')
110
- end
111
-
112
- def agency(xml)
113
- agency = ''
114
- publisher = []
115
- xml.xpath(ns("//bibdata/contributor[xmlns:role/@type = 'publisher']/"\
116
- 'organization')).each do |org|
117
- name = org&.at(ns('./name'))&.text
118
- agency1 = org&.at(ns('./abbreviation'))&.text || name
119
- publisher << name if name
120
- agency = iso?(org) ? "ISO/#{agency}" : "#{agency}#{agency1}/"
121
- end
122
- set(:agency, agency.sub(%r{/$}, ''))
123
- set(:publisher, multiple_and(publisher, @labels['and']))
124
- end
125
-
126
- def multiple_and(names, andword)
127
- return '' if names.empty?
128
- return names[0] if names.length == 1
129
- (names.length == 2) &&
130
- (return l10n("#{names[0]} #{andword} #{names[1]}", @lang, @script))
131
- l10n(names[0..-2].join(', ') + " #{andword} #{names[-1]}", @lang, @script)
48
+ b = isoxml&.at(ns("//bibdata/ext/doctype#{NOLANG}"))&.text || return
49
+ set(:doctype, status_print(b))
50
+ b1 = isoxml&.at(ns("//bibdata/ext/doctype#{currlang}"))&.text || b
51
+ set(:doctype_display, status_print(b1))
132
52
  end
133
53
 
134
- def docstatus(isoxml, _out)
135
- docstatus = isoxml.at(ns('//bibdata/status/stage'))
54
+ def docstatus(xml, _out)
136
55
  set(:unpublished, true)
137
- if docstatus
138
- set(:stage, status_print(docstatus.text))
139
- (i = isoxml&.at(ns('//bibdata/status/substage'))&.text) &&
140
- set(:substage, i)
141
- (i = isoxml&.at(ns('//bibdata/status/iteration'))&.text) &&
142
- set(:iteration, i)
143
- set(:unpublished, unpublished(docstatus.text))
144
- unpublished(docstatus.text) &&
145
- set(:stageabbr, stage_abbr(docstatus.text))
146
- end
56
+ return unless s = xml.at(ns("//bibdata/status/stage#{NOLANG}"))
57
+ s1 = xml.at(ns("//bibdata/status/stage#{currlang}")) || s
58
+ set(:stage, status_print(s.text))
59
+ s1 and set(:stage_display, status_print(s1.text))
60
+ (i = xml&.at(ns("//bibdata/status/substage#{NOLANG}"))&.text) and
61
+ set(:substage, i)
62
+ (i1 = xml&.at(ns("//bibdata/status/substage#{currlang}"))&.text || i) and
63
+ set(:substage_display, i1)
64
+ (i2 = xml&.at(ns('//bibdata/status/iteration'))&.text) and
65
+ set(:iteration, i2)
66
+ set(:unpublished, unpublished(s.text))
67
+ unpublished(s.text) && set(:stageabbr, stage_abbr(s.text))
147
68
  end
148
69
 
149
70
  def stage_abbr(docstatus)
150
- status_print(docstatus).split(/ /)
151
- .map { |s| s[0].upcase }.join('')
71
+ status_print(docstatus).split(/ /).map { |s| s[0].upcase }.join('')
152
72
  end
153
73
 
154
74
  def unpublished(status)
@@ -156,7 +76,7 @@ module IsoDoc
156
76
  end
157
77
 
158
78
  def status_print(status)
159
- status.split(/-/).map(&:capitalize).join(' ')
79
+ status.split(/[- ]/).map(&:capitalize).join(' ')
160
80
  end
161
81
 
162
82
  def docid(isoxml, _out)
@@ -164,18 +84,23 @@ module IsoDoc
164
84
  set(:docnumber, dn&.text)
165
85
  end
166
86
 
87
+ def otherid(isoxml, _out)
88
+ dn = isoxml.at(ns('//bibdata/docidentifier[@type = "ISBN"]'))
89
+ set(:isbn, dn&.text)
90
+ dn = isoxml.at(ns('//bibdata/docidentifier[@type = "ISBN10"]'))
91
+ set(:isbn10, dn&.text)
92
+ end
93
+
167
94
  def docnumeric(isoxml, _out)
168
95
  dn = isoxml.at(ns('//bibdata/docnumber'))
169
96
  set(:docnumeric, dn&.text)
170
97
  end
171
98
 
172
99
  def draftinfo(draft, revdate)
173
- draftinfo = ''
174
- if draft
175
- draftinfo = " (#{@labels['draft_label']} #{draft}"
176
- draftinfo += ", #{revdate}" if revdate
177
- draftinfo += ')'
178
- end
100
+ return "" unless draft
101
+ draftinfo = " (#{@labels['draft_label']} #{draft}"
102
+ draftinfo += ", #{revdate}" if revdate
103
+ draftinfo += ')'
179
104
  l10n(draftinfo, @lang, @script)
180
105
  end
181
106
 
@@ -191,7 +116,7 @@ module IsoDoc
191
116
  end
192
117
 
193
118
  def title(isoxml, _out)
194
- main = isoxml&.at(ns("//bibdata/title[@language='en']"))&.text
119
+ main = isoxml&.at(ns("//bibdata/title[@language='#{@lang}']"))&.text
195
120
  set(:doctitle, main)
196
121
  end
197
122
 
@@ -231,5 +156,13 @@ module IsoDoc
231
156
  isoxml.xpath(ns('//bibdata/keyword')).each { |kw| ret << kw.text }
232
157
  set(:keywords, ret)
233
158
  end
159
+
160
+ def note(isoxml, _out)
161
+ ret = []
162
+ isoxml.xpath(ns("//bibdata/note[@type = 'title-footnote']")).each do |n|
163
+ ret << n.text
164
+ end
165
+ set(:title_footnote, ret)
166
+ end
234
167
  end
235
168
  end