metanorma-standoc 1.10.2 → 1.10.4.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/asciidoctor/standoc/base.rb +13 -5
- data/lib/asciidoctor/standoc/blocks.rb +35 -31
- data/lib/asciidoctor/standoc/cleanup.rb +61 -0
- data/lib/asciidoctor/standoc/cleanup_block.rb +6 -3
- data/lib/asciidoctor/standoc/cleanup_reqt.rb +59 -14
- data/lib/asciidoctor/standoc/converter.rb +4 -0
- data/lib/asciidoctor/standoc/datamodel/diagram_preprocessor.rb +22 -21
- data/lib/asciidoctor/standoc/isodoc.rng +12 -0
- data/lib/asciidoctor/standoc/lists.rb +9 -6
- data/lib/asciidoctor/standoc/macros.rb +18 -0
- data/lib/asciidoctor/standoc/ref.rb +60 -56
- data/lib/asciidoctor/standoc/reqt.rb +39 -27
- data/lib/asciidoctor/standoc/reqt.rng +15 -4
- data/lib/asciidoctor/standoc/validate_section.rb +2 -1
- data/lib/isodoc/base.standard.xsl +6003 -0
- data/lib/isodoc/pdf_convert.rb +20 -0
- data/lib/metanorma-standoc.rb +1 -0
- data/lib/metanorma/standoc/processor.rb +5 -1
- data/lib/metanorma/standoc/version.rb +1 -1
- data/metanorma-standoc.gemspec +1 -1
- data/spec/asciidoctor/base_spec.rb +6 -0
- data/spec/asciidoctor/blocks_spec.rb +45 -25
- data/spec/asciidoctor/cleanup_sections_spec.rb +899 -864
- data/spec/asciidoctor/cleanup_spec.rb +136 -2
- data/spec/asciidoctor/macros_plantuml_spec.rb +165 -104
- data/spec/asciidoctor/macros_spec.rb +208 -0
- data/spec/asciidoctor/validate_spec.rb +4 -0
- data/spec/examples/datamodel/address_class_profile.adoc +1 -0
- data/spec/examples/datamodel/address_component_profile.adoc +1 -0
- data/spec/examples/datamodel/blank_definition_profile.adoc +1 -0
- data/spec/examples/datamodel/common_models_diagram.adoc +2 -1
- data/spec/examples/datamodel/top_down_diagram.adoc +2 -1
- data/spec/fixtures/datamodel_description_sections_tree.xml +327 -0
- data/spec/fixtures/test.xmi +9250 -0
- data/spec/metanorma/processor_spec.rb +50 -50
- data/spec/support/shared_examples/structured_data_2_text_preprocessor.rb +34 -34
- data/spec/vcr_cassettes/dated_iso_ref_joint_iso_iec.yml +50 -50
- data/spec/vcr_cassettes/isobib_get_123.yml +11 -11
- data/spec/vcr_cassettes/isobib_get_123_1.yml +23 -23
- data/spec/vcr_cassettes/isobib_get_123_1_fr.yml +35 -35
- data/spec/vcr_cassettes/isobib_get_123_2001.yml +12 -12
- data/spec/vcr_cassettes/isobib_get_124.yml +11 -11
- data/spec/vcr_cassettes/rfcbib_get_rfc8341.yml +14 -14
- data/spec/vcr_cassettes/separates_iev_citations_by_top_level_clause.yml +46 -46
- metadata +8 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4de5b7f8779dae7c359b93ce364ffa7cc406156bf1437c7cdccb6595b7bd958a
|
4
|
+
data.tar.gz: c35902148b405e451af8487faff391b6eddbbd7b07cd2b6c8d565cd515e4515c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6e33b33321d6826a65257a3440c63218021d5d40b69fa58b268d0a2c5e8436aed951e05c7f44ab97c74b5ce916c25ad7040cc962cf38be15ee2ebaf0c6858529
|
7
|
+
data.tar.gz: f8f719f8062c3c71ebd2883617b984d7432134cb94da1be308e9ede34bf74def5be6267570c76ff9f248e628e443d6b71a60b9f71e1ba436b7c64eb2c2b25c13
|
@@ -62,6 +62,12 @@ module Asciidoctor
|
|
62
62
|
IsoDoc::HtmlConvert.new(html_extract_attributes(node))
|
63
63
|
end
|
64
64
|
|
65
|
+
def pdf_converter(node)
|
66
|
+
return nil if node.attr("no-pdf")
|
67
|
+
|
68
|
+
IsoDoc::Standoc::PdfConvert.new(doc_extract_attributes(node))
|
69
|
+
end
|
70
|
+
|
65
71
|
def doc_extract_attributes(node)
|
66
72
|
attrs = {
|
67
73
|
script: node.attr("script"),
|
@@ -114,11 +120,11 @@ module Asciidoctor
|
|
114
120
|
node.attr("mn-keep-asciimath") != "false"
|
115
121
|
@fontheader = default_fonts(node)
|
116
122
|
@files_to_delete = []
|
117
|
-
if node.attr("docfile")
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
123
|
+
@filename = if node.attr("docfile")
|
124
|
+
File.basename(node.attr("docfile"))&.gsub(/\.adoc$/, "")
|
125
|
+
else
|
126
|
+
""
|
127
|
+
end
|
122
128
|
@localdir = Metanorma::Utils::localdir(node)
|
123
129
|
@output_dir = outputdir node
|
124
130
|
@no_isobib_cache = node.attr("no-isobib-cache")
|
@@ -156,6 +162,8 @@ module Asciidoctor
|
|
156
162
|
nil, false, "#{@filename}.html")
|
157
163
|
doc_converter(node).convert("#{@filename}.presentation.xml",
|
158
164
|
nil, false, "#{@filename}.doc")
|
165
|
+
pdf_converter(node)&.convert("#{@filename}.presentation.xml",
|
166
|
+
nil, false, "#{@filename}.pdf")
|
159
167
|
end
|
160
168
|
|
161
169
|
def document(node)
|
@@ -10,15 +10,17 @@ module Asciidoctor
|
|
10
10
|
end
|
11
11
|
|
12
12
|
def id_unnum_attrs(node)
|
13
|
-
attr_code(
|
13
|
+
attr_code(id: Metanorma::Utils::anchor_or_uuid(node),
|
14
14
|
unnumbered: node.option?("unnumbered") ? "true" : nil,
|
15
15
|
number: node.attr("number"),
|
16
|
-
subsequence: node.attr("subsequence")
|
16
|
+
subsequence: node.attr("subsequence"))
|
17
17
|
end
|
18
18
|
|
19
19
|
def formula_attrs(node)
|
20
|
-
attr_code(id_unnum_attrs(node)
|
21
|
-
|
20
|
+
attr_code(id_unnum_attrs(node)
|
21
|
+
.merge(keep_attrs(node).merge(
|
22
|
+
inequality: node.option?("inequality") ? "true" : nil,
|
23
|
+
)))
|
22
24
|
end
|
23
25
|
|
24
26
|
def keep_attrs(node)
|
@@ -58,8 +60,8 @@ module Asciidoctor
|
|
58
60
|
xml.figure **literal_attrs(node) do |f|
|
59
61
|
figure_title(node, f)
|
60
62
|
f.pre node.lines.join("\n"),
|
61
|
-
|
62
|
-
|
63
|
+
**attr_code(id: Metanorma::Utils::anchor_or_uuid,
|
64
|
+
alt: node.attr("alt"))
|
63
65
|
end
|
64
66
|
end
|
65
67
|
end
|
@@ -95,20 +97,21 @@ module Asciidoctor
|
|
95
97
|
end
|
96
98
|
|
97
99
|
def svgmap_attrs(node)
|
98
|
-
attr_code(
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
merge(keep_attrs(node)))
|
100
|
+
attr_code({ id: node.id,
|
101
|
+
unnumbered: node.option?("unnumbered") ? "true" : nil,
|
102
|
+
number: node.attr("number"),
|
103
|
+
subsequence: node.attr("subsequence") }
|
104
|
+
.merge(keep_attrs(node)))
|
103
105
|
end
|
104
106
|
|
105
107
|
def svgmap_example(node)
|
106
108
|
noko do |xml|
|
107
109
|
xml.svgmap **attr_code(svgmap_attrs(node).merge(
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
110
|
+
src: node.attr("src"), alt: node.attr("alt"),
|
111
|
+
)) do |ex|
|
112
|
+
figure_title(node, ex)
|
113
|
+
ex << node.content
|
114
|
+
end
|
112
115
|
end.join("\n")
|
113
116
|
end
|
114
117
|
|
@@ -136,9 +139,10 @@ module Asciidoctor
|
|
136
139
|
end.join("\n")
|
137
140
|
end
|
138
141
|
|
139
|
-
def figure_title(node,
|
142
|
+
def figure_title(node, out)
|
140
143
|
return if node.title.nil?
|
141
|
-
|
144
|
+
|
145
|
+
out.name { |name| name << node.title }
|
142
146
|
end
|
143
147
|
|
144
148
|
def figure_attrs(node)
|
@@ -149,15 +153,15 @@ module Asciidoctor
|
|
149
153
|
noko do |xml|
|
150
154
|
xml.figure **figure_attrs(node) do |f|
|
151
155
|
figure_title(node, f)
|
152
|
-
f.image **
|
156
|
+
f.image **image_attributes(node)
|
153
157
|
end
|
154
158
|
end
|
155
159
|
end
|
156
160
|
|
157
161
|
def para_attrs(node)
|
158
162
|
attr_code(keep_attrs(node)
|
159
|
-
.merge(align: node.attr("align"),
|
160
|
-
|
163
|
+
.merge(align: node.attr("align"),
|
164
|
+
id: Metanorma::Utils::anchor_or_uuid(node)))
|
161
165
|
end
|
162
166
|
|
163
167
|
def paragraph(node)
|
@@ -172,8 +176,8 @@ module Asciidoctor
|
|
172
176
|
|
173
177
|
def quote_attrs(node)
|
174
178
|
attr_code(keep_attrs(node)
|
175
|
-
.merge(align: node.attr("align"),
|
176
|
-
|
179
|
+
.merge(align: node.attr("align"),
|
180
|
+
id: Metanorma::Utils::anchor_or_uuid(node)))
|
177
181
|
end
|
178
182
|
|
179
183
|
def quote_attribution(node, out)
|
@@ -189,7 +193,7 @@ module Asciidoctor
|
|
189
193
|
|
190
194
|
def quote(node)
|
191
195
|
noko do |xml|
|
192
|
-
xml.quote **
|
196
|
+
xml.quote **quote_attrs(node) do |q|
|
193
197
|
quote_attribution(node, q)
|
194
198
|
wrap_in_para(node, q)
|
195
199
|
end
|
@@ -197,18 +201,18 @@ module Asciidoctor
|
|
197
201
|
end
|
198
202
|
|
199
203
|
def listing_attrs(node)
|
200
|
-
attr_code(keep_attrs(node)
|
201
|
-
merge(lang: node.attr("language"),
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
|
204
|
+
attr_code(keep_attrs(node)
|
205
|
+
.merge(lang: node.attr("language"),
|
206
|
+
id: Metanorma::Utils::anchor_or_uuid(node),
|
207
|
+
unnumbered: node.option?("unnumbered") ? "true" : nil,
|
208
|
+
number: node.attr("number"),
|
209
|
+
filename: node.attr("filename")))
|
206
210
|
end
|
207
211
|
|
208
212
|
# NOTE: html escaping is performed by Nokogiri
|
209
213
|
def listing(node)
|
210
214
|
fragment = ::Nokogiri::XML::Builder.new do |xml|
|
211
|
-
xml.sourcecode **
|
215
|
+
xml.sourcecode **listing_attrs(node) do |s|
|
212
216
|
figure_title(node, s)
|
213
217
|
s << node.content
|
214
218
|
end
|
@@ -219,7 +223,7 @@ module Asciidoctor
|
|
219
223
|
|
220
224
|
def pass(node)
|
221
225
|
noko do |xml|
|
222
|
-
xml.passthrough **attr_code(formats:
|
226
|
+
xml.passthrough **attr_code(formats:
|
223
227
|
node.attr("format") || "metanorma") do |p|
|
224
228
|
p << HTMLEntities.new.encode(node.content, :basic, :hexadecimal)
|
225
229
|
end
|
@@ -62,6 +62,7 @@ module Asciidoctor
|
|
62
62
|
bibdata_cleanup(xmldoc)
|
63
63
|
svgmap_cleanup(xmldoc)
|
64
64
|
boilerplate_cleanup(xmldoc)
|
65
|
+
toc_cleanup(xmldoc)
|
65
66
|
smartquotes_cleanup(xmldoc)
|
66
67
|
variant_cleanup(xmldoc)
|
67
68
|
para_cleanup(xmldoc)
|
@@ -84,6 +85,30 @@ module Asciidoctor
|
|
84
85
|
end
|
85
86
|
|
86
87
|
def smartquotes_cleanup1(xmldoc)
|
88
|
+
uninterrupt_quotes_around_xml(xmldoc)
|
89
|
+
dumb2smart_quotes(xmldoc)
|
90
|
+
end
|
91
|
+
|
92
|
+
# "abc<tag/>", def => "abc",<tag/> def
|
93
|
+
def uninterrupt_quotes_around_xml(xmldoc)
|
94
|
+
xmldoc.xpath("//*[following::text()[1]"\
|
95
|
+
"[starts-with(., '\"') or starts-with(., \"'\")]]")
|
96
|
+
.each do |x|
|
97
|
+
next if !x.ancestors("pre, tt, sourcecode, stem, figure").empty?
|
98
|
+
uninterrupt_quotes_around_xml1(x)
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
def uninterrupt_quotes_around_xml1(elem)
|
103
|
+
prev = elem.at(".//preceding::text()[1]") or return
|
104
|
+
/\S$/.match?(prev.text) or return
|
105
|
+
foll = elem.at(".//following::text()[1]")
|
106
|
+
m = /^(["'][[:punct:]]*)(\s|$)/.match(HTMLEntities.new.decode(foll&.text)) or return
|
107
|
+
foll.content = foll.text.sub(/^(["'][[:punct:]]*)/, "")
|
108
|
+
prev.content = "#{prev.text}#{m[1]}"
|
109
|
+
end
|
110
|
+
|
111
|
+
def dumb2smart_quotes(xmldoc)
|
87
112
|
(xmldoc.xpath("//*[child::text()]") - xmldoc.xpath(IGNORE_DUMBQUOTES))
|
88
113
|
.each do |x|
|
89
114
|
x.children.each do |n|
|
@@ -166,6 +191,42 @@ module Asciidoctor
|
|
166
191
|
end
|
167
192
|
end
|
168
193
|
end
|
194
|
+
|
195
|
+
def toc_cleanup(xmldoc)
|
196
|
+
xmldoc.xpath("//p[toc]").each do |x|
|
197
|
+
x.xpath("./toc").reverse.each do |t|
|
198
|
+
x.next = t
|
199
|
+
end
|
200
|
+
x.remove if x.text.strip.empty?
|
201
|
+
end
|
202
|
+
xmldoc.xpath("//toc").each { |t| toc_cleanup1(t, xmldoc) }
|
203
|
+
end
|
204
|
+
|
205
|
+
def toc_index(toc, xmldoc)
|
206
|
+
depths = toc.xpath("./toc-xpath").each_with_object({}) do |x, m|
|
207
|
+
m[x.text] = x["depth"]
|
208
|
+
end
|
209
|
+
depths.keys.each_with_object([]) do |key, arr|
|
210
|
+
xmldoc.xpath(key).each do |x|
|
211
|
+
arr << { text: x.children.to_xml, depth: depths[key].to_i,
|
212
|
+
target: x.xpath("(./ancestor-or-self::*/@id)[last()]")[0].text,
|
213
|
+
line: x.line }
|
214
|
+
end
|
215
|
+
end.sort_by { |a| a[:line] }
|
216
|
+
end
|
217
|
+
|
218
|
+
def toc_cleanup1(toc, xmldoc)
|
219
|
+
depth = 1
|
220
|
+
ret = ""
|
221
|
+
toc_index(toc, xmldoc).each do |x|
|
222
|
+
if depth > x[:depth] then ret += "</ul></li>" * (depth - x[:depth])
|
223
|
+
elsif depth < x[:depth] then ret += "<li><ul>" * (x[:depth] - depth)
|
224
|
+
end
|
225
|
+
ret += "<li><xref target='#{x[:target]}'>#{x[:text]}</xref></li>"
|
226
|
+
depth = x[:depth]
|
227
|
+
end
|
228
|
+
toc.children = "<ul>#{ret}</ul>"
|
229
|
+
end
|
169
230
|
end
|
170
231
|
end
|
171
232
|
end
|
@@ -7,8 +7,11 @@ module Asciidoctor
|
|
7
7
|
def para_cleanup(xmldoc)
|
8
8
|
["//p[not(ancestor::bibdata)]", "//ol[not(ancestor::bibdata)]",
|
9
9
|
"//ul[not(ancestor::bibdata)]", "//quote[not(ancestor::bibdata)]",
|
10
|
-
"//note[not(ancestor::bibitem or ancestor::table or ancestor::bibdata)]"
|
11
|
-
|
10
|
+
"//note[not(ancestor::bibitem or ancestor::table or ancestor::bibdata)]"].each do |w|
|
11
|
+
inject_id(
|
12
|
+
xmldoc, w
|
13
|
+
)
|
14
|
+
end
|
12
15
|
end
|
13
16
|
|
14
17
|
def inject_id(xmldoc, path)
|
@@ -205,7 +208,7 @@ module Asciidoctor
|
|
205
208
|
def safe_noko(text, doc)
|
206
209
|
Nokogiri::XML::Text.new(text, doc).to_xml(
|
207
210
|
encoding: "US-ASCII",
|
208
|
-
save_with: Nokogiri::XML::Node::SaveOptions::NO_DECLARATION
|
211
|
+
save_with: Nokogiri::XML::Node::SaveOptions::NO_DECLARATION,
|
209
212
|
)
|
210
213
|
end
|
211
214
|
|
@@ -1,40 +1,41 @@
|
|
1
1
|
module Asciidoctor
|
2
2
|
module Standoc
|
3
3
|
module Cleanup
|
4
|
-
def requirement_cleanup(
|
5
|
-
|
6
|
-
|
4
|
+
def requirement_cleanup(xmldoc)
|
5
|
+
requirement_metadata(xmldoc)
|
6
|
+
requirement_descriptions(xmldoc)
|
7
|
+
requirement_inherit(xmldoc)
|
7
8
|
end
|
8
9
|
|
9
|
-
|
10
|
-
|
11
|
-
|
10
|
+
REQRECPER = "//requirement | //recommendation | //permission".freeze
|
11
|
+
|
12
|
+
def requirement_inherit(xmldoc)
|
13
|
+
xmldoc.xpath(REQRECPER).each do |r|
|
12
14
|
ins = r.at("./classification") ||
|
13
15
|
r.at("./description | ./measurementtarget | ./specification | "\
|
14
16
|
"./verification | ./import | ./description | ./requirement | "\
|
15
|
-
"./recommendation | ./permission")
|
17
|
+
"./recommendation | ./permission | ./component")
|
16
18
|
r.xpath("./*//inherit").each { |i| ins.previous = i }
|
17
19
|
end
|
18
20
|
end
|
19
21
|
|
20
|
-
def requirement_descriptions(
|
21
|
-
|
22
|
-
.each do |r|
|
22
|
+
def requirement_descriptions(xmldoc)
|
23
|
+
xmldoc.xpath(REQRECPER).each do |r|
|
23
24
|
r.children.each do |e|
|
24
25
|
unless e.element? && (reqt_subpart(e.name) ||
|
25
26
|
%w(requirement recommendation permission).include?(e.name))
|
26
|
-
t = Nokogiri::XML::Element.new("description",
|
27
|
+
t = Nokogiri::XML::Element.new("description", r)
|
27
28
|
e.before(t)
|
28
29
|
t.children = e.remove
|
29
30
|
end
|
30
31
|
end
|
31
|
-
|
32
|
+
requirement_description_cleanup1(r)
|
32
33
|
end
|
33
34
|
end
|
34
35
|
|
35
|
-
def
|
36
|
+
def requirement_description_cleanup1(reqt)
|
36
37
|
while d = reqt.at("./description[following-sibling::*[1]"\
|
37
|
-
|
38
|
+
"[self::description]]")
|
38
39
|
n = d.next.remove
|
39
40
|
d << n.children
|
40
41
|
end
|
@@ -42,6 +43,50 @@ module Asciidoctor
|
|
42
43
|
r.replace("\n")
|
43
44
|
end
|
44
45
|
end
|
46
|
+
|
47
|
+
def requirement_metadata(xmldoc)
|
48
|
+
xmldoc.xpath(REQRECPER).each do |r|
|
49
|
+
dl = r&.at("./dl[@metadata = 'true']")&.remove or next
|
50
|
+
requirement_metadata1(r, dl)
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
def requirement_metadata1(reqt, dlist)
|
55
|
+
unless ins = reqt.at("./title")
|
56
|
+
reqt.children.first.previous = " "
|
57
|
+
ins = reqt.children.first
|
58
|
+
end
|
59
|
+
%w(label subject inherit).each do |a|
|
60
|
+
ins = reqt_dl_to_elems(ins, reqt, dlist, a)
|
61
|
+
end
|
62
|
+
reqt_dl_to_classif(ins, reqt, dlist)
|
63
|
+
end
|
64
|
+
|
65
|
+
def reqt_dl_to_elems(ins, reqt, dlist, name)
|
66
|
+
if a = reqt.at("./#{name}[last()]")
|
67
|
+
ins = a
|
68
|
+
end
|
69
|
+
dlist.xpath("./dt[text()='#{name}']").each do |e|
|
70
|
+
val = e.at("./following::dd/p") || e.at("./following::dd")
|
71
|
+
val.name = name
|
72
|
+
ins.next = val
|
73
|
+
ins = ins.next
|
74
|
+
end
|
75
|
+
ins
|
76
|
+
end
|
77
|
+
|
78
|
+
def reqt_dl_to_classif(ins, reqt, dlist)
|
79
|
+
if a = reqt.at("./classification[last()]")
|
80
|
+
ins = a
|
81
|
+
end
|
82
|
+
dlist.xpath("./dt[text()='classification']").each do |e|
|
83
|
+
val = e.at("./following::dd/p") || e.at("./following::dd")
|
84
|
+
req_classif_parse(val.text).each do |r|
|
85
|
+
ins.next = "<classification><tag>#{r[0]}</tag>"\
|
86
|
+
"<value>#{r[1]}</value></classification>"
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
45
90
|
end
|
46
91
|
end
|
47
92
|
end
|
@@ -27,6 +27,7 @@ module Asciidoctor
|
|
27
27
|
preprocessor Metanorma::Plugin::Datastruct::Yaml2TextPreprocessor
|
28
28
|
preprocessor Metanorma::Plugin::Lutaml::LutamlPreprocessor
|
29
29
|
preprocessor Metanorma::Plugin::Lutaml::LutamlUmlAttributesTablePreprocessor
|
30
|
+
preprocessor Metanorma::Plugin::Lutaml::LutamlUmlDatamodelDescriptionPreprocessor
|
30
31
|
inline_macro Asciidoctor::Standoc::AltTermInlineMacro
|
31
32
|
inline_macro Asciidoctor::Standoc::DeprecatedTermInlineMacro
|
32
33
|
inline_macro Asciidoctor::Standoc::DomainTermInlineMacro
|
@@ -47,6 +48,9 @@ module Asciidoctor
|
|
47
48
|
inline_macro Asciidoctor::Standoc::FormTextareaMacro
|
48
49
|
inline_macro Asciidoctor::Standoc::FormSelectMacro
|
49
50
|
inline_macro Asciidoctor::Standoc::FormOptionMacro
|
51
|
+
inline_macro Asciidoctor::Standoc::ToCInlineMacro
|
52
|
+
inline_macro Metanorma::Plugin::Lutaml::LutamlFigureInlineMacro
|
53
|
+
block_macro Metanorma::Plugin::Lutaml::LutamlDiagramBlockMacro
|
50
54
|
block Asciidoctor::Standoc::ToDoAdmonitionBlock
|
51
55
|
treeprocessor Asciidoctor::Standoc::ToDoInlineAdmonitionBlock
|
52
56
|
block Asciidoctor::Standoc::PlantUMLBlockMacro
|
@@ -1,16 +1,16 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require
|
4
|
-
require
|
3
|
+
require "erb"
|
4
|
+
require "asciidoctor/standoc/datamodel/plantuml_renderer"
|
5
5
|
|
6
6
|
module Asciidoctor
|
7
7
|
module Standoc
|
8
8
|
module Datamodel
|
9
9
|
class DiagramPreprocessor < Asciidoctor::Extensions::Preprocessor
|
10
|
-
BLOCK_START_REGEXP = /\{(.+?)\.\*,(.+),(.+)\}
|
11
|
-
BLOCK_END_REGEXP = /\A\{[A-Z]+\}\z
|
12
|
-
MARCO_REGEXP = /\[datamodel_diagram,([^,]+),?(.+)?\]
|
13
|
-
TEMPLATES_PATH = File.expand_path(
|
10
|
+
BLOCK_START_REGEXP = /\{(.+?)\.\*,(.+),(.+)\}/.freeze
|
11
|
+
BLOCK_END_REGEXP = /\A\{[A-Z]+\}\z/.freeze
|
12
|
+
MARCO_REGEXP = /\[datamodel_diagram,([^,]+),?(.+)?\]/.freeze
|
13
|
+
TEMPLATES_PATH = File.expand_path("../views/datamodel", __dir__).freeze
|
14
14
|
# search document for block `datamodel_diagram`
|
15
15
|
# read include derectives that goes after that in block and transform
|
16
16
|
# into plantuml block
|
@@ -33,7 +33,7 @@ module Asciidoctor
|
|
33
33
|
end
|
34
34
|
|
35
35
|
def parse_datamodel_marco(yaml_path, include_path, document)
|
36
|
-
include_path ||= File.join(File.dirname(yaml_path),
|
36
|
+
include_path ||= File.join(File.dirname(yaml_path), "..", "models")
|
37
37
|
include_path = yaml_relative_path(include_path, document)
|
38
38
|
yaml_relative_to_doc_path = yaml_relative_path(yaml_path, document)
|
39
39
|
view_hash = YAML.safe_load(File.read(yaml_relative_to_doc_path))
|
@@ -43,7 +43,7 @@ module Asciidoctor
|
|
43
43
|
end
|
44
44
|
|
45
45
|
def yaml_relative_path(file_path, document)
|
46
|
-
docfile = document.attributes[
|
46
|
+
docfile = document.attributes["docfile"] || "."
|
47
47
|
docfile_directory = File.dirname(docfile)
|
48
48
|
document.path_resolver.system_path(file_path, docfile_directory)
|
49
49
|
end
|
@@ -51,11 +51,11 @@ module Asciidoctor
|
|
51
51
|
def import_format(include_path, import_name, values)
|
52
52
|
include_content = File.read(File.join(
|
53
53
|
include_path,
|
54
|
-
"#{import_name}.yml"
|
55
|
-
|
54
|
+
"#{import_name}.yml",
|
55
|
+
))
|
56
56
|
content = YAML.safe_load(include_content)
|
57
57
|
if values
|
58
|
-
content[
|
58
|
+
content["skipSection"] = values["skipSection"]
|
59
59
|
end
|
60
60
|
content
|
61
61
|
end
|
@@ -63,36 +63,37 @@ module Asciidoctor
|
|
63
63
|
def format_import_directives(imports, include_path)
|
64
64
|
imports
|
65
65
|
.each_with_object({}) do |(import_name, values), res|
|
66
|
-
full_model_name = import_name.split(
|
66
|
+
full_model_name = import_name.split("/").join
|
67
67
|
content = import_format(include_path, import_name, values)
|
68
|
-
res[content[
|
68
|
+
res[content["name"] || full_model_name] = content
|
69
69
|
end.compact
|
70
70
|
end
|
71
71
|
|
72
72
|
def prepare_view_hash(view_hash, all_imports)
|
73
73
|
view_hash.merge!(
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
.merge!(
|
74
|
+
"classes" => model_type(all_imports, "class"),
|
75
|
+
"enums" => model_type(all_imports, "enum"),
|
76
|
+
"relations" => view_hash["relations"] || [],
|
77
|
+
"fidelity" => (view_hash["fidelity"] || {})
|
78
|
+
.merge!("classes" => model_type(all_imports,
|
79
|
+
"class")),
|
79
80
|
)
|
80
81
|
end
|
81
82
|
|
82
83
|
def model_type(imports, type)
|
83
84
|
imports
|
84
85
|
.select do |_name, elem|
|
85
|
-
elem[
|
86
|
+
elem["modelType"] == type
|
86
87
|
end
|
87
88
|
end
|
88
89
|
|
89
90
|
def plantuml_representations(view_hash, view_path, include_path)
|
90
91
|
yaml_directory = File.dirname(view_path)
|
91
|
-
all_imports = format_import_directives(view_hash[
|
92
|
+
all_imports = format_import_directives(view_hash["imports"],
|
92
93
|
include_path)
|
93
94
|
prepare_view_hash(view_hash, all_imports)
|
94
95
|
Asciidoctor::Datamodel::PlantumlRenderer
|
95
|
-
.new(view_hash, File.join(yaml_directory,
|
96
|
+
.new(view_hash, File.join(yaml_directory, ".."))
|
96
97
|
.render
|
97
98
|
.split("\n")
|
98
99
|
end
|