metanorma-jis 0.0.10 → 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -63,34 +63,29 @@ module IsoDoc
63
63
  olstyle: "l8" }
64
64
  end
65
65
 
66
- def norm_ref(isoxml, out, num)
67
- (f = isoxml.at(ns(norm_ref_xpath)) and f["hidden"] != "true") or
68
- return num
66
+ def norm_ref(node, out)
67
+ node["hidden"] != "true" or return
69
68
  out.div class: "normref_div" do |div|
70
- num += 1
71
- clause_name(f, f.at(ns("./title")), div, nil)
72
- if f.name == "clause"
73
- f.elements.each { |e| parse(e, div) unless e.name == "title" }
74
- else biblio_list(f, div, false)
69
+ clause_name(node, node.at(ns("./title")), div, nil)
70
+ if node.name == "clause"
71
+ node.elements.each { |e| parse(e, div) unless e.name == "title" }
72
+ else biblio_list(node, div, false)
75
73
  end
76
74
  end
77
- num
78
75
  end
79
76
 
80
- def bibliography(isoxml, out)
81
- (f = isoxml.at(ns(bibliography_xpath)) and f["hidden"] != "true") or
82
- return
77
+ def bibliography(node, out)
78
+ node["hidden"] != "true" or return
83
79
  page_break(out)
84
80
  out.div class: "bibliography" do |div|
85
81
  div.h1 class: "Section3" do |h1|
86
- f.at(ns("./title"))&.children&.each { |c2| parse(c2, h1) }
82
+ node.at(ns("./title"))&.children&.each { |c2| parse(c2, h1) }
87
83
  end
88
- biblio_list(f, div, true)
84
+ biblio_list(node, div, true)
89
85
  end
90
86
  end
91
87
 
92
88
  def annex_name(_annex, name, div)
93
- preceding_floating_titles(name, div)
94
89
  return if name.nil?
95
90
 
96
91
  div.h1 class: "Annex" do |t|
@@ -114,32 +109,6 @@ module IsoDoc
114
109
  end
115
110
  end
116
111
 
117
- def make_body2(body, docxml)
118
- body.div class: "WordSection2" do |div2|
119
- boilerplate docxml, div2
120
- front docxml, div2
121
- div2.p { |p| p << "&#xa0;" } # placeholder
122
- end
123
- section_break(body)
124
- end
125
-
126
- def middle(isoxml, out)
127
- middle_title(isoxml, out)
128
- middle_admonitions(isoxml, out)
129
- i = isoxml.at(ns("//sections/introduction")) and
130
- introduction i, out
131
- scope isoxml, out, 0
132
- norm_ref isoxml, out, 0
133
- clause_etc isoxml, out, 0
134
- annex isoxml, out
135
- bibliography isoxml, out
136
- end
137
-
138
- def make_body3(body, docxml)
139
- super
140
- commentary docxml, body
141
- end
142
-
143
112
  def footnote_parse(node, out)
144
113
  return table_footnote_parse(node, out) if @in_table || @in_figure # &&
145
114
 
@@ -161,23 +130,20 @@ module IsoDoc
161
130
  @seen_footnote << fn
162
131
  end
163
132
 
164
- def annex(isoxml, out)
165
- amd(isoxml) and @suppressheadingnumbers = @oldsuppressheadingnumbers
166
- isoxml.xpath(ns("//annex[not(@commentary = 'true')]")).each do |c|
167
- page_break(out)
168
- render_annex(out, c)
169
- end
170
- amd(isoxml) and @suppressheadingnumbers = true
133
+ def annex(node, out)
134
+ node["commentary"] == "true" and return commentary(node, out)
135
+ amd?(node.document.root) and
136
+ @suppressheadingnumbers = @oldsuppressheadingnumbers
137
+ page_break(out)
138
+ render_annex(out, node)
139
+ amd?(node.document.root) and @suppressheadingnumbers = true
171
140
  end
172
141
 
173
- def commentary(isoxml, out)
174
- isoxml.xpath(ns("//annex[@commentary = 'true']")).each do |c|
175
- out.span style: "mso-bookmark:PRECOMMENTARYPAGEREF"
176
- section_break(out)
177
- out.div class: "WordSectionCommentary" do |div|
178
- commentary_title(isoxml, div)
179
- render_annex(div, c)
180
- end
142
+ def commentary(node, out)
143
+ out.span style: "mso-bookmark:PRECOMMENTARYPAGEREF"
144
+ section_break(out)
145
+ out.div class: "WordSectionCommentary" do |div|
146
+ render_annex(div, node)
181
147
  end
182
148
  end
183
149
 
@@ -25,23 +25,48 @@ module IsoDoc
25
25
  l10n("#{title} #{num}<br/>#{obl}")
26
26
  end
27
27
 
28
- def back_anchor_names(xml)
29
- if @parse_settings.empty? || @parse_settings[:clauses]
30
- i = Counter.new("@")
31
- xml.xpath(ns("//annex")).each do |c|
28
+ def clause_order_main(docxml)
29
+ [
30
+ { path: "//sections/introduction" },
31
+ { path: "//clause[@type = 'scope']" },
32
+ { path: @klass.norm_ref_xpath },
33
+ { path: "//sections/terms | " \
34
+ "//sections/clause[descendant::terms]" },
35
+ { path: "//sections/definitions | " \
36
+ "//sections/clause[descendant::definitions][not(descendant::terms)]" },
37
+ { path: @klass.middle_clause(docxml), multi: true },
38
+ ]
39
+ end
40
+
41
+ def clause_order_annex(_docxml)
42
+ [{ path: "//annex[not(@commentary = 'true')]", multi: true }]
43
+ end
44
+
45
+ def clause_order_back(_docxml)
46
+ [
47
+ { path: @klass.bibliography_xpath },
48
+ { path: "//annex[@commentary = 'true']", multi: true },
49
+ { path: "//indexsect", multi: true },
50
+ { path: "//colophon/*", multi: true },
51
+ ]
52
+ end
53
+
54
+ def section_names(clause, num, lvl)
55
+ clause&.name == "introduction" and clause["unnumbered"] = "true"
56
+ super
57
+ end
58
+
59
+ def back_clauses_anchor_names(xml)
60
+ clause_order_back(xml).each do |a|
61
+ xml.xpath(ns(a[:path])).each do |c|
32
62
  if c["commentary"] == "true"
33
63
  commentary_names(c)
34
64
  else
35
- annex_names(c, i.increment(c).print)
65
+ preface_names(c)
36
66
  end
67
+ a[:multi] or break
37
68
  end
38
- xml.xpath(ns(@klass.bibliography_xpath)).each do |b|
39
- preface_names(b)
40
- end
41
- xml.xpath(ns("//colophon/clause")).each { |b| preface_names(b) }
42
- xml.xpath(ns("//indexsect")).each { |b| preface_names(b) }
43
69
  end
44
- references(xml) if @parse_settings.empty? || @parse_settings[:refs]
45
70
  end
46
71
 
47
72
  def commentary_names(clause)
@@ -7,42 +7,130 @@ module Metanorma
7
7
  super.merge("Japanese Industrial Standards" => "JIS")
8
8
  end
9
9
 
10
+ def home_agency
11
+ "JIS"
12
+ end
13
+
14
+ # Like the ISO code, but multilingual
10
15
  def metadata_author(node, xml)
11
- publishers = node.attr("publisher") || "JIS"
12
- csv_split(publishers)&.each do |p|
13
- xml.contributor do |c|
14
- c.role type: "author"
15
- c.organization do |a|
16
- organization(a, p, false, node, !node.attr("publisher"))
17
- end
18
- end
19
- end
16
+ metadata_contrib_sdo(node, xml, JIS_HASH,
17
+ { role: "author", sourcerole: "publisher" })
20
18
  node.attr("doctype") == "expert-commentary" and
21
19
  personal_author(node, xml)
22
20
  end
23
21
 
24
22
  def metadata_publisher(node, xml)
25
- publishers = node.attr("publisher") || "JIS"
26
- csv_split(publishers)&.each do |p|
23
+ metadata_contrib_sdo(node, xml, JIS_HASH,
24
+ { role: "publisher", sourcerole: "publisher" })
25
+ metadata_contrib_sdo(node, xml, nil,
26
+ { role: "authorizer",
27
+ sourcerole: "investigative-organization",
28
+ desc: "Investigative organization" })
29
+ metadata_contrib_sdo(node, xml, nil,
30
+ { role: "authorizer",
31
+ sourcerole: "investigative-committee",
32
+ desc: "Investigative committee" })
33
+ end
34
+
35
+ LANGS = %w(ja en).freeze
36
+
37
+ JIS_HASH =
38
+ { "ja" => "日本工業規格", "en" => "Japanese Industrial Standards" }.freeze
39
+
40
+ def metadata_contrib_sdo(node, xml, default_value, opt)
41
+ pub, default = metadata_contrib_extract(node, opt[:sourcerole], default_value)
42
+ metadata_contrib_sdo_build(node, xml, pub, default, opt)
43
+ end
44
+
45
+ def metadata_contrib_sdo_build(node, xml, pub, default, opt)
46
+ pub&.each do |p|
27
47
  xml.contributor do |c|
28
- c.role type: "publisher"
48
+ c.role type: opt[:role] do |r|
49
+ opt[:desc] and r.description opt[:desc]
50
+ end
29
51
  c.organization do |a|
30
- organization(a, p, true, node, !node.attr("publisher"))
52
+ organization(a, p, opt[:role] == "publisher", node, default)
53
+ end
54
+ end
55
+ end
56
+ end
57
+
58
+ def metadata_contrib_extract(node, role, default_value)
59
+ pub, default = multiling_docattr_csv(node, role, LANGS, default_value)
60
+ a = node.attr("#{role}-abbr") and abbr = a # one abbrev for all languages
61
+ [pub&.map { |p| { name: p, abbr: abbr } }, default]
62
+ end
63
+
64
+ def multiling_docattr(node, attr, langs)
65
+ ret = node.attr(attr) and return ret
66
+ ret = langs.each_with_object({}).each do |l, m|
67
+ x = node.attr("#{attr}-#{l}") and m[l] = x
68
+ end.compact
69
+ ret.empty? and return nil
70
+ ret
71
+ end
72
+
73
+ def multiling_docattr_csv(node, attr, langs, default)
74
+ ret = multiling_docattr(node, attr, langs)
75
+ not_found = ret.nil?
76
+ ret ||= default
77
+ ret &&= if ret.is_a?(Hash) then interleave_multiling_docattr(ret)
78
+ else csv_split(ret)
79
+ end
80
+ [ret, not_found]
81
+ end
82
+
83
+ # TODO abort if CSV count different between different languages
84
+ def interleave_multiling_docattr(ret)
85
+ h = ret.transform_values { |v| csv_split(v) }
86
+ h.each_with_object([]) do |(k, v), m|
87
+ v.each_with_index do |v1, i|
88
+ m[i] ||= {}
89
+ m[i][k] = v1
90
+ end
91
+ end
92
+ end
93
+
94
+ def multiling_noko_value(value, tag, xml)
95
+ if value.is_a?(Hash)
96
+ xml.send tag do |t|
97
+ value.each do |k, v|
98
+ t.variant v, language: k
31
99
  end
32
100
  end
101
+ elsif value.is_a?(Array)
102
+ value.each { |a| xml.send tag, a }
103
+ else xml.send tag, value
33
104
  end
34
105
  end
35
106
 
107
+ def organization(xml, org, _is_pub, node = nil, default_org = nil)
108
+ org.is_a?(Hash) or org = { name: org }
109
+ abbrevs = org_abbrev
110
+ name_str = org[:name].is_a?(Hash) ? org[:name]["en"] : org[:name]
111
+ n = abbrevs.invert[org[:name]] and org = { name: n, abbr: org[:name] }
112
+ multiling_noko_value(org[:name], "name", xml)
113
+ default_org && a = multiling_docattr(node, "subdivision", LANGS) and
114
+ multiling_noko_value(a, "subdivision", xml)
115
+ abbr = org[:abbr]
116
+ abbr ||= org_abbrev[name_str]
117
+ default_org && b = node.attr("subdivision-abbr") and abbr = b
118
+ abbr and xml.abbreviation abbr
119
+ # is_pub && node and org_address(node, org) # should refactor into struct, like abbr
120
+ end
121
+
36
122
  def metadata_copyright(node, xml)
37
- pub = node.attr("copyright-holder") || node.attr("publisher") || "JIS"
38
- csv_split(pub)&.each do |p|
123
+ pub, default = metadata_contrib_extract(node, "copyright-holder", nil)
124
+ if default
125
+ pub, default = metadata_contrib_extract(node, "publisher", JIS_HASH)
126
+ end
127
+
128
+ pub&.each do |p|
39
129
  xml.copyright do |c|
40
130
  c.from (node.attr("copyright-year") || Date.today.year)
41
131
  c.owner do |owner|
42
132
  owner.organization do |o|
43
- organization(o, p, true, node,
44
- !node.attr("copyright-holder") ||
45
- node.attr("publisher"))
133
+ organization(o, p, true, node, default)
46
134
  end
47
135
  end
48
136
  end
@@ -17,7 +17,7 @@
17
17
  these elements; we just want one namespace for any child grammars
18
18
  of this.
19
19
  -->
20
- <!-- VERSION v1.2.2 -->
20
+ <!-- VERSION v1.2.4 -->
21
21
  <grammar xmlns:a="http://relaxng.org/ns/compatibility/annotations/1.0" xmlns="http://relaxng.org/ns/structure/1.0" datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes">
22
22
  <include href="reqt.rng"/>
23
23
  <include href="basicdoc.rng">
@@ -192,9 +192,11 @@
192
192
  </attribute>
193
193
  </optional>
194
194
  <attribute name="citeas"/>
195
- <attribute name="type">
196
- <ref name="ReferenceFormat"/>
197
- </attribute>
195
+ <optional>
196
+ <attribute name="type">
197
+ <ref name="ReferenceFormat"/>
198
+ </attribute>
199
+ </optional>
198
200
  <optional>
199
201
  <attribute name="alt"/>
200
202
  </optional>
@@ -836,6 +838,26 @@
836
838
  <ref name="paragraph"/>
837
839
  </element>
838
840
  </define>
841
+ <define name="stem">
842
+ <element name="stem">
843
+ <attribute name="type">
844
+ <choice>
845
+ <value>MathML</value>
846
+ <value>AsciiMath</value>
847
+ <value>LatexMath</value>
848
+ </choice>
849
+ </attribute>
850
+ <attribute name="block">
851
+ <data type="boolean"/>
852
+ </attribute>
853
+ <oneOrMore>
854
+ <choice>
855
+ <text/>
856
+ <ref name="AnyElement"/>
857
+ </choice>
858
+ </oneOrMore>
859
+ </element>
860
+ </define>
839
861
  <define name="em">
840
862
  <element name="em">
841
863
  <zeroOrMore>
@@ -2046,6 +2068,9 @@
2046
2068
  </define>
2047
2069
  <define name="termdefinition">
2048
2070
  <element name="definition">
2071
+ <optional>
2072
+ <attribute name="type"/>
2073
+ </optional>
2049
2074
  <choice>
2050
2075
  <ref name="verbaldefinition"/>
2051
2076
  <ref name="nonverbalrep"/>
@@ -1,6 +1,6 @@
1
1
  module Metanorma
2
2
  module JIS
3
- VERSION = "0.0.10".freeze
3
+ VERSION = "0.1.1".freeze
4
4
  end
5
5
  end
6
6
 
@@ -30,9 +30,7 @@ Gem::Specification.new do |spec|
30
30
  spec.test_files = `git ls-files -- {spec}/*`.split("\n")
31
31
  spec.required_ruby_version = Gem::Requirement.new(">= 2.7.0")
32
32
 
33
- spec.add_dependency "metanorma-iso", "~> 2.4.2"
34
- #spec.add_dependency "relaton-bipm", "~> 1.14.8"
35
- #spec.add_dependency "relaton-iho", "~> 1.14.3"
33
+ spec.add_dependency "metanorma-iso", "~> 2.5.1"
36
34
  spec.add_dependency "pubid-jis"
37
35
 
38
36
  spec.add_development_dependency "debug"
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: metanorma-jis
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.10
4
+ version: 0.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ribose Inc.
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-07-24 00:00:00.000000000 Z
11
+ date: 2023-08-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: metanorma-iso
@@ -16,14 +16,14 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: 2.4.2
19
+ version: 2.5.1
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: 2.4.2
26
+ version: 2.5.1
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: pubid-jis
29
29
  requirement: !ruby/object:Gem::Requirement