isodoc 1.2.6 → 1.4.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (63) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/rake.yml +69 -0
  3. data/README.adoc +1 -3
  4. data/isodoc.gemspec +2 -1
  5. data/lib/isodoc-yaml/i18n-en.yaml +56 -0
  6. data/lib/isodoc-yaml/i18n-fr.yaml +64 -7
  7. data/lib/isodoc-yaml/i18n-zh-Hans.yaml +1 -0
  8. data/lib/isodoc/base_style/all.css +4 -0
  9. data/lib/isodoc/base_style/blocks.scss +2 -2
  10. data/lib/isodoc/base_style/reset.css +4 -0
  11. data/lib/isodoc/base_style/reset.scss +5 -0
  12. data/lib/isodoc/base_style/typography.scss +1 -1
  13. data/lib/isodoc/convert.rb +13 -98
  14. data/lib/isodoc/css.rb +95 -0
  15. data/lib/isodoc/function/inline.rb +0 -33
  16. data/lib/isodoc/function/inline_simple.rb +4 -1
  17. data/lib/isodoc/function/lists.rb +2 -1
  18. data/lib/isodoc/function/references.rb +8 -13
  19. data/lib/isodoc/function/section.rb +1 -1
  20. data/lib/isodoc/function/table.rb +10 -0
  21. data/lib/isodoc/function/to_word_html.rb +2 -2
  22. data/lib/isodoc/gem_tasks.rb +4 -0
  23. data/lib/isodoc/html_function/html.rb +1 -0
  24. data/lib/isodoc/html_function/mathvariant_to_plain.rb +82 -0
  25. data/lib/isodoc/html_function/postprocess.rb +41 -20
  26. data/lib/isodoc/i18n.rb +15 -2
  27. data/lib/isodoc/metadata.rb +28 -109
  28. data/lib/isodoc/metadata_contributor.rb +91 -0
  29. data/lib/isodoc/metadata_date.rb +6 -0
  30. data/lib/isodoc/presentation_function/bibdata.rb +79 -7
  31. data/lib/isodoc/presentation_function/block.rb +14 -9
  32. data/lib/isodoc/presentation_function/inline.rb +126 -22
  33. data/lib/isodoc/presentation_function/section.rb +9 -0
  34. data/lib/isodoc/presentation_xml_convert.rb +5 -0
  35. data/lib/isodoc/version.rb +1 -1
  36. data/lib/isodoc/word_convert.rb +0 -20
  37. data/lib/isodoc/word_function/body.rb +12 -0
  38. data/lib/isodoc/word_function/postprocess.rb +38 -80
  39. data/lib/isodoc/word_function/postprocess_cover.rb +55 -0
  40. data/lib/isodoc/word_function/table.rb +10 -0
  41. data/lib/isodoc/xref.rb +1 -0
  42. data/lib/isodoc/xref/xref_counter.rb +20 -9
  43. data/lib/isodoc/xref/xref_gen.rb +20 -2
  44. data/lib/isodoc/xref/xref_sect_gen.rb +1 -1
  45. data/spec/assets/html.scss +14 -0
  46. data/spec/assets/i18n.yaml +17 -9
  47. data/spec/isodoc/blocks_spec.rb +89 -241
  48. data/spec/isodoc/cleanup_spec.rb +0 -1
  49. data/spec/isodoc/footnotes_spec.rb +4 -5
  50. data/spec/isodoc/i18n_spec.rb +73 -38
  51. data/spec/isodoc/inline_spec.rb +177 -199
  52. data/spec/isodoc/lists_spec.rb +1 -1
  53. data/spec/isodoc/metadata_spec.rb +50 -7
  54. data/spec/isodoc/postproc_spec.rb +472 -11
  55. data/spec/isodoc/presentation_xml_spec.rb +584 -1
  56. data/spec/isodoc/ref_spec.rb +327 -12
  57. data/spec/isodoc/table_spec.rb +28 -0
  58. data/spec/isodoc/xref_spec.rb +162 -17
  59. data/spec/spec_helper.rb +2 -0
  60. metadata +22 -7
  61. data/.github/workflows/macos.yml +0 -42
  62. data/.github/workflows/ubuntu.yml +0 -62
  63. data/.github/workflows/windows.yml +0 -44
@@ -4,8 +4,21 @@ module IsoDoc
4
4
  class I18n
5
5
  def load_yaml(lang, script, i18nyaml = nil)
6
6
  ret = load_yaml1(lang, script)
7
- return ret.merge(YAML.load_file(i18nyaml)) if i18nyaml
8
- ret
7
+ return normalise_hash(ret.merge(YAML.load_file(i18nyaml))) if i18nyaml
8
+ normalise_hash(ret)
9
+ end
10
+
11
+ def normalise_hash(ret)
12
+ if ret.is_a? Hash
13
+ ret.each do |k, v|
14
+ ret[k] = normalise_hash(v)
15
+ end
16
+ ret
17
+ elsif ret.is_a? Array then ret.map { |n| normalise_hash(n) }
18
+ elsif ret.is_a? String then ret.unicode_normalize(:nfc)
19
+ else
20
+ ret
21
+ end
9
22
  end
10
23
 
11
24
  def load_yaml1(lang, script)
@@ -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,91 @@
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
+ subdivs = a&.xpath(ns('./affiliation/organization/subdivision'))&.map(&:text)&.join(", ")
21
+ name and subdivs and !subdivs.empty? and name = l10n("#{name}, #{subdivs}", @lang, @script)
22
+ location = a&.at(ns('./affiliation/organization/address/formattedAddress'))&.text
23
+ m << (!name.nil? && !location.nil? ? l10n("#{name}, #{location}", @lang, @script) :
24
+ (name || location || ''))
25
+ m
26
+ end
27
+ end
28
+
29
+ def extract_person_names_affiliations(authors)
30
+ names = extract_person_names(authors)
31
+ affils = extract_person_affiliations(authors)
32
+ ret = {}
33
+ affils.each_with_index do |a, i|
34
+ ret[a] ||= []
35
+ ret[a] << names[i]
36
+ end
37
+ ret
38
+ end
39
+
40
+ def personal_authors(isoxml)
41
+ authors = isoxml.xpath(ns("//bibdata/contributor[role/@type = 'author' "\
42
+ "or xmlns:role/@type = 'editor']/person"))
43
+ set(:authors, extract_person_names(authors))
44
+ set(:authors_affiliations, extract_person_names_affiliations(authors))
45
+ end
46
+
47
+ def author(xml, _out)
48
+ personal_authors(xml)
49
+ agency(xml)
50
+ end
51
+
52
+ def iso?(org)
53
+ name = org&.at(ns('./name'))&.text
54
+ abbrev = org&.at(ns('./abbreviation'))&.text
55
+ (abbrev == 'ISO' ||
56
+ name == 'International Organization for Standardization')
57
+ end
58
+
59
+ def agency1(xml)
60
+ agency = ''
61
+ publisher = []
62
+ xml.xpath(ns("//bibdata/contributor[xmlns:role/@type = 'publisher']/"\
63
+ 'organization')).each do |org|
64
+ name = org&.at(ns('./name'))&.text
65
+ agency1 = org&.at(ns('./abbreviation'))&.text || name
66
+ publisher << name if name
67
+ agency = iso?(org) ? "ISO/#{agency}" : "#{agency}#{agency1}/"
68
+ end
69
+ [agency, publisher]
70
+ end
71
+
72
+ def agency(xml)
73
+ agency, publisher = agency1(xml)
74
+ set(:agency, agency.sub(%r{/$}, ''))
75
+ set(:publisher, @i18n.multiple_and(publisher, @labels['and']))
76
+ agency_addr(xml)
77
+ end
78
+
79
+ def agency_addr(xml)
80
+ a = xml.at(ns("//bibdata/contributor[xmlns:role/@type = 'publisher'][1]/"\
81
+ "organization")) or return
82
+ n = a.at(ns("./subdivision")) and set(:subdivision, n.text)
83
+ n = a.at(ns("./address/formattedAddress")) and
84
+ set(:pub_address, n.children.to_xml)
85
+ n = a.at(ns("./phone[not(@type = 'fax')]")) and set(:pub_phone, n.text)
86
+ n = a.at(ns("./phone[@type = 'fax']")) and set(:pub_fax, n.text)
87
+ n = a.at(ns("./email")) and set(:pub_email, n.text)
88
+ n = a.at(ns("./uri")) and set(:pub_uri, n.text)
89
+ end
90
+ end
91
+ 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)
@@ -14,11 +25,72 @@ module IsoDoc
14
25
  hash_translate(b, @i18n.get["substage_dict"], "./status/substage")
15
26
  end
16
27
 
17
- def hash_translate(bibdata, hash, xpath)
18
- hash.is_a? Hash or return
28
+ def hash_translate(bibdata, hash, xpath, lang = @lang)
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.to_s.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
@@ -1,5 +1,10 @@
1
1
  module IsoDoc
2
2
  class PresentationXMLConvert < ::IsoDoc::Convert
3
+ def lower2cap(s)
4
+ return s if /^[[:upper:]][[:upper:]]/.match(s)
5
+ s.capitalize
6
+ end
7
+
3
8
  def figure(docxml)
4
9
  docxml.xpath(ns("//figure")).each do |f|
5
10
  figure1(f)
@@ -12,7 +17,7 @@ module IsoDoc
12
17
  return if labelled_ancestor(f) && f.ancestors("figure").empty?
13
18
  return if f.at(ns("./figure")) and !f.at(ns("./name"))
14
19
  lbl = @xrefs.anchor(f['id'], :label, false) or return
15
- prefix_name(f, "&nbsp;&mdash; ", l10n("#{@i18n.figure} #{lbl}"), "name")
20
+ prefix_name(f, "&nbsp;&mdash; ", l10n("#{lower2cap @i18n.figure} #{lbl}"), "name")
16
21
  end
17
22
 
18
23
  def prefix_name(f, delim, number, elem)
@@ -36,7 +41,7 @@ module IsoDoc
36
41
  return if labelled_ancestor(f)
37
42
  return unless f.ancestors("example").empty?
38
43
  lbl = @xrefs.anchor(f['id'], :label, false) or return
39
- prefix_name(f, "&nbsp;&mdash; ", l10n("#{@i18n.figure} #{lbl}"), "name")
44
+ prefix_name(f, "&nbsp;&mdash; ", l10n("#{lower2cap @i18n.figure} #{lbl}"), "name")
40
45
  end
41
46
 
42
47
  def formula(docxml)
@@ -65,7 +70,7 @@ module IsoDoc
65
70
 
66
71
  def example1(f)
67
72
  n = @xrefs.get[f["id"]]
68
- lbl = (n.nil? || n[:label].nil? || n[:label].empty?) ? @i18n.example :
73
+ lbl = (n.nil? || n[:label].nil? || n[:label].empty?) ? @i18n.example:
69
74
  l10n("#{@i18n.example} #{n[:label]}")
70
75
  prefix_name(f, "&nbsp;&mdash; ", lbl, "name")
71
76
  end
@@ -81,7 +86,7 @@ module IsoDoc
81
86
  return if f.parent.name == "bibitem"
82
87
  n = @xrefs.get[f["id"]]
83
88
  lbl = (@i18n.note if n.nil? || n[:label].nil? || n[:label].empty?) ?
84
- @i18n.note : l10n("#{@i18n.note} #{n[:label]}")
89
+ @i18n.note: l10n("#{@i18n.note} #{n[:label]}")
85
90
  prefix_name(f, "", lbl, "name")
86
91
  end
87
92
 
@@ -94,24 +99,24 @@ module IsoDoc
94
99
  # introduce name element
95
100
  def termnote1(f)
96
101
  lbl = l10n(@xrefs.anchor(f['id'], :label) || '???')
97
- prefix_name(f, "", lbl, "name")
102
+ prefix_name(f, "", lower2cap(lbl), "name")
98
103
  end
99
104
 
100
105
  def recommendation(docxml)
101
106
  docxml.xpath(ns("//recommendation")).each do |f|
102
- recommendation1(f, @i18n.recommendation)
107
+ recommendation1(f, lower2cap(@i18n.recommendation))
103
108
  end
104
109
  end
105
110
 
106
111
  def requirement(docxml)
107
112
  docxml.xpath(ns("//requirement")).each do |f|
108
- recommendation1(f, @i18n.requirement)
113
+ recommendation1(f, lower2cap(@i18n.requirement))
109
114
  end
110
115
  end
111
116
 
112
117
  def permission(docxml)
113
118
  docxml.xpath(ns("//permission")).each do |f|
114
- recommendation1(f, @i18n.permission)
119
+ recommendation1(f, lower2cap(@i18n.permission))
115
120
  end
116
121
  end
117
122
 
@@ -132,7 +137,7 @@ module IsoDoc
132
137
  return if labelled_ancestor(f)
133
138
  return if f["unnumbered"] && !f.at(ns("./name"))
134
139
  n = @xrefs.anchor(f['id'], :label, false)
135
- prefix_name(f, "&nbsp;&mdash; ", l10n("#{@i18n.table} #{n}"), "name")
140
+ prefix_name(f, "&nbsp;&mdash; ", l10n("#{lower2cap @i18n.table} #{n}"), "name")
136
141
  end
137
142
 
138
143
  # we use this to eliminate the semantic amend blocks from rendering