asciidoctor-iso 0.10.1 → 0.10.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/asciidoctor-iso.gemspec +1 -0
- data/lib/asciidoctor/iso/base.rb +1 -146
- data/lib/asciidoctor/iso/cleanup.rb +26 -233
- data/lib/asciidoctor/iso/converter.rb +2 -38
- data/lib/asciidoctor/iso/front.rb +2 -32
- data/lib/asciidoctor/iso/isodoc.rng +43 -25
- data/lib/asciidoctor/iso/isostandard.rng +8 -8
- data/lib/asciidoctor/iso/section.rb +2 -117
- data/lib/asciidoctor/iso/validate.rb +4 -45
- data/lib/asciidoctor/iso/validate_requirements.rb +2 -2
- data/lib/asciidoctor/iso/validate_section.rb +12 -6
- data/lib/asciidoctor/iso/validate_style.rb +2 -9
- data/lib/asciidoctor/iso/version.rb +1 -1
- data/spec/asciidoctor-iso/base_spec.rb +2 -0
- data/spec/asciidoctor-iso/macros_spec.rb +1 -1
- data/spec/asciidoctor-iso/refs_spec.rb +1 -1
- data/spec/asciidoctor-iso/validate_spec.rb +1 -12
- data/spec/assets/iso.doc +7 -7
- data/spec/spec_helper.rb +1 -0
- metadata +16 -13
- data/lib/asciidoctor/iso/blocks.rb +0 -190
- data/lib/asciidoctor/iso/cleanup_block.rb +0 -193
- data/lib/asciidoctor/iso/cleanup_footnotes.rb +0 -96
- data/lib/asciidoctor/iso/cleanup_ref.rb +0 -125
- data/lib/asciidoctor/iso/inline.rb +0 -134
- data/lib/asciidoctor/iso/isostandard_diff.rnc +0 -279
- data/lib/asciidoctor/iso/lists.rb +0 -87
- data/lib/asciidoctor/iso/macros.rb +0 -95
- data/lib/asciidoctor/iso/ref.rb +0 -187
- data/lib/asciidoctor/iso/table.rb +0 -61
- data/lib/asciidoctor/iso/utils.rb +0 -127
@@ -1,279 +0,0 @@
|
|
1
|
-
default namespace = "http://riboseinc.com/isoxml"
|
2
|
-
|
3
|
-
# grammar {
|
4
|
-
|
5
|
-
start = iso-standard
|
6
|
-
|
7
|
-
iso-standard =
|
8
|
-
element iso-standard {
|
9
|
-
#title+, status, creator, language, script, type, id, version?, copyright, sections
|
10
|
-
bibdata, version?, sections+
|
11
|
-
}
|
12
|
-
|
13
|
-
language =
|
14
|
-
element language { ( "en" | "fr" ) }
|
15
|
-
|
16
|
-
script =
|
17
|
-
element script { "Latn" }
|
18
|
-
|
19
|
-
# draft into isodoc? To replace version/version?
|
20
|
-
version =
|
21
|
-
element version {
|
22
|
-
edition?,
|
23
|
-
revision-date?,
|
24
|
-
draft?
|
25
|
-
}
|
26
|
-
|
27
|
-
draft = element draft {text}
|
28
|
-
|
29
|
-
# TODO to docidentifier
|
30
|
-
#id =
|
31
|
-
#element id {
|
32
|
-
#documentnumber,
|
33
|
-
#tc-documentnumber?
|
34
|
-
#}
|
35
|
-
|
36
|
-
# add type to docidentifier in isodoc?
|
37
|
-
docidentifier =
|
38
|
-
element docidentifier {
|
39
|
-
( text | documentnumber | tc-documentnumber )
|
40
|
-
}
|
41
|
-
|
42
|
-
# TODO to orgname
|
43
|
-
#creator =
|
44
|
-
#element creator {
|
45
|
-
#attribute role { text },
|
46
|
-
#technical-committee,
|
47
|
-
#subcommittee?,
|
48
|
-
#workgroup?,
|
49
|
-
#secretariat?
|
50
|
-
#}
|
51
|
-
|
52
|
-
organization =
|
53
|
-
element organization {
|
54
|
-
orgname, uri?, org-identifier*, contact*,
|
55
|
-
technical-committee?, subcommittee?, workgroup?, secretariat?
|
56
|
-
}
|
57
|
-
|
58
|
-
# Do not constrain in XML: add to validation
|
59
|
-
# type =
|
60
|
-
# element type {
|
61
|
-
# ( "international-standard" | "technical-specification" |
|
62
|
-
# "technical-report" | "publicly-available-specification" |
|
63
|
-
# "international-workshop-agreement" | "guide" )
|
64
|
-
# }
|
65
|
-
|
66
|
-
status =
|
67
|
-
element status {
|
68
|
-
FormattedString |
|
69
|
-
( stage, substage? )
|
70
|
-
}
|
71
|
-
|
72
|
-
stage =
|
73
|
-
element stage {
|
74
|
-
("00" | "10" | "20" | "30" | "40" | "50" | "60" | "90" | "95" )
|
75
|
-
}
|
76
|
-
|
77
|
-
substage =
|
78
|
-
element substage {
|
79
|
-
("00" | "20" | "60" | "90" | "92" | "93" | "98" | "99" )
|
80
|
-
}
|
81
|
-
|
82
|
-
documentnumber =
|
83
|
-
element project-number {
|
84
|
-
attribute part { xsd:int }?,
|
85
|
-
xsd:int
|
86
|
-
}
|
87
|
-
|
88
|
-
tc-documentnumber =
|
89
|
-
element tc-document-number {
|
90
|
-
xsd:int
|
91
|
-
}
|
92
|
-
|
93
|
-
technical-committee =
|
94
|
-
element technical-committee {
|
95
|
-
attribute number { xsd:int }?,
|
96
|
-
text
|
97
|
-
}
|
98
|
-
|
99
|
-
subcommittee =
|
100
|
-
element subcommittee {
|
101
|
-
attribute number { xsd:int }?,
|
102
|
-
text
|
103
|
-
}
|
104
|
-
|
105
|
-
workgroup =
|
106
|
-
element workgroup {
|
107
|
-
attribute number { xsd:int }?,
|
108
|
-
text
|
109
|
-
}
|
110
|
-
|
111
|
-
secretariat =
|
112
|
-
element secretariat { text }
|
113
|
-
|
114
|
-
btitle =
|
115
|
-
element title {
|
116
|
-
text |
|
117
|
-
( title-intro?, title-main, title-part? )
|
118
|
-
}
|
119
|
-
|
120
|
-
title-intro =
|
121
|
-
element title-intro { text }
|
122
|
-
|
123
|
-
title-main =
|
124
|
-
element title-main { text }
|
125
|
-
|
126
|
-
title-part =
|
127
|
-
element title-part { text }
|
128
|
-
|
129
|
-
sections =
|
130
|
-
element sections {
|
131
|
-
content, content?,
|
132
|
-
clause, references, terms, clause+,
|
133
|
-
annex*, references?
|
134
|
-
}
|
135
|
-
|
136
|
-
references =
|
137
|
-
element references {
|
138
|
-
attribute id { xsd:ID }?,
|
139
|
-
section-title?,
|
140
|
-
bibitem*,
|
141
|
-
references*
|
142
|
-
}
|
143
|
-
|
144
|
-
terms =
|
145
|
-
element terms {
|
146
|
-
attribute id { xsd:ID }?,
|
147
|
-
section-title?,
|
148
|
-
# boilerplate
|
149
|
-
paragraph-with-footnote*, ul?,
|
150
|
-
(term+ | terms? )
|
151
|
-
}
|
152
|
-
|
153
|
-
term =
|
154
|
-
element term {
|
155
|
-
attribute id { xsd:ID }?,
|
156
|
-
preferred, admitted*, deprecates*,
|
157
|
-
termdomain?, definition, termnote*, termexample*, termsource*
|
158
|
-
}
|
159
|
-
|
160
|
-
definition =
|
161
|
-
element definition {
|
162
|
-
( paragraph | figure | formula )+
|
163
|
-
}
|
164
|
-
|
165
|
-
origin =
|
166
|
-
element origin {
|
167
|
-
attribute citeas { text },
|
168
|
-
CitationType
|
169
|
-
}
|
170
|
-
|
171
|
-
clause-hanging-paragraph-with-footnote =
|
172
|
-
element subsection {
|
173
|
-
attribute id { xsd:ID }?,
|
174
|
-
attribute inline-header { xsd:boolean } ? ,
|
175
|
-
section-title?,
|
176
|
-
# allow hanging paragraphs in annexes: they introduce lists
|
177
|
-
BasicBlock*,
|
178
|
-
clause-hanging-paragraph-with-footnote*
|
179
|
-
}
|
180
|
-
|
181
|
-
annex =
|
182
|
-
element annex {
|
183
|
-
attribute id { xsd:ID }?,
|
184
|
-
attribute inline-header { xsd:boolean }?,
|
185
|
-
attribute subtype { "normative" | "informative" }?,
|
186
|
-
section-title?,
|
187
|
-
# allow hanging paragraps in annexes: they introduce lists
|
188
|
-
#( paragraph-with-footnote | table | note | formula | admonition | ol | ul | dl | figure | quote | sourcecode | review | example )*,
|
189
|
-
BasicBlock*,
|
190
|
-
clause-hanging-paragraph-with-footnote*
|
191
|
-
}
|
192
|
-
|
193
|
-
figure =
|
194
|
-
element figure {
|
195
|
-
attribute id { xsd:ID },
|
196
|
-
tname?,
|
197
|
-
( image | figure+ ),
|
198
|
-
fn*,
|
199
|
-
dl?,
|
200
|
-
note*
|
201
|
-
}
|
202
|
-
|
203
|
-
li =
|
204
|
-
element li {
|
205
|
-
#( paragraph-with-footnote | table | note | formula | admonition | ol | ul | dl | quote | sourcecode | review | example )+
|
206
|
-
BasicBlock+
|
207
|
-
# exclude figures?
|
208
|
-
}
|
209
|
-
|
210
|
-
dd =
|
211
|
-
element dd {
|
212
|
-
#( paragraph-with-footnote | table | note | formula | admonition | ol | ul | dl | quote | sourcecode | review | example )*
|
213
|
-
# exclude figures?
|
214
|
-
BasicBlock
|
215
|
-
}
|
216
|
-
|
217
|
-
admonition =
|
218
|
-
element admonition {
|
219
|
-
attribute id { xsd:ID },
|
220
|
-
attribute type {
|
221
|
-
( "danger" | "caution" | "warning" | "important" | "safety precautions" )},
|
222
|
-
paragraph-with-footnote+
|
223
|
-
}
|
224
|
-
|
225
|
-
xref =
|
226
|
-
element xref {
|
227
|
-
attribute target { xsd:IDREF },
|
228
|
-
text
|
229
|
-
}
|
230
|
-
|
231
|
-
hyperlink =
|
232
|
-
element link {
|
233
|
-
attribute target {xsd:anyURI},
|
234
|
-
text
|
235
|
-
}
|
236
|
-
|
237
|
-
thead =
|
238
|
-
element thead { tr+ }
|
239
|
-
|
240
|
-
td =
|
241
|
-
element td {
|
242
|
-
attribute colspan { text }?,
|
243
|
-
attribute rowspan { text }?,
|
244
|
-
attribute align { "left" | "right" | "center" }?,
|
245
|
-
(
|
246
|
-
(TextElement | fn | review )* |
|
247
|
-
paragraph-with-footnote+
|
248
|
-
)
|
249
|
-
}
|
250
|
-
|
251
|
-
th =
|
252
|
-
element th {
|
253
|
-
attribute colspan { text }?,
|
254
|
-
attribute rowspan { text }?,
|
255
|
-
attribute align { "left" | "right" | "center" }?,
|
256
|
-
(
|
257
|
-
(TextElement | fn | review )* |
|
258
|
-
paragraph-with-footnote+
|
259
|
-
)
|
260
|
-
}
|
261
|
-
|
262
|
-
table-note = element note {
|
263
|
-
attribute id { xsd:ID }?,
|
264
|
-
paragraph
|
265
|
-
}
|
266
|
-
|
267
|
-
|
268
|
-
Clause-Section =
|
269
|
-
attribute id { xsd:ID }?,
|
270
|
-
attribute inline-header { xsd:boolean }?,
|
271
|
-
section-title?,
|
272
|
-
(
|
273
|
-
BasicBlock+ |
|
274
|
-
clause-subsection+
|
275
|
-
)
|
276
|
-
|
277
|
-
# }
|
278
|
-
|
279
|
-
|
@@ -1,87 +0,0 @@
|
|
1
|
-
require "pp"
|
2
|
-
|
3
|
-
module Asciidoctor
|
4
|
-
module ISO
|
5
|
-
module Lists
|
6
|
-
def li(xml_ul, item)
|
7
|
-
xml_ul.li do |xml_li|
|
8
|
-
if item.blocks?
|
9
|
-
xml_li.p(**id_attr(item)) { |t| t << item.text }
|
10
|
-
xml_li << item.content
|
11
|
-
else
|
12
|
-
xml_li.p(**id_attr(item)) { |p| p << item.text }
|
13
|
-
end
|
14
|
-
end
|
15
|
-
end
|
16
|
-
|
17
|
-
def ulist(node)
|
18
|
-
return reference(node) if in_norm_ref? || in_biblio?
|
19
|
-
noko do |xml|
|
20
|
-
xml.ul **id_attr(node) do |xml_ul|
|
21
|
-
node.items.each do |item|
|
22
|
-
li(xml_ul, item)
|
23
|
-
end
|
24
|
-
end
|
25
|
-
end.join("\n")
|
26
|
-
end
|
27
|
-
|
28
|
-
def olist_style(style)
|
29
|
-
return "alphabet" if style == "loweralpha"
|
30
|
-
return "roman" if style == "lowerroman"
|
31
|
-
return "roman_upper" if style == "upperroman"
|
32
|
-
return "alphabet_upper" if style == "upperalpha"
|
33
|
-
style
|
34
|
-
end
|
35
|
-
|
36
|
-
def olist(node)
|
37
|
-
noko do |xml|
|
38
|
-
xml.ol **attr_code(id: Utils::anchor_or_uuid(node),
|
39
|
-
type: olist_style(node.style)) do |xml_ol|
|
40
|
-
node.items.each { |item| li(xml_ol, item) }
|
41
|
-
end
|
42
|
-
end.join("\n")
|
43
|
-
end
|
44
|
-
|
45
|
-
def dt(terms, xml_dl)
|
46
|
-
terms.each_with_index do |dt, idx|
|
47
|
-
xml_dl.dt { |xml_dt| xml_dt << dt.text }
|
48
|
-
if idx < terms.size - 1
|
49
|
-
xml_dl.dd
|
50
|
-
end
|
51
|
-
end
|
52
|
-
end
|
53
|
-
|
54
|
-
def dd(dd, xml_dl)
|
55
|
-
if dd.nil?
|
56
|
-
xml_dl.dd
|
57
|
-
return
|
58
|
-
end
|
59
|
-
xml_dl.dd do |xml_dd|
|
60
|
-
xml_dd.p { |t| t << dd.text } if dd.text?
|
61
|
-
xml_dd << dd.content if dd.blocks?
|
62
|
-
end
|
63
|
-
end
|
64
|
-
|
65
|
-
def dlist(node)
|
66
|
-
noko do |xml|
|
67
|
-
xml.dl **id_attr(node) do |xml_dl|
|
68
|
-
node.items.each do |terms, dd|
|
69
|
-
dt(terms, xml_dl)
|
70
|
-
dd(dd, xml_dl)
|
71
|
-
end
|
72
|
-
end
|
73
|
-
end.join("\n")
|
74
|
-
end
|
75
|
-
|
76
|
-
def colist(node)
|
77
|
-
noko do |xml|
|
78
|
-
node.items.each_with_index do |item, i|
|
79
|
-
xml.annotation **attr_code(id: i + 1) do |xml_li|
|
80
|
-
xml_li.p { |p| p << item.text }
|
81
|
-
end
|
82
|
-
end
|
83
|
-
end.join("\n")
|
84
|
-
end
|
85
|
-
end
|
86
|
-
end
|
87
|
-
end
|
@@ -1,95 +0,0 @@
|
|
1
|
-
require "asciidoctor/extensions"
|
2
|
-
module Asciidoctor
|
3
|
-
module ISO
|
4
|
-
class AltTermInlineMacro < Asciidoctor::Extensions::InlineMacroProcessor
|
5
|
-
use_dsl
|
6
|
-
named :alt
|
7
|
-
parse_content_as :text
|
8
|
-
using_format :short
|
9
|
-
|
10
|
-
def process(parent, _target, attrs)
|
11
|
-
out = Asciidoctor::Inline.new(parent, :quoted, attrs["text"]).convert
|
12
|
-
%{<admitted>#{out}</admitted>}
|
13
|
-
end
|
14
|
-
end
|
15
|
-
|
16
|
-
class DeprecatedTermInlineMacro <
|
17
|
-
Asciidoctor::Extensions::InlineMacroProcessor
|
18
|
-
use_dsl
|
19
|
-
named :deprecated
|
20
|
-
parse_content_as :text
|
21
|
-
using_format :short
|
22
|
-
|
23
|
-
def process(parent, _target, attrs)
|
24
|
-
out = Asciidoctor::Inline.new(parent, :quoted, attrs["text"]).convert
|
25
|
-
%{<deprecates>#{out}</deprecates>}
|
26
|
-
end
|
27
|
-
end
|
28
|
-
|
29
|
-
class DomainTermInlineMacro < Asciidoctor::Extensions::InlineMacroProcessor
|
30
|
-
use_dsl
|
31
|
-
named :domain
|
32
|
-
parse_content_as :text
|
33
|
-
using_format :short
|
34
|
-
|
35
|
-
def process(parent, _target, attrs)
|
36
|
-
out = Asciidoctor::Inline.new(parent, :quoted, attrs["text"]).convert
|
37
|
-
%{<domain>#{out}</domain>}
|
38
|
-
end
|
39
|
-
end
|
40
|
-
|
41
|
-
class PlantUMLBlockMacroBackend
|
42
|
-
# https://stackoverflow.com/questions/2108727/which-in-ruby-checking-if-program-exists-in-path-from-ruby
|
43
|
-
def self.plantuml_installed?
|
44
|
-
cmd = "plantuml"
|
45
|
-
exts = ENV['PATHEXT'] ? ENV['PATHEXT'].split(';') : ['']
|
46
|
-
ENV['PATH'].split(File::PATH_SEPARATOR).each do |path|
|
47
|
-
exts.each do |ext|
|
48
|
-
exe = File.join(path, "#{cmd}#{ext}")
|
49
|
-
return exe if File.executable?(exe) && !File.directory?(exe)
|
50
|
-
end
|
51
|
-
end
|
52
|
-
nil
|
53
|
-
end
|
54
|
-
|
55
|
-
def self.generate_file parent, reader
|
56
|
-
src = reader.source
|
57
|
-
reader.lines.first.sub(/\s+$/, "") != "@startuml" or
|
58
|
-
src = "@startuml\n#{src}\n@enduml\n"
|
59
|
-
filename = parent.document.reader.lineno
|
60
|
-
system "mkdir -p plantuml"
|
61
|
-
File.open("plantuml/#{filename}.pml", "w") { |f| f.write src }
|
62
|
-
system "plantuml plantuml/#{filename}.pml"
|
63
|
-
filename
|
64
|
-
end
|
65
|
-
|
66
|
-
def self.generate_attrs attrs
|
67
|
-
through_attrs = %w(id align float title role width height alt).
|
68
|
-
inject({}) do |memo, key|
|
69
|
-
memo[key] = attrs[key] if attrs.has_key? key
|
70
|
-
memo
|
71
|
-
end
|
72
|
-
end
|
73
|
-
end
|
74
|
-
|
75
|
-
class PlantUMLBlockMacro < Asciidoctor::Extensions::BlockProcessor
|
76
|
-
use_dsl
|
77
|
-
named :plantuml
|
78
|
-
on_context :literal
|
79
|
-
parse_content_as :raw
|
80
|
-
|
81
|
-
def process(parent, reader, attrs)
|
82
|
-
if PlantUMLBlockMacroBackend.plantuml_installed?
|
83
|
-
filename = PlantUMLBlockMacroBackend.generate_file parent, reader
|
84
|
-
through_attrs = PlantUMLBlockMacroBackend.generate_attrs attrs
|
85
|
-
through_attrs["target"] = "plantuml/#{filename}.png"
|
86
|
-
create_image_block parent, through_attrs
|
87
|
-
else
|
88
|
-
warn "PlantUML not installed"
|
89
|
-
# attrs.delete(1) : remove the style attribute
|
90
|
-
create_listing_block parent, reader.source, attrs.reject { |k, v| k == 1 }
|
91
|
-
end
|
92
|
-
end
|
93
|
-
end
|
94
|
-
end
|
95
|
-
end
|