asciidoctor-iso 0.6.0 → 0.6.1

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.
Files changed (41) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile.lock +7 -10
  3. data/README.adoc +118 -6
  4. data/asciidoctor-iso.gemspec +1 -4
  5. data/lib/asciidoctor-iso.rb +2 -0
  6. data/lib/asciidoctor/iso/base.rb +20 -95
  7. data/lib/asciidoctor/iso/blocks.rb +47 -39
  8. data/lib/asciidoctor/iso/cleanup.rb +25 -97
  9. data/lib/asciidoctor/iso/cleanup_block.rb +10 -1
  10. data/lib/asciidoctor/iso/cleanup_ref.rb +100 -0
  11. data/lib/asciidoctor/iso/converter.rb +5 -2
  12. data/lib/asciidoctor/iso/front.rb +52 -24
  13. data/lib/asciidoctor/iso/html/header.html +10 -10
  14. data/lib/asciidoctor/iso/html/html_iso_intro.html +1 -1
  15. data/lib/asciidoctor/iso/html/html_iso_titlepage.html +5 -5
  16. data/lib/asciidoctor/iso/html/htmlstyle.css +0 -21
  17. data/lib/asciidoctor/iso/html/isodoc.css +13 -28
  18. data/lib/asciidoctor/iso/html/word_iso_intro.html +2 -2
  19. data/lib/asciidoctor/iso/html/word_iso_titlepage.html +7 -7
  20. data/lib/asciidoctor/iso/html/wordstyle.css +998 -0
  21. data/lib/asciidoctor/iso/inline.rb +128 -0
  22. data/lib/asciidoctor/iso/isodoc.rng +1516 -0
  23. data/lib/asciidoctor/iso/isostandard.rnc +38 -39
  24. data/lib/asciidoctor/iso/isostandard.rng +529 -1276
  25. data/lib/asciidoctor/iso/isostandard_diff.rnc +40 -56
  26. data/lib/asciidoctor/iso/lists.rb +30 -28
  27. data/lib/asciidoctor/iso/macros.rb +37 -0
  28. data/lib/asciidoctor/iso/section.rb +1 -1
  29. data/lib/asciidoctor/iso/utils.rb +9 -0
  30. data/lib/asciidoctor/iso/validate.rb +41 -120
  31. data/lib/asciidoctor/iso/validate_section.rb +117 -0
  32. data/lib/asciidoctor/iso/validate_style.rb +5 -7
  33. data/lib/asciidoctor/iso/version.rb +1 -1
  34. data/spec/examples/rice.adoc +41 -8
  35. data/spec/examples/rice.doc +2885 -2859
  36. data/spec/examples/rice.html +316 -649
  37. data/spec/examples/rice.preview.html +51 -10
  38. data/spec/examples/rice.xml +418 -343
  39. metadata +12 -50
  40. data/lib/asciidoctor/iso/inline_anchor.rb +0 -59
  41. data/lib/asciidoctor/iso/validate.make.sh +0 -8
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: c29ba0cfa2863387a26f72eabdb729c5506f631e
4
- data.tar.gz: 4511b3434cb36ff15c5380002f7320c492a2e625
3
+ metadata.gz: 81628e6445230282af27ae6ee08a5b1662850618
4
+ data.tar.gz: 5ec3c5c6573556c7cf6cfb5ebcaa827d728db794
5
5
  SHA512:
6
- metadata.gz: 0aaee89e4089325c64d8dbe8c07e6a2d1ac387c9c67e85533fa2a117bf53cb1ca3362a2a2dac444854e8dd4d5ce22e0523f6b1109934a1aacfb7183fa2b593eb
7
- data.tar.gz: 19b11aab34452b3b66ef3f2963e234778dd8096bcf4c4636514dadd5d9059da68859fa860f20f097dcade70f339bf2815e10a6284577eae468aae2d860d3d479
6
+ metadata.gz: e79a67ec52c08f26beeda9eca31e38556832ed8eaaa000b42e05fbafc24a59cc96166b81d32b43264432a11e1087862a14fe30dc3ae241a60012bb9ad6f9137e
7
+ data.tar.gz: 7ee22285f177d6c466cbf7870a4f9e001eda32485a517625afb3df7c37d5f83e51cef712b77569f1bca21323e60a8017a7c02101c68080368956af4f2f7c644f
@@ -1,8 +1,8 @@
1
1
  GIT
2
2
  remote: https://github.com/riboseinc/html2doc.git
3
- revision: 1b65fde5d80501506554276174cda5d438f122f5
3
+ revision: 8a131b82eeecd0c27e4bde873f2ba16d425754d6
4
4
  specs:
5
- html2doc (0.0.1)
5
+ html2doc (0.6.0)
6
6
  asciimath
7
7
  htmlentities (~> 4.3.4)
8
8
  image_size
@@ -14,9 +14,9 @@ GIT
14
14
 
15
15
  GIT
16
16
  remote: https://github.com/riboseinc/isodoc.git
17
- revision: 45ea6e5fd3e3f1416c294a2e460f69fee268e0d2
17
+ revision: 0818963410de3aeb880f263678c47dcadcfe9b50
18
18
  specs:
19
- isodoc (0.0.1)
19
+ isodoc (0.4.0)
20
20
  asciimath
21
21
  html2doc
22
22
  htmlentities (~> 4.3.4)
@@ -30,16 +30,13 @@ GIT
30
30
  PATH
31
31
  remote: .
32
32
  specs:
33
- asciidoctor-iso (0.0.1)
33
+ asciidoctor-iso (0.6.1)
34
34
  asciidoctor (~> 1.5.6)
35
- asciimath
36
35
  html2doc
37
36
  htmlentities (~> 4.3.4)
38
- image_size
39
- mime-types
37
+ isodoc
40
38
  nokogiri (= 1.8.1)
41
39
  ruby-jing
42
- ruby-xslt
43
40
  thread_safe
44
41
  uuidtools
45
42
 
@@ -55,7 +52,7 @@ GEM
55
52
  docile (1.1.5)
56
53
  equivalent-xml (0.6.0)
57
54
  nokogiri (>= 1.4.3)
58
- ffi (1.9.18)
55
+ ffi (1.9.21)
59
56
  formatador (0.2.5)
60
57
  guard (2.14.2)
61
58
  formatador (>= 0.2.4)
@@ -30,6 +30,10 @@ https://www.iso.org/iso-templates.html[ISO Standard Microsoft Word template].
30
30
 
31
31
  This AsciiDoc syntax for writing ISO standards is hereby named "AsciiISO".
32
32
 
33
+ This README provides an overview of the functionality of the gem; see also
34
+ https://github.com/riboseinc/asciidoctor-iso/wiki/Guidance-for-authoring[Guidance for authoring]
35
+ ISO standards using the gem.
36
+
33
37
  == Usage
34
38
 
35
39
  [source,console]
@@ -56,6 +60,7 @@ https://github.com/riboseinc/isodoc[IsoDoc] gem generates temporary files:
56
60
  and the `{filename}_files` folder contains any images and headers for the Word
57
61
  document.
58
62
 
63
+
59
64
  === Content Warnings
60
65
 
61
66
  The gem also realises several format
@@ -150,6 +155,27 @@ XML to break up paragraphs within a footnote.)
150
155
  [[model_additions]]
151
156
  === Asciidoctor model additions
152
157
 
158
+ === Term markup
159
+
160
+ To ensure the structure of Terms and Definitions is captured accurately, the following
161
+ macros are defined, and must be used to mark up their respective content:
162
+
163
+ `alt:[TERM]`:: for alternative terms
164
+ `deprecated:[TERM]`:: for deprecated terms
165
+ `domain:[TERM]`:: for term domains
166
+
167
+ The macro contents can contain their own markup.
168
+
169
+ [source,asciidoctor]
170
+ --
171
+ === paddy
172
+ alt:[_paddy_ rice]
173
+ deprecated:[#[smallcap]#cargo# rice]
174
+ domain:[rice]
175
+
176
+ _paddy_ (<<paddy>>) from which the husk only has been removed
177
+ --
178
+
153
179
  ==== Paragraph alignment
154
180
 
155
181
  Alignment is defined as an attribute for paragraphs:
@@ -169,19 +195,45 @@ This paragraph is aligned center
169
195
  This paragraph is justified, which is the default
170
196
  --
171
197
 
172
- ==== Dates on reviewer notes
198
+ ==== Reviewer notes
173
199
 
174
- Reviewer notes are encoded as sidebars. A date attribute (in ISO 8601 format)
175
- and a reviewer attribute (naming the reviewer)
176
- are mandatory for reviewer notes; supplying the time as well as the date
177
- is optional.
200
+ Reviewer notes are encoded as sidebars, and can be separated at a distance from the
201
+ text they are annotating; the text they are annotating is indicated through anchors.
202
+ Reviewer notes are only rendered if the document has a `:draft:` attribute.
203
+
204
+ The following attributes on reviewer notes are mandatory:
205
+
206
+ * `reviewer` attribute (naming the reviewer)
207
+ * the starting target anchor of the note (`from` attribute)
208
+
209
+ The following attributes are optional:
210
+
211
+ * `date` attribute, optionally including the time (as xs:date or xs:datetime)
212
+ * the ending target anchor of the note (`to` attribute)
213
+
214
+ The span of text covered by the reviewer note is from the start of the
215
+ text encompassed by the `from` element, to the end of the text encompassed
216
+ by the `to` element. If only the `from` element supplied, the reviewer note
217
+ covers the `from` element. The `from` and `to` elements can be bookmarks,
218
+ which cover no space.
178
219
 
179
220
  [source,asciidoctor]
180
221
  --
181
- [reviewer="Nick Nicholas",date=20180125T0121]
222
+ [[clause_address_profile_definition]]
223
+ === Address Profile Definition (AddressProfileDescription)
224
+
225
+ [[para1]]
226
+ This is a clause address [[A]]profile[[B]] definition
227
+
228
+ [reviewer="Nick Nicholas",date=20180125T0121,from=clause_address_profile_definition,to=para1]
182
229
  ****
183
230
  I do not agree with this statement.
184
231
  ****
232
+
233
+ [reviewer="Nick Nicholas",date=20180125T0121,from=A,to=B]
234
+ ****
235
+ Profile?!
236
+ ****
185
237
  --
186
238
 
187
239
  ==== Strikethrough and Small Caps
@@ -228,6 +280,41 @@ attribute `inline-header`:
228
280
  consisting of a conical sample divider
229
281
  --
230
282
 
283
+ ==== Bibliographic details
284
+
285
+ Citations can include details of where in the document the citation is located; these
286
+ are entered by suffixing the type of locality, followed by the reference. Multiple
287
+ instances of locality and reference can be provided, delimited by comma or colon. For
288
+ example:
289
+
290
+ [source,asciidoctor]
291
+ --
292
+ <<ISO712,section 5, page 8-10>> # renders as: ISO 712, Section 5, Page 8-10
293
+ <<ISO712,section 5, page 8-10: 5:8-10>> # renders as ISO 712, 5:8-10
294
+ <<ISO712,whole>> # renders as: ISO 712, Whole of text
295
+ --
296
+
297
+ The references cannot contain spaces. Any text following the sequence of localities
298
+ will be displayed instead of the localities.
299
+
300
+ ==== Block Quotes
301
+
302
+ As in normal Asciidoctor, block quotes are preceded with an author and a citation;
303
+ but the citation is expected to be in the same format as all other citations,
304
+ a cross-reference optionally followed by text, which may include the bibliographic
305
+ sections referenced:
306
+
307
+ [source,asciidoctor]
308
+ --
309
+ [quote, ISO, "ISO7301,section 1"]
310
+ _____
311
+ This International Standard gives the minimum specifications for rice (_Oryza sativa_ L.)
312
+ which is subject to international trade. It is applicable to the following types: husked rice
313
+ and milled rice, parboiled or not, intended for direct human consumption. It is neither
314
+ applicable to other products derived from rice, nor to waxy rice (glutinous rice).
315
+ _____
316
+ --
317
+
231
318
  === Features not visible in HTML preview
232
319
 
233
320
  The gem uses built-in Asciidoc formatting as much as possible, so that users
@@ -382,23 +469,48 @@ in the deafting stage
382
469
  `:technical-committee-number:`:: The number of the relevant ISO technical
383
470
  committee
384
471
 
472
+ `:technical-committee-type:``:: The type of the relevant technical committee. Defaults
473
+ to `TC` if not supplied. Values: `TC1, `PC`, `JTC`, `JPC`.
474
+
385
475
  `:technical-committee:`:: The name of the relevant ISO technical committee
386
476
  (mandatory)
387
477
 
388
478
  `:subcommittee-number:`:: The number of the relevant ISO subcommittee
389
479
 
480
+ `:subcommittee-type:`:: The type of the relevant ISO subcommittee. Defaults to
481
+ `SC` if not supplied. Values: `SC`, `JSC`.
482
+
390
483
  `:subcommittee:`:: The name of the relevant ISO subcommittee
391
484
 
392
485
  `:workgroup-number:`:: The number of the relevant ISO workgroup
393
486
 
487
+ `:workgroup-type:`:: The type of the relevant ISO workgroup. Defaults to `WG` if
488
+ not supplied. Example values: `JWG`, `JAG`, `AG` (advisory group), `AHG`, `SWG`,
489
+ `SG`, `MA` (maintenance agency), `CORG`, `JCG`, `CAG`
490
+
394
491
  `:workgroup:`:: The name of the relevant ISO workgroup
395
492
 
396
493
  `:language:` :: The language of the document (`en` or `fr`) (mandatory)
397
494
 
495
+ `:publisher:`:: The standards agency publishing the standard; can be multiple
496
+ (comma-delimited). Defaults to `ISO`.
398
497
 
399
498
  The attribute `:draft:`, if present, includes review notes in the XML output;
400
499
  these are otherwise suppressed.
401
500
 
501
+ The document proper can reference the values of document attributes, which is convenient
502
+ for reusability. For example,
503
+ the Rice Model document references the editorial groups that have contributed to the
504
+ document as
505
+
506
+ [source,asciidoc]
507
+ --
508
+ This document was prepared by Technical Committee ISO/TC {technical-committee-number}, _{technical-committee}_, Subcommittee SC {subcommittee-number}, _{subcommittee}_.
509
+ --
510
+
511
+ If the corresponding document attributes are not populated in the header, then the references
512
+ themselves will not be populated.
513
+
402
514
 
403
515
  == Data Models
404
516
 
@@ -28,16 +28,13 @@ Gem::Specification.new do |spec|
28
28
  spec.required_ruby_version = Gem::Requirement.new(">= 2.4.0")
29
29
 
30
30
  spec.add_dependency "asciidoctor", "~> 1.5.6"
31
- spec.add_dependency "asciimath"
32
31
  spec.add_dependency "htmlentities", "~> 4.3.4"
33
- spec.add_dependency "image_size"
34
- spec.add_dependency "mime-types"
35
32
  spec.add_dependency "nokogiri", "= 1.8.1"
36
33
  spec.add_dependency "ruby-jing"
37
- spec.add_dependency "ruby-xslt"
38
34
  spec.add_dependency "thread_safe"
39
35
  spec.add_dependency "uuidtools"
40
36
  spec.add_dependency "html2doc"
37
+ spec.add_dependency "isodoc"
41
38
 
42
39
  spec.add_development_dependency "bundler", "~> 1.15"
43
40
  spec.add_development_dependency "byebug", "~> 9.1"
@@ -1,3 +1,5 @@
1
1
  require "asciidoctor" unless defined? Asciidoctor::Converter
2
2
  require_relative "asciidoctor/iso/converter"
3
3
  require_relative "asciidoctor/iso/version"
4
+ require "asciidoctor/extensions"
5
+
@@ -10,6 +10,11 @@ require "isodoc"
10
10
  module Asciidoctor
11
11
  module ISO
12
12
  module Base
13
+ Asciidoctor::Extensions.register do
14
+ inline_macro Asciidoctor::ISO::AltTermInlineMacro
15
+ inline_macro Asciidoctor::ISO::DeprecatedTermInlineMacro
16
+ inline_macro Asciidoctor::ISO::DomainTermInlineMacro
17
+ end
13
18
 
14
19
  def content(node)
15
20
  node.content
@@ -29,7 +34,7 @@ module Asciidoctor
29
34
  def doc_converter
30
35
  IsoDoc::Convert.new(
31
36
  htmlstylesheet: html_doc_path("htmlstyle.css"),
32
- wordstylesheet: nil,
37
+ wordstylesheet: html_doc_path("wordstyle.css"),
33
38
  standardstylesheet: html_doc_path("isodoc.css"),
34
39
  header: html_doc_path("header.html"),
35
40
  htmlcoverpage: html_doc_path("html_iso_titlepage.html"),
@@ -49,7 +54,6 @@ module Asciidoctor
49
54
  def document(node)
50
55
  init
51
56
  ret1 = makexml(node)
52
- validate(ret1)
53
57
  ret = ret1.to_xml(indent: 2)
54
58
  filename = node.attr("docfile").gsub(/\.adoc/, ".xml").
55
59
  gsub(%r{^.*/}, '')
@@ -67,6 +71,7 @@ module Asciidoctor
67
71
  result = textcleanup(result.flatten * "\n")
68
72
  ret1 = cleanup(Nokogiri::XML(result))
69
73
  ret1.root.add_namespace(nil, "http://riboseinc.com/isoxml")
74
+ validate(ret1)
70
75
  ret1
71
76
  end
72
77
 
@@ -75,8 +80,10 @@ module Asciidoctor
75
80
  end
76
81
 
77
82
  def front(node, xml)
78
- title node, xml
79
- metadata node, xml
83
+ xml.bibdata **attr_code(type: node.attr("doctype")) do |b|
84
+ metadata node, b
85
+ end
86
+ metadata_version(node, xml)
80
87
  end
81
88
 
82
89
  def middle(node, xml)
@@ -87,17 +94,18 @@ module Asciidoctor
87
94
 
88
95
  def add_term_source(xml_t, seen_xref, m)
89
96
  attr = { bibitemid: seen_xref.children[0]["target"],
90
- format: seen_xref.children[0]["format"] }
97
+ format: seen_xref.children[0]["format"],
98
+ type: "inline" }
91
99
  xml_t.origin seen_xref.children[0].content, **attr_code(attr)
92
- xml_t.isosection m[:section].gsub(/ /, "") if m[:section]
93
- if m[:text]
94
- xml_t.modification do |mod|
95
- mod.p { |p| p << m[:text] }
96
- end
100
+ m[:section] && xml_t.isosection do |s|
101
+ s.reference m[:section].gsub(/ /, "")
102
+ end
103
+ m[:text] && xml_t.modification do |mod|
104
+ mod.p { |p| p << m[:text].sub(/^\s+/, "") }
97
105
  end
98
106
  end
99
107
 
100
- TERM_REFERENCE_RE_STR = <<~REGEXP
108
+ TERM_REFERENCE_RE_STR = <<~REGEXP.freeze
101
109
  ^(?<xref><xref[^>]+>)
102
110
  (,\s(?<section>[^, ]+))?
103
111
  (,\s(?<text>.*))?
@@ -105,7 +113,7 @@ module Asciidoctor
105
113
  REGEXP
106
114
  TERM_REFERENCE_RE =
107
115
  Regexp.new(TERM_REFERENCE_RE_STR.gsub(/\s/, "").gsub(/_/, "\\s"),
108
- Regexp::IGNORECASE)
116
+ Regexp::IGNORECASE | Regexp::MULTILINE)
109
117
 
110
118
 
111
119
  def extract_termsource_refs(text)
@@ -128,89 +136,6 @@ module Asciidoctor
128
136
  end.join("\n")
129
137
  end
130
138
 
131
- def paragraph(node)
132
- return termsource(node) if node.role == "source"
133
- attrs = { align: node.attr("align"),
134
- id: Utils::anchor_or_uuid(node) }
135
- noko do |xml|
136
- xml.p **attr_code(attrs) do |xml_t|
137
- xml_t << node.content
138
- style(node, Utils::flatten_rawtext(node).join(" "))
139
- end
140
- end.join("\n")
141
- end
142
-
143
- def inline_footnote(node)
144
- noko do |xml|
145
- @fn_number += 1
146
- xml.fn **{reference: @fn_number} do |fn|
147
- # TODO multi-paragraph footnotes
148
- fn.p { |p| p << node.text }
149
- footnote_style(node, node.text)
150
- end
151
- end.join("\n")
152
- end
153
-
154
- def open(node)
155
- # open block is a container of multiple blocks,
156
- # treated as a single block.
157
- # We append each contained block to its parent
158
- result = []
159
- if node.blocks?
160
- node.blocks.each do |b|
161
- result << send(b.context, b)
162
- end
163
- else
164
- result = paragraph(node)
165
- end
166
- result
167
- end
168
-
169
- def inline_break(node)
170
- noko do |xml|
171
- xml << node.text
172
- xml.br
173
- end.join("\n")
174
- end
175
-
176
- def page_break(node)
177
- noko do |xml|
178
- xml << node.text
179
- xml.pagebreak
180
- end.join("\n")
181
- end
182
-
183
- def thematic_break(node)
184
- noko do |xml|
185
- xml << node.text
186
- xml.hr
187
- end.join("\n")
188
- end
189
-
190
- def inline_quoted(node)
191
- noko do |xml|
192
- case node.type
193
- when :emphasis then xml.em node.text
194
- when :strong then xml.strong node.text
195
- when :monospaced then xml.tt node.text
196
- when :double then xml << "\"#{node.text}\""
197
- when :single then xml << "'#{node.text}'"
198
- when :superscript then xml.sup node.text
199
- when :subscript then xml.sub node.text
200
- when :asciimath then xml.stem node.text, **{ type: "AsciiMath" }
201
- else
202
- case node.role
203
- when "alt" then xml.admitted { |a| a << node.text }
204
- when "deprecated" then xml.deprecates { |a| a << node.text }
205
- when "domain" then xml.domain { |a| a << node.text }
206
- when "strike" then xml.strike node.text
207
- when "smallcap" then xml.smallcap node.text
208
- else
209
- xml << node.text
210
- end
211
- end
212
- end.join
213
- end
214
139
  end
215
140
  end
216
141
  end
@@ -4,14 +4,29 @@ require "uri"
4
4
  module Asciidoctor
5
5
  module ISO
6
6
  module Blocks
7
+
7
8
  def id_attr(node = nil)
8
9
  { id: Utils::anchor_or_uuid(node) }
9
10
  end
10
11
 
12
+ def open(node)
13
+ # open block is a container of multiple blocks,
14
+ # treated as a single block.
15
+ # We append each contained block to its parent
16
+ result = []
17
+ if node.blocks?
18
+ node.blocks.each do |b|
19
+ result << send(b.context, b)
20
+ end
21
+ else
22
+ result = paragraph(node)
23
+ end
24
+ result
25
+ end
26
+
11
27
  def stem(node)
12
28
  # NOTE: html escaping is performed by Nokogiri
13
29
  stem_content = node.lines.join("\n")
14
-
15
30
  noko do |xml|
16
31
  xml.formula **id_attr(node) do |s|
17
32
  s.stem stem_content, **{ type: "AsciiMath" }
@@ -27,6 +42,8 @@ module Asciidoctor
27
42
  reviewer: node.attr("reviewer") || node.attr("source") || "(Unknown)",
28
43
  id: Utils::anchor_or_uuid(node),
29
44
  date: date.gsub(/[:-]/, ""),
45
+ from: node.attr("from"),
46
+ to: node.attr("to") || node.attr("from"),
30
47
  }
31
48
  end
32
49
 
@@ -35,7 +52,7 @@ module Asciidoctor
35
52
  content = Utils::flatten_rawtext(node.content).join("\n")
36
53
  noko do |xml|
37
54
  xml.review **attr_code(sidebar_attrs(node)) do |r|
38
- r << content
55
+ wrap_in_para(node, r)
39
56
  end
40
57
  end
41
58
  end
@@ -43,10 +60,7 @@ module Asciidoctor
43
60
  def termnote(n)
44
61
  noko do |xml|
45
62
  xml.termnote **id_attr(n) do |ex|
46
- if n.blocks? then ex << n.content
47
- else
48
- ex.p {|p| p << n.content }
49
- end
63
+ wrap_in_para(n, ex)
50
64
  style(n, Utils::flatten_rawtext(n.content).join("\n"))
51
65
  end
52
66
  end.join("\n")
@@ -55,10 +69,7 @@ module Asciidoctor
55
69
  def note(n)
56
70
  noko do |xml|
57
71
  xml.note **id_attr(n) do |c|
58
- if n.blocks? then c << n.content
59
- else
60
- c.p { |p| p << n.content }
61
- end
72
+ wrap_in_para(n, c)
62
73
  text = Utils::flatten_rawtext(n.content).join("\n")
63
74
  note_style(n, text)
64
75
  end
@@ -79,10 +90,7 @@ module Asciidoctor
79
90
  return note(node) if node.attr("name") == "note"
80
91
  noko do |xml|
81
92
  xml.admonition **admonition_attrs(node) do |a|
82
- if node.blocks? then a << node.content
83
- else
84
- a.p { |p| p << node.content }
85
- end
93
+ wrap_in_para(node, a)
86
94
  end
87
95
  end.join("\n")
88
96
  end
@@ -91,10 +99,7 @@ module Asciidoctor
91
99
  noko do |xml|
92
100
  xml.termexample **id_attr(node) do |ex|
93
101
  c = node.content
94
- if node.blocks? then ex << c
95
- else
96
- ex.p {|p| p << c }
97
- end
102
+ wrap_in_para(node, ex)
98
103
  text = Utils::flatten_rawtext(c).join("\n")
99
104
  termexample_style(node, text)
100
105
  end
@@ -107,15 +112,13 @@ module Asciidoctor
107
112
  xml.example **id_attr(node) do |ex|
108
113
  content = node.content
109
114
  ex << content
110
- text = Utils::flatten_rawtext(content).join("\n")
111
- termexample_style(node, text)
112
115
  end
113
116
  end.join("\n")
114
117
  end
115
118
 
116
119
  def preamble(node)
117
120
  noko do |xml|
118
- xml.content do |xml_abstract|
121
+ xml.foreword do |xml_abstract|
119
122
  xml_abstract.title { |t| t << "Foreword" }
120
123
  content = node.content
121
124
  xml_abstract << content
@@ -144,33 +147,38 @@ module Asciidoctor
144
147
  end
145
148
  end
146
149
 
150
+ def paragraph(node)
151
+ return termsource(node) if node.role == "source"
152
+ attrs = { align: node.attr("align"),
153
+ id: Utils::anchor_or_uuid(node) }
154
+ noko do |xml|
155
+ xml.p **attr_code(attrs) do |xml_t|
156
+ xml_t << node.content
157
+ style(node, Utils::flatten_rawtext(node).join(" "))
158
+ end
159
+ end.join("\n")
160
+ end
161
+
147
162
  def quote_attrs(node)
148
- {
149
- id: Utils::anchor_or_uuid(node),
150
- align: node.attr("align"),
151
- }
163
+ { id: Utils::anchor_or_uuid(node), align: node.attr("align") }
152
164
  end
153
165
 
154
166
  def quote_attribution(node, out)
155
- if node.attr("attribution")
156
- out.fullname do |f|
157
- f.surname { |s| s << node.attr("attribution") }
158
- # TODO: will break up into name components
159
- end
160
- end
161
167
  if node.attr("citetitle")
162
- # TODO: eref
168
+ m = /^(?<cite>[^,]+)(,(?<text>.*$))?$/.match node.attr("citetitle")
169
+ out.source m[:text],
170
+ **attr_code(target: m[:cite], type: "inline")
171
+ end
172
+ if node.attr("attribution")
173
+ out.author { |a| a << node.attr("attribution") }
163
174
  end
164
175
  end
165
176
 
166
177
  def quote(node)
167
178
  noko do |xml|
168
179
  xml.quote **attr_code(quote_attrs(node)) do |q|
169
- quote_attribution(node, out)
170
- if node.blocks? then q << node.content
171
- else
172
- q.p { |p| p << node.content }
173
- end
180
+ quote_attribution(node, q)
181
+ wrap_in_para(node, q)
174
182
  end
175
183
  end
176
184
  end
@@ -179,8 +187,8 @@ module Asciidoctor
179
187
  # NOTE: html escaping is performed by Nokogiri
180
188
  noko do |xml|
181
189
  if node.parent.context != :example
182
- xml.figure do |xml_figure|
183
- xml_figure.sourcecode **id_attr(node) do |s|
190
+ xml.example **id_attr(node) do |e|
191
+ e.sourcecode **id_attr(node) do |s|
184
192
  s << node.content
185
193
  end
186
194
  end