isodoc 1.2.6 → 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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: dcbc3f4f71f739273b06483080ad077fcda05b20f8eca96858300543b0fb2784
4
- data.tar.gz: f0c4a29519de6c22dbc47af2193d8f4ee0a2c925c5d0c9f58414813be28070ef
3
+ metadata.gz: c1a16a6af5cb8621eb1dd8e14a2680e7858476d5ffc1007e45566928e9ebaef7
4
+ data.tar.gz: ef5696d693f602b825457939bfab6f1ccfd827a9f24cbfa975ee6120c603b264
5
5
  SHA512:
6
- metadata.gz: 5eb17f999c954a1185f60807f5c9b4dcdde33391fd95546d51dca4a00aee8d742736155313153a5007205d06d189c5ee69b39152db57478669e54e7622fde568
7
- data.tar.gz: e0122186b16428b61c7009d7c8560ab12de531a8ec3bac56e58e89528f4a2a0acd2e1ab4ce4453919f7ed2707e7724037175852a3dc148a53bb0eef63aa5f695
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,8 +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
40
  spec.add_dependency "relaton-cli"
41
+ spec.add_dependency "gyoku", "~> 1.3"
41
42
 
42
43
  spec.add_development_dependency "rake", "~> 13.0"
43
44
  spec.add_development_dependency "byebug", "~> 9.1"
@@ -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
 
@@ -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; }
@@ -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
@@ -96,6 +96,7 @@ module IsoDoc::Function
96
96
  @meta.subtitle isoxml, out
97
97
  @meta.docstatus isoxml, out
98
98
  @meta.docid isoxml, out
99
+ @meta.otherid isoxml, out
99
100
  @meta.docnumeric isoxml, out
100
101
  @meta.doctype isoxml, out
101
102
  @meta.author isoxml, out
@@ -1,6 +1,7 @@
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
@@ -15,7 +16,7 @@ module IsoDoc
15
16
  end
16
17
 
17
18
  def initialize(lang, script, i18n, fonts_options = {})
18
- @metadata = {}
19
+ @metadata = { lang: lang, script: script }
19
20
  DATETYPES.each { |w| @metadata["#{w.gsub(/-/, '_')}date".to_sym] = 'XXX' }
20
21
  @lang = lang
21
22
  @script = script
@@ -37,122 +38,33 @@ module IsoDoc
37
38
  @metadata[key] = value
38
39
  end
39
40
 
40
- def extract_person_names(authors)
41
- authors.reduce([]) do |ret, a|
42
- if a.at(ns('./name/completename'))
43
- ret << a.at(ns('./name/completename')).text
44
- else
45
- fn = []
46
- forenames = a.xpath(ns('./name/forename'))
47
- forenames.each { |f| fn << f.text }
48
- surname = a&.at(ns('./name/surname'))&.text
49
- ret << fn.join(' ') + ' ' + surname
50
- end
51
- end
52
- end
53
-
54
- def extract_person_affiliations(authors)
55
- authors.reduce([]) do |m, a|
56
- name = a&.at(ns('./affiliation/organization/name'))&.text
57
- location = a&.at(ns('./affiliation/organization/address/'\
58
- 'formattedAddress'))&.text
59
- m << (!name.nil? && !location.nil? ? "#{name}, #{location}" :
60
- (name || location || ''))
61
- m
62
- end
63
- end
64
-
65
- def extract_person_names_affiliations(authors)
66
- names = extract_person_names(authors)
67
- affils = extract_person_affiliations(authors)
68
- ret = {}
69
- affils.each_with_index do |a, i|
70
- ret[a] ||= []
71
- ret[a] << names[i]
72
- end
73
- ret
74
- end
75
-
76
- def personal_authors(isoxml)
77
- authors = isoxml.xpath(ns("//bibdata/contributor[role/@type = 'author' "\
78
- "or xmlns:role/@type = 'editor']/person"))
79
- set(:authors, extract_person_names(authors))
80
- set(:authors_affiliations, extract_person_names_affiliations(authors))
81
- end
41
+ NOLANG = "[not(@language) or @language = '']".freeze
82
42
 
83
- def author(xml, _out)
84
- personal_authors(xml)
85
- agency(xml)
86
- end
87
-
88
- def bibdate(isoxml, _out)
89
- isoxml.xpath(ns('//bibdata/date')).each do |d|
90
- set("#{d['type'].gsub(/-/, '_')}date".to_sym, Common::date_range(d))
91
- end
43
+ def currlang
44
+ "[@language = '#{@lang}']"
92
45
  end
93
46
 
94
47
  def doctype(isoxml, _out)
95
- b = isoxml&.at(ns('//bibdata/ext/doctype'))&.text || return
48
+ b = isoxml&.at(ns("//bibdata/ext/doctype#{NOLANG}"))&.text || return
96
49
  set(:doctype, status_print(b))
97
- b = isoxml&.at(ns('//local_bibdata/ext/doctype'))&.text || return
98
- set(:doctype_display, status_print(b))
99
- end
100
-
101
- def iso?(org)
102
- name = org&.at(ns('./name'))&.text
103
- abbrev = org&.at(ns('./abbreviation'))&.text
104
- (abbrev == 'ISO' ||
105
- name == 'International Organization for Standardization')
106
- end
107
-
108
- def agency1(xml)
109
- agency = ''
110
- publisher = []
111
- xml.xpath(ns("//bibdata/contributor[xmlns:role/@type = 'publisher']/"\
112
- 'organization')).each do |org|
113
- name = org&.at(ns('./name'))&.text
114
- agency1 = org&.at(ns('./abbreviation'))&.text || name
115
- publisher << name if name
116
- agency = iso?(org) ? "ISO/#{agency}" : "#{agency}#{agency1}/"
117
- end
118
- [agency, publisher]
119
- end
120
-
121
- def agency(xml)
122
- agency, publisher = agency1(xml)
123
- set(:agency, agency.sub(%r{/$}, ''))
124
- set(:publisher, @i18n.multiple_and(publisher, @labels['and']))
125
- agency_addr(xml)
126
- end
127
-
128
- def agency_addr(xml)
129
- a = xml.at(ns("//bibdata/contributor[xmlns:role/@type = 'publisher'][1]/"\
130
- "organization")) or return
131
- n = a.at(ns("./subdivision")) and set(:subdivision, n.text)
132
- n = a.at(ns("./address/formattedAddress")) and
133
- set(:pub_address, n.children.to_xml)
134
- n = a.at(ns("./phone[not(@type = 'fax')]")) and set(:pub_phone, n.text)
135
- n = a.at(ns("./phone[@type = 'fax']")) and set(:pub_fax, n.text)
136
- n = a.at(ns("./email")) and set(:pub_email, n.text)
137
- n = a.at(ns("./uri")) and set(:pub_uri, n.text)
50
+ b1 = isoxml&.at(ns("//bibdata/ext/doctype#{currlang}"))&.text || b
51
+ set(:doctype_display, status_print(b1))
138
52
  end
139
53
 
140
- def docstatus(isoxml, _out)
54
+ def docstatus(xml, _out)
141
55
  set(:unpublished, true)
142
- return unless docstatus = isoxml.at(ns('//bibdata/status/stage'))
143
- docstatus_local = isoxml.at(ns('//local_bibdata/status/stage'))
144
- set(:stage, status_print(docstatus.text))
145
- docstatus_local and
146
- set(:stage_display, status_print(docstatus_local.text))
147
- (i = isoxml&.at(ns('//bibdata/status/substage'))&.text) &&
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
148
61
  set(:substage, i)
149
- (i = isoxml&.at(ns('//local_bibdata/status/substage'))&.text) &&
150
- set(:substage_display, i)
151
- (i = isoxml&.at(ns('//bibdata/status/iteration'))&.text) &&
152
- set(:iteration, i)
153
- set(:unpublished, unpublished(docstatus.text))
154
- unpublished(docstatus.text) &&
155
- set(:stageabbr, stage_abbr(docstatus.text))
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))
156
68
  end
157
69
 
158
70
  def stage_abbr(docstatus)
@@ -172,6 +84,13 @@ module IsoDoc
172
84
  set(:docnumber, dn&.text)
173
85
  end
174
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
+
175
94
  def docnumeric(isoxml, _out)
176
95
  dn = isoxml.at(ns('//bibdata/docnumber'))
177
96
  set(:docnumeric, dn&.text)
@@ -197,7 +116,7 @@ module IsoDoc
197
116
  end
198
117
 
199
118
  def title(isoxml, _out)
200
- main = isoxml&.at(ns("//bibdata/title[@language='en']"))&.text
119
+ main = isoxml&.at(ns("//bibdata/title[@language='#{@lang}']"))&.text
201
120
  set(:doctitle, main)
202
121
  end
203
122
 
@@ -0,0 +1,90 @@
1
+ module IsoDoc
2
+ class Metadata
3
+ def extract_person_names(authors)
4
+ authors.reduce([]) do |ret, a|
5
+ if a.at(ns('./name/completename'))
6
+ ret << a.at(ns('./name/completename')).text
7
+ else
8
+ fn = []
9
+ forenames = a.xpath(ns('./name/forename'))
10
+ forenames.each { |f| fn << f.text }
11
+ surname = a&.at(ns('./name/surname'))&.text
12
+ ret << fn.join(' ') + ' ' + surname
13
+ end
14
+ end
15
+ end
16
+
17
+ def extract_person_affiliations(authors)
18
+ authors.reduce([]) do |m, a|
19
+ name = a&.at(ns('./affiliation/organization/name'))&.text
20
+ location = a&.at(ns('./affiliation/organization/address/'\
21
+ 'formattedAddress'))&.text
22
+ m << (!name.nil? && !location.nil? ? "#{name}, #{location}" :
23
+ (name || location || ''))
24
+ m
25
+ end
26
+ end
27
+
28
+ def extract_person_names_affiliations(authors)
29
+ names = extract_person_names(authors)
30
+ affils = extract_person_affiliations(authors)
31
+ ret = {}
32
+ affils.each_with_index do |a, i|
33
+ ret[a] ||= []
34
+ ret[a] << names[i]
35
+ end
36
+ ret
37
+ end
38
+
39
+ def personal_authors(isoxml)
40
+ authors = isoxml.xpath(ns("//bibdata/contributor[role/@type = 'author' "\
41
+ "or xmlns:role/@type = 'editor']/person"))
42
+ set(:authors, extract_person_names(authors))
43
+ set(:authors_affiliations, extract_person_names_affiliations(authors))
44
+ end
45
+
46
+ def author(xml, _out)
47
+ personal_authors(xml)
48
+ agency(xml)
49
+ end
50
+
51
+ def iso?(org)
52
+ name = org&.at(ns('./name'))&.text
53
+ abbrev = org&.at(ns('./abbreviation'))&.text
54
+ (abbrev == 'ISO' ||
55
+ name == 'International Organization for Standardization')
56
+ end
57
+
58
+ def agency1(xml)
59
+ agency = ''
60
+ publisher = []
61
+ xml.xpath(ns("//bibdata/contributor[xmlns:role/@type = 'publisher']/"\
62
+ 'organization')).each do |org|
63
+ name = org&.at(ns('./name'))&.text
64
+ agency1 = org&.at(ns('./abbreviation'))&.text || name
65
+ publisher << name if name
66
+ agency = iso?(org) ? "ISO/#{agency}" : "#{agency}#{agency1}/"
67
+ end
68
+ [agency, publisher]
69
+ end
70
+
71
+ def agency(xml)
72
+ agency, publisher = agency1(xml)
73
+ set(:agency, agency.sub(%r{/$}, ''))
74
+ set(:publisher, @i18n.multiple_and(publisher, @labels['and']))
75
+ agency_addr(xml)
76
+ end
77
+
78
+ def agency_addr(xml)
79
+ a = xml.at(ns("//bibdata/contributor[xmlns:role/@type = 'publisher'][1]/"\
80
+ "organization")) or return
81
+ n = a.at(ns("./subdivision")) and set(:subdivision, n.text)
82
+ n = a.at(ns("./address/formattedAddress")) and
83
+ set(:pub_address, n.children.to_xml)
84
+ n = a.at(ns("./phone[not(@type = 'fax')]")) and set(:pub_phone, n.text)
85
+ n = a.at(ns("./phone[@type = 'fax']")) and set(:pub_fax, n.text)
86
+ n = a.at(ns("./email")) and set(:pub_email, n.text)
87
+ n = a.at(ns("./uri")) and set(:pub_uri, n.text)
88
+ end
89
+ end
90
+ end
@@ -40,5 +40,11 @@ module IsoDoc
40
40
  Date.parse(isodate).strftime("%B %d, %Y")
41
41
  end
42
42
  end
43
+
44
+ def bibdate(isoxml, _out)
45
+ isoxml.xpath(ns('//bibdata/date')).each do |d|
46
+ set("#{d['type'].gsub(/-/, '_')}date".to_sym, Common::date_range(d))
47
+ end
48
+ end
43
49
  end
44
50
  end
@@ -1,11 +1,22 @@
1
1
  module IsoDoc
2
2
  class PresentationXMLConvert < ::IsoDoc::Convert
3
3
  def bibdata(docxml)
4
+ a = bibdata_current(docxml) or return
5
+ bibdata_i18n(a)
6
+ a.next =
7
+ "<localized-strings>#{i8n_name(trim_hash(@i18n.get), "").join("")}"\
8
+ "</localized-strings>"
9
+ end
10
+
11
+ def bibdata_current(docxml)
4
12
  a = docxml.at(ns("//bibdata")) or return
5
- b = a.dup
6
- b.name = "local_bibdata"
7
- bibdata_i18n(b)
8
- a.next = b
13
+ a.xpath(ns("./language")).each do |l|
14
+ l.text == @lang and l["current"] = "true"
15
+ end
16
+ a.xpath(ns("./script")).each do |l|
17
+ l.text == @script and l["current"] = "true"
18
+ end
19
+ a
9
20
  end
10
21
 
11
22
  def bibdata_i18n(b)
@@ -15,10 +26,71 @@ module IsoDoc
15
26
  end
16
27
 
17
28
  def hash_translate(bibdata, hash, xpath)
18
- hash.is_a? Hash or return
19
29
  x = bibdata.at(ns(xpath)) or return
30
+ x["language"] = ""
31
+ hash.is_a? Hash or return
20
32
  hash[x.text] or return
21
- x.children = hash[x.text]
33
+ x.next = x.dup
34
+ x.next["language"] = @lang
35
+ x.next.children = hash[x.text]
36
+ end
37
+
38
+ def i18n_tag(k, v)
39
+ "<localized-string key='#{k}' language='#{@lang}'>#{v}</localized-string>"
40
+ end
41
+
42
+ def i18n_safe(k)
43
+ k.gsub(/\s|\./, "_")
44
+ end
45
+
46
+ def i8n_name(h, pref)
47
+ if h.is_a? Hash then i8n_name1(h, pref)
48
+ elsif h.is_a? Array
49
+ h.reject { |a| blank?(a) }.each_with_object([]).
50
+ with_index do |(v1, g), i|
51
+ i8n_name(v1, "#{i18n_safe(k)}.#{i}").each { |x| g << x }
52
+ end
53
+ else [i18n_tag(pref, h)]
54
+ end
55
+ end
56
+
57
+ def i8n_name1(h, pref)
58
+ h.reject { |k, v| blank?(v) }.each_with_object([]) do |(k, v), g|
59
+ if v.is_a? Hash then i8n_name(v, i18n_safe(k)).each { |x| g << x }
60
+ elsif v.is_a? Array
61
+ v.reject { |a| blank?(a) }.each_with_index do |v1, i|
62
+ i8n_name(v1, "#{i18n_safe(k)}.#{i}").each { |x| g << x }
63
+ end
64
+ else
65
+ g << i18n_tag("#{pref}#{pref.empty? ? "" : "."}#{i18n_safe(k)}", v)
66
+ end
67
+ end
68
+ end
69
+
70
+ #https://stackoverflow.com/a/31822406
71
+ def blank?(v)
72
+ v.nil? || v.respond_to?(:empty?) && v.empty?
73
+ end
74
+
75
+ def trim_hash(h)
76
+ loop do
77
+ h_new = trim_hash1(h)
78
+ break h if h==h_new
79
+ h = h_new
80
+ end
81
+ end
82
+
83
+ def trim_hash1(h)
84
+ return h unless h.is_a? Hash
85
+ h.each_with_object({}) do |(k,v), g|
86
+ next if blank?(v)
87
+ g[k] = if v.is_a? Hash then trim_hash1(h[k])
88
+ elsif v.is_a? Array
89
+ h[k].map { |a| trim_hash1(a) }.reject { |a| blank?(a) }
90
+ else
91
+ v
92
+ end
93
+ end
22
94
  end
23
95
  end
24
96
  end