asciidoctor-iso 0.6.1 → 0.7.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/.travis.yml +5 -0
- data/Gemfile.lock +12 -10
- data/README.adoc +113 -16
- data/bin/rspec +18 -0
- data/lib/asciidoctor/iso/base.rb +30 -28
- data/lib/asciidoctor/iso/blocks.rb +33 -33
- data/lib/asciidoctor/iso/cleanup.rb +79 -33
- data/lib/asciidoctor/iso/cleanup_block.rb +71 -18
- data/lib/asciidoctor/iso/cleanup_ref.rb +35 -30
- data/lib/asciidoctor/iso/converter.rb +0 -3
- data/lib/asciidoctor/iso/front.rb +29 -16
- data/lib/asciidoctor/iso/html/isodoc.css +34 -0
- data/lib/asciidoctor/iso/html/wordstyle.css +138 -6
- data/lib/asciidoctor/iso/inline.rb +10 -22
- data/lib/asciidoctor/iso/isodoc.rng +66 -16
- data/lib/asciidoctor/iso/isostandard.rng +129 -15
- data/lib/asciidoctor/iso/lists.rb +49 -42
- data/lib/asciidoctor/iso/macros.rb +12 -8
- data/lib/asciidoctor/iso/section.rb +53 -37
- data/lib/asciidoctor/iso/table.rb +9 -1
- data/lib/asciidoctor/iso/utils.rb +18 -13
- data/lib/asciidoctor/iso/validate.rb +100 -24
- data/lib/asciidoctor/iso/validate_requirements.rb +106 -0
- data/lib/asciidoctor/iso/validate_section.rb +85 -65
- data/lib/asciidoctor/iso/validate_style.rb +68 -115
- data/lib/asciidoctor/iso/version.rb +1 -1
- data/spec/asciidoctor-iso/base_spec.rb +193 -0
- data/spec/asciidoctor-iso/blocks_spec.rb +426 -0
- data/spec/asciidoctor-iso/cleanup_spec.rb +687 -0
- data/spec/asciidoctor-iso/inline_spec.rb +159 -0
- data/spec/asciidoctor-iso/lists_spec.rb +189 -0
- data/spec/asciidoctor-iso/macros_spec.rb +20 -0
- data/spec/asciidoctor-iso/refs_spec.rb +194 -0
- data/spec/asciidoctor-iso/section_spec.rb +301 -0
- data/spec/asciidoctor-iso/table_spec.rb +307 -0
- data/spec/asciidoctor-iso/validate_spec.rb +749 -0
- data/spec/examples/english.yaml +69 -0
- data/spec/examples/rice.adoc +30 -28
- data/spec/examples/rice.doc +3035 -2865
- data/spec/examples/rice.html +281 -234
- data/spec/examples/rice.preview.html +30 -20
- data/spec/examples/rice.xml +250 -282
- data/spec/spec_helper.rb +87 -0
- metadata +17 -2
@@ -5,168 +5,121 @@ require "pp"
|
|
5
5
|
module Asciidoctor
|
6
6
|
module ISO
|
7
7
|
module Validate
|
8
|
-
REQUIREMENT_RE_STR = <<~REGEXP.freeze
|
9
|
-
\\b
|
10
|
-
( shall | (is|are)_to |
|
11
|
-
(is|are)_required_(not_)?to |
|
12
|
-
has_to |
|
13
|
-
only\\b[^.,]+\\b(is|are)_permitted |
|
14
|
-
it_is_necessary |
|
15
|
-
(needs|need)_to |
|
16
|
-
(is|are)_not_(allowed | permitted |
|
17
|
-
acceptable | permissible) |
|
18
|
-
(is|are)_not_to_be |
|
19
|
-
(need|needs)_not |
|
20
|
-
do_not )
|
21
|
-
\\b
|
22
|
-
REGEXP
|
23
|
-
REQUIREMENT_RE =
|
24
|
-
Regexp.new(REQUIREMENT_RE_STR.gsub(/\s/, "").gsub(/_/, "\\s"),
|
25
|
-
Regexp::IGNORECASE)
|
26
|
-
|
27
|
-
def requirement(text)
|
28
|
-
text.split(/\.\s+/).each do |t|
|
29
|
-
return t if REQUIREMENT_RE.match? t
|
30
|
-
end
|
31
|
-
nil
|
32
|
-
end
|
33
|
-
|
34
|
-
RECOMMENDATION_RE_STR = <<~REGEXP.freeze
|
35
|
-
\\b
|
36
|
-
should |
|
37
|
-
ought_(not_)?to |
|
38
|
-
it_is_(not_)?recommended_that
|
39
|
-
\\b
|
40
|
-
REGEXP
|
41
|
-
RECOMMENDATION_RE =
|
42
|
-
Regexp.new(RECOMMENDATION_RE_STR.gsub(/\s/, "").gsub(/_/, "\\s"),
|
43
|
-
Regexp::IGNORECASE)
|
44
|
-
|
45
|
-
def recommendation(text)
|
46
|
-
text.split(/\.\s+/).each do |t|
|
47
|
-
return t if RECOMMENDATION_RE.match? t
|
48
|
-
end
|
49
|
-
nil
|
50
|
-
end
|
51
|
-
|
52
|
-
PERMISSION_RE_STR = <<~REGEXP.freeze
|
53
|
-
\\b
|
54
|
-
may |
|
55
|
-
(is|are)_(permitted | allowed | permissible ) |
|
56
|
-
it_is_not_required_that |
|
57
|
-
no\\b[^.,]+\\b(is|are)_required
|
58
|
-
\\b
|
59
|
-
REGEXP
|
60
|
-
PERMISSION_RE =
|
61
|
-
Regexp.new(PERMISSION_RE_STR.gsub(/\s/, "").gsub(/_/, "\\s"),
|
62
|
-
Regexp::IGNORECASE)
|
63
|
-
|
64
|
-
def permission(text)
|
65
|
-
text.split(/\.\s+/).each do |t|
|
66
|
-
return t if PERMISSION_RE.match? t
|
67
|
-
end
|
68
|
-
nil
|
69
|
-
end
|
70
|
-
|
71
|
-
POSSIBILITY_RE_STR = <<~REGEXP.freeze
|
72
|
-
\\b
|
73
|
-
can | cannot | be_able_to |
|
74
|
-
there_is_a_possibility_of |
|
75
|
-
it_is_possible_to | be_unable_to |
|
76
|
-
there_is_no_possibility_of |
|
77
|
-
it_is_not_possible_to
|
78
|
-
\\b
|
79
|
-
REGEXP
|
80
|
-
POSSIBILITY_RE =
|
81
|
-
Regexp.new(POSSIBILITY_RE_STR.gsub(/\s/, "").gsub(/_/, "\\s"),
|
82
|
-
Regexp::IGNORECASE)
|
83
|
-
|
84
|
-
def posssibility(text)
|
85
|
-
text.split(/\.\s+/).each do |t|
|
86
|
-
return t if POSSIBILITY_RE.match? t
|
87
|
-
end
|
88
|
-
nil
|
89
|
-
end
|
90
|
-
|
91
|
-
def external_constraint(text)
|
92
|
-
text.split(/\.\s+/).each do |t|
|
93
|
-
return t if /\b(must)\b/xi.match? t
|
94
|
-
end
|
95
|
-
nil
|
96
|
-
end
|
97
|
-
|
98
|
-
def style_no_guidance(node, text, docpart)
|
99
|
-
r = requirement(text)
|
100
|
-
style_warning(node, "#{docpart} may contain requirement", r) if r
|
101
|
-
r = permission(text)
|
102
|
-
style_warning(node, "#{docpart} may contain permission", r) if r
|
103
|
-
r = recommendation(text)
|
104
|
-
style_warning(node, "#{docpart} may contain recommendation", r) if r
|
105
|
-
end
|
106
|
-
|
107
8
|
def foreword_style(node, text)
|
9
|
+
return if @novalid
|
108
10
|
style_no_guidance(node, text, "Foreword")
|
109
11
|
end
|
110
12
|
|
111
13
|
def scope_style(node, text)
|
14
|
+
return if @novalid
|
112
15
|
style_no_guidance(node, text, "Scope")
|
113
16
|
end
|
114
17
|
|
115
18
|
def introduction_style(node, text)
|
19
|
+
return if @novalid
|
116
20
|
r = requirement(text)
|
117
21
|
style_warning(node, "Introduction may contain requirement", r) if r
|
118
22
|
end
|
119
23
|
|
120
24
|
def termexample_style(node, text)
|
25
|
+
return if @novalid
|
121
26
|
style_no_guidance(node, text, "Term Example")
|
122
27
|
style(node, text)
|
123
28
|
end
|
124
29
|
|
125
30
|
def note_style(node, text)
|
31
|
+
return if @novalid
|
126
32
|
style_no_guidance(node, text, "Note")
|
127
33
|
style(node, text)
|
128
34
|
end
|
129
35
|
|
130
36
|
def footnote_style(node, text)
|
37
|
+
return if @novalid
|
131
38
|
style_no_guidance(node, text, "Footnote")
|
132
39
|
style(node, text)
|
133
40
|
end
|
134
41
|
|
135
42
|
def style_warning(node, msg, text)
|
43
|
+
return if @novalid
|
136
44
|
w = "ISO style: WARNING (#{Utils::current_location(node)}): #{msg}"
|
137
45
|
w += ": #{text}" if text
|
138
46
|
warn w
|
139
47
|
end
|
140
48
|
|
141
|
-
|
142
|
-
|
143
|
-
m = re.match(text) and style_warning(n, warning, m[:num])
|
49
|
+
def style_regex(re, warning, n, text)
|
50
|
+
(m = re.match(text)) && style_warning(n, warning, m[:num])
|
144
51
|
end
|
145
52
|
|
146
53
|
# style check with a regex on a token
|
147
54
|
# and a negative match on its preceding token
|
148
55
|
def style_two_regex_not_prev(n, text, re, re_prev, warning)
|
149
56
|
return if text.nil?
|
150
|
-
|
151
|
-
|
152
|
-
m = re.match
|
153
|
-
m_prev = re_prev.match
|
57
|
+
arr = text.split(/\W+/)
|
58
|
+
arr.each_index do |i|
|
59
|
+
m = re.match arr[i]
|
60
|
+
m_prev = i.zero? ? nil : re_prev.match(arr[i - 1])
|
154
61
|
if !m.nil? && m_prev.nil?
|
155
62
|
style_warning(n, warning, m[:num])
|
156
63
|
end
|
157
64
|
end
|
158
65
|
end
|
159
66
|
|
160
|
-
def style(n,
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
67
|
+
def style(n, t)
|
68
|
+
return if @novalid
|
69
|
+
style_number(n, t)
|
70
|
+
style_percent(n, t)
|
71
|
+
style_abbrev(n, t)
|
72
|
+
style_units(n, t)
|
73
|
+
end
|
74
|
+
|
75
|
+
def style_number(n, t)
|
76
|
+
style_two_regex_not_prev(n, t, /^(?<num>-?[0-9]{4,}[,0-9]*)$/,
|
77
|
+
%r{(\bISO|\bIEC|\bIEEE/)$},
|
165
78
|
"number not broken up in threes")
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
79
|
+
style_regex(/\b(?<num>[0-9]+\.[0-9]+)/i,
|
80
|
+
"possible decimal point", n, t)
|
81
|
+
style_regex(/\b(?<num>billion[s]?)\b/i,
|
82
|
+
"ambiguous number", n, t)
|
83
|
+
end
|
84
|
+
|
85
|
+
def style_percent(n, t)
|
86
|
+
style_regex(/\b(?<num>[0-9.,]+%)/,
|
87
|
+
"no space before percent sign", n, t)
|
88
|
+
style_regex(/\b(?<num>[0-9.,]+ \u00b1 [0-9,.]+ %)/,
|
89
|
+
"unbracketed tolerance before percent sign", n, t)
|
90
|
+
end
|
91
|
+
|
92
|
+
def style_abbrev(n, t)
|
93
|
+
style_regex(/(^|\s)(?!e\.g\.|i\.e\.)
|
94
|
+
(?<num>[a-z]{1,2}\.([a-z]{1,2}|\.))\b/ix,
|
95
|
+
"no dots in abbreviations", n, t)
|
96
|
+
style_regex(/\b(?<num>ppm)\b/i,
|
97
|
+
"language-specific abbreviation", n, t)
|
98
|
+
end
|
99
|
+
|
100
|
+
# leaving out as problematic: N J K C S T H h d B o E
|
101
|
+
SI_UNIT = "(m|cm|mm|km|μm|nm|g|kg|mgmol|cd|rad|sr|Hz|Hz|MHz|Pa|hPa|kJ|"\
|
102
|
+
"V|kV|W|MW|kW|F|μF|Ω|Wb|°C|lm|lx|Bq|Gy|Sv|kat|l|t|eV|u|Np|Bd|"\
|
103
|
+
"bit|kB|MB|Hart|nat|Sh|var)".freeze
|
104
|
+
|
105
|
+
def style_units(n, t)
|
106
|
+
style_regex(/\b(?<num>[0-9][0-9,]*\s+[\u00b0\u2032\u2033])/,
|
107
|
+
"space between number and degrees/minutes/seconds", n, t)
|
108
|
+
style_regex(/\b(?<num>[0-9][0-9,]*#{SI_UNIT})\b/,
|
109
|
+
"no space between number and SI unit", n, t)
|
110
|
+
style_non_std_units(n, t)
|
111
|
+
end
|
112
|
+
|
113
|
+
NONSTD_UNITS = {
|
114
|
+
"sec": "s", "mins": "min", "hrs": "h", "hr": "h", "cc": "cm^3",
|
115
|
+
"lit": "l", "amp": "A", "amps": "A", "rpm": "r/min"
|
116
|
+
}.freeze
|
117
|
+
|
118
|
+
def style_non_std_units(n, t)
|
119
|
+
NONSTD_UNITS.each do |k, v|
|
120
|
+
style_regex(/\b(?<num>[0-9][0-9,]*\s+#{k})\b/,
|
121
|
+
"non-standard unit (should be #{v})", n, t)
|
122
|
+
end
|
170
123
|
end
|
171
124
|
end
|
172
125
|
end
|
@@ -0,0 +1,193 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
RSpec.describe Asciidoctor::ISO do
|
4
|
+
it "has a version number" do
|
5
|
+
expect(Asciidoctor::ISO::VERSION).not_to be nil
|
6
|
+
end
|
7
|
+
|
8
|
+
it "generates output for the Rice document" do
|
9
|
+
system "cd spec/examples; rm -f rice.doc; rm -f rice.html; asciidoctor --trace -b iso -r 'asciidoctor-iso' rice.adoc; cd ../.."
|
10
|
+
expect(File.exist?("spec/examples/rice.doc")).to be true
|
11
|
+
expect(File.exist?("spec/examples/rice.html")).to be true
|
12
|
+
end
|
13
|
+
|
14
|
+
it "processes a blank document" do
|
15
|
+
expect(Asciidoctor.convert(<<~"INPUT", backend: :iso, header_footer: true)).to be_equivalent_to <<~"OUTPUT"
|
16
|
+
#{ASCIIDOC_BLANK_HDR}
|
17
|
+
INPUT
|
18
|
+
#{BLANK_HDR}
|
19
|
+
<sections/>
|
20
|
+
</iso-standard>
|
21
|
+
OUTPUT
|
22
|
+
end
|
23
|
+
|
24
|
+
it "converts a blank document" do
|
25
|
+
system "rm -f test.doc"
|
26
|
+
expect(Asciidoctor.convert(<<~"INPUT", backend: :iso, header_footer: true)).to be_equivalent_to <<~"OUTPUT"
|
27
|
+
= Document title
|
28
|
+
Author
|
29
|
+
:docfile: test.adoc
|
30
|
+
:novalid:
|
31
|
+
INPUT
|
32
|
+
#{BLANK_HDR}
|
33
|
+
<sections/>
|
34
|
+
</iso-standard>
|
35
|
+
OUTPUT
|
36
|
+
expect(File.exist?("test.doc")).to be true
|
37
|
+
end
|
38
|
+
|
39
|
+
|
40
|
+
it "processes default metadata" do
|
41
|
+
expect(Asciidoctor.convert(<<~"INPUT", backend: :iso, header_footer: true)).to be_equivalent_to <<~'OUTPUT'
|
42
|
+
= Document title
|
43
|
+
Author
|
44
|
+
:docfile: test.adoc
|
45
|
+
:nodoc:
|
46
|
+
:novalid:
|
47
|
+
:docnumber: 1000
|
48
|
+
:partnumber: 1
|
49
|
+
:edition: 2
|
50
|
+
:revdate: 2000-01-01
|
51
|
+
:draft: 3.4
|
52
|
+
:technical-committee: TC
|
53
|
+
:technical-committee-number: 1
|
54
|
+
:technical-committee-type: A
|
55
|
+
:subcommittee: SC
|
56
|
+
:subcommittee-number: 2
|
57
|
+
:subcommittee-type: B
|
58
|
+
:workgroup: WG
|
59
|
+
:workgroup-number: 3
|
60
|
+
:workgroup-type: C
|
61
|
+
:secretariat: SECRETARIAT
|
62
|
+
:copyright-year: 2001
|
63
|
+
:docstage: 10
|
64
|
+
:docsubstage: 20
|
65
|
+
:language: en
|
66
|
+
:title-intro-en: Introduction
|
67
|
+
:title-main-en: Main Title
|
68
|
+
:title-part-en: Title Part
|
69
|
+
:title-intro-fr: Introduction Française
|
70
|
+
:title-main-fr: Titre Principal
|
71
|
+
:title-part-fr: Part du Titre
|
72
|
+
INPUT
|
73
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
74
|
+
<iso-standard xmlns="http://riboseinc.com/isoxml">
|
75
|
+
<bibdata type="article">
|
76
|
+
<title>
|
77
|
+
<title-intro language="en" format="text/plain">Introduction</title-intro>
|
78
|
+
<title-main language="en" format="text/plain">Main Title</title-main>
|
79
|
+
<title-part language="en" format="text/plain">Title Part</title-part>
|
80
|
+
</title>
|
81
|
+
<title>
|
82
|
+
<title-intro language="fr" format="text/plain">Introduction Française</title-intro>
|
83
|
+
<title-main language="fr" format="text/plain">Titre Principal</title-main>
|
84
|
+
<title-part language="fr" format="text/plain">Part du Titre</title-part>
|
85
|
+
</title>
|
86
|
+
<docidentifier>
|
87
|
+
<project-number part="1">1000</project-number>
|
88
|
+
</docidentifier>
|
89
|
+
<contributor>
|
90
|
+
<role type="author"/>
|
91
|
+
<organization>
|
92
|
+
<name>ISO</name>
|
93
|
+
</organization>
|
94
|
+
</contributor>
|
95
|
+
<contributor>
|
96
|
+
<role type="publisher"/>
|
97
|
+
<organization>
|
98
|
+
<name>ISO</name>
|
99
|
+
</organization>
|
100
|
+
</contributor>
|
101
|
+
<language>en</language>
|
102
|
+
<script>Latn</script>
|
103
|
+
<status>
|
104
|
+
<stage>10</stage>
|
105
|
+
<substage>20</substage>
|
106
|
+
</status>
|
107
|
+
<copyright>
|
108
|
+
<from>2001</from>
|
109
|
+
<owner>
|
110
|
+
<organization>
|
111
|
+
<name>ISO</name>
|
112
|
+
</organization>
|
113
|
+
</owner>
|
114
|
+
</copyright>
|
115
|
+
<editorialgroup>
|
116
|
+
<technical-committee number="1" type="A">TC</technical-committee>
|
117
|
+
<subcommittee number="2" type="B">SC</subcommittee>
|
118
|
+
<workgroup number="3" type="C">WG</workgroup>
|
119
|
+
<secretariat>SECRETARIAT</secretariat>
|
120
|
+
</editorialgroup>
|
121
|
+
</bibdata><version>
|
122
|
+
<edition>2</edition>
|
123
|
+
<revision-date>2000-01-01</revision-date>
|
124
|
+
<draft>3.4</draft>
|
125
|
+
</version>
|
126
|
+
<sections/>
|
127
|
+
</iso-standard>
|
128
|
+
OUTPUT
|
129
|
+
end
|
130
|
+
|
131
|
+
|
132
|
+
it "processes complex metadata" do
|
133
|
+
expect(Asciidoctor.convert(<<~"INPUT", backend: :iso, header_footer: true)).to be_equivalent_to <<~'OUTPUT'
|
134
|
+
= Document title
|
135
|
+
Author
|
136
|
+
:docfile: test.adoc
|
137
|
+
:nodoc:
|
138
|
+
:novalid:
|
139
|
+
:docnumber: 1000
|
140
|
+
:partnumber: 1-1
|
141
|
+
:tc-docnumber: 2000
|
142
|
+
:language: el
|
143
|
+
:script: Grek
|
144
|
+
INPUT
|
145
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
146
|
+
<iso-standard xmlns="http://riboseinc.com/isoxml">
|
147
|
+
<bibdata type="article">
|
148
|
+
<title>
|
149
|
+
</title>
|
150
|
+
<title>
|
151
|
+
</title>
|
152
|
+
<docidentifier>
|
153
|
+
<project-number part="1" subpart="1">1000</project-number>
|
154
|
+
<tc-document-number>2000</tc-document-number>
|
155
|
+
</docidentifier>
|
156
|
+
<contributor>
|
157
|
+
<role type="author"/>
|
158
|
+
<organization>
|
159
|
+
<name>ISO</name>
|
160
|
+
</organization>
|
161
|
+
</contributor>
|
162
|
+
<contributor>
|
163
|
+
<role type="publisher"/>
|
164
|
+
<organization>
|
165
|
+
<name>ISO</name>
|
166
|
+
</organization>
|
167
|
+
</contributor>
|
168
|
+
<language>el</language>
|
169
|
+
<script>Grek</script>
|
170
|
+
<status>
|
171
|
+
<stage>60</stage>
|
172
|
+
<substage>60</substage>
|
173
|
+
</status>
|
174
|
+
<copyright>
|
175
|
+
<from>2018</from>
|
176
|
+
<owner>
|
177
|
+
<organization>
|
178
|
+
<name>ISO</name>
|
179
|
+
</organization>
|
180
|
+
</owner>
|
181
|
+
</copyright>
|
182
|
+
<editorialgroup>
|
183
|
+
<technical-committee/>
|
184
|
+
<subcommittee/>
|
185
|
+
<workgroup/>
|
186
|
+
</editorialgroup>
|
187
|
+
</bibdata>
|
188
|
+
<sections/>
|
189
|
+
</iso-standard>
|
190
|
+
OUTPUT
|
191
|
+
end
|
192
|
+
|
193
|
+
end
|
@@ -0,0 +1,426 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
RSpec.describe Asciidoctor::ISO do
|
4
|
+
it "processes open blocks" do
|
5
|
+
expect(strip_guid(Asciidoctor.convert(<<~"INPUT", backend: :iso, header_footer: true))).to be_equivalent_to <<~"OUTPUT"
|
6
|
+
#{ASCIIDOC_BLANK_HDR}
|
7
|
+
--
|
8
|
+
x
|
9
|
+
|
10
|
+
y
|
11
|
+
|
12
|
+
z
|
13
|
+
--
|
14
|
+
INPUT
|
15
|
+
#{BLANK_HDR}
|
16
|
+
<sections><p id="_">x</p>
|
17
|
+
<p id="_">y</p>
|
18
|
+
<p id="_">z</p></sections>
|
19
|
+
</iso-standard>
|
20
|
+
OUTPUT
|
21
|
+
end
|
22
|
+
|
23
|
+
it "processes stem blocks" do
|
24
|
+
expect(strip_guid(Asciidoctor.convert(<<~"INPUT", backend: :iso, header_footer: true))).to be_equivalent_to <<~"OUTPUT"
|
25
|
+
#{ASCIIDOC_BLANK_HDR}
|
26
|
+
[stem]
|
27
|
+
++++
|
28
|
+
r = 1 %
|
29
|
+
r = 1 %
|
30
|
+
++++
|
31
|
+
INPUT
|
32
|
+
#{BLANK_HDR}
|
33
|
+
<sections>
|
34
|
+
<formula id="_">
|
35
|
+
<stem type="AsciiMath">r = 1 %
|
36
|
+
r = 1 %</stem>
|
37
|
+
</formula>
|
38
|
+
</sections>
|
39
|
+
</iso-standard>
|
40
|
+
OUTPUT
|
41
|
+
end
|
42
|
+
|
43
|
+
it "ignores review blocks unless document is in draft mode" do
|
44
|
+
expect(strip_guid(Asciidoctor.convert(<<~"INPUT", backend: :iso, header_footer: true))).to be_equivalent_to <<~"OUTPUT"
|
45
|
+
#{ASCIIDOC_BLANK_HDR}
|
46
|
+
[[foreword]]
|
47
|
+
.Foreword
|
48
|
+
Foreword
|
49
|
+
|
50
|
+
[reviewer=ISO,date=20170101,from=foreword,to=foreword]
|
51
|
+
****
|
52
|
+
A Foreword shall appear in each document. The generic text is shown here. It does not contain requirements, recommendations or permissions.
|
53
|
+
|
54
|
+
For further information on the Foreword, see *ISO/IEC Directives, Part 2, 2016, Clause 12.*
|
55
|
+
****
|
56
|
+
INPUT
|
57
|
+
#{BLANK_HDR}
|
58
|
+
<sections><p id="foreword">Foreword</p>
|
59
|
+
</sections>
|
60
|
+
</iso-standard>
|
61
|
+
OUTPUT
|
62
|
+
end
|
63
|
+
|
64
|
+
it "processes review blocks if document is in draft mode" do
|
65
|
+
expect(strip_guid(Asciidoctor.convert(<<~"INPUT", backend: :iso, header_footer: true))).to be_equivalent_to <<~"OUTPUT"
|
66
|
+
= Document title
|
67
|
+
Author
|
68
|
+
:docfile: test.adoc
|
69
|
+
:nodoc:
|
70
|
+
:novalid:
|
71
|
+
:draft: 1.2
|
72
|
+
|
73
|
+
[[foreword]]
|
74
|
+
.Foreword
|
75
|
+
Foreword
|
76
|
+
|
77
|
+
[reviewer=ISO,date=20170101,from=foreword,to=foreword]
|
78
|
+
****
|
79
|
+
A Foreword shall appear in each document. The generic text is shown here. It does not contain requirements, recommendations or permissions.
|
80
|
+
|
81
|
+
For further information on the Foreword, see *ISO/IEC Directives, Part 2, 2016, Clause 12.*
|
82
|
+
****
|
83
|
+
INPUT
|
84
|
+
#{BLANK_HDR}
|
85
|
+
<version>
|
86
|
+
<draft>1.2</draft>
|
87
|
+
</version>
|
88
|
+
<sections><p id="foreword">Foreword</p>
|
89
|
+
<review reviewer="ISO" id="_" date="20170101T0000" from="foreword" to="foreword"><p id="_">A Foreword shall appear in each document. The generic text is shown here. It does not contain requirements, recommendations or permissions.</p>
|
90
|
+
<p id="_">For further information on the Foreword, see <strong>ISO/IEC Directives, Part 2, 2016, Clause 12.</strong></p></review></sections>
|
91
|
+
</iso-standard>
|
92
|
+
|
93
|
+
OUTPUT
|
94
|
+
end
|
95
|
+
|
96
|
+
it "processes term notes" do
|
97
|
+
expect(strip_guid(Asciidoctor.convert(<<~"INPUT", backend: :iso, header_footer: true))).to be_equivalent_to <<~"OUTPUT"
|
98
|
+
#{ASCIIDOC_BLANK_HDR}
|
99
|
+
== Terms and Definitions
|
100
|
+
|
101
|
+
=== Term1
|
102
|
+
|
103
|
+
NOTE: This is a note
|
104
|
+
INPUT
|
105
|
+
#{BLANK_HDR}
|
106
|
+
<sections>
|
107
|
+
<terms id="_" obligation="normative">
|
108
|
+
<title>Terms and Definitions</title>
|
109
|
+
<term id="_">
|
110
|
+
<preferred>Term1</preferred>
|
111
|
+
<termnote id="_">
|
112
|
+
<p id="_">This is a note</p>
|
113
|
+
</termnote>
|
114
|
+
</term>
|
115
|
+
</terms>
|
116
|
+
</sections>
|
117
|
+
</iso-standard>
|
118
|
+
OUTPUT
|
119
|
+
end
|
120
|
+
|
121
|
+
it "processes notes" do
|
122
|
+
expect(strip_guid(Asciidoctor.convert(<<~"INPUT", backend: :iso, header_footer: true))).to be_equivalent_to <<~"OUTPUT"
|
123
|
+
#{ASCIIDOC_BLANK_HDR}
|
124
|
+
NOTE: This is a note
|
125
|
+
INPUT
|
126
|
+
#{BLANK_HDR}
|
127
|
+
<sections>
|
128
|
+
<note id="_">
|
129
|
+
<p id="_">This is a note</p>
|
130
|
+
</note>
|
131
|
+
</sections>
|
132
|
+
</iso-standard>
|
133
|
+
|
134
|
+
OUTPUT
|
135
|
+
end
|
136
|
+
|
137
|
+
it "processes simple admonitions with Asciidoc names" do
|
138
|
+
expect(strip_guid(Asciidoctor.convert(<<~"INPUT", backend: :iso, header_footer: true))).to be_equivalent_to <<~"OUTPUT"
|
139
|
+
#{ASCIIDOC_BLANK_HDR}
|
140
|
+
CAUTION: Only use paddy or parboiled rice for the determination of husked rice yield.
|
141
|
+
INPUT
|
142
|
+
#{BLANK_HDR}
|
143
|
+
<sections>
|
144
|
+
<admonition id="_" type="caution">
|
145
|
+
<p id="_">Only use paddy or parboiled rice for the determination of husked rice yield.</p>
|
146
|
+
</admonition>
|
147
|
+
</sections>
|
148
|
+
</iso-standard>
|
149
|
+
|
150
|
+
OUTPUT
|
151
|
+
end
|
152
|
+
|
153
|
+
|
154
|
+
it "processes complex admonitions with non-Asciidoc names" do
|
155
|
+
expect(strip_guid(Asciidoctor.convert(<<~"INPUT", backend: :iso, header_footer: true))).to be_equivalent_to <<~"OUTPUT"
|
156
|
+
#{ASCIIDOC_BLANK_HDR}
|
157
|
+
[CAUTION,type=Safety Precautions]
|
158
|
+
.Safety Precautions
|
159
|
+
====
|
160
|
+
While werewolves are hardy community members, keep in mind the following dietary concerns:
|
161
|
+
|
162
|
+
. They are allergic to cinnamon.
|
163
|
+
. More than two glasses of orange juice in 24 hours makes them howl in harmony with alarms and sirens.
|
164
|
+
. Celery makes them sad.
|
165
|
+
====
|
166
|
+
INPUT
|
167
|
+
#{BLANK_HDR}
|
168
|
+
<sections>
|
169
|
+
<admonition id="_" type="safety precautions"><p id="_">While werewolves are hardy community members, keep in mind the following dietary concerns:</p>
|
170
|
+
<ol id="_" type="arabic">
|
171
|
+
<li>
|
172
|
+
<p id="_">They are allergic to cinnamon.</p>
|
173
|
+
</li>
|
174
|
+
<li>
|
175
|
+
<p id="_">More than two glasses of orange juice in 24 hours makes them howl in harmony with alarms and sirens.</p>
|
176
|
+
</li>
|
177
|
+
<li>
|
178
|
+
<p id="_">Celery makes them sad.</p>
|
179
|
+
</li>
|
180
|
+
</ol></admonition>
|
181
|
+
</sections>
|
182
|
+
</iso-standard>
|
183
|
+
|
184
|
+
OUTPUT
|
185
|
+
end
|
186
|
+
|
187
|
+
it "processes term examples" do
|
188
|
+
expect(strip_guid(Asciidoctor.convert(<<~"INPUT", backend: :iso, header_footer: true))).to be_equivalent_to <<~"OUTPUT"
|
189
|
+
#{ASCIIDOC_BLANK_HDR}
|
190
|
+
== Terms and Definitions
|
191
|
+
|
192
|
+
=== Term1
|
193
|
+
|
194
|
+
[example]
|
195
|
+
This is an example
|
196
|
+
INPUT
|
197
|
+
#{BLANK_HDR}
|
198
|
+
<sections>
|
199
|
+
<terms id="_" obligation="normative">
|
200
|
+
<title>Terms and Definitions</title>
|
201
|
+
<term id="_">
|
202
|
+
<preferred>Term1</preferred>
|
203
|
+
<termexample id="_">
|
204
|
+
<p id="_">This is an example</p>
|
205
|
+
</termexample>
|
206
|
+
</term>
|
207
|
+
</terms>
|
208
|
+
</sections>
|
209
|
+
</iso-standard>
|
210
|
+
|
211
|
+
OUTPUT
|
212
|
+
end
|
213
|
+
|
214
|
+
it "processes examples" do
|
215
|
+
expect(strip_guid(Asciidoctor.convert(<<~"INPUT", backend: :iso, header_footer: true))).to be_equivalent_to <<~"OUTPUT"
|
216
|
+
#{ASCIIDOC_BLANK_HDR}
|
217
|
+
[example]
|
218
|
+
====
|
219
|
+
This is an example
|
220
|
+
|
221
|
+
Amen
|
222
|
+
====
|
223
|
+
INPUT
|
224
|
+
#{BLANK_HDR}
|
225
|
+
<sections>
|
226
|
+
<example id="_"><p id="_">This is an example</p>
|
227
|
+
<p id="_">Amen</p></example>
|
228
|
+
</sections>
|
229
|
+
</iso-standard>
|
230
|
+
OUTPUT
|
231
|
+
end
|
232
|
+
|
233
|
+
it "processes preambles" do
|
234
|
+
expect(strip_guid(Asciidoctor.convert(<<~"INPUT", backend: :iso, header_footer: true))).to be_equivalent_to <<~"OUTPUT"
|
235
|
+
#{ASCIIDOC_BLANK_HDR}
|
236
|
+
This is a preamble
|
237
|
+
|
238
|
+
== Section 1
|
239
|
+
INPUT
|
240
|
+
#{BLANK_HDR}
|
241
|
+
<foreword obligation="informative">
|
242
|
+
<title>Foreword</title>
|
243
|
+
<p id="_">This is a preamble</p>
|
244
|
+
</foreword><sections>
|
245
|
+
<clause id="_" inline-header="false" obligation="normative">
|
246
|
+
<title>Section 1</title>
|
247
|
+
</clause></sections>
|
248
|
+
</iso-standard>
|
249
|
+
OUTPUT
|
250
|
+
end
|
251
|
+
|
252
|
+
it "processes images" do
|
253
|
+
expect(strip_guid(Asciidoctor.convert(<<~"INPUT", backend: :iso, header_footer: true))).to be_equivalent_to <<~"OUTPUT"
|
254
|
+
#{ASCIIDOC_BLANK_HDR}
|
255
|
+
.Split-it-right sample divider
|
256
|
+
image::spec/examples/rice_images/rice_image1.png[]
|
257
|
+
|
258
|
+
INPUT
|
259
|
+
#{BLANK_HDR}
|
260
|
+
<sections>
|
261
|
+
<figure id="_">
|
262
|
+
<name>Split-it-right sample divider</name>
|
263
|
+
<image src="spec/examples/rice_images/rice_image1.png" id="_" imagetype="PNG"/>
|
264
|
+
</figure>
|
265
|
+
</sections>
|
266
|
+
</iso-standard>
|
267
|
+
OUTPUT
|
268
|
+
end
|
269
|
+
|
270
|
+
it "accepts width and height attributes on images" do
|
271
|
+
expect(strip_guid(Asciidoctor.convert(<<~"INPUT", backend: :iso, header_footer: true))).to be_equivalent_to <<~"OUTPUT"
|
272
|
+
#{ASCIIDOC_BLANK_HDR}
|
273
|
+
[height=4,width=3]
|
274
|
+
image::spec/examples/rice_images/rice_image1.png[]
|
275
|
+
|
276
|
+
INPUT
|
277
|
+
#{BLANK_HDR}
|
278
|
+
<sections>
|
279
|
+
<figure id="_">
|
280
|
+
<image src="spec/examples/rice_images/rice_image1.png" id="_" imagetype="PNG" height="4" width="3"/>
|
281
|
+
</figure>
|
282
|
+
</sections>
|
283
|
+
</iso-standard>
|
284
|
+
OUTPUT
|
285
|
+
end
|
286
|
+
|
287
|
+
it "accepts alignment attribute on paragraphs" do
|
288
|
+
expect(strip_guid(Asciidoctor.convert(<<~"INPUT", backend: :iso, header_footer: true))).to be_equivalent_to <<~"OUTPUT"
|
289
|
+
#{ASCIIDOC_BLANK_HDR}
|
290
|
+
[align=right]
|
291
|
+
This para is right-aligned.
|
292
|
+
INPUT
|
293
|
+
#{BLANK_HDR}
|
294
|
+
<sections>
|
295
|
+
<p align="right" id="_">This para is right-aligned.</p>
|
296
|
+
</sections>
|
297
|
+
</iso-standard>
|
298
|
+
OUTPUT
|
299
|
+
end
|
300
|
+
|
301
|
+
it "processes blockquotes" do
|
302
|
+
expect(strip_guid(Asciidoctor.convert(<<~"INPUT", backend: :iso, header_footer: true))).to be_equivalent_to <<~"OUTPUT"
|
303
|
+
#{ASCIIDOC_BLANK_HDR}
|
304
|
+
[quote, ISO, "ISO7301,section 1"]
|
305
|
+
____
|
306
|
+
Block quotation
|
307
|
+
____
|
308
|
+
INPUT
|
309
|
+
#{BLANK_HDR}
|
310
|
+
<sections>
|
311
|
+
<quote id="_">
|
312
|
+
<source type="inline" bibitemid="ISO7301" citeas=""><locality type="section"><referenceFrom>1</referenceFrom></locality></source>
|
313
|
+
<author>ISO</author>
|
314
|
+
<p id="_">Block quotation</p>
|
315
|
+
</quote>
|
316
|
+
</sections>
|
317
|
+
</iso-standard>
|
318
|
+
OUTPUT
|
319
|
+
end
|
320
|
+
|
321
|
+
it "processes source code" do
|
322
|
+
expect(strip_guid(Asciidoctor.convert(<<~"INPUT", backend: :iso, header_footer: true))).to be_equivalent_to <<~"OUTPUT"
|
323
|
+
#{ASCIIDOC_BLANK_HDR}
|
324
|
+
[source,ruby]
|
325
|
+
--
|
326
|
+
puts "Hello, world."
|
327
|
+
%w{a b c}.each do |x|
|
328
|
+
puts x
|
329
|
+
end
|
330
|
+
--
|
331
|
+
INPUT
|
332
|
+
#{BLANK_HDR}
|
333
|
+
<sections>
|
334
|
+
<sourcecode id="_">puts "Hello, world."
|
335
|
+
%w{a b c}.each do |x|
|
336
|
+
puts x
|
337
|
+
end</sourcecode>
|
338
|
+
</sections>
|
339
|
+
</iso-standard>
|
340
|
+
OUTPUT
|
341
|
+
end
|
342
|
+
|
343
|
+
it "processes callouts" do
|
344
|
+
expect(strip_guid(Asciidoctor.convert(<<~"INPUT", backend: :iso, header_footer: true))).to be_equivalent_to <<~"OUTPUT"
|
345
|
+
#{ASCIIDOC_BLANK_HDR}
|
346
|
+
[source,ruby]
|
347
|
+
--
|
348
|
+
puts "Hello, world." <1>
|
349
|
+
%w{a b c}.each do |x|
|
350
|
+
puts x <2>
|
351
|
+
end
|
352
|
+
--
|
353
|
+
<1> This is one callout
|
354
|
+
<2> This is another callout
|
355
|
+
INPUT
|
356
|
+
#{BLANK_HDR}
|
357
|
+
<sections><sourcecode id="_">puts "Hello, world." <callout target="_">1</callout>
|
358
|
+
%w{a b c}.each do |x|
|
359
|
+
puts x <callout target="_">2</callout>
|
360
|
+
end<annotation id="_">
|
361
|
+
<p id="_">This is one callout</p>
|
362
|
+
</annotation><annotation id="_">
|
363
|
+
<p id="_">This is another callout</p>
|
364
|
+
</annotation></sourcecode>
|
365
|
+
</sections>
|
366
|
+
</iso-standard>
|
367
|
+
OUTPUT
|
368
|
+
end
|
369
|
+
|
370
|
+
it "processes unmodified term sources" do
|
371
|
+
expect(strip_guid(Asciidoctor.convert(<<~"INPUT", backend: :iso, header_footer: true))).to be_equivalent_to <<~"OUTPUT"
|
372
|
+
#{ASCIIDOC_BLANK_HDR}
|
373
|
+
== Terms and Definitions
|
374
|
+
|
375
|
+
=== Term1
|
376
|
+
|
377
|
+
[.source]
|
378
|
+
<<ISO2191,section 1>>
|
379
|
+
INPUT
|
380
|
+
#{BLANK_HDR}
|
381
|
+
<sections>
|
382
|
+
<terms id="_" obligation="normative">
|
383
|
+
<title>Terms and Definitions</title>
|
384
|
+
<term id="_">
|
385
|
+
<preferred>Term1</preferred>
|
386
|
+
<termsource status="identical">
|
387
|
+
<origin bibitemid="ISO2191" type="inline" citeas=""><locality type="section"><referenceFrom>1</referenceFrom></locality></origin>
|
388
|
+
</termsource>
|
389
|
+
</term>
|
390
|
+
</terms>
|
391
|
+
</sections>
|
392
|
+
</iso-standard>
|
393
|
+
OUTPUT
|
394
|
+
end
|
395
|
+
|
396
|
+
it "processes modified term sources" do
|
397
|
+
expect(strip_guid(Asciidoctor.convert(<<~"INPUT", backend: :iso, header_footer: true))).to be_equivalent_to <<~"OUTPUT"
|
398
|
+
#{ASCIIDOC_BLANK_HDR}
|
399
|
+
== Terms and Definitions
|
400
|
+
|
401
|
+
=== Term1
|
402
|
+
|
403
|
+
[.source]
|
404
|
+
<<ISO2191,section 1>>, with adjustments
|
405
|
+
INPUT
|
406
|
+
#{BLANK_HDR}
|
407
|
+
<sections>
|
408
|
+
<terms id="_" obligation="normative">
|
409
|
+
<title>Terms and Definitions</title>
|
410
|
+
<term id="_">
|
411
|
+
<preferred>Term1</preferred>
|
412
|
+
<termsource status="modified">
|
413
|
+
<origin bibitemid="ISO2191" type="inline" citeas=""><locality type="section"><referenceFrom>1</referenceFrom></locality></origin>
|
414
|
+
<modification>
|
415
|
+
<p id="_">with adjustments</p>
|
416
|
+
</modification>
|
417
|
+
</termsource>
|
418
|
+
</term>
|
419
|
+
</terms>
|
420
|
+
</sections>
|
421
|
+
</iso-standard>
|
422
|
+
OUTPUT
|
423
|
+
end
|
424
|
+
|
425
|
+
|
426
|
+
end
|