mediacloth 0.0.3 → 0.5

Sign up to get free protection for your applications and to get access to all the features.
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