diff --git a/README.md b/README.md index 1133c49..2507025 100644 --- a/README.md +++ b/README.md @@ -12,6 +12,7 @@ Monorepo of plugins for [markdown-it.rs](https://crates.io/crates/markdown-it): - [markdown-it-heading-anchors](crates/heading_anchors/README.md) - [markdown-it-autolink](crates/autolink/README.md) - [markdown-it-deflist](crates/deflist/README.md) +- [markdown-it-gfm](crates/gfm/README.md) More to come... (hopefully, many from [mdit-py-plugins](https://github.com/executablebooks/mdit-py-plugins)) diff --git a/crates/gfm/Cargo.toml b/crates/gfm/Cargo.toml new file mode 100644 index 0000000..5f30829 --- /dev/null +++ b/crates/gfm/Cargo.toml @@ -0,0 +1,24 @@ +[package] +name = "markdown-it-gfm" +version = "0.0.0" +description = "A markdown-it plugin for parsing definition lists" +readme = "README.md" +license = "Apache-2.0" +authors = { workspace = true } +repository = { workspace = true } +keywords = { workspace = true } +categories = { workspace = true } +edition = { workspace = true } + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +markdown-it = { workspace = true } +markdown-it-tasklist = { path="../tasklist", version = "0.2.0" } +markdown-it-autolink = { path="../autolink", version = "0.2.0" } +markdown-it-heading-anchors = { path="../heading_anchors", version = "0.3.0" } +regex = { workspace = true } + +[dev-dependencies] +dev = { path = "../dev" } +testing = { workspace = true } diff --git a/crates/gfm/LICENSE b/crates/gfm/LICENSE new file mode 100644 index 0000000..b09cd78 --- /dev/null +++ b/crates/gfm/LICENSE @@ -0,0 +1,201 @@ +Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/crates/gfm/README.md b/crates/gfm/README.md new file mode 100644 index 0000000..df40b18 --- /dev/null +++ b/crates/gfm/README.md @@ -0,0 +1,17 @@ +# markdown-it-gfm + +[crates.io](https://crates.io/crates/markdown-it-gfm) + +A [markdown-it.rs](https://crates.io/crates/markdown-it) plugin to implement [Github Flavoured Markdown](https://github.github.com/gfm). + +## Usage + +To load the plugin: + +```rust +let parser = &mut markdown_it::MarkdownIt::new(); +markdown_it_gfm::add(parser); + +let root = parser.parse("https://github.github.com/gfm"); +assert_eq!(root.render(), "

https://github.github.com/gfm

\n"); +``` diff --git a/crates/gfm/src/lib.rs b/crates/gfm/src/lib.rs new file mode 100644 index 0000000..1a7704d --- /dev/null +++ b/crates/gfm/src/lib.rs @@ -0,0 +1,49 @@ +//! A [markdown_it] plugin for parsing Github Flavoured Markdown +//! +//! ```rust +//! let parser = &mut markdown_it::MarkdownIt::new(); +//! markdown_it_gfm::add(parser); +//! let root = parser.parse("https://github.github.com/gfm"); +//! assert_eq!(root.render(), "

https://github.github.com/gfm

\n"); +//! ``` +use markdown_it::parser::inline::builtin::InlineParserRule; +use markdown_it::plugins::html::html_block::HtmlBlock; +use markdown_it::plugins::html::html_inline::HtmlInline; +use markdown_it::{parser::core::CoreRule, MarkdownIt, Node}; +use regex::Regex; + +/// Add the GFM plugin to the parser +pub fn add(md: &mut MarkdownIt) { + markdown_it::plugins::cmark::add(md); + markdown_it::plugins::extra::tables::add(md); + markdown_it::plugins::extra::strikethrough::add(md); + markdown_it::plugins::html::add(md); + md.add_rule::().after::(); + markdown_it_tasklist::add_disabled(md); + markdown_it_autolink::add(md); +} + +/// Add the GFM plugin to the parser, plus heading anchors +pub fn add_with_anchors(md: &mut MarkdownIt) { + add(md); + markdown_it_heading_anchors::add(md); +} + +/// Implement the Disallowed Raw HTML (tagfilter) rule +struct TagFilter; +impl CoreRule for TagFilter { + fn run(root: &mut Node, _md: &MarkdownIt) { + let regex = Regex::new( + r#"<(?i)(iframe|noembed|noframes|plaintext|script|style|title|textarea|xmp)"#, + ) + .unwrap(); + root.walk_mut(|node, _| { + if let Some(value) = node.cast_mut::() { + value.content = regex.replace_all(&value.content, "<$1").to_string(); + } + if let Some(value) = node.cast_mut::() { + value.content = regex.replace_all(&value.content, "<$1").to_string(); + } + }); + } +} diff --git a/crates/gfm/tests/fixtures.rs b/crates/gfm/tests/fixtures.rs new file mode 100644 index 0000000..be25e61 --- /dev/null +++ b/crates/gfm/tests/fixtures.rs @@ -0,0 +1,13 @@ +use std::path::PathBuf; +use testing::fixture; + +#[fixture("tests/fixtures/spec*.md")] +fn test_spec(file: PathBuf) { + let f = dev::read_fixture_file(file); + + let parser = &mut markdown_it::MarkdownIt::new(); + markdown_it_gfm::add(parser); + let actual = parser.parse(&f.input).xrender(); + + dev::assert_no_diff(f, &actual); +} diff --git a/crates/gfm/tests/fixtures/_spec_493.md b/crates/gfm/tests/fixtures/_spec_493.md new file mode 100644 index 0000000..d726a33 --- /dev/null +++ b/crates/gfm/tests/fixtures/_spec_493.md @@ -0,0 +1,8 @@ +Example 493 (https://github.com/rlidwka/markdown-it.rs/issues/29) +...... + +This will ~~~not~~~ strike. + +...... + +

This will ~~~not~~~ strike.

diff --git a/crates/gfm/tests/fixtures/_spec_632.md b/crates/gfm/tests/fixtures/_spec_632.md new file mode 100644 index 0000000..b7d4610 --- /dev/null +++ b/crates/gfm/tests/fixtures/_spec_632.md @@ -0,0 +1,17 @@ +Example 632 +...... + +a.b-c_d@a.b + +a.b-c_d@a.b. + +a.b-c_d@a.b- + +a.b-c_d@a.b_ + +...... + +

a.b-c_d@a.b

+

a.b-c_d@a.b.

+

a.b-c_d@a.b-

+

a.b-c_d@a.b_

diff --git a/crates/gfm/tests/fixtures/spec_001.md b/crates/gfm/tests/fixtures/spec_001.md new file mode 100644 index 0000000..1097a5b --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_001.md @@ -0,0 +1,9 @@ +Example 1 +...... + + foo baz bim + +...... + +
foo	baz		bim
+
diff --git a/crates/gfm/tests/fixtures/spec_002.md b/crates/gfm/tests/fixtures/spec_002.md new file mode 100644 index 0000000..fc23f53 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_002.md @@ -0,0 +1,9 @@ +Example 2 +...... + + foo baz bim + +...... + +
foo	baz		bim
+
diff --git a/crates/gfm/tests/fixtures/spec_003.md b/crates/gfm/tests/fixtures/spec_003.md new file mode 100644 index 0000000..1cda623 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_003.md @@ -0,0 +1,11 @@ +Example 3 +...... + + a a + ὐ a + +...... + +
a	a
+ὐ	a
+
diff --git a/crates/gfm/tests/fixtures/spec_004.md b/crates/gfm/tests/fixtures/spec_004.md new file mode 100644 index 0000000..723800c --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_004.md @@ -0,0 +1,15 @@ +Example 4 +...... + + - foo + + bar + +...... + +
    +
  • +

    foo

    +

    bar

    +
  • +
diff --git a/crates/gfm/tests/fixtures/spec_005.md b/crates/gfm/tests/fixtures/spec_005.md new file mode 100644 index 0000000..6548895 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_005.md @@ -0,0 +1,16 @@ +Example 5 +...... + +- foo + + bar + +...... + +
    +
  • +

    foo

    +
      bar
    +
    +
  • +
diff --git a/crates/gfm/tests/fixtures/spec_006.md b/crates/gfm/tests/fixtures/spec_006.md new file mode 100644 index 0000000..be6f493 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_006.md @@ -0,0 +1,11 @@ +Example 6 +...... + +> foo + +...... + +
+
  foo
+
+
diff --git a/crates/gfm/tests/fixtures/spec_007.md b/crates/gfm/tests/fixtures/spec_007.md new file mode 100644 index 0000000..88f5601 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_007.md @@ -0,0 +1,13 @@ +Example 7 +...... + +- foo + +...... + +
    +
  • +
      foo
    +
    +
  • +
diff --git a/crates/gfm/tests/fixtures/spec_008.md b/crates/gfm/tests/fixtures/spec_008.md new file mode 100644 index 0000000..02797ed --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_008.md @@ -0,0 +1,11 @@ +Example 8 +...... + + foo + bar + +...... + +
foo
+bar
+
diff --git a/crates/gfm/tests/fixtures/spec_009.md b/crates/gfm/tests/fixtures/spec_009.md new file mode 100644 index 0000000..b1f614c --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_009.md @@ -0,0 +1,20 @@ +Example 9 +...... + + - foo + - bar + - baz + +...... + +
    +
  • foo +
      +
    • bar +
        +
      • baz
      • +
      +
    • +
    +
  • +
diff --git a/crates/gfm/tests/fixtures/spec_010.md b/crates/gfm/tests/fixtures/spec_010.md new file mode 100644 index 0000000..c5fbc3d --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_010.md @@ -0,0 +1,8 @@ +Example 10 +...... + +# Foo + +...... + +

Foo

diff --git a/crates/gfm/tests/fixtures/spec_011.md b/crates/gfm/tests/fixtures/spec_011.md new file mode 100644 index 0000000..aecef9b --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_011.md @@ -0,0 +1,8 @@ +Example 11 +...... + +* * * + +...... + +
diff --git a/crates/gfm/tests/fixtures/spec_012.md b/crates/gfm/tests/fixtures/spec_012.md new file mode 100644 index 0000000..6341fa2 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_012.md @@ -0,0 +1,12 @@ +Example 12 +...... + +- `one +- two` + +...... + +
    +
  • `one
  • +
  • two`
  • +
diff --git a/crates/gfm/tests/fixtures/spec_013.md b/crates/gfm/tests/fixtures/spec_013.md new file mode 100644 index 0000000..525d944 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_013.md @@ -0,0 +1,12 @@ +Example 13 +...... + +*** +--- +___ + +...... + +
+
+
diff --git a/crates/gfm/tests/fixtures/spec_014.md b/crates/gfm/tests/fixtures/spec_014.md new file mode 100644 index 0000000..28c85fe --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_014.md @@ -0,0 +1,8 @@ +Example 14 +...... + ++++ + +...... + +

+++

diff --git a/crates/gfm/tests/fixtures/spec_015.md b/crates/gfm/tests/fixtures/spec_015.md new file mode 100644 index 0000000..6605206 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_015.md @@ -0,0 +1,8 @@ +Example 15 +...... + +=== + +...... + +

===

diff --git a/crates/gfm/tests/fixtures/spec_016.md b/crates/gfm/tests/fixtures/spec_016.md new file mode 100644 index 0000000..8da3ce8 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_016.md @@ -0,0 +1,12 @@ +Example 16 +...... + +-- +** +__ + +...... + +

-- +** +__

diff --git a/crates/gfm/tests/fixtures/spec_017.md b/crates/gfm/tests/fixtures/spec_017.md new file mode 100644 index 0000000..b94660b --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_017.md @@ -0,0 +1,12 @@ +Example 17 +...... + + *** + *** + *** + +...... + +
+
+
diff --git a/crates/gfm/tests/fixtures/spec_018.md b/crates/gfm/tests/fixtures/spec_018.md new file mode 100644 index 0000000..805376e --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_018.md @@ -0,0 +1,9 @@ +Example 18 +...... + + *** + +...... + +
***
+
diff --git a/crates/gfm/tests/fixtures/spec_019.md b/crates/gfm/tests/fixtures/spec_019.md new file mode 100644 index 0000000..1a49419 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_019.md @@ -0,0 +1,10 @@ +Example 19 +...... + +Foo + *** + +...... + +

Foo +***

diff --git a/crates/gfm/tests/fixtures/spec_020.md b/crates/gfm/tests/fixtures/spec_020.md new file mode 100644 index 0000000..b0d2b4a --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_020.md @@ -0,0 +1,8 @@ +Example 20 +...... + +_____________________________________ + +...... + +
diff --git a/crates/gfm/tests/fixtures/spec_021.md b/crates/gfm/tests/fixtures/spec_021.md new file mode 100644 index 0000000..baf5369 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_021.md @@ -0,0 +1,8 @@ +Example 21 +...... + + - - - + +...... + +
diff --git a/crates/gfm/tests/fixtures/spec_022.md b/crates/gfm/tests/fixtures/spec_022.md new file mode 100644 index 0000000..e1e007a --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_022.md @@ -0,0 +1,8 @@ +Example 22 +...... + + ** * ** * ** * ** + +...... + +
diff --git a/crates/gfm/tests/fixtures/spec_023.md b/crates/gfm/tests/fixtures/spec_023.md new file mode 100644 index 0000000..3fc030e --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_023.md @@ -0,0 +1,8 @@ +Example 23 +...... + +- - - - + +...... + +
diff --git a/crates/gfm/tests/fixtures/spec_024.md b/crates/gfm/tests/fixtures/spec_024.md new file mode 100644 index 0000000..716e7ad --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_024.md @@ -0,0 +1,8 @@ +Example 24 +...... + +- - - - + +...... + +
diff --git a/crates/gfm/tests/fixtures/spec_025.md b/crates/gfm/tests/fixtures/spec_025.md new file mode 100644 index 0000000..6deccb8 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_025.md @@ -0,0 +1,14 @@ +Example 25 +...... + +_ _ _ _ a + +a------ + +---a--- + +...... + +

_ _ _ _ a

+

a------

+

---a---

diff --git a/crates/gfm/tests/fixtures/spec_026.md b/crates/gfm/tests/fixtures/spec_026.md new file mode 100644 index 0000000..dc62890 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_026.md @@ -0,0 +1,8 @@ +Example 26 +...... + + *-* + +...... + +

-

diff --git a/crates/gfm/tests/fixtures/spec_027.md b/crates/gfm/tests/fixtures/spec_027.md new file mode 100644 index 0000000..bdeaf70 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_027.md @@ -0,0 +1,16 @@ +Example 27 +...... + +- foo +*** +- bar + +...... + +
    +
  • foo
  • +
+
+
    +
  • bar
  • +
diff --git a/crates/gfm/tests/fixtures/spec_028.md b/crates/gfm/tests/fixtures/spec_028.md new file mode 100644 index 0000000..5d5550f --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_028.md @@ -0,0 +1,12 @@ +Example 28 +...... + +Foo +*** +bar + +...... + +

Foo

+
+

bar

diff --git a/crates/gfm/tests/fixtures/spec_029.md b/crates/gfm/tests/fixtures/spec_029.md new file mode 100644 index 0000000..a980267 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_029.md @@ -0,0 +1,11 @@ +Example 29 +...... + +Foo +--- +bar + +...... + +

Foo

+

bar

diff --git a/crates/gfm/tests/fixtures/spec_030.md b/crates/gfm/tests/fixtures/spec_030.md new file mode 100644 index 0000000..a1f09cb --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_030.md @@ -0,0 +1,16 @@ +Example 30 +...... + +* Foo +* * * +* Bar + +...... + +
    +
  • Foo
  • +
+
+
    +
  • Bar
  • +
diff --git a/crates/gfm/tests/fixtures/spec_031.md b/crates/gfm/tests/fixtures/spec_031.md new file mode 100644 index 0000000..3585917 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_031.md @@ -0,0 +1,14 @@ +Example 31 +...... + +- Foo +- * * * + +...... + +
    +
  • Foo
  • +
  • +
    +
  • +
diff --git a/crates/gfm/tests/fixtures/spec_032.md b/crates/gfm/tests/fixtures/spec_032.md new file mode 100644 index 0000000..1aa1f5e --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_032.md @@ -0,0 +1,18 @@ +Example 32 +...... + +# foo +## foo +### foo +#### foo +##### foo +###### foo + +...... + +

foo

+

foo

+

foo

+

foo

+
foo
+
foo
diff --git a/crates/gfm/tests/fixtures/spec_033.md b/crates/gfm/tests/fixtures/spec_033.md new file mode 100644 index 0000000..05957a8 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_033.md @@ -0,0 +1,8 @@ +Example 33 +...... + +####### foo + +...... + +

####### foo

diff --git a/crates/gfm/tests/fixtures/spec_034.md b/crates/gfm/tests/fixtures/spec_034.md new file mode 100644 index 0000000..ba53595 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_034.md @@ -0,0 +1,11 @@ +Example 34 +...... + +#5 bolt + +#hashtag + +...... + +

#5 bolt

+

#hashtag

diff --git a/crates/gfm/tests/fixtures/spec_035.md b/crates/gfm/tests/fixtures/spec_035.md new file mode 100644 index 0000000..725f46d --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_035.md @@ -0,0 +1,8 @@ +Example 35 +...... + +\## foo + +...... + +

## foo

diff --git a/crates/gfm/tests/fixtures/spec_036.md b/crates/gfm/tests/fixtures/spec_036.md new file mode 100644 index 0000000..b85c232 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_036.md @@ -0,0 +1,8 @@ +Example 36 +...... + +# foo *bar* \*baz\* + +...... + +

foo bar *baz*

diff --git a/crates/gfm/tests/fixtures/spec_037.md b/crates/gfm/tests/fixtures/spec_037.md new file mode 100644 index 0000000..e54764f --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_037.md @@ -0,0 +1,8 @@ +Example 37 +...... + +# foo + +...... + +

foo

diff --git a/crates/gfm/tests/fixtures/spec_038.md b/crates/gfm/tests/fixtures/spec_038.md new file mode 100644 index 0000000..9ea381c --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_038.md @@ -0,0 +1,12 @@ +Example 38 +...... + + ### foo + ## foo + # foo + +...... + +

foo

+

foo

+

foo

diff --git a/crates/gfm/tests/fixtures/spec_039.md b/crates/gfm/tests/fixtures/spec_039.md new file mode 100644 index 0000000..0880969 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_039.md @@ -0,0 +1,9 @@ +Example 39 +...... + + # foo + +...... + +
# foo
+
diff --git a/crates/gfm/tests/fixtures/spec_040.md b/crates/gfm/tests/fixtures/spec_040.md new file mode 100644 index 0000000..2a27bc1 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_040.md @@ -0,0 +1,10 @@ +Example 40 +...... + +foo + # bar + +...... + +

foo +# bar

diff --git a/crates/gfm/tests/fixtures/spec_041.md b/crates/gfm/tests/fixtures/spec_041.md new file mode 100644 index 0000000..4caf3ad --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_041.md @@ -0,0 +1,10 @@ +Example 41 +...... + +## foo ## + ### bar ### + +...... + +

foo

+

bar

diff --git a/crates/gfm/tests/fixtures/spec_042.md b/crates/gfm/tests/fixtures/spec_042.md new file mode 100644 index 0000000..0839e14 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_042.md @@ -0,0 +1,10 @@ +Example 42 +...... + +# foo ################################## +##### foo ## + +...... + +

foo

+
foo
diff --git a/crates/gfm/tests/fixtures/spec_043.md b/crates/gfm/tests/fixtures/spec_043.md new file mode 100644 index 0000000..139a409 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_043.md @@ -0,0 +1,8 @@ +Example 43 +...... + +### foo ### + +...... + +

foo

diff --git a/crates/gfm/tests/fixtures/spec_044.md b/crates/gfm/tests/fixtures/spec_044.md new file mode 100644 index 0000000..fa2dd7f --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_044.md @@ -0,0 +1,8 @@ +Example 44 +...... + +### foo ### b + +...... + +

foo ### b

diff --git a/crates/gfm/tests/fixtures/spec_045.md b/crates/gfm/tests/fixtures/spec_045.md new file mode 100644 index 0000000..7319a1d --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_045.md @@ -0,0 +1,8 @@ +Example 45 +...... + +# foo# + +...... + +

foo#

diff --git a/crates/gfm/tests/fixtures/spec_046.md b/crates/gfm/tests/fixtures/spec_046.md new file mode 100644 index 0000000..7045572 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_046.md @@ -0,0 +1,12 @@ +Example 46 +...... + +### foo \### +## foo #\## +# foo \# + +...... + +

foo ###

+

foo ###

+

foo #

diff --git a/crates/gfm/tests/fixtures/spec_047.md b/crates/gfm/tests/fixtures/spec_047.md new file mode 100644 index 0000000..e051892 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_047.md @@ -0,0 +1,12 @@ +Example 47 +...... + +**** +## foo +**** + +...... + +
+

foo

+
diff --git a/crates/gfm/tests/fixtures/spec_048.md b/crates/gfm/tests/fixtures/spec_048.md new file mode 100644 index 0000000..69a6d52 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_048.md @@ -0,0 +1,12 @@ +Example 48 +...... + +Foo bar +# baz +Bar foo + +...... + +

Foo bar

+

baz

+

Bar foo

diff --git a/crates/gfm/tests/fixtures/spec_049.md b/crates/gfm/tests/fixtures/spec_049.md new file mode 100644 index 0000000..62e0007 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_049.md @@ -0,0 +1,12 @@ +Example 49 +...... + +## +# +### ### + +...... + +

+

+

diff --git a/crates/gfm/tests/fixtures/spec_050.md b/crates/gfm/tests/fixtures/spec_050.md new file mode 100644 index 0000000..218a1fd --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_050.md @@ -0,0 +1,13 @@ +Example 50 +...... + +Foo *bar* +========= + +Foo *bar* +--------- + +...... + +

Foo bar

+

Foo bar

diff --git a/crates/gfm/tests/fixtures/spec_051.md b/crates/gfm/tests/fixtures/spec_051.md new file mode 100644 index 0000000..07bbf8c --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_051.md @@ -0,0 +1,11 @@ +Example 51 +...... + +Foo *bar +baz* +==== + +...... + +

Foo bar +baz

diff --git a/crates/gfm/tests/fixtures/spec_052.md b/crates/gfm/tests/fixtures/spec_052.md new file mode 100644 index 0000000..d55d058 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_052.md @@ -0,0 +1,11 @@ +Example 52 +...... + + Foo *bar +baz* +==== + +...... + +

Foo bar +baz

diff --git a/crates/gfm/tests/fixtures/spec_053.md b/crates/gfm/tests/fixtures/spec_053.md new file mode 100644 index 0000000..ac01650 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_053.md @@ -0,0 +1,13 @@ +Example 53 +...... + +Foo +------------------------- + +Foo += + +...... + +

Foo

+

Foo

diff --git a/crates/gfm/tests/fixtures/spec_054.md b/crates/gfm/tests/fixtures/spec_054.md new file mode 100644 index 0000000..afc281c --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_054.md @@ -0,0 +1,17 @@ +Example 54 +...... + + Foo +--- + + Foo +----- + + Foo + === + +...... + +

Foo

+

Foo

+

Foo

diff --git a/crates/gfm/tests/fixtures/spec_055.md b/crates/gfm/tests/fixtures/spec_055.md new file mode 100644 index 0000000..02228e7 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_055.md @@ -0,0 +1,17 @@ +Example 55 +...... + + Foo + --- + + Foo +--- + +...... + +
Foo
+---
+
+Foo
+
+
diff --git a/crates/gfm/tests/fixtures/spec_056.md b/crates/gfm/tests/fixtures/spec_056.md new file mode 100644 index 0000000..61c73f9 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_056.md @@ -0,0 +1,9 @@ +Example 56 +...... + +Foo + ---- + +...... + +

Foo

diff --git a/crates/gfm/tests/fixtures/spec_057.md b/crates/gfm/tests/fixtures/spec_057.md new file mode 100644 index 0000000..75903b0 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_057.md @@ -0,0 +1,10 @@ +Example 57 +...... + +Foo + --- + +...... + +

Foo +---

diff --git a/crates/gfm/tests/fixtures/spec_058.md b/crates/gfm/tests/fixtures/spec_058.md new file mode 100644 index 0000000..c6dee47 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_058.md @@ -0,0 +1,15 @@ +Example 58 +...... + +Foo += = + +Foo +--- - + +...... + +

Foo += =

+

Foo

+
diff --git a/crates/gfm/tests/fixtures/spec_059.md b/crates/gfm/tests/fixtures/spec_059.md new file mode 100644 index 0000000..d35e813 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_059.md @@ -0,0 +1,9 @@ +Example 59 +...... + +Foo +----- + +...... + +

Foo

diff --git a/crates/gfm/tests/fixtures/spec_060.md b/crates/gfm/tests/fixtures/spec_060.md new file mode 100644 index 0000000..c52f733 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_060.md @@ -0,0 +1,9 @@ +Example 60 +...... + +Foo\ +---- + +...... + +

Foo\

diff --git a/crates/gfm/tests/fixtures/spec_061.md b/crates/gfm/tests/fixtures/spec_061.md new file mode 100644 index 0000000..1c6349e --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_061.md @@ -0,0 +1,17 @@ +Example 61 +...... + +`Foo +---- +` + + + +...... + +

`Foo

+

`

+

<a title="a lot

+

of dashes"/>

diff --git a/crates/gfm/tests/fixtures/spec_062.md b/crates/gfm/tests/fixtures/spec_062.md new file mode 100644 index 0000000..5a8d309 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_062.md @@ -0,0 +1,12 @@ +Example 62 +...... + +> Foo +--- + +...... + +
+

Foo

+
+
diff --git a/crates/gfm/tests/fixtures/spec_063.md b/crates/gfm/tests/fixtures/spec_063.md new file mode 100644 index 0000000..cae7c97 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_063.md @@ -0,0 +1,14 @@ +Example 63 +...... + +> foo +bar +=== + +...... + +
+

foo +bar +===

+
diff --git a/crates/gfm/tests/fixtures/spec_064.md b/crates/gfm/tests/fixtures/spec_064.md new file mode 100644 index 0000000..e6e17eb --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_064.md @@ -0,0 +1,12 @@ +Example 64 +...... + +- Foo +--- + +...... + +
    +
  • Foo
  • +
+
diff --git a/crates/gfm/tests/fixtures/spec_065.md b/crates/gfm/tests/fixtures/spec_065.md new file mode 100644 index 0000000..c670a1c --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_065.md @@ -0,0 +1,11 @@ +Example 65 +...... + +Foo +Bar +--- + +...... + +

Foo +Bar

diff --git a/crates/gfm/tests/fixtures/spec_066.md b/crates/gfm/tests/fixtures/spec_066.md new file mode 100644 index 0000000..77cd42a --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_066.md @@ -0,0 +1,16 @@ +Example 66 +...... + +--- +Foo +--- +Bar +--- +Baz + +...... + +
+

Foo

+

Bar

+

Baz

diff --git a/crates/gfm/tests/fixtures/spec_067.md b/crates/gfm/tests/fixtures/spec_067.md new file mode 100644 index 0000000..3304fcf --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_067.md @@ -0,0 +1,9 @@ +Example 67 +...... + + +==== + +...... + +

====

diff --git a/crates/gfm/tests/fixtures/spec_068.md b/crates/gfm/tests/fixtures/spec_068.md new file mode 100644 index 0000000..f85efe9 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_068.md @@ -0,0 +1,10 @@ +Example 68 +...... + +--- +--- + +...... + +
+
diff --git a/crates/gfm/tests/fixtures/spec_069.md b/crates/gfm/tests/fixtures/spec_069.md new file mode 100644 index 0000000..299dd5e --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_069.md @@ -0,0 +1,12 @@ +Example 69 +...... + +- foo +----- + +...... + +
    +
  • foo
  • +
+
diff --git a/crates/gfm/tests/fixtures/spec_070.md b/crates/gfm/tests/fixtures/spec_070.md new file mode 100644 index 0000000..4185a17 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_070.md @@ -0,0 +1,11 @@ +Example 70 +...... + + foo +--- + +...... + +
foo
+
+
diff --git a/crates/gfm/tests/fixtures/spec_071.md b/crates/gfm/tests/fixtures/spec_071.md new file mode 100644 index 0000000..bfeadae --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_071.md @@ -0,0 +1,12 @@ +Example 71 +...... + +> foo +----- + +...... + +
+

foo

+
+
diff --git a/crates/gfm/tests/fixtures/spec_072.md b/crates/gfm/tests/fixtures/spec_072.md new file mode 100644 index 0000000..b34c912 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_072.md @@ -0,0 +1,9 @@ +Example 72 +...... + +\> foo +------ + +...... + +

> foo

diff --git a/crates/gfm/tests/fixtures/spec_073.md b/crates/gfm/tests/fixtures/spec_073.md new file mode 100644 index 0000000..8550a26 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_073.md @@ -0,0 +1,14 @@ +Example 73 +...... + +Foo + +bar +--- +baz + +...... + +

Foo

+

bar

+

baz

diff --git a/crates/gfm/tests/fixtures/spec_074.md b/crates/gfm/tests/fixtures/spec_074.md new file mode 100644 index 0000000..7332598 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_074.md @@ -0,0 +1,16 @@ +Example 74 +...... + +Foo +bar + +--- + +baz + +...... + +

Foo +bar

+
+

baz

diff --git a/crates/gfm/tests/fixtures/spec_075.md b/crates/gfm/tests/fixtures/spec_075.md new file mode 100644 index 0000000..c7c83cf --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_075.md @@ -0,0 +1,14 @@ +Example 75 +...... + +Foo +bar +* * * +baz + +...... + +

Foo +bar

+
+

baz

diff --git a/crates/gfm/tests/fixtures/spec_076.md b/crates/gfm/tests/fixtures/spec_076.md new file mode 100644 index 0000000..0cc6886 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_076.md @@ -0,0 +1,14 @@ +Example 76 +...... + +Foo +bar +\--- +baz + +...... + +

Foo +bar +--- +baz

diff --git a/crates/gfm/tests/fixtures/spec_077.md b/crates/gfm/tests/fixtures/spec_077.md new file mode 100644 index 0000000..a354de3 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_077.md @@ -0,0 +1,11 @@ +Example 77 +...... + + a simple + indented code block + +...... + +
a simple
+  indented code block
+
diff --git a/crates/gfm/tests/fixtures/spec_078.md b/crates/gfm/tests/fixtures/spec_078.md new file mode 100644 index 0000000..84bf5cd --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_078.md @@ -0,0 +1,15 @@ +Example 78 +...... + + - foo + + bar + +...... + +
    +
  • +

    foo

    +

    bar

    +
  • +
diff --git a/crates/gfm/tests/fixtures/spec_079.md b/crates/gfm/tests/fixtures/spec_079.md new file mode 100644 index 0000000..840c9c8 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_079.md @@ -0,0 +1,17 @@ +Example 79 +...... + +1. foo + + - bar + +...... + +
    +
  1. +

    foo

    +
      +
    • bar
    • +
    +
  2. +
diff --git a/crates/gfm/tests/fixtures/spec_080.md b/crates/gfm/tests/fixtures/spec_080.md new file mode 100644 index 0000000..46703cc --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_080.md @@ -0,0 +1,15 @@ +Example 80 +...... + +
+ *hi* + + - one + +...... + +
<a/>
+*hi*
+
+- one
+
diff --git a/crates/gfm/tests/fixtures/spec_081.md b/crates/gfm/tests/fixtures/spec_081.md new file mode 100644 index 0000000..3d41fe9 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_081.md @@ -0,0 +1,21 @@ +Example 81 +...... + + chunk1 + + chunk2 + + + + chunk3 + +...... + +
chunk1
+
+chunk2
+
+
+
+chunk3
+
diff --git a/crates/gfm/tests/fixtures/spec_082.md b/crates/gfm/tests/fixtures/spec_082.md new file mode 100644 index 0000000..14b7b85 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_082.md @@ -0,0 +1,13 @@ +Example 82 +...... + + chunk1 + + chunk2 + +...... + +
chunk1
+  
+  chunk2
+
diff --git a/crates/gfm/tests/fixtures/spec_083.md b/crates/gfm/tests/fixtures/spec_083.md new file mode 100644 index 0000000..b3a9fa5 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_083.md @@ -0,0 +1,11 @@ +Example 83 +...... + +Foo + bar + + +...... + +

Foo +bar

diff --git a/crates/gfm/tests/fixtures/spec_084.md b/crates/gfm/tests/fixtures/spec_084.md new file mode 100644 index 0000000..aace74a --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_084.md @@ -0,0 +1,11 @@ +Example 84 +...... + + foo +bar + +...... + +
foo
+
+

bar

diff --git a/crates/gfm/tests/fixtures/spec_085.md b/crates/gfm/tests/fixtures/spec_085.md new file mode 100644 index 0000000..3e723a4 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_085.md @@ -0,0 +1,19 @@ +Example 85 +...... + +# Heading + foo +Heading +------ + foo +---- + +...... + +

Heading

+
foo
+
+

Heading

+
foo
+
+
diff --git a/crates/gfm/tests/fixtures/spec_086.md b/crates/gfm/tests/fixtures/spec_086.md new file mode 100644 index 0000000..172983f --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_086.md @@ -0,0 +1,11 @@ +Example 86 +...... + + foo + bar + +...... + +
    foo
+bar
+
diff --git a/crates/gfm/tests/fixtures/spec_087.md b/crates/gfm/tests/fixtures/spec_087.md new file mode 100644 index 0000000..345f61a --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_087.md @@ -0,0 +1,13 @@ +Example 87 +...... + + + + foo + + + +...... + +
foo
+
diff --git a/crates/gfm/tests/fixtures/spec_088.md b/crates/gfm/tests/fixtures/spec_088.md new file mode 100644 index 0000000..cbfea3b --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_088.md @@ -0,0 +1,9 @@ +Example 88 +...... + + foo + +...... + +
foo  
+
diff --git a/crates/gfm/tests/fixtures/spec_089.md b/crates/gfm/tests/fixtures/spec_089.md new file mode 100644 index 0000000..e4ef237 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_089.md @@ -0,0 +1,13 @@ +Example 89 +...... + +``` +< + > +``` + +...... + +
<
+ >
+
diff --git a/crates/gfm/tests/fixtures/spec_090.md b/crates/gfm/tests/fixtures/spec_090.md new file mode 100644 index 0000000..e1c59ff --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_090.md @@ -0,0 +1,13 @@ +Example 90 +...... + +~~~ +< + > +~~~ + +...... + +
<
+ >
+
diff --git a/crates/gfm/tests/fixtures/spec_091.md b/crates/gfm/tests/fixtures/spec_091.md new file mode 100644 index 0000000..09a78de --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_091.md @@ -0,0 +1,10 @@ +Example 91 +...... + +`` +foo +`` + +...... + +

foo

diff --git a/crates/gfm/tests/fixtures/spec_092.md b/crates/gfm/tests/fixtures/spec_092.md new file mode 100644 index 0000000..c9f367f --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_092.md @@ -0,0 +1,13 @@ +Example 92 +...... + +``` +aaa +~~~ +``` + +...... + +
aaa
+~~~
+
diff --git a/crates/gfm/tests/fixtures/spec_093.md b/crates/gfm/tests/fixtures/spec_093.md new file mode 100644 index 0000000..35187ed --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_093.md @@ -0,0 +1,13 @@ +Example 93 +...... + +~~~ +aaa +``` +~~~ + +...... + +
aaa
+```
+
diff --git a/crates/gfm/tests/fixtures/spec_094.md b/crates/gfm/tests/fixtures/spec_094.md new file mode 100644 index 0000000..6fa9a31 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_094.md @@ -0,0 +1,13 @@ +Example 94 +...... + +```` +aaa +``` +`````` + +...... + +
aaa
+```
+
diff --git a/crates/gfm/tests/fixtures/spec_095.md b/crates/gfm/tests/fixtures/spec_095.md new file mode 100644 index 0000000..e9a4003 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_095.md @@ -0,0 +1,13 @@ +Example 95 +...... + +~~~~ +aaa +~~~ +~~~~ + +...... + +
aaa
+~~~
+
diff --git a/crates/gfm/tests/fixtures/spec_096.md b/crates/gfm/tests/fixtures/spec_096.md new file mode 100644 index 0000000..d989361 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_096.md @@ -0,0 +1,8 @@ +Example 96 +...... + +``` + +...... + +
diff --git a/crates/gfm/tests/fixtures/spec_097.md b/crates/gfm/tests/fixtures/spec_097.md new file mode 100644 index 0000000..8661fc0 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_097.md @@ -0,0 +1,14 @@ +Example 97 +...... + +````` + +``` +aaa + +...... + +

+```
+aaa
+
diff --git a/crates/gfm/tests/fixtures/spec_098.md b/crates/gfm/tests/fixtures/spec_098.md new file mode 100644 index 0000000..19e0266 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_098.md @@ -0,0 +1,15 @@ +Example 98 +...... + +> ``` +> aaa + +bbb + +...... + +
+
aaa
+
+
+

bbb

diff --git a/crates/gfm/tests/fixtures/spec_099.md b/crates/gfm/tests/fixtures/spec_099.md new file mode 100644 index 0000000..eb9c8d5 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_099.md @@ -0,0 +1,13 @@ +Example 99 +...... + +``` + + +``` + +...... + +

+  
+
diff --git a/crates/gfm/tests/fixtures/spec_100.md b/crates/gfm/tests/fixtures/spec_100.md new file mode 100644 index 0000000..9f0edc7 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_100.md @@ -0,0 +1,9 @@ +Example 100 +...... + +``` +``` + +...... + +
diff --git a/crates/gfm/tests/fixtures/spec_101.md b/crates/gfm/tests/fixtures/spec_101.md new file mode 100644 index 0000000..15d80ea --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_101.md @@ -0,0 +1,13 @@ +Example 101 +...... + + ``` + aaa +aaa +``` + +...... + +
aaa
+aaa
+
diff --git a/crates/gfm/tests/fixtures/spec_102.md b/crates/gfm/tests/fixtures/spec_102.md new file mode 100644 index 0000000..a0a61b6 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_102.md @@ -0,0 +1,15 @@ +Example 102 +...... + + ``` +aaa + aaa +aaa + ``` + +...... + +
aaa
+aaa
+aaa
+
diff --git a/crates/gfm/tests/fixtures/spec_103.md b/crates/gfm/tests/fixtures/spec_103.md new file mode 100644 index 0000000..251ec50 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_103.md @@ -0,0 +1,15 @@ +Example 103 +...... + + ``` + aaa + aaa + aaa + ``` + +...... + +
aaa
+ aaa
+aaa
+
diff --git a/crates/gfm/tests/fixtures/spec_104.md b/crates/gfm/tests/fixtures/spec_104.md new file mode 100644 index 0000000..c0dbd77 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_104.md @@ -0,0 +1,13 @@ +Example 104 +...... + + ``` + aaa + ``` + +...... + +
```
+aaa
+```
+
diff --git a/crates/gfm/tests/fixtures/spec_105.md b/crates/gfm/tests/fixtures/spec_105.md new file mode 100644 index 0000000..6d4619c --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_105.md @@ -0,0 +1,11 @@ +Example 105 +...... + +``` +aaa + ``` + +...... + +
aaa
+
diff --git a/crates/gfm/tests/fixtures/spec_106.md b/crates/gfm/tests/fixtures/spec_106.md new file mode 100644 index 0000000..4c51825 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_106.md @@ -0,0 +1,11 @@ +Example 106 +...... + + ``` +aaa + ``` + +...... + +
aaa
+
diff --git a/crates/gfm/tests/fixtures/spec_107.md b/crates/gfm/tests/fixtures/spec_107.md new file mode 100644 index 0000000..0bd1aa9 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_107.md @@ -0,0 +1,12 @@ +Example 107 +...... + +``` +aaa + ``` + +...... + +
aaa
+    ```
+
diff --git a/crates/gfm/tests/fixtures/spec_108.md b/crates/gfm/tests/fixtures/spec_108.md new file mode 100644 index 0000000..df60050 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_108.md @@ -0,0 +1,10 @@ +Example 108 +...... + +``` ``` +aaa + +...... + +

+aaa

diff --git a/crates/gfm/tests/fixtures/spec_109.md b/crates/gfm/tests/fixtures/spec_109.md new file mode 100644 index 0000000..be3c546 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_109.md @@ -0,0 +1,12 @@ +Example 109 +...... + +~~~~~~ +aaa +~~~ ~~ + +...... + +
aaa
+~~~ ~~
+
diff --git a/crates/gfm/tests/fixtures/spec_110.md b/crates/gfm/tests/fixtures/spec_110.md new file mode 100644 index 0000000..8adbd97 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_110.md @@ -0,0 +1,15 @@ +Example 110 +...... + +foo +``` +bar +``` +baz + +...... + +

foo

+
bar
+
+

baz

diff --git a/crates/gfm/tests/fixtures/spec_111.md b/crates/gfm/tests/fixtures/spec_111.md new file mode 100644 index 0000000..1ee7bba --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_111.md @@ -0,0 +1,16 @@ +Example 111 +...... + +foo +--- +~~~ +bar +~~~ +# baz + +...... + +

foo

+
bar
+
+

baz

diff --git a/crates/gfm/tests/fixtures/spec_112.md b/crates/gfm/tests/fixtures/spec_112.md new file mode 100644 index 0000000..d12fc8e --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_112.md @@ -0,0 +1,15 @@ +Example 112 +...... + +```ruby +def foo(x) + return 3 +end +``` + +...... + +
def foo(x)
+  return 3
+end
+
diff --git a/crates/gfm/tests/fixtures/spec_113.md b/crates/gfm/tests/fixtures/spec_113.md new file mode 100644 index 0000000..1b8c5a7 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_113.md @@ -0,0 +1,15 @@ +Example 113 +...... + +~~~~ ruby startline=3 $%@#$ +def foo(x) + return 3 +end +~~~~~~~ + +...... + +
def foo(x)
+  return 3
+end
+
diff --git a/crates/gfm/tests/fixtures/spec_114.md b/crates/gfm/tests/fixtures/spec_114.md new file mode 100644 index 0000000..948133e --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_114.md @@ -0,0 +1,9 @@ +Example 114 +...... + +````; +```` + +...... + +
diff --git a/crates/gfm/tests/fixtures/spec_115.md b/crates/gfm/tests/fixtures/spec_115.md new file mode 100644 index 0000000..6e68ce5 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_115.md @@ -0,0 +1,10 @@ +Example 115 +...... + +``` aa ``` +foo + +...... + +

aa +foo

diff --git a/crates/gfm/tests/fixtures/spec_116.md b/crates/gfm/tests/fixtures/spec_116.md new file mode 100644 index 0000000..1b58d44 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_116.md @@ -0,0 +1,11 @@ +Example 116 +...... + +~~~ aa ``` ~~~ +foo +~~~ + +...... + +
foo
+
diff --git a/crates/gfm/tests/fixtures/spec_117.md b/crates/gfm/tests/fixtures/spec_117.md new file mode 100644 index 0000000..a2bd3e3 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_117.md @@ -0,0 +1,11 @@ +Example 117 +...... + +``` +``` aaa +``` + +...... + +
``` aaa
+
diff --git a/crates/gfm/tests/fixtures/spec_118.md b/crates/gfm/tests/fixtures/spec_118.md new file mode 100644 index 0000000..bb25df2 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_118.md @@ -0,0 +1,19 @@ +Example 118 +...... + +
+
+**Hello**,
+
+_world_.
+
+
+ +...... + +
+
+**Hello**,
+

world. +

+
diff --git a/crates/gfm/tests/fixtures/spec_119.md b/crates/gfm/tests/fixtures/spec_119.md new file mode 100644 index 0000000..0376a18 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_119.md @@ -0,0 +1,23 @@ +Example 119 +...... + + + + + +
+ hi +
+ +okay. + +...... + + + + + +
+ hi +
+

okay.

diff --git a/crates/gfm/tests/fixtures/spec_120.md b/crates/gfm/tests/fixtures/spec_120.md new file mode 100644 index 0000000..8996d70 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_120.md @@ -0,0 +1,12 @@ +Example 120 +...... + +
+ *hello* + + +...... + + +*foo* + +...... + +
+*foo* diff --git a/crates/gfm/tests/fixtures/spec_122.md b/crates/gfm/tests/fixtures/spec_122.md new file mode 100644 index 0000000..9b3c6a4 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_122.md @@ -0,0 +1,14 @@ +Example 122 +...... + +
+ +*Markdown* + +
+ +...... + +
+

Markdown

+
diff --git a/crates/gfm/tests/fixtures/spec_123.md b/crates/gfm/tests/fixtures/spec_123.md new file mode 100644 index 0000000..b225f4b --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_123.md @@ -0,0 +1,12 @@ +Example 123 +...... + +
+
+ +...... + +
+
diff --git a/crates/gfm/tests/fixtures/spec_124.md b/crates/gfm/tests/fixtures/spec_124.md new file mode 100644 index 0000000..bdc5d64 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_124.md @@ -0,0 +1,12 @@ +Example 124 +...... + +
+
+ +...... + +
+
diff --git a/crates/gfm/tests/fixtures/spec_125.md b/crates/gfm/tests/fixtures/spec_125.md new file mode 100644 index 0000000..c39427e --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_125.md @@ -0,0 +1,13 @@ +Example 125 +...... + +
+*foo* + +*bar* + +...... + +
+*foo* +

bar

diff --git a/crates/gfm/tests/fixtures/spec_126.md b/crates/gfm/tests/fixtures/spec_126.md new file mode 100644 index 0000000..41f3c47 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_126.md @@ -0,0 +1,10 @@ +Example 126 +...... + +
+ +...... + + diff --git a/crates/gfm/tests/fixtures/spec_130.md b/crates/gfm/tests/fixtures/spec_130.md new file mode 100644 index 0000000..cc86a86 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_130.md @@ -0,0 +1,12 @@ +Example 130 +...... + +
+foo +
+ +...... + +
+foo +
diff --git a/crates/gfm/tests/fixtures/spec_131.md b/crates/gfm/tests/fixtures/spec_131.md new file mode 100644 index 0000000..1b0cac7 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_131.md @@ -0,0 +1,14 @@ +Example 131 +...... + +
+``` c +int x = 33; +``` + +...... + +
+``` c +int x = 33; +``` diff --git a/crates/gfm/tests/fixtures/spec_132.md b/crates/gfm/tests/fixtures/spec_132.md new file mode 100644 index 0000000..b4531d0 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_132.md @@ -0,0 +1,12 @@ +Example 132 +...... + + +*bar* + + +...... + + +*bar* + diff --git a/crates/gfm/tests/fixtures/spec_133.md b/crates/gfm/tests/fixtures/spec_133.md new file mode 100644 index 0000000..eab4b61 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_133.md @@ -0,0 +1,12 @@ +Example 133 +...... + + +*bar* + + +...... + + +*bar* + diff --git a/crates/gfm/tests/fixtures/spec_134.md b/crates/gfm/tests/fixtures/spec_134.md new file mode 100644 index 0000000..da99824 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_134.md @@ -0,0 +1,12 @@ +Example 134 +...... + + +*bar* + + +...... + + +*bar* + diff --git a/crates/gfm/tests/fixtures/spec_135.md b/crates/gfm/tests/fixtures/spec_135.md new file mode 100644 index 0000000..960a83e --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_135.md @@ -0,0 +1,10 @@ +Example 135 +...... + + +*bar* + +...... + + +*bar* diff --git a/crates/gfm/tests/fixtures/spec_136.md b/crates/gfm/tests/fixtures/spec_136.md new file mode 100644 index 0000000..365fc2b --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_136.md @@ -0,0 +1,12 @@ +Example 136 +...... + + +*foo* + + +...... + + +*foo* + diff --git a/crates/gfm/tests/fixtures/spec_137.md b/crates/gfm/tests/fixtures/spec_137.md new file mode 100644 index 0000000..b0f7156 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_137.md @@ -0,0 +1,14 @@ +Example 137 +...... + + + +*foo* + + + +...... + + +

foo

+
diff --git a/crates/gfm/tests/fixtures/spec_138.md b/crates/gfm/tests/fixtures/spec_138.md new file mode 100644 index 0000000..9162ed0 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_138.md @@ -0,0 +1,8 @@ +Example 138 +...... + +*foo* + +...... + +

foo

diff --git a/crates/gfm/tests/fixtures/spec_139.md b/crates/gfm/tests/fixtures/spec_139.md new file mode 100644 index 0000000..7612930 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_139.md @@ -0,0 +1,20 @@ +Example 139 +...... + +

+import Text.HTML.TagSoup
+
+main :: IO ()
+main = print $ parseTags tags
+
+okay + +...... + +

+import Text.HTML.TagSoup
+
+main :: IO ()
+main = print $ parseTags tags
+
+

okay

diff --git a/crates/gfm/tests/fixtures/spec_140_alt.md b/crates/gfm/tests/fixtures/spec_140_alt.md new file mode 100644 index 0000000..24aa189 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_140_alt.md @@ -0,0 +1,19 @@ +Example 140 +(tag filter applied) +...... + + +okay + +...... + +<script type="text/javascript"> +// JavaScript example + +document.getElementById("demo").innerHTML = "Hello JavaScript!"; + +

okay

diff --git a/crates/gfm/tests/fixtures/spec_141_alt.md b/crates/gfm/tests/fixtures/spec_141_alt.md new file mode 100644 index 0000000..e688a7a --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_141_alt.md @@ -0,0 +1,21 @@ +Example 141 +(tag filter applied) +...... + + +okay + +...... + +<style + type="text/css"> +h1 {color:red;} + +p {color:blue;} + +

okay

diff --git a/crates/gfm/tests/fixtures/spec_142_alt.md b/crates/gfm/tests/fixtures/spec_142_alt.md new file mode 100644 index 0000000..85a73f4 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_142_alt.md @@ -0,0 +1,15 @@ +Example 142 +(tag filter applied) +...... + + +*foo* + +...... + +<style>p{color:red;} +

foo

diff --git a/crates/gfm/tests/fixtures/spec_146.md b/crates/gfm/tests/fixtures/spec_146.md new file mode 100644 index 0000000..6741e76 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_146.md @@ -0,0 +1,10 @@ +Example 146 +...... + +*bar* +*baz* + +...... + +*bar* +

baz

diff --git a/crates/gfm/tests/fixtures/spec_147_alt.md b/crates/gfm/tests/fixtures/spec_147_alt.md new file mode 100644 index 0000000..6ca7c8b --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_147_alt.md @@ -0,0 +1,13 @@ +Example 147 +(tag filter applied) +...... + +1. *bar* + +...... + +<script> +foo +1. *bar* diff --git a/crates/gfm/tests/fixtures/spec_148.md b/crates/gfm/tests/fixtures/spec_148.md new file mode 100644 index 0000000..4605bd4 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_148.md @@ -0,0 +1,16 @@ +Example 148 +...... + + +okay + +...... + + +

okay

diff --git a/crates/gfm/tests/fixtures/spec_149.md b/crates/gfm/tests/fixtures/spec_149.md new file mode 100644 index 0000000..e5cb142 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_149.md @@ -0,0 +1,18 @@ +Example 149 +...... + +'; + +?> +okay + +...... + +'; + +?> +

okay

diff --git a/crates/gfm/tests/fixtures/spec_150.md b/crates/gfm/tests/fixtures/spec_150.md new file mode 100644 index 0000000..049d371 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_150.md @@ -0,0 +1,8 @@ +Example 150 +...... + + + +...... + + diff --git a/crates/gfm/tests/fixtures/spec_151.md b/crates/gfm/tests/fixtures/spec_151.md new file mode 100644 index 0000000..7661c85 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_151.md @@ -0,0 +1,32 @@ +Example 151 +...... + + +okay + +...... + + +

okay

diff --git a/crates/gfm/tests/fixtures/spec_152.md b/crates/gfm/tests/fixtures/spec_152.md new file mode 100644 index 0000000..9ac98f4 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_152.md @@ -0,0 +1,12 @@ +Example 152 +...... + + + + + +...... + + +
<!-- foo -->
+
diff --git a/crates/gfm/tests/fixtures/spec_153.md b/crates/gfm/tests/fixtures/spec_153.md new file mode 100644 index 0000000..1800af0 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_153.md @@ -0,0 +1,12 @@ +Example 153 +...... + +
+ +
+ +...... + +
+
<div>
+
diff --git a/crates/gfm/tests/fixtures/spec_154.md b/crates/gfm/tests/fixtures/spec_154.md new file mode 100644 index 0000000..c540c07 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_154.md @@ -0,0 +1,14 @@ +Example 154 +...... + +Foo +
+bar +
+ +...... + +

Foo

+
+bar +
diff --git a/crates/gfm/tests/fixtures/spec_155.md b/crates/gfm/tests/fixtures/spec_155.md new file mode 100644 index 0000000..5285985 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_155.md @@ -0,0 +1,14 @@ +Example 155 +...... + +
+bar +
+*foo* + +...... + +
+bar +
+*foo* diff --git a/crates/gfm/tests/fixtures/spec_156.md b/crates/gfm/tests/fixtures/spec_156.md new file mode 100644 index 0000000..d4a8817 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_156.md @@ -0,0 +1,12 @@ +Example 156 +...... + +Foo + +baz + +...... + +

Foo + +baz

diff --git a/crates/gfm/tests/fixtures/spec_157.md b/crates/gfm/tests/fixtures/spec_157.md new file mode 100644 index 0000000..4bffe97 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_157.md @@ -0,0 +1,14 @@ +Example 157 +...... + +
+ +*Emphasized* text. + +
+ +...... + +
+

Emphasized text.

+
diff --git a/crates/gfm/tests/fixtures/spec_158.md b/crates/gfm/tests/fixtures/spec_158.md new file mode 100644 index 0000000..a4fb761 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_158.md @@ -0,0 +1,12 @@ +Example 158 +...... + +
+*Emphasized* text. +
+ +...... + +
+*Emphasized* text. +
diff --git a/crates/gfm/tests/fixtures/spec_159.md b/crates/gfm/tests/fixtures/spec_159.md new file mode 100644 index 0000000..31236d6 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_159.md @@ -0,0 +1,24 @@ +Example 159 +...... + + + + + + + + + +
+Hi +
+ +...... + + + + + +
+Hi +
diff --git a/crates/gfm/tests/fixtures/spec_160.md b/crates/gfm/tests/fixtures/spec_160.md new file mode 100644 index 0000000..5296538 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_160.md @@ -0,0 +1,25 @@ +Example 160 +...... + + + + + + + + + +
+ Hi +
+ +...... + + + +
<td>
+  Hi
+</td>
+
+ +
diff --git a/crates/gfm/tests/fixtures/spec_161.md b/crates/gfm/tests/fixtures/spec_161.md new file mode 100644 index 0000000..9b439d0 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_161.md @@ -0,0 +1,10 @@ +Example 161 +...... + +[foo]: /url "title" + +[foo] + +...... + +

foo

diff --git a/crates/gfm/tests/fixtures/spec_162.md b/crates/gfm/tests/fixtures/spec_162.md new file mode 100644 index 0000000..f41bea9 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_162.md @@ -0,0 +1,12 @@ +Example 162 +...... + + [foo]: + /url + 'the title' + +[foo] + +...... + +

foo

diff --git a/crates/gfm/tests/fixtures/spec_163.md b/crates/gfm/tests/fixtures/spec_163.md new file mode 100644 index 0000000..dbd7e2a --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_163.md @@ -0,0 +1,10 @@ +Example 163 +...... + +[Foo*bar\]]:my_(url) 'title (with parens)' + +[Foo*bar\]] + +...... + +

Foo*bar]

diff --git a/crates/gfm/tests/fixtures/spec_164.md b/crates/gfm/tests/fixtures/spec_164.md new file mode 100644 index 0000000..553e873 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_164.md @@ -0,0 +1,12 @@ +Example 164 +...... + +[Foo bar]: + +'title' + +[Foo bar] + +...... + +

Foo bar

diff --git a/crates/gfm/tests/fixtures/spec_165.md b/crates/gfm/tests/fixtures/spec_165.md new file mode 100644 index 0000000..11a53b6 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_165.md @@ -0,0 +1,18 @@ +Example 165 +...... + +[foo]: /url ' +title +line1 +line2 +' + +[foo] + +...... + +

foo

diff --git a/crates/gfm/tests/fixtures/spec_166.md b/crates/gfm/tests/fixtures/spec_166.md new file mode 100644 index 0000000..01e171c --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_166.md @@ -0,0 +1,14 @@ +Example 166 +...... + +[foo]: /url 'title + +with blank line' + +[foo] + +...... + +

[foo]: /url 'title

+

with blank line'

+

[foo]

diff --git a/crates/gfm/tests/fixtures/spec_167.md b/crates/gfm/tests/fixtures/spec_167.md new file mode 100644 index 0000000..3977a78 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_167.md @@ -0,0 +1,11 @@ +Example 167 +...... + +[foo]: +/url + +[foo] + +...... + +

foo

diff --git a/crates/gfm/tests/fixtures/spec_168.md b/crates/gfm/tests/fixtures/spec_168.md new file mode 100644 index 0000000..3defcb9 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_168.md @@ -0,0 +1,11 @@ +Example 168 +...... + +[foo]: + +[foo] + +...... + +

[foo]:

+

[foo]

diff --git a/crates/gfm/tests/fixtures/spec_169.md b/crates/gfm/tests/fixtures/spec_169.md new file mode 100644 index 0000000..35ff236 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_169.md @@ -0,0 +1,10 @@ +Example 169 +...... + +[foo]: <> + +[foo] + +...... + +

foo

diff --git a/crates/gfm/tests/fixtures/spec_170.md b/crates/gfm/tests/fixtures/spec_170.md new file mode 100644 index 0000000..6b7f0f3 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_170.md @@ -0,0 +1,11 @@ +Example 170 +...... + +[foo]: (baz) + +[foo] + +...... + +

[foo]: (baz)

+

[foo]

diff --git a/crates/gfm/tests/fixtures/spec_171.md b/crates/gfm/tests/fixtures/spec_171.md new file mode 100644 index 0000000..2e1079f --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_171.md @@ -0,0 +1,10 @@ +Example 171 +...... + +[foo]: /url\bar\*baz "foo\"bar\baz" + +[foo] + +...... + +

foo

diff --git a/crates/gfm/tests/fixtures/spec_172.md b/crates/gfm/tests/fixtures/spec_172.md new file mode 100644 index 0000000..e966cc3 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_172.md @@ -0,0 +1,10 @@ +Example 172 +...... + +[foo] + +[foo]: url + +...... + +

foo

diff --git a/crates/gfm/tests/fixtures/spec_173.md b/crates/gfm/tests/fixtures/spec_173.md new file mode 100644 index 0000000..4ee7cef --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_173.md @@ -0,0 +1,11 @@ +Example 173 +...... + +[foo] + +[foo]: first +[foo]: second + +...... + +

foo

diff --git a/crates/gfm/tests/fixtures/spec_174.md b/crates/gfm/tests/fixtures/spec_174.md new file mode 100644 index 0000000..c73fa6f --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_174.md @@ -0,0 +1,10 @@ +Example 174 +...... + +[FOO]: /url + +[Foo] + +...... + +

Foo

diff --git a/crates/gfm/tests/fixtures/spec_175.md b/crates/gfm/tests/fixtures/spec_175.md new file mode 100644 index 0000000..5229b0d --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_175.md @@ -0,0 +1,10 @@ +Example 175 +...... + +[ΑΓΩ]: /φου + +[αγω] + +...... + +

αγω

diff --git a/crates/gfm/tests/fixtures/spec_176.md b/crates/gfm/tests/fixtures/spec_176.md new file mode 100644 index 0000000..85c1f1a --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_176.md @@ -0,0 +1,6 @@ +Example 176 +...... + +[foo]: /url + +...... diff --git a/crates/gfm/tests/fixtures/spec_177.md b/crates/gfm/tests/fixtures/spec_177.md new file mode 100644 index 0000000..4abb5f4 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_177.md @@ -0,0 +1,11 @@ +Example 177 +...... + +[ +foo +]: /url +bar + +...... + +

bar

diff --git a/crates/gfm/tests/fixtures/spec_178.md b/crates/gfm/tests/fixtures/spec_178.md new file mode 100644 index 0000000..f7ad39f --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_178.md @@ -0,0 +1,8 @@ +Example 178 +...... + +[foo]: /url "title" ok + +...... + +

[foo]: /url "title" ok

diff --git a/crates/gfm/tests/fixtures/spec_179.md b/crates/gfm/tests/fixtures/spec_179.md new file mode 100644 index 0000000..9f3562d --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_179.md @@ -0,0 +1,9 @@ +Example 179 +...... + +[foo]: /url +"title" ok + +...... + +

"title" ok

diff --git a/crates/gfm/tests/fixtures/spec_180.md b/crates/gfm/tests/fixtures/spec_180.md new file mode 100644 index 0000000..eedb766 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_180.md @@ -0,0 +1,12 @@ +Example 180 +...... + + [foo]: /url "title" + +[foo] + +...... + +
[foo]: /url "title"
+
+

[foo]

diff --git a/crates/gfm/tests/fixtures/spec_181.md b/crates/gfm/tests/fixtures/spec_181.md new file mode 100644 index 0000000..7f1c10d --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_181.md @@ -0,0 +1,14 @@ +Example 181 +...... + +``` +[foo]: /url +``` + +[foo] + +...... + +
[foo]: /url
+
+

[foo]

diff --git a/crates/gfm/tests/fixtures/spec_182.md b/crates/gfm/tests/fixtures/spec_182.md new file mode 100644 index 0000000..96c1846 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_182.md @@ -0,0 +1,13 @@ +Example 182 +...... + +Foo +[bar]: /baz + +[bar] + +...... + +

Foo +[bar]: /baz

+

[bar]

diff --git a/crates/gfm/tests/fixtures/spec_183.md b/crates/gfm/tests/fixtures/spec_183.md new file mode 100644 index 0000000..a5bf886 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_183.md @@ -0,0 +1,13 @@ +Example 183 +...... + +# [Foo] +[foo]: /url +> bar + +...... + +

Foo

+
+

bar

+
diff --git a/crates/gfm/tests/fixtures/spec_184.md b/crates/gfm/tests/fixtures/spec_184.md new file mode 100644 index 0000000..5abf6f4 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_184.md @@ -0,0 +1,12 @@ +Example 184 +...... + +[foo]: /url +bar +=== +[foo] + +...... + +

bar

+

foo

diff --git a/crates/gfm/tests/fixtures/spec_185.md b/crates/gfm/tests/fixtures/spec_185.md new file mode 100644 index 0000000..ca27a7d --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_185.md @@ -0,0 +1,11 @@ +Example 185 +...... + +[foo]: /url +=== +[foo] + +...... + +

=== +foo

diff --git a/crates/gfm/tests/fixtures/spec_186.md b/crates/gfm/tests/fixtures/spec_186.md new file mode 100644 index 0000000..7b653f0 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_186.md @@ -0,0 +1,17 @@ +Example 186 +...... + +[foo]: /foo-url "foo" +[bar]: /bar-url + "bar" +[baz]: /baz-url + +[foo], +[bar], +[baz] + +...... + +

foo, +bar, +baz

diff --git a/crates/gfm/tests/fixtures/spec_187.md b/crates/gfm/tests/fixtures/spec_187.md new file mode 100644 index 0000000..a9ba998 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_187.md @@ -0,0 +1,12 @@ +Example 187 +...... + +[foo] + +> [foo]: /url + +...... + +

foo

+
+
diff --git a/crates/gfm/tests/fixtures/spec_188.md b/crates/gfm/tests/fixtures/spec_188.md new file mode 100644 index 0000000..7efe3e9 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_188.md @@ -0,0 +1,6 @@ +Example 188 +...... + +[foo]: /url + +...... diff --git a/crates/gfm/tests/fixtures/spec_189.md b/crates/gfm/tests/fixtures/spec_189.md new file mode 100644 index 0000000..2101f3e --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_189.md @@ -0,0 +1,11 @@ +Example 189 +...... + +aaa + +bbb + +...... + +

aaa

+

bbb

diff --git a/crates/gfm/tests/fixtures/spec_190.md b/crates/gfm/tests/fixtures/spec_190.md new file mode 100644 index 0000000..7dd3c6b --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_190.md @@ -0,0 +1,15 @@ +Example 190 +...... + +aaa +bbb + +ccc +ddd + +...... + +

aaa +bbb

+

ccc +ddd

diff --git a/crates/gfm/tests/fixtures/spec_191.md b/crates/gfm/tests/fixtures/spec_191.md new file mode 100644 index 0000000..fd1db92 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_191.md @@ -0,0 +1,12 @@ +Example 191 +...... + +aaa + + +bbb + +...... + +

aaa

+

bbb

diff --git a/crates/gfm/tests/fixtures/spec_192.md b/crates/gfm/tests/fixtures/spec_192.md new file mode 100644 index 0000000..2e459f4 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_192.md @@ -0,0 +1,10 @@ +Example 192 +...... + + aaa + bbb + +...... + +

aaa +bbb

diff --git a/crates/gfm/tests/fixtures/spec_193.md b/crates/gfm/tests/fixtures/spec_193.md new file mode 100644 index 0000000..0270c9b --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_193.md @@ -0,0 +1,12 @@ +Example 193 +...... + +aaa + bbb + ccc + +...... + +

aaa +bbb +ccc

diff --git a/crates/gfm/tests/fixtures/spec_194.md b/crates/gfm/tests/fixtures/spec_194.md new file mode 100644 index 0000000..a120601 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_194.md @@ -0,0 +1,10 @@ +Example 194 +...... + + aaa +bbb + +...... + +

aaa +bbb

diff --git a/crates/gfm/tests/fixtures/spec_195.md b/crates/gfm/tests/fixtures/spec_195.md new file mode 100644 index 0000000..4e6e755 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_195.md @@ -0,0 +1,11 @@ +Example 195 +...... + + aaa +bbb + +...... + +
aaa
+
+

bbb

diff --git a/crates/gfm/tests/fixtures/spec_196.md b/crates/gfm/tests/fixtures/spec_196.md new file mode 100644 index 0000000..b9802f5 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_196.md @@ -0,0 +1,10 @@ +Example 196 +...... + +aaa +bbb + +...... + +

aaa
+bbb

diff --git a/crates/gfm/tests/fixtures/spec_197.md b/crates/gfm/tests/fixtures/spec_197.md new file mode 100644 index 0000000..f7bdf96 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_197.md @@ -0,0 +1,16 @@ +Example 197 +...... + + + +aaa + + +# aaa + + + +...... + +

aaa

+

aaa

diff --git a/crates/gfm/tests/fixtures/spec_198.md b/crates/gfm/tests/fixtures/spec_198.md new file mode 100644 index 0000000..ea8ecce --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_198.md @@ -0,0 +1,23 @@ +Example 198 +...... + +| foo | bar | +| --- | --- | +| baz | bim | + +...... + + + + + + + + + + + + + + +
foobar
bazbim
diff --git a/crates/gfm/tests/fixtures/spec_199_alt.md b/crates/gfm/tests/fixtures/spec_199_alt.md new file mode 100644 index 0000000..a69571c --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_199_alt.md @@ -0,0 +1,24 @@ +Example 199 +(how alignments are represented is altered) +...... + +| abc | defghi | +:-: | -----------: +bar | baz + +...... + + + + + + + + + + + + + + +
abcdefghi
barbaz
diff --git a/crates/gfm/tests/fixtures/spec_200.md b/crates/gfm/tests/fixtures/spec_200.md new file mode 100644 index 0000000..78991dd --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_200.md @@ -0,0 +1,25 @@ +Example 200 +...... + +| f\|oo | +| ------ | +| b `\|` az | +| b **\|** im | + +...... + + + + + + + + + + + + + + + +
f|oo
b | az
b | im
diff --git a/crates/gfm/tests/fixtures/spec_201.md b/crates/gfm/tests/fixtures/spec_201.md new file mode 100644 index 0000000..171371e --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_201.md @@ -0,0 +1,27 @@ +Example 201 +...... + +| abc | def | +| --- | --- | +| bar | baz | +> bar + +...... + + + + + + + + + + + + + + +
abcdef
barbaz
+
+

bar

+
diff --git a/crates/gfm/tests/fixtures/spec_202.md b/crates/gfm/tests/fixtures/spec_202.md new file mode 100644 index 0000000..c6c7c2c --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_202.md @@ -0,0 +1,31 @@ +Example 202 +...... + +| abc | def | +| --- | --- | +| bar | baz | +bar + +bar + +...... + + + + + + + + + + + + + + + + + + +
abcdef
barbaz
bar
+

bar

diff --git a/crates/gfm/tests/fixtures/spec_203.md b/crates/gfm/tests/fixtures/spec_203.md new file mode 100644 index 0000000..711b351 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_203.md @@ -0,0 +1,12 @@ +Example 203 +...... + +| abc | def | +| --- | +| bar | + +...... + +

| abc | def | +| --- | +| bar |

diff --git a/crates/gfm/tests/fixtures/spec_204.md b/crates/gfm/tests/fixtures/spec_204.md new file mode 100644 index 0000000..519cce1 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_204.md @@ -0,0 +1,28 @@ +Example 204 +...... + +| abc | def | +| --- | --- | +| bar | +| bar | baz | boo | + +...... + + + + + + + + + + + + + + + + + + +
abcdef
bar
barbaz
diff --git a/crates/gfm/tests/fixtures/spec_205.md b/crates/gfm/tests/fixtures/spec_205.md new file mode 100644 index 0000000..72d0e66 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_205.md @@ -0,0 +1,16 @@ +Example 205 +...... + +| abc | def | +| --- | --- | + +...... + + + + + + + + +
abcdef
diff --git a/crates/gfm/tests/fixtures/spec_206.md b/crates/gfm/tests/fixtures/spec_206.md new file mode 100644 index 0000000..72d497b --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_206.md @@ -0,0 +1,14 @@ +Example 206 +...... + +> # Foo +> bar +> baz + +...... + +
+

Foo

+

bar +baz

+
diff --git a/crates/gfm/tests/fixtures/spec_207.md b/crates/gfm/tests/fixtures/spec_207.md new file mode 100644 index 0000000..8a48f15 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_207.md @@ -0,0 +1,14 @@ +Example 207 +...... + +># Foo +>bar +> baz + +...... + +
+

Foo

+

bar +baz

+
diff --git a/crates/gfm/tests/fixtures/spec_208.md b/crates/gfm/tests/fixtures/spec_208.md new file mode 100644 index 0000000..69564ea --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_208.md @@ -0,0 +1,14 @@ +Example 208 +...... + + > # Foo + > bar + > baz + +...... + +
+

Foo

+

bar +baz

+
diff --git a/crates/gfm/tests/fixtures/spec_209.md b/crates/gfm/tests/fixtures/spec_209.md new file mode 100644 index 0000000..8847bb9 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_209.md @@ -0,0 +1,13 @@ +Example 209 +...... + + > # Foo + > bar + > baz + +...... + +
> # Foo
+> bar
+> baz
+
diff --git a/crates/gfm/tests/fixtures/spec_210.md b/crates/gfm/tests/fixtures/spec_210.md new file mode 100644 index 0000000..af20706 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_210.md @@ -0,0 +1,14 @@ +Example 210 +...... + +> # Foo +> bar +baz + +...... + +
+

Foo

+

bar +baz

+
diff --git a/crates/gfm/tests/fixtures/spec_211.md b/crates/gfm/tests/fixtures/spec_211.md new file mode 100644 index 0000000..f6e892f --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_211.md @@ -0,0 +1,14 @@ +Example 211 +...... + +> bar +baz +> foo + +...... + +
+

bar +baz +foo

+
diff --git a/crates/gfm/tests/fixtures/spec_212.md b/crates/gfm/tests/fixtures/spec_212.md new file mode 100644 index 0000000..52c7739 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_212.md @@ -0,0 +1,12 @@ +Example 212 +...... + +> foo +--- + +...... + +
+

foo

+
+
diff --git a/crates/gfm/tests/fixtures/spec_213.md b/crates/gfm/tests/fixtures/spec_213.md new file mode 100644 index 0000000..f90e99b --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_213.md @@ -0,0 +1,16 @@ +Example 213 +...... + +> - foo +- bar + +...... + +
+
    +
  • foo
  • +
+
+
    +
  • bar
  • +
diff --git a/crates/gfm/tests/fixtures/spec_214.md b/crates/gfm/tests/fixtures/spec_214.md new file mode 100644 index 0000000..35c297c --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_214.md @@ -0,0 +1,14 @@ +Example 214 +...... + +> foo + bar + +...... + +
+
foo
+
+
+
bar
+
diff --git a/crates/gfm/tests/fixtures/spec_215.md b/crates/gfm/tests/fixtures/spec_215.md new file mode 100644 index 0000000..3f36410 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_215.md @@ -0,0 +1,14 @@ +Example 215 +...... + +> ``` +foo +``` + +...... + +
+
+
+

foo

+
diff --git a/crates/gfm/tests/fixtures/spec_216.md b/crates/gfm/tests/fixtures/spec_216.md new file mode 100644 index 0000000..e808555 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_216.md @@ -0,0 +1,12 @@ +Example 216 +...... + +> foo + - bar + +...... + +
+

foo +- bar

+
diff --git a/crates/gfm/tests/fixtures/spec_217.md b/crates/gfm/tests/fixtures/spec_217.md new file mode 100644 index 0000000..f1229bc --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_217.md @@ -0,0 +1,9 @@ +Example 217 +...... + +> + +...... + +
+
diff --git a/crates/gfm/tests/fixtures/spec_218.md b/crates/gfm/tests/fixtures/spec_218.md new file mode 100644 index 0000000..9cb384d --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_218.md @@ -0,0 +1,11 @@ +Example 218 +...... + +> +> +> + +...... + +
+
diff --git a/crates/gfm/tests/fixtures/spec_219.md b/crates/gfm/tests/fixtures/spec_219.md new file mode 100644 index 0000000..d7dd0b1 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_219.md @@ -0,0 +1,12 @@ +Example 219 +...... + +> +> foo +> + +...... + +
+

foo

+
diff --git a/crates/gfm/tests/fixtures/spec_220.md b/crates/gfm/tests/fixtures/spec_220.md new file mode 100644 index 0000000..57049f5 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_220.md @@ -0,0 +1,15 @@ +Example 220 +...... + +> foo + +> bar + +...... + +
+

foo

+
+
+

bar

+
diff --git a/crates/gfm/tests/fixtures/spec_221.md b/crates/gfm/tests/fixtures/spec_221.md new file mode 100644 index 0000000..c41ae05 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_221.md @@ -0,0 +1,12 @@ +Example 221 +...... + +> foo +> bar + +...... + +
+

foo +bar

+
diff --git a/crates/gfm/tests/fixtures/spec_222.md b/crates/gfm/tests/fixtures/spec_222.md new file mode 100644 index 0000000..4fe3c54 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_222.md @@ -0,0 +1,13 @@ +Example 222 +...... + +> foo +> +> bar + +...... + +
+

foo

+

bar

+
diff --git a/crates/gfm/tests/fixtures/spec_223.md b/crates/gfm/tests/fixtures/spec_223.md new file mode 100644 index 0000000..1936b61 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_223.md @@ -0,0 +1,12 @@ +Example 223 +...... + +foo +> bar + +...... + +

foo

+
+

bar

+
diff --git a/crates/gfm/tests/fixtures/spec_224.md b/crates/gfm/tests/fixtures/spec_224.md new file mode 100644 index 0000000..9e852dc --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_224.md @@ -0,0 +1,16 @@ +Example 224 +...... + +> aaa +*** +> bbb + +...... + +
+

aaa

+
+
+
+

bbb

+
diff --git a/crates/gfm/tests/fixtures/spec_225.md b/crates/gfm/tests/fixtures/spec_225.md new file mode 100644 index 0000000..a48035c --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_225.md @@ -0,0 +1,12 @@ +Example 225 +...... + +> bar +baz + +...... + +
+

bar +baz

+
diff --git a/crates/gfm/tests/fixtures/spec_226.md b/crates/gfm/tests/fixtures/spec_226.md new file mode 100644 index 0000000..78800b9 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_226.md @@ -0,0 +1,13 @@ +Example 226 +...... + +> bar + +baz + +...... + +
+

bar

+
+

baz

diff --git a/crates/gfm/tests/fixtures/spec_227.md b/crates/gfm/tests/fixtures/spec_227.md new file mode 100644 index 0000000..5fa1a35 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_227.md @@ -0,0 +1,13 @@ +Example 227 +...... + +> bar +> +baz + +...... + +
+

bar

+
+

baz

diff --git a/crates/gfm/tests/fixtures/spec_228.md b/crates/gfm/tests/fixtures/spec_228.md new file mode 100644 index 0000000..3010ec2 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_228.md @@ -0,0 +1,16 @@ +Example 228 +...... + +> > > foo +bar + +...... + +
+
+
+

foo +bar

+
+
+
diff --git a/crates/gfm/tests/fixtures/spec_229.md b/crates/gfm/tests/fixtures/spec_229.md new file mode 100644 index 0000000..3eea019 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_229.md @@ -0,0 +1,18 @@ +Example 229 +...... + +>>> foo +> bar +>>baz + +...... + +
+
+
+

foo +bar +baz

+
+
+
diff --git a/crates/gfm/tests/fixtures/spec_230.md b/crates/gfm/tests/fixtures/spec_230.md new file mode 100644 index 0000000..51c0317 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_230.md @@ -0,0 +1,16 @@ +Example 230 +...... + +> code + +> not code + +...... + +
+
code
+
+
+
+

not code

+
diff --git a/crates/gfm/tests/fixtures/spec_231.md b/crates/gfm/tests/fixtures/spec_231.md new file mode 100644 index 0000000..a81e113 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_231.md @@ -0,0 +1,19 @@ +Example 231 +...... + +A paragraph +with two lines. + + indented code + +> A block quote. + +...... + +

A paragraph +with two lines.

+
indented code
+
+
+

A block quote.

+
diff --git a/crates/gfm/tests/fixtures/spec_232.md b/crates/gfm/tests/fixtures/spec_232.md new file mode 100644 index 0000000..7da99c4 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_232.md @@ -0,0 +1,23 @@ +Example 232 +...... + +1. A paragraph + with two lines. + + indented code + + > A block quote. + +...... + +
    +
  1. +

    A paragraph +with two lines.

    +
    indented code
    +
    +
    +

    A block quote.

    +
    +
  2. +
diff --git a/crates/gfm/tests/fixtures/spec_233.md b/crates/gfm/tests/fixtures/spec_233.md new file mode 100644 index 0000000..0e58a4b --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_233.md @@ -0,0 +1,13 @@ +Example 233 +...... + +- one + + two + +...... + +
    +
  • one
  • +
+

two

diff --git a/crates/gfm/tests/fixtures/spec_234.md b/crates/gfm/tests/fixtures/spec_234.md new file mode 100644 index 0000000..17771b6 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_234.md @@ -0,0 +1,15 @@ +Example 234 +...... + +- one + + two + +...... + +
    +
  • +

    one

    +

    two

    +
  • +
diff --git a/crates/gfm/tests/fixtures/spec_235.md b/crates/gfm/tests/fixtures/spec_235.md new file mode 100644 index 0000000..767d6f5 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_235.md @@ -0,0 +1,14 @@ +Example 235 +...... + + - one + + two + +...... + +
    +
  • one
  • +
+
 two
+
diff --git a/crates/gfm/tests/fixtures/spec_236.md b/crates/gfm/tests/fixtures/spec_236.md new file mode 100644 index 0000000..d585325 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_236.md @@ -0,0 +1,15 @@ +Example 236 +...... + + - one + + two + +...... + +
    +
  • +

    one

    +

    two

    +
  • +
diff --git a/crates/gfm/tests/fixtures/spec_237.md b/crates/gfm/tests/fixtures/spec_237.md new file mode 100644 index 0000000..ec3af4c --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_237.md @@ -0,0 +1,19 @@ +Example 237 +...... + + > > 1. one +>> +>> two + +...... + +
+
+
    +
  1. +

    one

    +

    two

    +
  2. +
+
+
diff --git a/crates/gfm/tests/fixtures/spec_238.md b/crates/gfm/tests/fixtures/spec_238.md new file mode 100644 index 0000000..03bf58d --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_238.md @@ -0,0 +1,17 @@ +Example 238 +...... + +>>- one +>> + > > two + +...... + +
+
+
    +
  • one
  • +
+

two

+
+
diff --git a/crates/gfm/tests/fixtures/spec_239.md b/crates/gfm/tests/fixtures/spec_239.md new file mode 100644 index 0000000..1e6f75a --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_239.md @@ -0,0 +1,11 @@ +Example 239 +...... + +-one + +2.two + +...... + +

-one

+

2.two

diff --git a/crates/gfm/tests/fixtures/spec_240.md b/crates/gfm/tests/fixtures/spec_240.md new file mode 100644 index 0000000..1e20a8b --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_240.md @@ -0,0 +1,16 @@ +Example 240 +...... + +- foo + + + bar + +...... + +
    +
  • +

    foo

    +

    bar

    +
  • +
diff --git a/crates/gfm/tests/fixtures/spec_241.md b/crates/gfm/tests/fixtures/spec_241.md new file mode 100644 index 0000000..482c0a5 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_241.md @@ -0,0 +1,26 @@ +Example 241 +...... + +1. foo + + ``` + bar + ``` + + baz + + > bam + +...... + +
    +
  1. +

    foo

    +
    bar
    +
    +

    baz

    +
    +

    bam

    +
    +
  2. +
diff --git a/crates/gfm/tests/fixtures/spec_242.md b/crates/gfm/tests/fixtures/spec_242.md new file mode 100644 index 0000000..66f86de --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_242.md @@ -0,0 +1,22 @@ +Example 242 +...... + +- Foo + + bar + + + baz + +...... + +
    +
  • +

    Foo

    +
    bar
    +
    +
    +baz
    +
    +
  • +
diff --git a/crates/gfm/tests/fixtures/spec_243.md b/crates/gfm/tests/fixtures/spec_243.md new file mode 100644 index 0000000..a104354 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_243.md @@ -0,0 +1,10 @@ +Example 243 +...... + +123456789. ok + +...... + +
    +
  1. ok
  2. +
diff --git a/crates/gfm/tests/fixtures/spec_244.md b/crates/gfm/tests/fixtures/spec_244.md new file mode 100644 index 0000000..1faa1a5 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_244.md @@ -0,0 +1,8 @@ +Example 244 +...... + +1234567890. not ok + +...... + +

1234567890. not ok

diff --git a/crates/gfm/tests/fixtures/spec_245.md b/crates/gfm/tests/fixtures/spec_245.md new file mode 100644 index 0000000..da088b2 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_245.md @@ -0,0 +1,10 @@ +Example 245 +...... + +0. ok + +...... + +
    +
  1. ok
  2. +
diff --git a/crates/gfm/tests/fixtures/spec_246.md b/crates/gfm/tests/fixtures/spec_246.md new file mode 100644 index 0000000..193f95c --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_246.md @@ -0,0 +1,10 @@ +Example 246 +...... + +003. ok + +...... + +
    +
  1. ok
  2. +
diff --git a/crates/gfm/tests/fixtures/spec_247.md b/crates/gfm/tests/fixtures/spec_247.md new file mode 100644 index 0000000..fef2103 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_247.md @@ -0,0 +1,8 @@ +Example 247 +...... + +-1. not ok + +...... + +

-1. not ok

diff --git a/crates/gfm/tests/fixtures/spec_248.md b/crates/gfm/tests/fixtures/spec_248.md new file mode 100644 index 0000000..fd979fd --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_248.md @@ -0,0 +1,16 @@ +Example 248 +...... + +- foo + + bar + +...... + +
    +
  • +

    foo

    +
    bar
    +
    +
  • +
diff --git a/crates/gfm/tests/fixtures/spec_249.md b/crates/gfm/tests/fixtures/spec_249.md new file mode 100644 index 0000000..35415ac --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_249.md @@ -0,0 +1,16 @@ +Example 249 +...... + + 10. foo + + bar + +...... + +
    +
  1. +

    foo

    +
    bar
    +
    +
  2. +
diff --git a/crates/gfm/tests/fixtures/spec_250.md b/crates/gfm/tests/fixtures/spec_250.md new file mode 100644 index 0000000..e4e0dba --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_250.md @@ -0,0 +1,16 @@ +Example 250 +...... + + indented code + +paragraph + + more code + +...... + +
indented code
+
+

paragraph

+
more code
+
diff --git a/crates/gfm/tests/fixtures/spec_251.md b/crates/gfm/tests/fixtures/spec_251.md new file mode 100644 index 0000000..0751399 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_251.md @@ -0,0 +1,20 @@ +Example 251 +...... + +1. indented code + + paragraph + + more code + +...... + +
    +
  1. +
    indented code
    +
    +

    paragraph

    +
    more code
    +
    +
  2. +
diff --git a/crates/gfm/tests/fixtures/spec_252.md b/crates/gfm/tests/fixtures/spec_252.md new file mode 100644 index 0000000..604f5b0 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_252.md @@ -0,0 +1,20 @@ +Example 252 +...... + +1. indented code + + paragraph + + more code + +...... + +
    +
  1. +
     indented code
    +
    +

    paragraph

    +
    more code
    +
    +
  2. +
diff --git a/crates/gfm/tests/fixtures/spec_253.md b/crates/gfm/tests/fixtures/spec_253.md new file mode 100644 index 0000000..755f34a --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_253.md @@ -0,0 +1,11 @@ +Example 253 +...... + + foo + +bar + +...... + +

foo

+

bar

diff --git a/crates/gfm/tests/fixtures/spec_254.md b/crates/gfm/tests/fixtures/spec_254.md new file mode 100644 index 0000000..db4e148 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_254.md @@ -0,0 +1,13 @@ +Example 254 +...... + +- foo + + bar + +...... + +
    +
  • foo
  • +
+

bar

diff --git a/crates/gfm/tests/fixtures/spec_255.md b/crates/gfm/tests/fixtures/spec_255.md new file mode 100644 index 0000000..ce9c52e --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_255.md @@ -0,0 +1,15 @@ +Example 255 +...... + +- foo + + bar + +...... + +
    +
  • +

    foo

    +

    bar

    +
  • +
diff --git a/crates/gfm/tests/fixtures/spec_256.md b/crates/gfm/tests/fixtures/spec_256.md new file mode 100644 index 0000000..ab569fe --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_256.md @@ -0,0 +1,25 @@ +Example 256 +...... + +- + foo +- + ``` + bar + ``` +- + baz + +...... + +
    +
  • foo
  • +
  • +
    bar
    +
    +
  • +
  • +
    baz
    +
    +
  • +
diff --git a/crates/gfm/tests/fixtures/spec_257.md b/crates/gfm/tests/fixtures/spec_257.md new file mode 100644 index 0000000..ab087ad --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_257.md @@ -0,0 +1,11 @@ +Example 257 +...... + +- + foo + +...... + +
    +
  • foo
  • +
diff --git a/crates/gfm/tests/fixtures/spec_258.md b/crates/gfm/tests/fixtures/spec_258.md new file mode 100644 index 0000000..55c7cf7 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_258.md @@ -0,0 +1,13 @@ +Example 258 +...... + +- + + foo + +...... + +
    +
  • +
+

foo

diff --git a/crates/gfm/tests/fixtures/spec_259.md b/crates/gfm/tests/fixtures/spec_259.md new file mode 100644 index 0000000..fa5d8b3 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_259.md @@ -0,0 +1,14 @@ +Example 259 +...... + +- foo +- +- bar + +...... + +
    +
  • foo
  • +
  • +
  • bar
  • +
diff --git a/crates/gfm/tests/fixtures/spec_260.md b/crates/gfm/tests/fixtures/spec_260.md new file mode 100644 index 0000000..bb5810e --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_260.md @@ -0,0 +1,14 @@ +Example 260 +...... + +- foo +- +- bar + +...... + +
    +
  • foo
  • +
  • +
  • bar
  • +
diff --git a/crates/gfm/tests/fixtures/spec_261.md b/crates/gfm/tests/fixtures/spec_261.md new file mode 100644 index 0000000..7e2a77f --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_261.md @@ -0,0 +1,14 @@ +Example 261 +...... + +1. foo +2. +3. bar + +...... + +
    +
  1. foo
  2. +
  3. +
  4. bar
  5. +
diff --git a/crates/gfm/tests/fixtures/spec_262.md b/crates/gfm/tests/fixtures/spec_262.md new file mode 100644 index 0000000..82e5b62 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_262.md @@ -0,0 +1,10 @@ +Example 262 +...... + +* + +...... + +
    +
  • +
diff --git a/crates/gfm/tests/fixtures/spec_263.md b/crates/gfm/tests/fixtures/spec_263.md new file mode 100644 index 0000000..5f88fef --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_263.md @@ -0,0 +1,15 @@ +Example 263 +...... + +foo +* + +foo +1. + +...... + +

foo +*

+

foo +1.

diff --git a/crates/gfm/tests/fixtures/spec_264.md b/crates/gfm/tests/fixtures/spec_264.md new file mode 100644 index 0000000..ada1e5c --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_264.md @@ -0,0 +1,23 @@ +Example 264 +...... + + 1. A paragraph + with two lines. + + indented code + + > A block quote. + +...... + +
    +
  1. +

    A paragraph +with two lines.

    +
    indented code
    +
    +
    +

    A block quote.

    +
    +
  2. +
diff --git a/crates/gfm/tests/fixtures/spec_265.md b/crates/gfm/tests/fixtures/spec_265.md new file mode 100644 index 0000000..8afc456 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_265.md @@ -0,0 +1,23 @@ +Example 265 +...... + + 1. A paragraph + with two lines. + + indented code + + > A block quote. + +...... + +
    +
  1. +

    A paragraph +with two lines.

    +
    indented code
    +
    +
    +

    A block quote.

    +
    +
  2. +
diff --git a/crates/gfm/tests/fixtures/spec_266.md b/crates/gfm/tests/fixtures/spec_266.md new file mode 100644 index 0000000..b0cd77d --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_266.md @@ -0,0 +1,23 @@ +Example 266 +...... + + 1. A paragraph + with two lines. + + indented code + + > A block quote. + +...... + +
    +
  1. +

    A paragraph +with two lines.

    +
    indented code
    +
    +
    +

    A block quote.

    +
    +
  2. +
diff --git a/crates/gfm/tests/fixtures/spec_267.md b/crates/gfm/tests/fixtures/spec_267.md new file mode 100644 index 0000000..2885679 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_267.md @@ -0,0 +1,19 @@ +Example 267 +...... + + 1. A paragraph + with two lines. + + indented code + + > A block quote. + +...... + +
1.  A paragraph
+    with two lines.
+
+        indented code
+
+    > A block quote.
+
diff --git a/crates/gfm/tests/fixtures/spec_268.md b/crates/gfm/tests/fixtures/spec_268.md new file mode 100644 index 0000000..1a08073 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_268.md @@ -0,0 +1,23 @@ +Example 268 +...... + + 1. A paragraph +with two lines. + + indented code + + > A block quote. + +...... + +
    +
  1. +

    A paragraph +with two lines.

    +
    indented code
    +
    +
    +

    A block quote.

    +
    +
  2. +
diff --git a/crates/gfm/tests/fixtures/spec_269.md b/crates/gfm/tests/fixtures/spec_269.md new file mode 100644 index 0000000..145d5d6 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_269.md @@ -0,0 +1,12 @@ +Example 269 +...... + + 1. A paragraph + with two lines. + +...... + +
    +
  1. A paragraph +with two lines.
  2. +
diff --git a/crates/gfm/tests/fixtures/spec_270.md b/crates/gfm/tests/fixtures/spec_270.md new file mode 100644 index 0000000..63f4f7e --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_270.md @@ -0,0 +1,18 @@ +Example 270 +...... + +> 1. > Blockquote +continued here. + +...... + +
+
    +
  1. +
    +

    Blockquote +continued here.

    +
    +
  2. +
+
diff --git a/crates/gfm/tests/fixtures/spec_271.md b/crates/gfm/tests/fixtures/spec_271.md new file mode 100644 index 0000000..6b51ce8 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_271.md @@ -0,0 +1,18 @@ +Example 271 +...... + +> 1. > Blockquote +> continued here. + +...... + +
+
    +
  1. +
    +

    Blockquote +continued here.

    +
    +
  2. +
+
diff --git a/crates/gfm/tests/fixtures/spec_272.md b/crates/gfm/tests/fixtures/spec_272.md new file mode 100644 index 0000000..190ec20 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_272.md @@ -0,0 +1,25 @@ +Example 272 +...... + +- foo + - bar + - baz + - boo + +...... + +
    +
  • foo +
      +
    • bar +
        +
      • baz +
          +
        • boo
        • +
        +
      • +
      +
    • +
    +
  • +
diff --git a/crates/gfm/tests/fixtures/spec_273.md b/crates/gfm/tests/fixtures/spec_273.md new file mode 100644 index 0000000..2324b38 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_273.md @@ -0,0 +1,16 @@ +Example 273 +...... + +- foo + - bar + - baz + - boo + +...... + +
    +
  • foo
  • +
  • bar
  • +
  • baz
  • +
  • boo
  • +
diff --git a/crates/gfm/tests/fixtures/spec_274.md b/crates/gfm/tests/fixtures/spec_274.md new file mode 100644 index 0000000..b42eb80 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_274.md @@ -0,0 +1,15 @@ +Example 274 +...... + +10) foo + - bar + +...... + +
    +
  1. foo +
      +
    • bar
    • +
    +
  2. +
diff --git a/crates/gfm/tests/fixtures/spec_275.md b/crates/gfm/tests/fixtures/spec_275.md new file mode 100644 index 0000000..91efdcb --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_275.md @@ -0,0 +1,14 @@ +Example 275 +...... + +10) foo + - bar + +...... + +
    +
  1. foo
  2. +
+
    +
  • bar
  • +
diff --git a/crates/gfm/tests/fixtures/spec_276.md b/crates/gfm/tests/fixtures/spec_276.md new file mode 100644 index 0000000..5e561d5 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_276.md @@ -0,0 +1,14 @@ +Example 276 +...... + +- - foo + +...... + +
    +
  • +
      +
    • foo
    • +
    +
  • +
diff --git a/crates/gfm/tests/fixtures/spec_277.md b/crates/gfm/tests/fixtures/spec_277.md new file mode 100644 index 0000000..b2dda91 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_277.md @@ -0,0 +1,18 @@ +Example 277 +...... + +1. - 2. foo + +...... + +
    +
  1. +
      +
    • +
        +
      1. foo
      2. +
      +
    • +
    +
  2. +
diff --git a/crates/gfm/tests/fixtures/spec_278.md b/crates/gfm/tests/fixtures/spec_278.md new file mode 100644 index 0000000..034b936 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_278.md @@ -0,0 +1,18 @@ +Example 278 +...... + +- # Foo +- Bar + --- + baz + +...... + +
    +
  • +

    Foo

    +
  • +
  • +

    Bar

    +baz
  • +
diff --git a/crates/gfm/tests/fixtures/spec_279_alt.md b/crates/gfm/tests/fixtures/spec_279_alt.md new file mode 100644 index 0000000..b026b8d --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_279_alt.md @@ -0,0 +1,13 @@ +Example 279 +(adds classes to ul/li elements) +...... + +- [ ] foo +- [x] bar + +...... + +
    +
  • foo
  • +
  • bar
  • +
diff --git a/crates/gfm/tests/fixtures/spec_280_alt.md b/crates/gfm/tests/fixtures/spec_280_alt.md new file mode 100644 index 0000000..9747f9b --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_280_alt.md @@ -0,0 +1,20 @@ +Example 280 +(adds classes to ul/li elements) +...... + +- [x] foo + - [ ] bar + - [x] baz +- [ ] bim + +...... + +
    +
  • foo +
      +
    • bar
    • +
    • baz
    • +
    +
  • +
  • bim
  • +
diff --git a/crates/gfm/tests/fixtures/spec_281.md b/crates/gfm/tests/fixtures/spec_281.md new file mode 100644 index 0000000..f81b0ce --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_281.md @@ -0,0 +1,16 @@ +Example 281 +...... + +- foo +- bar ++ baz + +...... + +
    +
  • foo
  • +
  • bar
  • +
+
    +
  • baz
  • +
diff --git a/crates/gfm/tests/fixtures/spec_282.md b/crates/gfm/tests/fixtures/spec_282.md new file mode 100644 index 0000000..9fec94b --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_282.md @@ -0,0 +1,16 @@ +Example 282 +...... + +1. foo +2. bar +3) baz + +...... + +
    +
  1. foo
  2. +
  3. bar
  4. +
+
    +
  1. baz
  2. +
diff --git a/crates/gfm/tests/fixtures/spec_283.md b/crates/gfm/tests/fixtures/spec_283.md new file mode 100644 index 0000000..cf94be8 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_283.md @@ -0,0 +1,14 @@ +Example 283 +...... + +Foo +- bar +- baz + +...... + +

Foo

+
    +
  • bar
  • +
  • baz
  • +
diff --git a/crates/gfm/tests/fixtures/spec_284.md b/crates/gfm/tests/fixtures/spec_284.md new file mode 100644 index 0000000..d240d42 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_284.md @@ -0,0 +1,10 @@ +Example 284 +...... + +The number of windows in my house is +14. The number of doors is 6. + +...... + +

The number of windows in my house is +14. The number of doors is 6.

diff --git a/crates/gfm/tests/fixtures/spec_285.md b/crates/gfm/tests/fixtures/spec_285.md new file mode 100644 index 0000000..c2db419 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_285.md @@ -0,0 +1,12 @@ +Example 285 +...... + +The number of windows in my house is +1. The number of doors is 6. + +...... + +

The number of windows in my house is

+
    +
  1. The number of doors is 6.
  2. +
diff --git a/crates/gfm/tests/fixtures/spec_286.md b/crates/gfm/tests/fixtures/spec_286.md new file mode 100644 index 0000000..e6be89e --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_286.md @@ -0,0 +1,23 @@ +Example 286 +...... + +- foo + +- bar + + +- baz + +...... + +
    +
  • +

    foo

    +
  • +
  • +

    bar

    +
  • +
  • +

    baz

    +
  • +
diff --git a/crates/gfm/tests/fixtures/spec_287.md b/crates/gfm/tests/fixtures/spec_287.md new file mode 100644 index 0000000..0b5bade --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_287.md @@ -0,0 +1,26 @@ +Example 287 +...... + +- foo + - bar + - baz + + + bim + +...... + +
    +
  • foo +
      +
    • bar +
        +
      • +

        baz

        +

        bim

        +
      • +
      +
    • +
    +
  • +
diff --git a/crates/gfm/tests/fixtures/spec_288.md b/crates/gfm/tests/fixtures/spec_288.md new file mode 100644 index 0000000..634f023 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_288.md @@ -0,0 +1,22 @@ +Example 288 +...... + +- foo +- bar + + + +- baz +- bim + +...... + +
    +
  • foo
  • +
  • bar
  • +
+ +
    +
  • baz
  • +
  • bim
  • +
diff --git a/crates/gfm/tests/fixtures/spec_289.md b/crates/gfm/tests/fixtures/spec_289.md new file mode 100644 index 0000000..f23ef69 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_289.md @@ -0,0 +1,27 @@ +Example 289 +...... + +- foo + + notcode + +- foo + + + + code + +...... + +
    +
  • +

    foo

    +

    notcode

    +
  • +
  • +

    foo

    +
  • +
+ +
code
+
diff --git a/crates/gfm/tests/fixtures/spec_290.md b/crates/gfm/tests/fixtures/spec_290.md new file mode 100644 index 0000000..31b99ff --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_290.md @@ -0,0 +1,22 @@ +Example 290 +...... + +- a + - b + - c + - d + - e + - f +- g + +...... + +
    +
  • a
  • +
  • b
  • +
  • c
  • +
  • d
  • +
  • e
  • +
  • f
  • +
  • g
  • +
diff --git a/crates/gfm/tests/fixtures/spec_291.md b/crates/gfm/tests/fixtures/spec_291.md new file mode 100644 index 0000000..d025293 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_291.md @@ -0,0 +1,22 @@ +Example 291 +...... + +1. a + + 2. b + + 3. c + +...... + +
    +
  1. +

    a

    +
  2. +
  3. +

    b

    +
  4. +
  5. +

    c

    +
  6. +
diff --git a/crates/gfm/tests/fixtures/spec_292.md b/crates/gfm/tests/fixtures/spec_292.md new file mode 100644 index 0000000..fe8d2ff --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_292.md @@ -0,0 +1,18 @@ +Example 292 +...... + +- a + - b + - c + - d + - e + +...... + +
    +
  • a
  • +
  • b
  • +
  • c
  • +
  • d +- e
  • +
diff --git a/crates/gfm/tests/fixtures/spec_293.md b/crates/gfm/tests/fixtures/spec_293.md new file mode 100644 index 0000000..249b7ae --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_293.md @@ -0,0 +1,21 @@ +Example 293 +...... + +1. a + + 2. b + + 3. c + +...... + +
    +
  1. +

    a

    +
  2. +
  3. +

    b

    +
  4. +
+
3. c
+
diff --git a/crates/gfm/tests/fixtures/spec_294.md b/crates/gfm/tests/fixtures/spec_294.md new file mode 100644 index 0000000..583b06b --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_294.md @@ -0,0 +1,21 @@ +Example 294 +...... + +- a +- b + +- c + +...... + +
    +
  • +

    a

    +
  • +
  • +

    b

    +
  • +
  • +

    c

    +
  • +
diff --git a/crates/gfm/tests/fixtures/spec_295.md b/crates/gfm/tests/fixtures/spec_295.md new file mode 100644 index 0000000..b63130c --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_295.md @@ -0,0 +1,19 @@ +Example 295 +...... + +* a +* + +* c + +...... + +
    +
  • +

    a

    +
  • +
  • +
  • +

    c

    +
  • +
diff --git a/crates/gfm/tests/fixtures/spec_296.md b/crates/gfm/tests/fixtures/spec_296.md new file mode 100644 index 0000000..366475b --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_296.md @@ -0,0 +1,23 @@ +Example 296 +...... + +- a +- b + + c +- d + +...... + +
    +
  • +

    a

    +
  • +
  • +

    b

    +

    c

    +
  • +
  • +

    d

    +
  • +
diff --git a/crates/gfm/tests/fixtures/spec_297.md b/crates/gfm/tests/fixtures/spec_297.md new file mode 100644 index 0000000..27206d1 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_297.md @@ -0,0 +1,22 @@ +Example 297 +...... + +- a +- b + + [ref]: /url +- d + +...... + +
    +
  • +

    a

    +
  • +
  • +

    b

    +
  • +
  • +

    d

    +
  • +
diff --git a/crates/gfm/tests/fixtures/spec_298.md b/crates/gfm/tests/fixtures/spec_298.md new file mode 100644 index 0000000..e7ca418 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_298.md @@ -0,0 +1,23 @@ +Example 298 +...... + +- a +- ``` + b + + + ``` +- c + +...... + +
    +
  • a
  • +
  • +
    b
    +
    +
    +
    +
  • +
  • c
  • +
diff --git a/crates/gfm/tests/fixtures/spec_299.md b/crates/gfm/tests/fixtures/spec_299.md new file mode 100644 index 0000000..d3679f6 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_299.md @@ -0,0 +1,22 @@ +Example 299 +...... + +- a + - b + + c +- d + +...... + +
    +
  • a +
      +
    • +

      b

      +

      c

      +
    • +
    +
  • +
  • d
  • +
diff --git a/crates/gfm/tests/fixtures/spec_300.md b/crates/gfm/tests/fixtures/spec_300.md new file mode 100644 index 0000000..b1ae89b --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_300.md @@ -0,0 +1,18 @@ +Example 300 +...... + +* a + > b + > +* c + +...... + +
    +
  • a +
    +

    b

    +
    +
  • +
  • c
  • +
diff --git a/crates/gfm/tests/fixtures/spec_301.md b/crates/gfm/tests/fixtures/spec_301.md new file mode 100644 index 0000000..6646af7 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_301.md @@ -0,0 +1,22 @@ +Example 301 +...... + +- a + > b + ``` + c + ``` +- d + +...... + +
    +
  • a +
    +

    b

    +
    +
    c
    +
    +
  • +
  • d
  • +
diff --git a/crates/gfm/tests/fixtures/spec_302.md b/crates/gfm/tests/fixtures/spec_302.md new file mode 100644 index 0000000..8004bb9 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_302.md @@ -0,0 +1,10 @@ +Example 302 +...... + +- a + +...... + +
    +
  • a
  • +
diff --git a/crates/gfm/tests/fixtures/spec_303.md b/crates/gfm/tests/fixtures/spec_303.md new file mode 100644 index 0000000..0672ce3 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_303.md @@ -0,0 +1,15 @@ +Example 303 +...... + +- a + - b + +...... + +
    +
  • a +
      +
    • b
    • +
    +
  • +
diff --git a/crates/gfm/tests/fixtures/spec_304.md b/crates/gfm/tests/fixtures/spec_304.md new file mode 100644 index 0000000..812db70 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_304.md @@ -0,0 +1,18 @@ +Example 304 +...... + +1. ``` + foo + ``` + + bar + +...... + +
    +
  1. +
    foo
    +
    +

    bar

    +
  2. +
diff --git a/crates/gfm/tests/fixtures/spec_305.md b/crates/gfm/tests/fixtures/spec_305.md new file mode 100644 index 0000000..4c020fe --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_305.md @@ -0,0 +1,19 @@ +Example 305 +...... + +* foo + * bar + + baz + +...... + +
    +
  • +

    foo

    +
      +
    • bar
    • +
    +

    baz

    +
  • +
diff --git a/crates/gfm/tests/fixtures/spec_306.md b/crates/gfm/tests/fixtures/spec_306.md new file mode 100644 index 0000000..180fa70 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_306.md @@ -0,0 +1,29 @@ +Example 306 +...... + +- a + - b + - c + +- d + - e + - f + +...... + +
    +
  • +

    a

    +
      +
    • b
    • +
    • c
    • +
    +
  • +
  • +

    d

    +
      +
    • e
    • +
    • f
    • +
    +
  • +
diff --git a/crates/gfm/tests/fixtures/spec_307.md b/crates/gfm/tests/fixtures/spec_307.md new file mode 100644 index 0000000..67822ce --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_307.md @@ -0,0 +1,8 @@ +Example 307 +...... + +`hi`lo` + +...... + +

hilo`

diff --git a/crates/gfm/tests/fixtures/spec_308.md b/crates/gfm/tests/fixtures/spec_308.md new file mode 100644 index 0000000..c3083c2 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_308.md @@ -0,0 +1,8 @@ +Example 308 +...... + +\!\"\#\$\%\&\'\(\)\*\+\,\-\.\/\:\;\<\=\>\?\@\[\\\]\^\_\`\{\|\}\~ + +...... + +

!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~

diff --git a/crates/gfm/tests/fixtures/spec_309.md b/crates/gfm/tests/fixtures/spec_309.md new file mode 100644 index 0000000..84e20bf --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_309.md @@ -0,0 +1,8 @@ +Example 309 +...... + +\ \A\a\ \3\φ\« + +...... + +

\ \A\a\ \3\φ\«

diff --git a/crates/gfm/tests/fixtures/spec_310.md b/crates/gfm/tests/fixtures/spec_310.md new file mode 100644 index 0000000..0b544df --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_310.md @@ -0,0 +1,24 @@ +Example 310 +...... + +\*not emphasized* +\
not a tag +\[not a link](/foo) +\`not code` +1\. not a list +\* not a list +\# not a heading +\[foo]: /url "not a reference" +\ö not a character entity + +...... + +

*not emphasized* +<br/> not a tag +[not a link](/foo) +`not code` +1. not a list +* not a list +# not a heading +[foo]: /url "not a reference" +&ouml; not a character entity

diff --git a/crates/gfm/tests/fixtures/spec_311.md b/crates/gfm/tests/fixtures/spec_311.md new file mode 100644 index 0000000..2faff6a --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_311.md @@ -0,0 +1,8 @@ +Example 311 +...... + +\\*emphasis* + +...... + +

\emphasis

diff --git a/crates/gfm/tests/fixtures/spec_312.md b/crates/gfm/tests/fixtures/spec_312.md new file mode 100644 index 0000000..f0f6d4e --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_312.md @@ -0,0 +1,10 @@ +Example 312 +...... + +foo\ +bar + +...... + +

foo
+bar

diff --git a/crates/gfm/tests/fixtures/spec_313.md b/crates/gfm/tests/fixtures/spec_313.md new file mode 100644 index 0000000..0094237 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_313.md @@ -0,0 +1,8 @@ +Example 313 +...... + +`` \[\` `` + +...... + +

\[\`

diff --git a/crates/gfm/tests/fixtures/spec_314.md b/crates/gfm/tests/fixtures/spec_314.md new file mode 100644 index 0000000..73d92fe --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_314.md @@ -0,0 +1,9 @@ +Example 314 +...... + + \[\] + +...... + +
\[\]
+
diff --git a/crates/gfm/tests/fixtures/spec_315.md b/crates/gfm/tests/fixtures/spec_315.md new file mode 100644 index 0000000..5303419 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_315.md @@ -0,0 +1,11 @@ +Example 315 +...... + +~~~ +\[\] +~~~ + +...... + +
\[\]
+
diff --git a/crates/gfm/tests/fixtures/spec_316.md b/crates/gfm/tests/fixtures/spec_316.md new file mode 100644 index 0000000..87ccdc3 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_316.md @@ -0,0 +1,8 @@ +Example 316 +...... + + + +...... + +

http://example.com?find=\*

diff --git a/crates/gfm/tests/fixtures/spec_317.md b/crates/gfm/tests/fixtures/spec_317.md new file mode 100644 index 0000000..c61cb4b --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_317.md @@ -0,0 +1,8 @@ +Example 317 +...... + + + +...... + + diff --git a/crates/gfm/tests/fixtures/spec_318.md b/crates/gfm/tests/fixtures/spec_318.md new file mode 100644 index 0000000..eba9aa8 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_318.md @@ -0,0 +1,8 @@ +Example 318 +...... + +[foo](/bar\* "ti\*tle") + +...... + +

foo

diff --git a/crates/gfm/tests/fixtures/spec_319.md b/crates/gfm/tests/fixtures/spec_319.md new file mode 100644 index 0000000..89edfe9 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_319.md @@ -0,0 +1,10 @@ +Example 319 +...... + +[foo] + +[foo]: /bar\* "ti\*tle" + +...... + +

foo

diff --git a/crates/gfm/tests/fixtures/spec_320.md b/crates/gfm/tests/fixtures/spec_320.md new file mode 100644 index 0000000..7c9f5ba --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_320.md @@ -0,0 +1,11 @@ +Example 320 +...... + +``` foo\+bar +foo +``` + +...... + +
foo
+
diff --git a/crates/gfm/tests/fixtures/spec_321.md b/crates/gfm/tests/fixtures/spec_321.md new file mode 100644 index 0000000..31a4199 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_321.md @@ -0,0 +1,12 @@ +Example 321 +...... + +  & © Æ Ď +¾ ℋ ⅆ +∲ ≧̸ + +...... + +

  & © Æ Ď +¾ ℋ ⅆ +∲ ≧̸

diff --git a/crates/gfm/tests/fixtures/spec_322.md b/crates/gfm/tests/fixtures/spec_322.md new file mode 100644 index 0000000..913d4db --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_322.md @@ -0,0 +1,8 @@ +Example 322 +...... + +# Ӓ Ϡ � + +...... + +

# Ӓ Ϡ �

diff --git a/crates/gfm/tests/fixtures/spec_323.md b/crates/gfm/tests/fixtures/spec_323.md new file mode 100644 index 0000000..66f005a --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_323.md @@ -0,0 +1,8 @@ +Example 323 +...... + +" ആ ಫ + +...... + +

" ആ ಫ

diff --git a/crates/gfm/tests/fixtures/spec_324.md b/crates/gfm/tests/fixtures/spec_324.md new file mode 100644 index 0000000..dfd3076 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_324.md @@ -0,0 +1,14 @@ +Example 324 +...... + +  &x; &#; &#x; +� +&#abcdef0; +&ThisIsNotDefined; &hi?; + +...... + +

&nbsp &x; &#; &#x; +&#987654321; +&#abcdef0; +&ThisIsNotDefined; &hi?;

diff --git a/crates/gfm/tests/fixtures/spec_325.md b/crates/gfm/tests/fixtures/spec_325.md new file mode 100644 index 0000000..d228f54 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_325.md @@ -0,0 +1,8 @@ +Example 325 +...... + +© + +...... + +

&copy

diff --git a/crates/gfm/tests/fixtures/spec_326.md b/crates/gfm/tests/fixtures/spec_326.md new file mode 100644 index 0000000..ccf4b14 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_326.md @@ -0,0 +1,8 @@ +Example 326 +...... + +&MadeUpEntity; + +...... + +

&MadeUpEntity;

diff --git a/crates/gfm/tests/fixtures/spec_327.md b/crates/gfm/tests/fixtures/spec_327.md new file mode 100644 index 0000000..36be9e9 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_327.md @@ -0,0 +1,8 @@ +Example 327 +...... + + + +...... + + diff --git a/crates/gfm/tests/fixtures/spec_328.md b/crates/gfm/tests/fixtures/spec_328.md new file mode 100644 index 0000000..0d75743 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_328.md @@ -0,0 +1,8 @@ +Example 328 +...... + +[foo](/föö "föö") + +...... + +

foo

diff --git a/crates/gfm/tests/fixtures/spec_329.md b/crates/gfm/tests/fixtures/spec_329.md new file mode 100644 index 0000000..e844cc7 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_329.md @@ -0,0 +1,10 @@ +Example 329 +...... + +[foo] + +[foo]: /föö "föö" + +...... + +

foo

diff --git a/crates/gfm/tests/fixtures/spec_330.md b/crates/gfm/tests/fixtures/spec_330.md new file mode 100644 index 0000000..970ee76 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_330.md @@ -0,0 +1,11 @@ +Example 330 +...... + +``` föö +foo +``` + +...... + +
foo
+
diff --git a/crates/gfm/tests/fixtures/spec_331.md b/crates/gfm/tests/fixtures/spec_331.md new file mode 100644 index 0000000..f163525 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_331.md @@ -0,0 +1,8 @@ +Example 331 +...... + +`föö` + +...... + +

f&ouml;&ouml;

diff --git a/crates/gfm/tests/fixtures/spec_332.md b/crates/gfm/tests/fixtures/spec_332.md new file mode 100644 index 0000000..083615a --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_332.md @@ -0,0 +1,9 @@ +Example 332 +...... + + föfö + +...... + +
f&ouml;f&ouml;
+
diff --git a/crates/gfm/tests/fixtures/spec_333.md b/crates/gfm/tests/fixtures/spec_333.md new file mode 100644 index 0000000..fec6fcf --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_333.md @@ -0,0 +1,10 @@ +Example 333 +...... + +*foo* +*foo* + +...... + +

*foo* +foo

diff --git a/crates/gfm/tests/fixtures/spec_334.md b/crates/gfm/tests/fixtures/spec_334.md new file mode 100644 index 0000000..6a5e8be --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_334.md @@ -0,0 +1,13 @@ +Example 334 +...... + +* foo + +* foo + +...... + +

* foo

+
    +
  • foo
  • +
diff --git a/crates/gfm/tests/fixtures/spec_335.md b/crates/gfm/tests/fixtures/spec_335.md new file mode 100644 index 0000000..03f1add --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_335.md @@ -0,0 +1,10 @@ +Example 335 +...... + +foo bar + +...... + +

foo + +bar

diff --git a/crates/gfm/tests/fixtures/spec_336.md b/crates/gfm/tests/fixtures/spec_336.md new file mode 100644 index 0000000..ca6fa72 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_336.md @@ -0,0 +1,8 @@ +Example 336 +...... + + foo + +...... + +

foo

diff --git a/crates/gfm/tests/fixtures/spec_337.md b/crates/gfm/tests/fixtures/spec_337.md new file mode 100644 index 0000000..8c1b63a --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_337.md @@ -0,0 +1,8 @@ +Example 337 +...... + +[a](url "tit") + +...... + +

[a](url "tit")

diff --git a/crates/gfm/tests/fixtures/spec_338.md b/crates/gfm/tests/fixtures/spec_338.md new file mode 100644 index 0000000..de8979b --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_338.md @@ -0,0 +1,8 @@ +Example 338 +...... + +`foo` + +...... + +

foo

diff --git a/crates/gfm/tests/fixtures/spec_339.md b/crates/gfm/tests/fixtures/spec_339.md new file mode 100644 index 0000000..391bc66 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_339.md @@ -0,0 +1,8 @@ +Example 339 +...... + +`` foo ` bar `` + +...... + +

foo ` bar

diff --git a/crates/gfm/tests/fixtures/spec_340.md b/crates/gfm/tests/fixtures/spec_340.md new file mode 100644 index 0000000..37c8546 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_340.md @@ -0,0 +1,8 @@ +Example 340 +...... + +` `` ` + +...... + +

``

diff --git a/crates/gfm/tests/fixtures/spec_341.md b/crates/gfm/tests/fixtures/spec_341.md new file mode 100644 index 0000000..d3f5b01 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_341.md @@ -0,0 +1,8 @@ +Example 341 +...... + +` `` ` + +...... + +

``

diff --git a/crates/gfm/tests/fixtures/spec_342.md b/crates/gfm/tests/fixtures/spec_342.md new file mode 100644 index 0000000..e348c9d --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_342.md @@ -0,0 +1,8 @@ +Example 342 +...... + +` a` + +...... + +

a

diff --git a/crates/gfm/tests/fixtures/spec_343.md b/crates/gfm/tests/fixtures/spec_343.md new file mode 100644 index 0000000..f755635 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_343.md @@ -0,0 +1,8 @@ +Example 343 +...... + +` b ` + +...... + +

 b 

diff --git a/crates/gfm/tests/fixtures/spec_344.md b/crates/gfm/tests/fixtures/spec_344.md new file mode 100644 index 0000000..5a08692 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_344.md @@ -0,0 +1,10 @@ +Example 344 +...... + +` ` +` ` + +...... + +

+

diff --git a/crates/gfm/tests/fixtures/spec_345.md b/crates/gfm/tests/fixtures/spec_345.md new file mode 100644 index 0000000..aa4db7a --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_345.md @@ -0,0 +1,12 @@ +Example 345 +...... + +`` +foo +bar +baz +`` + +...... + +

foo bar baz

diff --git a/crates/gfm/tests/fixtures/spec_346.md b/crates/gfm/tests/fixtures/spec_346.md new file mode 100644 index 0000000..a1ba62f --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_346.md @@ -0,0 +1,10 @@ +Example 346 +...... + +`` +foo +`` + +...... + +

foo

diff --git a/crates/gfm/tests/fixtures/spec_347.md b/crates/gfm/tests/fixtures/spec_347.md new file mode 100644 index 0000000..477bef5 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_347.md @@ -0,0 +1,9 @@ +Example 347 +...... + +`foo bar +baz` + +...... + +

foo bar baz

diff --git a/crates/gfm/tests/fixtures/spec_348.md b/crates/gfm/tests/fixtures/spec_348.md new file mode 100644 index 0000000..2c53618 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_348.md @@ -0,0 +1,8 @@ +Example 348 +...... + +`foo\`bar` + +...... + +

foo\bar`

diff --git a/crates/gfm/tests/fixtures/spec_349.md b/crates/gfm/tests/fixtures/spec_349.md new file mode 100644 index 0000000..43a211e --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_349.md @@ -0,0 +1,8 @@ +Example 349 +...... + +``foo`bar`` + +...... + +

foo`bar

diff --git a/crates/gfm/tests/fixtures/spec_350.md b/crates/gfm/tests/fixtures/spec_350.md new file mode 100644 index 0000000..51bdeb9 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_350.md @@ -0,0 +1,8 @@ +Example 350 +...... + +` foo `` bar ` + +...... + +

foo `` bar

diff --git a/crates/gfm/tests/fixtures/spec_351.md b/crates/gfm/tests/fixtures/spec_351.md new file mode 100644 index 0000000..72c9d68 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_351.md @@ -0,0 +1,8 @@ +Example 351 +...... + +*foo`*` + +...... + +

*foo*

diff --git a/crates/gfm/tests/fixtures/spec_352.md b/crates/gfm/tests/fixtures/spec_352.md new file mode 100644 index 0000000..2ef6df1 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_352.md @@ -0,0 +1,8 @@ +Example 352 +...... + +[not a `link](/foo`) + +...... + +

[not a link](/foo)

diff --git a/crates/gfm/tests/fixtures/spec_353.md b/crates/gfm/tests/fixtures/spec_353.md new file mode 100644 index 0000000..15f54b2 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_353.md @@ -0,0 +1,8 @@ +Example 353 +...... + +`` + +...... + +

<a href="">`

diff --git a/crates/gfm/tests/fixtures/spec_354.md b/crates/gfm/tests/fixtures/spec_354.md new file mode 100644 index 0000000..06b4290 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_354.md @@ -0,0 +1,8 @@ +Example 354 +...... + +
` + +...... + +

`

diff --git a/crates/gfm/tests/fixtures/spec_355.md b/crates/gfm/tests/fixtures/spec_355.md new file mode 100644 index 0000000..cde5001 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_355.md @@ -0,0 +1,8 @@ +Example 355 +...... + +`` + +...... + +

<http://foo.bar.baz>`

diff --git a/crates/gfm/tests/fixtures/spec_356.md b/crates/gfm/tests/fixtures/spec_356.md new file mode 100644 index 0000000..d6a3006 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_356.md @@ -0,0 +1,8 @@ +Example 356 +...... + +` + +...... + +

http://foo.bar.`baz`

diff --git a/crates/gfm/tests/fixtures/spec_357.md b/crates/gfm/tests/fixtures/spec_357.md new file mode 100644 index 0000000..6b9e1f8 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_357.md @@ -0,0 +1,8 @@ +Example 357 +...... + +```foo`` + +...... + +

```foo``

diff --git a/crates/gfm/tests/fixtures/spec_358.md b/crates/gfm/tests/fixtures/spec_358.md new file mode 100644 index 0000000..e8774b2 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_358.md @@ -0,0 +1,8 @@ +Example 358 +...... + +`foo + +...... + +

`foo

diff --git a/crates/gfm/tests/fixtures/spec_359.md b/crates/gfm/tests/fixtures/spec_359.md new file mode 100644 index 0000000..e8662ef --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_359.md @@ -0,0 +1,8 @@ +Example 359 +...... + +`foo``bar`` + +...... + +

`foobar

diff --git a/crates/gfm/tests/fixtures/spec_360.md b/crates/gfm/tests/fixtures/spec_360.md new file mode 100644 index 0000000..466e87b --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_360.md @@ -0,0 +1,8 @@ +Example 360 +...... + +*foo bar* + +...... + +

foo bar

diff --git a/crates/gfm/tests/fixtures/spec_361.md b/crates/gfm/tests/fixtures/spec_361.md new file mode 100644 index 0000000..fe960c8 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_361.md @@ -0,0 +1,8 @@ +Example 361 +...... + +a * foo bar* + +...... + +

a * foo bar*

diff --git a/crates/gfm/tests/fixtures/spec_362.md b/crates/gfm/tests/fixtures/spec_362.md new file mode 100644 index 0000000..f1e338a --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_362.md @@ -0,0 +1,8 @@ +Example 362 +...... + +a*"foo"* + +...... + +

a*"foo"*

diff --git a/crates/gfm/tests/fixtures/spec_363.md b/crates/gfm/tests/fixtures/spec_363.md new file mode 100644 index 0000000..843f36d --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_363.md @@ -0,0 +1,8 @@ +Example 363 +...... + +* a * + +...... + +

* a *

diff --git a/crates/gfm/tests/fixtures/spec_364.md b/crates/gfm/tests/fixtures/spec_364.md new file mode 100644 index 0000000..be14cac --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_364.md @@ -0,0 +1,8 @@ +Example 364 +...... + +foo*bar* + +...... + +

foobar

diff --git a/crates/gfm/tests/fixtures/spec_365.md b/crates/gfm/tests/fixtures/spec_365.md new file mode 100644 index 0000000..1f8131b --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_365.md @@ -0,0 +1,8 @@ +Example 365 +...... + +5*6*78 + +...... + +

5678

diff --git a/crates/gfm/tests/fixtures/spec_366.md b/crates/gfm/tests/fixtures/spec_366.md new file mode 100644 index 0000000..2b2cee9 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_366.md @@ -0,0 +1,8 @@ +Example 366 +...... + +_foo bar_ + +...... + +

foo bar

diff --git a/crates/gfm/tests/fixtures/spec_367.md b/crates/gfm/tests/fixtures/spec_367.md new file mode 100644 index 0000000..ce2ebe8 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_367.md @@ -0,0 +1,8 @@ +Example 367 +...... + +_ foo bar_ + +...... + +

_ foo bar_

diff --git a/crates/gfm/tests/fixtures/spec_368.md b/crates/gfm/tests/fixtures/spec_368.md new file mode 100644 index 0000000..8251b4a --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_368.md @@ -0,0 +1,8 @@ +Example 368 +...... + +a_"foo"_ + +...... + +

a_"foo"_

diff --git a/crates/gfm/tests/fixtures/spec_369.md b/crates/gfm/tests/fixtures/spec_369.md new file mode 100644 index 0000000..2d456bd --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_369.md @@ -0,0 +1,8 @@ +Example 369 +...... + +foo_bar_ + +...... + +

foo_bar_

diff --git a/crates/gfm/tests/fixtures/spec_370.md b/crates/gfm/tests/fixtures/spec_370.md new file mode 100644 index 0000000..cc52938 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_370.md @@ -0,0 +1,8 @@ +Example 370 +...... + +5_6_78 + +...... + +

5_6_78

diff --git a/crates/gfm/tests/fixtures/spec_371.md b/crates/gfm/tests/fixtures/spec_371.md new file mode 100644 index 0000000..7b9e7a4 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_371.md @@ -0,0 +1,8 @@ +Example 371 +...... + +пристаням_стремятся_ + +...... + +

пристаням_стремятся_

diff --git a/crates/gfm/tests/fixtures/spec_372.md b/crates/gfm/tests/fixtures/spec_372.md new file mode 100644 index 0000000..e9f7777 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_372.md @@ -0,0 +1,8 @@ +Example 372 +...... + +aa_"bb"_cc + +...... + +

aa_"bb"_cc

diff --git a/crates/gfm/tests/fixtures/spec_373.md b/crates/gfm/tests/fixtures/spec_373.md new file mode 100644 index 0000000..4d13923 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_373.md @@ -0,0 +1,8 @@ +Example 373 +...... + +foo-_(bar)_ + +...... + +

foo-(bar)

diff --git a/crates/gfm/tests/fixtures/spec_374.md b/crates/gfm/tests/fixtures/spec_374.md new file mode 100644 index 0000000..58ca2b6 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_374.md @@ -0,0 +1,8 @@ +Example 374 +...... + +_foo* + +...... + +

_foo*

diff --git a/crates/gfm/tests/fixtures/spec_375.md b/crates/gfm/tests/fixtures/spec_375.md new file mode 100644 index 0000000..99aa90a --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_375.md @@ -0,0 +1,8 @@ +Example 375 +...... + +*foo bar * + +...... + +

*foo bar *

diff --git a/crates/gfm/tests/fixtures/spec_376.md b/crates/gfm/tests/fixtures/spec_376.md new file mode 100644 index 0000000..35a5f78 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_376.md @@ -0,0 +1,10 @@ +Example 376 +...... + +*foo bar +* + +...... + +

*foo bar +*

diff --git a/crates/gfm/tests/fixtures/spec_377.md b/crates/gfm/tests/fixtures/spec_377.md new file mode 100644 index 0000000..f80fa7c --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_377.md @@ -0,0 +1,8 @@ +Example 377 +...... + +*(*foo) + +...... + +

*(*foo)

diff --git a/crates/gfm/tests/fixtures/spec_378.md b/crates/gfm/tests/fixtures/spec_378.md new file mode 100644 index 0000000..30a9982 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_378.md @@ -0,0 +1,8 @@ +Example 378 +...... + +*(*foo*)* + +...... + +

(foo)

diff --git a/crates/gfm/tests/fixtures/spec_379.md b/crates/gfm/tests/fixtures/spec_379.md new file mode 100644 index 0000000..685a1ef --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_379.md @@ -0,0 +1,8 @@ +Example 379 +...... + +*foo*bar + +...... + +

foobar

diff --git a/crates/gfm/tests/fixtures/spec_380.md b/crates/gfm/tests/fixtures/spec_380.md new file mode 100644 index 0000000..1244ba0 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_380.md @@ -0,0 +1,8 @@ +Example 380 +...... + +_foo bar _ + +...... + +

_foo bar _

diff --git a/crates/gfm/tests/fixtures/spec_381.md b/crates/gfm/tests/fixtures/spec_381.md new file mode 100644 index 0000000..0e05af8 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_381.md @@ -0,0 +1,8 @@ +Example 381 +...... + +_(_foo) + +...... + +

_(_foo)

diff --git a/crates/gfm/tests/fixtures/spec_382.md b/crates/gfm/tests/fixtures/spec_382.md new file mode 100644 index 0000000..9680c07 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_382.md @@ -0,0 +1,8 @@ +Example 382 +...... + +_(_foo_)_ + +...... + +

(foo)

diff --git a/crates/gfm/tests/fixtures/spec_383.md b/crates/gfm/tests/fixtures/spec_383.md new file mode 100644 index 0000000..f7b1a63 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_383.md @@ -0,0 +1,8 @@ +Example 383 +...... + +_foo_bar + +...... + +

_foo_bar

diff --git a/crates/gfm/tests/fixtures/spec_384.md b/crates/gfm/tests/fixtures/spec_384.md new file mode 100644 index 0000000..ad9b6fc --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_384.md @@ -0,0 +1,8 @@ +Example 384 +...... + +_пристаням_стремятся + +...... + +

_пристаням_стремятся

diff --git a/crates/gfm/tests/fixtures/spec_385.md b/crates/gfm/tests/fixtures/spec_385.md new file mode 100644 index 0000000..90f8f8d --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_385.md @@ -0,0 +1,8 @@ +Example 385 +...... + +_foo_bar_baz_ + +...... + +

foo_bar_baz

diff --git a/crates/gfm/tests/fixtures/spec_386.md b/crates/gfm/tests/fixtures/spec_386.md new file mode 100644 index 0000000..beb8aea --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_386.md @@ -0,0 +1,8 @@ +Example 386 +...... + +_(bar)_. + +...... + +

(bar).

diff --git a/crates/gfm/tests/fixtures/spec_387.md b/crates/gfm/tests/fixtures/spec_387.md new file mode 100644 index 0000000..dbc77c3 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_387.md @@ -0,0 +1,8 @@ +Example 387 +...... + +**foo bar** + +...... + +

foo bar

diff --git a/crates/gfm/tests/fixtures/spec_388.md b/crates/gfm/tests/fixtures/spec_388.md new file mode 100644 index 0000000..e292c73 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_388.md @@ -0,0 +1,8 @@ +Example 388 +...... + +** foo bar** + +...... + +

** foo bar**

diff --git a/crates/gfm/tests/fixtures/spec_389.md b/crates/gfm/tests/fixtures/spec_389.md new file mode 100644 index 0000000..9b55772 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_389.md @@ -0,0 +1,8 @@ +Example 389 +...... + +a**"foo"** + +...... + +

a**"foo"**

diff --git a/crates/gfm/tests/fixtures/spec_390.md b/crates/gfm/tests/fixtures/spec_390.md new file mode 100644 index 0000000..22611e6 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_390.md @@ -0,0 +1,8 @@ +Example 390 +...... + +foo**bar** + +...... + +

foobar

diff --git a/crates/gfm/tests/fixtures/spec_391.md b/crates/gfm/tests/fixtures/spec_391.md new file mode 100644 index 0000000..36a8460 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_391.md @@ -0,0 +1,8 @@ +Example 391 +...... + +__foo bar__ + +...... + +

foo bar

diff --git a/crates/gfm/tests/fixtures/spec_392.md b/crates/gfm/tests/fixtures/spec_392.md new file mode 100644 index 0000000..568389d --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_392.md @@ -0,0 +1,8 @@ +Example 392 +...... + +__ foo bar__ + +...... + +

__ foo bar__

diff --git a/crates/gfm/tests/fixtures/spec_393.md b/crates/gfm/tests/fixtures/spec_393.md new file mode 100644 index 0000000..50b4bc2 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_393.md @@ -0,0 +1,10 @@ +Example 393 +...... + +__ +foo bar__ + +...... + +

__ +foo bar__

diff --git a/crates/gfm/tests/fixtures/spec_394.md b/crates/gfm/tests/fixtures/spec_394.md new file mode 100644 index 0000000..4399d68 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_394.md @@ -0,0 +1,8 @@ +Example 394 +...... + +a__"foo"__ + +...... + +

a__"foo"__

diff --git a/crates/gfm/tests/fixtures/spec_395.md b/crates/gfm/tests/fixtures/spec_395.md new file mode 100644 index 0000000..872269a --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_395.md @@ -0,0 +1,8 @@ +Example 395 +...... + +foo__bar__ + +...... + +

foo__bar__

diff --git a/crates/gfm/tests/fixtures/spec_396.md b/crates/gfm/tests/fixtures/spec_396.md new file mode 100644 index 0000000..8090bdf --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_396.md @@ -0,0 +1,8 @@ +Example 396 +...... + +5__6__78 + +...... + +

5__6__78

diff --git a/crates/gfm/tests/fixtures/spec_397.md b/crates/gfm/tests/fixtures/spec_397.md new file mode 100644 index 0000000..316dd5f --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_397.md @@ -0,0 +1,8 @@ +Example 397 +...... + +пристаням__стремятся__ + +...... + +

пристаням__стремятся__

diff --git a/crates/gfm/tests/fixtures/spec_398.md b/crates/gfm/tests/fixtures/spec_398.md new file mode 100644 index 0000000..d1353a8 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_398.md @@ -0,0 +1,8 @@ +Example 398 +...... + +__foo, __bar__, baz__ + +...... + +

foo, bar, baz

diff --git a/crates/gfm/tests/fixtures/spec_399.md b/crates/gfm/tests/fixtures/spec_399.md new file mode 100644 index 0000000..6d23372 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_399.md @@ -0,0 +1,8 @@ +Example 399 +...... + +foo-__(bar)__ + +...... + +

foo-(bar)

diff --git a/crates/gfm/tests/fixtures/spec_400.md b/crates/gfm/tests/fixtures/spec_400.md new file mode 100644 index 0000000..2a7c18f --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_400.md @@ -0,0 +1,8 @@ +Example 400 +...... + +**foo bar ** + +...... + +

**foo bar **

diff --git a/crates/gfm/tests/fixtures/spec_401.md b/crates/gfm/tests/fixtures/spec_401.md new file mode 100644 index 0000000..34cd8e6 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_401.md @@ -0,0 +1,8 @@ +Example 401 +...... + +**(**foo) + +...... + +

**(**foo)

diff --git a/crates/gfm/tests/fixtures/spec_402.md b/crates/gfm/tests/fixtures/spec_402.md new file mode 100644 index 0000000..8a22702 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_402.md @@ -0,0 +1,8 @@ +Example 402 +...... + +*(**foo**)* + +...... + +

(foo)

diff --git a/crates/gfm/tests/fixtures/spec_403.md b/crates/gfm/tests/fixtures/spec_403.md new file mode 100644 index 0000000..3da4bf6 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_403.md @@ -0,0 +1,10 @@ +Example 403 +...... + +**Gomphocarpus (*Gomphocarpus physocarpus*, syn. +*Asclepias physocarpa*)** + +...... + +

Gomphocarpus (Gomphocarpus physocarpus, syn. +Asclepias physocarpa)

diff --git a/crates/gfm/tests/fixtures/spec_404.md b/crates/gfm/tests/fixtures/spec_404.md new file mode 100644 index 0000000..a822982 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_404.md @@ -0,0 +1,8 @@ +Example 404 +...... + +**foo "*bar*" foo** + +...... + +

foo "bar" foo

diff --git a/crates/gfm/tests/fixtures/spec_405.md b/crates/gfm/tests/fixtures/spec_405.md new file mode 100644 index 0000000..53d7c3c --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_405.md @@ -0,0 +1,8 @@ +Example 405 +...... + +**foo**bar + +...... + +

foobar

diff --git a/crates/gfm/tests/fixtures/spec_406.md b/crates/gfm/tests/fixtures/spec_406.md new file mode 100644 index 0000000..84e0fee --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_406.md @@ -0,0 +1,8 @@ +Example 406 +...... + +__foo bar __ + +...... + +

__foo bar __

diff --git a/crates/gfm/tests/fixtures/spec_407.md b/crates/gfm/tests/fixtures/spec_407.md new file mode 100644 index 0000000..a2fe83d --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_407.md @@ -0,0 +1,8 @@ +Example 407 +...... + +__(__foo) + +...... + +

__(__foo)

diff --git a/crates/gfm/tests/fixtures/spec_408.md b/crates/gfm/tests/fixtures/spec_408.md new file mode 100644 index 0000000..478b5bc --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_408.md @@ -0,0 +1,8 @@ +Example 408 +...... + +_(__foo__)_ + +...... + +

(foo)

diff --git a/crates/gfm/tests/fixtures/spec_409.md b/crates/gfm/tests/fixtures/spec_409.md new file mode 100644 index 0000000..6cf670b --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_409.md @@ -0,0 +1,8 @@ +Example 409 +...... + +__foo__bar + +...... + +

__foo__bar

diff --git a/crates/gfm/tests/fixtures/spec_410.md b/crates/gfm/tests/fixtures/spec_410.md new file mode 100644 index 0000000..6660eeb --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_410.md @@ -0,0 +1,8 @@ +Example 410 +...... + +__пристаням__стремятся + +...... + +

__пристаням__стремятся

diff --git a/crates/gfm/tests/fixtures/spec_411.md b/crates/gfm/tests/fixtures/spec_411.md new file mode 100644 index 0000000..c821dec --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_411.md @@ -0,0 +1,8 @@ +Example 411 +...... + +__foo__bar__baz__ + +...... + +

foo__bar__baz

diff --git a/crates/gfm/tests/fixtures/spec_412.md b/crates/gfm/tests/fixtures/spec_412.md new file mode 100644 index 0000000..d956616 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_412.md @@ -0,0 +1,8 @@ +Example 412 +...... + +__(bar)__. + +...... + +

(bar).

diff --git a/crates/gfm/tests/fixtures/spec_413.md b/crates/gfm/tests/fixtures/spec_413.md new file mode 100644 index 0000000..9a61bd7 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_413.md @@ -0,0 +1,8 @@ +Example 413 +...... + +*foo [bar](/url)* + +...... + +

foo bar

diff --git a/crates/gfm/tests/fixtures/spec_414.md b/crates/gfm/tests/fixtures/spec_414.md new file mode 100644 index 0000000..e63476b --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_414.md @@ -0,0 +1,10 @@ +Example 414 +...... + +*foo +bar* + +...... + +

foo +bar

diff --git a/crates/gfm/tests/fixtures/spec_415.md b/crates/gfm/tests/fixtures/spec_415.md new file mode 100644 index 0000000..4333d1d --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_415.md @@ -0,0 +1,8 @@ +Example 415 +...... + +_foo __bar__ baz_ + +...... + +

foo bar baz

diff --git a/crates/gfm/tests/fixtures/spec_416.md b/crates/gfm/tests/fixtures/spec_416.md new file mode 100644 index 0000000..10a9730 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_416.md @@ -0,0 +1,8 @@ +Example 416 +...... + +_foo _bar_ baz_ + +...... + +

foo bar baz

diff --git a/crates/gfm/tests/fixtures/spec_417.md b/crates/gfm/tests/fixtures/spec_417.md new file mode 100644 index 0000000..f1a2d37 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_417.md @@ -0,0 +1,8 @@ +Example 417 +...... + +__foo_ bar_ + +...... + +

foo bar

diff --git a/crates/gfm/tests/fixtures/spec_418.md b/crates/gfm/tests/fixtures/spec_418.md new file mode 100644 index 0000000..f183f77 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_418.md @@ -0,0 +1,8 @@ +Example 418 +...... + +*foo *bar** + +...... + +

foo bar

diff --git a/crates/gfm/tests/fixtures/spec_419.md b/crates/gfm/tests/fixtures/spec_419.md new file mode 100644 index 0000000..7201887 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_419.md @@ -0,0 +1,8 @@ +Example 419 +...... + +*foo **bar** baz* + +...... + +

foo bar baz

diff --git a/crates/gfm/tests/fixtures/spec_420.md b/crates/gfm/tests/fixtures/spec_420.md new file mode 100644 index 0000000..0fd4749 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_420.md @@ -0,0 +1,8 @@ +Example 420 +...... + +*foo**bar**baz* + +...... + +

foobarbaz

diff --git a/crates/gfm/tests/fixtures/spec_421.md b/crates/gfm/tests/fixtures/spec_421.md new file mode 100644 index 0000000..e7972fe --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_421.md @@ -0,0 +1,8 @@ +Example 421 +...... + +*foo**bar* + +...... + +

foo**bar

diff --git a/crates/gfm/tests/fixtures/spec_422.md b/crates/gfm/tests/fixtures/spec_422.md new file mode 100644 index 0000000..916b958 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_422.md @@ -0,0 +1,8 @@ +Example 422 +...... + +***foo** bar* + +...... + +

foo bar

diff --git a/crates/gfm/tests/fixtures/spec_423.md b/crates/gfm/tests/fixtures/spec_423.md new file mode 100644 index 0000000..9794c72 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_423.md @@ -0,0 +1,8 @@ +Example 423 +...... + +*foo **bar*** + +...... + +

foo bar

diff --git a/crates/gfm/tests/fixtures/spec_424.md b/crates/gfm/tests/fixtures/spec_424.md new file mode 100644 index 0000000..4882271 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_424.md @@ -0,0 +1,8 @@ +Example 424 +...... + +*foo**bar*** + +...... + +

foobar

diff --git a/crates/gfm/tests/fixtures/spec_425.md b/crates/gfm/tests/fixtures/spec_425.md new file mode 100644 index 0000000..f4c179c --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_425.md @@ -0,0 +1,8 @@ +Example 425 +...... + +foo***bar***baz + +...... + +

foobarbaz

diff --git a/crates/gfm/tests/fixtures/spec_426.md b/crates/gfm/tests/fixtures/spec_426.md new file mode 100644 index 0000000..06e08b7 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_426.md @@ -0,0 +1,8 @@ +Example 426 +...... + +foo******bar*********baz + +...... + +

foobar***baz

diff --git a/crates/gfm/tests/fixtures/spec_427.md b/crates/gfm/tests/fixtures/spec_427.md new file mode 100644 index 0000000..344e810 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_427.md @@ -0,0 +1,8 @@ +Example 427 +...... + +*foo **bar *baz* bim** bop* + +...... + +

foo bar baz bim bop

diff --git a/crates/gfm/tests/fixtures/spec_428.md b/crates/gfm/tests/fixtures/spec_428.md new file mode 100644 index 0000000..4e86e50 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_428.md @@ -0,0 +1,8 @@ +Example 428 +...... + +*foo [*bar*](/url)* + +...... + +

foo bar

diff --git a/crates/gfm/tests/fixtures/spec_429.md b/crates/gfm/tests/fixtures/spec_429.md new file mode 100644 index 0000000..749cfaf --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_429.md @@ -0,0 +1,8 @@ +Example 429 +...... + +** is not an empty emphasis + +...... + +

** is not an empty emphasis

diff --git a/crates/gfm/tests/fixtures/spec_430.md b/crates/gfm/tests/fixtures/spec_430.md new file mode 100644 index 0000000..2d12612 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_430.md @@ -0,0 +1,8 @@ +Example 430 +...... + +**** is not an empty strong emphasis + +...... + +

**** is not an empty strong emphasis

diff --git a/crates/gfm/tests/fixtures/spec_431.md b/crates/gfm/tests/fixtures/spec_431.md new file mode 100644 index 0000000..540f8d8 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_431.md @@ -0,0 +1,8 @@ +Example 431 +...... + +**foo [bar](/url)** + +...... + +

foo bar

diff --git a/crates/gfm/tests/fixtures/spec_432.md b/crates/gfm/tests/fixtures/spec_432.md new file mode 100644 index 0000000..b0a978b --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_432.md @@ -0,0 +1,10 @@ +Example 432 +...... + +**foo +bar** + +...... + +

foo +bar

diff --git a/crates/gfm/tests/fixtures/spec_433.md b/crates/gfm/tests/fixtures/spec_433.md new file mode 100644 index 0000000..14ec41c --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_433.md @@ -0,0 +1,8 @@ +Example 433 +...... + +__foo _bar_ baz__ + +...... + +

foo bar baz

diff --git a/crates/gfm/tests/fixtures/spec_434.md b/crates/gfm/tests/fixtures/spec_434.md new file mode 100644 index 0000000..579ac05 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_434.md @@ -0,0 +1,8 @@ +Example 434 +...... + +__foo __bar__ baz__ + +...... + +

foo bar baz

diff --git a/crates/gfm/tests/fixtures/spec_435.md b/crates/gfm/tests/fixtures/spec_435.md new file mode 100644 index 0000000..64cef42 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_435.md @@ -0,0 +1,8 @@ +Example 435 +...... + +____foo__ bar__ + +...... + +

foo bar

diff --git a/crates/gfm/tests/fixtures/spec_436.md b/crates/gfm/tests/fixtures/spec_436.md new file mode 100644 index 0000000..f8e7fe6 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_436.md @@ -0,0 +1,8 @@ +Example 436 +...... + +**foo **bar**** + +...... + +

foo bar

diff --git a/crates/gfm/tests/fixtures/spec_437.md b/crates/gfm/tests/fixtures/spec_437.md new file mode 100644 index 0000000..b4b53b7 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_437.md @@ -0,0 +1,8 @@ +Example 437 +...... + +**foo *bar* baz** + +...... + +

foo bar baz

diff --git a/crates/gfm/tests/fixtures/spec_438.md b/crates/gfm/tests/fixtures/spec_438.md new file mode 100644 index 0000000..b5e1f22 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_438.md @@ -0,0 +1,8 @@ +Example 438 +...... + +**foo*bar*baz** + +...... + +

foobarbaz

diff --git a/crates/gfm/tests/fixtures/spec_439.md b/crates/gfm/tests/fixtures/spec_439.md new file mode 100644 index 0000000..4510038 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_439.md @@ -0,0 +1,8 @@ +Example 439 +...... + +***foo* bar** + +...... + +

foo bar

diff --git a/crates/gfm/tests/fixtures/spec_440.md b/crates/gfm/tests/fixtures/spec_440.md new file mode 100644 index 0000000..7d0f517 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_440.md @@ -0,0 +1,8 @@ +Example 440 +...... + +**foo *bar*** + +...... + +

foo bar

diff --git a/crates/gfm/tests/fixtures/spec_441.md b/crates/gfm/tests/fixtures/spec_441.md new file mode 100644 index 0000000..6d59806 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_441.md @@ -0,0 +1,10 @@ +Example 441 +...... + +**foo *bar **baz** +bim* bop** + +...... + +

foo bar baz +bim bop

diff --git a/crates/gfm/tests/fixtures/spec_442.md b/crates/gfm/tests/fixtures/spec_442.md new file mode 100644 index 0000000..edddc64 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_442.md @@ -0,0 +1,8 @@ +Example 442 +...... + +**foo [*bar*](/url)** + +...... + +

foo bar

diff --git a/crates/gfm/tests/fixtures/spec_443.md b/crates/gfm/tests/fixtures/spec_443.md new file mode 100644 index 0000000..99021cb --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_443.md @@ -0,0 +1,8 @@ +Example 443 +...... + +__ is not an empty emphasis + +...... + +

__ is not an empty emphasis

diff --git a/crates/gfm/tests/fixtures/spec_444.md b/crates/gfm/tests/fixtures/spec_444.md new file mode 100644 index 0000000..42e00c5 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_444.md @@ -0,0 +1,8 @@ +Example 444 +...... + +____ is not an empty strong emphasis + +...... + +

____ is not an empty strong emphasis

diff --git a/crates/gfm/tests/fixtures/spec_445.md b/crates/gfm/tests/fixtures/spec_445.md new file mode 100644 index 0000000..4ac4d13 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_445.md @@ -0,0 +1,8 @@ +Example 445 +...... + +foo *** + +...... + +

foo ***

diff --git a/crates/gfm/tests/fixtures/spec_446.md b/crates/gfm/tests/fixtures/spec_446.md new file mode 100644 index 0000000..e411274 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_446.md @@ -0,0 +1,8 @@ +Example 446 +...... + +foo *\** + +...... + +

foo *

diff --git a/crates/gfm/tests/fixtures/spec_447.md b/crates/gfm/tests/fixtures/spec_447.md new file mode 100644 index 0000000..99cc4ec --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_447.md @@ -0,0 +1,8 @@ +Example 447 +...... + +foo *_* + +...... + +

foo _

diff --git a/crates/gfm/tests/fixtures/spec_448.md b/crates/gfm/tests/fixtures/spec_448.md new file mode 100644 index 0000000..965b8f0 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_448.md @@ -0,0 +1,8 @@ +Example 448 +...... + +foo ***** + +...... + +

foo *****

diff --git a/crates/gfm/tests/fixtures/spec_449.md b/crates/gfm/tests/fixtures/spec_449.md new file mode 100644 index 0000000..9344571 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_449.md @@ -0,0 +1,8 @@ +Example 449 +...... + +foo **\*** + +...... + +

foo *

diff --git a/crates/gfm/tests/fixtures/spec_450.md b/crates/gfm/tests/fixtures/spec_450.md new file mode 100644 index 0000000..39ef17a --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_450.md @@ -0,0 +1,8 @@ +Example 450 +...... + +foo **_** + +...... + +

foo _

diff --git a/crates/gfm/tests/fixtures/spec_451.md b/crates/gfm/tests/fixtures/spec_451.md new file mode 100644 index 0000000..236240e --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_451.md @@ -0,0 +1,8 @@ +Example 451 +...... + +**foo* + +...... + +

*foo

diff --git a/crates/gfm/tests/fixtures/spec_452.md b/crates/gfm/tests/fixtures/spec_452.md new file mode 100644 index 0000000..26d39e2 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_452.md @@ -0,0 +1,8 @@ +Example 452 +...... + +*foo** + +...... + +

foo*

diff --git a/crates/gfm/tests/fixtures/spec_453.md b/crates/gfm/tests/fixtures/spec_453.md new file mode 100644 index 0000000..66fc776 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_453.md @@ -0,0 +1,8 @@ +Example 453 +...... + +***foo** + +...... + +

*foo

diff --git a/crates/gfm/tests/fixtures/spec_454.md b/crates/gfm/tests/fixtures/spec_454.md new file mode 100644 index 0000000..e175a6a --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_454.md @@ -0,0 +1,8 @@ +Example 454 +...... + +****foo* + +...... + +

***foo

diff --git a/crates/gfm/tests/fixtures/spec_455.md b/crates/gfm/tests/fixtures/spec_455.md new file mode 100644 index 0000000..3159c85 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_455.md @@ -0,0 +1,8 @@ +Example 455 +...... + +**foo*** + +...... + +

foo*

diff --git a/crates/gfm/tests/fixtures/spec_456.md b/crates/gfm/tests/fixtures/spec_456.md new file mode 100644 index 0000000..69e133b --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_456.md @@ -0,0 +1,8 @@ +Example 456 +...... + +*foo**** + +...... + +

foo***

diff --git a/crates/gfm/tests/fixtures/spec_457.md b/crates/gfm/tests/fixtures/spec_457.md new file mode 100644 index 0000000..8e406e5 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_457.md @@ -0,0 +1,8 @@ +Example 457 +...... + +foo ___ + +...... + +

foo ___

diff --git a/crates/gfm/tests/fixtures/spec_458.md b/crates/gfm/tests/fixtures/spec_458.md new file mode 100644 index 0000000..b0f6a3d --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_458.md @@ -0,0 +1,8 @@ +Example 458 +...... + +foo _\__ + +...... + +

foo _

diff --git a/crates/gfm/tests/fixtures/spec_459.md b/crates/gfm/tests/fixtures/spec_459.md new file mode 100644 index 0000000..851ae46 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_459.md @@ -0,0 +1,8 @@ +Example 459 +...... + +foo _*_ + +...... + +

foo *

diff --git a/crates/gfm/tests/fixtures/spec_460.md b/crates/gfm/tests/fixtures/spec_460.md new file mode 100644 index 0000000..ef09736 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_460.md @@ -0,0 +1,8 @@ +Example 460 +...... + +foo _____ + +...... + +

foo _____

diff --git a/crates/gfm/tests/fixtures/spec_461.md b/crates/gfm/tests/fixtures/spec_461.md new file mode 100644 index 0000000..147b517 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_461.md @@ -0,0 +1,8 @@ +Example 461 +...... + +foo __\___ + +...... + +

foo _

diff --git a/crates/gfm/tests/fixtures/spec_462.md b/crates/gfm/tests/fixtures/spec_462.md new file mode 100644 index 0000000..abd4305 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_462.md @@ -0,0 +1,8 @@ +Example 462 +...... + +foo __*__ + +...... + +

foo *

diff --git a/crates/gfm/tests/fixtures/spec_463.md b/crates/gfm/tests/fixtures/spec_463.md new file mode 100644 index 0000000..820957e --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_463.md @@ -0,0 +1,8 @@ +Example 463 +...... + +__foo_ + +...... + +

_foo

diff --git a/crates/gfm/tests/fixtures/spec_464.md b/crates/gfm/tests/fixtures/spec_464.md new file mode 100644 index 0000000..fb973d7 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_464.md @@ -0,0 +1,8 @@ +Example 464 +...... + +_foo__ + +...... + +

foo_

diff --git a/crates/gfm/tests/fixtures/spec_465.md b/crates/gfm/tests/fixtures/spec_465.md new file mode 100644 index 0000000..c122284 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_465.md @@ -0,0 +1,8 @@ +Example 465 +...... + +___foo__ + +...... + +

_foo

diff --git a/crates/gfm/tests/fixtures/spec_466.md b/crates/gfm/tests/fixtures/spec_466.md new file mode 100644 index 0000000..b8737c6 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_466.md @@ -0,0 +1,8 @@ +Example 466 +...... + +____foo_ + +...... + +

___foo

diff --git a/crates/gfm/tests/fixtures/spec_467.md b/crates/gfm/tests/fixtures/spec_467.md new file mode 100644 index 0000000..8fa6b04 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_467.md @@ -0,0 +1,8 @@ +Example 467 +...... + +__foo___ + +...... + +

foo_

diff --git a/crates/gfm/tests/fixtures/spec_468.md b/crates/gfm/tests/fixtures/spec_468.md new file mode 100644 index 0000000..e94f131 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_468.md @@ -0,0 +1,8 @@ +Example 468 +...... + +_foo____ + +...... + +

foo___

diff --git a/crates/gfm/tests/fixtures/spec_469.md b/crates/gfm/tests/fixtures/spec_469.md new file mode 100644 index 0000000..dd09b33 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_469.md @@ -0,0 +1,8 @@ +Example 469 +...... + +**foo** + +...... + +

foo

diff --git a/crates/gfm/tests/fixtures/spec_470.md b/crates/gfm/tests/fixtures/spec_470.md new file mode 100644 index 0000000..3b83a84 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_470.md @@ -0,0 +1,8 @@ +Example 470 +...... + +*_foo_* + +...... + +

foo

diff --git a/crates/gfm/tests/fixtures/spec_471.md b/crates/gfm/tests/fixtures/spec_471.md new file mode 100644 index 0000000..51ad3e9 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_471.md @@ -0,0 +1,8 @@ +Example 471 +...... + +__foo__ + +...... + +

foo

diff --git a/crates/gfm/tests/fixtures/spec_472.md b/crates/gfm/tests/fixtures/spec_472.md new file mode 100644 index 0000000..d154868 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_472.md @@ -0,0 +1,8 @@ +Example 472 +...... + +_*foo*_ + +...... + +

foo

diff --git a/crates/gfm/tests/fixtures/spec_473.md b/crates/gfm/tests/fixtures/spec_473.md new file mode 100644 index 0000000..e3eb775 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_473.md @@ -0,0 +1,8 @@ +Example 473 +...... + +****foo**** + +...... + +

foo

diff --git a/crates/gfm/tests/fixtures/spec_474.md b/crates/gfm/tests/fixtures/spec_474.md new file mode 100644 index 0000000..43c0eff --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_474.md @@ -0,0 +1,8 @@ +Example 474 +...... + +____foo____ + +...... + +

foo

diff --git a/crates/gfm/tests/fixtures/spec_475.md b/crates/gfm/tests/fixtures/spec_475.md new file mode 100644 index 0000000..25fee7b --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_475.md @@ -0,0 +1,8 @@ +Example 475 +...... + +******foo****** + +...... + +

foo

diff --git a/crates/gfm/tests/fixtures/spec_476.md b/crates/gfm/tests/fixtures/spec_476.md new file mode 100644 index 0000000..d3ee877 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_476.md @@ -0,0 +1,8 @@ +Example 476 +...... + +***foo*** + +...... + +

foo

diff --git a/crates/gfm/tests/fixtures/spec_477.md b/crates/gfm/tests/fixtures/spec_477.md new file mode 100644 index 0000000..60535d7 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_477.md @@ -0,0 +1,8 @@ +Example 477 +...... + +_____foo_____ + +...... + +

foo

diff --git a/crates/gfm/tests/fixtures/spec_478.md b/crates/gfm/tests/fixtures/spec_478.md new file mode 100644 index 0000000..e2712a5 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_478.md @@ -0,0 +1,8 @@ +Example 478 +...... + +*foo _bar* baz_ + +...... + +

foo _bar baz_

diff --git a/crates/gfm/tests/fixtures/spec_479.md b/crates/gfm/tests/fixtures/spec_479.md new file mode 100644 index 0000000..901a111 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_479.md @@ -0,0 +1,8 @@ +Example 479 +...... + +*foo __bar *baz bim__ bam* + +...... + +

foo bar *baz bim bam

diff --git a/crates/gfm/tests/fixtures/spec_480.md b/crates/gfm/tests/fixtures/spec_480.md new file mode 100644 index 0000000..6a2a51d --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_480.md @@ -0,0 +1,8 @@ +Example 480 +...... + +**foo **bar baz** + +...... + +

**foo bar baz

diff --git a/crates/gfm/tests/fixtures/spec_481.md b/crates/gfm/tests/fixtures/spec_481.md new file mode 100644 index 0000000..fbd02e9 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_481.md @@ -0,0 +1,8 @@ +Example 481 +...... + +*foo *bar baz* + +...... + +

*foo bar baz

diff --git a/crates/gfm/tests/fixtures/spec_482.md b/crates/gfm/tests/fixtures/spec_482.md new file mode 100644 index 0000000..001ec76 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_482.md @@ -0,0 +1,8 @@ +Example 482 +...... + +*[bar*](/url) + +...... + +

*bar*

diff --git a/crates/gfm/tests/fixtures/spec_483.md b/crates/gfm/tests/fixtures/spec_483.md new file mode 100644 index 0000000..f2ea3da --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_483.md @@ -0,0 +1,8 @@ +Example 483 +...... + +_foo [bar_](/url) + +...... + +

_foo bar_

diff --git a/crates/gfm/tests/fixtures/spec_484.md b/crates/gfm/tests/fixtures/spec_484.md new file mode 100644 index 0000000..4dcf550 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_484.md @@ -0,0 +1,8 @@ +Example 484 +...... + +* + +...... + +

*

diff --git a/crates/gfm/tests/fixtures/spec_485.md b/crates/gfm/tests/fixtures/spec_485.md new file mode 100644 index 0000000..8f0de8b --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_485.md @@ -0,0 +1,8 @@ +Example 485 +...... + +** + +...... + +

**

diff --git a/crates/gfm/tests/fixtures/spec_486.md b/crates/gfm/tests/fixtures/spec_486.md new file mode 100644 index 0000000..d2dde87 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_486.md @@ -0,0 +1,8 @@ +Example 486 +...... + +__ + +...... + +

__

diff --git a/crates/gfm/tests/fixtures/spec_487.md b/crates/gfm/tests/fixtures/spec_487.md new file mode 100644 index 0000000..b6c2800 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_487.md @@ -0,0 +1,8 @@ +Example 487 +...... + +*a `*`* + +...... + +

a *

diff --git a/crates/gfm/tests/fixtures/spec_488.md b/crates/gfm/tests/fixtures/spec_488.md new file mode 100644 index 0000000..35399ba --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_488.md @@ -0,0 +1,8 @@ +Example 488 +...... + +_a `_`_ + +...... + +

a _

diff --git a/crates/gfm/tests/fixtures/spec_489.md b/crates/gfm/tests/fixtures/spec_489.md new file mode 100644 index 0000000..ef1cf9e --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_489.md @@ -0,0 +1,8 @@ +Example 489 +...... + +**a + +...... + +

**ahttp://foo.bar/?q=**

diff --git a/crates/gfm/tests/fixtures/spec_490.md b/crates/gfm/tests/fixtures/spec_490.md new file mode 100644 index 0000000..05e1242 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_490.md @@ -0,0 +1,8 @@ +Example 490 +...... + +__a + +...... + +

__ahttp://foo.bar/?q=__

diff --git a/crates/gfm/tests/fixtures/spec_492.md b/crates/gfm/tests/fixtures/spec_492.md new file mode 100644 index 0000000..ce65aee --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_492.md @@ -0,0 +1,11 @@ +Example 492 +...... + +This ~~has a + +new paragraph~~. + +...... + +

This ~~has a

+

new paragraph~~.

diff --git a/crates/gfm/tests/fixtures/spec_494.md b/crates/gfm/tests/fixtures/spec_494.md new file mode 100644 index 0000000..30fd055 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_494.md @@ -0,0 +1,8 @@ +Example 494 +...... + +[link](/uri "title") + +...... + +

link

diff --git a/crates/gfm/tests/fixtures/spec_495.md b/crates/gfm/tests/fixtures/spec_495.md new file mode 100644 index 0000000..fe498ec --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_495.md @@ -0,0 +1,8 @@ +Example 495 +...... + +[link](/uri) + +...... + +

link

diff --git a/crates/gfm/tests/fixtures/spec_496.md b/crates/gfm/tests/fixtures/spec_496.md new file mode 100644 index 0000000..5fbb9f5 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_496.md @@ -0,0 +1,8 @@ +Example 496 +...... + +[link]() + +...... + +

link

diff --git a/crates/gfm/tests/fixtures/spec_497.md b/crates/gfm/tests/fixtures/spec_497.md new file mode 100644 index 0000000..80d4520 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_497.md @@ -0,0 +1,8 @@ +Example 497 +...... + +[link](<>) + +...... + +

link

diff --git a/crates/gfm/tests/fixtures/spec_498.md b/crates/gfm/tests/fixtures/spec_498.md new file mode 100644 index 0000000..8f5060c --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_498.md @@ -0,0 +1,8 @@ +Example 498 +...... + +[link](/my uri) + +...... + +

[link](/my uri)

diff --git a/crates/gfm/tests/fixtures/spec_499.md b/crates/gfm/tests/fixtures/spec_499.md new file mode 100644 index 0000000..89c35e3 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_499.md @@ -0,0 +1,8 @@ +Example 499 +...... + +[link](
) + +...... + +

link

diff --git a/crates/gfm/tests/fixtures/spec_500.md b/crates/gfm/tests/fixtures/spec_500.md new file mode 100644 index 0000000..638a566 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_500.md @@ -0,0 +1,10 @@ +Example 500 +...... + +[link](foo +bar) + +...... + +

[link](foo +bar)

diff --git a/crates/gfm/tests/fixtures/spec_501.md b/crates/gfm/tests/fixtures/spec_501.md new file mode 100644 index 0000000..2a35850 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_501.md @@ -0,0 +1,10 @@ +Example 501 +...... + +[link]() + +...... + +

[link]()

diff --git a/crates/gfm/tests/fixtures/spec_502.md b/crates/gfm/tests/fixtures/spec_502.md new file mode 100644 index 0000000..79995f5 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_502.md @@ -0,0 +1,8 @@ +Example 502 +...... + +[a]() + +...... + +

a

diff --git a/crates/gfm/tests/fixtures/spec_503.md b/crates/gfm/tests/fixtures/spec_503.md new file mode 100644 index 0000000..8689f5f --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_503.md @@ -0,0 +1,8 @@ +Example 503 +...... + +[link]() + +...... + +

[link](<foo>)

diff --git a/crates/gfm/tests/fixtures/spec_504.md b/crates/gfm/tests/fixtures/spec_504.md new file mode 100644 index 0000000..cac54f6 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_504.md @@ -0,0 +1,12 @@ +Example 504 +...... + +[a]( +[a](c) + +...... + +

[a](<b)c +[a](<b)c> +[a](c)

diff --git a/crates/gfm/tests/fixtures/spec_505.md b/crates/gfm/tests/fixtures/spec_505.md new file mode 100644 index 0000000..900f66a --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_505.md @@ -0,0 +1,8 @@ +Example 505 +...... + +[link](\(foo\)) + +...... + +

link

diff --git a/crates/gfm/tests/fixtures/spec_506.md b/crates/gfm/tests/fixtures/spec_506.md new file mode 100644 index 0000000..44e8894 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_506.md @@ -0,0 +1,8 @@ +Example 506 +...... + +[link](foo(and(bar))) + +...... + +

link

diff --git a/crates/gfm/tests/fixtures/spec_507.md b/crates/gfm/tests/fixtures/spec_507.md new file mode 100644 index 0000000..c25499b --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_507.md @@ -0,0 +1,8 @@ +Example 507 +...... + +[link](foo\(and\(bar\)) + +...... + +

link

diff --git a/crates/gfm/tests/fixtures/spec_508.md b/crates/gfm/tests/fixtures/spec_508.md new file mode 100644 index 0000000..2427cf5 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_508.md @@ -0,0 +1,8 @@ +Example 508 +...... + +[link]() + +...... + +

link

diff --git a/crates/gfm/tests/fixtures/spec_509.md b/crates/gfm/tests/fixtures/spec_509.md new file mode 100644 index 0000000..d4ec542 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_509.md @@ -0,0 +1,8 @@ +Example 509 +...... + +[link](foo\)\:) + +...... + +

link

diff --git a/crates/gfm/tests/fixtures/spec_510.md b/crates/gfm/tests/fixtures/spec_510.md new file mode 100644 index 0000000..33dc956 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_510.md @@ -0,0 +1,14 @@ +Example 510 +...... + +[link](#fragment) + +[link](http://example.com#fragment) + +[link](http://example.com?foo=3#frag) + +...... + +

link

+

link

+

link

diff --git a/crates/gfm/tests/fixtures/spec_511.md b/crates/gfm/tests/fixtures/spec_511.md new file mode 100644 index 0000000..c096993 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_511.md @@ -0,0 +1,8 @@ +Example 511 +...... + +[link](foo\bar) + +...... + +

link

diff --git a/crates/gfm/tests/fixtures/spec_512.md b/crates/gfm/tests/fixtures/spec_512.md new file mode 100644 index 0000000..7295a0d --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_512.md @@ -0,0 +1,8 @@ +Example 512 +...... + +[link](foo%20bä) + +...... + +

link

diff --git a/crates/gfm/tests/fixtures/spec_513.md b/crates/gfm/tests/fixtures/spec_513.md new file mode 100644 index 0000000..123be77 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_513.md @@ -0,0 +1,8 @@ +Example 513 +...... + +[link]("title") + +...... + +

link

diff --git a/crates/gfm/tests/fixtures/spec_514.md b/crates/gfm/tests/fixtures/spec_514.md new file mode 100644 index 0000000..05ad781 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_514.md @@ -0,0 +1,12 @@ +Example 514 +...... + +[link](/url "title") +[link](/url 'title') +[link](/url (title)) + +...... + +

link +link +link

diff --git a/crates/gfm/tests/fixtures/spec_515.md b/crates/gfm/tests/fixtures/spec_515.md new file mode 100644 index 0000000..38dda46 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_515.md @@ -0,0 +1,8 @@ +Example 515 +...... + +[link](/url "title \""") + +...... + +

link

diff --git a/crates/gfm/tests/fixtures/spec_516.md b/crates/gfm/tests/fixtures/spec_516.md new file mode 100644 index 0000000..bb7dd36 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_516.md @@ -0,0 +1,8 @@ +Example 516 +...... + +[link](/url "title") + +...... + +

link

diff --git a/crates/gfm/tests/fixtures/spec_517.md b/crates/gfm/tests/fixtures/spec_517.md new file mode 100644 index 0000000..440cd03 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_517.md @@ -0,0 +1,8 @@ +Example 517 +...... + +[link](/url "title "and" title") + +...... + +

[link](/url "title "and" title")

diff --git a/crates/gfm/tests/fixtures/spec_518.md b/crates/gfm/tests/fixtures/spec_518.md new file mode 100644 index 0000000..211784b --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_518.md @@ -0,0 +1,8 @@ +Example 518 +...... + +[link](/url 'title "and" title') + +...... + +

link

diff --git a/crates/gfm/tests/fixtures/spec_519.md b/crates/gfm/tests/fixtures/spec_519.md new file mode 100644 index 0000000..e73d3b1 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_519.md @@ -0,0 +1,9 @@ +Example 519 +...... + +[link]( /uri + "title" ) + +...... + +

link

diff --git a/crates/gfm/tests/fixtures/spec_520.md b/crates/gfm/tests/fixtures/spec_520.md new file mode 100644 index 0000000..ef1242b --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_520.md @@ -0,0 +1,8 @@ +Example 520 +...... + +[link] (/uri) + +...... + +

[link] (/uri)

diff --git a/crates/gfm/tests/fixtures/spec_521.md b/crates/gfm/tests/fixtures/spec_521.md new file mode 100644 index 0000000..68a44d5 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_521.md @@ -0,0 +1,8 @@ +Example 521 +...... + +[link [foo [bar]]](/uri) + +...... + +

link [foo [bar]]

diff --git a/crates/gfm/tests/fixtures/spec_522.md b/crates/gfm/tests/fixtures/spec_522.md new file mode 100644 index 0000000..82dafef --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_522.md @@ -0,0 +1,8 @@ +Example 522 +...... + +[link] bar](/uri) + +...... + +

[link] bar](/uri)

diff --git a/crates/gfm/tests/fixtures/spec_523.md b/crates/gfm/tests/fixtures/spec_523.md new file mode 100644 index 0000000..f1c2162 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_523.md @@ -0,0 +1,8 @@ +Example 523 +...... + +[link [bar](/uri) + +...... + +

[link bar

diff --git a/crates/gfm/tests/fixtures/spec_524.md b/crates/gfm/tests/fixtures/spec_524.md new file mode 100644 index 0000000..6daaa36 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_524.md @@ -0,0 +1,8 @@ +Example 524 +...... + +[link \[bar](/uri) + +...... + +

link [bar

diff --git a/crates/gfm/tests/fixtures/spec_525.md b/crates/gfm/tests/fixtures/spec_525.md new file mode 100644 index 0000000..5e2a9c0 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_525.md @@ -0,0 +1,8 @@ +Example 525 +...... + +[link *foo **bar** `#`*](/uri) + +...... + +

link foo bar #

diff --git a/crates/gfm/tests/fixtures/spec_526.md b/crates/gfm/tests/fixtures/spec_526.md new file mode 100644 index 0000000..a6819d9 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_526.md @@ -0,0 +1,8 @@ +Example 526 +...... + +[![moon](moon.jpg)](/uri) + +...... + +

moon

diff --git a/crates/gfm/tests/fixtures/spec_527.md b/crates/gfm/tests/fixtures/spec_527.md new file mode 100644 index 0000000..676cc32 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_527.md @@ -0,0 +1,8 @@ +Example 527 +...... + +[foo [bar](/uri)](/uri) + +...... + +

[foo bar](/uri)

diff --git a/crates/gfm/tests/fixtures/spec_528.md b/crates/gfm/tests/fixtures/spec_528.md new file mode 100644 index 0000000..0108e07 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_528.md @@ -0,0 +1,8 @@ +Example 528 +...... + +[foo *[bar [baz](/uri)](/uri)*](/uri) + +...... + +

[foo [bar baz](/uri)](/uri)

diff --git a/crates/gfm/tests/fixtures/spec_529.md b/crates/gfm/tests/fixtures/spec_529.md new file mode 100644 index 0000000..c96c508 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_529.md @@ -0,0 +1,8 @@ +Example 529 +...... + +![[[foo](uri1)](uri2)](uri3) + +...... + +

[foo](uri2)

diff --git a/crates/gfm/tests/fixtures/spec_530.md b/crates/gfm/tests/fixtures/spec_530.md new file mode 100644 index 0000000..5199495 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_530.md @@ -0,0 +1,8 @@ +Example 530 +...... + +*[foo*](/uri) + +...... + +

*foo*

diff --git a/crates/gfm/tests/fixtures/spec_531.md b/crates/gfm/tests/fixtures/spec_531.md new file mode 100644 index 0000000..1975222 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_531.md @@ -0,0 +1,8 @@ +Example 531 +...... + +[foo *bar](baz*) + +...... + +

foo *bar

diff --git a/crates/gfm/tests/fixtures/spec_532.md b/crates/gfm/tests/fixtures/spec_532.md new file mode 100644 index 0000000..903c511 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_532.md @@ -0,0 +1,8 @@ +Example 532 +...... + +*foo [bar* baz] + +...... + +

foo [bar baz]

diff --git a/crates/gfm/tests/fixtures/spec_533.md b/crates/gfm/tests/fixtures/spec_533.md new file mode 100644 index 0000000..24ee9ba --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_533.md @@ -0,0 +1,8 @@ +Example 533 +...... + +[foo + +...... + +

[foo

diff --git a/crates/gfm/tests/fixtures/spec_534.md b/crates/gfm/tests/fixtures/spec_534.md new file mode 100644 index 0000000..63932f3 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_534.md @@ -0,0 +1,8 @@ +Example 534 +...... + +[foo`](/uri)` + +...... + +

[foo](/uri)

diff --git a/crates/gfm/tests/fixtures/spec_535.md b/crates/gfm/tests/fixtures/spec_535.md new file mode 100644 index 0000000..c152c5d --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_535.md @@ -0,0 +1,8 @@ +Example 535 +...... + +[foo + +...... + +

[foohttp://example.com/?search=](uri)

diff --git a/crates/gfm/tests/fixtures/spec_536.md b/crates/gfm/tests/fixtures/spec_536.md new file mode 100644 index 0000000..07d1c74 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_536.md @@ -0,0 +1,10 @@ +Example 536 +...... + +[foo][bar] + +[bar]: /url "title" + +...... + +

foo

diff --git a/crates/gfm/tests/fixtures/spec_537.md b/crates/gfm/tests/fixtures/spec_537.md new file mode 100644 index 0000000..f764106 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_537.md @@ -0,0 +1,10 @@ +Example 537 +...... + +[link [foo [bar]]][ref] + +[ref]: /uri + +...... + +

link [foo [bar]]

diff --git a/crates/gfm/tests/fixtures/spec_538.md b/crates/gfm/tests/fixtures/spec_538.md new file mode 100644 index 0000000..eeb69cc --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_538.md @@ -0,0 +1,10 @@ +Example 538 +...... + +[link \[bar][ref] + +[ref]: /uri + +...... + +

link [bar

diff --git a/crates/gfm/tests/fixtures/spec_539.md b/crates/gfm/tests/fixtures/spec_539.md new file mode 100644 index 0000000..d266598 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_539.md @@ -0,0 +1,10 @@ +Example 539 +...... + +[link *foo **bar** `#`*][ref] + +[ref]: /uri + +...... + +

link foo bar #

diff --git a/crates/gfm/tests/fixtures/spec_540.md b/crates/gfm/tests/fixtures/spec_540.md new file mode 100644 index 0000000..211630f --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_540.md @@ -0,0 +1,10 @@ +Example 540 +...... + +[![moon](moon.jpg)][ref] + +[ref]: /uri + +...... + +

moon

diff --git a/crates/gfm/tests/fixtures/spec_541.md b/crates/gfm/tests/fixtures/spec_541.md new file mode 100644 index 0000000..b1a930a --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_541.md @@ -0,0 +1,10 @@ +Example 541 +...... + +[foo [bar](/uri)][ref] + +[ref]: /uri + +...... + +

[foo bar]ref

diff --git a/crates/gfm/tests/fixtures/spec_542.md b/crates/gfm/tests/fixtures/spec_542.md new file mode 100644 index 0000000..81eb53d --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_542.md @@ -0,0 +1,10 @@ +Example 542 +...... + +[foo *bar [baz][ref]*][ref] + +[ref]: /uri + +...... + +

[foo bar baz]ref

diff --git a/crates/gfm/tests/fixtures/spec_543.md b/crates/gfm/tests/fixtures/spec_543.md new file mode 100644 index 0000000..5c52112 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_543.md @@ -0,0 +1,10 @@ +Example 543 +...... + +*[foo*][ref] + +[ref]: /uri + +...... + +

*foo*

diff --git a/crates/gfm/tests/fixtures/spec_544.md b/crates/gfm/tests/fixtures/spec_544.md new file mode 100644 index 0000000..b18931e --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_544.md @@ -0,0 +1,10 @@ +Example 544 +...... + +[foo *bar][ref] + +[ref]: /uri + +...... + +

foo *bar

diff --git a/crates/gfm/tests/fixtures/spec_545.md b/crates/gfm/tests/fixtures/spec_545.md new file mode 100644 index 0000000..a54c184 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_545.md @@ -0,0 +1,10 @@ +Example 545 +...... + +[foo + +[ref]: /uri + +...... + +

[foo

diff --git a/crates/gfm/tests/fixtures/spec_546.md b/crates/gfm/tests/fixtures/spec_546.md new file mode 100644 index 0000000..f50bbc3 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_546.md @@ -0,0 +1,10 @@ +Example 546 +...... + +[foo`][ref]` + +[ref]: /uri + +...... + +

[foo][ref]

diff --git a/crates/gfm/tests/fixtures/spec_547.md b/crates/gfm/tests/fixtures/spec_547.md new file mode 100644 index 0000000..f5a7c56 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_547.md @@ -0,0 +1,10 @@ +Example 547 +...... + +[foo + +[ref]: /uri + +...... + +

[foohttp://example.com/?search=][ref]

diff --git a/crates/gfm/tests/fixtures/spec_548.md b/crates/gfm/tests/fixtures/spec_548.md new file mode 100644 index 0000000..28fd21e --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_548.md @@ -0,0 +1,10 @@ +Example 548 +...... + +[foo][BaR] + +[bar]: /url "title" + +...... + +

foo

diff --git a/crates/gfm/tests/fixtures/spec_549.md b/crates/gfm/tests/fixtures/spec_549.md new file mode 100644 index 0000000..7a8d06f --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_549.md @@ -0,0 +1,10 @@ +Example 549 +...... + +[Толпой][Толпой] is a Russian word. + +[ТОЛПОЙ]: /url + +...... + +

Толпой is a Russian word.

diff --git a/crates/gfm/tests/fixtures/spec_550.md b/crates/gfm/tests/fixtures/spec_550.md new file mode 100644 index 0000000..727b6c7 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_550.md @@ -0,0 +1,11 @@ +Example 550 +...... + +[Foo + bar]: /url + +[Baz][Foo bar] + +...... + +

Baz

diff --git a/crates/gfm/tests/fixtures/spec_551.md b/crates/gfm/tests/fixtures/spec_551.md new file mode 100644 index 0000000..6d0cdc9 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_551.md @@ -0,0 +1,10 @@ +Example 551 +...... + +[foo] [bar] + +[bar]: /url "title" + +...... + +

[foo] bar

diff --git a/crates/gfm/tests/fixtures/spec_552.md b/crates/gfm/tests/fixtures/spec_552.md new file mode 100644 index 0000000..412dbb8 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_552.md @@ -0,0 +1,12 @@ +Example 552 +...... + +[foo] +[bar] + +[bar]: /url "title" + +...... + +

[foo] +bar

diff --git a/crates/gfm/tests/fixtures/spec_553.md b/crates/gfm/tests/fixtures/spec_553.md new file mode 100644 index 0000000..451a2db --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_553.md @@ -0,0 +1,12 @@ +Example 553 +...... + +[foo]: /url1 + +[foo]: /url2 + +[bar][foo] + +...... + +

bar

diff --git a/crates/gfm/tests/fixtures/spec_554.md b/crates/gfm/tests/fixtures/spec_554.md new file mode 100644 index 0000000..4c91a31 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_554.md @@ -0,0 +1,10 @@ +Example 554 +...... + +[bar][foo\!] + +[foo!]: /url + +...... + +

[bar][foo!]

diff --git a/crates/gfm/tests/fixtures/spec_555.md b/crates/gfm/tests/fixtures/spec_555.md new file mode 100644 index 0000000..9803b45 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_555.md @@ -0,0 +1,11 @@ +Example 555 +...... + +[foo][ref[] + +[ref[]: /uri + +...... + +

[foo][ref[]

+

[ref[]: /uri

diff --git a/crates/gfm/tests/fixtures/spec_556.md b/crates/gfm/tests/fixtures/spec_556.md new file mode 100644 index 0000000..79ab885 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_556.md @@ -0,0 +1,11 @@ +Example 556 +...... + +[foo][ref[bar]] + +[ref[bar]]: /uri + +...... + +

[foo][ref[bar]]

+

[ref[bar]]: /uri

diff --git a/crates/gfm/tests/fixtures/spec_557.md b/crates/gfm/tests/fixtures/spec_557.md new file mode 100644 index 0000000..d8a22e2 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_557.md @@ -0,0 +1,11 @@ +Example 557 +...... + +[[[foo]]] + +[[[foo]]]: /url + +...... + +

[[[foo]]]

+

[[[foo]]]: /url

diff --git a/crates/gfm/tests/fixtures/spec_558.md b/crates/gfm/tests/fixtures/spec_558.md new file mode 100644 index 0000000..3e9def3 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_558.md @@ -0,0 +1,10 @@ +Example 558 +...... + +[foo][ref\[] + +[ref\[]: /uri + +...... + +

foo

diff --git a/crates/gfm/tests/fixtures/spec_559.md b/crates/gfm/tests/fixtures/spec_559.md new file mode 100644 index 0000000..2566ce6 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_559.md @@ -0,0 +1,10 @@ +Example 559 +...... + +[bar\\]: /uri + +[bar\\] + +...... + +

bar\

diff --git a/crates/gfm/tests/fixtures/spec_560.md b/crates/gfm/tests/fixtures/spec_560.md new file mode 100644 index 0000000..b80a3aa --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_560.md @@ -0,0 +1,11 @@ +Example 560 +...... + +[] + +[]: /uri + +...... + +

[]

+

[]: /uri

diff --git a/crates/gfm/tests/fixtures/spec_561.md b/crates/gfm/tests/fixtures/spec_561.md new file mode 100644 index 0000000..849c8dc --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_561.md @@ -0,0 +1,15 @@ +Example 561 +...... + +[ + ] + +[ + ]: /uri + +...... + +

[ +]

+

[ +]: /uri

diff --git a/crates/gfm/tests/fixtures/spec_562.md b/crates/gfm/tests/fixtures/spec_562.md new file mode 100644 index 0000000..4e948d9 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_562.md @@ -0,0 +1,10 @@ +Example 562 +...... + +[foo][] + +[foo]: /url "title" + +...... + +

foo

diff --git a/crates/gfm/tests/fixtures/spec_563.md b/crates/gfm/tests/fixtures/spec_563.md new file mode 100644 index 0000000..68eaa6b --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_563.md @@ -0,0 +1,10 @@ +Example 563 +...... + +[*foo* bar][] + +[*foo* bar]: /url "title" + +...... + +

foo bar

diff --git a/crates/gfm/tests/fixtures/spec_564.md b/crates/gfm/tests/fixtures/spec_564.md new file mode 100644 index 0000000..b18923d --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_564.md @@ -0,0 +1,10 @@ +Example 564 +...... + +[Foo][] + +[foo]: /url "title" + +...... + +

Foo

diff --git a/crates/gfm/tests/fixtures/spec_565.md b/crates/gfm/tests/fixtures/spec_565.md new file mode 100644 index 0000000..fb59b40 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_565.md @@ -0,0 +1,12 @@ +Example 565 +...... + +[foo] +[] + +[foo]: /url "title" + +...... + +

foo +[]

diff --git a/crates/gfm/tests/fixtures/spec_566.md b/crates/gfm/tests/fixtures/spec_566.md new file mode 100644 index 0000000..73b060f --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_566.md @@ -0,0 +1,10 @@ +Example 566 +...... + +[foo] + +[foo]: /url "title" + +...... + +

foo

diff --git a/crates/gfm/tests/fixtures/spec_567.md b/crates/gfm/tests/fixtures/spec_567.md new file mode 100644 index 0000000..c9bc827 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_567.md @@ -0,0 +1,10 @@ +Example 567 +...... + +[*foo* bar] + +[*foo* bar]: /url "title" + +...... + +

foo bar

diff --git a/crates/gfm/tests/fixtures/spec_568.md b/crates/gfm/tests/fixtures/spec_568.md new file mode 100644 index 0000000..06801bf --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_568.md @@ -0,0 +1,10 @@ +Example 568 +...... + +[[*foo* bar]] + +[*foo* bar]: /url "title" + +...... + +

[foo bar]

diff --git a/crates/gfm/tests/fixtures/spec_569.md b/crates/gfm/tests/fixtures/spec_569.md new file mode 100644 index 0000000..928d3e4 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_569.md @@ -0,0 +1,10 @@ +Example 569 +...... + +[[bar [foo] + +[foo]: /url + +...... + +

[[bar foo

diff --git a/crates/gfm/tests/fixtures/spec_570.md b/crates/gfm/tests/fixtures/spec_570.md new file mode 100644 index 0000000..ec43b39 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_570.md @@ -0,0 +1,10 @@ +Example 570 +...... + +[Foo] + +[foo]: /url "title" + +...... + +

Foo

diff --git a/crates/gfm/tests/fixtures/spec_571.md b/crates/gfm/tests/fixtures/spec_571.md new file mode 100644 index 0000000..e292c16 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_571.md @@ -0,0 +1,10 @@ +Example 571 +...... + +[foo] bar + +[foo]: /url + +...... + +

foo bar

diff --git a/crates/gfm/tests/fixtures/spec_572.md b/crates/gfm/tests/fixtures/spec_572.md new file mode 100644 index 0000000..ae82be8 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_572.md @@ -0,0 +1,10 @@ +Example 572 +...... + +\[foo] + +[foo]: /url "title" + +...... + +

[foo]

diff --git a/crates/gfm/tests/fixtures/spec_573.md b/crates/gfm/tests/fixtures/spec_573.md new file mode 100644 index 0000000..a590f0f --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_573.md @@ -0,0 +1,10 @@ +Example 573 +...... + +[foo*]: /url + +*[foo*] + +...... + +

*foo*

diff --git a/crates/gfm/tests/fixtures/spec_574.md b/crates/gfm/tests/fixtures/spec_574.md new file mode 100644 index 0000000..02076b0 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_574.md @@ -0,0 +1,11 @@ +Example 574 +...... + +[foo][bar] + +[foo]: /url1 +[bar]: /url2 + +...... + +

foo

diff --git a/crates/gfm/tests/fixtures/spec_575.md b/crates/gfm/tests/fixtures/spec_575.md new file mode 100644 index 0000000..d0a11e6 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_575.md @@ -0,0 +1,10 @@ +Example 575 +...... + +[foo][] + +[foo]: /url1 + +...... + +

foo

diff --git a/crates/gfm/tests/fixtures/spec_576.md b/crates/gfm/tests/fixtures/spec_576.md new file mode 100644 index 0000000..642b412 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_576.md @@ -0,0 +1,10 @@ +Example 576 +...... + +[foo]() + +[foo]: /url1 + +...... + +

foo

diff --git a/crates/gfm/tests/fixtures/spec_577.md b/crates/gfm/tests/fixtures/spec_577.md new file mode 100644 index 0000000..086b5ee --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_577.md @@ -0,0 +1,10 @@ +Example 577 +...... + +[foo](not a link) + +[foo]: /url1 + +...... + +

foo(not a link)

diff --git a/crates/gfm/tests/fixtures/spec_578.md b/crates/gfm/tests/fixtures/spec_578.md new file mode 100644 index 0000000..a178fef --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_578.md @@ -0,0 +1,10 @@ +Example 578 +...... + +[foo][bar][baz] + +[baz]: /url + +...... + +

[foo]bar

diff --git a/crates/gfm/tests/fixtures/spec_579.md b/crates/gfm/tests/fixtures/spec_579.md new file mode 100644 index 0000000..a96f94e --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_579.md @@ -0,0 +1,11 @@ +Example 579 +...... + +[foo][bar][baz] + +[baz]: /url1 +[bar]: /url2 + +...... + +

foobaz

diff --git a/crates/gfm/tests/fixtures/spec_580.md b/crates/gfm/tests/fixtures/spec_580.md new file mode 100644 index 0000000..f95deb4 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_580.md @@ -0,0 +1,11 @@ +Example 580 +...... + +[foo][bar][baz] + +[baz]: /url1 +[foo]: /url2 + +...... + +

[foo]bar

diff --git a/crates/gfm/tests/fixtures/spec_581.md b/crates/gfm/tests/fixtures/spec_581.md new file mode 100644 index 0000000..b167eca --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_581.md @@ -0,0 +1,8 @@ +Example 581 +...... + +![foo](/url "title") + +...... + +

foo

diff --git a/crates/gfm/tests/fixtures/spec_582.md b/crates/gfm/tests/fixtures/spec_582.md new file mode 100644 index 0000000..85b9bfa --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_582.md @@ -0,0 +1,10 @@ +Example 582 +...... + +![foo *bar*] + +[foo *bar*]: train.jpg "train & tracks" + +...... + +

foo bar

diff --git a/crates/gfm/tests/fixtures/spec_583.md b/crates/gfm/tests/fixtures/spec_583.md new file mode 100644 index 0000000..0755abe --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_583.md @@ -0,0 +1,8 @@ +Example 583 +...... + +![foo ![bar](/url)](/url2) + +...... + +

foo bar

diff --git a/crates/gfm/tests/fixtures/spec_584.md b/crates/gfm/tests/fixtures/spec_584.md new file mode 100644 index 0000000..ab653d3 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_584.md @@ -0,0 +1,8 @@ +Example 584 +...... + +![foo [bar](/url)](/url2) + +...... + +

foo bar

diff --git a/crates/gfm/tests/fixtures/spec_585.md b/crates/gfm/tests/fixtures/spec_585.md new file mode 100644 index 0000000..3bb13c9 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_585.md @@ -0,0 +1,10 @@ +Example 585 +...... + +![foo *bar*][] + +[foo *bar*]: train.jpg "train & tracks" + +...... + +

foo bar

diff --git a/crates/gfm/tests/fixtures/spec_586.md b/crates/gfm/tests/fixtures/spec_586.md new file mode 100644 index 0000000..cc2bb25 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_586.md @@ -0,0 +1,10 @@ +Example 586 +...... + +![foo *bar*][foobar] + +[FOOBAR]: train.jpg "train & tracks" + +...... + +

foo bar

diff --git a/crates/gfm/tests/fixtures/spec_587.md b/crates/gfm/tests/fixtures/spec_587.md new file mode 100644 index 0000000..5fbfd21 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_587.md @@ -0,0 +1,8 @@ +Example 587 +...... + +![foo](train.jpg) + +...... + +

foo

diff --git a/crates/gfm/tests/fixtures/spec_588.md b/crates/gfm/tests/fixtures/spec_588.md new file mode 100644 index 0000000..94a6ef1 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_588.md @@ -0,0 +1,8 @@ +Example 588 +...... + +My ![foo bar](/path/to/train.jpg "title" ) + +...... + +

My foo bar

diff --git a/crates/gfm/tests/fixtures/spec_589.md b/crates/gfm/tests/fixtures/spec_589.md new file mode 100644 index 0000000..f522adf --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_589.md @@ -0,0 +1,8 @@ +Example 589 +...... + +![foo]() + +...... + +

foo

diff --git a/crates/gfm/tests/fixtures/spec_590.md b/crates/gfm/tests/fixtures/spec_590.md new file mode 100644 index 0000000..53639a0 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_590.md @@ -0,0 +1,8 @@ +Example 590 +...... + +![](/url) + +...... + +

diff --git a/crates/gfm/tests/fixtures/spec_591.md b/crates/gfm/tests/fixtures/spec_591.md new file mode 100644 index 0000000..9df1b14 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_591.md @@ -0,0 +1,10 @@ +Example 591 +...... + +![foo][bar] + +[bar]: /url + +...... + +

foo

diff --git a/crates/gfm/tests/fixtures/spec_592.md b/crates/gfm/tests/fixtures/spec_592.md new file mode 100644 index 0000000..70137a5 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_592.md @@ -0,0 +1,10 @@ +Example 592 +...... + +![foo][bar] + +[BAR]: /url + +...... + +

foo

diff --git a/crates/gfm/tests/fixtures/spec_593.md b/crates/gfm/tests/fixtures/spec_593.md new file mode 100644 index 0000000..6ba20eb --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_593.md @@ -0,0 +1,10 @@ +Example 593 +...... + +![foo][] + +[foo]: /url "title" + +...... + +

foo

diff --git a/crates/gfm/tests/fixtures/spec_594.md b/crates/gfm/tests/fixtures/spec_594.md new file mode 100644 index 0000000..1a328e2 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_594.md @@ -0,0 +1,10 @@ +Example 594 +...... + +![*foo* bar][] + +[*foo* bar]: /url "title" + +...... + +

foo bar

diff --git a/crates/gfm/tests/fixtures/spec_595.md b/crates/gfm/tests/fixtures/spec_595.md new file mode 100644 index 0000000..813b58c --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_595.md @@ -0,0 +1,10 @@ +Example 595 +...... + +![Foo][] + +[foo]: /url "title" + +...... + +

Foo

diff --git a/crates/gfm/tests/fixtures/spec_596.md b/crates/gfm/tests/fixtures/spec_596.md new file mode 100644 index 0000000..7eb68cd --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_596.md @@ -0,0 +1,12 @@ +Example 596 +...... + +![foo] +[] + +[foo]: /url "title" + +...... + +

foo +[]

diff --git a/crates/gfm/tests/fixtures/spec_597.md b/crates/gfm/tests/fixtures/spec_597.md new file mode 100644 index 0000000..50ec8eb --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_597.md @@ -0,0 +1,10 @@ +Example 597 +...... + +![foo] + +[foo]: /url "title" + +...... + +

foo

diff --git a/crates/gfm/tests/fixtures/spec_598.md b/crates/gfm/tests/fixtures/spec_598.md new file mode 100644 index 0000000..d629f8e --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_598.md @@ -0,0 +1,10 @@ +Example 598 +...... + +![*foo* bar] + +[*foo* bar]: /url "title" + +...... + +

foo bar

diff --git a/crates/gfm/tests/fixtures/spec_599.md b/crates/gfm/tests/fixtures/spec_599.md new file mode 100644 index 0000000..f841231 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_599.md @@ -0,0 +1,11 @@ +Example 599 +...... + +![[foo]] + +[[foo]]: /url "title" + +...... + +

![[foo]]

+

[[foo]]: /url "title"

diff --git a/crates/gfm/tests/fixtures/spec_600.md b/crates/gfm/tests/fixtures/spec_600.md new file mode 100644 index 0000000..c194be6 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_600.md @@ -0,0 +1,10 @@ +Example 600 +...... + +![Foo] + +[foo]: /url "title" + +...... + +

Foo

diff --git a/crates/gfm/tests/fixtures/spec_601.md b/crates/gfm/tests/fixtures/spec_601.md new file mode 100644 index 0000000..5fa64d5 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_601.md @@ -0,0 +1,10 @@ +Example 601 +...... + +!\[foo] + +[foo]: /url "title" + +...... + +

![foo]

diff --git a/crates/gfm/tests/fixtures/spec_602.md b/crates/gfm/tests/fixtures/spec_602.md new file mode 100644 index 0000000..d674ce3 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_602.md @@ -0,0 +1,10 @@ +Example 602 +...... + +\![foo] + +[foo]: /url "title" + +...... + +

!foo

diff --git a/crates/gfm/tests/fixtures/spec_603.md b/crates/gfm/tests/fixtures/spec_603.md new file mode 100644 index 0000000..897a966 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_603.md @@ -0,0 +1,8 @@ +Example 603 +...... + + + +...... + +

http://foo.bar.baz

diff --git a/crates/gfm/tests/fixtures/spec_604.md b/crates/gfm/tests/fixtures/spec_604.md new file mode 100644 index 0000000..660e486 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_604.md @@ -0,0 +1,8 @@ +Example 604 +...... + + + +...... + +

http://foo.bar.baz/test?q=hello&id=22&boolean

diff --git a/crates/gfm/tests/fixtures/spec_605.md b/crates/gfm/tests/fixtures/spec_605.md new file mode 100644 index 0000000..272b0be --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_605.md @@ -0,0 +1,8 @@ +Example 605 +...... + + + +...... + +

irc://foo.bar:2233/baz

diff --git a/crates/gfm/tests/fixtures/spec_606.md b/crates/gfm/tests/fixtures/spec_606.md new file mode 100644 index 0000000..fc59e54 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_606.md @@ -0,0 +1,8 @@ +Example 606 +...... + + + +...... + +

MAILTO:FOO@BAR.BAZ

diff --git a/crates/gfm/tests/fixtures/spec_607.md b/crates/gfm/tests/fixtures/spec_607.md new file mode 100644 index 0000000..da8f84b --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_607.md @@ -0,0 +1,8 @@ +Example 607 +...... + + + +...... + +

a+b+c:d

diff --git a/crates/gfm/tests/fixtures/spec_608.md b/crates/gfm/tests/fixtures/spec_608.md new file mode 100644 index 0000000..c9aa500 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_608.md @@ -0,0 +1,8 @@ +Example 608 +...... + + + +...... + +

made-up-scheme://foo,bar

diff --git a/crates/gfm/tests/fixtures/spec_609.md b/crates/gfm/tests/fixtures/spec_609.md new file mode 100644 index 0000000..183bc57 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_609.md @@ -0,0 +1,8 @@ +Example 609 +...... + + + +...... + +

http://../

diff --git a/crates/gfm/tests/fixtures/spec_610.md b/crates/gfm/tests/fixtures/spec_610.md new file mode 100644 index 0000000..0bd2a33 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_610.md @@ -0,0 +1,8 @@ +Example 610 +...... + + + +...... + +

localhost:5001/foo

diff --git a/crates/gfm/tests/fixtures/spec_611.md b/crates/gfm/tests/fixtures/spec_611.md new file mode 100644 index 0000000..1a3f5c3 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_611.md @@ -0,0 +1,8 @@ +Example 611 +...... + + + +...... + +

<http://foo.bar/baz bim>

diff --git a/crates/gfm/tests/fixtures/spec_612.md b/crates/gfm/tests/fixtures/spec_612.md new file mode 100644 index 0000000..f918c8b --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_612.md @@ -0,0 +1,8 @@ +Example 612 +...... + + + +...... + +

http://example.com/\[\

diff --git a/crates/gfm/tests/fixtures/spec_613.md b/crates/gfm/tests/fixtures/spec_613.md new file mode 100644 index 0000000..fcfcadd --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_613.md @@ -0,0 +1,8 @@ +Example 613 +...... + + + +...... + +

foo@bar.example.com

diff --git a/crates/gfm/tests/fixtures/spec_614.md b/crates/gfm/tests/fixtures/spec_614.md new file mode 100644 index 0000000..4512577 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_614.md @@ -0,0 +1,8 @@ +Example 614 +...... + + + +...... + +

foo+special@Bar.baz-bar0.com

diff --git a/crates/gfm/tests/fixtures/spec_615.md b/crates/gfm/tests/fixtures/spec_615.md new file mode 100644 index 0000000..7044bea --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_615.md @@ -0,0 +1,8 @@ +Example 615 +...... + + + +...... + +

<foo+@bar.example.com>

diff --git a/crates/gfm/tests/fixtures/spec_616.md b/crates/gfm/tests/fixtures/spec_616.md new file mode 100644 index 0000000..05ea8ed --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_616.md @@ -0,0 +1,8 @@ +Example 616 +...... + +<> + +...... + +

<>

diff --git a/crates/gfm/tests/fixtures/spec_618.md b/crates/gfm/tests/fixtures/spec_618.md new file mode 100644 index 0000000..4d6b80e --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_618.md @@ -0,0 +1,8 @@ +Example 618 +...... + + + +...... + +

<m:abc>

diff --git a/crates/gfm/tests/fixtures/spec_619.md b/crates/gfm/tests/fixtures/spec_619.md new file mode 100644 index 0000000..f060d04 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_619.md @@ -0,0 +1,8 @@ +Example 619 +...... + + + +...... + +

<foo.bar.baz>

diff --git a/crates/gfm/tests/fixtures/spec_622.md b/crates/gfm/tests/fixtures/spec_622.md new file mode 100644 index 0000000..e0ad1a1 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_622.md @@ -0,0 +1,8 @@ +Example 622 +...... + +www.commonmark.org + +...... + +

www.commonmark.org

diff --git a/crates/gfm/tests/fixtures/spec_623.md b/crates/gfm/tests/fixtures/spec_623.md new file mode 100644 index 0000000..9226549 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_623.md @@ -0,0 +1,8 @@ +Example 623 +...... + +Visit www.commonmark.org/help for more information. + +...... + +

Visit www.commonmark.org/help for more information.

diff --git a/crates/gfm/tests/fixtures/spec_624.md b/crates/gfm/tests/fixtures/spec_624.md new file mode 100644 index 0000000..3947743 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_624.md @@ -0,0 +1,11 @@ +Example 624 +...... + +Visit www.commonmark.org. + +Visit www.commonmark.org/a.b. + +...... + +

Visit www.commonmark.org.

+

Visit www.commonmark.org/a.b.

diff --git a/crates/gfm/tests/fixtures/spec_625.md b/crates/gfm/tests/fixtures/spec_625.md new file mode 100644 index 0000000..f1b25bb --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_625.md @@ -0,0 +1,17 @@ +Example 625 +...... + +www.google.com/search?q=Markup+(business) + +www.google.com/search?q=Markup+(business))) + +(www.google.com/search?q=Markup+(business)) + +(www.google.com/search?q=Markup+(business) + +...... + +

www.google.com/search?q=Markup+(business)

+

www.google.com/search?q=Markup+(business)))

+

(www.google.com/search?q=Markup+(business))

+

(www.google.com/search?q=Markup+(business)

diff --git a/crates/gfm/tests/fixtures/spec_626.md b/crates/gfm/tests/fixtures/spec_626.md new file mode 100644 index 0000000..2a547c6 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_626.md @@ -0,0 +1,8 @@ +Example 626 +...... + +www.google.com/search?q=(business))+ok + +...... + +

www.google.com/search?q=(business))+ok

diff --git a/crates/gfm/tests/fixtures/spec_627.md b/crates/gfm/tests/fixtures/spec_627.md new file mode 100644 index 0000000..698d0fb --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_627.md @@ -0,0 +1,11 @@ +Example 627 +...... + +www.google.com/search?q=commonmark&hl=en + +www.google.com/search?q=commonmark&hl; + +...... + +

www.google.com/search?q=commonmark&hl=en

+

www.google.com/search?q=commonmark&hl;

diff --git a/crates/gfm/tests/fixtures/spec_628.md b/crates/gfm/tests/fixtures/spec_628.md new file mode 100644 index 0000000..daa159e --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_628.md @@ -0,0 +1,8 @@ +Example 628 +...... + +www.commonmark.org/hewww.commonmark.org/he<lp

diff --git a/crates/gfm/tests/fixtures/spec_629.md b/crates/gfm/tests/fixtures/spec_629.md new file mode 100644 index 0000000..0b46102 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_629.md @@ -0,0 +1,11 @@ +Example 629 +...... + +http://commonmark.org + +(Visit https://encrypted.google.com/search?q=Markup+(business)) + +...... + +

http://commonmark.org

+

(Visit https://encrypted.google.com/search?q=Markup+(business))

diff --git a/crates/gfm/tests/fixtures/spec_630.md b/crates/gfm/tests/fixtures/spec_630.md new file mode 100644 index 0000000..bbfab21 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_630.md @@ -0,0 +1,8 @@ +Example 630 +...... + +foo@bar.baz + +...... + +

foo@bar.baz

diff --git a/crates/gfm/tests/fixtures/spec_631.md b/crates/gfm/tests/fixtures/spec_631.md new file mode 100644 index 0000000..cf26fe8 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_631.md @@ -0,0 +1,8 @@ +Example 631 +...... + +hello@mail+xyz.example isn't valid, but hello+xyz@mail.example is. + +...... + +

hello@mail+xyz.example isn't valid, but hello+xyz@mail.example is.

diff --git a/crates/gfm/tests/fixtures/spec_633.md b/crates/gfm/tests/fixtures/spec_633.md new file mode 100644 index 0000000..67429f8 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_633.md @@ -0,0 +1,29 @@ +Example 633 +...... + +mailto:foo@bar.baz + +mailto:a.b-c_d@a.b + +mailto:a.b-c_d@a.b. + +mailto:a.b-c_d@a.b/ + +mailto:a.b-c_d@a.b- + +mailto:a.b-c_d@a.b_ + +xmpp:foo@bar.baz + +xmpp:foo@bar.baz. + +...... + +

mailto:foo@bar.baz

+

mailto:a.b-c_d@a.b

+

mailto:a.b-c_d@a.b.

+

mailto:a.b-c_d@a.b/

+

mailto:a.b-c_d@a.b-

+

mailto:a.b-c_d@a.b_

+

xmpp:foo@bar.baz

+

xmpp:foo@bar.baz.

diff --git a/crates/gfm/tests/fixtures/spec_634.md b/crates/gfm/tests/fixtures/spec_634.md new file mode 100644 index 0000000..584b3c7 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_634.md @@ -0,0 +1,14 @@ +Example 634 +...... + +xmpp:foo@bar.baz/txt + +xmpp:foo@bar.baz/txt@bin + +xmpp:foo@bar.baz/txt@bin.com + +...... + +

xmpp:foo@bar.baz/txt

+

xmpp:foo@bar.baz/txt@bin

+

xmpp:foo@bar.baz/txt@bin.com

diff --git a/crates/gfm/tests/fixtures/spec_635.md b/crates/gfm/tests/fixtures/spec_635.md new file mode 100644 index 0000000..956c5b0 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_635.md @@ -0,0 +1,8 @@ +Example 635 +...... + +xmpp:foo@bar.baz/txt/bin + +...... + +

xmpp:foo@bar.baz/txt/bin

diff --git a/crates/gfm/tests/fixtures/spec_636.md b/crates/gfm/tests/fixtures/spec_636.md new file mode 100644 index 0000000..a3ff56e --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_636.md @@ -0,0 +1,8 @@ +Example 636 +...... + + + +...... + +

diff --git a/crates/gfm/tests/fixtures/spec_637.md b/crates/gfm/tests/fixtures/spec_637.md new file mode 100644 index 0000000..5839550 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_637.md @@ -0,0 +1,8 @@ +Example 637 +...... + + + +...... + +

diff --git a/crates/gfm/tests/fixtures/spec_638.md b/crates/gfm/tests/fixtures/spec_638.md new file mode 100644 index 0000000..9641d2c --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_638.md @@ -0,0 +1,10 @@ +Example 638 +...... + + + +...... + +

diff --git a/crates/gfm/tests/fixtures/spec_639.md b/crates/gfm/tests/fixtures/spec_639.md new file mode 100644 index 0000000..4fc14fc --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_639.md @@ -0,0 +1,10 @@ +Example 639 +...... + + + +...... + +

diff --git a/crates/gfm/tests/fixtures/spec_640.md b/crates/gfm/tests/fixtures/spec_640.md new file mode 100644 index 0000000..d2d64d9 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_640.md @@ -0,0 +1,8 @@ +Example 640 +...... + +Foo + +...... + +

Foo

diff --git a/crates/gfm/tests/fixtures/spec_641.md b/crates/gfm/tests/fixtures/spec_641.md new file mode 100644 index 0000000..c066eab --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_641.md @@ -0,0 +1,8 @@ +Example 641 +...... + +<33> <__> + +...... + +

<33> <__>

diff --git a/crates/gfm/tests/fixtures/spec_642.md b/crates/gfm/tests/fixtures/spec_642.md new file mode 100644 index 0000000..f90c264 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_642.md @@ -0,0 +1,8 @@ +Example 642 +...... + +
+ +...... + +

<a h*#ref="hi">

diff --git a/crates/gfm/tests/fixtures/spec_643.md b/crates/gfm/tests/fixtures/spec_643.md new file mode 100644 index 0000000..9f90f4e --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_643.md @@ -0,0 +1,8 @@ +Example 643 +...... + +
+ +...... + +

</a href="foo">

diff --git a/crates/gfm/tests/fixtures/spec_648.md b/crates/gfm/tests/fixtures/spec_648.md new file mode 100644 index 0000000..964f179 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_648.md @@ -0,0 +1,10 @@ +Example 648 +...... + +foo + +...... + +

foo

diff --git a/crates/gfm/tests/fixtures/spec_649.md b/crates/gfm/tests/fixtures/spec_649.md new file mode 100644 index 0000000..8c6911f --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_649.md @@ -0,0 +1,8 @@ +Example 649 +...... + +foo + +...... + +

foo <!-- not a comment -- two hyphens -->

diff --git a/crates/gfm/tests/fixtures/spec_650.md b/crates/gfm/tests/fixtures/spec_650.md new file mode 100644 index 0000000..f6cbaaf --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_650.md @@ -0,0 +1,11 @@ +Example 650 +...... + +foo foo --> + +foo + +...... + +

foo <!--> foo -->

+

foo <!-- foo--->

diff --git a/crates/gfm/tests/fixtures/spec_651.md b/crates/gfm/tests/fixtures/spec_651.md new file mode 100644 index 0000000..ae97300 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_651.md @@ -0,0 +1,8 @@ +Example 651 +...... + +foo + +...... + +

foo

diff --git a/crates/gfm/tests/fixtures/spec_652.md b/crates/gfm/tests/fixtures/spec_652.md new file mode 100644 index 0000000..7fcc064 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_652.md @@ -0,0 +1,8 @@ +Example 652 +...... + +foo + +...... + +

foo

diff --git a/crates/gfm/tests/fixtures/spec_653.md b/crates/gfm/tests/fixtures/spec_653.md new file mode 100644 index 0000000..698e372 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_653.md @@ -0,0 +1,8 @@ +Example 653 +...... + +foo &<]]> + +...... + +

foo &<]]>

diff --git a/crates/gfm/tests/fixtures/spec_654.md b/crates/gfm/tests/fixtures/spec_654.md new file mode 100644 index 0000000..266f8fa --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_654.md @@ -0,0 +1,8 @@ +Example 654 +...... + +foo
+ +...... + +

foo

diff --git a/crates/gfm/tests/fixtures/spec_655.md b/crates/gfm/tests/fixtures/spec_655.md new file mode 100644 index 0000000..e54edc7 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_655.md @@ -0,0 +1,8 @@ +Example 655 +...... + +foo + +...... + +

foo

diff --git a/crates/gfm/tests/fixtures/spec_656.md b/crates/gfm/tests/fixtures/spec_656.md new file mode 100644 index 0000000..01fb78c --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_656.md @@ -0,0 +1,8 @@ +Example 656 +...... + + + +...... + +

<a href=""">

diff --git a/crates/gfm/tests/fixtures/spec_657.md b/crates/gfm/tests/fixtures/spec_657.md new file mode 100644 index 0000000..0377809 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_657.md @@ -0,0 +1,15 @@ +Example 657 +...... + + <style> <em> + +<blockquote> + <xmp> is disallowed. <XMP> is also disallowed. +</blockquote> + +...... + +<p><strong> <title> <style> <em></p> +<blockquote> + <xmp> is disallowed. <XMP> is also disallowed. +</blockquote> diff --git a/crates/gfm/tests/fixtures/spec_658.md b/crates/gfm/tests/fixtures/spec_658.md new file mode 100644 index 0000000..dadc11d --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_658.md @@ -0,0 +1,10 @@ +Example 658 +...... + +foo +baz + +...... + +<p>foo<br /> +baz</p> diff --git a/crates/gfm/tests/fixtures/spec_659.md b/crates/gfm/tests/fixtures/spec_659.md new file mode 100644 index 0000000..24c2e95 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_659.md @@ -0,0 +1,10 @@ +Example 659 +...... + +foo\ +baz + +...... + +<p>foo<br /> +baz</p> diff --git a/crates/gfm/tests/fixtures/spec_660.md b/crates/gfm/tests/fixtures/spec_660.md new file mode 100644 index 0000000..460e2de --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_660.md @@ -0,0 +1,10 @@ +Example 660 +...... + +foo +baz + +...... + +<p>foo<br /> +baz</p> diff --git a/crates/gfm/tests/fixtures/spec_661.md b/crates/gfm/tests/fixtures/spec_661.md new file mode 100644 index 0000000..399ab45 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_661.md @@ -0,0 +1,10 @@ +Example 661 +...... + +foo + bar + +...... + +<p>foo<br /> +bar</p> diff --git a/crates/gfm/tests/fixtures/spec_662.md b/crates/gfm/tests/fixtures/spec_662.md new file mode 100644 index 0000000..8957188 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_662.md @@ -0,0 +1,10 @@ +Example 662 +...... + +foo\ + bar + +...... + +<p>foo<br /> +bar</p> diff --git a/crates/gfm/tests/fixtures/spec_663.md b/crates/gfm/tests/fixtures/spec_663.md new file mode 100644 index 0000000..d21d485 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_663.md @@ -0,0 +1,10 @@ +Example 663 +...... + +*foo +bar* + +...... + +<p><em>foo<br /> +bar</em></p> diff --git a/crates/gfm/tests/fixtures/spec_664.md b/crates/gfm/tests/fixtures/spec_664.md new file mode 100644 index 0000000..cbb0536 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_664.md @@ -0,0 +1,10 @@ +Example 664 +...... + +*foo\ +bar* + +...... + +<p><em>foo<br /> +bar</em></p> diff --git a/crates/gfm/tests/fixtures/spec_665.md b/crates/gfm/tests/fixtures/spec_665.md new file mode 100644 index 0000000..c5f3932 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_665.md @@ -0,0 +1,9 @@ +Example 665 +...... + +`code +span` + +...... + +<p><code>code span</code></p> diff --git a/crates/gfm/tests/fixtures/spec_666.md b/crates/gfm/tests/fixtures/spec_666.md new file mode 100644 index 0000000..bc8b262 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_666.md @@ -0,0 +1,9 @@ +Example 666 +...... + +`code\ +span` + +...... + +<p><code>code\ span</code></p> diff --git a/crates/gfm/tests/fixtures/spec_667.md b/crates/gfm/tests/fixtures/spec_667.md new file mode 100644 index 0000000..a490dea --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_667.md @@ -0,0 +1,10 @@ +Example 667 +...... + +<a href="foo +bar"> + +...... + +<p><a href="foo +bar"></p> diff --git a/crates/gfm/tests/fixtures/spec_668.md b/crates/gfm/tests/fixtures/spec_668.md new file mode 100644 index 0000000..04e683f --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_668.md @@ -0,0 +1,10 @@ +Example 668 +...... + +<a href="foo\ +bar"> + +...... + +<p><a href="foo\ +bar"></p> diff --git a/crates/gfm/tests/fixtures/spec_669.md b/crates/gfm/tests/fixtures/spec_669.md new file mode 100644 index 0000000..efa26e1 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_669.md @@ -0,0 +1,8 @@ +Example 669 +...... + +foo\ + +...... + +<p>foo\</p> diff --git a/crates/gfm/tests/fixtures/spec_670.md b/crates/gfm/tests/fixtures/spec_670.md new file mode 100644 index 0000000..b5aa0ee --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_670.md @@ -0,0 +1,8 @@ +Example 670 +...... + +foo + +...... + +<p>foo</p> diff --git a/crates/gfm/tests/fixtures/spec_671.md b/crates/gfm/tests/fixtures/spec_671.md new file mode 100644 index 0000000..e78e7d1 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_671.md @@ -0,0 +1,8 @@ +Example 671 +...... + +### foo\ + +...... + +<h3>foo\</h3> diff --git a/crates/gfm/tests/fixtures/spec_672.md b/crates/gfm/tests/fixtures/spec_672.md new file mode 100644 index 0000000..04d4631 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_672.md @@ -0,0 +1,8 @@ +Example 672 +...... + +### foo + +...... + +<h3>foo</h3> diff --git a/crates/gfm/tests/fixtures/spec_673.md b/crates/gfm/tests/fixtures/spec_673.md new file mode 100644 index 0000000..b3f739b --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_673.md @@ -0,0 +1,10 @@ +Example 673 +...... + +foo +baz + +...... + +<p>foo +baz</p> diff --git a/crates/gfm/tests/fixtures/spec_674.md b/crates/gfm/tests/fixtures/spec_674.md new file mode 100644 index 0000000..f5b145b --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_674.md @@ -0,0 +1,10 @@ +Example 674 +...... + +foo + baz + +...... + +<p>foo +baz</p> diff --git a/crates/gfm/tests/fixtures/spec_675.md b/crates/gfm/tests/fixtures/spec_675.md new file mode 100644 index 0000000..c9f779e --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_675.md @@ -0,0 +1,8 @@ +Example 675 +...... + +hello $.;'there + +...... + +<p>hello $.;'there</p> diff --git a/crates/gfm/tests/fixtures/spec_676.md b/crates/gfm/tests/fixtures/spec_676.md new file mode 100644 index 0000000..d28dba1 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_676.md @@ -0,0 +1,8 @@ +Example 676 +...... + +Foo χρῆν + +...... + +<p>Foo χρῆν</p> diff --git a/crates/gfm/tests/fixtures/spec_677.md b/crates/gfm/tests/fixtures/spec_677.md new file mode 100644 index 0000000..9312092 --- /dev/null +++ b/crates/gfm/tests/fixtures/spec_677.md @@ -0,0 +1,8 @@ +Example 677 +...... + +Multiple spaces + +...... + +<p>Multiple spaces</p> diff --git a/crates/gfm/tests/gen_fixtures.py b/crates/gfm/tests/gen_fixtures.py new file mode 100644 index 0000000..240b4e0 --- /dev/null +++ b/crates/gfm/tests/gen_fixtures.py @@ -0,0 +1,42 @@ +"""Simple script to generate the separate test fixtures from the full spec.txt file. + +From: https://github.com/github/cmark-gfm/blob/master/test/spec.txt + +Note: https://github.com/github/cmark-gfm/issues/288 +""" +from pathlib import Path +import re + +if __name__ == "__main__": + spec = (Path(__file__).parent / "spec.txt").read_text("utf8").splitlines() + tests = [] + pat = re.compile(r"^[`]{3,}\s*example") + while spec: + line = spec.pop(0) + if pat.match(line): + line = spec.pop(0) + md, html = [], [] + in_md = True + while not line.startswith("`" * 10): + if line == ".": + in_md = False + line = spec.pop(0) + continue + if in_md: + md.append(line) + else: + html.append(line) + line = spec.pop(0) + assert not in_md + tests.append((md, html)) + + for i, (md, html) in enumerate(tests, 1): + (Path(__file__).parent / "fixtures").mkdir(exist_ok=True) + filename = f"spec_{i:03}.md" + if i in (491, 617, 620, 621): + # these examples clash with the GFM extensions + continue + md_text = '\n'.join(md) + html_text = '\n'.join(html) + text = f"Example {i}\n......\n\n{md_text}\n\n......\n\n{html_text}\n" + (Path(__file__).parent / "fixtures" / filename).write_text(text, "utf8") diff --git a/crates/gfm/tests/spec.txt b/crates/gfm/tests/spec.txt new file mode 100644 index 0000000..4d11fe2 --- /dev/null +++ b/crates/gfm/tests/spec.txt @@ -0,0 +1,10281 @@ +--- +title: GitHub Flavored Markdown Spec +version: 0.29 +date: '2019-04-06' +license: '[CC-BY-SA 4.0](http://creativecommons.org/licenses/by-sa/4.0/)' +... + +# Introduction + +## What is GitHub Flavored Markdown? + +GitHub Flavored Markdown, often shortened as GFM, is the dialect of Markdown +that is currently supported for user content on GitHub.com and GitHub +Enterprise. + +This formal specification, based on the CommonMark Spec, defines the syntax and +semantics of this dialect. + +GFM is a strict superset of CommonMark. All the features which are supported in +GitHub user content and that are not specified on the original CommonMark Spec +are hence known as **extensions**, and highlighted as such. + +While GFM supports a wide range of inputs, it's worth noting that GitHub.com +and GitHub Enterprise perform additional post-processing and sanitization after +GFM is converted to HTML to ensure security and consistency of the website. + +## What is Markdown? + +Markdown is a plain text format for writing structured documents, +based on conventions for indicating formatting in email +and usenet posts. It was developed by John Gruber (with +help from Aaron Swartz) and released in 2004 in the form of a +[syntax description](http://daringfireball.net/projects/markdown/syntax) +and a Perl script (`Markdown.pl`) for converting Markdown to +HTML. In the next decade, dozens of implementations were +developed in many languages. Some extended the original +Markdown syntax with conventions for footnotes, tables, and +other document elements. Some allowed Markdown documents to be +rendered in formats other than HTML. Websites like Reddit, +StackOverflow, and GitHub had millions of people using Markdown. +And Markdown started to be used beyond the web, to author books, +articles, slide shows, letters, and lecture notes. + +What distinguishes Markdown from many other lightweight markup +syntaxes, which are often easier to write, is its readability. +As Gruber writes: + +> The overriding design goal for Markdown's formatting syntax is +> to make it as readable as possible. The idea is that a +> Markdown-formatted document should be publishable as-is, as +> plain text, without looking like it's been marked up with tags +> or formatting instructions. +> (<http://daringfireball.net/projects/markdown/>) + +The point can be illustrated by comparing a sample of +[AsciiDoc](http://www.methods.co.nz/asciidoc/) with +an equivalent sample of Markdown. Here is a sample of +AsciiDoc from the AsciiDoc manual: + +``` +1. List item one. ++ +List item one continued with a second paragraph followed by an +Indented block. ++ +................. +$ ls *.sh +$ mv *.sh ~/tmp +................. ++ +List item continued with a third paragraph. + +2. List item two continued with an open block. ++ +-- +This paragraph is part of the preceding list item. + +a. This list is nested and does not require explicit item +continuation. ++ +This paragraph is part of the preceding list item. + +b. List item b. + +This paragraph belongs to item two of the outer list. +-- +``` + +And here is the equivalent in Markdown: +``` +1. List item one. + + List item one continued with a second paragraph followed by an + Indented block. + + $ ls *.sh + $ mv *.sh ~/tmp + + List item continued with a third paragraph. + +2. List item two continued with an open block. + + This paragraph is part of the preceding list item. + + 1. This list is nested and does not require explicit item continuation. + + This paragraph is part of the preceding list item. + + 2. List item b. + + This paragraph belongs to item two of the outer list. +``` + +The AsciiDoc version is, arguably, easier to write. You don't need +to worry about indentation. But the Markdown version is much easier +to read. The nesting of list items is apparent to the eye in the +source, not just in the processed document. + +## Why is a spec needed? + +John Gruber's [canonical description of Markdown's +syntax](http://daringfireball.net/projects/markdown/syntax) +does not specify the syntax unambiguously. Here are some examples of +questions it does not answer: + +1. How much indentation is needed for a sublist? The spec says that + continuation paragraphs need to be indented four spaces, but is + not fully explicit about sublists. It is natural to think that + they, too, must be indented four spaces, but `Markdown.pl` does + not require that. This is hardly a "corner case," and divergences + between implementations on this issue often lead to surprises for + users in real documents. (See [this comment by John + Gruber](http://article.gmane.org/gmane.text.markdown.general/1997).) + +2. Is a blank line needed before a block quote or heading? + Most implementations do not require the blank line. However, + this can lead to unexpected results in hard-wrapped text, and + also to ambiguities in parsing (note that some implementations + put the heading inside the blockquote, while others do not). + (John Gruber has also spoken [in favor of requiring the blank + lines](http://article.gmane.org/gmane.text.markdown.general/2146).) + +3. Is a blank line needed before an indented code block? + (`Markdown.pl` requires it, but this is not mentioned in the + documentation, and some implementations do not require it.) + + ``` markdown + paragraph + code? + ``` + +4. What is the exact rule for determining when list items get + wrapped in `<p>` tags? Can a list be partially "loose" and partially + "tight"? What should we do with a list like this? + + ``` markdown + 1. one + + 2. two + 3. three + ``` + + Or this? + + ``` markdown + 1. one + - a + + - b + 2. two + ``` + + (There are some relevant comments by John Gruber + [here](http://article.gmane.org/gmane.text.markdown.general/2554).) + +5. Can list markers be indented? Can ordered list markers be right-aligned? + + ``` markdown + 8. item 1 + 9. item 2 + 10. item 2a + ``` + +6. Is this one list with a thematic break in its second item, + or two lists separated by a thematic break? + + ``` markdown + * a + * * * * * + * b + ``` + +7. When list markers change from numbers to bullets, do we have + two lists or one? (The Markdown syntax description suggests two, + but the perl scripts and many other implementations produce one.) + + ``` markdown + 1. fee + 2. fie + - foe + - fum + ``` + +8. What are the precedence rules for the markers of inline structure? + For example, is the following a valid link, or does the code span + take precedence ? + + ``` markdown + [a backtick (`)](/url) and [another backtick (`)](/url). + ``` + +9. What are the precedence rules for markers of emphasis and strong + emphasis? For example, how should the following be parsed? + + ``` markdown + *foo *bar* baz* + ``` + +10. What are the precedence rules between block-level and inline-level + structure? For example, how should the following be parsed? + + ``` markdown + - `a long code span can contain a hyphen like this + - and it can screw things up` + ``` + +11. Can list items include section headings? (`Markdown.pl` does not + allow this, but does allow blockquotes to include headings.) + + ``` markdown + - # Heading + ``` + +12. Can list items be empty? + + ``` markdown + * a + * + * b + ``` + +13. Can link references be defined inside block quotes or list items? + + ``` markdown + > Blockquote [foo]. + > + > [foo]: /url + ``` + +14. If there are multiple definitions for the same reference, which takes + precedence? + + ``` markdown + [foo]: /url1 + [foo]: /url2 + + [foo][] + ``` + +In the absence of a spec, early implementers consulted `Markdown.pl` +to resolve these ambiguities. But `Markdown.pl` was quite buggy, and +gave manifestly bad results in many cases, so it was not a +satisfactory replacement for a spec. + +Because there is no unambiguous spec, implementations have diverged +considerably. As a result, users are often surprised to find that +a document that renders one way on one system (say, a GitHub wiki) +renders differently on another (say, converting to docbook using +pandoc). To make matters worse, because nothing in Markdown counts +as a "syntax error," the divergence often isn't discovered right away. + +## About this document + +This document attempts to specify Markdown syntax unambiguously. +It contains many examples with side-by-side Markdown and +HTML. These are intended to double as conformance tests. An +accompanying script `spec_tests.py` can be used to run the tests +against any Markdown program: + + python test/spec_tests.py --spec spec.txt --program PROGRAM + +Since this document describes how Markdown is to be parsed into +an abstract syntax tree, it would have made sense to use an abstract +representation of the syntax tree instead of HTML. But HTML is capable +of representing the structural distinctions we need to make, and the +choice of HTML for the tests makes it possible to run the tests against +an implementation without writing an abstract syntax tree renderer. + +This document is generated from a text file, `spec.txt`, written +in Markdown with a small extension for the side-by-side tests. +The script `tools/makespec.py` can be used to convert `spec.txt` into +HTML or CommonMark (which can then be converted into other formats). + +In the examples, the `→` character is used to represent tabs. + +# Preliminaries + +## Characters and lines + +Any sequence of [characters] is a valid CommonMark +document. + +A [character](@) is a Unicode code point. Although some +code points (for example, combining accents) do not correspond to +characters in an intuitive sense, all code points count as characters +for purposes of this spec. + +This spec does not specify an encoding; it thinks of lines as composed +of [characters] rather than bytes. A conforming parser may be limited +to a certain encoding. + +A [line](@) is a sequence of zero or more [characters] +other than newline (`U+000A`) or carriage return (`U+000D`), +followed by a [line ending] or by the end of file. + +A [line ending](@) is a newline (`U+000A`), a carriage return +(`U+000D`) not followed by a newline, or a carriage return and a +following newline. + +A line containing no characters, or a line containing only spaces +(`U+0020`) or tabs (`U+0009`), is called a [blank line](@). + +The following definitions of character classes will be used in this spec: + +A [whitespace character](@) is a space +(`U+0020`), tab (`U+0009`), newline (`U+000A`), line tabulation (`U+000B`), +form feed (`U+000C`), or carriage return (`U+000D`). + +[Whitespace](@) is a sequence of one or more [whitespace +characters]. + +A [Unicode whitespace character](@) is +any code point in the Unicode `Zs` general category, or a tab (`U+0009`), +carriage return (`U+000D`), newline (`U+000A`), or form feed +(`U+000C`). + +[Unicode whitespace](@) is a sequence of one +or more [Unicode whitespace characters]. + +A [space](@) is `U+0020`. + +A [non-whitespace character](@) is any character +that is not a [whitespace character]. + +An [ASCII punctuation character](@) +is `!`, `"`, `#`, `$`, `%`, `&`, `'`, `(`, `)`, +`*`, `+`, `,`, `-`, `.`, `/` (U+0021–2F), +`:`, `;`, `<`, `=`, `>`, `?`, `@` (U+003A–0040), +`[`, `\`, `]`, `^`, `_`, `` ` `` (U+005B–0060), +`{`, `|`, `}`, or `~` (U+007B–007E). + +A [punctuation character](@) is an [ASCII +punctuation character] or anything in +the general Unicode categories `Pc`, `Pd`, `Pe`, `Pf`, `Pi`, `Po`, or `Ps`. + +## Tabs + +Tabs in lines are not expanded to [spaces]. However, +in contexts where whitespace helps to define block structure, +tabs behave as if they were replaced by spaces with a tab stop +of 4 characters. + +Thus, for example, a tab can be used instead of four spaces +in an indented code block. (Note, however, that internal +tabs are passed through as literal tabs, not expanded to +spaces.) + +```````````````````````````````` example + foo baz bim +. +<pre><code>foo baz bim +</code></pre> +```````````````````````````````` + +```````````````````````````````` example + foo baz bim +. +<pre><code>foo baz bim +</code></pre> +```````````````````````````````` + +```````````````````````````````` example + a a + ὐ a +. +<pre><code>a a +ὐ a +</code></pre> +```````````````````````````````` + +In the following example, a continuation paragraph of a list +item is indented with a tab; this has exactly the same effect +as indentation with four spaces would: + +```````````````````````````````` example + - foo + + bar +. +<ul> +<li> +<p>foo</p> +<p>bar</p> +</li> +</ul> +```````````````````````````````` + +```````````````````````````````` example +- foo + + bar +. +<ul> +<li> +<p>foo</p> +<pre><code> bar +</code></pre> +</li> +</ul> +```````````````````````````````` + +Normally the `>` that begins a block quote may be followed +optionally by a space, which is not considered part of the +content. In the following case `>` is followed by a tab, +which is treated as if it were expanded into three spaces. +Since one of these spaces is considered part of the +delimiter, `foo` is considered to be indented six spaces +inside the block quote context, so we get an indented +code block starting with two spaces. + +```````````````````````````````` example +> foo +. +<blockquote> +<pre><code> foo +</code></pre> +</blockquote> +```````````````````````````````` + +```````````````````````````````` example +- foo +. +<ul> +<li> +<pre><code> foo +</code></pre> +</li> +</ul> +```````````````````````````````` + + +```````````````````````````````` example + foo + bar +. +<pre><code>foo +bar +</code></pre> +```````````````````````````````` + +```````````````````````````````` example + - foo + - bar + - baz +. +<ul> +<li>foo +<ul> +<li>bar +<ul> +<li>baz</li> +</ul> +</li> +</ul> +</li> +</ul> +```````````````````````````````` + +```````````````````````````````` example +# Foo +. +<h1>Foo</h1> +```````````````````````````````` + +```````````````````````````````` example +* * * +. +<hr /> +```````````````````````````````` + + +## Insecure characters + +For security reasons, the Unicode character `U+0000` must be replaced +with the REPLACEMENT CHARACTER (`U+FFFD`). + +# Blocks and inlines + +We can think of a document as a sequence of +[blocks](@)---structural elements like paragraphs, block +quotations, lists, headings, rules, and code blocks. Some blocks (like +block quotes and list items) contain other blocks; others (like +headings and paragraphs) contain [inline](@) content---text, +links, emphasized text, images, code spans, and so on. + +## Precedence + +Indicators of block structure always take precedence over indicators +of inline structure. So, for example, the following is a list with +two items, not a list with one item containing a code span: + +```````````````````````````````` example +- `one +- two` +. +<ul> +<li>`one</li> +<li>two`</li> +</ul> +```````````````````````````````` + + +This means that parsing can proceed in two steps: first, the block +structure of the document can be discerned; second, text lines inside +paragraphs, headings, and other block constructs can be parsed for inline +structure. The second step requires information about link reference +definitions that will be available only at the end of the first +step. Note that the first step requires processing lines in sequence, +but the second can be parallelized, since the inline parsing of +one block element does not affect the inline parsing of any other. + +## Container blocks and leaf blocks + +We can divide blocks into two types: +[container blocks](@), +which can contain other blocks, and [leaf blocks](@), +which cannot. + +# Leaf blocks + +This section describes the different kinds of leaf block that make up a +Markdown document. + +## Thematic breaks + +A line consisting of 0-3 spaces of indentation, followed by a sequence +of three or more matching `-`, `_`, or `*` characters, each followed +optionally by any number of spaces or tabs, forms a +[thematic break](@). + +```````````````````````````````` example +*** +--- +___ +. +<hr /> +<hr /> +<hr /> +```````````````````````````````` + + +Wrong characters: + +```````````````````````````````` example ++++ +. +<p>+++</p> +```````````````````````````````` + + +```````````````````````````````` example +=== +. +<p>===</p> +```````````````````````````````` + + +Not enough characters: + +```````````````````````````````` example +-- +** +__ +. +<p>-- +** +__</p> +```````````````````````````````` + + +One to three spaces indent are allowed: + +```````````````````````````````` example + *** + *** + *** +. +<hr /> +<hr /> +<hr /> +```````````````````````````````` + + +Four spaces is too many: + +```````````````````````````````` example + *** +. +<pre><code>*** +</code></pre> +```````````````````````````````` + + +```````````````````````````````` example +Foo + *** +. +<p>Foo +***</p> +```````````````````````````````` + + +More than three characters may be used: + +```````````````````````````````` example +_____________________________________ +. +<hr /> +```````````````````````````````` + + +Spaces are allowed between the characters: + +```````````````````````````````` example + - - - +. +<hr /> +```````````````````````````````` + + +```````````````````````````````` example + ** * ** * ** * ** +. +<hr /> +```````````````````````````````` + + +```````````````````````````````` example +- - - - +. +<hr /> +```````````````````````````````` + + +Spaces are allowed at the end: + +```````````````````````````````` example +- - - - +. +<hr /> +```````````````````````````````` + + +However, no other characters may occur in the line: + +```````````````````````````````` example +_ _ _ _ a + +a------ + +---a--- +. +<p>_ _ _ _ a</p> +<p>a------</p> +<p>---a---</p> +```````````````````````````````` + + +It is required that all of the [non-whitespace characters] be the same. +So, this is not a thematic break: + +```````````````````````````````` example + *-* +. +<p><em>-</em></p> +```````````````````````````````` + + +Thematic breaks do not need blank lines before or after: + +```````````````````````````````` example +- foo +*** +- bar +. +<ul> +<li>foo</li> +</ul> +<hr /> +<ul> +<li>bar</li> +</ul> +```````````````````````````````` + + +Thematic breaks can interrupt a paragraph: + +```````````````````````````````` example +Foo +*** +bar +. +<p>Foo</p> +<hr /> +<p>bar</p> +```````````````````````````````` + + +If a line of dashes that meets the above conditions for being a +thematic break could also be interpreted as the underline of a [setext +heading], the interpretation as a +[setext heading] takes precedence. Thus, for example, +this is a setext heading, not a paragraph followed by a thematic break: + +```````````````````````````````` example +Foo +--- +bar +. +<h2>Foo</h2> +<p>bar</p> +```````````````````````````````` + + +When both a thematic break and a list item are possible +interpretations of a line, the thematic break takes precedence: + +```````````````````````````````` example +* Foo +* * * +* Bar +. +<ul> +<li>Foo</li> +</ul> +<hr /> +<ul> +<li>Bar</li> +</ul> +```````````````````````````````` + + +If you want a thematic break in a list item, use a different bullet: + +```````````````````````````````` example +- Foo +- * * * +. +<ul> +<li>Foo</li> +<li> +<hr /> +</li> +</ul> +```````````````````````````````` + + +## ATX headings + +An [ATX heading](@) +consists of a string of characters, parsed as inline content, between an +opening sequence of 1--6 unescaped `#` characters and an optional +closing sequence of any number of unescaped `#` characters. +The opening sequence of `#` characters must be followed by a +[space] or by the end of line. The optional closing sequence of `#`s must be +preceded by a [space] and may be followed by spaces only. The opening +`#` character may be indented 0-3 spaces. The raw contents of the +heading are stripped of leading and trailing spaces before being parsed +as inline content. The heading level is equal to the number of `#` +characters in the opening sequence. + +Simple headings: + +```````````````````````````````` example +# foo +## foo +### foo +#### foo +##### foo +###### foo +. +<h1>foo</h1> +<h2>foo</h2> +<h3>foo</h3> +<h4>foo</h4> +<h5>foo</h5> +<h6>foo</h6> +```````````````````````````````` + + +More than six `#` characters is not a heading: + +```````````````````````````````` example +####### foo +. +<p>####### foo</p> +```````````````````````````````` + + +At least one space is required between the `#` characters and the +heading's contents, unless the heading is empty. Note that many +implementations currently do not require the space. However, the +space was required by the +[original ATX implementation](http://www.aaronsw.com/2002/atx/atx.py), +and it helps prevent things like the following from being parsed as +headings: + +```````````````````````````````` example +#5 bolt + +#hashtag +. +<p>#5 bolt</p> +<p>#hashtag</p> +```````````````````````````````` + + +This is not a heading, because the first `#` is escaped: + +```````````````````````````````` example +\## foo +. +<p>## foo</p> +```````````````````````````````` + + +Contents are parsed as inlines: + +```````````````````````````````` example +# foo *bar* \*baz\* +. +<h1>foo <em>bar</em> *baz*</h1> +```````````````````````````````` + + +Leading and trailing [whitespace] is ignored in parsing inline content: + +```````````````````````````````` example +# foo +. +<h1>foo</h1> +```````````````````````````````` + + +One to three spaces indentation are allowed: + +```````````````````````````````` example + ### foo + ## foo + # foo +. +<h3>foo</h3> +<h2>foo</h2> +<h1>foo</h1> +```````````````````````````````` + + +Four spaces are too much: + +```````````````````````````````` example + # foo +. +<pre><code># foo +</code></pre> +```````````````````````````````` + + +```````````````````````````````` example +foo + # bar +. +<p>foo +# bar</p> +```````````````````````````````` + + +A closing sequence of `#` characters is optional: + +```````````````````````````````` example +## foo ## + ### bar ### +. +<h2>foo</h2> +<h3>bar</h3> +```````````````````````````````` + + +It need not be the same length as the opening sequence: + +```````````````````````````````` example +# foo ################################## +##### foo ## +. +<h1>foo</h1> +<h5>foo</h5> +```````````````````````````````` + + +Spaces are allowed after the closing sequence: + +```````````````````````````````` example +### foo ### +. +<h3>foo</h3> +```````````````````````````````` + + +A sequence of `#` characters with anything but [spaces] following it +is not a closing sequence, but counts as part of the contents of the +heading: + +```````````````````````````````` example +### foo ### b +. +<h3>foo ### b</h3> +```````````````````````````````` + + +The closing sequence must be preceded by a space: + +```````````````````````````````` example +# foo# +. +<h1>foo#</h1> +```````````````````````````````` + + +Backslash-escaped `#` characters do not count as part +of the closing sequence: + +```````````````````````````````` example +### foo \### +## foo #\## +# foo \# +. +<h3>foo ###</h3> +<h2>foo ###</h2> +<h1>foo #</h1> +```````````````````````````````` + + +ATX headings need not be separated from surrounding content by blank +lines, and they can interrupt paragraphs: + +```````````````````````````````` example +**** +## foo +**** +. +<hr /> +<h2>foo</h2> +<hr /> +```````````````````````````````` + + +```````````````````````````````` example +Foo bar +# baz +Bar foo +. +<p>Foo bar</p> +<h1>baz</h1> +<p>Bar foo</p> +```````````````````````````````` + + +ATX headings can be empty: + +```````````````````````````````` example +## +# +### ### +. +<h2></h2> +<h1></h1> +<h3></h3> +```````````````````````````````` + + +## Setext headings + +A [setext heading](@) consists of one or more +lines of text, each containing at least one [non-whitespace +character], with no more than 3 spaces indentation, followed by +a [setext heading underline]. The lines of text must be such +that, were they not followed by the setext heading underline, +they would be interpreted as a paragraph: they cannot be +interpretable as a [code fence], [ATX heading][ATX headings], +[block quote][block quotes], [thematic break][thematic breaks], +[list item][list items], or [HTML block][HTML blocks]. + +A [setext heading underline](@) is a sequence of +`=` characters or a sequence of `-` characters, with no more than 3 +spaces indentation and any number of trailing spaces. If a line +containing a single `-` can be interpreted as an +empty [list items], it should be interpreted this way +and not as a [setext heading underline]. + +The heading is a level 1 heading if `=` characters are used in +the [setext heading underline], and a level 2 heading if `-` +characters are used. The contents of the heading are the result +of parsing the preceding lines of text as CommonMark inline +content. + +In general, a setext heading need not be preceded or followed by a +blank line. However, it cannot interrupt a paragraph, so when a +setext heading comes after a paragraph, a blank line is needed between +them. + +Simple examples: + +```````````````````````````````` example +Foo *bar* +========= + +Foo *bar* +--------- +. +<h1>Foo <em>bar</em></h1> +<h2>Foo <em>bar</em></h2> +```````````````````````````````` + + +The content of the header may span more than one line: + +```````````````````````````````` example +Foo *bar +baz* +==== +. +<h1>Foo <em>bar +baz</em></h1> +```````````````````````````````` + +The contents are the result of parsing the headings's raw +content as inlines. The heading's raw content is formed by +concatenating the lines and removing initial and final +[whitespace]. + +```````````````````````````````` example + Foo *bar +baz* +==== +. +<h1>Foo <em>bar +baz</em></h1> +```````````````````````````````` + + +The underlining can be any length: + +```````````````````````````````` example +Foo +------------------------- + +Foo += +. +<h2>Foo</h2> +<h1>Foo</h1> +```````````````````````````````` + + +The heading content can be indented up to three spaces, and need +not line up with the underlining: + +```````````````````````````````` example + Foo +--- + + Foo +----- + + Foo + === +. +<h2>Foo</h2> +<h2>Foo</h2> +<h1>Foo</h1> +```````````````````````````````` + + +Four spaces indent is too much: + +```````````````````````````````` example + Foo + --- + + Foo +--- +. +<pre><code>Foo +--- + +Foo +</code></pre> +<hr /> +```````````````````````````````` + + +The setext heading underline can be indented up to three spaces, and +may have trailing spaces: + +```````````````````````````````` example +Foo + ---- +. +<h2>Foo</h2> +```````````````````````````````` + + +Four spaces is too much: + +```````````````````````````````` example +Foo + --- +. +<p>Foo +---</p> +```````````````````````````````` + + +The setext heading underline cannot contain internal spaces: + +```````````````````````````````` example +Foo += = + +Foo +--- - +. +<p>Foo += =</p> +<p>Foo</p> +<hr /> +```````````````````````````````` + + +Trailing spaces in the content line do not cause a line break: + +```````````````````````````````` example +Foo +----- +. +<h2>Foo</h2> +```````````````````````````````` + + +Nor does a backslash at the end: + +```````````````````````````````` example +Foo\ +---- +. +<h2>Foo\</h2> +```````````````````````````````` + + +Since indicators of block structure take precedence over +indicators of inline structure, the following are setext headings: + +```````````````````````````````` example +`Foo +---- +` + +<a title="a lot +--- +of dashes"/> +. +<h2>`Foo</h2> +<p>`</p> +<h2><a title="a lot</h2> +<p>of dashes"/></p> +```````````````````````````````` + + +The setext heading underline cannot be a [lazy continuation +line] in a list item or block quote: + +```````````````````````````````` example +> Foo +--- +. +<blockquote> +<p>Foo</p> +</blockquote> +<hr /> +```````````````````````````````` + + +```````````````````````````````` example +> foo +bar +=== +. +<blockquote> +<p>foo +bar +===</p> +</blockquote> +```````````````````````````````` + + +```````````````````````````````` example +- Foo +--- +. +<ul> +<li>Foo</li> +</ul> +<hr /> +```````````````````````````````` + + +A blank line is needed between a paragraph and a following +setext heading, since otherwise the paragraph becomes part +of the heading's content: + +```````````````````````````````` example +Foo +Bar +--- +. +<h2>Foo +Bar</h2> +```````````````````````````````` + + +But in general a blank line is not required before or after +setext headings: + +```````````````````````````````` example +--- +Foo +--- +Bar +--- +Baz +. +<hr /> +<h2>Foo</h2> +<h2>Bar</h2> +<p>Baz</p> +```````````````````````````````` + + +Setext headings cannot be empty: + +```````````````````````````````` example + +==== +. +<p>====</p> +```````````````````````````````` + + +Setext heading text lines must not be interpretable as block +constructs other than paragraphs. So, the line of dashes +in these examples gets interpreted as a thematic break: + +```````````````````````````````` example +--- +--- +. +<hr /> +<hr /> +```````````````````````````````` + + +```````````````````````````````` example +- foo +----- +. +<ul> +<li>foo</li> +</ul> +<hr /> +```````````````````````````````` + + +```````````````````````````````` example + foo +--- +. +<pre><code>foo +</code></pre> +<hr /> +```````````````````````````````` + + +```````````````````````````````` example +> foo +----- +. +<blockquote> +<p>foo</p> +</blockquote> +<hr /> +```````````````````````````````` + + +If you want a heading with `> foo` as its literal text, you can +use backslash escapes: + +```````````````````````````````` example +\> foo +------ +. +<h2>> foo</h2> +```````````````````````````````` + + +**Compatibility note:** Most existing Markdown implementations +do not allow the text of setext headings to span multiple lines. +But there is no consensus about how to interpret + +``` markdown +Foo +bar +--- +baz +``` + +One can find four different interpretations: + +1. paragraph "Foo", heading "bar", paragraph "baz" +2. paragraph "Foo bar", thematic break, paragraph "baz" +3. paragraph "Foo bar --- baz" +4. heading "Foo bar", paragraph "baz" + +We find interpretation 4 most natural, and interpretation 4 +increases the expressive power of CommonMark, by allowing +multiline headings. Authors who want interpretation 1 can +put a blank line after the first paragraph: + +```````````````````````````````` example +Foo + +bar +--- +baz +. +<p>Foo</p> +<h2>bar</h2> +<p>baz</p> +```````````````````````````````` + + +Authors who want interpretation 2 can put blank lines around +the thematic break, + +```````````````````````````````` example +Foo +bar + +--- + +baz +. +<p>Foo +bar</p> +<hr /> +<p>baz</p> +```````````````````````````````` + + +or use a thematic break that cannot count as a [setext heading +underline], such as + +```````````````````````````````` example +Foo +bar +* * * +baz +. +<p>Foo +bar</p> +<hr /> +<p>baz</p> +```````````````````````````````` + + +Authors who want interpretation 3 can use backslash escapes: + +```````````````````````````````` example +Foo +bar +\--- +baz +. +<p>Foo +bar +--- +baz</p> +```````````````````````````````` + + +## Indented code blocks + +An [indented code block](@) is composed of one or more +[indented chunks] separated by blank lines. +An [indented chunk](@) is a sequence of non-blank lines, +each indented four or more spaces. The contents of the code block are +the literal contents of the lines, including trailing +[line endings], minus four spaces of indentation. +An indented code block has no [info string]. + +An indented code block cannot interrupt a paragraph, so there must be +a blank line between a paragraph and a following indented code block. +(A blank line is not needed, however, between a code block and a following +paragraph.) + +```````````````````````````````` example + a simple + indented code block +. +<pre><code>a simple + indented code block +</code></pre> +```````````````````````````````` + + +If there is any ambiguity between an interpretation of indentation +as a code block and as indicating that material belongs to a [list +item][list items], the list item interpretation takes precedence: + +```````````````````````````````` example + - foo + + bar +. +<ul> +<li> +<p>foo</p> +<p>bar</p> +</li> +</ul> +```````````````````````````````` + + +```````````````````````````````` example +1. foo + + - bar +. +<ol> +<li> +<p>foo</p> +<ul> +<li>bar</li> +</ul> +</li> +</ol> +```````````````````````````````` + + + +The contents of a code block are literal text, and do not get parsed +as Markdown: + +```````````````````````````````` example + <a/> + *hi* + + - one +. +<pre><code><a/> +*hi* + +- one +</code></pre> +```````````````````````````````` + + +Here we have three chunks separated by blank lines: + +```````````````````````````````` example + chunk1 + + chunk2 + + + + chunk3 +. +<pre><code>chunk1 + +chunk2 + + + +chunk3 +</code></pre> +```````````````````````````````` + + +Any initial spaces beyond four will be included in the content, even +in interior blank lines: + +```````````````````````````````` example + chunk1 + + chunk2 +. +<pre><code>chunk1 + + chunk2 +</code></pre> +```````````````````````````````` + + +An indented code block cannot interrupt a paragraph. (This +allows hanging indents and the like.) + +```````````````````````````````` example +Foo + bar + +. +<p>Foo +bar</p> +```````````````````````````````` + + +However, any non-blank line with fewer than four leading spaces ends +the code block immediately. So a paragraph may occur immediately +after indented code: + +```````````````````````````````` example + foo +bar +. +<pre><code>foo +</code></pre> +<p>bar</p> +```````````````````````````````` + + +And indented code can occur immediately before and after other kinds of +blocks: + +```````````````````````````````` example +# Heading + foo +Heading +------ + foo +---- +. +<h1>Heading</h1> +<pre><code>foo +</code></pre> +<h2>Heading</h2> +<pre><code>foo +</code></pre> +<hr /> +```````````````````````````````` + + +The first line can be indented more than four spaces: + +```````````````````````````````` example + foo + bar +. +<pre><code> foo +bar +</code></pre> +```````````````````````````````` + + +Blank lines preceding or following an indented code block +are not included in it: + +```````````````````````````````` example + + + foo + + +. +<pre><code>foo +</code></pre> +```````````````````````````````` + + +Trailing spaces are included in the code block's content: + +```````````````````````````````` example + foo +. +<pre><code>foo +</code></pre> +```````````````````````````````` + + + +## Fenced code blocks + +A [code fence](@) is a sequence +of at least three consecutive backtick characters (`` ` ``) or +tildes (`~`). (Tildes and backticks cannot be mixed.) +A [fenced code block](@) +begins with a code fence, indented no more than three spaces. + +The line with the opening code fence may optionally contain some text +following the code fence; this is trimmed of leading and trailing +whitespace and called the [info string](@). If the [info string] comes +after a backtick fence, it may not contain any backtick +characters. (The reason for this restriction is that otherwise +some inline code would be incorrectly interpreted as the +beginning of a fenced code block.) + +The content of the code block consists of all subsequent lines, until +a closing [code fence] of the same type as the code block +began with (backticks or tildes), and with at least as many backticks +or tildes as the opening code fence. If the leading code fence is +indented N spaces, then up to N spaces of indentation are removed from +each line of the content (if present). (If a content line is not +indented, it is preserved unchanged. If it is indented less than N +spaces, all of the indentation is removed.) + +The closing code fence may be indented up to three spaces, and may be +followed only by spaces, which are ignored. If the end of the +containing block (or document) is reached and no closing code fence +has been found, the code block contains all of the lines after the +opening code fence until the end of the containing block (or +document). (An alternative spec would require backtracking in the +event that a closing code fence is not found. But this makes parsing +much less efficient, and there seems to be no real down side to the +behavior described here.) + +A fenced code block may interrupt a paragraph, and does not require +a blank line either before or after. + +The content of a code fence is treated as literal text, not parsed +as inlines. The first word of the [info string] is typically used to +specify the language of the code sample, and rendered in the `class` +attribute of the `code` tag. However, this spec does not mandate any +particular treatment of the [info string]. + +Here is a simple example with backticks: + +```````````````````````````````` example +``` +< + > +``` +. +<pre><code>< + > +</code></pre> +```````````````````````````````` + + +With tildes: + +```````````````````````````````` example +~~~ +< + > +~~~ +. +<pre><code>< + > +</code></pre> +```````````````````````````````` + +Fewer than three backticks is not enough: + +```````````````````````````````` example +`` +foo +`` +. +<p><code>foo</code></p> +```````````````````````````````` + +The closing code fence must use the same character as the opening +fence: + +```````````````````````````````` example +``` +aaa +~~~ +``` +. +<pre><code>aaa +~~~ +</code></pre> +```````````````````````````````` + + +```````````````````````````````` example +~~~ +aaa +``` +~~~ +. +<pre><code>aaa +``` +</code></pre> +```````````````````````````````` + + +The closing code fence must be at least as long as the opening fence: + +```````````````````````````````` example +```` +aaa +``` +`````` +. +<pre><code>aaa +``` +</code></pre> +```````````````````````````````` + + +```````````````````````````````` example +~~~~ +aaa +~~~ +~~~~ +. +<pre><code>aaa +~~~ +</code></pre> +```````````````````````````````` + + +Unclosed code blocks are closed by the end of the document +(or the enclosing [block quote][block quotes] or [list item][list items]): + +```````````````````````````````` example +``` +. +<pre><code></code></pre> +```````````````````````````````` + + +```````````````````````````````` example +````` + +``` +aaa +. +<pre><code> +``` +aaa +</code></pre> +```````````````````````````````` + + +```````````````````````````````` example +> ``` +> aaa + +bbb +. +<blockquote> +<pre><code>aaa +</code></pre> +</blockquote> +<p>bbb</p> +```````````````````````````````` + + +A code block can have all empty lines as its content: + +```````````````````````````````` example +``` + + +``` +. +<pre><code> + +</code></pre> +```````````````````````````````` + + +A code block can be empty: + +```````````````````````````````` example +``` +``` +. +<pre><code></code></pre> +```````````````````````````````` + + +Fences can be indented. If the opening fence is indented, +content lines will have equivalent opening indentation removed, +if present: + +```````````````````````````````` example + ``` + aaa +aaa +``` +. +<pre><code>aaa +aaa +</code></pre> +```````````````````````````````` + + +```````````````````````````````` example + ``` +aaa + aaa +aaa + ``` +. +<pre><code>aaa +aaa +aaa +</code></pre> +```````````````````````````````` + + +```````````````````````````````` example + ``` + aaa + aaa + aaa + ``` +. +<pre><code>aaa + aaa +aaa +</code></pre> +```````````````````````````````` + + +Four spaces indentation produces an indented code block: + +```````````````````````````````` example + ``` + aaa + ``` +. +<pre><code>``` +aaa +``` +</code></pre> +```````````````````````````````` + + +Closing fences may be indented by 0-3 spaces, and their indentation +need not match that of the opening fence: + +```````````````````````````````` example +``` +aaa + ``` +. +<pre><code>aaa +</code></pre> +```````````````````````````````` + + +```````````````````````````````` example + ``` +aaa + ``` +. +<pre><code>aaa +</code></pre> +```````````````````````````````` + + +This is not a closing fence, because it is indented 4 spaces: + +```````````````````````````````` example +``` +aaa + ``` +. +<pre><code>aaa + ``` +</code></pre> +```````````````````````````````` + + + +Code fences (opening and closing) cannot contain internal spaces: + +```````````````````````````````` example +``` ``` +aaa +. +<p><code> </code> +aaa</p> +```````````````````````````````` + + +```````````````````````````````` example +~~~~~~ +aaa +~~~ ~~ +. +<pre><code>aaa +~~~ ~~ +</code></pre> +```````````````````````````````` + + +Fenced code blocks can interrupt paragraphs, and can be followed +directly by paragraphs, without a blank line between: + +```````````````````````````````` example +foo +``` +bar +``` +baz +. +<p>foo</p> +<pre><code>bar +</code></pre> +<p>baz</p> +```````````````````````````````` + + +Other blocks can also occur before and after fenced code blocks +without an intervening blank line: + +```````````````````````````````` example +foo +--- +~~~ +bar +~~~ +# baz +. +<h2>foo</h2> +<pre><code>bar +</code></pre> +<h1>baz</h1> +```````````````````````````````` + + +An [info string] can be provided after the opening code fence. +Although this spec doesn't mandate any particular treatment of +the info string, the first word is typically used to specify +the language of the code block. In HTML output, the language is +normally indicated by adding a class to the `code` element consisting +of `language-` followed by the language name. + +```````````````````````````````` example +```ruby +def foo(x) + return 3 +end +``` +. +<pre><code class="language-ruby">def foo(x) + return 3 +end +</code></pre> +```````````````````````````````` + + +```````````````````````````````` example +~~~~ ruby startline=3 $%@#$ +def foo(x) + return 3 +end +~~~~~~~ +. +<pre><code class="language-ruby">def foo(x) + return 3 +end +</code></pre> +```````````````````````````````` + + +```````````````````````````````` example +````; +```` +. +<pre><code class="language-;"></code></pre> +```````````````````````````````` + + +[Info strings] for backtick code blocks cannot contain backticks: + +```````````````````````````````` example +``` aa ``` +foo +. +<p><code>aa</code> +foo</p> +```````````````````````````````` + + +[Info strings] for tilde code blocks can contain backticks and tildes: + +```````````````````````````````` example +~~~ aa ``` ~~~ +foo +~~~ +. +<pre><code class="language-aa">foo +</code></pre> +```````````````````````````````` + + +Closing code fences cannot have [info strings]: + +```````````````````````````````` example +``` +``` aaa +``` +. +<pre><code>``` aaa +</code></pre> +```````````````````````````````` + + + +## HTML blocks + +An [HTML block](@) is a group of lines that is treated +as raw HTML (and will not be escaped in HTML output). + +There are seven kinds of [HTML block], which can be defined by their +start and end conditions. The block begins with a line that meets a +[start condition](@) (after up to three spaces optional indentation). +It ends with the first subsequent line that meets a matching [end +condition](@), or the last line of the document, or the last line of +the [container block](#container-blocks) containing the current HTML +block, if no line is encountered that meets the [end condition]. If +the first line meets both the [start condition] and the [end +condition], the block will contain just that line. + +1. **Start condition:** line begins with the string `<script`, +`<pre`, or `<style` (case-insensitive), followed by whitespace, +the string `>`, or the end of the line.\ +**End condition:** line contains an end tag +`</script>`, `</pre>`, or `</style>` (case-insensitive; it +need not match the start tag). + +2. **Start condition:** line begins with the string `<!--`.\ +**End condition:** line contains the string `-->`. + +3. **Start condition:** line begins with the string `<?`.\ +**End condition:** line contains the string `?>`. + +4. **Start condition:** line begins with the string `<!` +followed by an uppercase ASCII letter.\ +**End condition:** line contains the character `>`. + +5. **Start condition:** line begins with the string +`<![CDATA[`.\ +**End condition:** line contains the string `]]>`. + +6. **Start condition:** line begins the string `<` or `</` +followed by one of the strings (case-insensitive) `address`, +`article`, `aside`, `base`, `basefont`, `blockquote`, `body`, +`caption`, `center`, `col`, `colgroup`, `dd`, `details`, `dialog`, +`dir`, `div`, `dl`, `dt`, `fieldset`, `figcaption`, `figure`, +`footer`, `form`, `frame`, `frameset`, +`h1`, `h2`, `h3`, `h4`, `h5`, `h6`, `head`, `header`, `hr`, +`html`, `iframe`, `legend`, `li`, `link`, `main`, `menu`, `menuitem`, +`nav`, `noframes`, `ol`, `optgroup`, `option`, `p`, `param`, +`section`, `summary`, `table`, `tbody`, `td`, +`tfoot`, `th`, `thead`, `title`, `tr`, `track`, `ul`, followed +by [whitespace], the end of the line, the string `>`, or +the string `/>`.\ +**End condition:** line is followed by a [blank line]. + +7. **Start condition:** line begins with a complete [open tag] +(with any [tag name] other than `script`, +`style`, or `pre`) or a complete [closing tag], +followed only by [whitespace] or the end of the line.\ +**End condition:** line is followed by a [blank line]. + +HTML blocks continue until they are closed by their appropriate +[end condition], or the last line of the document or other [container +block](#container-blocks). This means any HTML **within an HTML +block** that might otherwise be recognised as a start condition will +be ignored by the parser and passed through as-is, without changing +the parser's state. + +For instance, `<pre>` within a HTML block started by `<table>` will not affect +the parser state; as the HTML block was started in by start condition 6, it +will end at any blank line. This can be surprising: + +```````````````````````````````` example +<table><tr><td> +<pre> +**Hello**, + +_world_. +</pre> +</td></tr></table> +. +<table><tr><td> +<pre> +**Hello**, +<p><em>world</em>. +</pre></p> +</td></tr></table> +```````````````````````````````` + +In this case, the HTML block is terminated by the newline — the `**Hello**` +text remains verbatim — and regular parsing resumes, with a paragraph, +emphasised `world` and inline and block HTML following. + +All types of [HTML blocks] except type 7 may interrupt +a paragraph. Blocks of type 7 may not interrupt a paragraph. +(This restriction is intended to prevent unwanted interpretation +of long tags inside a wrapped paragraph as starting HTML blocks.) + +Some simple examples follow. Here are some basic HTML blocks +of type 6: + +```````````````````````````````` example +<table> + <tr> + <td> + hi + </td> + </tr> +</table> + +okay. +. +<table> + <tr> + <td> + hi + </td> + </tr> +</table> +<p>okay.</p> +```````````````````````````````` + + +```````````````````````````````` example + <div> + *hello* + <foo><a> +. + <div> + *hello* + <foo><a> +```````````````````````````````` + + +A block can also start with a closing tag: + +```````````````````````````````` example +</div> +*foo* +. +</div> +*foo* +```````````````````````````````` + + +Here we have two HTML blocks with a Markdown paragraph between them: + +```````````````````````````````` example +<DIV CLASS="foo"> + +*Markdown* + +</DIV> +. +<DIV CLASS="foo"> +<p><em>Markdown</em></p> +</DIV> +```````````````````````````````` + + +The tag on the first line can be partial, as long +as it is split where there would be whitespace: + +```````````````````````````````` example +<div id="foo" + class="bar"> +</div> +. +<div id="foo" + class="bar"> +</div> +```````````````````````````````` + + +```````````````````````````````` example +<div id="foo" class="bar + baz"> +</div> +. +<div id="foo" class="bar + baz"> +</div> +```````````````````````````````` + + +An open tag need not be closed: +```````````````````````````````` example +<div> +*foo* + +*bar* +. +<div> +*foo* +<p><em>bar</em></p> +```````````````````````````````` + + + +A partial tag need not even be completed (garbage +in, garbage out): + +```````````````````````````````` example +<div id="foo" +*hi* +. +<div id="foo" +*hi* +```````````````````````````````` + + +```````````````````````````````` example +<div class +foo +. +<div class +foo +```````````````````````````````` + + +The initial tag doesn't even need to be a valid +tag, as long as it starts like one: + +```````````````````````````````` example +<div *???-&&&-<--- +*foo* +. +<div *???-&&&-<--- +*foo* +```````````````````````````````` + + +In type 6 blocks, the initial tag need not be on a line by +itself: + +```````````````````````````````` example +<div><a href="bar">*foo*</a></div> +. +<div><a href="bar">*foo*</a></div> +```````````````````````````````` + + +```````````````````````````````` example +<table><tr><td> +foo +</td></tr></table> +. +<table><tr><td> +foo +</td></tr></table> +```````````````````````````````` + + +Everything until the next blank line or end of document +gets included in the HTML block. So, in the following +example, what looks like a Markdown code block +is actually part of the HTML block, which continues until a blank +line or the end of the document is reached: + +```````````````````````````````` example +<div></div> +``` c +int x = 33; +``` +. +<div></div> +``` c +int x = 33; +``` +```````````````````````````````` + + +To start an [HTML block] with a tag that is *not* in the +list of block-level tags in (6), you must put the tag by +itself on the first line (and it must be complete): + +```````````````````````````````` example +<a href="foo"> +*bar* +</a> +. +<a href="foo"> +*bar* +</a> +```````````````````````````````` + + +In type 7 blocks, the [tag name] can be anything: + +```````````````````````````````` example +<Warning> +*bar* +</Warning> +. +<Warning> +*bar* +</Warning> +```````````````````````````````` + + +```````````````````````````````` example +<i class="foo"> +*bar* +</i> +. +<i class="foo"> +*bar* +</i> +```````````````````````````````` + + +```````````````````````````````` example +</ins> +*bar* +. +</ins> +*bar* +```````````````````````````````` + + +These rules are designed to allow us to work with tags that +can function as either block-level or inline-level tags. +The `<del>` tag is a nice example. We can surround content with +`<del>` tags in three different ways. In this case, we get a raw +HTML block, because the `<del>` tag is on a line by itself: + +```````````````````````````````` example +<del> +*foo* +</del> +. +<del> +*foo* +</del> +```````````````````````````````` + + +In this case, we get a raw HTML block that just includes +the `<del>` tag (because it ends with the following blank +line). So the contents get interpreted as CommonMark: + +```````````````````````````````` example +<del> + +*foo* + +</del> +. +<del> +<p><em>foo</em></p> +</del> +```````````````````````````````` + + +Finally, in this case, the `<del>` tags are interpreted +as [raw HTML] *inside* the CommonMark paragraph. (Because +the tag is not on a line by itself, we get inline HTML +rather than an [HTML block].) + +```````````````````````````````` example +<del>*foo*</del> +. +<p><del><em>foo</em></del></p> +```````````````````````````````` + + +HTML tags designed to contain literal content +(`script`, `style`, `pre`), comments, processing instructions, +and declarations are treated somewhat differently. +Instead of ending at the first blank line, these blocks +end at the first line containing a corresponding end tag. +As a result, these blocks can contain blank lines: + +A pre tag (type 1): + +```````````````````````````````` example +<pre language="haskell"><code> +import Text.HTML.TagSoup + +main :: IO () +main = print $ parseTags tags +</code></pre> +okay +. +<pre language="haskell"><code> +import Text.HTML.TagSoup + +main :: IO () +main = print $ parseTags tags +</code></pre> +<p>okay</p> +```````````````````````````````` + + +A script tag (type 1): + +```````````````````````````````` example +<script type="text/javascript"> +// JavaScript example + +document.getElementById("demo").innerHTML = "Hello JavaScript!"; +</script> +okay +. +<script type="text/javascript"> +// JavaScript example + +document.getElementById("demo").innerHTML = "Hello JavaScript!"; +</script> +<p>okay</p> +```````````````````````````````` + + +A style tag (type 1): + +```````````````````````````````` example +<style + type="text/css"> +h1 {color:red;} + +p {color:blue;} +</style> +okay +. +<style + type="text/css"> +h1 {color:red;} + +p {color:blue;} +</style> +<p>okay</p> +```````````````````````````````` + + +If there is no matching end tag, the block will end at the +end of the document (or the enclosing [block quote][block quotes] +or [list item][list items]): + +```````````````````````````````` example +<style + type="text/css"> + +foo +. +<style + type="text/css"> + +foo +```````````````````````````````` + + +```````````````````````````````` example +> <div> +> foo + +bar +. +<blockquote> +<div> +foo +</blockquote> +<p>bar</p> +```````````````````````````````` + + +```````````````````````````````` example +- <div> +- foo +. +<ul> +<li> +<div> +</li> +<li>foo</li> +</ul> +```````````````````````````````` + + +The end tag can occur on the same line as the start tag: + +```````````````````````````````` example +<style>p{color:red;}</style> +*foo* +. +<style>p{color:red;}</style> +<p><em>foo</em></p> +```````````````````````````````` + + +```````````````````````````````` example +<!-- foo -->*bar* +*baz* +. +<!-- foo -->*bar* +<p><em>baz</em></p> +```````````````````````````````` + + +Note that anything on the last line after the +end tag will be included in the [HTML block]: + +```````````````````````````````` example +<script> +foo +</script>1. *bar* +. +<script> +foo +</script>1. *bar* +```````````````````````````````` + + +A comment (type 2): + +```````````````````````````````` example +<!-- Foo + +bar + baz --> +okay +. +<!-- Foo + +bar + baz --> +<p>okay</p> +```````````````````````````````` + + + +A processing instruction (type 3): + +```````````````````````````````` example +<?php + + echo '>'; + +?> +okay +. +<?php + + echo '>'; + +?> +<p>okay</p> +```````````````````````````````` + + +A declaration (type 4): + +```````````````````````````````` example +<!DOCTYPE html> +. +<!DOCTYPE html> +```````````````````````````````` + + +CDATA (type 5): + +```````````````````````````````` example +<![CDATA[ +function matchwo(a,b) +{ + if (a < b && a < 0) then { + return 1; + + } else { + + return 0; + } +} +]]> +okay +. +<![CDATA[ +function matchwo(a,b) +{ + if (a < b && a < 0) then { + return 1; + + } else { + + return 0; + } +} +]]> +<p>okay</p> +```````````````````````````````` + + +The opening tag can be indented 1-3 spaces, but not 4: + +```````````````````````````````` example + <!-- foo --> + + <!-- foo --> +. + <!-- foo --> +<pre><code><!-- foo --> +</code></pre> +```````````````````````````````` + + +```````````````````````````````` example + <div> + + <div> +. + <div> +<pre><code><div> +</code></pre> +```````````````````````````````` + + +An HTML block of types 1--6 can interrupt a paragraph, and need not be +preceded by a blank line. + +```````````````````````````````` example +Foo +<div> +bar +</div> +. +<p>Foo</p> +<div> +bar +</div> +```````````````````````````````` + + +However, a following blank line is needed, except at the end of +a document, and except for blocks of types 1--5, [above][HTML +block]: + +```````````````````````````````` example +<div> +bar +</div> +*foo* +. +<div> +bar +</div> +*foo* +```````````````````````````````` + + +HTML blocks of type 7 cannot interrupt a paragraph: + +```````````````````````````````` example +Foo +<a href="bar"> +baz +. +<p>Foo +<a href="bar"> +baz</p> +```````````````````````````````` + + +This rule differs from John Gruber's original Markdown syntax +specification, which says: + +> The only restrictions are that block-level HTML elements — +> e.g. `<div>`, `<table>`, `<pre>`, `<p>`, etc. — must be separated from +> surrounding content by blank lines, and the start and end tags of the +> block should not be indented with tabs or spaces. + +In some ways Gruber's rule is more restrictive than the one given +here: + +- It requires that an HTML block be preceded by a blank line. +- It does not allow the start tag to be indented. +- It requires a matching end tag, which it also does not allow to + be indented. + +Most Markdown implementations (including some of Gruber's own) do not +respect all of these restrictions. + +There is one respect, however, in which Gruber's rule is more liberal +than the one given here, since it allows blank lines to occur inside +an HTML block. There are two reasons for disallowing them here. +First, it removes the need to parse balanced tags, which is +expensive and can require backtracking from the end of the document +if no matching end tag is found. Second, it provides a very simple +and flexible way of including Markdown content inside HTML tags: +simply separate the Markdown from the HTML using blank lines: + +Compare: + +```````````````````````````````` example +<div> + +*Emphasized* text. + +</div> +. +<div> +<p><em>Emphasized</em> text.</p> +</div> +```````````````````````````````` + + +```````````````````````````````` example +<div> +*Emphasized* text. +</div> +. +<div> +*Emphasized* text. +</div> +```````````````````````````````` + + +Some Markdown implementations have adopted a convention of +interpreting content inside tags as text if the open tag has +the attribute `markdown=1`. The rule given above seems a simpler and +more elegant way of achieving the same expressive power, which is also +much simpler to parse. + +The main potential drawback is that one can no longer paste HTML +blocks into Markdown documents with 100% reliability. However, +*in most cases* this will work fine, because the blank lines in +HTML are usually followed by HTML block tags. For example: + +```````````````````````````````` example +<table> + +<tr> + +<td> +Hi +</td> + +</tr> + +</table> +. +<table> +<tr> +<td> +Hi +</td> +</tr> +</table> +```````````````````````````````` + + +There are problems, however, if the inner tags are indented +*and* separated by spaces, as then they will be interpreted as +an indented code block: + +```````````````````````````````` example +<table> + + <tr> + + <td> + Hi + </td> + + </tr> + +</table> +. +<table> + <tr> +<pre><code><td> + Hi +</td> +</code></pre> + </tr> +</table> +```````````````````````````````` + + +Fortunately, blank lines are usually not necessary and can be +deleted. The exception is inside `<pre>` tags, but as described +[above][HTML blocks], raw HTML blocks starting with `<pre>` +*can* contain blank lines. + +## Link reference definitions + +A [link reference definition](@) +consists of a [link label], indented up to three spaces, followed +by a colon (`:`), optional [whitespace] (including up to one +[line ending]), a [link destination], +optional [whitespace] (including up to one +[line ending]), and an optional [link +title], which if it is present must be separated +from the [link destination] by [whitespace]. +No further [non-whitespace characters] may occur on the line. + +A [link reference definition] +does not correspond to a structural element of a document. Instead, it +defines a label which can be used in [reference links] +and reference-style [images] elsewhere in the document. [Link +reference definitions] can come either before or after the links that use +them. + +```````````````````````````````` example +[foo]: /url "title" + +[foo] +. +<p><a href="/url" title="title">foo</a></p> +```````````````````````````````` + + +```````````````````````````````` example + [foo]: + /url + 'the title' + +[foo] +. +<p><a href="/url" title="the title">foo</a></p> +```````````````````````````````` + + +```````````````````````````````` example +[Foo*bar\]]:my_(url) 'title (with parens)' + +[Foo*bar\]] +. +<p><a href="my_(url)" title="title (with parens)">Foo*bar]</a></p> +```````````````````````````````` + + +```````````````````````````````` example +[Foo bar]: +<my url> +'title' + +[Foo bar] +. +<p><a href="my%20url" title="title">Foo bar</a></p> +```````````````````````````````` + + +The title may extend over multiple lines: + +```````````````````````````````` example +[foo]: /url ' +title +line1 +line2 +' + +[foo] +. +<p><a href="/url" title=" +title +line1 +line2 +">foo</a></p> +```````````````````````````````` + + +However, it may not contain a [blank line]: + +```````````````````````````````` example +[foo]: /url 'title + +with blank line' + +[foo] +. +<p>[foo]: /url 'title</p> +<p>with blank line'</p> +<p>[foo]</p> +```````````````````````````````` + + +The title may be omitted: + +```````````````````````````````` example +[foo]: +/url + +[foo] +. +<p><a href="/url">foo</a></p> +```````````````````````````````` + + +The link destination may not be omitted: + +```````````````````````````````` example +[foo]: + +[foo] +. +<p>[foo]:</p> +<p>[foo]</p> +```````````````````````````````` + + However, an empty link destination may be specified using + angle brackets: + +```````````````````````````````` example +[foo]: <> + +[foo] +. +<p><a href="">foo</a></p> +```````````````````````````````` + +The title must be separated from the link destination by +whitespace: + +```````````````````````````````` example +[foo]: <bar>(baz) + +[foo] +. +<p>[foo]: <bar>(baz)</p> +<p>[foo]</p> +```````````````````````````````` + + +Both title and destination can contain backslash escapes +and literal backslashes: + +```````````````````````````````` example +[foo]: /url\bar\*baz "foo\"bar\baz" + +[foo] +. +<p><a href="/url%5Cbar*baz" title="foo"bar\baz">foo</a></p> +```````````````````````````````` + + +A link can come before its corresponding definition: + +```````````````````````````````` example +[foo] + +[foo]: url +. +<p><a href="url">foo</a></p> +```````````````````````````````` + + +If there are several matching definitions, the first one takes +precedence: + +```````````````````````````````` example +[foo] + +[foo]: first +[foo]: second +. +<p><a href="first">foo</a></p> +```````````````````````````````` + + +As noted in the section on [Links], matching of labels is +case-insensitive (see [matches]). + +```````````````````````````````` example +[FOO]: /url + +[Foo] +. +<p><a href="/url">Foo</a></p> +```````````````````````````````` + + +```````````````````````````````` example +[ΑΓΩ]: /φου + +[αγω] +. +<p><a href="/%CF%86%CE%BF%CF%85">αγω</a></p> +```````````````````````````````` + + +Here is a link reference definition with no corresponding link. +It contributes nothing to the document. + +```````````````````````````````` example +[foo]: /url +. +```````````````````````````````` + + +Here is another one: + +```````````````````````````````` example +[ +foo +]: /url +bar +. +<p>bar</p> +```````````````````````````````` + + +This is not a link reference definition, because there are +[non-whitespace characters] after the title: + +```````````````````````````````` example +[foo]: /url "title" ok +. +<p>[foo]: /url "title" ok</p> +```````````````````````````````` + + +This is a link reference definition, but it has no title: + +```````````````````````````````` example +[foo]: /url +"title" ok +. +<p>"title" ok</p> +```````````````````````````````` + + +This is not a link reference definition, because it is indented +four spaces: + +```````````````````````````````` example + [foo]: /url "title" + +[foo] +. +<pre><code>[foo]: /url "title" +</code></pre> +<p>[foo]</p> +```````````````````````````````` + + +This is not a link reference definition, because it occurs inside +a code block: + +```````````````````````````````` example +``` +[foo]: /url +``` + +[foo] +. +<pre><code>[foo]: /url +</code></pre> +<p>[foo]</p> +```````````````````````````````` + + +A [link reference definition] cannot interrupt a paragraph. + +```````````````````````````````` example +Foo +[bar]: /baz + +[bar] +. +<p>Foo +[bar]: /baz</p> +<p>[bar]</p> +```````````````````````````````` + + +However, it can directly follow other block elements, such as headings +and thematic breaks, and it need not be followed by a blank line. + +```````````````````````````````` example +# [Foo] +[foo]: /url +> bar +. +<h1><a href="/url">Foo</a></h1> +<blockquote> +<p>bar</p> +</blockquote> +```````````````````````````````` + +```````````````````````````````` example +[foo]: /url +bar +=== +[foo] +. +<h1>bar</h1> +<p><a href="/url">foo</a></p> +```````````````````````````````` + +```````````````````````````````` example +[foo]: /url +=== +[foo] +. +<p>=== +<a href="/url">foo</a></p> +```````````````````````````````` + + +Several [link reference definitions] +can occur one after another, without intervening blank lines. + +```````````````````````````````` example +[foo]: /foo-url "foo" +[bar]: /bar-url + "bar" +[baz]: /baz-url + +[foo], +[bar], +[baz] +. +<p><a href="/foo-url" title="foo">foo</a>, +<a href="/bar-url" title="bar">bar</a>, +<a href="/baz-url">baz</a></p> +```````````````````````````````` + + +[Link reference definitions] can occur +inside block containers, like lists and block quotations. They +affect the entire document, not just the container in which they +are defined: + +```````````````````````````````` example +[foo] + +> [foo]: /url +. +<p><a href="/url">foo</a></p> +<blockquote> +</blockquote> +```````````````````````````````` + + +Whether something is a [link reference definition] is +independent of whether the link reference it defines is +used in the document. Thus, for example, the following +document contains just a link reference definition, and +no visible content: + +```````````````````````````````` example +[foo]: /url +. +```````````````````````````````` + + +## Paragraphs + +A sequence of non-blank lines that cannot be interpreted as other +kinds of blocks forms a [paragraph](@). +The contents of the paragraph are the result of parsing the +paragraph's raw content as inlines. The paragraph's raw content +is formed by concatenating the lines and removing initial and final +[whitespace]. + +A simple example with two paragraphs: + +```````````````````````````````` example +aaa + +bbb +. +<p>aaa</p> +<p>bbb</p> +```````````````````````````````` + + +Paragraphs can contain multiple lines, but no blank lines: + +```````````````````````````````` example +aaa +bbb + +ccc +ddd +. +<p>aaa +bbb</p> +<p>ccc +ddd</p> +```````````````````````````````` + + +Multiple blank lines between paragraph have no effect: + +```````````````````````````````` example +aaa + + +bbb +. +<p>aaa</p> +<p>bbb</p> +```````````````````````````````` + + +Leading spaces are skipped: + +```````````````````````````````` example + aaa + bbb +. +<p>aaa +bbb</p> +```````````````````````````````` + + +Lines after the first may be indented any amount, since indented +code blocks cannot interrupt paragraphs. + +```````````````````````````````` example +aaa + bbb + ccc +. +<p>aaa +bbb +ccc</p> +```````````````````````````````` + + +However, the first line may be indented at most three spaces, +or an indented code block will be triggered: + +```````````````````````````````` example + aaa +bbb +. +<p>aaa +bbb</p> +```````````````````````````````` + + +```````````````````````````````` example + aaa +bbb +. +<pre><code>aaa +</code></pre> +<p>bbb</p> +```````````````````````````````` + + +Final spaces are stripped before inline parsing, so a paragraph +that ends with two or more spaces will not end with a [hard line +break]: + +```````````````````````````````` example +aaa +bbb +. +<p>aaa<br /> +bbb</p> +```````````````````````````````` + + +## Blank lines + +[Blank lines] between block-level elements are ignored, +except for the role they play in determining whether a [list] +is [tight] or [loose]. + +Blank lines at the beginning and end of the document are also ignored. + +```````````````````````````````` example + + +aaa + + +# aaa + + +. +<p>aaa</p> +<h1>aaa</h1> +```````````````````````````````` + +<div class="extension"> + +## Tables (extension) + +GFM enables the `table` extension, where an additional leaf block type is +available. + +A [table](@) is an arrangement of data with rows and columns, consisting of a +single header row, a [delimiter row] separating the header from the data, and +zero or more data rows. + +Each row consists of cells containing arbitrary text, in which [inlines] are +parsed, separated by pipes (`|`). A leading and trailing pipe is also +recommended for clarity of reading, and if there's otherwise parsing ambiguity. +Spaces between pipes and cell content are trimmed. Block-level elements cannot +be inserted in a table. + +The [delimiter row](@) consists of cells whose only content are hyphens (`-`), +and optionally, a leading or trailing colon (`:`), or both, to indicate left, +right, or center alignment respectively. + +```````````````````````````````` example table +| foo | bar | +| --- | --- | +| baz | bim | +. +<table> +<thead> +<tr> +<th>foo</th> +<th>bar</th> +</tr> +</thead> +<tbody> +<tr> +<td>baz</td> +<td>bim</td> +</tr> +</tbody> +</table> +```````````````````````````````` + +Cells in one column don't need to match length, though it's easier to read if +they are. Likewise, use of leading and trailing pipes may be inconsistent: + +```````````````````````````````` example table +| abc | defghi | +:-: | -----------: +bar | baz +. +<table> +<thead> +<tr> +<th align="center">abc</th> +<th align="right">defghi</th> +</tr> +</thead> +<tbody> +<tr> +<td align="center">bar</td> +<td align="right">baz</td> +</tr> +</tbody> +</table> +```````````````````````````````` + +Include a pipe in a cell's content by escaping it, including inside other +inline spans: + +```````````````````````````````` example table +| f\|oo | +| ------ | +| b `\|` az | +| b **\|** im | +. +<table> +<thead> +<tr> +<th>f|oo</th> +</tr> +</thead> +<tbody> +<tr> +<td>b <code>|</code> az</td> +</tr> +<tr> +<td>b <strong>|</strong> im</td> +</tr> +</tbody> +</table> +```````````````````````````````` + +The table is broken at the first empty line, or beginning of another +block-level structure: + +```````````````````````````````` example table +| abc | def | +| --- | --- | +| bar | baz | +> bar +. +<table> +<thead> +<tr> +<th>abc</th> +<th>def</th> +</tr> +</thead> +<tbody> +<tr> +<td>bar</td> +<td>baz</td> +</tr> +</tbody> +</table> +<blockquote> +<p>bar</p> +</blockquote> +```````````````````````````````` + +```````````````````````````````` example table +| abc | def | +| --- | --- | +| bar | baz | +bar + +bar +. +<table> +<thead> +<tr> +<th>abc</th> +<th>def</th> +</tr> +</thead> +<tbody> +<tr> +<td>bar</td> +<td>baz</td> +</tr> +<tr> +<td>bar</td> +<td></td> +</tr> +</tbody> +</table> +<p>bar</p> +```````````````````````````````` + +The header row must match the [delimiter row] in the number of cells. If not, +a table will not be recognized: + +```````````````````````````````` example table +| abc | def | +| --- | +| bar | +. +<p>| abc | def | +| --- | +| bar |</p> +```````````````````````````````` + +The remainder of the table's rows may vary in the number of cells. If there +are a number of cells fewer than the number of cells in the header row, empty +cells are inserted. If there are greater, the excess is ignored: + +```````````````````````````````` example table +| abc | def | +| --- | --- | +| bar | +| bar | baz | boo | +. +<table> +<thead> +<tr> +<th>abc</th> +<th>def</th> +</tr> +</thead> +<tbody> +<tr> +<td>bar</td> +<td></td> +</tr> +<tr> +<td>bar</td> +<td>baz</td> +</tr> +</tbody> +</table> +```````````````````````````````` + +If there are no rows in the body, no `<tbody>` is generated in HTML output: + +```````````````````````````````` example table +| abc | def | +| --- | --- | +. +<table> +<thead> +<tr> +<th>abc</th> +<th>def</th> +</tr> +</thead> +</table> +```````````````````````````````` + +</div> + +# Container blocks + +A [container block](#container-blocks) is a block that has other +blocks as its contents. There are two basic kinds of container blocks: +[block quotes] and [list items]. +[Lists] are meta-containers for [list items]. + +We define the syntax for container blocks recursively. The general +form of the definition is: + +> If X is a sequence of blocks, then the result of +> transforming X in such-and-such a way is a container of type Y +> with these blocks as its content. + +So, we explain what counts as a block quote or list item by explaining +how these can be *generated* from their contents. This should suffice +to define the syntax, although it does not give a recipe for *parsing* +these constructions. (A recipe is provided below in the section entitled +[A parsing strategy](#appendix-a-parsing-strategy).) + +## Block quotes + +A [block quote marker](@) +consists of 0-3 spaces of initial indent, plus (a) the character `>` together +with a following space, or (b) a single character `>` not followed by a space. + +The following rules define [block quotes]: + +1. **Basic case.** If a string of lines *Ls* constitute a sequence + of blocks *Bs*, then the result of prepending a [block quote + marker] to the beginning of each line in *Ls* + is a [block quote](#block-quotes) containing *Bs*. + +2. **Laziness.** If a string of lines *Ls* constitute a [block + quote](#block-quotes) with contents *Bs*, then the result of deleting + the initial [block quote marker] from one or + more lines in which the next [non-whitespace character] after the [block + quote marker] is [paragraph continuation + text] is a block quote with *Bs* as its content. + [Paragraph continuation text](@) is text + that will be parsed as part of the content of a paragraph, but does + not occur at the beginning of the paragraph. + +3. **Consecutiveness.** A document cannot contain two [block + quotes] in a row unless there is a [blank line] between them. + +Nothing else counts as a [block quote](#block-quotes). + +Here is a simple example: + +```````````````````````````````` example +> # Foo +> bar +> baz +. +<blockquote> +<h1>Foo</h1> +<p>bar +baz</p> +</blockquote> +```````````````````````````````` + + +The spaces after the `>` characters can be omitted: + +```````````````````````````````` example +># Foo +>bar +> baz +. +<blockquote> +<h1>Foo</h1> +<p>bar +baz</p> +</blockquote> +```````````````````````````````` + + +The `>` characters can be indented 1-3 spaces: + +```````````````````````````````` example + > # Foo + > bar + > baz +. +<blockquote> +<h1>Foo</h1> +<p>bar +baz</p> +</blockquote> +```````````````````````````````` + + +Four spaces gives us a code block: + +```````````````````````````````` example + > # Foo + > bar + > baz +. +<pre><code>> # Foo +> bar +> baz +</code></pre> +```````````````````````````````` + + +The Laziness clause allows us to omit the `>` before +[paragraph continuation text]: + +```````````````````````````````` example +> # Foo +> bar +baz +. +<blockquote> +<h1>Foo</h1> +<p>bar +baz</p> +</blockquote> +```````````````````````````````` + + +A block quote can contain some lazy and some non-lazy +continuation lines: + +```````````````````````````````` example +> bar +baz +> foo +. +<blockquote> +<p>bar +baz +foo</p> +</blockquote> +```````````````````````````````` + + +Laziness only applies to lines that would have been continuations of +paragraphs had they been prepended with [block quote markers]. +For example, the `> ` cannot be omitted in the second line of + +``` markdown +> foo +> --- +``` + +without changing the meaning: + +```````````````````````````````` example +> foo +--- +. +<blockquote> +<p>foo</p> +</blockquote> +<hr /> +```````````````````````````````` + + +Similarly, if we omit the `> ` in the second line of + +``` markdown +> - foo +> - bar +``` + +then the block quote ends after the first line: + +```````````````````````````````` example +> - foo +- bar +. +<blockquote> +<ul> +<li>foo</li> +</ul> +</blockquote> +<ul> +<li>bar</li> +</ul> +```````````````````````````````` + + +For the same reason, we can't omit the `> ` in front of +subsequent lines of an indented or fenced code block: + +```````````````````````````````` example +> foo + bar +. +<blockquote> +<pre><code>foo +</code></pre> +</blockquote> +<pre><code>bar +</code></pre> +```````````````````````````````` + + +```````````````````````````````` example +> ``` +foo +``` +. +<blockquote> +<pre><code></code></pre> +</blockquote> +<p>foo</p> +<pre><code></code></pre> +```````````````````````````````` + + +Note that in the following case, we have a [lazy +continuation line]: + +```````````````````````````````` example +> foo + - bar +. +<blockquote> +<p>foo +- bar</p> +</blockquote> +```````````````````````````````` + + +To see why, note that in + +```markdown +> foo +> - bar +``` + +the `- bar` is indented too far to start a list, and can't +be an indented code block because indented code blocks cannot +interrupt paragraphs, so it is [paragraph continuation text]. + +A block quote can be empty: + +```````````````````````````````` example +> +. +<blockquote> +</blockquote> +```````````````````````````````` + + +```````````````````````````````` example +> +> +> +. +<blockquote> +</blockquote> +```````````````````````````````` + + +A block quote can have initial or final blank lines: + +```````````````````````````````` example +> +> foo +> +. +<blockquote> +<p>foo</p> +</blockquote> +```````````````````````````````` + + +A blank line always separates block quotes: + +```````````````````````````````` example +> foo + +> bar +. +<blockquote> +<p>foo</p> +</blockquote> +<blockquote> +<p>bar</p> +</blockquote> +```````````````````````````````` + + +(Most current Markdown implementations, including John Gruber's +original `Markdown.pl`, will parse this example as a single block quote +with two paragraphs. But it seems better to allow the author to decide +whether two block quotes or one are wanted.) + +Consecutiveness means that if we put these block quotes together, +we get a single block quote: + +```````````````````````````````` example +> foo +> bar +. +<blockquote> +<p>foo +bar</p> +</blockquote> +```````````````````````````````` + + +To get a block quote with two paragraphs, use: + +```````````````````````````````` example +> foo +> +> bar +. +<blockquote> +<p>foo</p> +<p>bar</p> +</blockquote> +```````````````````````````````` + + +Block quotes can interrupt paragraphs: + +```````````````````````````````` example +foo +> bar +. +<p>foo</p> +<blockquote> +<p>bar</p> +</blockquote> +```````````````````````````````` + + +In general, blank lines are not needed before or after block +quotes: + +```````````````````````````````` example +> aaa +*** +> bbb +. +<blockquote> +<p>aaa</p> +</blockquote> +<hr /> +<blockquote> +<p>bbb</p> +</blockquote> +```````````````````````````````` + + +However, because of laziness, a blank line is needed between +a block quote and a following paragraph: + +```````````````````````````````` example +> bar +baz +. +<blockquote> +<p>bar +baz</p> +</blockquote> +```````````````````````````````` + + +```````````````````````````````` example +> bar + +baz +. +<blockquote> +<p>bar</p> +</blockquote> +<p>baz</p> +```````````````````````````````` + + +```````````````````````````````` example +> bar +> +baz +. +<blockquote> +<p>bar</p> +</blockquote> +<p>baz</p> +```````````````````````````````` + + +It is a consequence of the Laziness rule that any number +of initial `>`s may be omitted on a continuation line of a +nested block quote: + +```````````````````````````````` example +> > > foo +bar +. +<blockquote> +<blockquote> +<blockquote> +<p>foo +bar</p> +</blockquote> +</blockquote> +</blockquote> +```````````````````````````````` + + +```````````````````````````````` example +>>> foo +> bar +>>baz +. +<blockquote> +<blockquote> +<blockquote> +<p>foo +bar +baz</p> +</blockquote> +</blockquote> +</blockquote> +```````````````````````````````` + + +When including an indented code block in a block quote, +remember that the [block quote marker] includes +both the `>` and a following space. So *five spaces* are needed after +the `>`: + +```````````````````````````````` example +> code + +> not code +. +<blockquote> +<pre><code>code +</code></pre> +</blockquote> +<blockquote> +<p>not code</p> +</blockquote> +```````````````````````````````` + + + +## List items + +A [list marker](@) is a +[bullet list marker] or an [ordered list marker]. + +A [bullet list marker](@) +is a `-`, `+`, or `*` character. + +An [ordered list marker](@) +is a sequence of 1--9 arabic digits (`0-9`), followed by either a +`.` character or a `)` character. (The reason for the length +limit is that with 10 digits we start seeing integer overflows +in some browsers.) + +The following rules define [list items]: + +1. **Basic case.** If a sequence of lines *Ls* constitute a sequence of + blocks *Bs* starting with a [non-whitespace character], and *M* is a + list marker of width *W* followed by 1 ≤ *N* ≤ 4 spaces, then the result + of prepending *M* and the following spaces to the first line of + *Ls*, and indenting subsequent lines of *Ls* by *W + N* spaces, is a + list item with *Bs* as its contents. The type of the list item + (bullet or ordered) is determined by the type of its list marker. + If the list item is ordered, then it is also assigned a start + number, based on the ordered list marker. + + Exceptions: + + 1. When the first list item in a [list] interrupts + a paragraph---that is, when it starts on a line that would + otherwise count as [paragraph continuation text]---then (a) + the lines *Ls* must not begin with a blank line, and (b) if + the list item is ordered, the start number must be 1. + 2. If any line is a [thematic break][thematic breaks] then + that line is not a list item. + +For example, let *Ls* be the lines + +```````````````````````````````` example +A paragraph +with two lines. + + indented code + +> A block quote. +. +<p>A paragraph +with two lines.</p> +<pre><code>indented code +</code></pre> +<blockquote> +<p>A block quote.</p> +</blockquote> +```````````````````````````````` + + +And let *M* be the marker `1.`, and *N* = 2. Then rule #1 says +that the following is an ordered list item with start number 1, +and the same contents as *Ls*: + +```````````````````````````````` example +1. A paragraph + with two lines. + + indented code + + > A block quote. +. +<ol> +<li> +<p>A paragraph +with two lines.</p> +<pre><code>indented code +</code></pre> +<blockquote> +<p>A block quote.</p> +</blockquote> +</li> +</ol> +```````````````````````````````` + + +The most important thing to notice is that the position of +the text after the list marker determines how much indentation +is needed in subsequent blocks in the list item. If the list +marker takes up two spaces, and there are three spaces between +the list marker and the next [non-whitespace character], then blocks +must be indented five spaces in order to fall under the list +item. + +Here are some examples showing how far content must be indented to be +put under the list item: + +```````````````````````````````` example +- one + + two +. +<ul> +<li>one</li> +</ul> +<p>two</p> +```````````````````````````````` + + +```````````````````````````````` example +- one + + two +. +<ul> +<li> +<p>one</p> +<p>two</p> +</li> +</ul> +```````````````````````````````` + + +```````````````````````````````` example + - one + + two +. +<ul> +<li>one</li> +</ul> +<pre><code> two +</code></pre> +```````````````````````````````` + + +```````````````````````````````` example + - one + + two +. +<ul> +<li> +<p>one</p> +<p>two</p> +</li> +</ul> +```````````````````````````````` + + +It is tempting to think of this in terms of columns: the continuation +blocks must be indented at least to the column of the first +[non-whitespace character] after the list marker. However, that is not quite right. +The spaces after the list marker determine how much relative indentation +is needed. Which column this indentation reaches will depend on +how the list item is embedded in other constructions, as shown by +this example: + +```````````````````````````````` example + > > 1. one +>> +>> two +. +<blockquote> +<blockquote> +<ol> +<li> +<p>one</p> +<p>two</p> +</li> +</ol> +</blockquote> +</blockquote> +```````````````````````````````` + + +Here `two` occurs in the same column as the list marker `1.`, +but is actually contained in the list item, because there is +sufficient indentation after the last containing blockquote marker. + +The converse is also possible. In the following example, the word `two` +occurs far to the right of the initial text of the list item, `one`, but +it is not considered part of the list item, because it is not indented +far enough past the blockquote marker: + +```````````````````````````````` example +>>- one +>> + > > two +. +<blockquote> +<blockquote> +<ul> +<li>one</li> +</ul> +<p>two</p> +</blockquote> +</blockquote> +```````````````````````````````` + + +Note that at least one space is needed between the list marker and +any following content, so these are not list items: + +```````````````````````````````` example +-one + +2.two +. +<p>-one</p> +<p>2.two</p> +```````````````````````````````` + + +A list item may contain blocks that are separated by more than +one blank line. + +```````````````````````````````` example +- foo + + + bar +. +<ul> +<li> +<p>foo</p> +<p>bar</p> +</li> +</ul> +```````````````````````````````` + + +A list item may contain any kind of block: + +```````````````````````````````` example +1. foo + + ``` + bar + ``` + + baz + + > bam +. +<ol> +<li> +<p>foo</p> +<pre><code>bar +</code></pre> +<p>baz</p> +<blockquote> +<p>bam</p> +</blockquote> +</li> +</ol> +```````````````````````````````` + + +A list item that contains an indented code block will preserve +empty lines within the code block verbatim. + +```````````````````````````````` example +- Foo + + bar + + + baz +. +<ul> +<li> +<p>Foo</p> +<pre><code>bar + + +baz +</code></pre> +</li> +</ul> +```````````````````````````````` + +Note that ordered list start numbers must be nine digits or less: + +```````````````````````````````` example +123456789. ok +. +<ol start="123456789"> +<li>ok</li> +</ol> +```````````````````````````````` + + +```````````````````````````````` example +1234567890. not ok +. +<p>1234567890. not ok</p> +```````````````````````````````` + + +A start number may begin with 0s: + +```````````````````````````````` example +0. ok +. +<ol start="0"> +<li>ok</li> +</ol> +```````````````````````````````` + + +```````````````````````````````` example +003. ok +. +<ol start="3"> +<li>ok</li> +</ol> +```````````````````````````````` + + +A start number may not be negative: + +```````````````````````````````` example +-1. not ok +. +<p>-1. not ok</p> +```````````````````````````````` + + + +2. **Item starting with indented code.** If a sequence of lines *Ls* + constitute a sequence of blocks *Bs* starting with an indented code + block, and *M* is a list marker of width *W* followed by + one space, then the result of prepending *M* and the following + space to the first line of *Ls*, and indenting subsequent lines of + *Ls* by *W + 1* spaces, is a list item with *Bs* as its contents. + If a line is empty, then it need not be indented. The type of the + list item (bullet or ordered) is determined by the type of its list + marker. If the list item is ordered, then it is also assigned a + start number, based on the ordered list marker. + +An indented code block will have to be indented four spaces beyond +the edge of the region where text will be included in the list item. +In the following case that is 6 spaces: + +```````````````````````````````` example +- foo + + bar +. +<ul> +<li> +<p>foo</p> +<pre><code>bar +</code></pre> +</li> +</ul> +```````````````````````````````` + + +And in this case it is 11 spaces: + +```````````````````````````````` example + 10. foo + + bar +. +<ol start="10"> +<li> +<p>foo</p> +<pre><code>bar +</code></pre> +</li> +</ol> +```````````````````````````````` + + +If the *first* block in the list item is an indented code block, +then by rule #2, the contents must be indented *one* space after the +list marker: + +```````````````````````````````` example + indented code + +paragraph + + more code +. +<pre><code>indented code +</code></pre> +<p>paragraph</p> +<pre><code>more code +</code></pre> +```````````````````````````````` + + +```````````````````````````````` example +1. indented code + + paragraph + + more code +. +<ol> +<li> +<pre><code>indented code +</code></pre> +<p>paragraph</p> +<pre><code>more code +</code></pre> +</li> +</ol> +```````````````````````````````` + + +Note that an additional space indent is interpreted as space +inside the code block: + +```````````````````````````````` example +1. indented code + + paragraph + + more code +. +<ol> +<li> +<pre><code> indented code +</code></pre> +<p>paragraph</p> +<pre><code>more code +</code></pre> +</li> +</ol> +```````````````````````````````` + + +Note that rules #1 and #2 only apply to two cases: (a) cases +in which the lines to be included in a list item begin with a +[non-whitespace character], and (b) cases in which +they begin with an indented code +block. In a case like the following, where the first block begins with +a three-space indent, the rules do not allow us to form a list item by +indenting the whole thing and prepending a list marker: + +```````````````````````````````` example + foo + +bar +. +<p>foo</p> +<p>bar</p> +```````````````````````````````` + + +```````````````````````````````` example +- foo + + bar +. +<ul> +<li>foo</li> +</ul> +<p>bar</p> +```````````````````````````````` + + +This is not a significant restriction, because when a block begins +with 1-3 spaces indent, the indentation can always be removed without +a change in interpretation, allowing rule #1 to be applied. So, in +the above case: + +```````````````````````````````` example +- foo + + bar +. +<ul> +<li> +<p>foo</p> +<p>bar</p> +</li> +</ul> +```````````````````````````````` + + +3. **Item starting with a blank line.** If a sequence of lines *Ls* + starting with a single [blank line] constitute a (possibly empty) + sequence of blocks *Bs*, not separated from each other by more than + one blank line, and *M* is a list marker of width *W*, + then the result of prepending *M* to the first line of *Ls*, and + indenting subsequent lines of *Ls* by *W + 1* spaces, is a list + item with *Bs* as its contents. + If a line is empty, then it need not be indented. The type of the + list item (bullet or ordered) is determined by the type of its list + marker. If the list item is ordered, then it is also assigned a + start number, based on the ordered list marker. + +Here are some list items that start with a blank line but are not empty: + +```````````````````````````````` example +- + foo +- + ``` + bar + ``` +- + baz +. +<ul> +<li>foo</li> +<li> +<pre><code>bar +</code></pre> +</li> +<li> +<pre><code>baz +</code></pre> +</li> +</ul> +```````````````````````````````` + +When the list item starts with a blank line, the number of spaces +following the list marker doesn't change the required indentation: + +```````````````````````````````` example +- + foo +. +<ul> +<li>foo</li> +</ul> +```````````````````````````````` + + +A list item can begin with at most one blank line. +In the following example, `foo` is not part of the list +item: + +```````````````````````````````` example +- + + foo +. +<ul> +<li></li> +</ul> +<p>foo</p> +```````````````````````````````` + + +Here is an empty bullet list item: + +```````````````````````````````` example +- foo +- +- bar +. +<ul> +<li>foo</li> +<li></li> +<li>bar</li> +</ul> +```````````````````````````````` + + +It does not matter whether there are spaces following the [list marker]: + +```````````````````````````````` example +- foo +- +- bar +. +<ul> +<li>foo</li> +<li></li> +<li>bar</li> +</ul> +```````````````````````````````` + + +Here is an empty ordered list item: + +```````````````````````````````` example +1. foo +2. +3. bar +. +<ol> +<li>foo</li> +<li></li> +<li>bar</li> +</ol> +```````````````````````````````` + + +A list may start or end with an empty list item: + +```````````````````````````````` example +* +. +<ul> +<li></li> +</ul> +```````````````````````````````` + +However, an empty list item cannot interrupt a paragraph: + +```````````````````````````````` example +foo +* + +foo +1. +. +<p>foo +*</p> +<p>foo +1.</p> +```````````````````````````````` + + +4. **Indentation.** If a sequence of lines *Ls* constitutes a list item + according to rule #1, #2, or #3, then the result of indenting each line + of *Ls* by 1-3 spaces (the same for each line) also constitutes a + list item with the same contents and attributes. If a line is + empty, then it need not be indented. + +Indented one space: + +```````````````````````````````` example + 1. A paragraph + with two lines. + + indented code + + > A block quote. +. +<ol> +<li> +<p>A paragraph +with two lines.</p> +<pre><code>indented code +</code></pre> +<blockquote> +<p>A block quote.</p> +</blockquote> +</li> +</ol> +```````````````````````````````` + + +Indented two spaces: + +```````````````````````````````` example + 1. A paragraph + with two lines. + + indented code + + > A block quote. +. +<ol> +<li> +<p>A paragraph +with two lines.</p> +<pre><code>indented code +</code></pre> +<blockquote> +<p>A block quote.</p> +</blockquote> +</li> +</ol> +```````````````````````````````` + + +Indented three spaces: + +```````````````````````````````` example + 1. A paragraph + with two lines. + + indented code + + > A block quote. +. +<ol> +<li> +<p>A paragraph +with two lines.</p> +<pre><code>indented code +</code></pre> +<blockquote> +<p>A block quote.</p> +</blockquote> +</li> +</ol> +```````````````````````````````` + + +Four spaces indent gives a code block: + +```````````````````````````````` example + 1. A paragraph + with two lines. + + indented code + + > A block quote. +. +<pre><code>1. A paragraph + with two lines. + + indented code + + > A block quote. +</code></pre> +```````````````````````````````` + + + +5. **Laziness.** If a string of lines *Ls* constitute a [list + item](#list-items) with contents *Bs*, then the result of deleting + some or all of the indentation from one or more lines in which the + next [non-whitespace character] after the indentation is + [paragraph continuation text] is a + list item with the same contents and attributes. The unindented + lines are called + [lazy continuation line](@)s. + +Here is an example with [lazy continuation lines]: + +```````````````````````````````` example + 1. A paragraph +with two lines. + + indented code + + > A block quote. +. +<ol> +<li> +<p>A paragraph +with two lines.</p> +<pre><code>indented code +</code></pre> +<blockquote> +<p>A block quote.</p> +</blockquote> +</li> +</ol> +```````````````````````````````` + + +Indentation can be partially deleted: + +```````````````````````````````` example + 1. A paragraph + with two lines. +. +<ol> +<li>A paragraph +with two lines.</li> +</ol> +```````````````````````````````` + + +These examples show how laziness can work in nested structures: + +```````````````````````````````` example +> 1. > Blockquote +continued here. +. +<blockquote> +<ol> +<li> +<blockquote> +<p>Blockquote +continued here.</p> +</blockquote> +</li> +</ol> +</blockquote> +```````````````````````````````` + + +```````````````````````````````` example +> 1. > Blockquote +> continued here. +. +<blockquote> +<ol> +<li> +<blockquote> +<p>Blockquote +continued here.</p> +</blockquote> +</li> +</ol> +</blockquote> +```````````````````````````````` + + + +6. **That's all.** Nothing that is not counted as a list item by rules + #1--5 counts as a [list item](#list-items). + +The rules for sublists follow from the general rules +[above][List items]. A sublist must be indented the same number +of spaces a paragraph would need to be in order to be included +in the list item. + +So, in this case we need two spaces indent: + +```````````````````````````````` example +- foo + - bar + - baz + - boo +. +<ul> +<li>foo +<ul> +<li>bar +<ul> +<li>baz +<ul> +<li>boo</li> +</ul> +</li> +</ul> +</li> +</ul> +</li> +</ul> +```````````````````````````````` + + +One is not enough: + +```````````````````````````````` example +- foo + - bar + - baz + - boo +. +<ul> +<li>foo</li> +<li>bar</li> +<li>baz</li> +<li>boo</li> +</ul> +```````````````````````````````` + + +Here we need four, because the list marker is wider: + +```````````````````````````````` example +10) foo + - bar +. +<ol start="10"> +<li>foo +<ul> +<li>bar</li> +</ul> +</li> +</ol> +```````````````````````````````` + + +Three is not enough: + +```````````````````````````````` example +10) foo + - bar +. +<ol start="10"> +<li>foo</li> +</ol> +<ul> +<li>bar</li> +</ul> +```````````````````````````````` + + +A list may be the first block in a list item: + +```````````````````````````````` example +- - foo +. +<ul> +<li> +<ul> +<li>foo</li> +</ul> +</li> +</ul> +```````````````````````````````` + + +```````````````````````````````` example +1. - 2. foo +. +<ol> +<li> +<ul> +<li> +<ol start="2"> +<li>foo</li> +</ol> +</li> +</ul> +</li> +</ol> +```````````````````````````````` + + +A list item can contain a heading: + +```````````````````````````````` example +- # Foo +- Bar + --- + baz +. +<ul> +<li> +<h1>Foo</h1> +</li> +<li> +<h2>Bar</h2> +baz</li> +</ul> +```````````````````````````````` + + +### Motivation + +John Gruber's Markdown spec says the following about list items: + +1. "List markers typically start at the left margin, but may be indented + by up to three spaces. List markers must be followed by one or more + spaces or a tab." + +2. "To make lists look nice, you can wrap items with hanging indents.... + But if you don't want to, you don't have to." + +3. "List items may consist of multiple paragraphs. Each subsequent + paragraph in a list item must be indented by either 4 spaces or one + tab." + +4. "It looks nice if you indent every line of the subsequent paragraphs, + but here again, Markdown will allow you to be lazy." + +5. "To put a blockquote within a list item, the blockquote's `>` + delimiters need to be indented." + +6. "To put a code block within a list item, the code block needs to be + indented twice — 8 spaces or two tabs." + +These rules specify that a paragraph under a list item must be indented +four spaces (presumably, from the left margin, rather than the start of +the list marker, but this is not said), and that code under a list item +must be indented eight spaces instead of the usual four. They also say +that a block quote must be indented, but not by how much; however, the +example given has four spaces indentation. Although nothing is said +about other kinds of block-level content, it is certainly reasonable to +infer that *all* block elements under a list item, including other +lists, must be indented four spaces. This principle has been called the +*four-space rule*. + +The four-space rule is clear and principled, and if the reference +implementation `Markdown.pl` had followed it, it probably would have +become the standard. However, `Markdown.pl` allowed paragraphs and +sublists to start with only two spaces indentation, at least on the +outer level. Worse, its behavior was inconsistent: a sublist of an +outer-level list needed two spaces indentation, but a sublist of this +sublist needed three spaces. It is not surprising, then, that different +implementations of Markdown have developed very different rules for +determining what comes under a list item. (Pandoc and python-Markdown, +for example, stuck with Gruber's syntax description and the four-space +rule, while discount, redcarpet, marked, PHP Markdown, and others +followed `Markdown.pl`'s behavior more closely.) + +Unfortunately, given the divergences between implementations, there +is no way to give a spec for list items that will be guaranteed not +to break any existing documents. However, the spec given here should +correctly handle lists formatted with either the four-space rule or +the more forgiving `Markdown.pl` behavior, provided they are laid out +in a way that is natural for a human to read. + +The strategy here is to let the width and indentation of the list marker +determine the indentation necessary for blocks to fall under the list +item, rather than having a fixed and arbitrary number. The writer can +think of the body of the list item as a unit which gets indented to the +right enough to fit the list marker (and any indentation on the list +marker). (The laziness rule, #5, then allows continuation lines to be +unindented if needed.) + +This rule is superior, we claim, to any rule requiring a fixed level of +indentation from the margin. The four-space rule is clear but +unnatural. It is quite unintuitive that + +``` markdown +- foo + + bar + + - baz +``` + +should be parsed as two lists with an intervening paragraph, + +``` html +<ul> +<li>foo</li> +</ul> +<p>bar</p> +<ul> +<li>baz</li> +</ul> +``` + +as the four-space rule demands, rather than a single list, + +``` html +<ul> +<li> +<p>foo</p> +<p>bar</p> +<ul> +<li>baz</li> +</ul> +</li> +</ul> +``` + +The choice of four spaces is arbitrary. It can be learned, but it is +not likely to be guessed, and it trips up beginners regularly. + +Would it help to adopt a two-space rule? The problem is that such +a rule, together with the rule allowing 1--3 spaces indentation of the +initial list marker, allows text that is indented *less than* the +original list marker to be included in the list item. For example, +`Markdown.pl` parses + +``` markdown + - one + + two +``` + +as a single list item, with `two` a continuation paragraph: + +``` html +<ul> +<li> +<p>one</p> +<p>two</p> +</li> +</ul> +``` + +and similarly + +``` markdown +> - one +> +> two +``` + +as + +``` html +<blockquote> +<ul> +<li> +<p>one</p> +<p>two</p> +</li> +</ul> +</blockquote> +``` + +This is extremely unintuitive. + +Rather than requiring a fixed indent from the margin, we could require +a fixed indent (say, two spaces, or even one space) from the list marker (which +may itself be indented). This proposal would remove the last anomaly +discussed. Unlike the spec presented above, it would count the following +as a list item with a subparagraph, even though the paragraph `bar` +is not indented as far as the first paragraph `foo`: + +``` markdown + 10. foo + + bar +``` + +Arguably this text does read like a list item with `bar` as a subparagraph, +which may count in favor of the proposal. However, on this proposal indented +code would have to be indented six spaces after the list marker. And this +would break a lot of existing Markdown, which has the pattern: + +``` markdown +1. foo + + indented code +``` + +where the code is indented eight spaces. The spec above, by contrast, will +parse this text as expected, since the code block's indentation is measured +from the beginning of `foo`. + +The one case that needs special treatment is a list item that *starts* +with indented code. How much indentation is required in that case, since +we don't have a "first paragraph" to measure from? Rule #2 simply stipulates +that in such cases, we require one space indentation from the list marker +(and then the normal four spaces for the indented code). This will match the +four-space rule in cases where the list marker plus its initial indentation +takes four spaces (a common case), but diverge in other cases. + +<div class="extension"> + +## Task list items (extension) + +GFM enables the `tasklist` extension, where an additional processing step is +performed on [list items]. + +A [task list item](@) is a [list item][list items] where the first block in it +is a paragraph which begins with a [task list item marker] and at least one +whitespace character before any other content. + +A [task list item marker](@) consists of an optional number of spaces, a left +bracket (`[`), either a whitespace character or the letter `x` in either +lowercase or uppercase, and then a right bracket (`]`). + +When rendered, the [task list item marker] is replaced with a semantic checkbox element; +in an HTML output, this would be an `<input type="checkbox">` element. + +If the character between the brackets is a whitespace character, the checkbox +is unchecked. Otherwise, the checkbox is checked. + +This spec does not define how the checkbox elements are interacted with: in practice, +implementors are free to render the checkboxes as disabled or inmutable elements, +or they may dynamically handle dynamic interactions (i.e. checking, unchecking) in +the final rendered document. + +```````````````````````````````` example disabled +- [ ] foo +- [x] bar +. +<ul> +<li><input disabled="" type="checkbox"> foo</li> +<li><input checked="" disabled="" type="checkbox"> bar</li> +</ul> +```````````````````````````````` + +Task lists can be arbitrarily nested: + +```````````````````````````````` example disabled +- [x] foo + - [ ] bar + - [x] baz +- [ ] bim +. +<ul> +<li><input checked="" disabled="" type="checkbox"> foo +<ul> +<li><input disabled="" type="checkbox"> bar</li> +<li><input checked="" disabled="" type="checkbox"> baz</li> +</ul> +</li> +<li><input disabled="" type="checkbox"> bim</li> +</ul> +```````````````````````````````` + +</div> + +## Lists + +A [list](@) is a sequence of one or more +list items [of the same type]. The list items +may be separated by any number of blank lines. + +Two list items are [of the same type](@) +if they begin with a [list marker] of the same type. +Two list markers are of the +same type if (a) they are bullet list markers using the same character +(`-`, `+`, or `*`) or (b) they are ordered list numbers with the same +delimiter (either `.` or `)`). + +A list is an [ordered list](@) +if its constituent list items begin with +[ordered list markers], and a +[bullet list](@) if its constituent list +items begin with [bullet list markers]. + +The [start number](@) +of an [ordered list] is determined by the list number of +its initial list item. The numbers of subsequent list items are +disregarded. + +A list is [loose](@) if any of its constituent +list items are separated by blank lines, or if any of its constituent +list items directly contain two block-level elements with a blank line +between them. Otherwise a list is [tight](@). +(The difference in HTML output is that paragraphs in a loose list are +wrapped in `<p>` tags, while paragraphs in a tight list are not.) + +Changing the bullet or ordered list delimiter starts a new list: + +```````````````````````````````` example +- foo +- bar ++ baz +. +<ul> +<li>foo</li> +<li>bar</li> +</ul> +<ul> +<li>baz</li> +</ul> +```````````````````````````````` + + +```````````````````````````````` example +1. foo +2. bar +3) baz +. +<ol> +<li>foo</li> +<li>bar</li> +</ol> +<ol start="3"> +<li>baz</li> +</ol> +```````````````````````````````` + + +In CommonMark, a list can interrupt a paragraph. That is, +no blank line is needed to separate a paragraph from a following +list: + +```````````````````````````````` example +Foo +- bar +- baz +. +<p>Foo</p> +<ul> +<li>bar</li> +<li>baz</li> +</ul> +```````````````````````````````` + +`Markdown.pl` does not allow this, through fear of triggering a list +via a numeral in a hard-wrapped line: + +``` markdown +The number of windows in my house is +14. The number of doors is 6. +``` + +Oddly, though, `Markdown.pl` *does* allow a blockquote to +interrupt a paragraph, even though the same considerations might +apply. + +In CommonMark, we do allow lists to interrupt paragraphs, for +two reasons. First, it is natural and not uncommon for people +to start lists without blank lines: + +``` markdown +I need to buy +- new shoes +- a coat +- a plane ticket +``` + +Second, we are attracted to a + +> [principle of uniformity](@): +> if a chunk of text has a certain +> meaning, it will continue to have the same meaning when put into a +> container block (such as a list item or blockquote). + +(Indeed, the spec for [list items] and [block quotes] presupposes +this principle.) This principle implies that if + +``` markdown + * I need to buy + - new shoes + - a coat + - a plane ticket +``` + +is a list item containing a paragraph followed by a nested sublist, +as all Markdown implementations agree it is (though the paragraph +may be rendered without `<p>` tags, since the list is "tight"), +then + +``` markdown +I need to buy +- new shoes +- a coat +- a plane ticket +``` + +by itself should be a paragraph followed by a nested sublist. + +Since it is well established Markdown practice to allow lists to +interrupt paragraphs inside list items, the [principle of +uniformity] requires us to allow this outside list items as +well. ([reStructuredText](http://docutils.sourceforge.net/rst.html) +takes a different approach, requiring blank lines before lists +even inside other list items.) + +In order to solve of unwanted lists in paragraphs with +hard-wrapped numerals, we allow only lists starting with `1` to +interrupt paragraphs. Thus, + +```````````````````````````````` example +The number of windows in my house is +14. The number of doors is 6. +. +<p>The number of windows in my house is +14. The number of doors is 6.</p> +```````````````````````````````` + +We may still get an unintended result in cases like + +```````````````````````````````` example +The number of windows in my house is +1. The number of doors is 6. +. +<p>The number of windows in my house is</p> +<ol> +<li>The number of doors is 6.</li> +</ol> +```````````````````````````````` + +but this rule should prevent most spurious list captures. + +There can be any number of blank lines between items: + +```````````````````````````````` example +- foo + +- bar + + +- baz +. +<ul> +<li> +<p>foo</p> +</li> +<li> +<p>bar</p> +</li> +<li> +<p>baz</p> +</li> +</ul> +```````````````````````````````` + +```````````````````````````````` example +- foo + - bar + - baz + + + bim +. +<ul> +<li>foo +<ul> +<li>bar +<ul> +<li> +<p>baz</p> +<p>bim</p> +</li> +</ul> +</li> +</ul> +</li> +</ul> +```````````````````````````````` + + +To separate consecutive lists of the same type, or to separate a +list from an indented code block that would otherwise be parsed +as a subparagraph of the final list item, you can insert a blank HTML +comment: + +```````````````````````````````` example +- foo +- bar + +<!-- --> + +- baz +- bim +. +<ul> +<li>foo</li> +<li>bar</li> +</ul> +<!-- --> +<ul> +<li>baz</li> +<li>bim</li> +</ul> +```````````````````````````````` + + +```````````````````````````````` example +- foo + + notcode + +- foo + +<!-- --> + + code +. +<ul> +<li> +<p>foo</p> +<p>notcode</p> +</li> +<li> +<p>foo</p> +</li> +</ul> +<!-- --> +<pre><code>code +</code></pre> +```````````````````````````````` + + +List items need not be indented to the same level. The following +list items will be treated as items at the same list level, +since none is indented enough to belong to the previous list +item: + +```````````````````````````````` example +- a + - b + - c + - d + - e + - f +- g +. +<ul> +<li>a</li> +<li>b</li> +<li>c</li> +<li>d</li> +<li>e</li> +<li>f</li> +<li>g</li> +</ul> +```````````````````````````````` + + +```````````````````````````````` example +1. a + + 2. b + + 3. c +. +<ol> +<li> +<p>a</p> +</li> +<li> +<p>b</p> +</li> +<li> +<p>c</p> +</li> +</ol> +```````````````````````````````` + +Note, however, that list items may not be indented more than +three spaces. Here `- e` is treated as a paragraph continuation +line, because it is indented more than three spaces: + +```````````````````````````````` example +- a + - b + - c + - d + - e +. +<ul> +<li>a</li> +<li>b</li> +<li>c</li> +<li>d +- e</li> +</ul> +```````````````````````````````` + +And here, `3. c` is treated as in indented code block, +because it is indented four spaces and preceded by a +blank line. + +```````````````````````````````` example +1. a + + 2. b + + 3. c +. +<ol> +<li> +<p>a</p> +</li> +<li> +<p>b</p> +</li> +</ol> +<pre><code>3. c +</code></pre> +```````````````````````````````` + + +This is a loose list, because there is a blank line between +two of the list items: + +```````````````````````````````` example +- a +- b + +- c +. +<ul> +<li> +<p>a</p> +</li> +<li> +<p>b</p> +</li> +<li> +<p>c</p> +</li> +</ul> +```````````````````````````````` + + +So is this, with a empty second item: + +```````````````````````````````` example +* a +* + +* c +. +<ul> +<li> +<p>a</p> +</li> +<li></li> +<li> +<p>c</p> +</li> +</ul> +```````````````````````````````` + + +These are loose lists, even though there is no space between the items, +because one of the items directly contains two block-level elements +with a blank line between them: + +```````````````````````````````` example +- a +- b + + c +- d +. +<ul> +<li> +<p>a</p> +</li> +<li> +<p>b</p> +<p>c</p> +</li> +<li> +<p>d</p> +</li> +</ul> +```````````````````````````````` + + +```````````````````````````````` example +- a +- b + + [ref]: /url +- d +. +<ul> +<li> +<p>a</p> +</li> +<li> +<p>b</p> +</li> +<li> +<p>d</p> +</li> +</ul> +```````````````````````````````` + + +This is a tight list, because the blank lines are in a code block: + +```````````````````````````````` example +- a +- ``` + b + + + ``` +- c +. +<ul> +<li>a</li> +<li> +<pre><code>b + + +</code></pre> +</li> +<li>c</li> +</ul> +```````````````````````````````` + + +This is a tight list, because the blank line is between two +paragraphs of a sublist. So the sublist is loose while +the outer list is tight: + +```````````````````````````````` example +- a + - b + + c +- d +. +<ul> +<li>a +<ul> +<li> +<p>b</p> +<p>c</p> +</li> +</ul> +</li> +<li>d</li> +</ul> +```````````````````````````````` + + +This is a tight list, because the blank line is inside the +block quote: + +```````````````````````````````` example +* a + > b + > +* c +. +<ul> +<li>a +<blockquote> +<p>b</p> +</blockquote> +</li> +<li>c</li> +</ul> +```````````````````````````````` + + +This list is tight, because the consecutive block elements +are not separated by blank lines: + +```````````````````````````````` example +- a + > b + ``` + c + ``` +- d +. +<ul> +<li>a +<blockquote> +<p>b</p> +</blockquote> +<pre><code>c +</code></pre> +</li> +<li>d</li> +</ul> +```````````````````````````````` + + +A single-paragraph list is tight: + +```````````````````````````````` example +- a +. +<ul> +<li>a</li> +</ul> +```````````````````````````````` + + +```````````````````````````````` example +- a + - b +. +<ul> +<li>a +<ul> +<li>b</li> +</ul> +</li> +</ul> +```````````````````````````````` + + +This list is loose, because of the blank line between the +two block elements in the list item: + +```````````````````````````````` example +1. ``` + foo + ``` + + bar +. +<ol> +<li> +<pre><code>foo +</code></pre> +<p>bar</p> +</li> +</ol> +```````````````````````````````` + + +Here the outer list is loose, the inner list tight: + +```````````````````````````````` example +* foo + * bar + + baz +. +<ul> +<li> +<p>foo</p> +<ul> +<li>bar</li> +</ul> +<p>baz</p> +</li> +</ul> +```````````````````````````````` + + +```````````````````````````````` example +- a + - b + - c + +- d + - e + - f +. +<ul> +<li> +<p>a</p> +<ul> +<li>b</li> +<li>c</li> +</ul> +</li> +<li> +<p>d</p> +<ul> +<li>e</li> +<li>f</li> +</ul> +</li> +</ul> +```````````````````````````````` + + +# Inlines + +Inlines are parsed sequentially from the beginning of the character +stream to the end (left to right, in left-to-right languages). +Thus, for example, in + +```````````````````````````````` example +`hi`lo` +. +<p><code>hi</code>lo`</p> +```````````````````````````````` + +`hi` is parsed as code, leaving the backtick at the end as a literal +backtick. + + +## Backslash escapes + +Any ASCII punctuation character may be backslash-escaped: + +```````````````````````````````` example +\!\"\#\$\%\&\'\(\)\*\+\,\-\.\/\:\;\<\=\>\?\@\[\\\]\^\_\`\{\|\}\~ +. +<p>!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~</p> +```````````````````````````````` + + +Backslashes before other characters are treated as literal +backslashes: + +```````````````````````````````` example +\ \A\a\ \3\φ\« +. +<p>\ \A\a\ \3\φ\«</p> +```````````````````````````````` + + +Escaped characters are treated as regular characters and do +not have their usual Markdown meanings: + +```````````````````````````````` example +\*not emphasized* +\<br/> not a tag +\[not a link](/foo) +\`not code` +1\. not a list +\* not a list +\# not a heading +\[foo]: /url "not a reference" +\ö not a character entity +. +<p>*not emphasized* +<br/> not a tag +[not a link](/foo) +`not code` +1. not a list +* not a list +# not a heading +[foo]: /url "not a reference" +&ouml; not a character entity</p> +```````````````````````````````` + + +If a backslash is itself escaped, the following character is not: + +```````````````````````````````` example +\\*emphasis* +. +<p>\<em>emphasis</em></p> +```````````````````````````````` + + +A backslash at the end of the line is a [hard line break]: + +```````````````````````````````` example +foo\ +bar +. +<p>foo<br /> +bar</p> +```````````````````````````````` + + +Backslash escapes do not work in code blocks, code spans, autolinks, or +raw HTML: + +```````````````````````````````` example +`` \[\` `` +. +<p><code>\[\`</code></p> +```````````````````````````````` + + +```````````````````````````````` example + \[\] +. +<pre><code>\[\] +</code></pre> +```````````````````````````````` + + +```````````````````````````````` example +~~~ +\[\] +~~~ +. +<pre><code>\[\] +</code></pre> +```````````````````````````````` + + +```````````````````````````````` example +<http://example.com?find=\*> +. +<p><a href="http://example.com?find=%5C*">http://example.com?find=\*</a></p> +```````````````````````````````` + + +```````````````````````````````` example +<a href="/bar\/)"> +. +<a href="/bar\/)"> +```````````````````````````````` + + +But they work in all other contexts, including URLs and link titles, +link references, and [info strings] in [fenced code blocks]: + +```````````````````````````````` example +[foo](/bar\* "ti\*tle") +. +<p><a href="/bar*" title="ti*tle">foo</a></p> +```````````````````````````````` + + +```````````````````````````````` example +[foo] + +[foo]: /bar\* "ti\*tle" +. +<p><a href="/bar*" title="ti*tle">foo</a></p> +```````````````````````````````` + + +```````````````````````````````` example +``` foo\+bar +foo +``` +. +<pre><code class="language-foo+bar">foo +</code></pre> +```````````````````````````````` + + + +## Entity and numeric character references + +Valid HTML entity references and numeric character references +can be used in place of the corresponding Unicode character, +with the following exceptions: + +- Entity and character references are not recognized in code + blocks and code spans. + +- Entity and character references cannot stand in place of + special characters that define structural elements in + CommonMark. For example, although `*` can be used + in place of a literal `*` character, `*` cannot replace + `*` in emphasis delimiters, bullet list markers, or thematic + breaks. + +Conforming CommonMark parsers need not store information about +whether a particular character was represented in the source +using a Unicode character or an entity reference. + +[Entity references](@) consist of `&` + any of the valid +HTML5 entity names + `;`. The +document <https://html.spec.whatwg.org/multipage/entities.json> +is used as an authoritative source for the valid entity +references and their corresponding code points. + +```````````````````````````````` example +  & © Æ Ď +¾ ℋ ⅆ +∲ ≧̸ +. +<p>  & © Æ Ď +¾ ℋ ⅆ +∲ ≧̸</p> +```````````````````````````````` + + +[Decimal numeric character +references](@) +consist of `&#` + a string of 1--7 arabic digits + `;`. A +numeric character reference is parsed as the corresponding +Unicode character. Invalid Unicode code points will be replaced by +the REPLACEMENT CHARACTER (`U+FFFD`). For security reasons, +the code point `U+0000` will also be replaced by `U+FFFD`. + +```````````````````````````````` example +# Ӓ Ϡ � +. +<p># Ӓ Ϡ �</p> +```````````````````````````````` + + +[Hexadecimal numeric character +references](@) consist of `&#` + +either `X` or `x` + a string of 1-6 hexadecimal digits + `;`. +They too are parsed as the corresponding Unicode character (this +time specified with a hexadecimal numeral instead of decimal). + +```````````````````````````````` example +" ആ ಫ +. +<p>" ആ ಫ</p> +```````````````````````````````` + + +Here are some nonentities: + +```````````````````````````````` example +  &x; &#; &#x; +� +&#abcdef0; +&ThisIsNotDefined; &hi?; +. +<p>&nbsp &x; &#; &#x; +&#987654321; +&#abcdef0; +&ThisIsNotDefined; &hi?;</p> +```````````````````````````````` + + +Although HTML5 does accept some entity references +without a trailing semicolon (such as `©`), these are not +recognized here, because it makes the grammar too ambiguous: + +```````````````````````````````` example +© +. +<p>&copy</p> +```````````````````````````````` + + +Strings that are not on the list of HTML5 named entities are not +recognized as entity references either: + +```````````````````````````````` example +&MadeUpEntity; +. +<p>&MadeUpEntity;</p> +```````````````````````````````` + + +Entity and numeric character references are recognized in any +context besides code spans or code blocks, including +URLs, [link titles], and [fenced code block][] [info strings]: + +```````````````````````````````` example +<a href="öö.html"> +. +<a href="öö.html"> +```````````````````````````````` + + +```````````````````````````````` example +[foo](/föö "föö") +. +<p><a href="/f%C3%B6%C3%B6" title="föö">foo</a></p> +```````````````````````````````` + + +```````````````````````````````` example +[foo] + +[foo]: /föö "föö" +. +<p><a href="/f%C3%B6%C3%B6" title="föö">foo</a></p> +```````````````````````````````` + + +```````````````````````````````` example +``` föö +foo +``` +. +<pre><code class="language-föö">foo +</code></pre> +```````````````````````````````` + + +Entity and numeric character references are treated as literal +text in code spans and code blocks: + +```````````````````````````````` example +`föö` +. +<p><code>f&ouml;&ouml;</code></p> +```````````````````````````````` + + +```````````````````````````````` example + föfö +. +<pre><code>f&ouml;f&ouml; +</code></pre> +```````````````````````````````` + + +Entity and numeric character references cannot be used +in place of symbols indicating structure in CommonMark +documents. + +```````````````````````````````` example +*foo* +*foo* +. +<p>*foo* +<em>foo</em></p> +```````````````````````````````` + +```````````````````````````````` example +* foo + +* foo +. +<p>* foo</p> +<ul> +<li>foo</li> +</ul> +```````````````````````````````` + +```````````````````````````````` example +foo bar +. +<p>foo + +bar</p> +```````````````````````````````` + +```````````````````````````````` example + foo +. +<p> foo</p> +```````````````````````````````` + + +```````````````````````````````` example +[a](url "tit") +. +<p>[a](url "tit")</p> +```````````````````````````````` + + +## Code spans + +A [backtick string](@) +is a string of one or more backtick characters (`` ` ``) that is neither +preceded nor followed by a backtick. + +A [code span](@) begins with a backtick string and ends with +a backtick string of equal length. The contents of the code span are +the characters between the two backtick strings, normalized in the +following ways: + +- First, [line endings] are converted to [spaces]. +- If the resulting string both begins *and* ends with a [space] + character, but does not consist entirely of [space] + characters, a single [space] character is removed from the + front and back. This allows you to include code that begins + or ends with backtick characters, which must be separated by + whitespace from the opening or closing backtick strings. + +This is a simple code span: + +```````````````````````````````` example +`foo` +. +<p><code>foo</code></p> +```````````````````````````````` + + +Here two backticks are used, because the code contains a backtick. +This example also illustrates stripping of a single leading and +trailing space: + +```````````````````````````````` example +`` foo ` bar `` +. +<p><code>foo ` bar</code></p> +```````````````````````````````` + + +This example shows the motivation for stripping leading and trailing +spaces: + +```````````````````````````````` example +` `` ` +. +<p><code>``</code></p> +```````````````````````````````` + +Note that only *one* space is stripped: + +```````````````````````````````` example +` `` ` +. +<p><code> `` </code></p> +```````````````````````````````` + +The stripping only happens if the space is on both +sides of the string: + +```````````````````````````````` example +` a` +. +<p><code> a</code></p> +```````````````````````````````` + +Only [spaces], and not [unicode whitespace] in general, are +stripped in this way: + +```````````````````````````````` example +` b ` +. +<p><code> b </code></p> +```````````````````````````````` + +No stripping occurs if the code span contains only spaces: + +```````````````````````````````` example +` ` +` ` +. +<p><code> </code> +<code> </code></p> +```````````````````````````````` + + +[Line endings] are treated like spaces: + +```````````````````````````````` example +`` +foo +bar +baz +`` +. +<p><code>foo bar baz</code></p> +```````````````````````````````` + +```````````````````````````````` example +`` +foo +`` +. +<p><code>foo </code></p> +```````````````````````````````` + + +Interior spaces are not collapsed: + +```````````````````````````````` example +`foo bar +baz` +. +<p><code>foo bar baz</code></p> +```````````````````````````````` + +Note that browsers will typically collapse consecutive spaces +when rendering `<code>` elements, so it is recommended that +the following CSS be used: + + code{white-space: pre-wrap;} + + +Note that backslash escapes do not work in code spans. All backslashes +are treated literally: + +```````````````````````````````` example +`foo\`bar` +. +<p><code>foo\</code>bar`</p> +```````````````````````````````` + + +Backslash escapes are never needed, because one can always choose a +string of *n* backtick characters as delimiters, where the code does +not contain any strings of exactly *n* backtick characters. + +```````````````````````````````` example +``foo`bar`` +. +<p><code>foo`bar</code></p> +```````````````````````````````` + +```````````````````````````````` example +` foo `` bar ` +. +<p><code>foo `` bar</code></p> +```````````````````````````````` + + +Code span backticks have higher precedence than any other inline +constructs except HTML tags and autolinks. Thus, for example, this is +not parsed as emphasized text, since the second `*` is part of a code +span: + +```````````````````````````````` example +*foo`*` +. +<p>*foo<code>*</code></p> +```````````````````````````````` + + +And this is not parsed as a link: + +```````````````````````````````` example +[not a `link](/foo`) +. +<p>[not a <code>link](/foo</code>)</p> +```````````````````````````````` + + +Code spans, HTML tags, and autolinks have the same precedence. +Thus, this is code: + +```````````````````````````````` example +`<a href="`">` +. +<p><code><a href="</code>">`</p> +```````````````````````````````` + + +But this is an HTML tag: + +```````````````````````````````` example +<a href="`">` +. +<p><a href="`">`</p> +```````````````````````````````` + + +And this is code: + +```````````````````````````````` example +`<http://foo.bar.`baz>` +. +<p><code><http://foo.bar.</code>baz>`</p> +```````````````````````````````` + + +But this is an autolink: + +```````````````````````````````` example +<http://foo.bar.`baz>` +. +<p><a href="http://foo.bar.%60baz">http://foo.bar.`baz</a>`</p> +```````````````````````````````` + + +When a backtick string is not closed by a matching backtick string, +we just have literal backticks: + +```````````````````````````````` example +```foo`` +. +<p>```foo``</p> +```````````````````````````````` + + +```````````````````````````````` example +`foo +. +<p>`foo</p> +```````````````````````````````` + +The following case also illustrates the need for opening and +closing backtick strings to be equal in length: + +```````````````````````````````` example +`foo``bar`` +. +<p>`foo<code>bar</code></p> +```````````````````````````````` + + +## Emphasis and strong emphasis + +John Gruber's original [Markdown syntax +description](http://daringfireball.net/projects/markdown/syntax#em) says: + +> Markdown treats asterisks (`*`) and underscores (`_`) as indicators of +> emphasis. Text wrapped with one `*` or `_` will be wrapped with an HTML +> `<em>` tag; double `*`'s or `_`'s will be wrapped with an HTML `<strong>` +> tag. + +This is enough for most users, but these rules leave much undecided, +especially when it comes to nested emphasis. The original +`Markdown.pl` test suite makes it clear that triple `***` and +`___` delimiters can be used for strong emphasis, and most +implementations have also allowed the following patterns: + +``` markdown +***strong emph*** +***strong** in emph* +***emph* in strong** +**in strong *emph*** +*in emph **strong*** +``` + +The following patterns are less widely supported, but the intent +is clear and they are useful (especially in contexts like bibliography +entries): + +``` markdown +*emph *with emph* in it* +**strong **with strong** in it** +``` + +Many implementations have also restricted intraword emphasis to +the `*` forms, to avoid unwanted emphasis in words containing +internal underscores. (It is best practice to put these in code +spans, but users often do not.) + +``` markdown +internal emphasis: foo*bar*baz +no emphasis: foo_bar_baz +``` + +The rules given below capture all of these patterns, while allowing +for efficient parsing strategies that do not backtrack. + +First, some definitions. A [delimiter run](@) is either +a sequence of one or more `*` characters that is not preceded or +followed by a non-backslash-escaped `*` character, or a sequence +of one or more `_` characters that is not preceded or followed by +a non-backslash-escaped `_` character. + +A [left-flanking delimiter run](@) is +a [delimiter run] that is (1) not followed by [Unicode whitespace], +and either (2a) not followed by a [punctuation character], or +(2b) followed by a [punctuation character] and +preceded by [Unicode whitespace] or a [punctuation character]. +For purposes of this definition, the beginning and the end of +the line count as Unicode whitespace. + +A [right-flanking delimiter run](@) is +a [delimiter run] that is (1) not preceded by [Unicode whitespace], +and either (2a) not preceded by a [punctuation character], or +(2b) preceded by a [punctuation character] and +followed by [Unicode whitespace] or a [punctuation character]. +For purposes of this definition, the beginning and the end of +the line count as Unicode whitespace. + +Here are some examples of delimiter runs. + + - left-flanking but not right-flanking: + + ``` + ***abc + _abc + **"abc" + _"abc" + ``` + + - right-flanking but not left-flanking: + + ``` + abc*** + abc_ + "abc"** + "abc"_ + ``` + + - Both left and right-flanking: + + ``` + abc***def + "abc"_"def" + ``` + + - Neither left nor right-flanking: + + ``` + abc *** def + a _ b + ``` + +(The idea of distinguishing left-flanking and right-flanking +delimiter runs based on the character before and the character +after comes from Roopesh Chander's +[vfmd](http://www.vfmd.org/vfmd-spec/specification/#procedure-for-identifying-emphasis-tags). +vfmd uses the terminology "emphasis indicator string" instead of "delimiter +run," and its rules for distinguishing left- and right-flanking runs +are a bit more complex than the ones given here.) + +The following rules define emphasis and strong emphasis: + +1. A single `*` character [can open emphasis](@) + iff (if and only if) it is part of a [left-flanking delimiter run]. + +2. A single `_` character [can open emphasis] iff + it is part of a [left-flanking delimiter run] + and either (a) not part of a [right-flanking delimiter run] + or (b) part of a [right-flanking delimiter run] + preceded by punctuation. + +3. A single `*` character [can close emphasis](@) + iff it is part of a [right-flanking delimiter run]. + +4. A single `_` character [can close emphasis] iff + it is part of a [right-flanking delimiter run] + and either (a) not part of a [left-flanking delimiter run] + or (b) part of a [left-flanking delimiter run] + followed by punctuation. + +5. A double `**` [can open strong emphasis](@) + iff it is part of a [left-flanking delimiter run]. + +6. A double `__` [can open strong emphasis] iff + it is part of a [left-flanking delimiter run] + and either (a) not part of a [right-flanking delimiter run] + or (b) part of a [right-flanking delimiter run] + preceded by punctuation. + +7. A double `**` [can close strong emphasis](@) + iff it is part of a [right-flanking delimiter run]. + +8. A double `__` [can close strong emphasis] iff + it is part of a [right-flanking delimiter run] + and either (a) not part of a [left-flanking delimiter run] + or (b) part of a [left-flanking delimiter run] + followed by punctuation. + +9. Emphasis begins with a delimiter that [can open emphasis] and ends + with a delimiter that [can close emphasis], and that uses the same + character (`_` or `*`) as the opening delimiter. The + opening and closing delimiters must belong to separate + [delimiter runs]. If one of the delimiters can both + open and close emphasis, then the sum of the lengths of the + delimiter runs containing the opening and closing delimiters + must not be a multiple of 3 unless both lengths are + multiples of 3. + +10. Strong emphasis begins with a delimiter that + [can open strong emphasis] and ends with a delimiter that + [can close strong emphasis], and that uses the same character + (`_` or `*`) as the opening delimiter. The + opening and closing delimiters must belong to separate + [delimiter runs]. If one of the delimiters can both open + and close strong emphasis, then the sum of the lengths of + the delimiter runs containing the opening and closing + delimiters must not be a multiple of 3 unless both lengths + are multiples of 3. + +11. A literal `*` character cannot occur at the beginning or end of + `*`-delimited emphasis or `**`-delimited strong emphasis, unless it + is backslash-escaped. + +12. A literal `_` character cannot occur at the beginning or end of + `_`-delimited emphasis or `__`-delimited strong emphasis, unless it + is backslash-escaped. + +Where rules 1--12 above are compatible with multiple parsings, +the following principles resolve ambiguity: + +13. The number of nestings should be minimized. Thus, for example, + an interpretation `<strong>...</strong>` is always preferred to + `<em><em>...</em></em>`. + +14. An interpretation `<em><strong>...</strong></em>` is always + preferred to `<strong><em>...</em></strong>`. + +15. When two potential emphasis or strong emphasis spans overlap, + so that the second begins before the first ends and ends after + the first ends, the first takes precedence. Thus, for example, + `*foo _bar* baz_` is parsed as `<em>foo _bar</em> baz_` rather + than `*foo <em>bar* baz</em>`. + +16. When there are two potential emphasis or strong emphasis spans + with the same closing delimiter, the shorter one (the one that + opens later) takes precedence. Thus, for example, + `**foo **bar baz**` is parsed as `**foo <strong>bar baz</strong>` + rather than `<strong>foo **bar baz</strong>`. + +17. Inline code spans, links, images, and HTML tags group more tightly + than emphasis. So, when there is a choice between an interpretation + that contains one of these elements and one that does not, the + former always wins. Thus, for example, `*[foo*](bar)` is + parsed as `*<a href="bar">foo*</a>` rather than as + `<em>[foo</em>](bar)`. + +These rules can be illustrated through a series of examples. + +Rule 1: + +```````````````````````````````` example +*foo bar* +. +<p><em>foo bar</em></p> +```````````````````````````````` + + +This is not emphasis, because the opening `*` is followed by +whitespace, and hence not part of a [left-flanking delimiter run]: + +```````````````````````````````` example +a * foo bar* +. +<p>a * foo bar*</p> +```````````````````````````````` + + +This is not emphasis, because the opening `*` is preceded +by an alphanumeric and followed by punctuation, and hence +not part of a [left-flanking delimiter run]: + +```````````````````````````````` example +a*"foo"* +. +<p>a*"foo"*</p> +```````````````````````````````` + + +Unicode nonbreaking spaces count as whitespace, too: + +```````````````````````````````` example +* a * +. +<p>* a *</p> +```````````````````````````````` + + +Intraword emphasis with `*` is permitted: + +```````````````````````````````` example +foo*bar* +. +<p>foo<em>bar</em></p> +```````````````````````````````` + + +```````````````````````````````` example +5*6*78 +. +<p>5<em>6</em>78</p> +```````````````````````````````` + + +Rule 2: + +```````````````````````````````` example +_foo bar_ +. +<p><em>foo bar</em></p> +```````````````````````````````` + + +This is not emphasis, because the opening `_` is followed by +whitespace: + +```````````````````````````````` example +_ foo bar_ +. +<p>_ foo bar_</p> +```````````````````````````````` + + +This is not emphasis, because the opening `_` is preceded +by an alphanumeric and followed by punctuation: + +```````````````````````````````` example +a_"foo"_ +. +<p>a_"foo"_</p> +```````````````````````````````` + + +Emphasis with `_` is not allowed inside words: + +```````````````````````````````` example +foo_bar_ +. +<p>foo_bar_</p> +```````````````````````````````` + + +```````````````````````````````` example +5_6_78 +. +<p>5_6_78</p> +```````````````````````````````` + + +```````````````````````````````` example +пристаням_стремятся_ +. +<p>пристаням_стремятся_</p> +```````````````````````````````` + + +Here `_` does not generate emphasis, because the first delimiter run +is right-flanking and the second left-flanking: + +```````````````````````````````` example +aa_"bb"_cc +. +<p>aa_"bb"_cc</p> +```````````````````````````````` + + +This is emphasis, even though the opening delimiter is +both left- and right-flanking, because it is preceded by +punctuation: + +```````````````````````````````` example +foo-_(bar)_ +. +<p>foo-<em>(bar)</em></p> +```````````````````````````````` + + +Rule 3: + +This is not emphasis, because the closing delimiter does +not match the opening delimiter: + +```````````````````````````````` example +_foo* +. +<p>_foo*</p> +```````````````````````````````` + + +This is not emphasis, because the closing `*` is preceded by +whitespace: + +```````````````````````````````` example +*foo bar * +. +<p>*foo bar *</p> +```````````````````````````````` + + +A newline also counts as whitespace: + +```````````````````````````````` example +*foo bar +* +. +<p>*foo bar +*</p> +```````````````````````````````` + + +This is not emphasis, because the second `*` is +preceded by punctuation and followed by an alphanumeric +(hence it is not part of a [right-flanking delimiter run]: + +```````````````````````````````` example +*(*foo) +. +<p>*(*foo)</p> +```````````````````````````````` + + +The point of this restriction is more easily appreciated +with this example: + +```````````````````````````````` example +*(*foo*)* +. +<p><em>(<em>foo</em>)</em></p> +```````````````````````````````` + + +Intraword emphasis with `*` is allowed: + +```````````````````````````````` example +*foo*bar +. +<p><em>foo</em>bar</p> +```````````````````````````````` + + + +Rule 4: + +This is not emphasis, because the closing `_` is preceded by +whitespace: + +```````````````````````````````` example +_foo bar _ +. +<p>_foo bar _</p> +```````````````````````````````` + + +This is not emphasis, because the second `_` is +preceded by punctuation and followed by an alphanumeric: + +```````````````````````````````` example +_(_foo) +. +<p>_(_foo)</p> +```````````````````````````````` + + +This is emphasis within emphasis: + +```````````````````````````````` example +_(_foo_)_ +. +<p><em>(<em>foo</em>)</em></p> +```````````````````````````````` + + +Intraword emphasis is disallowed for `_`: + +```````````````````````````````` example +_foo_bar +. +<p>_foo_bar</p> +```````````````````````````````` + + +```````````````````````````````` example +_пристаням_стремятся +. +<p>_пристаням_стремятся</p> +```````````````````````````````` + + +```````````````````````````````` example +_foo_bar_baz_ +. +<p><em>foo_bar_baz</em></p> +```````````````````````````````` + + +This is emphasis, even though the closing delimiter is +both left- and right-flanking, because it is followed by +punctuation: + +```````````````````````````````` example +_(bar)_. +. +<p><em>(bar)</em>.</p> +```````````````````````````````` + + +Rule 5: + +```````````````````````````````` example +**foo bar** +. +<p><strong>foo bar</strong></p> +```````````````````````````````` + + +This is not strong emphasis, because the opening delimiter is +followed by whitespace: + +```````````````````````````````` example +** foo bar** +. +<p>** foo bar**</p> +```````````````````````````````` + + +This is not strong emphasis, because the opening `**` is preceded +by an alphanumeric and followed by punctuation, and hence +not part of a [left-flanking delimiter run]: + +```````````````````````````````` example +a**"foo"** +. +<p>a**"foo"**</p> +```````````````````````````````` + + +Intraword strong emphasis with `**` is permitted: + +```````````````````````````````` example +foo**bar** +. +<p>foo<strong>bar</strong></p> +```````````````````````````````` + + +Rule 6: + +```````````````````````````````` example +__foo bar__ +. +<p><strong>foo bar</strong></p> +```````````````````````````````` + + +This is not strong emphasis, because the opening delimiter is +followed by whitespace: + +```````````````````````````````` example +__ foo bar__ +. +<p>__ foo bar__</p> +```````````````````````````````` + + +A newline counts as whitespace: +```````````````````````````````` example +__ +foo bar__ +. +<p>__ +foo bar__</p> +```````````````````````````````` + + +This is not strong emphasis, because the opening `__` is preceded +by an alphanumeric and followed by punctuation: + +```````````````````````````````` example +a__"foo"__ +. +<p>a__"foo"__</p> +```````````````````````````````` + + +Intraword strong emphasis is forbidden with `__`: + +```````````````````````````````` example +foo__bar__ +. +<p>foo__bar__</p> +```````````````````````````````` + + +```````````````````````````````` example +5__6__78 +. +<p>5__6__78</p> +```````````````````````````````` + + +```````````````````````````````` example +пристаням__стремятся__ +. +<p>пристаням__стремятся__</p> +```````````````````````````````` + + +```````````````````````````````` example +__foo, __bar__, baz__ +. +<p><strong>foo, <strong>bar</strong>, baz</strong></p> +```````````````````````````````` + + +This is strong emphasis, even though the opening delimiter is +both left- and right-flanking, because it is preceded by +punctuation: + +```````````````````````````````` example +foo-__(bar)__ +. +<p>foo-<strong>(bar)</strong></p> +```````````````````````````````` + + + +Rule 7: + +This is not strong emphasis, because the closing delimiter is preceded +by whitespace: + +```````````````````````````````` example +**foo bar ** +. +<p>**foo bar **</p> +```````````````````````````````` + + +(Nor can it be interpreted as an emphasized `*foo bar *`, because of +Rule 11.) + +This is not strong emphasis, because the second `**` is +preceded by punctuation and followed by an alphanumeric: + +```````````````````````````````` example +**(**foo) +. +<p>**(**foo)</p> +```````````````````````````````` + + +The point of this restriction is more easily appreciated +with these examples: + +```````````````````````````````` example +*(**foo**)* +. +<p><em>(<strong>foo</strong>)</em></p> +```````````````````````````````` + + +```````````````````````````````` example +**Gomphocarpus (*Gomphocarpus physocarpus*, syn. +*Asclepias physocarpa*)** +. +<p><strong>Gomphocarpus (<em>Gomphocarpus physocarpus</em>, syn. +<em>Asclepias physocarpa</em>)</strong></p> +```````````````````````````````` + + +```````````````````````````````` example +**foo "*bar*" foo** +. +<p><strong>foo "<em>bar</em>" foo</strong></p> +```````````````````````````````` + + +Intraword emphasis: + +```````````````````````````````` example +**foo**bar +. +<p><strong>foo</strong>bar</p> +```````````````````````````````` + + +Rule 8: + +This is not strong emphasis, because the closing delimiter is +preceded by whitespace: + +```````````````````````````````` example +__foo bar __ +. +<p>__foo bar __</p> +```````````````````````````````` + + +This is not strong emphasis, because the second `__` is +preceded by punctuation and followed by an alphanumeric: + +```````````````````````````````` example +__(__foo) +. +<p>__(__foo)</p> +```````````````````````````````` + + +The point of this restriction is more easily appreciated +with this example: + +```````````````````````````````` example +_(__foo__)_ +. +<p><em>(<strong>foo</strong>)</em></p> +```````````````````````````````` + + +Intraword strong emphasis is forbidden with `__`: + +```````````````````````````````` example +__foo__bar +. +<p>__foo__bar</p> +```````````````````````````````` + + +```````````````````````````````` example +__пристаням__стремятся +. +<p>__пристаням__стремятся</p> +```````````````````````````````` + + +```````````````````````````````` example +__foo__bar__baz__ +. +<p><strong>foo__bar__baz</strong></p> +```````````````````````````````` + + +This is strong emphasis, even though the closing delimiter is +both left- and right-flanking, because it is followed by +punctuation: + +```````````````````````````````` example +__(bar)__. +. +<p><strong>(bar)</strong>.</p> +```````````````````````````````` + + +Rule 9: + +Any nonempty sequence of inline elements can be the contents of an +emphasized span. + +```````````````````````````````` example +*foo [bar](/url)* +. +<p><em>foo <a href="/url">bar</a></em></p> +```````````````````````````````` + + +```````````````````````````````` example +*foo +bar* +. +<p><em>foo +bar</em></p> +```````````````````````````````` + + +In particular, emphasis and strong emphasis can be nested +inside emphasis: + +```````````````````````````````` example +_foo __bar__ baz_ +. +<p><em>foo <strong>bar</strong> baz</em></p> +```````````````````````````````` + + +```````````````````````````````` example +_foo _bar_ baz_ +. +<p><em>foo <em>bar</em> baz</em></p> +```````````````````````````````` + + +```````````````````````````````` example +__foo_ bar_ +. +<p><em><em>foo</em> bar</em></p> +```````````````````````````````` + + +```````````````````````````````` example +*foo *bar** +. +<p><em>foo <em>bar</em></em></p> +```````````````````````````````` + + +```````````````````````````````` example +*foo **bar** baz* +. +<p><em>foo <strong>bar</strong> baz</em></p> +```````````````````````````````` + +```````````````````````````````` example +*foo**bar**baz* +. +<p><em>foo<strong>bar</strong>baz</em></p> +```````````````````````````````` + +Note that in the preceding case, the interpretation + +``` markdown +<p><em>foo</em><em>bar<em></em>baz</em></p> +``` + + +is precluded by the condition that a delimiter that +can both open and close (like the `*` after `foo`) +cannot form emphasis if the sum of the lengths of +the delimiter runs containing the opening and +closing delimiters is a multiple of 3 unless +both lengths are multiples of 3. + + +For the same reason, we don't get two consecutive +emphasis sections in this example: + +```````````````````````````````` example +*foo**bar* +. +<p><em>foo**bar</em></p> +```````````````````````````````` + + +The same condition ensures that the following +cases are all strong emphasis nested inside +emphasis, even when the interior spaces are +omitted: + + +```````````````````````````````` example +***foo** bar* +. +<p><em><strong>foo</strong> bar</em></p> +```````````````````````````````` + + +```````````````````````````````` example +*foo **bar*** +. +<p><em>foo <strong>bar</strong></em></p> +```````````````````````````````` + + +```````````````````````````````` example +*foo**bar*** +. +<p><em>foo<strong>bar</strong></em></p> +```````````````````````````````` + + +When the lengths of the interior closing and opening +delimiter runs are *both* multiples of 3, though, +they can match to create emphasis: + +```````````````````````````````` example +foo***bar***baz +. +<p>foo<em><strong>bar</strong></em>baz</p> +```````````````````````````````` + +```````````````````````````````` example +foo******bar*********baz +. +<p>foo<strong><strong><strong>bar</strong></strong></strong>***baz</p> +```````````````````````````````` + + +Indefinite levels of nesting are possible: + +```````````````````````````````` example +*foo **bar *baz* bim** bop* +. +<p><em>foo <strong>bar <em>baz</em> bim</strong> bop</em></p> +```````````````````````````````` + + +```````````````````````````````` example +*foo [*bar*](/url)* +. +<p><em>foo <a href="/url"><em>bar</em></a></em></p> +```````````````````````````````` + + +There can be no empty emphasis or strong emphasis: + +```````````````````````````````` example +** is not an empty emphasis +. +<p>** is not an empty emphasis</p> +```````````````````````````````` + + +```````````````````````````````` example +**** is not an empty strong emphasis +. +<p>**** is not an empty strong emphasis</p> +```````````````````````````````` + + + +Rule 10: + +Any nonempty sequence of inline elements can be the contents of an +strongly emphasized span. + +```````````````````````````````` example +**foo [bar](/url)** +. +<p><strong>foo <a href="/url">bar</a></strong></p> +```````````````````````````````` + + +```````````````````````````````` example +**foo +bar** +. +<p><strong>foo +bar</strong></p> +```````````````````````````````` + + +In particular, emphasis and strong emphasis can be nested +inside strong emphasis: + +```````````````````````````````` example +__foo _bar_ baz__ +. +<p><strong>foo <em>bar</em> baz</strong></p> +```````````````````````````````` + + +```````````````````````````````` example +__foo __bar__ baz__ +. +<p><strong>foo <strong>bar</strong> baz</strong></p> +```````````````````````````````` + + +```````````````````````````````` example +____foo__ bar__ +. +<p><strong><strong>foo</strong> bar</strong></p> +```````````````````````````````` + + +```````````````````````````````` example +**foo **bar**** +. +<p><strong>foo <strong>bar</strong></strong></p> +```````````````````````````````` + + +```````````````````````````````` example +**foo *bar* baz** +. +<p><strong>foo <em>bar</em> baz</strong></p> +```````````````````````````````` + + +```````````````````````````````` example +**foo*bar*baz** +. +<p><strong>foo<em>bar</em>baz</strong></p> +```````````````````````````````` + + +```````````````````````````````` example +***foo* bar** +. +<p><strong><em>foo</em> bar</strong></p> +```````````````````````````````` + + +```````````````````````````````` example +**foo *bar*** +. +<p><strong>foo <em>bar</em></strong></p> +```````````````````````````````` + + +Indefinite levels of nesting are possible: + +```````````````````````````````` example +**foo *bar **baz** +bim* bop** +. +<p><strong>foo <em>bar <strong>baz</strong> +bim</em> bop</strong></p> +```````````````````````````````` + + +```````````````````````````````` example +**foo [*bar*](/url)** +. +<p><strong>foo <a href="/url"><em>bar</em></a></strong></p> +```````````````````````````````` + + +There can be no empty emphasis or strong emphasis: + +```````````````````````````````` example +__ is not an empty emphasis +. +<p>__ is not an empty emphasis</p> +```````````````````````````````` + + +```````````````````````````````` example +____ is not an empty strong emphasis +. +<p>____ is not an empty strong emphasis</p> +```````````````````````````````` + + + +Rule 11: + +```````````````````````````````` example +foo *** +. +<p>foo ***</p> +```````````````````````````````` + + +```````````````````````````````` example +foo *\** +. +<p>foo <em>*</em></p> +```````````````````````````````` + + +```````````````````````````````` example +foo *_* +. +<p>foo <em>_</em></p> +```````````````````````````````` + + +```````````````````````````````` example +foo ***** +. +<p>foo *****</p> +```````````````````````````````` + + +```````````````````````````````` example +foo **\*** +. +<p>foo <strong>*</strong></p> +```````````````````````````````` + + +```````````````````````````````` example +foo **_** +. +<p>foo <strong>_</strong></p> +```````````````````````````````` + + +Note that when delimiters do not match evenly, Rule 11 determines +that the excess literal `*` characters will appear outside of the +emphasis, rather than inside it: + +```````````````````````````````` example +**foo* +. +<p>*<em>foo</em></p> +```````````````````````````````` + + +```````````````````````````````` example +*foo** +. +<p><em>foo</em>*</p> +```````````````````````````````` + + +```````````````````````````````` example +***foo** +. +<p>*<strong>foo</strong></p> +```````````````````````````````` + + +```````````````````````````````` example +****foo* +. +<p>***<em>foo</em></p> +```````````````````````````````` + + +```````````````````````````````` example +**foo*** +. +<p><strong>foo</strong>*</p> +```````````````````````````````` + + +```````````````````````````````` example +*foo**** +. +<p><em>foo</em>***</p> +```````````````````````````````` + + + +Rule 12: + +```````````````````````````````` example +foo ___ +. +<p>foo ___</p> +```````````````````````````````` + + +```````````````````````````````` example +foo _\__ +. +<p>foo <em>_</em></p> +```````````````````````````````` + + +```````````````````````````````` example +foo _*_ +. +<p>foo <em>*</em></p> +```````````````````````````````` + + +```````````````````````````````` example +foo _____ +. +<p>foo _____</p> +```````````````````````````````` + + +```````````````````````````````` example +foo __\___ +. +<p>foo <strong>_</strong></p> +```````````````````````````````` + + +```````````````````````````````` example +foo __*__ +. +<p>foo <strong>*</strong></p> +```````````````````````````````` + + +```````````````````````````````` example +__foo_ +. +<p>_<em>foo</em></p> +```````````````````````````````` + + +Note that when delimiters do not match evenly, Rule 12 determines +that the excess literal `_` characters will appear outside of the +emphasis, rather than inside it: + +```````````````````````````````` example +_foo__ +. +<p><em>foo</em>_</p> +```````````````````````````````` + + +```````````````````````````````` example +___foo__ +. +<p>_<strong>foo</strong></p> +```````````````````````````````` + + +```````````````````````````````` example +____foo_ +. +<p>___<em>foo</em></p> +```````````````````````````````` + + +```````````````````````````````` example +__foo___ +. +<p><strong>foo</strong>_</p> +```````````````````````````````` + + +```````````````````````````````` example +_foo____ +. +<p><em>foo</em>___</p> +```````````````````````````````` + + +Rule 13 implies that if you want emphasis nested directly inside +emphasis, you must use different delimiters: + +```````````````````````````````` example +**foo** +. +<p><strong>foo</strong></p> +```````````````````````````````` + + +```````````````````````````````` example +*_foo_* +. +<p><em><em>foo</em></em></p> +```````````````````````````````` + + +```````````````````````````````` example +__foo__ +. +<p><strong>foo</strong></p> +```````````````````````````````` + + +```````````````````````````````` example +_*foo*_ +. +<p><em><em>foo</em></em></p> +```````````````````````````````` + + +However, strong emphasis within strong emphasis is possible without +switching delimiters: + +```````````````````````````````` example +****foo**** +. +<p><strong><strong>foo</strong></strong></p> +```````````````````````````````` + + +```````````````````````````````` example +____foo____ +. +<p><strong><strong>foo</strong></strong></p> +```````````````````````````````` + + + +Rule 13 can be applied to arbitrarily long sequences of +delimiters: + +```````````````````````````````` example +******foo****** +. +<p><strong><strong><strong>foo</strong></strong></strong></p> +```````````````````````````````` + + +Rule 14: + +```````````````````````````````` example +***foo*** +. +<p><em><strong>foo</strong></em></p> +```````````````````````````````` + + +```````````````````````````````` example +_____foo_____ +. +<p><em><strong><strong>foo</strong></strong></em></p> +```````````````````````````````` + + +Rule 15: + +```````````````````````````````` example +*foo _bar* baz_ +. +<p><em>foo _bar</em> baz_</p> +```````````````````````````````` + + +```````````````````````````````` example +*foo __bar *baz bim__ bam* +. +<p><em>foo <strong>bar *baz bim</strong> bam</em></p> +```````````````````````````````` + + +Rule 16: + +```````````````````````````````` example +**foo **bar baz** +. +<p>**foo <strong>bar baz</strong></p> +```````````````````````````````` + + +```````````````````````````````` example +*foo *bar baz* +. +<p>*foo <em>bar baz</em></p> +```````````````````````````````` + + +Rule 17: + +```````````````````````````````` example +*[bar*](/url) +. +<p>*<a href="/url">bar*</a></p> +```````````````````````````````` + + +```````````````````````````````` example +_foo [bar_](/url) +. +<p>_foo <a href="/url">bar_</a></p> +```````````````````````````````` + + +```````````````````````````````` example +*<img src="foo" title="*"/> +. +<p>*<img src="foo" title="*"/></p> +```````````````````````````````` + + +```````````````````````````````` example +**<a href="**"> +. +<p>**<a href="**"></p> +```````````````````````````````` + + +```````````````````````````````` example +__<a href="__"> +. +<p>__<a href="__"></p> +```````````````````````````````` + + +```````````````````````````````` example +*a `*`* +. +<p><em>a <code>*</code></em></p> +```````````````````````````````` + + +```````````````````````````````` example +_a `_`_ +. +<p><em>a <code>_</code></em></p> +```````````````````````````````` + + +```````````````````````````````` example +**a<http://foo.bar/?q=**> +. +<p>**a<a href="http://foo.bar/?q=**">http://foo.bar/?q=**</a></p> +```````````````````````````````` + + +```````````````````````````````` example +__a<http://foo.bar/?q=__> +. +<p>__a<a href="http://foo.bar/?q=__">http://foo.bar/?q=__</a></p> +```````````````````````````````` + + +<div class="extension"> + +## Strikethrough (extension) + +GFM enables the `strikethrough` extension, where an additional emphasis type is +available. + +Strikethrough text is any text wrapped in two tildes (`~`). + +```````````````````````````````` example strikethrough +~~Hi~~ Hello, world! +. +<p><del>Hi</del> Hello, world!</p> +```````````````````````````````` + +As with regular emphasis delimiters, a new paragraph will cause strikethrough +parsing to cease: + +```````````````````````````````` example strikethrough +This ~~has a + +new paragraph~~. +. +<p>This ~~has a</p> +<p>new paragraph~~.</p> +```````````````````````````````` + +Three or more tildes do not create a strikethrough: + +```````````````````````````````` example strikethrough +This will ~~~not~~~ strike. +. +<p>This will ~~~not~~~ strike.</p> +```````````````````````````````` + +</div> + +## Links + +A link contains [link text] (the visible text), a [link destination] +(the URI that is the link destination), and optionally a [link title]. +There are two basic kinds of links in Markdown. In [inline links] the +destination and title are given immediately after the link text. In +[reference links] the destination and title are defined elsewhere in +the document. + +A [link text](@) consists of a sequence of zero or more +inline elements enclosed by square brackets (`[` and `]`). The +following rules apply: + +- Links may not contain other links, at any level of nesting. If + multiple otherwise valid link definitions appear nested inside each + other, the inner-most definition is used. + +- Brackets are allowed in the [link text] only if (a) they + are backslash-escaped or (b) they appear as a matched pair of brackets, + with an open bracket `[`, a sequence of zero or more inlines, and + a close bracket `]`. + +- Backtick [code spans], [autolinks], and raw [HTML tags] bind more tightly + than the brackets in link text. Thus, for example, + `` [foo`]` `` could not be a link text, since the second `]` + is part of a code span. + +- The brackets in link text bind more tightly than markers for + [emphasis and strong emphasis]. Thus, for example, `*[foo*](url)` is a link. + +A [link destination](@) consists of either + +- a sequence of zero or more characters between an opening `<` and a + closing `>` that contains no line breaks or unescaped + `<` or `>` characters, or + +- a nonempty sequence of characters that does not start with + `<`, does not include ASCII space or control characters, and + includes parentheses only if (a) they are backslash-escaped or + (b) they are part of a balanced pair of unescaped parentheses. + (Implementations may impose limits on parentheses nesting to + avoid performance issues, but at least three levels of nesting + should be supported.) + +A [link title](@) consists of either + +- a sequence of zero or more characters between straight double-quote + characters (`"`), including a `"` character only if it is + backslash-escaped, or + +- a sequence of zero or more characters between straight single-quote + characters (`'`), including a `'` character only if it is + backslash-escaped, or + +- a sequence of zero or more characters between matching parentheses + (`(...)`), including a `(` or `)` character only if it is + backslash-escaped. + +Although [link titles] may span multiple lines, they may not contain +a [blank line]. + +An [inline link](@) consists of a [link text] followed immediately +by a left parenthesis `(`, optional [whitespace], an optional +[link destination], an optional [link title] separated from the link +destination by [whitespace], optional [whitespace], and a right +parenthesis `)`. The link's text consists of the inlines contained +in the [link text] (excluding the enclosing square brackets). +The link's URI consists of the link destination, excluding enclosing +`<...>` if present, with backslash-escapes in effect as described +above. The link's title consists of the link title, excluding its +enclosing delimiters, with backslash-escapes in effect as described +above. + +Here is a simple inline link: + +```````````````````````````````` example +[link](/uri "title") +. +<p><a href="/uri" title="title">link</a></p> +```````````````````````````````` + + +The title may be omitted: + +```````````````````````````````` example +[link](/uri) +. +<p><a href="/uri">link</a></p> +```````````````````````````````` + + +Both the title and the destination may be omitted: + +```````````````````````````````` example +[link]() +. +<p><a href="">link</a></p> +```````````````````````````````` + + +```````````````````````````````` example +[link](<>) +. +<p><a href="">link</a></p> +```````````````````````````````` + +The destination can only contain spaces if it is +enclosed in pointy brackets: + +```````````````````````````````` example +[link](/my uri) +. +<p>[link](/my uri)</p> +```````````````````````````````` + +```````````````````````````````` example +[link](</my uri>) +. +<p><a href="/my%20uri">link</a></p> +```````````````````````````````` + +The destination cannot contain line breaks, +even if enclosed in pointy brackets: + +```````````````````````````````` example +[link](foo +bar) +. +<p>[link](foo +bar)</p> +```````````````````````````````` + +```````````````````````````````` example +[link](<foo +bar>) +. +<p>[link](<foo +bar>)</p> +```````````````````````````````` + +The destination can contain `)` if it is enclosed +in pointy brackets: + +```````````````````````````````` example +[a](<b)c>) +. +<p><a href="b)c">a</a></p> +```````````````````````````````` + +Pointy brackets that enclose links must be unescaped: + +```````````````````````````````` example +[link](<foo\>) +. +<p>[link](<foo>)</p> +```````````````````````````````` + +These are not links, because the opening pointy bracket +is not matched properly: + +```````````````````````````````` example +[a](<b)c +[a](<b)c> +[a](<b>c) +. +<p>[a](<b)c +[a](<b)c> +[a](<b>c)</p> +```````````````````````````````` + +Parentheses inside the link destination may be escaped: + +```````````````````````````````` example +[link](\(foo\)) +. +<p><a href="(foo)">link</a></p> +```````````````````````````````` + +Any number of parentheses are allowed without escaping, as long as they are +balanced: + +```````````````````````````````` example +[link](foo(and(bar))) +. +<p><a href="foo(and(bar))">link</a></p> +```````````````````````````````` + +However, if you have unbalanced parentheses, you need to escape or use the +`<...>` form: + +```````````````````````````````` example +[link](foo\(and\(bar\)) +. +<p><a href="foo(and(bar)">link</a></p> +```````````````````````````````` + + +```````````````````````````````` example +[link](<foo(and(bar)>) +. +<p><a href="foo(and(bar)">link</a></p> +```````````````````````````````` + + +Parentheses and other symbols can also be escaped, as usual +in Markdown: + +```````````````````````````````` example +[link](foo\)\:) +. +<p><a href="foo):">link</a></p> +```````````````````````````````` + + +A link can contain fragment identifiers and queries: + +```````````````````````````````` example +[link](#fragment) + +[link](http://example.com#fragment) + +[link](http://example.com?foo=3#frag) +. +<p><a href="#fragment">link</a></p> +<p><a href="http://example.com#fragment">link</a></p> +<p><a href="http://example.com?foo=3#frag">link</a></p> +```````````````````````````````` + + +Note that a backslash before a non-escapable character is +just a backslash: + +```````````````````````````````` example +[link](foo\bar) +. +<p><a href="foo%5Cbar">link</a></p> +```````````````````````````````` + + +URL-escaping should be left alone inside the destination, as all +URL-escaped characters are also valid URL characters. Entity and +numerical character references in the destination will be parsed +into the corresponding Unicode code points, as usual. These may +be optionally URL-escaped when written as HTML, but this spec +does not enforce any particular policy for rendering URLs in +HTML or other formats. Renderers may make different decisions +about how to escape or normalize URLs in the output. + +```````````````````````````````` example +[link](foo%20bä) +. +<p><a href="foo%20b%C3%A4">link</a></p> +```````````````````````````````` + + +Note that, because titles can often be parsed as destinations, +if you try to omit the destination and keep the title, you'll +get unexpected results: + +```````````````````````````````` example +[link]("title") +. +<p><a href="%22title%22">link</a></p> +```````````````````````````````` + + +Titles may be in single quotes, double quotes, or parentheses: + +```````````````````````````````` example +[link](/url "title") +[link](/url 'title') +[link](/url (title)) +. +<p><a href="/url" title="title">link</a> +<a href="/url" title="title">link</a> +<a href="/url" title="title">link</a></p> +```````````````````````````````` + + +Backslash escapes and entity and numeric character references +may be used in titles: + +```````````````````````````````` example +[link](/url "title \""") +. +<p><a href="/url" title="title """>link</a></p> +```````````````````````````````` + + +Titles must be separated from the link using a [whitespace]. +Other [Unicode whitespace] like non-breaking space doesn't work. + +```````````````````````````````` example +[link](/url "title") +. +<p><a href="/url%C2%A0%22title%22">link</a></p> +```````````````````````````````` + + +Nested balanced quotes are not allowed without escaping: + +```````````````````````````````` example +[link](/url "title "and" title") +. +<p>[link](/url "title "and" title")</p> +```````````````````````````````` + + +But it is easy to work around this by using a different quote type: + +```````````````````````````````` example +[link](/url 'title "and" title') +. +<p><a href="/url" title="title "and" title">link</a></p> +```````````````````````````````` + + +(Note: `Markdown.pl` did allow double quotes inside a double-quoted +title, and its test suite included a test demonstrating this. +But it is hard to see a good rationale for the extra complexity this +brings, since there are already many ways---backslash escaping, +entity and numeric character references, or using a different +quote type for the enclosing title---to write titles containing +double quotes. `Markdown.pl`'s handling of titles has a number +of other strange features. For example, it allows single-quoted +titles in inline links, but not reference links. And, in +reference links but not inline links, it allows a title to begin +with `"` and end with `)`. `Markdown.pl` 1.0.1 even allows +titles with no closing quotation mark, though 1.0.2b8 does not. +It seems preferable to adopt a simple, rational rule that works +the same way in inline links and link reference definitions.) + +[Whitespace] is allowed around the destination and title: + +```````````````````````````````` example +[link]( /uri + "title" ) +. +<p><a href="/uri" title="title">link</a></p> +```````````````````````````````` + + +But it is not allowed between the link text and the +following parenthesis: + +```````````````````````````````` example +[link] (/uri) +. +<p>[link] (/uri)</p> +```````````````````````````````` + + +The link text may contain balanced brackets, but not unbalanced ones, +unless they are escaped: + +```````````````````````````````` example +[link [foo [bar]]](/uri) +. +<p><a href="/uri">link [foo [bar]]</a></p> +```````````````````````````````` + + +```````````````````````````````` example +[link] bar](/uri) +. +<p>[link] bar](/uri)</p> +```````````````````````````````` + + +```````````````````````````````` example +[link [bar](/uri) +. +<p>[link <a href="/uri">bar</a></p> +```````````````````````````````` + + +```````````````````````````````` example +[link \[bar](/uri) +. +<p><a href="/uri">link [bar</a></p> +```````````````````````````````` + + +The link text may contain inline content: + +```````````````````````````````` example +[link *foo **bar** `#`*](/uri) +. +<p><a href="/uri">link <em>foo <strong>bar</strong> <code>#</code></em></a></p> +```````````````````````````````` + + +```````````````````````````````` example +[![moon](moon.jpg)](/uri) +. +<p><a href="/uri"><img src="moon.jpg" alt="moon" /></a></p> +```````````````````````````````` + + +However, links may not contain other links, at any level of nesting. + +```````````````````````````````` example +[foo [bar](/uri)](/uri) +. +<p>[foo <a href="/uri">bar</a>](/uri)</p> +```````````````````````````````` + + +```````````````````````````````` example +[foo *[bar [baz](/uri)](/uri)*](/uri) +. +<p>[foo <em>[bar <a href="/uri">baz</a>](/uri)</em>](/uri)</p> +```````````````````````````````` + + +```````````````````````````````` example +![[[foo](uri1)](uri2)](uri3) +. +<p><img src="uri3" alt="[foo](uri2)" /></p> +```````````````````````````````` + + +These cases illustrate the precedence of link text grouping over +emphasis grouping: + +```````````````````````````````` example +*[foo*](/uri) +. +<p>*<a href="/uri">foo*</a></p> +```````````````````````````````` + + +```````````````````````````````` example +[foo *bar](baz*) +. +<p><a href="baz*">foo *bar</a></p> +```````````````````````````````` + + +Note that brackets that *aren't* part of links do not take +precedence: + +```````````````````````````````` example +*foo [bar* baz] +. +<p><em>foo [bar</em> baz]</p> +```````````````````````````````` + + +These cases illustrate the precedence of HTML tags, code spans, +and autolinks over link grouping: + +```````````````````````````````` example +[foo <bar attr="](baz)"> +. +<p>[foo <bar attr="](baz)"></p> +```````````````````````````````` + + +```````````````````````````````` example +[foo`](/uri)` +. +<p>[foo<code>](/uri)</code></p> +```````````````````````````````` + + +```````````````````````````````` example +[foo<http://example.com/?search=](uri)> +. +<p>[foo<a href="http://example.com/?search=%5D(uri)">http://example.com/?search=](uri)</a></p> +```````````````````````````````` + + +There are three kinds of [reference link](@)s: +[full](#full-reference-link), [collapsed](#collapsed-reference-link), +and [shortcut](#shortcut-reference-link). + +A [full reference link](@) +consists of a [link text] immediately followed by a [link label] +that [matches] a [link reference definition] elsewhere in the document. + +A [link label](@) begins with a left bracket (`[`) and ends +with the first right bracket (`]`) that is not backslash-escaped. +Between these brackets there must be at least one [non-whitespace character]. +Unescaped square bracket characters are not allowed inside the +opening and closing square brackets of [link labels]. A link +label can have at most 999 characters inside the square +brackets. + +One label [matches](@) +another just in case their normalized forms are equal. To normalize a +label, strip off the opening and closing brackets, +perform the *Unicode case fold*, strip leading and trailing +[whitespace] and collapse consecutive internal +[whitespace] to a single space. If there are multiple +matching reference link definitions, the one that comes first in the +document is used. (It is desirable in such cases to emit a warning.) + +The contents of the first link label are parsed as inlines, which are +used as the link's text. The link's URI and title are provided by the +matching [link reference definition]. + +Here is a simple example: + +```````````````````````````````` example +[foo][bar] + +[bar]: /url "title" +. +<p><a href="/url" title="title">foo</a></p> +```````````````````````````````` + + +The rules for the [link text] are the same as with +[inline links]. Thus: + +The link text may contain balanced brackets, but not unbalanced ones, +unless they are escaped: + +```````````````````````````````` example +[link [foo [bar]]][ref] + +[ref]: /uri +. +<p><a href="/uri">link [foo [bar]]</a></p> +```````````````````````````````` + + +```````````````````````````````` example +[link \[bar][ref] + +[ref]: /uri +. +<p><a href="/uri">link [bar</a></p> +```````````````````````````````` + + +The link text may contain inline content: + +```````````````````````````````` example +[link *foo **bar** `#`*][ref] + +[ref]: /uri +. +<p><a href="/uri">link <em>foo <strong>bar</strong> <code>#</code></em></a></p> +```````````````````````````````` + + +```````````````````````````````` example +[![moon](moon.jpg)][ref] + +[ref]: /uri +. +<p><a href="/uri"><img src="moon.jpg" alt="moon" /></a></p> +```````````````````````````````` + + +However, links may not contain other links, at any level of nesting. + +```````````````````````````````` example +[foo [bar](/uri)][ref] + +[ref]: /uri +. +<p>[foo <a href="/uri">bar</a>]<a href="/uri">ref</a></p> +```````````````````````````````` + + +```````````````````````````````` example +[foo *bar [baz][ref]*][ref] + +[ref]: /uri +. +<p>[foo <em>bar <a href="/uri">baz</a></em>]<a href="/uri">ref</a></p> +```````````````````````````````` + + +(In the examples above, we have two [shortcut reference links] +instead of one [full reference link].) + +The following cases illustrate the precedence of link text grouping over +emphasis grouping: + +```````````````````````````````` example +*[foo*][ref] + +[ref]: /uri +. +<p>*<a href="/uri">foo*</a></p> +```````````````````````````````` + + +```````````````````````````````` example +[foo *bar][ref] + +[ref]: /uri +. +<p><a href="/uri">foo *bar</a></p> +```````````````````````````````` + + +These cases illustrate the precedence of HTML tags, code spans, +and autolinks over link grouping: + +```````````````````````````````` example +[foo <bar attr="][ref]"> + +[ref]: /uri +. +<p>[foo <bar attr="][ref]"></p> +```````````````````````````````` + + +```````````````````````````````` example +[foo`][ref]` + +[ref]: /uri +. +<p>[foo<code>][ref]</code></p> +```````````````````````````````` + + +```````````````````````````````` example +[foo<http://example.com/?search=][ref]> + +[ref]: /uri +. +<p>[foo<a href="http://example.com/?search=%5D%5Bref%5D">http://example.com/?search=][ref]</a></p> +```````````````````````````````` + + +Matching is case-insensitive: + +```````````````````````````````` example +[foo][BaR] + +[bar]: /url "title" +. +<p><a href="/url" title="title">foo</a></p> +```````````````````````````````` + + +Unicode case fold is used: + +```````````````````````````````` example +[Толпой][Толпой] is a Russian word. + +[ТОЛПОЙ]: /url +. +<p><a href="/url">Толпой</a> is a Russian word.</p> +```````````````````````````````` + + +Consecutive internal [whitespace] is treated as one space for +purposes of determining matching: + +```````````````````````````````` example +[Foo + bar]: /url + +[Baz][Foo bar] +. +<p><a href="/url">Baz</a></p> +```````````````````````````````` + + +No [whitespace] is allowed between the [link text] and the +[link label]: + +```````````````````````````````` example +[foo] [bar] + +[bar]: /url "title" +. +<p>[foo] <a href="/url" title="title">bar</a></p> +```````````````````````````````` + + +```````````````````````````````` example +[foo] +[bar] + +[bar]: /url "title" +. +<p>[foo] +<a href="/url" title="title">bar</a></p> +```````````````````````````````` + + +This is a departure from John Gruber's original Markdown syntax +description, which explicitly allows whitespace between the link +text and the link label. It brings reference links in line with +[inline links], which (according to both original Markdown and +this spec) cannot have whitespace after the link text. More +importantly, it prevents inadvertent capture of consecutive +[shortcut reference links]. If whitespace is allowed between the +link text and the link label, then in the following we will have +a single reference link, not two shortcut reference links, as +intended: + +``` markdown +[foo] +[bar] + +[foo]: /url1 +[bar]: /url2 +``` + +(Note that [shortcut reference links] were introduced by Gruber +himself in a beta version of `Markdown.pl`, but never included +in the official syntax description. Without shortcut reference +links, it is harmless to allow space between the link text and +link label; but once shortcut references are introduced, it is +too dangerous to allow this, as it frequently leads to +unintended results.) + +When there are multiple matching [link reference definitions], +the first is used: + +```````````````````````````````` example +[foo]: /url1 + +[foo]: /url2 + +[bar][foo] +. +<p><a href="/url1">bar</a></p> +```````````````````````````````` + + +Note that matching is performed on normalized strings, not parsed +inline content. So the following does not match, even though the +labels define equivalent inline content: + +```````````````````````````````` example +[bar][foo\!] + +[foo!]: /url +. +<p>[bar][foo!]</p> +```````````````````````````````` + + +[Link labels] cannot contain brackets, unless they are +backslash-escaped: + +```````````````````````````````` example +[foo][ref[] + +[ref[]: /uri +. +<p>[foo][ref[]</p> +<p>[ref[]: /uri</p> +```````````````````````````````` + + +```````````````````````````````` example +[foo][ref[bar]] + +[ref[bar]]: /uri +. +<p>[foo][ref[bar]]</p> +<p>[ref[bar]]: /uri</p> +```````````````````````````````` + + +```````````````````````````````` example +[[[foo]]] + +[[[foo]]]: /url +. +<p>[[[foo]]]</p> +<p>[[[foo]]]: /url</p> +```````````````````````````````` + + +```````````````````````````````` example +[foo][ref\[] + +[ref\[]: /uri +. +<p><a href="/uri">foo</a></p> +```````````````````````````````` + + +Note that in this example `]` is not backslash-escaped: + +```````````````````````````````` example +[bar\\]: /uri + +[bar\\] +. +<p><a href="/uri">bar\</a></p> +```````````````````````````````` + + +A [link label] must contain at least one [non-whitespace character]: + +```````````````````````````````` example +[] + +[]: /uri +. +<p>[]</p> +<p>[]: /uri</p> +```````````````````````````````` + + +```````````````````````````````` example +[ + ] + +[ + ]: /uri +. +<p>[ +]</p> +<p>[ +]: /uri</p> +```````````````````````````````` + + +A [collapsed reference link](@) +consists of a [link label] that [matches] a +[link reference definition] elsewhere in the +document, followed by the string `[]`. +The contents of the first link label are parsed as inlines, +which are used as the link's text. The link's URI and title are +provided by the matching reference link definition. Thus, +`[foo][]` is equivalent to `[foo][foo]`. + +```````````````````````````````` example +[foo][] + +[foo]: /url "title" +. +<p><a href="/url" title="title">foo</a></p> +```````````````````````````````` + + +```````````````````````````````` example +[*foo* bar][] + +[*foo* bar]: /url "title" +. +<p><a href="/url" title="title"><em>foo</em> bar</a></p> +```````````````````````````````` + + +The link labels are case-insensitive: + +```````````````````````````````` example +[Foo][] + +[foo]: /url "title" +. +<p><a href="/url" title="title">Foo</a></p> +```````````````````````````````` + + + +As with full reference links, [whitespace] is not +allowed between the two sets of brackets: + +```````````````````````````````` example +[foo] +[] + +[foo]: /url "title" +. +<p><a href="/url" title="title">foo</a> +[]</p> +```````````````````````````````` + + +A [shortcut reference link](@) +consists of a [link label] that [matches] a +[link reference definition] elsewhere in the +document and is not followed by `[]` or a link label. +The contents of the first link label are parsed as inlines, +which are used as the link's text. The link's URI and title +are provided by the matching link reference definition. +Thus, `[foo]` is equivalent to `[foo][]`. + +```````````````````````````````` example +[foo] + +[foo]: /url "title" +. +<p><a href="/url" title="title">foo</a></p> +```````````````````````````````` + + +```````````````````````````````` example +[*foo* bar] + +[*foo* bar]: /url "title" +. +<p><a href="/url" title="title"><em>foo</em> bar</a></p> +```````````````````````````````` + + +```````````````````````````````` example +[[*foo* bar]] + +[*foo* bar]: /url "title" +. +<p>[<a href="/url" title="title"><em>foo</em> bar</a>]</p> +```````````````````````````````` + + +```````````````````````````````` example +[[bar [foo] + +[foo]: /url +. +<p>[[bar <a href="/url">foo</a></p> +```````````````````````````````` + + +The link labels are case-insensitive: + +```````````````````````````````` example +[Foo] + +[foo]: /url "title" +. +<p><a href="/url" title="title">Foo</a></p> +```````````````````````````````` + + +A space after the link text should be preserved: + +```````````````````````````````` example +[foo] bar + +[foo]: /url +. +<p><a href="/url">foo</a> bar</p> +```````````````````````````````` + + +If you just want bracketed text, you can backslash-escape the +opening bracket to avoid links: + +```````````````````````````````` example +\[foo] + +[foo]: /url "title" +. +<p>[foo]</p> +```````````````````````````````` + + +Note that this is a link, because a link label ends with the first +following closing bracket: + +```````````````````````````````` example +[foo*]: /url + +*[foo*] +. +<p>*<a href="/url">foo*</a></p> +```````````````````````````````` + + +Full and compact references take precedence over shortcut +references: + +```````````````````````````````` example +[foo][bar] + +[foo]: /url1 +[bar]: /url2 +. +<p><a href="/url2">foo</a></p> +```````````````````````````````` + +```````````````````````````````` example +[foo][] + +[foo]: /url1 +. +<p><a href="/url1">foo</a></p> +```````````````````````````````` + +Inline links also take precedence: + +```````````````````````````````` example +[foo]() + +[foo]: /url1 +. +<p><a href="">foo</a></p> +```````````````````````````````` + +```````````````````````````````` example +[foo](not a link) + +[foo]: /url1 +. +<p><a href="/url1">foo</a>(not a link)</p> +```````````````````````````````` + +In the following case `[bar][baz]` is parsed as a reference, +`[foo]` as normal text: + +```````````````````````````````` example +[foo][bar][baz] + +[baz]: /url +. +<p>[foo]<a href="/url">bar</a></p> +```````````````````````````````` + + +Here, though, `[foo][bar]` is parsed as a reference, since +`[bar]` is defined: + +```````````````````````````````` example +[foo][bar][baz] + +[baz]: /url1 +[bar]: /url2 +. +<p><a href="/url2">foo</a><a href="/url1">baz</a></p> +```````````````````````````````` + + +Here `[foo]` is not parsed as a shortcut reference, because it +is followed by a link label (even though `[bar]` is not defined): + +```````````````````````````````` example +[foo][bar][baz] + +[baz]: /url1 +[foo]: /url2 +. +<p>[foo]<a href="/url1">bar</a></p> +```````````````````````````````` + + + +## Images + +Syntax for images is like the syntax for links, with one +difference. Instead of [link text], we have an +[image description](@). The rules for this are the +same as for [link text], except that (a) an +image description starts with `![` rather than `[`, and +(b) an image description may contain links. +An image description has inline elements +as its contents. When an image is rendered to HTML, +this is standardly used as the image's `alt` attribute. + +```````````````````````````````` example +![foo](/url "title") +. +<p><img src="/url" alt="foo" title="title" /></p> +```````````````````````````````` + + +```````````````````````````````` example +![foo *bar*] + +[foo *bar*]: train.jpg "train & tracks" +. +<p><img src="train.jpg" alt="foo bar" title="train & tracks" /></p> +```````````````````````````````` + + +```````````````````````````````` example +![foo ![bar](/url)](/url2) +. +<p><img src="/url2" alt="foo bar" /></p> +```````````````````````````````` + + +```````````````````````````````` example +![foo [bar](/url)](/url2) +. +<p><img src="/url2" alt="foo bar" /></p> +```````````````````````````````` + + +Though this spec is concerned with parsing, not rendering, it is +recommended that in rendering to HTML, only the plain string content +of the [image description] be used. Note that in +the above example, the alt attribute's value is `foo bar`, not `foo +[bar](/url)` or `foo <a href="/url">bar</a>`. Only the plain string +content is rendered, without formatting. + +```````````````````````````````` example +![foo *bar*][] + +[foo *bar*]: train.jpg "train & tracks" +. +<p><img src="train.jpg" alt="foo bar" title="train & tracks" /></p> +```````````````````````````````` + + +```````````````````````````````` example +![foo *bar*][foobar] + +[FOOBAR]: train.jpg "train & tracks" +. +<p><img src="train.jpg" alt="foo bar" title="train & tracks" /></p> +```````````````````````````````` + + +```````````````````````````````` example +![foo](train.jpg) +. +<p><img src="train.jpg" alt="foo" /></p> +```````````````````````````````` + + +```````````````````````````````` example +My ![foo bar](/path/to/train.jpg "title" ) +. +<p>My <img src="/path/to/train.jpg" alt="foo bar" title="title" /></p> +```````````````````````````````` + + +```````````````````````````````` example +![foo](<url>) +. +<p><img src="url" alt="foo" /></p> +```````````````````````````````` + + +```````````````````````````````` example +![](/url) +. +<p><img src="/url" alt="" /></p> +```````````````````````````````` + + +Reference-style: + +```````````````````````````````` example +![foo][bar] + +[bar]: /url +. +<p><img src="/url" alt="foo" /></p> +```````````````````````````````` + + +```````````````````````````````` example +![foo][bar] + +[BAR]: /url +. +<p><img src="/url" alt="foo" /></p> +```````````````````````````````` + + +Collapsed: + +```````````````````````````````` example +![foo][] + +[foo]: /url "title" +. +<p><img src="/url" alt="foo" title="title" /></p> +```````````````````````````````` + + +```````````````````````````````` example +![*foo* bar][] + +[*foo* bar]: /url "title" +. +<p><img src="/url" alt="foo bar" title="title" /></p> +```````````````````````````````` + + +The labels are case-insensitive: + +```````````````````````````````` example +![Foo][] + +[foo]: /url "title" +. +<p><img src="/url" alt="Foo" title="title" /></p> +```````````````````````````````` + + +As with reference links, [whitespace] is not allowed +between the two sets of brackets: + +```````````````````````````````` example +![foo] +[] + +[foo]: /url "title" +. +<p><img src="/url" alt="foo" title="title" /> +[]</p> +```````````````````````````````` + + +Shortcut: + +```````````````````````````````` example +![foo] + +[foo]: /url "title" +. +<p><img src="/url" alt="foo" title="title" /></p> +```````````````````````````````` + + +```````````````````````````````` example +![*foo* bar] + +[*foo* bar]: /url "title" +. +<p><img src="/url" alt="foo bar" title="title" /></p> +```````````````````````````````` + + +Note that link labels cannot contain unescaped brackets: + +```````````````````````````````` example +![[foo]] + +[[foo]]: /url "title" +. +<p>![[foo]]</p> +<p>[[foo]]: /url "title"</p> +```````````````````````````````` + + +The link labels are case-insensitive: + +```````````````````````````````` example +![Foo] + +[foo]: /url "title" +. +<p><img src="/url" alt="Foo" title="title" /></p> +```````````````````````````````` + + +If you just want a literal `!` followed by bracketed text, you can +backslash-escape the opening `[`: + +```````````````````````````````` example +!\[foo] + +[foo]: /url "title" +. +<p>![foo]</p> +```````````````````````````````` + + +If you want a link after a literal `!`, backslash-escape the +`!`: + +```````````````````````````````` example +\![foo] + +[foo]: /url "title" +. +<p>!<a href="/url" title="title">foo</a></p> +```````````````````````````````` + + +## Autolinks + +[Autolink](@)s are absolute URIs and email addresses inside +`<` and `>`. They are parsed as links, with the URL or email address +as the link label. + +A [URI autolink](@) consists of `<`, followed by an +[absolute URI] followed by `>`. It is parsed as +a link to the URI, with the URI as the link's label. + +An [absolute URI](@), +for these purposes, consists of a [scheme] followed by a colon (`:`) +followed by zero or more characters other than ASCII +[whitespace] and control characters, `<`, and `>`. If +the URI includes these characters, they must be percent-encoded +(e.g. `%20` for a space). + +For purposes of this spec, a [scheme](@) is any sequence +of 2--32 characters beginning with an ASCII letter and followed +by any combination of ASCII letters, digits, or the symbols plus +("+"), period ("."), or hyphen ("-"). + +Here are some valid autolinks: + +```````````````````````````````` example +<http://foo.bar.baz> +. +<p><a href="http://foo.bar.baz">http://foo.bar.baz</a></p> +```````````````````````````````` + + +```````````````````````````````` example +<http://foo.bar.baz/test?q=hello&id=22&boolean> +. +<p><a href="http://foo.bar.baz/test?q=hello&id=22&boolean">http://foo.bar.baz/test?q=hello&id=22&boolean</a></p> +```````````````````````````````` + + +```````````````````````````````` example +<irc://foo.bar:2233/baz> +. +<p><a href="irc://foo.bar:2233/baz">irc://foo.bar:2233/baz</a></p> +```````````````````````````````` + + +Uppercase is also fine: + +```````````````````````````````` example +<MAILTO:FOO@BAR.BAZ> +. +<p><a href="MAILTO:FOO@BAR.BAZ">MAILTO:FOO@BAR.BAZ</a></p> +```````````````````````````````` + + +Note that many strings that count as [absolute URIs] for +purposes of this spec are not valid URIs, because their +schemes are not registered or because of other problems +with their syntax: + +```````````````````````````````` example +<a+b+c:d> +. +<p><a href="a+b+c:d">a+b+c:d</a></p> +```````````````````````````````` + + +```````````````````````````````` example +<made-up-scheme://foo,bar> +. +<p><a href="made-up-scheme://foo,bar">made-up-scheme://foo,bar</a></p> +```````````````````````````````` + + +```````````````````````````````` example +<http://../> +. +<p><a href="http://../">http://../</a></p> +```````````````````````````````` + + +```````````````````````````````` example +<localhost:5001/foo> +. +<p><a href="localhost:5001/foo">localhost:5001/foo</a></p> +```````````````````````````````` + + +Spaces are not allowed in autolinks: + +```````````````````````````````` example +<http://foo.bar/baz bim> +. +<p><http://foo.bar/baz bim></p> +```````````````````````````````` + + +Backslash-escapes do not work inside autolinks: + +```````````````````````````````` example +<http://example.com/\[\> +. +<p><a href="http://example.com/%5C%5B%5C">http://example.com/\[\</a></p> +```````````````````````````````` + + +An [email autolink](@) +consists of `<`, followed by an [email address], +followed by `>`. The link's label is the email address, +and the URL is `mailto:` followed by the email address. + +An [email address](@), +for these purposes, is anything that matches +the [non-normative regex from the HTML5 +spec](https://html.spec.whatwg.org/multipage/forms.html#e-mail-state-(type=email)): + + /^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])? + (?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/ + +Examples of email autolinks: + +```````````````````````````````` example +<foo@bar.example.com> +. +<p><a href="mailto:foo@bar.example.com">foo@bar.example.com</a></p> +```````````````````````````````` + + +```````````````````````````````` example +<foo+special@Bar.baz-bar0.com> +. +<p><a href="mailto:foo+special@Bar.baz-bar0.com">foo+special@Bar.baz-bar0.com</a></p> +```````````````````````````````` + + +Backslash-escapes do not work inside email autolinks: + +```````````````````````````````` example +<foo\+@bar.example.com> +. +<p><foo+@bar.example.com></p> +```````````````````````````````` + + +These are not autolinks: + +```````````````````````````````` example +<> +. +<p><></p> +```````````````````````````````` + + +```````````````````````````````` example +< http://foo.bar > +. +<p>< http://foo.bar ></p> +```````````````````````````````` + + +```````````````````````````````` example +<m:abc> +. +<p><m:abc></p> +```````````````````````````````` + + +```````````````````````````````` example +<foo.bar.baz> +. +<p><foo.bar.baz></p> +```````````````````````````````` + + +```````````````````````````````` example +http://example.com +. +<p>http://example.com</p> +```````````````````````````````` + + +```````````````````````````````` example +foo@bar.example.com +. +<p>foo@bar.example.com</p> +```````````````````````````````` + +<div class="extension"> + +## Autolinks (extension) + +GFM enables the `autolink` extension, where autolinks will be recognised in a +greater number of conditions. + +[Autolink]s can also be constructed without requiring the use of `<` and to `>` +to delimit them, although they will be recognized under a smaller set of +circumstances. All such recognized autolinks can only come at the beginning of +a line, after whitespace, or any of the delimiting characters `*`, `_`, `~`, +and `(`. + +An [extended www autolink](@) will be recognized +when the text `www.` is found followed by a [valid domain]. +A [valid domain](@) consists of segments +of alphanumeric characters, underscores (`_`) and hyphens (`-`) +separated by periods (`.`). +There must be at least one period, +and no underscores may be present in the last two segments of the domain. + +The scheme `http` will be inserted automatically: + +```````````````````````````````` example autolink +www.commonmark.org +. +<p><a href="http://www.commonmark.org">www.commonmark.org</a></p> +```````````````````````````````` + +After a [valid domain], zero or more non-space non-`<` characters may follow: + +```````````````````````````````` example autolink +Visit www.commonmark.org/help for more information. +. +<p>Visit <a href="http://www.commonmark.org/help">www.commonmark.org/help</a> for more information.</p> +```````````````````````````````` + +We then apply [extended autolink path validation](@) as follows: + +Trailing punctuation (specifically, `?`, `!`, `.`, `,`, `:`, `*`, `_`, and `~`) +will not be considered part of the autolink, though they may be included in the +interior of the link: + +```````````````````````````````` example autolink +Visit www.commonmark.org. + +Visit www.commonmark.org/a.b. +. +<p>Visit <a href="http://www.commonmark.org">www.commonmark.org</a>.</p> +<p>Visit <a href="http://www.commonmark.org/a.b">www.commonmark.org/a.b</a>.</p> +```````````````````````````````` + +When an autolink ends in `)`, we scan the entire autolink for the total number +of parentheses. If there is a greater number of closing parentheses than +opening ones, we don't consider the unmatched trailing parentheses part of the +autolink, in order to facilitate including an autolink inside a parenthesis: + +```````````````````````````````` example autolink +www.google.com/search?q=Markup+(business) + +www.google.com/search?q=Markup+(business))) + +(www.google.com/search?q=Markup+(business)) + +(www.google.com/search?q=Markup+(business) +. +<p><a href="http://www.google.com/search?q=Markup+(business)">www.google.com/search?q=Markup+(business)</a></p> +<p><a href="http://www.google.com/search?q=Markup+(business)">www.google.com/search?q=Markup+(business)</a>))</p> +<p>(<a href="http://www.google.com/search?q=Markup+(business)">www.google.com/search?q=Markup+(business)</a>)</p> +<p>(<a href="http://www.google.com/search?q=Markup+(business)">www.google.com/search?q=Markup+(business)</a></p> +```````````````````````````````` + +This check is only done when the link ends in a closing parentheses `)`, so if +the only parentheses are in the interior of the autolink, no special rules are +applied: + +```````````````````````````````` example autolink +www.google.com/search?q=(business))+ok +. +<p><a href="http://www.google.com/search?q=(business))+ok">www.google.com/search?q=(business))+ok</a></p> +```````````````````````````````` + +If an autolink ends in a semicolon (`;`), we check to see if it appears to +resemble an [entity reference][entity references]; if the preceding text is `&` +followed by one or more alphanumeric characters. If so, it is excluded from +the autolink: + +```````````````````````````````` example autolink +www.google.com/search?q=commonmark&hl=en + +www.google.com/search?q=commonmark&hl; +. +<p><a href="http://www.google.com/search?q=commonmark&hl=en">www.google.com/search?q=commonmark&hl=en</a></p> +<p><a href="http://www.google.com/search?q=commonmark">www.google.com/search?q=commonmark</a>&hl;</p> +```````````````````````````````` + +`<` immediately ends an autolink. + +```````````````````````````````` example autolink +www.commonmark.org/he<lp +. +<p><a href="http://www.commonmark.org/he">www.commonmark.org/he</a><lp</p> +```````````````````````````````` + +An [extended url autolink](@) will be recognised when one of the schemes +`http://`, or `https://`, followed by a [valid domain], then zero or +more non-space non-`<` characters according to +[extended autolink path validation]: + +```````````````````````````````` example autolink +http://commonmark.org + +(Visit https://encrypted.google.com/search?q=Markup+(business)) +. +<p><a href="http://commonmark.org">http://commonmark.org</a></p> +<p>(Visit <a href="https://encrypted.google.com/search?q=Markup+(business)">https://encrypted.google.com/search?q=Markup+(business)</a>)</p> +```````````````````````````````` + +An [extended email autolink](@) will be recognised when an email address is +recognised within any text node. Email addresses are recognised according to +the following rules: + +* One ore more characters which are alphanumeric, or `.`, `-`, `_`, or `+`. +* An `@` symbol. +* One or more characters which are alphanumeric, or `-` or `_`, + separated by periods (`.`). + There must be at least one period. + The last character must not be one of `-` or `_`. + +The scheme `mailto:` will automatically be added to the generated link: + +```````````````````````````````` example autolink +foo@bar.baz +. +<p><a href="mailto:foo@bar.baz">foo@bar.baz</a></p> +```````````````````````````````` + +`+` can occur before the `@`, but not after. + +```````````````````````````````` example autolink +hello@mail+xyz.example isn't valid, but hello+xyz@mail.example is. +. +<p>hello@mail+xyz.example isn't valid, but <a href="mailto:hello+xyz@mail.example">hello+xyz@mail.example</a> is.</p> +```````````````````````````````` + +`.`, `-`, and `_` can occur on both sides of the `@`, but only `.` may occur at +the end of the email address, in which case it will not be considered part of +the address: + +```````````````````````````````` example autolink +a.b-c_d@a.b + +a.b-c_d@a.b. + +a.b-c_d@a.b- + +a.b-c_d@a.b_ +. +<p><a href="mailto:a.b-c_d@a.b">a.b-c_d@a.b</a></p> +<p><a href="mailto:a.b-c_d@a.b">a.b-c_d@a.b</a>.</p> +<p>a.b-c_d@a.b-</p> +<p>a.b-c_d@a.b_</p> +```````````````````````````````` + +The scheme of the protocol will automatically be added to the generated link. All the rules of email address autolinking apply. + +```````````````````````````````` example autolink +mailto:foo@bar.baz + +mailto:a.b-c_d@a.b + +mailto:a.b-c_d@a.b. + +mailto:a.b-c_d@a.b/ + +mailto:a.b-c_d@a.b- + +mailto:a.b-c_d@a.b_ + +xmpp:foo@bar.baz + +xmpp:foo@bar.baz. +. +<p><a href="mailto:foo@bar.baz">mailto:foo@bar.baz</a></p> +<p><a href="mailto:a.b-c_d@a.b">mailto:a.b-c_d@a.b</a></p> +<p><a href="mailto:a.b-c_d@a.b">mailto:a.b-c_d@a.b</a>.</p> +<p><a href="mailto:a.b-c_d@a.b">mailto:a.b-c_d@a.b</a>/</p> +<p>mailto:a.b-c_d@a.b-</p> +<p>mailto:a.b-c_d@a.b_</p> +<p><a href="xmpp:foo@bar.baz">xmpp:foo@bar.baz</a></p> +<p><a href="xmpp:foo@bar.baz">xmpp:foo@bar.baz</a>.</p> +```````````````````````````````` + +A described in the specification xmpp offers an optional / followed by a resource. The resource can contain all alphanumeric characters, as well as @ and .. + +```````````````````````````````` example autolink +xmpp:foo@bar.baz/txt + +xmpp:foo@bar.baz/txt@bin + +xmpp:foo@bar.baz/txt@bin.com +. +<p><a href="xmpp:foo@bar.baz/txt">xmpp:foo@bar.baz/txt</a></p> +<p><a href="xmpp:foo@bar.baz/txt@bin">xmpp:foo@bar.baz/txt@bin</a></p> +<p><a href="xmpp:foo@bar.baz/txt@bin.com">xmpp:foo@bar.baz/txt@bin.com</a></p> +```````````````````````````````` + +Further / characters are not considered part of the domain: + +```````````````````````````````` example autolink +xmpp:foo@bar.baz/txt/bin +. +<p><a href="xmpp:foo@bar.baz/txt">xmpp:foo@bar.baz/txt</a>/bin</p> +```````````````````````````````` + +</div> + +## Raw HTML + +Text between `<` and `>` that looks like an HTML tag is parsed as a +raw HTML tag and will be rendered in HTML without escaping. +Tag and attribute names are not limited to current HTML tags, +so custom tags (and even, say, DocBook tags) may be used. + +Here is the grammar for tags: + +A [tag name](@) consists of an ASCII letter +followed by zero or more ASCII letters, digits, or +hyphens (`-`). + +An [attribute](@) consists of [whitespace], +an [attribute name], and an optional +[attribute value specification]. + +An [attribute name](@) +consists of an ASCII letter, `_`, or `:`, followed by zero or more ASCII +letters, digits, `_`, `.`, `:`, or `-`. (Note: This is the XML +specification restricted to ASCII. HTML5 is laxer.) + +An [attribute value specification](@) +consists of optional [whitespace], +a `=` character, optional [whitespace], and an [attribute +value]. + +An [attribute value](@) +consists of an [unquoted attribute value], +a [single-quoted attribute value], or a [double-quoted attribute value]. + +An [unquoted attribute value](@) +is a nonempty string of characters not +including [whitespace], `"`, `'`, `=`, `<`, `>`, or `` ` ``. + +A [single-quoted attribute value](@) +consists of `'`, zero or more +characters not including `'`, and a final `'`. + +A [double-quoted attribute value](@) +consists of `"`, zero or more +characters not including `"`, and a final `"`. + +An [open tag](@) consists of a `<` character, a [tag name], +zero or more [attributes], optional [whitespace], an optional `/` +character, and a `>` character. + +A [closing tag](@) consists of the string `</`, a +[tag name], optional [whitespace], and the character `>`. + +An [HTML comment](@) consists of `<!--` + *text* + `-->`, +where *text* does not start with `>` or `->`, does not end with `-`, +and does not contain `--`. (See the +[HTML5 spec](http://www.w3.org/TR/html5/syntax.html#comments).) + +A [processing instruction](@) +consists of the string `<?`, a string +of characters not including the string `?>`, and the string +`?>`. + +A [declaration](@) consists of the +string `<!`, a name consisting of one or more uppercase ASCII letters, +[whitespace], a string of characters not including the +character `>`, and the character `>`. + +A [CDATA section](@) consists of +the string `<![CDATA[`, a string of characters not including the string +`]]>`, and the string `]]>`. + +An [HTML tag](@) consists of an [open tag], a [closing tag], +an [HTML comment], a [processing instruction], a [declaration], +or a [CDATA section]. + +Here are some simple open tags: + +```````````````````````````````` example +<a><bab><c2c> +. +<p><a><bab><c2c></p> +```````````````````````````````` + + +Empty elements: + +```````````````````````````````` example +<a/><b2/> +. +<p><a/><b2/></p> +```````````````````````````````` + + +[Whitespace] is allowed: + +```````````````````````````````` example +<a /><b2 +data="foo" > +. +<p><a /><b2 +data="foo" ></p> +```````````````````````````````` + + +With attributes: + +```````````````````````````````` example +<a foo="bar" bam = 'baz <em>"</em>' +_boolean zoop:33=zoop:33 /> +. +<p><a foo="bar" bam = 'baz <em>"</em>' +_boolean zoop:33=zoop:33 /></p> +```````````````````````````````` + + +Custom tag names can be used: + +```````````````````````````````` example +Foo <responsive-image src="foo.jpg" /> +. +<p>Foo <responsive-image src="foo.jpg" /></p> +```````````````````````````````` + + +Illegal tag names, not parsed as HTML: + +```````````````````````````````` example +<33> <__> +. +<p><33> <__></p> +```````````````````````````````` + + +Illegal attribute names: + +```````````````````````````````` example +<a h*#ref="hi"> +. +<p><a h*#ref="hi"></p> +```````````````````````````````` + + +Illegal attribute values: + +```````````````````````````````` example +<a href="hi'> <a href=hi'> +. +<p><a href="hi'> <a href=hi'></p> +```````````````````````````````` + + +Illegal [whitespace]: + +```````````````````````````````` example +< a>< +foo><bar/ > +<foo bar=baz +bim!bop /> +. +<p>< a>< +foo><bar/ > +<foo bar=baz +bim!bop /></p> +```````````````````````````````` + + +Missing [whitespace]: + +```````````````````````````````` example +<a href='bar'title=title> +. +<p><a href='bar'title=title></p> +```````````````````````````````` + + +Closing tags: + +```````````````````````````````` example +</a></foo > +. +<p></a></foo ></p> +```````````````````````````````` + + +Illegal attributes in closing tag: + +```````````````````````````````` example +</a href="foo"> +. +<p></a href="foo"></p> +```````````````````````````````` + + +Comments: + +```````````````````````````````` example +foo <!-- this is a +comment - with hyphen --> +. +<p>foo <!-- this is a +comment - with hyphen --></p> +```````````````````````````````` + + +```````````````````````````````` example +foo <!-- not a comment -- two hyphens --> +. +<p>foo <!-- not a comment -- two hyphens --></p> +```````````````````````````````` + + +Not comments: + +```````````````````````````````` example +foo <!--> foo --> + +foo <!-- foo---> +. +<p>foo <!--> foo --></p> +<p>foo <!-- foo---></p> +```````````````````````````````` + + +Processing instructions: + +```````````````````````````````` example +foo <?php echo $a; ?> +. +<p>foo <?php echo $a; ?></p> +```````````````````````````````` + + +Declarations: + +```````````````````````````````` example +foo <!ELEMENT br EMPTY> +. +<p>foo <!ELEMENT br EMPTY></p> +```````````````````````````````` + + +CDATA sections: + +```````````````````````````````` example +foo <![CDATA[>&<]]> +. +<p>foo <![CDATA[>&<]]></p> +```````````````````````````````` + + +Entity and numeric character references are preserved in HTML +attributes: + +```````````````````````````````` example +foo <a href="ö"> +. +<p>foo <a href="ö"></p> +```````````````````````````````` + + +Backslash escapes do not work in HTML attributes: + +```````````````````````````````` example +foo <a href="\*"> +. +<p>foo <a href="\*"></p> +```````````````````````````````` + + +```````````````````````````````` example +<a href="\""> +. +<p><a href="""></p> +```````````````````````````````` + + +<div class="extension"> + +## Disallowed Raw HTML (extension) + +GFM enables the `tagfilter` extension, where the following HTML tags will be +filtered when rendering HTML output: + +* `<title>` +* `<textarea>` +* `<style>` +* `<xmp>` +* `<iframe>` +* `<noembed>` +* `<noframes>` +* `<script>` +* `<plaintext>` + +Filtering is done by replacing the leading `<` with the entity `<`. These +tags are chosen in particular as they change how HTML is interpreted in a way +unique to them (i.e. nested HTML is interpreted differently), and this is +usually undesireable in the context of other rendered Markdown content. + +All other HTML tags are left untouched. + +```````````````````````````````` example tagfilter +<strong> <title> <style> <em> + +<blockquote> + <xmp> is disallowed. <XMP> is also disallowed. +</blockquote> +. +<p><strong> <title> <style> <em></p> +<blockquote> + <xmp> is disallowed. <XMP> is also disallowed. +</blockquote> +```````````````````````````````` + +</div> + +## Hard line breaks + +A line break (not in a code span or HTML tag) that is preceded +by two or more spaces and does not occur at the end of a block +is parsed as a [hard line break](@) (rendered +in HTML as a `<br />` tag): + +```````````````````````````````` example +foo +baz +. +<p>foo<br /> +baz</p> +```````````````````````````````` + + +For a more visible alternative, a backslash before the +[line ending] may be used instead of two spaces: + +```````````````````````````````` example +foo\ +baz +. +<p>foo<br /> +baz</p> +```````````````````````````````` + + +More than two spaces can be used: + +```````````````````````````````` example +foo +baz +. +<p>foo<br /> +baz</p> +```````````````````````````````` + + +Leading spaces at the beginning of the next line are ignored: + +```````````````````````````````` example +foo + bar +. +<p>foo<br /> +bar</p> +```````````````````````````````` + + +```````````````````````````````` example +foo\ + bar +. +<p>foo<br /> +bar</p> +```````````````````````````````` + + +Line breaks can occur inside emphasis, links, and other constructs +that allow inline content: + +```````````````````````````````` example +*foo +bar* +. +<p><em>foo<br /> +bar</em></p> +```````````````````````````````` + + +```````````````````````````````` example +*foo\ +bar* +. +<p><em>foo<br /> +bar</em></p> +```````````````````````````````` + + +Line breaks do not occur inside code spans + +```````````````````````````````` example +`code +span` +. +<p><code>code span</code></p> +```````````````````````````````` + + +```````````````````````````````` example +`code\ +span` +. +<p><code>code\ span</code></p> +```````````````````````````````` + + +or HTML tags: + +```````````````````````````````` example +<a href="foo +bar"> +. +<p><a href="foo +bar"></p> +```````````````````````````````` + + +```````````````````````````````` example +<a href="foo\ +bar"> +. +<p><a href="foo\ +bar"></p> +```````````````````````````````` + + +Hard line breaks are for separating inline content within a block. +Neither syntax for hard line breaks works at the end of a paragraph or +other block element: + +```````````````````````````````` example +foo\ +. +<p>foo\</p> +```````````````````````````````` + + +```````````````````````````````` example +foo +. +<p>foo</p> +```````````````````````````````` + + +```````````````````````````````` example +### foo\ +. +<h3>foo\</h3> +```````````````````````````````` + + +```````````````````````````````` example +### foo +. +<h3>foo</h3> +```````````````````````````````` + + +## Soft line breaks + +A regular line break (not in a code span or HTML tag) that is not +preceded by two or more spaces or a backslash is parsed as a +[softbreak](@). (A softbreak may be rendered in HTML either as a +[line ending] or as a space. The result will be the same in +browsers. In the examples here, a [line ending] will be used.) + +```````````````````````````````` example +foo +baz +. +<p>foo +baz</p> +```````````````````````````````` + + +Spaces at the end of the line and beginning of the next line are +removed: + +```````````````````````````````` example +foo + baz +. +<p>foo +baz</p> +```````````````````````````````` + + +A conforming parser may render a soft line break in HTML either as a +line break or as a space. + +A renderer may also provide an option to render soft line breaks +as hard line breaks. + +## Textual content + +Any characters not given an interpretation by the above rules will +be parsed as plain textual content. + +```````````````````````````````` example +hello $.;'there +. +<p>hello $.;'there</p> +```````````````````````````````` + + +```````````````````````````````` example +Foo χρῆν +. +<p>Foo χρῆν</p> +```````````````````````````````` + + +Internal spaces are preserved verbatim: + +```````````````````````````````` example +Multiple spaces +. +<p>Multiple spaces</p> +```````````````````````````````` + + +<!-- END TESTS --> + +# Appendix: A parsing strategy + +In this appendix we describe some features of the parsing strategy +used in the CommonMark reference implementations. + +## Overview + +Parsing has two phases: + +1. In the first phase, lines of input are consumed and the block +structure of the document---its division into paragraphs, block quotes, +list items, and so on---is constructed. Text is assigned to these +blocks but not parsed. Link reference definitions are parsed and a +map of links is constructed. + +2. In the second phase, the raw text contents of paragraphs and headings +are parsed into sequences of Markdown inline elements (strings, +code spans, links, emphasis, and so on), using the map of link +references constructed in phase 1. + +At each point in processing, the document is represented as a tree of +**blocks**. The root of the tree is a `document` block. The `document` +may have any number of other blocks as **children**. These children +may, in turn, have other blocks as children. The last child of a block +is normally considered **open**, meaning that subsequent lines of input +can alter its contents. (Blocks that are not open are **closed**.) +Here, for example, is a possible document tree, with the open blocks +marked by arrows: + +``` tree +-> document + -> block_quote + paragraph + "Lorem ipsum dolor\nsit amet." + -> list (type=bullet tight=true bullet_char=-) + list_item + paragraph + "Qui *quodsi iracundia*" + -> list_item + -> paragraph + "aliquando id" +``` + +## Phase 1: block structure + +Each line that is processed has an effect on this tree. The line is +analyzed and, depending on its contents, the document may be altered +in one or more of the following ways: + +1. One or more open blocks may be closed. +2. One or more new blocks may be created as children of the + last open block. +3. Text may be added to the last (deepest) open block remaining + on the tree. + +Once a line has been incorporated into the tree in this way, +it can be discarded, so input can be read in a stream. + +For each line, we follow this procedure: + +1. First we iterate through the open blocks, starting with the +root document, and descending through last children down to the last +open block. Each block imposes a condition that the line must satisfy +if the block is to remain open. For example, a block quote requires a +`>` character. A paragraph requires a non-blank line. +In this phase we may match all or just some of the open +blocks. But we cannot close unmatched blocks yet, because we may have a +[lazy continuation line]. + +2. Next, after consuming the continuation markers for existing +blocks, we look for new block starts (e.g. `>` for a block quote). +If we encounter a new block start, we close any blocks unmatched +in step 1 before creating the new block as a child of the last +matched block. + +3. Finally, we look at the remainder of the line (after block +markers like `>`, list markers, and indentation have been consumed). +This is text that can be incorporated into the last open +block (a paragraph, code block, heading, or raw HTML). + +Setext headings are formed when we see a line of a paragraph +that is a [setext heading underline]. + +Reference link definitions are detected when a paragraph is closed; +the accumulated text lines are parsed to see if they begin with +one or more reference link definitions. Any remainder becomes a +normal paragraph. + +We can see how this works by considering how the tree above is +generated by four lines of Markdown: + +``` markdown +> Lorem ipsum dolor +sit amet. +> - Qui *quodsi iracundia* +> - aliquando id +``` + +At the outset, our document model is just + +``` tree +-> document +``` + +The first line of our text, + +``` markdown +> Lorem ipsum dolor +``` + +causes a `block_quote` block to be created as a child of our +open `document` block, and a `paragraph` block as a child of +the `block_quote`. Then the text is added to the last open +block, the `paragraph`: + +``` tree +-> document + -> block_quote + -> paragraph + "Lorem ipsum dolor" +``` + +The next line, + +``` markdown +sit amet. +``` + +is a "lazy continuation" of the open `paragraph`, so it gets added +to the paragraph's text: + +``` tree +-> document + -> block_quote + -> paragraph + "Lorem ipsum dolor\nsit amet." +``` + +The third line, + +``` markdown +> - Qui *quodsi iracundia* +``` + +causes the `paragraph` block to be closed, and a new `list` block +opened as a child of the `block_quote`. A `list_item` is also +added as a child of the `list`, and a `paragraph` as a child of +the `list_item`. The text is then added to the new `paragraph`: + +``` tree +-> document + -> block_quote + paragraph + "Lorem ipsum dolor\nsit amet." + -> list (type=bullet tight=true bullet_char=-) + -> list_item + -> paragraph + "Qui *quodsi iracundia*" +``` + +The fourth line, + +``` markdown +> - aliquando id +``` + +causes the `list_item` (and its child the `paragraph`) to be closed, +and a new `list_item` opened up as child of the `list`. A `paragraph` +is added as a child of the new `list_item`, to contain the text. +We thus obtain the final tree: + +``` tree +-> document + -> block_quote + paragraph + "Lorem ipsum dolor\nsit amet." + -> list (type=bullet tight=true bullet_char=-) + list_item + paragraph + "Qui *quodsi iracundia*" + -> list_item + -> paragraph + "aliquando id" +``` + +## Phase 2: inline structure + +Once all of the input has been parsed, all open blocks are closed. + +We then "walk the tree," visiting every node, and parse raw +string contents of paragraphs and headings as inlines. At this +point we have seen all the link reference definitions, so we can +resolve reference links as we go. + +``` tree +document + block_quote + paragraph + str "Lorem ipsum dolor" + softbreak + str "sit amet." + list (type=bullet tight=true bullet_char=-) + list_item + paragraph + str "Qui " + emph + str "quodsi iracundia" + list_item + paragraph + str "aliquando id" +``` + +Notice how the [line ending] in the first paragraph has +been parsed as a `softbreak`, and the asterisks in the first list item +have become an `emph`. + +### An algorithm for parsing nested emphasis and links + +By far the trickiest part of inline parsing is handling emphasis, +strong emphasis, links, and images. This is done using the following +algorithm. + +When we're parsing inlines and we hit either + +- a run of `*` or `_` characters, or +- a `[` or `![` + +we insert a text node with these symbols as its literal content, and we +add a pointer to this text node to the [delimiter stack](@). + +The [delimiter stack] is a doubly linked list. Each +element contains a pointer to a text node, plus information about + +- the type of delimiter (`[`, `![`, `*`, `_`) +- the number of delimiters, +- whether the delimiter is "active" (all are active to start), and +- whether the delimiter is a potential opener, a potential closer, + or both (which depends on what sort of characters precede + and follow the delimiters). + +When we hit a `]` character, we call the *look for link or image* +procedure (see below). + +When we hit the end of the input, we call the *process emphasis* +procedure (see below), with `stack_bottom` = NULL. + +#### *look for link or image* + +Starting at the top of the delimiter stack, we look backwards +through the stack for an opening `[` or `![` delimiter. + +- If we don't find one, we return a literal text node `]`. + +- If we do find one, but it's not *active*, we remove the inactive + delimiter from the stack, and return a literal text node `]`. + +- If we find one and it's active, then we parse ahead to see if + we have an inline link/image, reference link/image, compact reference + link/image, or shortcut reference link/image. + + + If we don't, then we remove the opening delimiter from the + delimiter stack and return a literal text node `]`. + + + If we do, then + + * We return a link or image node whose children are the inlines + after the text node pointed to by the opening delimiter. + + * We run *process emphasis* on these inlines, with the `[` opener + as `stack_bottom`. + + * We remove the opening delimiter. + + * If we have a link (and not an image), we also set all + `[` delimiters before the opening delimiter to *inactive*. (This + will prevent us from getting links within links.) + +#### *process emphasis* + +Parameter `stack_bottom` sets a lower bound to how far we +descend in the [delimiter stack]. If it is NULL, we can +go all the way to the bottom. Otherwise, we stop before +visiting `stack_bottom`. + +Let `current_position` point to the element on the [delimiter stack] +just above `stack_bottom` (or the first element if `stack_bottom` +is NULL). + +We keep track of the `openers_bottom` for each delimiter +type (`*`, `_`) and each length of the closing delimiter run +(modulo 3). Initialize this to `stack_bottom`. + +Then we repeat the following until we run out of potential +closers: + +- Move `current_position` forward in the delimiter stack (if needed) + until we find the first potential closer with delimiter `*` or `_`. + (This will be the potential closer closest + to the beginning of the input -- the first one in parse order.) + +- Now, look back in the stack (staying above `stack_bottom` and + the `openers_bottom` for this delimiter type) for the + first matching potential opener ("matching" means same delimiter). + +- If one is found: + + + Figure out whether we have emphasis or strong emphasis: + if both closer and opener spans have length >= 2, we have + strong, otherwise regular. + + + Insert an emph or strong emph node accordingly, after + the text node corresponding to the opener. + + + Remove any delimiters between the opener and closer from + the delimiter stack. + + + Remove 1 (for regular emph) or 2 (for strong emph) delimiters + from the opening and closing text nodes. If they become empty + as a result, remove them and remove the corresponding element + of the delimiter stack. If the closing node is removed, reset + `current_position` to the next element in the stack. + +- If none is found: + + + Set `openers_bottom` to the element before `current_position`. + (We know that there are no openers for this kind of closer up to and + including this point, so this puts a lower bound on future searches.) + + + If the closer at `current_position` is not a potential opener, + remove it from the delimiter stack (since we know it can't + be a closer either). + + + Advance `current_position` to the next element in the stack. + +After we're done, we remove all delimiters above `stack_bottom` from the +delimiter stack.