motion-kramdown 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (78) hide show
  1. checksums.yaml +7 -0
  2. data/README.md +84 -0
  3. data/lib/kramdown/compatibility.rb +36 -0
  4. data/lib/kramdown/converter/base.rb +259 -0
  5. data/lib/kramdown/converter/html.rb +461 -0
  6. data/lib/kramdown/converter/kramdown.rb +423 -0
  7. data/lib/kramdown/converter/latex.rb +600 -0
  8. data/lib/kramdown/converter/math_engine/itex2mml.rb +39 -0
  9. data/lib/kramdown/converter/math_engine/mathjax.rb +33 -0
  10. data/lib/kramdown/converter/math_engine/ritex.rb +38 -0
  11. data/lib/kramdown/converter/pdf.rb +624 -0
  12. data/lib/kramdown/converter/remove_html_tags.rb +53 -0
  13. data/lib/kramdown/converter/syntax_highlighter/coderay.rb +78 -0
  14. data/lib/kramdown/converter/syntax_highlighter/rouge.rb +37 -0
  15. data/lib/kramdown/converter/toc.rb +69 -0
  16. data/lib/kramdown/converter.rb +69 -0
  17. data/lib/kramdown/document.rb +144 -0
  18. data/lib/kramdown/element.rb +515 -0
  19. data/lib/kramdown/error.rb +17 -0
  20. data/lib/kramdown/options.rb +584 -0
  21. data/lib/kramdown/parser/base.rb +130 -0
  22. data/lib/kramdown/parser/gfm.rb +55 -0
  23. data/lib/kramdown/parser/html.rb +575 -0
  24. data/lib/kramdown/parser/kramdown/abbreviation.rb +67 -0
  25. data/lib/kramdown/parser/kramdown/autolink.rb +37 -0
  26. data/lib/kramdown/parser/kramdown/blank_line.rb +30 -0
  27. data/lib/kramdown/parser/kramdown/block_boundary.rb +33 -0
  28. data/lib/kramdown/parser/kramdown/blockquote.rb +39 -0
  29. data/lib/kramdown/parser/kramdown/codeblock.rb +56 -0
  30. data/lib/kramdown/parser/kramdown/codespan.rb +44 -0
  31. data/lib/kramdown/parser/kramdown/emphasis.rb +61 -0
  32. data/lib/kramdown/parser/kramdown/eob.rb +26 -0
  33. data/lib/kramdown/parser/kramdown/escaped_chars.rb +25 -0
  34. data/lib/kramdown/parser/kramdown/extensions.rb +201 -0
  35. data/lib/kramdown/parser/kramdown/footnote.rb +56 -0
  36. data/lib/kramdown/parser/kramdown/header.rb +59 -0
  37. data/lib/kramdown/parser/kramdown/horizontal_rule.rb +27 -0
  38. data/lib/kramdown/parser/kramdown/html.rb +160 -0
  39. data/lib/kramdown/parser/kramdown/html_entity.rb +33 -0
  40. data/lib/kramdown/parser/kramdown/line_break.rb +25 -0
  41. data/lib/kramdown/parser/kramdown/link.rb +139 -0
  42. data/lib/kramdown/parser/kramdown/list.rb +256 -0
  43. data/lib/kramdown/parser/kramdown/math.rb +54 -0
  44. data/lib/kramdown/parser/kramdown/paragraph.rb +54 -0
  45. data/lib/kramdown/parser/kramdown/smart_quotes.rb +174 -0
  46. data/lib/kramdown/parser/kramdown/table.rb +171 -0
  47. data/lib/kramdown/parser/kramdown/typographic_symbol.rb +44 -0
  48. data/lib/kramdown/parser/kramdown.rb +359 -0
  49. data/lib/kramdown/parser/markdown.rb +56 -0
  50. data/lib/kramdown/parser.rb +27 -0
  51. data/lib/kramdown/utils/configurable.rb +44 -0
  52. data/lib/kramdown/utils/entities.rb +347 -0
  53. data/lib/kramdown/utils/html.rb +75 -0
  54. data/lib/kramdown/utils/ordered_hash.rb +87 -0
  55. data/lib/kramdown/utils/string_scanner.rb +74 -0
  56. data/lib/kramdown/utils/unidecoder.rb +51 -0
  57. data/lib/kramdown/utils.rb +58 -0
  58. data/lib/kramdown/version.rb +15 -0
  59. data/lib/kramdown.rb +10 -0
  60. data/lib/motion-kramdown.rb +47 -0
  61. data/lib/rubymotion/encodings.rb +37 -0
  62. data/lib/rubymotion/rexml_shim.rb +25 -0
  63. data/lib/rubymotion/set.rb +1349 -0
  64. data/lib/rubymotion/version.rb +6 -0
  65. data/spec/document_tree.rb +48 -0
  66. data/spec/gfm_to_html.rb +95 -0
  67. data/spec/helpers/it_behaves_like.rb +27 -0
  68. data/spec/helpers/option_file.rb +46 -0
  69. data/spec/helpers/spec_options.rb +37 -0
  70. data/spec/helpers/tidy.rb +12 -0
  71. data/spec/html_to_html.rb +40 -0
  72. data/spec/html_to_kramdown_to_html.rb +46 -0
  73. data/spec/kramdown_to_xxx.rb +40 -0
  74. data/spec/test_location.rb +203 -0
  75. data/spec/test_string_scanner_kramdown.rb +19 -0
  76. data/spec/text_to_kramdown_to_html.rb +52 -0
  77. data/spec/text_to_latex.rb +33 -0
  78. metadata +164 -0
@@ -0,0 +1,347 @@
1
+ # -*- coding: utf-8 -*-
2
+ #
3
+ #--
4
+ # Copyright (C) 2009-2014 Thomas Leitner <t_leitner@gmx.at>
5
+ #
6
+ # This file is part of kramdown which is licensed under the MIT.
7
+ #++
8
+ #
9
+
10
+ module Kramdown
11
+
12
+ module Utils
13
+
14
+ # Provides convenience methods for handling named and numeric entities.
15
+ module Entities
16
+
17
+ # Represents an entity that has a +code_point+ and +name+.
18
+ class Entity < Struct.new(:code_point, :name)
19
+
20
+ # Return the UTF8 representation of the entity.
21
+ def char
22
+ [code_point] ? [code_point].pack('U*') : nil # RM can't use rescue nil
23
+ end
24
+
25
+ end
26
+
27
+ # Array of arrays. Each sub-array specifies a code point and the associated name.
28
+ #
29
+ # This table is not used directly -- Entity objects are automatically created from it and put
30
+ # into a Hash map when this file is loaded.
31
+ ENTITY_TABLE = [
32
+ [913, 'Alpha'],
33
+ [914, 'Beta'],
34
+ [915, 'Gamma'],
35
+ [916, 'Delta'],
36
+ [917, 'Epsilon'],
37
+ [918, 'Zeta'],
38
+ [919, 'Eta'],
39
+ [920, 'Theta'],
40
+ [921, 'Iota'],
41
+ [922, 'Kappa'],
42
+ [923, 'Lambda'],
43
+ [924, 'Mu'],
44
+ [925, 'Nu'],
45
+ [926, 'Xi'],
46
+ [927, 'Omicron'],
47
+ [928, 'Pi'],
48
+ [929, 'Rho'],
49
+ [931, 'Sigma'],
50
+ [932, 'Tau'],
51
+ [933, 'Upsilon'],
52
+ [934, 'Phi'],
53
+ [935, 'Chi'],
54
+ [936, 'Psi'],
55
+ [937, 'Omega'],
56
+ [945, 'alpha'],
57
+ [946, 'beta'],
58
+ [947, 'gamma'],
59
+ [948, 'delta'],
60
+ [949, 'epsilon'],
61
+ [950, 'zeta'],
62
+ [951, 'eta'],
63
+ [952, 'theta'],
64
+ [953, 'iota'],
65
+ [954, 'kappa'],
66
+ [955, 'lambda'],
67
+ [956, 'mu'],
68
+ [957, 'nu'],
69
+ [958, 'xi'],
70
+ [959, 'omicron'],
71
+ [960, 'pi'],
72
+ [961, 'rho'],
73
+ [963, 'sigma'],
74
+ [964, 'tau'],
75
+ [965, 'upsilon'],
76
+ [966, 'phi'],
77
+ [967, 'chi'],
78
+ [968, 'psi'],
79
+ [969, 'omega'],
80
+ [962, 'sigmaf'],
81
+ [977, 'thetasym'],
82
+ [978, 'upsih'],
83
+ [982, 'piv'],
84
+ [8204, 'zwnj'],
85
+ [8205, 'zwj'],
86
+ [8206, 'lrm'],
87
+ [8207, 'rlm'],
88
+ [8230, 'hellip'],
89
+ [8242, 'prime'],
90
+ [8243, 'Prime'],
91
+ [8254, 'oline'],
92
+ [8260, 'frasl'],
93
+ [8472, 'weierp'],
94
+ [8465, 'image'],
95
+ [8476, 'real'],
96
+ [8501, 'alefsym'],
97
+ [8226, 'bull'],
98
+ [8482, 'trade'],
99
+ [8592, 'larr'],
100
+ [8594, 'rarr'],
101
+ [8593, 'uarr'],
102
+ [8595, 'darr'],
103
+ [8596, 'harr'],
104
+ [8629, 'crarr'],
105
+ [8657, 'uArr'],
106
+ [8659, 'dArr'],
107
+ [8656, 'lArr'],
108
+ [8658, 'rArr'],
109
+ [8660, 'hArr'],
110
+ [8704, 'forall'],
111
+ [8706, 'part'],
112
+ [8707, 'exist'],
113
+ [8709, 'empty'],
114
+ [8711, 'nabla'],
115
+ [8712, 'isin'],
116
+ [8715, 'ni'],
117
+ [8713, 'notin'],
118
+ [8721, 'sum'],
119
+ [8719, 'prod'],
120
+ [8722, 'minus'],
121
+ [8727, 'lowast'],
122
+ [8730, 'radic'],
123
+ [8733, 'prop'],
124
+ [8734, 'infin'],
125
+ [8736, 'ang'],
126
+ [8743, 'and'],
127
+ [8744, 'or'],
128
+ [8745, 'cup'],
129
+ [8746, 'cap'],
130
+ [8747, 'int'],
131
+ [8756, 'there4'],
132
+ [8764, 'sim'],
133
+ [8776, 'asymp'],
134
+ [8773, 'cong'],
135
+ [8800, 'ne'],
136
+ [8801, 'equiv'],
137
+ [8804, 'le'],
138
+ [8805, 'ge'],
139
+ [8834, 'sub'],
140
+ [8835, 'sup'],
141
+ [8838, 'sube'],
142
+ [8839, 'supe'],
143
+ [8836, 'nsub'],
144
+ [8853, 'oplus'],
145
+ [8855, 'otimes'],
146
+ [8869, 'perp'],
147
+ [8901, 'sdot'],
148
+ [8942, 'vellip'],
149
+ [8968, 'rceil'],
150
+ [8969, 'lceil'],
151
+ [8970, 'lfloor'],
152
+ [8971, 'rfloor'],
153
+ [9001, 'rang'],
154
+ [9002, 'lang'],
155
+ [9674, 'loz'],
156
+ [9824, 'spades'],
157
+ [9827, 'clubs'],
158
+ [9829, 'hearts'],
159
+ [9830, 'diams'],
160
+ [38, 'amp'],
161
+ [34, 'quot'],
162
+ [39, 'apos'],
163
+ [169, 'copy'],
164
+ [60, 'lt'],
165
+ [62, 'gt'],
166
+ [338, 'OElig'],
167
+ [339, 'oelig'],
168
+ [352, 'Scaron'],
169
+ [353, 'scaron'],
170
+ [376, 'Yuml'],
171
+ [710, 'circ'],
172
+ [732, 'tilde'],
173
+ [8211, 'ndash'],
174
+ [8212, 'mdash'],
175
+ [8216, 'lsquo'],
176
+ [8217, 'rsquo'],
177
+ [8220, 'ldquo'],
178
+ [8221, 'rdquo'],
179
+ [8224, 'dagger'],
180
+ [8225, 'Dagger'],
181
+ [8240, 'permil'],
182
+ [8364, 'euro'],
183
+ [8249, 'lsaquo'],
184
+ [8250, 'rsaquo'],
185
+ [160, 'nbsp'],
186
+ [161, 'iexcl'],
187
+ [163, 'pound'],
188
+ [164, 'curren'],
189
+ [165, 'yen'],
190
+ [166, 'brvbar'],
191
+ [167, 'sect'],
192
+ [168, 'uml'],
193
+ [171, 'laquo'],
194
+ [187, 'raquo'],
195
+ [174, 'reg'],
196
+ [170, 'ordf'],
197
+ [172, 'not'],
198
+ [173, 'shy'],
199
+ [175, 'macr'],
200
+ [176, 'deg'],
201
+ [177, 'plusmn'],
202
+ [180, 'acute'],
203
+ [181, 'micro'],
204
+ [182, 'para'],
205
+ [183, 'middot'],
206
+ [184, 'cedil'],
207
+ [186, 'ordm'],
208
+ [162, 'cent'],
209
+ [185, 'sup1'],
210
+ [178, 'sup2'],
211
+ [179, 'sup3'],
212
+ [189, 'frac12'],
213
+ [188, 'frac14'],
214
+ [190, 'frac34'],
215
+ [191, 'iquest'],
216
+ [192, 'Agrave'],
217
+ [193, 'Aacute'],
218
+ [194, 'Acirc'],
219
+ [195, 'Atilde'],
220
+ [196, 'Auml'],
221
+ [197, 'Aring'],
222
+ [198, 'AElig'],
223
+ [199, 'Ccedil'],
224
+ [200, 'Egrave'],
225
+ [201, 'Eacute'],
226
+ [202, 'Ecirc'],
227
+ [203, 'Euml'],
228
+ [204, 'Igrave'],
229
+ [205, 'Iacute'],
230
+ [206, 'Icirc'],
231
+ [207, 'Iuml'],
232
+ [208, 'ETH'],
233
+ [209, 'Ntilde'],
234
+ [210, 'Ograve'],
235
+ [211, 'Oacute'],
236
+ [212, 'Ocirc'],
237
+ [213, 'Otilde'],
238
+ [214, 'Ouml'],
239
+ [215, 'times'],
240
+ [216, 'Oslash'],
241
+ [217, 'Ugrave'],
242
+ [218, 'Uacute'],
243
+ [219, 'Ucirc'],
244
+ [220, 'Uuml'],
245
+ [221, 'Yacute'],
246
+ [222, 'THORN'],
247
+ [223, 'szlig'],
248
+ [224, 'agrave'],
249
+ [225, 'aacute'],
250
+ [226, 'acirc'],
251
+ [227, 'atilde'],
252
+ [228, 'auml'],
253
+ [229, 'aring'],
254
+ [230, 'aelig'],
255
+ [231, 'ccedil'],
256
+ [232, 'egrave'],
257
+ [233, 'eacute'],
258
+ [234, 'ecirc'],
259
+ [235, 'euml'],
260
+ [236, 'igrave'],
261
+ [237, 'iacute'],
262
+ [238, 'icirc'],
263
+ [239, 'iuml'],
264
+ [240, 'eth'],
265
+ [241, 'ntilde'],
266
+ [242, 'ograve'],
267
+ [243, 'oacute'],
268
+ [244, 'ocirc'],
269
+ [245, 'otilde'],
270
+ [246, 'ouml'],
271
+ [247, 'divide'],
272
+ [248, 'oslash'],
273
+ [249, 'ugrave'],
274
+ [250, 'uacute'],
275
+ [251, 'ucirc'],
276
+ [252, 'uuml'],
277
+ [253, 'yacute'],
278
+ [254, 'thorn'],
279
+ [255, 'yuml'],
280
+
281
+ [8218, 'sbquo'],
282
+ [402, 'fnof'],
283
+ [8222, 'bdquo'],
284
+
285
+ [128, 8364],
286
+ [130, 8218],
287
+ [131, 402],
288
+ [132, 8222],
289
+ [133, 8230],
290
+ [134, 8224],
291
+ [135, 8225],
292
+ [136, 710],
293
+ [137, 8240],
294
+ [138, 352],
295
+ [139, 8249],
296
+ [140, 338],
297
+ [142, 381],
298
+ [145, 8216],
299
+ [146, 8217],
300
+ [147, 8220],
301
+ [148, 8221],
302
+ [149, 8226],
303
+ [150, 8211],
304
+ [151, 8212],
305
+ [152, 732],
306
+ [153, 8482],
307
+ [154, 353],
308
+ [155, 8250],
309
+ [156, 339],
310
+ [158, 382],
311
+ [159, 376],
312
+
313
+ [8194, 'ensp'],
314
+ [8195, 'emsp'],
315
+ [8201, 'thinsp'],
316
+ ]
317
+
318
+ # Contains the mapping of code point (or name) to the actual Entity object.
319
+ ENTITY_MAP = Hash.new do |h,k|
320
+ if k.kind_of?(Integer)
321
+ h[k] = Entity.new(k, nil)
322
+ else
323
+ raise Kramdown::Error, "Can't handle generic non-integer character reference '#{k}'"
324
+ end
325
+ end
326
+
327
+ ENTITY_TABLE.each do |code_point, data|
328
+ if data.kind_of?(String)
329
+ ENTITY_MAP[code_point] = ENTITY_MAP[data] = Entity.new(code_point, data)
330
+ else
331
+ ENTITY_MAP[code_point] = ENTITY_MAP[data]
332
+ end
333
+ end
334
+
335
+ # Return the entity for the given code point or name +point_or_name+.
336
+ def entity(point_or_name)
337
+ ENTITY_MAP[point_or_name]
338
+ end
339
+
340
+ module_function :entity
341
+
342
+ end
343
+
344
+ end
345
+
346
+ end
347
+
@@ -0,0 +1,75 @@
1
+ # -*- coding: utf-8 -*-
2
+ #
3
+ #--
4
+ # Copyright (C) 2009-2014 Thomas Leitner <t_leitner@gmx.at>
5
+ #
6
+ # This file is part of kramdown which is licensed under the MIT.
7
+ #++
8
+ #
9
+
10
+ module Kramdown
11
+
12
+ module Utils
13
+
14
+ # Provides convenience methods for HTML related tasks.
15
+ #
16
+ # *Note* that this module has to be mixed into a class that has a @root (containing an element
17
+ # of type :root) and an @options (containing an options hash) instance variable so that some of
18
+ # the methods can work correctly.
19
+ module Html
20
+
21
+ # Convert the entity +e+ to a string. The optional parameter +original+ may contain the
22
+ # original representation of the entity.
23
+ #
24
+ # This method uses the option +entity_output+ to determine the output form for the entity.
25
+ def entity_to_str(e, original = nil)
26
+ entity_output = @options[:entity_output]
27
+
28
+ if e.char.respond_to?(:encoding) && entity_output == :as_char &&
29
+ (c = (@root.options[:encoding] ? e.char.encode(@root.options[:encoding]) : nil)) && # RM can't use rescue nil
30
+ ((c = e.char) == '"' || !ESCAPE_MAP.has_key?(c))
31
+ c
32
+ elsif (entity_output == :as_input || entity_output == :as_char) && original
33
+ original
34
+ elsif (entity_output == :symbolic || ESCAPE_MAP.has_key?(e.char)) && !e.name.nil?
35
+ "&#{e.name};"
36
+ else # default to :numeric
37
+ "&##{e.code_point};"
38
+ end
39
+ end
40
+
41
+ # Return the HTML representation of the attributes +attr+.
42
+ def html_attributes(attr)
43
+ attr.map {|k,v| v.nil? || (k == 'id' && v.strip.empty?) ? '' : " #{k}=\"#{escape_html(v.to_s, :attribute)}\"" }.join('')
44
+ end
45
+
46
+ # :stopdoc:
47
+ ESCAPE_MAP = {
48
+ '<' => '&lt;',
49
+ '>' => '&gt;',
50
+ '&' => '&amp;',
51
+ '"' => '&quot;'
52
+ }
53
+ ESCAPE_ALL_RE = /<|>|&/
54
+ ESCAPE_TEXT_RE = Regexp.union(REXML::Parsers::BaseParser::REFERENCE_RE, /<|>|&/)
55
+ ESCAPE_ATTRIBUTE_RE = Regexp.union(REXML::Parsers::BaseParser::REFERENCE_RE, /<|>|&|"/)
56
+ ESCAPE_RE_FROM_TYPE = {
57
+ :all => ESCAPE_ALL_RE,
58
+ :text => ESCAPE_TEXT_RE,
59
+ :attribute => ESCAPE_ATTRIBUTE_RE
60
+ }
61
+ # :startdoc:
62
+
63
+ # Escape the special HTML characters in the string +str+. The parameter +type+ specifies what
64
+ # is escaped: :all - all special HTML characters except the quotation mark as well as
65
+ # entities, :text - all special HTML characters except the quotation mark but no entities and
66
+ # :attribute - all special HTML characters including the quotation mark but no entities.
67
+ def escape_html(str, type = :all)
68
+ str.gsub(ESCAPE_RE_FROM_TYPE[type]) {|m| ESCAPE_MAP[m] || m}
69
+ end
70
+
71
+ end
72
+
73
+ end
74
+
75
+ end
@@ -0,0 +1,87 @@
1
+ # -*- coding: utf-8 -*-
2
+ #
3
+ #--
4
+ # Copyright (C) 2009-2014 Thomas Leitner <t_leitner@gmx.at>
5
+ #
6
+ # This file is part of kramdown which is licensed under the MIT.
7
+ #++
8
+ #
9
+
10
+ module Kramdown
11
+
12
+ module Utils
13
+
14
+ if RUBY_VERSION < '1.9'
15
+
16
+ # A partial hash implementation which preserves the insertion order of the keys.
17
+ #
18
+ # *Note* that this class is only used on Ruby 1.8 since the built-in Hash on Ruby 1.9
19
+ # automatically preserves the insertion order. However, to remain compatibility only the
20
+ # methods defined in this class may be used when working with OrderedHash on Ruby 1.9.
21
+ class OrderedHash
22
+
23
+ include Enumerable
24
+
25
+ # Initialize the OrderedHash object.
26
+ def initialize
27
+ @data = {}
28
+ @order = []
29
+ end
30
+
31
+ # Iterate over the stored keys in insertion order.
32
+ def each
33
+ @order.each {|k| yield(k, @data[k])}
34
+ end
35
+
36
+ # Return the value for the +key+.
37
+ def [](key)
38
+ @data[key]
39
+ end
40
+
41
+ # Return +true+ if the hash contains the key.
42
+ def has_key?(key)
43
+ @data.has_key?(key)
44
+ end
45
+
46
+ # Set the value for the +key+ to +val+.
47
+ def []=(key, val)
48
+ @order << key if !@data.has_key?(key)
49
+ @data[key] = val
50
+ end
51
+
52
+ # Delete the +key+.
53
+ def delete(key)
54
+ @order.delete(key)
55
+ @data.delete(key)
56
+ end
57
+
58
+ def merge!(other)
59
+ other.each {|k,v| self[k] = v}
60
+ self
61
+ end
62
+
63
+ def dup #:nodoc:
64
+ new_object = super
65
+ new_object.instance_variable_set(:@data, @data.dup)
66
+ new_object.instance_variable_set(:@order, @order.dup)
67
+ new_object
68
+ end
69
+
70
+ def ==(other) #:nodoc:
71
+ return false unless other.kind_of?(self.class)
72
+ @data == other.instance_variable_get(:@data) && @order == other.instance_variable_get(:@order)
73
+ end
74
+
75
+ def inspect #:nodoc:
76
+ "{" + map {|k,v| "#{k.inspect}=>#{v.inspect}"}.join(" ") + "}"
77
+ end
78
+
79
+ end
80
+
81
+ else
82
+ OrderedHash = Hash
83
+ end
84
+
85
+ end
86
+
87
+ end
@@ -0,0 +1,74 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ # RM require 'strscan'
4
+
5
+ module Kramdown
6
+ module Utils
7
+
8
+ # This patched StringScanner adds line number information for current scan position and a
9
+ # start_line_number override for nested StringScanners.
10
+ class StringScanner < ::StringScanner
11
+
12
+ # The start line number. Used for nested StringScanners that scan a sub-string of the source
13
+ # document. The kramdown parser uses this, e.g., for span level parsers.
14
+ attr_reader :start_line_number
15
+
16
+ # Takes the start line number as optional second argument.
17
+ #
18
+ # Note: The original second argument is no longer used so this should be safe.
19
+ def initialize(string, start_line_number = 1)
20
+ super(string)
21
+ @start_line_number = start_line_number || 1
22
+ @previous_pos = 0
23
+ @previous_line_number = @start_line_number
24
+ end
25
+
26
+ # Sets the byte position of the scan pointer.
27
+ #
28
+ # Note: This also resets some internal variables, so always use pos= when setting the position
29
+ # and don't use any other method for that!
30
+ def pos=(pos)
31
+ if self.pos > pos
32
+ @previous_line_number = @start_line_number
33
+ @previous_pos = 0
34
+ end
35
+ super
36
+ end
37
+
38
+ # Return information needed to revert the byte position of the string scanner in a performant
39
+ # way.
40
+ #
41
+ # The returned data can be fed to #revert_pos to revert the position to the saved one.
42
+ #
43
+ # Note: Just saving #pos won't be enough.
44
+ def save_pos
45
+ [pos, @previous_pos, @previous_line_number]
46
+ end
47
+
48
+ # Revert the position to one saved by #save_pos.
49
+ def revert_pos(data)
50
+ self.pos = data[0]
51
+ @previous_pos, @previous_line_number = data[1], data[2]
52
+ end
53
+
54
+ # Returns the line number for current charpos.
55
+ #
56
+ # NOTE: Requires that all line endings are normalized to '\n'
57
+ #
58
+ # NOTE: Normally we'd have to add one to the count of newlines to get the correct line number.
59
+ # However we add the one indirectly by using a one-based start_line_number.
60
+ def current_line_number
61
+ # Not using string[@previous_pos..best_pos].count('\n') because it is slower
62
+ strscan = ::StringScanner.new(string)
63
+ strscan.pos = @previous_pos
64
+ old_pos = pos + 1
65
+ @previous_line_number += 1 while strscan.skip_until(/\n/) && strscan.pos <= old_pos
66
+
67
+ @previous_pos = (eos? ? pos : pos + 1)
68
+ @previous_line_number
69
+ end
70
+
71
+ end
72
+
73
+ end
74
+ end
@@ -0,0 +1,51 @@
1
+ # -*- coding: utf-8 -*-
2
+ #
3
+ #--
4
+ # Copyright (C) 2009-2014 Thomas Leitner <t_leitner@gmx.at>
5
+ #
6
+ # This file is part of kramdown which is licensed under the MIT.
7
+ #++
8
+ #
9
+ # This file is based on code originally from the Stringex library and needs the data files from
10
+ # Stringex to work correctly.
11
+
12
+ module Kramdown
13
+ module Utils
14
+
15
+ # Provides the ability to tranliterate Unicode strings into plain ASCII ones.
16
+ module Unidecoder
17
+
18
+ # RM gem 'stringex' if defined?(Gem)
19
+ # RM TODO path = $:.find {|dir| File.directory?(File.join(File.expand_path(dir), "stringex", "unidecoder_data"))}
20
+ path = 'lib' # RM TODO
21
+
22
+ if RUBY_VERSION <= '1.8.6' || !path
23
+ def self.decode(string)
24
+ string
25
+ end
26
+ else
27
+
28
+ CODEPOINTS = Hash.new do |h, k|
29
+ if File.exists?(File.join(path, "stringex", "unidecoder_data", "#{k}.yml")) # RM
30
+ h[k] = YAML::load(File.join(path, "stringex", "unidecoder_data", "#{k}.yml")) # RM
31
+ end # RM
32
+ end
33
+
34
+ # Transliterate string from Unicode into ASCII.
35
+ def self.decode(string)
36
+ string.gsub(/[^\x00-\x7f]/u) do |codepoint|
37
+ begin
38
+ unpacked = codepoint.unpack("U")[0]
39
+ CODEPOINTS["x%02x" % (unpacked >> 8)][unpacked & 255]
40
+ rescue
41
+ "?"
42
+ end
43
+ end
44
+ end
45
+
46
+ end
47
+
48
+ end
49
+
50
+ end
51
+ end
@@ -0,0 +1,58 @@
1
+ # -*- coding: utf-8 -*-
2
+ #
3
+ #--
4
+ # Copyright (C) 2009-2014 Thomas Leitner <t_leitner@gmx.at>
5
+ #
6
+ # This file is part of kramdown which is licensed under the MIT.
7
+ #++
8
+ #
9
+
10
+ module Kramdown
11
+
12
+ # == \Utils Module
13
+ #
14
+ # This module contains utility class/modules/methods that can be used by both parsers and
15
+ # converters.
16
+ module Utils
17
+
18
+ # RM autoload :Entities, 'kramdown/utils/entities'
19
+ # RM autoload :Html, 'kramdown/utils/html'
20
+ # RM autoload :OrderedHash, 'kramdown/utils/ordered_hash'
21
+ # RM autoload :Unidecoder, 'kramdown/utils/unidecoder'
22
+ # RM autoload :StringScanner, 'kramdown/utils/string_scanner'
23
+ # RM autoload :Configurable, 'kramdown/utils/configurable'
24
+
25
+ # Treat +name+ as if it were snake cased (e.g. snake_case) and camelize it (e.g. SnakeCase).
26
+ def self.camelize(name)
27
+ name.split('_').inject('') {|s,x| s << x[0..0].upcase << x[1..-1] }
28
+ end
29
+
30
+ # Treat +name+ as if it were camelized (e.g. CamelizedName) and snake-case it (e.g. camelized_name).
31
+ def self.snake_case(name)
32
+ name = name.dup
33
+ name.gsub!(/([A-Z]+)([A-Z][a-z])/,'\1_\2')
34
+ name.gsub!(/([a-z])([A-Z])/,'\1_\2')
35
+ name.downcase!
36
+ name
37
+ end
38
+
39
+ if RUBY_VERSION < '2.0'
40
+
41
+ # Resolve the recursive constant +str+.
42
+ def self.deep_const_get(str)
43
+ names = str.split(/::/)
44
+ names.shift if names.first.empty?
45
+ names.inject(::Object) {|mod, s| mod.const_get(s)}
46
+ end
47
+
48
+ else
49
+
50
+ def self.deep_const_get(str)
51
+ ::Object.const_get(str)
52
+ end
53
+
54
+ end
55
+
56
+ end
57
+
58
+ end