bean-kramdown 0.13.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (60) hide show
  1. data/AUTHORS +1 -0
  2. data/CONTRIBUTERS +11 -0
  3. data/COPYING +24 -0
  4. data/ChangeLog +6683 -0
  5. data/GPL +674 -0
  6. data/README +43 -0
  7. data/VERSION +1 -0
  8. data/bin/kramdown +78 -0
  9. data/lib/kramdown.rb +23 -0
  10. data/lib/kramdown/compatibility.rb +49 -0
  11. data/lib/kramdown/converter.rb +41 -0
  12. data/lib/kramdown/converter/base.rb +169 -0
  13. data/lib/kramdown/converter/bean_html.rb +71 -0
  14. data/lib/kramdown/converter/html.rb +411 -0
  15. data/lib/kramdown/converter/kramdown.rb +428 -0
  16. data/lib/kramdown/converter/latex.rb +607 -0
  17. data/lib/kramdown/converter/toc.rb +82 -0
  18. data/lib/kramdown/document.rb +119 -0
  19. data/lib/kramdown/element.rb +524 -0
  20. data/lib/kramdown/error.rb +30 -0
  21. data/lib/kramdown/options.rb +373 -0
  22. data/lib/kramdown/parser.rb +39 -0
  23. data/lib/kramdown/parser/base.rb +136 -0
  24. data/lib/kramdown/parser/bean_kramdown.rb +25 -0
  25. data/lib/kramdown/parser/bean_kramdown/info_box.rb +52 -0
  26. data/lib/kramdown/parser/bean_kramdown/oembed.rb +230 -0
  27. data/lib/kramdown/parser/html.rb +570 -0
  28. data/lib/kramdown/parser/kramdown.rb +339 -0
  29. data/lib/kramdown/parser/kramdown/abbreviation.rb +71 -0
  30. data/lib/kramdown/parser/kramdown/autolink.rb +53 -0
  31. data/lib/kramdown/parser/kramdown/blank_line.rb +43 -0
  32. data/lib/kramdown/parser/kramdown/block_boundary.rb +46 -0
  33. data/lib/kramdown/parser/kramdown/blockquote.rb +51 -0
  34. data/lib/kramdown/parser/kramdown/codeblock.rb +63 -0
  35. data/lib/kramdown/parser/kramdown/codespan.rb +56 -0
  36. data/lib/kramdown/parser/kramdown/emphasis.rb +70 -0
  37. data/lib/kramdown/parser/kramdown/eob.rb +39 -0
  38. data/lib/kramdown/parser/kramdown/escaped_chars.rb +38 -0
  39. data/lib/kramdown/parser/kramdown/extensions.rb +204 -0
  40. data/lib/kramdown/parser/kramdown/footnote.rb +74 -0
  41. data/lib/kramdown/parser/kramdown/header.rb +68 -0
  42. data/lib/kramdown/parser/kramdown/horizontal_rule.rb +39 -0
  43. data/lib/kramdown/parser/kramdown/html.rb +169 -0
  44. data/lib/kramdown/parser/kramdown/html_entity.rb +44 -0
  45. data/lib/kramdown/parser/kramdown/image.rb +157 -0
  46. data/lib/kramdown/parser/kramdown/line_break.rb +38 -0
  47. data/lib/kramdown/parser/kramdown/link.rb +154 -0
  48. data/lib/kramdown/parser/kramdown/list.rb +240 -0
  49. data/lib/kramdown/parser/kramdown/math.rb +65 -0
  50. data/lib/kramdown/parser/kramdown/paragraph.rb +63 -0
  51. data/lib/kramdown/parser/kramdown/smart_quotes.rb +214 -0
  52. data/lib/kramdown/parser/kramdown/table.rb +178 -0
  53. data/lib/kramdown/parser/kramdown/typographic_symbol.rb +52 -0
  54. data/lib/kramdown/parser/markdown.rb +69 -0
  55. data/lib/kramdown/utils.rb +42 -0
  56. data/lib/kramdown/utils/entities.rb +348 -0
  57. data/lib/kramdown/utils/html.rb +85 -0
  58. data/lib/kramdown/utils/ordered_hash.rb +100 -0
  59. data/lib/kramdown/version.rb +28 -0
  60. metadata +140 -0
data/README ADDED
@@ -0,0 +1,43 @@
1
+ = kramdown
2
+
3
+ kramdown is yet-another-markdown-parser but fast, pure Ruby, using a strict syntax definition and
4
+ supporting several common extensions. The syntax definition for the kramdown syntax can be found in
5
+ doc/syntax.page and a quick reference is available in doc/quickref.page.
6
+
7
+ The kramdown library is mainly written to support the kramdown-to-HTML conversion chain. However,
8
+ due to its flexibility it supports other input and output formats as well. Here is a list of the
9
+ supported formats:
10
+
11
+ * input formats: kramdown (a Markdown superset), Markdown, HTML
12
+ * output formats: HTML, kramdown, LaTeX (and therefore PDF)
13
+
14
+ All the documentation on the available input and output formats is available in the doc/ directory
15
+ and online at http://kramdown.rubyforge.org.
16
+
17
+
18
+ == Usage
19
+
20
+ kramdown has a basic *Cloth API, so using kramdown is as easy as
21
+
22
+ require 'kramdown'
23
+
24
+ Kramdown::Document.new(text).to_html
25
+
26
+ For detailed information have a look at the API documentation of the Kramdown::Document class.
27
+
28
+ The full API documentation is available at http://kramdown.rubyforge.org/rdoc/, other sites with an
29
+ API documentation for kramdown probably don't provide the complete documentation!
30
+
31
+
32
+ == Development
33
+
34
+ Just clone the git repository as described in doc/installation.page and you are good to go. You
35
+ probably want to install `rake` so that you can use the provided rake tasks. Aside from that:
36
+
37
+ * The +tidy+ binary needs to be installed for the automatically derived tests to work.
38
+ * The +latex+ binary needs to be installed for the latex-compilation tests to work.
39
+
40
+
41
+ == License
42
+
43
+ GPLv3 - see the COPYING file.
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 0.13.7
@@ -0,0 +1,78 @@
1
+ #! /Users/vincent/.rvm/rubies/ruby-1.9.3-p125/bin/ruby
2
+ # -*- coding: utf-8 -*-
3
+ #
4
+ #--
5
+ # Copyright (C) 2009-2012 Thomas Leitner <t_leitner@gmx.at>
6
+ #
7
+ # This file is part of kramdown.
8
+ #
9
+ # kramdown is free software: you can redistribute it and/or modify
10
+ # it under the terms of the GNU General Public License as published by
11
+ # the Free Software Foundation, either version 3 of the License, or
12
+ # (at your option) any later version.
13
+ #
14
+ # This program is distributed in the hope that it will be useful,
15
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
16
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17
+ # GNU General Public License for more details.
18
+ #
19
+ # You should have received a copy of the GNU General Public License
20
+ # along with this program. If not, see <http://www.gnu.org/licenses/>.
21
+ #++
22
+ #
23
+
24
+ require 'optparse'
25
+ require 'kramdown'
26
+
27
+ options = {}
28
+ format = 'html'
29
+ OptionParser.new do |opts|
30
+ opts.banner = "Usage: kramdown [options] [FILE FILE ...]"
31
+ opts.summary_indent = ' '*4
32
+
33
+ opts.separator ""
34
+ opts.separator "Command line options:"
35
+ opts.separator ""
36
+
37
+ opts.on("-i", "--input ARG", "Specify the input format: kramdown (default) or html") {|v| options[:input] = v}
38
+ opts.on("-o", "--output ARG", "Specify the output format: html (default), kramdown or latex") {|v| format = v}
39
+
40
+ opts.on("-v", "--version", "Show the version of kramdown") do
41
+ puts Kramdown::VERSION
42
+ exit
43
+ end
44
+ opts.on("-h", "--help", "Show the help") do
45
+ puts opts.summarize('', 5, 72)
46
+ exit
47
+ end
48
+
49
+ opts.separator ""
50
+ opts.separator "kramdown options:"
51
+ opts.separator ""
52
+
53
+ Kramdown::Options.definitions.each do |n, definition|
54
+ no = n.to_s.tr('_', '-')
55
+ if definition.type == Kramdown::Options::Boolean
56
+ opts.on("--[no-]#{no}") {|v| options[n] = Kramdown::Options.parse(n, v)}
57
+ else
58
+ type = definition.type
59
+ type = String if type == Symbol || type == Object
60
+ opts.on("--#{no} ARG", type) {|v| options[n] = Kramdown::Options.parse(n, v)}
61
+ end
62
+
63
+ definition.desc.split(/\n/).each do |line|
64
+ opts.separator opts.summary_indent + ' '*6 + line
65
+ end
66
+ opts.separator ''
67
+ end
68
+
69
+ end.parse!
70
+
71
+ begin
72
+ doc = Kramdown::Document.new(ARGF.read, options)
73
+ puts doc.send("to_#{format}")
74
+ doc.warnings.each {|warn| $stderr.puts "Warning: #{warn}"}
75
+ rescue Kramdown::Error => e
76
+ $stderr.puts "Error: #{e.message}"
77
+ exit(1)
78
+ end
@@ -0,0 +1,23 @@
1
+ # -*- coding: utf-8 -*-
2
+ #
3
+ #--
4
+ # Copyright (C) 2009-2012 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
+ require 'kramdown/document'
@@ -0,0 +1,49 @@
1
+ # -*- coding: utf-8 -*-
2
+ #
3
+ #--
4
+ # Copyright (C) 2009-2012 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
+ # All the code in this file is backported from Ruby 1.8.7 sothat kramdown works under 1.8.5
23
+ #
24
+ # :stopdoc:
25
+
26
+ if RUBY_VERSION <= '1.8.6'
27
+ require 'rexml/parsers/baseparser'
28
+ module REXML
29
+ module Parsers
30
+ class BaseParser
31
+ UNAME_STR= "(?:#{NCNAME_STR}:)?#{NCNAME_STR}" unless const_defined?(:UNAME_STR)
32
+ end
33
+ end
34
+ end
35
+
36
+ if !String.instance_methods.include?("start_with?")
37
+
38
+ class String
39
+ def start_with?(str)
40
+ self[0, str.length] == str
41
+ end
42
+ def end_with?(str)
43
+ self[-str.length, str.length] == str
44
+ end
45
+ end
46
+
47
+ end
48
+
49
+ end
@@ -0,0 +1,41 @@
1
+ # -*- coding: utf-8 -*-
2
+ #
3
+ #--
4
+ # Copyright (C) 2009-2012 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
+ # This module contains all available converters, i.e. classes that take a root Element and convert
26
+ # it to a specific output format. The result is normally a string. For example, the
27
+ # Converter::Html module converts an element tree into valid HTML.
28
+ #
29
+ # Converters use the Base class for common functionality (like applying a template to the output)
30
+ # \- see its API documentation for how to create a custom converter class.
31
+ module Converter
32
+
33
+ autoload :Base, 'kramdown/converter/base'
34
+ autoload :Html, 'kramdown/converter/html'
35
+ autoload :Latex, 'kramdown/converter/latex'
36
+ autoload :Kramdown, 'kramdown/converter/kramdown'
37
+ autoload :Toc, 'kramdown/converter/toc'
38
+
39
+ end
40
+
41
+ end
@@ -0,0 +1,169 @@
1
+ # -*- coding: utf-8 -*-
2
+ #
3
+ #--
4
+ # Copyright (C) 2009-2012 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
+ require 'erb'
24
+
25
+ module Kramdown
26
+
27
+ module Converter
28
+
29
+ # == \Base class for converters
30
+ #
31
+ # This class serves as base class for all converters. It provides methods that can/should be
32
+ # used by all converters (like #generate_id) as well as common functionality that is
33
+ # automatically applied to the result (for example, embedding the output into a template).
34
+ #
35
+ # A converter object is used as a throw-away object, i.e. it is only used for storing the needed
36
+ # state information during conversion. Therefore one can't instantiate a converter object
37
+ # directly but only use the Base::convert method.
38
+ #
39
+ # == Implementing a converter
40
+ #
41
+ # Implementing a new converter is rather easy: just derive a new class from this class and put
42
+ # it in the Kramdown::Converter module (the latter is only needed if auto-detection should work
43
+ # properly). Then you need to implement the #convert method which has to contain the conversion
44
+ # code for converting an element and has to return the conversion result.
45
+ #
46
+ # The actual transformation of the document tree can be done in any way. However, writing one
47
+ # method per element type is a straight forward way to do it - this is how the Html and Latex
48
+ # converters do the transformation.
49
+ #
50
+ # Have a look at the Base::convert method for additional information!
51
+ class Base
52
+
53
+ # Can be used by a converter for storing arbitrary information during the conversion process.
54
+ attr_reader :data
55
+
56
+ # The hash with the conversion options.
57
+ attr_reader :options
58
+
59
+ # The root element that is converted.
60
+ attr_reader :root
61
+
62
+ # The warnings array.
63
+ attr_reader :warnings
64
+
65
+ # Initialize the converter with the given +root+ element and +options+ hash.
66
+ def initialize(root, options)
67
+ @options = options
68
+ @root = root
69
+ @data = {}
70
+ @warnings = []
71
+ end
72
+ private_class_method(:new, :allocate)
73
+
74
+ # Convert the element tree +tree+ and return the resulting conversion object (normally a
75
+ # string) and an array with warning messages. The parameter +options+ specifies the conversion
76
+ # options that should be used.
77
+ #
78
+ # Initializes a new instance of the calling class and then calls the #convert method with
79
+ # +tree+ as parameter. If the +template+ option is specified and non-empty, the result is
80
+ # rendered into the specified template. The template resolution is done in the following way:
81
+ #
82
+ # 1. Look in the current working directory for the template.
83
+ #
84
+ # 2. Append +.convertername+ (e.g. +.html+) to the template name and look for the resulting
85
+ # file in the current working directory.
86
+ #
87
+ # 3. Append +.convertername+ to the template name and look for it in the kramdown data
88
+ # directory.
89
+ def self.convert(tree, options = {})
90
+ converter = new(tree, ::Kramdown::Options.merge(options.merge(tree.options[:options] || {})))
91
+ result = converter.convert(tree)
92
+ result = apply_template(converter, result) if !converter.options[:template].empty?
93
+ [result, converter.warnings]
94
+ end
95
+
96
+ # Convert the element +el+ and return the resulting object.
97
+ #
98
+ # This is the only method that has to be implemented by sub-classes!
99
+ def convert(el)
100
+ raise NotImplementedError
101
+ end
102
+
103
+ # Apply the +template+ using +body+ as the body string.
104
+ def self.apply_template(converter, body) # :nodoc:
105
+ erb = ERB.new(get_template(converter.options[:template]))
106
+ obj = Object.new
107
+ obj.instance_variable_set(:@converter, converter)
108
+ obj.instance_variable_set(:@body, body)
109
+ erb.result(obj.instance_eval{binding})
110
+ end
111
+
112
+ # Return the template specified by +template+.
113
+ def self.get_template(template) # :nodoc:
114
+ format_ext = '.' + self.name.split(/::/).last.downcase
115
+ shipped = File.join(::Kramdown.data_dir, template + format_ext)
116
+ if File.exist?(template)
117
+ File.read(template)
118
+ elsif File.exist?(template + format_ext)
119
+ File.read(template + format_ext)
120
+ elsif File.exist?(shipped)
121
+ File.read(shipped)
122
+ else
123
+ raise "The specified template file #{template} does not exist"
124
+ end
125
+ end
126
+
127
+ # Add the given warning +text+ to the warning array.
128
+ def warning(text)
129
+ @warnings << text
130
+ end
131
+
132
+ # Return +true+ if the header element +el+ should be used for the table of contents (as
133
+ # specified by the +toc_levels+ option).
134
+ def in_toc?(el)
135
+ @options[:toc_levels].include?(el.options[:level])
136
+ end
137
+
138
+ # Generate an unique alpha-numeric ID from the the string +str+ for use as a header ID.
139
+ #
140
+ # Uses the option +auto_id_prefix+: the value of this option is prepended to every generated
141
+ # ID.
142
+ def generate_id(str)
143
+ gen_id = str.gsub(/^[^a-zA-Z]+/, '')
144
+ gen_id.tr!('^a-zA-Z0-9 -', '')
145
+ gen_id.tr!(' ', '-')
146
+ gen_id.downcase!
147
+ gen_id = 'section' if gen_id.length == 0
148
+ @used_ids ||= {}
149
+ if @used_ids.has_key?(gen_id)
150
+ gen_id += '-' << (@used_ids[gen_id] += 1).to_s
151
+ else
152
+ @used_ids[gen_id] = 0
153
+ end
154
+ @options[:auto_id_prefix] + gen_id
155
+ end
156
+
157
+ SMART_QUOTE_INDICES = {:lsquo => 0, :rsquo => 1, :ldquo => 2, :rdquo => 3} # :nodoc:
158
+
159
+ # Return the entity that represents the given smart_quote element.
160
+ def smart_quote_entity(el)
161
+ res = @options[:smart_quotes][SMART_QUOTE_INDICES[el.value]]
162
+ ::Kramdown::Utils::Entities.entity(res)
163
+ end
164
+
165
+ end
166
+
167
+ end
168
+
169
+ end
@@ -0,0 +1,71 @@
1
+ require 'rexml/parsers/baseparser'
2
+
3
+ module Kramdown
4
+
5
+ module Converter
6
+
7
+ # Converts a Kramdown::Document to HTML.
8
+ #
9
+ # You can customize the HTML converter by sub-classing it and overriding the +convert_NAME+
10
+ # methods. Each such method takes the following parameters:
11
+ #
12
+ # [+el+] The element of type +NAME+ to be converted.
13
+ #
14
+ # [+indent+] A number representing the current amount of spaces for indent (only used for
15
+ # block-level elements).
16
+ #
17
+ # The return value of such a method has to be a string containing the element +el+ formatted as
18
+ # HTML element.
19
+ class Html < Base
20
+
21
+ def convert_info_box(el, indent)
22
+ if el.attr['class']
23
+ el.attr['class'] = el.attr['class'].include?('test') ?
24
+ el.attr['class'] :
25
+ el.attr['class'].split.unshift('test').reject(&:empty?).join(' ')
26
+ else
27
+ el.attr['class'] = 'infoBox'
28
+ end
29
+
30
+ "#{' '*indent}<div#{html_attributes(el.attr)}>\n#{inner(el, indent)}#{' '*indent}</div>\n"
31
+ end
32
+
33
+ def convert_oembed(el, indent)
34
+ provider = el.attr['provider_name']
35
+ el.attr['provider_name'] = nil
36
+ el_id = ""
37
+ if el.attr['html']
38
+ oembed_html = el.attr['html']
39
+ el.attr['html'] = nil
40
+ end
41
+ if el.attr['id']
42
+ el_id = " aria-labelledby=\"#{el.attr['id']}\""
43
+ el.attr['id'] = nil
44
+ end
45
+ if el.attr['role'] === "img"
46
+ "#{' '*indent}<figure%s#{html_attributes(el.attr)}>#{inner(el, indent)}</figure>\n" % el_id
47
+ else
48
+ if provider.casecmp "twitter"
49
+ "#{' '*indent}<figure#{html_attributes(el.attr)}>#{oembed_html}#{inner(el, indent)}</figure>\n"
50
+ else
51
+ "#{' '*indent}<figure%s#{html_attributes(el.attr)}>#{oembed_html}#{inner(el, indent)}</figure>\n" % el_id
52
+ end
53
+ end
54
+ end
55
+
56
+ def convert_figure(el, indent)
57
+ "#{' '*indent}<figure#{html_attributes(el.attr)}>#{inner(el, indent)}</figure>\n"
58
+ end
59
+
60
+ def convert_figCaption(el, indent)
61
+ id = ""
62
+ if el.attr['id']
63
+ id = " id=\"#{el.attr['id']}\""
64
+ el.attr['id'] = nil
65
+ end
66
+ "#{' '*indent}<figCaption%s#{html_attributes(el.attr)}>#{escape_html(el.value)}</figCaption>\n" % id
67
+ end
68
+
69
+ end
70
+ end
71
+ end