kramdown 0.13.3 → 0.13.4

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of kramdown might be problematic. Click here for more details.

Files changed (35) hide show
  1. data/CONTRIBUTERS +5 -1
  2. data/ChangeLog +192 -0
  3. data/Rakefile +4 -3
  4. data/VERSION +1 -1
  5. data/bin/kramdown +1 -1
  6. data/doc/index.page +1 -1
  7. data/doc/tests.page +1 -1
  8. data/lib/kramdown/converter.rb +1 -0
  9. data/lib/kramdown/converter/html.rb +3 -3
  10. data/lib/kramdown/converter/toc.rb +82 -0
  11. data/lib/kramdown/document.rb +1 -494
  12. data/lib/kramdown/element.rb +524 -0
  13. data/lib/kramdown/parser/html.rb +11 -11
  14. data/lib/kramdown/parser/kramdown.rb +1 -1
  15. data/lib/kramdown/parser/kramdown/header.rb +1 -1
  16. data/lib/kramdown/parser/kramdown/html.rb +11 -11
  17. data/lib/kramdown/parser/kramdown/smart_quotes.rb +1 -1
  18. data/lib/kramdown/version.rb +1 -1
  19. data/setup.rb +1 -1
  20. data/test/test_files.rb +3 -3
  21. data/test/testcases/block/09_html/parse_as_raw.html +3 -0
  22. data/test/testcases/block/09_html/parse_as_raw.htmlinput +34 -0
  23. data/test/testcases/block/09_html/parse_as_raw.text +3 -1
  24. data/test/testcases/block/09_html/parse_as_span.htmlinput +12 -0
  25. data/test/testcases/block/09_html/parse_as_span.text +1 -1
  26. data/test/testcases/block/09_html/parse_block_html.text +2 -2
  27. data/test/testcases/block/12_extension/options.html +1 -1
  28. data/test/testcases/block/12_extension/options2.html +1 -1
  29. data/test/testcases/block/12_extension/options3.html +2 -2
  30. data/test/testcases/block/14_table/table_with_footnote.html +1 -1
  31. data/test/testcases/span/04_footnote/footnote_nr.html +2 -2
  32. data/test/testcases/span/04_footnote/markers.html +5 -5
  33. data/test/testcases/span/05_html/normal.html +4 -2
  34. data/test/testcases/span/05_html/normal.text +6 -4
  35. metadata +40 -40
@@ -0,0 +1,524 @@
1
+ # -*- coding: utf-8 -*-
2
+ #
3
+ #--
4
+ # Copyright (C) 2009-2010 Thomas Leitner <t_leitner@gmx.at>
5
+ #
6
+ # This file is part of kramdown.
7
+ #
8
+ # kramdown is free software: you can redistribute it and/or modify
9
+ # it under the terms of the GNU General Public License as published by
10
+ # the Free Software Foundation, either version 3 of the License, or
11
+ # (at your option) any later version.
12
+ #
13
+ # This program is distributed in the hope that it will be useful,
14
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
15
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16
+ # GNU General Public License for more details.
17
+ #
18
+ # You should have received a copy of the GNU General Public License
19
+ # along with this program. If not, see <http://www.gnu.org/licenses/>.
20
+ #++
21
+ #
22
+
23
+ module Kramdown
24
+
25
+ # Represents all elements in the element tree.
26
+ #
27
+ # kramdown only uses this one class for representing all available elements in an element tree
28
+ # (paragraphs, headers, emphasis, ...). The type of element can be set via the #type accessor.
29
+ #
30
+ # Following is a description of all supported element types.
31
+ #
32
+ # == Structural Elements
33
+ #
34
+ # === :root
35
+ #
36
+ # [Category] None
37
+ # [Usage context] As the root element of a document
38
+ # [Content model] Block-level elements
39
+ #
40
+ # Represents the root of a kramdown document.
41
+ #
42
+ # The root element contains the following option keys:
43
+ #
44
+ # :encoding:: When running on Ruby 1.9 this key has to be set to the encoding used for the text
45
+ # parts of the kramdown document.
46
+ #
47
+ # :abbrev_defs:: This key may be used to store the mapping of abbreviation to abbreviation
48
+ # definition.
49
+ #
50
+ # :options:: This key may be used to store options that were set during parsing of the document.
51
+ #
52
+ #
53
+ # === :blank
54
+ #
55
+ # [Category] Block-level element
56
+ # [Usage context] Where block-level elements are expected
57
+ # [Content model] Empty
58
+ #
59
+ # Represents one or more blank lines. It is not allowed to have two or more consecutive blank
60
+ # elements.
61
+ #
62
+ # The +value+ field may contain the original content of the blank lines.
63
+ #
64
+ #
65
+ # === :p
66
+ #
67
+ # [Category] Block-level element
68
+ # [Usage context] Where block-level elements are expected
69
+ # [Content model] Span-level elements
70
+ #
71
+ # Represents a paragraph.
72
+ #
73
+ # If the option :transparent is +true+, this element just represents a block of text. I.e. this
74
+ # element just functions as a container for span-level elements.
75
+ #
76
+ #
77
+ # === :header
78
+ #
79
+ # [Category] Block-level element
80
+ # [Usage context] Where block-level elements are expected
81
+ # [Content model] Span-level elements
82
+ #
83
+ # Represents a header.
84
+ #
85
+ # The option :level specifies the header level and has to contain a number between 1 and \6. The
86
+ # option :raw_text has to contain the raw header text.
87
+ #
88
+ #
89
+ # === :blockquote
90
+ #
91
+ # [Category] Block-level element
92
+ # [Usage context] Where block-level elements are expected
93
+ # [Content model] Block-level elements
94
+ #
95
+ # Represents a blockquote.
96
+ #
97
+ #
98
+ # === :codeblock
99
+ #
100
+ # [Category] Block-level element
101
+ # [Usage context] Where block-level elements are expected
102
+ # [Content model] Empty
103
+ #
104
+ # Represents a code block, i.e. a block of text that should be used as-is.
105
+ #
106
+ # The +value+ field has to contain the content of the code block.
107
+ #
108
+ #
109
+ # === :ul
110
+ #
111
+ # [Category] Block-level element
112
+ # [Usage context] Where block-level elements are expected
113
+ # [Content model] One or more :li elements
114
+ #
115
+ # Represents an unordered list.
116
+ #
117
+ #
118
+ # === :ol
119
+ #
120
+ # [Category] Block-level element
121
+ # [Usage context] Where block-level elements are expected
122
+ # [Content model] One or more :li elements
123
+ #
124
+ # Represents an ordered list.
125
+ #
126
+ #
127
+ # === :li
128
+ #
129
+ # [Category] None
130
+ # [Usage context] Inside :ol and :ul elements
131
+ # [Content model] Block-level elements
132
+ #
133
+ # Represents a list item of an ordered or unordered list.
134
+ #
135
+ # Note that the first child of a list item must not be a :blank element!
136
+ #
137
+ #
138
+ # === :dl
139
+ #
140
+ # [Category] Block-level element
141
+ # [Usage context] Where block-level elements are expected
142
+ # [Content model] One or more groups each consisting of one or more :dt elements followed by one
143
+ # or more :dd elements.
144
+ #
145
+ # Represents a definition list which contains groups consisting of terms and definitions for them.
146
+ #
147
+ #
148
+ # === :dt
149
+ #
150
+ # [Category] None
151
+ # [Usage context] Before :dt or :dd elements inside a :dl elment
152
+ # [Content model] Span-level elements
153
+ #
154
+ # Represents the term part of a term-definition group in a definition list.
155
+ #
156
+ #
157
+ # === :dd
158
+ #
159
+ # [Category] None
160
+ # [Usage context] After :dt or :dd elements inside a :dl elment
161
+ # [Content model] Block-level elements
162
+ #
163
+ # Represents the definition part of a term-definition group in a definition list.
164
+ #
165
+ #
166
+ # === :hr
167
+ #
168
+ # [Category] Block-level element
169
+ # [Usage context] Where block-level elements are expected
170
+ # [Content model] None
171
+ #
172
+ # Represents a horizontal line.
173
+ #
174
+ #
175
+ # === :table
176
+ #
177
+ # [Category] Block-level element
178
+ # [Usage context] Where block-level elements are expected
179
+ # [Content model] Zero or one :thead elements, one or more :tbody elements, zero or one :tfoot
180
+ # elements
181
+ #
182
+ # Represents a table. Each table row (i.e. :tr element) of the table has to contain the same
183
+ # number of :td elements.
184
+ #
185
+ # The option :alignment has to be an array containing the alignment values, exactly one for each
186
+ # column of the table. The possible alignment values are :left, :center, :right and :default.
187
+ #
188
+ #
189
+ # === :thead
190
+ #
191
+ # [Category] None
192
+ # [Usage context] As first element inside a :table element
193
+ # [Content model] One or more :tr elements
194
+ #
195
+ # Represents the table header.
196
+ #
197
+ #
198
+ # === :tbody
199
+ #
200
+ # [Category] None
201
+ # [Usage context] After a :thead element but before a :tfoot element inside a :table element
202
+ # [Content model] One or more :tr elements
203
+ #
204
+ # Represents a table body.
205
+ #
206
+ #
207
+ # === :tfoot
208
+ #
209
+ # [Category] None
210
+ # [Usage context] As last element inside a :table element
211
+ # [Content model] One or more :tr elements
212
+ #
213
+ # Represents the table footer.
214
+ #
215
+ #
216
+ # === :tr
217
+ #
218
+ # [Category] None
219
+ # [Usage context] Inside :thead, :tbody and :tfoot elements
220
+ # [Content model] One or more :td elements
221
+ #
222
+ # Represents a table row.
223
+ #
224
+ #
225
+ # === :td
226
+ #
227
+ # [Category] None
228
+ # [Usage context] Inside :tr elements
229
+ # [Content model] As child of :thead/:tr span-level elements, as child of :tbody/:tr and
230
+ # :tfoot/:tr block-level elements
231
+ #
232
+ # Represents a table cell.
233
+ #
234
+ #
235
+ # === :math
236
+ #
237
+ # [Category] Block/span-level element
238
+ # [Usage context] Where block/span-level elements are expected
239
+ # [Content model] None
240
+ #
241
+ # Represents mathematical text that is written in LaTeX.
242
+ #
243
+ # The +value+ field has to contain the actual mathematical text.
244
+ #
245
+ # The option :category has to be set to either :span or :block depending on the context where the
246
+ # element is used.
247
+ #
248
+ #
249
+ # == Text Markup Elements
250
+ #
251
+ # === :text
252
+ #
253
+ # [Category] Span-level element
254
+ # [Usage context] Where span-level elements are expected
255
+ # [Content model] None
256
+ #
257
+ # Represents text.
258
+ #
259
+ # The +value+ field has to contain the text itself.
260
+ #
261
+ #
262
+ # === :br
263
+ #
264
+ # [Category] Span-level element
265
+ # [Usage context] Where span-level elements are expected
266
+ # [Content model] None
267
+ #
268
+ # Represents a hard line break.
269
+ #
270
+ #
271
+ # === :a
272
+ #
273
+ # [Category] Span-level element
274
+ # [Usage context] Where span-level elements are expected
275
+ # [Content model] Span-level elements
276
+ #
277
+ # Represents a link to an URL.
278
+ #
279
+ # The attribute +href+ has to be set to the URL to which the link points. The attribute +title+
280
+ # optionally contains the title of the link.
281
+ #
282
+ #
283
+ # === :img
284
+ #
285
+ # [Category] Span-level element
286
+ # [Usage context] Where span-level elements are expected
287
+ # [Content model] None
288
+ #
289
+ # Represents an image.
290
+ #
291
+ # The attribute +src+ has to be set to the URL of the image. The attribute +alt+ has to contain a
292
+ # text description of the image. The attribute +title+ optionally contains the title of the image.
293
+ #
294
+ #
295
+ # === :codespan
296
+ #
297
+ # [Category] Span-level element
298
+ # [Usage context] Where span-level elements are expected
299
+ # [Content model] None
300
+ #
301
+ # Represents verbatim text.
302
+ #
303
+ # The +value+ field has to contain the content of the code span.
304
+ #
305
+ #
306
+ # === :footnote
307
+ #
308
+ # [Category] Span-level element
309
+ # [Usage context] Where span-level elements are expected
310
+ # [Content model] None
311
+ #
312
+ # Represents a footnote marker.
313
+ #
314
+ # The +value+ field has to contain an element whose children are the content of the footnote. The
315
+ # option :name has to contain a valid and unique footnote name. A valid footnote name consists of
316
+ # a word character or a digit and then optionally followed by other word characters, digits or
317
+ # dashes.
318
+ #
319
+ #
320
+ # === :em
321
+ #
322
+ # [Category] Span-level element
323
+ # [Usage context] Where span-level elements are expected
324
+ # [Content model] Span-level elements
325
+ #
326
+ # Represents emphasis of its contents.
327
+ #
328
+ #
329
+ # === :strong
330
+ #
331
+ # [Category] Span-level element
332
+ # [Usage context] Where span-level elements are expected
333
+ # [Content model] Span-level elements
334
+ #
335
+ # Represents strong importance for its contents.
336
+ #
337
+ #
338
+ # === :entity
339
+ #
340
+ # [Category] Span-level element
341
+ # [Usage context] Where span-level elements are expected
342
+ # [Content model] None
343
+ #
344
+ # Represents an HTML entity.
345
+ #
346
+ # The +value+ field has to contain an instance of Kramdown::Utils::Entities::Entity. The option
347
+ # :original can be used to store the original representation of the entity.
348
+ #
349
+ #
350
+ # === :typographic_sym
351
+ #
352
+ # [Category] Span-level element
353
+ # [Usage context] Where span-level elements are expected
354
+ # [Content model] None
355
+ #
356
+ # Represents a typographic symbol.
357
+ #
358
+ # The +value+ field needs to contain a Symbol representing the specific typographic symbol from
359
+ # the following list:
360
+ #
361
+ # :mdash:: An mdash character (---)
362
+ # :ndash:: An ndash character (--)
363
+ # :hellip:: An ellipsis (...)
364
+ # :laquo:: A left guillemet (<<)
365
+ # :raquo:: A right guillemet (>>)
366
+ # :laquo_space:: A left guillemet with a space (<< )
367
+ # :raquo_space:: A right guillemet with a space ( >>)
368
+ #
369
+ #
370
+ # === :smart_quote
371
+ #
372
+ # [Category] Span-level element
373
+ # [Usage context] Where span-level elements are expected
374
+ # [Content model] None
375
+ #
376
+ # Represents a quotation character.
377
+ #
378
+ # The +value+ field needs to contain a Symbol representing the specific quotation character:
379
+ #
380
+ # :lsquo:: Left single quote
381
+ # :rsquo:: Right single quote
382
+ # :ldquo:: Left double quote
383
+ # :rdquo:: Right double quote
384
+ #
385
+ #
386
+ # === :abbreviation
387
+ #
388
+ # [Category] Span-level element
389
+ # [Usage context] Where span-level elements are expected
390
+ # [Content model] None
391
+ #
392
+ # Represents a text part that is an abbreviation.
393
+ #
394
+ # The +value+ field has to contain the text part that is the abbreviation. The definition of the
395
+ # abbreviation is stored in the :root element of the document.
396
+ #
397
+ #
398
+ # == Other Elements
399
+ #
400
+ # === :html_element
401
+ #
402
+ # [Category] Block/span-level element
403
+ # [Usage context] Where block/span-level elements or raw HTML elements are expected
404
+ # [Content model] Depends on the element
405
+ #
406
+ # Represents an HTML element.
407
+ #
408
+ # The +value+ field has to contain the name of the HTML element the element is representing.
409
+ #
410
+ # The option :category has to be set to either :span or :block depending on the whether the
411
+ # element is a block-level or a span-level element. The option :content_model has to be set to the
412
+ # content model for the element (either :block if it contains block-level elements, :span if it
413
+ # contains span-level elements or :raw if it contains raw content).
414
+ #
415
+ #
416
+ # === :xml_comment
417
+ #
418
+ # [Category] Block/span-level element
419
+ # [Usage context] Where block/span-level elements are expected or in raw HTML elements
420
+ # [Content model] None
421
+ #
422
+ # Represents an XML/HTML comment.
423
+ #
424
+ # The +value+ field has to contain the whole XML/HTML comment including the delimiters.
425
+ #
426
+ # The option :category has to be set to either :span or :block depending on the context where the
427
+ # element is used.
428
+ #
429
+ #
430
+ # === :xml_pi
431
+ #
432
+ # [Category] Block/span-level element
433
+ # [Usage context] Where block/span-level elements are expected or in raw HTML elements
434
+ # [Content model] None
435
+ #
436
+ # Represents an XML/HTML processing instruction.
437
+ #
438
+ # The +value+ field has to contain the whole XML/HTML processing instruction including the
439
+ # delimiters.
440
+ #
441
+ # The option :category has to be set to either :span or :block depending on the context where the
442
+ # element is used.
443
+ #
444
+ #
445
+ # === :comment
446
+ #
447
+ # [Category] Block/span-level element
448
+ # [Usage context] Where block/span-level elements are expected
449
+ # [Content model] None
450
+ #
451
+ # Represents a comment.
452
+ #
453
+ # The +value+ field has to contain the comment.
454
+ #
455
+ # The option :category has to be set to either :span or :block depending on the context where the
456
+ # element is used. If it is set to :span, then no blank lines are allowed in the comment.
457
+ #
458
+ #
459
+ # === :raw
460
+ #
461
+ # [Category] Block/span-level element
462
+ # [Usage context] Where block/span-level elements are expected
463
+ # [Content model] None
464
+ #
465
+ # Represents a raw string that should not be modified. For example, the element could contain some
466
+ # HTML code that should be output as-is without modification and escaping.
467
+ #
468
+ # The +value+ field has to contain the actual raw text.
469
+ #
470
+ # The option :category has to be set to either :span or :block depending on the context where the
471
+ # element is used. If it is set to :span, then no blank lines are allowed in the raw text.
472
+ #
473
+ # The option :type can be set to an array of strings to define for which converters the raw string
474
+ # is valid.
475
+ class Element
476
+
477
+ # A symbol representing the element type. For example, :p or :blockquote.
478
+ attr_accessor :type
479
+
480
+ # The value of the element. The interpretation of this field depends on the type of the element.
481
+ # Many elements don't use this field.
482
+ attr_accessor :value
483
+
484
+ # The child elements of this element.
485
+ attr_accessor :children
486
+
487
+
488
+ # Create a new Element object of type +type+. The optional parameters +value+, +attr+ and
489
+ # +options+ can also be set in this constructor for convenience.
490
+ def initialize(type, value = nil, attr = nil, options = nil)
491
+ @type, @value, @attr, @options = type, value, (Utils::OrderedHash.new.merge!(attr) if attr), options
492
+ @children = []
493
+ end
494
+
495
+ # The attributes of the element. Uses an Utils::OrderedHash to retain the insertion order.
496
+ def attr
497
+ @attr ||= Utils::OrderedHash.new
498
+ end
499
+
500
+ # The options hash for the element. It is used for storing arbitray options.
501
+ def options
502
+ @options ||= {}
503
+ end
504
+
505
+ def inspect #:nodoc:
506
+ "<kd:#{@type}#{@value.nil? ? '' : ' ' + @value.inspect} #{@attr.inspect}#{options.empty? ? '' : ' ' + @options.inspect}#{@children.empty? ? '' : ' ' + @children.inspect}>"
507
+ end
508
+
509
+ CATEGORY = {} # :nodoc:
510
+ [:blank, :p, :header, :blockquote, :codeblock, :ul, :ol, :dl, :table, :hr].each {|b| CATEGORY[b] = :block}
511
+ [:text, :a, :br, :img, :codespan, :footnote, :em, :strong, :entity, :typographic_sym,
512
+ :smart_quote, :abbreviation].each {|b| CATEGORY[b] = :span}
513
+
514
+ # Return the category of +el+ which can be :block, :span or +nil+.
515
+ #
516
+ # Most elements have a fixed category, however, some elements can either appear in a block-level
517
+ # or a span-level context. These elements need to have the option :category correctly set.
518
+ def self.category(el)
519
+ CATEGORY[el.type] || el.options[:category]
520
+ end
521
+
522
+ end
523
+
524
+ end