mediacloth 0.0.3 → 0.5

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.
Files changed (115) hide show
  1. data/README.md +36 -0
  2. data/lib/mediacloth/mediawikiast.rb +58 -1
  3. data/lib/mediacloth/mediawikihtmlgenerator.rb +229 -73
  4. data/lib/mediacloth/mediawikilexer.rb +1030 -656
  5. data/lib/mediacloth/mediawikilinkhandler.rb +89 -0
  6. data/lib/mediacloth/mediawikiparams.rb +1 -10
  7. data/lib/mediacloth/mediawikiparser.rb +939 -409
  8. data/lib/mediacloth/mediawikiparser.tab.rb +1357 -0
  9. data/lib/mediacloth/mediawikiparser.y +256 -52
  10. data/lib/mediacloth/mediawikisignedwikigenerator.rb +42 -0
  11. data/lib/mediacloth/mediawikitemplatehandler.rb +8 -0
  12. data/lib/mediacloth/mediawikiwalker.rb +72 -1
  13. data/lib/mediacloth.rb +33 -10
  14. data/test/data/ast1 +68 -0
  15. data/test/data/ast10 +196 -0
  16. data/test/data/ast11 +34 -0
  17. data/test/data/ast12 +39 -0
  18. data/test/data/ast13 +25 -0
  19. data/test/data/ast14 +13 -0
  20. data/test/data/ast15 +25 -0
  21. data/test/data/ast16 +17 -0
  22. data/test/data/ast17 +9 -0
  23. data/test/data/ast18 +21 -0
  24. data/test/data/ast19 +32 -0
  25. data/test/data/ast2 +4 -0
  26. data/test/data/ast20 +10 -0
  27. data/test/data/ast21 +27 -0
  28. data/test/data/ast22 +22 -0
  29. data/test/data/ast23 +5 -0
  30. data/test/data/ast3 +6 -0
  31. data/test/data/ast4 +122 -0
  32. data/test/data/ast5 +122 -0
  33. data/test/data/ast6 +22 -0
  34. data/test/data/ast7 +143 -0
  35. data/test/data/ast8 +3 -0
  36. data/test/data/ast9 +11 -0
  37. data/test/data/html1 +33 -5
  38. data/test/data/html10 +31 -27
  39. data/test/data/html11 +19 -0
  40. data/test/data/html12 +32 -0
  41. data/test/data/html13 +29 -0
  42. data/test/data/html14 +4 -0
  43. data/test/data/html15 +29 -0
  44. data/test/data/html16 +28 -0
  45. data/test/data/html17 +10 -0
  46. data/test/data/html18 +8 -0
  47. data/test/data/html19 +27 -0
  48. data/test/data/html2 +1 -1
  49. data/test/data/html20 +7 -0
  50. data/test/data/html21 +5 -0
  51. data/test/data/html22 +24 -0
  52. data/test/data/html23 +7 -0
  53. data/test/data/html3 +1 -1
  54. data/test/data/html4 +60 -11
  55. data/test/data/html5 +45 -6
  56. data/test/data/html6 +5 -5
  57. data/test/data/html7 +59 -1
  58. data/test/data/html8 +1 -1
  59. data/test/data/html9 +10 -2
  60. data/test/data/input1 +4 -0
  61. data/test/data/input11 +19 -0
  62. data/test/data/input12 +32 -0
  63. data/test/data/input13 +10 -0
  64. data/test/data/input14 +8 -0
  65. data/test/data/input15 +10 -0
  66. data/test/data/input16 +28 -0
  67. data/test/data/input17 +10 -0
  68. data/test/data/input18 +16 -0
  69. data/test/data/input19 +29 -0
  70. data/test/data/input20 +8 -0
  71. data/test/data/input21 +18 -0
  72. data/test/data/input22 +20 -0
  73. data/test/data/input23 +8 -0
  74. data/test/data/input4 +13 -1
  75. data/test/data/input5 +45 -4
  76. data/test/data/input7 +25 -1
  77. data/test/data/lex1 +17 -18
  78. data/test/data/lex10 +57 -87
  79. data/test/data/lex11 +18 -0
  80. data/test/data/lex12 +32 -0
  81. data/test/data/lex13 +3 -0
  82. data/test/data/lex14 +1 -0
  83. data/test/data/lex15 +3 -0
  84. data/test/data/lex16 +27 -0
  85. data/test/data/lex17 +9 -0
  86. data/test/data/lex18 +4 -0
  87. data/test/data/lex19 +27 -0
  88. data/test/data/lex2 +2 -2
  89. data/test/data/lex20 +7 -0
  90. data/test/data/lex21 +4 -0
  91. data/test/data/lex22 +3 -0
  92. data/test/data/lex23 +7 -0
  93. data/test/data/lex3 +1 -1
  94. data/test/data/lex4 +35 -29
  95. data/test/data/lex5 +57 -18
  96. data/test/data/lex6 +7 -7
  97. data/test/data/lex7 +42 -18
  98. data/test/data/lex8 +1 -1
  99. data/test/data/lex9 +6 -6
  100. data/test/dataproducers/ast.rb +24 -0
  101. data/test/dataproducers/html.rb +11 -12
  102. data/test/dataproducers/lex.rb +9 -4
  103. data/test/debugwalker.rb +25 -11
  104. data/test/htmlgenerator.rb +170 -13
  105. data/test/lexer.rb +626 -83
  106. data/test/linkhandler.rb +39 -0
  107. data/test/parser.rb +176 -9
  108. data/test/signedwikigenerator.rb +113 -0
  109. metadata +158 -79
  110. data/README +0 -37
  111. data/lib/mediacloth/mediawikilexer.rb~ +0 -491
  112. data/lib/mediacloth/mediawikiparser.y~ +0 -210
  113. data/test/data/result1 +0 -48
  114. data/test/dataproducers/html.rb~ +0 -24
  115. data/test/dataproducers/lex.rb~ +0 -15
@@ -8,13 +8,14 @@
8
8
  # parser.parse(input)
9
9
  class MediaWikiParser
10
10
 
11
- token BOLDSTART BOLDEND ITALICSTART ITALICEND LINKSTART LINKEND LINKSEP
12
- INTLINKSTART INTLINKEND INTLINKSEP RESOURCE_SEP
13
- SECTION_START SECTION_END TEXT PRE
14
- HLINE SIGNATURE_NAME SIGNATURE_DATE SIGNATURE_FULL
15
- UL_START UL_END LI_START LI_END OL_START OL_END
11
+ token TEXT BOLD_START BOLD_END ITALIC_START ITALIC_END LINK_START LINK_END LINKSEP
12
+ INTLINK_START INTLINK_END INTLINKSEP RESOURCESEP CHAR_ENT
13
+ PRE_START PRE_END PREINDENT_START PREINDENT_END
14
+ SECTION_START SECTION_END HLINE SIGNATURE_NAME SIGNATURE_DATE SIGNATURE_FULL
15
+ PARA_START PARA_END UL_START UL_END OL_START OL_END LI_START LI_END
16
+ DL_START DL_END DT_START DT_END DD_START DD_END TAG_START TAG_END ATTR_NAME ATTR_VALUE
16
17
  TABLE_START TABLE_END ROW_START ROW_END HEAD_START HEAD_END CELL_START CELL_END
17
- PARA_START PARA_END
18
+ KEYWORD TEMPLATE_START TEMPLATE_END CATEGORY PASTE_START PASTE_END
18
19
 
19
20
 
20
21
  rule
@@ -22,7 +23,7 @@ rule
22
23
  wiki:
23
24
  repeated_contents
24
25
  {
25
- @nodes.push WikiAST.new
26
+ @nodes.push WikiAST.new(0, @wiki_ast_length)
26
27
  #@nodes.last.children.insert(0, val[0])
27
28
  #puts val[0]
28
29
  @nodes.last.children += val[0]
@@ -42,50 +43,87 @@ contents:
42
43
  {
43
44
  result = val[0]
44
45
  }
46
+ | dictionary_list
47
+ {
48
+ list = ListAST.new(@ast_index, @ast_length)
49
+ list.list_type = :Dictionary
50
+ list.children = val[0]
51
+ result = list
52
+ }
45
53
  | preformatted
46
54
  {
47
- p = PreformattedAST.new
48
- p.contents = val[0]
49
- result = p
55
+ result = val[0]
50
56
  }
51
57
  | section
52
58
  {
53
59
  result = val[0]
54
60
  }
61
+ | tag
62
+ {
63
+ result = val[0]
64
+ }
65
+ | template
66
+ {
67
+ result = val[0]
68
+ }
69
+ | KEYWORD
70
+ {
71
+ k = KeywordAST.new(@ast_index, @ast_length)
72
+ k.text = val[0]
73
+ result = k
74
+ }
55
75
  | PARA_START para_contents PARA_END
56
76
  {
57
- if val[1]
58
- p = ParagraphAST.new
59
- p.children = val[1]
60
- result = p
61
- end
77
+ p = ParagraphAST.new(@ast_index, @ast_length)
78
+ p.children = val[1]
79
+ result = p
62
80
  }
63
- | LINKSTART link_contents LINKEND
81
+ | LINK_START link_contents LINK_END
64
82
  {
65
- l = LinkAST.new
83
+ l = LinkAST.new(@ast_index, @ast_length)
84
+ l.link_type = val[0]
66
85
  l.url = val[1][0]
67
86
  l.children += val[1][1..-1] if val[1].length > 1
68
87
  result = l
69
88
  }
70
- | INTLINKSTART TEXT RESOURCE_SEP TEXT reslink_repeated_contents INTLINKEND
89
+ | PASTE_START para_contents PASTE_END
90
+ {
91
+ p = PasteAST.new(@ast_index, @ast_length)
92
+ p.children = val[1]
93
+ result = p
94
+ }
95
+ | INTLINK_START TEXT RESOURCESEP TEXT reslink_repeated_contents INTLINK_END
71
96
  {
72
- l = ResourceLinkAST.new
97
+ l = ResourceLinkAST.new(@ast_index, @ast_length)
73
98
  l.prefix = val[1]
74
99
  l.locator = val[3]
75
100
  l.children = val[4] unless val[4].nil? or val[4].empty?
76
101
  result = l
77
102
  }
78
- | INTLINKSTART TEXT intlink_repeated_contents INTLINKEND
103
+ | INTLINK_START TEXT intlink_repeated_contents INTLINK_END
79
104
  {
80
- l = InternalLinkAST.new
105
+ l = InternalLinkAST.new(@ast_index, @ast_length)
81
106
  l.locator = val[1]
82
107
  l.children = val[2] unless val[2].nil? or val[2].empty?
83
108
  result = l
84
109
  }
110
+ | INTLINK_START CATEGORY TEXT cat_sort_contents INTLINK_END
111
+ {
112
+ l = CategoryAST.new(@ast_index, @ast_length)
113
+ l.locator = val[2]
114
+ l.sort_as = val[3]
115
+ result = l
116
+ }
117
+ | INTLINK_START RESOURCESEP CATEGORY TEXT intlink_repeated_contents INTLINK_END
118
+ {
119
+ l = CategoryLinkAST.new(@ast_index, @ast_length)
120
+ l.locator = val[3]
121
+ l.children = val[4] unless val[4].nil? or val[4].empty?
122
+ result = l
123
+ }
85
124
  | table
86
125
  ;
87
126
 
88
- #TODO: remove empty paragraphs in lexer
89
127
  para_contents:
90
128
  {
91
129
  result = nil
@@ -96,6 +134,49 @@ para_contents:
96
134
  }
97
135
  ;
98
136
 
137
+ tag:
138
+ TAG_START tag_attributes TAG_END
139
+ {
140
+ if val[0] != val[2]
141
+ raise Racc::ParseError.new("XHTML end tag #{val[2]} does not match start tag #{val[0]}")
142
+ end
143
+ elem = ElementAST.new(@ast_index, @ast_length)
144
+ elem.name = val[0]
145
+ elem.attributes = val[1]
146
+ result = elem
147
+ }
148
+ | TAG_START tag_attributes repeated_contents TAG_END
149
+ {
150
+ if val[0] != val[3]
151
+ raise Racc::ParseError.new("XHTML end tag #{val[3]} does not match start tag #{val[0]}")
152
+ end
153
+ elem = ElementAST.new(@ast_index, @ast_length)
154
+ elem.name = val[0]
155
+ elem.attributes = val[1]
156
+ elem.children += val[2]
157
+ result = elem
158
+ }
159
+ ;
160
+
161
+ tag_attributes:
162
+ {
163
+ result = nil
164
+ }
165
+ | ATTR_NAME tag_attributes
166
+ {
167
+ attr_map = val[2] ? val[2] : {}
168
+ attr_map[val[0]] = true
169
+ result = attr_map
170
+ }
171
+ | ATTR_NAME ATTR_VALUE tag_attributes
172
+ {
173
+ attr_map = val[2] ? val[2] : {}
174
+ attr_map[val[0]] = val[1]
175
+ result = attr_map
176
+ }
177
+ ;
178
+
179
+
99
180
  link_contents:
100
181
  TEXT
101
182
  {
@@ -132,6 +213,16 @@ intlink_repeated_contents:
132
213
  }
133
214
  ;
134
215
 
216
+ cat_sort_contents:
217
+ {
218
+ result = nil
219
+ }
220
+ | INTLINKSEP TEXT
221
+ {
222
+ result = val[1]
223
+ }
224
+ ;
225
+
135
226
  reslink_repeated_contents:
136
227
  {
137
228
  result = nil
@@ -142,7 +233,7 @@ reslink_repeated_contents:
142
233
  }
143
234
  | INTLINKSEP repeated_contents reslink_repeated_contents
144
235
  {
145
- i = InternalLinkItemAST.new
236
+ i = InternalLinkItemAST.new(@ast_index, @ast_length)
146
237
  i.children = val[1]
147
238
  result = [i]
148
239
  result += val[2] if val[2]
@@ -164,7 +255,7 @@ repeated_contents: contents
164
255
 
165
256
  text: element
166
257
  {
167
- p = TextAST.new
258
+ p = TextAST.new(@ast_index, @ast_length)
168
259
  p.formatting = val[0][0]
169
260
  p.contents = val[0][1]
170
261
  result = p
@@ -178,13 +269,13 @@ text: element
178
269
  table:
179
270
  TABLE_START table_contents TABLE_END
180
271
  {
181
- table = TableAST.new
272
+ table = TableAST.new(@ast_index, @ast_length)
182
273
  table.children = val[1] unless val[1].nil? or val[1].empty?
183
274
  result = table
184
275
  }
185
276
  | TABLE_START TEXT table_contents TABLE_END
186
277
  {
187
- table = TableAST.new
278
+ table = TableAST.new(@ast_index, @ast_length)
188
279
  table.options = val[1]
189
280
  table.children = val[2] unless val[2].nil? or val[2].empty?
190
281
  result = table
@@ -196,14 +287,14 @@ table_contents:
196
287
  }
197
288
  | ROW_START row_contents ROW_END table_contents
198
289
  {
199
- row = TableRowAST.new
290
+ row = TableRowAST.new(@ast_index, @ast_length)
200
291
  row.children = val[1] unless val[1].nil? or val[1].empty?
201
292
  result = [row]
202
293
  result += val[3] unless val[3].nil? or val[3].empty?
203
294
  }
204
295
  | ROW_START TEXT row_contents ROW_END table_contents
205
296
  {
206
- row = TableRowAST.new
297
+ row = TableRowAST.new(@ast_index, @ast_length)
207
298
  row.children = val[2] unless val[2].nil? or val[2].empty?
208
299
  row.options = val[1]
209
300
  result = [row]
@@ -216,14 +307,14 @@ row_contents:
216
307
  }
217
308
  | HEAD_START HEAD_END row_contents
218
309
  {
219
- cell = TableCellAST.new
310
+ cell = TableCellAST.new(@ast_index, @ast_length)
220
311
  cell.type = :head
221
312
  result = [cell]
222
313
  result += val[2] unless val[2].nil? or val[2].empty?
223
314
  }
224
315
  | HEAD_START repeated_contents HEAD_END row_contents
225
316
  {
226
- cell = TableCellAST.new
317
+ cell = TableCellAST.new(@ast_index, @ast_length)
227
318
  cell.children = val[1] unless val[1].nil? or val[1].empty?
228
319
  cell.type = :head
229
320
  result = [cell]
@@ -231,26 +322,36 @@ row_contents:
231
322
  }
232
323
  | CELL_START CELL_END row_contents
233
324
  {
234
- cell = TableCellAST.new
325
+ cell = TableCellAST.new(@ast_index, @ast_length)
235
326
  cell.type = :body
236
327
  result = [cell]
237
328
  result += val[2] unless val[2].nil? or val[2].empty?
238
329
  }
239
330
  | CELL_START repeated_contents CELL_END row_contents
240
331
  {
241
- cell = TableCellAST.new
242
- cell.children = val[1] unless val[1].nil? or val[1].empty?
243
- cell.type = :body
244
- result = [cell]
332
+ if val[2] == 'attributes'
333
+ result = []
334
+ else
335
+ cell = TableCellAST.new(@ast_index, @ast_length)
336
+ cell.children = val[1] unless val[1].nil? or val[1].empty?
337
+ cell.type = :body
338
+ result = [cell]
339
+ end
245
340
  result += val[3] unless val[3].nil? or val[3].empty?
341
+ if val[2] == 'attributes' and val[3] and val[3].first.class == TableCellAST
342
+ val[3].first.attributes = val[1]
343
+ end
344
+ result
246
345
  }
247
-
346
+
248
347
 
249
348
  element:
250
349
  TEXT
251
350
  { return [:None, val[0]] }
252
351
  | HLINE
253
352
  { return [:HLine, val[0]] }
353
+ | CHAR_ENT
354
+ { return [:CharacterEntity, val[0]] }
254
355
  | SIGNATURE_DATE
255
356
  { return [:SignatureDate, val[0]] }
256
357
  | SIGNATURE_NAME
@@ -260,28 +361,28 @@ element:
260
361
  ;
261
362
 
262
363
  formatted_element:
263
- BOLDSTART BOLDEND
364
+ BOLD_START BOLD_END
264
365
  {
265
- result = FormattedAST.new
366
+ result = FormattedAST.new(@ast_index, @ast_length)
266
367
  result.formatting = :Bold
267
368
  result
268
369
  }
269
- | ITALICSTART ITALICEND
370
+ | ITALIC_START ITALIC_END
270
371
  {
271
- result = FormattedAST.new
372
+ result = FormattedAST.new(@ast_index, @ast_length)
272
373
  result.formatting = :Italic
273
374
  result
274
375
  }
275
- | BOLDSTART repeated_contents BOLDEND
376
+ | BOLD_START repeated_contents BOLD_END
276
377
  {
277
- p = FormattedAST.new
378
+ p = FormattedAST.new(@ast_index, @ast_length)
278
379
  p.formatting = :Bold
279
380
  p.children += val[1]
280
381
  result = p
281
382
  }
282
- | ITALICSTART repeated_contents ITALICEND
383
+ | ITALIC_START repeated_contents ITALIC_END
283
384
  {
284
- p = FormattedAST.new
385
+ p = FormattedAST.new(@ast_index, @ast_length)
285
386
  p.formatting = :Italic
286
387
  p.children += val[1]
287
388
  result = p
@@ -290,7 +391,7 @@ formatted_element:
290
391
 
291
392
  bulleted_list: UL_START list_item list_contents UL_END
292
393
  {
293
- list = ListAST.new
394
+ list = ListAST.new(@ast_index, @ast_length)
294
395
  list.list_type = :Bulleted
295
396
  list.children << val[1]
296
397
  list.children += val[2]
@@ -300,7 +401,7 @@ bulleted_list: UL_START list_item list_contents UL_END
300
401
 
301
402
  numbered_list: OL_START list_item list_contents OL_END
302
403
  {
303
- list = ListAST.new
404
+ list = ListAST.new(@ast_index, @ast_length)
304
405
  list.list_type = :Numbered
305
406
  list.children << val[1]
306
407
  list.children += val[2]
@@ -322,29 +423,116 @@ list_contents:
322
423
  list_item:
323
424
  LI_START LI_END
324
425
  {
325
- result = ListItemAST.new
426
+ result = ListItemAST.new(@ast_index, @ast_length)
326
427
  }
327
428
  | LI_START repeated_contents LI_END
328
429
  {
329
- li = ListItemAST.new
430
+ li = ListItemAST.new(@ast_index, @ast_length)
330
431
  li.children += val[1]
331
432
  result = li
332
433
  }
333
434
  ;
334
435
 
335
- preformatted: PRE
336
- { result = val[0] }
436
+ dictionary_list:
437
+ DL_START dictionary_term dictionary_contents DL_END
438
+ {
439
+ result = [val[1]]
440
+ result += val[2]
441
+ }
442
+ | DL_START dictionary_contents DL_END
443
+ {
444
+ result = val[1]
445
+ }
446
+ ;
447
+
448
+ dictionary_term:
449
+ DT_START DT_END
450
+ {
451
+ result = ListTermAST.new(@ast_index, @ast_length)
452
+ }
453
+ | DT_START repeated_contents DT_END
454
+ {
455
+ term = ListTermAST.new(@ast_index, @ast_length)
456
+ term.children += val[1]
457
+ result = term
458
+ }
459
+
460
+ dictionary_contents:
461
+ dictionary_definition dictionary_contents
462
+ {
463
+ result = [val[0]]
464
+ result += val[1] if val[1]
465
+ }
466
+ |
467
+ {
468
+ result = []
469
+ }
470
+
471
+ dictionary_definition:
472
+ DD_START DD_END
473
+ {
474
+ result = ListDefinitionAST.new(@ast_index, @ast_length)
475
+ }
476
+ | DD_START repeated_contents DD_END
477
+ {
478
+ term = ListDefinitionAST.new(@ast_index, @ast_length)
479
+ term.children += val[1]
480
+ result = term
481
+ }
482
+
483
+ preformatted: PRE_START repeated_contents PRE_END
484
+ {
485
+ p = PreformattedAST.new(@ast_index, @ast_length)
486
+ p.children += val[1]
487
+ result = p
488
+ }
489
+ | PREINDENT_START repeated_contents PREINDENT_END
490
+ {
491
+ p = PreformattedAST.new(@ast_index, @ast_length)
492
+ p.indented = true
493
+ p.children += val[1]
494
+ result = p
495
+ }
337
496
  ;
338
497
 
339
498
  section: SECTION_START repeated_contents SECTION_END
340
499
  { result = [val[1], val[0].length]
341
- s = SectionAST.new
500
+ s = SectionAST.new(@ast_index, @ast_length)
342
501
  s.children = val[1]
343
502
  s.level = val[0].length
344
503
  result = s
345
504
  }
346
505
  ;
347
506
 
507
+ template: TEMPLATE_START TEXT template_parameters TEMPLATE_END
508
+ {
509
+ t = TemplateAST.new(@ast_index, @ast_length)
510
+ t.template_name = val[1]
511
+ t.children = val[2] unless val[2].nil? or val[2].empty?
512
+ result = t
513
+ }
514
+ ;
515
+
516
+ template_parameters:
517
+ {
518
+ result = nil
519
+ }
520
+ | INTLINKSEP TEXT template_parameters
521
+ {
522
+ p = TemplateParameterAST.new(@ast_index, @ast_length)
523
+ p.parameter_value = val[1]
524
+ result = [p]
525
+ result += val[2] if val[2]
526
+ }
527
+ | INTLINKSEP template template_parameters
528
+ {
529
+ p = TemplateParameterAST.new(@ast_index, @ast_length)
530
+ p.children << val[1]
531
+ result = [p]
532
+ result += val[2] if val[2]
533
+ }
534
+ ;
535
+
348
536
  end
349
537
 
350
538
  ---- header ----
@@ -356,6 +544,8 @@ attr_accessor :lexer
356
544
 
357
545
  def initialize
358
546
  @nodes = []
547
+ @context = []
548
+ @wiki_ast_length = 0
359
549
  super
360
550
  end
361
551
 
@@ -369,5 +559,19 @@ end
369
559
 
370
560
  #Asks the lexer to return the next token.
371
561
  def next_token
372
- return @lexer.lex
562
+ token = @lexer.lex
563
+ if token[0].to_s.upcase.include? "_START"
564
+ @context << token[2..3]
565
+ elsif token[0].to_s.upcase.include? "_END"
566
+ @ast_index = @context.last[0]
567
+ @ast_length = token[2] + token[3] - @context.last[0]
568
+ @context.pop
569
+ else
570
+ @ast_index = token[2]
571
+ @ast_length = token[3]
572
+ end
573
+
574
+ @wiki_ast_length += token[3]
575
+
576
+ return token[0..1]
373
577
  end
@@ -0,0 +1,42 @@
1
+ require 'mediacloth/mediawikiwalker'
2
+ require 'mediacloth/mediawikiparams'
3
+
4
+ class MediaWikiSignedWikiGenerator < MediaWikiWalker
5
+
6
+ attr_reader :signed_wiki
7
+
8
+ def parse(ast, wiki)
9
+ @signed_wiki = wiki
10
+ #For supporting multiple signatures in wiki
11
+ @index_inc = 0
12
+ super(ast)
13
+ end
14
+
15
+ protected
16
+
17
+ def parse_wiki_ast(ast)
18
+ super(ast).join
19
+ end
20
+
21
+ def parse_text(ast)
22
+ if ast.formatting
23
+ case(ast.formatting)
24
+ when :SignatureDate then
25
+ signature = @params.time
26
+ @signed_wiki[ast.index + @index_inc, ast.length] = signature
27
+ @index_inc += signature.length - ast.length
28
+ when :SignatureName then
29
+ signature = "[[User:#{@params.author}|#{@params.author}]]"
30
+ @signed_wiki[ast.index + @index_inc, ast.length] = signature
31
+ @index_inc += signature.length - ast.length
32
+ when :SignatureFull then
33
+ signature = "[[User:#{@params.author}|#{@params.author}]] #{@params.time}"
34
+ @signed_wiki[ast.index + @index_inc, ast.length] = signature
35
+ @index_inc += signature.length - ast.length
36
+ end
37
+ else
38
+ ast.contents
39
+ end
40
+ end
41
+
42
+ end
@@ -0,0 +1,8 @@
1
+ class MediaWikiTemplateHandler
2
+
3
+ def included_template(name, parameters)
4
+ serialized_parameters = "|" + parameters.join('|') if parameters and !parameters.empty?
5
+ "{{#{name}#{serialized_parameters}}}"
6
+ end
7
+
8
+ end
@@ -1,4 +1,5 @@
1
1
  require 'mediacloth/mediawikiast'
2
+ require 'mediacloth/mediawikiparams'
2
3
 
3
4
  #Default walker to traverse the parse tree.
4
5
  #
@@ -14,6 +15,27 @@ class MediaWikiWalker
14
15
  def parse(ast)
15
16
  parse_wiki_ast(ast)
16
17
  end
18
+
19
+ #Set generator's URL handler.
20
+ def link_handler=(handler)
21
+ @link_handler = handler
22
+ end
23
+
24
+ #Returns's this generator URL handler. If no handler was set, returns the
25
+ #default handler.
26
+ def link_handler
27
+ @link_handler ||= MediaWikiLinkHandler.new
28
+ end
29
+
30
+ attr_writer :template_handler
31
+ def template_handler
32
+ @template_handler ||= MediaWikiTemplateHandler.new
33
+ end
34
+
35
+ attr_writer :params
36
+ def params
37
+ @params ||= MediaWikiParams.new
38
+ end
17
39
 
18
40
  protected
19
41
 
@@ -28,13 +50,19 @@ protected
28
50
  r = parse_preformatted(c) if c.class == PreformattedAST
29
51
  r = parse_section(c) if c.class == SectionAST
30
52
  r = parse_paragraph(c) if c.class == ParagraphAST
53
+ r = parse_paste(c) if c.class == PasteAST
31
54
  r = parse_link(c) if c.class == LinkAST
32
55
  r = parse_internal_link(c) if c.class == InternalLinkAST
33
56
  r = parse_resource_link(c) if c.class == ResourceLinkAST
57
+ r = parse_category_link(c) if c.class == CategoryLinkAST
34
58
  r = parse_internal_link_item(c) if c.class == InternalLinkItemAST
35
59
  r = parse_table(c) if c.class == TableAST
36
60
  r = parse_table_row(c) if c.class == TableRowAST
37
61
  r = parse_table_cell(c) if c.class == TableCellAST
62
+ r = parse_element(c) if c.class == ElementAST
63
+ r = parse_template(c) if c.class == TemplateAST
64
+ r = parse_category(c) if c.class == CategoryAST
65
+ r = parse_keyword(c) if c.class == KeywordAST
38
66
  r
39
67
  end
40
68
  end
@@ -44,6 +72,11 @@ protected
44
72
  parse_wiki_ast(ast)
45
73
  end
46
74
 
75
+ #Reimplement this
76
+ def parse_paste(ast)
77
+ parse_wiki_ast(ast)
78
+ end
79
+
47
80
  #Reimplement this
48
81
  def parse_formatted(ast)
49
82
  parse_wiki_ast(ast)
@@ -56,7 +89,10 @@ protected
56
89
  #Reimplement this
57
90
  def parse_list(ast)
58
91
  ast.children.map do |c|
59
- parse_list_item(c) if c.class == ListItemAST
92
+ r = parse_list_item(c) if c.class == ListItemAST
93
+ r = parse_list_term(c) if c.class == ListTermAST
94
+ r = parse_list_definition(c) if c.class == ListDefinitionAST
95
+ r
60
96
  end
61
97
  end
62
98
 
@@ -65,8 +101,19 @@ protected
65
101
  parse_wiki_ast(ast)
66
102
  end
67
103
 
104
+ #Reimplement this
105
+ def parse_list_term(ast)
106
+ parse_wiki_ast(ast)
107
+ end
108
+
109
+ #Reimplement this
110
+ def parse_list_definition(ast)
111
+ parse_wiki_ast(ast)
112
+ end
113
+
68
114
  #Reimplement this
69
115
  def parse_preformatted(ast)
116
+ parse_wiki_ast(ast)
70
117
  end
71
118
 
72
119
  #Reimplement this
@@ -93,6 +140,13 @@ protected
93
140
  end
94
141
  end
95
142
 
143
+ #Reimplement this
144
+ def parse_category_link(ast)
145
+ ast.children.map do |c|
146
+ parse_internal_link_item(c) if c.class == InternalLinkItemAST
147
+ end
148
+ end
149
+
96
150
  #Reimplement this
97
151
  def parse_internal_link_item(ast)
98
152
  parse_wiki_ast(ast)
@@ -113,4 +167,21 @@ protected
113
167
  parse_wiki_ast(ast)
114
168
  end
115
169
 
170
+ #Reimplement this
171
+ def parse_element(ast)
172
+ parse_wiki_ast(ast)
173
+ end
174
+
175
+ #Reimplement this
176
+ def parse_template(ast)
177
+ end
178
+
179
+ #Reimplement this
180
+ def parse_category(ast)
181
+ end
182
+
183
+ #Reimplement this
184
+ def parse_keyword(ast)
185
+ end
186
+
116
187
  end