asciidoctor-iso 0.0.1 → 0.6.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (55) hide show
  1. checksums.yaml +4 -4
  2. data/.gitattributes +2 -0
  3. data/.gitignore +1 -0
  4. data/.hound.yml +3 -0
  5. data/.rubocop.ribose.yml +65 -0
  6. data/.rubocop.tb.yml +640 -0
  7. data/Gemfile +4 -0
  8. data/Gemfile.lock +162 -0
  9. data/Makefile +39 -0
  10. data/README.adoc +396 -59
  11. data/Rakefile +6 -0
  12. data/asciidoctor-iso.gemspec +11 -3
  13. data/lib/asciidoctor/iso/base.rb +122 -51
  14. data/lib/asciidoctor/iso/blocks.rb +119 -108
  15. data/lib/asciidoctor/iso/cleanup.rb +214 -0
  16. data/lib/asciidoctor/iso/cleanup_block.rb +157 -0
  17. data/lib/asciidoctor/iso/converter.rb +5 -3
  18. data/lib/asciidoctor/iso/front.rb +37 -28
  19. data/lib/asciidoctor/iso/html/header.html +184 -0
  20. data/lib/asciidoctor/iso/html/html_iso_intro.html +73 -0
  21. data/lib/asciidoctor/iso/html/html_iso_titlepage.html +31 -0
  22. data/lib/asciidoctor/iso/html/htmlstyle.css +67 -0
  23. data/lib/asciidoctor/iso/html/isodoc.css +679 -0
  24. data/lib/asciidoctor/iso/html/word_iso_intro.html +72 -0
  25. data/lib/asciidoctor/iso/html/word_iso_titlepage.html +58 -0
  26. data/lib/asciidoctor/iso/inline_anchor.rb +20 -26
  27. data/lib/asciidoctor/iso/isostandard.rnc +177 -0
  28. data/lib/asciidoctor/iso/isostandard.rng +1478 -0
  29. data/lib/asciidoctor/iso/isostandard_diff.rnc +295 -0
  30. data/lib/asciidoctor/iso/lists.rb +152 -109
  31. data/lib/asciidoctor/iso/section.rb +164 -0
  32. data/lib/asciidoctor/iso/table.rb +30 -27
  33. data/lib/asciidoctor/iso/utils.rb +61 -183
  34. data/lib/asciidoctor/iso/validate.make.sh +8 -0
  35. data/lib/asciidoctor/iso/validate.rb +195 -24
  36. data/lib/asciidoctor/iso/validate_style.rb +175 -0
  37. data/lib/asciidoctor/iso/version.rb +1 -1
  38. data/spec/examples/rice.adoc +45 -24
  39. data/spec/examples/rice.doc +17708 -0
  40. data/spec/examples/rice.html +1574 -1662
  41. data/spec/examples/rice.preview.html +1811 -0
  42. data/spec/examples/rice.sh +4 -0
  43. data/spec/examples/rice.xml +888 -62
  44. data/spec/examples/rice_images/rice_image1.png +0 -0
  45. data/spec/examples/rice_images/rice_image2.png +0 -0
  46. data/spec/examples/rice_images/rice_image3_1.png +0 -0
  47. data/spec/examples/rice_images/rice_image3_2.png +0 -0
  48. data/spec/examples/rice_images/rice_image3_3.png +0 -0
  49. metadata +135 -12
  50. data/grammar1.gif +0 -0
  51. data/grammar2.gif +0 -0
  52. data/grammar3.gif +0 -0
  53. data/grammar4.gif +0 -0
  54. data/lib/asciidoctor/iso/validate.rnc +0 -444
  55. data/lib/asciidoctor/iso/validate.rng +0 -1001
@@ -0,0 +1,214 @@
1
+ require "date"
2
+ require "nokogiri"
3
+ require "htmlentities"
4
+ require "json"
5
+ require "pathname"
6
+ require "open-uri"
7
+ require "pp"
8
+ require_relative "./cleanup_block.rb"
9
+
10
+ module Asciidoctor
11
+ module ISO
12
+ module Cleanup
13
+ def textcleanup(text)
14
+ text.gsub(/\s+<fn /, "<fn ")
15
+ end
16
+
17
+ def cleanup(xmldoc)
18
+ termdef_cleanup(xmldoc)
19
+ isotitle_cleanup(xmldoc)
20
+ table_cleanup(xmldoc)
21
+ formula_cleanup(xmldoc)
22
+ figure_cleanup(xmldoc)
23
+ ref_cleanup(xmldoc)
24
+ review_note_cleanup(xmldoc)
25
+ normref_cleanup(xmldoc)
26
+ xref_cleanup(xmldoc)
27
+ para_cleanup(xmldoc)
28
+ callout_cleanup(xmldoc)
29
+ origin_cleanup(xmldoc)
30
+ element_name_cleanup(xmldoc)
31
+ footnote_renumber(xmldoc)
32
+ xmldoc
33
+ end
34
+
35
+ def element_name_cleanup(xmldoc)
36
+ xmldoc.traverse { |n| n.name = n.name.gsub(/_/, "-") }
37
+ end
38
+
39
+ def callout_cleanup(xmldoc)
40
+ xmldoc.xpath("//sourcecode").each do |x|
41
+ callouts = x.elements.select { |e| e.name == "callout" }
42
+ annotations = x.elements.select { |e| e.name == "annotation" }
43
+ if callouts.size == annotations.size
44
+ callouts.each_with_index do |c, i|
45
+ c["target"] = UUIDTools::UUID.random_create
46
+ annotations[i]["id"] = c["id"]
47
+ end
48
+ else
49
+ warn "#{x["id"]}: mismatch of callouts and annotations"
50
+ end
51
+ end
52
+ end
53
+
54
+ def xref_cleanup(xmldoc)
55
+ reference_names(xmldoc)
56
+ xmldoc.xpath("//xref").each do |x|
57
+ #if InlineAnchor::is_refid? x["target"]
58
+ if is_refid? x["target"]
59
+ x.name = "eref"
60
+ x["bibitemid"] = x["target"]
61
+ x["citeas"] = @anchors[x["target"]][:xref]
62
+ x.delete("target")
63
+ else
64
+ x.delete("type")
65
+ end
66
+ end
67
+ end
68
+
69
+ def origin_cleanup(xmldoc)
70
+ xmldoc.xpath("//origin").each do |x|
71
+ x["citeas"] = @anchors[x["bibitemid"]][:xref]
72
+ n = x.next_element
73
+ if !n.nil? && n.name == "isosection"
74
+ n.name = "locality"
75
+ n["type"] = "section"
76
+ n.parent = x
77
+ end
78
+ end
79
+ end
80
+
81
+ def termdef_warn(text, re, term, msg)
82
+ if re.match? text
83
+ warn "ISO style: #{term}: #{msg}"
84
+ end
85
+ end
86
+
87
+ def termdef_style(xmldoc)
88
+ xmldoc.xpath("//term").each do |t|
89
+ para = t.at("./p") or return
90
+ term = t.at("preferred").text
91
+ termdef_warn(para.text, /^(the|a)\b/i, term,
92
+ "term definition starts with article")
93
+ termdef_warn(para.text, /\.$/i, term,
94
+ "term definition ends with period")
95
+ end
96
+ end
97
+
98
+ def termdef_stem_cleanup(xmldoc)
99
+ xmldoc.xpath("//termdef/p/stem").each do |a|
100
+ if a.parent.elements.size == 1
101
+ # para containing just a stem expression
102
+ t = Nokogiri::XML::Element.new("admitted", xmldoc)
103
+ parent = a.parent
104
+ t.children = a.remove
105
+ parent.replace(t)
106
+ end
107
+ end
108
+ end
109
+
110
+ def termdomain_cleanup(xmldoc)
111
+ xmldoc.xpath("//p/domain").each do |a|
112
+ prev = a.parent.previous
113
+ prev.next = a.remove
114
+ end
115
+ end
116
+
117
+ def termdefinition_cleanup(xmldoc)
118
+ xmldoc.xpath("//term").each do |d|
119
+ first_child = d.at("./p | ./figure | ./formula") or return
120
+ t = Nokogiri::XML::Element.new("definition", xmldoc)
121
+ first_child.replace(t)
122
+ t << first_child.remove
123
+ d.xpath("./p | ./figure | ./formula").each do |n|
124
+ t << n.remove
125
+ end
126
+ end
127
+ end
128
+
129
+ def termdef_unnest_cleanup(xmldoc)
130
+ # release termdef tags from surrounding paras
131
+ nodes = xmldoc.xpath("//p/admitted | //p/deprecates")
132
+ while !nodes.empty?
133
+ nodes[0].parent.replace(nodes[0].parent.children)
134
+ nodes = xmldoc.xpath("//p/admitted | //p/deprecates")
135
+ end
136
+ end
137
+
138
+ def termdef_cleanup(xmldoc)
139
+ termdef_unnest_cleanup(xmldoc)
140
+ termdef_stem_cleanup(xmldoc)
141
+ termdomain_cleanup(xmldoc)
142
+ termdefinition_cleanup(xmldoc)
143
+ termdef_style(xmldoc)
144
+ end
145
+
146
+ def isotitle_cleanup(xmldoc)
147
+ # Remove italicised ISO titles
148
+ xmldoc.xpath("//isotitle").each do |a|
149
+ if a.elements.size == 1 && a.elements[0].name == "em"
150
+ a.children = a.elements[0].children
151
+ end
152
+ end
153
+ end
154
+
155
+ def dl_table_cleanup(xmldoc)
156
+ # move Key dl after table footer
157
+ q = "//table/following-sibling::*[1]"\
158
+ "[self::p and normalize-space() = 'Key']"
159
+ xmldoc.xpath(q).each do |s|
160
+ if !s.next_element.nil? && s.next_element.name == "dl"
161
+ s.previous_element << s.next_element.remove
162
+ s.remove
163
+ end
164
+ end
165
+ end
166
+
167
+ def ref_cleanup(xmldoc)
168
+ # move ref before p
169
+ xmldoc.xpath("//p/ref").each do |r|
170
+ parent = r.parent
171
+ parent.previous = r.remove
172
+ end
173
+ xmldoc
174
+ end
175
+
176
+ def review_note_cleanup(xmldoc)
177
+ xmldoc.xpath("//review").each do |n|
178
+ prev = n.previous_element
179
+ if !prev.nil? && prev.name == "p"
180
+ n.parent = prev
181
+ end
182
+ end
183
+ end
184
+
185
+ def normref_cleanup(xmldoc)
186
+ q = "//references[title = 'Normative References']"
187
+ r = xmldoc.at(q)
188
+ r.elements.each do |n|
189
+ unless ["title", "bibitem"].include? n.name
190
+ n.remove
191
+ end
192
+ end
193
+ end
194
+
195
+ def format_ref(ref, isopub)
196
+ return "ISO #{ref}" if isopub
197
+ return "[#{ref}]" if /^\d+$/.match?(ref) && !/^\[.*\]$/.match?(ref)
198
+ ref
199
+ end
200
+
201
+ def reference_names(xmldoc)
202
+ xmldoc.xpath("//bibitem").each do |ref|
203
+ isopub = ref.at(("./publisher/affiliation[name = 'ISO']"))
204
+ docid = ref.at(("./docidentifier"))
205
+ date = ref.at(("./publisherdate"))
206
+ reference = format_ref(docid.text, isopub)
207
+ reference += ": #{date.text}" if date && isopub
208
+ @anchors[ref["id"]] = { xref: reference }
209
+ end
210
+ end
211
+
212
+ end
213
+ end
214
+ end
@@ -0,0 +1,157 @@
1
+ require "date"
2
+ require "nokogiri"
3
+ require "htmlentities"
4
+ require "json"
5
+ require "pathname"
6
+ require "open-uri"
7
+ require "pp"
8
+
9
+ module Asciidoctor
10
+ module ISO
11
+ module Cleanup
12
+ def para_cleanup(xmldoc)
13
+ xmldoc.xpath("//p[not(@id)]").each do |x|
14
+ x["id"] = Utils::anchor_or_uuid
15
+ end
16
+ xmldoc.xpath("//note[not(@id)][not(ancestor::bibitem)]"\
17
+ "[not(ancestor::table)]").each do |x|
18
+ x["id"] = Utils::anchor_or_uuid
19
+ end
20
+ end
21
+
22
+ def dl_table_cleanup(xmldoc)
23
+ # move Key dl after table footer
24
+ q = "//table/following-sibling::*[1]"\
25
+ "[self::p and normalize-space() = 'Key']"
26
+ xmldoc.xpath(q).each do |s|
27
+ if !s.next_element.nil? && s.next_element.name == "dl"
28
+ s.previous_element << s.next_element.remove
29
+ s.remove
30
+ end
31
+ end
32
+ end
33
+
34
+ def header_rows_cleanup(xmldoc)
35
+ q = "//table[@headerrows]"
36
+ xmldoc.xpath(q).each do |s|
37
+ thead = s.at("./thead")
38
+ [1..s["headerrows"].to_i].each do
39
+ row = s.at("./tbody/tr")
40
+ row.parent = thead
41
+ end
42
+ s.delete("headerrows")
43
+ end
44
+ end
45
+
46
+ def table_cleanup(xmldoc)
47
+ dl_table_cleanup(xmldoc)
48
+ notes_table_cleanup(xmldoc)
49
+ header_rows_cleanup(xmldoc)
50
+ end
51
+
52
+ def notes_table_cleanup(xmldoc)
53
+ # move notes into table
54
+ nomatches = false
55
+ until nomatches
56
+ q = "//table/following-sibling::*[1][self::note]"
57
+ nomatches = true
58
+ xmldoc.xpath(q).each do |n|
59
+ n.previous_element << n.remove
60
+ nomatches = false
61
+ end
62
+ end
63
+ end
64
+
65
+ def formula_cleanup(x)
66
+ # include where definition list inside stem block
67
+ q = "//formula/following-sibling::*[1]"\
68
+ "[self::p and text() = 'where']"
69
+ x.xpath(q).each do |s|
70
+ if !s.next_element.nil? && s.next_element.name == "dl"
71
+ s.previous_element << s.next_element.remove
72
+ s.remove
73
+ end
74
+ end
75
+ end
76
+
77
+ # include footnotes inside figure
78
+ def figure_footnote_cleanup(xmldoc)
79
+ nomatches = false
80
+ until nomatches
81
+ q = "//figure/following-sibling::*[1][self::p and *[1][self::fn]]"
82
+ nomatches = true
83
+ xmldoc.xpath(q).each do |s|
84
+ s.previous_element << s.first_element_child.remove
85
+ s.remove
86
+ nomatches = false
87
+ end
88
+ end
89
+ end
90
+
91
+ def figure_dl_cleanup(xmldoc)
92
+ # include key definition list inside figure
93
+ q = "//figure/following-sibling::*"\
94
+ "[self::p and normalize-space() = 'Key']"
95
+ xmldoc.xpath(q).each do |s|
96
+ if !s.next_element.nil? && s.next_element.name == "dl"
97
+ s.previous_element << s.next_element.remove
98
+ s.remove
99
+ end
100
+ end
101
+ end
102
+
103
+ def subfigure_cleanup(xmldoc)
104
+ # examples containing only figures become subfigures of figures
105
+ nodes = xmldoc.xpath("//example/figure")
106
+ while !nodes.empty?
107
+ nodes[0].parent.name = "figure"
108
+ nodes = xmldoc.xpath("//example/figure")
109
+ end
110
+ end
111
+
112
+ def figure_cleanup(xmldoc)
113
+ figure_footnote_cleanup(xmldoc)
114
+ figure_dl_cleanup(xmldoc)
115
+ subfigure_cleanup(xmldoc)
116
+ end
117
+
118
+ def table_footnote_renumber(xmldoc)
119
+ xmldoc.xpath("//table | //figure").each do |t|
120
+ seen, i = {}, 0
121
+ t.xpath(".//fn").each do |fn|
122
+ if seen[fn.text] then outnum = seen[fn.text]
123
+ else
124
+ i += 1
125
+ outnum = i
126
+ seen[fn.text] = outnum
127
+ end
128
+ fn["reference"] = (outnum - 1 + 'a'.ord).chr
129
+ fn["table"] = true
130
+ end
131
+ end
132
+ end
133
+
134
+ def other_footnote_renumber(xmldoc)
135
+ seen, i = {}, 0
136
+ xmldoc.xpath("//fn | //bibitem/note").each do |fn|
137
+ unless fn["table"]
138
+ if seen[fn.text] then outnum = seen[fn.text]
139
+ else
140
+ i += 1
141
+ outnum = i
142
+ seen[fn.text] = outnum
143
+ end
144
+ fn["reference"] = outnum.to_s
145
+ end
146
+ fn.delete("table")
147
+ end
148
+ end
149
+
150
+ def footnote_renumber(xmldoc)
151
+ table_footnote_renumber(xmldoc)
152
+ other_footnote_renumber(xmldoc)
153
+ end
154
+
155
+ end
156
+ end
157
+ end
@@ -1,14 +1,15 @@
1
1
  require "asciidoctor"
2
-
3
2
  require "asciidoctor/iso/version"
4
3
  require "asciidoctor/iso/base"
5
4
  require "asciidoctor/iso/front"
6
5
  require "asciidoctor/iso/lists"
7
6
  require "asciidoctor/iso/inline_anchor"
8
7
  require "asciidoctor/iso/blocks"
8
+ require "asciidoctor/iso/section"
9
9
  require "asciidoctor/iso/table"
10
10
  require "asciidoctor/iso/validate"
11
11
  require "asciidoctor/iso/utils"
12
+ require "asciidoctor/iso/cleanup"
12
13
 
13
14
  module Asciidoctor
14
15
  module ISO
@@ -23,8 +24,10 @@ module Asciidoctor
23
24
  include ::Asciidoctor::ISO::Lists
24
25
  include ::Asciidoctor::ISO::InlineAnchor
25
26
  include ::Asciidoctor::ISO::Blocks
27
+ include ::Asciidoctor::ISO::Section
26
28
  include ::Asciidoctor::ISO::Table
27
29
  include ::Asciidoctor::ISO::Utils
30
+ include ::Asciidoctor::ISO::Cleanup
28
31
  include ::Asciidoctor::ISO::Validate
29
32
 
30
33
  register_for "iso"
@@ -39,10 +42,9 @@ module Asciidoctor
39
42
 
40
43
  # alias_method :pass, :content
41
44
  alias_method :embedded, :content
42
- alias_method :verse, :content
45
+ alias_method :verse, :quote
43
46
  alias_method :literal, :content
44
47
  alias_method :audio, :skip
45
- alias_method :thematic_break, :skip
46
48
  alias_method :video, :skip
47
49
  alias_method :inline_button, :skip
48
50
  alias_method :inline_kbd, :skip
@@ -11,13 +11,10 @@ module Asciidoctor
11
11
  module Front
12
12
  def metadata_id(node, xml)
13
13
  xml.id do |i|
14
- i.documentnumber node.attr("docnumber"),
15
- **attr_code(partnumber: node.attr("partnumber"))
14
+ i.project_number node.attr("docnumber"),
15
+ **attr_code(part: node.attr("partnumber"))
16
16
  if node.attr("tc-docnumber")
17
- i.tc_documentnumber node.attr("tc-docnumber")
18
- end
19
- if node.attr("ref-docnumber")
20
- i.ref_documentnumber node.attr("ref-docnumber")
17
+ i.tc_document_number node.attr("tc-docnumber")
21
18
  end
22
19
  end
23
20
  end
@@ -25,15 +22,13 @@ module Asciidoctor
25
22
  def metadata_version(node, xml)
26
23
  xml.version do |v|
27
24
  v.edition node.attr("edition") if node.attr("edition")
28
- v.revdate node.attr("revdate") if node.attr("revdate")
29
- if node.attr("copyright-year")
30
- v.copyright_year node.attr("copyright-year")
31
- end
25
+ v.revision_date node.attr("revdate") if node.attr("revdate")
26
+ v.draft node.attr("draft") if node.attr("draft")
32
27
  end
33
28
  end
34
29
 
35
30
  def metadata_author(node, xml)
36
- xml.author do |a|
31
+ xml.creator **{ role: "author" } do |a|
37
32
  a.technical_committee node.attr("technical-committee"),
38
33
  **attr_code(number: node.attr("technical-committee-number"))
39
34
  if node.attr("subcommittee")
@@ -48,29 +43,43 @@ module Asciidoctor
48
43
  end
49
44
  end
50
45
 
51
- def metadata(node, xml)
52
- xml.documenttype node.attr("doctype")
53
- xml.documentstatus do |s|
54
- s.stage node.attr("docstage")
55
- s.substage node.attr("docsubstage") if node.attr("docsubstage")
46
+ def metadata_copyright(node, xml)
47
+ from = node.attr("copyright-year") || Date.today.year
48
+ xml.copyright do |c|
49
+ c.from from
50
+ c.owner do |o|
51
+ o.affiliation "ISO"
52
+ end
56
53
  end
57
- metadata_id(node, xml)
54
+ end
55
+
56
+ def metadata_status(node, xml)
57
+ xml.status do |s|
58
+ s.stage ( node.attr("docstage") || "60" )
59
+ s.substage ( node.attr("docsubstage") || "60" )
60
+ end
61
+ end
62
+
63
+ def metadata(node, xml)
64
+ metadata_status(node, xml)
65
+ metadata_author(node, xml)
58
66
  xml.language node.attr("language")
67
+ xml.script "latn"
68
+ xml.type node.attr("doctype")
69
+ metadata_id(node, xml)
59
70
  metadata_version(node, xml)
60
- metadata_author(node, xml)
71
+ metadata_copyright(node, xml)
61
72
  end
62
73
 
63
74
  def title(node, xml)
64
- xml.title do |t0|
65
- ["en", "fr"].each do |lang|
66
- t0.send lang do |t|
67
- if node.attr("title-intro-#{lang}")
68
- t.title_intro { |t1| t1 << node.attr("title-intro-#{lang}") }
69
- end
70
- t.title_main { |t1| t1 << node.attr("title-main-#{lang}") }
71
- if node.attr("title-part-#{lang}")
72
- t.title_part node.attr("title-part-#{lang}")
73
- end
75
+ ["en", "fr"].each do |lang|
76
+ xml.title **{ language: lang } do |t|
77
+ if node.attr("title-intro-#{lang}")
78
+ t.title_intro { |t1| t1 << node.attr("title-intro-#{lang}") }
79
+ end
80
+ t.title_main { |t1| t1 << node.attr("title-main-#{lang}") }
81
+ if node.attr("title-part-#{lang}")
82
+ t.title_part node.attr("title-part-#{lang}")
74
83
  end
75
84
  end
76
85
  end