kramdown 0.14.2 → 2.3.0
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.
- checksums.yaml +7 -0
- data/CONTRIBUTERS +63 -1
- data/COPYING +17 -11
- data/README.md +35 -14
- data/VERSION +1 -1
- data/bin/kramdown +92 -40
- data/data/kramdown/document.html +4 -0
- data/data/kramdown/document.latex +7 -0
- data/lib/kramdown.rb +3 -16
- data/lib/kramdown/converter.rb +42 -16
- data/lib/kramdown/converter/base.rb +102 -38
- data/lib/kramdown/converter/hash_ast.rb +38 -0
- data/lib/kramdown/converter/html.rb +232 -141
- data/lib/kramdown/converter/kramdown.rb +122 -104
- data/lib/kramdown/converter/latex.rb +95 -78
- data/lib/kramdown/converter/man.rb +300 -0
- data/lib/kramdown/converter/math_engine/mathjax.rb +32 -0
- data/lib/kramdown/converter/remove_html_tags.rb +8 -17
- data/lib/kramdown/converter/syntax_highlighter.rb +56 -0
- data/lib/kramdown/converter/syntax_highlighter/minted.rb +35 -0
- data/lib/kramdown/converter/syntax_highlighter/rouge.rb +85 -0
- data/lib/kramdown/converter/toc.rb +7 -20
- data/lib/kramdown/document.rb +30 -37
- data/lib/kramdown/element.rb +54 -27
- data/lib/kramdown/error.rb +3 -16
- data/lib/kramdown/options.rb +392 -247
- data/lib/kramdown/parser.rb +3 -16
- data/lib/kramdown/parser/base.rb +28 -33
- data/lib/kramdown/parser/html.rb +151 -119
- data/lib/kramdown/parser/kramdown.rb +87 -50
- data/lib/kramdown/parser/kramdown/abbreviation.rb +33 -27
- data/lib/kramdown/parser/kramdown/autolink.rb +7 -25
- data/lib/kramdown/parser/kramdown/blank_line.rb +6 -19
- data/lib/kramdown/parser/kramdown/block_boundary.rb +6 -18
- data/lib/kramdown/parser/kramdown/blockquote.rb +6 -19
- data/lib/kramdown/parser/kramdown/codeblock.rb +15 -24
- data/lib/kramdown/parser/kramdown/codespan.rb +20 -22
- data/lib/kramdown/parser/kramdown/emphasis.rb +15 -24
- data/lib/kramdown/parser/kramdown/eob.rb +3 -16
- data/lib/kramdown/parser/kramdown/escaped_chars.rb +3 -16
- data/lib/kramdown/parser/kramdown/extensions.rb +66 -56
- data/lib/kramdown/parser/kramdown/footnote.rb +21 -31
- data/lib/kramdown/parser/kramdown/header.rb +37 -37
- data/lib/kramdown/parser/kramdown/horizontal_rule.rb +5 -17
- data/lib/kramdown/parser/kramdown/html.rb +47 -56
- data/lib/kramdown/parser/kramdown/html_entity.rb +9 -19
- data/lib/kramdown/parser/kramdown/line_break.rb +4 -17
- data/lib/kramdown/parser/kramdown/link.rb +39 -38
- data/lib/kramdown/parser/kramdown/list.rb +124 -82
- data/lib/kramdown/parser/kramdown/math.rb +12 -24
- data/lib/kramdown/parser/kramdown/paragraph.rb +23 -24
- data/lib/kramdown/parser/kramdown/smart_quotes.rb +26 -66
- data/lib/kramdown/parser/kramdown/table.rb +41 -48
- data/lib/kramdown/parser/kramdown/typographic_symbol.rb +14 -22
- data/lib/kramdown/parser/markdown.rb +11 -23
- data/lib/kramdown/utils.rb +21 -18
- data/lib/kramdown/utils/configurable.rb +45 -0
- data/lib/kramdown/utils/entities.rb +287 -292
- data/lib/kramdown/utils/html.rb +27 -30
- data/lib/kramdown/utils/lru_cache.rb +41 -0
- data/lib/kramdown/utils/string_scanner.rb +81 -0
- data/lib/kramdown/utils/unidecoder.rb +50 -0
- data/lib/kramdown/version.rb +4 -17
- data/man/man1/kramdown.1 +340 -347
- data/test/run_tests.rb +7 -20
- data/test/test_files.rb +188 -100
- data/test/test_location.rb +216 -0
- data/test/test_string_scanner_kramdown.rb +27 -0
- data/test/testcases/block/03_paragraph/indented.html.gfm +18 -0
- data/test/testcases/block/03_paragraph/line_break_last_line.html +9 -0
- data/test/testcases/block/03_paragraph/line_break_last_line.text +9 -0
- data/test/testcases/block/03_paragraph/standalone_image.html +8 -0
- data/test/testcases/block/03_paragraph/standalone_image.text +6 -0
- data/test/testcases/block/03_paragraph/with_html_to_native.html +1 -0
- data/test/testcases/block/03_paragraph/with_html_to_native.options +1 -0
- data/test/testcases/block/03_paragraph/with_html_to_native.text +1 -0
- data/test/testcases/block/04_header/atx_header.html +15 -1
- data/test/testcases/block/04_header/atx_header.text +14 -1
- data/test/testcases/block/04_header/setext_header.html +3 -1
- data/test/testcases/block/04_header/setext_header.text +4 -1
- data/test/testcases/block/04_header/with_auto_id_stripping.html +1 -0
- data/test/testcases/block/04_header/with_auto_id_stripping.options +1 -0
- data/test/testcases/block/04_header/with_auto_id_stripping.text +1 -0
- data/test/testcases/block/04_header/with_auto_ids.html +2 -0
- data/test/testcases/block/04_header/with_auto_ids.options +1 -0
- data/test/testcases/block/04_header/with_auto_ids.text +2 -0
- data/test/testcases/block/06_codeblock/guess_lang_css_class.html +15 -0
- data/test/testcases/block/06_codeblock/guess_lang_css_class.options +2 -0
- data/test/testcases/block/06_codeblock/guess_lang_css_class.text +13 -0
- data/test/testcases/block/06_codeblock/highlighting-minted-with-opts.latex +9 -0
- data/test/testcases/block/06_codeblock/highlighting-minted-with-opts.options +4 -0
- data/test/testcases/block/06_codeblock/highlighting-minted-with-opts.text +5 -0
- data/test/testcases/block/06_codeblock/highlighting-minted.latex +8 -0
- data/test/testcases/block/06_codeblock/highlighting-minted.options +3 -0
- data/test/testcases/block/06_codeblock/highlighting-minted.text +4 -0
- data/test/testcases/block/06_codeblock/highlighting-opts.html +6 -0
- data/test/testcases/block/06_codeblock/highlighting-opts.options +7 -0
- data/test/testcases/block/06_codeblock/highlighting-opts.text +4 -0
- data/test/testcases/block/06_codeblock/highlighting.html +5 -6
- data/test/testcases/block/06_codeblock/issue_gh45.html +164 -0
- data/test/testcases/block/06_codeblock/issue_gh45.test +188 -0
- data/test/testcases/block/06_codeblock/rouge/disabled.html +2 -0
- data/test/testcases/block/06_codeblock/rouge/disabled.options +4 -0
- data/test/testcases/block/06_codeblock/rouge/disabled.text +1 -0
- data/test/testcases/block/06_codeblock/rouge/multiple.html +11 -0
- data/test/testcases/block/06_codeblock/rouge/multiple.options +4 -0
- data/test/testcases/block/06_codeblock/rouge/multiple.text +11 -0
- data/test/testcases/block/06_codeblock/rouge/simple.html +10 -0
- data/test/testcases/block/06_codeblock/rouge/simple.options +3 -0
- data/test/testcases/block/06_codeblock/rouge/simple.text +9 -0
- data/test/testcases/block/06_codeblock/with_lang_in_fenced_block.options +1 -1
- data/test/testcases/block/06_codeblock/with_lang_in_fenced_block_any_char.html +8 -0
- data/test/testcases/block/06_codeblock/with_lang_in_fenced_block_any_char.options +2 -0
- data/test/testcases/block/06_codeblock/with_lang_in_fenced_block_any_char.text +11 -0
- data/test/testcases/block/06_codeblock/with_lang_in_fenced_block_name_with_dash.html +3 -0
- data/test/testcases/block/06_codeblock/with_lang_in_fenced_block_name_with_dash.options +2 -0
- data/test/testcases/block/06_codeblock/with_lang_in_fenced_block_name_with_dash.text +4 -0
- data/test/testcases/block/07_horizontal_rule/error.html +2 -2
- data/test/testcases/block/07_horizontal_rule/normal.html +2 -0
- data/test/testcases/block/07_horizontal_rule/normal.text +3 -0
- data/test/testcases/block/08_list/brackets_in_item.latex +3 -0
- data/test/testcases/block/08_list/brackets_in_item.text +1 -0
- data/test/testcases/block/08_list/lazy_and_nested.html +9 -0
- data/test/testcases/block/08_list/lazy_and_nested.text +4 -0
- data/test/testcases/block/09_html/html5_attributes.html +2 -0
- data/test/testcases/block/09_html/html5_attributes.text +2 -0
- data/test/testcases/block/09_html/html_after_block.html +7 -0
- data/test/testcases/block/09_html/html_after_block.text +5 -0
- data/test/testcases/block/09_html/html_to_native/table_simple.html +13 -0
- data/test/testcases/block/09_html/html_to_native/table_simple.text +15 -0
- data/test/testcases/block/09_html/html_to_native/typography.html +1 -1
- data/test/testcases/block/09_html/not_parsed.html +1 -1
- data/test/testcases/block/09_html/processing_instruction.html +5 -6
- data/test/testcases/block/09_html/simple.html +1 -5
- data/test/testcases/block/09_html/simple.text +1 -5
- data/test/testcases/block/09_html/standalone_image_in_div.htmlinput +7 -0
- data/test/testcases/block/09_html/standalone_image_in_div.text +8 -0
- data/test/testcases/block/09_html/textarea.html +8 -0
- data/test/testcases/block/09_html/textarea.text +8 -0
- data/test/testcases/block/09_html/xml.html +8 -0
- data/test/testcases/block/09_html/xml.text +7 -0
- data/test/testcases/block/11_ial/simple.html +5 -1
- data/test/testcases/block/11_ial/simple.text +8 -1
- data/test/testcases/block/12_extension/options.html +4 -4
- data/test/testcases/block/12_extension/options.text +2 -0
- data/test/testcases/block/12_extension/options2.html +4 -4
- data/test/testcases/block/12_extension/options3.html +7 -6
- data/test/testcases/block/12_extension/options3.text +2 -2
- data/test/testcases/block/13_definition_list/auto_ids.html +15 -0
- data/test/testcases/block/13_definition_list/auto_ids.text +18 -0
- data/test/testcases/block/13_definition_list/item_ial.html +5 -0
- data/test/testcases/block/13_definition_list/item_ial.text +8 -0
- data/test/testcases/block/14_table/empty_tag_in_cell.html +8 -0
- data/test/testcases/block/14_table/empty_tag_in_cell.options +1 -0
- data/test/testcases/block/14_table/empty_tag_in_cell.text +1 -0
- data/test/testcases/block/14_table/errors.html +4 -0
- data/test/testcases/block/14_table/errors.text +4 -0
- data/test/testcases/block/14_table/header.html +21 -0
- data/test/testcases/block/14_table/header.text +7 -0
- data/test/testcases/block/14_table/simple.html +22 -7
- data/test/testcases/block/14_table/simple.text +4 -0
- data/test/testcases/block/14_table/table_with_footnote.html +4 -4
- data/test/testcases/block/15_math/gh_128.html +1 -0
- data/test/testcases/block/15_math/gh_128.text +1 -0
- data/test/testcases/block/15_math/no_engine.html +3 -0
- data/test/testcases/block/15_math/no_engine.options +1 -0
- data/test/testcases/block/15_math/no_engine.text +2 -0
- data/test/testcases/block/15_math/normal.html +17 -14
- data/test/testcases/block/15_math/normal.text +2 -0
- data/test/testcases/block/16_toc/toc_exclude.html +7 -7
- data/test/testcases/block/16_toc/toc_levels.html +5 -5
- data/test/testcases/block/16_toc/toc_levels.text +1 -1
- data/test/testcases/block/16_toc/toc_with_footnotes.html +5 -5
- data/test/testcases/block/16_toc/toc_with_links.html +8 -0
- data/test/testcases/block/16_toc/toc_with_links.options +2 -0
- data/test/testcases/block/16_toc/toc_with_links.text +8 -0
- data/test/testcases/cjk-line-break.html +4 -0
- data/test/testcases/cjk-line-break.options +1 -0
- data/test/testcases/cjk-line-break.text +12 -0
- data/test/testcases/man/example.man +123 -0
- data/test/testcases/man/example.text +85 -0
- data/test/testcases/man/heading-name-dash-description.man +4 -0
- data/test/testcases/man/heading-name-dash-description.text +1 -0
- data/test/testcases/man/heading-name-description.man +4 -0
- data/test/testcases/man/heading-name-description.text +2 -0
- data/test/testcases/man/heading-name-section-description.man +4 -0
- data/test/testcases/man/heading-name-section-description.text +1 -0
- data/test/testcases/man/heading-name-section.man +2 -0
- data/test/testcases/man/heading-name-section.text +1 -0
- data/test/testcases/man/heading-name.man +2 -0
- data/test/testcases/man/heading-name.text +1 -0
- data/test/testcases/man/sections.man +4 -0
- data/test/testcases/man/sections.text +11 -0
- data/test/testcases/man/text-escaping.man +8 -0
- data/test/testcases/man/text-escaping.text +7 -0
- data/test/testcases/span/01_link/empty.html +1 -1
- data/test/testcases/span/01_link/empty_title.htmlinput +3 -0
- data/test/testcases/span/01_link/empty_title.text +7 -0
- data/test/testcases/span/01_link/imagelinks.html +1 -0
- data/test/testcases/span/01_link/imagelinks.text +2 -0
- data/test/testcases/span/01_link/inline.html +1 -1
- data/test/testcases/span/01_link/latex_escaping.latex +6 -0
- data/test/testcases/span/01_link/latex_escaping.text +5 -0
- data/test/testcases/span/01_link/link_defs.html +1 -1
- data/test/testcases/span/01_link/link_defs.text +2 -1
- data/test/testcases/span/01_link/link_defs_with_ial.html +4 -0
- data/test/testcases/span/01_link/link_defs_with_ial.text +16 -0
- data/test/testcases/span/01_link/reference.html +3 -3
- data/test/testcases/span/02_emphasis/nesting.html +3 -0
- data/test/testcases/span/02_emphasis/nesting.text +4 -1
- data/test/testcases/span/02_emphasis/normal.html +19 -0
- data/test/testcases/span/02_emphasis/normal.options +1 -0
- data/test/testcases/span/02_emphasis/normal.text +17 -0
- data/test/testcases/span/03_codespan/highlighting-minted.latex +2 -0
- data/test/testcases/span/03_codespan/highlighting-minted.options +1 -0
- data/test/testcases/span/03_codespan/highlighting-minted.text +1 -0
- data/test/testcases/span/03_codespan/highlighting.html +1 -1
- data/test/testcases/span/03_codespan/normal-css-class.html +1 -0
- data/test/testcases/span/03_codespan/normal-css-class.options +2 -0
- data/test/testcases/span/03_codespan/normal-css-class.text +1 -0
- data/test/testcases/span/03_codespan/rouge/disabled.html +1 -0
- data/test/testcases/span/03_codespan/rouge/disabled.options +4 -0
- data/test/testcases/span/03_codespan/rouge/disabled.text +1 -0
- data/test/testcases/span/03_codespan/rouge/simple.html +1 -0
- data/test/testcases/span/03_codespan/rouge/simple.options +1 -0
- data/test/testcases/span/03_codespan/rouge/simple.text +1 -0
- data/test/testcases/span/04_footnote/backlink_inline.html +79 -0
- data/test/testcases/span/04_footnote/backlink_inline.options +1 -0
- data/test/testcases/span/04_footnote/backlink_inline.text +38 -0
- data/test/testcases/span/04_footnote/backlink_text.html +9 -0
- data/test/testcases/span/04_footnote/backlink_text.options +1 -0
- data/test/testcases/span/04_footnote/backlink_text.text +3 -0
- data/test/testcases/span/04_footnote/definitions.latex +2 -2
- data/test/testcases/span/04_footnote/footnote_nr.html +6 -6
- data/test/testcases/span/04_footnote/footnote_prefix.html +12 -0
- data/test/testcases/span/04_footnote/footnote_prefix.options +1 -0
- data/test/testcases/span/04_footnote/footnote_prefix.text +4 -0
- data/test/testcases/span/04_footnote/inside_footnote.html +17 -0
- data/test/testcases/span/04_footnote/inside_footnote.text +9 -0
- data/test/testcases/span/04_footnote/markers.html +16 -16
- data/test/testcases/span/04_footnote/markers.latex +3 -3
- data/test/testcases/span/04_footnote/markers.options +2 -0
- data/test/testcases/span/04_footnote/markers.text +2 -1
- data/test/testcases/span/04_footnote/placement.html +11 -0
- data/test/testcases/span/04_footnote/placement.options +1 -0
- data/test/testcases/span/04_footnote/placement.text +8 -0
- data/test/testcases/span/04_footnote/regexp_problem.html +14 -0
- data/test/testcases/span/04_footnote/regexp_problem.options +2 -0
- data/test/testcases/span/04_footnote/regexp_problem.text +52 -0
- data/test/testcases/span/04_footnote/without_backlink.html +9 -0
- data/test/testcases/span/04_footnote/without_backlink.options +1 -0
- data/test/testcases/span/04_footnote/without_backlink.text +3 -0
- data/test/testcases/span/05_html/button.html +7 -0
- data/test/testcases/span/05_html/button.text +7 -0
- data/test/testcases/span/05_html/mark_element.html +3 -0
- data/test/testcases/span/05_html/mark_element.text +3 -0
- data/test/testcases/span/05_html/normal.html +10 -1
- data/test/testcases/span/05_html/normal.text +9 -0
- data/test/testcases/span/05_html/raw_span_elements.html +2 -0
- data/test/testcases/span/05_html/raw_span_elements.text +2 -0
- data/test/testcases/span/05_html/xml.html +5 -0
- data/test/testcases/span/05_html/xml.text +5 -0
- data/test/testcases/span/abbreviations/abbrev.html +14 -1
- data/test/testcases/span/abbreviations/abbrev.text +18 -2
- data/test/testcases/span/abbreviations/in_footnote.html +9 -0
- data/test/testcases/span/abbreviations/in_footnote.text +5 -0
- data/test/testcases/span/autolinks/url_links.html +5 -4
- data/test/testcases/span/autolinks/url_links.text +1 -0
- data/test/testcases/span/line_breaks/normal.html +2 -2
- data/test/testcases/span/line_breaks/normal.latex +2 -2
- data/test/testcases/span/math/no_engine.html +1 -0
- data/test/testcases/span/math/no_engine.options +1 -0
- data/test/testcases/span/math/no_engine.text +1 -0
- data/test/testcases/span/math/normal.html +4 -3
- data/test/testcases/span/math/normal.text +2 -1
- data/test/testcases/span/text_substitutions/entities_as_char.html +1 -1
- data/test/testcases/span/text_substitutions/entities_as_char.options +1 -0
- data/test/testcases/span/text_substitutions/entities_as_char.text +1 -1
- data/test/testcases/span/text_substitutions/typography.html +22 -0
- data/test/testcases/span/text_substitutions/typography.text +22 -0
- data/test/testcases/span/text_substitutions/typography_subst.html +3 -0
- data/test/testcases/span/text_substitutions/typography_subst.latex +4 -0
- data/test/testcases/span/text_substitutions/typography_subst.options +8 -0
- data/test/testcases/span/text_substitutions/typography_subst.text +3 -0
- metadata +218 -67
- data/ChangeLog +0 -7436
- data/GPL +0 -674
- data/Rakefile +0 -306
- data/benchmark/benchmark.rb +0 -36
- data/benchmark/benchmark.sh +0 -74
- data/benchmark/generate_data.rb +0 -119
- data/benchmark/mdbasics.text +0 -306
- data/benchmark/mdsyntax.text +0 -888
- data/benchmark/testing.sh +0 -9
- data/benchmark/timing.sh +0 -10
- data/doc/bg.png +0 -0
- data/doc/default.scss.css +0 -181
- data/doc/default.template +0 -68
- data/doc/design.scss.css +0 -441
- data/doc/documentation.page +0 -84
- data/doc/documentation.template +0 -20
- data/doc/index.page +0 -94
- data/doc/installation.page +0 -88
- data/doc/links.markdown +0 -6
- data/doc/metainfo +0 -3
- data/doc/news.feed +0 -10
- data/doc/news.page +0 -29
- data/doc/options.page +0 -10
- data/doc/quickref.page +0 -598
- data/doc/sidebar.template +0 -21
- data/doc/syntax.page +0 -1700
- data/doc/tests.page +0 -91
- data/doc/virtual +0 -2
- data/lib/kramdown/compatibility.rb +0 -49
- data/lib/kramdown/utils/ordered_hash.rb +0 -100
- data/setup.rb +0 -1585
- data/test/testcases/block/07_horizontal_rule/error.html.19 +0 -7
- data/test/testcases/block/09_html/html_to_native/typography.html.19 +0 -1
- data/test/testcases/block/09_html/simple.html.19 +0 -64
- data/test/testcases/block/14_table/simple.html.19 +0 -177
- data/test/testcases/span/01_link/inline.html.19 +0 -46
- data/test/testcases/span/01_link/reference.html.19 +0 -37
- data/test/testcases/span/text_substitutions/entities_as_char.html.19 +0 -1
@@ -0,0 +1,32 @@
|
|
1
|
+
# -*- coding: utf-8; frozen_string_literal: true -*-
|
2
|
+
#
|
3
|
+
#--
|
4
|
+
# Copyright (C) 2009-2019 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::Converter::MathEngine
|
11
|
+
|
12
|
+
# Uses the MathJax javascript library for displaying math.
|
13
|
+
#
|
14
|
+
# Note that the javascript library itself is not include or linked, this has to be done
|
15
|
+
# separately. Only the math content is marked up correctly.
|
16
|
+
module Mathjax
|
17
|
+
|
18
|
+
def self.call(converter, el, opts)
|
19
|
+
value = converter.escape_html(el.value)
|
20
|
+
result = el.options[:category] == :block ? "\\[#{value}\\]\n" : "\\(#{value}\\)"
|
21
|
+
if el.attr.empty?
|
22
|
+
result
|
23
|
+
elsif el.options[:category] == :block
|
24
|
+
converter.format_as_block_html('div', el.attr, result, opts[:indent])
|
25
|
+
else
|
26
|
+
converter.format_as_span_html('span', el.attr, "$#{el.value}$")
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
end
|
31
|
+
|
32
|
+
end
|
@@ -1,25 +1,14 @@
|
|
1
|
-
# -*- coding: utf-8 -*-
|
1
|
+
# -*- coding: utf-8; frozen_string_literal: true -*-
|
2
2
|
#
|
3
3
|
#--
|
4
|
-
# Copyright (C) 2009-
|
4
|
+
# Copyright (C) 2009-2019 Thomas Leitner <t_leitner@gmx.at>
|
5
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/>.
|
6
|
+
# This file is part of kramdown which is licensed under the MIT.
|
20
7
|
#++
|
21
8
|
#
|
22
9
|
|
10
|
+
require 'kramdown/converter'
|
11
|
+
|
23
12
|
module Kramdown
|
24
13
|
|
25
14
|
module Converter
|
@@ -41,6 +30,8 @@ module Kramdown
|
|
41
30
|
end
|
42
31
|
|
43
32
|
def convert(el)
|
33
|
+
real_el, el = el, el.value if el.type == :footnote
|
34
|
+
|
44
35
|
children = el.children.dup
|
45
36
|
index = 0
|
46
37
|
while index < children.length
|
@@ -57,7 +48,7 @@ module Kramdown
|
|
57
48
|
end
|
58
49
|
end
|
59
50
|
el.children = children
|
60
|
-
el
|
51
|
+
real_el || el
|
61
52
|
end
|
62
53
|
|
63
54
|
end
|
@@ -0,0 +1,56 @@
|
|
1
|
+
# -*- coding: utf-8; frozen_string_literal: true -*-
|
2
|
+
#
|
3
|
+
#--
|
4
|
+
# Copyright (C) 2009-2019 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
|
+
module Converter
|
12
|
+
|
13
|
+
# == Container for Syntax Highlighters
|
14
|
+
#
|
15
|
+
# This module serves as container for the syntax highlighters that can be used together with
|
16
|
+
# kramdown.
|
17
|
+
#
|
18
|
+
# A syntax highlighter should not store any data itself but should use the provided converter
|
19
|
+
# object to do so (See Kramdown::Converter::Base#data).
|
20
|
+
#
|
21
|
+
# == Implementing a Syntax Highlighter
|
22
|
+
#
|
23
|
+
# Implementing a new syntax highlighter is easy because it is just an object that needs to
|
24
|
+
# respond to #call.
|
25
|
+
#
|
26
|
+
# The method #call needs to take the following arguments:
|
27
|
+
#
|
28
|
+
# converter:: This argument contains the converter object that calls the syntax highlighter. It
|
29
|
+
# can be used, for example, to store data in Kramdown::Converter::Base#data for one
|
30
|
+
# conversion run.
|
31
|
+
#
|
32
|
+
# text:: The raw text that should be highlighted.
|
33
|
+
#
|
34
|
+
# lang:: The language that the text should be highlighted for (e.g. ruby, python, ...).
|
35
|
+
#
|
36
|
+
# type:: The type of text, either :span for span-level code or :block for a codeblock.
|
37
|
+
#
|
38
|
+
# opts:: A Hash with options that may be passed from the converter.
|
39
|
+
#
|
40
|
+
# The return value of the method should be the highlighted text, suitable for the given
|
41
|
+
# converter (e.g. HTML for the HTML converter).
|
42
|
+
#
|
43
|
+
# == Special Implementation Details
|
44
|
+
#
|
45
|
+
# HTML converter:: If the syntax highlighter is used with an HTML converter, it should return
|
46
|
+
# :block type text correctly wrapped (i.e. normally inside a pre-tag, but may
|
47
|
+
# also be a table-tag or just a div-tag) but :span type text *without* a
|
48
|
+
# code-tag!
|
49
|
+
#
|
50
|
+
# Also, a syntax highlighter should store the default highlighting language for
|
51
|
+
# the invocation in the +opts+ hash under the key :default_lang.
|
52
|
+
module SyntaxHighlighter
|
53
|
+
end
|
54
|
+
|
55
|
+
end
|
56
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
# -*- coding: utf-8; frozen_string_literal: true -*-
|
2
|
+
#
|
3
|
+
#--
|
4
|
+
# Copyright (C) 2009-2019 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::Converter::SyntaxHighlighter
|
11
|
+
|
12
|
+
# Uses Minted to highlight code blocks and code spans.
|
13
|
+
module Minted
|
14
|
+
|
15
|
+
def self.call(converter, text, lang, type, _opts)
|
16
|
+
opts = converter.options[:syntax_highlighter_opts]
|
17
|
+
|
18
|
+
# Fallback to default language
|
19
|
+
lang ||= opts[:default_lang]
|
20
|
+
|
21
|
+
options = []
|
22
|
+
options << "breaklines" if opts[:wrap]
|
23
|
+
options << "linenos" if opts[:line_numbers]
|
24
|
+
options << "frame=#{opts[:frame]}" if opts[:frame]
|
25
|
+
|
26
|
+
if lang && type == :block
|
27
|
+
"\\begin{minted}[#{options.join(',')}]{#{lang}}\n#{text}\n\\end{minted}"
|
28
|
+
elsif lang && type == :span
|
29
|
+
"\\mintinline{#{lang}}{#{text}}"
|
30
|
+
else
|
31
|
+
nil
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,85 @@
|
|
1
|
+
# -*- coding: utf-8; frozen_string_literal: true -*-
|
2
|
+
#
|
3
|
+
#--
|
4
|
+
# Copyright (C) 2009-2019 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::Converter::SyntaxHighlighter
|
11
|
+
|
12
|
+
# Uses Rouge which is CSS-compatible to Pygments to highlight code blocks and code spans.
|
13
|
+
module Rouge
|
14
|
+
|
15
|
+
begin
|
16
|
+
require 'rouge'
|
17
|
+
|
18
|
+
# Highlighting via Rouge is available if this constant is +true+.
|
19
|
+
AVAILABLE = true
|
20
|
+
rescue LoadError, SyntaxError
|
21
|
+
AVAILABLE = false # :nodoc:
|
22
|
+
end
|
23
|
+
|
24
|
+
def self.call(converter, text, lang, type, call_opts)
|
25
|
+
opts = options(converter, type)
|
26
|
+
call_opts[:default_lang] = opts[:default_lang]
|
27
|
+
return nil unless lang || opts[:default_lang] || opts[:guess_lang]
|
28
|
+
|
29
|
+
lexer = ::Rouge::Lexer.find_fancy(lang || opts[:default_lang], text)
|
30
|
+
return nil if opts[:disable] || !lexer || (lexer.tag == "plaintext" && !opts[:guess_lang])
|
31
|
+
|
32
|
+
opts[:css_class] ||= 'highlight' # For backward compatibility when using Rouge 2.0
|
33
|
+
formatter = formatter_class(opts).new(opts)
|
34
|
+
formatter.format(lexer.lex(text))
|
35
|
+
end
|
36
|
+
|
37
|
+
def self.options(converter, type)
|
38
|
+
prepare_options(converter)
|
39
|
+
converter.data[:syntax_highlighter_rouge][type]
|
40
|
+
end
|
41
|
+
|
42
|
+
def self.prepare_options(converter)
|
43
|
+
return if converter.data.key?(:syntax_highlighter_rouge)
|
44
|
+
|
45
|
+
cache = converter.data[:syntax_highlighter_rouge] = {}
|
46
|
+
|
47
|
+
opts = converter.options[:syntax_highlighter_opts].dup
|
48
|
+
|
49
|
+
span_opts = opts.delete(:span)&.dup || {}
|
50
|
+
block_opts = opts.delete(:block)&.dup || {}
|
51
|
+
normalize_keys(span_opts)
|
52
|
+
normalize_keys(block_opts)
|
53
|
+
|
54
|
+
cache[:span] = opts.merge(span_opts)
|
55
|
+
cache[:span][:wrap] = false
|
56
|
+
|
57
|
+
cache[:block] = opts.merge(block_opts)
|
58
|
+
end
|
59
|
+
|
60
|
+
def self.normalize_keys(hash)
|
61
|
+
return if hash.empty?
|
62
|
+
|
63
|
+
hash.keys.each do |k|
|
64
|
+
hash[k.kind_of?(String) ? Kramdown::Options.str_to_sym(k) : k] = hash.delete(k)
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
def self.formatter_class(opts = {})
|
69
|
+
case formatter = opts[:formatter]
|
70
|
+
when Class
|
71
|
+
formatter
|
72
|
+
when /\A[[:upper:]][[:alnum:]_]*\z/
|
73
|
+
::Rouge::Formatters.const_get(formatter)
|
74
|
+
else
|
75
|
+
# Available in Rouge 2.0 or later
|
76
|
+
::Rouge::Formatters::HTMLLegacy
|
77
|
+
end
|
78
|
+
rescue NameError
|
79
|
+
# Fallback to Rouge 1.x
|
80
|
+
::Rouge::Formatters::HTML
|
81
|
+
end
|
82
|
+
|
83
|
+
end
|
84
|
+
|
85
|
+
end
|
@@ -1,26 +1,13 @@
|
|
1
|
-
# -*- coding: utf-8 -*-
|
1
|
+
# -*- coding: utf-8; frozen_string_literal: true -*-
|
2
2
|
#
|
3
3
|
#--
|
4
|
-
# Copyright (C) 2009-
|
4
|
+
# Copyright (C) 2009-2019 Thomas Leitner <t_leitner@gmx.at>
|
5
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/>.
|
6
|
+
# This file is part of kramdown which is licensed under the MIT.
|
20
7
|
#++
|
21
8
|
#
|
22
9
|
|
23
|
-
require '
|
10
|
+
require 'kramdown/converter'
|
24
11
|
|
25
12
|
module Kramdown
|
26
13
|
|
@@ -50,7 +37,7 @@ module Kramdown
|
|
50
37
|
attr['id'] = generate_id(el.options[:raw_text]) if @options[:auto_ids] && !attr['id']
|
51
38
|
add_to_toc(el, attr['id']) if attr['id']
|
52
39
|
else
|
53
|
-
el.children.each {|child| convert(child)}
|
40
|
+
el.children.each {|child| convert(child) }
|
54
41
|
end
|
55
42
|
@toc
|
56
43
|
end
|
@@ -58,10 +45,10 @@ module Kramdown
|
|
58
45
|
private
|
59
46
|
|
60
47
|
def add_to_toc(el, id)
|
61
|
-
toc_element = Element.new(:toc, el, :
|
48
|
+
toc_element = Element.new(:toc, el, id: id)
|
62
49
|
|
63
50
|
success = false
|
64
|
-
|
51
|
+
until success
|
65
52
|
if @stack.empty?
|
66
53
|
@toc.children << toc_element
|
67
54
|
@stack << toc_element
|
data/lib/kramdown/document.rb
CHANGED
@@ -1,55 +1,39 @@
|
|
1
|
-
# -*- coding: utf-8 -*-
|
1
|
+
# -*- coding: utf-8; frozen_string_literal: true -*-
|
2
2
|
#
|
3
3
|
#--
|
4
|
-
# Copyright (C) 2009-
|
4
|
+
# Copyright (C) 2009-2019 Thomas Leitner <t_leitner@gmx.at>
|
5
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/>.
|
6
|
+
# This file is part of kramdown which is licensed under the MIT.
|
20
7
|
#++
|
21
8
|
#
|
22
9
|
# = kramdown
|
23
10
|
#
|
24
|
-
# kramdown is
|
11
|
+
# kramdown is fast, pure Ruby Markdown superset converter, using a strict syntax definition and
|
25
12
|
# supporting several common extensions.
|
26
13
|
#
|
27
14
|
# The kramdown library is mainly written to support the kramdown-to-HTML conversion chain. However,
|
28
15
|
# due to its flexibility it supports other input and output formats as well. Here is a list of the
|
29
16
|
# supported formats:
|
30
17
|
#
|
31
|
-
# * input formats: kramdown (a Markdown superset), Markdown, HTML
|
32
|
-
# * output formats: HTML, kramdown, LaTeX (and therefore PDF)
|
18
|
+
# * input formats: kramdown (a Markdown superset), Markdown, GFM, HTML
|
19
|
+
# * output formats: HTML, kramdown, LaTeX (and therefore PDF), PDF via Prawn
|
33
20
|
#
|
34
21
|
# All the documentation on the available input and output formats is available at
|
35
|
-
# http://kramdown.
|
22
|
+
# http://kramdown.gettalong.org.
|
36
23
|
#
|
37
24
|
# == Usage
|
38
25
|
#
|
39
|
-
# kramdown has a
|
26
|
+
# kramdown has a simple API, so using kramdown is as easy as
|
40
27
|
#
|
41
28
|
# require 'kramdown'
|
42
29
|
#
|
43
30
|
# Kramdown::Document.new(text).to_html
|
44
31
|
#
|
45
|
-
# For detailed information have a look at the Kramdown::Document class.
|
32
|
+
# For detailed information have a look at the *\Kramdown::Document* class.
|
46
33
|
#
|
47
34
|
# == License
|
48
35
|
#
|
49
|
-
#
|
50
|
-
|
51
|
-
|
52
|
-
require 'kramdown/compatibility'
|
36
|
+
# MIT - see the COPYING file.
|
53
37
|
|
54
38
|
require 'kramdown/version'
|
55
39
|
require 'kramdown/element'
|
@@ -63,16 +47,15 @@ module Kramdown
|
|
63
47
|
|
64
48
|
# Return the data directory for kramdown.
|
65
49
|
def self.data_dir
|
66
|
-
unless defined?(
|
50
|
+
unless defined?(@data_dir)
|
67
51
|
require 'rbconfig'
|
68
|
-
|
69
|
-
|
70
|
-
raise "kramdown data directory not found! This is a bug, please report it!" unless File.directory?(
|
52
|
+
@data_dir = File.expand_path(File.join(File.dirname(__FILE__), '..', '..', 'data', 'kramdown'))
|
53
|
+
@data_dir = File.expand_path(File.join(RbConfig::CONFIG["datadir"], "kramdown")) unless File.exist?(@data_dir)
|
54
|
+
raise "kramdown data directory not found! This is a bug, please report it!" unless File.directory?(@data_dir)
|
71
55
|
end
|
72
|
-
|
56
|
+
@data_dir
|
73
57
|
end
|
74
58
|
|
75
|
-
|
76
59
|
# The main interface to kramdown.
|
77
60
|
#
|
78
61
|
# This class provides a one-stop-shop for using kramdown to convert text into various output
|
@@ -100,7 +83,6 @@ module Kramdown
|
|
100
83
|
# ::new) and the conversion phase.
|
101
84
|
attr_reader :warnings
|
102
85
|
|
103
|
-
|
104
86
|
# Create a new Kramdown document from the string +source+ and use the provided +options+. The
|
105
87
|
# options that can be used are defined in the Options module.
|
106
88
|
#
|
@@ -113,12 +95,14 @@ module Kramdown
|
|
113
95
|
# immediately available and the output can be generated.
|
114
96
|
def initialize(source, options = {})
|
115
97
|
@options = Options.merge(options).freeze
|
116
|
-
parser = (options[:input] || 'kramdown').to_s
|
98
|
+
parser = (@options[:input] || 'kramdown').to_s
|
117
99
|
parser = parser[0..0].upcase + parser[1..-1]
|
100
|
+
try_require('parser', parser)
|
118
101
|
if Parser.const_defined?(parser)
|
119
102
|
@root, @warnings = Parser.const_get(parser).parse(source, @options)
|
120
103
|
else
|
121
|
-
raise Kramdown::Error
|
104
|
+
raise Kramdown::Error, "kramdown has no parser to handle the specified " \
|
105
|
+
"input format: #{@options[:input]}"
|
122
106
|
end
|
123
107
|
end
|
124
108
|
|
@@ -127,7 +111,8 @@ module Kramdown
|
|
127
111
|
#
|
128
112
|
# For example, +to_html+ would instantiate the Kramdown::Converter::Html class.
|
129
113
|
def method_missing(id, *attr, &block)
|
130
|
-
if id.to_s =~ /^to_(\w+)$/ && (name = Utils.camelize($1)) &&
|
114
|
+
if id.to_s =~ /^to_(\w+)$/ && (name = Utils.camelize($1)) &&
|
115
|
+
try_require('converter', name) && Converter.const_defined?(name)
|
131
116
|
output, warnings = Converter.const_get(name).convert(@root, @options)
|
132
117
|
@warnings.concat(warnings)
|
133
118
|
output
|
@@ -140,7 +125,15 @@ module Kramdown
|
|
140
125
|
"<KD:Document: options=#{@options.inspect} root=#{@root.inspect} warnings=#{@warnings.inspect}>"
|
141
126
|
end
|
142
127
|
|
128
|
+
# Try requiring a parser or converter class and don't raise an error if the file is not found.
|
129
|
+
def try_require(type, name)
|
130
|
+
require("kramdown/#{type}/#{Utils.snake_case(name)}")
|
131
|
+
true
|
132
|
+
rescue LoadError
|
133
|
+
true
|
134
|
+
end
|
135
|
+
protected :try_require
|
136
|
+
|
143
137
|
end
|
144
138
|
|
145
139
|
end
|
146
|
-
|