arti_mark 0.1.beta3 → 0.1.beta5

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,10 +1,12 @@
1
1
  # -*- coding: utf-8 -*-
2
2
  require 'arti_mark/html/util'
3
- require 'arti_mark/html/result'
3
+ require 'arti_mark/html/pages'
4
4
  require 'arti_mark/html/context'
5
5
  require 'arti_mark/html/tag_writer'
6
6
  require 'arti_mark/html/header_writer'
7
+ require 'arti_mark/html/paragraph_writer'
7
8
  require 'arti_mark/html/writer_selector'
9
+ require 'arti_mark/html/abstract_item_writer'
8
10
  module ArtiMark
9
11
  module Html
10
12
  class Generator
@@ -13,6 +15,7 @@ module ArtiMark
13
15
  def initialize(param = {})
14
16
  @context = Context.new(param)
15
17
  article_writer = TagWriter.create('article', self)
18
+ section_writer = TagWriter.create('section', self)
16
19
  link_writer = TagWriter.create('a', self, trailer: '',
17
20
  item_preprocessor: proc do |item|
18
21
  (item[:attrs] ||= {}).merge!({:href => [ item[:args][0] ]})
@@ -20,31 +23,23 @@ module ArtiMark
20
23
  end)
21
24
 
22
25
  header_writer = HeaderWriter.new self
23
-
26
+ paragraph_writer = ParagraphWriter.new self
27
+ abstract_item_writer = AbstractItemWriter.new self
24
28
  @writers = {
25
- :paragraph =>
26
- TagWriter.create('p', self, chop_last_space: true,
27
- item_preprocessor: proc do |item|
28
- add_class(item, 'noindent') if item[:children][0] =~/^(「|『|()/ # TODO: should be plaggable}
29
- item
30
- end
31
- ),
32
- :paragraph_group =>
33
- TagWriter.create("div", self,
34
- item_preprocessor: proc do |item|
35
- add_class item, 'pgroup'
36
- item[:no_tag] = true unless @context.enable_pgroup
37
- item
38
- end
39
- ),
40
-
29
+ :page => abstract_item_writer,
30
+ :headers => abstract_item_writer,
31
+ :paragraph => paragraph_writer,
32
+ :paragraph_group => paragraph_writer,
41
33
  :block =>
42
34
  WriterSelector.new(self,
43
35
  {
44
36
  'd' => TagWriter.create('div', self),
45
37
  'art' => article_writer,
46
38
  'arti' => article_writer,
47
- 'article' => article_writer
39
+ 'article' => article_writer,
40
+ 'sec' => section_writer,
41
+ 'sect' => section_writer,
42
+ 'section' => section_writer,
48
43
  }),
49
44
  :line_command =>
50
45
  WriterSelector.new(self,
@@ -69,21 +64,6 @@ module ArtiMark
69
64
  :done
70
65
  end
71
66
  ),
72
- 'newpage' =>
73
- TagWriter.create('div', self,
74
- item_preprocessor: proc do |item|
75
- item[:no_tag] = true
76
- item
77
- end,
78
- write_body_preprocessor: proc do |item|
79
- title = nil
80
- if item[:args].size > 0 && item[:args][0].size > 0
81
- title = escape_html item[:args].first
82
- end
83
- @context.start_html(title)
84
- :done
85
- end
86
- ),
87
67
 
88
68
  }),
89
69
  :inline =>
@@ -128,10 +108,47 @@ module ArtiMark
128
108
  output "<dd>"; write_array item[:args][1]; output "</dd>"
129
109
  :done
130
110
  end),
111
+ :newpage =>
112
+ TagWriter.create('div', self,
113
+ item_preprocessor: proc do |item|
114
+ item[:no_tag] = true
115
+ item
116
+ end,
117
+ write_body_preprocessor: proc do |item|
118
+ title = nil
119
+ if item[:args].size > 0 && item[:args][0].size > 0
120
+ title = escape_html item[:args].first
121
+ end
122
+ @context.title = title unless title.nil?
123
+ @context.end_html
124
+ :done
125
+ end
126
+ ),
127
+ #headed-section
128
+ :h_section =>
129
+ TagWriter.create('section', self, write_body_preprocessor: proc do |item|
130
+ output "<h#{item[:level]}>#{item[:heading].strip}</h#{item[:level]}>\n"
131
+ :continue
132
+ end),
131
133
  # headers
132
134
  :stylesheets => header_writer,
133
135
  :title => header_writer,
134
136
  :lang => header_writer,
137
+ :paragraph_style => header_writer,
138
+ # pre-formatted
139
+ :preformatted =>
140
+ TagWriter.create('pre', self,write_body_preprocessor: proc do |item|
141
+ output "<code>" if item[:name] == 'precode'
142
+ output item[:children].join "\n"
143
+ output "</code>" if item[:name] == 'precode'
144
+ :done
145
+ end),
146
+ #break
147
+ :br =>
148
+ TagWriter.create('br', self, item_preprocessor: proc do |item|
149
+ item[:no_body] = true
150
+ item
151
+ end),
135
152
  }
136
153
  end
137
154
 
@@ -21,6 +21,9 @@ module ArtiMark
21
21
  end,
22
22
  :lang => proc do |item|
23
23
  @context.lang = escape_html item[:lang].strip
24
+ end,
25
+ :paragraph_style => proc do |item|
26
+ @context.paragraph_style = item[:paragraph_style].strip
24
27
  end
25
28
  }
26
29
  end
@@ -0,0 +1,56 @@
1
+ require 'securerandom'
2
+ module ArtiMark
3
+ module Html
4
+ class Context
5
+ class Pages
6
+ attr_reader :created_files
7
+ def initialize(filename_base = nil, sequence_format='%05d')
8
+ @filename_base = filename_base || "noramark_#{SecureRandom.uuid}"
9
+ @sequence_format = sequence_format || '%05d'
10
+ @result = []
11
+ end
12
+
13
+ def last
14
+ @result.last[:content]
15
+ end
16
+
17
+ def size
18
+ @result.size
19
+ end
20
+
21
+ def <<(page)
22
+ seq = @result.size + 1
23
+ @result << { content: page, filename: "#{@filename_base}_#{@sequence_format%(seq)}.xhtml" }
24
+ end
25
+
26
+ def [](num)
27
+ page = @result[num]
28
+ page.nil? ? nil : page[:content]
29
+ end
30
+
31
+ def pages
32
+ @result
33
+ end
34
+
35
+ def write_as_files(directory: nil)
36
+ dir = directory || Dir.pwd
37
+ Dir.chdir(dir) do
38
+ @result.each do
39
+ |page|
40
+ File.open(page[:filename], 'w+') do
41
+ |file|
42
+ file << page[:content]
43
+ end
44
+ end
45
+ end
46
+ end
47
+ def write_as_single_file(filename)
48
+ File.open(filename, 'w+') {
49
+ |file|
50
+ file << @result[0][:content]
51
+ }
52
+ end
53
+ end
54
+ end
55
+ end
56
+ end
@@ -0,0 +1,52 @@
1
+ # -*- coding: utf-8 -*-
2
+ module ArtiMark
3
+ module Html
4
+ class ParagraphWriter
5
+ def initialize(generator)
6
+ @generator = generator
7
+ @context = generator.context
8
+ @writer_set = { use_paragraph_group: {
9
+ :paragraph =>
10
+ TagWriter.create('p', @generator, chop_last_space: true,
11
+ item_preprocessor: proc do |item|
12
+ add_class(item, 'noindent') if item[:children][0] =~/^(「|『|()/ # TODO: should be plaggable}
13
+ item
14
+ end
15
+ ),
16
+ :paragraph_group =>
17
+ TagWriter.create("div", @generator,
18
+ item_preprocessor: proc do |item|
19
+ add_class item, 'pgroup'
20
+ item[:no_tag] = true unless @context.enable_pgroup
21
+ item
22
+ end
23
+ )
24
+ },
25
+ default: {
26
+ :paragraph =>
27
+ TagWriter.create(nil, @generator, chop_last_space: true,
28
+ item_preprocessor: proc do |item|
29
+ item[:no_tag] = true
30
+ item
31
+ end),
32
+ :paragraph_group =>
33
+ TagWriter.create("p", @generator,
34
+ item_preprocessor: proc do |item|
35
+ item[:children] = item[:children].inject([]) do |memo, item|
36
+ memo << { :type => :br, :args => [] } if !memo.last.nil? && memo.last[:type] == :paragraph && item[:type] == :paragraph
37
+ memo << item
38
+ end
39
+ item
40
+ end
41
+ )
42
+ }
43
+ }
44
+ end
45
+ def write(item)
46
+ writer_set = @writer_set[@context.paragraph_style]
47
+ writer_set = @writer_set['default'] if writer_set.nil?
48
+ writer_set[item[:type]].write(item)
49
+ end
50
+ end
51
+ end
52
+ end
@@ -38,6 +38,12 @@ blockend = lh - '}' - le empty_line*
38
38
  blockbody = (!blockend block)+:body { body }
39
39
  explicit_block = < blockhead:head - blockbody:body - blockend > { create_item(:block, head, body, raw: text) }
40
40
 
41
+ # preformatted block
42
+ preformatted_command = command:command &{ ['pre', 'precode'].include? command[:name] }
43
+ preformatted_command_head = lh - preformatted_command:command - '<<' &/[\w0-9]/ { command }
44
+ preformat_end(start) = lh word:delimiter &{ delimiter == start }
45
+ preformatted_block = < lh - preformatted_command_head:command !nl word:delimiter nl (!preformat_end(delimiter) (lh charstring nl))+:content preformat_end(delimiter) > { create_item(:preformatted, command, content, raw: text) }
46
+
41
47
  # inline command
42
48
  inline = img_inline | common_inline
43
49
  common_inline = < '[' command:c '{' documentcontent_except('}'):content '}' ']' > { create_item(:inline, c, content, raw: text) }
@@ -45,10 +51,17 @@ img_command = command:c &{ c[:name] == 'img' && c[:args].size == 2}
45
51
  img_inline = < '[' img_command:c ']' > { create_item(:inline, c, nil, raw: text) }
46
52
 
47
53
  # special line commands
54
+ commandname_for_special_line_command = newpage_command | explicit_paragraph_command
55
+
56
+ # newpage
57
+ newpage_command = command:command &{ command[:name] == 'newpage' }
58
+ newpage = < lh - newpage_command:c ':' documentcontent?:content - nl > { create_item(:newpage, c, content, raw:text) }
59
+
48
60
  # explicit paragraph
49
61
  explicit_paragraph_command = command:c &{ c[:name] == 'p' }
50
62
  explicit_paragraph = < lh - explicit_paragraph_command:c ':' documentcontent?:content le empty_line*> { create_item(:paragraph, c, content, raw:text) }
51
63
 
64
+
52
65
  # unordered list
53
66
  unordered_list = < unordered_item+:items > { create_item(:ul, nil, items, raw: text) }
54
67
  unordered_item = < lh '*:' documentcontent:content le > { create_item(:li, nil, content, raw: text) }
@@ -65,20 +78,30 @@ items_list = unordered_list | ordered_list | definition_list
65
78
 
66
79
 
67
80
  # generic line command
68
- line_command = < lh - !explicit_paragraph_command command:c ':' documentcontent?:content - le empty_line* > { create_item(:line_command, c, content, raw: text) }
81
+ line_command = < lh - !commandname_for_special_line_command command:c ':' documentcontent?:content - le empty_line* > { create_item(:line_command, c, content, raw: text) }
69
82
 
70
83
  # blocks
71
- line_block = items_list | line_command
72
- block = (line_block | explicit_block | paragraph_group):block empty_line* {block}
84
+ line_block = items_list | line_command
85
+ block = (preformatted_block | headed_section | line_block | explicit_block | paragraph_group ):block empty_line* {block}
73
86
  block_delimiter = blockhead | blockend
74
- paragraph_delimiter = block_delimiter | line_block
87
+ paragraph_delimiter = block_delimiter | preformatted_command_head | line_block | newpage | headed_start
75
88
 
89
+ # markdown-style headings
90
+ h_start_mark(n) = < '='+ ':' > &{ text.length - 1 == n }
91
+ h_markup_terminator(n) = lh - < '='+ ':' > &{ text.length - 1 <= n }
92
+
93
+ h_start(n) = lh - h_start_mark(n) charstring:s le { { level: n, heading: s } }
94
+ h_section(n) = < h_start(n):h (!h_markup_terminator(n) !eof block)+:content > { create_item(:h_section, h, content, raw: text) }
95
+
96
+ headed_start = h_start(1) | h_start(2) | h_start(3) | h_start(4) | h_start(5) | h_start(6)
97
+ headed_section = h_section(1) | h_section(2)| h_section(3)| h_section(4)| h_section(5) | h_section(6)
76
98
 
77
99
  #header
78
100
  stylesheets = < lh - 'stylesheets:' !le charstring:s nl > { create_item(:stylesheets, {:stylesheets => s.split(',').map(&:strip)}, nil, raw:text) }
79
101
  title = < lh - 'title:' !le charstring:t nl > { create_item(:title, {:title => t }, nil, raw:text) }
80
102
  lang = < lh - 'lang:' !le charstring:l nl > { create_item(:lang, {:lang => l }, nil, raw:text) }
81
- header = (stylesheets | title | lang) empty_line*
103
+ paragraph_style = < lh - 'paragraph-style:' !le charstring:l nl > { create_item(:paragraph_style, {:paragraph_style => l }, nil, raw:text) }
104
+ header = (stylesheets | title | lang | paragraph_style ) empty_line*
82
105
 
83
106
  # texts
84
107
  char = < /[[:print:]]/ > { text }
@@ -89,7 +112,12 @@ documentcontent_except(e) = (inline | !inline char_except(e))+:content ~parse_te
89
112
  documentcontent = (inline | !inline char)+:content ~parse_text(content)
90
113
  documentline = lh documentcontent:content le { content }
91
114
 
115
+ #page
116
+ headers = header*:headers { create_item(:headers, nil, headers) }
117
+ page = headers:headers - (!newpage block)*:blocks { create_item(:page, nil, [headers] + blocks.select{ |x| !x.nil?}) }
118
+ newpaged_page = newpage:newpage page:page { page[:children] = page[:children].unshift newpage; page }
92
119
  #root
93
- root = header*:headers - block*:blocks - eof_comment? eof { headers.concat blocks.select{ |x| !x.nil?} }
120
+ root = page:page newpaged_page*:pages - eof_comment? eof { [ page ] + pages }
121
+
94
122
 
95
123
 
@@ -1082,6 +1082,253 @@ class ArtiMark::Parser < KPeg::CompiledParser
1082
1082
  return _tmp
1083
1083
  end
1084
1084
 
1085
+ # preformatted_command = command:command &{ ['pre', 'precode'].include? command[:name] }
1086
+ def _preformatted_command
1087
+
1088
+ _save = self.pos
1089
+ while true # sequence
1090
+ _tmp = apply(:_command)
1091
+ command = @result
1092
+ unless _tmp
1093
+ self.pos = _save
1094
+ break
1095
+ end
1096
+ _save1 = self.pos
1097
+ _tmp = begin; ['pre', 'precode'].include? command[:name] ; end
1098
+ self.pos = _save1
1099
+ unless _tmp
1100
+ self.pos = _save
1101
+ end
1102
+ break
1103
+ end # end sequence
1104
+
1105
+ set_failed_rule :_preformatted_command unless _tmp
1106
+ return _tmp
1107
+ end
1108
+
1109
+ # preformatted_command_head = lh - preformatted_command:command - "<<" &/[\w0-9]/ { command }
1110
+ def _preformatted_command_head
1111
+
1112
+ _save = self.pos
1113
+ while true # sequence
1114
+ _tmp = apply(:_lh)
1115
+ unless _tmp
1116
+ self.pos = _save
1117
+ break
1118
+ end
1119
+ _tmp = apply(:__hyphen_)
1120
+ unless _tmp
1121
+ self.pos = _save
1122
+ break
1123
+ end
1124
+ _tmp = apply(:_preformatted_command)
1125
+ command = @result
1126
+ unless _tmp
1127
+ self.pos = _save
1128
+ break
1129
+ end
1130
+ _tmp = apply(:__hyphen_)
1131
+ unless _tmp
1132
+ self.pos = _save
1133
+ break
1134
+ end
1135
+ _tmp = match_string("<<")
1136
+ unless _tmp
1137
+ self.pos = _save
1138
+ break
1139
+ end
1140
+ _save1 = self.pos
1141
+ _tmp = scan(/\A(?-mix:[\w0-9])/)
1142
+ self.pos = _save1
1143
+ unless _tmp
1144
+ self.pos = _save
1145
+ break
1146
+ end
1147
+ @result = begin; command ; end
1148
+ _tmp = true
1149
+ unless _tmp
1150
+ self.pos = _save
1151
+ end
1152
+ break
1153
+ end # end sequence
1154
+
1155
+ set_failed_rule :_preformatted_command_head unless _tmp
1156
+ return _tmp
1157
+ end
1158
+
1159
+ # preformat_end = lh word:delimiter &{ delimiter == start }
1160
+ def _preformat_end(start)
1161
+
1162
+ _save = self.pos
1163
+ while true # sequence
1164
+ _tmp = apply(:_lh)
1165
+ unless _tmp
1166
+ self.pos = _save
1167
+ break
1168
+ end
1169
+ _tmp = apply(:_word)
1170
+ delimiter = @result
1171
+ unless _tmp
1172
+ self.pos = _save
1173
+ break
1174
+ end
1175
+ _save1 = self.pos
1176
+ _tmp = begin; delimiter == start ; end
1177
+ self.pos = _save1
1178
+ unless _tmp
1179
+ self.pos = _save
1180
+ end
1181
+ break
1182
+ end # end sequence
1183
+
1184
+ set_failed_rule :_preformat_end unless _tmp
1185
+ return _tmp
1186
+ end
1187
+
1188
+ # preformatted_block = < lh - preformatted_command_head:command !nl word:delimiter nl (!preformat_end(delimiter) lh charstring nl)+:content preformat_end(delimiter) > { create_item(:preformatted, command, content, raw: text) }
1189
+ def _preformatted_block
1190
+
1191
+ _save = self.pos
1192
+ while true # sequence
1193
+ _text_start = self.pos
1194
+
1195
+ _save1 = self.pos
1196
+ while true # sequence
1197
+ _tmp = apply(:_lh)
1198
+ unless _tmp
1199
+ self.pos = _save1
1200
+ break
1201
+ end
1202
+ _tmp = apply(:__hyphen_)
1203
+ unless _tmp
1204
+ self.pos = _save1
1205
+ break
1206
+ end
1207
+ _tmp = apply(:_preformatted_command_head)
1208
+ command = @result
1209
+ unless _tmp
1210
+ self.pos = _save1
1211
+ break
1212
+ end
1213
+ _save2 = self.pos
1214
+ _tmp = apply(:_nl)
1215
+ _tmp = _tmp ? nil : true
1216
+ self.pos = _save2
1217
+ unless _tmp
1218
+ self.pos = _save1
1219
+ break
1220
+ end
1221
+ _tmp = apply(:_word)
1222
+ delimiter = @result
1223
+ unless _tmp
1224
+ self.pos = _save1
1225
+ break
1226
+ end
1227
+ _tmp = apply(:_nl)
1228
+ unless _tmp
1229
+ self.pos = _save1
1230
+ break
1231
+ end
1232
+ _save3 = self.pos
1233
+ _ary = []
1234
+
1235
+ _save4 = self.pos
1236
+ while true # sequence
1237
+ _save5 = self.pos
1238
+ _tmp = apply_with_args(:_preformat_end, delimiter)
1239
+ _tmp = _tmp ? nil : true
1240
+ self.pos = _save5
1241
+ unless _tmp
1242
+ self.pos = _save4
1243
+ break
1244
+ end
1245
+ _tmp = apply(:_lh)
1246
+ unless _tmp
1247
+ self.pos = _save4
1248
+ break
1249
+ end
1250
+ _tmp = apply(:_charstring)
1251
+ unless _tmp
1252
+ self.pos = _save4
1253
+ break
1254
+ end
1255
+ _tmp = apply(:_nl)
1256
+ unless _tmp
1257
+ self.pos = _save4
1258
+ end
1259
+ break
1260
+ end # end sequence
1261
+
1262
+ if _tmp
1263
+ _ary << @result
1264
+ while true
1265
+
1266
+ _save6 = self.pos
1267
+ while true # sequence
1268
+ _save7 = self.pos
1269
+ _tmp = apply_with_args(:_preformat_end, delimiter)
1270
+ _tmp = _tmp ? nil : true
1271
+ self.pos = _save7
1272
+ unless _tmp
1273
+ self.pos = _save6
1274
+ break
1275
+ end
1276
+ _tmp = apply(:_lh)
1277
+ unless _tmp
1278
+ self.pos = _save6
1279
+ break
1280
+ end
1281
+ _tmp = apply(:_charstring)
1282
+ unless _tmp
1283
+ self.pos = _save6
1284
+ break
1285
+ end
1286
+ _tmp = apply(:_nl)
1287
+ unless _tmp
1288
+ self.pos = _save6
1289
+ end
1290
+ break
1291
+ end # end sequence
1292
+
1293
+ _ary << @result if _tmp
1294
+ break unless _tmp
1295
+ end
1296
+ _tmp = true
1297
+ @result = _ary
1298
+ else
1299
+ self.pos = _save3
1300
+ end
1301
+ content = @result
1302
+ unless _tmp
1303
+ self.pos = _save1
1304
+ break
1305
+ end
1306
+ _tmp = apply_with_args(:_preformat_end, delimiter)
1307
+ unless _tmp
1308
+ self.pos = _save1
1309
+ end
1310
+ break
1311
+ end # end sequence
1312
+
1313
+ if _tmp
1314
+ text = get_text(_text_start)
1315
+ end
1316
+ unless _tmp
1317
+ self.pos = _save
1318
+ break
1319
+ end
1320
+ @result = begin; create_item(:preformatted, command, content, raw: text) ; end
1321
+ _tmp = true
1322
+ unless _tmp
1323
+ self.pos = _save
1324
+ end
1325
+ break
1326
+ end # end sequence
1327
+
1328
+ set_failed_rule :_preformatted_block unless _tmp
1329
+ return _tmp
1330
+ end
1331
+
1085
1332
  # inline = (img_inline | common_inline)
1086
1333
  def _inline
1087
1334
 
@@ -1232,19 +1479,37 @@ class ArtiMark::Parser < KPeg::CompiledParser
1232
1479
  return _tmp
1233
1480
  end
1234
1481
 
1235
- # explicit_paragraph_command = command:c &{ c[:name] == 'p' }
1236
- def _explicit_paragraph_command
1482
+ # commandname_for_special_line_command = (newpage_command | explicit_paragraph_command)
1483
+ def _commandname_for_special_line_command
1484
+
1485
+ _save = self.pos
1486
+ while true # choice
1487
+ _tmp = apply(:_newpage_command)
1488
+ break if _tmp
1489
+ self.pos = _save
1490
+ _tmp = apply(:_explicit_paragraph_command)
1491
+ break if _tmp
1492
+ self.pos = _save
1493
+ break
1494
+ end # end choice
1495
+
1496
+ set_failed_rule :_commandname_for_special_line_command unless _tmp
1497
+ return _tmp
1498
+ end
1499
+
1500
+ # newpage_command = command:command &{ command[:name] == 'newpage' }
1501
+ def _newpage_command
1237
1502
 
1238
1503
  _save = self.pos
1239
1504
  while true # sequence
1240
1505
  _tmp = apply(:_command)
1241
- c = @result
1506
+ command = @result
1242
1507
  unless _tmp
1243
1508
  self.pos = _save
1244
1509
  break
1245
1510
  end
1246
1511
  _save1 = self.pos
1247
- _tmp = begin; c[:name] == 'p' ; end
1512
+ _tmp = begin; command[:name] == 'newpage' ; end
1248
1513
  self.pos = _save1
1249
1514
  unless _tmp
1250
1515
  self.pos = _save
@@ -1252,12 +1517,12 @@ class ArtiMark::Parser < KPeg::CompiledParser
1252
1517
  break
1253
1518
  end # end sequence
1254
1519
 
1255
- set_failed_rule :_explicit_paragraph_command unless _tmp
1520
+ set_failed_rule :_newpage_command unless _tmp
1256
1521
  return _tmp
1257
1522
  end
1258
1523
 
1259
- # explicit_paragraph = < lh - explicit_paragraph_command:c ":" documentcontent?:content le empty_line* > { create_item(:paragraph, c, content, raw:text) }
1260
- def _explicit_paragraph
1524
+ # newpage = < lh - newpage_command:c ":" documentcontent?:content - nl > { create_item(:newpage, c, content, raw:text) }
1525
+ def _newpage
1261
1526
 
1262
1527
  _save = self.pos
1263
1528
  while true # sequence
@@ -1275,7 +1540,7 @@ class ArtiMark::Parser < KPeg::CompiledParser
1275
1540
  self.pos = _save1
1276
1541
  break
1277
1542
  end
1278
- _tmp = apply(:_explicit_paragraph_command)
1543
+ _tmp = apply(:_newpage_command)
1279
1544
  c = @result
1280
1545
  unless _tmp
1281
1546
  self.pos = _save1
@@ -1298,16 +1563,12 @@ class ArtiMark::Parser < KPeg::CompiledParser
1298
1563
  self.pos = _save1
1299
1564
  break
1300
1565
  end
1301
- _tmp = apply(:_le)
1566
+ _tmp = apply(:__hyphen_)
1302
1567
  unless _tmp
1303
1568
  self.pos = _save1
1304
1569
  break
1305
1570
  end
1306
- while true
1307
- _tmp = apply(:_empty_line)
1308
- break unless _tmp
1309
- end
1310
- _tmp = true
1571
+ _tmp = apply(:_nl)
1311
1572
  unless _tmp
1312
1573
  self.pos = _save1
1313
1574
  end
@@ -1321,7 +1582,7 @@ class ArtiMark::Parser < KPeg::CompiledParser
1321
1582
  self.pos = _save
1322
1583
  break
1323
1584
  end
1324
- @result = begin; create_item(:paragraph, c, content, raw:text) ; end
1585
+ @result = begin; create_item(:newpage, c, content, raw:text) ; end
1325
1586
  _tmp = true
1326
1587
  unless _tmp
1327
1588
  self.pos = _save
@@ -1329,20 +1590,121 @@ class ArtiMark::Parser < KPeg::CompiledParser
1329
1590
  break
1330
1591
  end # end sequence
1331
1592
 
1332
- set_failed_rule :_explicit_paragraph unless _tmp
1593
+ set_failed_rule :_newpage unless _tmp
1333
1594
  return _tmp
1334
1595
  end
1335
1596
 
1336
- # unordered_list = < unordered_item+:items > { create_item(:ul, nil, items, raw: text) }
1337
- def _unordered_list
1597
+ # explicit_paragraph_command = command:c &{ c[:name] == 'p' }
1598
+ def _explicit_paragraph_command
1338
1599
 
1339
1600
  _save = self.pos
1340
1601
  while true # sequence
1341
- _text_start = self.pos
1602
+ _tmp = apply(:_command)
1603
+ c = @result
1604
+ unless _tmp
1605
+ self.pos = _save
1606
+ break
1607
+ end
1342
1608
  _save1 = self.pos
1343
- _ary = []
1344
- _tmp = apply(:_unordered_item)
1345
- if _tmp
1609
+ _tmp = begin; c[:name] == 'p' ; end
1610
+ self.pos = _save1
1611
+ unless _tmp
1612
+ self.pos = _save
1613
+ end
1614
+ break
1615
+ end # end sequence
1616
+
1617
+ set_failed_rule :_explicit_paragraph_command unless _tmp
1618
+ return _tmp
1619
+ end
1620
+
1621
+ # explicit_paragraph = < lh - explicit_paragraph_command:c ":" documentcontent?:content le empty_line* > { create_item(:paragraph, c, content, raw:text) }
1622
+ def _explicit_paragraph
1623
+
1624
+ _save = self.pos
1625
+ while true # sequence
1626
+ _text_start = self.pos
1627
+
1628
+ _save1 = self.pos
1629
+ while true # sequence
1630
+ _tmp = apply(:_lh)
1631
+ unless _tmp
1632
+ self.pos = _save1
1633
+ break
1634
+ end
1635
+ _tmp = apply(:__hyphen_)
1636
+ unless _tmp
1637
+ self.pos = _save1
1638
+ break
1639
+ end
1640
+ _tmp = apply(:_explicit_paragraph_command)
1641
+ c = @result
1642
+ unless _tmp
1643
+ self.pos = _save1
1644
+ break
1645
+ end
1646
+ _tmp = match_string(":")
1647
+ unless _tmp
1648
+ self.pos = _save1
1649
+ break
1650
+ end
1651
+ _save2 = self.pos
1652
+ _tmp = apply(:_documentcontent)
1653
+ @result = nil unless _tmp
1654
+ unless _tmp
1655
+ _tmp = true
1656
+ self.pos = _save2
1657
+ end
1658
+ content = @result
1659
+ unless _tmp
1660
+ self.pos = _save1
1661
+ break
1662
+ end
1663
+ _tmp = apply(:_le)
1664
+ unless _tmp
1665
+ self.pos = _save1
1666
+ break
1667
+ end
1668
+ while true
1669
+ _tmp = apply(:_empty_line)
1670
+ break unless _tmp
1671
+ end
1672
+ _tmp = true
1673
+ unless _tmp
1674
+ self.pos = _save1
1675
+ end
1676
+ break
1677
+ end # end sequence
1678
+
1679
+ if _tmp
1680
+ text = get_text(_text_start)
1681
+ end
1682
+ unless _tmp
1683
+ self.pos = _save
1684
+ break
1685
+ end
1686
+ @result = begin; create_item(:paragraph, c, content, raw:text) ; end
1687
+ _tmp = true
1688
+ unless _tmp
1689
+ self.pos = _save
1690
+ end
1691
+ break
1692
+ end # end sequence
1693
+
1694
+ set_failed_rule :_explicit_paragraph unless _tmp
1695
+ return _tmp
1696
+ end
1697
+
1698
+ # unordered_list = < unordered_item+:items > { create_item(:ul, nil, items, raw: text) }
1699
+ def _unordered_list
1700
+
1701
+ _save = self.pos
1702
+ while true # sequence
1703
+ _text_start = self.pos
1704
+ _save1 = self.pos
1705
+ _ary = []
1706
+ _tmp = apply(:_unordered_item)
1707
+ if _tmp
1346
1708
  _ary << @result
1347
1709
  while true
1348
1710
  _tmp = apply(:_unordered_item)
@@ -1656,7 +2018,7 @@ class ArtiMark::Parser < KPeg::CompiledParser
1656
2018
  return _tmp
1657
2019
  end
1658
2020
 
1659
- # line_command = < lh - !explicit_paragraph_command command:c ":" documentcontent?:content - le empty_line* > { create_item(:line_command, c, content, raw: text) }
2021
+ # line_command = < lh - !commandname_for_special_line_command command:c ":" documentcontent?:content - le empty_line* > { create_item(:line_command, c, content, raw: text) }
1660
2022
  def _line_command
1661
2023
 
1662
2024
  _save = self.pos
@@ -1676,7 +2038,7 @@ class ArtiMark::Parser < KPeg::CompiledParser
1676
2038
  break
1677
2039
  end
1678
2040
  _save2 = self.pos
1679
- _tmp = apply(:_explicit_paragraph_command)
2041
+ _tmp = apply(:_commandname_for_special_line_command)
1680
2042
  _tmp = _tmp ? nil : true
1681
2043
  self.pos = _save2
1682
2044
  unless _tmp
@@ -1699,28 +2061,404 @@ class ArtiMark::Parser < KPeg::CompiledParser
1699
2061
  @result = nil unless _tmp
1700
2062
  unless _tmp
1701
2063
  _tmp = true
1702
- self.pos = _save3
2064
+ self.pos = _save3
2065
+ end
2066
+ content = @result
2067
+ unless _tmp
2068
+ self.pos = _save1
2069
+ break
2070
+ end
2071
+ _tmp = apply(:__hyphen_)
2072
+ unless _tmp
2073
+ self.pos = _save1
2074
+ break
2075
+ end
2076
+ _tmp = apply(:_le)
2077
+ unless _tmp
2078
+ self.pos = _save1
2079
+ break
2080
+ end
2081
+ while true
2082
+ _tmp = apply(:_empty_line)
2083
+ break unless _tmp
2084
+ end
2085
+ _tmp = true
2086
+ unless _tmp
2087
+ self.pos = _save1
2088
+ end
2089
+ break
2090
+ end # end sequence
2091
+
2092
+ if _tmp
2093
+ text = get_text(_text_start)
2094
+ end
2095
+ unless _tmp
2096
+ self.pos = _save
2097
+ break
2098
+ end
2099
+ @result = begin; create_item(:line_command, c, content, raw: text) ; end
2100
+ _tmp = true
2101
+ unless _tmp
2102
+ self.pos = _save
2103
+ end
2104
+ break
2105
+ end # end sequence
2106
+
2107
+ set_failed_rule :_line_command unless _tmp
2108
+ return _tmp
2109
+ end
2110
+
2111
+ # line_block = (items_list | line_command)
2112
+ def _line_block
2113
+
2114
+ _save = self.pos
2115
+ while true # choice
2116
+ _tmp = apply(:_items_list)
2117
+ break if _tmp
2118
+ self.pos = _save
2119
+ _tmp = apply(:_line_command)
2120
+ break if _tmp
2121
+ self.pos = _save
2122
+ break
2123
+ end # end choice
2124
+
2125
+ set_failed_rule :_line_block unless _tmp
2126
+ return _tmp
2127
+ end
2128
+
2129
+ # block = (preformatted_block | headed_section | line_block | explicit_block | paragraph_group):block empty_line* {block}
2130
+ def _block
2131
+
2132
+ _save = self.pos
2133
+ while true # sequence
2134
+
2135
+ _save1 = self.pos
2136
+ while true # choice
2137
+ _tmp = apply(:_preformatted_block)
2138
+ break if _tmp
2139
+ self.pos = _save1
2140
+ _tmp = apply(:_headed_section)
2141
+ break if _tmp
2142
+ self.pos = _save1
2143
+ _tmp = apply(:_line_block)
2144
+ break if _tmp
2145
+ self.pos = _save1
2146
+ _tmp = apply(:_explicit_block)
2147
+ break if _tmp
2148
+ self.pos = _save1
2149
+ _tmp = apply(:_paragraph_group)
2150
+ break if _tmp
2151
+ self.pos = _save1
2152
+ break
2153
+ end # end choice
2154
+
2155
+ block = @result
2156
+ unless _tmp
2157
+ self.pos = _save
2158
+ break
2159
+ end
2160
+ while true
2161
+ _tmp = apply(:_empty_line)
2162
+ break unless _tmp
2163
+ end
2164
+ _tmp = true
2165
+ unless _tmp
2166
+ self.pos = _save
2167
+ break
2168
+ end
2169
+ @result = begin; block; end
2170
+ _tmp = true
2171
+ unless _tmp
2172
+ self.pos = _save
2173
+ end
2174
+ break
2175
+ end # end sequence
2176
+
2177
+ set_failed_rule :_block unless _tmp
2178
+ return _tmp
2179
+ end
2180
+
2181
+ # block_delimiter = (blockhead | blockend)
2182
+ def _block_delimiter
2183
+
2184
+ _save = self.pos
2185
+ while true # choice
2186
+ _tmp = apply(:_blockhead)
2187
+ break if _tmp
2188
+ self.pos = _save
2189
+ _tmp = apply(:_blockend)
2190
+ break if _tmp
2191
+ self.pos = _save
2192
+ break
2193
+ end # end choice
2194
+
2195
+ set_failed_rule :_block_delimiter unless _tmp
2196
+ return _tmp
2197
+ end
2198
+
2199
+ # paragraph_delimiter = (block_delimiter | preformatted_command_head | line_block | newpage | headed_start)
2200
+ def _paragraph_delimiter
2201
+
2202
+ _save = self.pos
2203
+ while true # choice
2204
+ _tmp = apply(:_block_delimiter)
2205
+ break if _tmp
2206
+ self.pos = _save
2207
+ _tmp = apply(:_preformatted_command_head)
2208
+ break if _tmp
2209
+ self.pos = _save
2210
+ _tmp = apply(:_line_block)
2211
+ break if _tmp
2212
+ self.pos = _save
2213
+ _tmp = apply(:_newpage)
2214
+ break if _tmp
2215
+ self.pos = _save
2216
+ _tmp = apply(:_headed_start)
2217
+ break if _tmp
2218
+ self.pos = _save
2219
+ break
2220
+ end # end choice
2221
+
2222
+ set_failed_rule :_paragraph_delimiter unless _tmp
2223
+ return _tmp
2224
+ end
2225
+
2226
+ # h_start_mark = < "="+ ":" > &{ text.length - 1 == n }
2227
+ def _h_start_mark(n)
2228
+
2229
+ _save = self.pos
2230
+ while true # sequence
2231
+ _text_start = self.pos
2232
+
2233
+ _save1 = self.pos
2234
+ while true # sequence
2235
+ _save2 = self.pos
2236
+ _tmp = match_string("=")
2237
+ if _tmp
2238
+ while true
2239
+ _tmp = match_string("=")
2240
+ break unless _tmp
2241
+ end
2242
+ _tmp = true
2243
+ else
2244
+ self.pos = _save2
2245
+ end
2246
+ unless _tmp
2247
+ self.pos = _save1
2248
+ break
2249
+ end
2250
+ _tmp = match_string(":")
2251
+ unless _tmp
2252
+ self.pos = _save1
2253
+ end
2254
+ break
2255
+ end # end sequence
2256
+
2257
+ if _tmp
2258
+ text = get_text(_text_start)
2259
+ end
2260
+ unless _tmp
2261
+ self.pos = _save
2262
+ break
2263
+ end
2264
+ _save3 = self.pos
2265
+ _tmp = begin; text.length - 1 == n ; end
2266
+ self.pos = _save3
2267
+ unless _tmp
2268
+ self.pos = _save
2269
+ end
2270
+ break
2271
+ end # end sequence
2272
+
2273
+ set_failed_rule :_h_start_mark unless _tmp
2274
+ return _tmp
2275
+ end
2276
+
2277
+ # h_markup_terminator = lh - < "="+ ":" > &{ text.length - 1 <= n }
2278
+ def _h_markup_terminator(n)
2279
+
2280
+ _save = self.pos
2281
+ while true # sequence
2282
+ _tmp = apply(:_lh)
2283
+ unless _tmp
2284
+ self.pos = _save
2285
+ break
2286
+ end
2287
+ _tmp = apply(:__hyphen_)
2288
+ unless _tmp
2289
+ self.pos = _save
2290
+ break
2291
+ end
2292
+ _text_start = self.pos
2293
+
2294
+ _save1 = self.pos
2295
+ while true # sequence
2296
+ _save2 = self.pos
2297
+ _tmp = match_string("=")
2298
+ if _tmp
2299
+ while true
2300
+ _tmp = match_string("=")
2301
+ break unless _tmp
2302
+ end
2303
+ _tmp = true
2304
+ else
2305
+ self.pos = _save2
2306
+ end
2307
+ unless _tmp
2308
+ self.pos = _save1
2309
+ break
2310
+ end
2311
+ _tmp = match_string(":")
2312
+ unless _tmp
2313
+ self.pos = _save1
2314
+ end
2315
+ break
2316
+ end # end sequence
2317
+
2318
+ if _tmp
2319
+ text = get_text(_text_start)
2320
+ end
2321
+ unless _tmp
2322
+ self.pos = _save
2323
+ break
2324
+ end
2325
+ _save3 = self.pos
2326
+ _tmp = begin; text.length - 1 <= n ; end
2327
+ self.pos = _save3
2328
+ unless _tmp
2329
+ self.pos = _save
2330
+ end
2331
+ break
2332
+ end # end sequence
2333
+
2334
+ set_failed_rule :_h_markup_terminator unless _tmp
2335
+ return _tmp
2336
+ end
2337
+
2338
+ # h_start = lh - h_start_mark(n) charstring:s le { { level: n, heading: s } }
2339
+ def _h_start(n)
2340
+
2341
+ _save = self.pos
2342
+ while true # sequence
2343
+ _tmp = apply(:_lh)
2344
+ unless _tmp
2345
+ self.pos = _save
2346
+ break
2347
+ end
2348
+ _tmp = apply(:__hyphen_)
2349
+ unless _tmp
2350
+ self.pos = _save
2351
+ break
2352
+ end
2353
+ _tmp = apply_with_args(:_h_start_mark, n)
2354
+ unless _tmp
2355
+ self.pos = _save
2356
+ break
2357
+ end
2358
+ _tmp = apply(:_charstring)
2359
+ s = @result
2360
+ unless _tmp
2361
+ self.pos = _save
2362
+ break
2363
+ end
2364
+ _tmp = apply(:_le)
2365
+ unless _tmp
2366
+ self.pos = _save
2367
+ break
2368
+ end
2369
+ @result = begin; { level: n, heading: s } ; end
2370
+ _tmp = true
2371
+ unless _tmp
2372
+ self.pos = _save
2373
+ end
2374
+ break
2375
+ end # end sequence
2376
+
2377
+ set_failed_rule :_h_start unless _tmp
2378
+ return _tmp
2379
+ end
2380
+
2381
+ # h_section = < h_start(n):h (!h_markup_terminator(n) !eof block)+:content > { create_item(:h_section, h, content, raw: text) }
2382
+ def _h_section(n)
2383
+
2384
+ _save = self.pos
2385
+ while true # sequence
2386
+ _text_start = self.pos
2387
+
2388
+ _save1 = self.pos
2389
+ while true # sequence
2390
+ _tmp = apply_with_args(:_h_start, n)
2391
+ h = @result
2392
+ unless _tmp
2393
+ self.pos = _save1
2394
+ break
2395
+ end
2396
+ _save2 = self.pos
2397
+ _ary = []
2398
+
2399
+ _save3 = self.pos
2400
+ while true # sequence
2401
+ _save4 = self.pos
2402
+ _tmp = apply_with_args(:_h_markup_terminator, n)
2403
+ _tmp = _tmp ? nil : true
2404
+ self.pos = _save4
2405
+ unless _tmp
2406
+ self.pos = _save3
2407
+ break
2408
+ end
2409
+ _save5 = self.pos
2410
+ _tmp = apply(:_eof)
2411
+ _tmp = _tmp ? nil : true
2412
+ self.pos = _save5
2413
+ unless _tmp
2414
+ self.pos = _save3
2415
+ break
2416
+ end
2417
+ _tmp = apply(:_block)
2418
+ unless _tmp
2419
+ self.pos = _save3
2420
+ end
2421
+ break
2422
+ end # end sequence
2423
+
2424
+ if _tmp
2425
+ _ary << @result
2426
+ while true
2427
+
2428
+ _save6 = self.pos
2429
+ while true # sequence
2430
+ _save7 = self.pos
2431
+ _tmp = apply_with_args(:_h_markup_terminator, n)
2432
+ _tmp = _tmp ? nil : true
2433
+ self.pos = _save7
2434
+ unless _tmp
2435
+ self.pos = _save6
2436
+ break
2437
+ end
2438
+ _save8 = self.pos
2439
+ _tmp = apply(:_eof)
2440
+ _tmp = _tmp ? nil : true
2441
+ self.pos = _save8
2442
+ unless _tmp
2443
+ self.pos = _save6
2444
+ break
2445
+ end
2446
+ _tmp = apply(:_block)
2447
+ unless _tmp
2448
+ self.pos = _save6
2449
+ end
2450
+ break
2451
+ end # end sequence
2452
+
2453
+ _ary << @result if _tmp
2454
+ break unless _tmp
2455
+ end
2456
+ _tmp = true
2457
+ @result = _ary
2458
+ else
2459
+ self.pos = _save2
1703
2460
  end
1704
2461
  content = @result
1705
- unless _tmp
1706
- self.pos = _save1
1707
- break
1708
- end
1709
- _tmp = apply(:__hyphen_)
1710
- unless _tmp
1711
- self.pos = _save1
1712
- break
1713
- end
1714
- _tmp = apply(:_le)
1715
- unless _tmp
1716
- self.pos = _save1
1717
- break
1718
- end
1719
- while true
1720
- _tmp = apply(:_empty_line)
1721
- break unless _tmp
1722
- end
1723
- _tmp = true
1724
2462
  unless _tmp
1725
2463
  self.pos = _save1
1726
2464
  end
@@ -1734,7 +2472,7 @@ class ArtiMark::Parser < KPeg::CompiledParser
1734
2472
  self.pos = _save
1735
2473
  break
1736
2474
  end
1737
- @result = begin; create_item(:line_command, c, content, raw: text) ; end
2475
+ @result = begin; create_item(:h_section, h, content, raw: text) ; end
1738
2476
  _tmp = true
1739
2477
  unless _tmp
1740
2478
  self.pos = _save
@@ -1742,107 +2480,67 @@ class ArtiMark::Parser < KPeg::CompiledParser
1742
2480
  break
1743
2481
  end # end sequence
1744
2482
 
1745
- set_failed_rule :_line_command unless _tmp
2483
+ set_failed_rule :_h_section unless _tmp
1746
2484
  return _tmp
1747
2485
  end
1748
2486
 
1749
- # line_block = (items_list | line_command)
1750
- def _line_block
2487
+ # headed_start = (h_start(1) | h_start(2) | h_start(3) | h_start(4) | h_start(5) | h_start(6))
2488
+ def _headed_start
1751
2489
 
1752
2490
  _save = self.pos
1753
2491
  while true # choice
1754
- _tmp = apply(:_items_list)
2492
+ _tmp = apply_with_args(:_h_start, 1)
1755
2493
  break if _tmp
1756
2494
  self.pos = _save
1757
- _tmp = apply(:_line_command)
2495
+ _tmp = apply_with_args(:_h_start, 2)
1758
2496
  break if _tmp
1759
2497
  self.pos = _save
1760
- break
1761
- end # end choice
1762
-
1763
- set_failed_rule :_line_block unless _tmp
1764
- return _tmp
1765
- end
1766
-
1767
- # block = (line_block | explicit_block | paragraph_group):block empty_line* {block}
1768
- def _block
1769
-
1770
- _save = self.pos
1771
- while true # sequence
1772
-
1773
- _save1 = self.pos
1774
- while true # choice
1775
- _tmp = apply(:_line_block)
1776
- break if _tmp
1777
- self.pos = _save1
1778
- _tmp = apply(:_explicit_block)
1779
- break if _tmp
1780
- self.pos = _save1
1781
- _tmp = apply(:_paragraph_group)
1782
- break if _tmp
1783
- self.pos = _save1
1784
- break
1785
- end # end choice
1786
-
1787
- block = @result
1788
- unless _tmp
1789
- self.pos = _save
1790
- break
1791
- end
1792
- while true
1793
- _tmp = apply(:_empty_line)
1794
- break unless _tmp
1795
- end
1796
- _tmp = true
1797
- unless _tmp
1798
- self.pos = _save
1799
- break
1800
- end
1801
- @result = begin; block; end
1802
- _tmp = true
1803
- unless _tmp
1804
- self.pos = _save
1805
- end
1806
- break
1807
- end # end sequence
1808
-
1809
- set_failed_rule :_block unless _tmp
1810
- return _tmp
1811
- end
1812
-
1813
- # block_delimiter = (blockhead | blockend)
1814
- def _block_delimiter
1815
-
1816
- _save = self.pos
1817
- while true # choice
1818
- _tmp = apply(:_blockhead)
2498
+ _tmp = apply_with_args(:_h_start, 3)
1819
2499
  break if _tmp
1820
2500
  self.pos = _save
1821
- _tmp = apply(:_blockend)
2501
+ _tmp = apply_with_args(:_h_start, 4)
2502
+ break if _tmp
2503
+ self.pos = _save
2504
+ _tmp = apply_with_args(:_h_start, 5)
2505
+ break if _tmp
2506
+ self.pos = _save
2507
+ _tmp = apply_with_args(:_h_start, 6)
1822
2508
  break if _tmp
1823
2509
  self.pos = _save
1824
2510
  break
1825
2511
  end # end choice
1826
2512
 
1827
- set_failed_rule :_block_delimiter unless _tmp
2513
+ set_failed_rule :_headed_start unless _tmp
1828
2514
  return _tmp
1829
2515
  end
1830
2516
 
1831
- # paragraph_delimiter = (block_delimiter | line_block)
1832
- def _paragraph_delimiter
2517
+ # headed_section = (h_section(1) | h_section(2) | h_section(3) | h_section(4) | h_section(5) | h_section(6))
2518
+ def _headed_section
1833
2519
 
1834
2520
  _save = self.pos
1835
2521
  while true # choice
1836
- _tmp = apply(:_block_delimiter)
2522
+ _tmp = apply_with_args(:_h_section, 1)
1837
2523
  break if _tmp
1838
2524
  self.pos = _save
1839
- _tmp = apply(:_line_block)
2525
+ _tmp = apply_with_args(:_h_section, 2)
2526
+ break if _tmp
2527
+ self.pos = _save
2528
+ _tmp = apply_with_args(:_h_section, 3)
2529
+ break if _tmp
2530
+ self.pos = _save
2531
+ _tmp = apply_with_args(:_h_section, 4)
2532
+ break if _tmp
2533
+ self.pos = _save
2534
+ _tmp = apply_with_args(:_h_section, 5)
2535
+ break if _tmp
2536
+ self.pos = _save
2537
+ _tmp = apply_with_args(:_h_section, 6)
1840
2538
  break if _tmp
1841
2539
  self.pos = _save
1842
2540
  break
1843
2541
  end # end choice
1844
2542
 
1845
- set_failed_rule :_paragraph_delimiter unless _tmp
2543
+ set_failed_rule :_headed_section unless _tmp
1846
2544
  return _tmp
1847
2545
  end
1848
2546
 
@@ -2038,7 +2736,71 @@ class ArtiMark::Parser < KPeg::CompiledParser
2038
2736
  return _tmp
2039
2737
  end
2040
2738
 
2041
- # header = (stylesheets | title | lang) empty_line*
2739
+ # paragraph_style = < lh - "paragraph-style:" !le charstring:l nl > { create_item(:paragraph_style, {:paragraph_style => l }, nil, raw:text) }
2740
+ def _paragraph_style
2741
+
2742
+ _save = self.pos
2743
+ while true # sequence
2744
+ _text_start = self.pos
2745
+
2746
+ _save1 = self.pos
2747
+ while true # sequence
2748
+ _tmp = apply(:_lh)
2749
+ unless _tmp
2750
+ self.pos = _save1
2751
+ break
2752
+ end
2753
+ _tmp = apply(:__hyphen_)
2754
+ unless _tmp
2755
+ self.pos = _save1
2756
+ break
2757
+ end
2758
+ _tmp = match_string("paragraph-style:")
2759
+ unless _tmp
2760
+ self.pos = _save1
2761
+ break
2762
+ end
2763
+ _save2 = self.pos
2764
+ _tmp = apply(:_le)
2765
+ _tmp = _tmp ? nil : true
2766
+ self.pos = _save2
2767
+ unless _tmp
2768
+ self.pos = _save1
2769
+ break
2770
+ end
2771
+ _tmp = apply(:_charstring)
2772
+ l = @result
2773
+ unless _tmp
2774
+ self.pos = _save1
2775
+ break
2776
+ end
2777
+ _tmp = apply(:_nl)
2778
+ unless _tmp
2779
+ self.pos = _save1
2780
+ end
2781
+ break
2782
+ end # end sequence
2783
+
2784
+ if _tmp
2785
+ text = get_text(_text_start)
2786
+ end
2787
+ unless _tmp
2788
+ self.pos = _save
2789
+ break
2790
+ end
2791
+ @result = begin; create_item(:paragraph_style, {:paragraph_style => l }, nil, raw:text) ; end
2792
+ _tmp = true
2793
+ unless _tmp
2794
+ self.pos = _save
2795
+ end
2796
+ break
2797
+ end # end sequence
2798
+
2799
+ set_failed_rule :_paragraph_style unless _tmp
2800
+ return _tmp
2801
+ end
2802
+
2803
+ # header = (stylesheets | title | lang | paragraph_style) empty_line*
2042
2804
  def _header
2043
2805
 
2044
2806
  _save = self.pos
@@ -2055,6 +2817,9 @@ class ArtiMark::Parser < KPeg::CompiledParser
2055
2817
  _tmp = apply(:_lang)
2056
2818
  break if _tmp
2057
2819
  self.pos = _save1
2820
+ _tmp = apply(:_paragraph_style)
2821
+ break if _tmp
2822
+ self.pos = _save1
2058
2823
  break
2059
2824
  end # end choice
2060
2825
 
@@ -2406,8 +3171,8 @@ class ArtiMark::Parser < KPeg::CompiledParser
2406
3171
  return _tmp
2407
3172
  end
2408
3173
 
2409
- # root = header*:headers - block*:blocks - eof_comment? eof { headers.concat blocks.select{ |x| !x.nil?} }
2410
- def _root
3174
+ # headers = header*:headers { create_item(:headers, nil, headers) }
3175
+ def _headers
2411
3176
 
2412
3177
  _save = self.pos
2413
3178
  while true # sequence
@@ -2424,6 +3189,29 @@ class ArtiMark::Parser < KPeg::CompiledParser
2424
3189
  self.pos = _save
2425
3190
  break
2426
3191
  end
3192
+ @result = begin; create_item(:headers, nil, headers) ; end
3193
+ _tmp = true
3194
+ unless _tmp
3195
+ self.pos = _save
3196
+ end
3197
+ break
3198
+ end # end sequence
3199
+
3200
+ set_failed_rule :_headers unless _tmp
3201
+ return _tmp
3202
+ end
3203
+
3204
+ # page = headers:headers - (!newpage block)*:blocks { create_item(:page, nil, [headers] + blocks.select{ |x| !x.nil?}) }
3205
+ def _page
3206
+
3207
+ _save = self.pos
3208
+ while true # sequence
3209
+ _tmp = apply(:_headers)
3210
+ headers = @result
3211
+ unless _tmp
3212
+ self.pos = _save
3213
+ break
3214
+ end
2427
3215
  _tmp = apply(:__hyphen_)
2428
3216
  unless _tmp
2429
3217
  self.pos = _save
@@ -2431,7 +3219,24 @@ class ArtiMark::Parser < KPeg::CompiledParser
2431
3219
  end
2432
3220
  _ary = []
2433
3221
  while true
2434
- _tmp = apply(:_block)
3222
+
3223
+ _save2 = self.pos
3224
+ while true # sequence
3225
+ _save3 = self.pos
3226
+ _tmp = apply(:_newpage)
3227
+ _tmp = _tmp ? nil : true
3228
+ self.pos = _save3
3229
+ unless _tmp
3230
+ self.pos = _save2
3231
+ break
3232
+ end
3233
+ _tmp = apply(:_block)
3234
+ unless _tmp
3235
+ self.pos = _save2
3236
+ end
3237
+ break
3238
+ end # end sequence
3239
+
2435
3240
  _ary << @result if _tmp
2436
3241
  break unless _tmp
2437
3242
  end
@@ -2442,16 +3247,81 @@ class ArtiMark::Parser < KPeg::CompiledParser
2442
3247
  self.pos = _save
2443
3248
  break
2444
3249
  end
3250
+ @result = begin; create_item(:page, nil, [headers] + blocks.select{ |x| !x.nil?}) ; end
3251
+ _tmp = true
3252
+ unless _tmp
3253
+ self.pos = _save
3254
+ end
3255
+ break
3256
+ end # end sequence
3257
+
3258
+ set_failed_rule :_page unless _tmp
3259
+ return _tmp
3260
+ end
3261
+
3262
+ # newpaged_page = newpage:newpage page:page { page[:children] = page[:children].unshift newpage; page }
3263
+ def _newpaged_page
3264
+
3265
+ _save = self.pos
3266
+ while true # sequence
3267
+ _tmp = apply(:_newpage)
3268
+ newpage = @result
3269
+ unless _tmp
3270
+ self.pos = _save
3271
+ break
3272
+ end
3273
+ _tmp = apply(:_page)
3274
+ page = @result
3275
+ unless _tmp
3276
+ self.pos = _save
3277
+ break
3278
+ end
3279
+ @result = begin; page[:children] = page[:children].unshift newpage; page ; end
3280
+ _tmp = true
3281
+ unless _tmp
3282
+ self.pos = _save
3283
+ end
3284
+ break
3285
+ end # end sequence
3286
+
3287
+ set_failed_rule :_newpaged_page unless _tmp
3288
+ return _tmp
3289
+ end
3290
+
3291
+ # root = page:page newpaged_page*:pages - eof_comment? eof { [ page ] + pages }
3292
+ def _root
3293
+
3294
+ _save = self.pos
3295
+ while true # sequence
3296
+ _tmp = apply(:_page)
3297
+ page = @result
3298
+ unless _tmp
3299
+ self.pos = _save
3300
+ break
3301
+ end
3302
+ _ary = []
3303
+ while true
3304
+ _tmp = apply(:_newpaged_page)
3305
+ _ary << @result if _tmp
3306
+ break unless _tmp
3307
+ end
3308
+ _tmp = true
3309
+ @result = _ary
3310
+ pages = @result
3311
+ unless _tmp
3312
+ self.pos = _save
3313
+ break
3314
+ end
2445
3315
  _tmp = apply(:__hyphen_)
2446
3316
  unless _tmp
2447
3317
  self.pos = _save
2448
3318
  break
2449
3319
  end
2450
- _save3 = self.pos
3320
+ _save2 = self.pos
2451
3321
  _tmp = apply(:_eof_comment)
2452
3322
  unless _tmp
2453
3323
  _tmp = true
2454
- self.pos = _save3
3324
+ self.pos = _save2
2455
3325
  end
2456
3326
  unless _tmp
2457
3327
  self.pos = _save
@@ -2462,7 +3332,7 @@ class ArtiMark::Parser < KPeg::CompiledParser
2462
3332
  self.pos = _save
2463
3333
  break
2464
3334
  end
2465
- @result = begin; headers.concat blocks.select{ |x| !x.nil?} ; end
3335
+ @result = begin; [ page ] + pages ; end
2466
3336
  _tmp = true
2467
3337
  unless _tmp
2468
3338
  self.pos = _save
@@ -2501,10 +3371,17 @@ class ArtiMark::Parser < KPeg::CompiledParser
2501
3371
  Rules[:_blockend] = rule_info("blockend", "lh - \"}\" - le empty_line*")
2502
3372
  Rules[:_blockbody] = rule_info("blockbody", "(!blockend block)+:body { body }")
2503
3373
  Rules[:_explicit_block] = rule_info("explicit_block", "< blockhead:head - blockbody:body - blockend > { create_item(:block, head, body, raw: text) }")
3374
+ Rules[:_preformatted_command] = rule_info("preformatted_command", "command:command &{ ['pre', 'precode'].include? command[:name] }")
3375
+ Rules[:_preformatted_command_head] = rule_info("preformatted_command_head", "lh - preformatted_command:command - \"<<\" &/[\\w0-9]/ { command }")
3376
+ Rules[:_preformat_end] = rule_info("preformat_end", "lh word:delimiter &{ delimiter == start }")
3377
+ Rules[:_preformatted_block] = rule_info("preformatted_block", "< lh - preformatted_command_head:command !nl word:delimiter nl (!preformat_end(delimiter) lh charstring nl)+:content preformat_end(delimiter) > { create_item(:preformatted, command, content, raw: text) }")
2504
3378
  Rules[:_inline] = rule_info("inline", "(img_inline | common_inline)")
2505
3379
  Rules[:_common_inline] = rule_info("common_inline", "< \"[\" command:c \"{\" documentcontent_except('}'):content \"}\" \"]\" > { create_item(:inline, c, content, raw: text) }")
2506
3380
  Rules[:_img_command] = rule_info("img_command", "command:c &{ c[:name] == 'img' && c[:args].size == 2}")
2507
3381
  Rules[:_img_inline] = rule_info("img_inline", "< \"[\" img_command:c \"]\" > { create_item(:inline, c, nil, raw: text) }")
3382
+ Rules[:_commandname_for_special_line_command] = rule_info("commandname_for_special_line_command", "(newpage_command | explicit_paragraph_command)")
3383
+ Rules[:_newpage_command] = rule_info("newpage_command", "command:command &{ command[:name] == 'newpage' }")
3384
+ Rules[:_newpage] = rule_info("newpage", "< lh - newpage_command:c \":\" documentcontent?:content - nl > { create_item(:newpage, c, content, raw:text) }")
2508
3385
  Rules[:_explicit_paragraph_command] = rule_info("explicit_paragraph_command", "command:c &{ c[:name] == 'p' }")
2509
3386
  Rules[:_explicit_paragraph] = rule_info("explicit_paragraph", "< lh - explicit_paragraph_command:c \":\" documentcontent?:content le empty_line* > { create_item(:paragraph, c, content, raw:text) }")
2510
3387
  Rules[:_unordered_list] = rule_info("unordered_list", "< unordered_item+:items > { create_item(:ul, nil, items, raw: text) }")
@@ -2514,15 +3391,22 @@ class ArtiMark::Parser < KPeg::CompiledParser
2514
3391
  Rules[:_definition_list] = rule_info("definition_list", "< definition_item+:items > { create_item(:dl, nil, items, raw: text) }")
2515
3392
  Rules[:_definition_item] = rule_info("definition_item", "< lh \";:\" - documentcontent_except(':'):term \":\" - documentcontent:definition le > { create_item(:dtdd, {:args => [term, definition]}, nil, raw: text) }")
2516
3393
  Rules[:_items_list] = rule_info("items_list", "(unordered_list | ordered_list | definition_list)")
2517
- Rules[:_line_command] = rule_info("line_command", "< lh - !explicit_paragraph_command command:c \":\" documentcontent?:content - le empty_line* > { create_item(:line_command, c, content, raw: text) }")
3394
+ Rules[:_line_command] = rule_info("line_command", "< lh - !commandname_for_special_line_command command:c \":\" documentcontent?:content - le empty_line* > { create_item(:line_command, c, content, raw: text) }")
2518
3395
  Rules[:_line_block] = rule_info("line_block", "(items_list | line_command)")
2519
- Rules[:_block] = rule_info("block", "(line_block | explicit_block | paragraph_group):block empty_line* {block}")
3396
+ Rules[:_block] = rule_info("block", "(preformatted_block | headed_section | line_block | explicit_block | paragraph_group):block empty_line* {block}")
2520
3397
  Rules[:_block_delimiter] = rule_info("block_delimiter", "(blockhead | blockend)")
2521
- Rules[:_paragraph_delimiter] = rule_info("paragraph_delimiter", "(block_delimiter | line_block)")
3398
+ Rules[:_paragraph_delimiter] = rule_info("paragraph_delimiter", "(block_delimiter | preformatted_command_head | line_block | newpage | headed_start)")
3399
+ Rules[:_h_start_mark] = rule_info("h_start_mark", "< \"=\"+ \":\" > &{ text.length - 1 == n }")
3400
+ Rules[:_h_markup_terminator] = rule_info("h_markup_terminator", "lh - < \"=\"+ \":\" > &{ text.length - 1 <= n }")
3401
+ Rules[:_h_start] = rule_info("h_start", "lh - h_start_mark(n) charstring:s le { { level: n, heading: s } }")
3402
+ Rules[:_h_section] = rule_info("h_section", "< h_start(n):h (!h_markup_terminator(n) !eof block)+:content > { create_item(:h_section, h, content, raw: text) }")
3403
+ Rules[:_headed_start] = rule_info("headed_start", "(h_start(1) | h_start(2) | h_start(3) | h_start(4) | h_start(5) | h_start(6))")
3404
+ Rules[:_headed_section] = rule_info("headed_section", "(h_section(1) | h_section(2) | h_section(3) | h_section(4) | h_section(5) | h_section(6))")
2522
3405
  Rules[:_stylesheets] = rule_info("stylesheets", "< lh - \"stylesheets:\" !le charstring:s nl > { create_item(:stylesheets, {:stylesheets => s.split(',').map(&:strip)}, nil, raw:text) }")
2523
3406
  Rules[:_title] = rule_info("title", "< lh - \"title:\" !le charstring:t nl > { create_item(:title, {:title => t }, nil, raw:text) }")
2524
3407
  Rules[:_lang] = rule_info("lang", "< lh - \"lang:\" !le charstring:l nl > { create_item(:lang, {:lang => l }, nil, raw:text) }")
2525
- Rules[:_header] = rule_info("header", "(stylesheets | title | lang) empty_line*")
3408
+ Rules[:_paragraph_style] = rule_info("paragraph_style", "< lh - \"paragraph-style:\" !le charstring:l nl > { create_item(:paragraph_style, {:paragraph_style => l }, nil, raw:text) }")
3409
+ Rules[:_header] = rule_info("header", "(stylesheets | title | lang | paragraph_style) empty_line*")
2526
3410
  Rules[:_char] = rule_info("char", "< /[[:print:]]/ > { text }")
2527
3411
  Rules[:_charstring] = rule_info("charstring", "< char* > { text }")
2528
3412
  Rules[:_char_except] = rule_info("char_except", "char:c &{ c != e }")
@@ -2530,6 +3414,9 @@ class ArtiMark::Parser < KPeg::CompiledParser
2530
3414
  Rules[:_documentcontent_except] = rule_info("documentcontent_except", "(inline | !inline char_except(e))+:content {parse_text(content)}")
2531
3415
  Rules[:_documentcontent] = rule_info("documentcontent", "(inline | !inline char)+:content {parse_text(content)}")
2532
3416
  Rules[:_documentline] = rule_info("documentline", "lh documentcontent:content le { content }")
2533
- Rules[:_root] = rule_info("root", "header*:headers - block*:blocks - eof_comment? eof { headers.concat blocks.select{ |x| !x.nil?} }")
3417
+ Rules[:_headers] = rule_info("headers", "header*:headers { create_item(:headers, nil, headers) }")
3418
+ Rules[:_page] = rule_info("page", "headers:headers - (!newpage block)*:blocks { create_item(:page, nil, [headers] + blocks.select{ |x| !x.nil?}) }")
3419
+ Rules[:_newpaged_page] = rule_info("newpaged_page", "newpage:newpage page:page { page[:children] = page[:children].unshift newpage; page }")
3420
+ Rules[:_root] = rule_info("root", "page:page newpaged_page*:pages - eof_comment? eof { [ page ] + pages }")
2534
3421
  # :startdoc:
2535
3422
  end