bean-kramdown 0.13.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 (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