newstile 1.0.1
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.
- data/AUTHORS +1 -0
- data/CONTRIBUTERS +6 -0
- data/COPYING +24 -0
- data/ChangeLog +5489 -0
- data/GPL +674 -0
- data/README +31 -0
- data/Rakefile +342 -0
- data/VERSION +1 -0
- data/benchmark/benchmark.rb +34 -0
- data/benchmark/generate_data.rb +112 -0
- data/benchmark/historic-jruby-1.4.0.dat +7 -0
- data/benchmark/historic-ruby-1.8.6.dat +7 -0
- data/benchmark/historic-ruby-1.8.7.dat +7 -0
- data/benchmark/historic-ruby-1.9.1p243.dat +7 -0
- data/benchmark/historic-ruby-1.9.2dev.dat +7 -0
- data/benchmark/mdbasics.text +306 -0
- data/benchmark/mdsyntax.text +888 -0
- data/benchmark/static-jruby-1.4.0.dat +7 -0
- data/benchmark/static-ruby-1.8.6.dat +7 -0
- data/benchmark/static-ruby-1.8.7.dat +7 -0
- data/benchmark/static-ruby-1.9.1p243.dat +7 -0
- data/benchmark/static-ruby-1.9.2dev.dat +7 -0
- data/benchmark/testing.sh +9 -0
- data/benchmark/timing.sh +10 -0
- data/bin/newstile +82 -0
- data/data/newstile/document.html +18 -0
- data/data/newstile/document.latex +43 -0
- data/doc/default.scss.css +519 -0
- data/doc/default.template +80 -0
- data/doc/documentation.page +72 -0
- data/doc/index.page +96 -0
- data/doc/installation.page +90 -0
- data/doc/links.markdown +6 -0
- data/doc/news.feed +10 -0
- data/doc/news.page +28 -0
- data/doc/quickref.page +564 -0
- data/doc/syntax.page +1615 -0
- data/doc/tests.page +51 -0
- data/doc/virtual +2 -0
- data/lib/newstile.rb +23 -0
- data/lib/newstile/compatibility.rb +34 -0
- data/lib/newstile/converter.rb +43 -0
- data/lib/newstile/converter/base.rb +111 -0
- data/lib/newstile/converter/html.rb +405 -0
- data/lib/newstile/converter/latex.rb +577 -0
- data/lib/newstile/converter/markdown.rb +426 -0
- data/lib/newstile/converter/newstile.rb +426 -0
- data/lib/newstile/document.rb +168 -0
- data/lib/newstile/error.rb +27 -0
- data/lib/newstile/options.rb +296 -0
- data/lib/newstile/parser.rb +39 -0
- data/lib/newstile/parser/base.rb +94 -0
- data/lib/newstile/parser/html.rb +499 -0
- data/lib/newstile/parser/newstile.rb +325 -0
- data/lib/newstile/parser/newstile/abbreviation.rb +66 -0
- data/lib/newstile/parser/newstile/attribute_list.rb +111 -0
- data/lib/newstile/parser/newstile/autolink.rb +54 -0
- data/lib/newstile/parser/newstile/blank_line.rb +43 -0
- data/lib/newstile/parser/newstile/block_boundary.rb +46 -0
- data/lib/newstile/parser/newstile/blockquote.rb +63 -0
- data/lib/newstile/parser/newstile/codeblock.rb +60 -0
- data/lib/newstile/parser/newstile/codespan.rb +57 -0
- data/lib/newstile/parser/newstile/emphasis.rb +70 -0
- data/lib/newstile/parser/newstile/eob.rb +39 -0
- data/lib/newstile/parser/newstile/escaped_chars.rb +38 -0
- data/lib/newstile/parser/newstile/extension.rb +116 -0
- data/lib/newstile/parser/newstile/footnote.rb +74 -0
- data/lib/newstile/parser/newstile/header.rb +84 -0
- data/lib/newstile/parser/newstile/horizontal_rule.rb +39 -0
- data/lib/newstile/parser/newstile/html.rb +175 -0
- data/lib/newstile/parser/newstile/html_entity.rb +39 -0
- data/lib/newstile/parser/newstile/line_break.rb +38 -0
- data/lib/newstile/parser/newstile/link.rb +177 -0
- data/lib/newstile/parser/newstile/list.rb +239 -0
- data/lib/newstile/parser/newstile/math.rb +64 -0
- data/lib/newstile/parser/newstile/paragraph.rb +55 -0
- data/lib/newstile/parser/newstile/smart_quotes.rb +214 -0
- data/lib/newstile/parser/newstile/table.rb +134 -0
- data/lib/newstile/parser/newstile/typographic_symbol.rb +54 -0
- data/lib/newstile/utils.rb +37 -0
- data/lib/newstile/utils/entities.rb +336 -0
- data/lib/newstile/utils/html.rb +75 -0
- data/lib/newstile/utils/ordered_hash.rb +79 -0
- data/lib/newstile/version.rb +28 -0
- data/man/man1/newstile.1 +246 -0
- data/setup.rb +1585 -0
- data/test/run_tests.rb +59 -0
- data/test/test_files.rb +162 -0
- data/test/testcases/block/01_blank_line/spaces.html +1 -0
- data/test/testcases/block/01_blank_line/spaces.text +3 -0
- data/test/testcases/block/01_blank_line/tabs.html +1 -0
- data/test/testcases/block/01_blank_line/tabs.text +6 -0
- data/test/testcases/block/02_eob/beginning.html +1 -0
- data/test/testcases/block/02_eob/beginning.text +3 -0
- data/test/testcases/block/02_eob/end.html +1 -0
- data/test/testcases/block/02_eob/end.text +3 -0
- data/test/testcases/block/02_eob/middle.html +1 -0
- data/test/testcases/block/02_eob/middle.text +5 -0
- data/test/testcases/block/03_paragraph/indented.html +18 -0
- data/test/testcases/block/03_paragraph/indented.text +19 -0
- data/test/testcases/block/03_paragraph/no_newline_at_end.html +5 -0
- data/test/testcases/block/03_paragraph/no_newline_at_end.text +5 -0
- data/test/testcases/block/03_paragraph/one_para.html +1 -0
- data/test/testcases/block/03_paragraph/one_para.text +1 -0
- data/test/testcases/block/03_paragraph/two_para.html +4 -0
- data/test/testcases/block/03_paragraph/two_para.text +4 -0
- data/test/testcases/block/04_header/atx_header.html +37 -0
- data/test/testcases/block/04_header/atx_header.text +34 -0
- data/test/testcases/block/04_header/atx_header_no_newline_at_end.html +1 -0
- data/test/testcases/block/04_header/atx_header_no_newline_at_end.text +1 -0
- data/test/testcases/block/04_header/setext_header.html +30 -0
- data/test/testcases/block/04_header/setext_header.html.19 +30 -0
- data/test/testcases/block/04_header/setext_header.text +36 -0
- data/test/testcases/block/04_header/setext_header_no_newline_at_end.html +1 -0
- data/test/testcases/block/04_header/setext_header_no_newline_at_end.text +2 -0
- data/test/testcases/block/04_header/with_auto_id_prefix.html +3 -0
- data/test/testcases/block/04_header/with_auto_id_prefix.options +2 -0
- data/test/testcases/block/04_header/with_auto_id_prefix.text +3 -0
- data/test/testcases/block/04_header/with_auto_ids.html +17 -0
- data/test/testcases/block/04_header/with_auto_ids.options +1 -0
- data/test/testcases/block/04_header/with_auto_ids.text +19 -0
- data/test/testcases/block/05_blockquote/indented.html +25 -0
- data/test/testcases/block/05_blockquote/indented.text +14 -0
- data/test/testcases/block/05_blockquote/lazy.html +34 -0
- data/test/testcases/block/05_blockquote/lazy.text +20 -0
- data/test/testcases/block/05_blockquote/nested.html +10 -0
- data/test/testcases/block/05_blockquote/nested.text +6 -0
- data/test/testcases/block/05_blockquote/no_newline_at_end.html +4 -0
- data/test/testcases/block/05_blockquote/no_newline_at_end.text +2 -0
- data/test/testcases/block/05_blockquote/with_code_blocks.html +15 -0
- data/test/testcases/block/05_blockquote/with_code_blocks.text +11 -0
- data/test/testcases/block/06_codeblock/error.html +4 -0
- data/test/testcases/block/06_codeblock/error.text +4 -0
- data/test/testcases/block/06_codeblock/lazy.html +4 -0
- data/test/testcases/block/06_codeblock/lazy.text +5 -0
- data/test/testcases/block/06_codeblock/no_newline_at_end.html +2 -0
- data/test/testcases/block/06_codeblock/no_newline_at_end.text +1 -0
- data/test/testcases/block/06_codeblock/no_newline_at_end_1.html +2 -0
- data/test/testcases/block/06_codeblock/no_newline_at_end_1.text +2 -0
- data/test/testcases/block/06_codeblock/normal.html +13 -0
- data/test/testcases/block/06_codeblock/normal.text +10 -0
- data/test/testcases/block/06_codeblock/tilde_syntax.html +7 -0
- data/test/testcases/block/06_codeblock/tilde_syntax.text +9 -0
- data/test/testcases/block/06_codeblock/whitespace.html +3 -0
- data/test/testcases/block/06_codeblock/whitespace.text +3 -0
- data/test/testcases/block/06_codeblock/with_blank_line.html +13 -0
- data/test/testcases/block/06_codeblock/with_blank_line.text +12 -0
- data/test/testcases/block/06_codeblock/with_eob_marker.html +6 -0
- data/test/testcases/block/06_codeblock/with_eob_marker.text +5 -0
- data/test/testcases/block/06_codeblock/with_ial.html +6 -0
- data/test/testcases/block/06_codeblock/with_ial.text +5 -0
- data/test/testcases/block/07_horizontal_rule/error.html +7 -0
- data/test/testcases/block/07_horizontal_rule/error.html.19 +7 -0
- data/test/testcases/block/07_horizontal_rule/error.text +7 -0
- data/test/testcases/block/07_horizontal_rule/normal.html +17 -0
- data/test/testcases/block/07_horizontal_rule/normal.text +17 -0
- data/test/testcases/block/07_horizontal_rule/sepspaces.html +3 -0
- data/test/testcases/block/07_horizontal_rule/sepspaces.text +3 -0
- data/test/testcases/block/07_horizontal_rule/septabs.html +3 -0
- data/test/testcases/block/07_horizontal_rule/septabs.text +3 -0
- data/test/testcases/block/08_list/escaping.html +17 -0
- data/test/testcases/block/08_list/escaping.text +17 -0
- data/test/testcases/block/08_list/item_ial.html +7 -0
- data/test/testcases/block/08_list/item_ial.text +5 -0
- data/test/testcases/block/08_list/lazy.html +39 -0
- data/test/testcases/block/08_list/lazy.text +29 -0
- data/test/testcases/block/08_list/list_and_hr.html +9 -0
- data/test/testcases/block/08_list/list_and_hr.text +5 -0
- data/test/testcases/block/08_list/list_and_others.html +40 -0
- data/test/testcases/block/08_list/list_and_others.text +26 -0
- data/test/testcases/block/08_list/mixed.html +117 -0
- data/test/testcases/block/08_list/mixed.text +66 -0
- data/test/testcases/block/08_list/nested.html +17 -0
- data/test/testcases/block/08_list/nested.text +7 -0
- data/test/testcases/block/08_list/other_first_element.html +39 -0
- data/test/testcases/block/08_list/other_first_element.text +18 -0
- data/test/testcases/block/08_list/simple_ol.html +19 -0
- data/test/testcases/block/08_list/simple_ol.text +13 -0
- data/test/testcases/block/08_list/simple_ul.html +48 -0
- data/test/testcases/block/08_list/simple_ul.text +36 -0
- data/test/testcases/block/08_list/single_item.html +3 -0
- data/test/testcases/block/08_list/single_item.text +1 -0
- data/test/testcases/block/08_list/special_cases.html +55 -0
- data/test/testcases/block/08_list/special_cases.text +35 -0
- data/test/testcases/block/09_html/comment.html +18 -0
- data/test/testcases/block/09_html/comment.text +15 -0
- data/test/testcases/block/09_html/content_model/deflists.html +6 -0
- data/test/testcases/block/09_html/content_model/deflists.options +1 -0
- data/test/testcases/block/09_html/content_model/deflists.text +6 -0
- data/test/testcases/block/09_html/content_model/tables.html +14 -0
- data/test/testcases/block/09_html/content_model/tables.options +1 -0
- data/test/testcases/block/09_html/content_model/tables.text +14 -0
- data/test/testcases/block/09_html/html_and_codeblocks.html +15 -0
- data/test/testcases/block/09_html/html_and_codeblocks.options +1 -0
- data/test/testcases/block/09_html/html_and_codeblocks.text +13 -0
- data/test/testcases/block/09_html/html_to_native/code.html +10 -0
- data/test/testcases/block/09_html/html_to_native/code.text +9 -0
- data/test/testcases/block/09_html/html_to_native/comment.html +7 -0
- data/test/testcases/block/09_html/html_to_native/comment.text +8 -0
- data/test/testcases/block/09_html/html_to_native/emphasis.html +3 -0
- data/test/testcases/block/09_html/html_to_native/emphasis.text +3 -0
- data/test/testcases/block/09_html/html_to_native/entity.html +1 -0
- data/test/testcases/block/09_html/html_to_native/entity.text +1 -0
- data/test/testcases/block/09_html/html_to_native/header.html +6 -0
- data/test/testcases/block/09_html/html_to_native/header.options +2 -0
- data/test/testcases/block/09_html/html_to_native/header.text +6 -0
- data/test/testcases/block/09_html/html_to_native/list_dl.html +8 -0
- data/test/testcases/block/09_html/html_to_native/list_dl.text +8 -0
- data/test/testcases/block/09_html/html_to_native/list_ol.html +15 -0
- data/test/testcases/block/09_html/html_to_native/list_ol.text +17 -0
- data/test/testcases/block/09_html/html_to_native/list_ul.html +19 -0
- data/test/testcases/block/09_html/html_to_native/list_ul.text +22 -0
- data/test/testcases/block/09_html/html_to_native/options +1 -0
- data/test/testcases/block/09_html/html_to_native/paragraph.html +3 -0
- data/test/testcases/block/09_html/html_to_native/paragraph.text +4 -0
- data/test/testcases/block/09_html/html_to_native/table_normal.html +14 -0
- data/test/testcases/block/09_html/html_to_native/table_normal.text +12 -0
- data/test/testcases/block/09_html/html_to_native/table_simple.html +48 -0
- data/test/testcases/block/09_html/html_to_native/table_simple.text +56 -0
- data/test/testcases/block/09_html/html_to_native/typography.html +1 -0
- data/test/testcases/block/09_html/html_to_native/typography.html.19 +1 -0
- data/test/testcases/block/09_html/html_to_native/typography.text +1 -0
- data/test/testcases/block/09_html/invalid_html_1.html +5 -0
- data/test/testcases/block/09_html/invalid_html_1.text +5 -0
- data/test/testcases/block/09_html/invalid_html_2.html +5 -0
- data/test/testcases/block/09_html/invalid_html_2.text +5 -0
- data/test/testcases/block/09_html/markdown_attr.html +38 -0
- data/test/testcases/block/09_html/markdown_attr.text +38 -0
- data/test/testcases/block/09_html/not_parsed.html +24 -0
- data/test/testcases/block/09_html/not_parsed.text +24 -0
- data/test/testcases/block/09_html/parse_as_raw.html +30 -0
- data/test/testcases/block/09_html/parse_as_raw.options +1 -0
- data/test/testcases/block/09_html/parse_as_raw.text +29 -0
- data/test/testcases/block/09_html/parse_as_span.html +12 -0
- data/test/testcases/block/09_html/parse_as_span.options +1 -0
- data/test/testcases/block/09_html/parse_as_span.text +9 -0
- data/test/testcases/block/09_html/parse_block_html.html +21 -0
- data/test/testcases/block/09_html/parse_block_html.options +1 -0
- data/test/testcases/block/09_html/parse_block_html.text +17 -0
- data/test/testcases/block/09_html/processing_instruction.html +13 -0
- data/test/testcases/block/09_html/processing_instruction.text +12 -0
- data/test/testcases/block/09_html/simple.html +64 -0
- data/test/testcases/block/09_html/simple.html.19 +64 -0
- data/test/testcases/block/09_html/simple.options +1 -0
- data/test/testcases/block/09_html/simple.text +59 -0
- data/test/testcases/block/10_ald/simple.html +2 -0
- data/test/testcases/block/10_ald/simple.text +8 -0
- data/test/testcases/block/11_ial/auto_id_and_ial.html +1 -0
- data/test/testcases/block/11_ial/auto_id_and_ial.options +1 -0
- data/test/testcases/block/11_ial/auto_id_and_ial.text +2 -0
- data/test/testcases/block/11_ial/simple.html +25 -0
- data/test/testcases/block/11_ial/simple.text +34 -0
- data/test/testcases/block/12_extension/comment.html +8 -0
- data/test/testcases/block/12_extension/comment.text +12 -0
- data/test/testcases/block/12_extension/ignored.html +8 -0
- data/test/testcases/block/12_extension/ignored.text +8 -0
- data/test/testcases/block/12_extension/nomarkdown.html +10 -0
- data/test/testcases/block/12_extension/nomarkdown.kramdown +20 -0
- data/test/testcases/block/12_extension/nomarkdown.latex +13 -0
- data/test/testcases/block/12_extension/nomarkdown.text +21 -0
- data/test/testcases/block/12_extension/options.html +21 -0
- data/test/testcases/block/12_extension/options.text +21 -0
- data/test/testcases/block/12_extension/options2.html +10 -0
- data/test/testcases/block/12_extension/options2.text +5 -0
- data/test/testcases/block/12_extension/options3.html +7 -0
- data/test/testcases/block/12_extension/options3.text +7 -0
- data/test/testcases/block/13_definition_list/definition_at_beginning.html +1 -0
- data/test/testcases/block/13_definition_list/definition_at_beginning.text +1 -0
- data/test/testcases/block/13_definition_list/item_ial.html +12 -0
- data/test/testcases/block/13_definition_list/item_ial.text +8 -0
- data/test/testcases/block/13_definition_list/multiple_terms.html +13 -0
- data/test/testcases/block/13_definition_list/multiple_terms.text +10 -0
- data/test/testcases/block/13_definition_list/no_def_list.html +2 -0
- data/test/testcases/block/13_definition_list/no_def_list.text +2 -0
- data/test/testcases/block/13_definition_list/para_wrapping.html +10 -0
- data/test/testcases/block/13_definition_list/para_wrapping.text +6 -0
- data/test/testcases/block/13_definition_list/separated_by_eob.html +8 -0
- data/test/testcases/block/13_definition_list/separated_by_eob.text +5 -0
- data/test/testcases/block/13_definition_list/simple.html +8 -0
- data/test/testcases/block/13_definition_list/simple.text +7 -0
- data/test/testcases/block/13_definition_list/styled_terms.html +4 -0
- data/test/testcases/block/13_definition_list/styled_terms.text +2 -0
- data/test/testcases/block/13_definition_list/too_much_space.html +3 -0
- data/test/testcases/block/13_definition_list/too_much_space.text +4 -0
- data/test/testcases/block/13_definition_list/with_blocks.html +38 -0
- data/test/testcases/block/13_definition_list/with_blocks.text +24 -0
- data/test/testcases/block/14_table/errors.html +8 -0
- data/test/testcases/block/14_table/errors.text +9 -0
- data/test/testcases/block/14_table/footer.html +65 -0
- data/test/testcases/block/14_table/footer.text +25 -0
- data/test/testcases/block/14_table/header.html +103 -0
- data/test/testcases/block/14_table/header.text +32 -0
- data/test/testcases/block/14_table/no_table.html +3 -0
- data/test/testcases/block/14_table/no_table.text +3 -0
- data/test/testcases/block/14_table/simple.html +139 -0
- data/test/testcases/block/14_table/simple.text +38 -0
- data/test/testcases/block/15_math/normal.html +26 -0
- data/test/testcases/block/15_math/normal.text +28 -0
- data/test/testcases/block/16_toc/no_toc_depth.html +33 -0
- data/test/testcases/block/16_toc/no_toc_depth.options +1 -0
- data/test/testcases/block/16_toc/no_toc_depth.text +16 -0
- data/test/testcases/block/16_toc/toc_depth_2.html +24 -0
- data/test/testcases/block/16_toc/toc_depth_2.options +1 -0
- data/test/testcases/block/16_toc/toc_depth_2.text +16 -0
- data/test/testcases/encoding.html +46 -0
- data/test/testcases/encoding.text +28 -0
- data/test/testcases/span/01_link/empty.html +5 -0
- data/test/testcases/span/01_link/empty.text +5 -0
- data/test/testcases/span/01_link/image_in_a.html +5 -0
- data/test/testcases/span/01_link/image_in_a.text +5 -0
- data/test/testcases/span/01_link/imagelinks.html +14 -0
- data/test/testcases/span/01_link/imagelinks.text +16 -0
- data/test/testcases/span/01_link/inline.html +46 -0
- data/test/testcases/span/01_link/inline.html.19 +46 -0
- data/test/testcases/span/01_link/inline.text +48 -0
- data/test/testcases/span/01_link/link_defs.html +9 -0
- data/test/testcases/span/01_link/link_defs.text +26 -0
- data/test/testcases/span/01_link/links_with_angle_brackets.html +3 -0
- data/test/testcases/span/01_link/links_with_angle_brackets.text +3 -0
- data/test/testcases/span/01_link/reference.html +35 -0
- data/test/testcases/span/01_link/reference.html.19 +35 -0
- data/test/testcases/span/01_link/reference.text +47 -0
- data/test/testcases/span/02_emphasis/empty.html +3 -0
- data/test/testcases/span/02_emphasis/empty.text +3 -0
- data/test/testcases/span/02_emphasis/errors.html +9 -0
- data/test/testcases/span/02_emphasis/errors.text +9 -0
- data/test/testcases/span/02_emphasis/nesting.html +38 -0
- data/test/testcases/span/02_emphasis/nesting.text +33 -0
- data/test/testcases/span/02_emphasis/normal.html +46 -0
- data/test/testcases/span/02_emphasis/normal.text +46 -0
- data/test/testcases/span/03_codespan/empty.html +5 -0
- data/test/testcases/span/03_codespan/empty.text +5 -0
- data/test/testcases/span/03_codespan/errors.html +1 -0
- data/test/testcases/span/03_codespan/errors.text +1 -0
- data/test/testcases/span/03_codespan/highlighting.html +1 -0
- data/test/testcases/span/03_codespan/highlighting.text +1 -0
- data/test/testcases/span/03_codespan/normal.html +16 -0
- data/test/testcases/span/03_codespan/normal.text +16 -0
- data/test/testcases/span/04_footnote/definitions.html +17 -0
- data/test/testcases/span/04_footnote/definitions.latex +17 -0
- data/test/testcases/span/04_footnote/definitions.text +24 -0
- data/test/testcases/span/04_footnote/footnote_nr.html +12 -0
- data/test/testcases/span/04_footnote/footnote_nr.latex +2 -0
- data/test/testcases/span/04_footnote/footnote_nr.options +1 -0
- data/test/testcases/span/04_footnote/footnote_nr.text +4 -0
- data/test/testcases/span/04_footnote/markers.html +46 -0
- data/test/testcases/span/04_footnote/markers.latex +23 -0
- data/test/testcases/span/04_footnote/markers.text +26 -0
- data/test/testcases/span/05_html/across_lines.html +1 -0
- data/test/testcases/span/05_html/across_lines.text +2 -0
- data/test/testcases/span/05_html/invalid.html +1 -0
- data/test/testcases/span/05_html/invalid.text +1 -0
- data/test/testcases/span/05_html/link_with_mailto.html +1 -0
- data/test/testcases/span/05_html/link_with_mailto.text +1 -0
- data/test/testcases/span/05_html/markdown_attr.html +6 -0
- data/test/testcases/span/05_html/markdown_attr.text +6 -0
- data/test/testcases/span/05_html/normal.html +30 -0
- data/test/testcases/span/05_html/normal.text +30 -0
- data/test/testcases/span/abbreviations/abbrev.html +8 -0
- data/test/testcases/span/abbreviations/abbrev.text +15 -0
- data/test/testcases/span/abbreviations/abbrev_defs.html +2 -0
- data/test/testcases/span/abbreviations/abbrev_defs.text +5 -0
- data/test/testcases/span/autolinks/url_links.html +12 -0
- data/test/testcases/span/autolinks/url_links.text +12 -0
- data/test/testcases/span/escaped_chars/normal.html +43 -0
- data/test/testcases/span/escaped_chars/normal.text +43 -0
- data/test/testcases/span/extension/comment.html +6 -0
- data/test/testcases/span/extension/comment.text +6 -0
- data/test/testcases/span/extension/ignored.html +1 -0
- data/test/testcases/span/extension/ignored.text +1 -0
- data/test/testcases/span/extension/nomarkdown.html +1 -0
- data/test/testcases/span/extension/nomarkdown.text +1 -0
- data/test/testcases/span/extension/options.html +1 -0
- data/test/testcases/span/extension/options.text +1 -0
- data/test/testcases/span/ial/simple.html +6 -0
- data/test/testcases/span/ial/simple.text +6 -0
- data/test/testcases/span/line_breaks/normal.html +11 -0
- data/test/testcases/span/line_breaks/normal.latex +12 -0
- data/test/testcases/span/line_breaks/normal.text +11 -0
- data/test/testcases/span/math/normal.html +5 -0
- data/test/testcases/span/math/normal.text +5 -0
- data/test/testcases/span/text_substitutions/entities.html +4 -0
- data/test/testcases/span/text_substitutions/entities.options +1 -0
- data/test/testcases/span/text_substitutions/entities.text +4 -0
- data/test/testcases/span/text_substitutions/entities_as_char.html +1 -0
- data/test/testcases/span/text_substitutions/entities_as_char.html.19 +1 -0
- data/test/testcases/span/text_substitutions/entities_as_char.options +1 -0
- data/test/testcases/span/text_substitutions/entities_as_char.text +1 -0
- data/test/testcases/span/text_substitutions/entities_as_input.html +1 -0
- data/test/testcases/span/text_substitutions/entities_as_input.options +1 -0
- data/test/testcases/span/text_substitutions/entities_as_input.text +1 -0
- data/test/testcases/span/text_substitutions/entities_numeric.html +1 -0
- data/test/testcases/span/text_substitutions/entities_numeric.options +1 -0
- data/test/testcases/span/text_substitutions/entities_numeric.text +1 -0
- data/test/testcases/span/text_substitutions/entities_symbolic.html +1 -0
- data/test/testcases/span/text_substitutions/entities_symbolic.options +1 -0
- data/test/testcases/span/text_substitutions/entities_symbolic.text +1 -0
- data/test/testcases/span/text_substitutions/greaterthan.html +1 -0
- data/test/testcases/span/text_substitutions/greaterthan.text +1 -0
- data/test/testcases/span/text_substitutions/lowerthan.html +1 -0
- data/test/testcases/span/text_substitutions/lowerthan.text +1 -0
- data/test/testcases/span/text_substitutions/typography.html +18 -0
- data/test/testcases/span/text_substitutions/typography.html.19 +18 -0
- data/test/testcases/span/text_substitutions/typography.text +18 -0
- metadata +476 -0
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
#
|
|
3
|
+
#--
|
|
4
|
+
# Copyright (C) 2009-2010 Thomas Leitner <t_leitner@gmx.at>
|
|
5
|
+
#
|
|
6
|
+
# This file is part of newstile.
|
|
7
|
+
#
|
|
8
|
+
# newstile 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 'newstile/parser/newstile/attribute_list'
|
|
24
|
+
|
|
25
|
+
module Newstile
|
|
26
|
+
module Parser
|
|
27
|
+
class Newstile
|
|
28
|
+
|
|
29
|
+
def parse_extension_start_tag(type)
|
|
30
|
+
orig_pos = @src.pos
|
|
31
|
+
@src.pos += @src.matched_size
|
|
32
|
+
|
|
33
|
+
error_block = lambda do |msg|
|
|
34
|
+
warning(msg)
|
|
35
|
+
@src.pos = orig_pos
|
|
36
|
+
add_text(@src.scan(/./)) if type == :span
|
|
37
|
+
false
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
if @src[4] || @src.matched == '{:/}'
|
|
41
|
+
name = (@src[4] ? "for '#{@src[4]}' " : '')
|
|
42
|
+
return error_block.call("Invalid extension stop tag #{name}found - ignoring it")
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
ext = @src[1]
|
|
46
|
+
opts = {}
|
|
47
|
+
body = nil
|
|
48
|
+
parse_attribute_list(@src[2] || '', opts)
|
|
49
|
+
|
|
50
|
+
if !@src[3]
|
|
51
|
+
stop_re = (type == :block ? /#{EXT_BLOCK_STOP_STR % ext}/ : /#{EXT_STOP_STR % ext}/)
|
|
52
|
+
if result = @src.scan_until(stop_re)
|
|
53
|
+
body = result.sub!(stop_re, '')
|
|
54
|
+
body.chomp! if type == :block
|
|
55
|
+
else
|
|
56
|
+
return error_block.call("No stop tag for extension '#{ext}' found - ignoring it")
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
if !handle_extension(ext, opts, body, type)
|
|
61
|
+
error_block.call("Invalid extension with name '#{ext}' specified - ignoring it")
|
|
62
|
+
else
|
|
63
|
+
true
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
def handle_extension(name, opts, body, type)
|
|
68
|
+
case name
|
|
69
|
+
when 'comment'
|
|
70
|
+
@tree.children << Element.new(:comment, body, nil, :category => type) if body.kind_of?(String)
|
|
71
|
+
true
|
|
72
|
+
when 'nomarkdown'
|
|
73
|
+
@tree.children << Element.new(:raw, body, nil, :category => type, :type => opts['type'].to_s.split(/\s+/)) if body.kind_of?(String)
|
|
74
|
+
true
|
|
75
|
+
when 'options'
|
|
76
|
+
opts.select do |k,v|
|
|
77
|
+
k = k.to_sym
|
|
78
|
+
if Newstile::Options.defined?(k)
|
|
79
|
+
@doc.options[k] = Newstile::Options.parse(k, v) rescue @doc.options[k]
|
|
80
|
+
false
|
|
81
|
+
else
|
|
82
|
+
true
|
|
83
|
+
end
|
|
84
|
+
end.each do |k,v|
|
|
85
|
+
warning("Unknown newstile option '#{k}'")
|
|
86
|
+
end
|
|
87
|
+
@tree.children << Element.new(:eob, :extension) if type == :block
|
|
88
|
+
true
|
|
89
|
+
else
|
|
90
|
+
false
|
|
91
|
+
end
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
EXT_STOP_STR = "\\{:/(%s)?\\}"
|
|
96
|
+
EXT_START_STR = "\\{::(\\w+)(?:\\s(#{ALD_ANY_CHARS}*?)|)(\\/)?\\}"
|
|
97
|
+
EXT_SPAN_START = /#{EXT_START_STR}|#{EXT_STOP_STR % ALD_ID_NAME}/
|
|
98
|
+
EXT_BLOCK_START = /^#{OPT_SPACE}(?:#{EXT_START_STR}|#{EXT_STOP_STR % ALD_ID_NAME})\s*?\n/
|
|
99
|
+
EXT_BLOCK_STOP_STR = "^#{OPT_SPACE}#{EXT_STOP_STR}\s*?\n"
|
|
100
|
+
|
|
101
|
+
# Parse the extension block at the current location.
|
|
102
|
+
def parse_block_extension
|
|
103
|
+
parse_extension_start_tag(:block)
|
|
104
|
+
end
|
|
105
|
+
define_parser(:block_extension, EXT_BLOCK_START)
|
|
106
|
+
|
|
107
|
+
|
|
108
|
+
# Parse the extension span at the current location.
|
|
109
|
+
def parse_span_extension
|
|
110
|
+
parse_extension_start_tag(:span)
|
|
111
|
+
end
|
|
112
|
+
define_parser(:span_extension, EXT_SPAN_START, '\{:[:/]')
|
|
113
|
+
|
|
114
|
+
end
|
|
115
|
+
end
|
|
116
|
+
end
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
#
|
|
3
|
+
#--
|
|
4
|
+
# Copyright (C) 2009-2010 Thomas Leitner <t_leitner@gmx.at>
|
|
5
|
+
#
|
|
6
|
+
# This file is part of newstile.
|
|
7
|
+
#
|
|
8
|
+
# newstile 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 'newstile/parser/newstile/attribute_list'
|
|
24
|
+
require 'newstile/parser/newstile/blank_line'
|
|
25
|
+
require 'newstile/parser/newstile/codeblock'
|
|
26
|
+
|
|
27
|
+
module Newstile
|
|
28
|
+
module Parser
|
|
29
|
+
class Newstile
|
|
30
|
+
|
|
31
|
+
FOOTNOTE_DEFINITION_START = /^#{OPT_SPACE}\[\^(#{ALD_ID_NAME})\]:\s*?(.*?\n#{CODEBLOCK_MATCH})/
|
|
32
|
+
|
|
33
|
+
# Parse the foot note definition at the current location.
|
|
34
|
+
def parse_footnote_definition
|
|
35
|
+
@src.pos += @src.matched_size
|
|
36
|
+
|
|
37
|
+
el = Element.new(:footnote_def)
|
|
38
|
+
parse_blocks(el, @src[2].gsub(INDENT, ''))
|
|
39
|
+
warning("Duplicate footnote name '#{@src[1]}' - overwriting") if @doc.parse_infos[:footnotes][@src[1]]
|
|
40
|
+
(@doc.parse_infos[:footnotes][@src[1]] = {})[:content] = el
|
|
41
|
+
@tree.children << Element.new(:eob, :footnote_def)
|
|
42
|
+
true
|
|
43
|
+
end
|
|
44
|
+
define_parser(:footnote_definition, FOOTNOTE_DEFINITION_START)
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
FOOTNOTE_MARKER_START = /\[\^(#{ALD_ID_NAME})\]/
|
|
48
|
+
|
|
49
|
+
# Parse the footnote marker at the current location.
|
|
50
|
+
def parse_footnote_marker
|
|
51
|
+
@src.pos += @src.matched_size
|
|
52
|
+
fn_def = @doc.parse_infos[:footnotes][@src[1]]
|
|
53
|
+
if fn_def
|
|
54
|
+
valid = fn_def[:marker] && fn_def[:marker].options[:stack][0..-2].zip(fn_def[:marker].options[:stack][1..-1]).all? do |par, child|
|
|
55
|
+
par.children.include?(child)
|
|
56
|
+
end
|
|
57
|
+
if !fn_def[:marker] || !valid
|
|
58
|
+
fn_def[:marker] = Element.new(:footnote, nil, nil, :name => @src[1])
|
|
59
|
+
fn_def[:marker].options[:stack] = [@stack.map {|s| s.first}, @tree, fn_def[:marker]].flatten.compact
|
|
60
|
+
@tree.children << fn_def[:marker]
|
|
61
|
+
else
|
|
62
|
+
warning("Footnote marker '#{@src[1]}' already appeared in document, ignoring newly found marker")
|
|
63
|
+
add_text(@src.matched)
|
|
64
|
+
end
|
|
65
|
+
else
|
|
66
|
+
warning("Footnote definition for '#{@src[1]}' not found")
|
|
67
|
+
add_text(@src.matched)
|
|
68
|
+
end
|
|
69
|
+
end
|
|
70
|
+
define_parser(:footnote_marker, FOOTNOTE_MARKER_START, '\[')
|
|
71
|
+
|
|
72
|
+
end
|
|
73
|
+
end
|
|
74
|
+
end
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
#
|
|
3
|
+
#--
|
|
4
|
+
# Copyright (C) 2009-2010 Thomas Leitner <t_leitner@gmx.at>
|
|
5
|
+
#
|
|
6
|
+
# This file is part of newstile.
|
|
7
|
+
#
|
|
8
|
+
# newstile 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 'newstile/parser/newstile/block_boundary'
|
|
24
|
+
|
|
25
|
+
module Newstile
|
|
26
|
+
module Parser
|
|
27
|
+
class Newstile
|
|
28
|
+
|
|
29
|
+
HEADER_ID=/(?:[ \t]\{#(\w[\w-]*)\})?/
|
|
30
|
+
SETEXT_HEADER_START = /^(#{OPT_SPACE}[^ \t].*?)#{HEADER_ID}[ \t]*?\n(-|=)+\s*?\n/
|
|
31
|
+
|
|
32
|
+
# Parse the Setext header at the current location.
|
|
33
|
+
def parse_setext_header
|
|
34
|
+
return false if !after_block_boundary?
|
|
35
|
+
|
|
36
|
+
@src.pos += @src.matched_size
|
|
37
|
+
text, id, level = @src[1].strip, @src[2], @src[3]
|
|
38
|
+
el = new_block_el(:header, nil, nil, :level => (level == '-' ? 2 : 1), :raw_text => text)
|
|
39
|
+
add_text(text, el)
|
|
40
|
+
el.attr['id'] = id if id
|
|
41
|
+
@tree.children << el
|
|
42
|
+
true
|
|
43
|
+
end
|
|
44
|
+
define_parser(:setext_header, SETEXT_HEADER_START)
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
ATX_HEADER_START = /^\#{1,6}/
|
|
48
|
+
ATX_HEADER_MATCH = /^(\#{1,6})(.+?)\s*?#*#{HEADER_ID}\s*?\n/
|
|
49
|
+
|
|
50
|
+
# Parse the Atx header at the current location.
|
|
51
|
+
def parse_atx_header
|
|
52
|
+
return false if !after_block_boundary?
|
|
53
|
+
|
|
54
|
+
result = @src.scan(ATX_HEADER_MATCH)
|
|
55
|
+
level, text, id = @src[1], @src[2].strip, @src[3]
|
|
56
|
+
el = new_block_el(:header, nil, nil, :level => level.length, :raw_text => text)
|
|
57
|
+
add_text(text, el)
|
|
58
|
+
el.attr['id'] = id if id
|
|
59
|
+
@tree.children << el
|
|
60
|
+
true
|
|
61
|
+
end
|
|
62
|
+
define_parser(:atx_header, ATX_HEADER_START)
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
NEWSTILE_HEADER_START = /^!{1,6} /
|
|
66
|
+
NEWSTILE_HEADER_MATCH = /^(!{1,6}) +(.+?)\s*?\!*#{HEADER_ID}\s*?\n/
|
|
67
|
+
|
|
68
|
+
# Parse the newstile header at the current location.
|
|
69
|
+
def parse_newstile_header
|
|
70
|
+
return false if !after_block_boundary?
|
|
71
|
+
|
|
72
|
+
result = @src.scan(NEWSTILE_HEADER_MATCH)
|
|
73
|
+
level, text, id = @src[1], @src[2], @src[3]
|
|
74
|
+
el = new_block_el(:header, nil, nil, :level => level.length, :raw_text => text)
|
|
75
|
+
add_text(text, el)
|
|
76
|
+
el.attr['id'] = id if id
|
|
77
|
+
@tree.children << el
|
|
78
|
+
true
|
|
79
|
+
end
|
|
80
|
+
define_parser(:newstile_header, NEWSTILE_HEADER_START)
|
|
81
|
+
|
|
82
|
+
end
|
|
83
|
+
end
|
|
84
|
+
end
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
#
|
|
3
|
+
#--
|
|
4
|
+
# Copyright (C) 2009-2010 Thomas Leitner <t_leitner@gmx.at>
|
|
5
|
+
#
|
|
6
|
+
# This file is part of newstile.
|
|
7
|
+
#
|
|
8
|
+
# newstile 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 Newstile
|
|
24
|
+
module Parser
|
|
25
|
+
class Newstile
|
|
26
|
+
|
|
27
|
+
HR_START = /^#{OPT_SPACE}(\*|-|_)[ \t]*\1[ \t]*\1[ \t]*(\1|[ \t])*\n/
|
|
28
|
+
|
|
29
|
+
# Parse the horizontal rule at the current location.
|
|
30
|
+
def parse_horizontal_rule
|
|
31
|
+
@src.pos += @src.matched_size
|
|
32
|
+
@tree.children << new_block_el(:hr)
|
|
33
|
+
true
|
|
34
|
+
end
|
|
35
|
+
define_parser(:horizontal_rule, HR_START)
|
|
36
|
+
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
end
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
#
|
|
3
|
+
#--
|
|
4
|
+
# Copyright (C) 2009-2010 Thomas Leitner <t_leitner@gmx.at>
|
|
5
|
+
#
|
|
6
|
+
# This file is part of newstile.
|
|
7
|
+
#
|
|
8
|
+
# newstile 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 'newstile/parser/html'
|
|
24
|
+
|
|
25
|
+
module Newstile
|
|
26
|
+
module Parser
|
|
27
|
+
class Newstile
|
|
28
|
+
|
|
29
|
+
include Newstile::Parser::Html::Parser
|
|
30
|
+
|
|
31
|
+
def handle_newstile_html_tag(el, closed)
|
|
32
|
+
parse_type = if @tree.type != :html_element || @tree.options[:parse_type] != :raw
|
|
33
|
+
(@doc.options[:parse_block_html] ? HTML_PARSE_AS[el.value] : :raw)
|
|
34
|
+
else
|
|
35
|
+
:raw
|
|
36
|
+
end
|
|
37
|
+
if val = html_parse_type(el.attr.delete('markdown'))
|
|
38
|
+
parse_type = (val == :default ? HTML_PARSE_AS[el.value] : val)
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
@src.scan(/[ \t]*\n/) if parse_type == :block
|
|
42
|
+
el.options[:parse_type] = parse_type
|
|
43
|
+
|
|
44
|
+
if !closed
|
|
45
|
+
if parse_type == :block
|
|
46
|
+
end_tag_found = parse_blocks(el)
|
|
47
|
+
if !end_tag_found
|
|
48
|
+
warning("Found no end tag for '#{el.value}' - auto-closing it")
|
|
49
|
+
end
|
|
50
|
+
elsif parse_type == :span
|
|
51
|
+
curpos = @src.pos
|
|
52
|
+
if result = @src.scan_until(/(?=<\/#{el.value}\s*>)/m)
|
|
53
|
+
add_text(extract_string(curpos...@src.pos, @src), el)
|
|
54
|
+
@src.scan(HTML_TAG_CLOSE_RE)
|
|
55
|
+
else
|
|
56
|
+
add_text(@src.scan(/.*/m), el)
|
|
57
|
+
warning("Found no end tag for '#{el.value}' - auto-closing it")
|
|
58
|
+
end
|
|
59
|
+
else
|
|
60
|
+
parse_raw_html(el, &method(:handle_newstile_html_tag))
|
|
61
|
+
end
|
|
62
|
+
@src.scan(/[ \t]*\n/) unless (@tree.type == :html_element && @tree.options[:parse_type] == :raw)
|
|
63
|
+
end
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
# Return the HTML parse type defined by the string +val+, i.e. raw when "0", default parsing
|
|
67
|
+
# (return value +nil+) when "1", span parsing when "span" and block parsing when "block". If
|
|
68
|
+
# +val+ is nil, then the default parsing mode is used.
|
|
69
|
+
def html_parse_type(val)
|
|
70
|
+
case val
|
|
71
|
+
when "0" then :raw
|
|
72
|
+
when "1" then :default
|
|
73
|
+
when "span" then :span
|
|
74
|
+
when "block" then :block
|
|
75
|
+
when NilClass then nil
|
|
76
|
+
else
|
|
77
|
+
warning("Invalid markdown attribute val '#{val}', using default")
|
|
78
|
+
nil
|
|
79
|
+
end
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
HTML_BLOCK_START = /^#{OPT_SPACE}<(#{REXML::Parsers::BaseParser::UNAME_STR}|\?|!--|\/)/
|
|
84
|
+
|
|
85
|
+
# Parse the HTML at the current position as block level HTML.
|
|
86
|
+
def parse_block_html
|
|
87
|
+
if result = @src.scan(HTML_COMMENT_RE)
|
|
88
|
+
@tree.children << Element.new(:xml_comment, result, nil, :category => :block)
|
|
89
|
+
@src.scan(/[ \t]*\n/)
|
|
90
|
+
true
|
|
91
|
+
elsif result = @src.scan(HTML_INSTRUCTION_RE)
|
|
92
|
+
@tree.children << Element.new(:xml_pi, result, nil, :category => :block)
|
|
93
|
+
@src.scan(/[ \t]*\n/)
|
|
94
|
+
true
|
|
95
|
+
else
|
|
96
|
+
if result = @src.check(/^#{OPT_SPACE}#{HTML_TAG_RE}/) && !HTML_SPAN_ELEMENTS.include?(@src[1])
|
|
97
|
+
@src.pos += @src.matched_size
|
|
98
|
+
handle_html_start_tag(&method(:handle_newstile_html_tag))
|
|
99
|
+
Newstile::Parser::Html::ElementConverter.new(@doc).process(@tree.children.last) if @doc.options[:html_to_native]
|
|
100
|
+
true
|
|
101
|
+
elsif result = @src.check(/^#{OPT_SPACE}#{HTML_TAG_CLOSE_RE}/) && !HTML_SPAN_ELEMENTS.include?(@src[1])
|
|
102
|
+
name = @src[1]
|
|
103
|
+
|
|
104
|
+
if @tree.type == :html_element && @tree.value == name
|
|
105
|
+
@src.pos += @src.matched_size
|
|
106
|
+
throw :stop_block_parsing, :found
|
|
107
|
+
else
|
|
108
|
+
false
|
|
109
|
+
end
|
|
110
|
+
else
|
|
111
|
+
false
|
|
112
|
+
end
|
|
113
|
+
end
|
|
114
|
+
end
|
|
115
|
+
define_parser(:block_html, HTML_BLOCK_START)
|
|
116
|
+
|
|
117
|
+
|
|
118
|
+
HTML_SPAN_START = /<(#{REXML::Parsers::BaseParser::UNAME_STR}|\?|!--|\/)/
|
|
119
|
+
|
|
120
|
+
# Parse the HTML at the current position as span level HTML.
|
|
121
|
+
def parse_span_html
|
|
122
|
+
if result = @src.scan(HTML_COMMENT_RE)
|
|
123
|
+
@tree.children << Element.new(:xml_comment, result, nil, :category => :span)
|
|
124
|
+
elsif result = @src.scan(HTML_INSTRUCTION_RE)
|
|
125
|
+
@tree.children << Element.new(:xml_pi, result, nil, :category => :span)
|
|
126
|
+
elsif result = @src.scan(HTML_TAG_CLOSE_RE)
|
|
127
|
+
warning("Found invalidly used HTML closing tag for '#{@src[1]}'")
|
|
128
|
+
add_text(result)
|
|
129
|
+
elsif result = @src.scan(HTML_TAG_RE)
|
|
130
|
+
if HTML_BLOCK_ELEMENTS.include?(@src[1])
|
|
131
|
+
warning("Found block HTML tag '#{@src[1]}' in span level text")
|
|
132
|
+
add_text(result)
|
|
133
|
+
return
|
|
134
|
+
end
|
|
135
|
+
|
|
136
|
+
reset_pos = @src.pos
|
|
137
|
+
attrs = Utils::OrderedHash.new
|
|
138
|
+
@src[2].scan(HTML_ATTRIBUTE_RE).each {|name,sep,val| attrs[name] = val.gsub(/\n+/, ' ')}
|
|
139
|
+
|
|
140
|
+
do_parsing = (HTML_PARSE_AS_RAW.include?(@src[1]) || @tree.options[:parse_type] == :raw ? false : @doc.options[:parse_span_html])
|
|
141
|
+
if val = html_parse_type(attrs.delete('markdown'))
|
|
142
|
+
if val == :block
|
|
143
|
+
warning("Cannot use block level parsing in span level HTML tag - using default mode")
|
|
144
|
+
elsif val == :span
|
|
145
|
+
do_parsing = true
|
|
146
|
+
elsif val == :default
|
|
147
|
+
do_parsing = !HTML_PARSE_AS_RAW.include?(@src[1])
|
|
148
|
+
elsif val == :raw
|
|
149
|
+
do_parsing = false
|
|
150
|
+
end
|
|
151
|
+
end
|
|
152
|
+
|
|
153
|
+
el = Element.new(:html_element, @src[1], attrs, :category => :span, :parse_type => (do_parsing ? :span : :raw))
|
|
154
|
+
@tree.children << el
|
|
155
|
+
stop_re = /<\/#{Regexp.escape(@src[1])}\s*>/
|
|
156
|
+
if !@src[4] && HTML_ELEMENTS_WITHOUT_BODY.include?(el.value)
|
|
157
|
+
warning("The HTML tag '#{el.value}' cannot have any content - auto-closing it")
|
|
158
|
+
elsif !@src[4]
|
|
159
|
+
if parse_spans(el, stop_re, (do_parsing ? nil : [:span_html]))
|
|
160
|
+
@src.scan(stop_re)
|
|
161
|
+
else
|
|
162
|
+
warning("Found no end tag for '#{el.value}' - auto-closing it")
|
|
163
|
+
add_text(@src.scan(/.*/m), el)
|
|
164
|
+
end
|
|
165
|
+
end
|
|
166
|
+
Newstile::Parser::Html::ElementConverter.new(@doc).process(el) if @doc.options[:html_to_native]
|
|
167
|
+
else
|
|
168
|
+
add_text(@src.scan(/./))
|
|
169
|
+
end
|
|
170
|
+
end
|
|
171
|
+
define_parser(:span_html, HTML_SPAN_START, '<')
|
|
172
|
+
|
|
173
|
+
end
|
|
174
|
+
end
|
|
175
|
+
end
|