asciidoctor-iso 0.0.1 → 0.6.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 +4 -4
- data/.gitattributes +2 -0
- data/.gitignore +1 -0
- data/.hound.yml +3 -0
- data/.rubocop.ribose.yml +65 -0
- data/.rubocop.tb.yml +640 -0
- data/Gemfile +4 -0
- data/Gemfile.lock +162 -0
- data/Makefile +39 -0
- data/README.adoc +396 -59
- data/Rakefile +6 -0
- data/asciidoctor-iso.gemspec +11 -3
- data/lib/asciidoctor/iso/base.rb +122 -51
- data/lib/asciidoctor/iso/blocks.rb +119 -108
- data/lib/asciidoctor/iso/cleanup.rb +214 -0
- data/lib/asciidoctor/iso/cleanup_block.rb +157 -0
- data/lib/asciidoctor/iso/converter.rb +5 -3
- data/lib/asciidoctor/iso/front.rb +37 -28
- data/lib/asciidoctor/iso/html/header.html +184 -0
- data/lib/asciidoctor/iso/html/html_iso_intro.html +73 -0
- data/lib/asciidoctor/iso/html/html_iso_titlepage.html +31 -0
- data/lib/asciidoctor/iso/html/htmlstyle.css +67 -0
- data/lib/asciidoctor/iso/html/isodoc.css +679 -0
- data/lib/asciidoctor/iso/html/word_iso_intro.html +72 -0
- data/lib/asciidoctor/iso/html/word_iso_titlepage.html +58 -0
- data/lib/asciidoctor/iso/inline_anchor.rb +20 -26
- data/lib/asciidoctor/iso/isostandard.rnc +177 -0
- data/lib/asciidoctor/iso/isostandard.rng +1478 -0
- data/lib/asciidoctor/iso/isostandard_diff.rnc +295 -0
- data/lib/asciidoctor/iso/lists.rb +152 -109
- data/lib/asciidoctor/iso/section.rb +164 -0
- data/lib/asciidoctor/iso/table.rb +30 -27
- data/lib/asciidoctor/iso/utils.rb +61 -183
- data/lib/asciidoctor/iso/validate.make.sh +8 -0
- data/lib/asciidoctor/iso/validate.rb +195 -24
- data/lib/asciidoctor/iso/validate_style.rb +175 -0
- data/lib/asciidoctor/iso/version.rb +1 -1
- data/spec/examples/rice.adoc +45 -24
- data/spec/examples/rice.doc +17708 -0
- data/spec/examples/rice.html +1574 -1662
- data/spec/examples/rice.preview.html +1811 -0
- data/spec/examples/rice.sh +4 -0
- data/spec/examples/rice.xml +888 -62
- data/spec/examples/rice_images/rice_image1.png +0 -0
- data/spec/examples/rice_images/rice_image2.png +0 -0
- data/spec/examples/rice_images/rice_image3_1.png +0 -0
- data/spec/examples/rice_images/rice_image3_2.png +0 -0
- data/spec/examples/rice_images/rice_image3_3.png +0 -0
- metadata +135 -12
- data/grammar1.gif +0 -0
- data/grammar2.gif +0 -0
- data/grammar3.gif +0 -0
- data/grammar4.gif +0 -0
- data/lib/asciidoctor/iso/validate.rnc +0 -444
- data/lib/asciidoctor/iso/validate.rng +0 -1001
data/Rakefile
ADDED
data/asciidoctor-iso.gemspec
CHANGED
@@ -10,7 +10,8 @@ Gem::Specification.new do |spec|
|
|
10
10
|
spec.authors = ["Ribose Inc."]
|
11
11
|
spec.email = ["open.source@ribose.com"]
|
12
12
|
|
13
|
-
spec.summary = "asciidoctor-iso lets you write ISO standards
|
13
|
+
spec.summary = "asciidoctor-iso lets you write ISO standards "\
|
14
|
+
"in AsciiDoc."
|
14
15
|
spec.description = <<~DESCRIPTION
|
15
16
|
asciidoctor-iso lets you write ISO standards in AsciiDoc syntax.
|
16
17
|
|
@@ -24,12 +25,19 @@ Gem::Specification.new do |spec|
|
|
24
25
|
spec.require_paths = ["lib"]
|
25
26
|
spec.files = `git ls-files`.split("\n")
|
26
27
|
spec.test_files = `git ls-files -- {spec}/*`.split("\n")
|
27
|
-
spec.required_ruby_version = Gem::Requirement.new(">= 2.
|
28
|
+
spec.required_ruby_version = Gem::Requirement.new(">= 2.4.0")
|
28
29
|
|
29
30
|
spec.add_dependency "asciidoctor", "~> 1.5.6"
|
31
|
+
spec.add_dependency "asciimath"
|
30
32
|
spec.add_dependency "htmlentities", "~> 4.3.4"
|
31
|
-
spec.add_dependency "
|
33
|
+
spec.add_dependency "image_size"
|
34
|
+
spec.add_dependency "mime-types"
|
35
|
+
spec.add_dependency "nokogiri", "= 1.8.1"
|
36
|
+
spec.add_dependency "ruby-jing"
|
37
|
+
spec.add_dependency "ruby-xslt"
|
32
38
|
spec.add_dependency "thread_safe"
|
39
|
+
spec.add_dependency "uuidtools"
|
40
|
+
spec.add_dependency "html2doc"
|
33
41
|
|
34
42
|
spec.add_development_dependency "bundler", "~> 1.15"
|
35
43
|
spec.add_development_dependency "byebug", "~> 9.1"
|
data/lib/asciidoctor/iso/base.rb
CHANGED
@@ -5,86 +5,150 @@ require "json"
|
|
5
5
|
require "pathname"
|
6
6
|
require "open-uri"
|
7
7
|
require "pp"
|
8
|
+
require "isodoc"
|
8
9
|
|
9
10
|
module Asciidoctor
|
10
11
|
module ISO
|
11
12
|
module Base
|
13
|
+
|
12
14
|
def content(node)
|
13
15
|
node.content
|
14
16
|
end
|
15
17
|
|
16
18
|
def skip(node, name = nil)
|
17
|
-
|
18
|
-
|
19
|
+
name = name || node.node_name
|
20
|
+
w = "converter missing for #{name} node in ISO backend"
|
21
|
+
warning(node, w, nil)
|
19
22
|
nil
|
20
23
|
end
|
21
24
|
|
25
|
+
def html_doc_path(file)
|
26
|
+
File.join(File.dirname(__FILE__), File.join("html", file))
|
27
|
+
end
|
28
|
+
|
29
|
+
def doc_converter
|
30
|
+
IsoDoc::Convert.new(
|
31
|
+
htmlstylesheet: html_doc_path("htmlstyle.css"),
|
32
|
+
wordstylesheet: nil,
|
33
|
+
standardstylesheet: html_doc_path("isodoc.css"),
|
34
|
+
header: html_doc_path("header.html"),
|
35
|
+
htmlcoverpage: html_doc_path("html_iso_titlepage.html"),
|
36
|
+
wordcoverpage: html_doc_path("word_iso_titlepage.html"),
|
37
|
+
htmlintropage: html_doc_path("html_iso_intro.html"),
|
38
|
+
wordintropage: html_doc_path("word_iso_intro.html"),
|
39
|
+
)
|
40
|
+
end
|
41
|
+
|
42
|
+
def init
|
43
|
+
@fn_number = 0
|
44
|
+
@draft = false
|
45
|
+
@refids = Set.new
|
46
|
+
@anchors = {}
|
47
|
+
end
|
48
|
+
|
22
49
|
def document(node)
|
23
|
-
|
24
|
-
|
50
|
+
init
|
51
|
+
ret1 = makexml(node)
|
52
|
+
validate(ret1)
|
53
|
+
ret = ret1.to_xml(indent: 2)
|
54
|
+
filename = node.attr("docfile").gsub(/\.adoc/, ".xml").
|
55
|
+
gsub(%r{^.*/}, '')
|
56
|
+
File.open("#{filename}", "w") { |f| f.write(ret) }
|
57
|
+
doc_converter.convert filename
|
58
|
+
ret
|
59
|
+
end
|
60
|
+
|
61
|
+
def makexml(node)
|
62
|
+
result = ["<?xml version='1.0' encoding='UTF-8'?>\n<iso-standard>"]
|
63
|
+
@draft = node.attributes.has_key?("draft")
|
25
64
|
result << noko { |ixml| front node, ixml }
|
26
65
|
result << noko { |ixml| middle node, ixml }
|
27
66
|
result << "</iso-standard>"
|
28
|
-
|
29
|
-
ret1 = cleanup(Nokogiri::XML(
|
30
|
-
|
31
|
-
ret1
|
67
|
+
result = textcleanup(result.flatten * "\n")
|
68
|
+
ret1 = cleanup(Nokogiri::XML(result))
|
69
|
+
ret1.root.add_namespace(nil, "http://riboseinc.com/isoxml")
|
70
|
+
ret1
|
71
|
+
end
|
72
|
+
|
73
|
+
def is_draft
|
74
|
+
@draft
|
32
75
|
end
|
33
76
|
|
34
77
|
def front(node, xml)
|
35
|
-
|
36
|
-
|
37
|
-
metadata node, xml_front
|
38
|
-
end
|
78
|
+
title node, xml
|
79
|
+
metadata node, xml
|
39
80
|
end
|
40
81
|
|
41
82
|
def middle(node, xml)
|
42
|
-
xml.
|
43
|
-
|
83
|
+
xml.sections do |s|
|
84
|
+
s << node.content if node.blocks?
|
44
85
|
end
|
45
86
|
end
|
46
87
|
|
47
|
-
def
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
warn %(asciidoctor: WARNING (#{current_location(node)}): term reference not in expected format: #{node.content})
|
56
|
-
else
|
57
|
-
seen_xref = Nokogiri::XML.fragment(matched[:xref])
|
58
|
-
attr = {
|
59
|
-
target: seen_xref.children[0]["target"],
|
60
|
-
format: seen_xref.children[0]["format"],
|
61
|
-
}
|
62
|
-
xml_t.xref seen_xref.children[0].content, **attr_code(attr)
|
63
|
-
xml_t.isosection matched[:section] if matched[:section]
|
64
|
-
xml_t.modification { |m| m << matched[:text] } if matched[:text]
|
65
|
-
end
|
88
|
+
def add_term_source(xml_t, seen_xref, m)
|
89
|
+
attr = { bibitemid: seen_xref.children[0]["target"],
|
90
|
+
format: seen_xref.children[0]["format"] }
|
91
|
+
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] }
|
66
96
|
end
|
67
97
|
end
|
68
|
-
|
98
|
+
end
|
99
|
+
|
100
|
+
TERM_REFERENCE_RE_STR = <<~REGEXP
|
101
|
+
^(?<xref><xref[^>]+>)
|
102
|
+
(,\s(?<section>[^, ]+))?
|
103
|
+
(,\s(?<text>.*))?
|
104
|
+
$
|
105
|
+
REGEXP
|
106
|
+
TERM_REFERENCE_RE =
|
107
|
+
Regexp.new(TERM_REFERENCE_RE_STR.gsub(/\s/, "").gsub(/_/, "\\s"),
|
108
|
+
Regexp::IGNORECASE)
|
109
|
+
|
110
|
+
|
111
|
+
def extract_termsource_refs(text)
|
112
|
+
matched = TERM_REFERENCE_RE.match text
|
113
|
+
if matched.nil?
|
114
|
+
warning(node, "term reference not in expected format", text)
|
115
|
+
end
|
116
|
+
matched
|
117
|
+
end
|
118
|
+
|
119
|
+
def termsource(node)
|
120
|
+
matched = extract_termsource_refs(node.content) or return
|
121
|
+
noko do |xml|
|
122
|
+
attrs = { status: matched[:text] ? "identical" : "modified" }
|
123
|
+
xml.termsource **attrs do |xml_t|
|
124
|
+
seen_xref = Nokogiri::XML.fragment(matched[:xref])
|
125
|
+
add_term_source(xml_t, seen_xref, matched)
|
126
|
+
style(node, matched[:text])
|
127
|
+
end
|
128
|
+
end.join("\n")
|
69
129
|
end
|
70
130
|
|
71
131
|
def paragraph(node)
|
72
132
|
return termsource(node) if node.role == "source"
|
73
|
-
|
74
|
-
|
75
|
-
|
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|
|
76
137
|
xml_t << node.content
|
138
|
+
style(node, Utils::flatten_rawtext(node).join(" "))
|
77
139
|
end
|
78
|
-
end
|
79
|
-
result
|
140
|
+
end.join("\n")
|
80
141
|
end
|
81
142
|
|
82
143
|
def inline_footnote(node)
|
83
144
|
noko do |xml|
|
84
|
-
|
85
|
-
|
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)
|
86
150
|
end
|
87
|
-
end.join
|
151
|
+
end.join("\n")
|
88
152
|
end
|
89
153
|
|
90
154
|
def open(node)
|
@@ -106,14 +170,21 @@ module Asciidoctor
|
|
106
170
|
noko do |xml|
|
107
171
|
xml << node.text
|
108
172
|
xml.br
|
109
|
-
end.join
|
173
|
+
end.join("\n")
|
110
174
|
end
|
111
175
|
|
112
176
|
def page_break(node)
|
113
177
|
noko do |xml|
|
114
178
|
xml << node.text
|
115
179
|
xml.pagebreak
|
116
|
-
end.join
|
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")
|
117
188
|
end
|
118
189
|
|
119
190
|
def inline_quoted(node)
|
@@ -126,14 +197,14 @@ module Asciidoctor
|
|
126
197
|
when :single then xml << "'#{node.text}'"
|
127
198
|
when :superscript then xml.sup node.text
|
128
199
|
when :subscript then xml.sub node.text
|
129
|
-
when :asciimath then xml.stem node.text
|
200
|
+
when :asciimath then xml.stem node.text, **{ type: "AsciiMath" }
|
130
201
|
else
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
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
|
137
208
|
else
|
138
209
|
xml << node.text
|
139
210
|
end
|
@@ -4,165 +4,172 @@ require "uri"
|
|
4
4
|
module Asciidoctor
|
5
5
|
module ISO
|
6
6
|
module Blocks
|
7
|
+
def id_attr(node = nil)
|
8
|
+
{ id: Utils::anchor_or_uuid(node) }
|
9
|
+
end
|
10
|
+
|
7
11
|
def stem(node)
|
8
|
-
stem_attributes = {
|
9
|
-
anchor: node.id,
|
10
|
-
}
|
11
12
|
# NOTE: html escaping is performed by Nokogiri
|
12
13
|
stem_content = node.lines.join("\n")
|
13
14
|
|
14
15
|
noko do |xml|
|
15
|
-
xml.formula **
|
16
|
-
s.stem stem_content
|
16
|
+
xml.formula **id_attr(node) do |s|
|
17
|
+
s.stem stem_content, **{ type: "AsciiMath" }
|
18
|
+
style(node, stem_content)
|
17
19
|
end
|
18
20
|
end
|
19
21
|
end
|
20
22
|
|
23
|
+
def sidebar_attrs(node)
|
24
|
+
date = node.attr("date") || DateTime.now.iso8601.gsub(/\+.*$/, "")
|
25
|
+
date += "T0000" unless /T/.match? date
|
26
|
+
{
|
27
|
+
reviewer: node.attr("reviewer") || node.attr("source") || "(Unknown)",
|
28
|
+
id: Utils::anchor_or_uuid(node),
|
29
|
+
date: date.gsub(/[:-]/, ""),
|
30
|
+
}
|
31
|
+
end
|
32
|
+
|
21
33
|
def sidebar(node)
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
noko do |xml|
|
28
|
-
xml.review_note content, **attr_code(note_attributes)
|
34
|
+
return unless is_draft
|
35
|
+
content = Utils::flatten_rawtext(node.content).join("\n")
|
36
|
+
noko do |xml|
|
37
|
+
xml.review **attr_code(sidebar_attrs(node)) do |r|
|
38
|
+
r << content
|
29
39
|
end
|
30
40
|
end
|
31
41
|
end
|
32
42
|
|
33
|
-
def termnote(
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
43
|
+
def termnote(n)
|
44
|
+
noko do |xml|
|
45
|
+
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
|
50
|
+
style(n, Utils::flatten_rawtext(n.content).join("\n"))
|
51
|
+
end
|
52
|
+
end.join("\n")
|
53
|
+
end
|
40
54
|
|
55
|
+
def note(n)
|
41
56
|
noko do |xml|
|
42
|
-
xml.
|
43
|
-
|
57
|
+
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
|
62
|
+
text = Utils::flatten_rawtext(n.content).join("\n")
|
63
|
+
note_style(n, text)
|
44
64
|
end
|
45
|
-
end.join
|
65
|
+
end.join("\n")
|
66
|
+
end
|
67
|
+
|
68
|
+
def admonition_attrs(node)
|
69
|
+
name = node.attr("name")
|
70
|
+
type = node.attr("type") and
|
71
|
+
["danger", "safety precautions"].each do |t|
|
72
|
+
name = t if type.casecmp(t).zero?
|
73
|
+
end
|
74
|
+
{ id: Utils::anchor_or_uuid(node), type: name }
|
46
75
|
end
|
47
76
|
|
48
77
|
def admonition(node)
|
49
|
-
return termnote(node) if
|
78
|
+
return termnote(node) if in_terms
|
79
|
+
return note(node) if node.attr("name") == "note"
|
50
80
|
noko do |xml|
|
51
|
-
xml.
|
52
|
-
if node.blocks?
|
53
|
-
xml_cref << node.content
|
81
|
+
xml.admonition **admonition_attrs(node) do |a|
|
82
|
+
if node.blocks? then a << node.content
|
54
83
|
else
|
55
|
-
|
84
|
+
a.p { |p| p << node.content }
|
56
85
|
end
|
57
86
|
end
|
58
|
-
end.join
|
87
|
+
end.join("\n")
|
59
88
|
end
|
60
89
|
|
61
90
|
def term_example(node)
|
62
91
|
noko do |xml|
|
63
|
-
xml.termexample **
|
64
|
-
|
92
|
+
xml.termexample **id_attr(node) do |ex|
|
93
|
+
c = node.content
|
94
|
+
if node.blocks? then ex << c
|
95
|
+
else
|
96
|
+
ex.p {|p| p << c }
|
97
|
+
end
|
98
|
+
text = Utils::flatten_rawtext(c).join("\n")
|
99
|
+
termexample_style(node, text)
|
65
100
|
end
|
66
|
-
end.join
|
101
|
+
end.join("\n")
|
67
102
|
end
|
68
103
|
|
69
104
|
def example(node)
|
70
|
-
return term_example(node) if
|
105
|
+
return term_example(node) if in_terms
|
71
106
|
noko do |xml|
|
72
|
-
xml.example **
|
73
|
-
|
107
|
+
xml.example **id_attr(node) do |ex|
|
108
|
+
content = node.content
|
109
|
+
ex << content
|
110
|
+
text = Utils::flatten_rawtext(content).join("\n")
|
111
|
+
termexample_style(node, text)
|
74
112
|
end
|
75
|
-
end.join
|
113
|
+
end.join("\n")
|
76
114
|
end
|
77
115
|
|
78
116
|
def preamble(node)
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
117
|
+
noko do |xml|
|
118
|
+
xml.content do |xml_abstract|
|
119
|
+
xml_abstract.title { |t| t << "Foreword" }
|
120
|
+
content = node.content
|
121
|
+
xml_abstract << content
|
122
|
+
text = Utils::flatten_rawtext(content).join("\n")
|
123
|
+
foreword_style(node, text)
|
83
124
|
end
|
84
|
-
end
|
85
|
-
result
|
125
|
+
end.join("\n")
|
86
126
|
end
|
87
127
|
|
88
|
-
def
|
89
|
-
|
128
|
+
def image_attributes(node)
|
129
|
+
uri = node.image_uri node.attr("target")
|
130
|
+
types = MIME::Types.type_for(uri)
|
131
|
+
{ src: uri,
|
132
|
+
id: Utils::anchor_or_uuid,
|
133
|
+
imagetype: types.first.sub_type.upcase,
|
134
|
+
height: node.attr("height"),
|
135
|
+
width: node.attr("width") }
|
136
|
+
end
|
137
|
+
|
138
|
+
def image(node)
|
90
139
|
noko do |xml|
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
xml_section << node.content
|
95
|
-
end
|
96
|
-
when "patent notice"
|
97
|
-
xml.patent_notice **attr_code(attr) do |xml_section|
|
98
|
-
xml_section << node.content
|
99
|
-
end
|
100
|
-
when "scope"
|
101
|
-
xml.scope **attr_code(attr) do |xml_section|
|
102
|
-
xml_section << node.content
|
103
|
-
end
|
104
|
-
when "normative references"
|
105
|
-
$norm_ref = true
|
106
|
-
xml.norm_ref **attr_code(attr) do |xml_section|
|
107
|
-
xml_section << node.content
|
108
|
-
end
|
109
|
-
$norm_ref = false
|
110
|
-
when "terms and definitions"
|
111
|
-
$term_def = true
|
112
|
-
xml.terms_defs **attr_code(attr) do |xml_section|
|
113
|
-
xml_section << node.content
|
114
|
-
end
|
115
|
-
$term_def = false
|
116
|
-
when "bibliography"
|
117
|
-
$biblio = true
|
118
|
-
xml.bibliography **attr_code(attr) do |xml_section|
|
119
|
-
xml_section << node.content
|
120
|
-
end
|
121
|
-
$biblio = true
|
122
|
-
else
|
123
|
-
if $term_def
|
124
|
-
xml.termdef **attr_code(attr) do |xml_section|
|
125
|
-
xml_section.term { |name| name << node.title }
|
126
|
-
xml_section << node.content
|
127
|
-
end
|
128
|
-
elsif node.attr("style") == "appendix"
|
129
|
-
xml.annex **attr_code(attr) do |xml_section|
|
130
|
-
xml_section.name { |name| name << node.title }
|
131
|
-
xml_section << node.content
|
132
|
-
end
|
133
|
-
else
|
134
|
-
xml.clause **attr_code(attr) do |xml_section|
|
135
|
-
unless node.title.nil?
|
136
|
-
xml_section.name { |name| name << node.title }
|
137
|
-
end
|
138
|
-
xml_section << node.content
|
139
|
-
end
|
140
|
-
end
|
140
|
+
xml.figure **id_attr(node) do |f|
|
141
|
+
f.name { |name| name << node.title } unless node.title.nil?
|
142
|
+
f.image **attr_code(image_attributes(node))
|
141
143
|
end
|
142
|
-
end
|
144
|
+
end
|
143
145
|
end
|
144
146
|
|
145
|
-
def
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
src: uri,
|
147
|
+
def quote_attrs(node)
|
148
|
+
{
|
149
|
+
id: Utils::anchor_or_uuid(node),
|
150
|
+
align: node.attr("align"),
|
150
151
|
}
|
152
|
+
end
|
151
153
|
|
152
|
-
|
153
|
-
|
154
|
-
|
154
|
+
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
|
155
159
|
end
|
156
160
|
end
|
161
|
+
if node.attr("citetitle")
|
162
|
+
# TODO: eref
|
163
|
+
end
|
157
164
|
end
|
158
165
|
|
159
166
|
def quote(node)
|
160
167
|
noko do |xml|
|
161
|
-
xml.quote **attr_code(
|
162
|
-
|
163
|
-
|
168
|
+
xml.quote **attr_code(quote_attrs(node)) do |q|
|
169
|
+
quote_attribution(node, out)
|
170
|
+
if node.blocks? then q << node.content
|
164
171
|
else
|
165
|
-
|
172
|
+
q.p { |p| p << node.content }
|
166
173
|
end
|
167
174
|
end
|
168
175
|
end
|
@@ -173,10 +180,14 @@ module Asciidoctor
|
|
173
180
|
noko do |xml|
|
174
181
|
if node.parent.context != :example
|
175
182
|
xml.figure do |xml_figure|
|
176
|
-
xml_figure.sourcecode
|
183
|
+
xml_figure.sourcecode **id_attr(node) do |s|
|
184
|
+
s << node.content
|
185
|
+
end
|
177
186
|
end
|
178
187
|
else
|
179
|
-
xml.sourcecode
|
188
|
+
xml.sourcecode **id_attr(node) do |s|
|
189
|
+
s << node.content
|
190
|
+
end
|
180
191
|
end
|
181
192
|
end
|
182
193
|
end
|