arti_mark 0.1.beta3 → 0.1.beta5

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.
@@ -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