isodoc 1.2.8 → 1.3.0

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: 491a322b0df2e6b1c8b4f12e520ca349657a009058b416067acdd5437a16085c
4
- data.tar.gz: 1f52844ffdc37875d2b40f8d46f52263abcbe5101c99adaf88d839a28a18ed49
3
+ metadata.gz: f1edc88536663d06a4d23249a6ec1909148185456f84a427fe2299da8e138ab4
4
+ data.tar.gz: fd6099657296706882b03eb557f59b242c733415b9d49fe8bf4e3aa73bd67eb8
5
5
  SHA512:
6
- metadata.gz: ce472eadec9ab44d5739f0e506813cb89cf7de6def2909e8ffd0788cf4fe246bf3433b75c22490528b0287bbfad1e2cc5ca50eeaacdd4156fe9bb32a36e912df
7
- data.tar.gz: efb30d195c6a15f97133b76d1d4cac762800fe7620d11a58a2655e7ccd3bc972827d419337cbff13fb7d1c4b96004da7b9d95323ae7d8f6c1eaa07d784f67834
6
+ metadata.gz: 4112c5b84d25a09e9d701b9735d80e01e9f4bf294288c097524c83e31689dc90c1dd9168e9f70061868d41c032d2b864a96b76b19f0926584a2549a1f5309a63
7
+ data.tar.gz: b002124056e50a37732ad78fa9e959658b0f07c9f5af9d248f69c0d282cc74804471124fc4b7f150ba19935e3aa904df0d54222fb201e279d6325ebfffe9def8
@@ -36,7 +36,7 @@ jobs:
36
36
  with:
37
37
  ruby-version: ${{ matrix.ruby }}
38
38
 
39
- - uses: actions/cache@v1
39
+ - uses: actions/cache@v2
40
40
  with:
41
41
  path: vendor/bundle
42
42
  key: bundle-${{ matrix.os }}-${{ matrix.ruby }}-${{ hashFiles('**/*.gemspec') }}
@@ -50,7 +50,7 @@
50
50
  }
51
51
 
52
52
  background-color: $colorBg;
53
- font-size: 0.8em;
53
+ font-size: $monospacefontsize;
54
54
  line-height: 1.6em;
55
55
  padding: 1.5em;
56
56
  margin: 2em 0 1em 0;
@@ -68,7 +68,7 @@
68
68
  }
69
69
 
70
70
  background-color: $colorBg;
71
- font-size: 0.8em;
71
+ font-size: $monospacefontsize;
72
72
  line-height: 1.6em;
73
73
  padding: 1.5em;
74
74
  margin: 2em 0 1em 0;
@@ -56,7 +56,7 @@
56
56
 
57
57
  &, th, td {
58
58
  border: $border;
59
- font-size: 0.95em;
59
+ font-size: 0.95em; // NN 20201115: ??? normalfontsize - 0.05?
60
60
  }
61
61
  th, td {
62
62
  padding: 1em;
@@ -3,6 +3,7 @@ require "isodoc/common"
3
3
  require "fileutils"
4
4
  require "tempfile"
5
5
  require_relative "i18n"
6
+ require_relative "css"
6
7
 
7
8
  module IsoDoc
8
9
  class Convert < ::IsoDoc::Common
@@ -17,6 +18,10 @@ module IsoDoc
17
18
  # wordcoverpage: Cover page for Word
18
19
  # htmlintropage: Introductory page for HTML
19
20
  # wordintropage: Introductory page for Word
21
+ # normalfontsize: Font size for body text
22
+ # smallerfontsize: Font size for smaller than body text
23
+ # monospacefontsize: Font size for monospace font
24
+ # footnotefontsize: Font size for footnotes
20
25
  # i18nyaml: YAML file for internationalisation of text
21
26
  # ulstyle: list style in Word CSS for unordered lists
22
27
  # olstyle: list style in Word CSS for ordered lists
@@ -25,8 +30,10 @@ module IsoDoc
25
30
  # monospace: font to use for monospace text
26
31
  # suppressheadingnumbers: suppress heading numbers for clauses
27
32
  # scripts: Scripts file for HTML
28
- # scripts_pdf: Scripts file for PDF
33
+ # scripts_pdf: Scripts file for PDF (not used in XSLT PDF)
29
34
  # datauriimage: Encode images in HTML output as data URIs
35
+ # break_up_urls_in_tables: whether to insert spaces in URLs in tables
36
+ # every 40-odd chars
30
37
  def initialize(options)
31
38
  @libdir ||= File.dirname(__FILE__)
32
39
  options.merge!(default_fonts(options)) do |_, old, new|
@@ -46,6 +53,10 @@ module IsoDoc
46
53
  @wordcoverpage = options[:wordcoverpage]
47
54
  @htmlintropage = options[:htmlintropage]
48
55
  @wordintropage = options[:wordintropage]
56
+ @normalfontsize = options[:normalfontsize]
57
+ @smallerfontsize = options[:smallerfontsize]
58
+ @monospacefontsize = options[:monospacefontsize]
59
+ @footnotefontsize = options[:footnotefontsize]
49
60
  @scripts = options[:scripts]
50
61
  @scripts_pdf = options[:scripts_pdf]
51
62
  @i18nyaml = options[:i18nyaml]
@@ -80,62 +91,10 @@ module IsoDoc
80
91
  @fn_bookmarks = {}
81
92
  end
82
93
 
83
- # Check if already compiled version(.css) exists,
84
- # if not, return original scss file. During release
85
- # we compile scss into css files in order to not depend on scss
86
- def precompiled_style_or_original(stylesheet_path)
87
- # Already have compiled stylesheet, use it
88
- return stylesheet_path if stylesheet_path.nil? ||
89
- File.extname(stylesheet_path) == '.css'
90
-
91
- basename = File.basename(stylesheet_path, '.*')
92
- compiled_path = File.join(File.dirname(stylesheet_path),
93
- "#{basename}.css")
94
- return stylesheet_path unless File.file?(compiled_path)
95
-
96
- compiled_path
97
- end
98
-
99
- # run this after @meta is populated
100
- def populate_css
101
- @htmlstylesheet = generate_css(@htmlstylesheet_name, true)
102
- @wordstylesheet = generate_css(@wordstylesheet_name, false)
103
- @standardstylesheet = generate_css(@standardstylesheet_name, false)
104
- end
105
-
106
94
  def tmpimagedir_suffix
107
95
  '_images'
108
96
  end
109
97
 
110
- def default_fonts(_options)
111
- {
112
- bodyfont: 'Arial',
113
- headerfont: 'Arial',
114
- monospacefont: 'Courier'
115
- }
116
- end
117
-
118
- # none for this parent gem, but will be populated in child gems
119
- # which have access to stylesheets &c
120
- def default_file_locations(_options)
121
- {}
122
- end
123
-
124
- def fonts_options
125
- {
126
- 'bodyfont' => options[:bodyfont] || 'Arial',
127
- 'headerfont' => options[:headerfont] || 'Arial',
128
- 'monospacefont' => options[:monospacefont] || 'Courier'
129
- }
130
- end
131
-
132
- def scss_fontheader
133
- b = options[:bodyfont] || 'Arial'
134
- h = options[:headerfont] || 'Arial'
135
- m = options[:monospacefont] || 'Courier'
136
- "$bodyfont: #{b};\n$headerfont: #{h};\n$monospacefont: #{m};\n"
137
- end
138
-
139
98
  def html_doc_path(*file)
140
99
  file.each do |f|
141
100
  ret = File.join(@libdir, File.join('html', f))
@@ -144,37 +103,6 @@ module IsoDoc
144
103
  nil
145
104
  end
146
105
 
147
- def convert_scss(filename, stylesheet)
148
- require 'sassc'
149
- require 'isodoc/sassc_importer'
150
-
151
- [File.join(Gem.loaded_specs['isodoc'].full_gem_path,
152
- 'lib', 'isodoc'),
153
- File.dirname(filename)].each do |name|
154
- SassC.load_paths << name
155
- end
156
- SassC::Engine.new(scss_fontheader + stylesheet, syntax: :scss,
157
- importer: SasscImporter)
158
- .render
159
- end
160
-
161
- def generate_css(filename, stripwordcss)
162
- return nil if filename.nil?
163
-
164
- filename = precompiled_style_or_original(filename)
165
- stylesheet = File.read(filename, encoding: 'UTF-8')
166
- stylesheet = populate_template(stylesheet, :word)
167
- stylesheet.gsub!(/(\s|\{)mso-[^:]+:[^;]+;/m, '\\1') if stripwordcss
168
- if File.extname(filename) == '.scss'
169
- stylesheet = convert_scss(filename, stylesheet)
170
- end
171
- Tempfile.open([File.basename(filename, '.*'), 'css'],
172
- encoding: 'utf-8') do |f|
173
- f.write(stylesheet)
174
- f
175
- end
176
- end
177
-
178
106
  def convert1(docxml, filename, dir)
179
107
  @xrefs.parse docxml
180
108
  noko do |xml|
@@ -0,0 +1,95 @@
1
+ module IsoDoc
2
+ class Convert < ::IsoDoc::Common
3
+ # Check if already compiled version(.css) exists,
4
+ # if not, return original scss file. During release
5
+ # we compile scss into css files in order to not depend on scss
6
+ def precompiled_style_or_original(stylesheet_path)
7
+ # Already have compiled stylesheet, use it
8
+ return stylesheet_path if stylesheet_path.nil? ||
9
+ File.extname(stylesheet_path) == '.css'
10
+ basename = File.basename(stylesheet_path, '.*')
11
+ compiled_path = File.join(File.dirname(stylesheet_path),
12
+ "#{basename}.css")
13
+ return stylesheet_path unless File.file?(compiled_path)
14
+ compiled_path
15
+ end
16
+
17
+ # run this after @meta is populated
18
+ def populate_css
19
+ @htmlstylesheet = generate_css(@htmlstylesheet_name, true)
20
+ @wordstylesheet = generate_css(@wordstylesheet_name, false)
21
+ @standardstylesheet = generate_css(@standardstylesheet_name, false)
22
+ end
23
+
24
+ def default_fonts(_options)
25
+ {
26
+ bodyfont: 'Arial',
27
+ headerfont: 'Arial',
28
+ monospacefont: 'Courier',
29
+ }
30
+ end
31
+
32
+ # none for this parent gem, but will be populated in child gems
33
+ # which have access to stylesheets &c
34
+ def default_file_locations(_options)
35
+ {}
36
+ end
37
+
38
+ def fonts_options
39
+ {
40
+ 'bodyfont' => options[:bodyfont] || 'Arial',
41
+ 'headerfont' => options[:headerfont] || 'Arial',
42
+ 'monospacefont' => options[:monospacefont] || 'Courier',
43
+ "normalfontsize" => options[:normalfontsize],
44
+ "monospacefontsize" => options[:monospacefontsize],
45
+ "smallerfontsize" => options[:smallerfontsize],
46
+ "footnotefontsize" => options[:footnotefontsize]
47
+ }
48
+ end
49
+
50
+ def scss_fontheader(is_html_css)
51
+ b = options[:bodyfont] || 'Arial'
52
+ h = options[:headerfont] || 'Arial'
53
+ m = options[:monospacefont] || 'Courier'
54
+ ns = options[:normalfontsize] || (is_html_css ? "1.0em" : '12.0pt')
55
+ ms = options[:monospacefontsize] || (is_html_css ? "0.8em" : '11.0pt')
56
+ ss = options[:smallerfontsize] || (is_html_css ? "0.9em" : '10.0pt')
57
+ fs = options[:footnotefontsize] || (is_html_css ? "0.9em" : '9.0pt')
58
+ "$bodyfont: #{b};\n$headerfont: #{h};\n$monospacefont: #{m};\n"\
59
+ "$normalfontsize: #{ns};\n$monospacefontsize: #{ms};\n"\
60
+ "$smallerfontsize: #{ss};\n$footnotefontsize: #{fs};\n"
61
+ end
62
+
63
+ def convert_scss(filename, stylesheet, stripwordcss)
64
+ require 'sassc'
65
+ require 'isodoc/sassc_importer'
66
+
67
+ [File.join(Gem.loaded_specs['isodoc'].full_gem_path,
68
+ 'lib', 'isodoc'),
69
+ File.dirname(filename)].each do |name|
70
+ SassC.load_paths << name
71
+ end
72
+ SassC::Engine.new(scss_fontheader(stripwordcss) + stylesheet,
73
+ syntax: :scss, importer: SasscImporter)
74
+ .render
75
+ end
76
+
77
+ # stripwordcss if HTML stylesheet, !stripwordcss if DOC stylesheet
78
+ def generate_css(filename, stripwordcss)
79
+ return nil if filename.nil?
80
+
81
+ filename = precompiled_style_or_original(filename)
82
+ stylesheet = File.read(filename, encoding: 'UTF-8')
83
+ stylesheet = populate_template(stylesheet, :word)
84
+ stylesheet.gsub!(/(\s|\{)mso-[^:]+:[^;]+;/m, '\\1') if stripwordcss
85
+ if File.extname(filename) == '.scss'
86
+ stylesheet = convert_scss(filename, stylesheet, stripwordcss)
87
+ end
88
+ Tempfile.open([File.basename(filename, '.*'), 'css'],
89
+ encoding: 'utf-8') do |f|
90
+ f.write(stylesheet)
91
+ f
92
+ end
93
+ end
94
+ end
95
+ end
@@ -38,7 +38,8 @@ module IsoDoc::Function
38
38
  end
39
39
 
40
40
  def ol_attrs(node)
41
- { type: ol_depth(node), id: node["id"], style: keep_style(node) }
41
+ { type: node["type"] ? ol_style(node["type"].to_sym) : ol_depth(node),
42
+ id: node["id"], style: keep_style(node) }
42
43
  end
43
44
 
44
45
  def ol_parse(node, out)
@@ -80,7 +80,8 @@ module IsoDoc::Function
80
80
  end
81
81
 
82
82
  def docid_prefix(prefix, docid)
83
- docid = "#{prefix} #{docid}" if prefix && !omit_docid_prefix(prefix)
83
+ docid = "#{prefix} #{docid}" if prefix && !omit_docid_prefix(prefix) &&
84
+ !/^#{prefix}\b/.match(docid)
84
85
  docid_l10n(docid)
85
86
  end
86
87
 
@@ -111,7 +112,7 @@ module IsoDoc::Function
111
112
  # reference not to be rendered because it is deemed implicit
112
113
  # in the standards environment
113
114
  def implicit_reference(b)
114
- false
115
+ b["hidden"] == "true"
115
116
  end
116
117
 
117
118
  def prefix_bracketed_ref(ref, text)
@@ -160,7 +161,7 @@ module IsoDoc::Function
160
161
  end
161
162
 
162
163
  def norm_ref(isoxml, out, num)
163
- f = isoxml.at(ns(norm_ref_xpath)) or return num
164
+ f = isoxml.at(ns(norm_ref_xpath)) and f["hidden"] != "true" or return num
164
165
  out.div do |div|
165
166
  num = num + 1
166
167
  clause_name(num, f.at(ns("./title")), div, nil)
@@ -180,10 +181,9 @@ module IsoDoc::Function
180
181
  end
181
182
 
182
183
  def bibliography(isoxml, out)
183
- f = isoxml.at(ns(bibliography_xpath)) || return
184
+ f = isoxml.at(ns(bibliography_xpath)) and f["hidden"] != "true" or return
184
185
  page_break(out)
185
186
  out.div do |div|
186
- #div.h1 @bibliography_lbl, **{ class: "Section3" }
187
187
  div.h1 **{class: "Section3"} do |h1|
188
188
  f&.at(ns("./title"))&.children&.each { |c2| parse(c2, h1) }
189
189
  end
@@ -192,6 +192,7 @@ module IsoDoc::Function
192
192
  end
193
193
 
194
194
  def bibliography_parse(node, out)
195
+ node["hidden"] != true or return
195
196
  title = node&.at(ns("./title"))&.text || ""
196
197
  out.div do |div|
197
198
  clause_parse_title(node, div, node.at(ns("./title")), out,
@@ -202,15 +203,9 @@ module IsoDoc::Function
202
203
 
203
204
  def format_ref(ref, prefix, isopub, date, allparts)
204
205
  ref = docid_prefix(prefix, ref)
205
- return "[#{ref}]" if /^\d+$/.match(ref) && !prefix &&
206
+ return "[#{ref}]" if ref && /^\d+$/.match(ref) && !prefix &&
206
207
  !/^\[.*\]$/.match(ref)
207
208
  ref
208
209
  end
209
-
210
- # def ref_names(ref)
211
- # linkend = ref.text
212
- # linkend.gsub!(/[\[\]]/, "") unless /^\[\d+\]$/.match linkend
213
- # @anchors[ref["id"]] = { xref: linkend }
214
- # end
215
210
  end
216
211
  end
@@ -186,14 +186,22 @@ module IsoDoc::HtmlFunction
186
186
  docxml
187
187
  end
188
188
 
189
+ def footnote_backlinks1(x, fn)
190
+ xdup = x.dup
191
+ xdup.remove["id"]
192
+ if fn.elements.empty?
193
+ fn.children.first.previous = xdup
194
+ else
195
+ fn.elements.first.children.first.previous = xdup
196
+ end
197
+ end
198
+
189
199
  def footnote_backlinks(docxml)
190
200
  seen = {}
191
201
  docxml.xpath('//a[@class = "FootnoteRef"]').each_with_index do |x, i|
192
202
  seen[x["href"]] and next or seen[x["href"]] = true
193
203
  fn = docxml.at(%<//*[@id = '#{x['href'].sub(/^#/, '')}']>) || next
194
- xdup = x.dup
195
- xdup.remove["id"]
196
- fn.elements.first.children.first.previous = xdup
204
+ footnote_backlinks1(x, fn)
197
205
  x["id"] ||= "fnref:#{i + 1}"
198
206
  fn.add_child "<a href='##{x['id']}'>&#x21A9;</a>"
199
207
  end
@@ -25,13 +25,13 @@ module IsoDoc
25
25
  hash_translate(b, @i18n.get["substage_dict"], "./status/substage")
26
26
  end
27
27
 
28
- def hash_translate(bibdata, hash, xpath)
28
+ def hash_translate(bibdata, hash, xpath, lang = @lang)
29
29
  x = bibdata.at(ns(xpath)) or return
30
30
  x["language"] = ""
31
31
  hash.is_a? Hash or return
32
32
  hash[x.text] or return
33
33
  x.next = x.dup
34
- x.next["language"] = @lang
34
+ x.next["language"] = lang
35
35
  x.next.children = hash[x.text]
36
36
  end
37
37
 
@@ -40,7 +40,7 @@ module IsoDoc
40
40
  end
41
41
 
42
42
  def i18n_safe(k)
43
- k.gsub(/\s|\./, "_")
43
+ k.to_s.gsub(/\s|\./, "_")
44
44
  end
45
45
 
46
46
  def i8n_name(h, pref)
@@ -164,14 +164,16 @@ module IsoDoc
164
164
  def localize_maths(f, locale)
165
165
  f.xpath(".//m:mn", MATHML).each do |x|
166
166
  num = /\./.match(x.text) ? x.text.to_f : x.text.to_i
167
- x.children = localized_number(num, locale)
167
+ precision = /\./.match(x.text) ? x.text.sub(/^.*\./, "").size : 0
168
+ x.children = localized_number(num, locale, precision)
168
169
  end
169
170
  end
170
171
 
171
172
  # By itself twiiter cldr does not support fraction part digits grouping
172
173
  # and custom delimeter, will decorate fraction part manually
173
- def localized_number(num, locale)
174
- localized = num.localize(locale).to_s
174
+ def localized_number(num, locale, precision)
175
+ localized = precision == 0 ? num.localize(locale).to_s :
176
+ num.localize(locale).to_decimal.to_s(:precision => precision)
175
177
  twitter_cldr_reader_symbols = twitter_cldr_reader(locale)
176
178
  return localized unless twitter_cldr_reader_symbols[:decimal]
177
179
  integer, fraction = localized.split(twitter_cldr_reader_symbols[:decimal])
@@ -1,3 +1,3 @@
1
1
  module IsoDoc
2
- VERSION = "1.2.8".freeze
2
+ VERSION = "1.3.0".freeze
3
3
  end
@@ -4,26 +4,6 @@ require_relative "word_function/body.rb"
4
4
  require_relative "word_function/postprocess.rb"
5
5
 
6
6
  module IsoDoc
7
-
8
- =begin
9
- module WordConvertModule
10
- # http://tech.tulentsev.com/2012/02/ruby-how-to-override-class-method-with-a-module/
11
- # https://www.ruby-forum.com/topic/148303
12
- #
13
- # The following is ugly indeed, but the only way I can split module override methods
14
- # across files
15
- def self.included base
16
- base.class_eval do
17
-
18
- eval File.open(File.join(File.dirname(__FILE__),"wordconvertmodule.rb")).read
19
- eval File.open(File.join(File.dirname(__FILE__),"comments.rb")).read
20
- eval File.open(File.join(File.dirname(__FILE__),"footnotes.rb")).read
21
- eval File.open(File.join(File.dirname(__FILE__),"postprocess.rb")).read
22
- end
23
- end
24
- end
25
- =end
26
-
27
7
  class WordConvert < ::IsoDoc::Convert
28
8
  include WordFunction::Comments
29
9
  include WordFunction::Footnotes
@@ -2,8 +2,8 @@ require "roman-numerals"
2
2
 
3
3
  module IsoDoc::XrefGen
4
4
  class Counter
5
- def initialize
6
- @num = 0
5
+ def initialize(num = 0)
6
+ @num = num
7
7
  @letter = ""
8
8
  @subseq = ""
9
9
  @letter_override = nil
@@ -76,13 +76,24 @@ module IsoDoc::XrefGen
76
76
  "#{@base}#{@number_override || @num}#{@letter_override || @letter}"
77
77
  end
78
78
 
79
- def listlabel(depth)
80
- return @num.to_s if [2, 7].include? depth
81
- return (96 + @num).chr.to_s if [1, 6].include? depth
82
- return (64 + @num).chr.to_s if [4, 9].include? depth
83
- return RomanNumerals.to_roman(@num).downcase if [3, 8].include? depth
84
- return RomanNumerals.to_roman(@num).upcase if [5, 10].include? depth
85
- return @num.to_s
79
+ def ol_type(list, depth)
80
+ return list["type"].to_sym if list["type"]
81
+ return :arabic if [2, 7].include? depth
82
+ return :alphabet if [1, 6].include? depth
83
+ return :alphabet_upper if [4, 9].include? depth
84
+ return :roman if [3, 8].include? depth
85
+ return :roman_upper if [5, 10].include? depth
86
+ return :arabic
87
+ end
88
+
89
+ def listlabel(list, depth)
90
+ case ol_type(list, depth)
91
+ when :arabic then @num.to_s
92
+ when :alphabet then (96 + @num).chr.to_s
93
+ when :alphabet_upper then (64 + @num).chr.to_s
94
+ when :roman then RomanNumerals.to_roman(@num).downcase
95
+ when :roman_upper then RomanNumerals.to_roman(@num).upcase
96
+ end
86
97
  end
87
98
  end
88
99
  end
@@ -123,9 +123,9 @@ module IsoDoc::XrefGen
123
123
  end
124
124
 
125
125
  def list_item_anchor_names(list, list_anchor, depth, prev_label, refer_list)
126
- c = Counter.new
126
+ c = Counter.new(list["start"] ? list["start"].to_i - 1 : 0)
127
127
  list.xpath(ns("./li")).each do |li|
128
- label = c.increment(li).listlabel(depth)
128
+ label = c.increment(li).listlabel(list, depth)
129
129
  label = "#{prev_label}.#{label}" unless prev_label.empty?
130
130
  label = "#{list_anchor[:xref]} #{label}" if refer_list
131
131
  li["id"] and @anchors[li["id"]] =
@@ -3,4 +3,18 @@
3
3
 
4
4
  p {
5
5
  font-family: $bodyfont;
6
+ font-size: $normalfontsize;
7
+ }
8
+ code {
9
+ font-family: $monospacefont;
10
+ font-size: $monospacefontsize;
11
+ }
12
+ aside {
13
+ font-size: $footnotefontsize;
14
+ }
15
+ h1 {
16
+ font-family: $headerfont;
17
+ }
18
+ p.note {
19
+ font-size: $smallerfontsize;
6
20
  }
@@ -203,7 +203,7 @@ RSpec.describe IsoDoc do
203
203
  <br/>
204
204
  <div>
205
205
  <h1 class="ForewordTitle">Foreword</h1>
206
- <ol type="a" id="_ae34a226-aab4-496d-987b-1aa7b6314026">
206
+ <ol type="I" id="_ae34a226-aab4-496d-987b-1aa7b6314026">
207
207
  <li id="_ae34a226-aab4-496d-987b-1aa7b6314027">
208
208
  <p id="_0091a277-fb0e-424a-aea8-f0001303fe78">all information necessary for the complete identification of the sample;</p>
209
209
  </li>
@@ -139,7 +139,7 @@ expect(File.exist?("test.doc")).to be true
139
139
  it "generates HTML output docs with complete configuration" do
140
140
  FileUtils.rm_f "test.doc"
141
141
  FileUtils.rm_f "test.html"
142
- IsoDoc::HtmlConvert.new({bodyfont: "Zapf", htmlstylesheet: "spec/assets/html.scss", htmlcoverpage: "spec/assets/htmlcover.html", htmlintropage: "spec/assets/htmlintro.html", scripts: "spec/assets/scripts.html", i18nyaml: "spec/assets/i18n.yaml", ulstyle: "l1", olstyle: "l2"}).convert("test", <<~"INPUT", false)
142
+ IsoDoc::HtmlConvert.new({bodyfont: "Zapf", monospacefont: "Consolas", headerfont: "Comic Sans", normalfontsize: "30pt", monospacefontsize: "29pt", smallerfontsize: "28pt", footnotefontsize: "27pt", htmlstylesheet: "spec/assets/html.scss", htmlcoverpage: "spec/assets/htmlcover.html", htmlintropage: "spec/assets/htmlintro.html", scripts: "spec/assets/scripts.html", i18nyaml: "spec/assets/i18n.yaml", ulstyle: "l1", olstyle: "l2"}).convert("test", <<~"INPUT", false)
143
143
  <iso-standard xmlns="http://riboseinc.com/isoxml">
144
144
  <preface><foreword>
145
145
  <note>
@@ -150,7 +150,13 @@ expect(File.exist?("test.doc")).to be true
150
150
  INPUT
151
151
  html = File.read("test.html")
152
152
  expect(html).to match(/another empty stylesheet/)
153
- expect(html).to match(/font-family: Zapf/)
153
+ expect(html).to match(/p \{[^}]*?font-family: Zapf/m)
154
+ expect(html).to match(/code \{[^}]*?font-family: Consolas/m)
155
+ expect(html).to match(/h1 \{[^}]*?font-family: Comic Sans/m)
156
+ expect(html).to match(/p \{[^}]*?font-size: 30pt/m)
157
+ expect(html).to match(/code \{[^}]*?font-size: 29pt/m)
158
+ expect(html).to match(/p\.note \{[^}]*?font-size: 28pt/m)
159
+ expect(html).to match(/aside \{[^}]*?font-size: 27pt/m)
154
160
  expect(html).to match(/an empty html cover page/)
155
161
  expect(html).to match(/an empty html intro page/)
156
162
  expect(html).to match(/This is > a script/)
@@ -172,7 +178,13 @@ expect(File.exist?("test.doc")).to be true
172
178
  INPUT
173
179
  html = File.read("test.html")
174
180
  expect(html).to match(/another empty stylesheet/)
175
- expect(html).to match(/font-family: Arial/)
181
+ expect(html).to match(/p \{[^}]*?font-family: Arial/m)
182
+ expect(html).to match(/code \{[^}]*?font-family: Courier/m)
183
+ expect(html).to match(/h1 \{[^}]*?font-family: Arial/m)
184
+ expect(html).to match(/p \{[^}]*?font-size: 1em;/m)
185
+ expect(html).to match(/code \{[^}]*?font-size: 0.8em/m)
186
+ expect(html).to match(/p\.note \{[^}]*?font-size: 0.9em/m)
187
+ expect(html).to match(/aside \{[^}]*?font-size: 0.9em/m)
176
188
  expect(html).to match(/an empty html cover page/)
177
189
  expect(html).to match(/an empty html intro page/)
178
190
  expect(html).to match(/This is > a script/)
@@ -183,7 +195,7 @@ expect(File.exist?("test.doc")).to be true
183
195
  it "generates Word output docs with complete configuration" do
184
196
  FileUtils.rm_f "test.doc"
185
197
  FileUtils.rm_f "test.html"
186
- IsoDoc::WordConvert.new({bodyfont: "Zapf", wordstylesheet: "spec/assets/html.scss", standardstylesheet: "spec/assets/std.css", header: "spec/assets/header.html", wordcoverpage: "spec/assets/wordcover.html", wordintropage: "spec/assets/wordintro.html", i18nyaml: "spec/assets/i18n.yaml", ulstyle: "l1", olstyle: "l2"}).convert("test", <<~"INPUT", false)
198
+ IsoDoc::WordConvert.new({bodyfont: "Zapf", monospacefont: "Consolas", headerfont: "Comic Sans", normalfontsize: "30pt", monospacefontsize: "29pt", smallerfontsize: "28pt", footnotefontsize: "27pt", wordstylesheet: "spec/assets/html.scss", standardstylesheet: "spec/assets/std.css", header: "spec/assets/header.html", wordcoverpage: "spec/assets/wordcover.html", wordintropage: "spec/assets/wordintro.html", i18nyaml: "spec/assets/i18n.yaml", ulstyle: "l1", olstyle: "l2"}).convert("test", <<~"INPUT", false)
187
199
  <iso-standard xmlns="http://riboseinc.com/isoxml">
188
200
  <preface><foreword>
189
201
  <note>
@@ -194,7 +206,13 @@ expect(File.exist?("test.doc")).to be true
194
206
  INPUT
195
207
  word = File.read("test.doc")
196
208
  expect(word).to match(/another empty stylesheet/)
197
- expect(word).to match(/font-family: Zapf/)
209
+ expect(word).to match(/p \{[^}]*?font-family: Zapf/m)
210
+ expect(word).to match(/code \{[^}]*?font-family: Consolas/m)
211
+ expect(word).to match(/h1 \{[^}]*?font-family: Comic Sans/m)
212
+ expect(word).to match(/p \{[^}]*?font-size: 30pt/m)
213
+ expect(word).to match(/code \{[^}]*?font-size: 29pt/m)
214
+ expect(word).to match(/p\.note \{[^}]*?font-size: 28pt/m)
215
+ expect(word).to match(/aside \{[^}]*?font-size: 27pt/m)
198
216
  expect(word).to match(/a third empty stylesheet/)
199
217
  #expect(word).to match(/<title>test<\/title>/)
200
218
  expect(word).to match(/test_files\/header.html/)
@@ -217,7 +235,13 @@ expect(File.exist?("test.doc")).to be true
217
235
  INPUT
218
236
  word = File.read("test.doc")
219
237
  expect(word).to match(/another empty stylesheet/)
220
- expect(word).to match(/font-family: Arial/)
238
+ expect(word).to match(/p \{[^}]*?font-family: Arial/m)
239
+ expect(word).to match(/code \{[^}]*?font-family: Courier/m)
240
+ expect(word).to match(/h1 \{[^}]*?font-family: Arial/m)
241
+ expect(word).to match(/p \{[^}]*?font-size: 12pt/m)
242
+ expect(word).to match(/code \{[^}]*?font-size: 11pt/m)
243
+ expect(word).to match(/p\.note \{[^}]*?font-size: 10pt/m)
244
+ expect(word).to match(/aside \{[^}]*?font-size: 9pt/m)
221
245
  expect(word).to match(/a third empty stylesheet/)
222
246
  #expect(word).to match(/<title>test<\/title>/)
223
247
  expect(word).to match(/test_files\/header.html/)
@@ -512,7 +536,7 @@ TOCLEVEL
512
536
  <p id="_ff27c067-2785-4551-96cf-0a73530ff1e6">This is a footnote.</p>
513
537
  </fn><clause id="N" inline-header="false" obligation="normative">
514
538
  <title>Introduction to this<fn reference="2">
515
- <p id="_ff27c067-2785-4551-96cf-0a73530ff1e6">Formerly denoted as 15 % (m/m).</p>
539
+ Formerly denoted as 15 % (m/m).
516
540
  </fn></title>
517
541
  </clause>
518
542
  <clause id="O" inline-header="false" obligation="normative">
@@ -548,7 +572,7 @@ TOCLEVEL
548
572
  </a>This is a footnote.</p>
549
573
  <a href="#fnref:1">&#x21A9;</a></aside>
550
574
  <aside id="fn:2" class="footnote">
551
- <p id="_ff27c067-2785-4551-96cf-0a73530ff1e6"><a class='FootnoteRef' href='#fn:2'><sup>2</sup></a>Formerly denoted as 15 % (m/m).</p>
575
+ <a class='FootnoteRef' href='#fn:2'><sup>2</sup></a>Formerly denoted as 15 % (m/m).
552
576
  <a href="#fnref:2">&#x21A9;</a></aside>
553
577
  </main>
554
578
  OUTPUT
@@ -494,7 +494,7 @@ it "customises localisation of numbers" do
494
494
  </bibdata>
495
495
  <preface>
496
496
  <p><stem type="MathML"><math xmlns="http://www.w3.org/1998/Math/MathML"><mn>30000</mn></math></stem>
497
- <stem type="MathML"><math xmlns="http://www.w3.org/1998/Math/MathML"><mi>P</mi><mfenced open="(" close=")"><mrow><mi>X</mi><mo>≥</mo><msub><mrow><mi>X</mi></mrow><mrow><mo>max</mo></mrow></msub></mrow></mfenced><mo>=</mo><munderover><mrow><mo>∑</mo></mrow><mrow><mrow><mi>j</mi><mo>=</mo><msub><mrow><mi>X</mi></mrow><mrow><mo>max</mo></mrow></msub></mrow></mrow><mrow><mn>1000</mn></mrow></munderover><mfenced open="(" close=")"><mtable><mtr><mtd><mn>1000</mn></mtd></mtr><mtr><mtd><mi>j</mi></mtd></mtr></mtable></mfenced><msup><mrow><mi>p</mi></mrow><mrow><mi>j</mi></mrow></msup><msup><mrow><mfenced open="(" close=")"><mrow><mn>1</mn><mo>−</mo><mi>p</mi></mrow></mfenced></mrow><mrow><mrow><mn>1.003</mn><mo>−</mo><mi>j</mi></mrow></mrow></msup></math></stem></p>
497
+ <stem type="MathML"><math xmlns="http://www.w3.org/1998/Math/MathML"><mi>P</mi><mfenced open="(" close=")"><mrow><mi>X</mi><mo>≥</mo><msub><mrow><mi>X</mi></mrow><mrow><mo>max</mo></mrow></msub></mrow></mfenced><mo>=</mo><munderover><mrow><mo>∑</mo></mrow><mrow><mrow><mi>j</mi><mo>=</mo><msub><mrow><mi>X</mi></mrow><mrow><mo>max</mo></mrow></msub></mrow></mrow><mrow><mn>1000</mn></mrow></munderover><mfenced open="(" close=")"><mtable><mtr><mtd><mn>1000</mn></mtd></mtr><mtr><mtd><mi>j</mi></mtd></mtr></mtable></mfenced><msup><mrow><mi>p</mi></mrow><mrow><mi>j</mi></mrow></msup><msup><mrow><mfenced open="(" close=")"><mrow><mn>0.0000032</mn><mo>−</mo><mi>p</mi></mrow></mfenced></mrow><mrow><mrow><mn>1.003</mn><mo>−</mo><mi>j</mi></mrow></mrow></msup></math></stem></p>
498
498
  </preface>
499
499
  </iso-standard>
500
500
  INPUT
@@ -573,7 +573,7 @@ it "customises localisation of numbers" do
573
573
  <mrow>
574
574
  <mfenced open='(' close=')'>
575
575
  <mrow>
576
- <mn>1</mn>
576
+ <mn>0,0000032</mn>
577
577
  <mo>&#x2212;</mo>
578
578
  <mi>p</mi>
579
579
  </mrow>
@@ -63,7 +63,7 @@ RSpec.describe IsoDoc do
63
63
  </bibitem>
64
64
  <bibitem id="ref1">
65
65
  <formattedref format="application/x-isodoc+xml"><smallcap>Standard No I.C.C 167</smallcap>. <em>Determination of the protein content in cereal and cereal products for food and animal feeding stuffs according to the Dumas combustion method</em> (see <link target="http://www.icc.or.at"/>)</formattedref>
66
- <docidentifier type="ICC">167</docidentifier>
66
+ <docidentifier type="ICC">ICC/167</docidentifier>
67
67
  </bibitem>
68
68
  <note><p>This is an annotation of ISO 20483:2013-2014</p></note>
69
69
  <bibitem id="zip_ffs"><formattedref format="application/x-isodoc+xml">Title 5</formattedref><docidentifier type="metanorma">[5]</docidentifier></bibitem>
@@ -136,7 +136,7 @@ RSpec.describe IsoDoc do
136
136
  <eref bibitemid='ISBN'>[1]</eref>
137
137
  <eref bibitemid='ISSN'>[2]</eref>
138
138
  <eref bibitemid='ISO16634'>ISO 16634:-- (all parts)</eref>
139
- <eref bibitemid='ref1'>ICC 167</eref>
139
+ <eref bibitemid='ref1'>ICC/167</eref>
140
140
  <eref bibitemid='ref10'>[10]</eref>
141
141
  <eref bibitemid='ref12'>Citn</eref>
142
142
  <eref bibitemid='zip_ffs'>[5]</eref>
@@ -213,7 +213,7 @@ RSpec.describe IsoDoc do
213
213
  <link target='http://www.icc.or.at'/>
214
214
  )
215
215
  </formattedref>
216
- <docidentifier type='ICC'>167</docidentifier>
216
+ <docidentifier type='ICC'>ICC/167</docidentifier>
217
217
  </bibitem>
218
218
  <note>
219
219
  <name>NOTE</name>
@@ -309,7 +309,7 @@ RSpec.describe IsoDoc do
309
309
  <a href='#ISBN'>[1]</a>
310
310
  <a href='#ISSN'>[2]</a>
311
311
  <a href='#ISO16634'>ISO 16634:-- (all parts)</a>
312
- <a href='#ref1'>ICC 167</a>
312
+ <a href='#ref1'>ICC/167</a>
313
313
  <a href='#ref10'>[10]</a>
314
314
  <a href='#ref12'>Citn</a>
315
315
  <a href='#zip_ffs'>[5]</a>
@@ -342,7 +342,7 @@ RSpec.describe IsoDoc do
342
342
  <i>Cereals and pulses</i>
343
343
  </p>
344
344
  <p id='ref1' class='NormRef'>
345
- ICC 167,
345
+ ICC/167,
346
346
  <span style='font-variant:small-caps;'>Standard No I.C.C 167</span>
347
347
  .
348
348
  <i>
@@ -424,4 +424,322 @@ RSpec.describe IsoDoc do
424
424
  expect(xmlpp(IsoDoc::HtmlConvert.new({}).convert("test", presxml, true))).to be_equivalent_to xmlpp(html)
425
425
  end
426
426
 
427
+
428
+ it "processes hidden references sections in Relaton bibliographies" do
429
+ presxml = <<~PRESXML
430
+ <iso-standard xmlns='http://riboseinc.com/isoxml' type="presentation">
431
+ <bibdata>
432
+ <language current="true">en</language>
433
+ </bibdata>
434
+ <preface>
435
+ <foreword>
436
+ <p id='_f06fd0d1-a203-4f3d-a515-0bdba0f8d83f'>
437
+ <eref bibitemid='ISO712'>[110]</eref>
438
+ <eref bibitemid='ISBN'>[1]</eref>
439
+ <eref bibitemid='ISSN'>[2]</eref>
440
+ <eref bibitemid='ISO16634'>ISO 16634:-- (all parts)</eref>
441
+ <eref bibitemid='ref1'>ICC/167</eref>
442
+ <eref bibitemid='ref10'>[10]</eref>
443
+ <eref bibitemid='ref12'>Citn</eref>
444
+ <eref bibitemid='zip_ffs'>[5]</eref>
445
+ </p>
446
+ </foreword>
447
+ </preface>
448
+ <bibliography>
449
+ <references id='_normative_references' obligation='informative' normative='true' hidden="true">
450
+ <title depth='1'>1.<tab/>Normative References</title>
451
+ <p>
452
+ The following documents are referred to in the text in such a way that
453
+ some or all of their content constitutes requirements of this document.
454
+ For dated references, only the edition cited applies. For undated
455
+ references, the latest edition of the referenced document (including any
456
+ amendments) applies.
457
+ </p>
458
+ <bibitem id='ISO712' type='standard'>
459
+ <title format='text/plain'>Cereals or cereal products</title>
460
+ <title type='main' format='text/plain'>Cereals and cereal products</title>
461
+ <docidentifier type='ISO'>ISO 712</docidentifier>
462
+ <docidentifier type='metanorma'>[110]</docidentifier>
463
+ <contributor>
464
+ <role type='publisher'/>
465
+ <organization>
466
+ <name>International Organization for Standardization</name>
467
+ </organization>
468
+ </contributor>
469
+ </bibitem>
470
+ <bibitem id='ISO16634' type='standard'>
471
+ <title language='x' format='text/plain'>
472
+ Cereals, pulses, milled cereal products, xxxx, oilseeds and animal
473
+ feeding stuffs
474
+ </title>
475
+ <title language='en' format='text/plain'>Cereals, pulses, milled cereal products, oilseeds and animal feeding stuffs</title>
476
+ <docidentifier type='ISO'>ISO 16634:-- (all parts)</docidentifier>
477
+ <date type='published'>
478
+ <on>--</on>
479
+ </date>
480
+ <contributor>
481
+ <role type='publisher'/>
482
+ <organization>
483
+ <abbreviation>ISO</abbreviation>
484
+ </organization>
485
+ </contributor>
486
+ <note format='text/plain' type='Unpublished-Status' reference='1'>Under preparation. (Stage at the time of publication ISO/DIS 16634)</note>
487
+ <extent type='part'>
488
+ <referenceFrom>all</referenceFrom>
489
+ </extent>
490
+ </bibitem>
491
+ <bibitem id='ISO20483' type='standard'>
492
+ <title format='text/plain'>Cereals and pulses</title>
493
+ <docidentifier type='ISO'>ISO 20483:2013-2014</docidentifier>
494
+ <date type='published'>
495
+ <from>2013</from>
496
+ <to>2014</to>
497
+ </date>
498
+ <contributor>
499
+ <role type='publisher'/>
500
+ <organization>
501
+ <name>International Organization for Standardization</name>
502
+ </organization>
503
+ </contributor>
504
+ </bibitem>
505
+ <bibitem id='ref1'>
506
+ <formattedref format='application/x-isodoc+xml'>
507
+ <smallcap>Standard No I.C.C 167</smallcap>
508
+ .
509
+ <em>
510
+ Determination of the protein content in cereal and cereal products
511
+ for food and animal feeding stuffs according to the Dumas combustion
512
+ method
513
+ </em>
514
+ (see
515
+ <link target='http://www.icc.or.at'/>
516
+ )
517
+ </formattedref>
518
+ <docidentifier type='ICC'>ICC/167</docidentifier>
519
+ </bibitem>
520
+ <note>
521
+ <name>NOTE</name>
522
+ <p>This is an annotation of ISO 20483:2013-2014</p>
523
+ </note>
524
+ <bibitem id='zip_ffs'>
525
+ <formattedref format='application/x-isodoc+xml'>Title 5</formattedref>
526
+ <docidentifier type='metanorma'>[5]</docidentifier>
527
+ </bibitem>
528
+ </references>
529
+ <references id='_bibliography' obligation='informative' normative='false' hidden="true">
530
+ <title depth="1">Bibliography</title>
531
+ <bibitem id='ISBN' type='ISBN'>
532
+ <title format='text/plain'>Chemicals for analytical laboratory use</title>
533
+ <docidentifier type='ISBN'>ISBN</docidentifier>
534
+ <docidentifier type='metanorma'>[1]</docidentifier>
535
+ <contributor>
536
+ <role type='publisher'/>
537
+ <organization>
538
+ <abbreviation>ISBN</abbreviation>
539
+ </organization>
540
+ </contributor>
541
+ </bibitem>
542
+ <bibitem id='ISSN' type='ISSN'>
543
+ <title format='text/plain'>Instruments for analytical laboratory use</title>
544
+ <docidentifier type='ISSN'>ISSN</docidentifier>
545
+ <docidentifier type='metanorma'>[2]</docidentifier>
546
+ <contributor>
547
+ <role type='publisher'/>
548
+ <organization>
549
+ <abbreviation>ISSN</abbreviation>
550
+ </organization>
551
+ </contributor>
552
+ </bibitem>
553
+ <note>
554
+ <name>NOTE</name>
555
+ <p>This is an annotation of document ISSN.</p>
556
+ </note>
557
+ <note>
558
+ <name>NOTE</name>
559
+ <p>This is another annotation of document ISSN.</p>
560
+ </note>
561
+ <bibitem id='ISO3696' type='standard'>
562
+ <title format='text/plain'>Water for analytical laboratory use</title>
563
+ <docidentifier type='ISO'>ISO 3696</docidentifier>
564
+ <contributor>
565
+ <role type='publisher'/>
566
+ <organization>
567
+ <abbreviation>ISO</abbreviation>
568
+ </organization>
569
+ </contributor>
570
+ </bibitem>
571
+ <bibitem id='ref10'>
572
+ <formattedref format='application/x-isodoc+xml'>
573
+ <smallcap>Standard No I.C.C 167</smallcap>
574
+ .
575
+ <em>
576
+ Determination of the protein content in cereal and cereal products
577
+ for food and animal feeding stuffs according to the Dumas combustion
578
+ method
579
+ </em>
580
+ (see
581
+ <link target='http://www.icc.or.at'/>
582
+ )
583
+ </formattedref>
584
+ <docidentifier type='metanorma'>[10]</docidentifier>
585
+ </bibitem>
586
+ <bibitem id='ref11'>
587
+ <title>Internet Calendaring and Scheduling Core Object Specification (iCalendar)</title>
588
+ <docidentifier type='IETF'>RFC 10</docidentifier>
589
+ </bibitem>
590
+ <bibitem id='ref12'>
591
+ <formattedref format='application/x-isodoc+xml'>
592
+ CitationWorks. 2019.
593
+ <em>How to cite a reference</em>
594
+ .
595
+ </formattedref>
596
+ <docidentifier type='metanorma'>[Citn]</docidentifier>
597
+ <docidentifier type='IETF'>RFC 20</docidentifier>
598
+ </bibitem>
599
+ </references>
600
+ </bibliography>
601
+ </iso-standard>
602
+ PRESXML
603
+
604
+ html = <<~OUTPUT
605
+ #{HTML_HDR}
606
+ <br/>
607
+ <div>
608
+ <h1 class='ForewordTitle'>Foreword</h1>
609
+ <p id='_f06fd0d1-a203-4f3d-a515-0bdba0f8d83f'>
610
+ <a href='#ISO712'>[110]</a>
611
+ <a href='#ISBN'>[1]</a>
612
+ <a href='#ISSN'>[2]</a>
613
+ <a href='#ISO16634'>ISO 16634:-- (all parts)</a>
614
+ <a href='#ref1'>ICC/167</a>
615
+ <a href='#ref10'>[10]</a>
616
+ <a href='#ref12'>Citn</a>
617
+ <a href='#zip_ffs'>[5]</a>
618
+ </p>
619
+ </div>
620
+ <p class='zzSTDTitle1'/>
621
+ </div>
622
+ </body>
623
+ </html>
624
+
625
+ OUTPUT
626
+ expect(xmlpp(IsoDoc::HtmlConvert.new({}).convert("test", presxml, true))).to be_equivalent_to xmlpp(html)
627
+ end
628
+
629
+ it "processes hidden references sections in Relaton bibliographies" do
630
+ presxml = <<~PRESXML
631
+ <iso-standard xmlns='http://riboseinc.com/isoxml' type="presentation">
632
+ <bibdata>
633
+ <language current="true">en</language>
634
+ </bibdata>
635
+ <preface>
636
+ <foreword>
637
+ <p id='_f06fd0d1-a203-4f3d-a515-0bdba0f8d83f'>
638
+ <eref bibitemid='ISO712'>[110]</eref>
639
+ <eref bibitemid='ISBN'>[1]</eref>
640
+ <eref bibitemid='ISSN'>[2]</eref>
641
+ <eref bibitemid='ISO16634'>ISO 16634:-- (all parts)</eref>
642
+ <eref bibitemid='ref1'>ICC/167</eref>
643
+ <eref bibitemid='ref10'>[10]</eref>
644
+ <eref bibitemid='ref12'>Citn</eref>
645
+ <eref bibitemid='zip_ffs'>[5]</eref>
646
+ </p>
647
+ </foreword>
648
+ </preface>
649
+ <bibliography>
650
+ <references id='_normative_references' obligation='informative' normative='true'>
651
+ <title depth='1'>1.<tab/>Normative References</title>
652
+ <p>
653
+ The following documents are referred to in the text in such a way that
654
+ some or all of their content constitutes requirements of this document.
655
+ For dated references, only the edition cited applies. For undated
656
+ references, the latest edition of the referenced document (including any
657
+ amendments) applies.
658
+ </p>
659
+ <bibitem id='ISO712' type='standard' hidden="true">
660
+ <title format='text/plain'>Cereals or cereal products</title>
661
+ <title type='main' format='text/plain'>Cereals and cereal products</title>
662
+ <docidentifier type='ISO'>ISO 712</docidentifier>
663
+ <docidentifier type='metanorma'>[110]</docidentifier>
664
+ <contributor>
665
+ <role type='publisher'/>
666
+ <organization>
667
+ <name>International Organization for Standardization</name>
668
+ </organization>
669
+ </contributor>
670
+ </bibitem>
671
+ <bibitem id='ISO16634' type='standard'>
672
+ <title language='x' format='text/plain'>
673
+ Cereals, pulses, milled cereal products, xxxx, oilseeds and animal
674
+ feeding stuffs
675
+ </title>
676
+ <title language='en' format='text/plain'>Cereals, pulses, milled cereal products, oilseeds and animal feeding stuffs</title>
677
+ <docidentifier type='ISO'>ISO 16634:-- (all parts)</docidentifier>
678
+ <date type='published'>
679
+ <on>--</on>
680
+ </date>
681
+ <contributor>
682
+ <role type='publisher'/>
683
+ <organization>
684
+ <abbreviation>ISO</abbreviation>
685
+ </organization>
686
+ </contributor>
687
+ <note format='text/plain' type='Unpublished-Status' reference='1'>Under preparation. (Stage at the time of publication ISO/DIS 16634)</note>
688
+ <extent type='part'>
689
+ <referenceFrom>all</referenceFrom>
690
+ </extent>
691
+ </bibitem>
692
+ </references></bibliography></iso-standard>
693
+ PRESXML
694
+
695
+ html = <<~OUTPUT
696
+ #{HTML_HDR}
697
+ <br/>
698
+ <div>
699
+ <h1 class='ForewordTitle'>Foreword</h1>
700
+ <p id='_f06fd0d1-a203-4f3d-a515-0bdba0f8d83f'>
701
+ <a href='#ISO712'>[110]</a>
702
+ <a href='#ISBN'>[1]</a>
703
+ <a href='#ISSN'>[2]</a>
704
+ <a href='#ISO16634'>ISO 16634:-- (all parts)</a>
705
+ <a href='#ref1'>ICC/167</a>
706
+ <a href='#ref10'>[10]</a>
707
+ <a href='#ref12'>Citn</a>
708
+ <a href='#zip_ffs'>[5]</a>
709
+ </p>
710
+ </div>
711
+ <p class='zzSTDTitle1'/>
712
+ <div>
713
+ <h1>1.&#160; Normative References</h1>
714
+ <p>
715
+ The following documents are referred to in the text in such a way
716
+ that some or all of their content constitutes requirements of this
717
+ document. For dated references, only the edition cited applies. For
718
+ undated references, the latest edition of the referenced document
719
+ (including any amendments) applies.
720
+ </p>
721
+ <p id='ISO16634' class='NormRef'>
722
+ ISO 16634:-- (all parts)
723
+ <a class='FootnoteRef' href='#fn:1'>
724
+ <sup>1</sup>
725
+ </a>
726
+ ,
727
+ <i>Cereals, pulses, milled cereal products, oilseeds and animal feeding stuffs</i>
728
+ </p>
729
+ </div>
730
+ <aside id='fn:1' class='footnote'>
731
+ <p>Under preparation. (Stage at the time of publication ISO/DIS 16634)</p>
732
+ </aside>
733
+
734
+ </div>
735
+ </body>
736
+ </html>
737
+
738
+ OUTPUT
739
+ expect(xmlpp(IsoDoc::HtmlConvert.new({}).convert("test", presxml, true))).to be_equivalent_to xmlpp(html)
740
+ end
741
+
742
+
427
743
  end
744
+
745
+
@@ -2313,7 +2313,7 @@ OUTPUT
2313
2313
  <li id="N1"><p>A</p></li>
2314
2314
  </ol>
2315
2315
  <clause id="xyz"><title>Preparatory</title>
2316
- <ol id="N02">
2316
+ <ol id="N02" type="arabic">
2317
2317
  <li id="N2"><p>A</p></li>
2318
2318
  </ol>
2319
2319
  </clause>
@@ -2321,17 +2321,17 @@ OUTPUT
2321
2321
  </preface>
2322
2322
  <sections>
2323
2323
  <clause id="scope" type="scope"><title>Scope</title>
2324
- <ol id="N0">
2324
+ <ol id="N0" type="roman">
2325
2325
  <li id="N"><p>A</p></li>
2326
2326
  </ol>
2327
2327
  </clause>
2328
2328
  <terms id="terms"/>
2329
2329
  <clause id="widgets"><title>Widgets</title>
2330
2330
  <clause id="widgets1">
2331
- <ol id="note1l">
2331
+ <ol id="note1l" type="alphabet">
2332
2332
  <li id="note1"><p>A</p></li>
2333
2333
  </ol>
2334
- <ol id="note2l">
2334
+ <ol id="note2l" type="roman_upper">
2335
2335
  <li id="note2"><p>A</p></li>
2336
2336
  </ol>
2337
2337
  </clause>
@@ -2339,12 +2339,12 @@ OUTPUT
2339
2339
  </sections>
2340
2340
  <annex id="annex1">
2341
2341
  <clause id="annex1a">
2342
- <ol id="ANl">
2342
+ <ol id="ANl" type="alphabet_upper">
2343
2343
  <li id="AN"><p>A</p></li>
2344
2344
  </ol>
2345
2345
  </clause>
2346
2346
  <clause id="annex1b">
2347
- <ol id="Anote1l">
2347
+ <ol id="Anote1l" type="roman" start="4">
2348
2348
  <li id="Anote1"><p>A</p></li>
2349
2349
  </ol>
2350
2350
  <ol id="Anote2l">
@@ -2360,12 +2360,12 @@ OUTPUT
2360
2360
  <foreword>
2361
2361
  <p>
2362
2362
  <xref target='N1'>Introduction, a)</xref>
2363
- <xref target='N2'>Preparatory, a)</xref>
2364
- <xref target='N'>Clause 1, a)</xref>
2363
+ <xref target='N2'>Preparatory, 1)</xref>
2364
+ <xref target='N'>Clause 1, i)</xref>
2365
2365
  <xref target='note1'>Clause 3.1, List 1 a)</xref>
2366
- <xref target='note2'>Clause 3.1, List 2 a)</xref>
2367
- <xref target='AN'>Annex A.1, a)</xref>
2368
- <xref target='Anote1'>Annex A.2, List 1 a)</xref>
2366
+ <xref target='note2'>Clause 3.1, List 2 I)</xref>
2367
+ <xref target='AN'>Annex A.1, A)</xref>
2368
+ <xref target='Anote1'>Annex A.2, List 1 iv)</xref>
2369
2369
  <xref target='Anote2'>Annex A.2, List 2 a)</xref>
2370
2370
  </p>
2371
2371
  </foreword>
@@ -2377,7 +2377,7 @@ OUTPUT
2377
2377
  </ol>
2378
2378
  <clause id='xyz'>
2379
2379
  <title depth='2'>Preparatory</title>
2380
- <ol id='N02'>
2380
+ <ol id='N02' type="arabic">
2381
2381
  <li id='N2'>
2382
2382
  <p>A</p>
2383
2383
  </li>
@@ -2392,7 +2392,7 @@ OUTPUT
2392
2392
  <tab/>
2393
2393
  Scope
2394
2394
  </title>
2395
- <ol id='N0'>
2395
+ <ol id='N0' type="roman">
2396
2396
  <li id='N'>
2397
2397
  <p>A</p>
2398
2398
  </li>
@@ -2408,12 +2408,12 @@ OUTPUT
2408
2408
  Widgets
2409
2409
  </title>
2410
2410
  <clause id='widgets1'><title>3.1.</title>
2411
- <ol id='note1l'>
2411
+ <ol id='note1l' type="alphabet">
2412
2412
  <li id='note1'>
2413
2413
  <p>A</p>
2414
2414
  </li>
2415
2415
  </ol>
2416
- <ol id='note2l'>
2416
+ <ol id='note2l' type="roman_upper">
2417
2417
  <li id='note2'>
2418
2418
  <p>A</p>
2419
2419
  </li>
@@ -2428,14 +2428,14 @@ OUTPUT
2428
2428
  (informative)
2429
2429
  </title>
2430
2430
  <clause id='annex1a'><title>A.1.</title>
2431
- <ol id='ANl'>
2431
+ <ol id='ANl' type="alphabet_upper">
2432
2432
  <li id='AN'>
2433
2433
  <p>A</p>
2434
2434
  </li>
2435
2435
  </ol>
2436
2436
  </clause>
2437
2437
  <clause id='annex1b'><title>A.2.</title>
2438
- <ol id='Anote1l'>
2438
+ <ol id='Anote1l' type="roman" start="4">
2439
2439
  <li id='Anote1'>
2440
2440
  <p>A</p>
2441
2441
  </li>
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: isodoc
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.8
4
+ version: 1.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ribose Inc.
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-11-09 00:00:00.000000000 Z
11
+ date: 2020-11-30 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: asciimath
@@ -352,6 +352,7 @@ files:
352
352
  - lib/isodoc/class_utils.rb
353
353
  - lib/isodoc/common.rb
354
354
  - lib/isodoc/convert.rb
355
+ - lib/isodoc/css.rb
355
356
  - lib/isodoc/function.rb
356
357
  - lib/isodoc/function/blocks.rb
357
358
  - lib/isodoc/function/blocks_example_note.rb