d-mark 1.0.0a3 → 1.0.0a4
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/Gemfile.lock +44 -39
- data/NEWS.md +10 -0
- data/Rakefile +3 -3
- data/lib/d-mark/parser.rb +29 -39
- data/lib/d-mark/version.rb +1 -1
- data/spec/d-mark/parser_spec.rb +67 -1
- metadata +3 -5
- data/samples/test.rb +0 -65
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: bd186ea6e5e8fb14c4c424b8a58793026a0a650b
|
4
|
+
data.tar.gz: cd847b7b9029f0098b3e10b3a7ba74f3b97aaad3
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 19198cab18de6924374fddeb55f0bec8e4db2e78b62caa7417ec9d6dec5189d9b5c275ab1bc58712fa39db00ef66993aa2e1b5c85cd10222492746655dff5d1f
|
7
|
+
data.tar.gz: 5256a0b8ac59bdf95891d4135a5ee2f6b9002e5bd5975aa1c9561f7def7a9453e90e00c007cbb4f14c45be2bf2f08e229ec0ed36602232e67ad67448fcbae631
|
data/Gemfile.lock
CHANGED
@@ -6,19 +6,19 @@ PATH
|
|
6
6
|
GEM
|
7
7
|
remote: https://rubygems.org/
|
8
8
|
specs:
|
9
|
-
ast (2.
|
10
|
-
codecov (0.1.
|
9
|
+
ast (2.3.0)
|
10
|
+
codecov (0.1.10)
|
11
11
|
json
|
12
12
|
simplecov
|
13
13
|
url
|
14
14
|
coderay (1.1.1)
|
15
|
-
diff-lcs (1.
|
15
|
+
diff-lcs (1.3)
|
16
16
|
docile (1.1.5)
|
17
|
-
ffi (1.9.
|
17
|
+
ffi (1.9.18)
|
18
18
|
formatador (0.2.5)
|
19
|
-
guard (2.
|
19
|
+
guard (2.14.1)
|
20
20
|
formatador (>= 0.2.4)
|
21
|
-
listen (>= 2.7,
|
21
|
+
listen (>= 2.7, < 4.0)
|
22
22
|
lumberjack (~> 1.0)
|
23
23
|
nenv (~> 0.1)
|
24
24
|
notiffany (~> 0.0)
|
@@ -28,57 +28,62 @@ GEM
|
|
28
28
|
guard-rake (1.0.0)
|
29
29
|
guard
|
30
30
|
rake
|
31
|
-
json (1.
|
32
|
-
listen (3.
|
33
|
-
rb-fsevent (>= 0.9.
|
34
|
-
rb-inotify (>= 0.9.7)
|
35
|
-
|
31
|
+
json (2.1.0)
|
32
|
+
listen (3.1.5)
|
33
|
+
rb-fsevent (~> 0.9, >= 0.9.4)
|
34
|
+
rb-inotify (~> 0.9, >= 0.9.7)
|
35
|
+
ruby_dep (~> 1.2)
|
36
|
+
lumberjack (1.0.12)
|
36
37
|
method_source (0.8.2)
|
37
38
|
nenv (0.3.0)
|
38
|
-
notiffany (0.
|
39
|
+
notiffany (0.1.1)
|
39
40
|
nenv (~> 0.1)
|
40
41
|
shellany (~> 0.0)
|
41
|
-
|
42
|
+
parallel (1.12.0)
|
43
|
+
parser (2.4.0.0)
|
42
44
|
ast (~> 2.2)
|
43
45
|
powerpack (0.1.1)
|
44
|
-
pry (0.10.
|
46
|
+
pry (0.10.4)
|
45
47
|
coderay (~> 1.1.0)
|
46
48
|
method_source (~> 0.8.1)
|
47
49
|
slop (~> 3.4)
|
48
|
-
rainbow (2.
|
49
|
-
|
50
|
-
|
51
|
-
rb-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
rspec-
|
56
|
-
rspec-
|
57
|
-
|
58
|
-
|
59
|
-
|
50
|
+
rainbow (2.2.2)
|
51
|
+
rake
|
52
|
+
rake (12.0.0)
|
53
|
+
rb-fsevent (0.10.2)
|
54
|
+
rb-inotify (0.9.10)
|
55
|
+
ffi (>= 0.5.0, < 2)
|
56
|
+
rspec (3.6.0)
|
57
|
+
rspec-core (~> 3.6.0)
|
58
|
+
rspec-expectations (~> 3.6.0)
|
59
|
+
rspec-mocks (~> 3.6.0)
|
60
|
+
rspec-core (3.6.0)
|
61
|
+
rspec-support (~> 3.6.0)
|
62
|
+
rspec-expectations (3.6.0)
|
60
63
|
diff-lcs (>= 1.2.0, < 2.0)
|
61
|
-
rspec-support (~> 3.
|
62
|
-
rspec-mocks (3.
|
64
|
+
rspec-support (~> 3.6.0)
|
65
|
+
rspec-mocks (3.6.0)
|
63
66
|
diff-lcs (>= 1.2.0, < 2.0)
|
64
|
-
rspec-support (~> 3.
|
65
|
-
rspec-support (3.
|
66
|
-
rubocop (0.
|
67
|
-
|
67
|
+
rspec-support (~> 3.6.0)
|
68
|
+
rspec-support (3.6.0)
|
69
|
+
rubocop (0.49.1)
|
70
|
+
parallel (~> 1.10)
|
71
|
+
parser (>= 2.3.3.1, < 3.0)
|
68
72
|
powerpack (~> 0.1)
|
69
73
|
rainbow (>= 1.99.1, < 3.0)
|
70
74
|
ruby-progressbar (~> 1.7)
|
71
75
|
unicode-display_width (~> 1.0, >= 1.0.1)
|
72
|
-
ruby-progressbar (1.
|
76
|
+
ruby-progressbar (1.8.1)
|
77
|
+
ruby_dep (1.5.0)
|
73
78
|
shellany (0.0.1)
|
74
|
-
simplecov (0.
|
79
|
+
simplecov (0.15.0)
|
75
80
|
docile (~> 1.1.0)
|
76
|
-
json (
|
81
|
+
json (>= 1.8, < 3)
|
77
82
|
simplecov-html (~> 0.10.0)
|
78
|
-
simplecov-html (0.10.
|
83
|
+
simplecov-html (0.10.2)
|
79
84
|
slop (3.6.0)
|
80
|
-
thor (0.
|
81
|
-
unicode-display_width (1.0
|
85
|
+
thor (0.20.0)
|
86
|
+
unicode-display_width (1.3.0)
|
82
87
|
url (0.3.2)
|
83
88
|
|
84
89
|
PLATFORMS
|
@@ -94,4 +99,4 @@ DEPENDENCIES
|
|
94
99
|
rubocop
|
95
100
|
|
96
101
|
BUNDLED WITH
|
97
|
-
1.
|
102
|
+
1.15.3
|
data/NEWS.md
CHANGED
data/Rakefile
CHANGED
@@ -7,8 +7,8 @@ RSpec::Core::RakeTask.new(:spec) do |t|
|
|
7
7
|
end
|
8
8
|
|
9
9
|
RuboCop::RakeTask.new(:rubocop) do |task|
|
10
|
-
task.options = %w
|
11
|
-
task.patterns = ['lib/**/*.rb', 'spec/**/*.rb']
|
10
|
+
task.options = %w[--display-cop-names --format simple]
|
11
|
+
task.patterns = ['lib/**/*.rb', 'spec/**/*.rb', 'Gemfile*', '*.gemspec', 'Rakefile']
|
12
12
|
end
|
13
13
|
|
14
|
-
task default: [
|
14
|
+
task default: %i[spec rubocop]
|
data/lib/d-mark/parser.rb
CHANGED
@@ -16,8 +16,8 @@ module DMark
|
|
16
16
|
attr_reader :pos
|
17
17
|
|
18
18
|
def initialize(input)
|
19
|
-
@
|
20
|
-
@
|
19
|
+
@input_chars = input.chars
|
20
|
+
@length = @input_chars.size
|
21
21
|
|
22
22
|
@pos = 0
|
23
23
|
@col_nr = 0
|
@@ -48,20 +48,12 @@ module DMark
|
|
48
48
|
|
49
49
|
##########
|
50
50
|
|
51
|
-
def peek_char(pos = @pos)
|
52
|
-
if eof?
|
53
|
-
nil
|
54
|
-
else
|
55
|
-
@input_chars[pos]
|
56
|
-
end
|
57
|
-
end
|
58
|
-
|
59
51
|
def eof?(pos = @pos)
|
60
|
-
pos >= @
|
52
|
+
pos >= @length
|
61
53
|
end
|
62
54
|
|
63
55
|
def advance
|
64
|
-
if
|
56
|
+
if @input_chars[@pos] == "\n"
|
65
57
|
@line_nr += 1
|
66
58
|
@col_nr = 0
|
67
59
|
end
|
@@ -71,7 +63,7 @@ module DMark
|
|
71
63
|
end
|
72
64
|
|
73
65
|
def read_char(c)
|
74
|
-
char =
|
66
|
+
char = @input_chars[@pos]
|
75
67
|
if char != c
|
76
68
|
raise_parse_error("expected #{c.inspect}, but got #{char.nil? ? 'EOF' : char.inspect}")
|
77
69
|
else
|
@@ -118,7 +110,7 @@ module DMark
|
|
118
110
|
pos = @pos
|
119
111
|
|
120
112
|
loop do
|
121
|
-
case
|
113
|
+
case @input_chars[pos]
|
122
114
|
when ' '
|
123
115
|
pos += 1
|
124
116
|
when nil
|
@@ -133,8 +125,8 @@ module DMark
|
|
133
125
|
|
134
126
|
# FIXME: ugly and duplicated
|
135
127
|
def try_read_block_start
|
136
|
-
if
|
137
|
-
next_char =
|
128
|
+
if @input_chars[@pos] == '#'
|
129
|
+
next_char = @input_chars[@pos + 1]
|
138
130
|
('a'..'z').cover?(next_char)
|
139
131
|
else
|
140
132
|
false
|
@@ -146,7 +138,7 @@ module DMark
|
|
146
138
|
pos = @pos
|
147
139
|
|
148
140
|
loop do
|
149
|
-
case
|
141
|
+
case @input_chars[pos]
|
150
142
|
when ' '
|
151
143
|
pos += 1
|
152
144
|
indentation_chars += 1
|
@@ -170,13 +162,13 @@ module DMark
|
|
170
162
|
identifier = read_identifier
|
171
163
|
|
172
164
|
attributes =
|
173
|
-
if
|
165
|
+
if @input_chars[@pos] == '['
|
174
166
|
read_attributes
|
175
167
|
else
|
176
168
|
{}
|
177
169
|
end
|
178
170
|
|
179
|
-
case
|
171
|
+
case @input_chars[@pos]
|
180
172
|
when nil, "\n"
|
181
173
|
advance
|
182
174
|
ElementNode.new(identifier, attributes, [])
|
@@ -189,7 +181,7 @@ module DMark
|
|
189
181
|
end
|
190
182
|
|
191
183
|
def read_end_of_inline_content
|
192
|
-
char =
|
184
|
+
char = @input_chars[@pos]
|
193
185
|
case char
|
194
186
|
when "\n", nil
|
195
187
|
advance
|
@@ -207,9 +199,9 @@ module DMark
|
|
207
199
|
end
|
208
200
|
|
209
201
|
def read_identifier_head
|
210
|
-
char =
|
202
|
+
char = @input_chars[@pos]
|
211
203
|
case char
|
212
|
-
when 'a'..'z'
|
204
|
+
when 'a'..'z', 'A'..'Z'
|
213
205
|
advance
|
214
206
|
char
|
215
207
|
else
|
@@ -217,18 +209,16 @@ module DMark
|
|
217
209
|
end
|
218
210
|
end
|
219
211
|
|
212
|
+
IDENTIFIER_CHARS = Set.new(['a'..'z', 'A'..'Z', ['-', '_'], '0'..'9'].map(&:to_a).flatten)
|
213
|
+
|
220
214
|
def read_identifier_tail
|
221
215
|
res = ''
|
222
216
|
|
223
217
|
loop do
|
224
|
-
char =
|
225
|
-
|
226
|
-
|
227
|
-
|
228
|
-
res << char
|
229
|
-
else
|
230
|
-
break
|
231
|
-
end
|
218
|
+
char = @input_chars[@pos]
|
219
|
+
break unless IDENTIFIER_CHARS.include?(char)
|
220
|
+
advance
|
221
|
+
res << char
|
232
222
|
end
|
233
223
|
|
234
224
|
res.to_s
|
@@ -241,7 +231,7 @@ module DMark
|
|
241
231
|
|
242
232
|
at_start = true
|
243
233
|
loop do
|
244
|
-
char =
|
234
|
+
char = @input_chars[@pos]
|
245
235
|
case char
|
246
236
|
when ']'
|
247
237
|
advance
|
@@ -250,7 +240,7 @@ module DMark
|
|
250
240
|
read_char(',') unless at_start
|
251
241
|
|
252
242
|
key = read_attribute_key
|
253
|
-
if
|
243
|
+
if @input_chars[@pos] == '='
|
254
244
|
read_char('=')
|
255
245
|
value = read_attribute_value
|
256
246
|
else
|
@@ -275,7 +265,7 @@ module DMark
|
|
275
265
|
|
276
266
|
is_escaping = false
|
277
267
|
loop do
|
278
|
-
char =
|
268
|
+
char = @input_chars[@pos]
|
279
269
|
|
280
270
|
if is_escaping
|
281
271
|
case char
|
@@ -315,7 +305,7 @@ module DMark
|
|
315
305
|
res = []
|
316
306
|
|
317
307
|
loop do
|
318
|
-
char =
|
308
|
+
char = @input_chars[@pos]
|
319
309
|
case char
|
320
310
|
when "\n", nil
|
321
311
|
break
|
@@ -336,7 +326,7 @@ module DMark
|
|
336
326
|
res = ''
|
337
327
|
|
338
328
|
loop do
|
339
|
-
char =
|
329
|
+
char = @input_chars[@pos]
|
340
330
|
case char
|
341
331
|
when nil, "\n", '%', '}'
|
342
332
|
break
|
@@ -346,15 +336,15 @@ module DMark
|
|
346
336
|
end
|
347
337
|
end
|
348
338
|
|
349
|
-
res
|
339
|
+
res
|
350
340
|
end
|
351
341
|
|
352
342
|
def read_percent_body
|
353
|
-
char =
|
343
|
+
char = @input_chars[@pos]
|
354
344
|
case char
|
355
345
|
when '%', '}', '#'
|
356
346
|
advance
|
357
|
-
char
|
347
|
+
char
|
358
348
|
when nil, "\n"
|
359
349
|
raise_parse_error('expected something after %')
|
360
350
|
else
|
@@ -365,7 +355,7 @@ module DMark
|
|
365
355
|
def read_inline_element
|
366
356
|
name = read_identifier
|
367
357
|
attributes =
|
368
|
-
if
|
358
|
+
if @input_chars[@pos] == '['
|
369
359
|
read_attributes
|
370
360
|
else
|
371
361
|
{}
|
data/lib/d-mark/version.rb
CHANGED
data/spec/d-mark/parser_spec.rb
CHANGED
@@ -15,6 +15,36 @@ describe 'DMark::Parser#parser' do
|
|
15
15
|
expect(parse('#p hi %}')).to eq [element('p', {}, ['hi ', '}'])]
|
16
16
|
end
|
17
17
|
|
18
|
+
it 'parses element with name containing dash' do
|
19
|
+
expect(parse('#intro-para hi')).to eq [
|
20
|
+
element('intro-para', {}, ['hi'])
|
21
|
+
]
|
22
|
+
end
|
23
|
+
|
24
|
+
it 'parses element with name containing underscore' do
|
25
|
+
expect(parse('#intro_para hi')).to eq [
|
26
|
+
element('intro_para', {}, ['hi'])
|
27
|
+
]
|
28
|
+
end
|
29
|
+
|
30
|
+
it 'parses element with name containing uppercase letters' do
|
31
|
+
expect(parse('#IntroPara hi')).to eq [
|
32
|
+
element('IntroPara', {}, ['hi'])
|
33
|
+
]
|
34
|
+
end
|
35
|
+
|
36
|
+
it 'does not parse element with name starting with a dash' do
|
37
|
+
expect { parse('#-intro hi there') }.to raise_error(DMark::Parser::ParserError)
|
38
|
+
end
|
39
|
+
|
40
|
+
it 'does not parse element with name starting with an underscore' do
|
41
|
+
expect { parse('#_intro hi there') }.to raise_error(DMark::Parser::ParserError)
|
42
|
+
end
|
43
|
+
|
44
|
+
it 'does not parse element with name starting with a digit' do
|
45
|
+
expect { parse('#4ever best friends') }.to raise_error(DMark::Parser::ParserError)
|
46
|
+
end
|
47
|
+
|
18
48
|
it 'parses escaped % in block' do
|
19
49
|
expect(parse('#p %%')).to eq [
|
20
50
|
element('p', {}, ['%'])
|
@@ -133,7 +163,7 @@ describe 'DMark::Parser#parser' do
|
|
133
163
|
|
134
164
|
it 'includes raw content' do
|
135
165
|
expect(parse("#p foo\n donkey")).to eq [
|
136
|
-
element('p', {}, %W
|
166
|
+
element('p', {}, %W[foo \n donkey])
|
137
167
|
]
|
138
168
|
end
|
139
169
|
|
@@ -179,6 +209,42 @@ describe 'DMark::Parser#parser' do
|
|
179
209
|
]
|
180
210
|
end
|
181
211
|
|
212
|
+
it 'parses attribute with dash' do
|
213
|
+
expect(parse('#p[intended-audience=learner] hi')).to eq [
|
214
|
+
element('p', { 'intended-audience' => 'learner' }, ['hi'])
|
215
|
+
]
|
216
|
+
end
|
217
|
+
|
218
|
+
it 'parses attribute with numbers' do
|
219
|
+
expect(parse('#p[is-over-9000=yup] hi')).to eq [
|
220
|
+
element('p', { 'is-over-9000' => 'yup' }, ['hi'])
|
221
|
+
]
|
222
|
+
end
|
223
|
+
|
224
|
+
it 'parses attribute with underscore' do
|
225
|
+
expect(parse('#p[intended_audience=learner] hi')).to eq [
|
226
|
+
element('p', { 'intended_audience' => 'learner' }, ['hi'])
|
227
|
+
]
|
228
|
+
end
|
229
|
+
|
230
|
+
it 'parses attribute with uppercase letters' do
|
231
|
+
expect(parse('#p[IntendedAudience=learner] hi')).to eq [
|
232
|
+
element('p', { 'IntendedAudience' => 'learner' }, ['hi'])
|
233
|
+
]
|
234
|
+
end
|
235
|
+
|
236
|
+
it 'does not parse atttributes starting with -' do
|
237
|
+
expect { parse('#p[-this=is dog] hello yes') }.to raise_error(DMark::Parser::ParserError)
|
238
|
+
end
|
239
|
+
|
240
|
+
it 'does not parse atttributes starting with _' do
|
241
|
+
expect { parse('#p[_this=is dog] hello yes') }.to raise_error(DMark::Parser::ParserError)
|
242
|
+
end
|
243
|
+
|
244
|
+
it 'does not parse atttributes starting with a digit' do
|
245
|
+
expect { parse('#p[4this=is dog] hello yes') }.to raise_error(DMark::Parser::ParserError)
|
246
|
+
end
|
247
|
+
|
182
248
|
it 'parses single value-less attribute' do
|
183
249
|
expect(parse('#p[foo] hi')).to eq [
|
184
250
|
element('p', { 'foo' => 'foo' }, ['hi'])
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: d-mark
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.0a4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Denis Defreyne
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2017-08-19 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -53,7 +53,6 @@ files:
|
|
53
53
|
- lib/d-mark/parser.rb
|
54
54
|
- lib/d-mark/translator.rb
|
55
55
|
- lib/d-mark/version.rb
|
56
|
-
- samples/test.rb
|
57
56
|
- samples/trivial.dmark
|
58
57
|
- samples/trivial.rb
|
59
58
|
- spec/d-mark/element_node_spec.rb
|
@@ -82,9 +81,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
82
81
|
version: 1.3.1
|
83
82
|
requirements: []
|
84
83
|
rubyforge_project:
|
85
|
-
rubygems_version: 2.6.
|
84
|
+
rubygems_version: 2.6.12
|
86
85
|
signing_key:
|
87
86
|
specification_version: 4
|
88
87
|
summary: markup language for writing text
|
89
88
|
test_files: []
|
90
|
-
has_rdoc:
|
data/samples/test.rb
DELETED
@@ -1,65 +0,0 @@
|
|
1
|
-
require 'd-mark'
|
2
|
-
|
3
|
-
module DMarkBook
|
4
|
-
module Translators
|
5
|
-
class HTML < DMark::Translator
|
6
|
-
def handle_string(node)
|
7
|
-
[html_escape(node)]
|
8
|
-
end
|
9
|
-
|
10
|
-
def handle_element(node, path)
|
11
|
-
case node.name
|
12
|
-
when 'p', 'dl', 'dt', 'dd', 'ol', 'ul', 'li', 'code', 'kbd', 'blockquote'
|
13
|
-
wrap(node.name) { handle_children(node, path) }
|
14
|
-
when 'h'
|
15
|
-
depth = path.count { |node| node.name == 'section' } + 1
|
16
|
-
wrap("h#{depth}") { handle_children(node, path) }
|
17
|
-
when 'section'
|
18
|
-
wrap('section', id: id_for_section(node)) { handle_children(node, path) }
|
19
|
-
when 'em'
|
20
|
-
wrap('em') { handle_children(node, path) }
|
21
|
-
when 'link'
|
22
|
-
wrap('a', href: node.attributes['target']) { handle_children(node, path) }
|
23
|
-
when 'listing'
|
24
|
-
wrap('pre') { wrap('code') { handle_children(node, path) } }
|
25
|
-
else
|
26
|
-
raise DMark::Translator::UnhandledNode.new(node)
|
27
|
-
end
|
28
|
-
end
|
29
|
-
|
30
|
-
def wrap(name, params = {})
|
31
|
-
params_string = params.map { |k, v| " #{k}=\"#{html_escape(v)}\"" }.join('')
|
32
|
-
["<#{name}#{params_string}>", yield, "</#{name}>"]
|
33
|
-
end
|
34
|
-
|
35
|
-
def html_escape(s)
|
36
|
-
s.gsub('&', '&').gsub('<', '<')
|
37
|
-
end
|
38
|
-
|
39
|
-
def id_for_section(node)
|
40
|
-
header = node.children.find { |c| c.name == 'h' }
|
41
|
-
text = header.children.join('')
|
42
|
-
text.downcase.gsub(/[^a-zA-Z-]/, '-')
|
43
|
-
end
|
44
|
-
end
|
45
|
-
end
|
46
|
-
end
|
47
|
-
|
48
|
-
class SpecialHTML < DMarkBook::Translators::HTML
|
49
|
-
def handle_element(node, depths)
|
50
|
-
case node.name
|
51
|
-
when 'firstterm', 'prompt', 'filename'
|
52
|
-
wrap('span', class: node.name) { handle_children(node, depths) }
|
53
|
-
when 'note', 'todo'
|
54
|
-
wrap('div', class: node.name) { handle_children(node, depths) }
|
55
|
-
else
|
56
|
-
super
|
57
|
-
end
|
58
|
-
end
|
59
|
-
end
|
60
|
-
|
61
|
-
content = File.readlines('site/content/index.dmark').drop(4).join
|
62
|
-
parser = DMark::Parser.new(content)
|
63
|
-
tree = parser.parse
|
64
|
-
|
65
|
-
puts SpecialHTML.new.translate(tree)
|