diff options
Diffstat (limited to 'tests')
369 files changed, 32902 insertions, 805 deletions
diff --git a/tests/__init__.py b/tests/__init__.py new file mode 100644 index 0000000..564ba3b --- /dev/null +++ b/tests/__init__.py @@ -0,0 +1,20 @@ +""" +Python Markdown + +A Python implementation of John Gruber's Markdown. + +Documentation: https://python-markdown.github.io/ +GitHub: https://github.com/Python-Markdown/markdown/ +PyPI: https://pypi.org/project/Markdown/ + +Started by Manfred Stienstra (http://www.dwerg.net/). +Maintained for a few years by Yuri Takhteyev (http://www.freewisdom.org). +Currently maintained by Waylan Limberg (https://github.com/waylan), +Dmitry Shachnev (https://github.com/mitya57) and Isaac Muse (https://github.com/facelessuser). + +Copyright 2007-2018 The Python Markdown Project (v. 1.7 and later) +Copyright 2004, 2005, 2006 Yuri Takhteyev (v. 0.2-1.6b) +Copyright 2004 Manfred Stienstra (the original version) + +License: BSD (see LICENSE.md for details). +""" diff --git a/tests/markdown-test/amps-and-angle-encoding.html b/tests/basic/amps-and-angle-encoding.html index 2c466c1..2c466c1 100644 --- a/tests/markdown-test/amps-and-angle-encoding.html +++ b/tests/basic/amps-and-angle-encoding.html diff --git a/tests/markdown-test/amps-and-angle-encoding.txt b/tests/basic/amps-and-angle-encoding.txt index 0e9527f..0e9527f 100644 --- a/tests/markdown-test/amps-and-angle-encoding.txt +++ b/tests/basic/amps-and-angle-encoding.txt diff --git a/tests/markdown-test/angle-links-and-img.html b/tests/basic/angle-links-and-img.html index 1ca3b0b..1ca3b0b 100644 --- a/tests/markdown-test/angle-links-and-img.html +++ b/tests/basic/angle-links-and-img.html diff --git a/tests/markdown-test/angle-links-and-img.txt b/tests/basic/angle-links-and-img.txt index 1dbf404..1dbf404 100644 --- a/tests/markdown-test/angle-links-and-img.txt +++ b/tests/basic/angle-links-and-img.txt diff --git a/tests/markdown-test/auto-links.html b/tests/basic/auto-links.html index 7481fe2..7481fe2 100644 --- a/tests/markdown-test/auto-links.html +++ b/tests/basic/auto-links.html diff --git a/tests/markdown-test/auto-links.txt b/tests/basic/auto-links.txt index a188b40..a188b40 100644 --- a/tests/markdown-test/auto-links.txt +++ b/tests/basic/auto-links.txt diff --git a/tests/markdown-test/backlash-escapes.html b/tests/basic/backlash-escapes.html index 876775f..876775f 100644 --- a/tests/markdown-test/backlash-escapes.html +++ b/tests/basic/backlash-escapes.html diff --git a/tests/markdown-test/backlash-escapes.txt b/tests/basic/backlash-escapes.txt index 16447a0..16447a0 100644 --- a/tests/markdown-test/backlash-escapes.txt +++ b/tests/basic/backlash-escapes.txt diff --git a/tests/markdown-test/blockquotes-with-code-blocks.html b/tests/basic/blockquotes-with-code-blocks.html index 5fc98b1..5fc98b1 100644 --- a/tests/markdown-test/blockquotes-with-code-blocks.html +++ b/tests/basic/blockquotes-with-code-blocks.html diff --git a/tests/markdown-test/blockquotes-with-code-blocks.txt b/tests/basic/blockquotes-with-code-blocks.txt index c31d171..c31d171 100644 --- a/tests/markdown-test/blockquotes-with-code-blocks.txt +++ b/tests/basic/blockquotes-with-code-blocks.txt diff --git a/tests/markdown-test/codeblock-in-list.html b/tests/basic/codeblock-in-list.html index 49edd56..49edd56 100644 --- a/tests/markdown-test/codeblock-in-list.html +++ b/tests/basic/codeblock-in-list.html diff --git a/tests/markdown-test/codeblock-in-list.txt b/tests/basic/codeblock-in-list.txt index 87d4e3b..87d4e3b 100644 --- a/tests/markdown-test/codeblock-in-list.txt +++ b/tests/basic/codeblock-in-list.txt diff --git a/tests/markdown-test/hard-wrapped.html b/tests/basic/hard-wrapped.html index e28e900..e28e900 100644 --- a/tests/markdown-test/hard-wrapped.html +++ b/tests/basic/hard-wrapped.html diff --git a/tests/markdown-test/hard-wrapped.txt b/tests/basic/hard-wrapped.txt index f8a5b27..f8a5b27 100644 --- a/tests/markdown-test/hard-wrapped.txt +++ b/tests/basic/hard-wrapped.txt diff --git a/tests/markdown-test/horizontal-rules.html b/tests/basic/horizontal-rules.html index 478e8c5..478e8c5 100644 --- a/tests/markdown-test/horizontal-rules.html +++ b/tests/basic/horizontal-rules.html diff --git a/tests/markdown-test/horizontal-rules.txt b/tests/basic/horizontal-rules.txt index 1594bda..1594bda 100644 --- a/tests/markdown-test/horizontal-rules.txt +++ b/tests/basic/horizontal-rules.txt diff --git a/tests/markdown-test/links-inline.html b/tests/basic/links-inline.html index 707937a..707937a 100644 --- a/tests/markdown-test/links-inline.html +++ b/tests/basic/links-inline.html diff --git a/tests/markdown-test/links-inline.txt b/tests/basic/links-inline.txt index 4d0c1c2..4d0c1c2 100644 --- a/tests/markdown-test/links-inline.txt +++ b/tests/basic/links-inline.txt diff --git a/tests/basic/links-reference.html b/tests/basic/links-reference.html new file mode 100644 index 0000000..63f242d --- /dev/null +++ b/tests/basic/links-reference.html @@ -0,0 +1,22 @@ +<p>Foo <a href="/url/" title="Title">bar</a>.</p> +<p>Foo <a href="/url/" title="Title">bar</a>.</p> +<p>Foo <a href="/url/" title="Title">bar</a>.</p> +<p>With <a href="/url/">embedded [brackets]</a>.</p> +<p>Indented <a href="/url">once</a>.</p> +<p>Indented <a href="/url">twice</a>.</p> +<p>Indented <a href="/url">thrice</a>.</p> +<p>Indented [four][] times.</p> +<pre><code>[four]: /url +</code></pre> +<p>With <a href="http://example.com/" title="Angle Brackets">angle brackets</a>.</p> +<p>And <a href="http://example.com/" title="Without angle brackets.">without</a>.</p> +<p>With <a href="http://example.com" title="Yes this works">line +breaks</a></p> +<p>and <a href="http://example.com" title="Yes this works">line +breaks</a> with one space.</p> +<p>and [line<br /> +breaks[] with two spaces.</p> +<p><a href="http://example.com" title="No more hanging empty bracket!">short ref</a></p> +<p><a href="http://example.com" title="No more hanging empty bracket!">short +ref</a></p> +<p><a href="http://example.com" title="Title on next line.">a ref</a></p>
\ No newline at end of file diff --git a/tests/basic/links-reference.txt b/tests/basic/links-reference.txt new file mode 100644 index 0000000..3d636e5 --- /dev/null +++ b/tests/basic/links-reference.txt @@ -0,0 +1,61 @@ +Foo [bar] [1]. + +Foo [bar][1]. + +Foo [bar] +[1]. + +[1]: /url/ "Title" + + +With [embedded [brackets]] [b]. + + +Indented [once][]. + +Indented [twice][]. + +Indented [thrice][]. + +Indented [four][] times. + + [once]: /url + + [twice]: /url + + [thrice]: /url + + [four]: /url + + +[b]: /url/ + +With [angle brackets][]. + +And [without][]. + +[angle brackets]: <http://example.com/> "Angle Brackets" +[without]: http://example.com/ "Without angle brackets." + +With [line +breaks][] + +and [line +breaks][] with one space. + +and [line +breaks[] with two spaces. + +[line breaks]: http://example.com "Yes this works" + +[short ref] + +[short +ref] + +[short ref]: http://example.com "No more hanging empty bracket!" + +[a ref] + +[a ref]: http://example.com + "Title on next line." diff --git a/tests/markdown-test/literal-quotes.html b/tests/basic/literal-quotes.html index 0342589..0342589 100644 --- a/tests/markdown-test/literal-quotes.html +++ b/tests/basic/literal-quotes.html diff --git a/tests/markdown-test/literal-quotes.txt b/tests/basic/literal-quotes.txt index 29d0e42..29d0e42 100644 --- a/tests/markdown-test/literal-quotes.txt +++ b/tests/basic/literal-quotes.txt diff --git a/tests/basic/markdown-documentation-basics.html b/tests/basic/markdown-documentation-basics.html new file mode 100644 index 0000000..fd2e687 --- /dev/null +++ b/tests/basic/markdown-documentation-basics.html @@ -0,0 +1,243 @@ +<h1>Markdown: Basics</h1> +<ul id="ProjectSubmenu"> + <li><a href="/projects/markdown/" title="Markdown Project Page">Main</a></li> + <li><a class="selected" title="Markdown Basics">Basics</a></li> + <li><a href="/projects/markdown/syntax" title="Markdown Syntax Documentation">Syntax</a></li> + <li><a href="/projects/markdown/license" title="Pricing and License Information">License</a></li> + <li><a href="/projects/markdown/dingus" title="Online Markdown Web Form">Dingus</a></li> +</ul> + +<h2>Getting the Gist of Markdown's Formatting Syntax</h2> +<p>This page offers a brief overview of what it's like to use Markdown. +The <a href="/projects/markdown/syntax" title="Markdown Syntax">syntax page</a> provides complete, detailed documentation for +every feature, but Markdown should be very easy to pick up simply by +looking at a few examples of it in action. The examples on this page +are written in a before/after style, showing example syntax and the +HTML output produced by Markdown.</p> +<p>It's also helpful to simply try Markdown out; the <a href="/projects/markdown/dingus" title="Markdown Dingus">Dingus</a> is a +web application that allows you type your own Markdown-formatted text +and translate it to XHTML.</p> +<p><strong>Note:</strong> This document is itself written using Markdown; you +can <a href="/projects/markdown/basics.text">see the source for it by adding '.text' to the URL</a>.</p> +<h2>Paragraphs, Headers, Blockquotes</h2> +<p>A paragraph is simply one or more consecutive lines of text, separated +by one or more blank lines. (A blank line is any line that looks like a +blank line -- a line containing nothing spaces or tabs is considered +blank.) Normal paragraphs should not be indented with spaces or tabs.</p> +<p>Markdown offers two styles of headers: <em>Setext</em> and <em>atx</em>. +Setext-style headers for <code><h1></code> and <code><h2></code> are created by +"underlining" with equal signs (<code>=</code>) and hyphens (<code>-</code>), respectively. +To create an atx-style header, you put 1-6 hash marks (<code>#</code>) at the +beginning of the line -- the number of hashes equals the resulting +HTML header level.</p> +<p>Blockquotes are indicated using email-style '<code>></code>' angle brackets.</p> +<p>Markdown:</p> +<pre><code>A First Level Header +==================== + +A Second Level Header +--------------------- + +Now is the time for all good men to come to +the aid of their country. This is just a +regular paragraph. + +The quick brown fox jumped over the lazy +dog's back. + +### Header 3 + +> This is a blockquote. +> +> This is the second paragraph in the blockquote. +> +> ## This is an H2 in a blockquote +</code></pre> +<p>Output:</p> +<pre><code><h1>A First Level Header</h1> + +<h2>A Second Level Header</h2> + +<p>Now is the time for all good men to come to +the aid of their country. This is just a +regular paragraph.</p> + +<p>The quick brown fox jumped over the lazy +dog's back.</p> + +<h3>Header 3</h3> + +<blockquote> + <p>This is a blockquote.</p> + + <p>This is the second paragraph in the blockquote.</p> + + <h2>This is an H2 in a blockquote</h2> +</blockquote> +</code></pre> +<h3>Phrase Emphasis</h3> +<p>Markdown uses asterisks and underscores to indicate spans of emphasis.</p> +<p>Markdown:</p> +<pre><code>Some of these words *are emphasized*. +Some of these words _are emphasized also_. + +Use two asterisks for **strong emphasis**. +Or, if you prefer, __use two underscores instead__. +</code></pre> +<p>Output:</p> +<pre><code><p>Some of these words <em>are emphasized</em>. +Some of these words <em>are emphasized also</em>.</p> + +<p>Use two asterisks for <strong>strong emphasis</strong>. +Or, if you prefer, <strong>use two underscores instead</strong>.</p> +</code></pre> +<h2>Lists</h2> +<p>Unordered (bulleted) lists use asterisks, pluses, and hyphens (<code>*</code>, +<code>+</code>, and <code>-</code>) as list markers. These three markers are +interchangeable; this:</p> +<pre><code>* Candy. +* Gum. +* Booze. +</code></pre> +<p>this:</p> +<pre><code>+ Candy. ++ Gum. ++ Booze. +</code></pre> +<p>and this:</p> +<pre><code>- Candy. +- Gum. +- Booze. +</code></pre> +<p>all produce the same output:</p> +<pre><code><ul> +<li>Candy.</li> +<li>Gum.</li> +<li>Booze.</li> +</ul> +</code></pre> +<p>Ordered (numbered) lists use regular numbers, followed by periods, as +list markers:</p> +<pre><code>1. Red +2. Green +3. Blue +</code></pre> +<p>Output:</p> +<pre><code><ol> +<li>Red</li> +<li>Green</li> +<li>Blue</li> +</ol> +</code></pre> +<p>If you put blank lines between items, you'll get <code><p></code> tags for the +list item text. You can create multi-paragraph list items by indenting +the paragraphs by 4 spaces or 1 tab:</p> +<pre><code>* A list item. + + With multiple paragraphs. + +* Another item in the list. +</code></pre> +<p>Output:</p> +<pre><code><ul> +<li><p>A list item.</p> +<p>With multiple paragraphs.</p></li> +<li><p>Another item in the list.</p></li> +</ul> +</code></pre> +<h3>Links</h3> +<p>Markdown supports two styles for creating links: <em>inline</em> and +<em>reference</em>. With both styles, you use square brackets to delimit the +text you want to turn into a link.</p> +<p>Inline-style links use parentheses immediately after the link text. +For example:</p> +<pre><code>This is an [example link](http://example.com/). +</code></pre> +<p>Output:</p> +<pre><code><p>This is an <a href="http://example.com/"> +example link</a>.</p> +</code></pre> +<p>Optionally, you may include a title attribute in the parentheses:</p> +<pre><code>This is an [example link](http://example.com/ "With a Title"). +</code></pre> +<p>Output:</p> +<pre><code><p>This is an <a href="http://example.com/" title="With a Title"> +example link</a>.</p> +</code></pre> +<p>Reference-style links allow you to refer to your links by names, which +you define elsewhere in your document:</p> +<pre><code>I get 10 times more traffic from [Google][1] than from +[Yahoo][2] or [MSN][3]. + +[1]: http://google.com/ "Google" +[2]: http://search.yahoo.com/ "Yahoo Search" +[3]: http://search.msn.com/ "MSN Search" +</code></pre> +<p>Output:</p> +<pre><code><p>I get 10 times more traffic from <a href="http://google.com/" +title="Google">Google</a> than from <a href="http://search.yahoo.com/" +title="Yahoo Search">Yahoo</a> or <a href="http://search.msn.com/" +title="MSN Search">MSN</a>.</p> +</code></pre> +<p>The title attribute is optional. Link names may contain letters, +numbers and spaces, but are <em>not</em> case sensitive:</p> +<pre><code>I start my morning with a cup of coffee and +[The New York Times][NY Times]. + +[ny times]: http://www.nytimes.com/ +</code></pre> +<p>Output:</p> +<pre><code><p>I start my morning with a cup of coffee and +<a href="http://www.nytimes.com/">The New York Times</a>.</p> +</code></pre> +<h3>Images</h3> +<p>Image syntax is very much like link syntax.</p> +<p>Inline (titles are optional):</p> +<pre><code>![alt text](/path/to/img.jpg "Title") +</code></pre> +<p>Reference-style:</p> +<pre><code>![alt text][id] + +[id]: /path/to/img.jpg "Title" +</code></pre> +<p>Both of the above examples produce the same output:</p> +<pre><code><img src="/path/to/img.jpg" alt="alt text" title="Title" /> +</code></pre> +<h3>Code</h3> +<p>In a regular paragraph, you can create code span by wrapping text in +backtick quotes. Any ampersands (<code>&</code>) and angle brackets (<code><</code> or +<code>></code>) will automatically be translated into HTML entities. This makes +it easy to use Markdown to write about HTML example code:</p> +<pre><code>I strongly recommend against using any `<blink>` tags. + +I wish SmartyPants used named entities like `&mdash;` +instead of decimal-encoded entities like `&#8212;`. +</code></pre> +<p>Output:</p> +<pre><code><p>I strongly recommend against using any +<code>&lt;blink&gt;</code> tags.</p> + +<p>I wish SmartyPants used named entities like +<code>&amp;mdash;</code> instead of decimal-encoded +entities like <code>&amp;#8212;</code>.</p> +</code></pre> +<p>To specify an entire block of pre-formatted code, indent every line of +the block by 4 spaces or 1 tab. Just like with code spans, <code>&</code>, <code><</code>, +and <code>></code> characters will be escaped automatically.</p> +<p>Markdown:</p> +<pre><code>If you want your page to validate under XHTML 1.0 Strict, +you've got to put paragraph tags in your blockquotes: + + <blockquote> + <p>For example.</p> + </blockquote> +</code></pre> +<p>Output:</p> +<pre><code><p>If you want your page to validate under XHTML 1.0 Strict, +you've got to put paragraph tags in your blockquotes:</p> + +<pre><code>&lt;blockquote&gt; + &lt;p&gt;For example.&lt;/p&gt; +&lt;/blockquote&gt; +</code></pre> +</code></pre>
\ No newline at end of file diff --git a/tests/basic/markdown-documentation-basics.txt b/tests/basic/markdown-documentation-basics.txt new file mode 100644 index 0000000..b0932f3 --- /dev/null +++ b/tests/basic/markdown-documentation-basics.txt @@ -0,0 +1,306 @@ +Markdown: Basics +================ + +<ul id="ProjectSubmenu"> + <li><a href="/projects/markdown/" title="Markdown Project Page">Main</a></li> + <li><a class="selected" title="Markdown Basics">Basics</a></li> + <li><a href="/projects/markdown/syntax" title="Markdown Syntax Documentation">Syntax</a></li> + <li><a href="/projects/markdown/license" title="Pricing and License Information">License</a></li> + <li><a href="/projects/markdown/dingus" title="Online Markdown Web Form">Dingus</a></li> +</ul> + + +Getting the Gist of Markdown's Formatting Syntax +------------------------------------------------ + +This page offers a brief overview of what it's like to use Markdown. +The [syntax page] [s] provides complete, detailed documentation for +every feature, but Markdown should be very easy to pick up simply by +looking at a few examples of it in action. The examples on this page +are written in a before/after style, showing example syntax and the +HTML output produced by Markdown. + +It's also helpful to simply try Markdown out; the [Dingus] [d] is a +web application that allows you type your own Markdown-formatted text +and translate it to XHTML. + +**Note:** This document is itself written using Markdown; you +can [see the source for it by adding '.text' to the URL] [src]. + + [s]: /projects/markdown/syntax "Markdown Syntax" + [d]: /projects/markdown/dingus "Markdown Dingus" + [src]: /projects/markdown/basics.text + + +## Paragraphs, Headers, Blockquotes ## + +A paragraph is simply one or more consecutive lines of text, separated +by one or more blank lines. (A blank line is any line that looks like a +blank line -- a line containing nothing spaces or tabs is considered +blank.) Normal paragraphs should not be indented with spaces or tabs. + +Markdown offers two styles of headers: *Setext* and *atx*. +Setext-style headers for `<h1>` and `<h2>` are created by +"underlining" with equal signs (`=`) and hyphens (`-`), respectively. +To create an atx-style header, you put 1-6 hash marks (`#`) at the +beginning of the line -- the number of hashes equals the resulting +HTML header level. + +Blockquotes are indicated using email-style '`>`' angle brackets. + +Markdown: + + A First Level Header + ==================== + + A Second Level Header + --------------------- + + Now is the time for all good men to come to + the aid of their country. This is just a + regular paragraph. + + The quick brown fox jumped over the lazy + dog's back. + + ### Header 3 + + > This is a blockquote. + > + > This is the second paragraph in the blockquote. + > + > ## This is an H2 in a blockquote + + +Output: + + <h1>A First Level Header</h1> + + <h2>A Second Level Header</h2> + + <p>Now is the time for all good men to come to + the aid of their country. This is just a + regular paragraph.</p> + + <p>The quick brown fox jumped over the lazy + dog's back.</p> + + <h3>Header 3</h3> + + <blockquote> + <p>This is a blockquote.</p> + + <p>This is the second paragraph in the blockquote.</p> + + <h2>This is an H2 in a blockquote</h2> + </blockquote> + + + +### Phrase Emphasis ### + +Markdown uses asterisks and underscores to indicate spans of emphasis. + +Markdown: + + Some of these words *are emphasized*. + Some of these words _are emphasized also_. + + Use two asterisks for **strong emphasis**. + Or, if you prefer, __use two underscores instead__. + +Output: + + <p>Some of these words <em>are emphasized</em>. + Some of these words <em>are emphasized also</em>.</p> + + <p>Use two asterisks for <strong>strong emphasis</strong>. + Or, if you prefer, <strong>use two underscores instead</strong>.</p> + + + +## Lists ## + +Unordered (bulleted) lists use asterisks, pluses, and hyphens (`*`, +`+`, and `-`) as list markers. These three markers are +interchangeable; this: + + * Candy. + * Gum. + * Booze. + +this: + + + Candy. + + Gum. + + Booze. + +and this: + + - Candy. + - Gum. + - Booze. + +all produce the same output: + + <ul> + <li>Candy.</li> + <li>Gum.</li> + <li>Booze.</li> + </ul> + +Ordered (numbered) lists use regular numbers, followed by periods, as +list markers: + + 1. Red + 2. Green + 3. Blue + +Output: + + <ol> + <li>Red</li> + <li>Green</li> + <li>Blue</li> + </ol> + +If you put blank lines between items, you'll get `<p>` tags for the +list item text. You can create multi-paragraph list items by indenting +the paragraphs by 4 spaces or 1 tab: + + * A list item. + + With multiple paragraphs. + + * Another item in the list. + +Output: + + <ul> + <li><p>A list item.</p> + <p>With multiple paragraphs.</p></li> + <li><p>Another item in the list.</p></li> + </ul> + + + +### Links ### + +Markdown supports two styles for creating links: *inline* and +*reference*. With both styles, you use square brackets to delimit the +text you want to turn into a link. + +Inline-style links use parentheses immediately after the link text. +For example: + + This is an [example link](http://example.com/). + +Output: + + <p>This is an <a href="http://example.com/"> + example link</a>.</p> + +Optionally, you may include a title attribute in the parentheses: + + This is an [example link](http://example.com/ "With a Title"). + +Output: + + <p>This is an <a href="http://example.com/" title="With a Title"> + example link</a>.</p> + +Reference-style links allow you to refer to your links by names, which +you define elsewhere in your document: + + I get 10 times more traffic from [Google][1] than from + [Yahoo][2] or [MSN][3]. + + [1]: http://google.com/ "Google" + [2]: http://search.yahoo.com/ "Yahoo Search" + [3]: http://search.msn.com/ "MSN Search" + +Output: + + <p>I get 10 times more traffic from <a href="http://google.com/" + title="Google">Google</a> than from <a href="http://search.yahoo.com/" + title="Yahoo Search">Yahoo</a> or <a href="http://search.msn.com/" + title="MSN Search">MSN</a>.</p> + +The title attribute is optional. Link names may contain letters, +numbers and spaces, but are *not* case sensitive: + + I start my morning with a cup of coffee and + [The New York Times][NY Times]. + + [ny times]: http://www.nytimes.com/ + +Output: + + <p>I start my morning with a cup of coffee and + <a href="http://www.nytimes.com/">The New York Times</a>.</p> + + +### Images ### + +Image syntax is very much like link syntax. + +Inline (titles are optional): + + ![alt text](/path/to/img.jpg "Title") + +Reference-style: + + ![alt text][id] + + [id]: /path/to/img.jpg "Title" + +Both of the above examples produce the same output: + + <img src="/path/to/img.jpg" alt="alt text" title="Title" /> + + + +### Code ### + +In a regular paragraph, you can create code span by wrapping text in +backtick quotes. Any ampersands (`&`) and angle brackets (`<` or +`>`) will automatically be translated into HTML entities. This makes +it easy to use Markdown to write about HTML example code: + + I strongly recommend against using any `<blink>` tags. + + I wish SmartyPants used named entities like `—` + instead of decimal-encoded entities like `—`. + +Output: + + <p>I strongly recommend against using any + <code><blink></code> tags.</p> + + <p>I wish SmartyPants used named entities like + <code>&mdash;</code> instead of decimal-encoded + entities like <code>&#8212;</code>.</p> + + +To specify an entire block of pre-formatted code, indent every line of +the block by 4 spaces or 1 tab. Just like with code spans, `&`, `<`, +and `>` characters will be escaped automatically. + +Markdown: + + If you want your page to validate under XHTML 1.0 Strict, + you've got to put paragraph tags in your blockquotes: + + <blockquote> + <p>For example.</p> + </blockquote> + +Output: + + <p>If you want your page to validate under XHTML 1.0 Strict, + you've got to put paragraph tags in your blockquotes:</p> + + <pre><code><blockquote> + <p>For example.</p> + </blockquote> + </code></pre> diff --git a/tests/extensions-x-def_list/markdown-syntax.html b/tests/basic/markdown-syntax.html index 2f63b4b..cd7ba17 100644 --- a/tests/extensions-x-def_list/markdown-syntax.html +++ b/tests/basic/markdown-syntax.html @@ -151,7 +151,7 @@ and <code>&</code> in your example code needs to be escaped.)</p> <p>A paragraph is simply one or more consecutive lines of text, separated by one or more blank lines. (A blank line is any line that looks like a blank line -- a line containing nothing but spaces or tabs is considered -blank.) Normal paragraphs should not be intended with spaces or tabs.</p> +blank.) Normal paragraphs should not be indented with spaces or tabs.</p> <p>The implication of the "one or more consecutive lines of text" rule is that Markdown supports "hard-wrapped" text paragraphs. This differs significantly from most other text-to-HTML formatters (including Movable @@ -241,7 +241,7 @@ Quote Level from the Text menu.</p> <h3 id="list">Lists</h3> <p>Markdown supports ordered (numbered) and unordered (bulleted) lists.</p> -<p>Unordered lists use asterisks, pluses, and hyphens -- interchangably +<p>Unordered lists use asterisks, pluses, and hyphens -- interchangeably -- as list markers:</p> <pre><code>* Red * Green @@ -328,7 +328,7 @@ items in <code><p></code> tags in the HTML output. For example, this input </ul> </code></pre> <p>List items may consist of multiple paragraphs. Each subsequent -paragraph in a list item must be intended by either 4 spaces +paragraph in a list item must be indented by either 4 spaces or one tab:</p> <pre><code>1. This is a list item with two paragraphs. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aliquam hendrerit @@ -484,12 +484,12 @@ on a line by itself:</p> <p>That is:</p> <ul> <li>Square brackets containing the link identifier (optionally -indented from the left margin using up to three spaces);</li> + indented from the left margin using up to three spaces);</li> <li>followed by a colon;</li> <li>followed by one or more spaces (or tabs);</li> <li>followed by the URL for the link;</li> <li>optionally followed by a title attribute for the link, enclosed -in double or single quotes.</li> + in double or single quotes.</li> </ul> <p>The link URL may, optionally, be surrounded by angle brackets:</p> <pre><code>[id]: <http://example.com/> "Optional Title Here" @@ -660,10 +660,10 @@ for links, allowing for two styles: <em>inline</em> and <em>reference</em>.</p> <ul> <li>An exclamation mark: <code>!</code>;</li> <li>followed by a set of square brackets, containing the <code>alt</code> -attribute text for the image;</li> + attribute text for the image;</li> <li>followed by a set of parentheses, containing the URL or path to -the image, and an optional <code>title</code> attribute enclosed in double -or single quotes.</li> + the image, and an optional <code>title</code> attribute enclosed in double + or single quotes.</li> </ul> <p>Reference-style image syntax looks like this:</p> <pre><code>![Alt text][id] diff --git a/tests/extensions-x-def_list/markdown-syntax.txt b/tests/basic/markdown-syntax.txt index dabd75c..38f6e78 100644 --- a/tests/extensions-x-def_list/markdown-syntax.txt +++ b/tests/basic/markdown-syntax.txt @@ -186,7 +186,7 @@ and `&` in your example code needs to be escaped.) A paragraph is simply one or more consecutive lines of text, separated by one or more blank lines. (A blank line is any line that looks like a blank line -- a line containing nothing but spaces or tabs is considered -blank.) Normal paragraphs should not be intended with spaces or tabs. +blank.) Normal paragraphs should not be indented with spaces or tabs. The implication of the "one or more consecutive lines of text" rule is that Markdown supports "hard-wrapped" text paragraphs. This differs @@ -298,7 +298,7 @@ Quote Level from the Text menu. Markdown supports ordered (numbered) and unordered (bulleted) lists. -Unordered lists use asterisks, pluses, and hyphens -- interchangably +Unordered lists use asterisks, pluses, and hyphens -- interchangeably -- as list markers: * Red @@ -401,7 +401,7 @@ will turn into: </ul> List items may consist of multiple paragraphs. Each subsequent -paragraph in a list item must be intended by either 4 spaces +paragraph in a list item must be indented by either 4 spaces or one tab: 1. This is a list item with two paragraphs. Lorem ipsum dolor diff --git a/tests/markdown-test/nested-blockquotes.html b/tests/basic/nested-blockquotes.html index f1b017e..f1b017e 100644 --- a/tests/markdown-test/nested-blockquotes.html +++ b/tests/basic/nested-blockquotes.html diff --git a/tests/markdown-test/nested-blockquotes.txt b/tests/basic/nested-blockquotes.txt index ed3c624..ed3c624 100644 --- a/tests/markdown-test/nested-blockquotes.txt +++ b/tests/basic/nested-blockquotes.txt diff --git a/tests/markdown-test/ordered-and-unordered-list.html b/tests/basic/ordered-and-unordered-list.html index 090c43c..090c43c 100644 --- a/tests/markdown-test/ordered-and-unordered-list.html +++ b/tests/basic/ordered-and-unordered-list.html diff --git a/tests/markdown-test/ordered-and-unordered-list.txt b/tests/basic/ordered-and-unordered-list.txt index 621db58..621db58 100644 --- a/tests/markdown-test/ordered-and-unordered-list.txt +++ b/tests/basic/ordered-and-unordered-list.txt diff --git a/tests/markdown-test/strong-and-em-together.html b/tests/basic/strong-and-em-together.html index 7bf5163..7bf5163 100644 --- a/tests/markdown-test/strong-and-em-together.html +++ b/tests/basic/strong-and-em-together.html diff --git a/tests/markdown-test/strong-and-em-together.txt b/tests/basic/strong-and-em-together.txt index 95ee690..95ee690 100644 --- a/tests/markdown-test/strong-and-em-together.txt +++ b/tests/basic/strong-and-em-together.txt diff --git a/tests/markdown-test/tabs.html b/tests/basic/tabs.html index b26391b..3c11f14 100644 --- a/tests/markdown-test/tabs.html +++ b/tests/basic/tabs.html @@ -1,11 +1,11 @@ <ul> <li> <p>this is a list item -indented with tabs</p> + indented with tabs</p> </li> <li> <p>this is a list item -indented with spaces</p> + indented with spaces</p> </li> </ul> <p>Code:</p> diff --git a/tests/markdown-test/tabs.txt b/tests/basic/tabs.txt index 589d113..589d113 100644 --- a/tests/markdown-test/tabs.txt +++ b/tests/basic/tabs.txt diff --git a/tests/markdown-test/tidyness.html b/tests/basic/tidyness.html index 52b2eaf..52b2eaf 100644 --- a/tests/markdown-test/tidyness.html +++ b/tests/basic/tidyness.html diff --git a/tests/markdown-test/tidyness.txt b/tests/basic/tidyness.txt index 5f18b8d..5f18b8d 100644 --- a/tests/markdown-test/tidyness.txt +++ b/tests/basic/tidyness.txt diff --git a/tests/extensions-x-abbr/abbr.html b/tests/extensions-x-abbr/abbr.html deleted file mode 100644 index 456524e..0000000 --- a/tests/extensions-x-abbr/abbr.html +++ /dev/null @@ -1,4 +0,0 @@ -<p>An <abbr title="Abbreviation">ABBR</abbr>: "<abbr title="Reference">REF</abbr>". -ref and REFERENCE should be ignored.</p> -<p>The <abbr title="Hyper Text Markup Language">HTML</abbr> specification -is maintained by the <abbr title="World Wide Web Consortium">W3C</abbr>.</p>
\ No newline at end of file diff --git a/tests/extensions-x-abbr/abbr.txt b/tests/extensions-x-abbr/abbr.txt deleted file mode 100644 index 991bf15..0000000 --- a/tests/extensions-x-abbr/abbr.txt +++ /dev/null @@ -1,13 +0,0 @@ -An ABBR: "REF". -ref and REFERENCE should be ignored. - -*[REF]: Reference -*[ABBR]: This gets overriden by the next one. -*[ABBR]: Abbreviation - -The HTML specification -is maintained by the W3C. - -*[HTML]: Hyper Text Markup Language -*[W3C]: World Wide Web Consortium - diff --git a/tests/extensions-x-footnotes/footnote.html b/tests/extensions-x-footnotes/footnote.html deleted file mode 100644 index 6556dab..0000000 --- a/tests/extensions-x-footnotes/footnote.html +++ /dev/null @@ -1,29 +0,0 @@ -<p>This is the body with a footnote<sup id="fnref:1"><a href="#fn:1" rel="footnote">1</a></sup> or two<sup id="fnref:2"><a href="#fn:2" rel="footnote">2</a></sup> or more<sup id="fnref:3"><a href="#fn:3" rel="footnote">3</a></sup> <sup id="fnref:4"><a href="#fn:4" rel="footnote">4</a></sup>.</p> -<div class="footnote"> -<hr /> -<ol> -<li id="fn:1"> -<p>Footnote that ends with a list:</p> -<ul> -<li>item 1</li> -<li>item 2</li> -</ul> -<p><a href="#fnref:1" rev="footnote" title="Jump back to footnote 1 in the text">↩</a></p> -</li> -<li id="fn:2"> -<blockquote> -<p>This footnote is a blockquote. -</p> -</blockquote> -<p><a href="#fnref:2" rev="footnote" title="Jump back to footnote 2 in the text">↩</a></p> -</li> -<li id="fn:3"> -<p>A simple oneliner. - <a href="#fnref:3" rev="footnote" title="Jump back to footnote 3 in the text">↩</a></p> -</li> -<li id="fn:4"> -<p>A footnote with multiple paragraphs.</p> -<p>Paragraph two. <a href="#fnref:4" rev="footnote" title="Jump back to footnote 4 in the text">↩</a></p> -</li> -</ol> -</div>
\ No newline at end of file diff --git a/tests/extensions-x-footnotes/footnote.txt b/tests/extensions-x-footnotes/footnote.txt deleted file mode 100644 index 07188d0..0000000 --- a/tests/extensions-x-footnotes/footnote.txt +++ /dev/null @@ -1,14 +0,0 @@ -This is the body with a footnote[^1] or two[^2] or more[^3] [^4]. - -[^1]: Footnote that ends with a list: - - * item 1 - * item 2 - -[^2]: > This footnote is a blockquote. - -[^3]: A simple oneliner. - -[^4]: A footnote with multiple paragraphs. - - Paragraph two. diff --git a/tests/extensions-x-footnotes/named_markers.html b/tests/extensions-x-footnotes/named_markers.html deleted file mode 100644 index 6996b5f..0000000 --- a/tests/extensions-x-footnotes/named_markers.html +++ /dev/null @@ -1,24 +0,0 @@ -<p>This is the body with footnotes<sup id="fnref:foo"><a href="#fn:foo" rel="footnote">1</a></sup> -that have named<sup id="fnref:bar"><a href="#fn:bar" rel="footnote">2</a></sup> markers and -oddly<sup id="fnref:56"><a href="#fn:56" rel="footnote">3</a></sup> numbered<sup id="fnref:99"><a href="#fn:99" rel="footnote">4</a></sup> markers.</p> -<div class="footnote"> -<hr /> -<ol> -<li id="fn:foo"> -<p>Footnote marked <code>foo</code>. - <a href="#fnref:foo" rev="footnote" title="Jump back to footnote 1 in the text">↩</a></p> -</li> -<li id="fn:bar"> -<p>This one is marked <em>bar</em>. - <a href="#fnref:bar" rev="footnote" title="Jump back to footnote 2 in the text">↩</a></p> -</li> -<li id="fn:56"> -<p>A <strong>numbered</strong> footnote. - <a href="#fnref:56" rev="footnote" title="Jump back to footnote 3 in the text">↩</a></p> -</li> -<li id="fn:99"> -<p>The last one. - <a href="#fnref:99" rev="footnote" title="Jump back to footnote 4 in the text">↩</a></p> -</li> -</ol> -</div>
\ No newline at end of file diff --git a/tests/extensions-x-tables/tables.html b/tests/extensions-x-tables/tables.html deleted file mode 100644 index c931e6a..0000000 --- a/tests/extensions-x-tables/tables.html +++ /dev/null @@ -1,119 +0,0 @@ -<h2>Table Tests</h2> -<table> -<thead> -<tr> -<th>First Header</th> -<th>Second Header</th> -</tr> -</thead> -<tbody> -<tr> -<td>Content Cell</td> -<td>Content Cell</td> -</tr> -<tr> -<td>Content Cell</td> -<td>Content Cell</td> -</tr> -</tbody> -</table> -<table> -<thead> -<tr> -<th>First Header</th> -<th>Second Header</th> -</tr> -</thead> -<tbody> -<tr> -<td>Content Cell</td> -<td>Content Cell</td> -</tr> -<tr> -<td>Content Cell</td> -<td>Content Cell</td> -</tr> -</tbody> -</table> -<table> -<thead> -<tr> -<th>Item</th> -<th align="right">Value</th> -</tr> -</thead> -<tbody> -<tr> -<td>Computer</td> -<td align="right">$1600</td> -</tr> -<tr> -<td>Phone</td> -<td align="right">$12</td> -</tr> -<tr> -<td>Pipe</td> -<td align="right">$1</td> -</tr> -</tbody> -</table> -<table> -<thead> -<tr> -<th>Function name</th> -<th>Description</th> -</tr> -</thead> -<tbody> -<tr> -<td><code>help()</code></td> -<td>Display the help window.</td> -</tr> -<tr> -<td><code>destroy()</code></td> -<td><strong>Destroy your computer!</strong></td> -</tr> -</tbody> -</table> -<table> -<thead> -<tr> -<th align="left">foo</th> -<th align="center">bar</th> -<th align="right">baz</th> -</tr> -</thead> -<tbody> -<tr> -<td align="left" /> -<td align="center">Q</td> -<td align="right" /> -</tr> -<tr> -<td align="left">W</td> -<td align="center" /> -<td align="right">W</td> -</tr> -</tbody> -</table> -<table> -<thead> -<tr> -<th>foo</th> -<th>bar</th> -<th>baz</th> -</tr> -</thead> -<tbody> -<tr> -<td /> -<td>Q</td> -<td /> -</tr> -<tr> -<td>W</td> -<td /> -<td>W</td> -</tr> -</tbody> -</table>
\ No newline at end of file diff --git a/tests/extensions-x-tables/tables.txt b/tests/extensions-x-tables/tables.txt deleted file mode 100644 index 64917ab..0000000 --- a/tests/extensions-x-tables/tables.txt +++ /dev/null @@ -1,34 +0,0 @@ -Table Tests ------------ - -First Header | Second Header -------------- | ------------- -Content Cell | Content Cell -Content Cell | Content Cell - -| First Header | Second Header | -| ------------- | ------------- | -| Content Cell | Content Cell | -| Content Cell | Content Cell | - -| Item | Value | -| :-------- | -----:| -| Computer | $1600 | -| Phone | $12 | -| Pipe | $1 | - -| Function name | Description | -| ------------- | ------------------------------ | -| `help()` | Display the help window. | -| `destroy()` | **Destroy your computer!** | - -|foo|bar|baz| -|:--|:-:|--:| -| | Q | | -|W | | W| - -foo|bar|baz ----|---|--- - | Q | - W | | W - diff --git a/tests/extensions-x-toc/nested.html b/tests/extensions-x-toc/nested.html deleted file mode 100644 index a8a1583..0000000 --- a/tests/extensions-x-toc/nested.html +++ /dev/null @@ -1,16 +0,0 @@ -<h1 id="header-a">Header A</h1> -<h2 id="header-1">Header 1</h2> -<h3 id="header-i">Header i</h3> -<h1 id="header-b">Header B</h1> -<div class="toc"> -<ul> -<li><a href="#header-a">Header A</a><ul> -<li><a href="#header-1">Header 1</a><ul> -<li><a href="#header-i">Header i</a></li> -</ul> -</li> -</ul> -</li> -<li><a href="#header-b">Header B</a></li> -</ul> -</div>
\ No newline at end of file diff --git a/tests/extensions-x-wikilinks/wikilinks.html b/tests/extensions-x-wikilinks/wikilinks.html deleted file mode 100644 index 1a38535..0000000 --- a/tests/extensions-x-wikilinks/wikilinks.html +++ /dev/null @@ -1,6 +0,0 @@ -<p>Some text with a <a class="wikilink" href="/WikiLink/">WikiLink</a>.</p> -<p>A link with <a class="wikilink" href="/white_space_and_underscores/">white space and_underscores</a> and a empty one.</p> -<p>And a <a href="http://example.com/RealLink">RealLink</a>.</p> -<p><a href="http://example.com/And_A_AutoLink">http://example.com/And_A_AutoLink</a></p> -<p>And a <a href="/MarkdownLink/" title="A MarkdownLink">MarkdownLink</a> for -completeness.</p>
\ No newline at end of file diff --git a/tests/extensions/admonition.html b/tests/extensions/admonition.html new file mode 100644 index 0000000..8812dcb --- /dev/null +++ b/tests/extensions/admonition.html @@ -0,0 +1,48 @@ +<p>Some text</p> +<div class="admonition note"> +<p class="admonition-title">Note</p> +<p>A normal paragraph here</p> +<ol> +<li>first</li> +<li>second</li> +</ol> +<blockquote> +<p>Some important quote</p> +<p>another paragraph in the quote</p> +</blockquote> +<pre><code>int main() { + // insert some code +} +</code></pre> +</div> +<p>More text and stuff.</p> +<div class="admonition note"> +<p class="admonition-title">Did you know?</p> +<p>You can customize the title of the admonition</p> +</div> +<p>Not part of an Admonition!</p> +<div class="admonition mycustomcssclass"> +<p class="admonition-title">And now...</p> +<p>For something completely different.</p> +<p>You can also use a custom CSS class name.</p> +</div> +<div class="admonition class1 class2 class3"> +<p class="admonition-title">And now...</p> +<p>For something completely different.</p> +<p>Several class names can be separated by space chars.</p> +</div> +<div class="admonition note anotherclass"> +<p class="admonition-title">Note</p> +<p>The default title is the capitalized first class name.</p> +</div> +<div class="admonition tip"> +<p>An explicitly empty string prevents the title from being rendered.</p> +</div> +<p>No body:</p> +<div class="admonition note"> +<p class="admonition-title">Note</p> +</div> +<p>Extra whitespace after the title should not alter output:</p> +<div class="admonition note"> +<p class="admonition-title">Note</p> +</div>
\ No newline at end of file diff --git a/tests/extensions/admonition.txt b/tests/extensions/admonition.txt new file mode 100644 index 0000000..03ff4e9 --- /dev/null +++ b/tests/extensions/admonition.txt @@ -0,0 +1,45 @@ +Some text + +!!! note + A normal paragraph here + + 1. first + 2. second + + > Some important quote + + > another paragraph in the quote + + int main() { + // insert some code + } + +More text and stuff. + +!!! Note "Did you know?" + You can customize the title of the admonition +Not part of an Admonition! + +!!! mycustomcssclass "And now..." + For something completely different. + + You can also use a custom CSS class name. + +!!! class1 class2 class3 "And now..." + For something completely different. + + Several class names can be separated by space chars. + +!!! note anotherclass + The default title is the capitalized first class name. + +!!! tip "" + An explicitly empty string prevents the title from being rendered. + +No body: + +!!! note + +Extra whitespace after the title should not alter output: + +!!! note diff --git a/tests/extensions/attr_list.html b/tests/extensions/attr_list.html new file mode 100644 index 0000000..e7bfe0b --- /dev/null +++ b/tests/extensions/attr_list.html @@ -0,0 +1,69 @@ +<h1 id="setext">This is a sextext header</h1> +<p class="myclass" id="par1">A paragraph with some text. +Line two of the paragraph.</p> +<h2 class="someclass" id="sextext2">This is another</h2> +<p>Test some <em class="inline">inline</em> text. +A <a class="linkkyclass" href="http://example.com" title="A title.">link</a> +And a <strong class="nest">nested <a class="linky2" href="http://example.com" title="Some title">link</a></strong></p> +<h3 id="hash">This is a hash Header</h3> +<p bar="b az" baz="blah blah" foo="foo" title="I wasn't kidding!">And now some random attributes.</p> +<h3 id="hash2">No closing hash header</h3> +<p class="foo bar addme" id="overridden">Now test overrides</p> +<pre><code># A code block which contains attr_list syntax +# This should be ignored. +{: #someid .someclass } +</code></pre> +<h3 id="hash3">No colon for compatibility with Headerid ext</h3> +<p id="the_end">Also a codespan: <code class="foo">{: .someclass}</code>.</p> +<h3 _:="{:" id="hash5">Bad Syntax</h3> +<ul> +<li class="item">Item1</li> +<li class="item">Item2<ul> +<li class="subitem">Item2-1</li> +</ul> +</li> +<li class="item"><em class="emph">Item3</em><ul> +<li class="subitem"><em class="emph">Item3-1</em></li> +</ul> +</li> +<li>Item4<ul> +<li>Item4-1</li> +</ul> +</li> +<li>Item5</li> +</ul> +<h1>And ordered lists <em class="inline">too</em></h1> +<ol> +<li class="item">Item1</li> +<li class="item">Item2<ol> +<li class="subitem">Item2-1</li> +</ol> +</li> +<li class="item"><em class="emph">Item3</em><ol> +<li class="subitem"><em class="emph">Item3-1</em></li> +</ol> +</li> +<li>Item4<ol> +<li>Item4-1</li> +</ol> +</li> +<li>Item5</li> +</ol> +<h1 class="block">Definition <em>lists</em></h1> +<dl> +<dt class="term">DT1</dt> +<dt class="term">DT2</dt> +<dd class="def">Some dd</dd> +<dd><em class="inline">dd</em></dd> +<dt><em class="inline">DT3</em></dt> +<dd>Some dd</dd> +</dl> +<h1>Bad attributes</h1> +<p>Key without <em foo="foo">value</em></p> +<p>Value without <em>key</em></p> +<p>No <em>key or value</em></p> +<p><em>Weirdness</em></p> +<p><em>More weirdness</em></p> +<p>This should not cause a <em foo="a">crash</em></p> +<p>Attr_lists do not contain <em>newlines</em>{ foo=bar +key=value }</p>
\ No newline at end of file diff --git a/tests/extensions/attr_list.txt b/tests/extensions/attr_list.txt new file mode 100644 index 0000000..465ce4f --- /dev/null +++ b/tests/extensions/attr_list.txt @@ -0,0 +1,94 @@ +This is a sextext header {: #setext} +==================================== + +A paragraph with some text. +Line two of the paragraph. +{: #par1 .myclass } + +This is another {: #sextext2 .someclass} +---------------------------------------- + +Test some _inline_{: .inline} text. +A [link](http://example.com){: .linkkyclass title="A title."} +And a __nested [link][]{: .linky2}__{: .nest} + +[link]: http://example.com "Some title" + +### This is a hash Header ### {: #hash} + +And now some random attributes. +{:foo bar='b az' baz="blah blah" title="I wasn't kidding!" } + +### No closing hash header {: #hash2} + +Now test overrides +{: #overrideme .andme id=overridden class='foo bar' .addme } + + # A code block which contains attr_list syntax + # This should be ignored. + {: #someid .someclass } + +### No colon for compatibility with Headerid ext { #hash3 } + +Also a codespan: `{: .someclass}`{: .foo}. +{: #the_end} + +### Bad Syntax { {: #hash5 } + +* Item1 + {: .item } +* Item2 + {: .item } + * Item2-1 + {: .subitem } +* _Item3_{: .emph } + {: .item } + * _Item3-1_{: .emph } + {: .subitem } +* Item4 + * Item4-1 +* Item5 + +# And ordered lists *too*{.inline} + +1. Item1 + {: .item } +2. Item2 + {: .item } + 1. Item2-1 + {: .subitem } +3. _Item3_{: .emph } + {: .item } + 1. _Item3-1_{: .emph } + {: .subitem } +4. Item4 + 1. Item4-1 +5. Item5 + +# Definition *lists* {.block} + +DT1 {.term} +DT2 {.term} +: Some dd + {.def} +: *dd*{.inline} + +*DT3*{.inline} +: Some dd + +# Bad attributes + +Key without *value*{ foo= } + +Value without *key*{ =bar } + +No *key or value*{ = } + +*Weirdness*{ == } + +*More weirdness*{ === } + +This should not cause a *crash*{ foo=a=b } + +Attr_lists do not contain *newlines*{ foo=bar +key=value } diff --git a/tests/extensions-x-codehilite/code.html b/tests/extensions/codehilite.html index 6a8ee91..6a8ee91 100644 --- a/tests/extensions-x-codehilite/code.html +++ b/tests/extensions/codehilite.html diff --git a/tests/extensions-x-codehilite/code.txt b/tests/extensions/codehilite.txt index 6c62e6a..6c62e6a 100644 --- a/tests/extensions-x-codehilite/code.txt +++ b/tests/extensions/codehilite.txt diff --git a/tests/extensions/extra/def-in-list.html b/tests/extensions/extra/def-in-list.html new file mode 100644 index 0000000..21cddaa --- /dev/null +++ b/tests/extensions/extra/def-in-list.html @@ -0,0 +1,25 @@ +<p>: a paragraph that starts with a colon</p> +<ul> +<li>A List item</li> +<li> +<dl> +<dt>A def term</dt> +<dd>A def item</dd> +<dd>a second</dd> +</dl> +</li> +<li> +<dl> +<dt>Another def term</dt> +<dd> +<p>a loose item</p> +</dd> +<dd> +<p>a second</p> +</dd> +</dl> +</li> +<li> +<p>: a list item that starts with a colon</p> +</li> +</ul>
\ No newline at end of file diff --git a/tests/extensions/extra/def-in-list.txt b/tests/extensions/extra/def-in-list.txt new file mode 100644 index 0000000..7a292ab --- /dev/null +++ b/tests/extensions/extra/def-in-list.txt @@ -0,0 +1,15 @@ +: a paragraph that starts with a colon + +* A List item +* + A def term + : A def item + : a second + +* Another def term + + : a loose item + + : a second + +* : a list item that starts with a colon diff --git a/tests/extensions/extra/extra_config.html b/tests/extensions/extra/extra_config.html new file mode 100644 index 0000000..cbad740 --- /dev/null +++ b/tests/extensions/extra/extra_config.html @@ -0,0 +1,9 @@ +<div class="footnote"> +<hr /> +<ol> +<li id="fn:1"> +<p>A Footnote. <a class="footnote-backref" href="#fnref:1" title="Jump back to footnote 1 in the text">↩</a></p> +</li> +</ol> +</div> +<p>Some text with a footnote<sup id="fnref:1"><a class="footnote-ref" href="#fn:1">1</a></sup>.</p>
\ No newline at end of file diff --git a/tests/extensions/extra/extra_config.txt b/tests/extensions/extra/extra_config.txt new file mode 100644 index 0000000..2d29819 --- /dev/null +++ b/tests/extensions/extra/extra_config.txt @@ -0,0 +1,5 @@ +~~~placemarker~~~ + +Some text with a footnote[^1]. + +[^1]: A Footnote. diff --git a/tests/extensions/extra/footnote.html b/tests/extensions/extra/footnote.html new file mode 100644 index 0000000..4d86421 --- /dev/null +++ b/tests/extensions/extra/footnote.html @@ -0,0 +1,71 @@ +<p>This is the body with a footnote<sup id="fnref:1"><a class="footnote-ref" href="#fn:1">1</a></sup> or two<sup id="fnref:2"><a class="footnote-ref" href="#fn:2">2</a></sup> or more<sup id="fnref:3"><a class="footnote-ref" href="#fn:3">3</a></sup> <sup id="fnref:4"><a class="footnote-ref" href="#fn:4">4</a></sup> <sup id="fnref:5"><a class="footnote-ref" href="#fn:5">5</a></sup>.</p> +<p>Also a reference that does not exist[^6].</p> +<p>Duplicate<sup id="fnref:a"><a class="footnote-ref" href="#fn:a">6</a></sup> footnotes<sup id="fnref2:a"><a class="footnote-ref" href="#fn:a">6</a></sup> test<sup id="fnref3:a"><a class="footnote-ref" href="#fn:a">6</a></sup>.</p> +<p>Duplicate<sup id="fnref:b"><a class="footnote-ref" href="#fn:b">7</a></sup> footnotes<sup id="fnref2:b"><a class="footnote-ref" href="#fn:b">7</a></sup> test<sup id="fnref3:b"><a class="footnote-ref" href="#fn:b">7</a></sup>.</p> +<p>Single after duplicates<sup id="fnref:c"><a class="footnote-ref" href="#fn:c">8</a></sup>.</p> +<p>Test emphasis at end of footnote<sup id="fnref:d"><a class="footnote-ref" href="#fn:d">9</a></sup></p> +<p>Complex footnote content<sup id="fnref:e"><a class="footnote-ref" href="#fn:e">10</a></sup></p> +<div class="footnote"> +<hr /> +<ol> +<li id="fn:1"> +<p>Footnote that ends with a list:</p> +<ul> +<li>item 1</li> +<li>item 2</li> +</ul> +<p><a class="footnote-backref" href="#fnref:1" title="Jump back to footnote 1 in the text">↩</a></p> +</li> +<li id="fn:2"> +<blockquote> +<p>This footnote is a blockquote.</p> +</blockquote> +<p><a class="footnote-backref" href="#fnref:2" title="Jump back to footnote 2 in the text">↩</a></p> +</li> +<li id="fn:3"> +<p>A simple oneliner. <a class="footnote-backref" href="#fnref:3" title="Jump back to footnote 3 in the text">↩</a></p> +</li> +<li id="fn:4"> +<p>A footnote with multiple paragraphs.</p> +<p>Paragraph two. <a class="footnote-backref" href="#fnref:4" title="Jump back to footnote 4 in the text">↩</a></p> +</li> +<li id="fn:5"> +<p>First line of first paragraph. +Second line of first paragraph is not intended. +Nor is third... <a class="footnote-backref" href="#fnref:5" title="Jump back to footnote 5 in the text">↩</a></p> +</li> +<li id="fn:a"> +<p>1 <a class="footnote-backref" href="#fnref:a" title="Jump back to footnote 6 in the text">↩</a><a class="footnote-backref" href="#fnref2:a" title="Jump back to footnote 6 in the text">↩</a><a class="footnote-backref" href="#fnref3:a" title="Jump back to footnote 6 in the text">↩</a></p> +</li> +<li id="fn:b"> +<p>2 <a class="footnote-backref" href="#fnref:b" title="Jump back to footnote 7 in the text">↩</a><a class="footnote-backref" href="#fnref2:b" title="Jump back to footnote 7 in the text">↩</a><a class="footnote-backref" href="#fnref3:b" title="Jump back to footnote 7 in the text">↩</a></p> +</li> +<li id="fn:c"> +<p>3 <a class="footnote-backref" href="#fnref:c" title="Jump back to footnote 8 in the text">↩</a></p> +</li> +<li id="fn:d"> +<p><em>emphasis works</em></p> +<p><em>emphasis still works</em> <a class="footnote-backref" href="#fnref:d" title="Jump back to footnote 9 in the text">↩</a></p> +</li> +<li id="fn:e"> +<ol> +<li> +<p>The top couple half figure, contrary sides and hands across with bottom couple,</p> +<p>Half figure back on your own sides, and turn partner to places,</p> +<p>Swing partners with right hands into straight line long-ways, as in a reel, and</p> +<p>Set,</p> +<p>Hey and return to places,</p> +<p>The other three couples do the same.</p> +</li> +<li> +<p>Top and bottom couples meet and set,</p> +<p>Then each gentleman leas the opposite lady to the couple on his left, and set,</p> +<p>Aach four right and left,</p> +<p>Swing side couples to places, and turn partners all eight,</p> +<p>The other two couple o the same.</p> +</li> +</ol> +<p><a class="footnote-backref" href="#fnref:e" title="Jump back to footnote 10 in the text">↩</a></p> +</li> +</ol> +</div>
\ No newline at end of file diff --git a/tests/extensions/extra/footnote.txt b/tests/extensions/extra/footnote.txt new file mode 100644 index 0000000..93b5869 --- /dev/null +++ b/tests/extensions/extra/footnote.txt @@ -0,0 +1,62 @@ +This is the body with a footnote[^1] or two[^2] or more[^3] [^4] [^5]. + +Also a reference that does not exist[^6]. + +Duplicate[^a] footnotes[^a] test[^a]. + +Duplicate[^b] footnotes[^b] test[^b]. + +Single after duplicates[^c]. + +Test emphasis at end of footnote[^d] + +Complex footnote content[^e] + +[^1]: Footnote that ends with a list: + + * item 1 + * item 2 + +[^2]: > This footnote is a blockquote. + +[^3]: A simple oneliner. + +[^4]: A footnote with multiple paragraphs. + + Paragraph two. + +[^5]: First line of first paragraph. +Second line of first paragraph is not intended. +Nor is third... + +[^a]: 1 +[^b]: 2 +[^c]: 3 + +[^d]: + _emphasis works_ + + _emphasis still works_ + +[^e]: + 1. The top couple half figure, contrary sides and hands across with bottom couple, + + Half figure back on your own sides, and turn partner to places, + + Swing partners with right hands into straight line long-ways, as in a reel, and + + Set, + + Hey and return to places, + + The other three couples do the same. + + 2. Top and bottom couples meet and set, + + Then each gentleman leas the opposite lady to the couple on his left, and set, + + Aach four right and left, + + Swing side couples to places, and turn partners all eight, + + The other two couple o the same. diff --git a/tests/extensions/extra/footnote_many_footnotes.html b/tests/extensions/extra/footnote_many_footnotes.html new file mode 100644 index 0000000..00de949 --- /dev/null +++ b/tests/extensions/extra/footnote_many_footnotes.html @@ -0,0 +1,4801 @@ +<p>Something<sup id="fnref:1"><a class="footnote-ref" href="#fn:1">1</a></sup></p> +<p>Something<sup id="fnref:2"><a class="footnote-ref" href="#fn:2">2</a></sup></p> +<p>Something<sup id="fnref:3"><a class="footnote-ref" href="#fn:3">3</a></sup></p> +<p>Something<sup id="fnref:4"><a class="footnote-ref" href="#fn:4">4</a></sup></p> +<p>Something<sup id="fnref:5"><a class="footnote-ref" href="#fn:5">5</a></sup></p> +<p>Something<sup id="fnref:6"><a class="footnote-ref" href="#fn:6">6</a></sup></p> +<p>Something<sup id="fnref:7"><a class="footnote-ref" href="#fn:7">7</a></sup></p> +<p>Something<sup id="fnref:8"><a class="footnote-ref" href="#fn:8">8</a></sup></p> +<p>Something<sup id="fnref:9"><a class="footnote-ref" href="#fn:9">9</a></sup></p> +<p>Something<sup id="fnref:10"><a class="footnote-ref" href="#fn:10">10</a></sup></p> +<p>Something<sup id="fnref:11"><a class="footnote-ref" href="#fn:11">11</a></sup></p> +<p>Something<sup id="fnref:12"><a class="footnote-ref" href="#fn:12">12</a></sup></p> +<p>Something<sup id="fnref:13"><a class="footnote-ref" href="#fn:13">13</a></sup></p> +<p>Something<sup id="fnref:14"><a class="footnote-ref" href="#fn:14">14</a></sup></p> +<p>Something<sup id="fnref:15"><a class="footnote-ref" href="#fn:15">15</a></sup></p> +<p>Something<sup id="fnref:16"><a class="footnote-ref" href="#fn:16">16</a></sup></p> +<p>Something<sup id="fnref:17"><a class="footnote-ref" href="#fn:17">17</a></sup></p> +<p>Something<sup id="fnref:18"><a class="footnote-ref" href="#fn:18">18</a></sup></p> +<p>Something<sup id="fnref:19"><a class="footnote-ref" href="#fn:19">19</a></sup></p> +<p>Something<sup id="fnref:20"><a class="footnote-ref" href="#fn:20">20</a></sup></p> +<p>Something<sup id="fnref:21"><a class="footnote-ref" href="#fn:21">21</a></sup></p> +<p>Something<sup id="fnref:22"><a class="footnote-ref" href="#fn:22">22</a></sup></p> +<p>Something<sup id="fnref:23"><a class="footnote-ref" href="#fn:23">23</a></sup></p> +<p>Something<sup id="fnref:24"><a class="footnote-ref" href="#fn:24">24</a></sup></p> +<p>Something<sup id="fnref:25"><a class="footnote-ref" href="#fn:25">25</a></sup></p> +<p>Something<sup id="fnref:26"><a class="footnote-ref" href="#fn:26">26</a></sup></p> +<p>Something<sup id="fnref:27"><a class="footnote-ref" href="#fn:27">27</a></sup></p> +<p>Something<sup id="fnref:28"><a class="footnote-ref" href="#fn:28">28</a></sup></p> +<p>Something<sup id="fnref:29"><a class="footnote-ref" href="#fn:29">29</a></sup></p> +<p>Something<sup id="fnref:30"><a class="footnote-ref" href="#fn:30">30</a></sup></p> +<p>Something<sup id="fnref:31"><a class="footnote-ref" href="#fn:31">31</a></sup></p> +<p>Something<sup id="fnref:32"><a class="footnote-ref" href="#fn:32">32</a></sup></p> +<p>Something<sup id="fnref:33"><a class="footnote-ref" href="#fn:33">33</a></sup></p> +<p>Something<sup id="fnref:34"><a class="footnote-ref" href="#fn:34">34</a></sup></p> +<p>Something<sup id="fnref:35"><a class="footnote-ref" href="#fn:35">35</a></sup></p> +<p>Something<sup id="fnref:36"><a class="footnote-ref" href="#fn:36">36</a></sup></p> +<p>Something<sup id="fnref:37"><a class="footnote-ref" href="#fn:37">37</a></sup></p> +<p>Something<sup id="fnref:38"><a class="footnote-ref" href="#fn:38">38</a></sup></p> +<p>Something<sup id="fnref:39"><a class="footnote-ref" href="#fn:39">39</a></sup></p> +<p>Something<sup id="fnref:40"><a class="footnote-ref" href="#fn:40">40</a></sup></p> +<p>Something<sup id="fnref:41"><a class="footnote-ref" href="#fn:41">41</a></sup></p> +<p>Something<sup id="fnref:42"><a class="footnote-ref" href="#fn:42">42</a></sup></p> +<p>Something<sup id="fnref:43"><a class="footnote-ref" href="#fn:43">43</a></sup></p> +<p>Something<sup id="fnref:44"><a class="footnote-ref" href="#fn:44">44</a></sup></p> +<p>Something<sup id="fnref:45"><a class="footnote-ref" href="#fn:45">45</a></sup></p> +<p>Something<sup id="fnref:46"><a class="footnote-ref" href="#fn:46">46</a></sup></p> +<p>Something<sup id="fnref:47"><a class="footnote-ref" href="#fn:47">47</a></sup></p> +<p>Something<sup id="fnref:48"><a class="footnote-ref" href="#fn:48">48</a></sup></p> +<p>Something<sup id="fnref:49"><a class="footnote-ref" href="#fn:49">49</a></sup></p> +<p>Something<sup id="fnref:50"><a class="footnote-ref" href="#fn:50">50</a></sup></p> +<p>Something<sup id="fnref:51"><a class="footnote-ref" href="#fn:51">51</a></sup></p> +<p>Something<sup id="fnref:52"><a class="footnote-ref" href="#fn:52">52</a></sup></p> +<p>Something<sup id="fnref:53"><a class="footnote-ref" href="#fn:53">53</a></sup></p> +<p>Something<sup id="fnref:54"><a class="footnote-ref" href="#fn:54">54</a></sup></p> +<p>Something<sup id="fnref:55"><a class="footnote-ref" href="#fn:55">55</a></sup></p> +<p>Something<sup id="fnref:56"><a class="footnote-ref" href="#fn:56">56</a></sup></p> +<p>Something<sup id="fnref:57"><a class="footnote-ref" href="#fn:57">57</a></sup></p> +<p>Something<sup id="fnref:58"><a class="footnote-ref" href="#fn:58">58</a></sup></p> +<p>Something<sup id="fnref:59"><a class="footnote-ref" href="#fn:59">59</a></sup></p> +<p>Something<sup id="fnref:60"><a class="footnote-ref" href="#fn:60">60</a></sup></p> +<p>Something<sup id="fnref:61"><a class="footnote-ref" href="#fn:61">61</a></sup></p> +<p>Something<sup id="fnref:62"><a class="footnote-ref" href="#fn:62">62</a></sup></p> +<p>Something<sup id="fnref:63"><a class="footnote-ref" href="#fn:63">63</a></sup></p> +<p>Something<sup id="fnref:64"><a class="footnote-ref" href="#fn:64">64</a></sup></p> +<p>Something<sup id="fnref:65"><a class="footnote-ref" href="#fn:65">65</a></sup></p> +<p>Something<sup id="fnref:66"><a class="footnote-ref" href="#fn:66">66</a></sup></p> +<p>Something<sup id="fnref:67"><a class="footnote-ref" href="#fn:67">67</a></sup></p> +<p>Something<sup id="fnref:68"><a class="footnote-ref" href="#fn:68">68</a></sup></p> +<p>Something<sup id="fnref:69"><a class="footnote-ref" href="#fn:69">69</a></sup></p> +<p>Something<sup id="fnref:70"><a class="footnote-ref" href="#fn:70">70</a></sup></p> +<p>Something<sup id="fnref:71"><a class="footnote-ref" href="#fn:71">71</a></sup></p> +<p>Something<sup id="fnref:72"><a class="footnote-ref" href="#fn:72">72</a></sup></p> +<p>Something<sup id="fnref:73"><a class="footnote-ref" href="#fn:73">73</a></sup></p> +<p>Something<sup id="fnref:74"><a class="footnote-ref" href="#fn:74">74</a></sup></p> +<p>Something<sup id="fnref:75"><a class="footnote-ref" href="#fn:75">75</a></sup></p> +<p>Something<sup id="fnref:76"><a class="footnote-ref" href="#fn:76">76</a></sup></p> +<p>Something<sup id="fnref:77"><a class="footnote-ref" href="#fn:77">77</a></sup></p> +<p>Something<sup id="fnref:78"><a class="footnote-ref" href="#fn:78">78</a></sup></p> +<p>Something<sup id="fnref:79"><a class="footnote-ref" href="#fn:79">79</a></sup></p> +<p>Something<sup id="fnref:80"><a class="footnote-ref" href="#fn:80">80</a></sup></p> +<p>Something<sup id="fnref:81"><a class="footnote-ref" href="#fn:81">81</a></sup></p> +<p>Something<sup id="fnref:82"><a class="footnote-ref" href="#fn:82">82</a></sup></p> +<p>Something<sup id="fnref:83"><a class="footnote-ref" href="#fn:83">83</a></sup></p> +<p>Something<sup id="fnref:84"><a class="footnote-ref" href="#fn:84">84</a></sup></p> +<p>Something<sup id="fnref:85"><a class="footnote-ref" href="#fn:85">85</a></sup></p> +<p>Something<sup id="fnref:86"><a class="footnote-ref" href="#fn:86">86</a></sup></p> +<p>Something<sup id="fnref:87"><a class="footnote-ref" href="#fn:87">87</a></sup></p> +<p>Something<sup id="fnref:88"><a class="footnote-ref" href="#fn:88">88</a></sup></p> +<p>Something<sup id="fnref:89"><a class="footnote-ref" href="#fn:89">89</a></sup></p> +<p>Something<sup id="fnref:90"><a class="footnote-ref" href="#fn:90">90</a></sup></p> +<p>Something<sup id="fnref:91"><a class="footnote-ref" href="#fn:91">91</a></sup></p> +<p>Something<sup id="fnref:92"><a class="footnote-ref" href="#fn:92">92</a></sup></p> +<p>Something<sup id="fnref:93"><a class="footnote-ref" href="#fn:93">93</a></sup></p> +<p>Something<sup id="fnref:94"><a class="footnote-ref" href="#fn:94">94</a></sup></p> +<p>Something<sup id="fnref:95"><a class="footnote-ref" href="#fn:95">95</a></sup></p> +<p>Something<sup id="fnref:96"><a class="footnote-ref" href="#fn:96">96</a></sup></p> +<p>Something<sup id="fnref:97"><a class="footnote-ref" href="#fn:97">97</a></sup></p> +<p>Something<sup id="fnref:98"><a class="footnote-ref" href="#fn:98">98</a></sup></p> +<p>Something<sup id="fnref:99"><a class="footnote-ref" href="#fn:99">99</a></sup></p> +<p>Something<sup id="fnref:100"><a class="footnote-ref" href="#fn:100">100</a></sup></p> +<p>Something<sup id="fnref:101"><a class="footnote-ref" href="#fn:101">101</a></sup></p> +<p>Something<sup id="fnref:102"><a class="footnote-ref" href="#fn:102">102</a></sup></p> +<p>Something<sup id="fnref:103"><a class="footnote-ref" href="#fn:103">103</a></sup></p> +<p>Something<sup id="fnref:104"><a class="footnote-ref" href="#fn:104">104</a></sup></p> +<p>Something<sup id="fnref:105"><a class="footnote-ref" href="#fn:105">105</a></sup></p> +<p>Something<sup id="fnref:106"><a class="footnote-ref" href="#fn:106">106</a></sup></p> +<p>Something<sup id="fnref:107"><a class="footnote-ref" href="#fn:107">107</a></sup></p> +<p>Something<sup id="fnref:108"><a class="footnote-ref" href="#fn:108">108</a></sup></p> +<p>Something<sup id="fnref:109"><a class="footnote-ref" href="#fn:109">109</a></sup></p> +<p>Something<sup id="fnref:110"><a class="footnote-ref" href="#fn:110">110</a></sup></p> +<p>Something<sup id="fnref:111"><a class="footnote-ref" href="#fn:111">111</a></sup></p> +<p>Something<sup id="fnref:112"><a class="footnote-ref" href="#fn:112">112</a></sup></p> +<p>Something<sup id="fnref:113"><a class="footnote-ref" href="#fn:113">113</a></sup></p> +<p>Something<sup id="fnref:114"><a class="footnote-ref" href="#fn:114">114</a></sup></p> +<p>Something<sup id="fnref:115"><a class="footnote-ref" href="#fn:115">115</a></sup></p> +<p>Something<sup id="fnref:116"><a class="footnote-ref" href="#fn:116">116</a></sup></p> +<p>Something<sup id="fnref:117"><a class="footnote-ref" href="#fn:117">117</a></sup></p> +<p>Something<sup id="fnref:118"><a class="footnote-ref" href="#fn:118">118</a></sup></p> +<p>Something<sup id="fnref:119"><a class="footnote-ref" href="#fn:119">119</a></sup></p> +<p>Something<sup id="fnref:120"><a class="footnote-ref" href="#fn:120">120</a></sup></p> +<p>Something<sup id="fnref:121"><a class="footnote-ref" href="#fn:121">121</a></sup></p> +<p>Something<sup id="fnref:122"><a class="footnote-ref" href="#fn:122">122</a></sup></p> +<p>Something<sup id="fnref:123"><a class="footnote-ref" href="#fn:123">123</a></sup></p> +<p>Something<sup id="fnref:124"><a class="footnote-ref" href="#fn:124">124</a></sup></p> +<p>Something<sup id="fnref:125"><a class="footnote-ref" href="#fn:125">125</a></sup></p> +<p>Something<sup id="fnref:126"><a class="footnote-ref" href="#fn:126">126</a></sup></p> +<p>Something<sup id="fnref:127"><a class="footnote-ref" href="#fn:127">127</a></sup></p> +<p>Something<sup id="fnref:128"><a class="footnote-ref" href="#fn:128">128</a></sup></p> +<p>Something<sup id="fnref:129"><a class="footnote-ref" href="#fn:129">129</a></sup></p> +<p>Something<sup id="fnref:130"><a class="footnote-ref" href="#fn:130">130</a></sup></p> +<p>Something<sup id="fnref:131"><a class="footnote-ref" href="#fn:131">131</a></sup></p> +<p>Something<sup id="fnref:132"><a class="footnote-ref" href="#fn:132">132</a></sup></p> +<p>Something<sup id="fnref:133"><a class="footnote-ref" href="#fn:133">133</a></sup></p> +<p>Something<sup id="fnref:134"><a class="footnote-ref" href="#fn:134">134</a></sup></p> +<p>Something<sup id="fnref:135"><a class="footnote-ref" href="#fn:135">135</a></sup></p> +<p>Something<sup id="fnref:136"><a class="footnote-ref" href="#fn:136">136</a></sup></p> +<p>Something<sup id="fnref:137"><a class="footnote-ref" href="#fn:137">137</a></sup></p> +<p>Something<sup id="fnref:138"><a class="footnote-ref" href="#fn:138">138</a></sup></p> +<p>Something<sup id="fnref:139"><a class="footnote-ref" href="#fn:139">139</a></sup></p> +<p>Something<sup id="fnref:140"><a class="footnote-ref" href="#fn:140">140</a></sup></p> +<p>Something<sup id="fnref:141"><a class="footnote-ref" href="#fn:141">141</a></sup></p> +<p>Something<sup id="fnref:142"><a class="footnote-ref" href="#fn:142">142</a></sup></p> +<p>Something<sup id="fnref:143"><a class="footnote-ref" href="#fn:143">143</a></sup></p> +<p>Something<sup id="fnref:144"><a class="footnote-ref" href="#fn:144">144</a></sup></p> +<p>Something<sup id="fnref:145"><a class="footnote-ref" href="#fn:145">145</a></sup></p> +<p>Something<sup id="fnref:146"><a class="footnote-ref" href="#fn:146">146</a></sup></p> +<p>Something<sup id="fnref:147"><a class="footnote-ref" href="#fn:147">147</a></sup></p> +<p>Something<sup id="fnref:148"><a class="footnote-ref" href="#fn:148">148</a></sup></p> +<p>Something<sup id="fnref:149"><a class="footnote-ref" href="#fn:149">149</a></sup></p> +<p>Something<sup id="fnref:150"><a class="footnote-ref" href="#fn:150">150</a></sup></p> +<p>Something<sup id="fnref:151"><a class="footnote-ref" href="#fn:151">151</a></sup></p> +<p>Something<sup id="fnref:152"><a class="footnote-ref" href="#fn:152">152</a></sup></p> +<p>Something<sup id="fnref:153"><a class="footnote-ref" href="#fn:153">153</a></sup></p> +<p>Something<sup id="fnref:154"><a class="footnote-ref" href="#fn:154">154</a></sup></p> +<p>Something<sup id="fnref:155"><a class="footnote-ref" href="#fn:155">155</a></sup></p> +<p>Something<sup id="fnref:156"><a class="footnote-ref" href="#fn:156">156</a></sup></p> +<p>Something<sup id="fnref:157"><a class="footnote-ref" href="#fn:157">157</a></sup></p> +<p>Something<sup id="fnref:158"><a class="footnote-ref" href="#fn:158">158</a></sup></p> +<p>Something<sup id="fnref:159"><a class="footnote-ref" href="#fn:159">159</a></sup></p> +<p>Something<sup id="fnref:160"><a class="footnote-ref" href="#fn:160">160</a></sup></p> +<p>Something<sup id="fnref:161"><a class="footnote-ref" href="#fn:161">161</a></sup></p> +<p>Something<sup id="fnref:162"><a class="footnote-ref" href="#fn:162">162</a></sup></p> +<p>Something<sup id="fnref:163"><a class="footnote-ref" href="#fn:163">163</a></sup></p> +<p>Something<sup id="fnref:164"><a class="footnote-ref" href="#fn:164">164</a></sup></p> +<p>Something<sup id="fnref:165"><a class="footnote-ref" href="#fn:165">165</a></sup></p> +<p>Something<sup id="fnref:166"><a class="footnote-ref" href="#fn:166">166</a></sup></p> +<p>Something<sup id="fnref:167"><a class="footnote-ref" href="#fn:167">167</a></sup></p> +<p>Something<sup id="fnref:168"><a class="footnote-ref" href="#fn:168">168</a></sup></p> +<p>Something<sup id="fnref:169"><a class="footnote-ref" href="#fn:169">169</a></sup></p> +<p>Something<sup id="fnref:170"><a class="footnote-ref" href="#fn:170">170</a></sup></p> +<p>Something<sup id="fnref:171"><a class="footnote-ref" href="#fn:171">171</a></sup></p> +<p>Something<sup id="fnref:172"><a class="footnote-ref" href="#fn:172">172</a></sup></p> +<p>Something<sup id="fnref:173"><a class="footnote-ref" href="#fn:173">173</a></sup></p> +<p>Something<sup id="fnref:174"><a class="footnote-ref" href="#fn:174">174</a></sup></p> +<p>Something<sup id="fnref:175"><a class="footnote-ref" href="#fn:175">175</a></sup></p> +<p>Something<sup id="fnref:176"><a class="footnote-ref" href="#fn:176">176</a></sup></p> +<p>Something<sup id="fnref:177"><a class="footnote-ref" href="#fn:177">177</a></sup></p> +<p>Something<sup id="fnref:178"><a class="footnote-ref" href="#fn:178">178</a></sup></p> +<p>Something<sup id="fnref:179"><a class="footnote-ref" href="#fn:179">179</a></sup></p> +<p>Something<sup id="fnref:180"><a class="footnote-ref" href="#fn:180">180</a></sup></p> +<p>Something<sup id="fnref:181"><a class="footnote-ref" href="#fn:181">181</a></sup></p> +<p>Something<sup id="fnref:182"><a class="footnote-ref" href="#fn:182">182</a></sup></p> +<p>Something<sup id="fnref:183"><a class="footnote-ref" href="#fn:183">183</a></sup></p> +<p>Something<sup id="fnref:184"><a class="footnote-ref" href="#fn:184">184</a></sup></p> +<p>Something<sup id="fnref:185"><a class="footnote-ref" href="#fn:185">185</a></sup></p> +<p>Something<sup id="fnref:186"><a class="footnote-ref" href="#fn:186">186</a></sup></p> +<p>Something<sup id="fnref:187"><a class="footnote-ref" href="#fn:187">187</a></sup></p> +<p>Something<sup id="fnref:188"><a class="footnote-ref" href="#fn:188">188</a></sup></p> +<p>Something<sup id="fnref:189"><a class="footnote-ref" href="#fn:189">189</a></sup></p> +<p>Something<sup id="fnref:190"><a class="footnote-ref" href="#fn:190">190</a></sup></p> +<p>Something<sup id="fnref:191"><a class="footnote-ref" href="#fn:191">191</a></sup></p> +<p>Something<sup id="fnref:192"><a class="footnote-ref" href="#fn:192">192</a></sup></p> +<p>Something<sup id="fnref:193"><a class="footnote-ref" href="#fn:193">193</a></sup></p> +<p>Something<sup id="fnref:194"><a class="footnote-ref" href="#fn:194">194</a></sup></p> +<p>Something<sup id="fnref:195"><a class="footnote-ref" href="#fn:195">195</a></sup></p> +<p>Something<sup id="fnref:196"><a class="footnote-ref" href="#fn:196">196</a></sup></p> +<p>Something<sup id="fnref:197"><a class="footnote-ref" href="#fn:197">197</a></sup></p> +<p>Something<sup id="fnref:198"><a class="footnote-ref" href="#fn:198">198</a></sup></p> +<p>Something<sup id="fnref:199"><a class="footnote-ref" href="#fn:199">199</a></sup></p> +<p>Something<sup id="fnref:200"><a class="footnote-ref" href="#fn:200">200</a></sup></p> +<p>Something<sup id="fnref:201"><a class="footnote-ref" href="#fn:201">201</a></sup></p> +<p>Something<sup id="fnref:202"><a class="footnote-ref" href="#fn:202">202</a></sup></p> +<p>Something<sup id="fnref:203"><a class="footnote-ref" href="#fn:203">203</a></sup></p> +<p>Something<sup id="fnref:204"><a class="footnote-ref" href="#fn:204">204</a></sup></p> +<p>Something<sup id="fnref:205"><a class="footnote-ref" href="#fn:205">205</a></sup></p> +<p>Something<sup id="fnref:206"><a class="footnote-ref" href="#fn:206">206</a></sup></p> +<p>Something<sup id="fnref:207"><a class="footnote-ref" href="#fn:207">207</a></sup></p> +<p>Something<sup id="fnref:208"><a class="footnote-ref" href="#fn:208">208</a></sup></p> +<p>Something<sup id="fnref:209"><a class="footnote-ref" href="#fn:209">209</a></sup></p> +<p>Something<sup id="fnref:210"><a class="footnote-ref" href="#fn:210">210</a></sup></p> +<p>Something<sup id="fnref:211"><a class="footnote-ref" href="#fn:211">211</a></sup></p> +<p>Something<sup id="fnref:212"><a class="footnote-ref" href="#fn:212">212</a></sup></p> +<p>Something<sup id="fnref:213"><a class="footnote-ref" href="#fn:213">213</a></sup></p> +<p>Something<sup id="fnref:214"><a class="footnote-ref" href="#fn:214">214</a></sup></p> +<p>Something<sup id="fnref:215"><a class="footnote-ref" href="#fn:215">215</a></sup></p> +<p>Something<sup id="fnref:216"><a class="footnote-ref" href="#fn:216">216</a></sup></p> +<p>Something<sup id="fnref:217"><a class="footnote-ref" href="#fn:217">217</a></sup></p> +<p>Something<sup id="fnref:218"><a class="footnote-ref" href="#fn:218">218</a></sup></p> +<p>Something<sup id="fnref:219"><a class="footnote-ref" href="#fn:219">219</a></sup></p> +<p>Something<sup id="fnref:220"><a class="footnote-ref" href="#fn:220">220</a></sup></p> +<p>Something<sup id="fnref:221"><a class="footnote-ref" href="#fn:221">221</a></sup></p> +<p>Something<sup id="fnref:222"><a class="footnote-ref" href="#fn:222">222</a></sup></p> +<p>Something<sup id="fnref:223"><a class="footnote-ref" href="#fn:223">223</a></sup></p> +<p>Something<sup id="fnref:224"><a class="footnote-ref" href="#fn:224">224</a></sup></p> +<p>Something<sup id="fnref:225"><a class="footnote-ref" href="#fn:225">225</a></sup></p> +<p>Something<sup id="fnref:226"><a class="footnote-ref" href="#fn:226">226</a></sup></p> +<p>Something<sup id="fnref:227"><a class="footnote-ref" href="#fn:227">227</a></sup></p> +<p>Something<sup id="fnref:228"><a class="footnote-ref" href="#fn:228">228</a></sup></p> +<p>Something<sup id="fnref:229"><a class="footnote-ref" href="#fn:229">229</a></sup></p> +<p>Something<sup id="fnref:230"><a class="footnote-ref" href="#fn:230">230</a></sup></p> +<p>Something<sup id="fnref:231"><a class="footnote-ref" href="#fn:231">231</a></sup></p> +<p>Something<sup id="fnref:232"><a class="footnote-ref" href="#fn:232">232</a></sup></p> +<p>Something<sup id="fnref:233"><a class="footnote-ref" href="#fn:233">233</a></sup></p> +<p>Something<sup id="fnref:234"><a class="footnote-ref" href="#fn:234">234</a></sup></p> +<p>Something<sup id="fnref:235"><a class="footnote-ref" href="#fn:235">235</a></sup></p> +<p>Something<sup id="fnref:236"><a class="footnote-ref" href="#fn:236">236</a></sup></p> +<p>Something<sup id="fnref:237"><a class="footnote-ref" href="#fn:237">237</a></sup></p> +<p>Something<sup id="fnref:238"><a class="footnote-ref" href="#fn:238">238</a></sup></p> +<p>Something<sup id="fnref:239"><a class="footnote-ref" href="#fn:239">239</a></sup></p> +<p>Something<sup id="fnref:240"><a class="footnote-ref" href="#fn:240">240</a></sup></p> +<p>Something<sup id="fnref:241"><a class="footnote-ref" href="#fn:241">241</a></sup></p> +<p>Something<sup id="fnref:242"><a class="footnote-ref" href="#fn:242">242</a></sup></p> +<p>Something<sup id="fnref:243"><a class="footnote-ref" href="#fn:243">243</a></sup></p> +<p>Something<sup id="fnref:244"><a class="footnote-ref" href="#fn:244">244</a></sup></p> +<p>Something<sup id="fnref:245"><a class="footnote-ref" href="#fn:245">245</a></sup></p> +<p>Something<sup id="fnref:246"><a class="footnote-ref" href="#fn:246">246</a></sup></p> +<p>Something<sup id="fnref:247"><a class="footnote-ref" href="#fn:247">247</a></sup></p> +<p>Something<sup id="fnref:248"><a class="footnote-ref" href="#fn:248">248</a></sup></p> +<p>Something<sup id="fnref:249"><a class="footnote-ref" href="#fn:249">249</a></sup></p> +<p>Something<sup id="fnref:250"><a class="footnote-ref" href="#fn:250">250</a></sup></p> +<p>Something<sup id="fnref:251"><a class="footnote-ref" href="#fn:251">251</a></sup></p> +<p>Something<sup id="fnref:252"><a class="footnote-ref" href="#fn:252">252</a></sup></p> +<p>Something<sup id="fnref:253"><a class="footnote-ref" href="#fn:253">253</a></sup></p> +<p>Something<sup id="fnref:254"><a class="footnote-ref" href="#fn:254">254</a></sup></p> +<p>Something<sup id="fnref:255"><a class="footnote-ref" href="#fn:255">255</a></sup></p> +<p>Something<sup id="fnref:256"><a class="footnote-ref" href="#fn:256">256</a></sup></p> +<p>Something<sup id="fnref:257"><a class="footnote-ref" href="#fn:257">257</a></sup></p> +<p>Something<sup id="fnref:258"><a class="footnote-ref" href="#fn:258">258</a></sup></p> +<p>Something<sup id="fnref:259"><a class="footnote-ref" href="#fn:259">259</a></sup></p> +<p>Something<sup id="fnref:260"><a class="footnote-ref" href="#fn:260">260</a></sup></p> +<p>Something<sup id="fnref:261"><a class="footnote-ref" href="#fn:261">261</a></sup></p> +<p>Something<sup id="fnref:262"><a class="footnote-ref" href="#fn:262">262</a></sup></p> +<p>Something<sup id="fnref:263"><a class="footnote-ref" href="#fn:263">263</a></sup></p> +<p>Something<sup id="fnref:264"><a class="footnote-ref" href="#fn:264">264</a></sup></p> +<p>Something<sup id="fnref:265"><a class="footnote-ref" href="#fn:265">265</a></sup></p> +<p>Something<sup id="fnref:266"><a class="footnote-ref" href="#fn:266">266</a></sup></p> +<p>Something<sup id="fnref:267"><a class="footnote-ref" href="#fn:267">267</a></sup></p> +<p>Something<sup id="fnref:268"><a class="footnote-ref" href="#fn:268">268</a></sup></p> +<p>Something<sup id="fnref:269"><a class="footnote-ref" href="#fn:269">269</a></sup></p> +<p>Something<sup id="fnref:270"><a class="footnote-ref" href="#fn:270">270</a></sup></p> +<p>Something<sup id="fnref:271"><a class="footnote-ref" href="#fn:271">271</a></sup></p> +<p>Something<sup id="fnref:272"><a class="footnote-ref" href="#fn:272">272</a></sup></p> +<p>Something<sup id="fnref:273"><a class="footnote-ref" href="#fn:273">273</a></sup></p> +<p>Something<sup id="fnref:274"><a class="footnote-ref" href="#fn:274">274</a></sup></p> +<p>Something<sup id="fnref:275"><a class="footnote-ref" href="#fn:275">275</a></sup></p> +<p>Something<sup id="fnref:276"><a class="footnote-ref" href="#fn:276">276</a></sup></p> +<p>Something<sup id="fnref:277"><a class="footnote-ref" href="#fn:277">277</a></sup></p> +<p>Something<sup id="fnref:278"><a class="footnote-ref" href="#fn:278">278</a></sup></p> +<p>Something<sup id="fnref:279"><a class="footnote-ref" href="#fn:279">279</a></sup></p> +<p>Something<sup id="fnref:280"><a class="footnote-ref" href="#fn:280">280</a></sup></p> +<p>Something<sup id="fnref:281"><a class="footnote-ref" href="#fn:281">281</a></sup></p> +<p>Something<sup id="fnref:282"><a class="footnote-ref" href="#fn:282">282</a></sup></p> +<p>Something<sup id="fnref:283"><a class="footnote-ref" href="#fn:283">283</a></sup></p> +<p>Something<sup id="fnref:284"><a class="footnote-ref" href="#fn:284">284</a></sup></p> +<p>Something<sup id="fnref:285"><a class="footnote-ref" href="#fn:285">285</a></sup></p> +<p>Something<sup id="fnref:286"><a class="footnote-ref" href="#fn:286">286</a></sup></p> +<p>Something<sup id="fnref:287"><a class="footnote-ref" href="#fn:287">287</a></sup></p> +<p>Something<sup id="fnref:288"><a class="footnote-ref" href="#fn:288">288</a></sup></p> +<p>Something<sup id="fnref:289"><a class="footnote-ref" href="#fn:289">289</a></sup></p> +<p>Something<sup id="fnref:290"><a class="footnote-ref" href="#fn:290">290</a></sup></p> +<p>Something<sup id="fnref:291"><a class="footnote-ref" href="#fn:291">291</a></sup></p> +<p>Something<sup id="fnref:292"><a class="footnote-ref" href="#fn:292">292</a></sup></p> +<p>Something<sup id="fnref:293"><a class="footnote-ref" href="#fn:293">293</a></sup></p> +<p>Something<sup id="fnref:294"><a class="footnote-ref" href="#fn:294">294</a></sup></p> +<p>Something<sup id="fnref:295"><a class="footnote-ref" href="#fn:295">295</a></sup></p> +<p>Something<sup id="fnref:296"><a class="footnote-ref" href="#fn:296">296</a></sup></p> +<p>Something<sup id="fnref:297"><a class="footnote-ref" href="#fn:297">297</a></sup></p> +<p>Something<sup id="fnref:298"><a class="footnote-ref" href="#fn:298">298</a></sup></p> +<p>Something<sup id="fnref:299"><a class="footnote-ref" href="#fn:299">299</a></sup></p> +<p>Something<sup id="fnref:300"><a class="footnote-ref" href="#fn:300">300</a></sup></p> +<p>Something<sup id="fnref:301"><a class="footnote-ref" href="#fn:301">301</a></sup></p> +<p>Something<sup id="fnref:302"><a class="footnote-ref" href="#fn:302">302</a></sup></p> +<p>Something<sup id="fnref:303"><a class="footnote-ref" href="#fn:303">303</a></sup></p> +<p>Something<sup id="fnref:304"><a class="footnote-ref" href="#fn:304">304</a></sup></p> +<p>Something<sup id="fnref:305"><a class="footnote-ref" href="#fn:305">305</a></sup></p> +<p>Something<sup id="fnref:306"><a class="footnote-ref" href="#fn:306">306</a></sup></p> +<p>Something<sup id="fnref:307"><a class="footnote-ref" href="#fn:307">307</a></sup></p> +<p>Something<sup id="fnref:308"><a class="footnote-ref" href="#fn:308">308</a></sup></p> +<p>Something<sup id="fnref:309"><a class="footnote-ref" href="#fn:309">309</a></sup></p> +<p>Something<sup id="fnref:310"><a class="footnote-ref" href="#fn:310">310</a></sup></p> +<p>Something<sup id="fnref:311"><a class="footnote-ref" href="#fn:311">311</a></sup></p> +<p>Something<sup id="fnref:312"><a class="footnote-ref" href="#fn:312">312</a></sup></p> +<p>Something<sup id="fnref:313"><a class="footnote-ref" href="#fn:313">313</a></sup></p> +<p>Something<sup id="fnref:314"><a class="footnote-ref" href="#fn:314">314</a></sup></p> +<p>Something<sup id="fnref:315"><a class="footnote-ref" href="#fn:315">315</a></sup></p> +<p>Something<sup id="fnref:316"><a class="footnote-ref" href="#fn:316">316</a></sup></p> +<p>Something<sup id="fnref:317"><a class="footnote-ref" href="#fn:317">317</a></sup></p> +<p>Something<sup id="fnref:318"><a class="footnote-ref" href="#fn:318">318</a></sup></p> +<p>Something<sup id="fnref:319"><a class="footnote-ref" href="#fn:319">319</a></sup></p> +<p>Something<sup id="fnref:320"><a class="footnote-ref" href="#fn:320">320</a></sup></p> +<p>Something<sup id="fnref:321"><a class="footnote-ref" href="#fn:321">321</a></sup></p> +<p>Something<sup id="fnref:322"><a class="footnote-ref" href="#fn:322">322</a></sup></p> +<p>Something<sup id="fnref:323"><a class="footnote-ref" href="#fn:323">323</a></sup></p> +<p>Something<sup id="fnref:324"><a class="footnote-ref" href="#fn:324">324</a></sup></p> +<p>Something<sup id="fnref:325"><a class="footnote-ref" href="#fn:325">325</a></sup></p> +<p>Something<sup id="fnref:326"><a class="footnote-ref" href="#fn:326">326</a></sup></p> +<p>Something<sup id="fnref:327"><a class="footnote-ref" href="#fn:327">327</a></sup></p> +<p>Something<sup id="fnref:328"><a class="footnote-ref" href="#fn:328">328</a></sup></p> +<p>Something<sup id="fnref:329"><a class="footnote-ref" href="#fn:329">329</a></sup></p> +<p>Something<sup id="fnref:330"><a class="footnote-ref" href="#fn:330">330</a></sup></p> +<p>Something<sup id="fnref:331"><a class="footnote-ref" href="#fn:331">331</a></sup></p> +<p>Something<sup id="fnref:332"><a class="footnote-ref" href="#fn:332">332</a></sup></p> +<p>Something<sup id="fnref:333"><a class="footnote-ref" href="#fn:333">333</a></sup></p> +<p>Something<sup id="fnref:334"><a class="footnote-ref" href="#fn:334">334</a></sup></p> +<p>Something<sup id="fnref:335"><a class="footnote-ref" href="#fn:335">335</a></sup></p> +<p>Something<sup id="fnref:336"><a class="footnote-ref" href="#fn:336">336</a></sup></p> +<p>Something<sup id="fnref:337"><a class="footnote-ref" href="#fn:337">337</a></sup></p> +<p>Something<sup id="fnref:338"><a class="footnote-ref" href="#fn:338">338</a></sup></p> +<p>Something<sup id="fnref:339"><a class="footnote-ref" href="#fn:339">339</a></sup></p> +<p>Something<sup id="fnref:340"><a class="footnote-ref" href="#fn:340">340</a></sup></p> +<p>Something<sup id="fnref:341"><a class="footnote-ref" href="#fn:341">341</a></sup></p> +<p>Something<sup id="fnref:342"><a class="footnote-ref" href="#fn:342">342</a></sup></p> +<p>Something<sup id="fnref:343"><a class="footnote-ref" href="#fn:343">343</a></sup></p> +<p>Something<sup id="fnref:344"><a class="footnote-ref" href="#fn:344">344</a></sup></p> +<p>Something<sup id="fnref:345"><a class="footnote-ref" href="#fn:345">345</a></sup></p> +<p>Something<sup id="fnref:346"><a class="footnote-ref" href="#fn:346">346</a></sup></p> +<p>Something<sup id="fnref:347"><a class="footnote-ref" href="#fn:347">347</a></sup></p> +<p>Something<sup id="fnref:348"><a class="footnote-ref" href="#fn:348">348</a></sup></p> +<p>Something<sup id="fnref:349"><a class="footnote-ref" href="#fn:349">349</a></sup></p> +<p>Something<sup id="fnref:350"><a class="footnote-ref" href="#fn:350">350</a></sup></p> +<p>Something<sup id="fnref:351"><a class="footnote-ref" href="#fn:351">351</a></sup></p> +<p>Something<sup id="fnref:352"><a class="footnote-ref" href="#fn:352">352</a></sup></p> +<p>Something<sup id="fnref:353"><a class="footnote-ref" href="#fn:353">353</a></sup></p> +<p>Something<sup id="fnref:354"><a class="footnote-ref" href="#fn:354">354</a></sup></p> +<p>Something<sup id="fnref:355"><a class="footnote-ref" href="#fn:355">355</a></sup></p> +<p>Something<sup id="fnref:356"><a class="footnote-ref" href="#fn:356">356</a></sup></p> +<p>Something<sup id="fnref:357"><a class="footnote-ref" href="#fn:357">357</a></sup></p> +<p>Something<sup id="fnref:358"><a class="footnote-ref" href="#fn:358">358</a></sup></p> +<p>Something<sup id="fnref:359"><a class="footnote-ref" href="#fn:359">359</a></sup></p> +<p>Something<sup id="fnref:360"><a class="footnote-ref" href="#fn:360">360</a></sup></p> +<p>Something<sup id="fnref:361"><a class="footnote-ref" href="#fn:361">361</a></sup></p> +<p>Something<sup id="fnref:362"><a class="footnote-ref" href="#fn:362">362</a></sup></p> +<p>Something<sup id="fnref:363"><a class="footnote-ref" href="#fn:363">363</a></sup></p> +<p>Something<sup id="fnref:364"><a class="footnote-ref" href="#fn:364">364</a></sup></p> +<p>Something<sup id="fnref:365"><a class="footnote-ref" href="#fn:365">365</a></sup></p> +<p>Something<sup id="fnref:366"><a class="footnote-ref" href="#fn:366">366</a></sup></p> +<p>Something<sup id="fnref:367"><a class="footnote-ref" href="#fn:367">367</a></sup></p> +<p>Something<sup id="fnref:368"><a class="footnote-ref" href="#fn:368">368</a></sup></p> +<p>Something<sup id="fnref:369"><a class="footnote-ref" href="#fn:369">369</a></sup></p> +<p>Something<sup id="fnref:370"><a class="footnote-ref" href="#fn:370">370</a></sup></p> +<p>Something<sup id="fnref:371"><a class="footnote-ref" href="#fn:371">371</a></sup></p> +<p>Something<sup id="fnref:372"><a class="footnote-ref" href="#fn:372">372</a></sup></p> +<p>Something<sup id="fnref:373"><a class="footnote-ref" href="#fn:373">373</a></sup></p> +<p>Something<sup id="fnref:374"><a class="footnote-ref" href="#fn:374">374</a></sup></p> +<p>Something<sup id="fnref:375"><a class="footnote-ref" href="#fn:375">375</a></sup></p> +<p>Something<sup id="fnref:376"><a class="footnote-ref" href="#fn:376">376</a></sup></p> +<p>Something<sup id="fnref:377"><a class="footnote-ref" href="#fn:377">377</a></sup></p> +<p>Something<sup id="fnref:378"><a class="footnote-ref" href="#fn:378">378</a></sup></p> +<p>Something<sup id="fnref:379"><a class="footnote-ref" href="#fn:379">379</a></sup></p> +<p>Something<sup id="fnref:380"><a class="footnote-ref" href="#fn:380">380</a></sup></p> +<p>Something<sup id="fnref:381"><a class="footnote-ref" href="#fn:381">381</a></sup></p> +<p>Something<sup id="fnref:382"><a class="footnote-ref" href="#fn:382">382</a></sup></p> +<p>Something<sup id="fnref:383"><a class="footnote-ref" href="#fn:383">383</a></sup></p> +<p>Something<sup id="fnref:384"><a class="footnote-ref" href="#fn:384">384</a></sup></p> +<p>Something<sup id="fnref:385"><a class="footnote-ref" href="#fn:385">385</a></sup></p> +<p>Something<sup id="fnref:386"><a class="footnote-ref" href="#fn:386">386</a></sup></p> +<p>Something<sup id="fnref:387"><a class="footnote-ref" href="#fn:387">387</a></sup></p> +<p>Something<sup id="fnref:388"><a class="footnote-ref" href="#fn:388">388</a></sup></p> +<p>Something<sup id="fnref:389"><a class="footnote-ref" href="#fn:389">389</a></sup></p> +<p>Something<sup id="fnref:390"><a class="footnote-ref" href="#fn:390">390</a></sup></p> +<p>Something<sup id="fnref:391"><a class="footnote-ref" href="#fn:391">391</a></sup></p> +<p>Something<sup id="fnref:392"><a class="footnote-ref" href="#fn:392">392</a></sup></p> +<p>Something<sup id="fnref:393"><a class="footnote-ref" href="#fn:393">393</a></sup></p> +<p>Something<sup id="fnref:394"><a class="footnote-ref" href="#fn:394">394</a></sup></p> +<p>Something<sup id="fnref:395"><a class="footnote-ref" href="#fn:395">395</a></sup></p> +<p>Something<sup id="fnref:396"><a class="footnote-ref" href="#fn:396">396</a></sup></p> +<p>Something<sup id="fnref:397"><a class="footnote-ref" href="#fn:397">397</a></sup></p> +<p>Something<sup id="fnref:398"><a class="footnote-ref" href="#fn:398">398</a></sup></p> +<p>Something<sup id="fnref:399"><a class="footnote-ref" href="#fn:399">399</a></sup></p> +<p>Something<sup id="fnref:400"><a class="footnote-ref" href="#fn:400">400</a></sup></p> +<p>Something<sup id="fnref:401"><a class="footnote-ref" href="#fn:401">401</a></sup></p> +<p>Something<sup id="fnref:402"><a class="footnote-ref" href="#fn:402">402</a></sup></p> +<p>Something<sup id="fnref:403"><a class="footnote-ref" href="#fn:403">403</a></sup></p> +<p>Something<sup id="fnref:404"><a class="footnote-ref" href="#fn:404">404</a></sup></p> +<p>Something<sup id="fnref:405"><a class="footnote-ref" href="#fn:405">405</a></sup></p> +<p>Something<sup id="fnref:406"><a class="footnote-ref" href="#fn:406">406</a></sup></p> +<p>Something<sup id="fnref:407"><a class="footnote-ref" href="#fn:407">407</a></sup></p> +<p>Something<sup id="fnref:408"><a class="footnote-ref" href="#fn:408">408</a></sup></p> +<p>Something<sup id="fnref:409"><a class="footnote-ref" href="#fn:409">409</a></sup></p> +<p>Something<sup id="fnref:410"><a class="footnote-ref" href="#fn:410">410</a></sup></p> +<p>Something<sup id="fnref:411"><a class="footnote-ref" href="#fn:411">411</a></sup></p> +<p>Something<sup id="fnref:412"><a class="footnote-ref" href="#fn:412">412</a></sup></p> +<p>Something<sup id="fnref:413"><a class="footnote-ref" href="#fn:413">413</a></sup></p> +<p>Something<sup id="fnref:414"><a class="footnote-ref" href="#fn:414">414</a></sup></p> +<p>Something<sup id="fnref:415"><a class="footnote-ref" href="#fn:415">415</a></sup></p> +<p>Something<sup id="fnref:416"><a class="footnote-ref" href="#fn:416">416</a></sup></p> +<p>Something<sup id="fnref:417"><a class="footnote-ref" href="#fn:417">417</a></sup></p> +<p>Something<sup id="fnref:418"><a class="footnote-ref" href="#fn:418">418</a></sup></p> +<p>Something<sup id="fnref:419"><a class="footnote-ref" href="#fn:419">419</a></sup></p> +<p>Something<sup id="fnref:420"><a class="footnote-ref" href="#fn:420">420</a></sup></p> +<p>Something<sup id="fnref:421"><a class="footnote-ref" href="#fn:421">421</a></sup></p> +<p>Something<sup id="fnref:422"><a class="footnote-ref" href="#fn:422">422</a></sup></p> +<p>Something<sup id="fnref:423"><a class="footnote-ref" href="#fn:423">423</a></sup></p> +<p>Something<sup id="fnref:424"><a class="footnote-ref" href="#fn:424">424</a></sup></p> +<p>Something<sup id="fnref:425"><a class="footnote-ref" href="#fn:425">425</a></sup></p> +<p>Something<sup id="fnref:426"><a class="footnote-ref" href="#fn:426">426</a></sup></p> +<p>Something<sup id="fnref:427"><a class="footnote-ref" href="#fn:427">427</a></sup></p> +<p>Something<sup id="fnref:428"><a class="footnote-ref" href="#fn:428">428</a></sup></p> +<p>Something<sup id="fnref:429"><a class="footnote-ref" href="#fn:429">429</a></sup></p> +<p>Something<sup id="fnref:430"><a class="footnote-ref" href="#fn:430">430</a></sup></p> +<p>Something<sup id="fnref:431"><a class="footnote-ref" href="#fn:431">431</a></sup></p> +<p>Something<sup id="fnref:432"><a class="footnote-ref" href="#fn:432">432</a></sup></p> +<p>Something<sup id="fnref:433"><a class="footnote-ref" href="#fn:433">433</a></sup></p> +<p>Something<sup id="fnref:434"><a class="footnote-ref" href="#fn:434">434</a></sup></p> +<p>Something<sup id="fnref:435"><a class="footnote-ref" href="#fn:435">435</a></sup></p> +<p>Something<sup id="fnref:436"><a class="footnote-ref" href="#fn:436">436</a></sup></p> +<p>Something<sup id="fnref:437"><a class="footnote-ref" href="#fn:437">437</a></sup></p> +<p>Something<sup id="fnref:438"><a class="footnote-ref" href="#fn:438">438</a></sup></p> +<p>Something<sup id="fnref:439"><a class="footnote-ref" href="#fn:439">439</a></sup></p> +<p>Something<sup id="fnref:440"><a class="footnote-ref" href="#fn:440">440</a></sup></p> +<p>Something<sup id="fnref:441"><a class="footnote-ref" href="#fn:441">441</a></sup></p> +<p>Something<sup id="fnref:442"><a class="footnote-ref" href="#fn:442">442</a></sup></p> +<p>Something<sup id="fnref:443"><a class="footnote-ref" href="#fn:443">443</a></sup></p> +<p>Something<sup id="fnref:444"><a class="footnote-ref" href="#fn:444">444</a></sup></p> +<p>Something<sup id="fnref:445"><a class="footnote-ref" href="#fn:445">445</a></sup></p> +<p>Something<sup id="fnref:446"><a class="footnote-ref" href="#fn:446">446</a></sup></p> +<p>Something<sup id="fnref:447"><a class="footnote-ref" href="#fn:447">447</a></sup></p> +<p>Something<sup id="fnref:448"><a class="footnote-ref" href="#fn:448">448</a></sup></p> +<p>Something<sup id="fnref:449"><a class="footnote-ref" href="#fn:449">449</a></sup></p> +<p>Something<sup id="fnref:450"><a class="footnote-ref" href="#fn:450">450</a></sup></p> +<p>Something<sup id="fnref:451"><a class="footnote-ref" href="#fn:451">451</a></sup></p> +<p>Something<sup id="fnref:452"><a class="footnote-ref" href="#fn:452">452</a></sup></p> +<p>Something<sup id="fnref:453"><a class="footnote-ref" href="#fn:453">453</a></sup></p> +<p>Something<sup id="fnref:454"><a class="footnote-ref" href="#fn:454">454</a></sup></p> +<p>Something<sup id="fnref:455"><a class="footnote-ref" href="#fn:455">455</a></sup></p> +<p>Something<sup id="fnref:456"><a class="footnote-ref" href="#fn:456">456</a></sup></p> +<p>Something<sup id="fnref:457"><a class="footnote-ref" href="#fn:457">457</a></sup></p> +<p>Something<sup id="fnref:458"><a class="footnote-ref" href="#fn:458">458</a></sup></p> +<p>Something<sup id="fnref:459"><a class="footnote-ref" href="#fn:459">459</a></sup></p> +<p>Something<sup id="fnref:460"><a class="footnote-ref" href="#fn:460">460</a></sup></p> +<p>Something<sup id="fnref:461"><a class="footnote-ref" href="#fn:461">461</a></sup></p> +<p>Something<sup id="fnref:462"><a class="footnote-ref" href="#fn:462">462</a></sup></p> +<p>Something<sup id="fnref:463"><a class="footnote-ref" href="#fn:463">463</a></sup></p> +<p>Something<sup id="fnref:464"><a class="footnote-ref" href="#fn:464">464</a></sup></p> +<p>Something<sup id="fnref:465"><a class="footnote-ref" href="#fn:465">465</a></sup></p> +<p>Something<sup id="fnref:466"><a class="footnote-ref" href="#fn:466">466</a></sup></p> +<p>Something<sup id="fnref:467"><a class="footnote-ref" href="#fn:467">467</a></sup></p> +<p>Something<sup id="fnref:468"><a class="footnote-ref" href="#fn:468">468</a></sup></p> +<p>Something<sup id="fnref:469"><a class="footnote-ref" href="#fn:469">469</a></sup></p> +<p>Something<sup id="fnref:470"><a class="footnote-ref" href="#fn:470">470</a></sup></p> +<p>Something<sup id="fnref:471"><a class="footnote-ref" href="#fn:471">471</a></sup></p> +<p>Something<sup id="fnref:472"><a class="footnote-ref" href="#fn:472">472</a></sup></p> +<p>Something<sup id="fnref:473"><a class="footnote-ref" href="#fn:473">473</a></sup></p> +<p>Something<sup id="fnref:474"><a class="footnote-ref" href="#fn:474">474</a></sup></p> +<p>Something<sup id="fnref:475"><a class="footnote-ref" href="#fn:475">475</a></sup></p> +<p>Something<sup id="fnref:476"><a class="footnote-ref" href="#fn:476">476</a></sup></p> +<p>Something<sup id="fnref:477"><a class="footnote-ref" href="#fn:477">477</a></sup></p> +<p>Something<sup id="fnref:478"><a class="footnote-ref" href="#fn:478">478</a></sup></p> +<p>Something<sup id="fnref:479"><a class="footnote-ref" href="#fn:479">479</a></sup></p> +<p>Something<sup id="fnref:480"><a class="footnote-ref" href="#fn:480">480</a></sup></p> +<p>Something<sup id="fnref:481"><a class="footnote-ref" href="#fn:481">481</a></sup></p> +<p>Something<sup id="fnref:482"><a class="footnote-ref" href="#fn:482">482</a></sup></p> +<p>Something<sup id="fnref:483"><a class="footnote-ref" href="#fn:483">483</a></sup></p> +<p>Something<sup id="fnref:484"><a class="footnote-ref" href="#fn:484">484</a></sup></p> +<p>Something<sup id="fnref:485"><a class="footnote-ref" href="#fn:485">485</a></sup></p> +<p>Something<sup id="fnref:486"><a class="footnote-ref" href="#fn:486">486</a></sup></p> +<p>Something<sup id="fnref:487"><a class="footnote-ref" href="#fn:487">487</a></sup></p> +<p>Something<sup id="fnref:488"><a class="footnote-ref" href="#fn:488">488</a></sup></p> +<p>Something<sup id="fnref:489"><a class="footnote-ref" href="#fn:489">489</a></sup></p> +<p>Something<sup id="fnref:490"><a class="footnote-ref" href="#fn:490">490</a></sup></p> +<p>Something<sup id="fnref:491"><a class="footnote-ref" href="#fn:491">491</a></sup></p> +<p>Something<sup id="fnref:492"><a class="footnote-ref" href="#fn:492">492</a></sup></p> +<p>Something<sup id="fnref:493"><a class="footnote-ref" href="#fn:493">493</a></sup></p> +<p>Something<sup id="fnref:494"><a class="footnote-ref" href="#fn:494">494</a></sup></p> +<p>Something<sup id="fnref:495"><a class="footnote-ref" href="#fn:495">495</a></sup></p> +<p>Something<sup id="fnref:496"><a class="footnote-ref" href="#fn:496">496</a></sup></p> +<p>Something<sup id="fnref:497"><a class="footnote-ref" href="#fn:497">497</a></sup></p> +<p>Something<sup id="fnref:498"><a class="footnote-ref" href="#fn:498">498</a></sup></p> +<p>Something<sup id="fnref:499"><a class="footnote-ref" href="#fn:499">499</a></sup></p> +<p>Something<sup id="fnref:500"><a class="footnote-ref" href="#fn:500">500</a></sup></p> +<p>Something<sup id="fnref:501"><a class="footnote-ref" href="#fn:501">501</a></sup></p> +<p>Something<sup id="fnref:502"><a class="footnote-ref" href="#fn:502">502</a></sup></p> +<p>Something<sup id="fnref:503"><a class="footnote-ref" href="#fn:503">503</a></sup></p> +<p>Something<sup id="fnref:504"><a class="footnote-ref" href="#fn:504">504</a></sup></p> +<p>Something<sup id="fnref:505"><a class="footnote-ref" href="#fn:505">505</a></sup></p> +<p>Something<sup id="fnref:506"><a class="footnote-ref" href="#fn:506">506</a></sup></p> +<p>Something<sup id="fnref:507"><a class="footnote-ref" href="#fn:507">507</a></sup></p> +<p>Something<sup id="fnref:508"><a class="footnote-ref" href="#fn:508">508</a></sup></p> +<p>Something<sup id="fnref:509"><a class="footnote-ref" href="#fn:509">509</a></sup></p> +<p>Something<sup id="fnref:510"><a class="footnote-ref" href="#fn:510">510</a></sup></p> +<p>Something<sup id="fnref:511"><a class="footnote-ref" href="#fn:511">511</a></sup></p> +<p>Something<sup id="fnref:512"><a class="footnote-ref" href="#fn:512">512</a></sup></p> +<p>Something<sup id="fnref:513"><a class="footnote-ref" href="#fn:513">513</a></sup></p> +<p>Something<sup id="fnref:514"><a class="footnote-ref" href="#fn:514">514</a></sup></p> +<p>Something<sup id="fnref:515"><a class="footnote-ref" href="#fn:515">515</a></sup></p> +<p>Something<sup id="fnref:516"><a class="footnote-ref" href="#fn:516">516</a></sup></p> +<p>Something<sup id="fnref:517"><a class="footnote-ref" href="#fn:517">517</a></sup></p> +<p>Something<sup id="fnref:518"><a class="footnote-ref" href="#fn:518">518</a></sup></p> +<p>Something<sup id="fnref:519"><a class="footnote-ref" href="#fn:519">519</a></sup></p> +<p>Something<sup id="fnref:520"><a class="footnote-ref" href="#fn:520">520</a></sup></p> +<p>Something<sup id="fnref:521"><a class="footnote-ref" href="#fn:521">521</a></sup></p> +<p>Something<sup id="fnref:522"><a class="footnote-ref" href="#fn:522">522</a></sup></p> +<p>Something<sup id="fnref:523"><a class="footnote-ref" href="#fn:523">523</a></sup></p> +<p>Something<sup id="fnref:524"><a class="footnote-ref" href="#fn:524">524</a></sup></p> +<p>Something<sup id="fnref:525"><a class="footnote-ref" href="#fn:525">525</a></sup></p> +<p>Something<sup id="fnref:526"><a class="footnote-ref" href="#fn:526">526</a></sup></p> +<p>Something<sup id="fnref:527"><a class="footnote-ref" href="#fn:527">527</a></sup></p> +<p>Something<sup id="fnref:528"><a class="footnote-ref" href="#fn:528">528</a></sup></p> +<p>Something<sup id="fnref:529"><a class="footnote-ref" href="#fn:529">529</a></sup></p> +<p>Something<sup id="fnref:530"><a class="footnote-ref" href="#fn:530">530</a></sup></p> +<p>Something<sup id="fnref:531"><a class="footnote-ref" href="#fn:531">531</a></sup></p> +<p>Something<sup id="fnref:532"><a class="footnote-ref" href="#fn:532">532</a></sup></p> +<p>Something<sup id="fnref:533"><a class="footnote-ref" href="#fn:533">533</a></sup></p> +<p>Something<sup id="fnref:534"><a class="footnote-ref" href="#fn:534">534</a></sup></p> +<p>Something<sup id="fnref:535"><a class="footnote-ref" href="#fn:535">535</a></sup></p> +<p>Something<sup id="fnref:536"><a class="footnote-ref" href="#fn:536">536</a></sup></p> +<p>Something<sup id="fnref:537"><a class="footnote-ref" href="#fn:537">537</a></sup></p> +<p>Something<sup id="fnref:538"><a class="footnote-ref" href="#fn:538">538</a></sup></p> +<p>Something<sup id="fnref:539"><a class="footnote-ref" href="#fn:539">539</a></sup></p> +<p>Something<sup id="fnref:540"><a class="footnote-ref" href="#fn:540">540</a></sup></p> +<p>Something<sup id="fnref:541"><a class="footnote-ref" href="#fn:541">541</a></sup></p> +<p>Something<sup id="fnref:542"><a class="footnote-ref" href="#fn:542">542</a></sup></p> +<p>Something<sup id="fnref:543"><a class="footnote-ref" href="#fn:543">543</a></sup></p> +<p>Something<sup id="fnref:544"><a class="footnote-ref" href="#fn:544">544</a></sup></p> +<p>Something<sup id="fnref:545"><a class="footnote-ref" href="#fn:545">545</a></sup></p> +<p>Something<sup id="fnref:546"><a class="footnote-ref" href="#fn:546">546</a></sup></p> +<p>Something<sup id="fnref:547"><a class="footnote-ref" href="#fn:547">547</a></sup></p> +<p>Something<sup id="fnref:548"><a class="footnote-ref" href="#fn:548">548</a></sup></p> +<p>Something<sup id="fnref:549"><a class="footnote-ref" href="#fn:549">549</a></sup></p> +<p>Something<sup id="fnref:550"><a class="footnote-ref" href="#fn:550">550</a></sup></p> +<p>Something<sup id="fnref:551"><a class="footnote-ref" href="#fn:551">551</a></sup></p> +<p>Something<sup id="fnref:552"><a class="footnote-ref" href="#fn:552">552</a></sup></p> +<p>Something<sup id="fnref:553"><a class="footnote-ref" href="#fn:553">553</a></sup></p> +<p>Something<sup id="fnref:554"><a class="footnote-ref" href="#fn:554">554</a></sup></p> +<p>Something<sup id="fnref:555"><a class="footnote-ref" href="#fn:555">555</a></sup></p> +<p>Something<sup id="fnref:556"><a class="footnote-ref" href="#fn:556">556</a></sup></p> +<p>Something<sup id="fnref:557"><a class="footnote-ref" href="#fn:557">557</a></sup></p> +<p>Something<sup id="fnref:558"><a class="footnote-ref" href="#fn:558">558</a></sup></p> +<p>Something<sup id="fnref:559"><a class="footnote-ref" href="#fn:559">559</a></sup></p> +<p>Something<sup id="fnref:560"><a class="footnote-ref" href="#fn:560">560</a></sup></p> +<p>Something<sup id="fnref:561"><a class="footnote-ref" href="#fn:561">561</a></sup></p> +<p>Something<sup id="fnref:562"><a class="footnote-ref" href="#fn:562">562</a></sup></p> +<p>Something<sup id="fnref:563"><a class="footnote-ref" href="#fn:563">563</a></sup></p> +<p>Something<sup id="fnref:564"><a class="footnote-ref" href="#fn:564">564</a></sup></p> +<p>Something<sup id="fnref:565"><a class="footnote-ref" href="#fn:565">565</a></sup></p> +<p>Something<sup id="fnref:566"><a class="footnote-ref" href="#fn:566">566</a></sup></p> +<p>Something<sup id="fnref:567"><a class="footnote-ref" href="#fn:567">567</a></sup></p> +<p>Something<sup id="fnref:568"><a class="footnote-ref" href="#fn:568">568</a></sup></p> +<p>Something<sup id="fnref:569"><a class="footnote-ref" href="#fn:569">569</a></sup></p> +<p>Something<sup id="fnref:570"><a class="footnote-ref" href="#fn:570">570</a></sup></p> +<p>Something<sup id="fnref:571"><a class="footnote-ref" href="#fn:571">571</a></sup></p> +<p>Something<sup id="fnref:572"><a class="footnote-ref" href="#fn:572">572</a></sup></p> +<p>Something<sup id="fnref:573"><a class="footnote-ref" href="#fn:573">573</a></sup></p> +<p>Something<sup id="fnref:574"><a class="footnote-ref" href="#fn:574">574</a></sup></p> +<p>Something<sup id="fnref:575"><a class="footnote-ref" href="#fn:575">575</a></sup></p> +<p>Something<sup id="fnref:576"><a class="footnote-ref" href="#fn:576">576</a></sup></p> +<p>Something<sup id="fnref:577"><a class="footnote-ref" href="#fn:577">577</a></sup></p> +<p>Something<sup id="fnref:578"><a class="footnote-ref" href="#fn:578">578</a></sup></p> +<p>Something<sup id="fnref:579"><a class="footnote-ref" href="#fn:579">579</a></sup></p> +<p>Something<sup id="fnref:580"><a class="footnote-ref" href="#fn:580">580</a></sup></p> +<p>Something<sup id="fnref:581"><a class="footnote-ref" href="#fn:581">581</a></sup></p> +<p>Something<sup id="fnref:582"><a class="footnote-ref" href="#fn:582">582</a></sup></p> +<p>Something<sup id="fnref:583"><a class="footnote-ref" href="#fn:583">583</a></sup></p> +<p>Something<sup id="fnref:584"><a class="footnote-ref" href="#fn:584">584</a></sup></p> +<p>Something<sup id="fnref:585"><a class="footnote-ref" href="#fn:585">585</a></sup></p> +<p>Something<sup id="fnref:586"><a class="footnote-ref" href="#fn:586">586</a></sup></p> +<p>Something<sup id="fnref:587"><a class="footnote-ref" href="#fn:587">587</a></sup></p> +<p>Something<sup id="fnref:588"><a class="footnote-ref" href="#fn:588">588</a></sup></p> +<p>Something<sup id="fnref:589"><a class="footnote-ref" href="#fn:589">589</a></sup></p> +<p>Something<sup id="fnref:590"><a class="footnote-ref" href="#fn:590">590</a></sup></p> +<p>Something<sup id="fnref:591"><a class="footnote-ref" href="#fn:591">591</a></sup></p> +<p>Something<sup id="fnref:592"><a class="footnote-ref" href="#fn:592">592</a></sup></p> +<p>Something<sup id="fnref:593"><a class="footnote-ref" href="#fn:593">593</a></sup></p> +<p>Something<sup id="fnref:594"><a class="footnote-ref" href="#fn:594">594</a></sup></p> +<p>Something<sup id="fnref:595"><a class="footnote-ref" href="#fn:595">595</a></sup></p> +<p>Something<sup id="fnref:596"><a class="footnote-ref" href="#fn:596">596</a></sup></p> +<p>Something<sup id="fnref:597"><a class="footnote-ref" href="#fn:597">597</a></sup></p> +<p>Something<sup id="fnref:598"><a class="footnote-ref" href="#fn:598">598</a></sup></p> +<p>Something<sup id="fnref:599"><a class="footnote-ref" href="#fn:599">599</a></sup></p> +<p>Something<sup id="fnref:600"><a class="footnote-ref" href="#fn:600">600</a></sup></p> +<p>Something<sup id="fnref:601"><a class="footnote-ref" href="#fn:601">601</a></sup></p> +<p>Something<sup id="fnref:602"><a class="footnote-ref" href="#fn:602">602</a></sup></p> +<p>Something<sup id="fnref:603"><a class="footnote-ref" href="#fn:603">603</a></sup></p> +<p>Something<sup id="fnref:604"><a class="footnote-ref" href="#fn:604">604</a></sup></p> +<p>Something<sup id="fnref:605"><a class="footnote-ref" href="#fn:605">605</a></sup></p> +<p>Something<sup id="fnref:606"><a class="footnote-ref" href="#fn:606">606</a></sup></p> +<p>Something<sup id="fnref:607"><a class="footnote-ref" href="#fn:607">607</a></sup></p> +<p>Something<sup id="fnref:608"><a class="footnote-ref" href="#fn:608">608</a></sup></p> +<p>Something<sup id="fnref:609"><a class="footnote-ref" href="#fn:609">609</a></sup></p> +<p>Something<sup id="fnref:610"><a class="footnote-ref" href="#fn:610">610</a></sup></p> +<p>Something<sup id="fnref:611"><a class="footnote-ref" href="#fn:611">611</a></sup></p> +<p>Something<sup id="fnref:612"><a class="footnote-ref" href="#fn:612">612</a></sup></p> +<p>Something<sup id="fnref:613"><a class="footnote-ref" href="#fn:613">613</a></sup></p> +<p>Something<sup id="fnref:614"><a class="footnote-ref" href="#fn:614">614</a></sup></p> +<p>Something<sup id="fnref:615"><a class="footnote-ref" href="#fn:615">615</a></sup></p> +<p>Something<sup id="fnref:616"><a class="footnote-ref" href="#fn:616">616</a></sup></p> +<p>Something<sup id="fnref:617"><a class="footnote-ref" href="#fn:617">617</a></sup></p> +<p>Something<sup id="fnref:618"><a class="footnote-ref" href="#fn:618">618</a></sup></p> +<p>Something<sup id="fnref:619"><a class="footnote-ref" href="#fn:619">619</a></sup></p> +<p>Something<sup id="fnref:620"><a class="footnote-ref" href="#fn:620">620</a></sup></p> +<p>Something<sup id="fnref:621"><a class="footnote-ref" href="#fn:621">621</a></sup></p> +<p>Something<sup id="fnref:622"><a class="footnote-ref" href="#fn:622">622</a></sup></p> +<p>Something<sup id="fnref:623"><a class="footnote-ref" href="#fn:623">623</a></sup></p> +<p>Something<sup id="fnref:624"><a class="footnote-ref" href="#fn:624">624</a></sup></p> +<p>Something<sup id="fnref:625"><a class="footnote-ref" href="#fn:625">625</a></sup></p> +<p>Something<sup id="fnref:626"><a class="footnote-ref" href="#fn:626">626</a></sup></p> +<p>Something<sup id="fnref:627"><a class="footnote-ref" href="#fn:627">627</a></sup></p> +<p>Something<sup id="fnref:628"><a class="footnote-ref" href="#fn:628">628</a></sup></p> +<p>Something<sup id="fnref:629"><a class="footnote-ref" href="#fn:629">629</a></sup></p> +<p>Something<sup id="fnref:630"><a class="footnote-ref" href="#fn:630">630</a></sup></p> +<p>Something<sup id="fnref:631"><a class="footnote-ref" href="#fn:631">631</a></sup></p> +<p>Something<sup id="fnref:632"><a class="footnote-ref" href="#fn:632">632</a></sup></p> +<p>Something<sup id="fnref:633"><a class="footnote-ref" href="#fn:633">633</a></sup></p> +<p>Something<sup id="fnref:634"><a class="footnote-ref" href="#fn:634">634</a></sup></p> +<p>Something<sup id="fnref:635"><a class="footnote-ref" href="#fn:635">635</a></sup></p> +<p>Something<sup id="fnref:636"><a class="footnote-ref" href="#fn:636">636</a></sup></p> +<p>Something<sup id="fnref:637"><a class="footnote-ref" href="#fn:637">637</a></sup></p> +<p>Something<sup id="fnref:638"><a class="footnote-ref" href="#fn:638">638</a></sup></p> +<p>Something<sup id="fnref:639"><a class="footnote-ref" href="#fn:639">639</a></sup></p> +<p>Something<sup id="fnref:640"><a class="footnote-ref" href="#fn:640">640</a></sup></p> +<p>Something<sup id="fnref:641"><a class="footnote-ref" href="#fn:641">641</a></sup></p> +<p>Something<sup id="fnref:642"><a class="footnote-ref" href="#fn:642">642</a></sup></p> +<p>Something<sup id="fnref:643"><a class="footnote-ref" href="#fn:643">643</a></sup></p> +<p>Something<sup id="fnref:644"><a class="footnote-ref" href="#fn:644">644</a></sup></p> +<p>Something<sup id="fnref:645"><a class="footnote-ref" href="#fn:645">645</a></sup></p> +<p>Something<sup id="fnref:646"><a class="footnote-ref" href="#fn:646">646</a></sup></p> +<p>Something<sup id="fnref:647"><a class="footnote-ref" href="#fn:647">647</a></sup></p> +<p>Something<sup id="fnref:648"><a class="footnote-ref" href="#fn:648">648</a></sup></p> +<p>Something<sup id="fnref:649"><a class="footnote-ref" href="#fn:649">649</a></sup></p> +<p>Something<sup id="fnref:650"><a class="footnote-ref" href="#fn:650">650</a></sup></p> +<p>Something<sup id="fnref:651"><a class="footnote-ref" href="#fn:651">651</a></sup></p> +<p>Something<sup id="fnref:652"><a class="footnote-ref" href="#fn:652">652</a></sup></p> +<p>Something<sup id="fnref:653"><a class="footnote-ref" href="#fn:653">653</a></sup></p> +<p>Something<sup id="fnref:654"><a class="footnote-ref" href="#fn:654">654</a></sup></p> +<p>Something<sup id="fnref:655"><a class="footnote-ref" href="#fn:655">655</a></sup></p> +<p>Something<sup id="fnref:656"><a class="footnote-ref" href="#fn:656">656</a></sup></p> +<p>Something<sup id="fnref:657"><a class="footnote-ref" href="#fn:657">657</a></sup></p> +<p>Something<sup id="fnref:658"><a class="footnote-ref" href="#fn:658">658</a></sup></p> +<p>Something<sup id="fnref:659"><a class="footnote-ref" href="#fn:659">659</a></sup></p> +<p>Something<sup id="fnref:660"><a class="footnote-ref" href="#fn:660">660</a></sup></p> +<p>Something<sup id="fnref:661"><a class="footnote-ref" href="#fn:661">661</a></sup></p> +<p>Something<sup id="fnref:662"><a class="footnote-ref" href="#fn:662">662</a></sup></p> +<p>Something<sup id="fnref:663"><a class="footnote-ref" href="#fn:663">663</a></sup></p> +<p>Something<sup id="fnref:664"><a class="footnote-ref" href="#fn:664">664</a></sup></p> +<p>Something<sup id="fnref:665"><a class="footnote-ref" href="#fn:665">665</a></sup></p> +<p>Something<sup id="fnref:666"><a class="footnote-ref" href="#fn:666">666</a></sup></p> +<p>Something<sup id="fnref:667"><a class="footnote-ref" href="#fn:667">667</a></sup></p> +<p>Something<sup id="fnref:668"><a class="footnote-ref" href="#fn:668">668</a></sup></p> +<p>Something<sup id="fnref:669"><a class="footnote-ref" href="#fn:669">669</a></sup></p> +<p>Something<sup id="fnref:670"><a class="footnote-ref" href="#fn:670">670</a></sup></p> +<p>Something<sup id="fnref:671"><a class="footnote-ref" href="#fn:671">671</a></sup></p> +<p>Something<sup id="fnref:672"><a class="footnote-ref" href="#fn:672">672</a></sup></p> +<p>Something<sup id="fnref:673"><a class="footnote-ref" href="#fn:673">673</a></sup></p> +<p>Something<sup id="fnref:674"><a class="footnote-ref" href="#fn:674">674</a></sup></p> +<p>Something<sup id="fnref:675"><a class="footnote-ref" href="#fn:675">675</a></sup></p> +<p>Something<sup id="fnref:676"><a class="footnote-ref" href="#fn:676">676</a></sup></p> +<p>Something<sup id="fnref:677"><a class="footnote-ref" href="#fn:677">677</a></sup></p> +<p>Something<sup id="fnref:678"><a class="footnote-ref" href="#fn:678">678</a></sup></p> +<p>Something<sup id="fnref:679"><a class="footnote-ref" href="#fn:679">679</a></sup></p> +<p>Something<sup id="fnref:680"><a class="footnote-ref" href="#fn:680">680</a></sup></p> +<p>Something<sup id="fnref:681"><a class="footnote-ref" href="#fn:681">681</a></sup></p> +<p>Something<sup id="fnref:682"><a class="footnote-ref" href="#fn:682">682</a></sup></p> +<p>Something<sup id="fnref:683"><a class="footnote-ref" href="#fn:683">683</a></sup></p> +<p>Something<sup id="fnref:684"><a class="footnote-ref" href="#fn:684">684</a></sup></p> +<p>Something<sup id="fnref:685"><a class="footnote-ref" href="#fn:685">685</a></sup></p> +<p>Something<sup id="fnref:686"><a class="footnote-ref" href="#fn:686">686</a></sup></p> +<p>Something<sup id="fnref:687"><a class="footnote-ref" href="#fn:687">687</a></sup></p> +<p>Something<sup id="fnref:688"><a class="footnote-ref" href="#fn:688">688</a></sup></p> +<p>Something<sup id="fnref:689"><a class="footnote-ref" href="#fn:689">689</a></sup></p> +<p>Something<sup id="fnref:690"><a class="footnote-ref" href="#fn:690">690</a></sup></p> +<p>Something<sup id="fnref:691"><a class="footnote-ref" href="#fn:691">691</a></sup></p> +<p>Something<sup id="fnref:692"><a class="footnote-ref" href="#fn:692">692</a></sup></p> +<p>Something<sup id="fnref:693"><a class="footnote-ref" href="#fn:693">693</a></sup></p> +<p>Something<sup id="fnref:694"><a class="footnote-ref" href="#fn:694">694</a></sup></p> +<p>Something<sup id="fnref:695"><a class="footnote-ref" href="#fn:695">695</a></sup></p> +<p>Something<sup id="fnref:696"><a class="footnote-ref" href="#fn:696">696</a></sup></p> +<p>Something<sup id="fnref:697"><a class="footnote-ref" href="#fn:697">697</a></sup></p> +<p>Something<sup id="fnref:698"><a class="footnote-ref" href="#fn:698">698</a></sup></p> +<p>Something<sup id="fnref:699"><a class="footnote-ref" href="#fn:699">699</a></sup></p> +<p>Something<sup id="fnref:700"><a class="footnote-ref" href="#fn:700">700</a></sup></p> +<p>Something<sup id="fnref:701"><a class="footnote-ref" href="#fn:701">701</a></sup></p> +<p>Something<sup id="fnref:702"><a class="footnote-ref" href="#fn:702">702</a></sup></p> +<p>Something<sup id="fnref:703"><a class="footnote-ref" href="#fn:703">703</a></sup></p> +<p>Something<sup id="fnref:704"><a class="footnote-ref" href="#fn:704">704</a></sup></p> +<p>Something<sup id="fnref:705"><a class="footnote-ref" href="#fn:705">705</a></sup></p> +<p>Something<sup id="fnref:706"><a class="footnote-ref" href="#fn:706">706</a></sup></p> +<p>Something<sup id="fnref:707"><a class="footnote-ref" href="#fn:707">707</a></sup></p> +<p>Something<sup id="fnref:708"><a class="footnote-ref" href="#fn:708">708</a></sup></p> +<p>Something<sup id="fnref:709"><a class="footnote-ref" href="#fn:709">709</a></sup></p> +<p>Something<sup id="fnref:710"><a class="footnote-ref" href="#fn:710">710</a></sup></p> +<p>Something<sup id="fnref:711"><a class="footnote-ref" href="#fn:711">711</a></sup></p> +<p>Something<sup id="fnref:712"><a class="footnote-ref" href="#fn:712">712</a></sup></p> +<p>Something<sup id="fnref:713"><a class="footnote-ref" href="#fn:713">713</a></sup></p> +<p>Something<sup id="fnref:714"><a class="footnote-ref" href="#fn:714">714</a></sup></p> +<p>Something<sup id="fnref:715"><a class="footnote-ref" href="#fn:715">715</a></sup></p> +<p>Something<sup id="fnref:716"><a class="footnote-ref" href="#fn:716">716</a></sup></p> +<p>Something<sup id="fnref:717"><a class="footnote-ref" href="#fn:717">717</a></sup></p> +<p>Something<sup id="fnref:718"><a class="footnote-ref" href="#fn:718">718</a></sup></p> +<p>Something<sup id="fnref:719"><a class="footnote-ref" href="#fn:719">719</a></sup></p> +<p>Something<sup id="fnref:720"><a class="footnote-ref" href="#fn:720">720</a></sup></p> +<p>Something<sup id="fnref:721"><a class="footnote-ref" href="#fn:721">721</a></sup></p> +<p>Something<sup id="fnref:722"><a class="footnote-ref" href="#fn:722">722</a></sup></p> +<p>Something<sup id="fnref:723"><a class="footnote-ref" href="#fn:723">723</a></sup></p> +<p>Something<sup id="fnref:724"><a class="footnote-ref" href="#fn:724">724</a></sup></p> +<p>Something<sup id="fnref:725"><a class="footnote-ref" href="#fn:725">725</a></sup></p> +<p>Something<sup id="fnref:726"><a class="footnote-ref" href="#fn:726">726</a></sup></p> +<p>Something<sup id="fnref:727"><a class="footnote-ref" href="#fn:727">727</a></sup></p> +<p>Something<sup id="fnref:728"><a class="footnote-ref" href="#fn:728">728</a></sup></p> +<p>Something<sup id="fnref:729"><a class="footnote-ref" href="#fn:729">729</a></sup></p> +<p>Something<sup id="fnref:730"><a class="footnote-ref" href="#fn:730">730</a></sup></p> +<p>Something<sup id="fnref:731"><a class="footnote-ref" href="#fn:731">731</a></sup></p> +<p>Something<sup id="fnref:732"><a class="footnote-ref" href="#fn:732">732</a></sup></p> +<p>Something<sup id="fnref:733"><a class="footnote-ref" href="#fn:733">733</a></sup></p> +<p>Something<sup id="fnref:734"><a class="footnote-ref" href="#fn:734">734</a></sup></p> +<p>Something<sup id="fnref:735"><a class="footnote-ref" href="#fn:735">735</a></sup></p> +<p>Something<sup id="fnref:736"><a class="footnote-ref" href="#fn:736">736</a></sup></p> +<p>Something<sup id="fnref:737"><a class="footnote-ref" href="#fn:737">737</a></sup></p> +<p>Something<sup id="fnref:738"><a class="footnote-ref" href="#fn:738">738</a></sup></p> +<p>Something<sup id="fnref:739"><a class="footnote-ref" href="#fn:739">739</a></sup></p> +<p>Something<sup id="fnref:740"><a class="footnote-ref" href="#fn:740">740</a></sup></p> +<p>Something<sup id="fnref:741"><a class="footnote-ref" href="#fn:741">741</a></sup></p> +<p>Something<sup id="fnref:742"><a class="footnote-ref" href="#fn:742">742</a></sup></p> +<p>Something<sup id="fnref:743"><a class="footnote-ref" href="#fn:743">743</a></sup></p> +<p>Something<sup id="fnref:744"><a class="footnote-ref" href="#fn:744">744</a></sup></p> +<p>Something<sup id="fnref:745"><a class="footnote-ref" href="#fn:745">745</a></sup></p> +<p>Something<sup id="fnref:746"><a class="footnote-ref" href="#fn:746">746</a></sup></p> +<p>Something<sup id="fnref:747"><a class="footnote-ref" href="#fn:747">747</a></sup></p> +<p>Something<sup id="fnref:748"><a class="footnote-ref" href="#fn:748">748</a></sup></p> +<p>Something<sup id="fnref:749"><a class="footnote-ref" href="#fn:749">749</a></sup></p> +<p>Something<sup id="fnref:750"><a class="footnote-ref" href="#fn:750">750</a></sup></p> +<p>Something<sup id="fnref:751"><a class="footnote-ref" href="#fn:751">751</a></sup></p> +<p>Something<sup id="fnref:752"><a class="footnote-ref" href="#fn:752">752</a></sup></p> +<p>Something<sup id="fnref:753"><a class="footnote-ref" href="#fn:753">753</a></sup></p> +<p>Something<sup id="fnref:754"><a class="footnote-ref" href="#fn:754">754</a></sup></p> +<p>Something<sup id="fnref:755"><a class="footnote-ref" href="#fn:755">755</a></sup></p> +<p>Something<sup id="fnref:756"><a class="footnote-ref" href="#fn:756">756</a></sup></p> +<p>Something<sup id="fnref:757"><a class="footnote-ref" href="#fn:757">757</a></sup></p> +<p>Something<sup id="fnref:758"><a class="footnote-ref" href="#fn:758">758</a></sup></p> +<p>Something<sup id="fnref:759"><a class="footnote-ref" href="#fn:759">759</a></sup></p> +<p>Something<sup id="fnref:760"><a class="footnote-ref" href="#fn:760">760</a></sup></p> +<p>Something<sup id="fnref:761"><a class="footnote-ref" href="#fn:761">761</a></sup></p> +<p>Something<sup id="fnref:762"><a class="footnote-ref" href="#fn:762">762</a></sup></p> +<p>Something<sup id="fnref:763"><a class="footnote-ref" href="#fn:763">763</a></sup></p> +<p>Something<sup id="fnref:764"><a class="footnote-ref" href="#fn:764">764</a></sup></p> +<p>Something<sup id="fnref:765"><a class="footnote-ref" href="#fn:765">765</a></sup></p> +<p>Something<sup id="fnref:766"><a class="footnote-ref" href="#fn:766">766</a></sup></p> +<p>Something<sup id="fnref:767"><a class="footnote-ref" href="#fn:767">767</a></sup></p> +<p>Something<sup id="fnref:768"><a class="footnote-ref" href="#fn:768">768</a></sup></p> +<p>Something<sup id="fnref:769"><a class="footnote-ref" href="#fn:769">769</a></sup></p> +<p>Something<sup id="fnref:770"><a class="footnote-ref" href="#fn:770">770</a></sup></p> +<p>Something<sup id="fnref:771"><a class="footnote-ref" href="#fn:771">771</a></sup></p> +<p>Something<sup id="fnref:772"><a class="footnote-ref" href="#fn:772">772</a></sup></p> +<p>Something<sup id="fnref:773"><a class="footnote-ref" href="#fn:773">773</a></sup></p> +<p>Something<sup id="fnref:774"><a class="footnote-ref" href="#fn:774">774</a></sup></p> +<p>Something<sup id="fnref:775"><a class="footnote-ref" href="#fn:775">775</a></sup></p> +<p>Something<sup id="fnref:776"><a class="footnote-ref" href="#fn:776">776</a></sup></p> +<p>Something<sup id="fnref:777"><a class="footnote-ref" href="#fn:777">777</a></sup></p> +<p>Something<sup id="fnref:778"><a class="footnote-ref" href="#fn:778">778</a></sup></p> +<p>Something<sup id="fnref:779"><a class="footnote-ref" href="#fn:779">779</a></sup></p> +<p>Something<sup id="fnref:780"><a class="footnote-ref" href="#fn:780">780</a></sup></p> +<p>Something<sup id="fnref:781"><a class="footnote-ref" href="#fn:781">781</a></sup></p> +<p>Something<sup id="fnref:782"><a class="footnote-ref" href="#fn:782">782</a></sup></p> +<p>Something<sup id="fnref:783"><a class="footnote-ref" href="#fn:783">783</a></sup></p> +<p>Something<sup id="fnref:784"><a class="footnote-ref" href="#fn:784">784</a></sup></p> +<p>Something<sup id="fnref:785"><a class="footnote-ref" href="#fn:785">785</a></sup></p> +<p>Something<sup id="fnref:786"><a class="footnote-ref" href="#fn:786">786</a></sup></p> +<p>Something<sup id="fnref:787"><a class="footnote-ref" href="#fn:787">787</a></sup></p> +<p>Something<sup id="fnref:788"><a class="footnote-ref" href="#fn:788">788</a></sup></p> +<p>Something<sup id="fnref:789"><a class="footnote-ref" href="#fn:789">789</a></sup></p> +<p>Something<sup id="fnref:790"><a class="footnote-ref" href="#fn:790">790</a></sup></p> +<p>Something<sup id="fnref:791"><a class="footnote-ref" href="#fn:791">791</a></sup></p> +<p>Something<sup id="fnref:792"><a class="footnote-ref" href="#fn:792">792</a></sup></p> +<p>Something<sup id="fnref:793"><a class="footnote-ref" href="#fn:793">793</a></sup></p> +<p>Something<sup id="fnref:794"><a class="footnote-ref" href="#fn:794">794</a></sup></p> +<p>Something<sup id="fnref:795"><a class="footnote-ref" href="#fn:795">795</a></sup></p> +<p>Something<sup id="fnref:796"><a class="footnote-ref" href="#fn:796">796</a></sup></p> +<p>Something<sup id="fnref:797"><a class="footnote-ref" href="#fn:797">797</a></sup></p> +<p>Something<sup id="fnref:798"><a class="footnote-ref" href="#fn:798">798</a></sup></p> +<p>Something<sup id="fnref:799"><a class="footnote-ref" href="#fn:799">799</a></sup></p> +<p>Something<sup id="fnref:800"><a class="footnote-ref" href="#fn:800">800</a></sup></p> +<p>Something<sup id="fnref:801"><a class="footnote-ref" href="#fn:801">801</a></sup></p> +<p>Something<sup id="fnref:802"><a class="footnote-ref" href="#fn:802">802</a></sup></p> +<p>Something<sup id="fnref:803"><a class="footnote-ref" href="#fn:803">803</a></sup></p> +<p>Something<sup id="fnref:804"><a class="footnote-ref" href="#fn:804">804</a></sup></p> +<p>Something<sup id="fnref:805"><a class="footnote-ref" href="#fn:805">805</a></sup></p> +<p>Something<sup id="fnref:806"><a class="footnote-ref" href="#fn:806">806</a></sup></p> +<p>Something<sup id="fnref:807"><a class="footnote-ref" href="#fn:807">807</a></sup></p> +<p>Something<sup id="fnref:808"><a class="footnote-ref" href="#fn:808">808</a></sup></p> +<p>Something<sup id="fnref:809"><a class="footnote-ref" href="#fn:809">809</a></sup></p> +<p>Something<sup id="fnref:810"><a class="footnote-ref" href="#fn:810">810</a></sup></p> +<p>Something<sup id="fnref:811"><a class="footnote-ref" href="#fn:811">811</a></sup></p> +<p>Something<sup id="fnref:812"><a class="footnote-ref" href="#fn:812">812</a></sup></p> +<p>Something<sup id="fnref:813"><a class="footnote-ref" href="#fn:813">813</a></sup></p> +<p>Something<sup id="fnref:814"><a class="footnote-ref" href="#fn:814">814</a></sup></p> +<p>Something<sup id="fnref:815"><a class="footnote-ref" href="#fn:815">815</a></sup></p> +<p>Something<sup id="fnref:816"><a class="footnote-ref" href="#fn:816">816</a></sup></p> +<p>Something<sup id="fnref:817"><a class="footnote-ref" href="#fn:817">817</a></sup></p> +<p>Something<sup id="fnref:818"><a class="footnote-ref" href="#fn:818">818</a></sup></p> +<p>Something<sup id="fnref:819"><a class="footnote-ref" href="#fn:819">819</a></sup></p> +<p>Something<sup id="fnref:820"><a class="footnote-ref" href="#fn:820">820</a></sup></p> +<p>Something<sup id="fnref:821"><a class="footnote-ref" href="#fn:821">821</a></sup></p> +<p>Something<sup id="fnref:822"><a class="footnote-ref" href="#fn:822">822</a></sup></p> +<p>Something<sup id="fnref:823"><a class="footnote-ref" href="#fn:823">823</a></sup></p> +<p>Something<sup id="fnref:824"><a class="footnote-ref" href="#fn:824">824</a></sup></p> +<p>Something<sup id="fnref:825"><a class="footnote-ref" href="#fn:825">825</a></sup></p> +<p>Something<sup id="fnref:826"><a class="footnote-ref" href="#fn:826">826</a></sup></p> +<p>Something<sup id="fnref:827"><a class="footnote-ref" href="#fn:827">827</a></sup></p> +<p>Something<sup id="fnref:828"><a class="footnote-ref" href="#fn:828">828</a></sup></p> +<p>Something<sup id="fnref:829"><a class="footnote-ref" href="#fn:829">829</a></sup></p> +<p>Something<sup id="fnref:830"><a class="footnote-ref" href="#fn:830">830</a></sup></p> +<p>Something<sup id="fnref:831"><a class="footnote-ref" href="#fn:831">831</a></sup></p> +<p>Something<sup id="fnref:832"><a class="footnote-ref" href="#fn:832">832</a></sup></p> +<p>Something<sup id="fnref:833"><a class="footnote-ref" href="#fn:833">833</a></sup></p> +<p>Something<sup id="fnref:834"><a class="footnote-ref" href="#fn:834">834</a></sup></p> +<p>Something<sup id="fnref:835"><a class="footnote-ref" href="#fn:835">835</a></sup></p> +<p>Something<sup id="fnref:836"><a class="footnote-ref" href="#fn:836">836</a></sup></p> +<p>Something<sup id="fnref:837"><a class="footnote-ref" href="#fn:837">837</a></sup></p> +<p>Something<sup id="fnref:838"><a class="footnote-ref" href="#fn:838">838</a></sup></p> +<p>Something<sup id="fnref:839"><a class="footnote-ref" href="#fn:839">839</a></sup></p> +<p>Something<sup id="fnref:840"><a class="footnote-ref" href="#fn:840">840</a></sup></p> +<p>Something<sup id="fnref:841"><a class="footnote-ref" href="#fn:841">841</a></sup></p> +<p>Something<sup id="fnref:842"><a class="footnote-ref" href="#fn:842">842</a></sup></p> +<p>Something<sup id="fnref:843"><a class="footnote-ref" href="#fn:843">843</a></sup></p> +<p>Something<sup id="fnref:844"><a class="footnote-ref" href="#fn:844">844</a></sup></p> +<p>Something<sup id="fnref:845"><a class="footnote-ref" href="#fn:845">845</a></sup></p> +<p>Something<sup id="fnref:846"><a class="footnote-ref" href="#fn:846">846</a></sup></p> +<p>Something<sup id="fnref:847"><a class="footnote-ref" href="#fn:847">847</a></sup></p> +<p>Something<sup id="fnref:848"><a class="footnote-ref" href="#fn:848">848</a></sup></p> +<p>Something<sup id="fnref:849"><a class="footnote-ref" href="#fn:849">849</a></sup></p> +<p>Something<sup id="fnref:850"><a class="footnote-ref" href="#fn:850">850</a></sup></p> +<p>Something<sup id="fnref:851"><a class="footnote-ref" href="#fn:851">851</a></sup></p> +<p>Something<sup id="fnref:852"><a class="footnote-ref" href="#fn:852">852</a></sup></p> +<p>Something<sup id="fnref:853"><a class="footnote-ref" href="#fn:853">853</a></sup></p> +<p>Something<sup id="fnref:854"><a class="footnote-ref" href="#fn:854">854</a></sup></p> +<p>Something<sup id="fnref:855"><a class="footnote-ref" href="#fn:855">855</a></sup></p> +<p>Something<sup id="fnref:856"><a class="footnote-ref" href="#fn:856">856</a></sup></p> +<p>Something<sup id="fnref:857"><a class="footnote-ref" href="#fn:857">857</a></sup></p> +<p>Something<sup id="fnref:858"><a class="footnote-ref" href="#fn:858">858</a></sup></p> +<p>Something<sup id="fnref:859"><a class="footnote-ref" href="#fn:859">859</a></sup></p> +<p>Something<sup id="fnref:860"><a class="footnote-ref" href="#fn:860">860</a></sup></p> +<p>Something<sup id="fnref:861"><a class="footnote-ref" href="#fn:861">861</a></sup></p> +<p>Something<sup id="fnref:862"><a class="footnote-ref" href="#fn:862">862</a></sup></p> +<p>Something<sup id="fnref:863"><a class="footnote-ref" href="#fn:863">863</a></sup></p> +<p>Something<sup id="fnref:864"><a class="footnote-ref" href="#fn:864">864</a></sup></p> +<p>Something<sup id="fnref:865"><a class="footnote-ref" href="#fn:865">865</a></sup></p> +<p>Something<sup id="fnref:866"><a class="footnote-ref" href="#fn:866">866</a></sup></p> +<p>Something<sup id="fnref:867"><a class="footnote-ref" href="#fn:867">867</a></sup></p> +<p>Something<sup id="fnref:868"><a class="footnote-ref" href="#fn:868">868</a></sup></p> +<p>Something<sup id="fnref:869"><a class="footnote-ref" href="#fn:869">869</a></sup></p> +<p>Something<sup id="fnref:870"><a class="footnote-ref" href="#fn:870">870</a></sup></p> +<p>Something<sup id="fnref:871"><a class="footnote-ref" href="#fn:871">871</a></sup></p> +<p>Something<sup id="fnref:872"><a class="footnote-ref" href="#fn:872">872</a></sup></p> +<p>Something<sup id="fnref:873"><a class="footnote-ref" href="#fn:873">873</a></sup></p> +<p>Something<sup id="fnref:874"><a class="footnote-ref" href="#fn:874">874</a></sup></p> +<p>Something<sup id="fnref:875"><a class="footnote-ref" href="#fn:875">875</a></sup></p> +<p>Something<sup id="fnref:876"><a class="footnote-ref" href="#fn:876">876</a></sup></p> +<p>Something<sup id="fnref:877"><a class="footnote-ref" href="#fn:877">877</a></sup></p> +<p>Something<sup id="fnref:878"><a class="footnote-ref" href="#fn:878">878</a></sup></p> +<p>Something<sup id="fnref:879"><a class="footnote-ref" href="#fn:879">879</a></sup></p> +<p>Something<sup id="fnref:880"><a class="footnote-ref" href="#fn:880">880</a></sup></p> +<p>Something<sup id="fnref:881"><a class="footnote-ref" href="#fn:881">881</a></sup></p> +<p>Something<sup id="fnref:882"><a class="footnote-ref" href="#fn:882">882</a></sup></p> +<p>Something<sup id="fnref:883"><a class="footnote-ref" href="#fn:883">883</a></sup></p> +<p>Something<sup id="fnref:884"><a class="footnote-ref" href="#fn:884">884</a></sup></p> +<p>Something<sup id="fnref:885"><a class="footnote-ref" href="#fn:885">885</a></sup></p> +<p>Something<sup id="fnref:886"><a class="footnote-ref" href="#fn:886">886</a></sup></p> +<p>Something<sup id="fnref:887"><a class="footnote-ref" href="#fn:887">887</a></sup></p> +<p>Something<sup id="fnref:888"><a class="footnote-ref" href="#fn:888">888</a></sup></p> +<p>Something<sup id="fnref:889"><a class="footnote-ref" href="#fn:889">889</a></sup></p> +<p>Something<sup id="fnref:890"><a class="footnote-ref" href="#fn:890">890</a></sup></p> +<p>Something<sup id="fnref:891"><a class="footnote-ref" href="#fn:891">891</a></sup></p> +<p>Something<sup id="fnref:892"><a class="footnote-ref" href="#fn:892">892</a></sup></p> +<p>Something<sup id="fnref:893"><a class="footnote-ref" href="#fn:893">893</a></sup></p> +<p>Something<sup id="fnref:894"><a class="footnote-ref" href="#fn:894">894</a></sup></p> +<p>Something<sup id="fnref:895"><a class="footnote-ref" href="#fn:895">895</a></sup></p> +<p>Something<sup id="fnref:896"><a class="footnote-ref" href="#fn:896">896</a></sup></p> +<p>Something<sup id="fnref:897"><a class="footnote-ref" href="#fn:897">897</a></sup></p> +<p>Something<sup id="fnref:898"><a class="footnote-ref" href="#fn:898">898</a></sup></p> +<p>Something<sup id="fnref:899"><a class="footnote-ref" href="#fn:899">899</a></sup></p> +<p>Something<sup id="fnref:900"><a class="footnote-ref" href="#fn:900">900</a></sup></p> +<p>Something<sup id="fnref:901"><a class="footnote-ref" href="#fn:901">901</a></sup></p> +<p>Something<sup id="fnref:902"><a class="footnote-ref" href="#fn:902">902</a></sup></p> +<p>Something<sup id="fnref:903"><a class="footnote-ref" href="#fn:903">903</a></sup></p> +<p>Something<sup id="fnref:904"><a class="footnote-ref" href="#fn:904">904</a></sup></p> +<p>Something<sup id="fnref:905"><a class="footnote-ref" href="#fn:905">905</a></sup></p> +<p>Something<sup id="fnref:906"><a class="footnote-ref" href="#fn:906">906</a></sup></p> +<p>Something<sup id="fnref:907"><a class="footnote-ref" href="#fn:907">907</a></sup></p> +<p>Something<sup id="fnref:908"><a class="footnote-ref" href="#fn:908">908</a></sup></p> +<p>Something<sup id="fnref:909"><a class="footnote-ref" href="#fn:909">909</a></sup></p> +<p>Something<sup id="fnref:910"><a class="footnote-ref" href="#fn:910">910</a></sup></p> +<p>Something<sup id="fnref:911"><a class="footnote-ref" href="#fn:911">911</a></sup></p> +<p>Something<sup id="fnref:912"><a class="footnote-ref" href="#fn:912">912</a></sup></p> +<p>Something<sup id="fnref:913"><a class="footnote-ref" href="#fn:913">913</a></sup></p> +<p>Something<sup id="fnref:914"><a class="footnote-ref" href="#fn:914">914</a></sup></p> +<p>Something<sup id="fnref:915"><a class="footnote-ref" href="#fn:915">915</a></sup></p> +<p>Something<sup id="fnref:916"><a class="footnote-ref" href="#fn:916">916</a></sup></p> +<p>Something<sup id="fnref:917"><a class="footnote-ref" href="#fn:917">917</a></sup></p> +<p>Something<sup id="fnref:918"><a class="footnote-ref" href="#fn:918">918</a></sup></p> +<p>Something<sup id="fnref:919"><a class="footnote-ref" href="#fn:919">919</a></sup></p> +<p>Something<sup id="fnref:920"><a class="footnote-ref" href="#fn:920">920</a></sup></p> +<p>Something<sup id="fnref:921"><a class="footnote-ref" href="#fn:921">921</a></sup></p> +<p>Something<sup id="fnref:922"><a class="footnote-ref" href="#fn:922">922</a></sup></p> +<p>Something<sup id="fnref:923"><a class="footnote-ref" href="#fn:923">923</a></sup></p> +<p>Something<sup id="fnref:924"><a class="footnote-ref" href="#fn:924">924</a></sup></p> +<p>Something<sup id="fnref:925"><a class="footnote-ref" href="#fn:925">925</a></sup></p> +<p>Something<sup id="fnref:926"><a class="footnote-ref" href="#fn:926">926</a></sup></p> +<p>Something<sup id="fnref:927"><a class="footnote-ref" href="#fn:927">927</a></sup></p> +<p>Something<sup id="fnref:928"><a class="footnote-ref" href="#fn:928">928</a></sup></p> +<p>Something<sup id="fnref:929"><a class="footnote-ref" href="#fn:929">929</a></sup></p> +<p>Something<sup id="fnref:930"><a class="footnote-ref" href="#fn:930">930</a></sup></p> +<p>Something<sup id="fnref:931"><a class="footnote-ref" href="#fn:931">931</a></sup></p> +<p>Something<sup id="fnref:932"><a class="footnote-ref" href="#fn:932">932</a></sup></p> +<p>Something<sup id="fnref:933"><a class="footnote-ref" href="#fn:933">933</a></sup></p> +<p>Something<sup id="fnref:934"><a class="footnote-ref" href="#fn:934">934</a></sup></p> +<p>Something<sup id="fnref:935"><a class="footnote-ref" href="#fn:935">935</a></sup></p> +<p>Something<sup id="fnref:936"><a class="footnote-ref" href="#fn:936">936</a></sup></p> +<p>Something<sup id="fnref:937"><a class="footnote-ref" href="#fn:937">937</a></sup></p> +<p>Something<sup id="fnref:938"><a class="footnote-ref" href="#fn:938">938</a></sup></p> +<p>Something<sup id="fnref:939"><a class="footnote-ref" href="#fn:939">939</a></sup></p> +<p>Something<sup id="fnref:940"><a class="footnote-ref" href="#fn:940">940</a></sup></p> +<p>Something<sup id="fnref:941"><a class="footnote-ref" href="#fn:941">941</a></sup></p> +<p>Something<sup id="fnref:942"><a class="footnote-ref" href="#fn:942">942</a></sup></p> +<p>Something<sup id="fnref:943"><a class="footnote-ref" href="#fn:943">943</a></sup></p> +<p>Something<sup id="fnref:944"><a class="footnote-ref" href="#fn:944">944</a></sup></p> +<p>Something<sup id="fnref:945"><a class="footnote-ref" href="#fn:945">945</a></sup></p> +<p>Something<sup id="fnref:946"><a class="footnote-ref" href="#fn:946">946</a></sup></p> +<p>Something<sup id="fnref:947"><a class="footnote-ref" href="#fn:947">947</a></sup></p> +<p>Something<sup id="fnref:948"><a class="footnote-ref" href="#fn:948">948</a></sup></p> +<p>Something<sup id="fnref:949"><a class="footnote-ref" href="#fn:949">949</a></sup></p> +<p>Something<sup id="fnref:950"><a class="footnote-ref" href="#fn:950">950</a></sup></p> +<p>Something<sup id="fnref:951"><a class="footnote-ref" href="#fn:951">951</a></sup></p> +<p>Something<sup id="fnref:952"><a class="footnote-ref" href="#fn:952">952</a></sup></p> +<p>Something<sup id="fnref:953"><a class="footnote-ref" href="#fn:953">953</a></sup></p> +<p>Something<sup id="fnref:954"><a class="footnote-ref" href="#fn:954">954</a></sup></p> +<p>Something<sup id="fnref:955"><a class="footnote-ref" href="#fn:955">955</a></sup></p> +<p>Something<sup id="fnref:956"><a class="footnote-ref" href="#fn:956">956</a></sup></p> +<p>Something<sup id="fnref:957"><a class="footnote-ref" href="#fn:957">957</a></sup></p> +<p>Something<sup id="fnref:958"><a class="footnote-ref" href="#fn:958">958</a></sup></p> +<p>Something<sup id="fnref:959"><a class="footnote-ref" href="#fn:959">959</a></sup></p> +<p>Something<sup id="fnref:960"><a class="footnote-ref" href="#fn:960">960</a></sup></p> +<p>Something<sup id="fnref:961"><a class="footnote-ref" href="#fn:961">961</a></sup></p> +<p>Something<sup id="fnref:962"><a class="footnote-ref" href="#fn:962">962</a></sup></p> +<p>Something<sup id="fnref:963"><a class="footnote-ref" href="#fn:963">963</a></sup></p> +<p>Something<sup id="fnref:964"><a class="footnote-ref" href="#fn:964">964</a></sup></p> +<p>Something<sup id="fnref:965"><a class="footnote-ref" href="#fn:965">965</a></sup></p> +<p>Something<sup id="fnref:966"><a class="footnote-ref" href="#fn:966">966</a></sup></p> +<p>Something<sup id="fnref:967"><a class="footnote-ref" href="#fn:967">967</a></sup></p> +<p>Something<sup id="fnref:968"><a class="footnote-ref" href="#fn:968">968</a></sup></p> +<p>Something<sup id="fnref:969"><a class="footnote-ref" href="#fn:969">969</a></sup></p> +<p>Something<sup id="fnref:970"><a class="footnote-ref" href="#fn:970">970</a></sup></p> +<p>Something<sup id="fnref:971"><a class="footnote-ref" href="#fn:971">971</a></sup></p> +<p>Something<sup id="fnref:972"><a class="footnote-ref" href="#fn:972">972</a></sup></p> +<p>Something<sup id="fnref:973"><a class="footnote-ref" href="#fn:973">973</a></sup></p> +<p>Something<sup id="fnref:974"><a class="footnote-ref" href="#fn:974">974</a></sup></p> +<p>Something<sup id="fnref:975"><a class="footnote-ref" href="#fn:975">975</a></sup></p> +<p>Something<sup id="fnref:976"><a class="footnote-ref" href="#fn:976">976</a></sup></p> +<p>Something<sup id="fnref:977"><a class="footnote-ref" href="#fn:977">977</a></sup></p> +<p>Something<sup id="fnref:978"><a class="footnote-ref" href="#fn:978">978</a></sup></p> +<p>Something<sup id="fnref:979"><a class="footnote-ref" href="#fn:979">979</a></sup></p> +<p>Something<sup id="fnref:980"><a class="footnote-ref" href="#fn:980">980</a></sup></p> +<p>Something<sup id="fnref:981"><a class="footnote-ref" href="#fn:981">981</a></sup></p> +<p>Something<sup id="fnref:982"><a class="footnote-ref" href="#fn:982">982</a></sup></p> +<p>Something<sup id="fnref:983"><a class="footnote-ref" href="#fn:983">983</a></sup></p> +<p>Something<sup id="fnref:984"><a class="footnote-ref" href="#fn:984">984</a></sup></p> +<p>Something<sup id="fnref:985"><a class="footnote-ref" href="#fn:985">985</a></sup></p> +<p>Something<sup id="fnref:986"><a class="footnote-ref" href="#fn:986">986</a></sup></p> +<p>Something<sup id="fnref:987"><a class="footnote-ref" href="#fn:987">987</a></sup></p> +<p>Something<sup id="fnref:988"><a class="footnote-ref" href="#fn:988">988</a></sup></p> +<p>Something<sup id="fnref:989"><a class="footnote-ref" href="#fn:989">989</a></sup></p> +<p>Something<sup id="fnref:990"><a class="footnote-ref" href="#fn:990">990</a></sup></p> +<p>Something<sup id="fnref:991"><a class="footnote-ref" href="#fn:991">991</a></sup></p> +<p>Something<sup id="fnref:992"><a class="footnote-ref" href="#fn:992">992</a></sup></p> +<p>Something<sup id="fnref:993"><a class="footnote-ref" href="#fn:993">993</a></sup></p> +<p>Something<sup id="fnref:994"><a class="footnote-ref" href="#fn:994">994</a></sup></p> +<p>Something<sup id="fnref:995"><a class="footnote-ref" href="#fn:995">995</a></sup></p> +<p>Something<sup id="fnref:996"><a class="footnote-ref" href="#fn:996">996</a></sup></p> +<p>Something<sup id="fnref:997"><a class="footnote-ref" href="#fn:997">997</a></sup></p> +<p>Something<sup id="fnref:998"><a class="footnote-ref" href="#fn:998">998</a></sup></p> +<p>Something<sup id="fnref:999"><a class="footnote-ref" href="#fn:999">999</a></sup></p> +<p>Something<sup id="fnref:1000"><a class="footnote-ref" href="#fn:1000">1000</a></sup></p> +<p>Something<sup id="fnref:1001"><a class="footnote-ref" href="#fn:1001">1001</a></sup></p> +<p>Something<sup id="fnref:1002"><a class="footnote-ref" href="#fn:1002">1002</a></sup></p> +<p>Something<sup id="fnref:1003"><a class="footnote-ref" href="#fn:1003">1003</a></sup></p> +<p>Something<sup id="fnref:1004"><a class="footnote-ref" href="#fn:1004">1004</a></sup></p> +<p>Something<sup id="fnref:1005"><a class="footnote-ref" href="#fn:1005">1005</a></sup></p> +<p>Something<sup id="fnref:1006"><a class="footnote-ref" href="#fn:1006">1006</a></sup></p> +<p>Something<sup id="fnref:1007"><a class="footnote-ref" href="#fn:1007">1007</a></sup></p> +<p>Something<sup id="fnref:1008"><a class="footnote-ref" href="#fn:1008">1008</a></sup></p> +<p>Something<sup id="fnref:1009"><a class="footnote-ref" href="#fn:1009">1009</a></sup></p> +<p>Something<sup id="fnref:1010"><a class="footnote-ref" href="#fn:1010">1010</a></sup></p> +<p>Something<sup id="fnref:1011"><a class="footnote-ref" href="#fn:1011">1011</a></sup></p> +<p>Something<sup id="fnref:1012"><a class="footnote-ref" href="#fn:1012">1012</a></sup></p> +<p>Something<sup id="fnref:1013"><a class="footnote-ref" href="#fn:1013">1013</a></sup></p> +<p>Something<sup id="fnref:1014"><a class="footnote-ref" href="#fn:1014">1014</a></sup></p> +<p>Something<sup id="fnref:1015"><a class="footnote-ref" href="#fn:1015">1015</a></sup></p> +<p>Something<sup id="fnref:1016"><a class="footnote-ref" href="#fn:1016">1016</a></sup></p> +<p>Something<sup id="fnref:1017"><a class="footnote-ref" href="#fn:1017">1017</a></sup></p> +<p>Something<sup id="fnref:1018"><a class="footnote-ref" href="#fn:1018">1018</a></sup></p> +<p>Something<sup id="fnref:1019"><a class="footnote-ref" href="#fn:1019">1019</a></sup></p> +<p>Something<sup id="fnref:1020"><a class="footnote-ref" href="#fn:1020">1020</a></sup></p> +<p>Something<sup id="fnref:1021"><a class="footnote-ref" href="#fn:1021">1021</a></sup></p> +<p>Something<sup id="fnref:1022"><a class="footnote-ref" href="#fn:1022">1022</a></sup></p> +<p>Something<sup id="fnref:1023"><a class="footnote-ref" href="#fn:1023">1023</a></sup></p> +<p>Something<sup id="fnref:1024"><a class="footnote-ref" href="#fn:1024">1024</a></sup></p> +<p>Something<sup id="fnref:1025"><a class="footnote-ref" href="#fn:1025">1025</a></sup></p> +<p>Something<sup id="fnref:1026"><a class="footnote-ref" href="#fn:1026">1026</a></sup></p> +<p>Something<sup id="fnref:1027"><a class="footnote-ref" href="#fn:1027">1027</a></sup></p> +<p>Something<sup id="fnref:1028"><a class="footnote-ref" href="#fn:1028">1028</a></sup></p> +<p>Something<sup id="fnref:1029"><a class="footnote-ref" href="#fn:1029">1029</a></sup></p> +<p>Something<sup id="fnref:1030"><a class="footnote-ref" href="#fn:1030">1030</a></sup></p> +<p>Something<sup id="fnref:1031"><a class="footnote-ref" href="#fn:1031">1031</a></sup></p> +<p>Something<sup id="fnref:1032"><a class="footnote-ref" href="#fn:1032">1032</a></sup></p> +<p>Something<sup id="fnref:1033"><a class="footnote-ref" href="#fn:1033">1033</a></sup></p> +<p>Something<sup id="fnref:1034"><a class="footnote-ref" href="#fn:1034">1034</a></sup></p> +<p>Something<sup id="fnref:1035"><a class="footnote-ref" href="#fn:1035">1035</a></sup></p> +<p>Something<sup id="fnref:1036"><a class="footnote-ref" href="#fn:1036">1036</a></sup></p> +<p>Something<sup id="fnref:1037"><a class="footnote-ref" href="#fn:1037">1037</a></sup></p> +<p>Something<sup id="fnref:1038"><a class="footnote-ref" href="#fn:1038">1038</a></sup></p> +<p>Something<sup id="fnref:1039"><a class="footnote-ref" href="#fn:1039">1039</a></sup></p> +<p>Something<sup id="fnref:1040"><a class="footnote-ref" href="#fn:1040">1040</a></sup></p> +<p>Something<sup id="fnref:1041"><a class="footnote-ref" href="#fn:1041">1041</a></sup></p> +<p>Something<sup id="fnref:1042"><a class="footnote-ref" href="#fn:1042">1042</a></sup></p> +<p>Something<sup id="fnref:1043"><a class="footnote-ref" href="#fn:1043">1043</a></sup></p> +<p>Something<sup id="fnref:1044"><a class="footnote-ref" href="#fn:1044">1044</a></sup></p> +<p>Something<sup id="fnref:1045"><a class="footnote-ref" href="#fn:1045">1045</a></sup></p> +<p>Something<sup id="fnref:1046"><a class="footnote-ref" href="#fn:1046">1046</a></sup></p> +<p>Something<sup id="fnref:1047"><a class="footnote-ref" href="#fn:1047">1047</a></sup></p> +<p>Something<sup id="fnref:1048"><a class="footnote-ref" href="#fn:1048">1048</a></sup></p> +<p>Something<sup id="fnref:1049"><a class="footnote-ref" href="#fn:1049">1049</a></sup></p> +<p>Something<sup id="fnref:1050"><a class="footnote-ref" href="#fn:1050">1050</a></sup></p> +<p>Something<sup id="fnref:1051"><a class="footnote-ref" href="#fn:1051">1051</a></sup></p> +<p>Something<sup id="fnref:1052"><a class="footnote-ref" href="#fn:1052">1052</a></sup></p> +<p>Something<sup id="fnref:1053"><a class="footnote-ref" href="#fn:1053">1053</a></sup></p> +<p>Something<sup id="fnref:1054"><a class="footnote-ref" href="#fn:1054">1054</a></sup></p> +<p>Something<sup id="fnref:1055"><a class="footnote-ref" href="#fn:1055">1055</a></sup></p> +<p>Something<sup id="fnref:1056"><a class="footnote-ref" href="#fn:1056">1056</a></sup></p> +<p>Something<sup id="fnref:1057"><a class="footnote-ref" href="#fn:1057">1057</a></sup></p> +<p>Something<sup id="fnref:1058"><a class="footnote-ref" href="#fn:1058">1058</a></sup></p> +<p>Something<sup id="fnref:1059"><a class="footnote-ref" href="#fn:1059">1059</a></sup></p> +<p>Something<sup id="fnref:1060"><a class="footnote-ref" href="#fn:1060">1060</a></sup></p> +<p>Something<sup id="fnref:1061"><a class="footnote-ref" href="#fn:1061">1061</a></sup></p> +<p>Something<sup id="fnref:1062"><a class="footnote-ref" href="#fn:1062">1062</a></sup></p> +<p>Something<sup id="fnref:1063"><a class="footnote-ref" href="#fn:1063">1063</a></sup></p> +<p>Something<sup id="fnref:1064"><a class="footnote-ref" href="#fn:1064">1064</a></sup></p> +<p>Something<sup id="fnref:1065"><a class="footnote-ref" href="#fn:1065">1065</a></sup></p> +<p>Something<sup id="fnref:1066"><a class="footnote-ref" href="#fn:1066">1066</a></sup></p> +<p>Something<sup id="fnref:1067"><a class="footnote-ref" href="#fn:1067">1067</a></sup></p> +<p>Something<sup id="fnref:1068"><a class="footnote-ref" href="#fn:1068">1068</a></sup></p> +<p>Something<sup id="fnref:1069"><a class="footnote-ref" href="#fn:1069">1069</a></sup></p> +<p>Something<sup id="fnref:1070"><a class="footnote-ref" href="#fn:1070">1070</a></sup></p> +<p>Something<sup id="fnref:1071"><a class="footnote-ref" href="#fn:1071">1071</a></sup></p> +<p>Something<sup id="fnref:1072"><a class="footnote-ref" href="#fn:1072">1072</a></sup></p> +<p>Something<sup id="fnref:1073"><a class="footnote-ref" href="#fn:1073">1073</a></sup></p> +<p>Something<sup id="fnref:1074"><a class="footnote-ref" href="#fn:1074">1074</a></sup></p> +<p>Something<sup id="fnref:1075"><a class="footnote-ref" href="#fn:1075">1075</a></sup></p> +<p>Something<sup id="fnref:1076"><a class="footnote-ref" href="#fn:1076">1076</a></sup></p> +<p>Something<sup id="fnref:1077"><a class="footnote-ref" href="#fn:1077">1077</a></sup></p> +<p>Something<sup id="fnref:1078"><a class="footnote-ref" href="#fn:1078">1078</a></sup></p> +<p>Something<sup id="fnref:1079"><a class="footnote-ref" href="#fn:1079">1079</a></sup></p> +<p>Something<sup id="fnref:1080"><a class="footnote-ref" href="#fn:1080">1080</a></sup></p> +<p>Something<sup id="fnref:1081"><a class="footnote-ref" href="#fn:1081">1081</a></sup></p> +<p>Something<sup id="fnref:1082"><a class="footnote-ref" href="#fn:1082">1082</a></sup></p> +<p>Something<sup id="fnref:1083"><a class="footnote-ref" href="#fn:1083">1083</a></sup></p> +<p>Something<sup id="fnref:1084"><a class="footnote-ref" href="#fn:1084">1084</a></sup></p> +<p>Something<sup id="fnref:1085"><a class="footnote-ref" href="#fn:1085">1085</a></sup></p> +<p>Something<sup id="fnref:1086"><a class="footnote-ref" href="#fn:1086">1086</a></sup></p> +<p>Something<sup id="fnref:1087"><a class="footnote-ref" href="#fn:1087">1087</a></sup></p> +<p>Something<sup id="fnref:1088"><a class="footnote-ref" href="#fn:1088">1088</a></sup></p> +<p>Something<sup id="fnref:1089"><a class="footnote-ref" href="#fn:1089">1089</a></sup></p> +<p>Something<sup id="fnref:1090"><a class="footnote-ref" href="#fn:1090">1090</a></sup></p> +<p>Something<sup id="fnref:1091"><a class="footnote-ref" href="#fn:1091">1091</a></sup></p> +<p>Something<sup id="fnref:1092"><a class="footnote-ref" href="#fn:1092">1092</a></sup></p> +<p>Something<sup id="fnref:1093"><a class="footnote-ref" href="#fn:1093">1093</a></sup></p> +<p>Something<sup id="fnref:1094"><a class="footnote-ref" href="#fn:1094">1094</a></sup></p> +<p>Something<sup id="fnref:1095"><a class="footnote-ref" href="#fn:1095">1095</a></sup></p> +<p>Something<sup id="fnref:1096"><a class="footnote-ref" href="#fn:1096">1096</a></sup></p> +<p>Something<sup id="fnref:1097"><a class="footnote-ref" href="#fn:1097">1097</a></sup></p> +<p>Something<sup id="fnref:1098"><a class="footnote-ref" href="#fn:1098">1098</a></sup></p> +<p>Something<sup id="fnref:1099"><a class="footnote-ref" href="#fn:1099">1099</a></sup></p> +<p>Something<sup id="fnref:1100"><a class="footnote-ref" href="#fn:1100">1100</a></sup></p> +<p>Something<sup id="fnref:1101"><a class="footnote-ref" href="#fn:1101">1101</a></sup></p> +<p>Something<sup id="fnref:1102"><a class="footnote-ref" href="#fn:1102">1102</a></sup></p> +<p>Something<sup id="fnref:1103"><a class="footnote-ref" href="#fn:1103">1103</a></sup></p> +<p>Something<sup id="fnref:1104"><a class="footnote-ref" href="#fn:1104">1104</a></sup></p> +<p>Something<sup id="fnref:1105"><a class="footnote-ref" href="#fn:1105">1105</a></sup></p> +<p>Something<sup id="fnref:1106"><a class="footnote-ref" href="#fn:1106">1106</a></sup></p> +<p>Something<sup id="fnref:1107"><a class="footnote-ref" href="#fn:1107">1107</a></sup></p> +<p>Something<sup id="fnref:1108"><a class="footnote-ref" href="#fn:1108">1108</a></sup></p> +<p>Something<sup id="fnref:1109"><a class="footnote-ref" href="#fn:1109">1109</a></sup></p> +<p>Something<sup id="fnref:1110"><a class="footnote-ref" href="#fn:1110">1110</a></sup></p> +<p>Something<sup id="fnref:1111"><a class="footnote-ref" href="#fn:1111">1111</a></sup></p> +<p>Something<sup id="fnref:1112"><a class="footnote-ref" href="#fn:1112">1112</a></sup></p> +<p>Something<sup id="fnref:1113"><a class="footnote-ref" href="#fn:1113">1113</a></sup></p> +<p>Something<sup id="fnref:1114"><a class="footnote-ref" href="#fn:1114">1114</a></sup></p> +<p>Something<sup id="fnref:1115"><a class="footnote-ref" href="#fn:1115">1115</a></sup></p> +<p>Something<sup id="fnref:1116"><a class="footnote-ref" href="#fn:1116">1116</a></sup></p> +<p>Something<sup id="fnref:1117"><a class="footnote-ref" href="#fn:1117">1117</a></sup></p> +<p>Something<sup id="fnref:1118"><a class="footnote-ref" href="#fn:1118">1118</a></sup></p> +<p>Something<sup id="fnref:1119"><a class="footnote-ref" href="#fn:1119">1119</a></sup></p> +<p>Something<sup id="fnref:1120"><a class="footnote-ref" href="#fn:1120">1120</a></sup></p> +<p>Something<sup id="fnref:1121"><a class="footnote-ref" href="#fn:1121">1121</a></sup></p> +<p>Something<sup id="fnref:1122"><a class="footnote-ref" href="#fn:1122">1122</a></sup></p> +<p>Something<sup id="fnref:1123"><a class="footnote-ref" href="#fn:1123">1123</a></sup></p> +<p>Something<sup id="fnref:1124"><a class="footnote-ref" href="#fn:1124">1124</a></sup></p> +<p>Something<sup id="fnref:1125"><a class="footnote-ref" href="#fn:1125">1125</a></sup></p> +<p>Something<sup id="fnref:1126"><a class="footnote-ref" href="#fn:1126">1126</a></sup></p> +<p>Something<sup id="fnref:1127"><a class="footnote-ref" href="#fn:1127">1127</a></sup></p> +<p>Something<sup id="fnref:1128"><a class="footnote-ref" href="#fn:1128">1128</a></sup></p> +<p>Something<sup id="fnref:1129"><a class="footnote-ref" href="#fn:1129">1129</a></sup></p> +<p>Something<sup id="fnref:1130"><a class="footnote-ref" href="#fn:1130">1130</a></sup></p> +<p>Something<sup id="fnref:1131"><a class="footnote-ref" href="#fn:1131">1131</a></sup></p> +<p>Something<sup id="fnref:1132"><a class="footnote-ref" href="#fn:1132">1132</a></sup></p> +<p>Something<sup id="fnref:1133"><a class="footnote-ref" href="#fn:1133">1133</a></sup></p> +<p>Something<sup id="fnref:1134"><a class="footnote-ref" href="#fn:1134">1134</a></sup></p> +<p>Something<sup id="fnref:1135"><a class="footnote-ref" href="#fn:1135">1135</a></sup></p> +<p>Something<sup id="fnref:1136"><a class="footnote-ref" href="#fn:1136">1136</a></sup></p> +<p>Something<sup id="fnref:1137"><a class="footnote-ref" href="#fn:1137">1137</a></sup></p> +<p>Something<sup id="fnref:1138"><a class="footnote-ref" href="#fn:1138">1138</a></sup></p> +<p>Something<sup id="fnref:1139"><a class="footnote-ref" href="#fn:1139">1139</a></sup></p> +<p>Something<sup id="fnref:1140"><a class="footnote-ref" href="#fn:1140">1140</a></sup></p> +<p>Something<sup id="fnref:1141"><a class="footnote-ref" href="#fn:1141">1141</a></sup></p> +<p>Something<sup id="fnref:1142"><a class="footnote-ref" href="#fn:1142">1142</a></sup></p> +<p>Something<sup id="fnref:1143"><a class="footnote-ref" href="#fn:1143">1143</a></sup></p> +<p>Something<sup id="fnref:1144"><a class="footnote-ref" href="#fn:1144">1144</a></sup></p> +<p>Something<sup id="fnref:1145"><a class="footnote-ref" href="#fn:1145">1145</a></sup></p> +<p>Something<sup id="fnref:1146"><a class="footnote-ref" href="#fn:1146">1146</a></sup></p> +<p>Something<sup id="fnref:1147"><a class="footnote-ref" href="#fn:1147">1147</a></sup></p> +<p>Something<sup id="fnref:1148"><a class="footnote-ref" href="#fn:1148">1148</a></sup></p> +<p>Something<sup id="fnref:1149"><a class="footnote-ref" href="#fn:1149">1149</a></sup></p> +<p>Something<sup id="fnref:1150"><a class="footnote-ref" href="#fn:1150">1150</a></sup></p> +<p>Something<sup id="fnref:1151"><a class="footnote-ref" href="#fn:1151">1151</a></sup></p> +<p>Something<sup id="fnref:1152"><a class="footnote-ref" href="#fn:1152">1152</a></sup></p> +<p>Something<sup id="fnref:1153"><a class="footnote-ref" href="#fn:1153">1153</a></sup></p> +<p>Something<sup id="fnref:1154"><a class="footnote-ref" href="#fn:1154">1154</a></sup></p> +<p>Something<sup id="fnref:1155"><a class="footnote-ref" href="#fn:1155">1155</a></sup></p> +<p>Something<sup id="fnref:1156"><a class="footnote-ref" href="#fn:1156">1156</a></sup></p> +<p>Something<sup id="fnref:1157"><a class="footnote-ref" href="#fn:1157">1157</a></sup></p> +<p>Something<sup id="fnref:1158"><a class="footnote-ref" href="#fn:1158">1158</a></sup></p> +<p>Something<sup id="fnref:1159"><a class="footnote-ref" href="#fn:1159">1159</a></sup></p> +<p>Something<sup id="fnref:1160"><a class="footnote-ref" href="#fn:1160">1160</a></sup></p> +<p>Something<sup id="fnref:1161"><a class="footnote-ref" href="#fn:1161">1161</a></sup></p> +<p>Something<sup id="fnref:1162"><a class="footnote-ref" href="#fn:1162">1162</a></sup></p> +<p>Something<sup id="fnref:1163"><a class="footnote-ref" href="#fn:1163">1163</a></sup></p> +<p>Something<sup id="fnref:1164"><a class="footnote-ref" href="#fn:1164">1164</a></sup></p> +<p>Something<sup id="fnref:1165"><a class="footnote-ref" href="#fn:1165">1165</a></sup></p> +<p>Something<sup id="fnref:1166"><a class="footnote-ref" href="#fn:1166">1166</a></sup></p> +<p>Something<sup id="fnref:1167"><a class="footnote-ref" href="#fn:1167">1167</a></sup></p> +<p>Something<sup id="fnref:1168"><a class="footnote-ref" href="#fn:1168">1168</a></sup></p> +<p>Something<sup id="fnref:1169"><a class="footnote-ref" href="#fn:1169">1169</a></sup></p> +<p>Something<sup id="fnref:1170"><a class="footnote-ref" href="#fn:1170">1170</a></sup></p> +<p>Something<sup id="fnref:1171"><a class="footnote-ref" href="#fn:1171">1171</a></sup></p> +<p>Something<sup id="fnref:1172"><a class="footnote-ref" href="#fn:1172">1172</a></sup></p> +<p>Something<sup id="fnref:1173"><a class="footnote-ref" href="#fn:1173">1173</a></sup></p> +<p>Something<sup id="fnref:1174"><a class="footnote-ref" href="#fn:1174">1174</a></sup></p> +<p>Something<sup id="fnref:1175"><a class="footnote-ref" href="#fn:1175">1175</a></sup></p> +<p>Something<sup id="fnref:1176"><a class="footnote-ref" href="#fn:1176">1176</a></sup></p> +<p>Something<sup id="fnref:1177"><a class="footnote-ref" href="#fn:1177">1177</a></sup></p> +<p>Something<sup id="fnref:1178"><a class="footnote-ref" href="#fn:1178">1178</a></sup></p> +<p>Something<sup id="fnref:1179"><a class="footnote-ref" href="#fn:1179">1179</a></sup></p> +<p>Something<sup id="fnref:1180"><a class="footnote-ref" href="#fn:1180">1180</a></sup></p> +<p>Something<sup id="fnref:1181"><a class="footnote-ref" href="#fn:1181">1181</a></sup></p> +<p>Something<sup id="fnref:1182"><a class="footnote-ref" href="#fn:1182">1182</a></sup></p> +<p>Something<sup id="fnref:1183"><a class="footnote-ref" href="#fn:1183">1183</a></sup></p> +<p>Something<sup id="fnref:1184"><a class="footnote-ref" href="#fn:1184">1184</a></sup></p> +<p>Something<sup id="fnref:1185"><a class="footnote-ref" href="#fn:1185">1185</a></sup></p> +<p>Something<sup id="fnref:1186"><a class="footnote-ref" href="#fn:1186">1186</a></sup></p> +<p>Something<sup id="fnref:1187"><a class="footnote-ref" href="#fn:1187">1187</a></sup></p> +<p>Something<sup id="fnref:1188"><a class="footnote-ref" href="#fn:1188">1188</a></sup></p> +<p>Something<sup id="fnref:1189"><a class="footnote-ref" href="#fn:1189">1189</a></sup></p> +<p>Something<sup id="fnref:1190"><a class="footnote-ref" href="#fn:1190">1190</a></sup></p> +<p>Something<sup id="fnref:1191"><a class="footnote-ref" href="#fn:1191">1191</a></sup></p> +<p>Something<sup id="fnref:1192"><a class="footnote-ref" href="#fn:1192">1192</a></sup></p> +<p>Something<sup id="fnref:1193"><a class="footnote-ref" href="#fn:1193">1193</a></sup></p> +<p>Something<sup id="fnref:1194"><a class="footnote-ref" href="#fn:1194">1194</a></sup></p> +<p>Something<sup id="fnref:1195"><a class="footnote-ref" href="#fn:1195">1195</a></sup></p> +<p>Something<sup id="fnref:1196"><a class="footnote-ref" href="#fn:1196">1196</a></sup></p> +<p>Something<sup id="fnref:1197"><a class="footnote-ref" href="#fn:1197">1197</a></sup></p> +<p>Something<sup id="fnref:1198"><a class="footnote-ref" href="#fn:1198">1198</a></sup></p> +<p>Something<sup id="fnref:1199"><a class="footnote-ref" href="#fn:1199">1199</a></sup></p> +<div class="footnote"> +<hr /> +<ol> +<li id="fn:1"> +<p>Another thing <a class="footnote-backref" href="#fnref:1" title="Jump back to footnote 1 in the text">↩</a></p> +</li> +<li id="fn:2"> +<p>Another thing <a class="footnote-backref" href="#fnref:2" title="Jump back to footnote 2 in the text">↩</a></p> +</li> +<li id="fn:3"> +<p>Another thing <a class="footnote-backref" href="#fnref:3" title="Jump back to footnote 3 in the text">↩</a></p> +</li> +<li id="fn:4"> +<p>Another thing <a class="footnote-backref" href="#fnref:4" title="Jump back to footnote 4 in the text">↩</a></p> +</li> +<li id="fn:5"> +<p>Another thing <a class="footnote-backref" href="#fnref:5" title="Jump back to footnote 5 in the text">↩</a></p> +</li> +<li id="fn:6"> +<p>Another thing <a class="footnote-backref" href="#fnref:6" title="Jump back to footnote 6 in the text">↩</a></p> +</li> +<li id="fn:7"> +<p>Another thing <a class="footnote-backref" href="#fnref:7" title="Jump back to footnote 7 in the text">↩</a></p> +</li> +<li id="fn:8"> +<p>Another thing <a class="footnote-backref" href="#fnref:8" title="Jump back to footnote 8 in the text">↩</a></p> +</li> +<li id="fn:9"> +<p>Another thing <a class="footnote-backref" href="#fnref:9" title="Jump back to footnote 9 in the text">↩</a></p> +</li> +<li id="fn:10"> +<p>Another thing <a class="footnote-backref" href="#fnref:10" title="Jump back to footnote 10 in the text">↩</a></p> +</li> +<li id="fn:11"> +<p>Another thing <a class="footnote-backref" href="#fnref:11" title="Jump back to footnote 11 in the text">↩</a></p> +</li> +<li id="fn:12"> +<p>Another thing <a class="footnote-backref" href="#fnref:12" title="Jump back to footnote 12 in the text">↩</a></p> +</li> +<li id="fn:13"> +<p>Another thing <a class="footnote-backref" href="#fnref:13" title="Jump back to footnote 13 in the text">↩</a></p> +</li> +<li id="fn:14"> +<p>Another thing <a class="footnote-backref" href="#fnref:14" title="Jump back to footnote 14 in the text">↩</a></p> +</li> +<li id="fn:15"> +<p>Another thing <a class="footnote-backref" href="#fnref:15" title="Jump back to footnote 15 in the text">↩</a></p> +</li> +<li id="fn:16"> +<p>Another thing <a class="footnote-backref" href="#fnref:16" title="Jump back to footnote 16 in the text">↩</a></p> +</li> +<li id="fn:17"> +<p>Another thing <a class="footnote-backref" href="#fnref:17" title="Jump back to footnote 17 in the text">↩</a></p> +</li> +<li id="fn:18"> +<p>Another thing <a class="footnote-backref" href="#fnref:18" title="Jump back to footnote 18 in the text">↩</a></p> +</li> +<li id="fn:19"> +<p>Another thing <a class="footnote-backref" href="#fnref:19" title="Jump back to footnote 19 in the text">↩</a></p> +</li> +<li id="fn:20"> +<p>Another thing <a class="footnote-backref" href="#fnref:20" title="Jump back to footnote 20 in the text">↩</a></p> +</li> +<li id="fn:21"> +<p>Another thing <a class="footnote-backref" href="#fnref:21" title="Jump back to footnote 21 in the text">↩</a></p> +</li> +<li id="fn:22"> +<p>Another thing <a class="footnote-backref" href="#fnref:22" title="Jump back to footnote 22 in the text">↩</a></p> +</li> +<li id="fn:23"> +<p>Another thing <a class="footnote-backref" href="#fnref:23" title="Jump back to footnote 23 in the text">↩</a></p> +</li> +<li id="fn:24"> +<p>Another thing <a class="footnote-backref" href="#fnref:24" title="Jump back to footnote 24 in the text">↩</a></p> +</li> +<li id="fn:25"> +<p>Another thing <a class="footnote-backref" href="#fnref:25" title="Jump back to footnote 25 in the text">↩</a></p> +</li> +<li id="fn:26"> +<p>Another thing <a class="footnote-backref" href="#fnref:26" title="Jump back to footnote 26 in the text">↩</a></p> +</li> +<li id="fn:27"> +<p>Another thing <a class="footnote-backref" href="#fnref:27" title="Jump back to footnote 27 in the text">↩</a></p> +</li> +<li id="fn:28"> +<p>Another thing <a class="footnote-backref" href="#fnref:28" title="Jump back to footnote 28 in the text">↩</a></p> +</li> +<li id="fn:29"> +<p>Another thing <a class="footnote-backref" href="#fnref:29" title="Jump back to footnote 29 in the text">↩</a></p> +</li> +<li id="fn:30"> +<p>Another thing <a class="footnote-backref" href="#fnref:30" title="Jump back to footnote 30 in the text">↩</a></p> +</li> +<li id="fn:31"> +<p>Another thing <a class="footnote-backref" href="#fnref:31" title="Jump back to footnote 31 in the text">↩</a></p> +</li> +<li id="fn:32"> +<p>Another thing <a class="footnote-backref" href="#fnref:32" title="Jump back to footnote 32 in the text">↩</a></p> +</li> +<li id="fn:33"> +<p>Another thing <a class="footnote-backref" href="#fnref:33" title="Jump back to footnote 33 in the text">↩</a></p> +</li> +<li id="fn:34"> +<p>Another thing <a class="footnote-backref" href="#fnref:34" title="Jump back to footnote 34 in the text">↩</a></p> +</li> +<li id="fn:35"> +<p>Another thing <a class="footnote-backref" href="#fnref:35" title="Jump back to footnote 35 in the text">↩</a></p> +</li> +<li id="fn:36"> +<p>Another thing <a class="footnote-backref" href="#fnref:36" title="Jump back to footnote 36 in the text">↩</a></p> +</li> +<li id="fn:37"> +<p>Another thing <a class="footnote-backref" href="#fnref:37" title="Jump back to footnote 37 in the text">↩</a></p> +</li> +<li id="fn:38"> +<p>Another thing <a class="footnote-backref" href="#fnref:38" title="Jump back to footnote 38 in the text">↩</a></p> +</li> +<li id="fn:39"> +<p>Another thing <a class="footnote-backref" href="#fnref:39" title="Jump back to footnote 39 in the text">↩</a></p> +</li> +<li id="fn:40"> +<p>Another thing <a class="footnote-backref" href="#fnref:40" title="Jump back to footnote 40 in the text">↩</a></p> +</li> +<li id="fn:41"> +<p>Another thing <a class="footnote-backref" href="#fnref:41" title="Jump back to footnote 41 in the text">↩</a></p> +</li> +<li id="fn:42"> +<p>Another thing <a class="footnote-backref" href="#fnref:42" title="Jump back to footnote 42 in the text">↩</a></p> +</li> +<li id="fn:43"> +<p>Another thing <a class="footnote-backref" href="#fnref:43" title="Jump back to footnote 43 in the text">↩</a></p> +</li> +<li id="fn:44"> +<p>Another thing <a class="footnote-backref" href="#fnref:44" title="Jump back to footnote 44 in the text">↩</a></p> +</li> +<li id="fn:45"> +<p>Another thing <a class="footnote-backref" href="#fnref:45" title="Jump back to footnote 45 in the text">↩</a></p> +</li> +<li id="fn:46"> +<p>Another thing <a class="footnote-backref" href="#fnref:46" title="Jump back to footnote 46 in the text">↩</a></p> +</li> +<li id="fn:47"> +<p>Another thing <a class="footnote-backref" href="#fnref:47" title="Jump back to footnote 47 in the text">↩</a></p> +</li> +<li id="fn:48"> +<p>Another thing <a class="footnote-backref" href="#fnref:48" title="Jump back to footnote 48 in the text">↩</a></p> +</li> +<li id="fn:49"> +<p>Another thing <a class="footnote-backref" href="#fnref:49" title="Jump back to footnote 49 in the text">↩</a></p> +</li> +<li id="fn:50"> +<p>Another thing <a class="footnote-backref" href="#fnref:50" title="Jump back to footnote 50 in the text">↩</a></p> +</li> +<li id="fn:51"> +<p>Another thing <a class="footnote-backref" href="#fnref:51" title="Jump back to footnote 51 in the text">↩</a></p> +</li> +<li id="fn:52"> +<p>Another thing <a class="footnote-backref" href="#fnref:52" title="Jump back to footnote 52 in the text">↩</a></p> +</li> +<li id="fn:53"> +<p>Another thing <a class="footnote-backref" href="#fnref:53" title="Jump back to footnote 53 in the text">↩</a></p> +</li> +<li id="fn:54"> +<p>Another thing <a class="footnote-backref" href="#fnref:54" title="Jump back to footnote 54 in the text">↩</a></p> +</li> +<li id="fn:55"> +<p>Another thing <a class="footnote-backref" href="#fnref:55" title="Jump back to footnote 55 in the text">↩</a></p> +</li> +<li id="fn:56"> +<p>Another thing <a class="footnote-backref" href="#fnref:56" title="Jump back to footnote 56 in the text">↩</a></p> +</li> +<li id="fn:57"> +<p>Another thing <a class="footnote-backref" href="#fnref:57" title="Jump back to footnote 57 in the text">↩</a></p> +</li> +<li id="fn:58"> +<p>Another thing <a class="footnote-backref" href="#fnref:58" title="Jump back to footnote 58 in the text">↩</a></p> +</li> +<li id="fn:59"> +<p>Another thing <a class="footnote-backref" href="#fnref:59" title="Jump back to footnote 59 in the text">↩</a></p> +</li> +<li id="fn:60"> +<p>Another thing <a class="footnote-backref" href="#fnref:60" title="Jump back to footnote 60 in the text">↩</a></p> +</li> +<li id="fn:61"> +<p>Another thing <a class="footnote-backref" href="#fnref:61" title="Jump back to footnote 61 in the text">↩</a></p> +</li> +<li id="fn:62"> +<p>Another thing <a class="footnote-backref" href="#fnref:62" title="Jump back to footnote 62 in the text">↩</a></p> +</li> +<li id="fn:63"> +<p>Another thing <a class="footnote-backref" href="#fnref:63" title="Jump back to footnote 63 in the text">↩</a></p> +</li> +<li id="fn:64"> +<p>Another thing <a class="footnote-backref" href="#fnref:64" title="Jump back to footnote 64 in the text">↩</a></p> +</li> +<li id="fn:65"> +<p>Another thing <a class="footnote-backref" href="#fnref:65" title="Jump back to footnote 65 in the text">↩</a></p> +</li> +<li id="fn:66"> +<p>Another thing <a class="footnote-backref" href="#fnref:66" title="Jump back to footnote 66 in the text">↩</a></p> +</li> +<li id="fn:67"> +<p>Another thing <a class="footnote-backref" href="#fnref:67" title="Jump back to footnote 67 in the text">↩</a></p> +</li> +<li id="fn:68"> +<p>Another thing <a class="footnote-backref" href="#fnref:68" title="Jump back to footnote 68 in the text">↩</a></p> +</li> +<li id="fn:69"> +<p>Another thing <a class="footnote-backref" href="#fnref:69" title="Jump back to footnote 69 in the text">↩</a></p> +</li> +<li id="fn:70"> +<p>Another thing <a class="footnote-backref" href="#fnref:70" title="Jump back to footnote 70 in the text">↩</a></p> +</li> +<li id="fn:71"> +<p>Another thing <a class="footnote-backref" href="#fnref:71" title="Jump back to footnote 71 in the text">↩</a></p> +</li> +<li id="fn:72"> +<p>Another thing <a class="footnote-backref" href="#fnref:72" title="Jump back to footnote 72 in the text">↩</a></p> +</li> +<li id="fn:73"> +<p>Another thing <a class="footnote-backref" href="#fnref:73" title="Jump back to footnote 73 in the text">↩</a></p> +</li> +<li id="fn:74"> +<p>Another thing <a class="footnote-backref" href="#fnref:74" title="Jump back to footnote 74 in the text">↩</a></p> +</li> +<li id="fn:75"> +<p>Another thing <a class="footnote-backref" href="#fnref:75" title="Jump back to footnote 75 in the text">↩</a></p> +</li> +<li id="fn:76"> +<p>Another thing <a class="footnote-backref" href="#fnref:76" title="Jump back to footnote 76 in the text">↩</a></p> +</li> +<li id="fn:77"> +<p>Another thing <a class="footnote-backref" href="#fnref:77" title="Jump back to footnote 77 in the text">↩</a></p> +</li> +<li id="fn:78"> +<p>Another thing <a class="footnote-backref" href="#fnref:78" title="Jump back to footnote 78 in the text">↩</a></p> +</li> +<li id="fn:79"> +<p>Another thing <a class="footnote-backref" href="#fnref:79" title="Jump back to footnote 79 in the text">↩</a></p> +</li> +<li id="fn:80"> +<p>Another thing <a class="footnote-backref" href="#fnref:80" title="Jump back to footnote 80 in the text">↩</a></p> +</li> +<li id="fn:81"> +<p>Another thing <a class="footnote-backref" href="#fnref:81" title="Jump back to footnote 81 in the text">↩</a></p> +</li> +<li id="fn:82"> +<p>Another thing <a class="footnote-backref" href="#fnref:82" title="Jump back to footnote 82 in the text">↩</a></p> +</li> +<li id="fn:83"> +<p>Another thing <a class="footnote-backref" href="#fnref:83" title="Jump back to footnote 83 in the text">↩</a></p> +</li> +<li id="fn:84"> +<p>Another thing <a class="footnote-backref" href="#fnref:84" title="Jump back to footnote 84 in the text">↩</a></p> +</li> +<li id="fn:85"> +<p>Another thing <a class="footnote-backref" href="#fnref:85" title="Jump back to footnote 85 in the text">↩</a></p> +</li> +<li id="fn:86"> +<p>Another thing <a class="footnote-backref" href="#fnref:86" title="Jump back to footnote 86 in the text">↩</a></p> +</li> +<li id="fn:87"> +<p>Another thing <a class="footnote-backref" href="#fnref:87" title="Jump back to footnote 87 in the text">↩</a></p> +</li> +<li id="fn:88"> +<p>Another thing <a class="footnote-backref" href="#fnref:88" title="Jump back to footnote 88 in the text">↩</a></p> +</li> +<li id="fn:89"> +<p>Another thing <a class="footnote-backref" href="#fnref:89" title="Jump back to footnote 89 in the text">↩</a></p> +</li> +<li id="fn:90"> +<p>Another thing <a class="footnote-backref" href="#fnref:90" title="Jump back to footnote 90 in the text">↩</a></p> +</li> +<li id="fn:91"> +<p>Another thing <a class="footnote-backref" href="#fnref:91" title="Jump back to footnote 91 in the text">↩</a></p> +</li> +<li id="fn:92"> +<p>Another thing <a class="footnote-backref" href="#fnref:92" title="Jump back to footnote 92 in the text">↩</a></p> +</li> +<li id="fn:93"> +<p>Another thing <a class="footnote-backref" href="#fnref:93" title="Jump back to footnote 93 in the text">↩</a></p> +</li> +<li id="fn:94"> +<p>Another thing <a class="footnote-backref" href="#fnref:94" title="Jump back to footnote 94 in the text">↩</a></p> +</li> +<li id="fn:95"> +<p>Another thing <a class="footnote-backref" href="#fnref:95" title="Jump back to footnote 95 in the text">↩</a></p> +</li> +<li id="fn:96"> +<p>Another thing <a class="footnote-backref" href="#fnref:96" title="Jump back to footnote 96 in the text">↩</a></p> +</li> +<li id="fn:97"> +<p>Another thing <a class="footnote-backref" href="#fnref:97" title="Jump back to footnote 97 in the text">↩</a></p> +</li> +<li id="fn:98"> +<p>Another thing <a class="footnote-backref" href="#fnref:98" title="Jump back to footnote 98 in the text">↩</a></p> +</li> +<li id="fn:99"> +<p>Another thing <a class="footnote-backref" href="#fnref:99" title="Jump back to footnote 99 in the text">↩</a></p> +</li> +<li id="fn:100"> +<p>Another thing <a class="footnote-backref" href="#fnref:100" title="Jump back to footnote 100 in the text">↩</a></p> +</li> +<li id="fn:101"> +<p>Another thing <a class="footnote-backref" href="#fnref:101" title="Jump back to footnote 101 in the text">↩</a></p> +</li> +<li id="fn:102"> +<p>Another thing <a class="footnote-backref" href="#fnref:102" title="Jump back to footnote 102 in the text">↩</a></p> +</li> +<li id="fn:103"> +<p>Another thing <a class="footnote-backref" href="#fnref:103" title="Jump back to footnote 103 in the text">↩</a></p> +</li> +<li id="fn:104"> +<p>Another thing <a class="footnote-backref" href="#fnref:104" title="Jump back to footnote 104 in the text">↩</a></p> +</li> +<li id="fn:105"> +<p>Another thing <a class="footnote-backref" href="#fnref:105" title="Jump back to footnote 105 in the text">↩</a></p> +</li> +<li id="fn:106"> +<p>Another thing <a class="footnote-backref" href="#fnref:106" title="Jump back to footnote 106 in the text">↩</a></p> +</li> +<li id="fn:107"> +<p>Another thing <a class="footnote-backref" href="#fnref:107" title="Jump back to footnote 107 in the text">↩</a></p> +</li> +<li id="fn:108"> +<p>Another thing <a class="footnote-backref" href="#fnref:108" title="Jump back to footnote 108 in the text">↩</a></p> +</li> +<li id="fn:109"> +<p>Another thing <a class="footnote-backref" href="#fnref:109" title="Jump back to footnote 109 in the text">↩</a></p> +</li> +<li id="fn:110"> +<p>Another thing <a class="footnote-backref" href="#fnref:110" title="Jump back to footnote 110 in the text">↩</a></p> +</li> +<li id="fn:111"> +<p>Another thing <a class="footnote-backref" href="#fnref:111" title="Jump back to footnote 111 in the text">↩</a></p> +</li> +<li id="fn:112"> +<p>Another thing <a class="footnote-backref" href="#fnref:112" title="Jump back to footnote 112 in the text">↩</a></p> +</li> +<li id="fn:113"> +<p>Another thing <a class="footnote-backref" href="#fnref:113" title="Jump back to footnote 113 in the text">↩</a></p> +</li> +<li id="fn:114"> +<p>Another thing <a class="footnote-backref" href="#fnref:114" title="Jump back to footnote 114 in the text">↩</a></p> +</li> +<li id="fn:115"> +<p>Another thing <a class="footnote-backref" href="#fnref:115" title="Jump back to footnote 115 in the text">↩</a></p> +</li> +<li id="fn:116"> +<p>Another thing <a class="footnote-backref" href="#fnref:116" title="Jump back to footnote 116 in the text">↩</a></p> +</li> +<li id="fn:117"> +<p>Another thing <a class="footnote-backref" href="#fnref:117" title="Jump back to footnote 117 in the text">↩</a></p> +</li> +<li id="fn:118"> +<p>Another thing <a class="footnote-backref" href="#fnref:118" title="Jump back to footnote 118 in the text">↩</a></p> +</li> +<li id="fn:119"> +<p>Another thing <a class="footnote-backref" href="#fnref:119" title="Jump back to footnote 119 in the text">↩</a></p> +</li> +<li id="fn:120"> +<p>Another thing <a class="footnote-backref" href="#fnref:120" title="Jump back to footnote 120 in the text">↩</a></p> +</li> +<li id="fn:121"> +<p>Another thing <a class="footnote-backref" href="#fnref:121" title="Jump back to footnote 121 in the text">↩</a></p> +</li> +<li id="fn:122"> +<p>Another thing <a class="footnote-backref" href="#fnref:122" title="Jump back to footnote 122 in the text">↩</a></p> +</li> +<li id="fn:123"> +<p>Another thing <a class="footnote-backref" href="#fnref:123" title="Jump back to footnote 123 in the text">↩</a></p> +</li> +<li id="fn:124"> +<p>Another thing <a class="footnote-backref" href="#fnref:124" title="Jump back to footnote 124 in the text">↩</a></p> +</li> +<li id="fn:125"> +<p>Another thing <a class="footnote-backref" href="#fnref:125" title="Jump back to footnote 125 in the text">↩</a></p> +</li> +<li id="fn:126"> +<p>Another thing <a class="footnote-backref" href="#fnref:126" title="Jump back to footnote 126 in the text">↩</a></p> +</li> +<li id="fn:127"> +<p>Another thing <a class="footnote-backref" href="#fnref:127" title="Jump back to footnote 127 in the text">↩</a></p> +</li> +<li id="fn:128"> +<p>Another thing <a class="footnote-backref" href="#fnref:128" title="Jump back to footnote 128 in the text">↩</a></p> +</li> +<li id="fn:129"> +<p>Another thing <a class="footnote-backref" href="#fnref:129" title="Jump back to footnote 129 in the text">↩</a></p> +</li> +<li id="fn:130"> +<p>Another thing <a class="footnote-backref" href="#fnref:130" title="Jump back to footnote 130 in the text">↩</a></p> +</li> +<li id="fn:131"> +<p>Another thing <a class="footnote-backref" href="#fnref:131" title="Jump back to footnote 131 in the text">↩</a></p> +</li> +<li id="fn:132"> +<p>Another thing <a class="footnote-backref" href="#fnref:132" title="Jump back to footnote 132 in the text">↩</a></p> +</li> +<li id="fn:133"> +<p>Another thing <a class="footnote-backref" href="#fnref:133" title="Jump back to footnote 133 in the text">↩</a></p> +</li> +<li id="fn:134"> +<p>Another thing <a class="footnote-backref" href="#fnref:134" title="Jump back to footnote 134 in the text">↩</a></p> +</li> +<li id="fn:135"> +<p>Another thing <a class="footnote-backref" href="#fnref:135" title="Jump back to footnote 135 in the text">↩</a></p> +</li> +<li id="fn:136"> +<p>Another thing <a class="footnote-backref" href="#fnref:136" title="Jump back to footnote 136 in the text">↩</a></p> +</li> +<li id="fn:137"> +<p>Another thing <a class="footnote-backref" href="#fnref:137" title="Jump back to footnote 137 in the text">↩</a></p> +</li> +<li id="fn:138"> +<p>Another thing <a class="footnote-backref" href="#fnref:138" title="Jump back to footnote 138 in the text">↩</a></p> +</li> +<li id="fn:139"> +<p>Another thing <a class="footnote-backref" href="#fnref:139" title="Jump back to footnote 139 in the text">↩</a></p> +</li> +<li id="fn:140"> +<p>Another thing <a class="footnote-backref" href="#fnref:140" title="Jump back to footnote 140 in the text">↩</a></p> +</li> +<li id="fn:141"> +<p>Another thing <a class="footnote-backref" href="#fnref:141" title="Jump back to footnote 141 in the text">↩</a></p> +</li> +<li id="fn:142"> +<p>Another thing <a class="footnote-backref" href="#fnref:142" title="Jump back to footnote 142 in the text">↩</a></p> +</li> +<li id="fn:143"> +<p>Another thing <a class="footnote-backref" href="#fnref:143" title="Jump back to footnote 143 in the text">↩</a></p> +</li> +<li id="fn:144"> +<p>Another thing <a class="footnote-backref" href="#fnref:144" title="Jump back to footnote 144 in the text">↩</a></p> +</li> +<li id="fn:145"> +<p>Another thing <a class="footnote-backref" href="#fnref:145" title="Jump back to footnote 145 in the text">↩</a></p> +</li> +<li id="fn:146"> +<p>Another thing <a class="footnote-backref" href="#fnref:146" title="Jump back to footnote 146 in the text">↩</a></p> +</li> +<li id="fn:147"> +<p>Another thing <a class="footnote-backref" href="#fnref:147" title="Jump back to footnote 147 in the text">↩</a></p> +</li> +<li id="fn:148"> +<p>Another thing <a class="footnote-backref" href="#fnref:148" title="Jump back to footnote 148 in the text">↩</a></p> +</li> +<li id="fn:149"> +<p>Another thing <a class="footnote-backref" href="#fnref:149" title="Jump back to footnote 149 in the text">↩</a></p> +</li> +<li id="fn:150"> +<p>Another thing <a class="footnote-backref" href="#fnref:150" title="Jump back to footnote 150 in the text">↩</a></p> +</li> +<li id="fn:151"> +<p>Another thing <a class="footnote-backref" href="#fnref:151" title="Jump back to footnote 151 in the text">↩</a></p> +</li> +<li id="fn:152"> +<p>Another thing <a class="footnote-backref" href="#fnref:152" title="Jump back to footnote 152 in the text">↩</a></p> +</li> +<li id="fn:153"> +<p>Another thing <a class="footnote-backref" href="#fnref:153" title="Jump back to footnote 153 in the text">↩</a></p> +</li> +<li id="fn:154"> +<p>Another thing <a class="footnote-backref" href="#fnref:154" title="Jump back to footnote 154 in the text">↩</a></p> +</li> +<li id="fn:155"> +<p>Another thing <a class="footnote-backref" href="#fnref:155" title="Jump back to footnote 155 in the text">↩</a></p> +</li> +<li id="fn:156"> +<p>Another thing <a class="footnote-backref" href="#fnref:156" title="Jump back to footnote 156 in the text">↩</a></p> +</li> +<li id="fn:157"> +<p>Another thing <a class="footnote-backref" href="#fnref:157" title="Jump back to footnote 157 in the text">↩</a></p> +</li> +<li id="fn:158"> +<p>Another thing <a class="footnote-backref" href="#fnref:158" title="Jump back to footnote 158 in the text">↩</a></p> +</li> +<li id="fn:159"> +<p>Another thing <a class="footnote-backref" href="#fnref:159" title="Jump back to footnote 159 in the text">↩</a></p> +</li> +<li id="fn:160"> +<p>Another thing <a class="footnote-backref" href="#fnref:160" title="Jump back to footnote 160 in the text">↩</a></p> +</li> +<li id="fn:161"> +<p>Another thing <a class="footnote-backref" href="#fnref:161" title="Jump back to footnote 161 in the text">↩</a></p> +</li> +<li id="fn:162"> +<p>Another thing <a class="footnote-backref" href="#fnref:162" title="Jump back to footnote 162 in the text">↩</a></p> +</li> +<li id="fn:163"> +<p>Another thing <a class="footnote-backref" href="#fnref:163" title="Jump back to footnote 163 in the text">↩</a></p> +</li> +<li id="fn:164"> +<p>Another thing <a class="footnote-backref" href="#fnref:164" title="Jump back to footnote 164 in the text">↩</a></p> +</li> +<li id="fn:165"> +<p>Another thing <a class="footnote-backref" href="#fnref:165" title="Jump back to footnote 165 in the text">↩</a></p> +</li> +<li id="fn:166"> +<p>Another thing <a class="footnote-backref" href="#fnref:166" title="Jump back to footnote 166 in the text">↩</a></p> +</li> +<li id="fn:167"> +<p>Another thing <a class="footnote-backref" href="#fnref:167" title="Jump back to footnote 167 in the text">↩</a></p> +</li> +<li id="fn:168"> +<p>Another thing <a class="footnote-backref" href="#fnref:168" title="Jump back to footnote 168 in the text">↩</a></p> +</li> +<li id="fn:169"> +<p>Another thing <a class="footnote-backref" href="#fnref:169" title="Jump back to footnote 169 in the text">↩</a></p> +</li> +<li id="fn:170"> +<p>Another thing <a class="footnote-backref" href="#fnref:170" title="Jump back to footnote 170 in the text">↩</a></p> +</li> +<li id="fn:171"> +<p>Another thing <a class="footnote-backref" href="#fnref:171" title="Jump back to footnote 171 in the text">↩</a></p> +</li> +<li id="fn:172"> +<p>Another thing <a class="footnote-backref" href="#fnref:172" title="Jump back to footnote 172 in the text">↩</a></p> +</li> +<li id="fn:173"> +<p>Another thing <a class="footnote-backref" href="#fnref:173" title="Jump back to footnote 173 in the text">↩</a></p> +</li> +<li id="fn:174"> +<p>Another thing <a class="footnote-backref" href="#fnref:174" title="Jump back to footnote 174 in the text">↩</a></p> +</li> +<li id="fn:175"> +<p>Another thing <a class="footnote-backref" href="#fnref:175" title="Jump back to footnote 175 in the text">↩</a></p> +</li> +<li id="fn:176"> +<p>Another thing <a class="footnote-backref" href="#fnref:176" title="Jump back to footnote 176 in the text">↩</a></p> +</li> +<li id="fn:177"> +<p>Another thing <a class="footnote-backref" href="#fnref:177" title="Jump back to footnote 177 in the text">↩</a></p> +</li> +<li id="fn:178"> +<p>Another thing <a class="footnote-backref" href="#fnref:178" title="Jump back to footnote 178 in the text">↩</a></p> +</li> +<li id="fn:179"> +<p>Another thing <a class="footnote-backref" href="#fnref:179" title="Jump back to footnote 179 in the text">↩</a></p> +</li> +<li id="fn:180"> +<p>Another thing <a class="footnote-backref" href="#fnref:180" title="Jump back to footnote 180 in the text">↩</a></p> +</li> +<li id="fn:181"> +<p>Another thing <a class="footnote-backref" href="#fnref:181" title="Jump back to footnote 181 in the text">↩</a></p> +</li> +<li id="fn:182"> +<p>Another thing <a class="footnote-backref" href="#fnref:182" title="Jump back to footnote 182 in the text">↩</a></p> +</li> +<li id="fn:183"> +<p>Another thing <a class="footnote-backref" href="#fnref:183" title="Jump back to footnote 183 in the text">↩</a></p> +</li> +<li id="fn:184"> +<p>Another thing <a class="footnote-backref" href="#fnref:184" title="Jump back to footnote 184 in the text">↩</a></p> +</li> +<li id="fn:185"> +<p>Another thing <a class="footnote-backref" href="#fnref:185" title="Jump back to footnote 185 in the text">↩</a></p> +</li> +<li id="fn:186"> +<p>Another thing <a class="footnote-backref" href="#fnref:186" title="Jump back to footnote 186 in the text">↩</a></p> +</li> +<li id="fn:187"> +<p>Another thing <a class="footnote-backref" href="#fnref:187" title="Jump back to footnote 187 in the text">↩</a></p> +</li> +<li id="fn:188"> +<p>Another thing <a class="footnote-backref" href="#fnref:188" title="Jump back to footnote 188 in the text">↩</a></p> +</li> +<li id="fn:189"> +<p>Another thing <a class="footnote-backref" href="#fnref:189" title="Jump back to footnote 189 in the text">↩</a></p> +</li> +<li id="fn:190"> +<p>Another thing <a class="footnote-backref" href="#fnref:190" title="Jump back to footnote 190 in the text">↩</a></p> +</li> +<li id="fn:191"> +<p>Another thing <a class="footnote-backref" href="#fnref:191" title="Jump back to footnote 191 in the text">↩</a></p> +</li> +<li id="fn:192"> +<p>Another thing <a class="footnote-backref" href="#fnref:192" title="Jump back to footnote 192 in the text">↩</a></p> +</li> +<li id="fn:193"> +<p>Another thing <a class="footnote-backref" href="#fnref:193" title="Jump back to footnote 193 in the text">↩</a></p> +</li> +<li id="fn:194"> +<p>Another thing <a class="footnote-backref" href="#fnref:194" title="Jump back to footnote 194 in the text">↩</a></p> +</li> +<li id="fn:195"> +<p>Another thing <a class="footnote-backref" href="#fnref:195" title="Jump back to footnote 195 in the text">↩</a></p> +</li> +<li id="fn:196"> +<p>Another thing <a class="footnote-backref" href="#fnref:196" title="Jump back to footnote 196 in the text">↩</a></p> +</li> +<li id="fn:197"> +<p>Another thing <a class="footnote-backref" href="#fnref:197" title="Jump back to footnote 197 in the text">↩</a></p> +</li> +<li id="fn:198"> +<p>Another thing <a class="footnote-backref" href="#fnref:198" title="Jump back to footnote 198 in the text">↩</a></p> +</li> +<li id="fn:199"> +<p>Another thing <a class="footnote-backref" href="#fnref:199" title="Jump back to footnote 199 in the text">↩</a></p> +</li> +<li id="fn:200"> +<p>Another thing <a class="footnote-backref" href="#fnref:200" title="Jump back to footnote 200 in the text">↩</a></p> +</li> +<li id="fn:201"> +<p>Another thing <a class="footnote-backref" href="#fnref:201" title="Jump back to footnote 201 in the text">↩</a></p> +</li> +<li id="fn:202"> +<p>Another thing <a class="footnote-backref" href="#fnref:202" title="Jump back to footnote 202 in the text">↩</a></p> +</li> +<li id="fn:203"> +<p>Another thing <a class="footnote-backref" href="#fnref:203" title="Jump back to footnote 203 in the text">↩</a></p> +</li> +<li id="fn:204"> +<p>Another thing <a class="footnote-backref" href="#fnref:204" title="Jump back to footnote 204 in the text">↩</a></p> +</li> +<li id="fn:205"> +<p>Another thing <a class="footnote-backref" href="#fnref:205" title="Jump back to footnote 205 in the text">↩</a></p> +</li> +<li id="fn:206"> +<p>Another thing <a class="footnote-backref" href="#fnref:206" title="Jump back to footnote 206 in the text">↩</a></p> +</li> +<li id="fn:207"> +<p>Another thing <a class="footnote-backref" href="#fnref:207" title="Jump back to footnote 207 in the text">↩</a></p> +</li> +<li id="fn:208"> +<p>Another thing <a class="footnote-backref" href="#fnref:208" title="Jump back to footnote 208 in the text">↩</a></p> +</li> +<li id="fn:209"> +<p>Another thing <a class="footnote-backref" href="#fnref:209" title="Jump back to footnote 209 in the text">↩</a></p> +</li> +<li id="fn:210"> +<p>Another thing <a class="footnote-backref" href="#fnref:210" title="Jump back to footnote 210 in the text">↩</a></p> +</li> +<li id="fn:211"> +<p>Another thing <a class="footnote-backref" href="#fnref:211" title="Jump back to footnote 211 in the text">↩</a></p> +</li> +<li id="fn:212"> +<p>Another thing <a class="footnote-backref" href="#fnref:212" title="Jump back to footnote 212 in the text">↩</a></p> +</li> +<li id="fn:213"> +<p>Another thing <a class="footnote-backref" href="#fnref:213" title="Jump back to footnote 213 in the text">↩</a></p> +</li> +<li id="fn:214"> +<p>Another thing <a class="footnote-backref" href="#fnref:214" title="Jump back to footnote 214 in the text">↩</a></p> +</li> +<li id="fn:215"> +<p>Another thing <a class="footnote-backref" href="#fnref:215" title="Jump back to footnote 215 in the text">↩</a></p> +</li> +<li id="fn:216"> +<p>Another thing <a class="footnote-backref" href="#fnref:216" title="Jump back to footnote 216 in the text">↩</a></p> +</li> +<li id="fn:217"> +<p>Another thing <a class="footnote-backref" href="#fnref:217" title="Jump back to footnote 217 in the text">↩</a></p> +</li> +<li id="fn:218"> +<p>Another thing <a class="footnote-backref" href="#fnref:218" title="Jump back to footnote 218 in the text">↩</a></p> +</li> +<li id="fn:219"> +<p>Another thing <a class="footnote-backref" href="#fnref:219" title="Jump back to footnote 219 in the text">↩</a></p> +</li> +<li id="fn:220"> +<p>Another thing <a class="footnote-backref" href="#fnref:220" title="Jump back to footnote 220 in the text">↩</a></p> +</li> +<li id="fn:221"> +<p>Another thing <a class="footnote-backref" href="#fnref:221" title="Jump back to footnote 221 in the text">↩</a></p> +</li> +<li id="fn:222"> +<p>Another thing <a class="footnote-backref" href="#fnref:222" title="Jump back to footnote 222 in the text">↩</a></p> +</li> +<li id="fn:223"> +<p>Another thing <a class="footnote-backref" href="#fnref:223" title="Jump back to footnote 223 in the text">↩</a></p> +</li> +<li id="fn:224"> +<p>Another thing <a class="footnote-backref" href="#fnref:224" title="Jump back to footnote 224 in the text">↩</a></p> +</li> +<li id="fn:225"> +<p>Another thing <a class="footnote-backref" href="#fnref:225" title="Jump back to footnote 225 in the text">↩</a></p> +</li> +<li id="fn:226"> +<p>Another thing <a class="footnote-backref" href="#fnref:226" title="Jump back to footnote 226 in the text">↩</a></p> +</li> +<li id="fn:227"> +<p>Another thing <a class="footnote-backref" href="#fnref:227" title="Jump back to footnote 227 in the text">↩</a></p> +</li> +<li id="fn:228"> +<p>Another thing <a class="footnote-backref" href="#fnref:228" title="Jump back to footnote 228 in the text">↩</a></p> +</li> +<li id="fn:229"> +<p>Another thing <a class="footnote-backref" href="#fnref:229" title="Jump back to footnote 229 in the text">↩</a></p> +</li> +<li id="fn:230"> +<p>Another thing <a class="footnote-backref" href="#fnref:230" title="Jump back to footnote 230 in the text">↩</a></p> +</li> +<li id="fn:231"> +<p>Another thing <a class="footnote-backref" href="#fnref:231" title="Jump back to footnote 231 in the text">↩</a></p> +</li> +<li id="fn:232"> +<p>Another thing <a class="footnote-backref" href="#fnref:232" title="Jump back to footnote 232 in the text">↩</a></p> +</li> +<li id="fn:233"> +<p>Another thing <a class="footnote-backref" href="#fnref:233" title="Jump back to footnote 233 in the text">↩</a></p> +</li> +<li id="fn:234"> +<p>Another thing <a class="footnote-backref" href="#fnref:234" title="Jump back to footnote 234 in the text">↩</a></p> +</li> +<li id="fn:235"> +<p>Another thing <a class="footnote-backref" href="#fnref:235" title="Jump back to footnote 235 in the text">↩</a></p> +</li> +<li id="fn:236"> +<p>Another thing <a class="footnote-backref" href="#fnref:236" title="Jump back to footnote 236 in the text">↩</a></p> +</li> +<li id="fn:237"> +<p>Another thing <a class="footnote-backref" href="#fnref:237" title="Jump back to footnote 237 in the text">↩</a></p> +</li> +<li id="fn:238"> +<p>Another thing <a class="footnote-backref" href="#fnref:238" title="Jump back to footnote 238 in the text">↩</a></p> +</li> +<li id="fn:239"> +<p>Another thing <a class="footnote-backref" href="#fnref:239" title="Jump back to footnote 239 in the text">↩</a></p> +</li> +<li id="fn:240"> +<p>Another thing <a class="footnote-backref" href="#fnref:240" title="Jump back to footnote 240 in the text">↩</a></p> +</li> +<li id="fn:241"> +<p>Another thing <a class="footnote-backref" href="#fnref:241" title="Jump back to footnote 241 in the text">↩</a></p> +</li> +<li id="fn:242"> +<p>Another thing <a class="footnote-backref" href="#fnref:242" title="Jump back to footnote 242 in the text">↩</a></p> +</li> +<li id="fn:243"> +<p>Another thing <a class="footnote-backref" href="#fnref:243" title="Jump back to footnote 243 in the text">↩</a></p> +</li> +<li id="fn:244"> +<p>Another thing <a class="footnote-backref" href="#fnref:244" title="Jump back to footnote 244 in the text">↩</a></p> +</li> +<li id="fn:245"> +<p>Another thing <a class="footnote-backref" href="#fnref:245" title="Jump back to footnote 245 in the text">↩</a></p> +</li> +<li id="fn:246"> +<p>Another thing <a class="footnote-backref" href="#fnref:246" title="Jump back to footnote 246 in the text">↩</a></p> +</li> +<li id="fn:247"> +<p>Another thing <a class="footnote-backref" href="#fnref:247" title="Jump back to footnote 247 in the text">↩</a></p> +</li> +<li id="fn:248"> +<p>Another thing <a class="footnote-backref" href="#fnref:248" title="Jump back to footnote 248 in the text">↩</a></p> +</li> +<li id="fn:249"> +<p>Another thing <a class="footnote-backref" href="#fnref:249" title="Jump back to footnote 249 in the text">↩</a></p> +</li> +<li id="fn:250"> +<p>Another thing <a class="footnote-backref" href="#fnref:250" title="Jump back to footnote 250 in the text">↩</a></p> +</li> +<li id="fn:251"> +<p>Another thing <a class="footnote-backref" href="#fnref:251" title="Jump back to footnote 251 in the text">↩</a></p> +</li> +<li id="fn:252"> +<p>Another thing <a class="footnote-backref" href="#fnref:252" title="Jump back to footnote 252 in the text">↩</a></p> +</li> +<li id="fn:253"> +<p>Another thing <a class="footnote-backref" href="#fnref:253" title="Jump back to footnote 253 in the text">↩</a></p> +</li> +<li id="fn:254"> +<p>Another thing <a class="footnote-backref" href="#fnref:254" title="Jump back to footnote 254 in the text">↩</a></p> +</li> +<li id="fn:255"> +<p>Another thing <a class="footnote-backref" href="#fnref:255" title="Jump back to footnote 255 in the text">↩</a></p> +</li> +<li id="fn:256"> +<p>Another thing <a class="footnote-backref" href="#fnref:256" title="Jump back to footnote 256 in the text">↩</a></p> +</li> +<li id="fn:257"> +<p>Another thing <a class="footnote-backref" href="#fnref:257" title="Jump back to footnote 257 in the text">↩</a></p> +</li> +<li id="fn:258"> +<p>Another thing <a class="footnote-backref" href="#fnref:258" title="Jump back to footnote 258 in the text">↩</a></p> +</li> +<li id="fn:259"> +<p>Another thing <a class="footnote-backref" href="#fnref:259" title="Jump back to footnote 259 in the text">↩</a></p> +</li> +<li id="fn:260"> +<p>Another thing <a class="footnote-backref" href="#fnref:260" title="Jump back to footnote 260 in the text">↩</a></p> +</li> +<li id="fn:261"> +<p>Another thing <a class="footnote-backref" href="#fnref:261" title="Jump back to footnote 261 in the text">↩</a></p> +</li> +<li id="fn:262"> +<p>Another thing <a class="footnote-backref" href="#fnref:262" title="Jump back to footnote 262 in the text">↩</a></p> +</li> +<li id="fn:263"> +<p>Another thing <a class="footnote-backref" href="#fnref:263" title="Jump back to footnote 263 in the text">↩</a></p> +</li> +<li id="fn:264"> +<p>Another thing <a class="footnote-backref" href="#fnref:264" title="Jump back to footnote 264 in the text">↩</a></p> +</li> +<li id="fn:265"> +<p>Another thing <a class="footnote-backref" href="#fnref:265" title="Jump back to footnote 265 in the text">↩</a></p> +</li> +<li id="fn:266"> +<p>Another thing <a class="footnote-backref" href="#fnref:266" title="Jump back to footnote 266 in the text">↩</a></p> +</li> +<li id="fn:267"> +<p>Another thing <a class="footnote-backref" href="#fnref:267" title="Jump back to footnote 267 in the text">↩</a></p> +</li> +<li id="fn:268"> +<p>Another thing <a class="footnote-backref" href="#fnref:268" title="Jump back to footnote 268 in the text">↩</a></p> +</li> +<li id="fn:269"> +<p>Another thing <a class="footnote-backref" href="#fnref:269" title="Jump back to footnote 269 in the text">↩</a></p> +</li> +<li id="fn:270"> +<p>Another thing <a class="footnote-backref" href="#fnref:270" title="Jump back to footnote 270 in the text">↩</a></p> +</li> +<li id="fn:271"> +<p>Another thing <a class="footnote-backref" href="#fnref:271" title="Jump back to footnote 271 in the text">↩</a></p> +</li> +<li id="fn:272"> +<p>Another thing <a class="footnote-backref" href="#fnref:272" title="Jump back to footnote 272 in the text">↩</a></p> +</li> +<li id="fn:273"> +<p>Another thing <a class="footnote-backref" href="#fnref:273" title="Jump back to footnote 273 in the text">↩</a></p> +</li> +<li id="fn:274"> +<p>Another thing <a class="footnote-backref" href="#fnref:274" title="Jump back to footnote 274 in the text">↩</a></p> +</li> +<li id="fn:275"> +<p>Another thing <a class="footnote-backref" href="#fnref:275" title="Jump back to footnote 275 in the text">↩</a></p> +</li> +<li id="fn:276"> +<p>Another thing <a class="footnote-backref" href="#fnref:276" title="Jump back to footnote 276 in the text">↩</a></p> +</li> +<li id="fn:277"> +<p>Another thing <a class="footnote-backref" href="#fnref:277" title="Jump back to footnote 277 in the text">↩</a></p> +</li> +<li id="fn:278"> +<p>Another thing <a class="footnote-backref" href="#fnref:278" title="Jump back to footnote 278 in the text">↩</a></p> +</li> +<li id="fn:279"> +<p>Another thing <a class="footnote-backref" href="#fnref:279" title="Jump back to footnote 279 in the text">↩</a></p> +</li> +<li id="fn:280"> +<p>Another thing <a class="footnote-backref" href="#fnref:280" title="Jump back to footnote 280 in the text">↩</a></p> +</li> +<li id="fn:281"> +<p>Another thing <a class="footnote-backref" href="#fnref:281" title="Jump back to footnote 281 in the text">↩</a></p> +</li> +<li id="fn:282"> +<p>Another thing <a class="footnote-backref" href="#fnref:282" title="Jump back to footnote 282 in the text">↩</a></p> +</li> +<li id="fn:283"> +<p>Another thing <a class="footnote-backref" href="#fnref:283" title="Jump back to footnote 283 in the text">↩</a></p> +</li> +<li id="fn:284"> +<p>Another thing <a class="footnote-backref" href="#fnref:284" title="Jump back to footnote 284 in the text">↩</a></p> +</li> +<li id="fn:285"> +<p>Another thing <a class="footnote-backref" href="#fnref:285" title="Jump back to footnote 285 in the text">↩</a></p> +</li> +<li id="fn:286"> +<p>Another thing <a class="footnote-backref" href="#fnref:286" title="Jump back to footnote 286 in the text">↩</a></p> +</li> +<li id="fn:287"> +<p>Another thing <a class="footnote-backref" href="#fnref:287" title="Jump back to footnote 287 in the text">↩</a></p> +</li> +<li id="fn:288"> +<p>Another thing <a class="footnote-backref" href="#fnref:288" title="Jump back to footnote 288 in the text">↩</a></p> +</li> +<li id="fn:289"> +<p>Another thing <a class="footnote-backref" href="#fnref:289" title="Jump back to footnote 289 in the text">↩</a></p> +</li> +<li id="fn:290"> +<p>Another thing <a class="footnote-backref" href="#fnref:290" title="Jump back to footnote 290 in the text">↩</a></p> +</li> +<li id="fn:291"> +<p>Another thing <a class="footnote-backref" href="#fnref:291" title="Jump back to footnote 291 in the text">↩</a></p> +</li> +<li id="fn:292"> +<p>Another thing <a class="footnote-backref" href="#fnref:292" title="Jump back to footnote 292 in the text">↩</a></p> +</li> +<li id="fn:293"> +<p>Another thing <a class="footnote-backref" href="#fnref:293" title="Jump back to footnote 293 in the text">↩</a></p> +</li> +<li id="fn:294"> +<p>Another thing <a class="footnote-backref" href="#fnref:294" title="Jump back to footnote 294 in the text">↩</a></p> +</li> +<li id="fn:295"> +<p>Another thing <a class="footnote-backref" href="#fnref:295" title="Jump back to footnote 295 in the text">↩</a></p> +</li> +<li id="fn:296"> +<p>Another thing <a class="footnote-backref" href="#fnref:296" title="Jump back to footnote 296 in the text">↩</a></p> +</li> +<li id="fn:297"> +<p>Another thing <a class="footnote-backref" href="#fnref:297" title="Jump back to footnote 297 in the text">↩</a></p> +</li> +<li id="fn:298"> +<p>Another thing <a class="footnote-backref" href="#fnref:298" title="Jump back to footnote 298 in the text">↩</a></p> +</li> +<li id="fn:299"> +<p>Another thing <a class="footnote-backref" href="#fnref:299" title="Jump back to footnote 299 in the text">↩</a></p> +</li> +<li id="fn:300"> +<p>Another thing <a class="footnote-backref" href="#fnref:300" title="Jump back to footnote 300 in the text">↩</a></p> +</li> +<li id="fn:301"> +<p>Another thing <a class="footnote-backref" href="#fnref:301" title="Jump back to footnote 301 in the text">↩</a></p> +</li> +<li id="fn:302"> +<p>Another thing <a class="footnote-backref" href="#fnref:302" title="Jump back to footnote 302 in the text">↩</a></p> +</li> +<li id="fn:303"> +<p>Another thing <a class="footnote-backref" href="#fnref:303" title="Jump back to footnote 303 in the text">↩</a></p> +</li> +<li id="fn:304"> +<p>Another thing <a class="footnote-backref" href="#fnref:304" title="Jump back to footnote 304 in the text">↩</a></p> +</li> +<li id="fn:305"> +<p>Another thing <a class="footnote-backref" href="#fnref:305" title="Jump back to footnote 305 in the text">↩</a></p> +</li> +<li id="fn:306"> +<p>Another thing <a class="footnote-backref" href="#fnref:306" title="Jump back to footnote 306 in the text">↩</a></p> +</li> +<li id="fn:307"> +<p>Another thing <a class="footnote-backref" href="#fnref:307" title="Jump back to footnote 307 in the text">↩</a></p> +</li> +<li id="fn:308"> +<p>Another thing <a class="footnote-backref" href="#fnref:308" title="Jump back to footnote 308 in the text">↩</a></p> +</li> +<li id="fn:309"> +<p>Another thing <a class="footnote-backref" href="#fnref:309" title="Jump back to footnote 309 in the text">↩</a></p> +</li> +<li id="fn:310"> +<p>Another thing <a class="footnote-backref" href="#fnref:310" title="Jump back to footnote 310 in the text">↩</a></p> +</li> +<li id="fn:311"> +<p>Another thing <a class="footnote-backref" href="#fnref:311" title="Jump back to footnote 311 in the text">↩</a></p> +</li> +<li id="fn:312"> +<p>Another thing <a class="footnote-backref" href="#fnref:312" title="Jump back to footnote 312 in the text">↩</a></p> +</li> +<li id="fn:313"> +<p>Another thing <a class="footnote-backref" href="#fnref:313" title="Jump back to footnote 313 in the text">↩</a></p> +</li> +<li id="fn:314"> +<p>Another thing <a class="footnote-backref" href="#fnref:314" title="Jump back to footnote 314 in the text">↩</a></p> +</li> +<li id="fn:315"> +<p>Another thing <a class="footnote-backref" href="#fnref:315" title="Jump back to footnote 315 in the text">↩</a></p> +</li> +<li id="fn:316"> +<p>Another thing <a class="footnote-backref" href="#fnref:316" title="Jump back to footnote 316 in the text">↩</a></p> +</li> +<li id="fn:317"> +<p>Another thing <a class="footnote-backref" href="#fnref:317" title="Jump back to footnote 317 in the text">↩</a></p> +</li> +<li id="fn:318"> +<p>Another thing <a class="footnote-backref" href="#fnref:318" title="Jump back to footnote 318 in the text">↩</a></p> +</li> +<li id="fn:319"> +<p>Another thing <a class="footnote-backref" href="#fnref:319" title="Jump back to footnote 319 in the text">↩</a></p> +</li> +<li id="fn:320"> +<p>Another thing <a class="footnote-backref" href="#fnref:320" title="Jump back to footnote 320 in the text">↩</a></p> +</li> +<li id="fn:321"> +<p>Another thing <a class="footnote-backref" href="#fnref:321" title="Jump back to footnote 321 in the text">↩</a></p> +</li> +<li id="fn:322"> +<p>Another thing <a class="footnote-backref" href="#fnref:322" title="Jump back to footnote 322 in the text">↩</a></p> +</li> +<li id="fn:323"> +<p>Another thing <a class="footnote-backref" href="#fnref:323" title="Jump back to footnote 323 in the text">↩</a></p> +</li> +<li id="fn:324"> +<p>Another thing <a class="footnote-backref" href="#fnref:324" title="Jump back to footnote 324 in the text">↩</a></p> +</li> +<li id="fn:325"> +<p>Another thing <a class="footnote-backref" href="#fnref:325" title="Jump back to footnote 325 in the text">↩</a></p> +</li> +<li id="fn:326"> +<p>Another thing <a class="footnote-backref" href="#fnref:326" title="Jump back to footnote 326 in the text">↩</a></p> +</li> +<li id="fn:327"> +<p>Another thing <a class="footnote-backref" href="#fnref:327" title="Jump back to footnote 327 in the text">↩</a></p> +</li> +<li id="fn:328"> +<p>Another thing <a class="footnote-backref" href="#fnref:328" title="Jump back to footnote 328 in the text">↩</a></p> +</li> +<li id="fn:329"> +<p>Another thing <a class="footnote-backref" href="#fnref:329" title="Jump back to footnote 329 in the text">↩</a></p> +</li> +<li id="fn:330"> +<p>Another thing <a class="footnote-backref" href="#fnref:330" title="Jump back to footnote 330 in the text">↩</a></p> +</li> +<li id="fn:331"> +<p>Another thing <a class="footnote-backref" href="#fnref:331" title="Jump back to footnote 331 in the text">↩</a></p> +</li> +<li id="fn:332"> +<p>Another thing <a class="footnote-backref" href="#fnref:332" title="Jump back to footnote 332 in the text">↩</a></p> +</li> +<li id="fn:333"> +<p>Another thing <a class="footnote-backref" href="#fnref:333" title="Jump back to footnote 333 in the text">↩</a></p> +</li> +<li id="fn:334"> +<p>Another thing <a class="footnote-backref" href="#fnref:334" title="Jump back to footnote 334 in the text">↩</a></p> +</li> +<li id="fn:335"> +<p>Another thing <a class="footnote-backref" href="#fnref:335" title="Jump back to footnote 335 in the text">↩</a></p> +</li> +<li id="fn:336"> +<p>Another thing <a class="footnote-backref" href="#fnref:336" title="Jump back to footnote 336 in the text">↩</a></p> +</li> +<li id="fn:337"> +<p>Another thing <a class="footnote-backref" href="#fnref:337" title="Jump back to footnote 337 in the text">↩</a></p> +</li> +<li id="fn:338"> +<p>Another thing <a class="footnote-backref" href="#fnref:338" title="Jump back to footnote 338 in the text">↩</a></p> +</li> +<li id="fn:339"> +<p>Another thing <a class="footnote-backref" href="#fnref:339" title="Jump back to footnote 339 in the text">↩</a></p> +</li> +<li id="fn:340"> +<p>Another thing <a class="footnote-backref" href="#fnref:340" title="Jump back to footnote 340 in the text">↩</a></p> +</li> +<li id="fn:341"> +<p>Another thing <a class="footnote-backref" href="#fnref:341" title="Jump back to footnote 341 in the text">↩</a></p> +</li> +<li id="fn:342"> +<p>Another thing <a class="footnote-backref" href="#fnref:342" title="Jump back to footnote 342 in the text">↩</a></p> +</li> +<li id="fn:343"> +<p>Another thing <a class="footnote-backref" href="#fnref:343" title="Jump back to footnote 343 in the text">↩</a></p> +</li> +<li id="fn:344"> +<p>Another thing <a class="footnote-backref" href="#fnref:344" title="Jump back to footnote 344 in the text">↩</a></p> +</li> +<li id="fn:345"> +<p>Another thing <a class="footnote-backref" href="#fnref:345" title="Jump back to footnote 345 in the text">↩</a></p> +</li> +<li id="fn:346"> +<p>Another thing <a class="footnote-backref" href="#fnref:346" title="Jump back to footnote 346 in the text">↩</a></p> +</li> +<li id="fn:347"> +<p>Another thing <a class="footnote-backref" href="#fnref:347" title="Jump back to footnote 347 in the text">↩</a></p> +</li> +<li id="fn:348"> +<p>Another thing <a class="footnote-backref" href="#fnref:348" title="Jump back to footnote 348 in the text">↩</a></p> +</li> +<li id="fn:349"> +<p>Another thing <a class="footnote-backref" href="#fnref:349" title="Jump back to footnote 349 in the text">↩</a></p> +</li> +<li id="fn:350"> +<p>Another thing <a class="footnote-backref" href="#fnref:350" title="Jump back to footnote 350 in the text">↩</a></p> +</li> +<li id="fn:351"> +<p>Another thing <a class="footnote-backref" href="#fnref:351" title="Jump back to footnote 351 in the text">↩</a></p> +</li> +<li id="fn:352"> +<p>Another thing <a class="footnote-backref" href="#fnref:352" title="Jump back to footnote 352 in the text">↩</a></p> +</li> +<li id="fn:353"> +<p>Another thing <a class="footnote-backref" href="#fnref:353" title="Jump back to footnote 353 in the text">↩</a></p> +</li> +<li id="fn:354"> +<p>Another thing <a class="footnote-backref" href="#fnref:354" title="Jump back to footnote 354 in the text">↩</a></p> +</li> +<li id="fn:355"> +<p>Another thing <a class="footnote-backref" href="#fnref:355" title="Jump back to footnote 355 in the text">↩</a></p> +</li> +<li id="fn:356"> +<p>Another thing <a class="footnote-backref" href="#fnref:356" title="Jump back to footnote 356 in the text">↩</a></p> +</li> +<li id="fn:357"> +<p>Another thing <a class="footnote-backref" href="#fnref:357" title="Jump back to footnote 357 in the text">↩</a></p> +</li> +<li id="fn:358"> +<p>Another thing <a class="footnote-backref" href="#fnref:358" title="Jump back to footnote 358 in the text">↩</a></p> +</li> +<li id="fn:359"> +<p>Another thing <a class="footnote-backref" href="#fnref:359" title="Jump back to footnote 359 in the text">↩</a></p> +</li> +<li id="fn:360"> +<p>Another thing <a class="footnote-backref" href="#fnref:360" title="Jump back to footnote 360 in the text">↩</a></p> +</li> +<li id="fn:361"> +<p>Another thing <a class="footnote-backref" href="#fnref:361" title="Jump back to footnote 361 in the text">↩</a></p> +</li> +<li id="fn:362"> +<p>Another thing <a class="footnote-backref" href="#fnref:362" title="Jump back to footnote 362 in the text">↩</a></p> +</li> +<li id="fn:363"> +<p>Another thing <a class="footnote-backref" href="#fnref:363" title="Jump back to footnote 363 in the text">↩</a></p> +</li> +<li id="fn:364"> +<p>Another thing <a class="footnote-backref" href="#fnref:364" title="Jump back to footnote 364 in the text">↩</a></p> +</li> +<li id="fn:365"> +<p>Another thing <a class="footnote-backref" href="#fnref:365" title="Jump back to footnote 365 in the text">↩</a></p> +</li> +<li id="fn:366"> +<p>Another thing <a class="footnote-backref" href="#fnref:366" title="Jump back to footnote 366 in the text">↩</a></p> +</li> +<li id="fn:367"> +<p>Another thing <a class="footnote-backref" href="#fnref:367" title="Jump back to footnote 367 in the text">↩</a></p> +</li> +<li id="fn:368"> +<p>Another thing <a class="footnote-backref" href="#fnref:368" title="Jump back to footnote 368 in the text">↩</a></p> +</li> +<li id="fn:369"> +<p>Another thing <a class="footnote-backref" href="#fnref:369" title="Jump back to footnote 369 in the text">↩</a></p> +</li> +<li id="fn:370"> +<p>Another thing <a class="footnote-backref" href="#fnref:370" title="Jump back to footnote 370 in the text">↩</a></p> +</li> +<li id="fn:371"> +<p>Another thing <a class="footnote-backref" href="#fnref:371" title="Jump back to footnote 371 in the text">↩</a></p> +</li> +<li id="fn:372"> +<p>Another thing <a class="footnote-backref" href="#fnref:372" title="Jump back to footnote 372 in the text">↩</a></p> +</li> +<li id="fn:373"> +<p>Another thing <a class="footnote-backref" href="#fnref:373" title="Jump back to footnote 373 in the text">↩</a></p> +</li> +<li id="fn:374"> +<p>Another thing <a class="footnote-backref" href="#fnref:374" title="Jump back to footnote 374 in the text">↩</a></p> +</li> +<li id="fn:375"> +<p>Another thing <a class="footnote-backref" href="#fnref:375" title="Jump back to footnote 375 in the text">↩</a></p> +</li> +<li id="fn:376"> +<p>Another thing <a class="footnote-backref" href="#fnref:376" title="Jump back to footnote 376 in the text">↩</a></p> +</li> +<li id="fn:377"> +<p>Another thing <a class="footnote-backref" href="#fnref:377" title="Jump back to footnote 377 in the text">↩</a></p> +</li> +<li id="fn:378"> +<p>Another thing <a class="footnote-backref" href="#fnref:378" title="Jump back to footnote 378 in the text">↩</a></p> +</li> +<li id="fn:379"> +<p>Another thing <a class="footnote-backref" href="#fnref:379" title="Jump back to footnote 379 in the text">↩</a></p> +</li> +<li id="fn:380"> +<p>Another thing <a class="footnote-backref" href="#fnref:380" title="Jump back to footnote 380 in the text">↩</a></p> +</li> +<li id="fn:381"> +<p>Another thing <a class="footnote-backref" href="#fnref:381" title="Jump back to footnote 381 in the text">↩</a></p> +</li> +<li id="fn:382"> +<p>Another thing <a class="footnote-backref" href="#fnref:382" title="Jump back to footnote 382 in the text">↩</a></p> +</li> +<li id="fn:383"> +<p>Another thing <a class="footnote-backref" href="#fnref:383" title="Jump back to footnote 383 in the text">↩</a></p> +</li> +<li id="fn:384"> +<p>Another thing <a class="footnote-backref" href="#fnref:384" title="Jump back to footnote 384 in the text">↩</a></p> +</li> +<li id="fn:385"> +<p>Another thing <a class="footnote-backref" href="#fnref:385" title="Jump back to footnote 385 in the text">↩</a></p> +</li> +<li id="fn:386"> +<p>Another thing <a class="footnote-backref" href="#fnref:386" title="Jump back to footnote 386 in the text">↩</a></p> +</li> +<li id="fn:387"> +<p>Another thing <a class="footnote-backref" href="#fnref:387" title="Jump back to footnote 387 in the text">↩</a></p> +</li> +<li id="fn:388"> +<p>Another thing <a class="footnote-backref" href="#fnref:388" title="Jump back to footnote 388 in the text">↩</a></p> +</li> +<li id="fn:389"> +<p>Another thing <a class="footnote-backref" href="#fnref:389" title="Jump back to footnote 389 in the text">↩</a></p> +</li> +<li id="fn:390"> +<p>Another thing <a class="footnote-backref" href="#fnref:390" title="Jump back to footnote 390 in the text">↩</a></p> +</li> +<li id="fn:391"> +<p>Another thing <a class="footnote-backref" href="#fnref:391" title="Jump back to footnote 391 in the text">↩</a></p> +</li> +<li id="fn:392"> +<p>Another thing <a class="footnote-backref" href="#fnref:392" title="Jump back to footnote 392 in the text">↩</a></p> +</li> +<li id="fn:393"> +<p>Another thing <a class="footnote-backref" href="#fnref:393" title="Jump back to footnote 393 in the text">↩</a></p> +</li> +<li id="fn:394"> +<p>Another thing <a class="footnote-backref" href="#fnref:394" title="Jump back to footnote 394 in the text">↩</a></p> +</li> +<li id="fn:395"> +<p>Another thing <a class="footnote-backref" href="#fnref:395" title="Jump back to footnote 395 in the text">↩</a></p> +</li> +<li id="fn:396"> +<p>Another thing <a class="footnote-backref" href="#fnref:396" title="Jump back to footnote 396 in the text">↩</a></p> +</li> +<li id="fn:397"> +<p>Another thing <a class="footnote-backref" href="#fnref:397" title="Jump back to footnote 397 in the text">↩</a></p> +</li> +<li id="fn:398"> +<p>Another thing <a class="footnote-backref" href="#fnref:398" title="Jump back to footnote 398 in the text">↩</a></p> +</li> +<li id="fn:399"> +<p>Another thing <a class="footnote-backref" href="#fnref:399" title="Jump back to footnote 399 in the text">↩</a></p> +</li> +<li id="fn:400"> +<p>Another thing <a class="footnote-backref" href="#fnref:400" title="Jump back to footnote 400 in the text">↩</a></p> +</li> +<li id="fn:401"> +<p>Another thing <a class="footnote-backref" href="#fnref:401" title="Jump back to footnote 401 in the text">↩</a></p> +</li> +<li id="fn:402"> +<p>Another thing <a class="footnote-backref" href="#fnref:402" title="Jump back to footnote 402 in the text">↩</a></p> +</li> +<li id="fn:403"> +<p>Another thing <a class="footnote-backref" href="#fnref:403" title="Jump back to footnote 403 in the text">↩</a></p> +</li> +<li id="fn:404"> +<p>Another thing <a class="footnote-backref" href="#fnref:404" title="Jump back to footnote 404 in the text">↩</a></p> +</li> +<li id="fn:405"> +<p>Another thing <a class="footnote-backref" href="#fnref:405" title="Jump back to footnote 405 in the text">↩</a></p> +</li> +<li id="fn:406"> +<p>Another thing <a class="footnote-backref" href="#fnref:406" title="Jump back to footnote 406 in the text">↩</a></p> +</li> +<li id="fn:407"> +<p>Another thing <a class="footnote-backref" href="#fnref:407" title="Jump back to footnote 407 in the text">↩</a></p> +</li> +<li id="fn:408"> +<p>Another thing <a class="footnote-backref" href="#fnref:408" title="Jump back to footnote 408 in the text">↩</a></p> +</li> +<li id="fn:409"> +<p>Another thing <a class="footnote-backref" href="#fnref:409" title="Jump back to footnote 409 in the text">↩</a></p> +</li> +<li id="fn:410"> +<p>Another thing <a class="footnote-backref" href="#fnref:410" title="Jump back to footnote 410 in the text">↩</a></p> +</li> +<li id="fn:411"> +<p>Another thing <a class="footnote-backref" href="#fnref:411" title="Jump back to footnote 411 in the text">↩</a></p> +</li> +<li id="fn:412"> +<p>Another thing <a class="footnote-backref" href="#fnref:412" title="Jump back to footnote 412 in the text">↩</a></p> +</li> +<li id="fn:413"> +<p>Another thing <a class="footnote-backref" href="#fnref:413" title="Jump back to footnote 413 in the text">↩</a></p> +</li> +<li id="fn:414"> +<p>Another thing <a class="footnote-backref" href="#fnref:414" title="Jump back to footnote 414 in the text">↩</a></p> +</li> +<li id="fn:415"> +<p>Another thing <a class="footnote-backref" href="#fnref:415" title="Jump back to footnote 415 in the text">↩</a></p> +</li> +<li id="fn:416"> +<p>Another thing <a class="footnote-backref" href="#fnref:416" title="Jump back to footnote 416 in the text">↩</a></p> +</li> +<li id="fn:417"> +<p>Another thing <a class="footnote-backref" href="#fnref:417" title="Jump back to footnote 417 in the text">↩</a></p> +</li> +<li id="fn:418"> +<p>Another thing <a class="footnote-backref" href="#fnref:418" title="Jump back to footnote 418 in the text">↩</a></p> +</li> +<li id="fn:419"> +<p>Another thing <a class="footnote-backref" href="#fnref:419" title="Jump back to footnote 419 in the text">↩</a></p> +</li> +<li id="fn:420"> +<p>Another thing <a class="footnote-backref" href="#fnref:420" title="Jump back to footnote 420 in the text">↩</a></p> +</li> +<li id="fn:421"> +<p>Another thing <a class="footnote-backref" href="#fnref:421" title="Jump back to footnote 421 in the text">↩</a></p> +</li> +<li id="fn:422"> +<p>Another thing <a class="footnote-backref" href="#fnref:422" title="Jump back to footnote 422 in the text">↩</a></p> +</li> +<li id="fn:423"> +<p>Another thing <a class="footnote-backref" href="#fnref:423" title="Jump back to footnote 423 in the text">↩</a></p> +</li> +<li id="fn:424"> +<p>Another thing <a class="footnote-backref" href="#fnref:424" title="Jump back to footnote 424 in the text">↩</a></p> +</li> +<li id="fn:425"> +<p>Another thing <a class="footnote-backref" href="#fnref:425" title="Jump back to footnote 425 in the text">↩</a></p> +</li> +<li id="fn:426"> +<p>Another thing <a class="footnote-backref" href="#fnref:426" title="Jump back to footnote 426 in the text">↩</a></p> +</li> +<li id="fn:427"> +<p>Another thing <a class="footnote-backref" href="#fnref:427" title="Jump back to footnote 427 in the text">↩</a></p> +</li> +<li id="fn:428"> +<p>Another thing <a class="footnote-backref" href="#fnref:428" title="Jump back to footnote 428 in the text">↩</a></p> +</li> +<li id="fn:429"> +<p>Another thing <a class="footnote-backref" href="#fnref:429" title="Jump back to footnote 429 in the text">↩</a></p> +</li> +<li id="fn:430"> +<p>Another thing <a class="footnote-backref" href="#fnref:430" title="Jump back to footnote 430 in the text">↩</a></p> +</li> +<li id="fn:431"> +<p>Another thing <a class="footnote-backref" href="#fnref:431" title="Jump back to footnote 431 in the text">↩</a></p> +</li> +<li id="fn:432"> +<p>Another thing <a class="footnote-backref" href="#fnref:432" title="Jump back to footnote 432 in the text">↩</a></p> +</li> +<li id="fn:433"> +<p>Another thing <a class="footnote-backref" href="#fnref:433" title="Jump back to footnote 433 in the text">↩</a></p> +</li> +<li id="fn:434"> +<p>Another thing <a class="footnote-backref" href="#fnref:434" title="Jump back to footnote 434 in the text">↩</a></p> +</li> +<li id="fn:435"> +<p>Another thing <a class="footnote-backref" href="#fnref:435" title="Jump back to footnote 435 in the text">↩</a></p> +</li> +<li id="fn:436"> +<p>Another thing <a class="footnote-backref" href="#fnref:436" title="Jump back to footnote 436 in the text">↩</a></p> +</li> +<li id="fn:437"> +<p>Another thing <a class="footnote-backref" href="#fnref:437" title="Jump back to footnote 437 in the text">↩</a></p> +</li> +<li id="fn:438"> +<p>Another thing <a class="footnote-backref" href="#fnref:438" title="Jump back to footnote 438 in the text">↩</a></p> +</li> +<li id="fn:439"> +<p>Another thing <a class="footnote-backref" href="#fnref:439" title="Jump back to footnote 439 in the text">↩</a></p> +</li> +<li id="fn:440"> +<p>Another thing <a class="footnote-backref" href="#fnref:440" title="Jump back to footnote 440 in the text">↩</a></p> +</li> +<li id="fn:441"> +<p>Another thing <a class="footnote-backref" href="#fnref:441" title="Jump back to footnote 441 in the text">↩</a></p> +</li> +<li id="fn:442"> +<p>Another thing <a class="footnote-backref" href="#fnref:442" title="Jump back to footnote 442 in the text">↩</a></p> +</li> +<li id="fn:443"> +<p>Another thing <a class="footnote-backref" href="#fnref:443" title="Jump back to footnote 443 in the text">↩</a></p> +</li> +<li id="fn:444"> +<p>Another thing <a class="footnote-backref" href="#fnref:444" title="Jump back to footnote 444 in the text">↩</a></p> +</li> +<li id="fn:445"> +<p>Another thing <a class="footnote-backref" href="#fnref:445" title="Jump back to footnote 445 in the text">↩</a></p> +</li> +<li id="fn:446"> +<p>Another thing <a class="footnote-backref" href="#fnref:446" title="Jump back to footnote 446 in the text">↩</a></p> +</li> +<li id="fn:447"> +<p>Another thing <a class="footnote-backref" href="#fnref:447" title="Jump back to footnote 447 in the text">↩</a></p> +</li> +<li id="fn:448"> +<p>Another thing <a class="footnote-backref" href="#fnref:448" title="Jump back to footnote 448 in the text">↩</a></p> +</li> +<li id="fn:449"> +<p>Another thing <a class="footnote-backref" href="#fnref:449" title="Jump back to footnote 449 in the text">↩</a></p> +</li> +<li id="fn:450"> +<p>Another thing <a class="footnote-backref" href="#fnref:450" title="Jump back to footnote 450 in the text">↩</a></p> +</li> +<li id="fn:451"> +<p>Another thing <a class="footnote-backref" href="#fnref:451" title="Jump back to footnote 451 in the text">↩</a></p> +</li> +<li id="fn:452"> +<p>Another thing <a class="footnote-backref" href="#fnref:452" title="Jump back to footnote 452 in the text">↩</a></p> +</li> +<li id="fn:453"> +<p>Another thing <a class="footnote-backref" href="#fnref:453" title="Jump back to footnote 453 in the text">↩</a></p> +</li> +<li id="fn:454"> +<p>Another thing <a class="footnote-backref" href="#fnref:454" title="Jump back to footnote 454 in the text">↩</a></p> +</li> +<li id="fn:455"> +<p>Another thing <a class="footnote-backref" href="#fnref:455" title="Jump back to footnote 455 in the text">↩</a></p> +</li> +<li id="fn:456"> +<p>Another thing <a class="footnote-backref" href="#fnref:456" title="Jump back to footnote 456 in the text">↩</a></p> +</li> +<li id="fn:457"> +<p>Another thing <a class="footnote-backref" href="#fnref:457" title="Jump back to footnote 457 in the text">↩</a></p> +</li> +<li id="fn:458"> +<p>Another thing <a class="footnote-backref" href="#fnref:458" title="Jump back to footnote 458 in the text">↩</a></p> +</li> +<li id="fn:459"> +<p>Another thing <a class="footnote-backref" href="#fnref:459" title="Jump back to footnote 459 in the text">↩</a></p> +</li> +<li id="fn:460"> +<p>Another thing <a class="footnote-backref" href="#fnref:460" title="Jump back to footnote 460 in the text">↩</a></p> +</li> +<li id="fn:461"> +<p>Another thing <a class="footnote-backref" href="#fnref:461" title="Jump back to footnote 461 in the text">↩</a></p> +</li> +<li id="fn:462"> +<p>Another thing <a class="footnote-backref" href="#fnref:462" title="Jump back to footnote 462 in the text">↩</a></p> +</li> +<li id="fn:463"> +<p>Another thing <a class="footnote-backref" href="#fnref:463" title="Jump back to footnote 463 in the text">↩</a></p> +</li> +<li id="fn:464"> +<p>Another thing <a class="footnote-backref" href="#fnref:464" title="Jump back to footnote 464 in the text">↩</a></p> +</li> +<li id="fn:465"> +<p>Another thing <a class="footnote-backref" href="#fnref:465" title="Jump back to footnote 465 in the text">↩</a></p> +</li> +<li id="fn:466"> +<p>Another thing <a class="footnote-backref" href="#fnref:466" title="Jump back to footnote 466 in the text">↩</a></p> +</li> +<li id="fn:467"> +<p>Another thing <a class="footnote-backref" href="#fnref:467" title="Jump back to footnote 467 in the text">↩</a></p> +</li> +<li id="fn:468"> +<p>Another thing <a class="footnote-backref" href="#fnref:468" title="Jump back to footnote 468 in the text">↩</a></p> +</li> +<li id="fn:469"> +<p>Another thing <a class="footnote-backref" href="#fnref:469" title="Jump back to footnote 469 in the text">↩</a></p> +</li> +<li id="fn:470"> +<p>Another thing <a class="footnote-backref" href="#fnref:470" title="Jump back to footnote 470 in the text">↩</a></p> +</li> +<li id="fn:471"> +<p>Another thing <a class="footnote-backref" href="#fnref:471" title="Jump back to footnote 471 in the text">↩</a></p> +</li> +<li id="fn:472"> +<p>Another thing <a class="footnote-backref" href="#fnref:472" title="Jump back to footnote 472 in the text">↩</a></p> +</li> +<li id="fn:473"> +<p>Another thing <a class="footnote-backref" href="#fnref:473" title="Jump back to footnote 473 in the text">↩</a></p> +</li> +<li id="fn:474"> +<p>Another thing <a class="footnote-backref" href="#fnref:474" title="Jump back to footnote 474 in the text">↩</a></p> +</li> +<li id="fn:475"> +<p>Another thing <a class="footnote-backref" href="#fnref:475" title="Jump back to footnote 475 in the text">↩</a></p> +</li> +<li id="fn:476"> +<p>Another thing <a class="footnote-backref" href="#fnref:476" title="Jump back to footnote 476 in the text">↩</a></p> +</li> +<li id="fn:477"> +<p>Another thing <a class="footnote-backref" href="#fnref:477" title="Jump back to footnote 477 in the text">↩</a></p> +</li> +<li id="fn:478"> +<p>Another thing <a class="footnote-backref" href="#fnref:478" title="Jump back to footnote 478 in the text">↩</a></p> +</li> +<li id="fn:479"> +<p>Another thing <a class="footnote-backref" href="#fnref:479" title="Jump back to footnote 479 in the text">↩</a></p> +</li> +<li id="fn:480"> +<p>Another thing <a class="footnote-backref" href="#fnref:480" title="Jump back to footnote 480 in the text">↩</a></p> +</li> +<li id="fn:481"> +<p>Another thing <a class="footnote-backref" href="#fnref:481" title="Jump back to footnote 481 in the text">↩</a></p> +</li> +<li id="fn:482"> +<p>Another thing <a class="footnote-backref" href="#fnref:482" title="Jump back to footnote 482 in the text">↩</a></p> +</li> +<li id="fn:483"> +<p>Another thing <a class="footnote-backref" href="#fnref:483" title="Jump back to footnote 483 in the text">↩</a></p> +</li> +<li id="fn:484"> +<p>Another thing <a class="footnote-backref" href="#fnref:484" title="Jump back to footnote 484 in the text">↩</a></p> +</li> +<li id="fn:485"> +<p>Another thing <a class="footnote-backref" href="#fnref:485" title="Jump back to footnote 485 in the text">↩</a></p> +</li> +<li id="fn:486"> +<p>Another thing <a class="footnote-backref" href="#fnref:486" title="Jump back to footnote 486 in the text">↩</a></p> +</li> +<li id="fn:487"> +<p>Another thing <a class="footnote-backref" href="#fnref:487" title="Jump back to footnote 487 in the text">↩</a></p> +</li> +<li id="fn:488"> +<p>Another thing <a class="footnote-backref" href="#fnref:488" title="Jump back to footnote 488 in the text">↩</a></p> +</li> +<li id="fn:489"> +<p>Another thing <a class="footnote-backref" href="#fnref:489" title="Jump back to footnote 489 in the text">↩</a></p> +</li> +<li id="fn:490"> +<p>Another thing <a class="footnote-backref" href="#fnref:490" title="Jump back to footnote 490 in the text">↩</a></p> +</li> +<li id="fn:491"> +<p>Another thing <a class="footnote-backref" href="#fnref:491" title="Jump back to footnote 491 in the text">↩</a></p> +</li> +<li id="fn:492"> +<p>Another thing <a class="footnote-backref" href="#fnref:492" title="Jump back to footnote 492 in the text">↩</a></p> +</li> +<li id="fn:493"> +<p>Another thing <a class="footnote-backref" href="#fnref:493" title="Jump back to footnote 493 in the text">↩</a></p> +</li> +<li id="fn:494"> +<p>Another thing <a class="footnote-backref" href="#fnref:494" title="Jump back to footnote 494 in the text">↩</a></p> +</li> +<li id="fn:495"> +<p>Another thing <a class="footnote-backref" href="#fnref:495" title="Jump back to footnote 495 in the text">↩</a></p> +</li> +<li id="fn:496"> +<p>Another thing <a class="footnote-backref" href="#fnref:496" title="Jump back to footnote 496 in the text">↩</a></p> +</li> +<li id="fn:497"> +<p>Another thing <a class="footnote-backref" href="#fnref:497" title="Jump back to footnote 497 in the text">↩</a></p> +</li> +<li id="fn:498"> +<p>Another thing <a class="footnote-backref" href="#fnref:498" title="Jump back to footnote 498 in the text">↩</a></p> +</li> +<li id="fn:499"> +<p>Another thing <a class="footnote-backref" href="#fnref:499" title="Jump back to footnote 499 in the text">↩</a></p> +</li> +<li id="fn:500"> +<p>Another thing <a class="footnote-backref" href="#fnref:500" title="Jump back to footnote 500 in the text">↩</a></p> +</li> +<li id="fn:501"> +<p>Another thing <a class="footnote-backref" href="#fnref:501" title="Jump back to footnote 501 in the text">↩</a></p> +</li> +<li id="fn:502"> +<p>Another thing <a class="footnote-backref" href="#fnref:502" title="Jump back to footnote 502 in the text">↩</a></p> +</li> +<li id="fn:503"> +<p>Another thing <a class="footnote-backref" href="#fnref:503" title="Jump back to footnote 503 in the text">↩</a></p> +</li> +<li id="fn:504"> +<p>Another thing <a class="footnote-backref" href="#fnref:504" title="Jump back to footnote 504 in the text">↩</a></p> +</li> +<li id="fn:505"> +<p>Another thing <a class="footnote-backref" href="#fnref:505" title="Jump back to footnote 505 in the text">↩</a></p> +</li> +<li id="fn:506"> +<p>Another thing <a class="footnote-backref" href="#fnref:506" title="Jump back to footnote 506 in the text">↩</a></p> +</li> +<li id="fn:507"> +<p>Another thing <a class="footnote-backref" href="#fnref:507" title="Jump back to footnote 507 in the text">↩</a></p> +</li> +<li id="fn:508"> +<p>Another thing <a class="footnote-backref" href="#fnref:508" title="Jump back to footnote 508 in the text">↩</a></p> +</li> +<li id="fn:509"> +<p>Another thing <a class="footnote-backref" href="#fnref:509" title="Jump back to footnote 509 in the text">↩</a></p> +</li> +<li id="fn:510"> +<p>Another thing <a class="footnote-backref" href="#fnref:510" title="Jump back to footnote 510 in the text">↩</a></p> +</li> +<li id="fn:511"> +<p>Another thing <a class="footnote-backref" href="#fnref:511" title="Jump back to footnote 511 in the text">↩</a></p> +</li> +<li id="fn:512"> +<p>Another thing <a class="footnote-backref" href="#fnref:512" title="Jump back to footnote 512 in the text">↩</a></p> +</li> +<li id="fn:513"> +<p>Another thing <a class="footnote-backref" href="#fnref:513" title="Jump back to footnote 513 in the text">↩</a></p> +</li> +<li id="fn:514"> +<p>Another thing <a class="footnote-backref" href="#fnref:514" title="Jump back to footnote 514 in the text">↩</a></p> +</li> +<li id="fn:515"> +<p>Another thing <a class="footnote-backref" href="#fnref:515" title="Jump back to footnote 515 in the text">↩</a></p> +</li> +<li id="fn:516"> +<p>Another thing <a class="footnote-backref" href="#fnref:516" title="Jump back to footnote 516 in the text">↩</a></p> +</li> +<li id="fn:517"> +<p>Another thing <a class="footnote-backref" href="#fnref:517" title="Jump back to footnote 517 in the text">↩</a></p> +</li> +<li id="fn:518"> +<p>Another thing <a class="footnote-backref" href="#fnref:518" title="Jump back to footnote 518 in the text">↩</a></p> +</li> +<li id="fn:519"> +<p>Another thing <a class="footnote-backref" href="#fnref:519" title="Jump back to footnote 519 in the text">↩</a></p> +</li> +<li id="fn:520"> +<p>Another thing <a class="footnote-backref" href="#fnref:520" title="Jump back to footnote 520 in the text">↩</a></p> +</li> +<li id="fn:521"> +<p>Another thing <a class="footnote-backref" href="#fnref:521" title="Jump back to footnote 521 in the text">↩</a></p> +</li> +<li id="fn:522"> +<p>Another thing <a class="footnote-backref" href="#fnref:522" title="Jump back to footnote 522 in the text">↩</a></p> +</li> +<li id="fn:523"> +<p>Another thing <a class="footnote-backref" href="#fnref:523" title="Jump back to footnote 523 in the text">↩</a></p> +</li> +<li id="fn:524"> +<p>Another thing <a class="footnote-backref" href="#fnref:524" title="Jump back to footnote 524 in the text">↩</a></p> +</li> +<li id="fn:525"> +<p>Another thing <a class="footnote-backref" href="#fnref:525" title="Jump back to footnote 525 in the text">↩</a></p> +</li> +<li id="fn:526"> +<p>Another thing <a class="footnote-backref" href="#fnref:526" title="Jump back to footnote 526 in the text">↩</a></p> +</li> +<li id="fn:527"> +<p>Another thing <a class="footnote-backref" href="#fnref:527" title="Jump back to footnote 527 in the text">↩</a></p> +</li> +<li id="fn:528"> +<p>Another thing <a class="footnote-backref" href="#fnref:528" title="Jump back to footnote 528 in the text">↩</a></p> +</li> +<li id="fn:529"> +<p>Another thing <a class="footnote-backref" href="#fnref:529" title="Jump back to footnote 529 in the text">↩</a></p> +</li> +<li id="fn:530"> +<p>Another thing <a class="footnote-backref" href="#fnref:530" title="Jump back to footnote 530 in the text">↩</a></p> +</li> +<li id="fn:531"> +<p>Another thing <a class="footnote-backref" href="#fnref:531" title="Jump back to footnote 531 in the text">↩</a></p> +</li> +<li id="fn:532"> +<p>Another thing <a class="footnote-backref" href="#fnref:532" title="Jump back to footnote 532 in the text">↩</a></p> +</li> +<li id="fn:533"> +<p>Another thing <a class="footnote-backref" href="#fnref:533" title="Jump back to footnote 533 in the text">↩</a></p> +</li> +<li id="fn:534"> +<p>Another thing <a class="footnote-backref" href="#fnref:534" title="Jump back to footnote 534 in the text">↩</a></p> +</li> +<li id="fn:535"> +<p>Another thing <a class="footnote-backref" href="#fnref:535" title="Jump back to footnote 535 in the text">↩</a></p> +</li> +<li id="fn:536"> +<p>Another thing <a class="footnote-backref" href="#fnref:536" title="Jump back to footnote 536 in the text">↩</a></p> +</li> +<li id="fn:537"> +<p>Another thing <a class="footnote-backref" href="#fnref:537" title="Jump back to footnote 537 in the text">↩</a></p> +</li> +<li id="fn:538"> +<p>Another thing <a class="footnote-backref" href="#fnref:538" title="Jump back to footnote 538 in the text">↩</a></p> +</li> +<li id="fn:539"> +<p>Another thing <a class="footnote-backref" href="#fnref:539" title="Jump back to footnote 539 in the text">↩</a></p> +</li> +<li id="fn:540"> +<p>Another thing <a class="footnote-backref" href="#fnref:540" title="Jump back to footnote 540 in the text">↩</a></p> +</li> +<li id="fn:541"> +<p>Another thing <a class="footnote-backref" href="#fnref:541" title="Jump back to footnote 541 in the text">↩</a></p> +</li> +<li id="fn:542"> +<p>Another thing <a class="footnote-backref" href="#fnref:542" title="Jump back to footnote 542 in the text">↩</a></p> +</li> +<li id="fn:543"> +<p>Another thing <a class="footnote-backref" href="#fnref:543" title="Jump back to footnote 543 in the text">↩</a></p> +</li> +<li id="fn:544"> +<p>Another thing <a class="footnote-backref" href="#fnref:544" title="Jump back to footnote 544 in the text">↩</a></p> +</li> +<li id="fn:545"> +<p>Another thing <a class="footnote-backref" href="#fnref:545" title="Jump back to footnote 545 in the text">↩</a></p> +</li> +<li id="fn:546"> +<p>Another thing <a class="footnote-backref" href="#fnref:546" title="Jump back to footnote 546 in the text">↩</a></p> +</li> +<li id="fn:547"> +<p>Another thing <a class="footnote-backref" href="#fnref:547" title="Jump back to footnote 547 in the text">↩</a></p> +</li> +<li id="fn:548"> +<p>Another thing <a class="footnote-backref" href="#fnref:548" title="Jump back to footnote 548 in the text">↩</a></p> +</li> +<li id="fn:549"> +<p>Another thing <a class="footnote-backref" href="#fnref:549" title="Jump back to footnote 549 in the text">↩</a></p> +</li> +<li id="fn:550"> +<p>Another thing <a class="footnote-backref" href="#fnref:550" title="Jump back to footnote 550 in the text">↩</a></p> +</li> +<li id="fn:551"> +<p>Another thing <a class="footnote-backref" href="#fnref:551" title="Jump back to footnote 551 in the text">↩</a></p> +</li> +<li id="fn:552"> +<p>Another thing <a class="footnote-backref" href="#fnref:552" title="Jump back to footnote 552 in the text">↩</a></p> +</li> +<li id="fn:553"> +<p>Another thing <a class="footnote-backref" href="#fnref:553" title="Jump back to footnote 553 in the text">↩</a></p> +</li> +<li id="fn:554"> +<p>Another thing <a class="footnote-backref" href="#fnref:554" title="Jump back to footnote 554 in the text">↩</a></p> +</li> +<li id="fn:555"> +<p>Another thing <a class="footnote-backref" href="#fnref:555" title="Jump back to footnote 555 in the text">↩</a></p> +</li> +<li id="fn:556"> +<p>Another thing <a class="footnote-backref" href="#fnref:556" title="Jump back to footnote 556 in the text">↩</a></p> +</li> +<li id="fn:557"> +<p>Another thing <a class="footnote-backref" href="#fnref:557" title="Jump back to footnote 557 in the text">↩</a></p> +</li> +<li id="fn:558"> +<p>Another thing <a class="footnote-backref" href="#fnref:558" title="Jump back to footnote 558 in the text">↩</a></p> +</li> +<li id="fn:559"> +<p>Another thing <a class="footnote-backref" href="#fnref:559" title="Jump back to footnote 559 in the text">↩</a></p> +</li> +<li id="fn:560"> +<p>Another thing <a class="footnote-backref" href="#fnref:560" title="Jump back to footnote 560 in the text">↩</a></p> +</li> +<li id="fn:561"> +<p>Another thing <a class="footnote-backref" href="#fnref:561" title="Jump back to footnote 561 in the text">↩</a></p> +</li> +<li id="fn:562"> +<p>Another thing <a class="footnote-backref" href="#fnref:562" title="Jump back to footnote 562 in the text">↩</a></p> +</li> +<li id="fn:563"> +<p>Another thing <a class="footnote-backref" href="#fnref:563" title="Jump back to footnote 563 in the text">↩</a></p> +</li> +<li id="fn:564"> +<p>Another thing <a class="footnote-backref" href="#fnref:564" title="Jump back to footnote 564 in the text">↩</a></p> +</li> +<li id="fn:565"> +<p>Another thing <a class="footnote-backref" href="#fnref:565" title="Jump back to footnote 565 in the text">↩</a></p> +</li> +<li id="fn:566"> +<p>Another thing <a class="footnote-backref" href="#fnref:566" title="Jump back to footnote 566 in the text">↩</a></p> +</li> +<li id="fn:567"> +<p>Another thing <a class="footnote-backref" href="#fnref:567" title="Jump back to footnote 567 in the text">↩</a></p> +</li> +<li id="fn:568"> +<p>Another thing <a class="footnote-backref" href="#fnref:568" title="Jump back to footnote 568 in the text">↩</a></p> +</li> +<li id="fn:569"> +<p>Another thing <a class="footnote-backref" href="#fnref:569" title="Jump back to footnote 569 in the text">↩</a></p> +</li> +<li id="fn:570"> +<p>Another thing <a class="footnote-backref" href="#fnref:570" title="Jump back to footnote 570 in the text">↩</a></p> +</li> +<li id="fn:571"> +<p>Another thing <a class="footnote-backref" href="#fnref:571" title="Jump back to footnote 571 in the text">↩</a></p> +</li> +<li id="fn:572"> +<p>Another thing <a class="footnote-backref" href="#fnref:572" title="Jump back to footnote 572 in the text">↩</a></p> +</li> +<li id="fn:573"> +<p>Another thing <a class="footnote-backref" href="#fnref:573" title="Jump back to footnote 573 in the text">↩</a></p> +</li> +<li id="fn:574"> +<p>Another thing <a class="footnote-backref" href="#fnref:574" title="Jump back to footnote 574 in the text">↩</a></p> +</li> +<li id="fn:575"> +<p>Another thing <a class="footnote-backref" href="#fnref:575" title="Jump back to footnote 575 in the text">↩</a></p> +</li> +<li id="fn:576"> +<p>Another thing <a class="footnote-backref" href="#fnref:576" title="Jump back to footnote 576 in the text">↩</a></p> +</li> +<li id="fn:577"> +<p>Another thing <a class="footnote-backref" href="#fnref:577" title="Jump back to footnote 577 in the text">↩</a></p> +</li> +<li id="fn:578"> +<p>Another thing <a class="footnote-backref" href="#fnref:578" title="Jump back to footnote 578 in the text">↩</a></p> +</li> +<li id="fn:579"> +<p>Another thing <a class="footnote-backref" href="#fnref:579" title="Jump back to footnote 579 in the text">↩</a></p> +</li> +<li id="fn:580"> +<p>Another thing <a class="footnote-backref" href="#fnref:580" title="Jump back to footnote 580 in the text">↩</a></p> +</li> +<li id="fn:581"> +<p>Another thing <a class="footnote-backref" href="#fnref:581" title="Jump back to footnote 581 in the text">↩</a></p> +</li> +<li id="fn:582"> +<p>Another thing <a class="footnote-backref" href="#fnref:582" title="Jump back to footnote 582 in the text">↩</a></p> +</li> +<li id="fn:583"> +<p>Another thing <a class="footnote-backref" href="#fnref:583" title="Jump back to footnote 583 in the text">↩</a></p> +</li> +<li id="fn:584"> +<p>Another thing <a class="footnote-backref" href="#fnref:584" title="Jump back to footnote 584 in the text">↩</a></p> +</li> +<li id="fn:585"> +<p>Another thing <a class="footnote-backref" href="#fnref:585" title="Jump back to footnote 585 in the text">↩</a></p> +</li> +<li id="fn:586"> +<p>Another thing <a class="footnote-backref" href="#fnref:586" title="Jump back to footnote 586 in the text">↩</a></p> +</li> +<li id="fn:587"> +<p>Another thing <a class="footnote-backref" href="#fnref:587" title="Jump back to footnote 587 in the text">↩</a></p> +</li> +<li id="fn:588"> +<p>Another thing <a class="footnote-backref" href="#fnref:588" title="Jump back to footnote 588 in the text">↩</a></p> +</li> +<li id="fn:589"> +<p>Another thing <a class="footnote-backref" href="#fnref:589" title="Jump back to footnote 589 in the text">↩</a></p> +</li> +<li id="fn:590"> +<p>Another thing <a class="footnote-backref" href="#fnref:590" title="Jump back to footnote 590 in the text">↩</a></p> +</li> +<li id="fn:591"> +<p>Another thing <a class="footnote-backref" href="#fnref:591" title="Jump back to footnote 591 in the text">↩</a></p> +</li> +<li id="fn:592"> +<p>Another thing <a class="footnote-backref" href="#fnref:592" title="Jump back to footnote 592 in the text">↩</a></p> +</li> +<li id="fn:593"> +<p>Another thing <a class="footnote-backref" href="#fnref:593" title="Jump back to footnote 593 in the text">↩</a></p> +</li> +<li id="fn:594"> +<p>Another thing <a class="footnote-backref" href="#fnref:594" title="Jump back to footnote 594 in the text">↩</a></p> +</li> +<li id="fn:595"> +<p>Another thing <a class="footnote-backref" href="#fnref:595" title="Jump back to footnote 595 in the text">↩</a></p> +</li> +<li id="fn:596"> +<p>Another thing <a class="footnote-backref" href="#fnref:596" title="Jump back to footnote 596 in the text">↩</a></p> +</li> +<li id="fn:597"> +<p>Another thing <a class="footnote-backref" href="#fnref:597" title="Jump back to footnote 597 in the text">↩</a></p> +</li> +<li id="fn:598"> +<p>Another thing <a class="footnote-backref" href="#fnref:598" title="Jump back to footnote 598 in the text">↩</a></p> +</li> +<li id="fn:599"> +<p>Another thing <a class="footnote-backref" href="#fnref:599" title="Jump back to footnote 599 in the text">↩</a></p> +</li> +<li id="fn:600"> +<p>Another thing <a class="footnote-backref" href="#fnref:600" title="Jump back to footnote 600 in the text">↩</a></p> +</li> +<li id="fn:601"> +<p>Another thing <a class="footnote-backref" href="#fnref:601" title="Jump back to footnote 601 in the text">↩</a></p> +</li> +<li id="fn:602"> +<p>Another thing <a class="footnote-backref" href="#fnref:602" title="Jump back to footnote 602 in the text">↩</a></p> +</li> +<li id="fn:603"> +<p>Another thing <a class="footnote-backref" href="#fnref:603" title="Jump back to footnote 603 in the text">↩</a></p> +</li> +<li id="fn:604"> +<p>Another thing <a class="footnote-backref" href="#fnref:604" title="Jump back to footnote 604 in the text">↩</a></p> +</li> +<li id="fn:605"> +<p>Another thing <a class="footnote-backref" href="#fnref:605" title="Jump back to footnote 605 in the text">↩</a></p> +</li> +<li id="fn:606"> +<p>Another thing <a class="footnote-backref" href="#fnref:606" title="Jump back to footnote 606 in the text">↩</a></p> +</li> +<li id="fn:607"> +<p>Another thing <a class="footnote-backref" href="#fnref:607" title="Jump back to footnote 607 in the text">↩</a></p> +</li> +<li id="fn:608"> +<p>Another thing <a class="footnote-backref" href="#fnref:608" title="Jump back to footnote 608 in the text">↩</a></p> +</li> +<li id="fn:609"> +<p>Another thing <a class="footnote-backref" href="#fnref:609" title="Jump back to footnote 609 in the text">↩</a></p> +</li> +<li id="fn:610"> +<p>Another thing <a class="footnote-backref" href="#fnref:610" title="Jump back to footnote 610 in the text">↩</a></p> +</li> +<li id="fn:611"> +<p>Another thing <a class="footnote-backref" href="#fnref:611" title="Jump back to footnote 611 in the text">↩</a></p> +</li> +<li id="fn:612"> +<p>Another thing <a class="footnote-backref" href="#fnref:612" title="Jump back to footnote 612 in the text">↩</a></p> +</li> +<li id="fn:613"> +<p>Another thing <a class="footnote-backref" href="#fnref:613" title="Jump back to footnote 613 in the text">↩</a></p> +</li> +<li id="fn:614"> +<p>Another thing <a class="footnote-backref" href="#fnref:614" title="Jump back to footnote 614 in the text">↩</a></p> +</li> +<li id="fn:615"> +<p>Another thing <a class="footnote-backref" href="#fnref:615" title="Jump back to footnote 615 in the text">↩</a></p> +</li> +<li id="fn:616"> +<p>Another thing <a class="footnote-backref" href="#fnref:616" title="Jump back to footnote 616 in the text">↩</a></p> +</li> +<li id="fn:617"> +<p>Another thing <a class="footnote-backref" href="#fnref:617" title="Jump back to footnote 617 in the text">↩</a></p> +</li> +<li id="fn:618"> +<p>Another thing <a class="footnote-backref" href="#fnref:618" title="Jump back to footnote 618 in the text">↩</a></p> +</li> +<li id="fn:619"> +<p>Another thing <a class="footnote-backref" href="#fnref:619" title="Jump back to footnote 619 in the text">↩</a></p> +</li> +<li id="fn:620"> +<p>Another thing <a class="footnote-backref" href="#fnref:620" title="Jump back to footnote 620 in the text">↩</a></p> +</li> +<li id="fn:621"> +<p>Another thing <a class="footnote-backref" href="#fnref:621" title="Jump back to footnote 621 in the text">↩</a></p> +</li> +<li id="fn:622"> +<p>Another thing <a class="footnote-backref" href="#fnref:622" title="Jump back to footnote 622 in the text">↩</a></p> +</li> +<li id="fn:623"> +<p>Another thing <a class="footnote-backref" href="#fnref:623" title="Jump back to footnote 623 in the text">↩</a></p> +</li> +<li id="fn:624"> +<p>Another thing <a class="footnote-backref" href="#fnref:624" title="Jump back to footnote 624 in the text">↩</a></p> +</li> +<li id="fn:625"> +<p>Another thing <a class="footnote-backref" href="#fnref:625" title="Jump back to footnote 625 in the text">↩</a></p> +</li> +<li id="fn:626"> +<p>Another thing <a class="footnote-backref" href="#fnref:626" title="Jump back to footnote 626 in the text">↩</a></p> +</li> +<li id="fn:627"> +<p>Another thing <a class="footnote-backref" href="#fnref:627" title="Jump back to footnote 627 in the text">↩</a></p> +</li> +<li id="fn:628"> +<p>Another thing <a class="footnote-backref" href="#fnref:628" title="Jump back to footnote 628 in the text">↩</a></p> +</li> +<li id="fn:629"> +<p>Another thing <a class="footnote-backref" href="#fnref:629" title="Jump back to footnote 629 in the text">↩</a></p> +</li> +<li id="fn:630"> +<p>Another thing <a class="footnote-backref" href="#fnref:630" title="Jump back to footnote 630 in the text">↩</a></p> +</li> +<li id="fn:631"> +<p>Another thing <a class="footnote-backref" href="#fnref:631" title="Jump back to footnote 631 in the text">↩</a></p> +</li> +<li id="fn:632"> +<p>Another thing <a class="footnote-backref" href="#fnref:632" title="Jump back to footnote 632 in the text">↩</a></p> +</li> +<li id="fn:633"> +<p>Another thing <a class="footnote-backref" href="#fnref:633" title="Jump back to footnote 633 in the text">↩</a></p> +</li> +<li id="fn:634"> +<p>Another thing <a class="footnote-backref" href="#fnref:634" title="Jump back to footnote 634 in the text">↩</a></p> +</li> +<li id="fn:635"> +<p>Another thing <a class="footnote-backref" href="#fnref:635" title="Jump back to footnote 635 in the text">↩</a></p> +</li> +<li id="fn:636"> +<p>Another thing <a class="footnote-backref" href="#fnref:636" title="Jump back to footnote 636 in the text">↩</a></p> +</li> +<li id="fn:637"> +<p>Another thing <a class="footnote-backref" href="#fnref:637" title="Jump back to footnote 637 in the text">↩</a></p> +</li> +<li id="fn:638"> +<p>Another thing <a class="footnote-backref" href="#fnref:638" title="Jump back to footnote 638 in the text">↩</a></p> +</li> +<li id="fn:639"> +<p>Another thing <a class="footnote-backref" href="#fnref:639" title="Jump back to footnote 639 in the text">↩</a></p> +</li> +<li id="fn:640"> +<p>Another thing <a class="footnote-backref" href="#fnref:640" title="Jump back to footnote 640 in the text">↩</a></p> +</li> +<li id="fn:641"> +<p>Another thing <a class="footnote-backref" href="#fnref:641" title="Jump back to footnote 641 in the text">↩</a></p> +</li> +<li id="fn:642"> +<p>Another thing <a class="footnote-backref" href="#fnref:642" title="Jump back to footnote 642 in the text">↩</a></p> +</li> +<li id="fn:643"> +<p>Another thing <a class="footnote-backref" href="#fnref:643" title="Jump back to footnote 643 in the text">↩</a></p> +</li> +<li id="fn:644"> +<p>Another thing <a class="footnote-backref" href="#fnref:644" title="Jump back to footnote 644 in the text">↩</a></p> +</li> +<li id="fn:645"> +<p>Another thing <a class="footnote-backref" href="#fnref:645" title="Jump back to footnote 645 in the text">↩</a></p> +</li> +<li id="fn:646"> +<p>Another thing <a class="footnote-backref" href="#fnref:646" title="Jump back to footnote 646 in the text">↩</a></p> +</li> +<li id="fn:647"> +<p>Another thing <a class="footnote-backref" href="#fnref:647" title="Jump back to footnote 647 in the text">↩</a></p> +</li> +<li id="fn:648"> +<p>Another thing <a class="footnote-backref" href="#fnref:648" title="Jump back to footnote 648 in the text">↩</a></p> +</li> +<li id="fn:649"> +<p>Another thing <a class="footnote-backref" href="#fnref:649" title="Jump back to footnote 649 in the text">↩</a></p> +</li> +<li id="fn:650"> +<p>Another thing <a class="footnote-backref" href="#fnref:650" title="Jump back to footnote 650 in the text">↩</a></p> +</li> +<li id="fn:651"> +<p>Another thing <a class="footnote-backref" href="#fnref:651" title="Jump back to footnote 651 in the text">↩</a></p> +</li> +<li id="fn:652"> +<p>Another thing <a class="footnote-backref" href="#fnref:652" title="Jump back to footnote 652 in the text">↩</a></p> +</li> +<li id="fn:653"> +<p>Another thing <a class="footnote-backref" href="#fnref:653" title="Jump back to footnote 653 in the text">↩</a></p> +</li> +<li id="fn:654"> +<p>Another thing <a class="footnote-backref" href="#fnref:654" title="Jump back to footnote 654 in the text">↩</a></p> +</li> +<li id="fn:655"> +<p>Another thing <a class="footnote-backref" href="#fnref:655" title="Jump back to footnote 655 in the text">↩</a></p> +</li> +<li id="fn:656"> +<p>Another thing <a class="footnote-backref" href="#fnref:656" title="Jump back to footnote 656 in the text">↩</a></p> +</li> +<li id="fn:657"> +<p>Another thing <a class="footnote-backref" href="#fnref:657" title="Jump back to footnote 657 in the text">↩</a></p> +</li> +<li id="fn:658"> +<p>Another thing <a class="footnote-backref" href="#fnref:658" title="Jump back to footnote 658 in the text">↩</a></p> +</li> +<li id="fn:659"> +<p>Another thing <a class="footnote-backref" href="#fnref:659" title="Jump back to footnote 659 in the text">↩</a></p> +</li> +<li id="fn:660"> +<p>Another thing <a class="footnote-backref" href="#fnref:660" title="Jump back to footnote 660 in the text">↩</a></p> +</li> +<li id="fn:661"> +<p>Another thing <a class="footnote-backref" href="#fnref:661" title="Jump back to footnote 661 in the text">↩</a></p> +</li> +<li id="fn:662"> +<p>Another thing <a class="footnote-backref" href="#fnref:662" title="Jump back to footnote 662 in the text">↩</a></p> +</li> +<li id="fn:663"> +<p>Another thing <a class="footnote-backref" href="#fnref:663" title="Jump back to footnote 663 in the text">↩</a></p> +</li> +<li id="fn:664"> +<p>Another thing <a class="footnote-backref" href="#fnref:664" title="Jump back to footnote 664 in the text">↩</a></p> +</li> +<li id="fn:665"> +<p>Another thing <a class="footnote-backref" href="#fnref:665" title="Jump back to footnote 665 in the text">↩</a></p> +</li> +<li id="fn:666"> +<p>Another thing <a class="footnote-backref" href="#fnref:666" title="Jump back to footnote 666 in the text">↩</a></p> +</li> +<li id="fn:667"> +<p>Another thing <a class="footnote-backref" href="#fnref:667" title="Jump back to footnote 667 in the text">↩</a></p> +</li> +<li id="fn:668"> +<p>Another thing <a class="footnote-backref" href="#fnref:668" title="Jump back to footnote 668 in the text">↩</a></p> +</li> +<li id="fn:669"> +<p>Another thing <a class="footnote-backref" href="#fnref:669" title="Jump back to footnote 669 in the text">↩</a></p> +</li> +<li id="fn:670"> +<p>Another thing <a class="footnote-backref" href="#fnref:670" title="Jump back to footnote 670 in the text">↩</a></p> +</li> +<li id="fn:671"> +<p>Another thing <a class="footnote-backref" href="#fnref:671" title="Jump back to footnote 671 in the text">↩</a></p> +</li> +<li id="fn:672"> +<p>Another thing <a class="footnote-backref" href="#fnref:672" title="Jump back to footnote 672 in the text">↩</a></p> +</li> +<li id="fn:673"> +<p>Another thing <a class="footnote-backref" href="#fnref:673" title="Jump back to footnote 673 in the text">↩</a></p> +</li> +<li id="fn:674"> +<p>Another thing <a class="footnote-backref" href="#fnref:674" title="Jump back to footnote 674 in the text">↩</a></p> +</li> +<li id="fn:675"> +<p>Another thing <a class="footnote-backref" href="#fnref:675" title="Jump back to footnote 675 in the text">↩</a></p> +</li> +<li id="fn:676"> +<p>Another thing <a class="footnote-backref" href="#fnref:676" title="Jump back to footnote 676 in the text">↩</a></p> +</li> +<li id="fn:677"> +<p>Another thing <a class="footnote-backref" href="#fnref:677" title="Jump back to footnote 677 in the text">↩</a></p> +</li> +<li id="fn:678"> +<p>Another thing <a class="footnote-backref" href="#fnref:678" title="Jump back to footnote 678 in the text">↩</a></p> +</li> +<li id="fn:679"> +<p>Another thing <a class="footnote-backref" href="#fnref:679" title="Jump back to footnote 679 in the text">↩</a></p> +</li> +<li id="fn:680"> +<p>Another thing <a class="footnote-backref" href="#fnref:680" title="Jump back to footnote 680 in the text">↩</a></p> +</li> +<li id="fn:681"> +<p>Another thing <a class="footnote-backref" href="#fnref:681" title="Jump back to footnote 681 in the text">↩</a></p> +</li> +<li id="fn:682"> +<p>Another thing <a class="footnote-backref" href="#fnref:682" title="Jump back to footnote 682 in the text">↩</a></p> +</li> +<li id="fn:683"> +<p>Another thing <a class="footnote-backref" href="#fnref:683" title="Jump back to footnote 683 in the text">↩</a></p> +</li> +<li id="fn:684"> +<p>Another thing <a class="footnote-backref" href="#fnref:684" title="Jump back to footnote 684 in the text">↩</a></p> +</li> +<li id="fn:685"> +<p>Another thing <a class="footnote-backref" href="#fnref:685" title="Jump back to footnote 685 in the text">↩</a></p> +</li> +<li id="fn:686"> +<p>Another thing <a class="footnote-backref" href="#fnref:686" title="Jump back to footnote 686 in the text">↩</a></p> +</li> +<li id="fn:687"> +<p>Another thing <a class="footnote-backref" href="#fnref:687" title="Jump back to footnote 687 in the text">↩</a></p> +</li> +<li id="fn:688"> +<p>Another thing <a class="footnote-backref" href="#fnref:688" title="Jump back to footnote 688 in the text">↩</a></p> +</li> +<li id="fn:689"> +<p>Another thing <a class="footnote-backref" href="#fnref:689" title="Jump back to footnote 689 in the text">↩</a></p> +</li> +<li id="fn:690"> +<p>Another thing <a class="footnote-backref" href="#fnref:690" title="Jump back to footnote 690 in the text">↩</a></p> +</li> +<li id="fn:691"> +<p>Another thing <a class="footnote-backref" href="#fnref:691" title="Jump back to footnote 691 in the text">↩</a></p> +</li> +<li id="fn:692"> +<p>Another thing <a class="footnote-backref" href="#fnref:692" title="Jump back to footnote 692 in the text">↩</a></p> +</li> +<li id="fn:693"> +<p>Another thing <a class="footnote-backref" href="#fnref:693" title="Jump back to footnote 693 in the text">↩</a></p> +</li> +<li id="fn:694"> +<p>Another thing <a class="footnote-backref" href="#fnref:694" title="Jump back to footnote 694 in the text">↩</a></p> +</li> +<li id="fn:695"> +<p>Another thing <a class="footnote-backref" href="#fnref:695" title="Jump back to footnote 695 in the text">↩</a></p> +</li> +<li id="fn:696"> +<p>Another thing <a class="footnote-backref" href="#fnref:696" title="Jump back to footnote 696 in the text">↩</a></p> +</li> +<li id="fn:697"> +<p>Another thing <a class="footnote-backref" href="#fnref:697" title="Jump back to footnote 697 in the text">↩</a></p> +</li> +<li id="fn:698"> +<p>Another thing <a class="footnote-backref" href="#fnref:698" title="Jump back to footnote 698 in the text">↩</a></p> +</li> +<li id="fn:699"> +<p>Another thing <a class="footnote-backref" href="#fnref:699" title="Jump back to footnote 699 in the text">↩</a></p> +</li> +<li id="fn:700"> +<p>Another thing <a class="footnote-backref" href="#fnref:700" title="Jump back to footnote 700 in the text">↩</a></p> +</li> +<li id="fn:701"> +<p>Another thing <a class="footnote-backref" href="#fnref:701" title="Jump back to footnote 701 in the text">↩</a></p> +</li> +<li id="fn:702"> +<p>Another thing <a class="footnote-backref" href="#fnref:702" title="Jump back to footnote 702 in the text">↩</a></p> +</li> +<li id="fn:703"> +<p>Another thing <a class="footnote-backref" href="#fnref:703" title="Jump back to footnote 703 in the text">↩</a></p> +</li> +<li id="fn:704"> +<p>Another thing <a class="footnote-backref" href="#fnref:704" title="Jump back to footnote 704 in the text">↩</a></p> +</li> +<li id="fn:705"> +<p>Another thing <a class="footnote-backref" href="#fnref:705" title="Jump back to footnote 705 in the text">↩</a></p> +</li> +<li id="fn:706"> +<p>Another thing <a class="footnote-backref" href="#fnref:706" title="Jump back to footnote 706 in the text">↩</a></p> +</li> +<li id="fn:707"> +<p>Another thing <a class="footnote-backref" href="#fnref:707" title="Jump back to footnote 707 in the text">↩</a></p> +</li> +<li id="fn:708"> +<p>Another thing <a class="footnote-backref" href="#fnref:708" title="Jump back to footnote 708 in the text">↩</a></p> +</li> +<li id="fn:709"> +<p>Another thing <a class="footnote-backref" href="#fnref:709" title="Jump back to footnote 709 in the text">↩</a></p> +</li> +<li id="fn:710"> +<p>Another thing <a class="footnote-backref" href="#fnref:710" title="Jump back to footnote 710 in the text">↩</a></p> +</li> +<li id="fn:711"> +<p>Another thing <a class="footnote-backref" href="#fnref:711" title="Jump back to footnote 711 in the text">↩</a></p> +</li> +<li id="fn:712"> +<p>Another thing <a class="footnote-backref" href="#fnref:712" title="Jump back to footnote 712 in the text">↩</a></p> +</li> +<li id="fn:713"> +<p>Another thing <a class="footnote-backref" href="#fnref:713" title="Jump back to footnote 713 in the text">↩</a></p> +</li> +<li id="fn:714"> +<p>Another thing <a class="footnote-backref" href="#fnref:714" title="Jump back to footnote 714 in the text">↩</a></p> +</li> +<li id="fn:715"> +<p>Another thing <a class="footnote-backref" href="#fnref:715" title="Jump back to footnote 715 in the text">↩</a></p> +</li> +<li id="fn:716"> +<p>Another thing <a class="footnote-backref" href="#fnref:716" title="Jump back to footnote 716 in the text">↩</a></p> +</li> +<li id="fn:717"> +<p>Another thing <a class="footnote-backref" href="#fnref:717" title="Jump back to footnote 717 in the text">↩</a></p> +</li> +<li id="fn:718"> +<p>Another thing <a class="footnote-backref" href="#fnref:718" title="Jump back to footnote 718 in the text">↩</a></p> +</li> +<li id="fn:719"> +<p>Another thing <a class="footnote-backref" href="#fnref:719" title="Jump back to footnote 719 in the text">↩</a></p> +</li> +<li id="fn:720"> +<p>Another thing <a class="footnote-backref" href="#fnref:720" title="Jump back to footnote 720 in the text">↩</a></p> +</li> +<li id="fn:721"> +<p>Another thing <a class="footnote-backref" href="#fnref:721" title="Jump back to footnote 721 in the text">↩</a></p> +</li> +<li id="fn:722"> +<p>Another thing <a class="footnote-backref" href="#fnref:722" title="Jump back to footnote 722 in the text">↩</a></p> +</li> +<li id="fn:723"> +<p>Another thing <a class="footnote-backref" href="#fnref:723" title="Jump back to footnote 723 in the text">↩</a></p> +</li> +<li id="fn:724"> +<p>Another thing <a class="footnote-backref" href="#fnref:724" title="Jump back to footnote 724 in the text">↩</a></p> +</li> +<li id="fn:725"> +<p>Another thing <a class="footnote-backref" href="#fnref:725" title="Jump back to footnote 725 in the text">↩</a></p> +</li> +<li id="fn:726"> +<p>Another thing <a class="footnote-backref" href="#fnref:726" title="Jump back to footnote 726 in the text">↩</a></p> +</li> +<li id="fn:727"> +<p>Another thing <a class="footnote-backref" href="#fnref:727" title="Jump back to footnote 727 in the text">↩</a></p> +</li> +<li id="fn:728"> +<p>Another thing <a class="footnote-backref" href="#fnref:728" title="Jump back to footnote 728 in the text">↩</a></p> +</li> +<li id="fn:729"> +<p>Another thing <a class="footnote-backref" href="#fnref:729" title="Jump back to footnote 729 in the text">↩</a></p> +</li> +<li id="fn:730"> +<p>Another thing <a class="footnote-backref" href="#fnref:730" title="Jump back to footnote 730 in the text">↩</a></p> +</li> +<li id="fn:731"> +<p>Another thing <a class="footnote-backref" href="#fnref:731" title="Jump back to footnote 731 in the text">↩</a></p> +</li> +<li id="fn:732"> +<p>Another thing <a class="footnote-backref" href="#fnref:732" title="Jump back to footnote 732 in the text">↩</a></p> +</li> +<li id="fn:733"> +<p>Another thing <a class="footnote-backref" href="#fnref:733" title="Jump back to footnote 733 in the text">↩</a></p> +</li> +<li id="fn:734"> +<p>Another thing <a class="footnote-backref" href="#fnref:734" title="Jump back to footnote 734 in the text">↩</a></p> +</li> +<li id="fn:735"> +<p>Another thing <a class="footnote-backref" href="#fnref:735" title="Jump back to footnote 735 in the text">↩</a></p> +</li> +<li id="fn:736"> +<p>Another thing <a class="footnote-backref" href="#fnref:736" title="Jump back to footnote 736 in the text">↩</a></p> +</li> +<li id="fn:737"> +<p>Another thing <a class="footnote-backref" href="#fnref:737" title="Jump back to footnote 737 in the text">↩</a></p> +</li> +<li id="fn:738"> +<p>Another thing <a class="footnote-backref" href="#fnref:738" title="Jump back to footnote 738 in the text">↩</a></p> +</li> +<li id="fn:739"> +<p>Another thing <a class="footnote-backref" href="#fnref:739" title="Jump back to footnote 739 in the text">↩</a></p> +</li> +<li id="fn:740"> +<p>Another thing <a class="footnote-backref" href="#fnref:740" title="Jump back to footnote 740 in the text">↩</a></p> +</li> +<li id="fn:741"> +<p>Another thing <a class="footnote-backref" href="#fnref:741" title="Jump back to footnote 741 in the text">↩</a></p> +</li> +<li id="fn:742"> +<p>Another thing <a class="footnote-backref" href="#fnref:742" title="Jump back to footnote 742 in the text">↩</a></p> +</li> +<li id="fn:743"> +<p>Another thing <a class="footnote-backref" href="#fnref:743" title="Jump back to footnote 743 in the text">↩</a></p> +</li> +<li id="fn:744"> +<p>Another thing <a class="footnote-backref" href="#fnref:744" title="Jump back to footnote 744 in the text">↩</a></p> +</li> +<li id="fn:745"> +<p>Another thing <a class="footnote-backref" href="#fnref:745" title="Jump back to footnote 745 in the text">↩</a></p> +</li> +<li id="fn:746"> +<p>Another thing <a class="footnote-backref" href="#fnref:746" title="Jump back to footnote 746 in the text">↩</a></p> +</li> +<li id="fn:747"> +<p>Another thing <a class="footnote-backref" href="#fnref:747" title="Jump back to footnote 747 in the text">↩</a></p> +</li> +<li id="fn:748"> +<p>Another thing <a class="footnote-backref" href="#fnref:748" title="Jump back to footnote 748 in the text">↩</a></p> +</li> +<li id="fn:749"> +<p>Another thing <a class="footnote-backref" href="#fnref:749" title="Jump back to footnote 749 in the text">↩</a></p> +</li> +<li id="fn:750"> +<p>Another thing <a class="footnote-backref" href="#fnref:750" title="Jump back to footnote 750 in the text">↩</a></p> +</li> +<li id="fn:751"> +<p>Another thing <a class="footnote-backref" href="#fnref:751" title="Jump back to footnote 751 in the text">↩</a></p> +</li> +<li id="fn:752"> +<p>Another thing <a class="footnote-backref" href="#fnref:752" title="Jump back to footnote 752 in the text">↩</a></p> +</li> +<li id="fn:753"> +<p>Another thing <a class="footnote-backref" href="#fnref:753" title="Jump back to footnote 753 in the text">↩</a></p> +</li> +<li id="fn:754"> +<p>Another thing <a class="footnote-backref" href="#fnref:754" title="Jump back to footnote 754 in the text">↩</a></p> +</li> +<li id="fn:755"> +<p>Another thing <a class="footnote-backref" href="#fnref:755" title="Jump back to footnote 755 in the text">↩</a></p> +</li> +<li id="fn:756"> +<p>Another thing <a class="footnote-backref" href="#fnref:756" title="Jump back to footnote 756 in the text">↩</a></p> +</li> +<li id="fn:757"> +<p>Another thing <a class="footnote-backref" href="#fnref:757" title="Jump back to footnote 757 in the text">↩</a></p> +</li> +<li id="fn:758"> +<p>Another thing <a class="footnote-backref" href="#fnref:758" title="Jump back to footnote 758 in the text">↩</a></p> +</li> +<li id="fn:759"> +<p>Another thing <a class="footnote-backref" href="#fnref:759" title="Jump back to footnote 759 in the text">↩</a></p> +</li> +<li id="fn:760"> +<p>Another thing <a class="footnote-backref" href="#fnref:760" title="Jump back to footnote 760 in the text">↩</a></p> +</li> +<li id="fn:761"> +<p>Another thing <a class="footnote-backref" href="#fnref:761" title="Jump back to footnote 761 in the text">↩</a></p> +</li> +<li id="fn:762"> +<p>Another thing <a class="footnote-backref" href="#fnref:762" title="Jump back to footnote 762 in the text">↩</a></p> +</li> +<li id="fn:763"> +<p>Another thing <a class="footnote-backref" href="#fnref:763" title="Jump back to footnote 763 in the text">↩</a></p> +</li> +<li id="fn:764"> +<p>Another thing <a class="footnote-backref" href="#fnref:764" title="Jump back to footnote 764 in the text">↩</a></p> +</li> +<li id="fn:765"> +<p>Another thing <a class="footnote-backref" href="#fnref:765" title="Jump back to footnote 765 in the text">↩</a></p> +</li> +<li id="fn:766"> +<p>Another thing <a class="footnote-backref" href="#fnref:766" title="Jump back to footnote 766 in the text">↩</a></p> +</li> +<li id="fn:767"> +<p>Another thing <a class="footnote-backref" href="#fnref:767" title="Jump back to footnote 767 in the text">↩</a></p> +</li> +<li id="fn:768"> +<p>Another thing <a class="footnote-backref" href="#fnref:768" title="Jump back to footnote 768 in the text">↩</a></p> +</li> +<li id="fn:769"> +<p>Another thing <a class="footnote-backref" href="#fnref:769" title="Jump back to footnote 769 in the text">↩</a></p> +</li> +<li id="fn:770"> +<p>Another thing <a class="footnote-backref" href="#fnref:770" title="Jump back to footnote 770 in the text">↩</a></p> +</li> +<li id="fn:771"> +<p>Another thing <a class="footnote-backref" href="#fnref:771" title="Jump back to footnote 771 in the text">↩</a></p> +</li> +<li id="fn:772"> +<p>Another thing <a class="footnote-backref" href="#fnref:772" title="Jump back to footnote 772 in the text">↩</a></p> +</li> +<li id="fn:773"> +<p>Another thing <a class="footnote-backref" href="#fnref:773" title="Jump back to footnote 773 in the text">↩</a></p> +</li> +<li id="fn:774"> +<p>Another thing <a class="footnote-backref" href="#fnref:774" title="Jump back to footnote 774 in the text">↩</a></p> +</li> +<li id="fn:775"> +<p>Another thing <a class="footnote-backref" href="#fnref:775" title="Jump back to footnote 775 in the text">↩</a></p> +</li> +<li id="fn:776"> +<p>Another thing <a class="footnote-backref" href="#fnref:776" title="Jump back to footnote 776 in the text">↩</a></p> +</li> +<li id="fn:777"> +<p>Another thing <a class="footnote-backref" href="#fnref:777" title="Jump back to footnote 777 in the text">↩</a></p> +</li> +<li id="fn:778"> +<p>Another thing <a class="footnote-backref" href="#fnref:778" title="Jump back to footnote 778 in the text">↩</a></p> +</li> +<li id="fn:779"> +<p>Another thing <a class="footnote-backref" href="#fnref:779" title="Jump back to footnote 779 in the text">↩</a></p> +</li> +<li id="fn:780"> +<p>Another thing <a class="footnote-backref" href="#fnref:780" title="Jump back to footnote 780 in the text">↩</a></p> +</li> +<li id="fn:781"> +<p>Another thing <a class="footnote-backref" href="#fnref:781" title="Jump back to footnote 781 in the text">↩</a></p> +</li> +<li id="fn:782"> +<p>Another thing <a class="footnote-backref" href="#fnref:782" title="Jump back to footnote 782 in the text">↩</a></p> +</li> +<li id="fn:783"> +<p>Another thing <a class="footnote-backref" href="#fnref:783" title="Jump back to footnote 783 in the text">↩</a></p> +</li> +<li id="fn:784"> +<p>Another thing <a class="footnote-backref" href="#fnref:784" title="Jump back to footnote 784 in the text">↩</a></p> +</li> +<li id="fn:785"> +<p>Another thing <a class="footnote-backref" href="#fnref:785" title="Jump back to footnote 785 in the text">↩</a></p> +</li> +<li id="fn:786"> +<p>Another thing <a class="footnote-backref" href="#fnref:786" title="Jump back to footnote 786 in the text">↩</a></p> +</li> +<li id="fn:787"> +<p>Another thing <a class="footnote-backref" href="#fnref:787" title="Jump back to footnote 787 in the text">↩</a></p> +</li> +<li id="fn:788"> +<p>Another thing <a class="footnote-backref" href="#fnref:788" title="Jump back to footnote 788 in the text">↩</a></p> +</li> +<li id="fn:789"> +<p>Another thing <a class="footnote-backref" href="#fnref:789" title="Jump back to footnote 789 in the text">↩</a></p> +</li> +<li id="fn:790"> +<p>Another thing <a class="footnote-backref" href="#fnref:790" title="Jump back to footnote 790 in the text">↩</a></p> +</li> +<li id="fn:791"> +<p>Another thing <a class="footnote-backref" href="#fnref:791" title="Jump back to footnote 791 in the text">↩</a></p> +</li> +<li id="fn:792"> +<p>Another thing <a class="footnote-backref" href="#fnref:792" title="Jump back to footnote 792 in the text">↩</a></p> +</li> +<li id="fn:793"> +<p>Another thing <a class="footnote-backref" href="#fnref:793" title="Jump back to footnote 793 in the text">↩</a></p> +</li> +<li id="fn:794"> +<p>Another thing <a class="footnote-backref" href="#fnref:794" title="Jump back to footnote 794 in the text">↩</a></p> +</li> +<li id="fn:795"> +<p>Another thing <a class="footnote-backref" href="#fnref:795" title="Jump back to footnote 795 in the text">↩</a></p> +</li> +<li id="fn:796"> +<p>Another thing <a class="footnote-backref" href="#fnref:796" title="Jump back to footnote 796 in the text">↩</a></p> +</li> +<li id="fn:797"> +<p>Another thing <a class="footnote-backref" href="#fnref:797" title="Jump back to footnote 797 in the text">↩</a></p> +</li> +<li id="fn:798"> +<p>Another thing <a class="footnote-backref" href="#fnref:798" title="Jump back to footnote 798 in the text">↩</a></p> +</li> +<li id="fn:799"> +<p>Another thing <a class="footnote-backref" href="#fnref:799" title="Jump back to footnote 799 in the text">↩</a></p> +</li> +<li id="fn:800"> +<p>Another thing <a class="footnote-backref" href="#fnref:800" title="Jump back to footnote 800 in the text">↩</a></p> +</li> +<li id="fn:801"> +<p>Another thing <a class="footnote-backref" href="#fnref:801" title="Jump back to footnote 801 in the text">↩</a></p> +</li> +<li id="fn:802"> +<p>Another thing <a class="footnote-backref" href="#fnref:802" title="Jump back to footnote 802 in the text">↩</a></p> +</li> +<li id="fn:803"> +<p>Another thing <a class="footnote-backref" href="#fnref:803" title="Jump back to footnote 803 in the text">↩</a></p> +</li> +<li id="fn:804"> +<p>Another thing <a class="footnote-backref" href="#fnref:804" title="Jump back to footnote 804 in the text">↩</a></p> +</li> +<li id="fn:805"> +<p>Another thing <a class="footnote-backref" href="#fnref:805" title="Jump back to footnote 805 in the text">↩</a></p> +</li> +<li id="fn:806"> +<p>Another thing <a class="footnote-backref" href="#fnref:806" title="Jump back to footnote 806 in the text">↩</a></p> +</li> +<li id="fn:807"> +<p>Another thing <a class="footnote-backref" href="#fnref:807" title="Jump back to footnote 807 in the text">↩</a></p> +</li> +<li id="fn:808"> +<p>Another thing <a class="footnote-backref" href="#fnref:808" title="Jump back to footnote 808 in the text">↩</a></p> +</li> +<li id="fn:809"> +<p>Another thing <a class="footnote-backref" href="#fnref:809" title="Jump back to footnote 809 in the text">↩</a></p> +</li> +<li id="fn:810"> +<p>Another thing <a class="footnote-backref" href="#fnref:810" title="Jump back to footnote 810 in the text">↩</a></p> +</li> +<li id="fn:811"> +<p>Another thing <a class="footnote-backref" href="#fnref:811" title="Jump back to footnote 811 in the text">↩</a></p> +</li> +<li id="fn:812"> +<p>Another thing <a class="footnote-backref" href="#fnref:812" title="Jump back to footnote 812 in the text">↩</a></p> +</li> +<li id="fn:813"> +<p>Another thing <a class="footnote-backref" href="#fnref:813" title="Jump back to footnote 813 in the text">↩</a></p> +</li> +<li id="fn:814"> +<p>Another thing <a class="footnote-backref" href="#fnref:814" title="Jump back to footnote 814 in the text">↩</a></p> +</li> +<li id="fn:815"> +<p>Another thing <a class="footnote-backref" href="#fnref:815" title="Jump back to footnote 815 in the text">↩</a></p> +</li> +<li id="fn:816"> +<p>Another thing <a class="footnote-backref" href="#fnref:816" title="Jump back to footnote 816 in the text">↩</a></p> +</li> +<li id="fn:817"> +<p>Another thing <a class="footnote-backref" href="#fnref:817" title="Jump back to footnote 817 in the text">↩</a></p> +</li> +<li id="fn:818"> +<p>Another thing <a class="footnote-backref" href="#fnref:818" title="Jump back to footnote 818 in the text">↩</a></p> +</li> +<li id="fn:819"> +<p>Another thing <a class="footnote-backref" href="#fnref:819" title="Jump back to footnote 819 in the text">↩</a></p> +</li> +<li id="fn:820"> +<p>Another thing <a class="footnote-backref" href="#fnref:820" title="Jump back to footnote 820 in the text">↩</a></p> +</li> +<li id="fn:821"> +<p>Another thing <a class="footnote-backref" href="#fnref:821" title="Jump back to footnote 821 in the text">↩</a></p> +</li> +<li id="fn:822"> +<p>Another thing <a class="footnote-backref" href="#fnref:822" title="Jump back to footnote 822 in the text">↩</a></p> +</li> +<li id="fn:823"> +<p>Another thing <a class="footnote-backref" href="#fnref:823" title="Jump back to footnote 823 in the text">↩</a></p> +</li> +<li id="fn:824"> +<p>Another thing <a class="footnote-backref" href="#fnref:824" title="Jump back to footnote 824 in the text">↩</a></p> +</li> +<li id="fn:825"> +<p>Another thing <a class="footnote-backref" href="#fnref:825" title="Jump back to footnote 825 in the text">↩</a></p> +</li> +<li id="fn:826"> +<p>Another thing <a class="footnote-backref" href="#fnref:826" title="Jump back to footnote 826 in the text">↩</a></p> +</li> +<li id="fn:827"> +<p>Another thing <a class="footnote-backref" href="#fnref:827" title="Jump back to footnote 827 in the text">↩</a></p> +</li> +<li id="fn:828"> +<p>Another thing <a class="footnote-backref" href="#fnref:828" title="Jump back to footnote 828 in the text">↩</a></p> +</li> +<li id="fn:829"> +<p>Another thing <a class="footnote-backref" href="#fnref:829" title="Jump back to footnote 829 in the text">↩</a></p> +</li> +<li id="fn:830"> +<p>Another thing <a class="footnote-backref" href="#fnref:830" title="Jump back to footnote 830 in the text">↩</a></p> +</li> +<li id="fn:831"> +<p>Another thing <a class="footnote-backref" href="#fnref:831" title="Jump back to footnote 831 in the text">↩</a></p> +</li> +<li id="fn:832"> +<p>Another thing <a class="footnote-backref" href="#fnref:832" title="Jump back to footnote 832 in the text">↩</a></p> +</li> +<li id="fn:833"> +<p>Another thing <a class="footnote-backref" href="#fnref:833" title="Jump back to footnote 833 in the text">↩</a></p> +</li> +<li id="fn:834"> +<p>Another thing <a class="footnote-backref" href="#fnref:834" title="Jump back to footnote 834 in the text">↩</a></p> +</li> +<li id="fn:835"> +<p>Another thing <a class="footnote-backref" href="#fnref:835" title="Jump back to footnote 835 in the text">↩</a></p> +</li> +<li id="fn:836"> +<p>Another thing <a class="footnote-backref" href="#fnref:836" title="Jump back to footnote 836 in the text">↩</a></p> +</li> +<li id="fn:837"> +<p>Another thing <a class="footnote-backref" href="#fnref:837" title="Jump back to footnote 837 in the text">↩</a></p> +</li> +<li id="fn:838"> +<p>Another thing <a class="footnote-backref" href="#fnref:838" title="Jump back to footnote 838 in the text">↩</a></p> +</li> +<li id="fn:839"> +<p>Another thing <a class="footnote-backref" href="#fnref:839" title="Jump back to footnote 839 in the text">↩</a></p> +</li> +<li id="fn:840"> +<p>Another thing <a class="footnote-backref" href="#fnref:840" title="Jump back to footnote 840 in the text">↩</a></p> +</li> +<li id="fn:841"> +<p>Another thing <a class="footnote-backref" href="#fnref:841" title="Jump back to footnote 841 in the text">↩</a></p> +</li> +<li id="fn:842"> +<p>Another thing <a class="footnote-backref" href="#fnref:842" title="Jump back to footnote 842 in the text">↩</a></p> +</li> +<li id="fn:843"> +<p>Another thing <a class="footnote-backref" href="#fnref:843" title="Jump back to footnote 843 in the text">↩</a></p> +</li> +<li id="fn:844"> +<p>Another thing <a class="footnote-backref" href="#fnref:844" title="Jump back to footnote 844 in the text">↩</a></p> +</li> +<li id="fn:845"> +<p>Another thing <a class="footnote-backref" href="#fnref:845" title="Jump back to footnote 845 in the text">↩</a></p> +</li> +<li id="fn:846"> +<p>Another thing <a class="footnote-backref" href="#fnref:846" title="Jump back to footnote 846 in the text">↩</a></p> +</li> +<li id="fn:847"> +<p>Another thing <a class="footnote-backref" href="#fnref:847" title="Jump back to footnote 847 in the text">↩</a></p> +</li> +<li id="fn:848"> +<p>Another thing <a class="footnote-backref" href="#fnref:848" title="Jump back to footnote 848 in the text">↩</a></p> +</li> +<li id="fn:849"> +<p>Another thing <a class="footnote-backref" href="#fnref:849" title="Jump back to footnote 849 in the text">↩</a></p> +</li> +<li id="fn:850"> +<p>Another thing <a class="footnote-backref" href="#fnref:850" title="Jump back to footnote 850 in the text">↩</a></p> +</li> +<li id="fn:851"> +<p>Another thing <a class="footnote-backref" href="#fnref:851" title="Jump back to footnote 851 in the text">↩</a></p> +</li> +<li id="fn:852"> +<p>Another thing <a class="footnote-backref" href="#fnref:852" title="Jump back to footnote 852 in the text">↩</a></p> +</li> +<li id="fn:853"> +<p>Another thing <a class="footnote-backref" href="#fnref:853" title="Jump back to footnote 853 in the text">↩</a></p> +</li> +<li id="fn:854"> +<p>Another thing <a class="footnote-backref" href="#fnref:854" title="Jump back to footnote 854 in the text">↩</a></p> +</li> +<li id="fn:855"> +<p>Another thing <a class="footnote-backref" href="#fnref:855" title="Jump back to footnote 855 in the text">↩</a></p> +</li> +<li id="fn:856"> +<p>Another thing <a class="footnote-backref" href="#fnref:856" title="Jump back to footnote 856 in the text">↩</a></p> +</li> +<li id="fn:857"> +<p>Another thing <a class="footnote-backref" href="#fnref:857" title="Jump back to footnote 857 in the text">↩</a></p> +</li> +<li id="fn:858"> +<p>Another thing <a class="footnote-backref" href="#fnref:858" title="Jump back to footnote 858 in the text">↩</a></p> +</li> +<li id="fn:859"> +<p>Another thing <a class="footnote-backref" href="#fnref:859" title="Jump back to footnote 859 in the text">↩</a></p> +</li> +<li id="fn:860"> +<p>Another thing <a class="footnote-backref" href="#fnref:860" title="Jump back to footnote 860 in the text">↩</a></p> +</li> +<li id="fn:861"> +<p>Another thing <a class="footnote-backref" href="#fnref:861" title="Jump back to footnote 861 in the text">↩</a></p> +</li> +<li id="fn:862"> +<p>Another thing <a class="footnote-backref" href="#fnref:862" title="Jump back to footnote 862 in the text">↩</a></p> +</li> +<li id="fn:863"> +<p>Another thing <a class="footnote-backref" href="#fnref:863" title="Jump back to footnote 863 in the text">↩</a></p> +</li> +<li id="fn:864"> +<p>Another thing <a class="footnote-backref" href="#fnref:864" title="Jump back to footnote 864 in the text">↩</a></p> +</li> +<li id="fn:865"> +<p>Another thing <a class="footnote-backref" href="#fnref:865" title="Jump back to footnote 865 in the text">↩</a></p> +</li> +<li id="fn:866"> +<p>Another thing <a class="footnote-backref" href="#fnref:866" title="Jump back to footnote 866 in the text">↩</a></p> +</li> +<li id="fn:867"> +<p>Another thing <a class="footnote-backref" href="#fnref:867" title="Jump back to footnote 867 in the text">↩</a></p> +</li> +<li id="fn:868"> +<p>Another thing <a class="footnote-backref" href="#fnref:868" title="Jump back to footnote 868 in the text">↩</a></p> +</li> +<li id="fn:869"> +<p>Another thing <a class="footnote-backref" href="#fnref:869" title="Jump back to footnote 869 in the text">↩</a></p> +</li> +<li id="fn:870"> +<p>Another thing <a class="footnote-backref" href="#fnref:870" title="Jump back to footnote 870 in the text">↩</a></p> +</li> +<li id="fn:871"> +<p>Another thing <a class="footnote-backref" href="#fnref:871" title="Jump back to footnote 871 in the text">↩</a></p> +</li> +<li id="fn:872"> +<p>Another thing <a class="footnote-backref" href="#fnref:872" title="Jump back to footnote 872 in the text">↩</a></p> +</li> +<li id="fn:873"> +<p>Another thing <a class="footnote-backref" href="#fnref:873" title="Jump back to footnote 873 in the text">↩</a></p> +</li> +<li id="fn:874"> +<p>Another thing <a class="footnote-backref" href="#fnref:874" title="Jump back to footnote 874 in the text">↩</a></p> +</li> +<li id="fn:875"> +<p>Another thing <a class="footnote-backref" href="#fnref:875" title="Jump back to footnote 875 in the text">↩</a></p> +</li> +<li id="fn:876"> +<p>Another thing <a class="footnote-backref" href="#fnref:876" title="Jump back to footnote 876 in the text">↩</a></p> +</li> +<li id="fn:877"> +<p>Another thing <a class="footnote-backref" href="#fnref:877" title="Jump back to footnote 877 in the text">↩</a></p> +</li> +<li id="fn:878"> +<p>Another thing <a class="footnote-backref" href="#fnref:878" title="Jump back to footnote 878 in the text">↩</a></p> +</li> +<li id="fn:879"> +<p>Another thing <a class="footnote-backref" href="#fnref:879" title="Jump back to footnote 879 in the text">↩</a></p> +</li> +<li id="fn:880"> +<p>Another thing <a class="footnote-backref" href="#fnref:880" title="Jump back to footnote 880 in the text">↩</a></p> +</li> +<li id="fn:881"> +<p>Another thing <a class="footnote-backref" href="#fnref:881" title="Jump back to footnote 881 in the text">↩</a></p> +</li> +<li id="fn:882"> +<p>Another thing <a class="footnote-backref" href="#fnref:882" title="Jump back to footnote 882 in the text">↩</a></p> +</li> +<li id="fn:883"> +<p>Another thing <a class="footnote-backref" href="#fnref:883" title="Jump back to footnote 883 in the text">↩</a></p> +</li> +<li id="fn:884"> +<p>Another thing <a class="footnote-backref" href="#fnref:884" title="Jump back to footnote 884 in the text">↩</a></p> +</li> +<li id="fn:885"> +<p>Another thing <a class="footnote-backref" href="#fnref:885" title="Jump back to footnote 885 in the text">↩</a></p> +</li> +<li id="fn:886"> +<p>Another thing <a class="footnote-backref" href="#fnref:886" title="Jump back to footnote 886 in the text">↩</a></p> +</li> +<li id="fn:887"> +<p>Another thing <a class="footnote-backref" href="#fnref:887" title="Jump back to footnote 887 in the text">↩</a></p> +</li> +<li id="fn:888"> +<p>Another thing <a class="footnote-backref" href="#fnref:888" title="Jump back to footnote 888 in the text">↩</a></p> +</li> +<li id="fn:889"> +<p>Another thing <a class="footnote-backref" href="#fnref:889" title="Jump back to footnote 889 in the text">↩</a></p> +</li> +<li id="fn:890"> +<p>Another thing <a class="footnote-backref" href="#fnref:890" title="Jump back to footnote 890 in the text">↩</a></p> +</li> +<li id="fn:891"> +<p>Another thing <a class="footnote-backref" href="#fnref:891" title="Jump back to footnote 891 in the text">↩</a></p> +</li> +<li id="fn:892"> +<p>Another thing <a class="footnote-backref" href="#fnref:892" title="Jump back to footnote 892 in the text">↩</a></p> +</li> +<li id="fn:893"> +<p>Another thing <a class="footnote-backref" href="#fnref:893" title="Jump back to footnote 893 in the text">↩</a></p> +</li> +<li id="fn:894"> +<p>Another thing <a class="footnote-backref" href="#fnref:894" title="Jump back to footnote 894 in the text">↩</a></p> +</li> +<li id="fn:895"> +<p>Another thing <a class="footnote-backref" href="#fnref:895" title="Jump back to footnote 895 in the text">↩</a></p> +</li> +<li id="fn:896"> +<p>Another thing <a class="footnote-backref" href="#fnref:896" title="Jump back to footnote 896 in the text">↩</a></p> +</li> +<li id="fn:897"> +<p>Another thing <a class="footnote-backref" href="#fnref:897" title="Jump back to footnote 897 in the text">↩</a></p> +</li> +<li id="fn:898"> +<p>Another thing <a class="footnote-backref" href="#fnref:898" title="Jump back to footnote 898 in the text">↩</a></p> +</li> +<li id="fn:899"> +<p>Another thing <a class="footnote-backref" href="#fnref:899" title="Jump back to footnote 899 in the text">↩</a></p> +</li> +<li id="fn:900"> +<p>Another thing <a class="footnote-backref" href="#fnref:900" title="Jump back to footnote 900 in the text">↩</a></p> +</li> +<li id="fn:901"> +<p>Another thing <a class="footnote-backref" href="#fnref:901" title="Jump back to footnote 901 in the text">↩</a></p> +</li> +<li id="fn:902"> +<p>Another thing <a class="footnote-backref" href="#fnref:902" title="Jump back to footnote 902 in the text">↩</a></p> +</li> +<li id="fn:903"> +<p>Another thing <a class="footnote-backref" href="#fnref:903" title="Jump back to footnote 903 in the text">↩</a></p> +</li> +<li id="fn:904"> +<p>Another thing <a class="footnote-backref" href="#fnref:904" title="Jump back to footnote 904 in the text">↩</a></p> +</li> +<li id="fn:905"> +<p>Another thing <a class="footnote-backref" href="#fnref:905" title="Jump back to footnote 905 in the text">↩</a></p> +</li> +<li id="fn:906"> +<p>Another thing <a class="footnote-backref" href="#fnref:906" title="Jump back to footnote 906 in the text">↩</a></p> +</li> +<li id="fn:907"> +<p>Another thing <a class="footnote-backref" href="#fnref:907" title="Jump back to footnote 907 in the text">↩</a></p> +</li> +<li id="fn:908"> +<p>Another thing <a class="footnote-backref" href="#fnref:908" title="Jump back to footnote 908 in the text">↩</a></p> +</li> +<li id="fn:909"> +<p>Another thing <a class="footnote-backref" href="#fnref:909" title="Jump back to footnote 909 in the text">↩</a></p> +</li> +<li id="fn:910"> +<p>Another thing <a class="footnote-backref" href="#fnref:910" title="Jump back to footnote 910 in the text">↩</a></p> +</li> +<li id="fn:911"> +<p>Another thing <a class="footnote-backref" href="#fnref:911" title="Jump back to footnote 911 in the text">↩</a></p> +</li> +<li id="fn:912"> +<p>Another thing <a class="footnote-backref" href="#fnref:912" title="Jump back to footnote 912 in the text">↩</a></p> +</li> +<li id="fn:913"> +<p>Another thing <a class="footnote-backref" href="#fnref:913" title="Jump back to footnote 913 in the text">↩</a></p> +</li> +<li id="fn:914"> +<p>Another thing <a class="footnote-backref" href="#fnref:914" title="Jump back to footnote 914 in the text">↩</a></p> +</li> +<li id="fn:915"> +<p>Another thing <a class="footnote-backref" href="#fnref:915" title="Jump back to footnote 915 in the text">↩</a></p> +</li> +<li id="fn:916"> +<p>Another thing <a class="footnote-backref" href="#fnref:916" title="Jump back to footnote 916 in the text">↩</a></p> +</li> +<li id="fn:917"> +<p>Another thing <a class="footnote-backref" href="#fnref:917" title="Jump back to footnote 917 in the text">↩</a></p> +</li> +<li id="fn:918"> +<p>Another thing <a class="footnote-backref" href="#fnref:918" title="Jump back to footnote 918 in the text">↩</a></p> +</li> +<li id="fn:919"> +<p>Another thing <a class="footnote-backref" href="#fnref:919" title="Jump back to footnote 919 in the text">↩</a></p> +</li> +<li id="fn:920"> +<p>Another thing <a class="footnote-backref" href="#fnref:920" title="Jump back to footnote 920 in the text">↩</a></p> +</li> +<li id="fn:921"> +<p>Another thing <a class="footnote-backref" href="#fnref:921" title="Jump back to footnote 921 in the text">↩</a></p> +</li> +<li id="fn:922"> +<p>Another thing <a class="footnote-backref" href="#fnref:922" title="Jump back to footnote 922 in the text">↩</a></p> +</li> +<li id="fn:923"> +<p>Another thing <a class="footnote-backref" href="#fnref:923" title="Jump back to footnote 923 in the text">↩</a></p> +</li> +<li id="fn:924"> +<p>Another thing <a class="footnote-backref" href="#fnref:924" title="Jump back to footnote 924 in the text">↩</a></p> +</li> +<li id="fn:925"> +<p>Another thing <a class="footnote-backref" href="#fnref:925" title="Jump back to footnote 925 in the text">↩</a></p> +</li> +<li id="fn:926"> +<p>Another thing <a class="footnote-backref" href="#fnref:926" title="Jump back to footnote 926 in the text">↩</a></p> +</li> +<li id="fn:927"> +<p>Another thing <a class="footnote-backref" href="#fnref:927" title="Jump back to footnote 927 in the text">↩</a></p> +</li> +<li id="fn:928"> +<p>Another thing <a class="footnote-backref" href="#fnref:928" title="Jump back to footnote 928 in the text">↩</a></p> +</li> +<li id="fn:929"> +<p>Another thing <a class="footnote-backref" href="#fnref:929" title="Jump back to footnote 929 in the text">↩</a></p> +</li> +<li id="fn:930"> +<p>Another thing <a class="footnote-backref" href="#fnref:930" title="Jump back to footnote 930 in the text">↩</a></p> +</li> +<li id="fn:931"> +<p>Another thing <a class="footnote-backref" href="#fnref:931" title="Jump back to footnote 931 in the text">↩</a></p> +</li> +<li id="fn:932"> +<p>Another thing <a class="footnote-backref" href="#fnref:932" title="Jump back to footnote 932 in the text">↩</a></p> +</li> +<li id="fn:933"> +<p>Another thing <a class="footnote-backref" href="#fnref:933" title="Jump back to footnote 933 in the text">↩</a></p> +</li> +<li id="fn:934"> +<p>Another thing <a class="footnote-backref" href="#fnref:934" title="Jump back to footnote 934 in the text">↩</a></p> +</li> +<li id="fn:935"> +<p>Another thing <a class="footnote-backref" href="#fnref:935" title="Jump back to footnote 935 in the text">↩</a></p> +</li> +<li id="fn:936"> +<p>Another thing <a class="footnote-backref" href="#fnref:936" title="Jump back to footnote 936 in the text">↩</a></p> +</li> +<li id="fn:937"> +<p>Another thing <a class="footnote-backref" href="#fnref:937" title="Jump back to footnote 937 in the text">↩</a></p> +</li> +<li id="fn:938"> +<p>Another thing <a class="footnote-backref" href="#fnref:938" title="Jump back to footnote 938 in the text">↩</a></p> +</li> +<li id="fn:939"> +<p>Another thing <a class="footnote-backref" href="#fnref:939" title="Jump back to footnote 939 in the text">↩</a></p> +</li> +<li id="fn:940"> +<p>Another thing <a class="footnote-backref" href="#fnref:940" title="Jump back to footnote 940 in the text">↩</a></p> +</li> +<li id="fn:941"> +<p>Another thing <a class="footnote-backref" href="#fnref:941" title="Jump back to footnote 941 in the text">↩</a></p> +</li> +<li id="fn:942"> +<p>Another thing <a class="footnote-backref" href="#fnref:942" title="Jump back to footnote 942 in the text">↩</a></p> +</li> +<li id="fn:943"> +<p>Another thing <a class="footnote-backref" href="#fnref:943" title="Jump back to footnote 943 in the text">↩</a></p> +</li> +<li id="fn:944"> +<p>Another thing <a class="footnote-backref" href="#fnref:944" title="Jump back to footnote 944 in the text">↩</a></p> +</li> +<li id="fn:945"> +<p>Another thing <a class="footnote-backref" href="#fnref:945" title="Jump back to footnote 945 in the text">↩</a></p> +</li> +<li id="fn:946"> +<p>Another thing <a class="footnote-backref" href="#fnref:946" title="Jump back to footnote 946 in the text">↩</a></p> +</li> +<li id="fn:947"> +<p>Another thing <a class="footnote-backref" href="#fnref:947" title="Jump back to footnote 947 in the text">↩</a></p> +</li> +<li id="fn:948"> +<p>Another thing <a class="footnote-backref" href="#fnref:948" title="Jump back to footnote 948 in the text">↩</a></p> +</li> +<li id="fn:949"> +<p>Another thing <a class="footnote-backref" href="#fnref:949" title="Jump back to footnote 949 in the text">↩</a></p> +</li> +<li id="fn:950"> +<p>Another thing <a class="footnote-backref" href="#fnref:950" title="Jump back to footnote 950 in the text">↩</a></p> +</li> +<li id="fn:951"> +<p>Another thing <a class="footnote-backref" href="#fnref:951" title="Jump back to footnote 951 in the text">↩</a></p> +</li> +<li id="fn:952"> +<p>Another thing <a class="footnote-backref" href="#fnref:952" title="Jump back to footnote 952 in the text">↩</a></p> +</li> +<li id="fn:953"> +<p>Another thing <a class="footnote-backref" href="#fnref:953" title="Jump back to footnote 953 in the text">↩</a></p> +</li> +<li id="fn:954"> +<p>Another thing <a class="footnote-backref" href="#fnref:954" title="Jump back to footnote 954 in the text">↩</a></p> +</li> +<li id="fn:955"> +<p>Another thing <a class="footnote-backref" href="#fnref:955" title="Jump back to footnote 955 in the text">↩</a></p> +</li> +<li id="fn:956"> +<p>Another thing <a class="footnote-backref" href="#fnref:956" title="Jump back to footnote 956 in the text">↩</a></p> +</li> +<li id="fn:957"> +<p>Another thing <a class="footnote-backref" href="#fnref:957" title="Jump back to footnote 957 in the text">↩</a></p> +</li> +<li id="fn:958"> +<p>Another thing <a class="footnote-backref" href="#fnref:958" title="Jump back to footnote 958 in the text">↩</a></p> +</li> +<li id="fn:959"> +<p>Another thing <a class="footnote-backref" href="#fnref:959" title="Jump back to footnote 959 in the text">↩</a></p> +</li> +<li id="fn:960"> +<p>Another thing <a class="footnote-backref" href="#fnref:960" title="Jump back to footnote 960 in the text">↩</a></p> +</li> +<li id="fn:961"> +<p>Another thing <a class="footnote-backref" href="#fnref:961" title="Jump back to footnote 961 in the text">↩</a></p> +</li> +<li id="fn:962"> +<p>Another thing <a class="footnote-backref" href="#fnref:962" title="Jump back to footnote 962 in the text">↩</a></p> +</li> +<li id="fn:963"> +<p>Another thing <a class="footnote-backref" href="#fnref:963" title="Jump back to footnote 963 in the text">↩</a></p> +</li> +<li id="fn:964"> +<p>Another thing <a class="footnote-backref" href="#fnref:964" title="Jump back to footnote 964 in the text">↩</a></p> +</li> +<li id="fn:965"> +<p>Another thing <a class="footnote-backref" href="#fnref:965" title="Jump back to footnote 965 in the text">↩</a></p> +</li> +<li id="fn:966"> +<p>Another thing <a class="footnote-backref" href="#fnref:966" title="Jump back to footnote 966 in the text">↩</a></p> +</li> +<li id="fn:967"> +<p>Another thing <a class="footnote-backref" href="#fnref:967" title="Jump back to footnote 967 in the text">↩</a></p> +</li> +<li id="fn:968"> +<p>Another thing <a class="footnote-backref" href="#fnref:968" title="Jump back to footnote 968 in the text">↩</a></p> +</li> +<li id="fn:969"> +<p>Another thing <a class="footnote-backref" href="#fnref:969" title="Jump back to footnote 969 in the text">↩</a></p> +</li> +<li id="fn:970"> +<p>Another thing <a class="footnote-backref" href="#fnref:970" title="Jump back to footnote 970 in the text">↩</a></p> +</li> +<li id="fn:971"> +<p>Another thing <a class="footnote-backref" href="#fnref:971" title="Jump back to footnote 971 in the text">↩</a></p> +</li> +<li id="fn:972"> +<p>Another thing <a class="footnote-backref" href="#fnref:972" title="Jump back to footnote 972 in the text">↩</a></p> +</li> +<li id="fn:973"> +<p>Another thing <a class="footnote-backref" href="#fnref:973" title="Jump back to footnote 973 in the text">↩</a></p> +</li> +<li id="fn:974"> +<p>Another thing <a class="footnote-backref" href="#fnref:974" title="Jump back to footnote 974 in the text">↩</a></p> +</li> +<li id="fn:975"> +<p>Another thing <a class="footnote-backref" href="#fnref:975" title="Jump back to footnote 975 in the text">↩</a></p> +</li> +<li id="fn:976"> +<p>Another thing <a class="footnote-backref" href="#fnref:976" title="Jump back to footnote 976 in the text">↩</a></p> +</li> +<li id="fn:977"> +<p>Another thing <a class="footnote-backref" href="#fnref:977" title="Jump back to footnote 977 in the text">↩</a></p> +</li> +<li id="fn:978"> +<p>Another thing <a class="footnote-backref" href="#fnref:978" title="Jump back to footnote 978 in the text">↩</a></p> +</li> +<li id="fn:979"> +<p>Another thing <a class="footnote-backref" href="#fnref:979" title="Jump back to footnote 979 in the text">↩</a></p> +</li> +<li id="fn:980"> +<p>Another thing <a class="footnote-backref" href="#fnref:980" title="Jump back to footnote 980 in the text">↩</a></p> +</li> +<li id="fn:981"> +<p>Another thing <a class="footnote-backref" href="#fnref:981" title="Jump back to footnote 981 in the text">↩</a></p> +</li> +<li id="fn:982"> +<p>Another thing <a class="footnote-backref" href="#fnref:982" title="Jump back to footnote 982 in the text">↩</a></p> +</li> +<li id="fn:983"> +<p>Another thing <a class="footnote-backref" href="#fnref:983" title="Jump back to footnote 983 in the text">↩</a></p> +</li> +<li id="fn:984"> +<p>Another thing <a class="footnote-backref" href="#fnref:984" title="Jump back to footnote 984 in the text">↩</a></p> +</li> +<li id="fn:985"> +<p>Another thing <a class="footnote-backref" href="#fnref:985" title="Jump back to footnote 985 in the text">↩</a></p> +</li> +<li id="fn:986"> +<p>Another thing <a class="footnote-backref" href="#fnref:986" title="Jump back to footnote 986 in the text">↩</a></p> +</li> +<li id="fn:987"> +<p>Another thing <a class="footnote-backref" href="#fnref:987" title="Jump back to footnote 987 in the text">↩</a></p> +</li> +<li id="fn:988"> +<p>Another thing <a class="footnote-backref" href="#fnref:988" title="Jump back to footnote 988 in the text">↩</a></p> +</li> +<li id="fn:989"> +<p>Another thing <a class="footnote-backref" href="#fnref:989" title="Jump back to footnote 989 in the text">↩</a></p> +</li> +<li id="fn:990"> +<p>Another thing <a class="footnote-backref" href="#fnref:990" title="Jump back to footnote 990 in the text">↩</a></p> +</li> +<li id="fn:991"> +<p>Another thing <a class="footnote-backref" href="#fnref:991" title="Jump back to footnote 991 in the text">↩</a></p> +</li> +<li id="fn:992"> +<p>Another thing <a class="footnote-backref" href="#fnref:992" title="Jump back to footnote 992 in the text">↩</a></p> +</li> +<li id="fn:993"> +<p>Another thing <a class="footnote-backref" href="#fnref:993" title="Jump back to footnote 993 in the text">↩</a></p> +</li> +<li id="fn:994"> +<p>Another thing <a class="footnote-backref" href="#fnref:994" title="Jump back to footnote 994 in the text">↩</a></p> +</li> +<li id="fn:995"> +<p>Another thing <a class="footnote-backref" href="#fnref:995" title="Jump back to footnote 995 in the text">↩</a></p> +</li> +<li id="fn:996"> +<p>Another thing <a class="footnote-backref" href="#fnref:996" title="Jump back to footnote 996 in the text">↩</a></p> +</li> +<li id="fn:997"> +<p>Another thing <a class="footnote-backref" href="#fnref:997" title="Jump back to footnote 997 in the text">↩</a></p> +</li> +<li id="fn:998"> +<p>Another thing <a class="footnote-backref" href="#fnref:998" title="Jump back to footnote 998 in the text">↩</a></p> +</li> +<li id="fn:999"> +<p>Another thing <a class="footnote-backref" href="#fnref:999" title="Jump back to footnote 999 in the text">↩</a></p> +</li> +<li id="fn:1000"> +<p>Another thing <a class="footnote-backref" href="#fnref:1000" title="Jump back to footnote 1000 in the text">↩</a></p> +</li> +<li id="fn:1001"> +<p>Another thing <a class="footnote-backref" href="#fnref:1001" title="Jump back to footnote 1001 in the text">↩</a></p> +</li> +<li id="fn:1002"> +<p>Another thing <a class="footnote-backref" href="#fnref:1002" title="Jump back to footnote 1002 in the text">↩</a></p> +</li> +<li id="fn:1003"> +<p>Another thing <a class="footnote-backref" href="#fnref:1003" title="Jump back to footnote 1003 in the text">↩</a></p> +</li> +<li id="fn:1004"> +<p>Another thing <a class="footnote-backref" href="#fnref:1004" title="Jump back to footnote 1004 in the text">↩</a></p> +</li> +<li id="fn:1005"> +<p>Another thing <a class="footnote-backref" href="#fnref:1005" title="Jump back to footnote 1005 in the text">↩</a></p> +</li> +<li id="fn:1006"> +<p>Another thing <a class="footnote-backref" href="#fnref:1006" title="Jump back to footnote 1006 in the text">↩</a></p> +</li> +<li id="fn:1007"> +<p>Another thing <a class="footnote-backref" href="#fnref:1007" title="Jump back to footnote 1007 in the text">↩</a></p> +</li> +<li id="fn:1008"> +<p>Another thing <a class="footnote-backref" href="#fnref:1008" title="Jump back to footnote 1008 in the text">↩</a></p> +</li> +<li id="fn:1009"> +<p>Another thing <a class="footnote-backref" href="#fnref:1009" title="Jump back to footnote 1009 in the text">↩</a></p> +</li> +<li id="fn:1010"> +<p>Another thing <a class="footnote-backref" href="#fnref:1010" title="Jump back to footnote 1010 in the text">↩</a></p> +</li> +<li id="fn:1011"> +<p>Another thing <a class="footnote-backref" href="#fnref:1011" title="Jump back to footnote 1011 in the text">↩</a></p> +</li> +<li id="fn:1012"> +<p>Another thing <a class="footnote-backref" href="#fnref:1012" title="Jump back to footnote 1012 in the text">↩</a></p> +</li> +<li id="fn:1013"> +<p>Another thing <a class="footnote-backref" href="#fnref:1013" title="Jump back to footnote 1013 in the text">↩</a></p> +</li> +<li id="fn:1014"> +<p>Another thing <a class="footnote-backref" href="#fnref:1014" title="Jump back to footnote 1014 in the text">↩</a></p> +</li> +<li id="fn:1015"> +<p>Another thing <a class="footnote-backref" href="#fnref:1015" title="Jump back to footnote 1015 in the text">↩</a></p> +</li> +<li id="fn:1016"> +<p>Another thing <a class="footnote-backref" href="#fnref:1016" title="Jump back to footnote 1016 in the text">↩</a></p> +</li> +<li id="fn:1017"> +<p>Another thing <a class="footnote-backref" href="#fnref:1017" title="Jump back to footnote 1017 in the text">↩</a></p> +</li> +<li id="fn:1018"> +<p>Another thing <a class="footnote-backref" href="#fnref:1018" title="Jump back to footnote 1018 in the text">↩</a></p> +</li> +<li id="fn:1019"> +<p>Another thing <a class="footnote-backref" href="#fnref:1019" title="Jump back to footnote 1019 in the text">↩</a></p> +</li> +<li id="fn:1020"> +<p>Another thing <a class="footnote-backref" href="#fnref:1020" title="Jump back to footnote 1020 in the text">↩</a></p> +</li> +<li id="fn:1021"> +<p>Another thing <a class="footnote-backref" href="#fnref:1021" title="Jump back to footnote 1021 in the text">↩</a></p> +</li> +<li id="fn:1022"> +<p>Another thing <a class="footnote-backref" href="#fnref:1022" title="Jump back to footnote 1022 in the text">↩</a></p> +</li> +<li id="fn:1023"> +<p>Another thing <a class="footnote-backref" href="#fnref:1023" title="Jump back to footnote 1023 in the text">↩</a></p> +</li> +<li id="fn:1024"> +<p>Another thing <a class="footnote-backref" href="#fnref:1024" title="Jump back to footnote 1024 in the text">↩</a></p> +</li> +<li id="fn:1025"> +<p>Another thing <a class="footnote-backref" href="#fnref:1025" title="Jump back to footnote 1025 in the text">↩</a></p> +</li> +<li id="fn:1026"> +<p>Another thing <a class="footnote-backref" href="#fnref:1026" title="Jump back to footnote 1026 in the text">↩</a></p> +</li> +<li id="fn:1027"> +<p>Another thing <a class="footnote-backref" href="#fnref:1027" title="Jump back to footnote 1027 in the text">↩</a></p> +</li> +<li id="fn:1028"> +<p>Another thing <a class="footnote-backref" href="#fnref:1028" title="Jump back to footnote 1028 in the text">↩</a></p> +</li> +<li id="fn:1029"> +<p>Another thing <a class="footnote-backref" href="#fnref:1029" title="Jump back to footnote 1029 in the text">↩</a></p> +</li> +<li id="fn:1030"> +<p>Another thing <a class="footnote-backref" href="#fnref:1030" title="Jump back to footnote 1030 in the text">↩</a></p> +</li> +<li id="fn:1031"> +<p>Another thing <a class="footnote-backref" href="#fnref:1031" title="Jump back to footnote 1031 in the text">↩</a></p> +</li> +<li id="fn:1032"> +<p>Another thing <a class="footnote-backref" href="#fnref:1032" title="Jump back to footnote 1032 in the text">↩</a></p> +</li> +<li id="fn:1033"> +<p>Another thing <a class="footnote-backref" href="#fnref:1033" title="Jump back to footnote 1033 in the text">↩</a></p> +</li> +<li id="fn:1034"> +<p>Another thing <a class="footnote-backref" href="#fnref:1034" title="Jump back to footnote 1034 in the text">↩</a></p> +</li> +<li id="fn:1035"> +<p>Another thing <a class="footnote-backref" href="#fnref:1035" title="Jump back to footnote 1035 in the text">↩</a></p> +</li> +<li id="fn:1036"> +<p>Another thing <a class="footnote-backref" href="#fnref:1036" title="Jump back to footnote 1036 in the text">↩</a></p> +</li> +<li id="fn:1037"> +<p>Another thing <a class="footnote-backref" href="#fnref:1037" title="Jump back to footnote 1037 in the text">↩</a></p> +</li> +<li id="fn:1038"> +<p>Another thing <a class="footnote-backref" href="#fnref:1038" title="Jump back to footnote 1038 in the text">↩</a></p> +</li> +<li id="fn:1039"> +<p>Another thing <a class="footnote-backref" href="#fnref:1039" title="Jump back to footnote 1039 in the text">↩</a></p> +</li> +<li id="fn:1040"> +<p>Another thing <a class="footnote-backref" href="#fnref:1040" title="Jump back to footnote 1040 in the text">↩</a></p> +</li> +<li id="fn:1041"> +<p>Another thing <a class="footnote-backref" href="#fnref:1041" title="Jump back to footnote 1041 in the text">↩</a></p> +</li> +<li id="fn:1042"> +<p>Another thing <a class="footnote-backref" href="#fnref:1042" title="Jump back to footnote 1042 in the text">↩</a></p> +</li> +<li id="fn:1043"> +<p>Another thing <a class="footnote-backref" href="#fnref:1043" title="Jump back to footnote 1043 in the text">↩</a></p> +</li> +<li id="fn:1044"> +<p>Another thing <a class="footnote-backref" href="#fnref:1044" title="Jump back to footnote 1044 in the text">↩</a></p> +</li> +<li id="fn:1045"> +<p>Another thing <a class="footnote-backref" href="#fnref:1045" title="Jump back to footnote 1045 in the text">↩</a></p> +</li> +<li id="fn:1046"> +<p>Another thing <a class="footnote-backref" href="#fnref:1046" title="Jump back to footnote 1046 in the text">↩</a></p> +</li> +<li id="fn:1047"> +<p>Another thing <a class="footnote-backref" href="#fnref:1047" title="Jump back to footnote 1047 in the text">↩</a></p> +</li> +<li id="fn:1048"> +<p>Another thing <a class="footnote-backref" href="#fnref:1048" title="Jump back to footnote 1048 in the text">↩</a></p> +</li> +<li id="fn:1049"> +<p>Another thing <a class="footnote-backref" href="#fnref:1049" title="Jump back to footnote 1049 in the text">↩</a></p> +</li> +<li id="fn:1050"> +<p>Another thing <a class="footnote-backref" href="#fnref:1050" title="Jump back to footnote 1050 in the text">↩</a></p> +</li> +<li id="fn:1051"> +<p>Another thing <a class="footnote-backref" href="#fnref:1051" title="Jump back to footnote 1051 in the text">↩</a></p> +</li> +<li id="fn:1052"> +<p>Another thing <a class="footnote-backref" href="#fnref:1052" title="Jump back to footnote 1052 in the text">↩</a></p> +</li> +<li id="fn:1053"> +<p>Another thing <a class="footnote-backref" href="#fnref:1053" title="Jump back to footnote 1053 in the text">↩</a></p> +</li> +<li id="fn:1054"> +<p>Another thing <a class="footnote-backref" href="#fnref:1054" title="Jump back to footnote 1054 in the text">↩</a></p> +</li> +<li id="fn:1055"> +<p>Another thing <a class="footnote-backref" href="#fnref:1055" title="Jump back to footnote 1055 in the text">↩</a></p> +</li> +<li id="fn:1056"> +<p>Another thing <a class="footnote-backref" href="#fnref:1056" title="Jump back to footnote 1056 in the text">↩</a></p> +</li> +<li id="fn:1057"> +<p>Another thing <a class="footnote-backref" href="#fnref:1057" title="Jump back to footnote 1057 in the text">↩</a></p> +</li> +<li id="fn:1058"> +<p>Another thing <a class="footnote-backref" href="#fnref:1058" title="Jump back to footnote 1058 in the text">↩</a></p> +</li> +<li id="fn:1059"> +<p>Another thing <a class="footnote-backref" href="#fnref:1059" title="Jump back to footnote 1059 in the text">↩</a></p> +</li> +<li id="fn:1060"> +<p>Another thing <a class="footnote-backref" href="#fnref:1060" title="Jump back to footnote 1060 in the text">↩</a></p> +</li> +<li id="fn:1061"> +<p>Another thing <a class="footnote-backref" href="#fnref:1061" title="Jump back to footnote 1061 in the text">↩</a></p> +</li> +<li id="fn:1062"> +<p>Another thing <a class="footnote-backref" href="#fnref:1062" title="Jump back to footnote 1062 in the text">↩</a></p> +</li> +<li id="fn:1063"> +<p>Another thing <a class="footnote-backref" href="#fnref:1063" title="Jump back to footnote 1063 in the text">↩</a></p> +</li> +<li id="fn:1064"> +<p>Another thing <a class="footnote-backref" href="#fnref:1064" title="Jump back to footnote 1064 in the text">↩</a></p> +</li> +<li id="fn:1065"> +<p>Another thing <a class="footnote-backref" href="#fnref:1065" title="Jump back to footnote 1065 in the text">↩</a></p> +</li> +<li id="fn:1066"> +<p>Another thing <a class="footnote-backref" href="#fnref:1066" title="Jump back to footnote 1066 in the text">↩</a></p> +</li> +<li id="fn:1067"> +<p>Another thing <a class="footnote-backref" href="#fnref:1067" title="Jump back to footnote 1067 in the text">↩</a></p> +</li> +<li id="fn:1068"> +<p>Another thing <a class="footnote-backref" href="#fnref:1068" title="Jump back to footnote 1068 in the text">↩</a></p> +</li> +<li id="fn:1069"> +<p>Another thing <a class="footnote-backref" href="#fnref:1069" title="Jump back to footnote 1069 in the text">↩</a></p> +</li> +<li id="fn:1070"> +<p>Another thing <a class="footnote-backref" href="#fnref:1070" title="Jump back to footnote 1070 in the text">↩</a></p> +</li> +<li id="fn:1071"> +<p>Another thing <a class="footnote-backref" href="#fnref:1071" title="Jump back to footnote 1071 in the text">↩</a></p> +</li> +<li id="fn:1072"> +<p>Another thing <a class="footnote-backref" href="#fnref:1072" title="Jump back to footnote 1072 in the text">↩</a></p> +</li> +<li id="fn:1073"> +<p>Another thing <a class="footnote-backref" href="#fnref:1073" title="Jump back to footnote 1073 in the text">↩</a></p> +</li> +<li id="fn:1074"> +<p>Another thing <a class="footnote-backref" href="#fnref:1074" title="Jump back to footnote 1074 in the text">↩</a></p> +</li> +<li id="fn:1075"> +<p>Another thing <a class="footnote-backref" href="#fnref:1075" title="Jump back to footnote 1075 in the text">↩</a></p> +</li> +<li id="fn:1076"> +<p>Another thing <a class="footnote-backref" href="#fnref:1076" title="Jump back to footnote 1076 in the text">↩</a></p> +</li> +<li id="fn:1077"> +<p>Another thing <a class="footnote-backref" href="#fnref:1077" title="Jump back to footnote 1077 in the text">↩</a></p> +</li> +<li id="fn:1078"> +<p>Another thing <a class="footnote-backref" href="#fnref:1078" title="Jump back to footnote 1078 in the text">↩</a></p> +</li> +<li id="fn:1079"> +<p>Another thing <a class="footnote-backref" href="#fnref:1079" title="Jump back to footnote 1079 in the text">↩</a></p> +</li> +<li id="fn:1080"> +<p>Another thing <a class="footnote-backref" href="#fnref:1080" title="Jump back to footnote 1080 in the text">↩</a></p> +</li> +<li id="fn:1081"> +<p>Another thing <a class="footnote-backref" href="#fnref:1081" title="Jump back to footnote 1081 in the text">↩</a></p> +</li> +<li id="fn:1082"> +<p>Another thing <a class="footnote-backref" href="#fnref:1082" title="Jump back to footnote 1082 in the text">↩</a></p> +</li> +<li id="fn:1083"> +<p>Another thing <a class="footnote-backref" href="#fnref:1083" title="Jump back to footnote 1083 in the text">↩</a></p> +</li> +<li id="fn:1084"> +<p>Another thing <a class="footnote-backref" href="#fnref:1084" title="Jump back to footnote 1084 in the text">↩</a></p> +</li> +<li id="fn:1085"> +<p>Another thing <a class="footnote-backref" href="#fnref:1085" title="Jump back to footnote 1085 in the text">↩</a></p> +</li> +<li id="fn:1086"> +<p>Another thing <a class="footnote-backref" href="#fnref:1086" title="Jump back to footnote 1086 in the text">↩</a></p> +</li> +<li id="fn:1087"> +<p>Another thing <a class="footnote-backref" href="#fnref:1087" title="Jump back to footnote 1087 in the text">↩</a></p> +</li> +<li id="fn:1088"> +<p>Another thing <a class="footnote-backref" href="#fnref:1088" title="Jump back to footnote 1088 in the text">↩</a></p> +</li> +<li id="fn:1089"> +<p>Another thing <a class="footnote-backref" href="#fnref:1089" title="Jump back to footnote 1089 in the text">↩</a></p> +</li> +<li id="fn:1090"> +<p>Another thing <a class="footnote-backref" href="#fnref:1090" title="Jump back to footnote 1090 in the text">↩</a></p> +</li> +<li id="fn:1091"> +<p>Another thing <a class="footnote-backref" href="#fnref:1091" title="Jump back to footnote 1091 in the text">↩</a></p> +</li> +<li id="fn:1092"> +<p>Another thing <a class="footnote-backref" href="#fnref:1092" title="Jump back to footnote 1092 in the text">↩</a></p> +</li> +<li id="fn:1093"> +<p>Another thing <a class="footnote-backref" href="#fnref:1093" title="Jump back to footnote 1093 in the text">↩</a></p> +</li> +<li id="fn:1094"> +<p>Another thing <a class="footnote-backref" href="#fnref:1094" title="Jump back to footnote 1094 in the text">↩</a></p> +</li> +<li id="fn:1095"> +<p>Another thing <a class="footnote-backref" href="#fnref:1095" title="Jump back to footnote 1095 in the text">↩</a></p> +</li> +<li id="fn:1096"> +<p>Another thing <a class="footnote-backref" href="#fnref:1096" title="Jump back to footnote 1096 in the text">↩</a></p> +</li> +<li id="fn:1097"> +<p>Another thing <a class="footnote-backref" href="#fnref:1097" title="Jump back to footnote 1097 in the text">↩</a></p> +</li> +<li id="fn:1098"> +<p>Another thing <a class="footnote-backref" href="#fnref:1098" title="Jump back to footnote 1098 in the text">↩</a></p> +</li> +<li id="fn:1099"> +<p>Another thing <a class="footnote-backref" href="#fnref:1099" title="Jump back to footnote 1099 in the text">↩</a></p> +</li> +<li id="fn:1100"> +<p>Another thing <a class="footnote-backref" href="#fnref:1100" title="Jump back to footnote 1100 in the text">↩</a></p> +</li> +<li id="fn:1101"> +<p>Another thing <a class="footnote-backref" href="#fnref:1101" title="Jump back to footnote 1101 in the text">↩</a></p> +</li> +<li id="fn:1102"> +<p>Another thing <a class="footnote-backref" href="#fnref:1102" title="Jump back to footnote 1102 in the text">↩</a></p> +</li> +<li id="fn:1103"> +<p>Another thing <a class="footnote-backref" href="#fnref:1103" title="Jump back to footnote 1103 in the text">↩</a></p> +</li> +<li id="fn:1104"> +<p>Another thing <a class="footnote-backref" href="#fnref:1104" title="Jump back to footnote 1104 in the text">↩</a></p> +</li> +<li id="fn:1105"> +<p>Another thing <a class="footnote-backref" href="#fnref:1105" title="Jump back to footnote 1105 in the text">↩</a></p> +</li> +<li id="fn:1106"> +<p>Another thing <a class="footnote-backref" href="#fnref:1106" title="Jump back to footnote 1106 in the text">↩</a></p> +</li> +<li id="fn:1107"> +<p>Another thing <a class="footnote-backref" href="#fnref:1107" title="Jump back to footnote 1107 in the text">↩</a></p> +</li> +<li id="fn:1108"> +<p>Another thing <a class="footnote-backref" href="#fnref:1108" title="Jump back to footnote 1108 in the text">↩</a></p> +</li> +<li id="fn:1109"> +<p>Another thing <a class="footnote-backref" href="#fnref:1109" title="Jump back to footnote 1109 in the text">↩</a></p> +</li> +<li id="fn:1110"> +<p>Another thing <a class="footnote-backref" href="#fnref:1110" title="Jump back to footnote 1110 in the text">↩</a></p> +</li> +<li id="fn:1111"> +<p>Another thing <a class="footnote-backref" href="#fnref:1111" title="Jump back to footnote 1111 in the text">↩</a></p> +</li> +<li id="fn:1112"> +<p>Another thing <a class="footnote-backref" href="#fnref:1112" title="Jump back to footnote 1112 in the text">↩</a></p> +</li> +<li id="fn:1113"> +<p>Another thing <a class="footnote-backref" href="#fnref:1113" title="Jump back to footnote 1113 in the text">↩</a></p> +</li> +<li id="fn:1114"> +<p>Another thing <a class="footnote-backref" href="#fnref:1114" title="Jump back to footnote 1114 in the text">↩</a></p> +</li> +<li id="fn:1115"> +<p>Another thing <a class="footnote-backref" href="#fnref:1115" title="Jump back to footnote 1115 in the text">↩</a></p> +</li> +<li id="fn:1116"> +<p>Another thing <a class="footnote-backref" href="#fnref:1116" title="Jump back to footnote 1116 in the text">↩</a></p> +</li> +<li id="fn:1117"> +<p>Another thing <a class="footnote-backref" href="#fnref:1117" title="Jump back to footnote 1117 in the text">↩</a></p> +</li> +<li id="fn:1118"> +<p>Another thing <a class="footnote-backref" href="#fnref:1118" title="Jump back to footnote 1118 in the text">↩</a></p> +</li> +<li id="fn:1119"> +<p>Another thing <a class="footnote-backref" href="#fnref:1119" title="Jump back to footnote 1119 in the text">↩</a></p> +</li> +<li id="fn:1120"> +<p>Another thing <a class="footnote-backref" href="#fnref:1120" title="Jump back to footnote 1120 in the text">↩</a></p> +</li> +<li id="fn:1121"> +<p>Another thing <a class="footnote-backref" href="#fnref:1121" title="Jump back to footnote 1121 in the text">↩</a></p> +</li> +<li id="fn:1122"> +<p>Another thing <a class="footnote-backref" href="#fnref:1122" title="Jump back to footnote 1122 in the text">↩</a></p> +</li> +<li id="fn:1123"> +<p>Another thing <a class="footnote-backref" href="#fnref:1123" title="Jump back to footnote 1123 in the text">↩</a></p> +</li> +<li id="fn:1124"> +<p>Another thing <a class="footnote-backref" href="#fnref:1124" title="Jump back to footnote 1124 in the text">↩</a></p> +</li> +<li id="fn:1125"> +<p>Another thing <a class="footnote-backref" href="#fnref:1125" title="Jump back to footnote 1125 in the text">↩</a></p> +</li> +<li id="fn:1126"> +<p>Another thing <a class="footnote-backref" href="#fnref:1126" title="Jump back to footnote 1126 in the text">↩</a></p> +</li> +<li id="fn:1127"> +<p>Another thing <a class="footnote-backref" href="#fnref:1127" title="Jump back to footnote 1127 in the text">↩</a></p> +</li> +<li id="fn:1128"> +<p>Another thing <a class="footnote-backref" href="#fnref:1128" title="Jump back to footnote 1128 in the text">↩</a></p> +</li> +<li id="fn:1129"> +<p>Another thing <a class="footnote-backref" href="#fnref:1129" title="Jump back to footnote 1129 in the text">↩</a></p> +</li> +<li id="fn:1130"> +<p>Another thing <a class="footnote-backref" href="#fnref:1130" title="Jump back to footnote 1130 in the text">↩</a></p> +</li> +<li id="fn:1131"> +<p>Another thing <a class="footnote-backref" href="#fnref:1131" title="Jump back to footnote 1131 in the text">↩</a></p> +</li> +<li id="fn:1132"> +<p>Another thing <a class="footnote-backref" href="#fnref:1132" title="Jump back to footnote 1132 in the text">↩</a></p> +</li> +<li id="fn:1133"> +<p>Another thing <a class="footnote-backref" href="#fnref:1133" title="Jump back to footnote 1133 in the text">↩</a></p> +</li> +<li id="fn:1134"> +<p>Another thing <a class="footnote-backref" href="#fnref:1134" title="Jump back to footnote 1134 in the text">↩</a></p> +</li> +<li id="fn:1135"> +<p>Another thing <a class="footnote-backref" href="#fnref:1135" title="Jump back to footnote 1135 in the text">↩</a></p> +</li> +<li id="fn:1136"> +<p>Another thing <a class="footnote-backref" href="#fnref:1136" title="Jump back to footnote 1136 in the text">↩</a></p> +</li> +<li id="fn:1137"> +<p>Another thing <a class="footnote-backref" href="#fnref:1137" title="Jump back to footnote 1137 in the text">↩</a></p> +</li> +<li id="fn:1138"> +<p>Another thing <a class="footnote-backref" href="#fnref:1138" title="Jump back to footnote 1138 in the text">↩</a></p> +</li> +<li id="fn:1139"> +<p>Another thing <a class="footnote-backref" href="#fnref:1139" title="Jump back to footnote 1139 in the text">↩</a></p> +</li> +<li id="fn:1140"> +<p>Another thing <a class="footnote-backref" href="#fnref:1140" title="Jump back to footnote 1140 in the text">↩</a></p> +</li> +<li id="fn:1141"> +<p>Another thing <a class="footnote-backref" href="#fnref:1141" title="Jump back to footnote 1141 in the text">↩</a></p> +</li> +<li id="fn:1142"> +<p>Another thing <a class="footnote-backref" href="#fnref:1142" title="Jump back to footnote 1142 in the text">↩</a></p> +</li> +<li id="fn:1143"> +<p>Another thing <a class="footnote-backref" href="#fnref:1143" title="Jump back to footnote 1143 in the text">↩</a></p> +</li> +<li id="fn:1144"> +<p>Another thing <a class="footnote-backref" href="#fnref:1144" title="Jump back to footnote 1144 in the text">↩</a></p> +</li> +<li id="fn:1145"> +<p>Another thing <a class="footnote-backref" href="#fnref:1145" title="Jump back to footnote 1145 in the text">↩</a></p> +</li> +<li id="fn:1146"> +<p>Another thing <a class="footnote-backref" href="#fnref:1146" title="Jump back to footnote 1146 in the text">↩</a></p> +</li> +<li id="fn:1147"> +<p>Another thing <a class="footnote-backref" href="#fnref:1147" title="Jump back to footnote 1147 in the text">↩</a></p> +</li> +<li id="fn:1148"> +<p>Another thing <a class="footnote-backref" href="#fnref:1148" title="Jump back to footnote 1148 in the text">↩</a></p> +</li> +<li id="fn:1149"> +<p>Another thing <a class="footnote-backref" href="#fnref:1149" title="Jump back to footnote 1149 in the text">↩</a></p> +</li> +<li id="fn:1150"> +<p>Another thing <a class="footnote-backref" href="#fnref:1150" title="Jump back to footnote 1150 in the text">↩</a></p> +</li> +<li id="fn:1151"> +<p>Another thing <a class="footnote-backref" href="#fnref:1151" title="Jump back to footnote 1151 in the text">↩</a></p> +</li> +<li id="fn:1152"> +<p>Another thing <a class="footnote-backref" href="#fnref:1152" title="Jump back to footnote 1152 in the text">↩</a></p> +</li> +<li id="fn:1153"> +<p>Another thing <a class="footnote-backref" href="#fnref:1153" title="Jump back to footnote 1153 in the text">↩</a></p> +</li> +<li id="fn:1154"> +<p>Another thing <a class="footnote-backref" href="#fnref:1154" title="Jump back to footnote 1154 in the text">↩</a></p> +</li> +<li id="fn:1155"> +<p>Another thing <a class="footnote-backref" href="#fnref:1155" title="Jump back to footnote 1155 in the text">↩</a></p> +</li> +<li id="fn:1156"> +<p>Another thing <a class="footnote-backref" href="#fnref:1156" title="Jump back to footnote 1156 in the text">↩</a></p> +</li> +<li id="fn:1157"> +<p>Another thing <a class="footnote-backref" href="#fnref:1157" title="Jump back to footnote 1157 in the text">↩</a></p> +</li> +<li id="fn:1158"> +<p>Another thing <a class="footnote-backref" href="#fnref:1158" title="Jump back to footnote 1158 in the text">↩</a></p> +</li> +<li id="fn:1159"> +<p>Another thing <a class="footnote-backref" href="#fnref:1159" title="Jump back to footnote 1159 in the text">↩</a></p> +</li> +<li id="fn:1160"> +<p>Another thing <a class="footnote-backref" href="#fnref:1160" title="Jump back to footnote 1160 in the text">↩</a></p> +</li> +<li id="fn:1161"> +<p>Another thing <a class="footnote-backref" href="#fnref:1161" title="Jump back to footnote 1161 in the text">↩</a></p> +</li> +<li id="fn:1162"> +<p>Another thing <a class="footnote-backref" href="#fnref:1162" title="Jump back to footnote 1162 in the text">↩</a></p> +</li> +<li id="fn:1163"> +<p>Another thing <a class="footnote-backref" href="#fnref:1163" title="Jump back to footnote 1163 in the text">↩</a></p> +</li> +<li id="fn:1164"> +<p>Another thing <a class="footnote-backref" href="#fnref:1164" title="Jump back to footnote 1164 in the text">↩</a></p> +</li> +<li id="fn:1165"> +<p>Another thing <a class="footnote-backref" href="#fnref:1165" title="Jump back to footnote 1165 in the text">↩</a></p> +</li> +<li id="fn:1166"> +<p>Another thing <a class="footnote-backref" href="#fnref:1166" title="Jump back to footnote 1166 in the text">↩</a></p> +</li> +<li id="fn:1167"> +<p>Another thing <a class="footnote-backref" href="#fnref:1167" title="Jump back to footnote 1167 in the text">↩</a></p> +</li> +<li id="fn:1168"> +<p>Another thing <a class="footnote-backref" href="#fnref:1168" title="Jump back to footnote 1168 in the text">↩</a></p> +</li> +<li id="fn:1169"> +<p>Another thing <a class="footnote-backref" href="#fnref:1169" title="Jump back to footnote 1169 in the text">↩</a></p> +</li> +<li id="fn:1170"> +<p>Another thing <a class="footnote-backref" href="#fnref:1170" title="Jump back to footnote 1170 in the text">↩</a></p> +</li> +<li id="fn:1171"> +<p>Another thing <a class="footnote-backref" href="#fnref:1171" title="Jump back to footnote 1171 in the text">↩</a></p> +</li> +<li id="fn:1172"> +<p>Another thing <a class="footnote-backref" href="#fnref:1172" title="Jump back to footnote 1172 in the text">↩</a></p> +</li> +<li id="fn:1173"> +<p>Another thing <a class="footnote-backref" href="#fnref:1173" title="Jump back to footnote 1173 in the text">↩</a></p> +</li> +<li id="fn:1174"> +<p>Another thing <a class="footnote-backref" href="#fnref:1174" title="Jump back to footnote 1174 in the text">↩</a></p> +</li> +<li id="fn:1175"> +<p>Another thing <a class="footnote-backref" href="#fnref:1175" title="Jump back to footnote 1175 in the text">↩</a></p> +</li> +<li id="fn:1176"> +<p>Another thing <a class="footnote-backref" href="#fnref:1176" title="Jump back to footnote 1176 in the text">↩</a></p> +</li> +<li id="fn:1177"> +<p>Another thing <a class="footnote-backref" href="#fnref:1177" title="Jump back to footnote 1177 in the text">↩</a></p> +</li> +<li id="fn:1178"> +<p>Another thing <a class="footnote-backref" href="#fnref:1178" title="Jump back to footnote 1178 in the text">↩</a></p> +</li> +<li id="fn:1179"> +<p>Another thing <a class="footnote-backref" href="#fnref:1179" title="Jump back to footnote 1179 in the text">↩</a></p> +</li> +<li id="fn:1180"> +<p>Another thing <a class="footnote-backref" href="#fnref:1180" title="Jump back to footnote 1180 in the text">↩</a></p> +</li> +<li id="fn:1181"> +<p>Another thing <a class="footnote-backref" href="#fnref:1181" title="Jump back to footnote 1181 in the text">↩</a></p> +</li> +<li id="fn:1182"> +<p>Another thing <a class="footnote-backref" href="#fnref:1182" title="Jump back to footnote 1182 in the text">↩</a></p> +</li> +<li id="fn:1183"> +<p>Another thing <a class="footnote-backref" href="#fnref:1183" title="Jump back to footnote 1183 in the text">↩</a></p> +</li> +<li id="fn:1184"> +<p>Another thing <a class="footnote-backref" href="#fnref:1184" title="Jump back to footnote 1184 in the text">↩</a></p> +</li> +<li id="fn:1185"> +<p>Another thing <a class="footnote-backref" href="#fnref:1185" title="Jump back to footnote 1185 in the text">↩</a></p> +</li> +<li id="fn:1186"> +<p>Another thing <a class="footnote-backref" href="#fnref:1186" title="Jump back to footnote 1186 in the text">↩</a></p> +</li> +<li id="fn:1187"> +<p>Another thing <a class="footnote-backref" href="#fnref:1187" title="Jump back to footnote 1187 in the text">↩</a></p> +</li> +<li id="fn:1188"> +<p>Another thing <a class="footnote-backref" href="#fnref:1188" title="Jump back to footnote 1188 in the text">↩</a></p> +</li> +<li id="fn:1189"> +<p>Another thing <a class="footnote-backref" href="#fnref:1189" title="Jump back to footnote 1189 in the text">↩</a></p> +</li> +<li id="fn:1190"> +<p>Another thing <a class="footnote-backref" href="#fnref:1190" title="Jump back to footnote 1190 in the text">↩</a></p> +</li> +<li id="fn:1191"> +<p>Another thing <a class="footnote-backref" href="#fnref:1191" title="Jump back to footnote 1191 in the text">↩</a></p> +</li> +<li id="fn:1192"> +<p>Another thing <a class="footnote-backref" href="#fnref:1192" title="Jump back to footnote 1192 in the text">↩</a></p> +</li> +<li id="fn:1193"> +<p>Another thing <a class="footnote-backref" href="#fnref:1193" title="Jump back to footnote 1193 in the text">↩</a></p> +</li> +<li id="fn:1194"> +<p>Another thing <a class="footnote-backref" href="#fnref:1194" title="Jump back to footnote 1194 in the text">↩</a></p> +</li> +<li id="fn:1195"> +<p>Another thing <a class="footnote-backref" href="#fnref:1195" title="Jump back to footnote 1195 in the text">↩</a></p> +</li> +<li id="fn:1196"> +<p>Another thing <a class="footnote-backref" href="#fnref:1196" title="Jump back to footnote 1196 in the text">↩</a></p> +</li> +<li id="fn:1197"> +<p>Another thing <a class="footnote-backref" href="#fnref:1197" title="Jump back to footnote 1197 in the text">↩</a></p> +</li> +<li id="fn:1198"> +<p>Another thing <a class="footnote-backref" href="#fnref:1198" title="Jump back to footnote 1198 in the text">↩</a></p> +</li> +<li id="fn:1199"> +<p>Another thing <a class="footnote-backref" href="#fnref:1199" title="Jump back to footnote 1199 in the text">↩</a></p> +</li> +</ol> +</div>
\ No newline at end of file diff --git a/tests/extensions/extra/footnote_many_footnotes.txt b/tests/extensions/extra/footnote_many_footnotes.txt new file mode 100644 index 0000000..cd5ee8d --- /dev/null +++ b/tests/extensions/extra/footnote_many_footnotes.txt @@ -0,0 +1,4796 @@ +Something[^1] + +Something[^2] + +Something[^3] + +Something[^4] + +Something[^5] + +Something[^6] + +Something[^7] + +Something[^8] + +Something[^9] + +Something[^10] + +Something[^11] + +Something[^12] + +Something[^13] + +Something[^14] + +Something[^15] + +Something[^16] + +Something[^17] + +Something[^18] + +Something[^19] + +Something[^20] + +Something[^21] + +Something[^22] + +Something[^23] + +Something[^24] + +Something[^25] + +Something[^26] + +Something[^27] + +Something[^28] + +Something[^29] + +Something[^30] + +Something[^31] + +Something[^32] + +Something[^33] + +Something[^34] + +Something[^35] + +Something[^36] + +Something[^37] + +Something[^38] + +Something[^39] + +Something[^40] + +Something[^41] + +Something[^42] + +Something[^43] + +Something[^44] + +Something[^45] + +Something[^46] + +Something[^47] + +Something[^48] + +Something[^49] + +Something[^50] + +Something[^51] + +Something[^52] + +Something[^53] + +Something[^54] + +Something[^55] + +Something[^56] + +Something[^57] + +Something[^58] + +Something[^59] + +Something[^60] + +Something[^61] + +Something[^62] + +Something[^63] + +Something[^64] + +Something[^65] + +Something[^66] + +Something[^67] + +Something[^68] + +Something[^69] + +Something[^70] + +Something[^71] + +Something[^72] + +Something[^73] + +Something[^74] + +Something[^75] + +Something[^76] + +Something[^77] + +Something[^78] + +Something[^79] + +Something[^80] + +Something[^81] + +Something[^82] + +Something[^83] + +Something[^84] + +Something[^85] + +Something[^86] + +Something[^87] + +Something[^88] + +Something[^89] + +Something[^90] + +Something[^91] + +Something[^92] + +Something[^93] + +Something[^94] + +Something[^95] + +Something[^96] + +Something[^97] + +Something[^98] + +Something[^99] + +Something[^100] + +Something[^101] + +Something[^102] + +Something[^103] + +Something[^104] + +Something[^105] + +Something[^106] + +Something[^107] + +Something[^108] + +Something[^109] + +Something[^110] + +Something[^111] + +Something[^112] + +Something[^113] + +Something[^114] + +Something[^115] + +Something[^116] + +Something[^117] + +Something[^118] + +Something[^119] + +Something[^120] + +Something[^121] + +Something[^122] + +Something[^123] + +Something[^124] + +Something[^125] + +Something[^126] + +Something[^127] + +Something[^128] + +Something[^129] + +Something[^130] + +Something[^131] + +Something[^132] + +Something[^133] + +Something[^134] + +Something[^135] + +Something[^136] + +Something[^137] + +Something[^138] + +Something[^139] + +Something[^140] + +Something[^141] + +Something[^142] + +Something[^143] + +Something[^144] + +Something[^145] + +Something[^146] + +Something[^147] + +Something[^148] + +Something[^149] + +Something[^150] + +Something[^151] + +Something[^152] + +Something[^153] + +Something[^154] + +Something[^155] + +Something[^156] + +Something[^157] + +Something[^158] + +Something[^159] + +Something[^160] + +Something[^161] + +Something[^162] + +Something[^163] + +Something[^164] + +Something[^165] + +Something[^166] + +Something[^167] + +Something[^168] + +Something[^169] + +Something[^170] + +Something[^171] + +Something[^172] + +Something[^173] + +Something[^174] + +Something[^175] + +Something[^176] + +Something[^177] + +Something[^178] + +Something[^179] + +Something[^180] + +Something[^181] + +Something[^182] + +Something[^183] + +Something[^184] + +Something[^185] + +Something[^186] + +Something[^187] + +Something[^188] + +Something[^189] + +Something[^190] + +Something[^191] + +Something[^192] + +Something[^193] + +Something[^194] + +Something[^195] + +Something[^196] + +Something[^197] + +Something[^198] + +Something[^199] + +Something[^200] + +Something[^201] + +Something[^202] + +Something[^203] + +Something[^204] + +Something[^205] + +Something[^206] + +Something[^207] + +Something[^208] + +Something[^209] + +Something[^210] + +Something[^211] + +Something[^212] + +Something[^213] + +Something[^214] + +Something[^215] + +Something[^216] + +Something[^217] + +Something[^218] + +Something[^219] + +Something[^220] + +Something[^221] + +Something[^222] + +Something[^223] + +Something[^224] + +Something[^225] + +Something[^226] + +Something[^227] + +Something[^228] + +Something[^229] + +Something[^230] + +Something[^231] + +Something[^232] + +Something[^233] + +Something[^234] + +Something[^235] + +Something[^236] + +Something[^237] + +Something[^238] + +Something[^239] + +Something[^240] + +Something[^241] + +Something[^242] + +Something[^243] + +Something[^244] + +Something[^245] + +Something[^246] + +Something[^247] + +Something[^248] + +Something[^249] + +Something[^250] + +Something[^251] + +Something[^252] + +Something[^253] + +Something[^254] + +Something[^255] + +Something[^256] + +Something[^257] + +Something[^258] + +Something[^259] + +Something[^260] + +Something[^261] + +Something[^262] + +Something[^263] + +Something[^264] + +Something[^265] + +Something[^266] + +Something[^267] + +Something[^268] + +Something[^269] + +Something[^270] + +Something[^271] + +Something[^272] + +Something[^273] + +Something[^274] + +Something[^275] + +Something[^276] + +Something[^277] + +Something[^278] + +Something[^279] + +Something[^280] + +Something[^281] + +Something[^282] + +Something[^283] + +Something[^284] + +Something[^285] + +Something[^286] + +Something[^287] + +Something[^288] + +Something[^289] + +Something[^290] + +Something[^291] + +Something[^292] + +Something[^293] + +Something[^294] + +Something[^295] + +Something[^296] + +Something[^297] + +Something[^298] + +Something[^299] + +Something[^300] + +Something[^301] + +Something[^302] + +Something[^303] + +Something[^304] + +Something[^305] + +Something[^306] + +Something[^307] + +Something[^308] + +Something[^309] + +Something[^310] + +Something[^311] + +Something[^312] + +Something[^313] + +Something[^314] + +Something[^315] + +Something[^316] + +Something[^317] + +Something[^318] + +Something[^319] + +Something[^320] + +Something[^321] + +Something[^322] + +Something[^323] + +Something[^324] + +Something[^325] + +Something[^326] + +Something[^327] + +Something[^328] + +Something[^329] + +Something[^330] + +Something[^331] + +Something[^332] + +Something[^333] + +Something[^334] + +Something[^335] + +Something[^336] + +Something[^337] + +Something[^338] + +Something[^339] + +Something[^340] + +Something[^341] + +Something[^342] + +Something[^343] + +Something[^344] + +Something[^345] + +Something[^346] + +Something[^347] + +Something[^348] + +Something[^349] + +Something[^350] + +Something[^351] + +Something[^352] + +Something[^353] + +Something[^354] + +Something[^355] + +Something[^356] + +Something[^357] + +Something[^358] + +Something[^359] + +Something[^360] + +Something[^361] + +Something[^362] + +Something[^363] + +Something[^364] + +Something[^365] + +Something[^366] + +Something[^367] + +Something[^368] + +Something[^369] + +Something[^370] + +Something[^371] + +Something[^372] + +Something[^373] + +Something[^374] + +Something[^375] + +Something[^376] + +Something[^377] + +Something[^378] + +Something[^379] + +Something[^380] + +Something[^381] + +Something[^382] + +Something[^383] + +Something[^384] + +Something[^385] + +Something[^386] + +Something[^387] + +Something[^388] + +Something[^389] + +Something[^390] + +Something[^391] + +Something[^392] + +Something[^393] + +Something[^394] + +Something[^395] + +Something[^396] + +Something[^397] + +Something[^398] + +Something[^399] + +Something[^400] + +Something[^401] + +Something[^402] + +Something[^403] + +Something[^404] + +Something[^405] + +Something[^406] + +Something[^407] + +Something[^408] + +Something[^409] + +Something[^410] + +Something[^411] + +Something[^412] + +Something[^413] + +Something[^414] + +Something[^415] + +Something[^416] + +Something[^417] + +Something[^418] + +Something[^419] + +Something[^420] + +Something[^421] + +Something[^422] + +Something[^423] + +Something[^424] + +Something[^425] + +Something[^426] + +Something[^427] + +Something[^428] + +Something[^429] + +Something[^430] + +Something[^431] + +Something[^432] + +Something[^433] + +Something[^434] + +Something[^435] + +Something[^436] + +Something[^437] + +Something[^438] + +Something[^439] + +Something[^440] + +Something[^441] + +Something[^442] + +Something[^443] + +Something[^444] + +Something[^445] + +Something[^446] + +Something[^447] + +Something[^448] + +Something[^449] + +Something[^450] + +Something[^451] + +Something[^452] + +Something[^453] + +Something[^454] + +Something[^455] + +Something[^456] + +Something[^457] + +Something[^458] + +Something[^459] + +Something[^460] + +Something[^461] + +Something[^462] + +Something[^463] + +Something[^464] + +Something[^465] + +Something[^466] + +Something[^467] + +Something[^468] + +Something[^469] + +Something[^470] + +Something[^471] + +Something[^472] + +Something[^473] + +Something[^474] + +Something[^475] + +Something[^476] + +Something[^477] + +Something[^478] + +Something[^479] + +Something[^480] + +Something[^481] + +Something[^482] + +Something[^483] + +Something[^484] + +Something[^485] + +Something[^486] + +Something[^487] + +Something[^488] + +Something[^489] + +Something[^490] + +Something[^491] + +Something[^492] + +Something[^493] + +Something[^494] + +Something[^495] + +Something[^496] + +Something[^497] + +Something[^498] + +Something[^499] + +Something[^500] + +Something[^501] + +Something[^502] + +Something[^503] + +Something[^504] + +Something[^505] + +Something[^506] + +Something[^507] + +Something[^508] + +Something[^509] + +Something[^510] + +Something[^511] + +Something[^512] + +Something[^513] + +Something[^514] + +Something[^515] + +Something[^516] + +Something[^517] + +Something[^518] + +Something[^519] + +Something[^520] + +Something[^521] + +Something[^522] + +Something[^523] + +Something[^524] + +Something[^525] + +Something[^526] + +Something[^527] + +Something[^528] + +Something[^529] + +Something[^530] + +Something[^531] + +Something[^532] + +Something[^533] + +Something[^534] + +Something[^535] + +Something[^536] + +Something[^537] + +Something[^538] + +Something[^539] + +Something[^540] + +Something[^541] + +Something[^542] + +Something[^543] + +Something[^544] + +Something[^545] + +Something[^546] + +Something[^547] + +Something[^548] + +Something[^549] + +Something[^550] + +Something[^551] + +Something[^552] + +Something[^553] + +Something[^554] + +Something[^555] + +Something[^556] + +Something[^557] + +Something[^558] + +Something[^559] + +Something[^560] + +Something[^561] + +Something[^562] + +Something[^563] + +Something[^564] + +Something[^565] + +Something[^566] + +Something[^567] + +Something[^568] + +Something[^569] + +Something[^570] + +Something[^571] + +Something[^572] + +Something[^573] + +Something[^574] + +Something[^575] + +Something[^576] + +Something[^577] + +Something[^578] + +Something[^579] + +Something[^580] + +Something[^581] + +Something[^582] + +Something[^583] + +Something[^584] + +Something[^585] + +Something[^586] + +Something[^587] + +Something[^588] + +Something[^589] + +Something[^590] + +Something[^591] + +Something[^592] + +Something[^593] + +Something[^594] + +Something[^595] + +Something[^596] + +Something[^597] + +Something[^598] + +Something[^599] + +Something[^600] + +Something[^601] + +Something[^602] + +Something[^603] + +Something[^604] + +Something[^605] + +Something[^606] + +Something[^607] + +Something[^608] + +Something[^609] + +Something[^610] + +Something[^611] + +Something[^612] + +Something[^613] + +Something[^614] + +Something[^615] + +Something[^616] + +Something[^617] + +Something[^618] + +Something[^619] + +Something[^620] + +Something[^621] + +Something[^622] + +Something[^623] + +Something[^624] + +Something[^625] + +Something[^626] + +Something[^627] + +Something[^628] + +Something[^629] + +Something[^630] + +Something[^631] + +Something[^632] + +Something[^633] + +Something[^634] + +Something[^635] + +Something[^636] + +Something[^637] + +Something[^638] + +Something[^639] + +Something[^640] + +Something[^641] + +Something[^642] + +Something[^643] + +Something[^644] + +Something[^645] + +Something[^646] + +Something[^647] + +Something[^648] + +Something[^649] + +Something[^650] + +Something[^651] + +Something[^652] + +Something[^653] + +Something[^654] + +Something[^655] + +Something[^656] + +Something[^657] + +Something[^658] + +Something[^659] + +Something[^660] + +Something[^661] + +Something[^662] + +Something[^663] + +Something[^664] + +Something[^665] + +Something[^666] + +Something[^667] + +Something[^668] + +Something[^669] + +Something[^670] + +Something[^671] + +Something[^672] + +Something[^673] + +Something[^674] + +Something[^675] + +Something[^676] + +Something[^677] + +Something[^678] + +Something[^679] + +Something[^680] + +Something[^681] + +Something[^682] + +Something[^683] + +Something[^684] + +Something[^685] + +Something[^686] + +Something[^687] + +Something[^688] + +Something[^689] + +Something[^690] + +Something[^691] + +Something[^692] + +Something[^693] + +Something[^694] + +Something[^695] + +Something[^696] + +Something[^697] + +Something[^698] + +Something[^699] + +Something[^700] + +Something[^701] + +Something[^702] + +Something[^703] + +Something[^704] + +Something[^705] + +Something[^706] + +Something[^707] + +Something[^708] + +Something[^709] + +Something[^710] + +Something[^711] + +Something[^712] + +Something[^713] + +Something[^714] + +Something[^715] + +Something[^716] + +Something[^717] + +Something[^718] + +Something[^719] + +Something[^720] + +Something[^721] + +Something[^722] + +Something[^723] + +Something[^724] + +Something[^725] + +Something[^726] + +Something[^727] + +Something[^728] + +Something[^729] + +Something[^730] + +Something[^731] + +Something[^732] + +Something[^733] + +Something[^734] + +Something[^735] + +Something[^736] + +Something[^737] + +Something[^738] + +Something[^739] + +Something[^740] + +Something[^741] + +Something[^742] + +Something[^743] + +Something[^744] + +Something[^745] + +Something[^746] + +Something[^747] + +Something[^748] + +Something[^749] + +Something[^750] + +Something[^751] + +Something[^752] + +Something[^753] + +Something[^754] + +Something[^755] + +Something[^756] + +Something[^757] + +Something[^758] + +Something[^759] + +Something[^760] + +Something[^761] + +Something[^762] + +Something[^763] + +Something[^764] + +Something[^765] + +Something[^766] + +Something[^767] + +Something[^768] + +Something[^769] + +Something[^770] + +Something[^771] + +Something[^772] + +Something[^773] + +Something[^774] + +Something[^775] + +Something[^776] + +Something[^777] + +Something[^778] + +Something[^779] + +Something[^780] + +Something[^781] + +Something[^782] + +Something[^783] + +Something[^784] + +Something[^785] + +Something[^786] + +Something[^787] + +Something[^788] + +Something[^789] + +Something[^790] + +Something[^791] + +Something[^792] + +Something[^793] + +Something[^794] + +Something[^795] + +Something[^796] + +Something[^797] + +Something[^798] + +Something[^799] + +Something[^800] + +Something[^801] + +Something[^802] + +Something[^803] + +Something[^804] + +Something[^805] + +Something[^806] + +Something[^807] + +Something[^808] + +Something[^809] + +Something[^810] + +Something[^811] + +Something[^812] + +Something[^813] + +Something[^814] + +Something[^815] + +Something[^816] + +Something[^817] + +Something[^818] + +Something[^819] + +Something[^820] + +Something[^821] + +Something[^822] + +Something[^823] + +Something[^824] + +Something[^825] + +Something[^826] + +Something[^827] + +Something[^828] + +Something[^829] + +Something[^830] + +Something[^831] + +Something[^832] + +Something[^833] + +Something[^834] + +Something[^835] + +Something[^836] + +Something[^837] + +Something[^838] + +Something[^839] + +Something[^840] + +Something[^841] + +Something[^842] + +Something[^843] + +Something[^844] + +Something[^845] + +Something[^846] + +Something[^847] + +Something[^848] + +Something[^849] + +Something[^850] + +Something[^851] + +Something[^852] + +Something[^853] + +Something[^854] + +Something[^855] + +Something[^856] + +Something[^857] + +Something[^858] + +Something[^859] + +Something[^860] + +Something[^861] + +Something[^862] + +Something[^863] + +Something[^864] + +Something[^865] + +Something[^866] + +Something[^867] + +Something[^868] + +Something[^869] + +Something[^870] + +Something[^871] + +Something[^872] + +Something[^873] + +Something[^874] + +Something[^875] + +Something[^876] + +Something[^877] + +Something[^878] + +Something[^879] + +Something[^880] + +Something[^881] + +Something[^882] + +Something[^883] + +Something[^884] + +Something[^885] + +Something[^886] + +Something[^887] + +Something[^888] + +Something[^889] + +Something[^890] + +Something[^891] + +Something[^892] + +Something[^893] + +Something[^894] + +Something[^895] + +Something[^896] + +Something[^897] + +Something[^898] + +Something[^899] + +Something[^900] + +Something[^901] + +Something[^902] + +Something[^903] + +Something[^904] + +Something[^905] + +Something[^906] + +Something[^907] + +Something[^908] + +Something[^909] + +Something[^910] + +Something[^911] + +Something[^912] + +Something[^913] + +Something[^914] + +Something[^915] + +Something[^916] + +Something[^917] + +Something[^918] + +Something[^919] + +Something[^920] + +Something[^921] + +Something[^922] + +Something[^923] + +Something[^924] + +Something[^925] + +Something[^926] + +Something[^927] + +Something[^928] + +Something[^929] + +Something[^930] + +Something[^931] + +Something[^932] + +Something[^933] + +Something[^934] + +Something[^935] + +Something[^936] + +Something[^937] + +Something[^938] + +Something[^939] + +Something[^940] + +Something[^941] + +Something[^942] + +Something[^943] + +Something[^944] + +Something[^945] + +Something[^946] + +Something[^947] + +Something[^948] + +Something[^949] + +Something[^950] + +Something[^951] + +Something[^952] + +Something[^953] + +Something[^954] + +Something[^955] + +Something[^956] + +Something[^957] + +Something[^958] + +Something[^959] + +Something[^960] + +Something[^961] + +Something[^962] + +Something[^963] + +Something[^964] + +Something[^965] + +Something[^966] + +Something[^967] + +Something[^968] + +Something[^969] + +Something[^970] + +Something[^971] + +Something[^972] + +Something[^973] + +Something[^974] + +Something[^975] + +Something[^976] + +Something[^977] + +Something[^978] + +Something[^979] + +Something[^980] + +Something[^981] + +Something[^982] + +Something[^983] + +Something[^984] + +Something[^985] + +Something[^986] + +Something[^987] + +Something[^988] + +Something[^989] + +Something[^990] + +Something[^991] + +Something[^992] + +Something[^993] + +Something[^994] + +Something[^995] + +Something[^996] + +Something[^997] + +Something[^998] + +Something[^999] + +Something[^1000] + +Something[^1001] + +Something[^1002] + +Something[^1003] + +Something[^1004] + +Something[^1005] + +Something[^1006] + +Something[^1007] + +Something[^1008] + +Something[^1009] + +Something[^1010] + +Something[^1011] + +Something[^1012] + +Something[^1013] + +Something[^1014] + +Something[^1015] + +Something[^1016] + +Something[^1017] + +Something[^1018] + +Something[^1019] + +Something[^1020] + +Something[^1021] + +Something[^1022] + +Something[^1023] + +Something[^1024] + +Something[^1025] + +Something[^1026] + +Something[^1027] + +Something[^1028] + +Something[^1029] + +Something[^1030] + +Something[^1031] + +Something[^1032] + +Something[^1033] + +Something[^1034] + +Something[^1035] + +Something[^1036] + +Something[^1037] + +Something[^1038] + +Something[^1039] + +Something[^1040] + +Something[^1041] + +Something[^1042] + +Something[^1043] + +Something[^1044] + +Something[^1045] + +Something[^1046] + +Something[^1047] + +Something[^1048] + +Something[^1049] + +Something[^1050] + +Something[^1051] + +Something[^1052] + +Something[^1053] + +Something[^1054] + +Something[^1055] + +Something[^1056] + +Something[^1057] + +Something[^1058] + +Something[^1059] + +Something[^1060] + +Something[^1061] + +Something[^1062] + +Something[^1063] + +Something[^1064] + +Something[^1065] + +Something[^1066] + +Something[^1067] + +Something[^1068] + +Something[^1069] + +Something[^1070] + +Something[^1071] + +Something[^1072] + +Something[^1073] + +Something[^1074] + +Something[^1075] + +Something[^1076] + +Something[^1077] + +Something[^1078] + +Something[^1079] + +Something[^1080] + +Something[^1081] + +Something[^1082] + +Something[^1083] + +Something[^1084] + +Something[^1085] + +Something[^1086] + +Something[^1087] + +Something[^1088] + +Something[^1089] + +Something[^1090] + +Something[^1091] + +Something[^1092] + +Something[^1093] + +Something[^1094] + +Something[^1095] + +Something[^1096] + +Something[^1097] + +Something[^1098] + +Something[^1099] + +Something[^1100] + +Something[^1101] + +Something[^1102] + +Something[^1103] + +Something[^1104] + +Something[^1105] + +Something[^1106] + +Something[^1107] + +Something[^1108] + +Something[^1109] + +Something[^1110] + +Something[^1111] + +Something[^1112] + +Something[^1113] + +Something[^1114] + +Something[^1115] + +Something[^1116] + +Something[^1117] + +Something[^1118] + +Something[^1119] + +Something[^1120] + +Something[^1121] + +Something[^1122] + +Something[^1123] + +Something[^1124] + +Something[^1125] + +Something[^1126] + +Something[^1127] + +Something[^1128] + +Something[^1129] + +Something[^1130] + +Something[^1131] + +Something[^1132] + +Something[^1133] + +Something[^1134] + +Something[^1135] + +Something[^1136] + +Something[^1137] + +Something[^1138] + +Something[^1139] + +Something[^1140] + +Something[^1141] + +Something[^1142] + +Something[^1143] + +Something[^1144] + +Something[^1145] + +Something[^1146] + +Something[^1147] + +Something[^1148] + +Something[^1149] + +Something[^1150] + +Something[^1151] + +Something[^1152] + +Something[^1153] + +Something[^1154] + +Something[^1155] + +Something[^1156] + +Something[^1157] + +Something[^1158] + +Something[^1159] + +Something[^1160] + +Something[^1161] + +Something[^1162] + +Something[^1163] + +Something[^1164] + +Something[^1165] + +Something[^1166] + +Something[^1167] + +Something[^1168] + +Something[^1169] + +Something[^1170] + +Something[^1171] + +Something[^1172] + +Something[^1173] + +Something[^1174] + +Something[^1175] + +Something[^1176] + +Something[^1177] + +Something[^1178] + +Something[^1179] + +Something[^1180] + +Something[^1181] + +Something[^1182] + +Something[^1183] + +Something[^1184] + +Something[^1185] + +Something[^1186] + +Something[^1187] + +Something[^1188] + +Something[^1189] + +Something[^1190] + +Something[^1191] + +Something[^1192] + +Something[^1193] + +Something[^1194] + +Something[^1195] + +Something[^1196] + +Something[^1197] + +Something[^1198] + +Something[^1199] + +[^1]: Another thing + +[^2]: Another thing + +[^3]: Another thing + +[^4]: Another thing + +[^5]: Another thing + +[^6]: Another thing + +[^7]: Another thing + +[^8]: Another thing + +[^9]: Another thing + +[^10]: Another thing + +[^11]: Another thing + +[^12]: Another thing + +[^13]: Another thing + +[^14]: Another thing + +[^15]: Another thing + +[^16]: Another thing + +[^17]: Another thing + +[^18]: Another thing + +[^19]: Another thing + +[^20]: Another thing + +[^21]: Another thing + +[^22]: Another thing + +[^23]: Another thing + +[^24]: Another thing + +[^25]: Another thing + +[^26]: Another thing + +[^27]: Another thing + +[^28]: Another thing + +[^29]: Another thing + +[^30]: Another thing + +[^31]: Another thing + +[^32]: Another thing + +[^33]: Another thing + +[^34]: Another thing + +[^35]: Another thing + +[^36]: Another thing + +[^37]: Another thing + +[^38]: Another thing + +[^39]: Another thing + +[^40]: Another thing + +[^41]: Another thing + +[^42]: Another thing + +[^43]: Another thing + +[^44]: Another thing + +[^45]: Another thing + +[^46]: Another thing + +[^47]: Another thing + +[^48]: Another thing + +[^49]: Another thing + +[^50]: Another thing + +[^51]: Another thing + +[^52]: Another thing + +[^53]: Another thing + +[^54]: Another thing + +[^55]: Another thing + +[^56]: Another thing + +[^57]: Another thing + +[^58]: Another thing + +[^59]: Another thing + +[^60]: Another thing + +[^61]: Another thing + +[^62]: Another thing + +[^63]: Another thing + +[^64]: Another thing + +[^65]: Another thing + +[^66]: Another thing + +[^67]: Another thing + +[^68]: Another thing + +[^69]: Another thing + +[^70]: Another thing + +[^71]: Another thing + +[^72]: Another thing + +[^73]: Another thing + +[^74]: Another thing + +[^75]: Another thing + +[^76]: Another thing + +[^77]: Another thing + +[^78]: Another thing + +[^79]: Another thing + +[^80]: Another thing + +[^81]: Another thing + +[^82]: Another thing + +[^83]: Another thing + +[^84]: Another thing + +[^85]: Another thing + +[^86]: Another thing + +[^87]: Another thing + +[^88]: Another thing + +[^89]: Another thing + +[^90]: Another thing + +[^91]: Another thing + +[^92]: Another thing + +[^93]: Another thing + +[^94]: Another thing + +[^95]: Another thing + +[^96]: Another thing + +[^97]: Another thing + +[^98]: Another thing + +[^99]: Another thing + +[^100]: Another thing + +[^101]: Another thing + +[^102]: Another thing + +[^103]: Another thing + +[^104]: Another thing + +[^105]: Another thing + +[^106]: Another thing + +[^107]: Another thing + +[^108]: Another thing + +[^109]: Another thing + +[^110]: Another thing + +[^111]: Another thing + +[^112]: Another thing + +[^113]: Another thing + +[^114]: Another thing + +[^115]: Another thing + +[^116]: Another thing + +[^117]: Another thing + +[^118]: Another thing + +[^119]: Another thing + +[^120]: Another thing + +[^121]: Another thing + +[^122]: Another thing + +[^123]: Another thing + +[^124]: Another thing + +[^125]: Another thing + +[^126]: Another thing + +[^127]: Another thing + +[^128]: Another thing + +[^129]: Another thing + +[^130]: Another thing + +[^131]: Another thing + +[^132]: Another thing + +[^133]: Another thing + +[^134]: Another thing + +[^135]: Another thing + +[^136]: Another thing + +[^137]: Another thing + +[^138]: Another thing + +[^139]: Another thing + +[^140]: Another thing + +[^141]: Another thing + +[^142]: Another thing + +[^143]: Another thing + +[^144]: Another thing + +[^145]: Another thing + +[^146]: Another thing + +[^147]: Another thing + +[^148]: Another thing + +[^149]: Another thing + +[^150]: Another thing + +[^151]: Another thing + +[^152]: Another thing + +[^153]: Another thing + +[^154]: Another thing + +[^155]: Another thing + +[^156]: Another thing + +[^157]: Another thing + +[^158]: Another thing + +[^159]: Another thing + +[^160]: Another thing + +[^161]: Another thing + +[^162]: Another thing + +[^163]: Another thing + +[^164]: Another thing + +[^165]: Another thing + +[^166]: Another thing + +[^167]: Another thing + +[^168]: Another thing + +[^169]: Another thing + +[^170]: Another thing + +[^171]: Another thing + +[^172]: Another thing + +[^173]: Another thing + +[^174]: Another thing + +[^175]: Another thing + +[^176]: Another thing + +[^177]: Another thing + +[^178]: Another thing + +[^179]: Another thing + +[^180]: Another thing + +[^181]: Another thing + +[^182]: Another thing + +[^183]: Another thing + +[^184]: Another thing + +[^185]: Another thing + +[^186]: Another thing + +[^187]: Another thing + +[^188]: Another thing + +[^189]: Another thing + +[^190]: Another thing + +[^191]: Another thing + +[^192]: Another thing + +[^193]: Another thing + +[^194]: Another thing + +[^195]: Another thing + +[^196]: Another thing + +[^197]: Another thing + +[^198]: Another thing + +[^199]: Another thing + +[^200]: Another thing + +[^201]: Another thing + +[^202]: Another thing + +[^203]: Another thing + +[^204]: Another thing + +[^205]: Another thing + +[^206]: Another thing + +[^207]: Another thing + +[^208]: Another thing + +[^209]: Another thing + +[^210]: Another thing + +[^211]: Another thing + +[^212]: Another thing + +[^213]: Another thing + +[^214]: Another thing + +[^215]: Another thing + +[^216]: Another thing + +[^217]: Another thing + +[^218]: Another thing + +[^219]: Another thing + +[^220]: Another thing + +[^221]: Another thing + +[^222]: Another thing + +[^223]: Another thing + +[^224]: Another thing + +[^225]: Another thing + +[^226]: Another thing + +[^227]: Another thing + +[^228]: Another thing + +[^229]: Another thing + +[^230]: Another thing + +[^231]: Another thing + +[^232]: Another thing + +[^233]: Another thing + +[^234]: Another thing + +[^235]: Another thing + +[^236]: Another thing + +[^237]: Another thing + +[^238]: Another thing + +[^239]: Another thing + +[^240]: Another thing + +[^241]: Another thing + +[^242]: Another thing + +[^243]: Another thing + +[^244]: Another thing + +[^245]: Another thing + +[^246]: Another thing + +[^247]: Another thing + +[^248]: Another thing + +[^249]: Another thing + +[^250]: Another thing + +[^251]: Another thing + +[^252]: Another thing + +[^253]: Another thing + +[^254]: Another thing + +[^255]: Another thing + +[^256]: Another thing + +[^257]: Another thing + +[^258]: Another thing + +[^259]: Another thing + +[^260]: Another thing + +[^261]: Another thing + +[^262]: Another thing + +[^263]: Another thing + +[^264]: Another thing + +[^265]: Another thing + +[^266]: Another thing + +[^267]: Another thing + +[^268]: Another thing + +[^269]: Another thing + +[^270]: Another thing + +[^271]: Another thing + +[^272]: Another thing + +[^273]: Another thing + +[^274]: Another thing + +[^275]: Another thing + +[^276]: Another thing + +[^277]: Another thing + +[^278]: Another thing + +[^279]: Another thing + +[^280]: Another thing + +[^281]: Another thing + +[^282]: Another thing + +[^283]: Another thing + +[^284]: Another thing + +[^285]: Another thing + +[^286]: Another thing + +[^287]: Another thing + +[^288]: Another thing + +[^289]: Another thing + +[^290]: Another thing + +[^291]: Another thing + +[^292]: Another thing + +[^293]: Another thing + +[^294]: Another thing + +[^295]: Another thing + +[^296]: Another thing + +[^297]: Another thing + +[^298]: Another thing + +[^299]: Another thing + +[^300]: Another thing + +[^301]: Another thing + +[^302]: Another thing + +[^303]: Another thing + +[^304]: Another thing + +[^305]: Another thing + +[^306]: Another thing + +[^307]: Another thing + +[^308]: Another thing + +[^309]: Another thing + +[^310]: Another thing + +[^311]: Another thing + +[^312]: Another thing + +[^313]: Another thing + +[^314]: Another thing + +[^315]: Another thing + +[^316]: Another thing + +[^317]: Another thing + +[^318]: Another thing + +[^319]: Another thing + +[^320]: Another thing + +[^321]: Another thing + +[^322]: Another thing + +[^323]: Another thing + +[^324]: Another thing + +[^325]: Another thing + +[^326]: Another thing + +[^327]: Another thing + +[^328]: Another thing + +[^329]: Another thing + +[^330]: Another thing + +[^331]: Another thing + +[^332]: Another thing + +[^333]: Another thing + +[^334]: Another thing + +[^335]: Another thing + +[^336]: Another thing + +[^337]: Another thing + +[^338]: Another thing + +[^339]: Another thing + +[^340]: Another thing + +[^341]: Another thing + +[^342]: Another thing + +[^343]: Another thing + +[^344]: Another thing + +[^345]: Another thing + +[^346]: Another thing + +[^347]: Another thing + +[^348]: Another thing + +[^349]: Another thing + +[^350]: Another thing + +[^351]: Another thing + +[^352]: Another thing + +[^353]: Another thing + +[^354]: Another thing + +[^355]: Another thing + +[^356]: Another thing + +[^357]: Another thing + +[^358]: Another thing + +[^359]: Another thing + +[^360]: Another thing + +[^361]: Another thing + +[^362]: Another thing + +[^363]: Another thing + +[^364]: Another thing + +[^365]: Another thing + +[^366]: Another thing + +[^367]: Another thing + +[^368]: Another thing + +[^369]: Another thing + +[^370]: Another thing + +[^371]: Another thing + +[^372]: Another thing + +[^373]: Another thing + +[^374]: Another thing + +[^375]: Another thing + +[^376]: Another thing + +[^377]: Another thing + +[^378]: Another thing + +[^379]: Another thing + +[^380]: Another thing + +[^381]: Another thing + +[^382]: Another thing + +[^383]: Another thing + +[^384]: Another thing + +[^385]: Another thing + +[^386]: Another thing + +[^387]: Another thing + +[^388]: Another thing + +[^389]: Another thing + +[^390]: Another thing + +[^391]: Another thing + +[^392]: Another thing + +[^393]: Another thing + +[^394]: Another thing + +[^395]: Another thing + +[^396]: Another thing + +[^397]: Another thing + +[^398]: Another thing + +[^399]: Another thing + +[^400]: Another thing + +[^401]: Another thing + +[^402]: Another thing + +[^403]: Another thing + +[^404]: Another thing + +[^405]: Another thing + +[^406]: Another thing + +[^407]: Another thing + +[^408]: Another thing + +[^409]: Another thing + +[^410]: Another thing + +[^411]: Another thing + +[^412]: Another thing + +[^413]: Another thing + +[^414]: Another thing + +[^415]: Another thing + +[^416]: Another thing + +[^417]: Another thing + +[^418]: Another thing + +[^419]: Another thing + +[^420]: Another thing + +[^421]: Another thing + +[^422]: Another thing + +[^423]: Another thing + +[^424]: Another thing + +[^425]: Another thing + +[^426]: Another thing + +[^427]: Another thing + +[^428]: Another thing + +[^429]: Another thing + +[^430]: Another thing + +[^431]: Another thing + +[^432]: Another thing + +[^433]: Another thing + +[^434]: Another thing + +[^435]: Another thing + +[^436]: Another thing + +[^437]: Another thing + +[^438]: Another thing + +[^439]: Another thing + +[^440]: Another thing + +[^441]: Another thing + +[^442]: Another thing + +[^443]: Another thing + +[^444]: Another thing + +[^445]: Another thing + +[^446]: Another thing + +[^447]: Another thing + +[^448]: Another thing + +[^449]: Another thing + +[^450]: Another thing + +[^451]: Another thing + +[^452]: Another thing + +[^453]: Another thing + +[^454]: Another thing + +[^455]: Another thing + +[^456]: Another thing + +[^457]: Another thing + +[^458]: Another thing + +[^459]: Another thing + +[^460]: Another thing + +[^461]: Another thing + +[^462]: Another thing + +[^463]: Another thing + +[^464]: Another thing + +[^465]: Another thing + +[^466]: Another thing + +[^467]: Another thing + +[^468]: Another thing + +[^469]: Another thing + +[^470]: Another thing + +[^471]: Another thing + +[^472]: Another thing + +[^473]: Another thing + +[^474]: Another thing + +[^475]: Another thing + +[^476]: Another thing + +[^477]: Another thing + +[^478]: Another thing + +[^479]: Another thing + +[^480]: Another thing + +[^481]: Another thing + +[^482]: Another thing + +[^483]: Another thing + +[^484]: Another thing + +[^485]: Another thing + +[^486]: Another thing + +[^487]: Another thing + +[^488]: Another thing + +[^489]: Another thing + +[^490]: Another thing + +[^491]: Another thing + +[^492]: Another thing + +[^493]: Another thing + +[^494]: Another thing + +[^495]: Another thing + +[^496]: Another thing + +[^497]: Another thing + +[^498]: Another thing + +[^499]: Another thing + +[^500]: Another thing + +[^501]: Another thing + +[^502]: Another thing + +[^503]: Another thing + +[^504]: Another thing + +[^505]: Another thing + +[^506]: Another thing + +[^507]: Another thing + +[^508]: Another thing + +[^509]: Another thing + +[^510]: Another thing + +[^511]: Another thing + +[^512]: Another thing + +[^513]: Another thing + +[^514]: Another thing + +[^515]: Another thing + +[^516]: Another thing + +[^517]: Another thing + +[^518]: Another thing + +[^519]: Another thing + +[^520]: Another thing + +[^521]: Another thing + +[^522]: Another thing + +[^523]: Another thing + +[^524]: Another thing + +[^525]: Another thing + +[^526]: Another thing + +[^527]: Another thing + +[^528]: Another thing + +[^529]: Another thing + +[^530]: Another thing + +[^531]: Another thing + +[^532]: Another thing + +[^533]: Another thing + +[^534]: Another thing + +[^535]: Another thing + +[^536]: Another thing + +[^537]: Another thing + +[^538]: Another thing + +[^539]: Another thing + +[^540]: Another thing + +[^541]: Another thing + +[^542]: Another thing + +[^543]: Another thing + +[^544]: Another thing + +[^545]: Another thing + +[^546]: Another thing + +[^547]: Another thing + +[^548]: Another thing + +[^549]: Another thing + +[^550]: Another thing + +[^551]: Another thing + +[^552]: Another thing + +[^553]: Another thing + +[^554]: Another thing + +[^555]: Another thing + +[^556]: Another thing + +[^557]: Another thing + +[^558]: Another thing + +[^559]: Another thing + +[^560]: Another thing + +[^561]: Another thing + +[^562]: Another thing + +[^563]: Another thing + +[^564]: Another thing + +[^565]: Another thing + +[^566]: Another thing + +[^567]: Another thing + +[^568]: Another thing + +[^569]: Another thing + +[^570]: Another thing + +[^571]: Another thing + +[^572]: Another thing + +[^573]: Another thing + +[^574]: Another thing + +[^575]: Another thing + +[^576]: Another thing + +[^577]: Another thing + +[^578]: Another thing + +[^579]: Another thing + +[^580]: Another thing + +[^581]: Another thing + +[^582]: Another thing + +[^583]: Another thing + +[^584]: Another thing + +[^585]: Another thing + +[^586]: Another thing + +[^587]: Another thing + +[^588]: Another thing + +[^589]: Another thing + +[^590]: Another thing + +[^591]: Another thing + +[^592]: Another thing + +[^593]: Another thing + +[^594]: Another thing + +[^595]: Another thing + +[^596]: Another thing + +[^597]: Another thing + +[^598]: Another thing + +[^599]: Another thing + +[^600]: Another thing + +[^601]: Another thing + +[^602]: Another thing + +[^603]: Another thing + +[^604]: Another thing + +[^605]: Another thing + +[^606]: Another thing + +[^607]: Another thing + +[^608]: Another thing + +[^609]: Another thing + +[^610]: Another thing + +[^611]: Another thing + +[^612]: Another thing + +[^613]: Another thing + +[^614]: Another thing + +[^615]: Another thing + +[^616]: Another thing + +[^617]: Another thing + +[^618]: Another thing + +[^619]: Another thing + +[^620]: Another thing + +[^621]: Another thing + +[^622]: Another thing + +[^623]: Another thing + +[^624]: Another thing + +[^625]: Another thing + +[^626]: Another thing + +[^627]: Another thing + +[^628]: Another thing + +[^629]: Another thing + +[^630]: Another thing + +[^631]: Another thing + +[^632]: Another thing + +[^633]: Another thing + +[^634]: Another thing + +[^635]: Another thing + +[^636]: Another thing + +[^637]: Another thing + +[^638]: Another thing + +[^639]: Another thing + +[^640]: Another thing + +[^641]: Another thing + +[^642]: Another thing + +[^643]: Another thing + +[^644]: Another thing + +[^645]: Another thing + +[^646]: Another thing + +[^647]: Another thing + +[^648]: Another thing + +[^649]: Another thing + +[^650]: Another thing + +[^651]: Another thing + +[^652]: Another thing + +[^653]: Another thing + +[^654]: Another thing + +[^655]: Another thing + +[^656]: Another thing + +[^657]: Another thing + +[^658]: Another thing + +[^659]: Another thing + +[^660]: Another thing + +[^661]: Another thing + +[^662]: Another thing + +[^663]: Another thing + +[^664]: Another thing + +[^665]: Another thing + +[^666]: Another thing + +[^667]: Another thing + +[^668]: Another thing + +[^669]: Another thing + +[^670]: Another thing + +[^671]: Another thing + +[^672]: Another thing + +[^673]: Another thing + +[^674]: Another thing + +[^675]: Another thing + +[^676]: Another thing + +[^677]: Another thing + +[^678]: Another thing + +[^679]: Another thing + +[^680]: Another thing + +[^681]: Another thing + +[^682]: Another thing + +[^683]: Another thing + +[^684]: Another thing + +[^685]: Another thing + +[^686]: Another thing + +[^687]: Another thing + +[^688]: Another thing + +[^689]: Another thing + +[^690]: Another thing + +[^691]: Another thing + +[^692]: Another thing + +[^693]: Another thing + +[^694]: Another thing + +[^695]: Another thing + +[^696]: Another thing + +[^697]: Another thing + +[^698]: Another thing + +[^699]: Another thing + +[^700]: Another thing + +[^701]: Another thing + +[^702]: Another thing + +[^703]: Another thing + +[^704]: Another thing + +[^705]: Another thing + +[^706]: Another thing + +[^707]: Another thing + +[^708]: Another thing + +[^709]: Another thing + +[^710]: Another thing + +[^711]: Another thing + +[^712]: Another thing + +[^713]: Another thing + +[^714]: Another thing + +[^715]: Another thing + +[^716]: Another thing + +[^717]: Another thing + +[^718]: Another thing + +[^719]: Another thing + +[^720]: Another thing + +[^721]: Another thing + +[^722]: Another thing + +[^723]: Another thing + +[^724]: Another thing + +[^725]: Another thing + +[^726]: Another thing + +[^727]: Another thing + +[^728]: Another thing + +[^729]: Another thing + +[^730]: Another thing + +[^731]: Another thing + +[^732]: Another thing + +[^733]: Another thing + +[^734]: Another thing + +[^735]: Another thing + +[^736]: Another thing + +[^737]: Another thing + +[^738]: Another thing + +[^739]: Another thing + +[^740]: Another thing + +[^741]: Another thing + +[^742]: Another thing + +[^743]: Another thing + +[^744]: Another thing + +[^745]: Another thing + +[^746]: Another thing + +[^747]: Another thing + +[^748]: Another thing + +[^749]: Another thing + +[^750]: Another thing + +[^751]: Another thing + +[^752]: Another thing + +[^753]: Another thing + +[^754]: Another thing + +[^755]: Another thing + +[^756]: Another thing + +[^757]: Another thing + +[^758]: Another thing + +[^759]: Another thing + +[^760]: Another thing + +[^761]: Another thing + +[^762]: Another thing + +[^763]: Another thing + +[^764]: Another thing + +[^765]: Another thing + +[^766]: Another thing + +[^767]: Another thing + +[^768]: Another thing + +[^769]: Another thing + +[^770]: Another thing + +[^771]: Another thing + +[^772]: Another thing + +[^773]: Another thing + +[^774]: Another thing + +[^775]: Another thing + +[^776]: Another thing + +[^777]: Another thing + +[^778]: Another thing + +[^779]: Another thing + +[^780]: Another thing + +[^781]: Another thing + +[^782]: Another thing + +[^783]: Another thing + +[^784]: Another thing + +[^785]: Another thing + +[^786]: Another thing + +[^787]: Another thing + +[^788]: Another thing + +[^789]: Another thing + +[^790]: Another thing + +[^791]: Another thing + +[^792]: Another thing + +[^793]: Another thing + +[^794]: Another thing + +[^795]: Another thing + +[^796]: Another thing + +[^797]: Another thing + +[^798]: Another thing + +[^799]: Another thing + +[^800]: Another thing + +[^801]: Another thing + +[^802]: Another thing + +[^803]: Another thing + +[^804]: Another thing + +[^805]: Another thing + +[^806]: Another thing + +[^807]: Another thing + +[^808]: Another thing + +[^809]: Another thing + +[^810]: Another thing + +[^811]: Another thing + +[^812]: Another thing + +[^813]: Another thing + +[^814]: Another thing + +[^815]: Another thing + +[^816]: Another thing + +[^817]: Another thing + +[^818]: Another thing + +[^819]: Another thing + +[^820]: Another thing + +[^821]: Another thing + +[^822]: Another thing + +[^823]: Another thing + +[^824]: Another thing + +[^825]: Another thing + +[^826]: Another thing + +[^827]: Another thing + +[^828]: Another thing + +[^829]: Another thing + +[^830]: Another thing + +[^831]: Another thing + +[^832]: Another thing + +[^833]: Another thing + +[^834]: Another thing + +[^835]: Another thing + +[^836]: Another thing + +[^837]: Another thing + +[^838]: Another thing + +[^839]: Another thing + +[^840]: Another thing + +[^841]: Another thing + +[^842]: Another thing + +[^843]: Another thing + +[^844]: Another thing + +[^845]: Another thing + +[^846]: Another thing + +[^847]: Another thing + +[^848]: Another thing + +[^849]: Another thing + +[^850]: Another thing + +[^851]: Another thing + +[^852]: Another thing + +[^853]: Another thing + +[^854]: Another thing + +[^855]: Another thing + +[^856]: Another thing + +[^857]: Another thing + +[^858]: Another thing + +[^859]: Another thing + +[^860]: Another thing + +[^861]: Another thing + +[^862]: Another thing + +[^863]: Another thing + +[^864]: Another thing + +[^865]: Another thing + +[^866]: Another thing + +[^867]: Another thing + +[^868]: Another thing + +[^869]: Another thing + +[^870]: Another thing + +[^871]: Another thing + +[^872]: Another thing + +[^873]: Another thing + +[^874]: Another thing + +[^875]: Another thing + +[^876]: Another thing + +[^877]: Another thing + +[^878]: Another thing + +[^879]: Another thing + +[^880]: Another thing + +[^881]: Another thing + +[^882]: Another thing + +[^883]: Another thing + +[^884]: Another thing + +[^885]: Another thing + +[^886]: Another thing + +[^887]: Another thing + +[^888]: Another thing + +[^889]: Another thing + +[^890]: Another thing + +[^891]: Another thing + +[^892]: Another thing + +[^893]: Another thing + +[^894]: Another thing + +[^895]: Another thing + +[^896]: Another thing + +[^897]: Another thing + +[^898]: Another thing + +[^899]: Another thing + +[^900]: Another thing + +[^901]: Another thing + +[^902]: Another thing + +[^903]: Another thing + +[^904]: Another thing + +[^905]: Another thing + +[^906]: Another thing + +[^907]: Another thing + +[^908]: Another thing + +[^909]: Another thing + +[^910]: Another thing + +[^911]: Another thing + +[^912]: Another thing + +[^913]: Another thing + +[^914]: Another thing + +[^915]: Another thing + +[^916]: Another thing + +[^917]: Another thing + +[^918]: Another thing + +[^919]: Another thing + +[^920]: Another thing + +[^921]: Another thing + +[^922]: Another thing + +[^923]: Another thing + +[^924]: Another thing + +[^925]: Another thing + +[^926]: Another thing + +[^927]: Another thing + +[^928]: Another thing + +[^929]: Another thing + +[^930]: Another thing + +[^931]: Another thing + +[^932]: Another thing + +[^933]: Another thing + +[^934]: Another thing + +[^935]: Another thing + +[^936]: Another thing + +[^937]: Another thing + +[^938]: Another thing + +[^939]: Another thing + +[^940]: Another thing + +[^941]: Another thing + +[^942]: Another thing + +[^943]: Another thing + +[^944]: Another thing + +[^945]: Another thing + +[^946]: Another thing + +[^947]: Another thing + +[^948]: Another thing + +[^949]: Another thing + +[^950]: Another thing + +[^951]: Another thing + +[^952]: Another thing + +[^953]: Another thing + +[^954]: Another thing + +[^955]: Another thing + +[^956]: Another thing + +[^957]: Another thing + +[^958]: Another thing + +[^959]: Another thing + +[^960]: Another thing + +[^961]: Another thing + +[^962]: Another thing + +[^963]: Another thing + +[^964]: Another thing + +[^965]: Another thing + +[^966]: Another thing + +[^967]: Another thing + +[^968]: Another thing + +[^969]: Another thing + +[^970]: Another thing + +[^971]: Another thing + +[^972]: Another thing + +[^973]: Another thing + +[^974]: Another thing + +[^975]: Another thing + +[^976]: Another thing + +[^977]: Another thing + +[^978]: Another thing + +[^979]: Another thing + +[^980]: Another thing + +[^981]: Another thing + +[^982]: Another thing + +[^983]: Another thing + +[^984]: Another thing + +[^985]: Another thing + +[^986]: Another thing + +[^987]: Another thing + +[^988]: Another thing + +[^989]: Another thing + +[^990]: Another thing + +[^991]: Another thing + +[^992]: Another thing + +[^993]: Another thing + +[^994]: Another thing + +[^995]: Another thing + +[^996]: Another thing + +[^997]: Another thing + +[^998]: Another thing + +[^999]: Another thing + +[^1000]: Another thing + +[^1001]: Another thing + +[^1002]: Another thing + +[^1003]: Another thing + +[^1004]: Another thing + +[^1005]: Another thing + +[^1006]: Another thing + +[^1007]: Another thing + +[^1008]: Another thing + +[^1009]: Another thing + +[^1010]: Another thing + +[^1011]: Another thing + +[^1012]: Another thing + +[^1013]: Another thing + +[^1014]: Another thing + +[^1015]: Another thing + +[^1016]: Another thing + +[^1017]: Another thing + +[^1018]: Another thing + +[^1019]: Another thing + +[^1020]: Another thing + +[^1021]: Another thing + +[^1022]: Another thing + +[^1023]: Another thing + +[^1024]: Another thing + +[^1025]: Another thing + +[^1026]: Another thing + +[^1027]: Another thing + +[^1028]: Another thing + +[^1029]: Another thing + +[^1030]: Another thing + +[^1031]: Another thing + +[^1032]: Another thing + +[^1033]: Another thing + +[^1034]: Another thing + +[^1035]: Another thing + +[^1036]: Another thing + +[^1037]: Another thing + +[^1038]: Another thing + +[^1039]: Another thing + +[^1040]: Another thing + +[^1041]: Another thing + +[^1042]: Another thing + +[^1043]: Another thing + +[^1044]: Another thing + +[^1045]: Another thing + +[^1046]: Another thing + +[^1047]: Another thing + +[^1048]: Another thing + +[^1049]: Another thing + +[^1050]: Another thing + +[^1051]: Another thing + +[^1052]: Another thing + +[^1053]: Another thing + +[^1054]: Another thing + +[^1055]: Another thing + +[^1056]: Another thing + +[^1057]: Another thing + +[^1058]: Another thing + +[^1059]: Another thing + +[^1060]: Another thing + +[^1061]: Another thing + +[^1062]: Another thing + +[^1063]: Another thing + +[^1064]: Another thing + +[^1065]: Another thing + +[^1066]: Another thing + +[^1067]: Another thing + +[^1068]: Another thing + +[^1069]: Another thing + +[^1070]: Another thing + +[^1071]: Another thing + +[^1072]: Another thing + +[^1073]: Another thing + +[^1074]: Another thing + +[^1075]: Another thing + +[^1076]: Another thing + +[^1077]: Another thing + +[^1078]: Another thing + +[^1079]: Another thing + +[^1080]: Another thing + +[^1081]: Another thing + +[^1082]: Another thing + +[^1083]: Another thing + +[^1084]: Another thing + +[^1085]: Another thing + +[^1086]: Another thing + +[^1087]: Another thing + +[^1088]: Another thing + +[^1089]: Another thing + +[^1090]: Another thing + +[^1091]: Another thing + +[^1092]: Another thing + +[^1093]: Another thing + +[^1094]: Another thing + +[^1095]: Another thing + +[^1096]: Another thing + +[^1097]: Another thing + +[^1098]: Another thing + +[^1099]: Another thing + +[^1100]: Another thing + +[^1101]: Another thing + +[^1102]: Another thing + +[^1103]: Another thing + +[^1104]: Another thing + +[^1105]: Another thing + +[^1106]: Another thing + +[^1107]: Another thing + +[^1108]: Another thing + +[^1109]: Another thing + +[^1110]: Another thing + +[^1111]: Another thing + +[^1112]: Another thing + +[^1113]: Another thing + +[^1114]: Another thing + +[^1115]: Another thing + +[^1116]: Another thing + +[^1117]: Another thing + +[^1118]: Another thing + +[^1119]: Another thing + +[^1120]: Another thing + +[^1121]: Another thing + +[^1122]: Another thing + +[^1123]: Another thing + +[^1124]: Another thing + +[^1125]: Another thing + +[^1126]: Another thing + +[^1127]: Another thing + +[^1128]: Another thing + +[^1129]: Another thing + +[^1130]: Another thing + +[^1131]: Another thing + +[^1132]: Another thing + +[^1133]: Another thing + +[^1134]: Another thing + +[^1135]: Another thing + +[^1136]: Another thing + +[^1137]: Another thing + +[^1138]: Another thing + +[^1139]: Another thing + +[^1140]: Another thing + +[^1141]: Another thing + +[^1142]: Another thing + +[^1143]: Another thing + +[^1144]: Another thing + +[^1145]: Another thing + +[^1146]: Another thing + +[^1147]: Another thing + +[^1148]: Another thing + +[^1149]: Another thing + +[^1150]: Another thing + +[^1151]: Another thing + +[^1152]: Another thing + +[^1153]: Another thing + +[^1154]: Another thing + +[^1155]: Another thing + +[^1156]: Another thing + +[^1157]: Another thing + +[^1158]: Another thing + +[^1159]: Another thing + +[^1160]: Another thing + +[^1161]: Another thing + +[^1162]: Another thing + +[^1163]: Another thing + +[^1164]: Another thing + +[^1165]: Another thing + +[^1166]: Another thing + +[^1167]: Another thing + +[^1168]: Another thing + +[^1169]: Another thing + +[^1170]: Another thing + +[^1171]: Another thing + +[^1172]: Another thing + +[^1173]: Another thing + +[^1174]: Another thing + +[^1175]: Another thing + +[^1176]: Another thing + +[^1177]: Another thing + +[^1178]: Another thing + +[^1179]: Another thing + +[^1180]: Another thing + +[^1181]: Another thing + +[^1182]: Another thing + +[^1183]: Another thing + +[^1184]: Another thing + +[^1185]: Another thing + +[^1186]: Another thing + +[^1187]: Another thing + +[^1188]: Another thing + +[^1189]: Another thing + +[^1190]: Another thing + +[^1191]: Another thing + +[^1192]: Another thing + +[^1193]: Another thing + +[^1194]: Another thing + +[^1195]: Another thing + +[^1196]: Another thing + +[^1197]: Another thing + +[^1198]: Another thing + +[^1199]: Another thing + diff --git a/tests/extensions/extra/footnote_placeholder.html b/tests/extensions/extra/footnote_placeholder.html new file mode 100644 index 0000000..cbad740 --- /dev/null +++ b/tests/extensions/extra/footnote_placeholder.html @@ -0,0 +1,9 @@ +<div class="footnote"> +<hr /> +<ol> +<li id="fn:1"> +<p>A Footnote. <a class="footnote-backref" href="#fnref:1" title="Jump back to footnote 1 in the text">↩</a></p> +</li> +</ol> +</div> +<p>Some text with a footnote<sup id="fnref:1"><a class="footnote-ref" href="#fn:1">1</a></sup>.</p>
\ No newline at end of file diff --git a/tests/extensions/extra/footnote_placeholder.txt b/tests/extensions/extra/footnote_placeholder.txt new file mode 100644 index 0000000..0b0af42 --- /dev/null +++ b/tests/extensions/extra/footnote_placeholder.txt @@ -0,0 +1,5 @@ +///Footnotes Go Here/// + +Some text with a footnote[^1]. + +[^1]: A Footnote. diff --git a/tests/extensions/extra/footnote_placeholder_depth.html b/tests/extensions/extra/footnote_placeholder_depth.html new file mode 100644 index 0000000..60c2bbb --- /dev/null +++ b/tests/extensions/extra/footnote_placeholder_depth.html @@ -0,0 +1,13 @@ +<blockquote> +<blockquote> +<div class="footnote"> +<hr /> +<ol> +<li id="fn:1"> +<p>A Footnote. <a class="footnote-backref" href="#fnref:1" title="Jump back to footnote 1 in the text">↩</a></p> +</li> +</ol> +</div> +<p>Some text with a footnote<sup id="fnref:1"><a class="footnote-ref" href="#fn:1">1</a></sup>.</p> +</blockquote> +</blockquote>
\ No newline at end of file diff --git a/tests/extensions/extra/footnote_placeholder_depth.txt b/tests/extensions/extra/footnote_placeholder_depth.txt new file mode 100644 index 0000000..cfe87c0 --- /dev/null +++ b/tests/extensions/extra/footnote_placeholder_depth.txt @@ -0,0 +1,5 @@ +>> ///Footnotes Go Here/// +>> +>> Some text with a footnote[^1]. + +[^1]: A Footnote. diff --git a/tests/extensions-x-def_list/loose_def_list.html b/tests/extensions/extra/loose_def_list.html index 98fdec8..0de6eb6 100644 --- a/tests/extensions-x-def_list/loose_def_list.html +++ b/tests/extensions/extra/loose_def_list.html @@ -18,4 +18,14 @@ line 2 of def 2-1</p> <p>par 2 of def2-2</p> </dd> </dl> -<p>more text</p>
\ No newline at end of file +<p>more text</p> +<dl> +<dt>term 4</dt> +<dd>not loose</dd> +<dt>term 5</dt> +<dd> +<p>loose</p> +</dd> +<dt>term 6</dt> +<dd>also not loose</dd> +</dl>
\ No newline at end of file diff --git a/tests/extensions-x-def_list/loose_def_list.txt b/tests/extensions/extra/loose_def_list.txt index 24cd6a4..909d12b 100644 --- a/tests/extensions-x-def_list/loose_def_list.txt +++ b/tests/extensions/extra/loose_def_list.txt @@ -18,3 +18,14 @@ term 3 more text +term 4 +: not loose + + +term 5 + +: loose + +term 6 +: also not loose + diff --git a/tests/markdown-test/markdown-syntax.html b/tests/extensions/extra/markdown-syntax.html index 2f63b4b..cd7ba17 100644 --- a/tests/markdown-test/markdown-syntax.html +++ b/tests/extensions/extra/markdown-syntax.html @@ -151,7 +151,7 @@ and <code>&</code> in your example code needs to be escaped.)</p> <p>A paragraph is simply one or more consecutive lines of text, separated by one or more blank lines. (A blank line is any line that looks like a blank line -- a line containing nothing but spaces or tabs is considered -blank.) Normal paragraphs should not be intended with spaces or tabs.</p> +blank.) Normal paragraphs should not be indented with spaces or tabs.</p> <p>The implication of the "one or more consecutive lines of text" rule is that Markdown supports "hard-wrapped" text paragraphs. This differs significantly from most other text-to-HTML formatters (including Movable @@ -241,7 +241,7 @@ Quote Level from the Text menu.</p> <h3 id="list">Lists</h3> <p>Markdown supports ordered (numbered) and unordered (bulleted) lists.</p> -<p>Unordered lists use asterisks, pluses, and hyphens -- interchangably +<p>Unordered lists use asterisks, pluses, and hyphens -- interchangeably -- as list markers:</p> <pre><code>* Red * Green @@ -328,7 +328,7 @@ items in <code><p></code> tags in the HTML output. For example, this input </ul> </code></pre> <p>List items may consist of multiple paragraphs. Each subsequent -paragraph in a list item must be intended by either 4 spaces +paragraph in a list item must be indented by either 4 spaces or one tab:</p> <pre><code>1. This is a list item with two paragraphs. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aliquam hendrerit @@ -484,12 +484,12 @@ on a line by itself:</p> <p>That is:</p> <ul> <li>Square brackets containing the link identifier (optionally -indented from the left margin using up to three spaces);</li> + indented from the left margin using up to three spaces);</li> <li>followed by a colon;</li> <li>followed by one or more spaces (or tabs);</li> <li>followed by the URL for the link;</li> <li>optionally followed by a title attribute for the link, enclosed -in double or single quotes.</li> + in double or single quotes.</li> </ul> <p>The link URL may, optionally, be surrounded by angle brackets:</p> <pre><code>[id]: <http://example.com/> "Optional Title Here" @@ -660,10 +660,10 @@ for links, allowing for two styles: <em>inline</em> and <em>reference</em>.</p> <ul> <li>An exclamation mark: <code>!</code>;</li> <li>followed by a set of square brackets, containing the <code>alt</code> -attribute text for the image;</li> + attribute text for the image;</li> <li>followed by a set of parentheses, containing the URL or path to -the image, and an optional <code>title</code> attribute enclosed in double -or single quotes.</li> + the image, and an optional <code>title</code> attribute enclosed in double + or single quotes.</li> </ul> <p>Reference-style image syntax looks like this:</p> <pre><code>![Alt text][id] diff --git a/tests/extensions/extra/markdown-syntax.txt b/tests/extensions/extra/markdown-syntax.txt new file mode 100644 index 0000000..38f6e78 --- /dev/null +++ b/tests/extensions/extra/markdown-syntax.txt @@ -0,0 +1,888 @@ +Markdown: Syntax +================ + +<ul id="ProjectSubmenu"> + <li><a href="/projects/markdown/" title="Markdown Project Page">Main</a></li> + <li><a href="/projects/markdown/basics" title="Markdown Basics">Basics</a></li> + <li><a class="selected" title="Markdown Syntax Documentation">Syntax</a></li> + <li><a href="/projects/markdown/license" title="Pricing and License Information">License</a></li> + <li><a href="/projects/markdown/dingus" title="Online Markdown Web Form">Dingus</a></li> +</ul> + + +* [Overview](#overview) + * [Philosophy](#philosophy) + * [Inline HTML](#html) + * [Automatic Escaping for Special Characters](#autoescape) +* [Block Elements](#block) + * [Paragraphs and Line Breaks](#p) + * [Headers](#header) + * [Blockquotes](#blockquote) + * [Lists](#list) + * [Code Blocks](#precode) + * [Horizontal Rules](#hr) +* [Span Elements](#span) + * [Links](#link) + * [Emphasis](#em) + * [Code](#code) + * [Images](#img) +* [Miscellaneous](#misc) + * [Backslash Escapes](#backslash) + * [Automatic Links](#autolink) + + +**Note:** This document is itself written using Markdown; you +can [see the source for it by adding '.text' to the URL][src]. + + [src]: /projects/markdown/syntax.text + +* * * + +<h2 id="overview">Overview</h2> + +<h3 id="philosophy">Philosophy</h3> + +Markdown is intended to be as easy-to-read and easy-to-write as is feasible. + +Readability, however, is emphasized above all else. 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. While +Markdown's syntax has been influenced by several existing text-to-HTML +filters -- including [Setext] [1], [atx] [2], [Textile] [3], [reStructuredText] [4], +[Grutatext] [5], and [EtText] [6] -- the single biggest source of +inspiration for Markdown's syntax is the format of plain text email. + + [1]: http://docutils.sourceforge.net/mirror/setext.html + [2]: http://www.aaronsw.com/2002/atx/ + [3]: http://textism.com/tools/textile/ + [4]: http://docutils.sourceforge.net/rst.html + [5]: http://www.triptico.com/software/grutatxt.html + [6]: http://ettext.taint.org/doc/ + +To this end, Markdown's syntax is comprised entirely of punctuation +characters, which punctuation characters have been carefully chosen so +as to look like what they mean. E.g., asterisks around a word actually +look like \*emphasis\*. Markdown lists look like, well, lists. Even +blockquotes look like quoted passages of text, assuming you've ever +used email. + + + +<h3 id="html">Inline HTML</h3> + +Markdown's syntax is intended for one purpose: to be used as a +format for *writing* for the web. + +Markdown is not a replacement for HTML, or even close to it. Its +syntax is very small, corresponding only to a very small subset of +HTML tags. The idea is *not* to create a syntax that makes it easier +to insert HTML tags. In my opinion, HTML tags are already easy to +insert. The idea for Markdown is to make it easy to read, write, and +edit prose. HTML is a *publishing* format; Markdown is a *writing* +format. Thus, Markdown's formatting syntax only addresses issues that +can be conveyed in plain text. + +For any markup that is not covered by Markdown's syntax, you simply +use HTML itself. There's no need to preface it or delimit it to +indicate that you're switching from Markdown to HTML; you just use +the tags. + +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. Markdown is smart enough not +to add extra (unwanted) `<p>` tags around HTML block-level tags. + +For example, to add an HTML table to a Markdown article: + + This is a regular paragraph. + + <table> + <tr> + <td>Foo</td> + </tr> + </table> + + This is another regular paragraph. + +Note that Markdown formatting syntax is not processed within block-level +HTML tags. E.g., you can't use Markdown-style `*emphasis*` inside an +HTML block. + +Span-level HTML tags -- e.g. `<span>`, `<cite>`, or `<del>` -- can be +used anywhere in a Markdown paragraph, list item, or header. If you +want, you can even use HTML tags instead of Markdown formatting; e.g. if +you'd prefer to use HTML `<a>` or `<img>` tags instead of Markdown's +link or image syntax, go right ahead. + +Unlike block-level HTML tags, Markdown syntax *is* processed within +span-level tags. + + +<h3 id="autoescape">Automatic Escaping for Special Characters</h3> + +In HTML, there are two characters that demand special treatment: `<` +and `&`. Left angle brackets are used to start tags; ampersands are +used to denote HTML entities. If you want to use them as literal +characters, you must escape them as entities, e.g. `<`, and +`&`. + +Ampersands in particular are bedeviling for web writers. If you want to +write about 'AT&T', you need to write '`AT&T`'. You even need to +escape ampersands within URLs. Thus, if you want to link to: + + http://images.google.com/images?num=30&q=larry+bird + +you need to encode the URL as: + + http://images.google.com/images?num=30&q=larry+bird + +in your anchor tag `href` attribute. Needless to say, this is easy to +forget, and is probably the single most common source of HTML validation +errors in otherwise well-marked-up web sites. + +Markdown allows you to use these characters naturally, taking care of +all the necessary escaping for you. If you use an ampersand as part of +an HTML entity, it remains unchanged; otherwise it will be translated +into `&`. + +So, if you want to include a copyright symbol in your article, you can write: + + © + +and Markdown will leave it alone. But if you write: + + AT&T + +Markdown will translate it to: + + AT&T + +Similarly, because Markdown supports [inline HTML](#html), if you use +angle brackets as delimiters for HTML tags, Markdown will treat them as +such. But if you write: + + 4 < 5 + +Markdown will translate it to: + + 4 < 5 + +However, inside Markdown code spans and blocks, angle brackets and +ampersands are *always* encoded automatically. This makes it easy to use +Markdown to write about HTML code. (As opposed to raw HTML, which is a +terrible format for writing about HTML syntax, because every single `<` +and `&` in your example code needs to be escaped.) + + +* * * + + +<h2 id="block">Block Elements</h2> + + +<h3 id="p">Paragraphs and Line Breaks</h3> + +A paragraph is simply one or more consecutive lines of text, separated +by one or more blank lines. (A blank line is any line that looks like a +blank line -- a line containing nothing but spaces or tabs is considered +blank.) Normal paragraphs should not be indented with spaces or tabs. + +The implication of the "one or more consecutive lines of text" rule is +that Markdown supports "hard-wrapped" text paragraphs. This differs +significantly from most other text-to-HTML formatters (including Movable +Type's "Convert Line Breaks" option) which translate every line break +character in a paragraph into a `<br />` tag. + +When you *do* want to insert a `<br />` break tag using Markdown, you +end a line with two or more spaces, then type return. + +Yes, this takes a tad more effort to create a `<br />`, but a simplistic +"every line break is a `<br />`" rule wouldn't work for Markdown. +Markdown's email-style [blockquoting][bq] and multi-paragraph [list items][l] +work best -- and look better -- when you format them with hard breaks. + + [bq]: #blockquote + [l]: #list + + + +<h3 id="header">Headers</h3> + +Markdown supports two styles of headers, [Setext] [1] and [atx] [2]. + +Setext-style headers are "underlined" using equal signs (for first-level +headers) and dashes (for second-level headers). For example: + + This is an H1 + ============= + + This is an H2 + ------------- + +Any number of underlining `=`'s or `-`'s will work. + +Atx-style headers use 1-6 hash characters at the start of the line, +corresponding to header levels 1-6. For example: + + # This is an H1 + + ## This is an H2 + + ###### This is an H6 + +Optionally, you may "close" atx-style headers. This is purely +cosmetic -- you can use this if you think it looks better. The +closing hashes don't even need to match the number of hashes +used to open the header. (The number of opening hashes +determines the header level.) : + + # This is an H1 # + + ## This is an H2 ## + + ### This is an H3 ###### + + +<h3 id="blockquote">Blockquotes</h3> + +Markdown uses email-style `>` characters for blockquoting. If you're +familiar with quoting passages of text in an email message, then you +know how to create a blockquote in Markdown. It looks best if you hard +wrap the text and put a `>` before every line: + + > This is a blockquote with two paragraphs. Lorem ipsum dolor sit amet, + > consectetuer adipiscing elit. Aliquam hendrerit mi posuere lectus. + > Vestibulum enim wisi, viverra nec, fringilla in, laoreet vitae, risus. + > + > Donec sit amet nisl. Aliquam semper ipsum sit amet velit. Suspendisse + > id sem consectetuer libero luctus adipiscing. + +Markdown allows you to be lazy and only put the `>` before the first +line of a hard-wrapped paragraph: + + > This is a blockquote with two paragraphs. Lorem ipsum dolor sit amet, + consectetuer adipiscing elit. Aliquam hendrerit mi posuere lectus. + Vestibulum enim wisi, viverra nec, fringilla in, laoreet vitae, risus. + + > Donec sit amet nisl. Aliquam semper ipsum sit amet velit. Suspendisse + id sem consectetuer libero luctus adipiscing. + +Blockquotes can be nested (i.e. a blockquote-in-a-blockquote) by +adding additional levels of `>`: + + > This is the first level of quoting. + > + > > This is nested blockquote. + > + > Back to the first level. + +Blockquotes can contain other Markdown elements, including headers, lists, +and code blocks: + + > ## This is a header. + > + > 1. This is the first list item. + > 2. This is the second list item. + > + > Here's some example code: + > + > return shell_exec("echo $input | $markdown_script"); + +Any decent text editor should make email-style quoting easy. For +example, with BBEdit, you can make a selection and choose Increase +Quote Level from the Text menu. + + +<h3 id="list">Lists</h3> + +Markdown supports ordered (numbered) and unordered (bulleted) lists. + +Unordered lists use asterisks, pluses, and hyphens -- interchangeably +-- as list markers: + + * Red + * Green + * Blue + +is equivalent to: + + + Red + + Green + + Blue + +and: + + - Red + - Green + - Blue + +Ordered lists use numbers followed by periods: + + 1. Bird + 2. McHale + 3. Parish + +It's important to note that the actual numbers you use to mark the +list have no effect on the HTML output Markdown produces. The HTML +Markdown produces from the above list is: + + <ol> + <li>Bird</li> + <li>McHale</li> + <li>Parish</li> + </ol> + +If you instead wrote the list in Markdown like this: + + 1. Bird + 1. McHale + 1. Parish + +or even: + + 3. Bird + 1. McHale + 8. Parish + +you'd get the exact same HTML output. The point is, if you want to, +you can use ordinal numbers in your ordered Markdown lists, so that +the numbers in your source match the numbers in your published HTML. +But if you want to be lazy, you don't have to. + +If you do use lazy list numbering, however, you should still start the +list with the number 1. At some point in the future, Markdown may support +starting ordered lists at an arbitrary number. + +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. + +To make lists look nice, you can wrap items with hanging indents: + + * Lorem ipsum dolor sit amet, consectetuer adipiscing elit. + Aliquam hendrerit mi posuere lectus. Vestibulum enim wisi, + viverra nec, fringilla in, laoreet vitae, risus. + * Donec sit amet nisl. Aliquam semper ipsum sit amet velit. + Suspendisse id sem consectetuer libero luctus adipiscing. + +But if you want to be lazy, you don't have to: + + * Lorem ipsum dolor sit amet, consectetuer adipiscing elit. + Aliquam hendrerit mi posuere lectus. Vestibulum enim wisi, + viverra nec, fringilla in, laoreet vitae, risus. + * Donec sit amet nisl. Aliquam semper ipsum sit amet velit. + Suspendisse id sem consectetuer libero luctus adipiscing. + +If list items are separated by blank lines, Markdown will wrap the +items in `<p>` tags in the HTML output. For example, this input: + + * Bird + * Magic + +will turn into: + + <ul> + <li>Bird</li> + <li>Magic</li> + </ul> + +But this: + + * Bird + + * Magic + +will turn into: + + <ul> + <li><p>Bird</p></li> + <li><p>Magic</p></li> + </ul> + +List items may consist of multiple paragraphs. Each subsequent +paragraph in a list item must be indented by either 4 spaces +or one tab: + + 1. This is a list item with two paragraphs. Lorem ipsum dolor + sit amet, consectetuer adipiscing elit. Aliquam hendrerit + mi posuere lectus. + + Vestibulum enim wisi, viverra nec, fringilla in, laoreet + vitae, risus. Donec sit amet nisl. Aliquam semper ipsum + sit amet velit. + + 2. Suspendisse id sem consectetuer libero luctus adipiscing. + +It looks nice if you indent every line of the subsequent +paragraphs, but here again, Markdown will allow you to be +lazy: + + * This is a list item with two paragraphs. + + This is the second paragraph in the list item. You're + only required to indent the first line. Lorem ipsum dolor + sit amet, consectetuer adipiscing elit. + + * Another item in the same list. + +To put a blockquote within a list item, the blockquote's `>` +delimiters need to be indented: + + * A list item with a blockquote: + + > This is a blockquote + > inside a list item. + +To put a code block within a list item, the code block needs +to be indented *twice* -- 8 spaces or two tabs: + + * A list item with a code block: + + <code goes here> + + +It's worth noting that it's possible to trigger an ordered list by +accident, by writing something like this: + + 1986. What a great season. + +In other words, a *number-period-space* sequence at the beginning of a +line. To avoid this, you can backslash-escape the period: + + 1986\. What a great season. + + + +<h3 id="precode">Code Blocks</h3> + +Pre-formatted code blocks are used for writing about programming or +markup source code. Rather than forming normal paragraphs, the lines +of a code block are interpreted literally. Markdown wraps a code block +in both `<pre>` and `<code>` tags. + +To produce a code block in Markdown, simply indent every line of the +block by at least 4 spaces or 1 tab. For example, given this input: + + This is a normal paragraph: + + This is a code block. + +Markdown will generate: + + <p>This is a normal paragraph:</p> + + <pre><code>This is a code block. + </code></pre> + +One level of indentation -- 4 spaces or 1 tab -- is removed from each +line of the code block. For example, this: + + Here is an example of AppleScript: + + tell application "Foo" + beep + end tell + +will turn into: + + <p>Here is an example of AppleScript:</p> + + <pre><code>tell application "Foo" + beep + end tell + </code></pre> + +A code block continues until it reaches a line that is not indented +(or the end of the article). + +Within a code block, ampersands (`&`) and angle brackets (`<` and `>`) +are automatically converted into HTML entities. This makes it very +easy to include example HTML source code using Markdown -- just paste +it and indent it, and Markdown will handle the hassle of encoding the +ampersands and angle brackets. For example, this: + + <div class="footer"> + © 2004 Foo Corporation + </div> + +will turn into: + + <pre><code><div class="footer"> + &copy; 2004 Foo Corporation + </div> + </code></pre> + +Regular Markdown syntax is not processed within code blocks. E.g., +asterisks are just literal asterisks within a code block. This means +it's also easy to use Markdown to write about Markdown's own syntax. + + + +<h3 id="hr">Horizontal Rules</h3> + +You can produce a horizontal rule tag (`<hr />`) by placing three or +more hyphens, asterisks, or underscores on a line by themselves. If you +wish, you may use spaces between the hyphens or asterisks. Each of the +following lines will produce a horizontal rule: + + * * * + + *** + + ***** + + - - - + + --------------------------------------- + + _ _ _ + + +* * * + +<h2 id="span">Span Elements</h2> + +<h3 id="link">Links</h3> + +Markdown supports two style of links: *inline* and *reference*. + +In both styles, the link text is delimited by [square brackets]. + +To create an inline link, use a set of regular parentheses immediately +after the link text's closing square bracket. Inside the parentheses, +put the URL where you want the link to point, along with an *optional* +title for the link, surrounded in quotes. For example: + + This is [an example](http://example.com/ "Title") inline link. + + [This link](http://example.net/) has no title attribute. + +Will produce: + + <p>This is <a href="http://example.com/" title="Title"> + an example</a> inline link.</p> + + <p><a href="http://example.net/">This link</a> has no + title attribute.</p> + +If you're referring to a local resource on the same server, you can +use relative paths: + + See my [About](/about/) page for details. + +Reference-style links use a second set of square brackets, inside +which you place a label of your choosing to identify the link: + + This is [an example][id] reference-style link. + +You can optionally use a space to separate the sets of brackets: + + This is [an example] [id] reference-style link. + +Then, anywhere in the document, you define your link label like this, +on a line by itself: + + [id]: http://example.com/ "Optional Title Here" + +That is: + +* Square brackets containing the link identifier (optionally + indented from the left margin using up to three spaces); +* followed by a colon; +* followed by one or more spaces (or tabs); +* followed by the URL for the link; +* optionally followed by a title attribute for the link, enclosed + in double or single quotes. + +The link URL may, optionally, be surrounded by angle brackets: + + [id]: <http://example.com/> "Optional Title Here" + +You can put the title attribute on the next line and use extra spaces +or tabs for padding, which tends to look better with longer URLs: + + [id]: http://example.com/longish/path/to/resource/here + "Optional Title Here" + +Link definitions are only used for creating links during Markdown +processing, and are stripped from your document in the HTML output. + +Link definition names may constist of letters, numbers, spaces, and punctuation -- but they are *not* case sensitive. E.g. these two links: + + [link text][a] + [link text][A] + +are equivalent. + +The *implicit link name* shortcut allows you to omit the name of the +link, in which case the link text itself is used as the name. +Just use an empty set of square brackets -- e.g., to link the word +"Google" to the google.com web site, you could simply write: + + [Google][] + +And then define the link: + + [Google]: http://google.com/ + +Because link names may contain spaces, this shortcut even works for +multiple words in the link text: + + Visit [Daring Fireball][] for more information. + +And then define the link: + + [Daring Fireball]: http://daringfireball.net/ + +Link definitions can be placed anywhere in your Markdown document. I +tend to put them immediately after each paragraph in which they're +used, but if you want, you can put them all at the end of your +document, sort of like footnotes. + +Here's an example of reference links in action: + + I get 10 times more traffic from [Google] [1] than from + [Yahoo] [2] or [MSN] [3]. + + [1]: http://google.com/ "Google" + [2]: http://search.yahoo.com/ "Yahoo Search" + [3]: http://search.msn.com/ "MSN Search" + +Using the implicit link name shortcut, you could instead write: + + I get 10 times more traffic from [Google][] than from + [Yahoo][] or [MSN][]. + + [google]: http://google.com/ "Google" + [yahoo]: http://search.yahoo.com/ "Yahoo Search" + [msn]: http://search.msn.com/ "MSN Search" + +Both of the above examples will produce the following HTML output: + + <p>I get 10 times more traffic from <a href="http://google.com/" + title="Google">Google</a> than from + <a href="http://search.yahoo.com/" title="Yahoo Search">Yahoo</a> + or <a href="http://search.msn.com/" title="MSN Search">MSN</a>.</p> + +For comparison, here is the same paragraph written using +Markdown's inline link style: + + I get 10 times more traffic from [Google](http://google.com/ "Google") + than from [Yahoo](http://search.yahoo.com/ "Yahoo Search") or + [MSN](http://search.msn.com/ "MSN Search"). + +The point of reference-style links is not that they're easier to +write. The point is that with reference-style links, your document +source is vastly more readable. Compare the above examples: using +reference-style links, the paragraph itself is only 81 characters +long; with inline-style links, it's 176 characters; and as raw HTML, +it's 234 characters. In the raw HTML, there's more markup than there +is text. + +With Markdown's reference-style links, a source document much more +closely resembles the final output, as rendered in a browser. By +allowing you to move the markup-related metadata out of the paragraph, +you can add links without interrupting the narrative flow of your +prose. + + +<h3 id="em">Emphasis</h3> + +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. E.g., this input: + + *single asterisks* + + _single underscores_ + + **double asterisks** + + __double underscores__ + +will produce: + + <em>single asterisks</em> + + <em>single underscores</em> + + <strong>double asterisks</strong> + + <strong>double underscores</strong> + +You can use whichever style you prefer; the lone restriction is that +the same character must be used to open and close an emphasis span. + +Emphasis can be used in the middle of a word: + + un*fucking*believable + +But if you surround an `*` or `_` with spaces, it'll be treated as a +literal asterisk or underscore. + +To produce a literal asterisk or underscore at a position where it +would otherwise be used as an emphasis delimiter, you can backslash +escape it: + + \*this text is surrounded by literal asterisks\* + + + +<h3 id="code">Code</h3> + +To indicate a span of code, wrap it with backtick quotes (`` ` ``). +Unlike a pre-formatted code block, a code span indicates code within a +normal paragraph. For example: + + Use the `printf()` function. + +will produce: + + <p>Use the <code>printf()</code> function.</p> + +To include a literal backtick character within a code span, you can use +multiple backticks as the opening and closing delimiters: + + ``There is a literal backtick (`) here.`` + +which will produce this: + + <p><code>There is a literal backtick (`) here.</code></p> + +The backtick delimiters surrounding a code span may include spaces -- +one after the opening, one before the closing. This allows you to place +literal backtick characters at the beginning or end of a code span: + + A single backtick in a code span: `` ` `` + + A backtick-delimited string in a code span: `` `foo` `` + +will produce: + + <p>A single backtick in a code span: <code>`</code></p> + + <p>A backtick-delimited string in a code span: <code>`foo`</code></p> + +With a code span, ampersands and angle brackets are encoded as HTML +entities automatically, which makes it easy to include example HTML +tags. Markdown will turn this: + + Please don't use any `<blink>` tags. + +into: + + <p>Please don't use any <code><blink></code> tags.</p> + +You can write this: + + `—` is the decimal-encoded equivalent of `—`. + +to produce: + + <p><code>&#8212;</code> is the decimal-encoded + equivalent of <code>&mdash;</code>.</p> + + + +<h3 id="img">Images</h3> + +Admittedly, it's fairly difficult to devise a "natural" syntax for +placing images into a plain text document format. + +Markdown uses an image syntax that is intended to resemble the syntax +for links, allowing for two styles: *inline* and *reference*. + +Inline image syntax looks like this: + + ![Alt text](/path/to/img.jpg) + + ![Alt text](/path/to/img.jpg "Optional title") + +That is: + +* An exclamation mark: `!`; +* followed by a set of square brackets, containing the `alt` + attribute text for the image; +* followed by a set of parentheses, containing the URL or path to + the image, and an optional `title` attribute enclosed in double + or single quotes. + +Reference-style image syntax looks like this: + + ![Alt text][id] + +Where "id" is the name of a defined image reference. Image references +are defined using syntax identical to link references: + + [id]: url/to/image "Optional title attribute" + +As of this writing, Markdown has no syntax for specifying the +dimensions of an image; if this is important to you, you can simply +use regular HTML `<img>` tags. + + +* * * + + +<h2 id="misc">Miscellaneous</h2> + +<h3 id="autolink">Automatic Links</h3> + +Markdown supports a shortcut style for creating "automatic" links for URLs and email addresses: simply surround the URL or email address with angle brackets. What this means is that if you want to show the actual text of a URL or email address, and also have it be a clickable link, you can do this: + + <http://example.com/> + +Markdown will turn this into: + + <a href="http://example.com/">http://example.com/</a> + +Automatic links for email addresses work similarly, except that +Markdown will also perform a bit of randomized decimal and hex +entity-encoding to help obscure your address from address-harvesting +spambots. For example, Markdown will turn this: + + <address@example.com> + +into something like this: + + <a href="mailto:addre + ss@example.co + m">address@exa + mple.com</a> + +which will render in a browser as a clickable link to "address@example.com". + +(This sort of entity-encoding trick will indeed fool many, if not +most, address-harvesting bots, but it definitely won't fool all of +them. It's better than nothing, but an address published in this way +will probably eventually start receiving spam.) + + + +<h3 id="backslash">Backslash Escapes</h3> + +Markdown allows you to use backslash escapes to generate literal +characters which would otherwise have special meaning in Markdown's +formatting syntax. For example, if you wanted to surround a word with +literal asterisks (instead of an HTML `<em>` tag), you can backslashes +before the asterisks, like this: + + \*literal asterisks\* + +Markdown provides backslash escapes for the following characters: + + \ backslash + ` backtick + * asterisk + _ underscore + {} curly braces + [] square brackets + () parentheses + # hash mark + + plus sign + - minus sign (hyphen) + . dot + ! exclamation mark + diff --git a/tests/extensions/extra/named_markers.html b/tests/extensions/extra/named_markers.html new file mode 100644 index 0000000..fd40245 --- /dev/null +++ b/tests/extensions/extra/named_markers.html @@ -0,0 +1,20 @@ +<p>This is the body with footnotes<sup id="fnref:foo"><a class="footnote-ref" href="#fn:foo">1</a></sup> +that have named<sup id="fnref:bar"><a class="footnote-ref" href="#fn:bar">2</a></sup> markers and +oddly<sup id="fnref:56"><a class="footnote-ref" href="#fn:56">3</a></sup> numbered<sup id="fnref:99"><a class="footnote-ref" href="#fn:99">4</a></sup> markers.</p> +<div class="footnote"> +<hr /> +<ol> +<li id="fn:foo"> +<p>Footnote marked <code>foo</code>. <a class="footnote-backref" href="#fnref:foo" title="Jump back to footnote 1 in the text">↩</a></p> +</li> +<li id="fn:bar"> +<p>This one is marked <em>bar</em>. <a class="footnote-backref" href="#fnref:bar" title="Jump back to footnote 2 in the text">↩</a></p> +</li> +<li id="fn:56"> +<p>A <strong>numbered</strong> footnote. <a class="footnote-backref" href="#fnref:56" title="Jump back to footnote 3 in the text">↩</a></p> +</li> +<li id="fn:99"> +<p>The last one. <a class="footnote-backref" href="#fnref:99" title="Jump back to footnote 4 in the text">↩</a></p> +</li> +</ol> +</div>
\ No newline at end of file diff --git a/tests/extensions-x-footnotes/named_markers.txt b/tests/extensions/extra/named_markers.txt index d246524..d246524 100644 --- a/tests/extensions-x-footnotes/named_markers.txt +++ b/tests/extensions/extra/named_markers.txt diff --git a/tests/extensions/extra/raw-html.html b/tests/extensions/extra/raw-html.html new file mode 100644 index 0000000..ef94cb3 --- /dev/null +++ b/tests/extensions/extra/raw-html.html @@ -0,0 +1,123 @@ +<div> +<p><em>foo</em></p> +</div> +<div class="baz"> +<p><em>bar</em></p> +</div> +<div> +<p><em>blah</em></p> +</div> +<div name="Example"> +<p>The text of the <code>Example</code> element.</p> +<div name="DefaultBlockMode"> +<p>This text gets wrapped in <code>p</code> tags.</p> +</div> +<p>The tail of the <code>DefaultBlockMode</code> subelement.</p> +<p name="DefaultSpanMode"> +This text <em>is not</em> wrapped in additional <code>p</code> tags. +</p> +<p>The tail of the <code>DefaultSpanMode</code> subelement.</p> +<div name="SpanModeOverride"> +This <code>div</code> block is not wrapped in paragraph tags. +Note: Subelements are not required to have tail text. +</div> +<p name="BlockModeOverride"> +<p>This <code>p</code> block <em>is</em> foolishly wrapped in further paragraph tags.</p> +</p> +<p>The tail of the <code>BlockModeOverride</code> subelement.</p> +<div name="RawHtml"> +Raw html blocks may also be nested. +</div> +</div> +<p>This text is after the markdown in html.</p> +<div name="issue308"> +<p><span>1</span> +<span>2</span></p> +</div> +<div name="issue368"> +<p>Markdown is <em>active</em> here.</p> +<div name="RawHtml"> +Raw html blocks may also be nested. +</div> +<p>Markdown is <em>still</em> active here.</p> +</div> +<p>Markdown is <em>active again</em> here.</p> +<div> +<p>foo bar</p> +<p><em>bar</em></p> +</div> +<div name="issue584"> +<div> +<p><a href="http://example.com">link</a></p> +</div> +</div> +<div name="issue584"> +<div> +<p><abbr title="Abbreviation">abbr</abbr></p> +</div> +</div> +<div name="issue584"> +<div> +<p>footnote<sup id="fnref:1"><a class="footnote-ref" href="#fn:1">1</a></sup></p> +</div> +</div> +<div name="issue584"> +<div> +<p><a href="http://example.com">link</a></p> +</div> +</div> +<div name="issue584"> +<div> +<p><abbr title="Abbreviation">abbr</abbr></p> +</div> +</div> +<div name="issue584"> +<div> +<p>footnote<sup id="fnref:2"><a class="footnote-ref" href="#fn:2">2</a></sup></p> +</div> +</div> +<div class="footnote"> +<hr /> +<ol> +<li id="fn:1"> +<ol> +<li> +<p>The top couple half figure, contrary sides and hands across with bottom couple,</p> +<p>Half figure back on your own sides, and turn partner to places,</p> +<p>Swing partners with right hands into straight line long-ways, as in a reel, and</p> +<p>Set,</p> +<p>Hey and return to places,</p> +<p>The other three couples do the same.</p> +</li> +<li> +<p>Top and bottom couples meet and set,</p> +<p>Then each gentleman leas the opposite lady to the couple on his left, and set,</p> +<p>Aach four right and left,</p> +<p>Swing side couples to places, and turn partners all eight,</p> +<p>The other two couple o the same.</p> +</li> +</ol> +<p><a class="footnote-backref" href="#fnref:1" title="Jump back to footnote 1 in the text">↩</a></p> +</li> +<li id="fn:2"> +<ol> +<li> +<p>The top couple half figure, contrary sides and hands across with bottom couple,</p> +<p>Half figure back on your own sides, and turn partner to places,</p> +<p>Swing partners with right hands into straight line long-ways, as in a reel, and</p> +<p>Set,</p> +<p>Hey and return to places,</p> +<p>The other three couples do the same.</p> +</li> +<li> +<p>Top and bottom couples meet and set,</p> +<p>Then each gentleman leas the opposite lady to the couple on his left, and set,</p> +<p>Aach four right and left,</p> +<p>Swing side couples to places, and turn partners all eight,</p> +<p>The other two couple o the same.</p> +</li> +</ol> +<p><a class="footnote-backref" href="#fnref:2" title="Jump back to footnote 2 in the text">↩</a></p> +</li> +</ol> +</div>
\ No newline at end of file diff --git a/tests/extensions/extra/raw-html.txt b/tests/extensions/extra/raw-html.txt new file mode 100644 index 0000000..c82ddbb --- /dev/null +++ b/tests/extensions/extra/raw-html.txt @@ -0,0 +1,184 @@ +<div markdown="1">_foo_</div> + +<div markdown=1 class="baz"> +_bar_ +</div> + +<div markdown> + +_blah_ + +</div> + +<div markdown="1" name="Example"> + +The text of the `Example` element. + +<div markdown="1" name="DefaultBlockMode"> +This text gets wrapped in `p` tags. +</div> + +The tail of the `DefaultBlockMode` subelement. + +<p markdown="1" name="DefaultSpanMode"> +This text *is not* wrapped in additional `p` tags. +</p> + +The tail of the `DefaultSpanMode` subelement. + +<div markdown="span" name="SpanModeOverride"> +This `div` block is not wrapped in paragraph tags. +Note: Subelements are not required to have tail text. +</div> + +<p markdown="block" name="BlockModeOverride"> +This `p` block *is* foolishly wrapped in further paragraph tags. +</p> + +The tail of the `BlockModeOverride` subelement. + +<div name="RawHtml"> +Raw html blocks may also be nested. +</div> + +</div> + +This text is after the markdown in html. + +<div markdown="1" name="issue308"> + +<span>1</span> +<span>2</span> + +</div> + +<div markdown="1" name="issue368"> + +Markdown is *active* here. + +<div name="RawHtml"> +Raw html blocks may also be nested. +</div> + +Markdown is *still* active here. + +</div> + +Markdown is *active again* here. + +<div markdown=1> +foo bar + +<em>bar</em> +</div> + +<div markdown="1" name="issue584"> + +[link]: http://example.com + +<div markdown="1"> +[link][link] +</div> + +</div> + +<div markdown="1" name="issue584"> + +*[abbr]: Abbreviation + +<div markdown="1"> +abbr +</div> + +</div> + +<div markdown="1" name="issue584"> + +[^1]: + 1. The top couple half figure, contrary sides and hands across with bottom couple, + + Half figure back on your own sides, and turn partner to places, + + Swing partners with right hands into straight line long-ways, as in a reel, and + + Set, + + Hey and return to places, + + The other three couples do the same. + + 2. Top and bottom couples meet and set, + + Then each gentleman leas the opposite lady to the couple on his left, and set, + + Aach four right and left, + + Swing side couples to places, and turn partners all eight, + + The other two couple o the same. + +<div markdown="1"> +footnote[^1] +</div> + +</div> + +<div markdown="1" name="issue584"> + +[link]: http://example.com + + + + +<div markdown="1"> +[link][link] +</div> + +</div> + +<div markdown="1" name="issue584"> + +*[abbr]: Abbreviation + + + + +<div markdown="1"> +abbr +</div> + +</div> + +<div markdown="1" name="issue584"> + +[^2]: + 1. The top couple half figure, contrary sides and hands across with bottom couple, + + Half figure back on your own sides, and turn partner to places, + + Swing partners with right hands into straight line long-ways, as in a reel, and + + Set, + + Hey and return to places, + + The other three couples do the same. + + 2. Top and bottom couples meet and set, + + Then each gentleman leas the opposite lady to the couple on his left, and set, + + Aach four right and left, + + Swing side couples to places, and turn partners all eight, + + The other two couple o the same. + + + + +<div markdown="1"> +footnote[^2] +</div> + +</div> diff --git a/tests/extensions-x-def_list/simple_def-lists.html b/tests/extensions/extra/simple_def-lists.html index 278e1ec..9448773 100644 --- a/tests/extensions-x-def_list/simple_def-lists.html +++ b/tests/extensions/extra/simple_def-lists.html @@ -34,4 +34,10 @@ line <strong>2</strong> of def 3</p> </ul> </dd> </dl> +<p>and more text.</p> +<dl> +<dt>term 4</dt> +<dd>def4 + line 2 of def 4</dd> +</dl> <p>final text.</p>
\ No newline at end of file diff --git a/tests/extensions-x-def_list/simple_def-lists.txt b/tests/extensions/extra/simple_def-lists.txt index 20c028a..20e9afa 100644 --- a/tests/extensions-x-def_list/simple_def-lists.txt +++ b/tests/extensions/extra/simple_def-lists.txt @@ -26,4 +26,10 @@ term *3* * > blockquote in list +and more text. + +term 4 +: def4 + line 2 of def 4 + final text. diff --git a/tests/extensions/github_flavored.html b/tests/extensions/github_flavored.html new file mode 100644 index 0000000..98dc82a --- /dev/null +++ b/tests/extensions/github_flavored.html @@ -0,0 +1,40 @@ +<p>index 0000000..6e956a9</p> +<pre><code class="language-diff">--- /dev/null ++++ b/test/data/stripped_text/mike-30-lili +@@ -0,0 +1,27 @@ ++Summary: ++ drift_mod.py | 1 + ++ 1 files changed, 1 insertions(+), 0 deletions(-) ++ ++commit da4bfb04debdd994683740878d09988b2641513d ++Author: Mike Dirolf <mike@dirolf.com> ++Date: Tue Jan 17 13:42:28 2012 -0500 ++ ++``` ++minor: just wanted to push something. ++``` ++ ++diff --git a/drift_mod.py b/drift_mod.py ++index 34dfba6..8a88a69 100644 ++ ++``` ++--- a/drift_mod.py +++++ b/drift_mod.py ++@@ -281,6 +281,7 @@ CONTEXT_DIFF_LINE_PATTERN = re.compile(r'^(' ++ '|\+ .*' ++ '|- .*' ++ ')$') +++ ++ def wrap_context_diffs(message_text): ++ return _wrap_diff(CONTEXT_DIFF_HEADER_PATTERN, ++ CONTEXT_DIFF_LINE_PATTERN, ++``` +</code></pre> +<p>Test support for foo+bar lexer names.</p> +<pre><code class="language-html+jinja"><title>{% block title %}{% endblock %}</title> +<ul> +{% for user in users %} + <li><a href="{{ user.url }}">{{ user.username }}</a></li> +{% endfor %} +</ul> +</code></pre>
\ No newline at end of file diff --git a/tests/extensions/github_flavored.txt b/tests/extensions/github_flavored.txt new file mode 100644 index 0000000..4f362b7 --- /dev/null +++ b/tests/extensions/github_flavored.txt @@ -0,0 +1,45 @@ +index 0000000..6e956a9 + +```diff +--- /dev/null ++++ b/test/data/stripped_text/mike-30-lili +@@ -0,0 +1,27 @@ ++Summary: ++ drift_mod.py | 1 + ++ 1 files changed, 1 insertions(+), 0 deletions(-) ++ ++commit da4bfb04debdd994683740878d09988b2641513d ++Author: Mike Dirolf <mike@dirolf.com> ++Date: Tue Jan 17 13:42:28 2012 -0500 ++ ++``` ++minor: just wanted to push something. ++``` ++ ++diff --git a/drift_mod.py b/drift_mod.py ++index 34dfba6..8a88a69 100644 ++ ++``` ++--- a/drift_mod.py +++++ b/drift_mod.py ++@@ -281,6 +281,7 @@ CONTEXT_DIFF_LINE_PATTERN = re.compile(r'^(' ++ '|\+ .*' ++ '|- .*' ++ ')$') +++ ++ def wrap_context_diffs(message_text): ++ return _wrap_diff(CONTEXT_DIFF_HEADER_PATTERN, ++ CONTEXT_DIFF_LINE_PATTERN, ++``` +``` + +Test support for foo+bar lexer names. + +```html+jinja +<title>{% block title %}{% endblock %}</title> +<ul> +{% for user in users %} + <li><a href="{{ user.url }}">{{ user.username }}</a></li> +{% endfor %} +</ul> +``` diff --git a/tests/extensions/nl2br_w_attr_list.html b/tests/extensions/nl2br_w_attr_list.html new file mode 100644 index 0000000..e5e7eb2 --- /dev/null +++ b/tests/extensions/nl2br_w_attr_list.html @@ -0,0 +1 @@ +<p id="bar">Foo<br /></p>
\ No newline at end of file diff --git a/tests/extensions/nl2br_w_attr_list.txt b/tests/extensions/nl2br_w_attr_list.txt new file mode 100644 index 0000000..4b520b5 --- /dev/null +++ b/tests/extensions/nl2br_w_attr_list.txt @@ -0,0 +1,2 @@ +Foo +{: #bar}
\ No newline at end of file diff --git a/tests/extensions/sane_lists.html b/tests/extensions/sane_lists.html new file mode 100644 index 0000000..ed51b4d --- /dev/null +++ b/tests/extensions/sane_lists.html @@ -0,0 +1,32 @@ +<ol> +<li>Ordered</li> +<li>List</li> +</ol> +<ul> +<li>Unordered</li> +<li>List</li> +</ul> +<ol> +<li>Ordered again</li> +</ol> +<p>Paragraph +* not a list item</p> +<ol> +<li>More ordered +* not a list item</li> +</ol> +<ul> +<li>Unordered again +1. not a list item</li> +</ul> +<ol start="3"> +<li>Bird</li> +<li>McHale</li> +<li>Parish</li> +</ol> +<p>Not a list</p> +<ol start="3"> +<li>Bird</li> +<li>McHale</li> +<li>Parish</li> +</ol>
\ No newline at end of file diff --git a/tests/extensions/sane_lists.txt b/tests/extensions/sane_lists.txt new file mode 100644 index 0000000..464149f --- /dev/null +++ b/tests/extensions/sane_lists.txt @@ -0,0 +1,26 @@ +1. Ordered +2. List + +* Unordered +* List + +1. Ordered again + +Paragraph +* not a list item + +1. More ordered +* not a list item + +* Unordered again +1. not a list item + +3. Bird +1. McHale +8. Parish + +Not a list + +3. Bird +1. McHale +8. Parish
\ No newline at end of file diff --git a/tests/extensions/smarty.html b/tests/extensions/smarty.html new file mode 100644 index 0000000..e37e377 --- /dev/null +++ b/tests/extensions/smarty.html @@ -0,0 +1,32 @@ +<p>’.<br /> +1440–80’s<br /> +1440–’80s<br /> +1440—’80s<br /> +1960s<br /> +1960’s<br /> +one two ’60s<br /> +’60s</p> +<p>It’s fun. What’s fun?<br /> +“Isn’t this fun”? — she said…<br /> +“‘Quoted’ words in a larger quote.”<br /> +‘Quoted “words” in a larger quote.’<br /> +“quoted” text and <strong>bold “quoted” text</strong><br /> +‘quoted’ text and <strong>bold ‘quoted’ text</strong><br /> +em-dashes (—) and ellipes (…)<br /> +“<a href="http://example.com">Link</a>” — she said.</p> +<p>“Ellipsis within quotes…”</p> +<p>Кавычки-«ёлочки»<br /> +«hello»<br /> +Anführungszeichen-»Chevrons«</p> +<hr /> +<p>Escaped -- ndash<br /> +'Escaped' "quotes"<br /> +Escaped ellipsis...</p> +<p>‘Escaped "quotes" in real ones’<br /> +'“Real” quotes in escaped ones'</p> +<p>Skip <code><<all>> "code" -- --- 'spans' ...</code>.</p> +<pre><code>Also skip "code" 'blocks' +foo -- bar --- baz ... +</code></pre> +<p>A line that ‘wraps’ with +<em>emphasis</em> at the beginning of the next line.</p>
\ No newline at end of file diff --git a/tests/extensions/smarty.txt b/tests/extensions/smarty.txt new file mode 100644 index 0000000..12e5c95 --- /dev/null +++ b/tests/extensions/smarty.txt @@ -0,0 +1,40 @@ +'. +1440--80's +1440--'80s +1440---'80s +1960s +1960's +one two '60s +'60s + +It's fun. What's fun? +"Isn't this fun"? --- she said... +"'Quoted' words in a larger quote." +'Quoted "words" in a larger quote.' +"quoted" text and **bold "quoted" text** +'quoted' text and **bold 'quoted' text** +em-dashes (---) and ellipes (...) +"[Link](http://example.com)" --- she said. + +"Ellipsis within quotes..." + +Кавычки-<<ёлочки>> +<<hello>> +Anführungszeichen->>Chevrons<< + +--- -- --- + +Escaped \-- ndash +\'Escaped\' \"quotes\" +Escaped ellipsis\... + +'Escaped \"quotes\" in real ones' +\'"Real" quotes in escaped ones\' + +Skip `<<all>> "code" -- --- 'spans' ...`. + + Also skip "code" 'blocks' + foo -- bar --- baz ... + +A line that 'wraps' with +*emphasis* at the beginning of the next line. diff --git a/tests/extensions-x-toc/syntax-toc.html b/tests/extensions/toc.html index eea5347..1f06b68 100644 --- a/tests/extensions-x-toc/syntax-toc.html +++ b/tests/extensions/toc.html @@ -135,7 +135,7 @@ and <code>&</code> in your example code needs to be escaped.)</p> <p>A paragraph is simply one or more consecutive lines of text, separated by one or more blank lines. (A blank line is any line that looks like a blank line -- a line containing nothing but spaces or tabs is considered -blank.) Normal paragraphs should not be intended with spaces or tabs.</p> +blank.) Normal paragraphs should not be indented with spaces or tabs.</p> <p>The implication of the "one or more consecutive lines of text" rule is that Markdown supports "hard-wrapped" text paragraphs. This differs significantly from most other text-to-HTML formatters (including Movable @@ -222,7 +222,7 @@ example, with BBEdit, you can make a selection and choose Increase Quote Level from the Text menu.</p> <h2 id="lists">Lists</h2> <p>Markdown supports ordered (numbered) and unordered (bulleted) lists.</p> -<p>Unordered lists use asterisks, pluses, and hyphens -- interchangably +<p>Unordered lists use asterisks, pluses, and hyphens -- interchangeably -- as list markers:</p> <pre><code>* Red * Green @@ -309,7 +309,7 @@ items in <code><p></code> tags in the HTML output. For example, this input </ul> </code></pre> <p>List items may consist of multiple paragraphs. Each subsequent -paragraph in a list item must be intended by either 4 spaces +paragraph in a list item must be indented by either 4 spaces or one tab:</p> <pre><code>1. This is a list item with two paragraphs. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aliquam hendrerit @@ -461,12 +461,12 @@ on a line by itself:</p> <p>That is:</p> <ul> <li>Square brackets containing the link identifier (optionally -indented from the left margin using up to three spaces);</li> + indented from the left margin using up to three spaces);</li> <li>followed by a colon;</li> <li>followed by one or more spaces (or tabs);</li> <li>followed by the URL for the link;</li> <li>optionally followed by a title attribute for the link, enclosed -in double or single quotes.</li> + in double or single quotes.</li> </ul> <p>The link URL may, optionally, be surrounded by angle brackets:</p> <pre><code>[id]: <http://example.com/> "Optional Title Here" @@ -634,10 +634,10 @@ for links, allowing for two styles: <em>inline</em> and <em>reference</em>.</p> <ul> <li>An exclamation mark: <code>!</code>;</li> <li>followed by a set of square brackets, containing the <code>alt</code> -attribute text for the image;</li> + attribute text for the image;</li> <li>followed by a set of parentheses, containing the URL or path to -the image, and an optional <code>title</code> attribute enclosed in double -or single quotes.</li> + the image, and an optional <code>title</code> attribute enclosed in double + or single quotes.</li> </ul> <p>Reference-style image syntax looks like this:</p> <pre><code>![Alt text][id] diff --git a/tests/extensions-x-toc/syntax-toc.txt b/tests/extensions/toc.txt index f297200..1a1de34 100644 --- a/tests/extensions-x-toc/syntax-toc.txt +++ b/tests/extensions/toc.txt @@ -149,7 +149,7 @@ and `&` in your example code needs to be escaped.) A paragraph is simply one or more consecutive lines of text, separated by one or more blank lines. (A blank line is any line that looks like a blank line -- a line containing nothing but spaces or tabs is considered -blank.) Normal paragraphs should not be intended with spaces or tabs. +blank.) Normal paragraphs should not be indented with spaces or tabs. The implication of the "one or more consecutive lines of text" rule is that Markdown supports "hard-wrapped" text paragraphs. This differs @@ -261,7 +261,7 @@ Quote Level from the Text menu. Markdown supports ordered (numbered) and unordered (bulleted) lists. -Unordered lists use asterisks, pluses, and hyphens -- interchangably +Unordered lists use asterisks, pluses, and hyphens -- interchangeably -- as list markers: * Red @@ -364,7 +364,7 @@ will turn into: </ul> List items may consist of multiple paragraphs. Each subsequent -paragraph in a list item must be intended by either 4 spaces +paragraph in a list item must be indented by either 4 spaces or one tab: 1. This is a list item with two paragraphs. Lorem ipsum dolor diff --git a/tests/extensions-x-toc/invalid.html b/tests/extensions/toc_invalid.html index 41a3b1f..41a3b1f 100644 --- a/tests/extensions-x-toc/invalid.html +++ b/tests/extensions/toc_invalid.html diff --git a/tests/extensions-x-toc/invalid.txt b/tests/extensions/toc_invalid.txt index f6c4ec4..f6c4ec4 100644 --- a/tests/extensions-x-toc/invalid.txt +++ b/tests/extensions/toc_invalid.txt diff --git a/tests/extensions/toc_nested.html b/tests/extensions/toc_nested.html new file mode 100644 index 0000000..27af9df --- /dev/null +++ b/tests/extensions/toc_nested.html @@ -0,0 +1,16 @@ +<h1 id="header-a">Header A<a class="headerlink" href="#header-a" title="Permanent link">¶</a></h1> +<h2 id="header-1">Header 1<a class="headerlink" href="#header-1" title="Permanent link">¶</a></h2> +<h3 id="header-i">Header i<a class="headerlink" href="#header-i" title="Permanent link">¶</a></h3> +<h1 id="header-b">Header <em>B</em><a class="headerlink" href="#header-b" title="Permanent link">¶</a></h1> +<div class="toc"> +<ul> +<li><a href="#header-a">Header A</a><ul> +<li><a href="#header-1">Header 1</a><ul> +<li><a href="#header-i">Header i</a></li> +</ul> +</li> +</ul> +</li> +<li><a href="#header-b">Header B</a></li> +</ul> +</div>
\ No newline at end of file diff --git a/tests/extensions-x-toc/nested.txt b/tests/extensions/toc_nested.txt index 9b515f9..0f897b2 100644 --- a/tests/extensions-x-toc/nested.txt +++ b/tests/extensions/toc_nested.txt @@ -4,6 +4,6 @@ ### Header i -# Header B +# Header *B* [TOC] diff --git a/tests/extensions/toc_nested2.html b/tests/extensions/toc_nested2.html new file mode 100644 index 0000000..2d8fa2d --- /dev/null +++ b/tests/extensions/toc_nested2.html @@ -0,0 +1,14 @@ +<div class="toc"> +<ul> +<li><a href="#start-with-header-other-than-one">Start with header other than one.</a></li> +<li><a href="#header-3">Header 3</a><ul> +<li><a href="#header-4">Header 4</a></li> +</ul> +</li> +<li><a href="#header-3_1">Header 3</a></li> +</ul> +</div> +<h3 id="start-with-header-other-than-one">Start with header other than one.<a class="headerlink" href="#start-with-header-other-than-one" title="Permanent link">[link]</a></h3> +<h3 id="header-3">Header 3<a class="headerlink" href="#header-3" title="Permanent link">[link]</a></h3> +<h4 id="header-4">Header 4<a class="headerlink" href="#header-4" title="Permanent link">[link]</a></h4> +<h3 id="header-3_1">Header 3<a class="headerlink" href="#header-3_1" title="Permanent link">[link]</a></h3>
\ No newline at end of file diff --git a/tests/extensions/toc_nested2.txt b/tests/extensions/toc_nested2.txt new file mode 100644 index 0000000..9db4d8c --- /dev/null +++ b/tests/extensions/toc_nested2.txt @@ -0,0 +1,10 @@ +[TOC] + +### Start with header other than one. + +### Header 3 + +#### Header 4 + +### Header 3 + diff --git a/tests/extensions/toc_nested_list.html b/tests/extensions/toc_nested_list.html new file mode 100644 index 0000000..6912411 --- /dev/null +++ b/tests/extensions/toc_nested_list.html @@ -0,0 +1,30 @@ +<h1 id="title">Title</h1> +<div class="toc"> +<ul> +<li><a href="#title">Title</a><ul> +<li><a href="#section-1">Section 1</a><ul> +<li><a href="#subsection-1">Subsection 1</a></li> +<li><a href="#subsection-2">Subsection 2</a></li> +</ul> +</li> +<li><a href="#section-2">Section 2</a></li> +<li><a href="#section-3">Section 3</a></li> +</ul> +</li> +</ul> +</div> +<h2 id="section-1">Section 1</h2> +<ol> +<li> +<p>List Item 1</p> +<h3 id="subsection-1">Subsection 1</h3> +<p>Explanation 1</p> +</li> +<li> +<p>List Item 2</p> +<h3 id="subsection-2">Subsection 2</h3> +<p>Explanation 2</p> +</li> +</ol> +<h2 id="section-2">Section 2</h2> +<h2 id="section-3">Section 3</h2>
\ No newline at end of file diff --git a/tests/extensions/toc_nested_list.txt b/tests/extensions/toc_nested_list.txt new file mode 100644 index 0000000..d83e96f --- /dev/null +++ b/tests/extensions/toc_nested_list.txt @@ -0,0 +1,19 @@ +# Title + +[TOC] + +## Section 1 + +1. List Item 1 + + ### Subsection 1 + Explanation 1 + +2. List Item 2 + + ### Subsection 2 + Explanation 2 + +## Section 2 + +## Section 3
\ No newline at end of file diff --git a/tests/extensions/toc_out_of_order.html b/tests/extensions/toc_out_of_order.html new file mode 100644 index 0000000..93d8b04 --- /dev/null +++ b/tests/extensions/toc_out_of_order.html @@ -0,0 +1,8 @@ +<div class="toc"> +<ul> +<li><a href="#header-2">Header 2</a></li> +<li><a href="#header-1">Header 1</a></li> +</ul> +</div> +<h2 id="header-2">Header 2</h2> +<h1 id="header-1">Header 1</h1>
\ No newline at end of file diff --git a/tests/extensions/toc_out_of_order.txt b/tests/extensions/toc_out_of_order.txt new file mode 100644 index 0000000..f08bdbc --- /dev/null +++ b/tests/extensions/toc_out_of_order.txt @@ -0,0 +1,5 @@ +[TOC] + +## Header 2 + +# Header 1 diff --git a/tests/extensions/wikilinks.html b/tests/extensions/wikilinks.html new file mode 100644 index 0000000..a76a693 --- /dev/null +++ b/tests/extensions/wikilinks.html @@ -0,0 +1,9 @@ +<p>Some text with a <a class="wikilink" href="/WikiLink/">WikiLink</a>.</p> +<p>A link with <a class="wikilink" href="/white_space_and_underscores/">white space and_underscores</a> and a empty one.</p> +<p>Another with <a class="wikilink" href="/double_spaces/">double spaces</a> and <a class="wikilink" href="/double__underscores/">double__underscores</a> and +one that <a class="wikilink" href="/has_emphasis_inside/">has <em>emphasis</em> inside</a> and one <a class="wikilink" href="/with_multiple_underscores/">with_multiple_underscores</a> +and one that is <em><a class="wikilink" href="/emphasised/">emphasised</a></em>.</p> +<p>And a <a href="http://example.com/RealLink">RealLink</a>.</p> +<p><a href="http://example.com/And_A_AutoLink">http://example.com/And_A_AutoLink</a></p> +<p>And a <a href="/MarkdownLink/" title="A MarkdownLink">MarkdownLink</a> for +completeness.</p>
\ No newline at end of file diff --git a/tests/extensions-x-wikilinks/wikilinks.txt b/tests/extensions/wikilinks.txt index 8e6911b..8e6911b 100644 --- a/tests/extensions-x-wikilinks/wikilinks.txt +++ b/tests/extensions/wikilinks.txt diff --git a/tests/html4/html4.html b/tests/html4/html4.html deleted file mode 100644 index 7c88ad7..0000000 --- a/tests/html4/html4.html +++ /dev/null @@ -1,2 +0,0 @@ -<p>A test of the most<br> -basic of html/xhtml differences.</p>
\ No newline at end of file diff --git a/tests/html4/html4.txt b/tests/html4/html4.txt deleted file mode 100644 index fddaf8e..0000000 --- a/tests/html4/html4.txt +++ /dev/null @@ -1,2 +0,0 @@ -A test of the most -basic of html/xhtml differences.
\ No newline at end of file diff --git a/tests/markdown-test/benchmark.dat b/tests/markdown-test/benchmark.dat deleted file mode 100644 index 3d549dd..0000000 --- a/tests/markdown-test/benchmark.dat +++ /dev/null @@ -1,20 +0,0 @@ -construction:0.000000:0.000000 -amps-and-angle-encoding:0.070000:131072.000000 -auto-links:0.080000:397312.000000 -backlash-escapes:0.270000:884736.000000 -blockquotes-with-dode-blocks:0.020000:0.000000 -hard-wrapped:0.020000:0.000000 -horizontal-rules:0.180000:135168.000000 -inline-html-advanced:0.070000:0.000000 -inline-html-comments:0.080000:0.000000 -inline-html-simple:0.210000:0.000000 -links-inline:0.140000:0.000000 -links-reference:0.170000:0.000000 -literal-quotes:0.090000:0.000000 -markdown-documentation-basics:0.690000:1806336.000000 -markdown-syntax:3.310000:6696960.000000 -nested-blockquotes:0.200000:0.000000 -ordered-and-unordered-list:0.530000:0.000000 -strong-and-em-together:0.200000:0.000000 -tabs:0.200000:0.000000 -tidyness:0.200000:0.000000 diff --git a/tests/misc/amp-in-url.html b/tests/misc/amp-in-url.html deleted file mode 100644 index 2170a54..0000000 --- a/tests/misc/amp-in-url.html +++ /dev/null @@ -1 +0,0 @@ -<p><a href="http://www.freewisdom.org/this&that">link</a></p>
\ No newline at end of file diff --git a/tests/misc/amp-in-url.txt b/tests/misc/amp-in-url.txt deleted file mode 100644 index 471106e..0000000 --- a/tests/misc/amp-in-url.txt +++ /dev/null @@ -1 +0,0 @@ -[link](http://www.freewisdom.org/this&that) diff --git a/tests/misc/ampersand.html b/tests/misc/ampersand.html deleted file mode 100644 index 94ed80c..0000000 --- a/tests/misc/ampersand.html +++ /dev/null @@ -1,2 +0,0 @@ -<p>&</p> -<p>AT&T</p>
\ No newline at end of file diff --git a/tests/misc/ampersand.txt b/tests/misc/ampersand.txt deleted file mode 100644 index 367d32c..0000000 --- a/tests/misc/ampersand.txt +++ /dev/null @@ -1,5 +0,0 @@ -& - -AT&T - - diff --git a/tests/misc/attributes2.html b/tests/misc/attributes2.html deleted file mode 100644 index 5971cc8..0000000 --- a/tests/misc/attributes2.html +++ /dev/null @@ -1,6 +0,0 @@ -<p id="TABLE.OF.CONTENTS" /> -<ul> -<li id="TABLEOFCONTENTS" /> -</ul> -<p id="TABLEOFCONTENTS">Or in the middle of the text </p> -<p id="tableofcontents" />
\ No newline at end of file diff --git a/tests/misc/attributes2.txt b/tests/misc/attributes2.txt deleted file mode 100644 index d635cb2..0000000 --- a/tests/misc/attributes2.txt +++ /dev/null @@ -1,10 +0,0 @@ -{@id=TABLE.OF.CONTENTS} - - -* {@id=TABLEOFCONTENTS} - - -Or in the middle of the text {@id=TABLEOFCONTENTS} - -{@id=tableofcontents} - diff --git a/tests/misc/backtick-escape.html b/tests/misc/backtick-escape.html index 07f5115..da30541 100644 --- a/tests/misc/backtick-escape.html +++ b/tests/misc/backtick-escape.html @@ -1,3 +1,4 @@ -<p>\`This should not be in code.\` -`This also should not be in code.` +<p>`This should not be in code.` +\<code>This should be in code.\\</code> +\`This should not be in code.\` `And finally this should not be in code.`</p>
\ No newline at end of file diff --git a/tests/misc/backtick-escape.txt b/tests/misc/backtick-escape.txt index b4d80b2..c019463 100644 --- a/tests/misc/backtick-escape.txt +++ b/tests/misc/backtick-escape.txt @@ -1,3 +1,4 @@ -\\`This should not be in code.\\` -\`This also should not be in code.\` +\`This should not be in code.\` +\\`This should be in code.\\` +\\\`This should not be in code.\\\` \`And finally this should not be in code.` diff --git a/tests/misc/bidi.html b/tests/misc/bidi.html index ffe04dc..3cc0444 100644 --- a/tests/misc/bidi.html +++ b/tests/misc/bidi.html @@ -1,7 +1,7 @@ <p><strong>Python</strong>(パイソン)は、<a href="http://en.wikipedia.org/wiki/Guido_van_Rossum">Guido van Rossum</a> によって作られたオープンソースのオブジェクト指向スクリプト言語。<a href="http://ja.wikipedia.org/wiki/Perl">Perl</a>とともに欧米で広く普及している。イギリスのテレビ局 BBC が製作したコメディ番組『空飛ぶモンティ・パイソン』にちなんで名付けられた。 (Pythonには、爬虫類のニシキヘビの意味があり、Python言語のマスコットやアイコンとして使われることがある。)</p> <p>|||||||||||||||||||||||||||||THIS SHOULD BE LTR|||||||||||||||||||||||||</p> -<p dir="rtl">|||||||||||||||||||||||||||||THIS SHOULD BE RTL||||||||||||||||||||||||| </p> -<p dir="ltr">(<strong>بايثون</strong> لغة برمجة حديثة بسيطة، واضحة، سريعة ، تستخدم أسلوب البرمجة الكائنية (THIS SHOULD BE LTR ) وقابلة للتطوير بالإضافة إلى أنها مجانية و مفتوح </p> +<p>|||||||||||||||||||||||||||||THIS SHOULD BE RTL||||||||||||||||||||||||| </p> +<p>(<strong>بايثون</strong> لغة برمجة حديثة بسيطة، واضحة، سريعة ، تستخدم أسلوب البرمجة الكائنية (THIS SHOULD BE LTR ) وقابلة للتطوير بالإضافة إلى أنها مجانية و مفتوح </p> <p>پایتون زبان برنامهنویسی تفسیری و سطح بالا ، شیگرا و یک زبان برنامهنویسی تفسیری سمت سرور قدرتمند است که توسط گیدو ون روسوم در سال ۱۹۹۰ ساخته شد. این زبان در ویژگیها شبیه پرل، روبی، اسکیم، اسمالتاک و تیسیال است و از مدیریت خودکار حافظه استفاده میکند</p> <p>Python,是一种面向对象的、直譯式的计算机程序设计语言,也是一种功能强大而完善的通用型语言,已经具有十多年的发展历史,成熟且稳定。</p> <p>ބްލޫ ވޭލްގެ ދޫ މަތީގައި އެއްފަހަރާ 50 މީހުންނަށް ތިބެވިދާނެވެ. ބޮޑު މަހުގެ ދުލަކީ އެހާމެ ބޮޑު އެއްޗެކެވެ.</p> diff --git a/tests/misc/bidi.txt b/tests/misc/bidi.txt index f11ff1c..7e6dbea 100644 --- a/tests/misc/bidi.txt +++ b/tests/misc/bidi.txt @@ -2,10 +2,10 @@ |||||||||||||||||||||||||||||THIS SHOULD BE LTR||||||||||||||||||||||||| -|||||||||||||||||||||||||||||THIS SHOULD BE RTL||||||||||||||||||||||||| {@dir=rtl} +|||||||||||||||||||||||||||||THIS SHOULD BE RTL||||||||||||||||||||||||| -(**بايثون** لغة برمجة حديثة بسيطة، واضحة، سريعة ، تستخدم أسلوب البرمجة الكائنية (THIS SHOULD BE LTR ) وقابلة للتطوير {@dir=ltr} بالإضافة إلى أنها مجانية و مفتوح +(**بايثون** لغة برمجة حديثة بسيطة، واضحة، سريعة ، تستخدم أسلوب البرمجة الكائنية (THIS SHOULD BE LTR ) وقابلة للتطوير بالإضافة إلى أنها مجانية و مفتوح diff --git a/tests/misc/blank-block-quote.html b/tests/misc/blank-block-quote.html index 23df17a..966078c 100644 --- a/tests/misc/blank-block-quote.html +++ b/tests/misc/blank-block-quote.html @@ -1,3 +1,3 @@ <p>aaaaaaaaaaa</p> -<blockquote /> +<blockquote></blockquote> <p>bbbbbbbbbbb</p>
\ No newline at end of file diff --git a/tests/misc/blank_lines_in_codeblocks.html b/tests/misc/blank_lines_in_codeblocks.html new file mode 100644 index 0000000..57a4c36 --- /dev/null +++ b/tests/misc/blank_lines_in_codeblocks.html @@ -0,0 +1,61 @@ +<p>Preserve blank lines in code blocks with tabs:</p> +<pre><code>a code block + +two tabbed lines + + +three tabbed lines + + + +four tabbed lines + + + + +five tabbed lines + + + + + +six tabbed lines + + + + + + +End of tabbed block +</code></pre> +<p>And without tabs:</p> +<pre><code>a code block + +two blank lines + + +three blank lines + + + +four blank lines + + + + +five blank lines + + + + + +six blank lines + + + + + + +End of block +</code></pre> +<p>End of document</p>
\ No newline at end of file diff --git a/tests/misc/blank_lines_in_codeblocks.txt b/tests/misc/blank_lines_in_codeblocks.txt new file mode 100644 index 0000000..e7ae102 --- /dev/null +++ b/tests/misc/blank_lines_in_codeblocks.txt @@ -0,0 +1,73 @@ +Preserve blank lines in code blocks with tabs: + + a code block + + two tabbed lines + + + three tabbed lines + + + + four tabbed lines + + + + + five tabbed lines + + + + + + six tabbed lines + + + + + + + End of tabbed block + + + + + + +And without tabs: + + a code block + + two blank lines + + + three blank lines + + + + four blank lines + + + + + five blank lines + + + + + + six blank lines + + + + + + + End of block + + + + + + +End of document
\ No newline at end of file diff --git a/tests/misc/blockquote-hr.html b/tests/misc/blockquote-hr.html index 61c1a3c..e13784f 100644 --- a/tests/misc/blockquote-hr.html +++ b/tests/misc/blockquote-hr.html @@ -13,4 +13,13 @@ With multiple lines. Even a lazy line.</p> <hr /> <p>The last line.</p> +</blockquote> +<p>foo</p> +<blockquote> +<p>bar</p> +<hr /> +</blockquote> +<hr /> +<blockquote> +<p>baz</p> </blockquote>
\ No newline at end of file diff --git a/tests/misc/blockquote-hr.txt b/tests/misc/blockquote-hr.txt index ef9c44f..8f67b24 100644 --- a/tests/misc/blockquote-hr.txt +++ b/tests/misc/blockquote-hr.txt @@ -19,3 +19,9 @@ Even a lazy line. > --- > The last line. + +foo +> bar +> *** +--- +> baz diff --git a/tests/misc/br.html b/tests/misc/br.html index 08563a5..e8e6fdf 100644 --- a/tests/misc/br.html +++ b/tests/misc/br.html @@ -8,4 +8,4 @@ Or, if you prefer, <strong>use two underscores instead</strong>.< <h2>Lists</h2> <p>Unordered (bulleted) lists use asterisks, pluses, and hyphens (<code>*</code>, <code>+</code>, and <code>-</code>) as list markers. These three markers are -interchangable; this:</p>
\ No newline at end of file +interchangeable; this:</p>
\ No newline at end of file diff --git a/tests/misc/br.txt b/tests/misc/br.txt index 59d29e0..19f4cf1 100644 --- a/tests/misc/br.txt +++ b/tests/misc/br.txt @@ -12,5 +12,5 @@ Output: Unordered (bulleted) lists use asterisks, pluses, and hyphens (`*`, `+`, and `-`) as list markers. These three markers are -interchangable; this: +interchangeable; this: diff --git a/tests/misc/brackets-in-img-title.html b/tests/misc/brackets-in-img-title.html new file mode 100644 index 0000000..3677139 --- /dev/null +++ b/tests/misc/brackets-in-img-title.html @@ -0,0 +1,9 @@ +<p><img alt="alt" src="local-img.jpg" /> +<img alt="alt" src="local-img.jpg" title="" /> +<img alt="alt" src="local-img.jpg" title="normal title" /></p> +<p><img alt="alt" src="local-img.jpg" title="(just title in brackets)" /> +<img alt="alt" src="local-img.jpg" title="title with brackets (I think)" /></p> +<p><img alt="alt" src="local-img.jpg" title="(" /> +<img alt="alt" src="local-img.jpg" title="(open only" /> +<img alt="alt" src="local-img.jpg" title=")" /> +<img alt="alt" src="local-img.jpg" title="close only)" /></p>
\ No newline at end of file diff --git a/tests/misc/brackets-in-img-title.txt b/tests/misc/brackets-in-img-title.txt new file mode 100644 index 0000000..01fcd4e --- /dev/null +++ b/tests/misc/brackets-in-img-title.txt @@ -0,0 +1,12 @@ +![alt](local-img.jpg) +![alt](local-img.jpg "") +![alt](local-img.jpg "normal title") + +![alt](local-img.jpg "(just title in brackets)") +![alt](local-img.jpg "title with brackets (I think)") + +![alt](local-img.jpg "(") +![alt](local-img.jpg "(open only") +![alt](local-img.jpg ")") +![alt](local-img.jpg "close only)") + diff --git a/tests/misc/comments.html b/tests/misc/comments.html deleted file mode 100644 index 005a755..0000000 --- a/tests/misc/comments.html +++ /dev/null @@ -1,5 +0,0 @@ -<p>X<0</p> -<p>X>0</p> -<!-- A comment --> - -<div>as if</div>
\ No newline at end of file diff --git a/tests/misc/comments.txt b/tests/misc/comments.txt deleted file mode 100644 index 68302b0..0000000 --- a/tests/misc/comments.txt +++ /dev/null @@ -1,7 +0,0 @@ -X<0 - -X>0 - -<!-- A comment --> - -<div>as if</div> diff --git a/tests/misc/div.html b/tests/misc/div.html deleted file mode 100644 index 7cd0d6d..0000000 --- a/tests/misc/div.html +++ /dev/null @@ -1,4 +0,0 @@ -<div id="sidebar"> - -<p><em>foo</em></p> -</div>
\ No newline at end of file diff --git a/tests/misc/div.txt b/tests/misc/div.txt deleted file mode 100644 index ca87745..0000000 --- a/tests/misc/div.txt +++ /dev/null @@ -1,5 +0,0 @@ -<div id="sidebar"> - - _foo_ - -</div> diff --git a/tests/misc/em-around-links.html b/tests/misc/em-around-links.html index 06bfa8e..cc415f5 100644 --- a/tests/misc/em-around-links.html +++ b/tests/misc/em-around-links.html @@ -1,16 +1,13 @@ <h1>Title</h1> - <ul> - <li><em><a href="http://www.freewisdom.org/projects/python-markdown/">Python in Markdown</a> by some +<li><em><a href="http://example.com">Python in Markdown</a> by some great folks</em> - This <em>does</em> work as expected.</li> - <li><em><a href="http://www.freewisdom.org/projects/python-markdown/">Python in Markdown</a> by some +<li><em><a href="http://example.com">Python in Markdown</a> by some great folks</em> - This <em>does</em> work as expected.</li> - <li><a href="http://www.freewisdom.org/projects/python-markdown/"><em>Python in Markdown</em></a> by some +<li><a href="http://example.com"><em>Python in Markdown</em></a> by some great folks - This <em>does</em> work as expected.</li> - <li><a href="http://www.freewisdom.org/projects/python-markdown/"><em>Python in Markdown</em></a> <em>by some +<li><a href="http://example.com"><em>Python in Markdown</em></a> <em>by some great folks</em> - This <em>does</em> work as expected.</li> </ul> - -<p><em><a href="http://www.freewisdom.org/projects/python-markdown/">Python in Markdown</a> by some - great folks</em> - This <em>does</em> work as expected.</p> - +<p><em><a href="http://example.com">Python in Markdown</a> by some +great folks</em> - This <em>does</em> work as expected.</p>
\ No newline at end of file diff --git a/tests/misc/em-around-links.txt b/tests/misc/em-around-links.txt index 5b15be4..dbc3644 100644 --- a/tests/misc/em-around-links.txt +++ b/tests/misc/em-around-links.txt @@ -1,14 +1,14 @@ # Title - - *[Python in Markdown](http://www.freewisdom.org/projects/python-markdown/) by some + - *[Python in Markdown](http://example.com) by some great folks* - This *does* work as expected. - - _[Python in Markdown](http://www.freewisdom.org/projects/python-markdown/) by some + - _[Python in Markdown](http://example.com) by some great folks_ - This *does* work as expected. - - [_Python in Markdown_](http://www.freewisdom.org/projects/python-markdown/) by some + - [_Python in Markdown_](http://example.com) by some great folks - This *does* work as expected. - - [_Python in Markdown_](http://www.freewisdom.org/projects/python-markdown/) _by some + - [_Python in Markdown_](http://example.com) _by some great folks_ - This *does* work as expected. -_[Python in Markdown](http://www.freewisdom.org/projects/python-markdown/) by some +_[Python in Markdown](http://example.com) by some great folks_ - This *does* work as expected. diff --git a/tests/misc/em_strong.html b/tests/misc/em_strong.html index 75c92d8..776381b 100644 --- a/tests/misc/em_strong.html +++ b/tests/misc/em_strong.html @@ -7,4 +7,5 @@ <p>three asterisks: ***</p> <p>with spaces: * * *</p> <p>three underscores: ___</p> -<p>with spaces: _ _ _</p>
\ No newline at end of file +<p>with spaces: _ _ _</p> +<p>One char: <em>a</em></p>
\ No newline at end of file diff --git a/tests/misc/em_strong.txt b/tests/misc/em_strong.txt index d0774ad..1285665 100644 --- a/tests/misc/em_strong.txt +++ b/tests/misc/em_strong.txt @@ -18,3 +18,4 @@ three underscores: ___ with spaces: _ _ _ +One char: _a_ diff --git a/tests/misc/em_strong_complex.html b/tests/misc/em_strong_complex.html new file mode 100644 index 0000000..65faddf --- /dev/null +++ b/tests/misc/em_strong_complex.html @@ -0,0 +1,14 @@ +<p><em><strong>test test</strong> test test</em></p> +<p><strong><em>test test</em> test test</strong></p> +<p><strong><em>test</em></strong></p> +<p><strong>test</strong></p> +<p><strong><em>test</em> test</strong>_</p> +<p><strong><em>test</em> test</strong></p> +<p><em>test_test test_test</em></p> +<p><em><strong>test test</strong> test test</em></p> +<p><strong><em>test test</em> test test</strong></p> +<p>*<em>test</em></p> +<p><strong><em>test</em></strong></p> +<p><strong>test</strong>*</p> +<p><strong><em>test</em> test</strong></p> +<p><em>test</em>test test<em>test</em></p>
\ No newline at end of file diff --git a/tests/misc/em_strong_complex.txt b/tests/misc/em_strong_complex.txt new file mode 100644 index 0000000..0425971 --- /dev/null +++ b/tests/misc/em_strong_complex.txt @@ -0,0 +1,27 @@ +___test test__ test test_ + +___test test_ test test__ + +___test___ + +__test__ + +___test_ test___ + +___test_ test__ + +_test_test test_test_ + +***test test** test test* + +***test test* test test** + +**test* + +***test*** + +**test*** + +***test* test** + +*test*test test*test*
\ No newline at end of file diff --git a/tests/misc/email.html b/tests/misc/email.html index 0d033bb..8ef799f 100644 --- a/tests/misc/email.html +++ b/tests/misc/email.html @@ -1,2 +1,3 @@ <p>asdfasdfadsfasd <a href="mailto:yuri@freewisdom.org">yuri@freewisdom.org</a> or you can say -instead <a href="mailto:yuri@freewisdom.org">yuri@freewisdom.org</a></p>
\ No newline at end of file +instead <a href="mailto:yuri@freewisdom.org">yuri@freewisdom.org</a></p> +<p><a href="mailto:bob&sue@example.com">bob&sue@example.com</a></p>
\ No newline at end of file diff --git a/tests/misc/email.txt b/tests/misc/email.txt index ece8801..c557c73 100644 --- a/tests/misc/email.txt +++ b/tests/misc/email.txt @@ -1,3 +1,5 @@ asdfasdfadsfasd <yuri@freewisdom.org> or you can say instead <mailto:yuri@freewisdom.org> + +<bob&sue@example.com> diff --git a/tests/misc/escaped_links.html b/tests/misc/escaped_links.html new file mode 100644 index 0000000..b2a7c96 --- /dev/null +++ b/tests/misc/escaped_links.html @@ -0,0 +1,4 @@ +<p>Backslashed in links:</p> +<p><a href="/query?q=go:GO\:0000307">q=go:GO\:0000307</a></p> +<p><a href="/query?q=go:GO\:0000308" title="/query?q=go:GO\:0000308">q=go:GO\:0000308</a></p> +<p>a \non-escaped char.</p>
\ No newline at end of file diff --git a/tests/misc/escaped_links.txt b/tests/misc/escaped_links.txt new file mode 100644 index 0000000..c64ab26 --- /dev/null +++ b/tests/misc/escaped_links.txt @@ -0,0 +1,9 @@ +Backslashed in links: + +[q=go:GO\\:0000307](/query?q=go:GO\\:0000307) + +[q=go:GO\\:0000308][foo] + +[foo]: /query?q=go:GO\:0000308 "/query?q=go:GO\:0000308" + +a \non-escaped char.
\ No newline at end of file diff --git a/tests/misc/h1.html b/tests/misc/h1.html index fbf9b4d..886b61e 100644 --- a/tests/misc/h1.html +++ b/tests/misc/h1.html @@ -1,3 +1,5 @@ <h2>Header</h2> <h1>Header 2</h1> -<h3>H3</h3>
\ No newline at end of file +<h3>H3</h3> +<h1>H1</h1> +<h2>H2</h2>
\ No newline at end of file diff --git a/tests/misc/h1.txt b/tests/misc/h1.txt index 0a1c8f9..f67b921 100644 --- a/tests/misc/h1.txt +++ b/tests/misc/h1.txt @@ -5,3 +5,9 @@ Header 2 ======== ### H3 + +H1 += + +H2 +-- diff --git a/tests/misc/header-in-lists.html b/tests/misc/header-in-lists.html new file mode 100644 index 0000000..351b44a --- /dev/null +++ b/tests/misc/header-in-lists.html @@ -0,0 +1,20 @@ +<p>Tight List:</p> +<ul> +<li> +<h1>Header1</h1> +Line 1-2 - <strong>not</strong> a header <em>or</em> paragraph!</li> +<li> +<h1>Header2</h1> +Line 2-2 - not a header or paragraph!</li> +</ul> +<p>Loose List:</p> +<ul> +<li> +<h1>Header1</h1> +<p>Line 1-2 - <em>a</em> paragraph</p> +</li> +<li> +<h1>Header2</h1> +<p>Line 2-2 - a paragraph</p> +</li> +</ul>
\ No newline at end of file diff --git a/tests/misc/header-in-lists.txt b/tests/misc/header-in-lists.txt new file mode 100644 index 0000000..b22083e --- /dev/null +++ b/tests/misc/header-in-lists.txt @@ -0,0 +1,14 @@ +Tight List: + +* #Header1 +Line 1-2 - **not** a header *or* paragraph! +* #Header2 +Line 2-2 - not a header or paragraph! + +Loose List: + +* #Header1 +Line 1-2 - *a* paragraph + +* #Header2 +Line 2-2 - a paragraph diff --git a/tests/misc/html-comments.html b/tests/misc/html-comments.html deleted file mode 100644 index 7b36246..0000000 --- a/tests/misc/html-comments.html +++ /dev/null @@ -1,2 +0,0 @@ -<p>Here is HTML <!-- **comment** --> -and once more <p><!--comment--></p></p>
\ No newline at end of file diff --git a/tests/misc/html-comments.txt b/tests/misc/html-comments.txt deleted file mode 100644 index cac4da5..0000000 --- a/tests/misc/html-comments.txt +++ /dev/null @@ -1,2 +0,0 @@ -Here is HTML <!-- **comment** --> -and once more <p><!--comment--></p> diff --git a/tests/misc/html.html b/tests/misc/html.html deleted file mode 100644 index 81ac5ee..0000000 --- a/tests/misc/html.html +++ /dev/null @@ -1,9 +0,0 @@ -<h1>Block level html</h1> - -<p>Some inline <b>stuff<b>.<br /> -</p> -<p>Now some <arbitrary>arbitrary tags</arbitrary>.</p> -<div>More block level html.</div> - -<p>And of course <script>blah</script>.</p> -<p><a href="script>stuff</script">this <script>link</a></p>
\ No newline at end of file diff --git a/tests/misc/html.txt b/tests/misc/html.txt deleted file mode 100644 index 3ac3ae0..0000000 --- a/tests/misc/html.txt +++ /dev/null @@ -1,13 +0,0 @@ - -<h1>Block level html</h1> - -Some inline <b>stuff<b>. - -Now some <arbitrary>arbitrary tags</arbitrary>. - -<div>More block level html.</div> - -And of course <script>blah</script>. - -[this <script>link](<script>stuff</script>) - diff --git a/tests/misc/image.html b/tests/misc/image.html deleted file mode 100644 index 16be2d5..0000000 --- a/tests/misc/image.html +++ /dev/null @@ -1 +0,0 @@ -<p><img alt="Poster" src="http://humane_man.jpg" title="The most humane man." /></p>
\ No newline at end of file diff --git a/tests/misc/image.txt b/tests/misc/image.txt deleted file mode 100644 index 5553bd4..0000000 --- a/tests/misc/image.txt +++ /dev/null @@ -1,2 +0,0 @@ - -![Poster](http://humane_man.jpg "The most humane man.") diff --git a/tests/misc/ins-at-start-of-paragraph.html b/tests/misc/ins-at-start-of-paragraph.html new file mode 100644 index 0000000..a08524e --- /dev/null +++ b/tests/misc/ins-at-start-of-paragraph.html @@ -0,0 +1 @@ +<p><ins>Hello, fellow developer</ins> this ins should be wrapped in a p.</p>
\ No newline at end of file diff --git a/tests/misc/ins-at-start-of-paragraph.txt b/tests/misc/ins-at-start-of-paragraph.txt new file mode 100644 index 0000000..2aee0bc --- /dev/null +++ b/tests/misc/ins-at-start-of-paragraph.txt @@ -0,0 +1 @@ +<ins>Hello, fellow developer</ins> this ins should be wrapped in a p. diff --git a/tests/misc/lists3.html b/tests/misc/lists3.html index 991395b..7cfe001 100644 --- a/tests/misc/lists3.html +++ b/tests/misc/lists3.html @@ -1,5 +1,5 @@ <ul> <li>blah blah blah -sdf asdf asdf asdf asdf -asda asdf asdfasd</li> + sdf asdf asdf asdf asdf + asda asdf asdfasd</li> </ul>
\ No newline at end of file diff --git a/tests/misc/lists7.html b/tests/misc/lists7.html new file mode 100644 index 0000000..81c1daa --- /dev/null +++ b/tests/misc/lists7.html @@ -0,0 +1,98 @@ +<ul> +<li>item 1</li> +<li> +<ul> +<li>item 2-1</li> +<li>item 2-2</li> +<li>item 2-3</li> +<li>item 2-4</li> +</ul> +</li> +<li>item 3</li> +<li> +<ul> +<li> +<p>item 4-1</p> +</li> +<li> +<p>item 4-2</p> +</li> +<li> +<p>item 4-3</p> +</li> +<li> +<p>item 4-4</p> +</li> +</ul> +</li> +</ul> +<h2>same as above, different spacing</h2> +<ul> +<li>item 1</li> +<li> +<ul> +<li>item 2-1</li> +<li>item 2-2</li> +</ul> +</li> +<li>item 3</li> +<li> +<ul> +<li> +<p>item 4-1</p> +</li> +<li> +<p>item 4-2</p> +</li> +</ul> +</li> +</ul> +<h2>only 1 item in nested list ##</h2> +<ul> +<li>item 1</li> +<li> +<ul> +<li>item 2-1</li> +</ul> +</li> +<li>item 3</li> +<li> +<ul> +<li>item 4-1</li> +</ul> +</li> +</ul> +<h2>Something ludicrous ##</h2> +<ul> +<li>item 1</li> +<li> +<ul> +<li>item 2-1</li> +<li>item 2-2</li> +<li> +<ul> +<li>item 2-2-1</li> +<li>item 2-2-2</li> +</ul> +</li> +<li>item 2-3</li> +</ul> +</li> +<li>item 3</li> +<li> +<ul> +<li> +<p>item 4-1</p> +</li> +<li> +<ul> +<li>item 4-1-1</li> +<li>item 4-1-2</li> +</ul> +</li> +<li> +<p>item 4-2</p> +</li> +</ul> +</li> +</ul>
\ No newline at end of file diff --git a/tests/misc/lists7.txt b/tests/misc/lists7.txt new file mode 100644 index 0000000..77181c8 --- /dev/null +++ b/tests/misc/lists7.txt @@ -0,0 +1,44 @@ +* item 1 +* * item 2-1 + * item 2-2 + * item 2-3 + * item 2-4 +* item 3 +* * item 4-1 + + * item 4-2 + + * item 4-3 + + * item 4-4 + +## same as above, different spacing +* item 1 +* * item 2-1 + * item 2-2 +* item 3 +* * item 4-1 + + * item 4-2 + +## only 1 item in nested list ## +* item 1 +* * item 2-1 +* item 3 +* * item 4-1 + +## Something ludicrous ## +* item 1 +* * item 2-1 + * item 2-2 + * * item 2-2-1 + * item 2-2-2 + * item 2-3 +* item 3 +* * item 4-1 + + * * item 4-1-1 + * item 4-1-2 + + * item 4-2 + diff --git a/tests/misc/lists8.html b/tests/misc/lists8.html new file mode 100644 index 0000000..8a93a51 --- /dev/null +++ b/tests/misc/lists8.html @@ -0,0 +1,39 @@ +<h1>Lists with blockquotes</h1> +<ol> +<li> +<blockquote> +<p>Four-score and seven years ago...</p> +</blockquote> +</li> +<li> +<blockquote> +<p>We have nothing to fear...</p> +</blockquote> +</li> +<li> +<blockquote> +<p>This is it...</p> +</blockquote> +</li> +</ol> +<h1>Multi-line blockquotes</h1> +<ul> +<li> +<blockquote> +<p>Four-score and sever years ago +our fathers brought forth</p> +</blockquote> +</li> +<li> +<blockquote> +<p>We have nothing to fear +but fear itself</p> +</blockquote> +</li> +<li> +<blockquote> +<p>This is it +as far as I'm concerned</p> +</blockquote> +</li> +</ul>
\ No newline at end of file diff --git a/tests/misc/lists8.txt b/tests/misc/lists8.txt new file mode 100644 index 0000000..8ab6767 --- /dev/null +++ b/tests/misc/lists8.txt @@ -0,0 +1,16 @@ +# Lists with blockquotes +1. > Four-score and seven years ago... + +2. > We have nothing to fear... + +3. > This is it... + +# Multi-line blockquotes +* > Four-score and sever years ago + > our fathers brought forth + +* > We have nothing to fear + > but fear itself + +* > This is it + > as far as I'm concerned diff --git a/tests/misc/markup-inside-p.html b/tests/misc/markup-inside-p.html deleted file mode 100644 index 1b6b420..0000000 --- a/tests/misc/markup-inside-p.html +++ /dev/null @@ -1,21 +0,0 @@ -<p> - -_foo_ - -</p> - -<p> -_foo_ -</p> - -<p>_foo_</p> - -<p> - -_foo_ -</p> - -<p> -_foo_ - -</p>
\ No newline at end of file diff --git a/tests/misc/markup-inside-p.txt b/tests/misc/markup-inside-p.txt deleted file mode 100644 index ab7dd0f..0000000 --- a/tests/misc/markup-inside-p.txt +++ /dev/null @@ -1,21 +0,0 @@ -<p> - -_foo_ - -</p> - -<p> -_foo_ -</p> - -<p>_foo_</p> - -<p> - -_foo_ -</p> - -<p> -_foo_ - -</p> diff --git a/tests/misc/mismatched-tags.html b/tests/misc/mismatched-tags.html deleted file mode 100644 index ec087e1..0000000 --- a/tests/misc/mismatched-tags.html +++ /dev/null @@ -1,11 +0,0 @@ -<p>Some text</p> - -<div>some more text</div> - -<p>and a bit more</p> -<p>And this output</p> - -<p><em>Compatible with PHP Markdown Extra 1.2.2 and Markdown.pl1.0.2b8:</em></p> -<!-- comment --><p><div>text</div><br /></p><br /> - -<p>Should be in p</p>
\ No newline at end of file diff --git a/tests/misc/mismatched-tags.txt b/tests/misc/mismatched-tags.txt deleted file mode 100644 index 8e6a52f..0000000 --- a/tests/misc/mismatched-tags.txt +++ /dev/null @@ -1,9 +0,0 @@ -<p>Some text</p><div>some more text</div> - -and a bit more - -<p>And this output</p> *Compatible with PHP Markdown Extra 1.2.2 and Markdown.pl1.0.2b8:* - -<!-- comment --><p><div>text</div><br /></p><br /> - -Should be in p diff --git a/tests/misc/more_comments.html b/tests/misc/more_comments.html deleted file mode 100644 index 97074d5..0000000 --- a/tests/misc/more_comments.html +++ /dev/null @@ -1,7 +0,0 @@ -<!--asd@asdfd.com> - -<!asd@asdfd.com> - -<asd!@asdfd.com> - -<p>Test</p>
\ No newline at end of file diff --git a/tests/misc/more_comments.txt b/tests/misc/more_comments.txt deleted file mode 100644 index 0397f9c..0000000 --- a/tests/misc/more_comments.txt +++ /dev/null @@ -1,9 +0,0 @@ -<!--asd@asdfd.com> - - -<!asd@asdfd.com> - - -<asd!@asdfd.com> - -Test diff --git a/tests/misc/multi-line-tags.html b/tests/misc/multi-line-tags.html deleted file mode 100644 index 763a050..0000000 --- a/tests/misc/multi-line-tags.html +++ /dev/null @@ -1,4 +0,0 @@ -<div> - -<p>asdf asdfasd</p> -</div>
\ No newline at end of file diff --git a/tests/misc/multi-line-tags.txt b/tests/misc/multi-line-tags.txt deleted file mode 100644 index 4ea3b02..0000000 --- a/tests/misc/multi-line-tags.txt +++ /dev/null @@ -1,6 +0,0 @@ - -<div> - -asdf asdfasd - -</div> diff --git a/tests/misc/multi-paragraph-block-quote.html b/tests/misc/multi-paragraph-block-quote.html index e13986a..f01b5e4 100644 --- a/tests/misc/multi-paragraph-block-quote.html +++ b/tests/misc/multi-paragraph-block-quote.html @@ -1,6 +1,6 @@ <blockquote> <p>This is line one of paragraph one - This is line two of paragraph one</p> +This is line two of paragraph one</p> <p>This is line one of paragraph two</p> <p>This is another blockquote.</p> </blockquote>
\ No newline at end of file diff --git a/tests/misc/multi-test.html b/tests/misc/multi-test.html index 2c8fe9e..9fe9648 100644 --- a/tests/misc/multi-test.html +++ b/tests/misc/multi-test.html @@ -1,5 +1,3 @@ -<h1 id="inthebeginning">Header </h1> -<p>Now, let's try something <em class="special">inline</em>, to see if it works</p> <p>Blah blah blah <a href="http://www.slashdot.org">http://www.slashdot.org</a></p> <ul> <li>Basic list</li> diff --git a/tests/misc/multi-test.txt b/tests/misc/multi-test.txt index c4ab1c1..feaac31 100644 --- a/tests/misc/multi-test.txt +++ b/tests/misc/multi-test.txt @@ -1,9 +1,3 @@ - -# Header {@id=inthebeginning} - -Now, let's try something *inline{@class=special}*, to see if it works - - Blah blah blah <http://www.slashdot.org> * Basic list diff --git a/tests/misc/multiline-comments.html b/tests/misc/multiline-comments.html deleted file mode 100644 index 547ba0b..0000000 --- a/tests/misc/multiline-comments.html +++ /dev/null @@ -1,16 +0,0 @@ -<!-- - -foo - ---> - -<p> - -foo - -</p> - -<div> - -<p>foo</p> -</div>
\ No newline at end of file diff --git a/tests/misc/multiline-comments.txt b/tests/misc/multiline-comments.txt deleted file mode 100644 index 71bc418..0000000 --- a/tests/misc/multiline-comments.txt +++ /dev/null @@ -1,18 +0,0 @@ -<!-- - -foo - ---> - -<p> - -foo - -</p> - - -<div> - -foo - -</div> diff --git a/tests/misc/nested-lists.html b/tests/misc/nested-lists.html index bb73784..9af441a 100644 --- a/tests/misc/nested-lists.html +++ b/tests/misc/nested-lists.html @@ -36,4 +36,17 @@ </ul> </li> <li>item 2</li> +<li>item 3</li> +<li> +<p>item 4</p> +<ul> +<li>item 4-1</li> +<li>item 4-2</li> +<li> +<p>item 4-3</p> +<p>Paragraph under item 4-3</p> +</li> +</ul> +<p>Paragraph under item 4</p> +</li> </ul>
\ No newline at end of file diff --git a/tests/misc/nested-lists.txt b/tests/misc/nested-lists.txt index 38aae15..a2704b4 100644 --- a/tests/misc/nested-lists.txt +++ b/tests/misc/nested-lists.txt @@ -22,3 +22,12 @@ plain text * item 1-2 * item 1-2-1 * item 2 +* item 3 +* item 4 + * item 4-1 + * item 4-2 + * item 4-3 + + Paragraph under item 4-3 + + Paragraph under item 4 diff --git a/tests/misc/nested-patterns.html b/tests/misc/nested-patterns.html index b90d46d..1c7bb43 100644 --- a/tests/misc/nested-patterns.html +++ b/tests/misc/nested-patterns.html @@ -1,7 +1,10 @@ -<p><strong><em><a href="http://www.freewisdom.org">link</a></em></strong> -<strong><em><a href="http://www.freewisdom.org">link</a></em></strong> -<strong><a href="http://www.freewisdom.org"><em>link</em></a></strong> -<strong><a href="http://www.freewisdom.org"><em>link</em></a></strong> -<strong><a href="http://www.freewisdom.org"><em>link</em></a></strong> -<strong><a href="http://www.freewisdom.org"><em>link</em></a></strong> -<a href="http://www.freewisdom.org"><strong><em>link</em></strong></a></p>
\ No newline at end of file +<p><strong><em><a href="http://example.com">link</a></em></strong> +<strong><em><a href="http://example.com">link</a></em></strong> +<strong><a href="http://example.com"><em>link</em></a></strong> +<strong><a href="http://example.com"><em>link</em></a></strong> +<strong><a href="http://example.com"><em>link</em></a></strong> +<strong><a href="http://example.com"><em>link</em></a></strong> +<a href="http://example.com"><strong><em>link</em></strong></a></p> +<p><strong><em>I am <strong><em>italic</em> and</strong> bold</em> I am <code>just</code> bold</strong></p> +<p>Example <strong><em>bold italic</em></strong> on the same line <strong><em>bold italic</em></strong>.</p> +<p>Example <strong><em>bold italic</em></strong> on the same line <strong><em>bold italic</em></strong>.</p>
\ No newline at end of file diff --git a/tests/misc/nested-patterns.txt b/tests/misc/nested-patterns.txt index 3f5dc3e..9032cf1 100644 --- a/tests/misc/nested-patterns.txt +++ b/tests/misc/nested-patterns.txt @@ -1,7 +1,13 @@ -___[link](http://www.freewisdom.org)___ -***[link](http://www.freewisdom.org)*** -**[*link*](http://www.freewisdom.org)** -__[_link_](http://www.freewisdom.org)__ -__[*link*](http://www.freewisdom.org)__ -**[_link_](http://www.freewisdom.org)** -[***link***](http://www.freewisdom.org) +___[link](http://example.com)___ +***[link](http://example.com)*** +**[*link*](http://example.com)** +__[_link_](http://example.com)__ +__[*link*](http://example.com)__ +**[_link_](http://example.com)** +[***link***](http://example.com) + +***I am ___italic_ and__ bold* I am `just` bold** + +Example __*bold italic*__ on the same line __*bold italic*__. + +Example **_bold italic_** on the same line **_bold italic_**. diff --git a/tests/misc/para-with-hr.html b/tests/misc/para-with-hr.html index 8569fec..7607449 100644 --- a/tests/misc/para-with-hr.html +++ b/tests/misc/para-with-hr.html @@ -1,3 +1,6 @@ <p>Here is a paragraph, followed by a horizontal rule.</p> <hr /> -<p>Followed by another paragraph.</p>
\ No newline at end of file +<p>Followed by another paragraph.</p> +<p>Here is another paragraph, followed by: +*** not an HR. +Followed by more of the same paragraph.</p>
\ No newline at end of file diff --git a/tests/misc/para-with-hr.txt b/tests/misc/para-with-hr.txt index 20735fb..165bbe3 100644 --- a/tests/misc/para-with-hr.txt +++ b/tests/misc/para-with-hr.txt @@ -2,3 +2,6 @@ Here is a paragraph, followed by a horizontal rule. *** Followed by another paragraph. +Here is another paragraph, followed by: +*** not an HR. +Followed by more of the same paragraph. diff --git a/tests/misc/php.html b/tests/misc/php.html deleted file mode 100644 index 8cd4ed5..0000000 --- a/tests/misc/php.html +++ /dev/null @@ -1,11 +0,0 @@ -<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" - "http://www.w3.org/TR/html4/strict.dtd"> - -<p><b>This should have a p tag</b></p> -<!--This is a comment --> - -<div>This shouldn't</div> - -<?php echo "block_level";?> - -<p><?php echo "not_block_level";?></p>
\ No newline at end of file diff --git a/tests/misc/php.txt b/tests/misc/php.txt deleted file mode 100644 index ca5be45..0000000 --- a/tests/misc/php.txt +++ /dev/null @@ -1,13 +0,0 @@ -<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" - "http://www.w3.org/TR/html4/strict.dtd"> - -<b>This should have a p tag</b> - -<!--This is a comment --> - -<div>This shouldn't</div> - -<?php echo "block_level";?> - - <?php echo "not_block_level";?> - diff --git a/tests/misc/pre.html b/tests/misc/pre.html deleted file mode 100644 index a44ae12..0000000 --- a/tests/misc/pre.html +++ /dev/null @@ -1,13 +0,0 @@ -<pre> - -aaa - -bbb -</pre> - -<pre> -* and this is pre-formatted content -* and it should be printed just like this -* and not formatted as a list - -</pre>
\ No newline at end of file diff --git a/tests/misc/pre.txt b/tests/misc/pre.txt deleted file mode 100644 index 31243b5..0000000 --- a/tests/misc/pre.txt +++ /dev/null @@ -1,14 +0,0 @@ -<pre> - -aaa - -bbb -</pre> - -<pre> -* and this is pre-formatted content -* and it should be printed just like this -* and not formatted as a list - -</pre> - diff --git a/tests/misc/some-test.html b/tests/misc/some-test.html index a36d1ee..b78683f 100644 --- a/tests/misc/some-test.html +++ b/tests/misc/some-test.html @@ -24,8 +24,10 @@ </ul> <p>Markdown</p> <ul> -<li>Python - is ok<ul> +<li> +<p>Python + is ok</p> +<ul> <li>Therefore i am</li> </ul> </li> diff --git a/tests/misc/tabs-in-lists.html b/tests/misc/tabs-in-lists.html index a1a92ec..fdb7cb6 100644 --- a/tests/misc/tabs-in-lists.html +++ b/tests/misc/tabs-in-lists.html @@ -19,7 +19,7 @@ <p>Now a list with 4 spaces and some text:</p> <ul> <li>A -abcdef</li> + abcdef</li> <li>B</li> </ul> <p>Now with a tab and an extra space:</p> diff --git a/tests/misc/two-spaces.html b/tests/misc/two-spaces.html index 102d1db..97b54b4 100644 --- a/tests/misc/two-spaces.html +++ b/tests/misc/two-spaces.html @@ -4,14 +4,12 @@ but this line has three <br /> and this is the second from last line in this test message</p> <ul> -<li>This list item has two spaces.<br /> -</li> +<li>This list item has two spaces. </li> <li> <p>This has none. This line has three. <br /> This line has none. - And this line two.<br /> -</p> + And this line two. </p> <p>This line has none.</p> </li> <li> diff --git a/tests/misc/uche.html b/tests/misc/uche.html index e62329d..9134e95 100644 --- a/tests/misc/uche.html +++ b/tests/misc/uche.html @@ -1,3 +1,3 @@ <p><img alt="asif" src="http://fourthought.com/images/ftlogo.png" title="Fourthought logo" /></p> -<p><a href="http://fourthought.com/"><img alt="" src="http://fourthought.com/images/ftlogo.png" style="float: left; margin: 10px; border: none;" title="Fourthought logo" /></a></p> +<p><a href="http://fourthought.com/"><img alt="Alt text" src="http://fourthought.com/images/ftlogo.png" title="Fourthought logo" /></a></p> <p><a href="http://link.com/"><img alt="text" src="x" /></a></p>
\ No newline at end of file diff --git a/tests/misc/uche.txt b/tests/misc/uche.txt index a3dda1a..625d2ae 100644 --- a/tests/misc/uche.txt +++ b/tests/misc/uche.txt @@ -1,7 +1,6 @@ ![asif](http://fourthought.com/images/ftlogo.png "Fourthought logo") -[![{@style=float: left; margin: 10px; border: -none;}](http://fourthought.com/images/ftlogo.png "Fourthought +[![Alt text](http://fourthought.com/images/ftlogo.png "Fourthought logo")](http://fourthought.com/) [![text](x)](http://link.com/) diff --git a/tests/misc/underscores.html b/tests/misc/underscores.html index 54bd9f9..72d51b8 100644 --- a/tests/misc/underscores.html +++ b/tests/misc/underscores.html @@ -1,6 +1,6 @@ <p>THIS_SHOULD_STAY_AS_IS</p> <p>Here is some <em>emphasis</em>, ok?</p> <p>Ok, at least <em>this</em> should work.</p> -<p>THIS<strong>SHOULD</strong>STAY</p> +<p>THIS__SHOULD__STAY</p> <p>Here is some <strong>strong</strong> stuff.</p> <p>THIS<strong><em>SHOULD</em></strong>STAY?</p>
\ No newline at end of file diff --git a/tests/php/Auto Links.text b/tests/php/Auto Links.text new file mode 100644 index 0000000..4b10d32 --- /dev/null +++ b/tests/php/Auto Links.text @@ -0,0 +1,3 @@ +<HTTP://WWW.SOMEURL.COM> + +<hr@company.com>
\ No newline at end of file diff --git a/tests/php/Auto Links.xhtml b/tests/php/Auto Links.xhtml new file mode 100644 index 0000000..259c47f --- /dev/null +++ b/tests/php/Auto Links.xhtml @@ -0,0 +1,3 @@ +<p><a href="HTTP://WWW.SOMEURL.COM">HTTP://WWW.SOMEURL.COM</a></p> + +<p><a href="mailto:hr@company.com">hr@company.com</a></p>
\ No newline at end of file diff --git a/tests/php/Backslash escapes.text b/tests/php/Backslash escapes.text new file mode 100644 index 0000000..a5e769b --- /dev/null +++ b/tests/php/Backslash escapes.text @@ -0,0 +1 @@ +Tricky combinaisons:
backslash with \\-- two dashes
backslash with \\> greater than
\\\[test](not a link)
\\\*no emphasis*
\ No newline at end of file diff --git a/tests/php/Backslash escapes.xhtml b/tests/php/Backslash escapes.xhtml new file mode 100644 index 0000000..08fb8ef --- /dev/null +++ b/tests/php/Backslash escapes.xhtml @@ -0,0 +1 @@ +<p>Tricky combinaisons:</p>
<p>backslash with \-- two dashes</p>
<p>backslash with \> greater than</p>
<p>\[test](not a link)</p>
<p>\*no emphasis*</p>
\ No newline at end of file diff --git a/tests/php/Code Spans.text b/tests/php/Code Spans.text new file mode 100644 index 0000000..43f2bcf --- /dev/null +++ b/tests/php/Code Spans.text @@ -0,0 +1,6 @@ +From `<!--` to `-->` +on two lines. + +From `<!--` +to `-->` +on three lines. diff --git a/tests/php/Code Spans.xhtml b/tests/php/Code Spans.xhtml new file mode 100644 index 0000000..9ed0df8 --- /dev/null +++ b/tests/php/Code Spans.xhtml @@ -0,0 +1,6 @@ +<p>From <code><!--</code> to <code>--></code> +on two lines.</p> + +<p>From <code><!--</code> +to <code>--></code> +on three lines.</p> diff --git a/tests/php/Code block in a list item.text b/tests/php/Code block in a list item.text new file mode 100644 index 0000000..5093348 --- /dev/null +++ b/tests/php/Code block in a list item.text @@ -0,0 +1,15 @@ + +* List Item: + + code block + + with a blank line + + within a list item. + +* code block + as first element of a list item + +* List Item: + + code block with whitespace on preceding line
\ No newline at end of file diff --git a/tests/php/Code block in a list item.xhtml b/tests/php/Code block in a list item.xhtml new file mode 100644 index 0000000..361c1ae --- /dev/null +++ b/tests/php/Code block in a list item.xhtml @@ -0,0 +1,18 @@ +<ul> +<li><p>List Item:</p> + +<pre><code>code block + +with a blank line +</code></pre> + +<p>within a list item.</p></li> +<li><pre><code>code block +as first element of a list item +</code></pre></li> + +<li><p>List Item:</p> + +<pre><code>code block with whitespace on preceding line +</code></pre></li> +</ul>
\ No newline at end of file diff --git a/tests/php/Code block on second line.text b/tests/php/Code block on second line.text new file mode 100644 index 0000000..b7fcd97 --- /dev/null +++ b/tests/php/Code block on second line.text @@ -0,0 +1,2 @@ + + Codeblock on second line diff --git a/tests/php/Code block on second line.xhtml b/tests/php/Code block on second line.xhtml new file mode 100644 index 0000000..25abb16 --- /dev/null +++ b/tests/php/Code block on second line.xhtml @@ -0,0 +1,2 @@ +<pre><code>Codeblock on second line +</code></pre> diff --git a/tests/php/Email auto links.text b/tests/php/Email auto links.text new file mode 100644 index 0000000..a8af4ec --- /dev/null +++ b/tests/php/Email auto links.text @@ -0,0 +1,3 @@ +<michel.fortin@michelf.com> + +International domain names: <help@tūdaliņ.lv>
\ No newline at end of file diff --git a/tests/php/Email auto links.xhtml b/tests/php/Email auto links.xhtml new file mode 100644 index 0000000..a32c408 --- /dev/null +++ b/tests/php/Email auto links.xhtml @@ -0,0 +1,3 @@ +<p><a href="mailto:michel.fortin@michelf.com">michel.fortin@michelf.com</a></p> + +<p>International domain names: <a href="mailto:help@tūdaliņ.lv">help@tūdaliņ.lv</a></p> diff --git a/tests/php/Emphasis.text b/tests/php/Emphasis.text new file mode 100644 index 0000000..88e93d4 --- /dev/null +++ b/tests/php/Emphasis.text @@ -0,0 +1,80 @@ +Combined emphasis: + +1. ***test test*** +2. ___test test___ +3. *test **test*** +4. **test *test*** +5. ***test* test** +6. ***test** test* +7. ***test* test** +8. **test *test*** +9. *test **test*** +10. _test __test___ +11. __test _test___ +12. ___test_ test__ +13. ___test__ test_ +14. ___test_ test__ +15. __test _test___ +16. _test __test___ + + +Incorrect nesting: + +1. *test **test* test** +2. _test __test_ test__ +3. **test *test** test* +4. __test _test__ test_ +5. *test *test* test* +6. _test _test_ test_ +7. **test **test** test** +8. __test __test__ test__ + + + +No emphasis: + +1. test* test *test +2. test** test **test +3. test_ test _test +4. test__ test __test + + + +Middle-word emphasis (asterisks): + +1. *a*b +2. a*b* +3. a*b*c +4. **a**b +5. a**b** +6. a**b**c + + +Middle-word emphasis (underscore): + +1. _a_b +2. a_b_ +3. a_b_c +4. __a__b +5. a__b__ +6. a__b__c + +my_precious_file.txt + + +## Tricky Cases + +E**. **Test** TestTestTest + +E**. **Test** Test Test Test + + +## Overlong emphasis + +Name: ____________ +Organization: ____ +Region/Country: __ + +_____Cut here_____ + +____Cut here____ diff --git a/tests/php/Emphasis.xhtml b/tests/php/Emphasis.xhtml new file mode 100644 index 0000000..4879070 --- /dev/null +++ b/tests/php/Emphasis.xhtml @@ -0,0 +1,83 @@ +<p>Combined emphasis:</p> + +<ol> +<li><strong><em>test test</em></strong></li> +<li><strong><em>test test</em></strong></li> +<li><em>test <strong>test</strong></em></li> +<li><strong>test <em>test</em></strong></li> +<li><strong><em>test</em> test</strong></li> +<li><em><strong>test</strong> test</em></li> +<li><strong><em>test</em> test</strong></li> +<li><strong>test <em>test</em></strong></li> +<li><em>test <strong>test</strong></em></li> +<li><em>test <strong>test</strong></em></li> +<li><strong>test <em>test</em></strong></li> +<li><strong><em>test</em> test</strong></li> +<li><em><strong>test</strong> test</em></li> +<li><strong><em>test</em> test</strong></li> +<li><strong>test <em>test</em></strong></li> +<li><em>test <strong>test</strong></em></li> +</ol> + +<p>Incorrect nesting:</p> + +<ol> +<li>*test <strong>test* test</strong></li> +<li>_test <strong>test_ test</strong></li> +<li><strong>test *test</strong> test*</li> +<li><strong>test _test</strong> test_</li> +<li><em>test *test</em> test*</li> +<li><em>test _test</em> test_</li> +<li><strong>test **test</strong> test**</li> +<li><strong>test __test</strong> test__</li> +</ol> + +<p>No emphasis:</p> + +<ol> +<li>test* test *test</li> +<li>test** test **test</li> +<li>test_ test _test</li> +<li>test__ test __test</li> +</ol> + +<p>Middle-word emphasis (asterisks):</p> + +<ol> +<li><em>a</em>b</li> +<li>a<em>b</em></li> +<li>a<em>b</em>c</li> +<li><strong>a</strong>b</li> +<li>a<strong>b</strong></li> +<li>a<strong>b</strong>c</li> +</ol> + +<p>Middle-word emphasis (underscore):</p> + +<ol> +<li><em>a</em>b</li> +<li>a<em>b</em></li> +<li>a<em>b</em>c</li> +<li><strong>a</strong>b</li> +<li>a<strong>b</strong></li> +<li>a<strong>b</strong>c</li> +</ol> + +<p>my<em>precious</em>file.txt</p> + +<h2>Tricky Cases</h2> + +<p>E**. <strong>Test</strong> TestTestTest</p> + +<p>E**. <strong>Test</strong> Test Test Test</p> + + +<h2>Overlong emphasis</h2> + +<p>Name: ____________<br /> +Organization: ____<br /> +Region/Country: __</p> + +<p>_____Cut here_____</p> + +<p>____Cut here____</p>
\ No newline at end of file diff --git a/tests/php/Empty List Item.text b/tests/php/Empty List Item.text new file mode 100644 index 0000000..3c4edba --- /dev/null +++ b/tests/php/Empty List Item.text @@ -0,0 +1,35 @@ +With asterisks + + * List item + * + * List item + +With numbers + +1. List item +2. +3. List item + +With hyphens + +- List item +- +- List item + +With asterisks + + * List item + * List item + * + +With numbers + +1. List item +2. List item +3. + +With hyphens + +- List item +- List item +- diff --git a/tests/php/Empty List Item.xhtml b/tests/php/Empty List Item.xhtml new file mode 100644 index 0000000..02d86ed --- /dev/null +++ b/tests/php/Empty List Item.xhtml @@ -0,0 +1,47 @@ +<p>With asterisks</p> + +<ul> +<li>List item</li> +<li></li> +<li>List item</li> +</ul> + +<p>With numbers</p> + +<ol> +<li>List item</li> +<li></li> +<li>List item</li> +</ol> + +<p>With hyphens</p> + +<ul> +<li>List item</li> +<li></li> +<li>List item</li> +</ul> + +<p>With asterisks</p> + +<ul> +<li>List item</li> +<li>List item</li> +<li></li> +</ul> + +<p>With numbers</p> + +<ol> +<li>List item</li> +<li>List item</li> +<li></li> +</ol> + +<p>With hyphens</p> + +<ul> +<li>List item</li> +<li>List item</li> +<li></li> +</ul>
\ No newline at end of file diff --git a/tests/php/Headers.text b/tests/php/Headers.text new file mode 100644 index 0000000..3a39174 --- /dev/null +++ b/tests/php/Headers.text @@ -0,0 +1,9 @@ +Header
======
Header
------
### Header + + - - - + +Header
======
Paragraph
Header
------
Paragraph
### Header
Paragraph + + - - - + +Paragraph
Header
======
Paragraph
Paragraph
Header
------
Paragraph
Paragraph
### Header
Paragraph
\ No newline at end of file diff --git a/tests/php/Headers.xhtml b/tests/php/Headers.xhtml new file mode 100644 index 0000000..3adb470 --- /dev/null +++ b/tests/php/Headers.xhtml @@ -0,0 +1,39 @@ +<h1>Header</h1> + +<h2>Header</h2> + +<h3>Header</h3> + +<hr /> + +<h1>Header</h1> + +<p>Paragraph</p> + +<h2>Header</h2> + +<p>Paragraph</p> + +<h3>Header</h3> + +<p>Paragraph</p> + +<hr /> + +<p>Paragraph</p> + +<h1>Header</h1> + +<p>Paragraph</p> + +<p>Paragraph</p> + +<h2>Header</h2> + +<p>Paragraph</p> + +<p>Paragraph</p> + +<h3>Header</h3> + +<p>Paragraph</p> diff --git a/tests/php/Horizontal Rules.text b/tests/php/Horizontal Rules.text new file mode 100644 index 0000000..8e2da0b --- /dev/null +++ b/tests/php/Horizontal Rules.text @@ -0,0 +1,29 @@ +Horizontal rules: + +- - - + +* * * + +*** + +--- + +___ + +Not horizontal rules (testing for a bug in 1.0.1j): + ++++ + +,,, + +=== + +??? + +AAA + +jjj + +j j j + +n n n diff --git a/tests/php/Horizontal Rules.xhtml b/tests/php/Horizontal Rules.xhtml new file mode 100644 index 0000000..b9170b1 --- /dev/null +++ b/tests/php/Horizontal Rules.xhtml @@ -0,0 +1,30 @@ +<p>Horizontal rules:</p> + +<hr /> + +<hr /> + +<hr /> + +<hr /> + +<hr /> + +<p>Not horizontal rules (testing for a bug in 1.0.1j):</p> + +<p>+++</p> + +<p>,,,</p> + +<p>===</p> + +<p>???</p> + +<p>AAA</p> + +<p>jjj</p> + +<p>j j j</p> + +<p>n n n</p> + diff --git a/tests/php/Inline HTML (Simple).text b/tests/php/Inline HTML (Simple).text new file mode 100644 index 0000000..9177105 --- /dev/null +++ b/tests/php/Inline HTML (Simple).text @@ -0,0 +1,15 @@ +With some attributes: + +<div id="test"> + foo +</div> + +<div id="test" + class="nono"> + foo +</div> + +Hr's: + +<hr class="foo" + id="bar" > diff --git a/tests/php/Inline HTML (Simple).xhtml b/tests/php/Inline HTML (Simple).xhtml new file mode 100644 index 0000000..facfefb --- /dev/null +++ b/tests/php/Inline HTML (Simple).xhtml @@ -0,0 +1,15 @@ +<p>With some attributes:</p> + +<div id="test"> + foo +</div> + +<div id="test" + class="nono"> + foo +</div> + +<p>Hr's:</p> + +<hr class="foo" + id="bar" >
\ No newline at end of file diff --git a/tests/php/Inline HTML (Span).text b/tests/php/Inline HTML (Span).text new file mode 100644 index 0000000..19028bb --- /dev/null +++ b/tests/php/Inline HTML (Span).text @@ -0,0 +1,4 @@ +<abbr title="` **Attribute Content Is Not A Code Span** `">ACINACS</abbr> + +<abbr title="`first backtick!">SB</abbr> +<abbr title="`second backtick!">SB</abbr>
\ No newline at end of file diff --git a/tests/php/Inline HTML (Span).xhtml b/tests/php/Inline HTML (Span).xhtml new file mode 100644 index 0000000..4d18aff --- /dev/null +++ b/tests/php/Inline HTML (Span).xhtml @@ -0,0 +1,4 @@ +<p><abbr title="` **Attribute Content Is Not A Code Span** `">ACINACS</abbr></p> + +<p><abbr title="`first backtick!">SB</abbr> +<abbr title="`second backtick!">SB</abbr></p>
\ No newline at end of file diff --git a/tests/php/Inline HTML comments.text b/tests/php/Inline HTML comments.text new file mode 100644 index 0000000..d57d00a --- /dev/null +++ b/tests/php/Inline HTML comments.text @@ -0,0 +1,9 @@ +Paragraph one. + +<!-- double--dash (invalid SGML comment) --> + +Paragraph two. + +<!-- enclosed tag </div> --> + +The end. diff --git a/tests/php/Inline HTML comments.xhtml b/tests/php/Inline HTML comments.xhtml new file mode 100644 index 0000000..b45f014 --- /dev/null +++ b/tests/php/Inline HTML comments.xhtml @@ -0,0 +1,9 @@ +<p>Paragraph one.</p> + +<!-- double--dash (invalid SGML comment) --> + +<p>Paragraph two.</p> + +<!-- enclosed tag </div> --> + +<p>The end.</p> diff --git a/tests/php/Ins & del.text b/tests/php/Ins & del.text new file mode 100644 index 0000000..2d54c66 --- /dev/null +++ b/tests/php/Ins & del.text @@ -0,0 +1,17 @@ +Here is a block tag ins: + +<ins> +<p>Some text</p> +</ins> + +<ins>And here it is inside a paragraph.</ins> + +And here it is <ins>in the middle of</ins> a paragraph. + +<del> +<p>Some text</p> +</del> + +<del>And here is ins as a paragraph.</del> + +And here it is <del>in the middle of</del> a paragraph. diff --git a/tests/php/Ins & del.xhtml b/tests/php/Ins & del.xhtml new file mode 100644 index 0000000..60e8c5f --- /dev/null +++ b/tests/php/Ins & del.xhtml @@ -0,0 +1,17 @@ +<p>Here is a block tag ins:</p> + +<ins> +<p>Some text</p> +</ins> + +<p><ins>And here it is inside a paragraph.</ins></p> + +<p>And here it is <ins>in the middle of</ins> a paragraph.</p> + +<del> +<p>Some text</p> +</del> + +<p><del>And here is ins as a paragraph.</del></p> + +<p>And here it is <del>in the middle of</del> a paragraph.</p> diff --git a/tests/php/License b/tests/php/License new file mode 100644 index 0000000..d511905 --- /dev/null +++ b/tests/php/License @@ -0,0 +1,339 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Lesser General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + <one line to give the program's name and a brief idea of what it does.> + Copyright (C) <year> <name of author> + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + <signature of Ty Coon>, 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. diff --git a/tests/php/Links, inline style.text b/tests/php/Links, inline style.text new file mode 100644 index 0000000..600a044 --- /dev/null +++ b/tests/php/Links, inline style.text @@ -0,0 +1 @@ +[silly URL w/ angle brackets](<?}]*+|&)>). diff --git a/tests/php/Links, inline style.xhtml b/tests/php/Links, inline style.xhtml new file mode 100644 index 0000000..d3e4d11 --- /dev/null +++ b/tests/php/Links, inline style.xhtml @@ -0,0 +1 @@ +<p><a href="?}]*+|&)">silly URL w/ angle brackets</a>.</p> diff --git a/tests/php/MD5 Hashes.text b/tests/php/MD5 Hashes.text new file mode 100644 index 0000000..7e03221 --- /dev/null +++ b/tests/php/MD5 Hashes.text @@ -0,0 +1,11 @@ +# Character Escapes + +The MD5 value for `+` is "26b17225b626fb9238849fd60eabdf60". + +# HTML Blocks + +<p>test</p> + +The MD5 value for `<p>test</p>` is: + +6205333b793f34273d75379350b36826
\ No newline at end of file diff --git a/tests/php/MD5 Hashes.xhtml b/tests/php/MD5 Hashes.xhtml new file mode 100644 index 0000000..894e4aa --- /dev/null +++ b/tests/php/MD5 Hashes.xhtml @@ -0,0 +1,11 @@ +<h1>Character Escapes</h1> + +<p>The MD5 value for <code>+</code> is "26b17225b626fb9238849fd60eabdf60".</p> + +<h1>HTML Blocks</h1> + +<p>test</p> + +<p>The MD5 value for <code><p>test</p></code> is:</p> + +<p>6205333b793f34273d75379350b36826</p> diff --git a/tests/php/Mixed OLs and ULs.text b/tests/php/Mixed OLs and ULs.text new file mode 100644 index 0000000..cecde21 --- /dev/null +++ b/tests/php/Mixed OLs and ULs.text @@ -0,0 +1,13 @@ +* test ++ test +- test + +1. test +2. test + +* test ++ test +- test + +1. test +2. test diff --git a/tests/php/Mixed OLs and ULs.xhtml b/tests/php/Mixed OLs and ULs.xhtml new file mode 100644 index 0000000..0872aaa --- /dev/null +++ b/tests/php/Mixed OLs and ULs.xhtml @@ -0,0 +1,21 @@ +<ul> +<li>test</li> +<li>test</li> +<li>test</li> +</ul> + +<ol> +<li>test</li> +<li>test</li> +</ol> + +<ul> +<li>test</li> +<li>test</li> +<li>test</li> +</ul> + +<ol> +<li>test</li> +<li>test</li> +</ol> diff --git a/tests/php/Nesting.text b/tests/php/Nesting.text new file mode 100644 index 0000000..791538c --- /dev/null +++ b/tests/php/Nesting.text @@ -0,0 +1,11 @@ +Valid nesting: + +**[Link](url)** + +[**Link**](url) + +**[**Link**](url)** + +Invalid nesting: + +[[Link](url)](url)
\ No newline at end of file diff --git a/tests/php/Nesting.xhtml b/tests/php/Nesting.xhtml new file mode 100644 index 0000000..37845d3 --- /dev/null +++ b/tests/php/Nesting.xhtml @@ -0,0 +1,11 @@ +<p>Valid nesting:</p> + +<p><strong><a href="url">Link</a></strong></p> + +<p><a href="url"><strong>Link</strong></a></p> + +<p><strong><a href="url"><strong>Link</strong></a></strong></p> + +<p>Invalid nesting:</p> + +<p><a href="url">[Link](url)</a></p> diff --git a/tests/php/PHP-Specific Bugs.text b/tests/php/PHP-Specific Bugs.text new file mode 100644 index 0000000..246b60d --- /dev/null +++ b/tests/php/PHP-Specific Bugs.text @@ -0,0 +1,22 @@ +This tests for a bug where quotes escaped by PHP when using +`preg_replace` with the `/e` modifier must be correctly unescaped +(hence the `_UnslashQuotes` function found only in PHP Markdown). + + + +Headers below should appear exactly as they are typed (no backslash +added or removed). + +Header "quoted\" again \\"" +=========================== + +Header "quoted\" again \\"" +--------------------------- + +### Header "quoted\" again \\"" ### + + + +Test with tabs for `_Detab`: + + Code 'block' with some "tabs" and "quotes" diff --git a/tests/php/PHP-Specific Bugs.xhtml b/tests/php/PHP-Specific Bugs.xhtml new file mode 100644 index 0000000..c982417 --- /dev/null +++ b/tests/php/PHP-Specific Bugs.xhtml @@ -0,0 +1,17 @@ +<p>This tests for a bug where quotes escaped by PHP when using +<code>preg_replace</code> with the <code>/e</code> modifier must be correctly unescaped +(hence the <code>_UnslashQuotes</code> function found only in PHP Markdown).</p> + +<p>Headers below should appear exactly as they are typed (no backslash +added or removed).</p> + +<h1>Header "quoted\" again \""</h1> + +<h2>Header "quoted\" again \""</h2> + +<h3>Header "quoted\" again \""</h3> + +<p>Test with tabs for <code>_Detab</code>:</p> + +<pre><code>Code 'block' with some "tabs" and "quotes" +</code></pre> diff --git a/tests/php/Parens in URL.text b/tests/php/Parens in URL.text new file mode 100644 index 0000000..bb7be4f --- /dev/null +++ b/tests/php/Parens in URL.text @@ -0,0 +1,14 @@ +[Inline link 1 with parens](/url\(test\) "title"). + +[Inline link 2 with parens](</url\(test\)> "title"). + +[Inline link 3 with non-escaped parens](/url(test) "title"). + +[Inline link 4 with non-escaped parens](</url(test)> "title"). + +[Reference link 1 with parens][1]. + +[Reference link 2 with parens][2]. + + [1]: /url(test) "title" + [2]: </url(test)> "title" diff --git a/tests/php/Parens in URL.xhtml b/tests/php/Parens in URL.xhtml new file mode 100644 index 0000000..a81aa02 --- /dev/null +++ b/tests/php/Parens in URL.xhtml @@ -0,0 +1,11 @@ +<p><a href="/url(test)" title="title">Inline link 1 with parens</a>.</p> + +<p><a href="/url(test)" title="title">Inline link 2 with parens</a>.</p> + +<p><a href="/url(test)" title="title">Inline link 3 with non-escaped parens</a>.</p> + +<p><a href="/url(test)" title="title">Inline link 4 with non-escaped parens</a>.</p> + +<p><a href="/url(test)" title="title">Reference link 1 with parens</a>.</p> + +<p><a href="/url(test)" title="title">Reference link 2 with parens</a>.</p>
\ No newline at end of file diff --git a/tests/php/Quotes in attributes.text b/tests/php/Quotes in attributes.text new file mode 100644 index 0000000..9792286 --- /dev/null +++ b/tests/php/Quotes in attributes.text @@ -0,0 +1,5 @@ +[Test](/"style="color:red) +[Test](/'style='color:red) + +![](/"style="border-color:red;border-size:1px;border-style:solid) +![](/'style='border-color:red;border-size:1px;border-style:solid) diff --git a/tests/php/Quotes in attributes.xhtml b/tests/php/Quotes in attributes.xhtml new file mode 100644 index 0000000..e3fcfd2 --- /dev/null +++ b/tests/php/Quotes in attributes.xhtml @@ -0,0 +1,5 @@ +<p><a href="/"style="color:red">Test</a> +<a href="/'style='color:red">Test</a></p> + +<p><img src="/"style="border-color:red;border-size:1px;border-style:solid" alt="" /> +<img src="/'style='border-color:red;border-size:1px;border-style:solid" alt="" /></p> diff --git a/tests/php/Tight blocks.text b/tests/php/Tight blocks.text new file mode 100644 index 0000000..ae4cdcb --- /dev/null +++ b/tests/php/Tight blocks.text @@ -0,0 +1 @@ +Paragraph and no space:
* ciao
Paragraph and 1 space:
* ciao
Paragraph and 3 spaces:
* ciao
Paragraph and 4 spaces:
* ciao
Paragraph before header:
#Header
Paragraph before blockquote:
>Some quote.
\ No newline at end of file diff --git a/tests/php/Tight blocks.xhtml b/tests/php/Tight blocks.xhtml new file mode 100644 index 0000000..8655430 --- /dev/null +++ b/tests/php/Tight blocks.xhtml @@ -0,0 +1,21 @@ +<p>Paragraph and no space: +* ciao</p> + +<p>Paragraph and 1 space: + * ciao</p> + +<p>Paragraph and 3 spaces: + * ciao</p> + +<p>Paragraph and 4 spaces: + * ciao</p> + +<p>Paragraph before header:</p> + +<h1>Header</h1> + +<p>Paragraph before blockquote:</p> + +<blockquote> + <p>Some quote.</p> +</blockquote> diff --git a/tests/php/extra/Abbr.text b/tests/php/extra/Abbr.text new file mode 100644 index 0000000..ae72f4e --- /dev/null +++ b/tests/php/extra/Abbr.text @@ -0,0 +1,31 @@ +Some text about HTML, SGML and HTML4. + +Let's talk about the U.S.A., (É.U. or É.-U. d'A. in French). + +*[HTML4]: Hyper Text Markup Language version 4 +*[HTML]: Hyper Text Markup Language +*[SGML]: Standard Generalized Markup Language +*[U.S.A.]: United States of America +*[É.U.] : États-Unis d'Amérique +*[É.-U. d'A.] : États-Unis d'Amérique + +And here we have a CD, some CDs, and some other CD's. + +*[CD]: Compact Disk + +Let's transfert documents through TCP/IP, using TCP packets. + +*[IP]: Internet Protocol +*[TCP]: Transmission Control Protocol + + --- + +Bienvenue sur [CMS](http://www.bidulecms.com "Bidule CMS"). + +*[CMS]: Content Management System + + --- + +ATCCE + +*[ATCCE]: Abbreviation "Testing" Correct 'Character' < Escapes >
\ No newline at end of file diff --git a/tests/php/extra/Abbr.xhtml b/tests/php/extra/Abbr.xhtml new file mode 100644 index 0000000..8beaa2e --- /dev/null +++ b/tests/php/extra/Abbr.xhtml @@ -0,0 +1,15 @@ +<p>Some text about <abbr title="Hyper Text Markup Language">HTML</abbr>, <abbr title="Standard Generalized Markup Language">SGML</abbr> and <abbr title="Hyper Text Markup Language version 4">HTML4</abbr>.</p> + +<p>Let's talk about the <abbr title="United States of America">U.S.A.</abbr>, (<abbr title="États-Unis d'Amérique">É.U.</abbr> or <abbr title="États-Unis d'Amérique">É.-U. d'A.</abbr> in French).</p> + +<p>And here we have a <abbr title="Compact Disk">CD</abbr>, some CDs, and some other <abbr title="Compact Disk">CD</abbr>'s.</p> + +<p>Let's transfert documents through <abbr title="Transmission Control Protocol">TCP</abbr>/<abbr title="Internet Protocol">IP</abbr>, using <abbr title="Transmission Control Protocol">TCP</abbr> packets.</p> + +<hr /> + +<p>Bienvenue sur <a href="http://www.bidulecms.com" title="Bidule CMS"><abbr title="Content Management System">CMS</abbr></a>.</p> + +<hr /> + +<p><abbr title="Abbreviation "Testing" Correct 'Character' < Escapes >">ATCCE</abbr></p> diff --git a/tests/php/extra/Definition Lists.text b/tests/php/extra/Definition Lists.text new file mode 100644 index 0000000..5b3bdb6 --- /dev/null +++ b/tests/php/extra/Definition Lists.text @@ -0,0 +1,115 @@ +A simple definition list: + +Term 1 +: Definition 1 + +Term 2 +: Definition 2 + +With multiple terms: + +Term 1 +Term 2 +: Definition 1 + +Term 3 +Term 4 +: Definition 2 + +With multiple definitions: + +Term 1 +: Definition 1 +: Definition 2 + +Term 2 +: Definition 3 +: Definition 4 + +With multiple lines per definition: + +Term 1 +: Definition 1 line 1 ... +Definition 1 line 2 +: Definition 2 line 1 ... +Definition 2 line 2 + +Term 2 +: Definition 3 line 2 ... + Definition 3 line 2 +: Definition 4 line 2 ... + Definition 4 line 2 + +With paragraphs: + +Term 1 + +: Definition 1 (paragraph) + +Term 2 + +: Definition 2 (paragraph) + +With multiple paragraphs: + +Term 1 + +: Definition 1 paragraph 1 line 1 ... + Definition 1 paragraph 1 line 2 + + Definition 1 paragraph 2 line 1 ... + Definition 1 paragraph 2 line 2 + +Term 2 + +: Definition 1 paragraph 1 line 1 ... +Definition 1 paragraph 1 line 2 (lazy) + + Definition 1 paragraph 2 line 1 ... +Definition 1 paragraph 2 line 2 (lazy) + +* * * + +A mix: + +Term 1 +Term 2 + +: Definition 1 paragraph 1 line 1 ... +Definition 1 paragraph 1 line 2 (lazy) + + Definition 1 paragraph 2 line 1 ... + Definition 1 paragraph 2 line 2 + +: Definition 2 paragraph 1 line 1 ... +Definition 2 paragraph 1 line 2 (lazy) + +Term 3 +: Definition 3 (no paragraph) +: Definition 4 (no paragraph) +: Definition 5 line 1 ... + Definition 5 line 2 (no paragraph) + +: Definition 6 paragraph 1 line 1 ... +Definition 6 paragraph 1 line 2 +: Definition 7 (no paragraph) +: Definition 8 paragraph 1 line 1 (forced paragraph) ... + Definition 8 paragraph 1 line 2 + + Definition 8 paragraph 2 line 1 + +Term 4 +: Definition 9 paragraph 1 line 1 (forced paragraph) ... + Definition 9 paragraph 1 line 2 + + Definition 9 paragraph 2 line 1 +: Definition 10 (no paragraph) + +* * * + +Special cases: + +Term + +: code block + as first element of a definition
\ No newline at end of file diff --git a/tests/php/extra/Definition Lists.xhtml b/tests/php/extra/Definition Lists.xhtml new file mode 100644 index 0000000..f99f456 --- /dev/null +++ b/tests/php/extra/Definition Lists.xhtml @@ -0,0 +1,155 @@ +<p>A simple definition list:</p> + +<dl> +<dt>Term 1</dt> +<dd>Definition 1</dd> + +<dt>Term 2</dt> +<dd>Definition 2</dd> +</dl> + +<p>With multiple terms:</p> + +<dl> +<dt>Term 1</dt> +<dt>Term 2</dt> +<dd>Definition 1</dd> + +<dt>Term 3</dt> +<dt>Term 4</dt> +<dd>Definition 2</dd> +</dl> + +<p>With multiple definitions:</p> + +<dl> +<dt>Term 1</dt> +<dd>Definition 1</dd> + +<dd>Definition 2</dd> + +<dt>Term 2</dt> +<dd>Definition 3</dd> + +<dd>Definition 4</dd> +</dl> + +<p>With multiple lines per definition:</p> + +<dl> +<dt>Term 1</dt> +<dd>Definition 1 line 1 ... +Definition 1 line 2</dd> + +<dd>Definition 2 line 1 ... +Definition 2 line 2</dd> + +<dt>Term 2</dt> +<dd>Definition 3 line 2 ... +Definition 3 line 2</dd> + +<dd>Definition 4 line 2 ... +Definition 4 line 2</dd> +</dl> + +<p>With paragraphs:</p> + +<dl> +<dt>Term 1</dt> +<dd> +<p>Definition 1 (paragraph)</p> +</dd> + +<dt>Term 2</dt> +<dd> +<p>Definition 2 (paragraph)</p> +</dd> +</dl> + +<p>With multiple paragraphs:</p> + +<dl> +<dt>Term 1</dt> +<dd> +<p>Definition 1 paragraph 1 line 1 ... +Definition 1 paragraph 1 line 2</p> + +<p>Definition 1 paragraph 2 line 1 ... +Definition 1 paragraph 2 line 2</p> +</dd> + +<dt>Term 2</dt> +<dd> +<p>Definition 1 paragraph 1 line 1 ... +Definition 1 paragraph 1 line 2 (lazy)</p> + +<p>Definition 1 paragraph 2 line 1 ... +Definition 1 paragraph 2 line 2 (lazy)</p> +</dd> +</dl> + +<hr /> + +<p>A mix:</p> + +<dl> +<dt>Term 1</dt> +<dt>Term 2</dt> +<dd> +<p>Definition 1 paragraph 1 line 1 ... +Definition 1 paragraph 1 line 2 (lazy)</p> + +<p>Definition 1 paragraph 2 line 1 ... +Definition 1 paragraph 2 line 2</p> +</dd> + +<dd> +<p>Definition 2 paragraph 1 line 1 ... +Definition 2 paragraph 1 line 2 (lazy)</p> +</dd> + +<dt>Term 3</dt> +<dd>Definition 3 (no paragraph)</dd> + +<dd>Definition 4 (no paragraph)</dd> + +<dd>Definition 5 line 1 ... +Definition 5 line 2 (no paragraph)</dd> + +<dd> +<p>Definition 6 paragraph 1 line 1 ... +Definition 6 paragraph 1 line 2</p> +</dd> + +<dd>Definition 7 (no paragraph)</dd> + +<dd> +<p>Definition 8 paragraph 1 line 1 (forced paragraph) ... +Definition 8 paragraph 1 line 2</p> + +<p>Definition 8 paragraph 2 line 1</p> +</dd> + +<dt>Term 4</dt> +<dd> +<p>Definition 9 paragraph 1 line 1 (forced paragraph) ... +Definition 9 paragraph 1 line 2</p> + +<p>Definition 9 paragraph 2 line 1</p> +</dd> + +<dd>Definition 10 (no paragraph)</dd> +</dl> + +<hr /> + +<p>Special cases:</p> + +<dl> +<dt>Term</dt> +<dd> +<pre><code>code block +as first element of a definition +</code></pre> +</dd> +</dl> diff --git a/tests/php/extra/Emphasis.text b/tests/php/extra/Emphasis.text new file mode 100644 index 0000000..88e93d4 --- /dev/null +++ b/tests/php/extra/Emphasis.text @@ -0,0 +1,80 @@ +Combined emphasis: + +1. ***test test*** +2. ___test test___ +3. *test **test*** +4. **test *test*** +5. ***test* test** +6. ***test** test* +7. ***test* test** +8. **test *test*** +9. *test **test*** +10. _test __test___ +11. __test _test___ +12. ___test_ test__ +13. ___test__ test_ +14. ___test_ test__ +15. __test _test___ +16. _test __test___ + + +Incorrect nesting: + +1. *test **test* test** +2. _test __test_ test__ +3. **test *test** test* +4. __test _test__ test_ +5. *test *test* test* +6. _test _test_ test_ +7. **test **test** test** +8. __test __test__ test__ + + + +No emphasis: + +1. test* test *test +2. test** test **test +3. test_ test _test +4. test__ test __test + + + +Middle-word emphasis (asterisks): + +1. *a*b +2. a*b* +3. a*b*c +4. **a**b +5. a**b** +6. a**b**c + + +Middle-word emphasis (underscore): + +1. _a_b +2. a_b_ +3. a_b_c +4. __a__b +5. a__b__ +6. a__b__c + +my_precious_file.txt + + +## Tricky Cases + +E**. **Test** TestTestTest + +E**. **Test** Test Test Test + + +## Overlong emphasis + +Name: ____________ +Organization: ____ +Region/Country: __ + +_____Cut here_____ + +____Cut here____ diff --git a/tests/php/extra/Emphasis.xhtml b/tests/php/extra/Emphasis.xhtml new file mode 100644 index 0000000..1fa8218 --- /dev/null +++ b/tests/php/extra/Emphasis.xhtml @@ -0,0 +1,83 @@ +<p>Combined emphasis:</p> + +<ol> +<li><strong><em>test test</em></strong></li> +<li><strong><em>test test</em></strong></li> +<li><em>test <strong>test</strong></em></li> +<li><strong>test <em>test</em></strong></li> +<li><strong><em>test</em> test</strong></li> +<li><em><strong>test</strong> test</em></li> +<li><strong><em>test</em> test</strong></li> +<li><strong>test <em>test</em></strong></li> +<li><em>test <strong>test</strong></em></li> +<li><em>test <strong>test</strong></em></li> +<li><strong>test <em>test</em></strong></li> +<li><strong><em>test</em> test</strong></li> +<li><em><strong>test</strong> test</em></li> +<li><strong><em>test</em> test</strong></li> +<li><strong>test <em>test</em></strong></li> +<li><em>test <strong>test</strong></em></li> +</ol> + +<p>Incorrect nesting:</p> + +<ol> +<li>*test <strong>test* test</strong></li> +<li>_test <strong>test_ test</strong></li> +<li><strong>test *test</strong> test*</li> +<li><strong>test _test</strong> test_</li> +<li><em>test *test</em> test*</li> +<li><em>test _test</em> test_</li> +<li><strong>test **test</strong> test**</li> +<li><strong>test __test</strong> test__</li> +</ol> + +<p>No emphasis:</p> + +<ol> +<li>test* test *test</li> +<li>test** test **test</li> +<li>test_ test _test</li> +<li>test__ test __test</li> +</ol> + +<p>Middle-word emphasis (asterisks):</p> + +<ol> +<li><em>a</em>b</li> +<li>a<em>b</em></li> +<li>a<em>b</em>c</li> +<li><strong>a</strong>b</li> +<li>a<strong>b</strong></li> +<li>a<strong>b</strong>c</li> +</ol> + +<p>Middle-word emphasis (underscore):</p> + +<ol> +<li>_a_b</li> +<li>a_b_</li> +<li>a_b_c</li> +<li>__a__b</li> +<li>a__b__</li> +<li>a__b__c</li> +</ol> + +<p>my_precious_file.txt</p> + +<h2>Tricky Cases</h2> + +<p>E**. <strong>Test</strong> TestTestTest</p> + +<p>E**. <strong>Test</strong> Test Test Test</p> + + +<h2>Overlong emphasis</h2> + +<p>Name: ____________<br /> +Organization: ____<br /> +Region/Country: __</p> + +<p>_____Cut here_____</p> + +<p>____Cut here____</p> diff --git a/tests/php/extra/Fenced Code Blocks.text b/tests/php/extra/Fenced Code Blocks.text new file mode 100644 index 0000000..f2400ff --- /dev/null +++ b/tests/php/extra/Fenced Code Blocks.text @@ -0,0 +1,60 @@ +~~~ +Fenced +~~~ + +Code block starting and ending with empty lines: +~~~ + + +Fenced + + +~~~ + +Indented code block containing fenced code block sample: + + ~~~ + Fenced + ~~~ + +Fenced code block with indented code block sample: + +~~~ +Some text + + Indented code block sample code +~~~ + +Fenced code block with long markers: + +~~~~~~~~~~~~~~~~~~ +Fenced +~~~~~~~~~~~~~~~~~~ + +Fenced code block with fenced code block markers of different length in it: + +~~~~ +In code block +~~~ +Still in code block +~~~~~ +Still in code block +~~~~ + +Fenced code block with Markdown header and horizontal rule: + +~~~ +#test +--- +~~~ + +Fenced code block with link definitions, footnote definition and +abbreviation definitions: + +~~~ +[example]: http://example.com/ + +[^1]: Footnote def + +*[HTML]: HyperText Markup Language +~~~
\ No newline at end of file diff --git a/tests/php/extra/Fenced Code Blocks.xhtml b/tests/php/extra/Fenced Code Blocks.xhtml new file mode 100644 index 0000000..518908c --- /dev/null +++ b/tests/php/extra/Fenced Code Blocks.xhtml @@ -0,0 +1,53 @@ +<pre><code>Fenced +</code></pre> + +<p>Code block starting and ending with empty lines:</p> + +<pre><code><br /><br />Fenced + + +</code></pre> + +<p>Indented code block containing fenced code block sample:</p> + +<pre><code>~~~ +Fenced +~~~ +</code></pre> + +<p>Fenced code block with indented code block sample:</p> + +<pre><code>Some text + + Indented code block sample code +</code></pre> + +<p>Fenced code block with long markers:</p> + +<pre><code>Fenced +</code></pre> + +<p>Fenced code block with fenced code block markers of different length in it:</p> + +<pre><code>In code block +~~~ +Still in code block +~~~~~ +Still in code block +</code></pre> + +<p>Fenced code block with Markdown header and horizontal rule:</p> + +<pre><code>#test +--- +</code></pre> + +<p>Fenced code block with link definitions, footnote definition and +abbreviation definitions:</p> + +<pre><code>[example]: http://example.com/ + +[^1]: Footnote def + +*[HTML]: HyperText Markup Language +</code></pre> diff --git a/tests/php/extra/Footnotes.text b/tests/php/extra/Footnotes.text new file mode 100644 index 0000000..40192e9 --- /dev/null +++ b/tests/php/extra/Footnotes.text @@ -0,0 +1,61 @@ +This is the first paragraph.[^first] + +[^first]: This is the first note. + +* List item one.[^second] +* List item two.[^third] + +[^third]: This is the third note, defined out of order. +[^second]: This is the second note. +[^fourth]: This is the fourth note. + +# Header[^fourth] + +Some paragraph with a footnote[^1], and another[^2]. + +[^1]: Content for fifth footnote. +[^2]: Content for sixth footnote spaning on + three lines, with some span-level markup like + _emphasis_, a [link][]. + +[link]: http://www.michelf.com/ + +Another paragraph with a named footnote[^fn-name]. + +[^fn-name]: + Footnote beginning on the line next to the marker. + +This paragraph should not have a footnote marker since +the footnote is undefined.[^3] + +This paragraph should not have a footnote marker since +the footnote has already been used before.[^1] + +This paragraph links to a footnote with plenty of +block-level content.[^block] + +[^block]: + Paragraph. + + * List item + + > Blockquote + + Code block + +This paragraph host the footnote reference within a +footnote test[^reference]. + +[^reference]: + This footnote has a footnote of its own.[^nested] + +[^nested]: + This footnote should appear even though as it is refered + from another footnote. But [^reference] should be litteral + since the footnote with that name has already been used. + + - - - + +Testing unusual footnote name[^1$^!"']. + +[^1$^!"']: Haha! diff --git a/tests/php/extra/Footnotes.xhtml b/tests/php/extra/Footnotes.xhtml new file mode 100644 index 0000000..e33639d --- /dev/null +++ b/tests/php/extra/Footnotes.xhtml @@ -0,0 +1,96 @@ +<p>This is the first paragraph.<sup id="fnref:first"><a href="#fn:first" rel="footnote">1</a></sup></p> + +<ul> +<li>List item one.<sup id="fnref:second"><a href="#fn:second" rel="footnote">2</a></sup></li> +<li>List item two.<sup id="fnref:third"><a href="#fn:third" rel="footnote">3</a></sup></li> +</ul> + +<h1>Header<sup id="fnref:fourth"><a href="#fn:fourth" rel="footnote">4</a></sup></h1> + +<p>Some paragraph with a footnote<sup id="fnref:1"><a href="#fn:1" rel="footnote">5</a></sup>, and another<sup id="fnref:2"><a href="#fn:2" rel="footnote">6</a></sup>.</p> + +<p>Another paragraph with a named footnote<sup id="fnref:fn-name"><a href="#fn:fn-name" rel="footnote">7</a></sup>.</p> + +<p>This paragraph should not have a footnote marker since +the footnote is undefined.[^3]</p> + +<p>This paragraph should not have a footnote marker since +the footnote has already been used before.[^1]</p> + +<p>This paragraph links to a footnote with plenty of +block-level content.<sup id="fnref:block"><a href="#fn:block" rel="footnote">8</a></sup></p> + +<p>This paragraph host the footnote reference within a +footnote test<sup id="fnref:reference"><a href="#fn:reference" rel="footnote">9</a></sup>.</p> + +<hr /> + +<p>Testing unusual footnote name<sup id="fnref:1$^!"'"><a href="#fn:1$^!"'" rel="footnote">10</a></sup>.</p> + +<div class="footnotes"> +<hr /> +<ol> + +<li id="fn:first"> +<p>This is the first note. <a href="#fnref:first" rev="footnote">↩</a></p> +</li> + +<li id="fn:second"> +<p>This is the second note. <a href="#fnref:second" rev="footnote">↩</a></p> +</li> + +<li id="fn:third"> +<p>This is the third note, defined out of order. <a href="#fnref:third" rev="footnote">↩</a></p> +</li> + +<li id="fn:fourth"> +<p>This is the fourth note. <a href="#fnref:fourth" rev="footnote">↩</a></p> +</li> + +<li id="fn:1"> +<p>Content for fifth footnote. <a href="#fnref:1" rev="footnote">↩</a></p> +</li> + +<li id="fn:2"> +<p>Content for sixth footnote spaning on +three lines, with some span-level markup like +<em>emphasis</em>, a <a href="http://www.michelf.com/">link</a>. <a href="#fnref:2" rev="footnote">↩</a></p> +</li> + +<li id="fn:fn-name"> +<p>Footnote beginning on the line next to the marker. <a href="#fnref:fn-name" rev="footnote">↩</a></p> +</li> + +<li id="fn:block"> +<p>Paragraph.</p> + +<ul> +<li>List item</li> +</ul> + +<blockquote> + <p>Blockquote</p> +</blockquote> + +<pre><code>Code block +</code></pre> + +<p><a href="#fnref:block" rev="footnote">↩</a></p> +</li> + +<li id="fn:reference"> +<p>This footnote has a footnote of its own.<sup id="fnref:nested"><a href="#fn:nested" rel="footnote">11</a></sup> <a href="#fnref:reference" rev="footnote">↩</a></p> +</li> + +<li id="fn:1$^!"'"> +<p>Haha! <a href="#fnref:1$^!"'" rev="footnote">↩</a></p> +</li> + +<li id="fn:nested"> +<p>This footnote should appear even though as it is refered +from another footnote. But [^reference] should be litteral +since the footnote with that name has already been used. <a href="#fnref:nested" rev="footnote">↩</a></p> +</li> + +</ol> +</div> diff --git a/tests/php/extra/Inline HTML with Markdown content.text b/tests/php/extra/Inline HTML with Markdown content.text new file mode 100644 index 0000000..1eb5450 --- /dev/null +++ b/tests/php/extra/Inline HTML with Markdown content.text @@ -0,0 +1,104 @@ +# Markdown inside code blocks + +<div markdown="1"> +foo +</div> + +<div markdown='1'> +foo +</div> + +<div markdown=1> +foo +</div> + +<table> +<tr><td markdown="1">test _emphasis_ (span)</td></tr> +</table> + +<table> +<tr><td markdown="span">test _emphasis_ (span)</td></tr> +</table> + +<table> +<tr><td markdown="block">test _emphasis_ (block)</td></tr> +</table> + +## More complicated + +<table> +<tr><td markdown="1"> +* this is _not_ a list item</td></tr> +<tr><td markdown="span"> +* this is _not_ a list item</td></tr> +<tr><td markdown="block"> +* this _is_ a list item +</td></tr> +</table> + +## With indent + +<div> + <div markdown="1"> + This text is no code block: if it was, the + closing `<div>` would be too and the HTML block + would be invalid. + + Markdown content in HTML blocks is assumed to be + indented the same as the block opening tag. + + **This should be the third paragraph after the header.** + </div> +</div> + +## Code block with rogue `</div>`s in Markdown code span and block + +<div> + <div markdown="1"> + + This is a code block however: + + </div> + + Funny isn't it? Here is a code span: `</div>`. + + </div> +</div> + +<div> + <div markdown="1"> + * List item, not a code block + +Some text + + This is a code block. + </div> +</div> + +## No code block in markdown span mode + +<p markdown="1"> + This is not a code block since Markdown parse paragraph + content as span. Code spans like `</p>` are allowed though. +</p> + +<p markdown="1">_Hello_ _world_</p> + +## Preserving attributes and tags on more than one line: + +<p class="test" markdown="1" +id="12"> +Some _span_ content. +</p> + + +## Header confusion bug + +<table class="canvas"> +<tr> +<td id="main" markdown="1">Hello World! +============ + +Hello World!</td> +</tr> +</table> diff --git a/tests/php/extra/Inline HTML with Markdown content.xhtml b/tests/php/extra/Inline HTML with Markdown content.xhtml new file mode 100644 index 0000000..4751f78 --- /dev/null +++ b/tests/php/extra/Inline HTML with Markdown content.xhtml @@ -0,0 +1,125 @@ +<h1>Markdown inside code blocks</h1> + +<div> + +<p>foo</p> + +</div> + +<div> + +<p>foo</p> + +</div> + +<div> + +<p>foo</p> + +</div> + +<table> +<tr><td>test <em>emphasis</em> (span)</td></tr> +</table> + +<table> +<tr><td>test <em>emphasis</em> (span)</td></tr> +</table> + +<table> +<tr><td> + +<p>test <em>emphasis</em> (block)</p> + +</td></tr> +</table> + +<h2>More complicated</h2> + +<table> +<tr><td> +* this is <em>not</em> a list item</td></tr> +<tr><td> +* this is <em>not</em> a list item</td></tr> +<tr><td> + +<ul> +<li>this <em>is</em> a list item</li> +</ul> + +</td></tr> +</table> + +<h2>With indent</h2> + +<div> + <div> + +<p>This text is no code block: if it was, the +closing <code><div></code> would be too and the HTML block +would be invalid.</p> + +<p>Markdown content in HTML blocks is assumed to be +indented the same as the block opening tag.</p> + +<p><strong>This should be the third paragraph after the header.</strong></p> + +</div> +</div> + +<h2>Code block with rogue <code></div></code>s in Markdown code span and block</h2> + +<div> + <div> + +<p>This is a code block however:</p> + +<pre><code></div> +</code></pre> + +<p>Funny isn't it? Here is a code span: <code></div></code>.</p> + +</div> +</div> + +<div> + <div> + +<ul> +<li>List item, not a code block</li> +</ul> + +<p>Some text</p> + +<pre><code>This is a code block. +</code></pre> + +</div> +</div> + +<h2>No code block in markdown span mode</h2> + +<p> + This is not a code block since Markdown parse paragraph + content as span. Code spans like <code></p></code> are allowed though. +</p> + +<p><em>Hello</em> <em>world</em></p> + +<h2>Preserving attributes and tags on more than one line:</h2> + +<p class="test" +id="12"> +Some <em>span</em> content. +</p> + +<h2>Header confusion bug</h2> + +<table class="canvas"> +<tr> +<td id="main">Hello World! +============ + +Hello World!</td> +</tr> +</table>
\ No newline at end of file diff --git a/tests/php/extra/Tables.text b/tests/php/extra/Tables.text new file mode 100644 index 0000000..71b93ca --- /dev/null +++ b/tests/php/extra/Tables.text @@ -0,0 +1,104 @@ +# Simple tables + +Header 1 | Header 2 +--------- | --------- +Cell 1 | Cell 2 +Cell 3 | Cell 4 + +With leading pipes: + +| Header 1 | Header 2 +| --------- | --------- +| Cell 1 | Cell 2 +| Cell 3 | Cell 4 + +With tailing pipes: + +Header 1 | Header 2 | +--------- | --------- | +Cell 1 | Cell 2 | +Cell 3 | Cell 4 | + +With leading and tailing pipes: + +| Header 1 | Header 2 | +| --------- | --------- | +| Cell 1 | Cell 2 | +| Cell 3 | Cell 4 | + +* * * + +# One-column one-row table + +With leading pipes: + +| Header +| ------- +| Cell + +With tailing pipes: + +Header | +------- | +Cell | + +With leading and tailing pipes: + +| Header | +| ------- | +| Cell | + +* * * + +Table alignement: + +| Default | Right | Center | Left | +| --------- |:--------- |:---------:| ---------:| +| Long Cell | Long Cell | Long Cell | Long Cell | +| Cell | Cell | Cell | Cell | + +Table alignement (alternate spacing): + +| Default | Right | Center | Left | +| --------- | :-------- | :-------: | --------: | +| Long Cell | Long Cell | Long Cell | Long Cell | +| Cell | Cell | Cell | Cell | + +* * * + +# Empty cells + +| Header 1 | Header 2 | +| --------- | --------- | +| A | B | +| C | | + +Header 1 | Header 2 +--------- | --------- +A | B + | D + +* * * + +# Missing tailing pipe + +Header 1 | Header 2 +--------- | --------- | +Cell | Cell | +Cell | Cell | + +Header 1 | Header 2 | +--------- | --------- +Cell | Cell | +Cell | Cell | + +Header 1 | Header 2 | +--------- | --------- | +Cell | Cell +Cell | Cell | + +Header 1 | Header 2 | +--------- | --------- | +Cell | Cell | +Cell | Cell + diff --git a/tests/php/extra/Tables.xhtml b/tests/php/extra/Tables.xhtml new file mode 100644 index 0000000..e36286c --- /dev/null +++ b/tests/php/extra/Tables.xhtml @@ -0,0 +1,310 @@ +<h1>Simple tables</h1> + +<table> +<thead> +<tr> + <th>Header 1</th> + <th>Header 2</th> +</tr> +</thead> +<tbody> +<tr> + <td>Cell 1</td> + <td>Cell 2</td> +</tr> +<tr> + <td>Cell 3</td> + <td>Cell 4</td> +</tr> +</tbody> +</table> + +<p>With leading pipes:</p> + +<table> +<thead> +<tr> + <th>Header 1</th> + <th>Header 2</th> +</tr> +</thead> +<tbody> +<tr> + <td>Cell 1</td> + <td>Cell 2</td> +</tr> +<tr> + <td>Cell 3</td> + <td>Cell 4</td> +</tr> +</tbody> +</table> + +<p>With tailing pipes:</p> + +<table> +<thead> +<tr> + <th>Header 1</th> + <th>Header 2</th> +</tr> +</thead> +<tbody> +<tr> + <td>Cell 1</td> + <td>Cell 2</td> +</tr> +<tr> + <td>Cell 3</td> + <td>Cell 4</td> +</tr> +</tbody> +</table> + +<p>With leading and tailing pipes:</p> + +<table> +<thead> +<tr> + <th>Header 1</th> + <th>Header 2</th> +</tr> +</thead> +<tbody> +<tr> + <td>Cell 1</td> + <td>Cell 2</td> +</tr> +<tr> + <td>Cell 3</td> + <td>Cell 4</td> +</tr> +</tbody> +</table> + +<hr /> + +<h1>One-column one-row table</h1> + +<p>With leading pipes:</p> + +<table> +<thead> +<tr> + <th>Header</th> +</tr> +</thead> +<tbody> +<tr> + <td>Cell</td> +</tr> +</tbody> +</table> + +<p>With tailing pipes:</p> + +<table> +<thead> +<tr> + <th>Header</th> +</tr> +</thead> +<tbody> +<tr> + <td>Cell</td> +</tr> +</tbody> +</table> + +<p>With leading and tailing pipes:</p> + +<table> +<thead> +<tr> + <th>Header</th> +</tr> +</thead> +<tbody> +<tr> + <td>Cell</td> +</tr> +</tbody> +</table> + +<hr /> + +<p>Table alignement:</p> + +<table> +<thead> +<tr> + <th>Default</th> + <th align="left">Right</th> + <th align="center">Center</th> + <th align="right">Left</th> +</tr> +</thead> +<tbody> +<tr> + <td>Long Cell</td> + <td align="left">Long Cell</td> + <td align="center">Long Cell</td> + <td align="right">Long Cell</td> +</tr> +<tr> + <td>Cell</td> + <td align="left">Cell</td> + <td align="center">Cell</td> + <td align="right">Cell</td> +</tr> +</tbody> +</table> + +<p>Table alignement (alternate spacing):</p> + +<table> +<thead> +<tr> + <th>Default</th> + <th align="left">Right</th> + <th align="center">Center</th> + <th align="right">Left</th> +</tr> +</thead> +<tbody> +<tr> + <td>Long Cell</td> + <td align="left">Long Cell</td> + <td align="center">Long Cell</td> + <td align="right">Long Cell</td> +</tr> +<tr> + <td>Cell</td> + <td align="left">Cell</td> + <td align="center">Cell</td> + <td align="right">Cell</td> +</tr> +</tbody> +</table> + +<hr /> + +<h1>Empty cells</h1> + +<table> +<thead> +<tr> + <th>Header 1</th> + <th>Header 2</th> +</tr> +</thead> +<tbody> +<tr> + <td>A</td> + <td>B</td> +</tr> +<tr> + <td>C</td> + <td></td> +</tr> +</tbody> +</table> + +<table> +<thead> +<tr> + <th>Header 1</th> + <th>Header 2</th> +</tr> +</thead> +<tbody> +<tr> + <td>A</td> + <td>B</td> +</tr> +<tr> + <td></td> + <td>D</td> +</tr> +</tbody> +</table> + +<hr /> + +<h1>Missing tailing pipe</h1> + +<table> +<thead> +<tr> + <th>Header 1</th> + <th>Header 2</th> +</tr> +</thead> +<tbody> +<tr> + <td>Cell</td> + <td>Cell</td> +</tr> +<tr> + <td>Cell</td> + <td>Cell</td> +</tr> +</tbody> +</table> + +<table> +<thead> +<tr> + <th>Header 1</th> + <th>Header 2</th> +</tr> +</thead> +<tbody> +<tr> + <td>Cell</td> + <td>Cell</td> +</tr> +<tr> + <td>Cell</td> + <td>Cell</td> +</tr> +</tbody> +</table> + +<table> +<thead> +<tr> + <th>Header 1</th> + <th>Header 2</th> +</tr> +</thead> +<tbody> +<tr> + <td>Cell</td> + <td>Cell</td> +</tr> +<tr> + <td>Cell</td> + <td>Cell</td> +</tr> +</tbody> +</table> + +<table> +<thead> +<tr> + <th>Header 1</th> + <th>Header 2</th> +</tr> +</thead> +<tbody> +<tr> + <td>Cell</td> + <td>Cell</td> +</tr> +<tr> + <td>Cell</td> + <td>Cell</td> +</tr> +</tbody> +</table>
\ No newline at end of file diff --git a/tests/pl/Tests_2004/Amps and angle encoding.html b/tests/pl/Tests_2004/Amps and angle encoding.html new file mode 100644 index 0000000..9606860 --- /dev/null +++ b/tests/pl/Tests_2004/Amps and angle encoding.html @@ -0,0 +1,17 @@ +<p>AT&T has an ampersand in their name.</p> + +<p>AT&T is another way to write it.</p> + +<p>This & that.</p> + +<p>4 < 5.</p> + +<p>6 > 5.</p> + +<p>Here's a <a href="http://example.com/?foo=1&bar=2">link</a> with an ampersand in the URL.</p> + +<p>Here's a link with an amersand in the link text: <a href="http://att.com/" title="AT&T">AT&T</a>.</p> + +<p>Here's an inline <a href="/script?foo=1&bar=2">link</a>.</p> + +<p>Here's an inline <a href="/script?foo=1&bar=2">link</a>.</p> diff --git a/tests/pl/Tests_2004/Amps and angle encoding.text b/tests/pl/Tests_2004/Amps and angle encoding.text new file mode 100644 index 0000000..0e9527f --- /dev/null +++ b/tests/pl/Tests_2004/Amps and angle encoding.text @@ -0,0 +1,21 @@ +AT&T has an ampersand in their name. + +AT&T is another way to write it. + +This & that. + +4 < 5. + +6 > 5. + +Here's a [link] [1] with an ampersand in the URL. + +Here's a link with an amersand in the link text: [AT&T] [2]. + +Here's an inline [link](/script?foo=1&bar=2). + +Here's an inline [link](</script?foo=1&bar=2>). + + +[1]: http://example.com/?foo=1&bar=2 +[2]: http://att.com/ "AT&T"
\ No newline at end of file diff --git a/tests/pl/Tests_2004/Auto links.html b/tests/pl/Tests_2004/Auto links.html new file mode 100644 index 0000000..f8df985 --- /dev/null +++ b/tests/pl/Tests_2004/Auto links.html @@ -0,0 +1,18 @@ +<p>Link: <a href="http://example.com/">http://example.com/</a>.</p> + +<p>With an ampersand: <a href="http://example.com/?foo=1&bar=2">http://example.com/?foo=1&bar=2</a></p> + +<ul> +<li>In a list?</li> +<li><a href="http://example.com/">http://example.com/</a></li> +<li>It should.</li> +</ul> + +<blockquote> + <p>Blockquoted: <a href="http://example.com/">http://example.com/</a></p> +</blockquote> + +<p>Auto-links should not occur here: <code><http://example.com/></code></p> + +<pre><code>or here: <http://example.com/> +</code></pre> diff --git a/tests/pl/Tests_2004/Auto links.text b/tests/pl/Tests_2004/Auto links.text new file mode 100644 index 0000000..abbc488 --- /dev/null +++ b/tests/pl/Tests_2004/Auto links.text @@ -0,0 +1,13 @@ +Link: <http://example.com/>. + +With an ampersand: <http://example.com/?foo=1&bar=2> + +* In a list? +* <http://example.com/> +* It should. + +> Blockquoted: <http://example.com/> + +Auto-links should not occur here: `<http://example.com/>` + + or here: <http://example.com/>
\ No newline at end of file diff --git a/tests/pl/Tests_2004/Backslash escapes.html b/tests/pl/Tests_2004/Backslash escapes.html new file mode 100644 index 0000000..77823c3 --- /dev/null +++ b/tests/pl/Tests_2004/Backslash escapes.html @@ -0,0 +1,102 @@ +<p>These should all get escaped:</p> + +<p>Backslash: \</p> + +<p>Backtick: `</p> + +<p>Asterisk: *</p> + +<p>Underscore: _</p> + +<p>Left brace: {</p> + +<p>Right brace: }</p> + +<p>Left bracket: [</p> + +<p>Right bracket: ]</p> + +<p>Left paren: (</p> + +<p>Right paren: )</p> + +<p>Greater-than: ></p> + +<p>Hash: #</p> + +<p>Period: .</p> + +<p>Bang: !</p> + +<p>Plus: +</p> + +<p>Minus: -</p> + +<p>These should not, because they occur within a code block:</p> + +<pre><code>Backslash: \\ + +Backtick: \` + +Asterisk: \* + +Underscore: \_ + +Left brace: \{ + +Right brace: \} + +Left bracket: \[ + +Right bracket: \] + +Left paren: \( + +Right paren: \) + +Greater-than: \> + +Hash: \# + +Period: \. + +Bang: \! + +Plus: \+ + +Minus: \- +</code></pre> + +<p>Nor should these, which occur in code spans:</p> + +<p>Backslash: <code>\\</code></p> + +<p>Backtick: <code>\`</code></p> + +<p>Asterisk: <code>\*</code></p> + +<p>Underscore: <code>\_</code></p> + +<p>Left brace: <code>\{</code></p> + +<p>Right brace: <code>\}</code></p> + +<p>Left bracket: <code>\[</code></p> + +<p>Right bracket: <code>\]</code></p> + +<p>Left paren: <code>\(</code></p> + +<p>Right paren: <code>\)</code></p> + +<p>Greater-than: <code>\></code></p> + +<p>Hash: <code>\#</code></p> + +<p>Period: <code>\.</code></p> + +<p>Bang: <code>\!</code></p> + +<p>Plus: <code>\+</code></p> + +<p>Minus: <code>\-</code></p> diff --git a/tests/pl/Tests_2004/Backslash escapes.text b/tests/pl/Tests_2004/Backslash escapes.text new file mode 100644 index 0000000..16447a0 --- /dev/null +++ b/tests/pl/Tests_2004/Backslash escapes.text @@ -0,0 +1,104 @@ +These should all get escaped: + +Backslash: \\ + +Backtick: \` + +Asterisk: \* + +Underscore: \_ + +Left brace: \{ + +Right brace: \} + +Left bracket: \[ + +Right bracket: \] + +Left paren: \( + +Right paren: \) + +Greater-than: \> + +Hash: \# + +Period: \. + +Bang: \! + +Plus: \+ + +Minus: \- + + + +These should not, because they occur within a code block: + + Backslash: \\ + + Backtick: \` + + Asterisk: \* + + Underscore: \_ + + Left brace: \{ + + Right brace: \} + + Left bracket: \[ + + Right bracket: \] + + Left paren: \( + + Right paren: \) + + Greater-than: \> + + Hash: \# + + Period: \. + + Bang: \! + + Plus: \+ + + Minus: \- + + +Nor should these, which occur in code spans: + +Backslash: `\\` + +Backtick: `` \` `` + +Asterisk: `\*` + +Underscore: `\_` + +Left brace: `\{` + +Right brace: `\}` + +Left bracket: `\[` + +Right bracket: `\]` + +Left paren: `\(` + +Right paren: `\)` + +Greater-than: `\>` + +Hash: `\#` + +Period: `\.` + +Bang: `\!` + +Plus: `\+` + +Minus: `\-` diff --git a/tests/pl/Tests_2004/Blockquotes with code blocks.html b/tests/pl/Tests_2004/Blockquotes with code blocks.html new file mode 100644 index 0000000..990202a --- /dev/null +++ b/tests/pl/Tests_2004/Blockquotes with code blocks.html @@ -0,0 +1,15 @@ +<blockquote> + <p>Example:</p> + +<pre><code>sub status { + print "working"; +} +</code></pre> + + <p>Or:</p> + +<pre><code>sub status { + return "working"; +} +</code></pre> +</blockquote> diff --git a/tests/pl/Tests_2004/Blockquotes with code blocks.text b/tests/pl/Tests_2004/Blockquotes with code blocks.text new file mode 100644 index 0000000..c31d171 --- /dev/null +++ b/tests/pl/Tests_2004/Blockquotes with code blocks.text @@ -0,0 +1,11 @@ +> Example: +> +> sub status { +> print "working"; +> } +> +> Or: +> +> sub status { +> return "working"; +> } diff --git a/tests/pl/Tests_2004/Hard-wrapped paragraphs with list-like lines.html b/tests/pl/Tests_2004/Hard-wrapped paragraphs with list-like lines.html new file mode 100644 index 0000000..e21ac79 --- /dev/null +++ b/tests/pl/Tests_2004/Hard-wrapped paragraphs with list-like lines.html @@ -0,0 +1,8 @@ +<p>In Markdown 1.0.0 and earlier. Version +8. This line turns into a list item. +Because a hard-wrapped line in the +middle of a paragraph looked like a +list item.</p> + +<p>Here's one with a bullet. +* criminey.</p> diff --git a/tests/pl/Tests_2004/Hard-wrapped paragraphs with list-like lines.text b/tests/pl/Tests_2004/Hard-wrapped paragraphs with list-like lines.text new file mode 100644 index 0000000..f8a5b27 --- /dev/null +++ b/tests/pl/Tests_2004/Hard-wrapped paragraphs with list-like lines.text @@ -0,0 +1,8 @@ +In Markdown 1.0.0 and earlier. Version +8. This line turns into a list item. +Because a hard-wrapped line in the +middle of a paragraph looked like a +list item. + +Here's one with a bullet. +* criminey. diff --git a/tests/pl/Tests_2004/Horizontal rules.html b/tests/pl/Tests_2004/Horizontal rules.html new file mode 100644 index 0000000..2dc2ab6 --- /dev/null +++ b/tests/pl/Tests_2004/Horizontal rules.html @@ -0,0 +1,71 @@ +<p>Dashes:</p> + +<hr /> + +<hr /> + +<hr /> + +<hr /> + +<pre><code>--- +</code></pre> + +<hr /> + +<hr /> + +<hr /> + +<hr /> + +<pre><code>- - - +</code></pre> + +<p>Asterisks:</p> + +<hr /> + +<hr /> + +<hr /> + +<hr /> + +<pre><code>*** +</code></pre> + +<hr /> + +<hr /> + +<hr /> + +<hr /> + +<pre><code>* * * +</code></pre> + +<p>Underscores:</p> + +<hr /> + +<hr /> + +<hr /> + +<hr /> + +<pre><code>___ +</code></pre> + +<hr /> + +<hr /> + +<hr /> + +<hr /> + +<pre><code>_ _ _ +</code></pre> diff --git a/tests/pl/Tests_2004/Horizontal rules.text b/tests/pl/Tests_2004/Horizontal rules.text new file mode 100644 index 0000000..1594bda --- /dev/null +++ b/tests/pl/Tests_2004/Horizontal rules.text @@ -0,0 +1,67 @@ +Dashes: + +--- + + --- + + --- + + --- + + --- + +- - - + + - - - + + - - - + + - - - + + - - - + + +Asterisks: + +*** + + *** + + *** + + *** + + *** + +* * * + + * * * + + * * * + + * * * + + * * * + + +Underscores: + +___ + + ___ + + ___ + + ___ + + ___ + +_ _ _ + + _ _ _ + + _ _ _ + + _ _ _ + + _ _ _ diff --git a/tests/markdown-test/inline-html-advanced.html b/tests/pl/Tests_2004/Inline HTML (Advanced).html index af1dec1..1972d87 100644 --- a/tests/markdown-test/inline-html-advanced.html +++ b/tests/pl/Tests_2004/Inline HTML (Advanced).html @@ -1,7 +1,9 @@ <p>Simple block on one line:</p> + <div>foo</div> <p>And nested without indentation:</p> + <div> <div> <div> @@ -9,4 +11,4 @@ foo </div> </div> <div>bar</div> -</div>
\ No newline at end of file +</div> diff --git a/tests/markdown-test/inline-html-advanced.txt b/tests/pl/Tests_2004/Inline HTML (Advanced).text index 9d71ddc..9d71ddc 100644 --- a/tests/markdown-test/inline-html-advanced.txt +++ b/tests/pl/Tests_2004/Inline HTML (Advanced).text diff --git a/tests/markdown-test/inline-html-simple.html b/tests/pl/Tests_2004/Inline HTML (Simple).html index cb10451..6bf78f8 100644 --- a/tests/markdown-test/inline-html-simple.html +++ b/tests/pl/Tests_2004/Inline HTML (Simple).html @@ -1,17 +1,23 @@ <p>Here's a simple block:</p> + <div> foo </div> <p>This should be a code block, though:</p> + <pre><code><div> foo </div> </code></pre> + <p>As should this:</p> + <pre><code><div>foo</div> </code></pre> + <p>Now, nested:</p> + <div> <div> <div> @@ -21,38 +27,46 @@ </div> <p>This should just be an HTML comment:</p> + <!-- Comment --> <p>Multiline:</p> + <!-- Blah Blah --> <p>Code block:</p> + <pre><code><!-- Comment --> </code></pre> + <p>Just plain comment, with trailing spaces on the line:</p> -<!-- foo --> + +<!-- foo --> <p>Code:</p> + <pre><code><hr /> </code></pre> + <p>Hr's:</p> + <hr> <hr/> <hr /> -<hr> +<hr> -<hr/> +<hr/> -<hr /> +<hr /> <hr class="foo" id="bar" /> <hr class="foo" id="bar"/> -<hr class="foo" id="bar" >
\ No newline at end of file +<hr class="foo" id="bar" > diff --git a/tests/markdown-test/inline-html-simple.txt b/tests/pl/Tests_2004/Inline HTML (Simple).text index 14aa2dc..14aa2dc 100644 --- a/tests/markdown-test/inline-html-simple.txt +++ b/tests/pl/Tests_2004/Inline HTML (Simple).text diff --git a/tests/markdown-test/inline-html-comments.html b/tests/pl/Tests_2004/Inline HTML comments.html index 0d4cad9..3f167a1 100644 --- a/tests/markdown-test/inline-html-comments.html +++ b/tests/pl/Tests_2004/Inline HTML comments.html @@ -1,4 +1,5 @@ <p>Paragraph one.</p> + <!-- This is a simple comment --> <!-- @@ -6,6 +7,7 @@ --> <p>Paragraph two.</p> + <!-- one comment block -- -- with two comments --> -<p>The end.</p>
\ No newline at end of file +<p>The end.</p> diff --git a/tests/markdown-test/inline-html-comments.txt b/tests/pl/Tests_2004/Inline HTML comments.text index 41d830d..41d830d 100644 --- a/tests/markdown-test/inline-html-comments.txt +++ b/tests/pl/Tests_2004/Inline HTML comments.text diff --git a/tests/pl/Tests_2004/Links, inline style.html b/tests/pl/Tests_2004/Links, inline style.html new file mode 100644 index 0000000..bdfabb5 --- /dev/null +++ b/tests/pl/Tests_2004/Links, inline style.html @@ -0,0 +1,9 @@ +<p>Just a <a href="/url/">URL</a>.</p> + +<p><a href="/url/" title="title">URL and title</a>.</p> + +<p><a href="/url/" title="title preceded by two spaces">URL and title</a>.</p> + +<p><a href="/url/" title="title preceded by a tab">URL and title</a>.</p> + +<p><a href="">Empty</a>.</p> diff --git a/tests/pl/Tests_2004/Links, inline style.text b/tests/pl/Tests_2004/Links, inline style.text new file mode 100644 index 0000000..4d0c1c2 --- /dev/null +++ b/tests/pl/Tests_2004/Links, inline style.text @@ -0,0 +1,9 @@ +Just a [URL](/url/). + +[URL and title](/url/ "title"). + +[URL and title](/url/ "title preceded by two spaces"). + +[URL and title](/url/ "title preceded by a tab"). + +[Empty](). diff --git a/tests/markdown-test/links-reference.html b/tests/pl/Tests_2004/Links, reference style.html index 165c71a..cf4d833 100644 --- a/tests/markdown-test/links-reference.html +++ b/tests/pl/Tests_2004/Links, reference style.html @@ -1,10 +1,18 @@ <p>Foo <a href="/url/" title="Title">bar</a>.</p> + <p>Foo <a href="/url/" title="Title">bar</a>.</p> + <p>Foo <a href="/url/" title="Title">bar</a>.</p> + <p>With <a href="/url/">embedded [brackets]</a>.</p> + <p>Indented <a href="/url">once</a>.</p> + <p>Indented <a href="/url">twice</a>.</p> + <p>Indented <a href="/url">thrice</a>.</p> + <p>Indented [four][] times.</p> + <pre><code>[four]: /url -</code></pre>
\ No newline at end of file +</code></pre> diff --git a/tests/markdown-test/links-reference.txt b/tests/pl/Tests_2004/Links, reference style.text index b2fa734..b2fa734 100644 --- a/tests/markdown-test/links-reference.txt +++ b/tests/pl/Tests_2004/Links, reference style.text diff --git a/tests/pl/Tests_2004/Literal quotes in titles.html b/tests/pl/Tests_2004/Literal quotes in titles.html new file mode 100644 index 0000000..611c1ac --- /dev/null +++ b/tests/pl/Tests_2004/Literal quotes in titles.html @@ -0,0 +1,3 @@ +<p>Foo <a href="/url/" title="Title with "quotes" inside">bar</a>.</p> + +<p>Foo <a href="/url/" title="Title with "quotes" inside">bar</a>.</p> diff --git a/tests/pl/Tests_2004/Literal quotes in titles.text b/tests/pl/Tests_2004/Literal quotes in titles.text new file mode 100644 index 0000000..29d0e42 --- /dev/null +++ b/tests/pl/Tests_2004/Literal quotes in titles.text @@ -0,0 +1,7 @@ +Foo [bar][]. + +Foo [bar](/url/ "Title with "quotes" inside"). + + + [bar]: /url/ "Title with "quotes" inside" + diff --git a/tests/markdown-test/markdown-documentation-basics.html b/tests/pl/Tests_2004/Markdown Documentation - Basics.html index 3bcaea9..342f0c1 100644 --- a/tests/markdown-test/markdown-documentation-basics.html +++ b/tests/pl/Tests_2004/Markdown Documentation - Basics.html @@ -1,4 +1,5 @@ <h1>Markdown: Basics</h1> + <ul id="ProjectSubmenu"> <li><a href="/projects/markdown/" title="Markdown Project Page">Main</a></li> <li><a class="selected" title="Markdown Basics">Basics</a></li> @@ -8,30 +9,39 @@ </ul> <h2>Getting the Gist of Markdown's Formatting Syntax</h2> + <p>This page offers a brief overview of what it's like to use Markdown. The <a href="/projects/markdown/syntax" title="Markdown Syntax">syntax page</a> provides complete, detailed documentation for every feature, but Markdown should be very easy to pick up simply by looking at a few examples of it in action. The examples on this page are written in a before/after style, showing example syntax and the HTML output produced by Markdown.</p> + <p>It's also helpful to simply try Markdown out; the <a href="/projects/markdown/dingus" title="Markdown Dingus">Dingus</a> is a web application that allows you type your own Markdown-formatted text and translate it to XHTML.</p> + <p><strong>Note:</strong> This document is itself written using Markdown; you can <a href="/projects/markdown/basics.text">see the source for it by adding '.text' to the URL</a>.</p> + <h2>Paragraphs, Headers, Blockquotes</h2> + <p>A paragraph is simply one or more consecutive lines of text, separated by one or more blank lines. (A blank line is any line that looks like a blank line -- a line containing nothing spaces or tabs is considered -blank.) Normal paragraphs should not be intended with spaces or tabs.</p> +blank.) Normal paragraphs should not be indented with spaces or tabs.</p> + <p>Markdown offers two styles of headers: <em>Setext</em> and <em>atx</em>. Setext-style headers for <code><h1></code> and <code><h2></code> are created by "underlining" with equal signs (<code>=</code>) and hyphens (<code>-</code>), respectively. To create an atx-style header, you put 1-6 hash marks (<code>#</code>) at the beginning of the line -- the number of hashes equals the resulting HTML header level.</p> + <p>Blockquotes are indicated using email-style '<code>></code>' angle brackets.</p> + <p>Markdown:</p> + <pre><code>A First Level Header ==================== @@ -53,7 +63,9 @@ dog's back. > > ## This is an H2 in a blockquote </code></pre> + <p>Output:</p> + <pre><code><h1>A First Level Header</h1> <h2>A Second Level Header</h2> @@ -75,97 +87,132 @@ dog's back.</p> <h2>This is an H2 in a blockquote</h2> </blockquote> </code></pre> + <h3>Phrase Emphasis</h3> + <p>Markdown uses asterisks and underscores to indicate spans of emphasis.</p> + <p>Markdown:</p> + <pre><code>Some of these words *are emphasized*. Some of these words _are emphasized also_. Use two asterisks for **strong emphasis**. Or, if you prefer, __use two underscores instead__. </code></pre> + <p>Output:</p> + <pre><code><p>Some of these words <em>are emphasized</em>. Some of these words <em>are emphasized also</em>.</p> <p>Use two asterisks for <strong>strong emphasis</strong>. Or, if you prefer, <strong>use two underscores instead</strong>.</p> </code></pre> + <h2>Lists</h2> + <p>Unordered (bulleted) lists use asterisks, pluses, and hyphens (<code>*</code>, <code>+</code>, and <code>-</code>) as list markers. These three markers are interchangable; this:</p> + <pre><code>* Candy. * Gum. * Booze. </code></pre> + <p>this:</p> + <pre><code>+ Candy. + Gum. + Booze. </code></pre> + <p>and this:</p> + <pre><code>- Candy. - Gum. - Booze. </code></pre> + <p>all produce the same output:</p> + <pre><code><ul> <li>Candy.</li> <li>Gum.</li> <li>Booze.</li> </ul> </code></pre> + <p>Ordered (numbered) lists use regular numbers, followed by periods, as list markers:</p> + <pre><code>1. Red 2. Green 3. Blue </code></pre> + <p>Output:</p> + <pre><code><ol> <li>Red</li> <li>Green</li> <li>Blue</li> </ol> </code></pre> + <p>If you put blank lines between items, you'll get <code><p></code> tags for the list item text. You can create multi-paragraph list items by indenting the paragraphs by 4 spaces or 1 tab:</p> + <pre><code>* A list item. With multiple paragraphs. * Another item in the list. </code></pre> + <p>Output:</p> + <pre><code><ul> <li><p>A list item.</p> <p>With multiple paragraphs.</p></li> <li><p>Another item in the list.</p></li> </ul> </code></pre> + <h3>Links</h3> + <p>Markdown supports two styles for creating links: <em>inline</em> and <em>reference</em>. With both styles, you use square brackets to delimit the text you want to turn into a link.</p> + <p>Inline-style links use parentheses immediately after the link text. For example:</p> + <pre><code>This is an [example link](http://example.com/). </code></pre> + <p>Output:</p> + <pre><code><p>This is an <a href="http://example.com/"> example link</a>.</p> </code></pre> + <p>Optionally, you may include a title attribute in the parentheses:</p> + <pre><code>This is an [example link](http://example.com/ "With a Title"). </code></pre> + <p>Output:</p> + <pre><code><p>This is an <a href="http://example.com/" title="With a Title"> example link</a>.</p> </code></pre> + <p>Reference-style links allow you to refer to your links by names, which you define elsewhere in your document:</p> + <pre><code>I get 10 times more traffic from [Google][1] than from [Yahoo][2] or [MSN][3]. @@ -173,47 +220,66 @@ you define elsewhere in your document:</p> [2]: http://search.yahoo.com/ "Yahoo Search" [3]: http://search.msn.com/ "MSN Search" </code></pre> + <p>Output:</p> + <pre><code><p>I get 10 times more traffic from <a href="http://google.com/" title="Google">Google</a> than from <a href="http://search.yahoo.com/" title="Yahoo Search">Yahoo</a> or <a href="http://search.msn.com/" title="MSN Search">MSN</a>.</p> </code></pre> + <p>The title attribute is optional. Link names may contain letters, numbers and spaces, but are <em>not</em> case sensitive:</p> + <pre><code>I start my morning with a cup of coffee and [The New York Times][NY Times]. [ny times]: http://www.nytimes.com/ </code></pre> + <p>Output:</p> + <pre><code><p>I start my morning with a cup of coffee and <a href="http://www.nytimes.com/">The New York Times</a>.</p> </code></pre> + <h3>Images</h3> + <p>Image syntax is very much like link syntax.</p> + <p>Inline (titles are optional):</p> + <pre><code>![alt text](/path/to/img.jpg "Title") </code></pre> + <p>Reference-style:</p> + <pre><code>![alt text][id] [id]: /path/to/img.jpg "Title" </code></pre> + <p>Both of the above examples produce the same output:</p> + <pre><code><img src="/path/to/img.jpg" alt="alt text" title="Title" /> </code></pre> + <h3>Code</h3> + <p>In a regular paragraph, you can create code span by wrapping text in backtick quotes. Any ampersands (<code>&</code>) and angle brackets (<code><</code> or <code>></code>) will automatically be translated into HTML entities. This makes it easy to use Markdown to write about HTML example code:</p> + <pre><code>I strongly recommend against using any `<blink>` tags. I wish SmartyPants used named entities like `&mdash;` instead of decimal-encoded entites like `&#8212;`. </code></pre> + <p>Output:</p> + <pre><code><p>I strongly recommend against using any <code>&lt;blink&gt;</code> tags.</p> @@ -221,10 +287,13 @@ instead of decimal-encoded entites like `&#8212;`. <code>&amp;mdash;</code> instead of decimal-encoded entites like <code>&amp;#8212;</code>.</p> </code></pre> + <p>To specify an entire block of pre-formatted code, indent every line of the block by 4 spaces or 1 tab. Just like with code spans, <code>&</code>, <code><</code>, and <code>></code> characters will be escaped automatically.</p> + <p>Markdown:</p> + <pre><code>If you want your page to validate under XHTML 1.0 Strict, you've got to put paragraph tags in your blockquotes: @@ -232,7 +301,9 @@ you've got to put paragraph tags in your blockquotes: <p>For example.</p> </blockquote> </code></pre> + <p>Output:</p> + <pre><code><p>If you want your page to validate under XHTML 1.0 Strict, you've got to put paragraph tags in your blockquotes:</p> @@ -240,4 +311,4 @@ you've got to put paragraph tags in your blockquotes:</p> &lt;p&gt;For example.&lt;/p&gt; &lt;/blockquote&gt; </code></pre> -</code></pre>
\ No newline at end of file +</code></pre> diff --git a/tests/markdown-test/markdown-documentation-basics.txt b/tests/pl/Tests_2004/Markdown Documentation - Basics.text index 486055c..2abe24a 100644 --- a/tests/markdown-test/markdown-documentation-basics.txt +++ b/tests/pl/Tests_2004/Markdown Documentation - Basics.text @@ -37,7 +37,7 @@ can [see the source for it by adding '.text' to the URL] [src]. A paragraph is simply one or more consecutive lines of text, separated by one or more blank lines. (A blank line is any line that looks like a blank line -- a line containing nothing spaces or tabs is considered -blank.) Normal paragraphs should not be intended with spaces or tabs. +blank.) Normal paragraphs should not be indented with spaces or tabs. Markdown offers two styles of headers: *Setext* and *atx*. Setext-style headers for `<h1>` and `<h2>` are created by diff --git a/tests/pl/Tests_2004/Markdown Documentation - Syntax.html b/tests/pl/Tests_2004/Markdown Documentation - Syntax.html new file mode 100644 index 0000000..7847793 --- /dev/null +++ b/tests/pl/Tests_2004/Markdown Documentation - Syntax.html @@ -0,0 +1,942 @@ +<h1>Markdown: Syntax</h1> + +<ul id="ProjectSubmenu"> + <li><a href="/projects/markdown/" title="Markdown Project Page">Main</a></li> + <li><a href="/projects/markdown/basics" title="Markdown Basics">Basics</a></li> + <li><a class="selected" title="Markdown Syntax Documentation">Syntax</a></li> + <li><a href="/projects/markdown/license" title="Pricing and License Information">License</a></li> + <li><a href="/projects/markdown/dingus" title="Online Markdown Web Form">Dingus</a></li> +</ul> + +<ul> +<li><a href="#overview">Overview</a> +<ul> +<li><a href="#philosophy">Philosophy</a></li> +<li><a href="#html">Inline HTML</a></li> +<li><a href="#autoescape">Automatic Escaping for Special Characters</a></li> +</ul></li> +<li><a href="#block">Block Elements</a> +<ul> +<li><a href="#p">Paragraphs and Line Breaks</a></li> +<li><a href="#header">Headers</a></li> +<li><a href="#blockquote">Blockquotes</a></li> +<li><a href="#list">Lists</a></li> +<li><a href="#precode">Code Blocks</a></li> +<li><a href="#hr">Horizontal Rules</a></li> +</ul></li> +<li><a href="#span">Span Elements</a> +<ul> +<li><a href="#link">Links</a></li> +<li><a href="#em">Emphasis</a></li> +<li><a href="#code">Code</a></li> +<li><a href="#img">Images</a></li> +</ul></li> +<li><a href="#misc">Miscellaneous</a> +<ul> +<li><a href="#backslash">Backslash Escapes</a></li> +<li><a href="#autolink">Automatic Links</a></li> +</ul></li> +</ul> + +<p><strong>Note:</strong> This document is itself written using Markdown; you +can <a href="/projects/markdown/syntax.text">see the source for it by adding '.text' to the URL</a>.</p> + +<hr /> + +<h2 id="overview">Overview</h2> + +<h3 id="philosophy">Philosophy</h3> + +<p>Markdown is intended to be as easy-to-read and easy-to-write as is feasible.</p> + +<p>Readability, however, is emphasized above all else. 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. While +Markdown's syntax has been influenced by several existing text-to-HTML +filters -- including <a href="http://docutils.sourceforge.net/mirror/setext.html">Setext</a>, <a href="http://www.aaronsw.com/2002/atx/">atx</a>, <a href="http://textism.com/tools/textile/">Textile</a>, <a href="http://docutils.sourceforge.net/rst.html">reStructuredText</a>, +<a href="http://www.triptico.com/software/grutatxt.html">Grutatext</a>, and <a href="http://ettext.taint.org/doc/">EtText</a> -- the single biggest source of +inspiration for Markdown's syntax is the format of plain text email.</p> + +<p>To this end, Markdown's syntax is comprised entirely of punctuation +characters, which punctuation characters have been carefully chosen so +as to look like what they mean. E.g., asterisks around a word actually +look like *emphasis*. Markdown lists look like, well, lists. Even +blockquotes look like quoted passages of text, assuming you've ever +used email.</p> + +<h3 id="html">Inline HTML</h3> + +<p>Markdown's syntax is intended for one purpose: to be used as a +format for <em>writing</em> for the web.</p> + +<p>Markdown is not a replacement for HTML, or even close to it. Its +syntax is very small, corresponding only to a very small subset of +HTML tags. The idea is <em>not</em> to create a syntax that makes it easier +to insert HTML tags. In my opinion, HTML tags are already easy to +insert. The idea for Markdown is to make it easy to read, write, and +edit prose. HTML is a <em>publishing</em> format; Markdown is a <em>writing</em> +format. Thus, Markdown's formatting syntax only addresses issues that +can be conveyed in plain text.</p> + +<p>For any markup that is not covered by Markdown's syntax, you simply +use HTML itself. There's no need to preface it or delimit it to +indicate that you're switching from Markdown to HTML; you just use +the tags.</p> + +<p>The only restrictions are that block-level HTML elements -- e.g. <code><div></code>, +<code><table></code>, <code><pre></code>, <code><p></code>, 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. Markdown is smart enough not +to add extra (unwanted) <code><p></code> tags around HTML block-level tags.</p> + +<p>For example, to add an HTML table to a Markdown article:</p> + +<pre><code>This is a regular paragraph. + +<table> + <tr> + <td>Foo</td> + </tr> +</table> + +This is another regular paragraph. +</code></pre> + +<p>Note that Markdown formatting syntax is not processed within block-level +HTML tags. E.g., you can't use Markdown-style <code>*emphasis*</code> inside an +HTML block.</p> + +<p>Span-level HTML tags -- e.g. <code><span></code>, <code><cite></code>, or <code><del></code> -- can be +used anywhere in a Markdown paragraph, list item, or header. If you +want, you can even use HTML tags instead of Markdown formatting; e.g. if +you'd prefer to use HTML <code><a></code> or <code><img></code> tags instead of Markdown's +link or image syntax, go right ahead.</p> + +<p>Unlike block-level HTML tags, Markdown syntax <em>is</em> processed within +span-level tags.</p> + +<h3 id="autoescape">Automatic Escaping for Special Characters</h3> + +<p>In HTML, there are two characters that demand special treatment: <code><</code> +and <code>&</code>. Left angle brackets are used to start tags; ampersands are +used to denote HTML entities. If you want to use them as literal +characters, you must escape them as entities, e.g. <code>&lt;</code>, and +<code>&amp;</code>.</p> + +<p>Ampersands in particular are bedeviling for web writers. If you want to +write about 'AT&T', you need to write '<code>AT&amp;T</code>'. You even need to +escape ampersands within URLs. Thus, if you want to link to:</p> + +<pre><code>http://images.google.com/images?num=30&q=larry+bird +</code></pre> + +<p>you need to encode the URL as:</p> + +<pre><code>http://images.google.com/images?num=30&amp;q=larry+bird +</code></pre> + +<p>in your anchor tag <code>href</code> attribute. Needless to say, this is easy to +forget, and is probably the single most common source of HTML validation +errors in otherwise well-marked-up web sites.</p> + +<p>Markdown allows you to use these characters naturally, taking care of +all the necessary escaping for you. If you use an ampersand as part of +an HTML entity, it remains unchanged; otherwise it will be translated +into <code>&amp;</code>.</p> + +<p>So, if you want to include a copyright symbol in your article, you can write:</p> + +<pre><code>&copy; +</code></pre> + +<p>and Markdown will leave it alone. But if you write:</p> + +<pre><code>AT&T +</code></pre> + +<p>Markdown will translate it to:</p> + +<pre><code>AT&amp;T +</code></pre> + +<p>Similarly, because Markdown supports <a href="#html">inline HTML</a>, if you use +angle brackets as delimiters for HTML tags, Markdown will treat them as +such. But if you write:</p> + +<pre><code>4 < 5 +</code></pre> + +<p>Markdown will translate it to:</p> + +<pre><code>4 &lt; 5 +</code></pre> + +<p>However, inside Markdown code spans and blocks, angle brackets and +ampersands are <em>always</em> encoded automatically. This makes it easy to use +Markdown to write about HTML code. (As opposed to raw HTML, which is a +terrible format for writing about HTML syntax, because every single <code><</code> +and <code>&</code> in your example code needs to be escaped.)</p> + +<hr /> + +<h2 id="block">Block Elements</h2> + +<h3 id="p">Paragraphs and Line Breaks</h3> + +<p>A paragraph is simply one or more consecutive lines of text, separated +by one or more blank lines. (A blank line is any line that looks like a +blank line -- a line containing nothing but spaces or tabs is considered +blank.) Normal paragraphs should not be indented with spaces or tabs.</p> + +<p>The implication of the "one or more consecutive lines of text" rule is +that Markdown supports "hard-wrapped" text paragraphs. This differs +significantly from most other text-to-HTML formatters (including Movable +Type's "Convert Line Breaks" option) which translate every line break +character in a paragraph into a <code><br /></code> tag.</p> + +<p>When you <em>do</em> want to insert a <code><br /></code> break tag using Markdown, you +end a line with two or more spaces, then type return.</p> + +<p>Yes, this takes a tad more effort to create a <code><br /></code>, but a simplistic +"every line break is a <code><br /></code>" rule wouldn't work for Markdown. +Markdown's email-style <a href="#blockquote">blockquoting</a> and multi-paragraph <a href="#list">list items</a> +work best -- and look better -- when you format them with hard breaks.</p> + +<h3 id="header">Headers</h3> + +<p>Markdown supports two styles of headers, <a href="http://docutils.sourceforge.net/mirror/setext.html">Setext</a> and <a href="http://www.aaronsw.com/2002/atx/">atx</a>.</p> + +<p>Setext-style headers are "underlined" using equal signs (for first-level +headers) and dashes (for second-level headers). For example:</p> + +<pre><code>This is an H1 +============= + +This is an H2 +------------- +</code></pre> + +<p>Any number of underlining <code>=</code>'s or <code>-</code>'s will work.</p> + +<p>Atx-style headers use 1-6 hash characters at the start of the line, +corresponding to header levels 1-6. For example:</p> + +<pre><code># This is an H1 + +## This is an H2 + +###### This is an H6 +</code></pre> + +<p>Optionally, you may "close" atx-style headers. This is purely +cosmetic -- you can use this if you think it looks better. The +closing hashes don't even need to match the number of hashes +used to open the header. (The number of opening hashes +determines the header level.) :</p> + +<pre><code># This is an H1 # + +## This is an H2 ## + +### This is an H3 ###### +</code></pre> + +<h3 id="blockquote">Blockquotes</h3> + +<p>Markdown uses email-style <code>></code> characters for blockquoting. If you're +familiar with quoting passages of text in an email message, then you +know how to create a blockquote in Markdown. It looks best if you hard +wrap the text and put a <code>></code> before every line:</p> + +<pre><code>> This is a blockquote with two paragraphs. Lorem ipsum dolor sit amet, +> consectetuer adipiscing elit. Aliquam hendrerit mi posuere lectus. +> Vestibulum enim wisi, viverra nec, fringilla in, laoreet vitae, risus. +> +> Donec sit amet nisl. Aliquam semper ipsum sit amet velit. Suspendisse +> id sem consectetuer libero luctus adipiscing. +</code></pre> + +<p>Markdown allows you to be lazy and only put the <code>></code> before the first +line of a hard-wrapped paragraph:</p> + +<pre><code>> This is a blockquote with two paragraphs. Lorem ipsum dolor sit amet, +consectetuer adipiscing elit. Aliquam hendrerit mi posuere lectus. +Vestibulum enim wisi, viverra nec, fringilla in, laoreet vitae, risus. + +> Donec sit amet nisl. Aliquam semper ipsum sit amet velit. Suspendisse +id sem consectetuer libero luctus adipiscing. +</code></pre> + +<p>Blockquotes can be nested (i.e. a blockquote-in-a-blockquote) by +adding additional levels of <code>></code>:</p> + +<pre><code>> This is the first level of quoting. +> +> > This is nested blockquote. +> +> Back to the first level. +</code></pre> + +<p>Blockquotes can contain other Markdown elements, including headers, lists, +and code blocks:</p> + +<pre><code>> ## This is a header. +> +> 1. This is the first list item. +> 2. This is the second list item. +> +> Here's some example code: +> +> return shell_exec("echo $input | $markdown_script"); +</code></pre> + +<p>Any decent text editor should make email-style quoting easy. For +example, with BBEdit, you can make a selection and choose Increase +Quote Level from the Text menu.</p> + +<h3 id="list">Lists</h3> + +<p>Markdown supports ordered (numbered) and unordered (bulleted) lists.</p> + +<p>Unordered lists use asterisks, pluses, and hyphens -- interchangably +-- as list markers:</p> + +<pre><code>* Red +* Green +* Blue +</code></pre> + +<p>is equivalent to:</p> + +<pre><code>+ Red ++ Green ++ Blue +</code></pre> + +<p>and:</p> + +<pre><code>- Red +- Green +- Blue +</code></pre> + +<p>Ordered lists use numbers followed by periods:</p> + +<pre><code>1. Bird +2. McHale +3. Parish +</code></pre> + +<p>It's important to note that the actual numbers you use to mark the +list have no effect on the HTML output Markdown produces. The HTML +Markdown produces from the above list is:</p> + +<pre><code><ol> +<li>Bird</li> +<li>McHale</li> +<li>Parish</li> +</ol> +</code></pre> + +<p>If you instead wrote the list in Markdown like this:</p> + +<pre><code>1. Bird +1. McHale +1. Parish +</code></pre> + +<p>or even:</p> + +<pre><code>3. Bird +1. McHale +8. Parish +</code></pre> + +<p>you'd get the exact same HTML output. The point is, if you want to, +you can use ordinal numbers in your ordered Markdown lists, so that +the numbers in your source match the numbers in your published HTML. +But if you want to be lazy, you don't have to.</p> + +<p>If you do use lazy list numbering, however, you should still start the +list with the number 1. At some point in the future, Markdown may support +starting ordered lists at an arbitrary number.</p> + +<p>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.</p> + +<p>To make lists look nice, you can wrap items with hanging indents:</p> + +<pre><code>* Lorem ipsum dolor sit amet, consectetuer adipiscing elit. + Aliquam hendrerit mi posuere lectus. Vestibulum enim wisi, + viverra nec, fringilla in, laoreet vitae, risus. +* Donec sit amet nisl. Aliquam semper ipsum sit amet velit. + Suspendisse id sem consectetuer libero luctus adipiscing. +</code></pre> + +<p>But if you want to be lazy, you don't have to:</p> + +<pre><code>* Lorem ipsum dolor sit amet, consectetuer adipiscing elit. +Aliquam hendrerit mi posuere lectus. Vestibulum enim wisi, +viverra nec, fringilla in, laoreet vitae, risus. +* Donec sit amet nisl. Aliquam semper ipsum sit amet velit. +Suspendisse id sem consectetuer libero luctus adipiscing. +</code></pre> + +<p>If list items are separated by blank lines, Markdown will wrap the +items in <code><p></code> tags in the HTML output. For example, this input:</p> + +<pre><code>* Bird +* Magic +</code></pre> + +<p>will turn into:</p> + +<pre><code><ul> +<li>Bird</li> +<li>Magic</li> +</ul> +</code></pre> + +<p>But this:</p> + +<pre><code>* Bird + +* Magic +</code></pre> + +<p>will turn into:</p> + +<pre><code><ul> +<li><p>Bird</p></li> +<li><p>Magic</p></li> +</ul> +</code></pre> + +<p>List items may consist of multiple paragraphs. Each subsequent +paragraph in a list item must be indented by either 4 spaces +or one tab:</p> + +<pre><code>1. This is a list item with two paragraphs. Lorem ipsum dolor + sit amet, consectetuer adipiscing elit. Aliquam hendrerit + mi posuere lectus. + + Vestibulum enim wisi, viverra nec, fringilla in, laoreet + vitae, risus. Donec sit amet nisl. Aliquam semper ipsum + sit amet velit. + +2. Suspendisse id sem consectetuer libero luctus adipiscing. +</code></pre> + +<p>It looks nice if you indent every line of the subsequent +paragraphs, but here again, Markdown will allow you to be +lazy:</p> + +<pre><code>* This is a list item with two paragraphs. + + This is the second paragraph in the list item. You're +only required to indent the first line. Lorem ipsum dolor +sit amet, consectetuer adipiscing elit. + +* Another item in the same list. +</code></pre> + +<p>To put a blockquote within a list item, the blockquote's <code>></code> +delimiters need to be indented:</p> + +<pre><code>* A list item with a blockquote: + + > This is a blockquote + > inside a list item. +</code></pre> + +<p>To put a code block within a list item, the code block needs +to be indented <em>twice</em> -- 8 spaces or two tabs:</p> + +<pre><code>* A list item with a code block: + + <code goes here> +</code></pre> + +<p>It's worth noting that it's possible to trigger an ordered list by +accident, by writing something like this:</p> + +<pre><code>1986. What a great season. +</code></pre> + +<p>In other words, a <em>number-period-space</em> sequence at the beginning of a +line. To avoid this, you can backslash-escape the period:</p> + +<pre><code>1986\. What a great season. +</code></pre> + +<h3 id="precode">Code Blocks</h3> + +<p>Pre-formatted code blocks are used for writing about programming or +markup source code. Rather than forming normal paragraphs, the lines +of a code block are interpreted literally. Markdown wraps a code block +in both <code><pre></code> and <code><code></code> tags.</p> + +<p>To produce a code block in Markdown, simply indent every line of the +block by at least 4 spaces or 1 tab. For example, given this input:</p> + +<pre><code>This is a normal paragraph: + + This is a code block. +</code></pre> + +<p>Markdown will generate:</p> + +<pre><code><p>This is a normal paragraph:</p> + +<pre><code>This is a code block. +</code></pre> +</code></pre> + +<p>One level of indentation -- 4 spaces or 1 tab -- is removed from each +line of the code block. For example, this:</p> + +<pre><code>Here is an example of AppleScript: + + tell application "Foo" + beep + end tell +</code></pre> + +<p>will turn into:</p> + +<pre><code><p>Here is an example of AppleScript:</p> + +<pre><code>tell application "Foo" + beep +end tell +</code></pre> +</code></pre> + +<p>A code block continues until it reaches a line that is not indented +(or the end of the article).</p> + +<p>Within a code block, ampersands (<code>&</code>) and angle brackets (<code><</code> and <code>></code>) +are automatically converted into HTML entities. This makes it very +easy to include example HTML source code using Markdown -- just paste +it and indent it, and Markdown will handle the hassle of encoding the +ampersands and angle brackets. For example, this:</p> + +<pre><code> <div class="footer"> + &copy; 2004 Foo Corporation + </div> +</code></pre> + +<p>will turn into:</p> + +<pre><code><pre><code>&lt;div class="footer"&gt; + &amp;copy; 2004 Foo Corporation +&lt;/div&gt; +</code></pre> +</code></pre> + +<p>Regular Markdown syntax is not processed within code blocks. E.g., +asterisks are just literal asterisks within a code block. This means +it's also easy to use Markdown to write about Markdown's own syntax.</p> + +<h3 id="hr">Horizontal Rules</h3> + +<p>You can produce a horizontal rule tag (<code><hr /></code>) by placing three or +more hyphens, asterisks, or underscores on a line by themselves. If you +wish, you may use spaces between the hyphens or asterisks. Each of the +following lines will produce a horizontal rule:</p> + +<pre><code>* * * + +*** + +***** + +- - - + +--------------------------------------- + +_ _ _ +</code></pre> + +<hr /> + +<h2 id="span">Span Elements</h2> + +<h3 id="link">Links</h3> + +<p>Markdown supports two style of links: <em>inline</em> and <em>reference</em>.</p> + +<p>In both styles, the link text is delimited by [square brackets].</p> + +<p>To create an inline link, use a set of regular parentheses immediately +after the link text's closing square bracket. Inside the parentheses, +put the URL where you want the link to point, along with an <em>optional</em> +title for the link, surrounded in quotes. For example:</p> + +<pre><code>This is [an example](http://example.com/ "Title") inline link. + +[This link](http://example.net/) has no title attribute. +</code></pre> + +<p>Will produce:</p> + +<pre><code><p>This is <a href="http://example.com/" title="Title"> +an example</a> inline link.</p> + +<p><a href="http://example.net/">This link</a> has no +title attribute.</p> +</code></pre> + +<p>If you're referring to a local resource on the same server, you can +use relative paths:</p> + +<pre><code>See my [About](/about/) page for details. +</code></pre> + +<p>Reference-style links use a second set of square brackets, inside +which you place a label of your choosing to identify the link:</p> + +<pre><code>This is [an example][id] reference-style link. +</code></pre> + +<p>You can optionally use a space to separate the sets of brackets:</p> + +<pre><code>This is [an example] [id] reference-style link. +</code></pre> + +<p>Then, anywhere in the document, you define your link label like this, +on a line by itself:</p> + +<pre><code>[id]: http://example.com/ "Optional Title Here" +</code></pre> + +<p>That is:</p> + +<ul> +<li>Square brackets containing the link identifier (optionally +indented from the left margin using up to three spaces);</li> +<li>followed by a colon;</li> +<li>followed by one or more spaces (or tabs);</li> +<li>followed by the URL for the link;</li> +<li>optionally followed by a title attribute for the link, enclosed +in double or single quotes.</li> +</ul> + +<p>The link URL may, optionally, be surrounded by angle brackets:</p> + +<pre><code>[id]: <http://example.com/> "Optional Title Here" +</code></pre> + +<p>You can put the title attribute on the next line and use extra spaces +or tabs for padding, which tends to look better with longer URLs:</p> + +<pre><code>[id]: http://example.com/longish/path/to/resource/here + "Optional Title Here" +</code></pre> + +<p>Link definitions are only used for creating links during Markdown +processing, and are stripped from your document in the HTML output.</p> + +<p>Link definition names may constist of letters, numbers, spaces, and punctuation -- but they are <em>not</em> case sensitive. E.g. these two links:</p> + +<pre><code>[link text][a] +[link text][A] +</code></pre> + +<p>are equivalent.</p> + +<p>The <em>implicit link name</em> shortcut allows you to omit the name of the +link, in which case the link text itself is used as the name. +Just use an empty set of square brackets -- e.g., to link the word +"Google" to the google.com web site, you could simply write:</p> + +<pre><code>[Google][] +</code></pre> + +<p>And then define the link:</p> + +<pre><code>[Google]: http://google.com/ +</code></pre> + +<p>Because link names may contain spaces, this shortcut even works for +multiple words in the link text:</p> + +<pre><code>Visit [Daring Fireball][] for more information. +</code></pre> + +<p>And then define the link:</p> + +<pre><code>[Daring Fireball]: http://daringfireball.net/ +</code></pre> + +<p>Link definitions can be placed anywhere in your Markdown document. I +tend to put them immediately after each paragraph in which they're +used, but if you want, you can put them all at the end of your +document, sort of like footnotes.</p> + +<p>Here's an example of reference links in action:</p> + +<pre><code>I get 10 times more traffic from [Google] [1] than from +[Yahoo] [2] or [MSN] [3]. + + [1]: http://google.com/ "Google" + [2]: http://search.yahoo.com/ "Yahoo Search" + [3]: http://search.msn.com/ "MSN Search" +</code></pre> + +<p>Using the implicit link name shortcut, you could instead write:</p> + +<pre><code>I get 10 times more traffic from [Google][] than from +[Yahoo][] or [MSN][]. + + [google]: http://google.com/ "Google" + [yahoo]: http://search.yahoo.com/ "Yahoo Search" + [msn]: http://search.msn.com/ "MSN Search" +</code></pre> + +<p>Both of the above examples will produce the following HTML output:</p> + +<pre><code><p>I get 10 times more traffic from <a href="http://google.com/" +title="Google">Google</a> than from +<a href="http://search.yahoo.com/" title="Yahoo Search">Yahoo</a> +or <a href="http://search.msn.com/" title="MSN Search">MSN</a>.</p> +</code></pre> + +<p>For comparison, here is the same paragraph written using +Markdown's inline link style:</p> + +<pre><code>I get 10 times more traffic from [Google](http://google.com/ "Google") +than from [Yahoo](http://search.yahoo.com/ "Yahoo Search") or +[MSN](http://search.msn.com/ "MSN Search"). +</code></pre> + +<p>The point of reference-style links is not that they're easier to +write. The point is that with reference-style links, your document +source is vastly more readable. Compare the above examples: using +reference-style links, the paragraph itself is only 81 characters +long; with inline-style links, it's 176 characters; and as raw HTML, +it's 234 characters. In the raw HTML, there's more markup than there +is text.</p> + +<p>With Markdown's reference-style links, a source document much more +closely resembles the final output, as rendered in a browser. By +allowing you to move the markup-related metadata out of the paragraph, +you can add links without interrupting the narrative flow of your +prose.</p> + +<h3 id="em">Emphasis</h3> + +<p>Markdown treats asterisks (<code>*</code>) and underscores (<code>_</code>) as indicators of +emphasis. Text wrapped with one <code>*</code> or <code>_</code> will be wrapped with an +HTML <code><em></code> tag; double <code>*</code>'s or <code>_</code>'s will be wrapped with an HTML +<code><strong></code> tag. E.g., this input:</p> + +<pre><code>*single asterisks* + +_single underscores_ + +**double asterisks** + +__double underscores__ +</code></pre> + +<p>will produce:</p> + +<pre><code><em>single asterisks</em> + +<em>single underscores</em> + +<strong>double asterisks</strong> + +<strong>double underscores</strong> +</code></pre> + +<p>You can use whichever style you prefer; the lone restriction is that +the same character must be used to open and close an emphasis span.</p> + +<p>Emphasis can be used in the middle of a word:</p> + +<pre><code>un*fucking*believable +</code></pre> + +<p>But if you surround an <code>*</code> or <code>_</code> with spaces, it'll be treated as a +literal asterisk or underscore.</p> + +<p>To produce a literal asterisk or underscore at a position where it +would otherwise be used as an emphasis delimiter, you can backslash +escape it:</p> + +<pre><code>\*this text is surrounded by literal asterisks\* +</code></pre> + +<h3 id="code">Code</h3> + +<p>To indicate a span of code, wrap it with backtick quotes (<code>`</code>). +Unlike a pre-formatted code block, a code span indicates code within a +normal paragraph. For example:</p> + +<pre><code>Use the `printf()` function. +</code></pre> + +<p>will produce:</p> + +<pre><code><p>Use the <code>printf()</code> function.</p> +</code></pre> + +<p>To include a literal backtick character within a code span, you can use +multiple backticks as the opening and closing delimiters:</p> + +<pre><code>``There is a literal backtick (`) here.`` +</code></pre> + +<p>which will produce this:</p> + +<pre><code><p><code>There is a literal backtick (`) here.</code></p> +</code></pre> + +<p>The backtick delimiters surrounding a code span may include spaces -- +one after the opening, one before the closing. This allows you to place +literal backtick characters at the beginning or end of a code span:</p> + +<pre><code>A single backtick in a code span: `` ` `` + +A backtick-delimited string in a code span: `` `foo` `` +</code></pre> + +<p>will produce:</p> + +<pre><code><p>A single backtick in a code span: <code>`</code></p> + +<p>A backtick-delimited string in a code span: <code>`foo`</code></p> +</code></pre> + +<p>With a code span, ampersands and angle brackets are encoded as HTML +entities automatically, which makes it easy to include example HTML +tags. Markdown will turn this:</p> + +<pre><code>Please don't use any `<blink>` tags. +</code></pre> + +<p>into:</p> + +<pre><code><p>Please don't use any <code>&lt;blink&gt;</code> tags.</p> +</code></pre> + +<p>You can write this:</p> + +<pre><code>`&#8212;` is the decimal-encoded equivalent of `&mdash;`. +</code></pre> + +<p>to produce:</p> + +<pre><code><p><code>&amp;#8212;</code> is the decimal-encoded +equivalent of <code>&amp;mdash;</code>.</p> +</code></pre> + +<h3 id="img">Images</h3> + +<p>Admittedly, it's fairly difficult to devise a "natural" syntax for +placing images into a plain text document format.</p> + +<p>Markdown uses an image syntax that is intended to resemble the syntax +for links, allowing for two styles: <em>inline</em> and <em>reference</em>.</p> + +<p>Inline image syntax looks like this:</p> + +<pre><code>![Alt text](/path/to/img.jpg) + +![Alt text](/path/to/img.jpg "Optional title") +</code></pre> + +<p>That is:</p> + +<ul> +<li>An exclamation mark: <code>!</code>;</li> +<li>followed by a set of square brackets, containing the <code>alt</code> +attribute text for the image;</li> +<li>followed by a set of parentheses, containing the URL or path to +the image, and an optional <code>title</code> attribute enclosed in double +or single quotes.</li> +</ul> + +<p>Reference-style image syntax looks like this:</p> + +<pre><code>![Alt text][id] +</code></pre> + +<p>Where "id" is the name of a defined image reference. Image references +are defined using syntax identical to link references:</p> + +<pre><code>[id]: url/to/image "Optional title attribute" +</code></pre> + +<p>As of this writing, Markdown has no syntax for specifying the +dimensions of an image; if this is important to you, you can simply +use regular HTML <code><img></code> tags.</p> + +<hr /> + +<h2 id="misc">Miscellaneous</h2> + +<h3 id="autolink">Automatic Links</h3> + +<p>Markdown supports a shortcut style for creating "automatic" links for URLs and email addresses: simply surround the URL or email address with angle brackets. What this means is that if you want to show the actual text of a URL or email address, and also have it be a clickable link, you can do this:</p> + +<pre><code><http://example.com/> +</code></pre> + +<p>Markdown will turn this into:</p> + +<pre><code><a href="http://example.com/">http://example.com/</a> +</code></pre> + +<p>Automatic links for email addresses work similarly, except that +Markdown will also perform a bit of randomized decimal and hex +entity-encoding to help obscure your address from address-harvesting +spambots. For example, Markdown will turn this:</p> + +<pre><code><address@example.com> +</code></pre> + +<p>into something like this:</p> + +<pre><code><a href="&#x6D;&#x61;i&#x6C;&#x74;&#x6F;:&#x61;&#x64;&#x64;&#x72;&#x65; +&#115;&#115;&#64;&#101;&#120;&#x61;&#109;&#x70;&#x6C;e&#x2E;&#99;&#111; +&#109;">&#x61;&#x64;&#x64;&#x72;&#x65;&#115;&#115;&#64;&#101;&#120;&#x61; +&#109;&#x70;&#x6C;e&#x2E;&#99;&#111;&#109;</a> +</code></pre> + +<p>which will render in a browser as a clickable link to "address@example.com".</p> + +<p>(This sort of entity-encoding trick will indeed fool many, if not +most, address-harvesting bots, but it definitely won't fool all of +them. It's better than nothing, but an address published in this way +will probably eventually start receiving spam.)</p> + +<h3 id="backslash">Backslash Escapes</h3> + +<p>Markdown allows you to use backslash escapes to generate literal +characters which would otherwise have special meaning in Markdown's +formatting syntax. For example, if you wanted to surround a word with +literal asterisks (instead of an HTML <code><em></code> tag), you can backslashes +before the asterisks, like this:</p> + +<pre><code>\*literal asterisks\* +</code></pre> + +<p>Markdown provides backslash escapes for the following characters:</p> + +<pre><code>\ backslash +` backtick +* asterisk +_ underscore +{} curly braces +[] square brackets +() parentheses +# hash mark ++ plus sign +- minus sign (hyphen) +. dot +! exclamation mark +</code></pre> diff --git a/tests/markdown-test/markdown-syntax.txt b/tests/pl/Tests_2004/Markdown Documentation - Syntax.text index dabd75c..e0a3d1c 100644 --- a/tests/markdown-test/markdown-syntax.txt +++ b/tests/pl/Tests_2004/Markdown Documentation - Syntax.text @@ -186,7 +186,7 @@ and `&` in your example code needs to be escaped.) A paragraph is simply one or more consecutive lines of text, separated by one or more blank lines. (A blank line is any line that looks like a blank line -- a line containing nothing but spaces or tabs is considered -blank.) Normal paragraphs should not be intended with spaces or tabs. +blank.) Normal paragraphs should not be indented with spaces or tabs. The implication of the "one or more consecutive lines of text" rule is that Markdown supports "hard-wrapped" text paragraphs. This differs @@ -401,7 +401,7 @@ will turn into: </ul> List items may consist of multiple paragraphs. Each subsequent -paragraph in a list item must be intended by either 4 spaces +paragraph in a list item must be indented by either 4 spaces or one tab: 1. This is a list item with two paragraphs. Lorem ipsum dolor diff --git a/tests/pl/Tests_2004/Nested blockquotes.html b/tests/pl/Tests_2004/Nested blockquotes.html new file mode 100644 index 0000000..d8ec7f8 --- /dev/null +++ b/tests/pl/Tests_2004/Nested blockquotes.html @@ -0,0 +1,9 @@ +<blockquote> + <p>foo</p> + + <blockquote> + <p>bar</p> + </blockquote> + + <p>foo</p> +</blockquote> diff --git a/tests/pl/Tests_2004/Nested blockquotes.text b/tests/pl/Tests_2004/Nested blockquotes.text new file mode 100644 index 0000000..ed3c624 --- /dev/null +++ b/tests/pl/Tests_2004/Nested blockquotes.text @@ -0,0 +1,5 @@ +> foo +> +> > bar +> +> foo diff --git a/tests/pl/Tests_2004/Ordered and unordered lists.html b/tests/pl/Tests_2004/Ordered and unordered lists.html new file mode 100644 index 0000000..ce85c3a --- /dev/null +++ b/tests/pl/Tests_2004/Ordered and unordered lists.html @@ -0,0 +1,137 @@ +<h2>Unordered</h2> + +<p>Asterisks tight:</p> + +<ul> +<li>asterisk 1</li> +<li>asterisk 2</li> +<li>asterisk 3</li> +</ul> + +<p>Asterisks loose:</p> + +<ul> +<li><p>asterisk 1</p></li> +<li><p>asterisk 2</p></li> +<li><p>asterisk 3</p></li> +</ul> + +<hr /> + +<p>Pluses tight:</p> + +<ul> +<li>Plus 1</li> +<li>Plus 2</li> +<li>Plus 3</li> +</ul> + +<p>Pluses loose:</p> + +<ul> +<li><p>Plus 1</p></li> +<li><p>Plus 2</p></li> +<li><p>Plus 3</p></li> +</ul> + +<hr /> + +<p>Minuses tight:</p> + +<ul> +<li>Minus 1</li> +<li>Minus 2</li> +<li>Minus 3</li> +</ul> + +<p>Minuses loose:</p> + +<ul> +<li><p>Minus 1</p></li> +<li><p>Minus 2</p></li> +<li><p>Minus 3</p></li> +</ul> + +<h2>Ordered</h2> + +<p>Tight:</p> + +<ol> +<li>First</li> +<li>Second</li> +<li>Third</li> +</ol> + +<p>and:</p> + +<ol> +<li>One</li> +<li>Two</li> +<li>Three</li> +</ol> + +<p>Loose using tabs:</p> + +<ol> +<li><p>First</p></li> +<li><p>Second</p></li> +<li><p>Third</p></li> +</ol> + +<p>and using spaces:</p> + +<ol> +<li><p>One</p></li> +<li><p>Two</p></li> +<li><p>Three</p></li> +</ol> + +<p>Multiple paragraphs:</p> + +<ol> +<li><p>Item 1, graf one.</p> + +<p>Item 2. graf two. The quick brown fox jumped over the lazy dog's +back.</p></li> +<li><p>Item 2.</p></li> +<li><p>Item 3.</p></li> +</ol> + +<h2>Nested</h2> + +<ul> +<li>Tab +<ul> +<li>Tab +<ul> +<li>Tab</li> +</ul></li> +</ul></li> +</ul> + +<p>Here's another:</p> + +<ol> +<li>First</li> +<li>Second: +<ul> +<li>Fee</li> +<li>Fie</li> +<li>Foe</li> +</ul></li> +<li>Third</li> +</ol> + +<p>Same thing but with paragraphs:</p> + +<ol> +<li><p>First</p></li> +<li><p>Second:</p> + +<ul> +<li>Fee</li> +<li>Fie</li> +<li>Foe</li> +</ul></li> +<li><p>Third</p></li> +</ol> diff --git a/tests/pl/Tests_2004/Ordered and unordered lists.text b/tests/pl/Tests_2004/Ordered and unordered lists.text new file mode 100644 index 0000000..621db58 --- /dev/null +++ b/tests/pl/Tests_2004/Ordered and unordered lists.text @@ -0,0 +1,122 @@ +## Unordered + +Asterisks tight: + +* asterisk 1 +* asterisk 2 +* asterisk 3 + + +Asterisks loose: + +* asterisk 1 + +* asterisk 2 + +* asterisk 3 + +* * * + +Pluses tight: + ++ Plus 1 ++ Plus 2 ++ Plus 3 + + +Pluses loose: + ++ Plus 1 + ++ Plus 2 + ++ Plus 3 + +* * * + + +Minuses tight: + +- Minus 1 +- Minus 2 +- Minus 3 + + +Minuses loose: + +- Minus 1 + +- Minus 2 + +- Minus 3 + + +## Ordered + +Tight: + +1. First +2. Second +3. Third + +and: + +1. One +2. Two +3. Three + + +Loose using tabs: + +1. First + +2. Second + +3. Third + +and using spaces: + +1. One + +2. Two + +3. Three + +Multiple paragraphs: + +1. Item 1, graf one. + + Item 2. graf two. The quick brown fox jumped over the lazy dog's + back. + +2. Item 2. + +3. Item 3. + + + +## Nested + +* Tab + * Tab + * Tab + +Here's another: + +1. First +2. Second: + * Fee + * Fie + * Foe +3. Third + +Same thing but with paragraphs: + +1. First + +2. Second: + * Fee + * Fie + * Foe + +3. Third diff --git a/tests/pl/Tests_2004/Strong and em together.html b/tests/pl/Tests_2004/Strong and em together.html new file mode 100644 index 0000000..71ec78c --- /dev/null +++ b/tests/pl/Tests_2004/Strong and em together.html @@ -0,0 +1,7 @@ +<p><strong><em>This is strong and em.</em></strong></p> + +<p>So is <strong><em>this</em></strong> word.</p> + +<p><strong><em>This is strong and em.</em></strong></p> + +<p>So is <strong><em>this</em></strong> word.</p> diff --git a/tests/pl/Tests_2004/Strong and em together.text b/tests/pl/Tests_2004/Strong and em together.text new file mode 100644 index 0000000..95ee690 --- /dev/null +++ b/tests/pl/Tests_2004/Strong and em together.text @@ -0,0 +1,7 @@ +***This is strong and em.*** + +So is ***this*** word. + +___This is strong and em.___ + +So is ___this___ word. diff --git a/tests/pl/Tests_2004/Tabs.html b/tests/pl/Tests_2004/Tabs.html new file mode 100644 index 0000000..3301ba8 --- /dev/null +++ b/tests/pl/Tests_2004/Tabs.html @@ -0,0 +1,25 @@ +<ul> +<li><p>this is a list item +indented with tabs</p></li> +<li><p>this is a list item +indented with spaces</p></li> +</ul> + +<p>Code:</p> + +<pre><code>this code block is indented by one tab +</code></pre> + +<p>And:</p> + +<pre><code> this code block is indented by two tabs +</code></pre> + +<p>And:</p> + +<pre><code>+ this is an example list item + indented with tabs + ++ this is an example list item + indented with spaces +</code></pre> diff --git a/tests/pl/Tests_2004/Tabs.text b/tests/pl/Tests_2004/Tabs.text new file mode 100644 index 0000000..589d113 --- /dev/null +++ b/tests/pl/Tests_2004/Tabs.text @@ -0,0 +1,21 @@ ++ this is a list item + indented with tabs + ++ this is a list item + indented with spaces + +Code: + + this code block is indented by one tab + +And: + + this code block is indented by two tabs + +And: + + + this is an example list item + indented with tabs + + + this is an example list item + indented with spaces diff --git a/tests/pl/Tests_2004/Tidyness.html b/tests/pl/Tests_2004/Tidyness.html new file mode 100644 index 0000000..f2a8ce7 --- /dev/null +++ b/tests/pl/Tests_2004/Tidyness.html @@ -0,0 +1,8 @@ +<blockquote> +<p>A list within a blockquote:</p> +<ul> +<li>asterisk 1</li> +<li>asterisk 2</li> +<li>asterisk 3</li> +</ul> +</blockquote> diff --git a/tests/pl/Tests_2004/Tidyness.text b/tests/pl/Tests_2004/Tidyness.text new file mode 100644 index 0000000..5f18b8d --- /dev/null +++ b/tests/pl/Tests_2004/Tidyness.text @@ -0,0 +1,5 @@ +> A list within a blockquote: +> +> * asterisk 1 +> * asterisk 2 +> * asterisk 3 diff --git a/tests/pl/Tests_2004/Yuri-Attributes.html b/tests/pl/Tests_2004/Yuri-Attributes.html new file mode 100644 index 0000000..057da2f --- /dev/null +++ b/tests/pl/Tests_2004/Yuri-Attributes.html @@ -0,0 +1,28 @@ + + +<h1 id="lorem"> Lorem ipsum </h1> +<p>Dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor + incididunt ut labore et dolore magna aliqua. +</p> +<ul> + <li><p class="first_item">Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris + nisi ut aliquip ex ea commodo consequat. +</p> + + </li> + + <li><p>Duis aute irure dolor in reprehenderit in voluptate velit esse + cillum dolore eu fugiat nulla pariatur2. Excepteur sint occaecat + cupidatat non proident, sunt in culpa qui officia deserunt mollit + anim id est laborum. +</p> + + </li> +</ul> +<p>Duis aute <strong type="term">irure</strong> dolor in reprehenderit in voluptate + velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint + occaecat cupidatat non proident, sunt in culpa qui officia deserunt + mollit anim id est laborum. +</p> + + diff --git a/tests/pl/Tests_2004/Yuri-Attributes.text b/tests/pl/Tests_2004/Yuri-Attributes.text new file mode 100644 index 0000000..8ee512d --- /dev/null +++ b/tests/pl/Tests_2004/Yuri-Attributes.text @@ -0,0 +1,19 @@ + +Lorem ipsum {@id=lorem} +================================= + +Dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor +incididunt ut labore et dolore magna aliqua. + +* Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris + nisi ut aliquip ex ea commodo consequat.{@class=first_item} + +* Duis aute irure dolor in reprehenderit in voluptate velit esse + cillum dolore eu fugiat nulla pariatur2. Excepteur sint occaecat + cupidatat non proident, sunt in culpa qui officia deserunt mollit + anim id est laborum. + +Duis aute **irure{@type=term}** dolor in reprehenderit in voluptate +velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint +occaecat cupidatat non proident, sunt in culpa qui officia deserunt +mollit anim id est laborum. diff --git a/tests/pl/Tests_2004/Yuri-Email.html b/tests/pl/Tests_2004/Yuri-Email.html new file mode 100644 index 0000000..bf1d149 --- /dev/null +++ b/tests/pl/Tests_2004/Yuri-Email.html @@ -0,0 +1,18 @@ + +<p>Lorem ipsum <a href="mailto:yuri@domain.org">yuri@domain.org</a>, etc. +</p> +<ul> + <li> + An email address in a list + </li> + + <li> + <a href="mailto:yuri@domain.org">yuri@domain.org</a> + </li> + + <li> + Another item. + </li> +</ul> + + diff --git a/tests/pl/Tests_2004/Yuri-Email.text b/tests/pl/Tests_2004/Yuri-Email.text new file mode 100644 index 0000000..8f9c779 --- /dev/null +++ b/tests/pl/Tests_2004/Yuri-Email.text @@ -0,0 +1,7 @@ +Lorem ipsum <yuri@domain.org>, etc. + +* An email address in a list +* <yuri@domain.org> +* Another item. + + diff --git a/tests/pl/Tests_2004/Yuri-Footnotes.html b/tests/pl/Tests_2004/Yuri-Footnotes.html new file mode 100644 index 0000000..cadb040 --- /dev/null +++ b/tests/pl/Tests_2004/Yuri-Footnotes.html @@ -0,0 +1,46 @@ + +<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod + tempor incididunt ut labore et dolore magna aliqua<sup><a href="#fn1-903162597" id="fnr1-903162597">1</a></sup>. Ut enim ad minim + veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea + commodo consequat. Duis aute irure dolor in reprehenderit in voluptate + velit esse cillum dolore eu fugiat nulla pariatur<sup><a href="#fn2-903162597" id="fnr2-903162597">2</a></sup>. Excepteur sint + occaecat cupidatat non proident, sunt in culpa qui officia deserunt + mollit anim id est laborum. +</p> +<ul> + <li> + Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do + eiusmod tempor incididunt ut labore et dolore<sup><a href="#fn3-903162597" id="fnr3-903162597">3</a></sup> magna aliqua. + </li> +</ul> +<p>Duis aute irure dolor in reprehenderit in voluptate + velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint + occaecat cupidatat non proident, sunt in culpa qui officia deserunt + mollit anim id est laborum. +</p> + +<div class="footnote"><hr/><ol> + <li id="fn1-903162597"> + Sed ut perspiciatis unde omnis iste natus error sit voluptatem + accusantium doloremque laudantium, totam rem aperiam, eaque ipsa + quae ab illo inventore veritatis et quasi architecto beatae vitae + dicta sunt explicabo.<a href="#fnr1-903162597" class="footnoteBackLink" title="Jump back to footnote 1 in the text">↩</a> + </li> + + <li id="fn2-903162597"> + Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit + aut fugit, sed quia consequuntur magni dolores eos qui ratione + voluptatem sequi nesciunt. <p> Neque porro quisquam est, qui dolorem ipsum quia dolor sit amet, + consectetur, adipisci velit, sed quia non numquam eius modi + tempora incidunt ut labore et dolore magnam aliquam quaerat + voluptatem. <a href="#fnr2-903162597" class="footnoteBackLink" title="Jump back to footnote 1 in the text">↩</a> +</p> + + </li> + + <li id="fn3-903162597"> + Ut enim ad minim veniam, quis nostrud exercitation ullamco + laboris nisi ut aliquip ex ea commodo consequat. <a href="#fnr3-903162597" class="footnoteBackLink" title="Jump back to footnote 1 in the text">↩</a> + </li> +</ol> +</div> diff --git a/tests/pl/Tests_2004/Yuri-Footnotes.text b/tests/pl/Tests_2004/Yuri-Footnotes.text new file mode 100644 index 0000000..16fe402 --- /dev/null +++ b/tests/pl/Tests_2004/Yuri-Footnotes.text @@ -0,0 +1,32 @@ +Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod +tempor incididunt ut labore et dolore magna aliqua[^2]. Ut enim ad minim +veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea +commodo consequat. Duis aute irure dolor in reprehenderit in voluptate +velit esse cillum dolore eu fugiat nulla pariatur[^1]. Excepteur sint +occaecat cupidatat non proident, sunt in culpa qui officia deserunt +mollit anim id est laborum. + +[^1]: Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit + aut fugit, sed quia consequuntur magni dolores eos qui ratione + voluptatem sequi nesciunt. + + Neque porro quisquam est, qui dolorem ipsum quia dolor sit amet, + consectetur, adipisci velit, sed quia non numquam eius modi + tempora incidunt ut labore et dolore magnam aliquam quaerat + voluptatem. + +[^2]: Sed ut perspiciatis unde omnis iste natus error sit voluptatem + accusantium doloremque laudantium, totam rem aperiam, eaque ipsa + quae ab illo inventore veritatis et quasi architecto beatae vitae + dicta sunt explicabo. + +* Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do + eiusmod tempor incididunt ut labore et dolore[^foo] magna aliqua. + +[^foo]: Ut enim ad minim veniam, quis nostrud exercitation ullamco + laboris nisi ut aliquip ex ea commodo consequat. + +Duis aute irure dolor in reprehenderit in voluptate +velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint +occaecat cupidatat non proident, sunt in culpa qui officia deserunt +mollit anim id est laborum. diff --git a/tests/pl/Tests_2004/Yuri-Links-in-Headers.html b/tests/pl/Tests_2004/Yuri-Links-in-Headers.html new file mode 100644 index 0000000..6afc56e --- /dev/null +++ b/tests/pl/Tests_2004/Yuri-Links-in-Headers.html @@ -0,0 +1,15 @@ +<h2>A plain header</h2> + +<p>Let's first have a plain header</p> + +<h1>An underlined header</h1> + +<p>(That's also useful)</p> + +<h1>A header with a <a href="http://www.link.com">link</a></h1> + +<p>First with a hash</p> + +<h2>Another with a <a href="http://www.link.com/">link</a></h2> + +<p>This time underlined</p> diff --git a/tests/pl/Tests_2004/Yuri-Links-in-Headers.text b/tests/pl/Tests_2004/Yuri-Links-in-Headers.text new file mode 100644 index 0000000..d06a9e1 --- /dev/null +++ b/tests/pl/Tests_2004/Yuri-Links-in-Headers.text @@ -0,0 +1,18 @@ +## A plain header + +Let's first have a plain header + +An underlined header +==================== + +(That's also useful) + +# A header with a [link](http://www.link.com) + +First with a hash + +Another with a [link][a] +------------------------ +This time underlined + +[a]: http://www.link.com/ diff --git a/tests/pl/Tests_2007/Amps and angle encoding.html b/tests/pl/Tests_2007/Amps and angle encoding.html new file mode 100644 index 0000000..9606860 --- /dev/null +++ b/tests/pl/Tests_2007/Amps and angle encoding.html @@ -0,0 +1,17 @@ +<p>AT&T has an ampersand in their name.</p> + +<p>AT&T is another way to write it.</p> + +<p>This & that.</p> + +<p>4 < 5.</p> + +<p>6 > 5.</p> + +<p>Here's a <a href="http://example.com/?foo=1&bar=2">link</a> with an ampersand in the URL.</p> + +<p>Here's a link with an amersand in the link text: <a href="http://att.com/" title="AT&T">AT&T</a>.</p> + +<p>Here's an inline <a href="/script?foo=1&bar=2">link</a>.</p> + +<p>Here's an inline <a href="/script?foo=1&bar=2">link</a>.</p> diff --git a/tests/pl/Tests_2007/Amps and angle encoding.text b/tests/pl/Tests_2007/Amps and angle encoding.text new file mode 100644 index 0000000..0e9527f --- /dev/null +++ b/tests/pl/Tests_2007/Amps and angle encoding.text @@ -0,0 +1,21 @@ +AT&T has an ampersand in their name. + +AT&T is another way to write it. + +This & that. + +4 < 5. + +6 > 5. + +Here's a [link] [1] with an ampersand in the URL. + +Here's a link with an amersand in the link text: [AT&T] [2]. + +Here's an inline [link](/script?foo=1&bar=2). + +Here's an inline [link](</script?foo=1&bar=2>). + + +[1]: http://example.com/?foo=1&bar=2 +[2]: http://att.com/ "AT&T"
\ No newline at end of file diff --git a/tests/pl/Tests_2007/Auto links.html b/tests/pl/Tests_2007/Auto links.html new file mode 100644 index 0000000..f8df985 --- /dev/null +++ b/tests/pl/Tests_2007/Auto links.html @@ -0,0 +1,18 @@ +<p>Link: <a href="http://example.com/">http://example.com/</a>.</p> + +<p>With an ampersand: <a href="http://example.com/?foo=1&bar=2">http://example.com/?foo=1&bar=2</a></p> + +<ul> +<li>In a list?</li> +<li><a href="http://example.com/">http://example.com/</a></li> +<li>It should.</li> +</ul> + +<blockquote> + <p>Blockquoted: <a href="http://example.com/">http://example.com/</a></p> +</blockquote> + +<p>Auto-links should not occur here: <code><http://example.com/></code></p> + +<pre><code>or here: <http://example.com/> +</code></pre> diff --git a/tests/pl/Tests_2007/Auto links.text b/tests/pl/Tests_2007/Auto links.text new file mode 100644 index 0000000..abbc488 --- /dev/null +++ b/tests/pl/Tests_2007/Auto links.text @@ -0,0 +1,13 @@ +Link: <http://example.com/>. + +With an ampersand: <http://example.com/?foo=1&bar=2> + +* In a list? +* <http://example.com/> +* It should. + +> Blockquoted: <http://example.com/> + +Auto-links should not occur here: `<http://example.com/>` + + or here: <http://example.com/>
\ No newline at end of file diff --git a/tests/pl/Tests_2007/Backslash escapes.html b/tests/pl/Tests_2007/Backslash escapes.html new file mode 100644 index 0000000..29870da --- /dev/null +++ b/tests/pl/Tests_2007/Backslash escapes.html @@ -0,0 +1,118 @@ +<p>These should all get escaped:</p> + +<p>Backslash: \</p> + +<p>Backtick: `</p> + +<p>Asterisk: *</p> + +<p>Underscore: _</p> + +<p>Left brace: {</p> + +<p>Right brace: }</p> + +<p>Left bracket: [</p> + +<p>Right bracket: ]</p> + +<p>Left paren: (</p> + +<p>Right paren: )</p> + +<p>Greater-than: ></p> + +<p>Hash: #</p> + +<p>Period: .</p> + +<p>Bang: !</p> + +<p>Plus: +</p> + +<p>Minus: -</p> + +<p>These should not, because they occur within a code block:</p> + +<pre><code>Backslash: \\ + +Backtick: \` + +Asterisk: \* + +Underscore: \_ + +Left brace: \{ + +Right brace: \} + +Left bracket: \[ + +Right bracket: \] + +Left paren: \( + +Right paren: \) + +Greater-than: \> + +Hash: \# + +Period: \. + +Bang: \! + +Plus: \+ + +Minus: \- +</code></pre> + +<p>Nor should these, which occur in code spans:</p> + +<p>Backslash: <code>\\</code></p> + +<p>Backtick: <code>\`</code></p> + +<p>Asterisk: <code>\*</code></p> + +<p>Underscore: <code>\_</code></p> + +<p>Left brace: <code>\{</code></p> + +<p>Right brace: <code>\}</code></p> + +<p>Left bracket: <code>\[</code></p> + +<p>Right bracket: <code>\]</code></p> + +<p>Left paren: <code>\(</code></p> + +<p>Right paren: <code>\)</code></p> + +<p>Greater-than: <code>\></code></p> + +<p>Hash: <code>\#</code></p> + +<p>Period: <code>\.</code></p> + +<p>Bang: <code>\!</code></p> + +<p>Plus: <code>\+</code></p> + +<p>Minus: <code>\-</code></p> + + +<p>These should get escaped, even though they're matching pairs for +other Markdown constructs:</p> + +<p>*asterisks*</p> + +<p>_underscores_</p> + +<p>`backticks`</p> + +<p>This is a code span with a literal backslash-backtick sequence: <code>\`</code></p> + +<p>This is a tag with unescaped backticks <span attr='`ticks`'>bar</span>.</p> + +<p>This is a tag with backslashes <span attr='\\backslashes\\'>bar</span>.</p> diff --git a/tests/pl/Tests_2007/Backslash escapes.text b/tests/pl/Tests_2007/Backslash escapes.text new file mode 100644 index 0000000..5b014cb --- /dev/null +++ b/tests/pl/Tests_2007/Backslash escapes.text @@ -0,0 +1,120 @@ +These should all get escaped: + +Backslash: \\ + +Backtick: \` + +Asterisk: \* + +Underscore: \_ + +Left brace: \{ + +Right brace: \} + +Left bracket: \[ + +Right bracket: \] + +Left paren: \( + +Right paren: \) + +Greater-than: \> + +Hash: \# + +Period: \. + +Bang: \! + +Plus: \+ + +Minus: \- + + + +These should not, because they occur within a code block: + + Backslash: \\ + + Backtick: \` + + Asterisk: \* + + Underscore: \_ + + Left brace: \{ + + Right brace: \} + + Left bracket: \[ + + Right bracket: \] + + Left paren: \( + + Right paren: \) + + Greater-than: \> + + Hash: \# + + Period: \. + + Bang: \! + + Plus: \+ + + Minus: \- + + +Nor should these, which occur in code spans: + +Backslash: `\\` + +Backtick: `` \` `` + +Asterisk: `\*` + +Underscore: `\_` + +Left brace: `\{` + +Right brace: `\}` + +Left bracket: `\[` + +Right bracket: `\]` + +Left paren: `\(` + +Right paren: `\)` + +Greater-than: `\>` + +Hash: `\#` + +Period: `\.` + +Bang: `\!` + +Plus: `\+` + +Minus: `\-` + + +These should get escaped, even though they're matching pairs for +other Markdown constructs: + +\*asterisks\* + +\_underscores\_ + +\`backticks\` + +This is a code span with a literal backslash-backtick sequence: `` \` `` + +This is a tag with unescaped backticks <span attr='`ticks`'>bar</span>. + +This is a tag with backslashes <span attr='\\backslashes\\'>bar</span>. diff --git a/tests/pl/Tests_2007/Blockquotes with code blocks.html b/tests/pl/Tests_2007/Blockquotes with code blocks.html new file mode 100644 index 0000000..990202a --- /dev/null +++ b/tests/pl/Tests_2007/Blockquotes with code blocks.html @@ -0,0 +1,15 @@ +<blockquote> + <p>Example:</p> + +<pre><code>sub status { + print "working"; +} +</code></pre> + + <p>Or:</p> + +<pre><code>sub status { + return "working"; +} +</code></pre> +</blockquote> diff --git a/tests/pl/Tests_2007/Blockquotes with code blocks.text b/tests/pl/Tests_2007/Blockquotes with code blocks.text new file mode 100644 index 0000000..c31d171 --- /dev/null +++ b/tests/pl/Tests_2007/Blockquotes with code blocks.text @@ -0,0 +1,11 @@ +> Example: +> +> sub status { +> print "working"; +> } +> +> Or: +> +> sub status { +> return "working"; +> } diff --git a/tests/pl/Tests_2007/Code Blocks.html b/tests/pl/Tests_2007/Code Blocks.html new file mode 100644 index 0000000..32703f5 --- /dev/null +++ b/tests/pl/Tests_2007/Code Blocks.html @@ -0,0 +1,18 @@ +<pre><code>code block on the first line +</code></pre> + +<p>Regular text.</p> + +<pre><code>code block indented by spaces +</code></pre> + +<p>Regular text.</p> + +<pre><code>the lines in this block +all contain trailing spaces +</code></pre> + +<p>Regular Text.</p> + +<pre><code>code block on the last line +</code></pre> diff --git a/tests/pl/Tests_2007/Code Blocks.text b/tests/pl/Tests_2007/Code Blocks.text new file mode 100644 index 0000000..b54b092 --- /dev/null +++ b/tests/pl/Tests_2007/Code Blocks.text @@ -0,0 +1,14 @@ + code block on the first line + +Regular text. + + code block indented by spaces + +Regular text. + + the lines in this block + all contain trailing spaces + +Regular Text. + + code block on the last line
\ No newline at end of file diff --git a/tests/pl/Tests_2007/Code Spans.html b/tests/pl/Tests_2007/Code Spans.html new file mode 100644 index 0000000..b057457 --- /dev/null +++ b/tests/pl/Tests_2007/Code Spans.html @@ -0,0 +1,5 @@ +<p><code><test a="</code> content of attribute <code>"></code></p> + +<p>Fix for backticks within HTML tag: <span attr='`ticks`'>like this</span></p> + +<p>Here's how you put <code>`backticks`</code> in a code span.</p> diff --git a/tests/pl/Tests_2007/Code Spans.text b/tests/pl/Tests_2007/Code Spans.text new file mode 100644 index 0000000..5c229c7 --- /dev/null +++ b/tests/pl/Tests_2007/Code Spans.text @@ -0,0 +1,5 @@ +`<test a="` content of attribute `">` + +Fix for backticks within HTML tag: <span attr='`ticks`'>like this</span> + +Here's how you put `` `backticks` `` in a code span.
\ No newline at end of file diff --git a/tests/pl/Tests_2007/Hard-wrapped paragraphs with list-like lines.html b/tests/pl/Tests_2007/Hard-wrapped paragraphs with list-like lines.html new file mode 100644 index 0000000..e21ac79 --- /dev/null +++ b/tests/pl/Tests_2007/Hard-wrapped paragraphs with list-like lines.html @@ -0,0 +1,8 @@ +<p>In Markdown 1.0.0 and earlier. Version +8. This line turns into a list item. +Because a hard-wrapped line in the +middle of a paragraph looked like a +list item.</p> + +<p>Here's one with a bullet. +* criminey.</p> diff --git a/tests/pl/Tests_2007/Hard-wrapped paragraphs with list-like lines.text b/tests/pl/Tests_2007/Hard-wrapped paragraphs with list-like lines.text new file mode 100644 index 0000000..f8a5b27 --- /dev/null +++ b/tests/pl/Tests_2007/Hard-wrapped paragraphs with list-like lines.text @@ -0,0 +1,8 @@ +In Markdown 1.0.0 and earlier. Version +8. This line turns into a list item. +Because a hard-wrapped line in the +middle of a paragraph looked like a +list item. + +Here's one with a bullet. +* criminey. diff --git a/tests/pl/Tests_2007/Horizontal rules.html b/tests/pl/Tests_2007/Horizontal rules.html new file mode 100644 index 0000000..2dc2ab6 --- /dev/null +++ b/tests/pl/Tests_2007/Horizontal rules.html @@ -0,0 +1,71 @@ +<p>Dashes:</p> + +<hr /> + +<hr /> + +<hr /> + +<hr /> + +<pre><code>--- +</code></pre> + +<hr /> + +<hr /> + +<hr /> + +<hr /> + +<pre><code>- - - +</code></pre> + +<p>Asterisks:</p> + +<hr /> + +<hr /> + +<hr /> + +<hr /> + +<pre><code>*** +</code></pre> + +<hr /> + +<hr /> + +<hr /> + +<hr /> + +<pre><code>* * * +</code></pre> + +<p>Underscores:</p> + +<hr /> + +<hr /> + +<hr /> + +<hr /> + +<pre><code>___ +</code></pre> + +<hr /> + +<hr /> + +<hr /> + +<hr /> + +<pre><code>_ _ _ +</code></pre> diff --git a/tests/pl/Tests_2007/Horizontal rules.text b/tests/pl/Tests_2007/Horizontal rules.text new file mode 100644 index 0000000..1594bda --- /dev/null +++ b/tests/pl/Tests_2007/Horizontal rules.text @@ -0,0 +1,67 @@ +Dashes: + +--- + + --- + + --- + + --- + + --- + +- - - + + - - - + + - - - + + - - - + + - - - + + +Asterisks: + +*** + + *** + + *** + + *** + + *** + +* * * + + * * * + + * * * + + * * * + + * * * + + +Underscores: + +___ + + ___ + + ___ + + ___ + + ___ + +_ _ _ + + _ _ _ + + _ _ _ + + _ _ _ + + _ _ _ diff --git a/tests/pl/Tests_2007/Images.html b/tests/pl/Tests_2007/Images.html new file mode 100644 index 0000000..217f028 --- /dev/null +++ b/tests/pl/Tests_2007/Images.html @@ -0,0 +1,21 @@ +<p><img src="/path/to/img.jpg" alt="Alt text" title="" /></p> + +<p><img src="/path/to/img.jpg" alt="Alt text" title="Optional title" /></p> + +<p>Inline within a paragraph: <a href="/url/">alt text</a>.</p> + +<p><img src="/url/" alt="alt text" title="title preceded by two spaces" /></p> + +<p><img src="/url/" alt="alt text" title="title has spaces afterward" /></p> + +<p><img src="/url/" alt="alt text" title="" /></p> + +<p><img src="/url/" alt="alt text" title="with a title" />.</p> + +<p><img src="" alt="Empty" title="" /></p> + +<p><img src="http://example.com/(parens).jpg" alt="this is a stupid URL" title="" /></p> + +<p><img src="/url/" alt="alt text" /></p> + +<p><img src="/url/" alt="alt text" title="Title here" /></p> diff --git a/tests/pl/Tests_2007/Images.text b/tests/pl/Tests_2007/Images.text new file mode 100644 index 0000000..5707590 --- /dev/null +++ b/tests/pl/Tests_2007/Images.text @@ -0,0 +1,26 @@ +![Alt text](/path/to/img.jpg) + +![Alt text](/path/to/img.jpg "Optional title") + +Inline within a paragraph: [alt text](/url/). + +![alt text](/url/ "title preceded by two spaces") + +![alt text](/url/ "title has spaces afterward" ) + +![alt text](</url/>) + +![alt text](</url/> "with a title"). + +![Empty]() + +![this is a stupid URL](http://example.com/(parens).jpg) + + +![alt text][foo] + + [foo]: /url/ + +![alt text][bar] + + [bar]: /url/ "Title here"
\ No newline at end of file diff --git a/tests/pl/Tests_2007/Inline HTML (Advanced).html b/tests/pl/Tests_2007/Inline HTML (Advanced).html new file mode 100644 index 0000000..884f14c --- /dev/null +++ b/tests/pl/Tests_2007/Inline HTML (Advanced).html @@ -0,0 +1,30 @@ +<p>Simple block on one line:</p> + +<div>foo</div> + +<p>And nested without indentation:</p> + +<div> +<div> +<div> +foo +</div> +<div style=">"/> +</div> +<div>bar</div> +</div> + +<p>And with attributes:</p> + +<div> + <div id="foo"> + </div> +</div> + +<p>This was broken in 1.0.2b7:</p> + +<div class="inlinepage"> +<div class="toggleableend"> +foo +</div> +</div> diff --git a/tests/pl/Tests_2007/Inline HTML (Advanced).text b/tests/pl/Tests_2007/Inline HTML (Advanced).text new file mode 100644 index 0000000..3633f81 --- /dev/null +++ b/tests/pl/Tests_2007/Inline HTML (Advanced).text @@ -0,0 +1,30 @@ +Simple block on one line: + +<div>foo</div> + +And nested without indentation: + +<div> +<div> +<div> +foo +</div> +<div style=">"/> +</div> +<div>bar</div> +</div> + +And with attributes: + +<div> + <div id="foo"> + </div> +</div> + +This was broken in 1.0.2b7: + +<div class="inlinepage"> +<div class="toggleableend"> +foo +</div> +</div> diff --git a/tests/safe_mode/inline-html-simple.html b/tests/pl/Tests_2007/Inline HTML (Simple).html index ad19a77..6bf78f8 100644 --- a/tests/safe_mode/inline-html-simple.html +++ b/tests/pl/Tests_2007/Inline HTML (Simple).html @@ -1,45 +1,72 @@ <p>Here's a simple block:</p> -<p><div> + +<div> foo -</div></p> +</div> + <p>This should be a code block, though:</p> + <pre><code><div> foo </div> </code></pre> + <p>As should this:</p> + <pre><code><div>foo</div> </code></pre> + <p>Now, nested:</p> -<p><div> - <div> - <div> + +<div> + <div> + <div> foo - </div> - </div> -</div></p> + </div> + </div> +</div> + <p>This should just be an HTML comment:</p> -<p><!-- Comment --></p> + +<!-- Comment --> + <p>Multiline:</p> -<p><!-- + +<!-- Blah Blah ---></p> +--> + <p>Code block:</p> + <pre><code><!-- Comment --> </code></pre> + <p>Just plain comment, with trailing spaces on the line:</p> -<p><!-- foo --></p> + +<!-- foo --> + <p>Code:</p> + <pre><code><hr /> </code></pre> + <p>Hr's:</p> -<p><hr></p> -<p><hr/></p> -<p><hr /></p> -<p><hr></p> -<p><hr/></p> -<p><hr /></p> -<p><hr class="foo" id="bar" /></p> -<p><hr class="foo" id="bar"/></p> -<p><hr class="foo" id="bar" ></p>
\ No newline at end of file + +<hr> + +<hr/> + +<hr /> + +<hr> + +<hr/> + +<hr /> + +<hr class="foo" id="bar" /> + +<hr class="foo" id="bar"/> + +<hr class="foo" id="bar" > diff --git a/tests/safe_mode/inline-html-simple.txt b/tests/pl/Tests_2007/Inline HTML (Simple).text index 14aa2dc..14aa2dc 100644 --- a/tests/safe_mode/inline-html-simple.txt +++ b/tests/pl/Tests_2007/Inline HTML (Simple).text diff --git a/tests/pl/Tests_2007/Inline HTML comments.html b/tests/pl/Tests_2007/Inline HTML comments.html new file mode 100644 index 0000000..3f167a1 --- /dev/null +++ b/tests/pl/Tests_2007/Inline HTML comments.html @@ -0,0 +1,13 @@ +<p>Paragraph one.</p> + +<!-- This is a simple comment --> + +<!-- + This is another comment. +--> + +<p>Paragraph two.</p> + +<!-- one comment block -- -- with two comments --> + +<p>The end.</p> diff --git a/tests/safe_mode/inline-html-comments.txt b/tests/pl/Tests_2007/Inline HTML comments.text index 41d830d..41d830d 100644 --- a/tests/safe_mode/inline-html-comments.txt +++ b/tests/pl/Tests_2007/Inline HTML comments.text diff --git a/tests/pl/Tests_2007/Links, inline style.html b/tests/pl/Tests_2007/Links, inline style.html new file mode 100644 index 0000000..9f351ef --- /dev/null +++ b/tests/pl/Tests_2007/Links, inline style.html @@ -0,0 +1,23 @@ +<p>Just a <a href="/url/">URL</a>.</p> + +<p><a href="/url/" title="title">URL and title</a>.</p> + +<p><a href="/url/" title="title preceded by two spaces">URL and title</a>.</p> + +<p><a href="/url/" title="title preceded by a tab">URL and title</a>.</p> + +<p><a href="/url/" title="title has spaces afterward">URL and title</a>.</p> + +<p><a href="/url/">URL wrapped in angle brackets</a>.</p> + +<p><a href="/url/" title="Here's the title">URL w/ angle brackets + title</a>.</p> + +<p><a href="">Empty</a>.</p> + +<p><a href="http://en.wikipedia.org/wiki/WIMP_(computing)">With parens in the URL</a></p> + +<p>(With outer parens and <a href="/foo(bar)">parens in url</a>)</p> + +<p><a href="/foo(bar)" title="and a title">With parens in the URL</a></p> + +<p>(With outer parens and <a href="/foo(bar)" title="and a title">parens in url</a>)</p> diff --git a/tests/pl/Tests_2007/Links, inline style.text b/tests/pl/Tests_2007/Links, inline style.text new file mode 100644 index 0000000..aba9658 --- /dev/null +++ b/tests/pl/Tests_2007/Links, inline style.text @@ -0,0 +1,24 @@ +Just a [URL](/url/). + +[URL and title](/url/ "title"). + +[URL and title](/url/ "title preceded by two spaces"). + +[URL and title](/url/ "title preceded by a tab"). + +[URL and title](/url/ "title has spaces afterward" ). + +[URL wrapped in angle brackets](</url/>). + +[URL w/ angle brackets + title](</url/> "Here's the title"). + +[Empty](). + +[With parens in the URL](http://en.wikipedia.org/wiki/WIMP_(computing)) + +(With outer parens and [parens in url](/foo(bar))) + + +[With parens in the URL](/foo(bar) "and a title") + +(With outer parens and [parens in url](/foo(bar) "and a title")) diff --git a/tests/pl/Tests_2007/Links, reference style.html b/tests/pl/Tests_2007/Links, reference style.html new file mode 100644 index 0000000..8e70c32 --- /dev/null +++ b/tests/pl/Tests_2007/Links, reference style.html @@ -0,0 +1,52 @@ +<p>Foo <a href="/url/" title="Title">bar</a>.</p> + +<p>Foo <a href="/url/" title="Title">bar</a>.</p> + +<p>Foo <a href="/url/" title="Title">bar</a>.</p> + +<p>With <a href="/url/">embedded [brackets]</a>.</p> + +<p>Indented <a href="/url">once</a>.</p> + +<p>Indented <a href="/url">twice</a>.</p> + +<p>Indented <a href="/url">thrice</a>.</p> + +<p>Indented [four][] times.</p> + +<pre><code>[four]: /url +</code></pre> + +<hr /> + +<p><a href="foo">this</a> should work</p> + +<p>So should <a href="foo">this</a>.</p> + +<p>And <a href="foo">this</a>.</p> + +<p>And <a href="foo">this</a>.</p> + +<p>And <a href="foo">this</a>.</p> + +<p>But not [that] [].</p> + +<p>Nor [that][].</p> + +<p>Nor [that].</p> + +<p>[Something in brackets like <a href="foo">this</a> should work]</p> + +<p>[Same with <a href="foo">this</a>.]</p> + +<p>In this case, <a href="/somethingelse/">this</a> points to something else.</p> + +<p>Backslashing should suppress [this] and [this].</p> + +<hr /> + +<p>Here's one where the <a href="/url/">link +breaks</a> across lines.</p> + +<p>Here's another where the <a href="/url/">link +breaks</a> across lines, but with a line-ending space.</p> diff --git a/tests/pl/Tests_2007/Links, reference style.text b/tests/pl/Tests_2007/Links, reference style.text new file mode 100644 index 0000000..341ec88 --- /dev/null +++ b/tests/pl/Tests_2007/Links, reference style.text @@ -0,0 +1,71 @@ +Foo [bar] [1]. + +Foo [bar][1]. + +Foo [bar] +[1]. + +[1]: /url/ "Title" + + +With [embedded [brackets]] [b]. + + +Indented [once][]. + +Indented [twice][]. + +Indented [thrice][]. + +Indented [four][] times. + + [once]: /url + + [twice]: /url + + [thrice]: /url + + [four]: /url + + +[b]: /url/ + +* * * + +[this] [this] should work + +So should [this][this]. + +And [this] []. + +And [this][]. + +And [this]. + +But not [that] []. + +Nor [that][]. + +Nor [that]. + +[Something in brackets like [this][] should work] + +[Same with [this].] + +In this case, [this](/somethingelse/) points to something else. + +Backslashing should suppress \[this] and [this\]. + +[this]: foo + + +* * * + +Here's one where the [link +breaks] across lines. + +Here's another where the [link +breaks] across lines, but with a line-ending space. + + +[link breaks]: /url/ diff --git a/tests/pl/Tests_2007/Links, shortcut references.html b/tests/pl/Tests_2007/Links, shortcut references.html new file mode 100644 index 0000000..bf81e93 --- /dev/null +++ b/tests/pl/Tests_2007/Links, shortcut references.html @@ -0,0 +1,9 @@ +<p>This is the <a href="/simple">simple case</a>.</p> + +<p>This one has a <a href="/foo">line +break</a>.</p> + +<p>This one has a <a href="/foo">line +break</a> with a line-ending space.</p> + +<p><a href="/that">this</a> and the <a href="/other">other</a></p> diff --git a/tests/pl/Tests_2007/Links, shortcut references.text b/tests/pl/Tests_2007/Links, shortcut references.text new file mode 100644 index 0000000..8c44c98 --- /dev/null +++ b/tests/pl/Tests_2007/Links, shortcut references.text @@ -0,0 +1,20 @@ +This is the [simple case]. + +[simple case]: /simple + + + +This one has a [line +break]. + +This one has a [line +break] with a line-ending space. + +[line break]: /foo + + +[this] [that] and the [other] + +[this]: /this +[that]: /that +[other]: /other diff --git a/tests/pl/Tests_2007/Literal quotes in titles.html b/tests/pl/Tests_2007/Literal quotes in titles.html new file mode 100644 index 0000000..611c1ac --- /dev/null +++ b/tests/pl/Tests_2007/Literal quotes in titles.html @@ -0,0 +1,3 @@ +<p>Foo <a href="/url/" title="Title with "quotes" inside">bar</a>.</p> + +<p>Foo <a href="/url/" title="Title with "quotes" inside">bar</a>.</p> diff --git a/tests/pl/Tests_2007/Literal quotes in titles.text b/tests/pl/Tests_2007/Literal quotes in titles.text new file mode 100644 index 0000000..29d0e42 --- /dev/null +++ b/tests/pl/Tests_2007/Literal quotes in titles.text @@ -0,0 +1,7 @@ +Foo [bar][]. + +Foo [bar](/url/ "Title with "quotes" inside"). + + + [bar]: /url/ "Title with "quotes" inside" + diff --git a/tests/pl/Tests_2007/Markdown Documentation - Basics.html b/tests/pl/Tests_2007/Markdown Documentation - Basics.html new file mode 100644 index 0000000..342f0c1 --- /dev/null +++ b/tests/pl/Tests_2007/Markdown Documentation - Basics.html @@ -0,0 +1,314 @@ +<h1>Markdown: Basics</h1> + +<ul id="ProjectSubmenu"> + <li><a href="/projects/markdown/" title="Markdown Project Page">Main</a></li> + <li><a class="selected" title="Markdown Basics">Basics</a></li> + <li><a href="/projects/markdown/syntax" title="Markdown Syntax Documentation">Syntax</a></li> + <li><a href="/projects/markdown/license" title="Pricing and License Information">License</a></li> + <li><a href="/projects/markdown/dingus" title="Online Markdown Web Form">Dingus</a></li> +</ul> + +<h2>Getting the Gist of Markdown's Formatting Syntax</h2> + +<p>This page offers a brief overview of what it's like to use Markdown. +The <a href="/projects/markdown/syntax" title="Markdown Syntax">syntax page</a> provides complete, detailed documentation for +every feature, but Markdown should be very easy to pick up simply by +looking at a few examples of it in action. The examples on this page +are written in a before/after style, showing example syntax and the +HTML output produced by Markdown.</p> + +<p>It's also helpful to simply try Markdown out; the <a href="/projects/markdown/dingus" title="Markdown Dingus">Dingus</a> is a +web application that allows you type your own Markdown-formatted text +and translate it to XHTML.</p> + +<p><strong>Note:</strong> This document is itself written using Markdown; you +can <a href="/projects/markdown/basics.text">see the source for it by adding '.text' to the URL</a>.</p> + +<h2>Paragraphs, Headers, Blockquotes</h2> + +<p>A paragraph is simply one or more consecutive lines of text, separated +by one or more blank lines. (A blank line is any line that looks like a +blank line -- a line containing nothing spaces or tabs is considered +blank.) Normal paragraphs should not be indented with spaces or tabs.</p> + +<p>Markdown offers two styles of headers: <em>Setext</em> and <em>atx</em>. +Setext-style headers for <code><h1></code> and <code><h2></code> are created by +"underlining" with equal signs (<code>=</code>) and hyphens (<code>-</code>), respectively. +To create an atx-style header, you put 1-6 hash marks (<code>#</code>) at the +beginning of the line -- the number of hashes equals the resulting +HTML header level.</p> + +<p>Blockquotes are indicated using email-style '<code>></code>' angle brackets.</p> + +<p>Markdown:</p> + +<pre><code>A First Level Header +==================== + +A Second Level Header +--------------------- + +Now is the time for all good men to come to +the aid of their country. This is just a +regular paragraph. + +The quick brown fox jumped over the lazy +dog's back. + +### Header 3 + +> This is a blockquote. +> +> This is the second paragraph in the blockquote. +> +> ## This is an H2 in a blockquote +</code></pre> + +<p>Output:</p> + +<pre><code><h1>A First Level Header</h1> + +<h2>A Second Level Header</h2> + +<p>Now is the time for all good men to come to +the aid of their country. This is just a +regular paragraph.</p> + +<p>The quick brown fox jumped over the lazy +dog's back.</p> + +<h3>Header 3</h3> + +<blockquote> + <p>This is a blockquote.</p> + + <p>This is the second paragraph in the blockquote.</p> + + <h2>This is an H2 in a blockquote</h2> +</blockquote> +</code></pre> + +<h3>Phrase Emphasis</h3> + +<p>Markdown uses asterisks and underscores to indicate spans of emphasis.</p> + +<p>Markdown:</p> + +<pre><code>Some of these words *are emphasized*. +Some of these words _are emphasized also_. + +Use two asterisks for **strong emphasis**. +Or, if you prefer, __use two underscores instead__. +</code></pre> + +<p>Output:</p> + +<pre><code><p>Some of these words <em>are emphasized</em>. +Some of these words <em>are emphasized also</em>.</p> + +<p>Use two asterisks for <strong>strong emphasis</strong>. +Or, if you prefer, <strong>use two underscores instead</strong>.</p> +</code></pre> + +<h2>Lists</h2> + +<p>Unordered (bulleted) lists use asterisks, pluses, and hyphens (<code>*</code>, +<code>+</code>, and <code>-</code>) as list markers. These three markers are +interchangable; this:</p> + +<pre><code>* Candy. +* Gum. +* Booze. +</code></pre> + +<p>this:</p> + +<pre><code>+ Candy. ++ Gum. ++ Booze. +</code></pre> + +<p>and this:</p> + +<pre><code>- Candy. +- Gum. +- Booze. +</code></pre> + +<p>all produce the same output:</p> + +<pre><code><ul> +<li>Candy.</li> +<li>Gum.</li> +<li>Booze.</li> +</ul> +</code></pre> + +<p>Ordered (numbered) lists use regular numbers, followed by periods, as +list markers:</p> + +<pre><code>1. Red +2. Green +3. Blue +</code></pre> + +<p>Output:</p> + +<pre><code><ol> +<li>Red</li> +<li>Green</li> +<li>Blue</li> +</ol> +</code></pre> + +<p>If you put blank lines between items, you'll get <code><p></code> tags for the +list item text. You can create multi-paragraph list items by indenting +the paragraphs by 4 spaces or 1 tab:</p> + +<pre><code>* A list item. + + With multiple paragraphs. + +* Another item in the list. +</code></pre> + +<p>Output:</p> + +<pre><code><ul> +<li><p>A list item.</p> +<p>With multiple paragraphs.</p></li> +<li><p>Another item in the list.</p></li> +</ul> +</code></pre> + +<h3>Links</h3> + +<p>Markdown supports two styles for creating links: <em>inline</em> and +<em>reference</em>. With both styles, you use square brackets to delimit the +text you want to turn into a link.</p> + +<p>Inline-style links use parentheses immediately after the link text. +For example:</p> + +<pre><code>This is an [example link](http://example.com/). +</code></pre> + +<p>Output:</p> + +<pre><code><p>This is an <a href="http://example.com/"> +example link</a>.</p> +</code></pre> + +<p>Optionally, you may include a title attribute in the parentheses:</p> + +<pre><code>This is an [example link](http://example.com/ "With a Title"). +</code></pre> + +<p>Output:</p> + +<pre><code><p>This is an <a href="http://example.com/" title="With a Title"> +example link</a>.</p> +</code></pre> + +<p>Reference-style links allow you to refer to your links by names, which +you define elsewhere in your document:</p> + +<pre><code>I get 10 times more traffic from [Google][1] than from +[Yahoo][2] or [MSN][3]. + +[1]: http://google.com/ "Google" +[2]: http://search.yahoo.com/ "Yahoo Search" +[3]: http://search.msn.com/ "MSN Search" +</code></pre> + +<p>Output:</p> + +<pre><code><p>I get 10 times more traffic from <a href="http://google.com/" +title="Google">Google</a> than from <a href="http://search.yahoo.com/" +title="Yahoo Search">Yahoo</a> or <a href="http://search.msn.com/" +title="MSN Search">MSN</a>.</p> +</code></pre> + +<p>The title attribute is optional. Link names may contain letters, +numbers and spaces, but are <em>not</em> case sensitive:</p> + +<pre><code>I start my morning with a cup of coffee and +[The New York Times][NY Times]. + +[ny times]: http://www.nytimes.com/ +</code></pre> + +<p>Output:</p> + +<pre><code><p>I start my morning with a cup of coffee and +<a href="http://www.nytimes.com/">The New York Times</a>.</p> +</code></pre> + +<h3>Images</h3> + +<p>Image syntax is very much like link syntax.</p> + +<p>Inline (titles are optional):</p> + +<pre><code>![alt text](/path/to/img.jpg "Title") +</code></pre> + +<p>Reference-style:</p> + +<pre><code>![alt text][id] + +[id]: /path/to/img.jpg "Title" +</code></pre> + +<p>Both of the above examples produce the same output:</p> + +<pre><code><img src="/path/to/img.jpg" alt="alt text" title="Title" /> +</code></pre> + +<h3>Code</h3> + +<p>In a regular paragraph, you can create code span by wrapping text in +backtick quotes. Any ampersands (<code>&</code>) and angle brackets (<code><</code> or +<code>></code>) will automatically be translated into HTML entities. This makes +it easy to use Markdown to write about HTML example code:</p> + +<pre><code>I strongly recommend against using any `<blink>` tags. + +I wish SmartyPants used named entities like `&mdash;` +instead of decimal-encoded entites like `&#8212;`. +</code></pre> + +<p>Output:</p> + +<pre><code><p>I strongly recommend against using any +<code>&lt;blink&gt;</code> tags.</p> + +<p>I wish SmartyPants used named entities like +<code>&amp;mdash;</code> instead of decimal-encoded +entites like <code>&amp;#8212;</code>.</p> +</code></pre> + +<p>To specify an entire block of pre-formatted code, indent every line of +the block by 4 spaces or 1 tab. Just like with code spans, <code>&</code>, <code><</code>, +and <code>></code> characters will be escaped automatically.</p> + +<p>Markdown:</p> + +<pre><code>If you want your page to validate under XHTML 1.0 Strict, +you've got to put paragraph tags in your blockquotes: + + <blockquote> + <p>For example.</p> + </blockquote> +</code></pre> + +<p>Output:</p> + +<pre><code><p>If you want your page to validate under XHTML 1.0 Strict, +you've got to put paragraph tags in your blockquotes:</p> + +<pre><code>&lt;blockquote&gt; + &lt;p&gt;For example.&lt;/p&gt; +&lt;/blockquote&gt; +</code></pre> +</code></pre> diff --git a/tests/pl/Tests_2007/Markdown Documentation - Basics.text b/tests/pl/Tests_2007/Markdown Documentation - Basics.text new file mode 100644 index 0000000..2abe24a --- /dev/null +++ b/tests/pl/Tests_2007/Markdown Documentation - Basics.text @@ -0,0 +1,306 @@ +Markdown: Basics +================ + +<ul id="ProjectSubmenu"> + <li><a href="/projects/markdown/" title="Markdown Project Page">Main</a></li> + <li><a class="selected" title="Markdown Basics">Basics</a></li> + <li><a href="/projects/markdown/syntax" title="Markdown Syntax Documentation">Syntax</a></li> + <li><a href="/projects/markdown/license" title="Pricing and License Information">License</a></li> + <li><a href="/projects/markdown/dingus" title="Online Markdown Web Form">Dingus</a></li> +</ul> + + +Getting the Gist of Markdown's Formatting Syntax +------------------------------------------------ + +This page offers a brief overview of what it's like to use Markdown. +The [syntax page] [s] provides complete, detailed documentation for +every feature, but Markdown should be very easy to pick up simply by +looking at a few examples of it in action. The examples on this page +are written in a before/after style, showing example syntax and the +HTML output produced by Markdown. + +It's also helpful to simply try Markdown out; the [Dingus] [d] is a +web application that allows you type your own Markdown-formatted text +and translate it to XHTML. + +**Note:** This document is itself written using Markdown; you +can [see the source for it by adding '.text' to the URL] [src]. + + [s]: /projects/markdown/syntax "Markdown Syntax" + [d]: /projects/markdown/dingus "Markdown Dingus" + [src]: /projects/markdown/basics.text + + +## Paragraphs, Headers, Blockquotes ## + +A paragraph is simply one or more consecutive lines of text, separated +by one or more blank lines. (A blank line is any line that looks like a +blank line -- a line containing nothing spaces or tabs is considered +blank.) Normal paragraphs should not be indented with spaces or tabs. + +Markdown offers two styles of headers: *Setext* and *atx*. +Setext-style headers for `<h1>` and `<h2>` are created by +"underlining" with equal signs (`=`) and hyphens (`-`), respectively. +To create an atx-style header, you put 1-6 hash marks (`#`) at the +beginning of the line -- the number of hashes equals the resulting +HTML header level. + +Blockquotes are indicated using email-style '`>`' angle brackets. + +Markdown: + + A First Level Header + ==================== + + A Second Level Header + --------------------- + + Now is the time for all good men to come to + the aid of their country. This is just a + regular paragraph. + + The quick brown fox jumped over the lazy + dog's back. + + ### Header 3 + + > This is a blockquote. + > + > This is the second paragraph in the blockquote. + > + > ## This is an H2 in a blockquote + + +Output: + + <h1>A First Level Header</h1> + + <h2>A Second Level Header</h2> + + <p>Now is the time for all good men to come to + the aid of their country. This is just a + regular paragraph.</p> + + <p>The quick brown fox jumped over the lazy + dog's back.</p> + + <h3>Header 3</h3> + + <blockquote> + <p>This is a blockquote.</p> + + <p>This is the second paragraph in the blockquote.</p> + + <h2>This is an H2 in a blockquote</h2> + </blockquote> + + + +### Phrase Emphasis ### + +Markdown uses asterisks and underscores to indicate spans of emphasis. + +Markdown: + + Some of these words *are emphasized*. + Some of these words _are emphasized also_. + + Use two asterisks for **strong emphasis**. + Or, if you prefer, __use two underscores instead__. + +Output: + + <p>Some of these words <em>are emphasized</em>. + Some of these words <em>are emphasized also</em>.</p> + + <p>Use two asterisks for <strong>strong emphasis</strong>. + Or, if you prefer, <strong>use two underscores instead</strong>.</p> + + + +## Lists ## + +Unordered (bulleted) lists use asterisks, pluses, and hyphens (`*`, +`+`, and `-`) as list markers. These three markers are +interchangable; this: + + * Candy. + * Gum. + * Booze. + +this: + + + Candy. + + Gum. + + Booze. + +and this: + + - Candy. + - Gum. + - Booze. + +all produce the same output: + + <ul> + <li>Candy.</li> + <li>Gum.</li> + <li>Booze.</li> + </ul> + +Ordered (numbered) lists use regular numbers, followed by periods, as +list markers: + + 1. Red + 2. Green + 3. Blue + +Output: + + <ol> + <li>Red</li> + <li>Green</li> + <li>Blue</li> + </ol> + +If you put blank lines between items, you'll get `<p>` tags for the +list item text. You can create multi-paragraph list items by indenting +the paragraphs by 4 spaces or 1 tab: + + * A list item. + + With multiple paragraphs. + + * Another item in the list. + +Output: + + <ul> + <li><p>A list item.</p> + <p>With multiple paragraphs.</p></li> + <li><p>Another item in the list.</p></li> + </ul> + + + +### Links ### + +Markdown supports two styles for creating links: *inline* and +*reference*. With both styles, you use square brackets to delimit the +text you want to turn into a link. + +Inline-style links use parentheses immediately after the link text. +For example: + + This is an [example link](http://example.com/). + +Output: + + <p>This is an <a href="http://example.com/"> + example link</a>.</p> + +Optionally, you may include a title attribute in the parentheses: + + This is an [example link](http://example.com/ "With a Title"). + +Output: + + <p>This is an <a href="http://example.com/" title="With a Title"> + example link</a>.</p> + +Reference-style links allow you to refer to your links by names, which +you define elsewhere in your document: + + I get 10 times more traffic from [Google][1] than from + [Yahoo][2] or [MSN][3]. + + [1]: http://google.com/ "Google" + [2]: http://search.yahoo.com/ "Yahoo Search" + [3]: http://search.msn.com/ "MSN Search" + +Output: + + <p>I get 10 times more traffic from <a href="http://google.com/" + title="Google">Google</a> than from <a href="http://search.yahoo.com/" + title="Yahoo Search">Yahoo</a> or <a href="http://search.msn.com/" + title="MSN Search">MSN</a>.</p> + +The title attribute is optional. Link names may contain letters, +numbers and spaces, but are *not* case sensitive: + + I start my morning with a cup of coffee and + [The New York Times][NY Times]. + + [ny times]: http://www.nytimes.com/ + +Output: + + <p>I start my morning with a cup of coffee and + <a href="http://www.nytimes.com/">The New York Times</a>.</p> + + +### Images ### + +Image syntax is very much like link syntax. + +Inline (titles are optional): + + ![alt text](/path/to/img.jpg "Title") + +Reference-style: + + ![alt text][id] + + [id]: /path/to/img.jpg "Title" + +Both of the above examples produce the same output: + + <img src="/path/to/img.jpg" alt="alt text" title="Title" /> + + + +### Code ### + +In a regular paragraph, you can create code span by wrapping text in +backtick quotes. Any ampersands (`&`) and angle brackets (`<` or +`>`) will automatically be translated into HTML entities. This makes +it easy to use Markdown to write about HTML example code: + + I strongly recommend against using any `<blink>` tags. + + I wish SmartyPants used named entities like `—` + instead of decimal-encoded entites like `—`. + +Output: + + <p>I strongly recommend against using any + <code><blink></code> tags.</p> + + <p>I wish SmartyPants used named entities like + <code>&mdash;</code> instead of decimal-encoded + entites like <code>&#8212;</code>.</p> + + +To specify an entire block of pre-formatted code, indent every line of +the block by 4 spaces or 1 tab. Just like with code spans, `&`, `<`, +and `>` characters will be escaped automatically. + +Markdown: + + If you want your page to validate under XHTML 1.0 Strict, + you've got to put paragraph tags in your blockquotes: + + <blockquote> + <p>For example.</p> + </blockquote> + +Output: + + <p>If you want your page to validate under XHTML 1.0 Strict, + you've got to put paragraph tags in your blockquotes:</p> + + <pre><code><blockquote> + <p>For example.</p> + </blockquote> + </code></pre> diff --git a/tests/pl/Tests_2007/Markdown Documentation - Syntax.html b/tests/pl/Tests_2007/Markdown Documentation - Syntax.html new file mode 100644 index 0000000..7847793 --- /dev/null +++ b/tests/pl/Tests_2007/Markdown Documentation - Syntax.html @@ -0,0 +1,942 @@ +<h1>Markdown: Syntax</h1> + +<ul id="ProjectSubmenu"> + <li><a href="/projects/markdown/" title="Markdown Project Page">Main</a></li> + <li><a href="/projects/markdown/basics" title="Markdown Basics">Basics</a></li> + <li><a class="selected" title="Markdown Syntax Documentation">Syntax</a></li> + <li><a href="/projects/markdown/license" title="Pricing and License Information">License</a></li> + <li><a href="/projects/markdown/dingus" title="Online Markdown Web Form">Dingus</a></li> +</ul> + +<ul> +<li><a href="#overview">Overview</a> +<ul> +<li><a href="#philosophy">Philosophy</a></li> +<li><a href="#html">Inline HTML</a></li> +<li><a href="#autoescape">Automatic Escaping for Special Characters</a></li> +</ul></li> +<li><a href="#block">Block Elements</a> +<ul> +<li><a href="#p">Paragraphs and Line Breaks</a></li> +<li><a href="#header">Headers</a></li> +<li><a href="#blockquote">Blockquotes</a></li> +<li><a href="#list">Lists</a></li> +<li><a href="#precode">Code Blocks</a></li> +<li><a href="#hr">Horizontal Rules</a></li> +</ul></li> +<li><a href="#span">Span Elements</a> +<ul> +<li><a href="#link">Links</a></li> +<li><a href="#em">Emphasis</a></li> +<li><a href="#code">Code</a></li> +<li><a href="#img">Images</a></li> +</ul></li> +<li><a href="#misc">Miscellaneous</a> +<ul> +<li><a href="#backslash">Backslash Escapes</a></li> +<li><a href="#autolink">Automatic Links</a></li> +</ul></li> +</ul> + +<p><strong>Note:</strong> This document is itself written using Markdown; you +can <a href="/projects/markdown/syntax.text">see the source for it by adding '.text' to the URL</a>.</p> + +<hr /> + +<h2 id="overview">Overview</h2> + +<h3 id="philosophy">Philosophy</h3> + +<p>Markdown is intended to be as easy-to-read and easy-to-write as is feasible.</p> + +<p>Readability, however, is emphasized above all else. 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. While +Markdown's syntax has been influenced by several existing text-to-HTML +filters -- including <a href="http://docutils.sourceforge.net/mirror/setext.html">Setext</a>, <a href="http://www.aaronsw.com/2002/atx/">atx</a>, <a href="http://textism.com/tools/textile/">Textile</a>, <a href="http://docutils.sourceforge.net/rst.html">reStructuredText</a>, +<a href="http://www.triptico.com/software/grutatxt.html">Grutatext</a>, and <a href="http://ettext.taint.org/doc/">EtText</a> -- the single biggest source of +inspiration for Markdown's syntax is the format of plain text email.</p> + +<p>To this end, Markdown's syntax is comprised entirely of punctuation +characters, which punctuation characters have been carefully chosen so +as to look like what they mean. E.g., asterisks around a word actually +look like *emphasis*. Markdown lists look like, well, lists. Even +blockquotes look like quoted passages of text, assuming you've ever +used email.</p> + +<h3 id="html">Inline HTML</h3> + +<p>Markdown's syntax is intended for one purpose: to be used as a +format for <em>writing</em> for the web.</p> + +<p>Markdown is not a replacement for HTML, or even close to it. Its +syntax is very small, corresponding only to a very small subset of +HTML tags. The idea is <em>not</em> to create a syntax that makes it easier +to insert HTML tags. In my opinion, HTML tags are already easy to +insert. The idea for Markdown is to make it easy to read, write, and +edit prose. HTML is a <em>publishing</em> format; Markdown is a <em>writing</em> +format. Thus, Markdown's formatting syntax only addresses issues that +can be conveyed in plain text.</p> + +<p>For any markup that is not covered by Markdown's syntax, you simply +use HTML itself. There's no need to preface it or delimit it to +indicate that you're switching from Markdown to HTML; you just use +the tags.</p> + +<p>The only restrictions are that block-level HTML elements -- e.g. <code><div></code>, +<code><table></code>, <code><pre></code>, <code><p></code>, 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. Markdown is smart enough not +to add extra (unwanted) <code><p></code> tags around HTML block-level tags.</p> + +<p>For example, to add an HTML table to a Markdown article:</p> + +<pre><code>This is a regular paragraph. + +<table> + <tr> + <td>Foo</td> + </tr> +</table> + +This is another regular paragraph. +</code></pre> + +<p>Note that Markdown formatting syntax is not processed within block-level +HTML tags. E.g., you can't use Markdown-style <code>*emphasis*</code> inside an +HTML block.</p> + +<p>Span-level HTML tags -- e.g. <code><span></code>, <code><cite></code>, or <code><del></code> -- can be +used anywhere in a Markdown paragraph, list item, or header. If you +want, you can even use HTML tags instead of Markdown formatting; e.g. if +you'd prefer to use HTML <code><a></code> or <code><img></code> tags instead of Markdown's +link or image syntax, go right ahead.</p> + +<p>Unlike block-level HTML tags, Markdown syntax <em>is</em> processed within +span-level tags.</p> + +<h3 id="autoescape">Automatic Escaping for Special Characters</h3> + +<p>In HTML, there are two characters that demand special treatment: <code><</code> +and <code>&</code>. Left angle brackets are used to start tags; ampersands are +used to denote HTML entities. If you want to use them as literal +characters, you must escape them as entities, e.g. <code>&lt;</code>, and +<code>&amp;</code>.</p> + +<p>Ampersands in particular are bedeviling for web writers. If you want to +write about 'AT&T', you need to write '<code>AT&amp;T</code>'. You even need to +escape ampersands within URLs. Thus, if you want to link to:</p> + +<pre><code>http://images.google.com/images?num=30&q=larry+bird +</code></pre> + +<p>you need to encode the URL as:</p> + +<pre><code>http://images.google.com/images?num=30&amp;q=larry+bird +</code></pre> + +<p>in your anchor tag <code>href</code> attribute. Needless to say, this is easy to +forget, and is probably the single most common source of HTML validation +errors in otherwise well-marked-up web sites.</p> + +<p>Markdown allows you to use these characters naturally, taking care of +all the necessary escaping for you. If you use an ampersand as part of +an HTML entity, it remains unchanged; otherwise it will be translated +into <code>&amp;</code>.</p> + +<p>So, if you want to include a copyright symbol in your article, you can write:</p> + +<pre><code>&copy; +</code></pre> + +<p>and Markdown will leave it alone. But if you write:</p> + +<pre><code>AT&T +</code></pre> + +<p>Markdown will translate it to:</p> + +<pre><code>AT&amp;T +</code></pre> + +<p>Similarly, because Markdown supports <a href="#html">inline HTML</a>, if you use +angle brackets as delimiters for HTML tags, Markdown will treat them as +such. But if you write:</p> + +<pre><code>4 < 5 +</code></pre> + +<p>Markdown will translate it to:</p> + +<pre><code>4 &lt; 5 +</code></pre> + +<p>However, inside Markdown code spans and blocks, angle brackets and +ampersands are <em>always</em> encoded automatically. This makes it easy to use +Markdown to write about HTML code. (As opposed to raw HTML, which is a +terrible format for writing about HTML syntax, because every single <code><</code> +and <code>&</code> in your example code needs to be escaped.)</p> + +<hr /> + +<h2 id="block">Block Elements</h2> + +<h3 id="p">Paragraphs and Line Breaks</h3> + +<p>A paragraph is simply one or more consecutive lines of text, separated +by one or more blank lines. (A blank line is any line that looks like a +blank line -- a line containing nothing but spaces or tabs is considered +blank.) Normal paragraphs should not be indented with spaces or tabs.</p> + +<p>The implication of the "one or more consecutive lines of text" rule is +that Markdown supports "hard-wrapped" text paragraphs. This differs +significantly from most other text-to-HTML formatters (including Movable +Type's "Convert Line Breaks" option) which translate every line break +character in a paragraph into a <code><br /></code> tag.</p> + +<p>When you <em>do</em> want to insert a <code><br /></code> break tag using Markdown, you +end a line with two or more spaces, then type return.</p> + +<p>Yes, this takes a tad more effort to create a <code><br /></code>, but a simplistic +"every line break is a <code><br /></code>" rule wouldn't work for Markdown. +Markdown's email-style <a href="#blockquote">blockquoting</a> and multi-paragraph <a href="#list">list items</a> +work best -- and look better -- when you format them with hard breaks.</p> + +<h3 id="header">Headers</h3> + +<p>Markdown supports two styles of headers, <a href="http://docutils.sourceforge.net/mirror/setext.html">Setext</a> and <a href="http://www.aaronsw.com/2002/atx/">atx</a>.</p> + +<p>Setext-style headers are "underlined" using equal signs (for first-level +headers) and dashes (for second-level headers). For example:</p> + +<pre><code>This is an H1 +============= + +This is an H2 +------------- +</code></pre> + +<p>Any number of underlining <code>=</code>'s or <code>-</code>'s will work.</p> + +<p>Atx-style headers use 1-6 hash characters at the start of the line, +corresponding to header levels 1-6. For example:</p> + +<pre><code># This is an H1 + +## This is an H2 + +###### This is an H6 +</code></pre> + +<p>Optionally, you may "close" atx-style headers. This is purely +cosmetic -- you can use this if you think it looks better. The +closing hashes don't even need to match the number of hashes +used to open the header. (The number of opening hashes +determines the header level.) :</p> + +<pre><code># This is an H1 # + +## This is an H2 ## + +### This is an H3 ###### +</code></pre> + +<h3 id="blockquote">Blockquotes</h3> + +<p>Markdown uses email-style <code>></code> characters for blockquoting. If you're +familiar with quoting passages of text in an email message, then you +know how to create a blockquote in Markdown. It looks best if you hard +wrap the text and put a <code>></code> before every line:</p> + +<pre><code>> This is a blockquote with two paragraphs. Lorem ipsum dolor sit amet, +> consectetuer adipiscing elit. Aliquam hendrerit mi posuere lectus. +> Vestibulum enim wisi, viverra nec, fringilla in, laoreet vitae, risus. +> +> Donec sit amet nisl. Aliquam semper ipsum sit amet velit. Suspendisse +> id sem consectetuer libero luctus adipiscing. +</code></pre> + +<p>Markdown allows you to be lazy and only put the <code>></code> before the first +line of a hard-wrapped paragraph:</p> + +<pre><code>> This is a blockquote with two paragraphs. Lorem ipsum dolor sit amet, +consectetuer adipiscing elit. Aliquam hendrerit mi posuere lectus. +Vestibulum enim wisi, viverra nec, fringilla in, laoreet vitae, risus. + +> Donec sit amet nisl. Aliquam semper ipsum sit amet velit. Suspendisse +id sem consectetuer libero luctus adipiscing. +</code></pre> + +<p>Blockquotes can be nested (i.e. a blockquote-in-a-blockquote) by +adding additional levels of <code>></code>:</p> + +<pre><code>> This is the first level of quoting. +> +> > This is nested blockquote. +> +> Back to the first level. +</code></pre> + +<p>Blockquotes can contain other Markdown elements, including headers, lists, +and code blocks:</p> + +<pre><code>> ## This is a header. +> +> 1. This is the first list item. +> 2. This is the second list item. +> +> Here's some example code: +> +> return shell_exec("echo $input | $markdown_script"); +</code></pre> + +<p>Any decent text editor should make email-style quoting easy. For +example, with BBEdit, you can make a selection and choose Increase +Quote Level from the Text menu.</p> + +<h3 id="list">Lists</h3> + +<p>Markdown supports ordered (numbered) and unordered (bulleted) lists.</p> + +<p>Unordered lists use asterisks, pluses, and hyphens -- interchangably +-- as list markers:</p> + +<pre><code>* Red +* Green +* Blue +</code></pre> + +<p>is equivalent to:</p> + +<pre><code>+ Red ++ Green ++ Blue +</code></pre> + +<p>and:</p> + +<pre><code>- Red +- Green +- Blue +</code></pre> + +<p>Ordered lists use numbers followed by periods:</p> + +<pre><code>1. Bird +2. McHale +3. Parish +</code></pre> + +<p>It's important to note that the actual numbers you use to mark the +list have no effect on the HTML output Markdown produces. The HTML +Markdown produces from the above list is:</p> + +<pre><code><ol> +<li>Bird</li> +<li>McHale</li> +<li>Parish</li> +</ol> +</code></pre> + +<p>If you instead wrote the list in Markdown like this:</p> + +<pre><code>1. Bird +1. McHale +1. Parish +</code></pre> + +<p>or even:</p> + +<pre><code>3. Bird +1. McHale +8. Parish +</code></pre> + +<p>you'd get the exact same HTML output. The point is, if you want to, +you can use ordinal numbers in your ordered Markdown lists, so that +the numbers in your source match the numbers in your published HTML. +But if you want to be lazy, you don't have to.</p> + +<p>If you do use lazy list numbering, however, you should still start the +list with the number 1. At some point in the future, Markdown may support +starting ordered lists at an arbitrary number.</p> + +<p>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.</p> + +<p>To make lists look nice, you can wrap items with hanging indents:</p> + +<pre><code>* Lorem ipsum dolor sit amet, consectetuer adipiscing elit. + Aliquam hendrerit mi posuere lectus. Vestibulum enim wisi, + viverra nec, fringilla in, laoreet vitae, risus. +* Donec sit amet nisl. Aliquam semper ipsum sit amet velit. + Suspendisse id sem consectetuer libero luctus adipiscing. +</code></pre> + +<p>But if you want to be lazy, you don't have to:</p> + +<pre><code>* Lorem ipsum dolor sit amet, consectetuer adipiscing elit. +Aliquam hendrerit mi posuere lectus. Vestibulum enim wisi, +viverra nec, fringilla in, laoreet vitae, risus. +* Donec sit amet nisl. Aliquam semper ipsum sit amet velit. +Suspendisse id sem consectetuer libero luctus adipiscing. +</code></pre> + +<p>If list items are separated by blank lines, Markdown will wrap the +items in <code><p></code> tags in the HTML output. For example, this input:</p> + +<pre><code>* Bird +* Magic +</code></pre> + +<p>will turn into:</p> + +<pre><code><ul> +<li>Bird</li> +<li>Magic</li> +</ul> +</code></pre> + +<p>But this:</p> + +<pre><code>* Bird + +* Magic +</code></pre> + +<p>will turn into:</p> + +<pre><code><ul> +<li><p>Bird</p></li> +<li><p>Magic</p></li> +</ul> +</code></pre> + +<p>List items may consist of multiple paragraphs. Each subsequent +paragraph in a list item must be indented by either 4 spaces +or one tab:</p> + +<pre><code>1. This is a list item with two paragraphs. Lorem ipsum dolor + sit amet, consectetuer adipiscing elit. Aliquam hendrerit + mi posuere lectus. + + Vestibulum enim wisi, viverra nec, fringilla in, laoreet + vitae, risus. Donec sit amet nisl. Aliquam semper ipsum + sit amet velit. + +2. Suspendisse id sem consectetuer libero luctus adipiscing. +</code></pre> + +<p>It looks nice if you indent every line of the subsequent +paragraphs, but here again, Markdown will allow you to be +lazy:</p> + +<pre><code>* This is a list item with two paragraphs. + + This is the second paragraph in the list item. You're +only required to indent the first line. Lorem ipsum dolor +sit amet, consectetuer adipiscing elit. + +* Another item in the same list. +</code></pre> + +<p>To put a blockquote within a list item, the blockquote's <code>></code> +delimiters need to be indented:</p> + +<pre><code>* A list item with a blockquote: + + > This is a blockquote + > inside a list item. +</code></pre> + +<p>To put a code block within a list item, the code block needs +to be indented <em>twice</em> -- 8 spaces or two tabs:</p> + +<pre><code>* A list item with a code block: + + <code goes here> +</code></pre> + +<p>It's worth noting that it's possible to trigger an ordered list by +accident, by writing something like this:</p> + +<pre><code>1986. What a great season. +</code></pre> + +<p>In other words, a <em>number-period-space</em> sequence at the beginning of a +line. To avoid this, you can backslash-escape the period:</p> + +<pre><code>1986\. What a great season. +</code></pre> + +<h3 id="precode">Code Blocks</h3> + +<p>Pre-formatted code blocks are used for writing about programming or +markup source code. Rather than forming normal paragraphs, the lines +of a code block are interpreted literally. Markdown wraps a code block +in both <code><pre></code> and <code><code></code> tags.</p> + +<p>To produce a code block in Markdown, simply indent every line of the +block by at least 4 spaces or 1 tab. For example, given this input:</p> + +<pre><code>This is a normal paragraph: + + This is a code block. +</code></pre> + +<p>Markdown will generate:</p> + +<pre><code><p>This is a normal paragraph:</p> + +<pre><code>This is a code block. +</code></pre> +</code></pre> + +<p>One level of indentation -- 4 spaces or 1 tab -- is removed from each +line of the code block. For example, this:</p> + +<pre><code>Here is an example of AppleScript: + + tell application "Foo" + beep + end tell +</code></pre> + +<p>will turn into:</p> + +<pre><code><p>Here is an example of AppleScript:</p> + +<pre><code>tell application "Foo" + beep +end tell +</code></pre> +</code></pre> + +<p>A code block continues until it reaches a line that is not indented +(or the end of the article).</p> + +<p>Within a code block, ampersands (<code>&</code>) and angle brackets (<code><</code> and <code>></code>) +are automatically converted into HTML entities. This makes it very +easy to include example HTML source code using Markdown -- just paste +it and indent it, and Markdown will handle the hassle of encoding the +ampersands and angle brackets. For example, this:</p> + +<pre><code> <div class="footer"> + &copy; 2004 Foo Corporation + </div> +</code></pre> + +<p>will turn into:</p> + +<pre><code><pre><code>&lt;div class="footer"&gt; + &amp;copy; 2004 Foo Corporation +&lt;/div&gt; +</code></pre> +</code></pre> + +<p>Regular Markdown syntax is not processed within code blocks. E.g., +asterisks are just literal asterisks within a code block. This means +it's also easy to use Markdown to write about Markdown's own syntax.</p> + +<h3 id="hr">Horizontal Rules</h3> + +<p>You can produce a horizontal rule tag (<code><hr /></code>) by placing three or +more hyphens, asterisks, or underscores on a line by themselves. If you +wish, you may use spaces between the hyphens or asterisks. Each of the +following lines will produce a horizontal rule:</p> + +<pre><code>* * * + +*** + +***** + +- - - + +--------------------------------------- + +_ _ _ +</code></pre> + +<hr /> + +<h2 id="span">Span Elements</h2> + +<h3 id="link">Links</h3> + +<p>Markdown supports two style of links: <em>inline</em> and <em>reference</em>.</p> + +<p>In both styles, the link text is delimited by [square brackets].</p> + +<p>To create an inline link, use a set of regular parentheses immediately +after the link text's closing square bracket. Inside the parentheses, +put the URL where you want the link to point, along with an <em>optional</em> +title for the link, surrounded in quotes. For example:</p> + +<pre><code>This is [an example](http://example.com/ "Title") inline link. + +[This link](http://example.net/) has no title attribute. +</code></pre> + +<p>Will produce:</p> + +<pre><code><p>This is <a href="http://example.com/" title="Title"> +an example</a> inline link.</p> + +<p><a href="http://example.net/">This link</a> has no +title attribute.</p> +</code></pre> + +<p>If you're referring to a local resource on the same server, you can +use relative paths:</p> + +<pre><code>See my [About](/about/) page for details. +</code></pre> + +<p>Reference-style links use a second set of square brackets, inside +which you place a label of your choosing to identify the link:</p> + +<pre><code>This is [an example][id] reference-style link. +</code></pre> + +<p>You can optionally use a space to separate the sets of brackets:</p> + +<pre><code>This is [an example] [id] reference-style link. +</code></pre> + +<p>Then, anywhere in the document, you define your link label like this, +on a line by itself:</p> + +<pre><code>[id]: http://example.com/ "Optional Title Here" +</code></pre> + +<p>That is:</p> + +<ul> +<li>Square brackets containing the link identifier (optionally +indented from the left margin using up to three spaces);</li> +<li>followed by a colon;</li> +<li>followed by one or more spaces (or tabs);</li> +<li>followed by the URL for the link;</li> +<li>optionally followed by a title attribute for the link, enclosed +in double or single quotes.</li> +</ul> + +<p>The link URL may, optionally, be surrounded by angle brackets:</p> + +<pre><code>[id]: <http://example.com/> "Optional Title Here" +</code></pre> + +<p>You can put the title attribute on the next line and use extra spaces +or tabs for padding, which tends to look better with longer URLs:</p> + +<pre><code>[id]: http://example.com/longish/path/to/resource/here + "Optional Title Here" +</code></pre> + +<p>Link definitions are only used for creating links during Markdown +processing, and are stripped from your document in the HTML output.</p> + +<p>Link definition names may constist of letters, numbers, spaces, and punctuation -- but they are <em>not</em> case sensitive. E.g. these two links:</p> + +<pre><code>[link text][a] +[link text][A] +</code></pre> + +<p>are equivalent.</p> + +<p>The <em>implicit link name</em> shortcut allows you to omit the name of the +link, in which case the link text itself is used as the name. +Just use an empty set of square brackets -- e.g., to link the word +"Google" to the google.com web site, you could simply write:</p> + +<pre><code>[Google][] +</code></pre> + +<p>And then define the link:</p> + +<pre><code>[Google]: http://google.com/ +</code></pre> + +<p>Because link names may contain spaces, this shortcut even works for +multiple words in the link text:</p> + +<pre><code>Visit [Daring Fireball][] for more information. +</code></pre> + +<p>And then define the link:</p> + +<pre><code>[Daring Fireball]: http://daringfireball.net/ +</code></pre> + +<p>Link definitions can be placed anywhere in your Markdown document. I +tend to put them immediately after each paragraph in which they're +used, but if you want, you can put them all at the end of your +document, sort of like footnotes.</p> + +<p>Here's an example of reference links in action:</p> + +<pre><code>I get 10 times more traffic from [Google] [1] than from +[Yahoo] [2] or [MSN] [3]. + + [1]: http://google.com/ "Google" + [2]: http://search.yahoo.com/ "Yahoo Search" + [3]: http://search.msn.com/ "MSN Search" +</code></pre> + +<p>Using the implicit link name shortcut, you could instead write:</p> + +<pre><code>I get 10 times more traffic from [Google][] than from +[Yahoo][] or [MSN][]. + + [google]: http://google.com/ "Google" + [yahoo]: http://search.yahoo.com/ "Yahoo Search" + [msn]: http://search.msn.com/ "MSN Search" +</code></pre> + +<p>Both of the above examples will produce the following HTML output:</p> + +<pre><code><p>I get 10 times more traffic from <a href="http://google.com/" +title="Google">Google</a> than from +<a href="http://search.yahoo.com/" title="Yahoo Search">Yahoo</a> +or <a href="http://search.msn.com/" title="MSN Search">MSN</a>.</p> +</code></pre> + +<p>For comparison, here is the same paragraph written using +Markdown's inline link style:</p> + +<pre><code>I get 10 times more traffic from [Google](http://google.com/ "Google") +than from [Yahoo](http://search.yahoo.com/ "Yahoo Search") or +[MSN](http://search.msn.com/ "MSN Search"). +</code></pre> + +<p>The point of reference-style links is not that they're easier to +write. The point is that with reference-style links, your document +source is vastly more readable. Compare the above examples: using +reference-style links, the paragraph itself is only 81 characters +long; with inline-style links, it's 176 characters; and as raw HTML, +it's 234 characters. In the raw HTML, there's more markup than there +is text.</p> + +<p>With Markdown's reference-style links, a source document much more +closely resembles the final output, as rendered in a browser. By +allowing you to move the markup-related metadata out of the paragraph, +you can add links without interrupting the narrative flow of your +prose.</p> + +<h3 id="em">Emphasis</h3> + +<p>Markdown treats asterisks (<code>*</code>) and underscores (<code>_</code>) as indicators of +emphasis. Text wrapped with one <code>*</code> or <code>_</code> will be wrapped with an +HTML <code><em></code> tag; double <code>*</code>'s or <code>_</code>'s will be wrapped with an HTML +<code><strong></code> tag. E.g., this input:</p> + +<pre><code>*single asterisks* + +_single underscores_ + +**double asterisks** + +__double underscores__ +</code></pre> + +<p>will produce:</p> + +<pre><code><em>single asterisks</em> + +<em>single underscores</em> + +<strong>double asterisks</strong> + +<strong>double underscores</strong> +</code></pre> + +<p>You can use whichever style you prefer; the lone restriction is that +the same character must be used to open and close an emphasis span.</p> + +<p>Emphasis can be used in the middle of a word:</p> + +<pre><code>un*fucking*believable +</code></pre> + +<p>But if you surround an <code>*</code> or <code>_</code> with spaces, it'll be treated as a +literal asterisk or underscore.</p> + +<p>To produce a literal asterisk or underscore at a position where it +would otherwise be used as an emphasis delimiter, you can backslash +escape it:</p> + +<pre><code>\*this text is surrounded by literal asterisks\* +</code></pre> + +<h3 id="code">Code</h3> + +<p>To indicate a span of code, wrap it with backtick quotes (<code>`</code>). +Unlike a pre-formatted code block, a code span indicates code within a +normal paragraph. For example:</p> + +<pre><code>Use the `printf()` function. +</code></pre> + +<p>will produce:</p> + +<pre><code><p>Use the <code>printf()</code> function.</p> +</code></pre> + +<p>To include a literal backtick character within a code span, you can use +multiple backticks as the opening and closing delimiters:</p> + +<pre><code>``There is a literal backtick (`) here.`` +</code></pre> + +<p>which will produce this:</p> + +<pre><code><p><code>There is a literal backtick (`) here.</code></p> +</code></pre> + +<p>The backtick delimiters surrounding a code span may include spaces -- +one after the opening, one before the closing. This allows you to place +literal backtick characters at the beginning or end of a code span:</p> + +<pre><code>A single backtick in a code span: `` ` `` + +A backtick-delimited string in a code span: `` `foo` `` +</code></pre> + +<p>will produce:</p> + +<pre><code><p>A single backtick in a code span: <code>`</code></p> + +<p>A backtick-delimited string in a code span: <code>`foo`</code></p> +</code></pre> + +<p>With a code span, ampersands and angle brackets are encoded as HTML +entities automatically, which makes it easy to include example HTML +tags. Markdown will turn this:</p> + +<pre><code>Please don't use any `<blink>` tags. +</code></pre> + +<p>into:</p> + +<pre><code><p>Please don't use any <code>&lt;blink&gt;</code> tags.</p> +</code></pre> + +<p>You can write this:</p> + +<pre><code>`&#8212;` is the decimal-encoded equivalent of `&mdash;`. +</code></pre> + +<p>to produce:</p> + +<pre><code><p><code>&amp;#8212;</code> is the decimal-encoded +equivalent of <code>&amp;mdash;</code>.</p> +</code></pre> + +<h3 id="img">Images</h3> + +<p>Admittedly, it's fairly difficult to devise a "natural" syntax for +placing images into a plain text document format.</p> + +<p>Markdown uses an image syntax that is intended to resemble the syntax +for links, allowing for two styles: <em>inline</em> and <em>reference</em>.</p> + +<p>Inline image syntax looks like this:</p> + +<pre><code>![Alt text](/path/to/img.jpg) + +![Alt text](/path/to/img.jpg "Optional title") +</code></pre> + +<p>That is:</p> + +<ul> +<li>An exclamation mark: <code>!</code>;</li> +<li>followed by a set of square brackets, containing the <code>alt</code> +attribute text for the image;</li> +<li>followed by a set of parentheses, containing the URL or path to +the image, and an optional <code>title</code> attribute enclosed in double +or single quotes.</li> +</ul> + +<p>Reference-style image syntax looks like this:</p> + +<pre><code>![Alt text][id] +</code></pre> + +<p>Where "id" is the name of a defined image reference. Image references +are defined using syntax identical to link references:</p> + +<pre><code>[id]: url/to/image "Optional title attribute" +</code></pre> + +<p>As of this writing, Markdown has no syntax for specifying the +dimensions of an image; if this is important to you, you can simply +use regular HTML <code><img></code> tags.</p> + +<hr /> + +<h2 id="misc">Miscellaneous</h2> + +<h3 id="autolink">Automatic Links</h3> + +<p>Markdown supports a shortcut style for creating "automatic" links for URLs and email addresses: simply surround the URL or email address with angle brackets. What this means is that if you want to show the actual text of a URL or email address, and also have it be a clickable link, you can do this:</p> + +<pre><code><http://example.com/> +</code></pre> + +<p>Markdown will turn this into:</p> + +<pre><code><a href="http://example.com/">http://example.com/</a> +</code></pre> + +<p>Automatic links for email addresses work similarly, except that +Markdown will also perform a bit of randomized decimal and hex +entity-encoding to help obscure your address from address-harvesting +spambots. For example, Markdown will turn this:</p> + +<pre><code><address@example.com> +</code></pre> + +<p>into something like this:</p> + +<pre><code><a href="&#x6D;&#x61;i&#x6C;&#x74;&#x6F;:&#x61;&#x64;&#x64;&#x72;&#x65; +&#115;&#115;&#64;&#101;&#120;&#x61;&#109;&#x70;&#x6C;e&#x2E;&#99;&#111; +&#109;">&#x61;&#x64;&#x64;&#x72;&#x65;&#115;&#115;&#64;&#101;&#120;&#x61; +&#109;&#x70;&#x6C;e&#x2E;&#99;&#111;&#109;</a> +</code></pre> + +<p>which will render in a browser as a clickable link to "address@example.com".</p> + +<p>(This sort of entity-encoding trick will indeed fool many, if not +most, address-harvesting bots, but it definitely won't fool all of +them. It's better than nothing, but an address published in this way +will probably eventually start receiving spam.)</p> + +<h3 id="backslash">Backslash Escapes</h3> + +<p>Markdown allows you to use backslash escapes to generate literal +characters which would otherwise have special meaning in Markdown's +formatting syntax. For example, if you wanted to surround a word with +literal asterisks (instead of an HTML <code><em></code> tag), you can backslashes +before the asterisks, like this:</p> + +<pre><code>\*literal asterisks\* +</code></pre> + +<p>Markdown provides backslash escapes for the following characters:</p> + +<pre><code>\ backslash +` backtick +* asterisk +_ underscore +{} curly braces +[] square brackets +() parentheses +# hash mark ++ plus sign +- minus sign (hyphen) +. dot +! exclamation mark +</code></pre> diff --git a/tests/pl/Tests_2007/Markdown Documentation - Syntax.text b/tests/pl/Tests_2007/Markdown Documentation - Syntax.text new file mode 100644 index 0000000..f175fa9 --- /dev/null +++ b/tests/pl/Tests_2007/Markdown Documentation - Syntax.text @@ -0,0 +1,888 @@ +Markdown: Syntax +================ + +<ul id="ProjectSubmenu"> + <li><a href="/projects/markdown/" title="Markdown Project Page">Main</a></li> + <li><a href="/projects/markdown/basics" title="Markdown Basics">Basics</a></li> + <li><a class="selected" title="Markdown Syntax Documentation">Syntax</a></li> + <li><a href="/projects/markdown/license" title="Pricing and License Information">License</a></li> + <li><a href="/projects/markdown/dingus" title="Online Markdown Web Form">Dingus</a></li> +</ul> + + +* [Overview](#overview) + * [Philosophy](#philosophy) + * [Inline HTML](#html) + * [Automatic Escaping for Special Characters](#autoescape) +* [Block Elements](#block) + * [Paragraphs and Line Breaks](#p) + * [Headers](#header) + * [Blockquotes](#blockquote) + * [Lists](#list) + * [Code Blocks](#precode) + * [Horizontal Rules](#hr) +* [Span Elements](#span) + * [Links](#link) + * [Emphasis](#em) + * [Code](#code) + * [Images](#img) +* [Miscellaneous](#misc) + * [Backslash Escapes](#backslash) + * [Automatic Links](#autolink) + + +**Note:** This document is itself written using Markdown; you +can [see the source for it by adding '.text' to the URL][src]. + + [src]: /projects/markdown/syntax.text + +* * * + +<h2 id="overview">Overview</h2> + +<h3 id="philosophy">Philosophy</h3> + +Markdown is intended to be as easy-to-read and easy-to-write as is feasible. + +Readability, however, is emphasized above all else. 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. While +Markdown's syntax has been influenced by several existing text-to-HTML +filters -- including [Setext] [1], [atx] [2], [Textile] [3], [reStructuredText] [4], +[Grutatext] [5], and [EtText] [6] -- the single biggest source of +inspiration for Markdown's syntax is the format of plain text email. + + [1]: http://docutils.sourceforge.net/mirror/setext.html + [2]: http://www.aaronsw.com/2002/atx/ + [3]: http://textism.com/tools/textile/ + [4]: http://docutils.sourceforge.net/rst.html + [5]: http://www.triptico.com/software/grutatxt.html + [6]: http://ettext.taint.org/doc/ + +To this end, Markdown's syntax is comprised entirely of punctuation +characters, which punctuation characters have been carefully chosen so +as to look like what they mean. E.g., asterisks around a word actually +look like \*emphasis\*. Markdown lists look like, well, lists. Even +blockquotes look like quoted passages of text, assuming you've ever +used email. + + + +<h3 id="html">Inline HTML</h3> + +Markdown's syntax is intended for one purpose: to be used as a +format for *writing* for the web. + +Markdown is not a replacement for HTML, or even close to it. Its +syntax is very small, corresponding only to a very small subset of +HTML tags. The idea is *not* to create a syntax that makes it easier +to insert HTML tags. In my opinion, HTML tags are already easy to +insert. The idea for Markdown is to make it easy to read, write, and +edit prose. HTML is a *publishing* format; Markdown is a *writing* +format. Thus, Markdown's formatting syntax only addresses issues that +can be conveyed in plain text. + +For any markup that is not covered by Markdown's syntax, you simply +use HTML itself. There's no need to preface it or delimit it to +indicate that you're switching from Markdown to HTML; you just use +the tags. + +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. Markdown is smart enough not +to add extra (unwanted) `<p>` tags around HTML block-level tags. + +For example, to add an HTML table to a Markdown article: + + This is a regular paragraph. + + <table> + <tr> + <td>Foo</td> + </tr> + </table> + + This is another regular paragraph. + +Note that Markdown formatting syntax is not processed within block-level +HTML tags. E.g., you can't use Markdown-style `*emphasis*` inside an +HTML block. + +Span-level HTML tags -- e.g. `<span>`, `<cite>`, or `<del>` -- can be +used anywhere in a Markdown paragraph, list item, or header. If you +want, you can even use HTML tags instead of Markdown formatting; e.g. if +you'd prefer to use HTML `<a>` or `<img>` tags instead of Markdown's +link or image syntax, go right ahead. + +Unlike block-level HTML tags, Markdown syntax *is* processed within +span-level tags. + + +<h3 id="autoescape">Automatic Escaping for Special Characters</h3> + +In HTML, there are two characters that demand special treatment: `<` +and `&`. Left angle brackets are used to start tags; ampersands are +used to denote HTML entities. If you want to use them as literal +characters, you must escape them as entities, e.g. `<`, and +`&`. + +Ampersands in particular are bedeviling for web writers. If you want to +write about 'AT&T', you need to write '`AT&T`'. You even need to +escape ampersands within URLs. Thus, if you want to link to: + + http://images.google.com/images?num=30&q=larry+bird + +you need to encode the URL as: + + http://images.google.com/images?num=30&q=larry+bird + +in your anchor tag `href` attribute. Needless to say, this is easy to +forget, and is probably the single most common source of HTML validation +errors in otherwise well-marked-up web sites. + +Markdown allows you to use these characters naturally, taking care of +all the necessary escaping for you. If you use an ampersand as part of +an HTML entity, it remains unchanged; otherwise it will be translated +into `&`. + +So, if you want to include a copyright symbol in your article, you can write: + + © + +and Markdown will leave it alone. But if you write: + + AT&T + +Markdown will translate it to: + + AT&T + +Similarly, because Markdown supports [inline HTML](#html), if you use +angle brackets as delimiters for HTML tags, Markdown will treat them as +such. But if you write: + + 4 < 5 + +Markdown will translate it to: + + 4 < 5 + +However, inside Markdown code spans and blocks, angle brackets and +ampersands are *always* encoded automatically. This makes it easy to use +Markdown to write about HTML code. (As opposed to raw HTML, which is a +terrible format for writing about HTML syntax, because every single `<` +and `&` in your example code needs to be escaped.) + + +* * * + + +<h2 id="block">Block Elements</h2> + + +<h3 id="p">Paragraphs and Line Breaks</h3> + +A paragraph is simply one or more consecutive lines of text, separated +by one or more blank lines. (A blank line is any line that looks like a +blank line -- a line containing nothing but spaces or tabs is considered +blank.) Normal paragraphs should not be indented with spaces or tabs. + +The implication of the "one or more consecutive lines of text" rule is +that Markdown supports "hard-wrapped" text paragraphs. This differs +significantly from most other text-to-HTML formatters (including Movable +Type's "Convert Line Breaks" option) which translate every line break +character in a paragraph into a `<br />` tag. + +When you *do* want to insert a `<br />` break tag using Markdown, you +end a line with two or more spaces, then type return. + +Yes, this takes a tad more effort to create a `<br />`, but a simplistic +"every line break is a `<br />`" rule wouldn't work for Markdown. +Markdown's email-style [blockquoting][bq] and multi-paragraph [list items][l] +work best -- and look better -- when you format them with hard breaks. + + [bq]: #blockquote + [l]: #list + + + +<h3 id="header">Headers</h3> + +Markdown supports two styles of headers, [Setext] [1] and [atx] [2]. + +Setext-style headers are "underlined" using equal signs (for first-level +headers) and dashes (for second-level headers). For example: + + This is an H1 + ============= + + This is an H2 + ------------- + +Any number of underlining `=`'s or `-`'s will work. + +Atx-style headers use 1-6 hash characters at the start of the line, +corresponding to header levels 1-6. For example: + + # This is an H1 + + ## This is an H2 + + ###### This is an H6 + +Optionally, you may "close" atx-style headers. This is purely +cosmetic -- you can use this if you think it looks better. The +closing hashes don't even need to match the number of hashes +used to open the header. (The number of opening hashes +determines the header level.) : + + # This is an H1 # + + ## This is an H2 ## + + ### This is an H3 ###### + + +<h3 id="blockquote">Blockquotes</h3> + +Markdown uses email-style `>` characters for blockquoting. If you're +familiar with quoting passages of text in an email message, then you +know how to create a blockquote in Markdown. It looks best if you hard +wrap the text and put a `>` before every line: + + > This is a blockquote with two paragraphs. Lorem ipsum dolor sit amet, + > consectetuer adipiscing elit. Aliquam hendrerit mi posuere lectus. + > Vestibulum enim wisi, viverra nec, fringilla in, laoreet vitae, risus. + > + > Donec sit amet nisl. Aliquam semper ipsum sit amet velit. Suspendisse + > id sem consectetuer libero luctus adipiscing. + +Markdown allows you to be lazy and only put the `>` before the first +line of a hard-wrapped paragraph: + + > This is a blockquote with two paragraphs. Lorem ipsum dolor sit amet, + consectetuer adipiscing elit. Aliquam hendrerit mi posuere lectus. + Vestibulum enim wisi, viverra nec, fringilla in, laoreet vitae, risus. + + > Donec sit amet nisl. Aliquam semper ipsum sit amet velit. Suspendisse + id sem consectetuer libero luctus adipiscing. + +Blockquotes can be nested (i.e. a blockquote-in-a-blockquote) by +adding additional levels of `>`: + + > This is the first level of quoting. + > + > > This is nested blockquote. + > + > Back to the first level. + +Blockquotes can contain other Markdown elements, including headers, lists, +and code blocks: + + > ## This is a header. + > + > 1. This is the first list item. + > 2. This is the second list item. + > + > Here's some example code: + > + > return shell_exec("echo $input | $markdown_script"); + +Any decent text editor should make email-style quoting easy. For +example, with BBEdit, you can make a selection and choose Increase +Quote Level from the Text menu. + + +<h3 id="list">Lists</h3> + +Markdown supports ordered (numbered) and unordered (bulleted) lists. + +Unordered lists use asterisks, pluses, and hyphens -- interchangably +-- as list markers: + + * Red + * Green + * Blue + +is equivalent to: + + + Red + + Green + + Blue + +and: + + - Red + - Green + - Blue + +Ordered lists use numbers followed by periods: + + 1. Bird + 2. McHale + 3. Parish + +It's important to note that the actual numbers you use to mark the +list have no effect on the HTML output Markdown produces. The HTML +Markdown produces from the above list is: + + <ol> + <li>Bird</li> + <li>McHale</li> + <li>Parish</li> + </ol> + +If you instead wrote the list in Markdown like this: + + 1. Bird + 1. McHale + 1. Parish + +or even: + + 3. Bird + 1. McHale + 8. Parish + +you'd get the exact same HTML output. The point is, if you want to, +you can use ordinal numbers in your ordered Markdown lists, so that +the numbers in your source match the numbers in your published HTML. +But if you want to be lazy, you don't have to. + +If you do use lazy list numbering, however, you should still start the +list with the number 1. At some point in the future, Markdown may support +starting ordered lists at an arbitrary number. + +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. + +To make lists look nice, you can wrap items with hanging indents: + + * Lorem ipsum dolor sit amet, consectetuer adipiscing elit. + Aliquam hendrerit mi posuere lectus. Vestibulum enim wisi, + viverra nec, fringilla in, laoreet vitae, risus. + * Donec sit amet nisl. Aliquam semper ipsum sit amet velit. + Suspendisse id sem consectetuer libero luctus adipiscing. + +But if you want to be lazy, you don't have to: + + * Lorem ipsum dolor sit amet, consectetuer adipiscing elit. + Aliquam hendrerit mi posuere lectus. Vestibulum enim wisi, + viverra nec, fringilla in, laoreet vitae, risus. + * Donec sit amet nisl. Aliquam semper ipsum sit amet velit. + Suspendisse id sem consectetuer libero luctus adipiscing. + +If list items are separated by blank lines, Markdown will wrap the +items in `<p>` tags in the HTML output. For example, this input: + + * Bird + * Magic + +will turn into: + + <ul> + <li>Bird</li> + <li>Magic</li> + </ul> + +But this: + + * Bird + + * Magic + +will turn into: + + <ul> + <li><p>Bird</p></li> + <li><p>Magic</p></li> + </ul> + +List items may consist of multiple paragraphs. Each subsequent +paragraph in a list item must be indented by either 4 spaces +or one tab: + + 1. This is a list item with two paragraphs. Lorem ipsum dolor + sit amet, consectetuer adipiscing elit. Aliquam hendrerit + mi posuere lectus. + + Vestibulum enim wisi, viverra nec, fringilla in, laoreet + vitae, risus. Donec sit amet nisl. Aliquam semper ipsum + sit amet velit. + + 2. Suspendisse id sem consectetuer libero luctus adipiscing. + +It looks nice if you indent every line of the subsequent +paragraphs, but here again, Markdown will allow you to be +lazy: + + * This is a list item with two paragraphs. + + This is the second paragraph in the list item. You're + only required to indent the first line. Lorem ipsum dolor + sit amet, consectetuer adipiscing elit. + + * Another item in the same list. + +To put a blockquote within a list item, the blockquote's `>` +delimiters need to be indented: + + * A list item with a blockquote: + + > This is a blockquote + > inside a list item. + +To put a code block within a list item, the code block needs +to be indented *twice* -- 8 spaces or two tabs: + + * A list item with a code block: + + <code goes here> + + +It's worth noting that it's possible to trigger an ordered list by +accident, by writing something like this: + + 1986. What a great season. + +In other words, a *number-period-space* sequence at the beginning of a +line. To avoid this, you can backslash-escape the period: + + 1986\. What a great season. + + + +<h3 id="precode">Code Blocks</h3> + +Pre-formatted code blocks are used for writing about programming or +markup source code. Rather than forming normal paragraphs, the lines +of a code block are interpreted literally. Markdown wraps a code block +in both `<pre>` and `<code>` tags. + +To produce a code block in Markdown, simply indent every line of the +block by at least 4 spaces or 1 tab. For example, given this input: + + This is a normal paragraph: + + This is a code block. + +Markdown will generate: + + <p>This is a normal paragraph:</p> + + <pre><code>This is a code block. + </code></pre> + +One level of indentation -- 4 spaces or 1 tab -- is removed from each +line of the code block. For example, this: + + Here is an example of AppleScript: + + tell application "Foo" + beep + end tell + +will turn into: + + <p>Here is an example of AppleScript:</p> + + <pre><code>tell application "Foo" + beep + end tell + </code></pre> + +A code block continues until it reaches a line that is not indented +(or the end of the article). + +Within a code block, ampersands (`&`) and angle brackets (`<` and `>`) +are automatically converted into HTML entities. This makes it very +easy to include example HTML source code using Markdown -- just paste +it and indent it, and Markdown will handle the hassle of encoding the +ampersands and angle brackets. For example, this: + + <div class="footer"> + © 2004 Foo Corporation + </div> + +will turn into: + + <pre><code><div class="footer"> + &copy; 2004 Foo Corporation + </div> + </code></pre> + +Regular Markdown syntax is not processed within code blocks. E.g., +asterisks are just literal asterisks within a code block. This means +it's also easy to use Markdown to write about Markdown's own syntax. + + + +<h3 id="hr">Horizontal Rules</h3> + +You can produce a horizontal rule tag (`<hr />`) by placing three or +more hyphens, asterisks, or underscores on a line by themselves. If you +wish, you may use spaces between the hyphens or asterisks. Each of the +following lines will produce a horizontal rule: + + * * * + + *** + + ***** + + - - - + + --------------------------------------- + + _ _ _ + + +* * * + +<h2 id="span">Span Elements</h2> + +<h3 id="link">Links</h3> + +Markdown supports two style of links: *inline* and *reference*. + +In both styles, the link text is delimited by [square brackets]. + +To create an inline link, use a set of regular parentheses immediately +after the link text's closing square bracket. Inside the parentheses, +put the URL where you want the link to point, along with an *optional* +title for the link, surrounded in quotes. For example: + + This is [an example](http://example.com/ "Title") inline link. + + [This link](http://example.net/) has no title attribute. + +Will produce: + + <p>This is <a href="http://example.com/" title="Title"> + an example</a> inline link.</p> + + <p><a href="http://example.net/">This link</a> has no + title attribute.</p> + +If you're referring to a local resource on the same server, you can +use relative paths: + + See my [About](/about/) page for details. + +Reference-style links use a second set of square brackets, inside +which you place a label of your choosing to identify the link: + + This is [an example][id] reference-style link. + +You can optionally use a space to separate the sets of brackets: + + This is [an example] [id] reference-style link. + +Then, anywhere in the document, you define your link label like this, +on a line by itself: + + [id]: http://example.com/ "Optional Title Here" + +That is: + +* Square brackets containing the link identifier (optionally + indented from the left margin using up to three spaces); +* followed by a colon; +* followed by one or more spaces (or tabs); +* followed by the URL for the link; +* optionally followed by a title attribute for the link, enclosed + in double or single quotes. + +The link URL may, optionally, be surrounded by angle brackets: + + [id]: <http://example.com/> "Optional Title Here" + +You can put the title attribute on the next line and use extra spaces +or tabs for padding, which tends to look better with longer URLs: + + [id]: http://example.com/longish/path/to/resource/here + "Optional Title Here" + +Link definitions are only used for creating links during Markdown +processing, and are stripped from your document in the HTML output. + +Link definition names may constist of letters, numbers, spaces, and punctuation -- but they are *not* case sensitive. E.g. these two links: + + [link text][a] + [link text][A] + +are equivalent. + +The *implicit link name* shortcut allows you to omit the name of the +link, in which case the link text itself is used as the name. +Just use an empty set of square brackets -- e.g., to link the word +"Google" to the google.com web site, you could simply write: + + [Google][] + +And then define the link: + + [Google]: http://google.com/ + +Because link names may contain spaces, this shortcut even works for +multiple words in the link text: + + Visit [Daring Fireball][] for more information. + +And then define the link: + + [Daring Fireball]: http://daringfireball.net/ + +Link definitions can be placed anywhere in your Markdown document. I +tend to put them immediately after each paragraph in which they're +used, but if you want, you can put them all at the end of your +document, sort of like footnotes. + +Here's an example of reference links in action: + + I get 10 times more traffic from [Google] [1] than from + [Yahoo] [2] or [MSN] [3]. + + [1]: http://google.com/ "Google" + [2]: http://search.yahoo.com/ "Yahoo Search" + [3]: http://search.msn.com/ "MSN Search" + +Using the implicit link name shortcut, you could instead write: + + I get 10 times more traffic from [Google][] than from + [Yahoo][] or [MSN][]. + + [google]: http://google.com/ "Google" + [yahoo]: http://search.yahoo.com/ "Yahoo Search" + [msn]: http://search.msn.com/ "MSN Search" + +Both of the above examples will produce the following HTML output: + + <p>I get 10 times more traffic from <a href="http://google.com/" + title="Google">Google</a> than from + <a href="http://search.yahoo.com/" title="Yahoo Search">Yahoo</a> + or <a href="http://search.msn.com/" title="MSN Search">MSN</a>.</p> + +For comparison, here is the same paragraph written using +Markdown's inline link style: + + I get 10 times more traffic from [Google](http://google.com/ "Google") + than from [Yahoo](http://search.yahoo.com/ "Yahoo Search") or + [MSN](http://search.msn.com/ "MSN Search"). + +The point of reference-style links is not that they're easier to +write. The point is that with reference-style links, your document +source is vastly more readable. Compare the above examples: using +reference-style links, the paragraph itself is only 81 characters +long; with inline-style links, it's 176 characters; and as raw HTML, +it's 234 characters. In the raw HTML, there's more markup than there +is text. + +With Markdown's reference-style links, a source document much more +closely resembles the final output, as rendered in a browser. By +allowing you to move the markup-related metadata out of the paragraph, +you can add links without interrupting the narrative flow of your +prose. + + +<h3 id="em">Emphasis</h3> + +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. E.g., this input: + + *single asterisks* + + _single underscores_ + + **double asterisks** + + __double underscores__ + +will produce: + + <em>single asterisks</em> + + <em>single underscores</em> + + <strong>double asterisks</strong> + + <strong>double underscores</strong> + +You can use whichever style you prefer; the lone restriction is that +the same character must be used to open and close an emphasis span. + +Emphasis can be used in the middle of a word: + + un*fucking*believable + +But if you surround an `*` or `_` with spaces, it'll be treated as a +literal asterisk or underscore. + +To produce a literal asterisk or underscore at a position where it +would otherwise be used as an emphasis delimiter, you can backslash +escape it: + + \*this text is surrounded by literal asterisks\* + + + +<h3 id="code">Code</h3> + +To indicate a span of code, wrap it with backtick quotes (`` ` ``). +Unlike a pre-formatted code block, a code span indicates code within a +normal paragraph. For example: + + Use the `printf()` function. + +will produce: + + <p>Use the <code>printf()</code> function.</p> + +To include a literal backtick character within a code span, you can use +multiple backticks as the opening and closing delimiters: + + ``There is a literal backtick (`) here.`` + +which will produce this: + + <p><code>There is a literal backtick (`) here.</code></p> + +The backtick delimiters surrounding a code span may include spaces -- +one after the opening, one before the closing. This allows you to place +literal backtick characters at the beginning or end of a code span: + + A single backtick in a code span: `` ` `` + + A backtick-delimited string in a code span: `` `foo` `` + +will produce: + + <p>A single backtick in a code span: <code>`</code></p> + + <p>A backtick-delimited string in a code span: <code>`foo`</code></p> + +With a code span, ampersands and angle brackets are encoded as HTML +entities automatically, which makes it easy to include example HTML +tags. Markdown will turn this: + + Please don't use any `<blink>` tags. + +into: + + <p>Please don't use any <code><blink></code> tags.</p> + +You can write this: + + `—` is the decimal-encoded equivalent of `—`. + +to produce: + + <p><code>&#8212;</code> is the decimal-encoded + equivalent of <code>&mdash;</code>.</p> + + + +<h3 id="img">Images</h3> + +Admittedly, it's fairly difficult to devise a "natural" syntax for +placing images into a plain text document format. + +Markdown uses an image syntax that is intended to resemble the syntax +for links, allowing for two styles: *inline* and *reference*. + +Inline image syntax looks like this: + + ![Alt text](/path/to/img.jpg) + + ![Alt text](/path/to/img.jpg "Optional title") + +That is: + +* An exclamation mark: `!`; +* followed by a set of square brackets, containing the `alt` + attribute text for the image; +* followed by a set of parentheses, containing the URL or path to + the image, and an optional `title` attribute enclosed in double + or single quotes. + +Reference-style image syntax looks like this: + + ![Alt text][id] + +Where "id" is the name of a defined image reference. Image references +are defined using syntax identical to link references: + + [id]: url/to/image "Optional title attribute" + +As of this writing, Markdown has no syntax for specifying the +dimensions of an image; if this is important to you, you can simply +use regular HTML `<img>` tags. + + +* * * + + +<h2 id="misc">Miscellaneous</h2> + +<h3 id="autolink">Automatic Links</h3> + +Markdown supports a shortcut style for creating "automatic" links for URLs and email addresses: simply surround the URL or email address with angle brackets. What this means is that if you want to show the actual text of a URL or email address, and also have it be a clickable link, you can do this: + + <http://example.com/> + +Markdown will turn this into: + + <a href="http://example.com/">http://example.com/</a> + +Automatic links for email addresses work similarly, except that +Markdown will also perform a bit of randomized decimal and hex +entity-encoding to help obscure your address from address-harvesting +spambots. For example, Markdown will turn this: + + <address@example.com> + +into something like this: + + <a href="mailto:addre + ss@example.co + m">address@exa + mple.com</a> + +which will render in a browser as a clickable link to "address@example.com". + +(This sort of entity-encoding trick will indeed fool many, if not +most, address-harvesting bots, but it definitely won't fool all of +them. It's better than nothing, but an address published in this way +will probably eventually start receiving spam.) + + + +<h3 id="backslash">Backslash Escapes</h3> + +Markdown allows you to use backslash escapes to generate literal +characters which would otherwise have special meaning in Markdown's +formatting syntax. For example, if you wanted to surround a word with +literal asterisks (instead of an HTML `<em>` tag), you can backslashes +before the asterisks, like this: + + \*literal asterisks\* + +Markdown provides backslash escapes for the following characters: + + \ backslash + ` backtick + * asterisk + _ underscore + {} curly braces + [] square brackets + () parentheses + # hash mark + + plus sign + - minus sign (hyphen) + . dot + ! exclamation mark + diff --git a/tests/pl/Tests_2007/Nested blockquotes.html b/tests/pl/Tests_2007/Nested blockquotes.html new file mode 100644 index 0000000..d8ec7f8 --- /dev/null +++ b/tests/pl/Tests_2007/Nested blockquotes.html @@ -0,0 +1,9 @@ +<blockquote> + <p>foo</p> + + <blockquote> + <p>bar</p> + </blockquote> + + <p>foo</p> +</blockquote> diff --git a/tests/pl/Tests_2007/Nested blockquotes.text b/tests/pl/Tests_2007/Nested blockquotes.text new file mode 100644 index 0000000..ed3c624 --- /dev/null +++ b/tests/pl/Tests_2007/Nested blockquotes.text @@ -0,0 +1,5 @@ +> foo +> +> > bar +> +> foo diff --git a/tests/pl/Tests_2007/Ordered and unordered lists.html b/tests/pl/Tests_2007/Ordered and unordered lists.html new file mode 100644 index 0000000..ba71eab --- /dev/null +++ b/tests/pl/Tests_2007/Ordered and unordered lists.html @@ -0,0 +1,148 @@ +<h2>Unordered</h2> + +<p>Asterisks tight:</p> + +<ul> +<li>asterisk 1</li> +<li>asterisk 2</li> +<li>asterisk 3</li> +</ul> + +<p>Asterisks loose:</p> + +<ul> +<li><p>asterisk 1</p></li> +<li><p>asterisk 2</p></li> +<li><p>asterisk 3</p></li> +</ul> + +<hr /> + +<p>Pluses tight:</p> + +<ul> +<li>Plus 1</li> +<li>Plus 2</li> +<li>Plus 3</li> +</ul> + +<p>Pluses loose:</p> + +<ul> +<li><p>Plus 1</p></li> +<li><p>Plus 2</p></li> +<li><p>Plus 3</p></li> +</ul> + +<hr /> + +<p>Minuses tight:</p> + +<ul> +<li>Minus 1</li> +<li>Minus 2</li> +<li>Minus 3</li> +</ul> + +<p>Minuses loose:</p> + +<ul> +<li><p>Minus 1</p></li> +<li><p>Minus 2</p></li> +<li><p>Minus 3</p></li> +</ul> + +<h2>Ordered</h2> + +<p>Tight:</p> + +<ol> +<li>First</li> +<li>Second</li> +<li>Third</li> +</ol> + +<p>and:</p> + +<ol> +<li>One</li> +<li>Two</li> +<li>Three</li> +</ol> + +<p>Loose using tabs:</p> + +<ol> +<li><p>First</p></li> +<li><p>Second</p></li> +<li><p>Third</p></li> +</ol> + +<p>and using spaces:</p> + +<ol> +<li><p>One</p></li> +<li><p>Two</p></li> +<li><p>Three</p></li> +</ol> + +<p>Multiple paragraphs:</p> + +<ol> +<li><p>Item 1, graf one.</p> + +<p>Item 2. graf two. The quick brown fox jumped over the lazy dog's +back.</p></li> +<li><p>Item 2.</p></li> +<li><p>Item 3.</p></li> +</ol> + +<h2>Nested</h2> + +<ul> +<li>Tab +<ul> +<li>Tab +<ul> +<li>Tab</li> +</ul></li> +</ul></li> +</ul> + +<p>Here's another:</p> + +<ol> +<li>First</li> +<li>Second: +<ul> +<li>Fee</li> +<li>Fie</li> +<li>Foe</li> +</ul></li> +<li>Third</li> +</ol> + +<p>Same thing but with paragraphs:</p> + +<ol> +<li><p>First</p></li> +<li><p>Second:</p> + +<ul> +<li>Fee</li> +<li>Fie</li> +<li>Foe</li> +</ul></li> +<li><p>Third</p></li> +</ol> + + +<p>This was an error in Markdown 1.0.1:</p> + +<ul> +<li><p>this</p> + +<ul><li>sub</li></ul> + +<p>that</p></li> +</ul> diff --git a/tests/pl/Tests_2007/Ordered and unordered lists.text b/tests/pl/Tests_2007/Ordered and unordered lists.text new file mode 100644 index 0000000..7f3b497 --- /dev/null +++ b/tests/pl/Tests_2007/Ordered and unordered lists.text @@ -0,0 +1,131 @@ +## Unordered + +Asterisks tight: + +* asterisk 1 +* asterisk 2 +* asterisk 3 + + +Asterisks loose: + +* asterisk 1 + +* asterisk 2 + +* asterisk 3 + +* * * + +Pluses tight: + ++ Plus 1 ++ Plus 2 ++ Plus 3 + + +Pluses loose: + ++ Plus 1 + ++ Plus 2 + ++ Plus 3 + +* * * + + +Minuses tight: + +- Minus 1 +- Minus 2 +- Minus 3 + + +Minuses loose: + +- Minus 1 + +- Minus 2 + +- Minus 3 + + +## Ordered + +Tight: + +1. First +2. Second +3. Third + +and: + +1. One +2. Two +3. Three + + +Loose using tabs: + +1. First + +2. Second + +3. Third + +and using spaces: + +1. One + +2. Two + +3. Three + +Multiple paragraphs: + +1. Item 1, graf one. + + Item 2. graf two. The quick brown fox jumped over the lazy dog's + back. + +2. Item 2. + +3. Item 3. + + + +## Nested + +* Tab + * Tab + * Tab + +Here's another: + +1. First +2. Second: + * Fee + * Fie + * Foe +3. Third + +Same thing but with paragraphs: + +1. First + +2. Second: + * Fee + * Fie + * Foe + +3. Third + + +This was an error in Markdown 1.0.1: + +* this + + * sub + + that diff --git a/tests/pl/Tests_2007/Strong and em together.html b/tests/pl/Tests_2007/Strong and em together.html new file mode 100644 index 0000000..71ec78c --- /dev/null +++ b/tests/pl/Tests_2007/Strong and em together.html @@ -0,0 +1,7 @@ +<p><strong><em>This is strong and em.</em></strong></p> + +<p>So is <strong><em>this</em></strong> word.</p> + +<p><strong><em>This is strong and em.</em></strong></p> + +<p>So is <strong><em>this</em></strong> word.</p> diff --git a/tests/pl/Tests_2007/Strong and em together.text b/tests/pl/Tests_2007/Strong and em together.text new file mode 100644 index 0000000..95ee690 --- /dev/null +++ b/tests/pl/Tests_2007/Strong and em together.text @@ -0,0 +1,7 @@ +***This is strong and em.*** + +So is ***this*** word. + +___This is strong and em.___ + +So is ___this___ word. diff --git a/tests/pl/Tests_2007/Tabs.html b/tests/pl/Tests_2007/Tabs.html new file mode 100644 index 0000000..3301ba8 --- /dev/null +++ b/tests/pl/Tests_2007/Tabs.html @@ -0,0 +1,25 @@ +<ul> +<li><p>this is a list item +indented with tabs</p></li> +<li><p>this is a list item +indented with spaces</p></li> +</ul> + +<p>Code:</p> + +<pre><code>this code block is indented by one tab +</code></pre> + +<p>And:</p> + +<pre><code> this code block is indented by two tabs +</code></pre> + +<p>And:</p> + +<pre><code>+ this is an example list item + indented with tabs + ++ this is an example list item + indented with spaces +</code></pre> diff --git a/tests/pl/Tests_2007/Tabs.text b/tests/pl/Tests_2007/Tabs.text new file mode 100644 index 0000000..589d113 --- /dev/null +++ b/tests/pl/Tests_2007/Tabs.text @@ -0,0 +1,21 @@ ++ this is a list item + indented with tabs + ++ this is a list item + indented with spaces + +Code: + + this code block is indented by one tab + +And: + + this code block is indented by two tabs + +And: + + + this is an example list item + indented with tabs + + + this is an example list item + indented with spaces diff --git a/tests/pl/Tests_2007/Tidyness.html b/tests/pl/Tests_2007/Tidyness.html new file mode 100644 index 0000000..f2a8ce7 --- /dev/null +++ b/tests/pl/Tests_2007/Tidyness.html @@ -0,0 +1,8 @@ +<blockquote> +<p>A list within a blockquote:</p> +<ul> +<li>asterisk 1</li> +<li>asterisk 2</li> +<li>asterisk 3</li> +</ul> +</blockquote> diff --git a/tests/pl/Tests_2007/Tidyness.text b/tests/pl/Tests_2007/Tidyness.text new file mode 100644 index 0000000..5f18b8d --- /dev/null +++ b/tests/pl/Tests_2007/Tidyness.text @@ -0,0 +1,5 @@ +> A list within a blockquote: +> +> * asterisk 1 +> * asterisk 2 +> * asterisk 3 diff --git a/tests/safe_mode/inline-html-advanced.html b/tests/safe_mode/inline-html-advanced.html deleted file mode 100644 index e9dd2ec..0000000 --- a/tests/safe_mode/inline-html-advanced.html +++ /dev/null @@ -1,11 +0,0 @@ -<p>Simple block on one line:</p> -<p><div>foo</div></p> -<p>And nested without indentation:</p> -<p><div> -<div> -<div> -foo -</div> -</div> -<div>bar</div> -</div></p>
\ No newline at end of file diff --git a/tests/safe_mode/inline-html-advanced.txt b/tests/safe_mode/inline-html-advanced.txt deleted file mode 100644 index 9d71ddc..0000000 --- a/tests/safe_mode/inline-html-advanced.txt +++ /dev/null @@ -1,14 +0,0 @@ -Simple block on one line: - -<div>foo</div> - -And nested without indentation: - -<div> -<div> -<div> -foo -</div> -</div> -<div>bar</div> -</div> diff --git a/tests/safe_mode/inline-html-comments.html b/tests/safe_mode/inline-html-comments.html deleted file mode 100644 index 0f1e417..0000000 --- a/tests/safe_mode/inline-html-comments.html +++ /dev/null @@ -1,8 +0,0 @@ -<p>Paragraph one.</p> -<p><!-- This is a simple comment --></p> -<p><!-- - This is another comment. ---></p> -<p>Paragraph two.</p> -<p><!-- one comment block -- -- with two comments --></p> -<p>The end.</p>
\ No newline at end of file diff --git a/tests/safe_mode/script_tags.html b/tests/safe_mode/script_tags.html deleted file mode 100644 index df63ffc..0000000 --- a/tests/safe_mode/script_tags.html +++ /dev/null @@ -1,28 +0,0 @@ -<p>This should be stripped/escaped in safe_mode.</p> -<p><script> -alert("Hello world!") -</script></p> -<p>With blank lines.</p> -<p><script> - -alert("Hello world!") - -</script></p> -<p>Now with some weirdness</p> -<p><code><script <!-- -alert("Hello world!") -</script <></code> `</p> -<p>Try another way.</p> -<p><script <!-- -alert("Hello world!") -</script <> - -This time with blank lines. - -<script <!-- - -alert("Hello world!") - -</script <> - -</p>
\ No newline at end of file diff --git a/tests/safe_mode/script_tags.txt b/tests/safe_mode/script_tags.txt deleted file mode 100644 index 44041c2..0000000 --- a/tests/safe_mode/script_tags.txt +++ /dev/null @@ -1,33 +0,0 @@ -This should be stripped/escaped in safe_mode. - -<script> -alert("Hello world!") -</script> - -With blank lines. - -<script> - -alert("Hello world!") - -</script> - -Now with some weirdness - -``<script <!-- -alert("Hello world!") -</script <>`` ` - -Try another way. - -<script <!-- -alert("Hello world!") -</script <> - -This time with blank lines. - -<script <!-- - -alert("Hello world!") - -</script <> diff --git a/tests/safe_mode/unsafe_urls.html b/tests/safe_mode/unsafe_urls.html deleted file mode 100644 index e617f35..0000000 --- a/tests/safe_mode/unsafe_urls.html +++ /dev/null @@ -1,20 +0,0 @@ -<p>These links should be unsafe and not allowed in safe_mode</p> -<p><a href="">link</a> -<a href="">link</a> -<a href="">link</a> -<a href="">link</a> -<a href="">link</a> -<a href="">link</a> -<a href="">link</a> -<a href="">link</a> -<a href="">link</a> -<a href="">link</a> -<a href="">link</a></p> -<p><img alt="img" src="" /> -<a href="">ref</a> -<img alt="imgref" src="" /></p> -<p>These should work regardless:</p> -<p><a href="relative/url.html">relative</a> -<a href="mailto:foo@bar.com">email</a> -<a href="news:some.news.group.com">news scheme</a> -<a href="http://example.com">http link</a></p>
\ No newline at end of file diff --git a/tests/safe_mode/unsafe_urls.txt b/tests/safe_mode/unsafe_urls.txt deleted file mode 100644 index 7bfd81d..0000000 --- a/tests/safe_mode/unsafe_urls.txt +++ /dev/null @@ -1,27 +0,0 @@ -These links should be unsafe and not allowed in safe_mode - -[link](javascript:alert%28'Hello%20world!'%29) -[link](vbscript:msgbox%28%22Hello%20world!%22%29) -[link](livescript:alert%28'Hello%20world!'%29) -[link](mocha:[code]) -[link](jAvAsCrIpT:alert%28'Hello%20world!'%29) -[link](ja vas cr ipt:alert%28'Hello%20world!'%29) -[link](ja vas cr ipt:alert%28'Hello%20world!'%29) -[link](ja vas cr ipt:alert%28'Hello%20world!'%29) -[link](ja%09 %0Avas cr
ipt:alert%28'Hello%20world!'%29) -[link](ja%20vas%20cr%20ipt:alert%28'Hello%20world!'%29) -[link](live%20script:alert%28'Hello%20world!'%29) - -![img](javascript:alert%29'XSS'%29) -[ref][] -![imgref][] - -[ref]: javascript:alert%29'XSS'%29 -[imgref]: javascript:alert%29'XSS'%29 - -These should work regardless: - -[relative](relative/url.html) -[email](mailto:foo@bar.com) -[news scheme](news:some.news.group.com) -[http link](http://example.com) diff --git a/tests/test_apis.py b/tests/test_apis.py new file mode 100644 index 0000000..1a38be6 --- /dev/null +++ b/tests/test_apis.py @@ -0,0 +1,957 @@ +""" +Python Markdown + +A Python implementation of John Gruber's Markdown. + +Documentation: https://python-markdown.github.io/ +GitHub: https://github.com/Python-Markdown/markdown/ +PyPI: https://pypi.org/project/Markdown/ + +Started by Manfred Stienstra (http://www.dwerg.net/). +Maintained for a few years by Yuri Takhteyev (http://www.freewisdom.org). +Currently maintained by Waylan Limberg (https://github.com/waylan), +Dmitry Shachnev (https://github.com/mitya57) and Isaac Muse (https://github.com/facelessuser). + +Copyright 2007-2018 The Python Markdown Project (v. 1.7 and later) +Copyright 2004, 2005, 2006 Yuri Takhteyev (v. 0.2-1.6b) +Copyright 2004 Manfred Stienstra (the original version) + +License: BSD (see LICENSE.md for details). + +Python-Markdown Regression Tests +================================ + +Tests of the various APIs with the python markdown lib. +""" + +import unittest +import sys +import os +import markdown +import warnings +from markdown.__main__ import parse_options +from logging import DEBUG, WARNING, CRITICAL +import yaml +import tempfile +from io import BytesIO +import xml.etree.ElementTree as etree +from xml.etree.ElementTree import ProcessingInstruction + + +class TestMarkdownBasics(unittest.TestCase): + """ Tests basics of the Markdown class. """ + + def setUp(self): + """ Create instance of Markdown. """ + self.md = markdown.Markdown() + + def testBlankInput(self): + """ Test blank input. """ + self.assertEqual(self.md.convert(''), '') + + def testWhitespaceOnly(self): + """ Test input of only whitespace. """ + self.assertEqual(self.md.convert(' '), '') + + def testSimpleInput(self): + """ Test simple input. """ + self.assertEqual(self.md.convert('foo'), '<p>foo</p>') + + def testInstanceExtension(self): + """ Test Extension loading with a class instance. """ + from markdown.extensions.footnotes import FootnoteExtension + markdown.Markdown(extensions=[FootnoteExtension()]) + + def testEntryPointExtension(self): + """ Test Extension loading with an entry point. """ + markdown.Markdown(extensions=['footnotes']) + + def testDotNotationExtension(self): + """ Test Extension loading with Name (`path.to.module`). """ + markdown.Markdown(extensions=['markdown.extensions.footnotes']) + + def testDotNotationExtensionWithClass(self): + """ Test Extension loading with class name (`path.to.module:Class`). """ + markdown.Markdown(extensions=['markdown.extensions.footnotes:FootnoteExtension']) + + +class TestConvertFile(unittest.TestCase): + """ Tests of ConvertFile. """ + + def setUp(self): + self.saved = sys.stdin, sys.stdout + sys.stdin = BytesIO(bytes('foo', encoding='utf-8')) + sys.stdout = BytesIO() + + def tearDown(self): + sys.stdin, sys.stdout = self.saved + + def getTempFiles(self, src): + """ Return the file names for two temp files. """ + infd, infile = tempfile.mkstemp(suffix='.txt') + with os.fdopen(infd, 'w') as fp: + fp.write(src) + outfd, outfile = tempfile.mkstemp(suffix='.html') + return infile, outfile, outfd + + def testFileNames(self): + infile, outfile, outfd = self.getTempFiles('foo') + markdown.markdownFromFile(input=infile, output=outfile) + with os.fdopen(outfd, 'r') as fp: + output = fp.read() + self.assertEqual(output, '<p>foo</p>') + + def testFileObjects(self): + infile = BytesIO(bytes('foo', encoding='utf-8')) + outfile = BytesIO() + markdown.markdownFromFile(input=infile, output=outfile) + outfile.seek(0) + self.assertEqual(outfile.read().decode('utf-8'), '<p>foo</p>') + + def testStdinStdout(self): + markdown.markdownFromFile() + sys.stdout.seek(0) + self.assertEqual(sys.stdout.read().decode('utf-8'), '<p>foo</p>') + + +class TestBlockParser(unittest.TestCase): + """ Tests of the BlockParser class. """ + + def setUp(self): + """ Create instance of BlockParser. """ + self.parser = markdown.Markdown().parser + + def testParseChunk(self): + """ Test BlockParser.parseChunk. """ + root = etree.Element("div") + text = 'foo' + self.parser.parseChunk(root, text) + self.assertEqual( + markdown.serializers.to_xhtml_string(root), + "<div><p>foo</p></div>" + ) + + def testParseDocument(self): + """ Test BlockParser.parseDocument. """ + lines = ['#foo', '', 'bar', '', ' baz'] + tree = self.parser.parseDocument(lines) + self.assertIsInstance(tree, etree.ElementTree) + self.assertIs(etree.iselement(tree.getroot()), True) + self.assertEqual( + markdown.serializers.to_xhtml_string(tree.getroot()), + "<div><h1>foo</h1><p>bar</p><pre><code>baz\n</code></pre></div>" + ) + + +class TestBlockParserState(unittest.TestCase): + """ Tests of the State class for BlockParser. """ + + def setUp(self): + self.state = markdown.blockparser.State() + + def testBlankState(self): + """ Test State when empty. """ + self.assertEqual(self.state, []) + + def testSetSate(self): + """ Test State.set(). """ + self.state.set('a_state') + self.assertEqual(self.state, ['a_state']) + self.state.set('state2') + self.assertEqual(self.state, ['a_state', 'state2']) + + def testIsSate(self): + """ Test State.isstate(). """ + self.assertEqual(self.state.isstate('anything'), False) + self.state.set('a_state') + self.assertEqual(self.state.isstate('a_state'), True) + self.state.set('state2') + self.assertEqual(self.state.isstate('state2'), True) + self.assertEqual(self.state.isstate('a_state'), False) + self.assertEqual(self.state.isstate('missing'), False) + + def testReset(self): + """ Test State.reset(). """ + self.state.set('a_state') + self.state.reset() + self.assertEqual(self.state, []) + self.state.set('state1') + self.state.set('state2') + self.state.reset() + self.assertEqual(self.state, ['state1']) + + +class TestHtmlStash(unittest.TestCase): + """ Test Markdown's HtmlStash. """ + + def setUp(self): + self.stash = markdown.util.HtmlStash() + self.placeholder = self.stash.store('foo') + + def testSimpleStore(self): + """ Test HtmlStash.store. """ + self.assertEqual(self.placeholder, self.stash.get_placeholder(0)) + self.assertEqual(self.stash.html_counter, 1) + self.assertEqual(self.stash.rawHtmlBlocks, ['foo']) + + def testStoreMore(self): + """ Test HtmlStash.store with additional blocks. """ + placeholder = self.stash.store('bar') + self.assertEqual(placeholder, self.stash.get_placeholder(1)) + self.assertEqual(self.stash.html_counter, 2) + self.assertEqual( + self.stash.rawHtmlBlocks, + ['foo', 'bar'] + ) + + def testReset(self): + """ Test HtmlStash.reset. """ + self.stash.reset() + self.assertEqual(self.stash.html_counter, 0) + self.assertEqual(self.stash.rawHtmlBlocks, []) + + +class Item: + """ A dummy Registry item object for testing. """ + def __init__(self, data): + self.data = data + + def __repr__(self): + return repr(self.data) + + def __eq__(self, other): + return self.data == other + + +class RegistryTests(unittest.TestCase): + """ Test the processor registry. """ + + def testCreateRegistry(self): + r = markdown.util.Registry() + r.register(Item('a'), 'a', 20) + self.assertEqual(len(r), 1) + self.assertIsInstance(r, markdown.util.Registry) + + def testRegisterWithoutPriority(self): + r = markdown.util.Registry() + with self.assertRaises(TypeError): + r.register(Item('a')) + + def testSortRegistry(self): + r = markdown.util.Registry() + r.register(Item('a'), 'a', 20) + r.register(Item('b'), 'b', 21) + r.register(Item('c'), 'c', 20.5) + self.assertEqual(len(r), 3) + self.assertEqual(list(r), ['b', 'c', 'a']) + + def testIsSorted(self): + r = markdown.util.Registry() + self.assertIs(r._is_sorted, False) + r.register(Item('a'), 'a', 20) + list(r) + self.assertIs(r._is_sorted, True) + r.register(Item('b'), 'b', 21) + self.assertIs(r._is_sorted, False) + r['a'] + self.assertIs(r._is_sorted, True) + r._is_sorted = False + r.get_index_for_name('a') + self.assertIs(r._is_sorted, True) + r._is_sorted = False + repr(r) + self.assertIs(r._is_sorted, True) + + def testDeregister(self): + r = markdown.util.Registry() + r.register(Item('a'), 'a', 20) + r.register(Item('b'), 'b', 30) + r.register(Item('c'), 'c', 40) + self.assertEqual(len(r), 3) + r.deregister('b') + self.assertEqual(len(r), 2) + r.deregister('c', strict=False) + self.assertEqual(len(r), 1) + # deregister non-existent item with strict=False + r.deregister('d', strict=False) + self.assertEqual(len(r), 1) + with self.assertRaises(ValueError): + # deregister non-existent item with strict=True + r.deregister('e') + self.assertEqual(list(r), ['a']) + + def testRegistryContains(self): + r = markdown.util.Registry() + item = Item('a') + r.register(item, 'a', 20) + self.assertIs('a' in r, True) + self.assertIn(item, r) + self.assertNotIn('b', r) + + def testRegistryIter(self): + r = markdown.util.Registry() + r.register(Item('a'), 'a', 20) + r.register(Item('b'), 'b', 30) + self.assertEqual(list(r), ['b', 'a']) + + def testRegistryGetItemByIndex(self): + r = markdown.util.Registry() + r.register(Item('a'), 'a', 20) + r.register(Item('b'), 'b', 30) + self.assertEqual(r[0], 'b') + self.assertEqual(r[1], 'a') + with self.assertRaises(IndexError): + r[3] + + def testRegistryGetItemByItem(self): + r = markdown.util.Registry() + r.register(Item('a'), 'a', 20) + r.register(Item('b'), 'b', 30) + self.assertEqual(r['a'], 'a') + self.assertEqual(r['b'], 'b') + with self.assertRaises(KeyError): + r['c'] + + def testRegistrySetItem(self): + r = markdown.util.Registry() + with self.assertRaises(TypeError): + r[0] = 'a' + with self.assertRaises(TypeError): + r['a'] = 'a' + + def testRegistryDelItem(self): + r = markdown.util.Registry() + r.register(Item('a'), 'a', 20) + with self.assertRaises(TypeError): + del r[0] + with self.assertRaises(TypeError): + del r['a'] + + def testRegistrySlice(self): + r = markdown.util.Registry() + r.register(Item('a'), 'a', 20) + r.register(Item('b'), 'b', 30) + r.register(Item('c'), 'c', 40) + slc = r[1:] + self.assertEqual(len(slc), 2) + self.assertIsInstance(slc, markdown.util.Registry) + self.assertEqual(list(slc), ['b', 'a']) + + def testGetIndexForName(self): + r = markdown.util.Registry() + r.register(Item('a'), 'a', 20) + r.register(Item('b'), 'b', 30) + self.assertEqual(r.get_index_for_name('a'), 1) + self.assertEqual(r.get_index_for_name('b'), 0) + with self.assertRaises(ValueError): + r.get_index_for_name('c') + + def testRegisterDupplicate(self): + r = markdown.util.Registry() + r.register(Item('a'), 'a', 20) + r.register(Item('b1'), 'b', 10) + self.assertEqual(list(r), ['a', 'b1']) + self.assertEqual(len(r), 2) + r.register(Item('b2'), 'b', 30) + self.assertEqual(len(r), 2) + self.assertEqual(list(r), ['b2', 'a']) + + +class TestErrors(unittest.TestCase): + """ Test Error Reporting. """ + + def setUp(self): + # Set warnings to be raised as errors + warnings.simplefilter('error') + + def tearDown(self): + # Reset warning behavior back to default + warnings.simplefilter('default') + + def testBadOutputFormat(self): + """ Test failure on bad output_format. """ + self.assertRaises(KeyError, markdown.Markdown, output_format='invalid') + + def testLoadExtensionFailure(self): + """ Test failure of an extension to load. """ + self.assertRaises( + ImportError, + markdown.Markdown, extensions=['non_existant_ext'] + ) + + def testLoadBadExtension(self): + """ Test loading of an Extension with no makeExtension function. """ + self.assertRaises(AttributeError, markdown.Markdown, extensions=['markdown.util']) + + def testNonExtension(self): + """ Test loading a non Extension object as an extension. """ + self.assertRaises(TypeError, markdown.Markdown, extensions=[object]) + + def testDotNotationExtensionWithBadClass(self): + """ Test Extension loading with non-existent class name (`path.to.module:Class`). """ + self.assertRaises( + AttributeError, + markdown.Markdown, + extensions=['markdown.extensions.footnotes:MissingExtension'] + ) + + def testBaseExtention(self): + """ Test that the base Extension class will raise NotImplemented. """ + self.assertRaises( + NotImplementedError, + markdown.Markdown, extensions=[markdown.extensions.Extension()] + ) + + +class testETreeComments(unittest.TestCase): + """ + Test that ElementTree Comments work. + + These tests should only be a concern when using cElementTree with third + party serializers (including markdown's (x)html serializer). While markdown + doesn't use ElementTree.Comment itself, we should certainly support any + third party extensions which may. Therefore, these tests are included to + ensure such support is maintained. + """ + + def setUp(self): + # Create comment node + self.comment = etree.Comment('foo') + + def testCommentIsComment(self): + """ Test that an ElementTree Comment passes the `is Comment` test. """ + self.assertIs(self.comment.tag, etree.Comment) + + def testCommentIsBlockLevel(self): + """ Test that an ElementTree Comment is recognized as BlockLevel. """ + md = markdown.Markdown() + self.assertIs(md.is_block_level(self.comment.tag), False) + + def testCommentSerialization(self): + """ Test that an ElementTree Comment serializes properly. """ + self.assertEqual( + markdown.serializers.to_html_string(self.comment), + '<!--foo-->' + ) + + def testCommentPrettify(self): + """ Test that an ElementTree Comment is prettified properly. """ + pretty = markdown.treeprocessors.PrettifyTreeprocessor(markdown.Markdown()) + pretty.run(self.comment) + self.assertEqual( + markdown.serializers.to_html_string(self.comment), + '<!--foo-->\n' + ) + + +class testElementTailTests(unittest.TestCase): + """ Element Tail Tests """ + def setUp(self): + self.pretty = markdown.treeprocessors.PrettifyTreeprocessor(markdown.Markdown()) + + def testBrTailNoNewline(self): + """ Test that last <br> in tree has a new line tail """ + root = etree.Element('root') + br = etree.SubElement(root, 'br') + self.assertEqual(br.tail, None) + self.pretty.run(root) + self.assertEqual(br.tail, "\n") + + +class testElementPreCodeTests(unittest.TestCase): + """ Element PreCode Tests """ + def setUp(self): + md = markdown.Markdown() + self.pretty = markdown.treeprocessors.PrettifyTreeprocessor(md) + + def prettify(self, xml): + root = etree.fromstring(xml) + self.pretty.run(root) + return etree.tostring(root, encoding="unicode", short_empty_elements=False) + + def testPreCodeEmpty(self): + xml = "<pre><code></code></pre>" + expected = "<pre><code></code></pre>\n" + self.assertEqual(expected, self.prettify(xml)) + + def testPreCodeWithChildren(self): + xml = "<pre><code> <span /></code></pre>" + expected = "<pre><code> <span></span></code></pre>\n" + self.assertEqual(expected, self.prettify(xml)) + + def testPreCodeWithSpaceOnly(self): + xml = "<pre><code> </code></pre>" + expected = "<pre><code>\n</code></pre>\n" + self.assertEqual(expected, self.prettify(xml)) + + def testPreCodeWithText(self): + xml = "<pre><code> hello</code></pre>" + expected = "<pre><code> hello\n</code></pre>\n" + self.assertEqual(expected, self.prettify(xml)) + + def testPreCodeWithTrailingSpace(self): + xml = "<pre><code> hello </code></pre>" + expected = "<pre><code> hello\n</code></pre>\n" + self.assertEqual(expected, self.prettify(xml)) + + +class testSerializers(unittest.TestCase): + """ Test the html and xhtml serializers. """ + + def testHtml(self): + """ Test HTML serialization. """ + el = etree.Element('div') + el.set('id', 'foo<&">') + p = etree.SubElement(el, 'p') + p.text = 'foo <&escaped>' + p.set('hidden', 'hidden') + etree.SubElement(el, 'hr') + non_element = etree.SubElement(el, None) + non_element.text = 'non-element text' + script = etree.SubElement(non_element, 'script') + script.text = '<&"test\nescaping">' + el.tail = "tail text" + self.assertEqual( + markdown.serializers.to_html_string(el), + '<div id="foo<&">">' + '<p hidden>foo <&escaped></p>' + '<hr>' + 'non-element text' + '<script><&"test\nescaping"></script>' + '</div>tail text' + ) + + def testXhtml(self): + """" Test XHTML serialization. """ + el = etree.Element('div') + el.set('id', 'foo<&">') + p = etree.SubElement(el, 'p') + p.text = 'foo<&escaped>' + p.set('hidden', 'hidden') + etree.SubElement(el, 'hr') + non_element = etree.SubElement(el, None) + non_element.text = 'non-element text' + script = etree.SubElement(non_element, 'script') + script.text = '<&"test\nescaping">' + el.tail = "tail text" + self.assertEqual( + markdown.serializers.to_xhtml_string(el), + '<div id="foo<&">">' + '<p hidden="hidden">foo<&escaped></p>' + '<hr />' + 'non-element text' + '<script><&"test\nescaping"></script>' + '</div>tail text' + ) + + def testMixedCaseTags(self): + """" Test preservation of tag case. """ + el = etree.Element('MixedCase') + el.text = 'not valid ' + em = etree.SubElement(el, 'EMPHASIS') + em.text = 'html' + etree.SubElement(el, 'HR') + self.assertEqual( + markdown.serializers.to_xhtml_string(el), + '<MixedCase>not valid <EMPHASIS>html</EMPHASIS><HR /></MixedCase>' + ) + + def testProsessingInstruction(self): + """ Test serialization of ProcessignInstruction. """ + pi = ProcessingInstruction('foo', text='<&"test\nescaping">') + self.assertIs(pi.tag, ProcessingInstruction) + self.assertEqual( + markdown.serializers.to_xhtml_string(pi), + '<?foo <&"test\nescaping">?>' + ) + + def testQNameTag(self): + """ Test serialization of QName tag. """ + div = etree.Element('div') + qname = etree.QName('http://www.w3.org/1998/Math/MathML', 'math') + math = etree.SubElement(div, qname) + math.set('display', 'block') + sem = etree.SubElement(math, 'semantics') + msup = etree.SubElement(sem, 'msup') + mi = etree.SubElement(msup, 'mi') + mi.text = 'x' + mn = etree.SubElement(msup, 'mn') + mn.text = '2' + ann = etree.SubElement(sem, 'annotations') + ann.text = 'x^2' + self.assertEqual( + markdown.serializers.to_xhtml_string(div), + '<div>' + '<math display="block" xmlns="http://www.w3.org/1998/Math/MathML">' + '<semantics>' + '<msup>' + '<mi>x</mi>' + '<mn>2</mn>' + '</msup>' + '<annotations>x^2</annotations>' + '</semantics>' + '</math>' + '</div>' + ) + + def testQNameAttribute(self): + """ Test serialization of QName attribute. """ + div = etree.Element('div') + div.set(etree.QName('foo'), etree.QName('bar')) + self.assertEqual( + markdown.serializers.to_xhtml_string(div), + '<div foo="bar"></div>' + ) + + def testBadQNameTag(self): + """ Test serialization of QName with no tag. """ + qname = etree.QName('http://www.w3.org/1998/Math/MathML') + el = etree.Element(qname) + self.assertRaises(ValueError, markdown.serializers.to_xhtml_string, el) + + def testQNameEscaping(self): + """ Test QName escaping. """ + qname = etree.QName('<&"test\nescaping">', 'div') + el = etree.Element(qname) + self.assertEqual( + markdown.serializers.to_xhtml_string(el), + '<div xmlns="<&"test escaping">"></div>' + ) + + def testQNamePreEscaping(self): + """ Test QName that is already partially escaped. """ + qname = etree.QName('<&"test escaping">', 'div') + el = etree.Element(qname) + self.assertEqual( + markdown.serializers.to_xhtml_string(el), + '<div xmlns="<&"test escaping">"></div>' + ) + + def buildExtension(self): + """ Build an extension which registers fakeSerializer. """ + def fakeSerializer(elem): + # Ignore input and return hardcoded output + return '<div><p>foo</p></div>' + + class registerFakeSerializer(markdown.extensions.Extension): + def extendMarkdown(self, md): + md.output_formats['fake'] = fakeSerializer + + return registerFakeSerializer() + + def testRegisterSerializer(self): + self.assertEqual( + markdown.markdown( + 'baz', extensions=[self.buildExtension()], output_format='fake' + ), + '<p>foo</p>' + ) + + def testXHTMLOutput(self): + self.assertEqual( + markdown.markdown('foo \nbar', output_format='xhtml'), + '<p>foo<br />\nbar</p>' + ) + + def testHTMLOutput(self): + self.assertEqual( + markdown.markdown('foo \nbar', output_format='html'), + '<p>foo<br>\nbar</p>' + ) + + +class testAtomicString(unittest.TestCase): + """ Test that AtomicStrings are honored (not parsed). """ + + def setUp(self): + md = markdown.Markdown() + self.inlineprocessor = md.treeprocessors['inline'] + + def testString(self): + """ Test that a regular string is parsed. """ + tree = etree.Element('div') + p = etree.SubElement(tree, 'p') + p.text = 'some *text*' + new = self.inlineprocessor.run(tree) + self.assertEqual( + markdown.serializers.to_html_string(new), + '<div><p>some <em>text</em></p></div>' + ) + + def testSimpleAtomicString(self): + """ Test that a simple AtomicString is not parsed. """ + tree = etree.Element('div') + p = etree.SubElement(tree, 'p') + p.text = markdown.util.AtomicString('some *text*') + new = self.inlineprocessor.run(tree) + self.assertEqual( + markdown.serializers.to_html_string(new), + '<div><p>some *text*</p></div>' + ) + + def testNestedAtomicString(self): + """ Test that a nested AtomicString is not parsed. """ + tree = etree.Element('div') + p = etree.SubElement(tree, 'p') + p.text = markdown.util.AtomicString('*some* ') + span1 = etree.SubElement(p, 'span') + span1.text = markdown.util.AtomicString('*more* ') + span2 = etree.SubElement(span1, 'span') + span2.text = markdown.util.AtomicString('*text* ') + span3 = etree.SubElement(span2, 'span') + span3.text = markdown.util.AtomicString('*here*') + span3.tail = markdown.util.AtomicString(' *to*') + span2.tail = markdown.util.AtomicString(' *test*') + span1.tail = markdown.util.AtomicString(' *with*') + new = self.inlineprocessor.run(tree) + self.assertEqual( + markdown.serializers.to_html_string(new), + '<div><p>*some* <span>*more* <span>*text* <span>*here*</span> ' + '*to*</span> *test*</span> *with*</p></div>' + ) + + +class TestConfigParsing(unittest.TestCase): + def assertParses(self, value, result): + self.assertIs(markdown.util.parseBoolValue(value, False), result) + + def testBooleansParsing(self): + self.assertParses(True, True) + self.assertParses('novalue', None) + self.assertParses('yES', True) + self.assertParses('FALSE', False) + self.assertParses(0., False) + self.assertParses('none', False) + + def testPreserveNone(self): + self.assertIsNone(markdown.util.parseBoolValue('None', preserve_none=True)) + self.assertIsNone(markdown.util.parseBoolValue(None, preserve_none=True)) + + def testInvalidBooleansParsing(self): + self.assertRaises(ValueError, markdown.util.parseBoolValue, 'novalue') + + +class TestCliOptionParsing(unittest.TestCase): + """ Test parsing of Command Line Interface Options. """ + + def setUp(self): + self.default_options = { + 'input': None, + 'output': None, + 'encoding': None, + 'output_format': 'xhtml', + 'lazy_ol': True, + 'extensions': [], + 'extension_configs': {}, + } + self.tempfile = '' + + def tearDown(self): + if os.path.isfile(self.tempfile): + os.remove(self.tempfile) + + def testNoOptions(self): + options, logging_level = parse_options([]) + self.assertEqual(options, self.default_options) + self.assertEqual(logging_level, CRITICAL) + + def testQuietOption(self): + options, logging_level = parse_options(['-q']) + self.assertGreater(logging_level, CRITICAL) + + def testVerboseOption(self): + options, logging_level = parse_options(['-v']) + self.assertEqual(logging_level, WARNING) + + def testNoisyOption(self): + options, logging_level = parse_options(['--noisy']) + self.assertEqual(logging_level, DEBUG) + + def testInputFileOption(self): + options, logging_level = parse_options(['foo.txt']) + self.default_options['input'] = 'foo.txt' + self.assertEqual(options, self.default_options) + + def testOutputFileOption(self): + options, logging_level = parse_options(['-f', 'foo.html']) + self.default_options['output'] = 'foo.html' + self.assertEqual(options, self.default_options) + + def testInputAndOutputFileOptions(self): + options, logging_level = parse_options(['-f', 'foo.html', 'foo.txt']) + self.default_options['output'] = 'foo.html' + self.default_options['input'] = 'foo.txt' + self.assertEqual(options, self.default_options) + + def testEncodingOption(self): + options, logging_level = parse_options(['-e', 'utf-8']) + self.default_options['encoding'] = 'utf-8' + self.assertEqual(options, self.default_options) + + def testOutputFormatOption(self): + options, logging_level = parse_options(['-o', 'html']) + self.default_options['output_format'] = 'html' + self.assertEqual(options, self.default_options) + + def testNoLazyOlOption(self): + options, logging_level = parse_options(['-n']) + self.default_options['lazy_ol'] = False + self.assertEqual(options, self.default_options) + + def testExtensionOption(self): + options, logging_level = parse_options(['-x', 'markdown.extensions.footnotes']) + self.default_options['extensions'] = ['markdown.extensions.footnotes'] + self.assertEqual(options, self.default_options) + + def testMultipleExtensionOptions(self): + options, logging_level = parse_options([ + '-x', 'markdown.extensions.footnotes', + '-x', 'markdown.extensions.smarty' + ]) + self.default_options['extensions'] = [ + 'markdown.extensions.footnotes', + 'markdown.extensions.smarty' + ] + self.assertEqual(options, self.default_options) + + def create_config_file(self, config): + """ Helper to create temp config files. """ + if not isinstance(config, str): + # convert to string + config = yaml.dump(config) + fd, self.tempfile = tempfile.mkstemp('.yml') + with os.fdopen(fd, 'w') as fp: + fp.write(config) + + def testExtensionConfigOption(self): + config = { + 'markdown.extensions.wikilinks': { + 'base_url': 'http://example.com/', + 'end_url': '.html', + 'html_class': 'test', + }, + 'markdown.extensions.footnotes:FootnotesExtension': { + 'PLACE_MARKER': '~~~footnotes~~~' + } + } + self.create_config_file(config) + options, logging_level = parse_options(['-c', self.tempfile]) + self.default_options['extension_configs'] = config + self.assertEqual(options, self.default_options) + + def textBoolExtensionConfigOption(self): + config = { + 'markdown.extensions.toc': { + 'title': 'Some Title', + 'anchorlink': True, + 'permalink': True + } + } + self.create_config_file(config) + options, logging_level = parse_options(['-c', self.tempfile]) + self.default_options['extension_configs'] = config + self.assertEqual(options, self.default_options) + + def testExtensionConfigOptionAsJSON(self): + config = { + 'markdown.extensions.wikilinks': { + 'base_url': 'http://example.com/', + 'end_url': '.html', + 'html_class': 'test', + }, + 'markdown.extensions.footnotes:FootnotesExtension': { + 'PLACE_MARKER': '~~~footnotes~~~' + } + } + import json + self.create_config_file(json.dumps(config)) + options, logging_level = parse_options(['-c', self.tempfile]) + self.default_options['extension_configs'] = config + self.assertEqual(options, self.default_options) + + def testExtensionConfigOptionMissingFile(self): + self.assertRaises(IOError, parse_options, ['-c', 'missing_file.yaml']) + + def testExtensionConfigOptionBadFormat(self): + config = """ +[footnotes] +PLACE_MARKER= ~~~footnotes~~~ +""" + self.create_config_file(config) + self.assertRaises(yaml.YAMLError, parse_options, ['-c', self.tempfile]) + + +class TestEscapeAppend(unittest.TestCase): + """ Tests escape character append. """ + + def testAppend(self): + """ Test that appended escapes are only in the current instance. """ + md = markdown.Markdown() + md.ESCAPED_CHARS.append('|') + self.assertEqual('|' in md.ESCAPED_CHARS, True) + md2 = markdown.Markdown() + self.assertEqual('|' not in md2.ESCAPED_CHARS, True) + + +class TestBlockAppend(unittest.TestCase): + """ Tests block kHTML append. """ + + def testBlockAppend(self): + """ Test that appended escapes are only in the current instance. """ + md = markdown.Markdown() + md.block_level_elements.append('test') + self.assertEqual('test' in md.block_level_elements, True) + md2 = markdown.Markdown() + self.assertEqual('test' not in md2.block_level_elements, True) + + +class TestAncestorExclusion(unittest.TestCase): + """ Tests exclusion of tags in ancestor list. """ + + class AncestorExample(markdown.inlinepatterns.SimpleTagInlineProcessor): + """ Ancestor Test. """ + + ANCESTOR_EXCLUDES = ('a',) + + def handleMatch(self, m, data): + """ Handle match. """ + el = etree.Element(self.tag) + el.text = m.group(2) + return el, m.start(0), m.end(0) + + class AncestorExtension(markdown.Extension): + + def __init__(self, *args, **kwargs): + """Initialize.""" + + self.config = {} + + def extendMarkdown(self, md): + """Modify inline patterns.""" + + pattern = r'(\+)([^\+]+)\1' + md.inlinePatterns.register(TestAncestorExclusion.AncestorExample(pattern, 'strong'), 'ancestor-test', 0) + + def setUp(self): + """Setup markdown object.""" + self.md = markdown.Markdown(extensions=[TestAncestorExclusion.AncestorExtension()]) + + def test_ancestors(self): + """ Test that an extension can exclude parent tags. """ + test = """ +Some +test+ and a [+link+](http://test.com) +""" + result = """<p>Some <strong>test</strong> and a <a href="http://test.com">+link+</a></p>""" + + self.md.reset() + self.assertEqual(self.md.convert(test), result) + + def test_ancestors_tail(self): + """ Test that an extension can exclude parent tags when dealing with a tail. """ + test = """ +[***+em+*+strong+**](http://test.com) +""" + result = """<p><a href="http://test.com"><strong><em>+em+</em>+strong+</strong></a></p>""" + + self.md.reset() + self.assertEqual(self.md.convert(test), result) diff --git a/tests/test_extensions.py b/tests/test_extensions.py new file mode 100644 index 0000000..b19d10a --- /dev/null +++ b/tests/test_extensions.py @@ -0,0 +1,665 @@ +""" +Python Markdown + +A Python implementation of John Gruber's Markdown. + +Documentation: https://python-markdown.github.io/ +GitHub: https://github.com/Python-Markdown/markdown/ +PyPI: https://pypi.org/project/Markdown/ + +Started by Manfred Stienstra (http://www.dwerg.net/). +Maintained for a few years by Yuri Takhteyev (http://www.freewisdom.org). +Currently maintained by Waylan Limberg (https://github.com/waylan), +Dmitry Shachnev (https://github.com/mitya57) and Isaac Muse (https://github.com/facelessuser). + +Copyright 2007-2018 The Python Markdown Project (v. 1.7 and later) +Copyright 2004, 2005, 2006 Yuri Takhteyev (v. 0.2-1.6b) +Copyright 2004 Manfred Stienstra (the original version) + +License: BSD (see LICENSE.md for details). + +Python-Markdown Extension Regression Tests +========================================== + +A collection of regression tests to confirm that the included extensions +continue to work as advertised. This used to be accomplished by doctests. +""" + +import unittest +import markdown + + +class TestCaseWithAssertStartsWith(unittest.TestCase): + + def assertStartsWith(self, expectedPrefix, text, msg=None): + if not text.startswith(expectedPrefix): + if len(expectedPrefix) + 5 < len(text): + text = text[:len(expectedPrefix) + 5] + '...' + standardMsg = '{} not found at the start of {}'.format(repr(expectedPrefix), + repr(text)) + self.fail(self._formatMessage(msg, standardMsg)) + + +class TestExtensionClass(unittest.TestCase): + """ Test markdown.extensions.Extension. """ + + def setUp(self): + class TestExtension(markdown.extensions.Extension): + config = { + 'foo': ['bar', 'Description of foo'], + 'bar': ['baz', 'Description of bar'] + } + + self.ext = TestExtension() + self.ExtKlass = TestExtension + + def testGetConfig(self): + self.assertEqual(self.ext.getConfig('foo'), 'bar') + + def testGetConfigDefault(self): + self.assertEqual(self.ext.getConfig('baz'), '') + self.assertEqual(self.ext.getConfig('baz', default='missing'), 'missing') + + def testGetConfigs(self): + self.assertEqual(self.ext.getConfigs(), {'foo': 'bar', 'bar': 'baz'}) + + def testGetConfigInfo(self): + self.assertEqual( + dict(self.ext.getConfigInfo()), + dict([ + ('foo', 'Description of foo'), + ('bar', 'Description of bar') + ]) + ) + + def testSetConfig(self): + self.ext.setConfig('foo', 'baz') + self.assertEqual(self.ext.getConfigs(), {'foo': 'baz', 'bar': 'baz'}) + + def testSetConfigWithBadKey(self): + # self.ext.setConfig('bad', 'baz) ==> KeyError + self.assertRaises(KeyError, self.ext.setConfig, 'bad', 'baz') + + def testConfigAsKwargsOnInit(self): + ext = self.ExtKlass(foo='baz', bar='blah') + self.assertEqual(ext.getConfigs(), {'foo': 'baz', 'bar': 'blah'}) + + +class TestAbbr(unittest.TestCase): + """ Test abbr extension. """ + + def setUp(self): + self.md = markdown.Markdown(extensions=['abbr']) + + def testSimpleAbbr(self): + """ Test Abbreviations. """ + text = 'Some text with an ABBR and a REF. Ignore REFERENCE and ref.' + \ + '\n\n*[ABBR]: Abbreviation\n' + \ + '*[REF]: Abbreviation Reference' + self.assertEqual( + self.md.convert(text), + '<p>Some text with an <abbr title="Abbreviation">ABBR</abbr> ' + 'and a <abbr title="Abbreviation Reference">REF</abbr>. Ignore ' + 'REFERENCE and ref.</p>' + ) + + def testNestedAbbr(self): + """ Test Nested Abbreviations. """ + text = '[ABBR](/foo) and _ABBR_\n\n' + \ + '*[ABBR]: Abbreviation' + self.assertEqual( + self.md.convert(text), + '<p><a href="/foo"><abbr title="Abbreviation">ABBR</abbr></a> ' + 'and <em><abbr title="Abbreviation">ABBR</abbr></em></p>' + ) + + +class TestMetaData(unittest.TestCase): + """ Test MetaData extension. """ + + def setUp(self): + self.md = markdown.Markdown(extensions=['meta']) + + def testBasicMetaData(self): + """ Test basic metadata. """ + + text = '''Title: A Test Doc. +Author: Waylan Limberg + John Doe +Blank_Data: + +The body. This is paragraph one.''' + self.assertEqual( + self.md.convert(text), + '<p>The body. This is paragraph one.</p>' + ) + self.assertEqual( + self.md.Meta, { + 'author': ['Waylan Limberg', 'John Doe'], + 'blank_data': [''], + 'title': ['A Test Doc.'] + } + ) + + def testYamlMetaData(self): + """ Test metadata specified as simple YAML. """ + + text = '''--- +Title: A Test Doc. +Author: [Waylan Limberg, John Doe] +Blank_Data: +--- + +The body. This is paragraph one.''' + self.assertEqual( + self.md.convert(text), + '<p>The body. This is paragraph one.</p>' + ) + self.assertEqual( + self.md.Meta, { + 'author': ['[Waylan Limberg, John Doe]'], + 'blank_data': [''], + 'title': ['A Test Doc.'] + } + ) + + def testMissingMetaData(self): + """ Test document without Meta Data. """ + + text = ' Some Code - not extra lines of meta data.' + self.assertEqual( + self.md.convert(text), + '<pre><code>Some Code - not extra lines of meta data.\n' + '</code></pre>' + ) + self.assertEqual(self.md.Meta, {}) + + def testMetaDataWithoutNewline(self): + """ Test document with only metadata and no newline at end.""" + text = 'title: No newline' + self.assertEqual(self.md.convert(text), '') + self.assertEqual(self.md.Meta, {'title': ['No newline']}) + + def testMetaDataReset(self): + """ Test that reset call remove Meta entirely """ + + text = '''Title: A Test Doc. +Author: Waylan Limberg + John Doe +Blank_Data: + +The body. This is paragraph one.''' + self.md.convert(text) + + self.md.reset() + self.assertEqual(self.md.Meta, {}) + + +class TestWikiLinks(unittest.TestCase): + """ Test Wikilinks Extension. """ + + def setUp(self): + self.md = markdown.Markdown(extensions=['wikilinks']) + self.text = "Some text with a [[WikiLink]]." + + def testBasicWikilinks(self): + """ Test [[wikilinks]]. """ + + self.assertEqual( + self.md.convert(self.text), + '<p>Some text with a ' + '<a class="wikilink" href="/WikiLink/">WikiLink</a>.</p>' + ) + + def testWikilinkWhitespace(self): + """ Test whitespace in wikilinks. """ + self.assertEqual( + self.md.convert('[[ foo bar_baz ]]'), + '<p><a class="wikilink" href="/foo_bar_baz/">foo bar_baz</a></p>' + ) + self.assertEqual( + self.md.convert('foo [[ ]] bar'), + '<p>foo bar</p>' + ) + + def testSimpleSettings(self): + """ Test Simple Settings. """ + + self.assertEqual(markdown.markdown( + self.text, extensions=[ + markdown.extensions.wikilinks.WikiLinkExtension( + base_url='/wiki/', + end_url='.html', + html_class='foo') + ] + ), + '<p>Some text with a ' + '<a class="foo" href="/wiki/WikiLink.html">WikiLink</a>.</p>') + + def testComplexSettings(self): + """ Test Complex Settings. """ + + md = markdown.Markdown( + extensions=['wikilinks'], + extension_configs={ + 'wikilinks': [ + ('base_url', 'http://example.com/'), + ('end_url', '.html'), + ('html_class', '') + ] + }, + safe_mode=True + ) + self.assertEqual( + md.convert(self.text), + '<p>Some text with a ' + '<a href="http://example.com/WikiLink.html">WikiLink</a>.</p>' + ) + + def testWikilinksMetaData(self): + """ test MetaData with Wikilinks Extension. """ + + text = """wiki_base_url: http://example.com/ +wiki_end_url: .html +wiki_html_class: + +Some text with a [[WikiLink]].""" + md = markdown.Markdown(extensions=['meta', 'wikilinks']) + self.assertEqual( + md.convert(text), + '<p>Some text with a ' + '<a href="http://example.com/WikiLink.html">WikiLink</a>.</p>' + ) + + # MetaData should not carry over to next document: + self.assertEqual( + md.convert("No [[MetaData]] here."), + '<p>No <a class="wikilink" href="/MetaData/">MetaData</a> ' + 'here.</p>' + ) + + def testURLCallback(self): + """ Test used of a custom URL builder. """ + + from markdown.extensions.wikilinks import WikiLinkExtension + + def my_url_builder(label, base, end): + return '/bar/' + + md = markdown.Markdown(extensions=[WikiLinkExtension(build_url=my_url_builder)]) + self.assertEqual( + md.convert('[[foo]]'), + '<p><a class="wikilink" href="/bar/">foo</a></p>' + ) + + +class TestAdmonition(unittest.TestCase): + """ Test Admonition Extension. """ + + def setUp(self): + self.md = markdown.Markdown(extensions=['admonition']) + + def testRE(self): + RE = self.md.parser.blockprocessors['admonition'].RE + tests = [ + ('!!! note', ('note', None)), + ('!!! note "Please Note"', ('note', 'Please Note')), + ('!!! note ""', ('note', '')), + ] + for test, expected in tests: + self.assertEqual(RE.match(test).groups(), expected) + + +class TestTOC(TestCaseWithAssertStartsWith): + """ Test TOC Extension. """ + + def setUp(self): + self.md = markdown.Markdown(extensions=['toc']) + + def testMarker(self): + """ Test TOC with a Marker. """ + text = '[TOC]\n\n# Header 1\n\n## Header 2' + self.assertEqual( + self.md.convert(text), + '<div class="toc">\n' + '<ul>\n' # noqa + '<li><a href="#header-1">Header 1</a>' # noqa + '<ul>\n' # noqa + '<li><a href="#header-2">Header 2</a></li>\n' # noqa + '</ul>\n' # noqa + '</li>\n' # noqa + '</ul>\n' # noqa + '</div>\n' + '<h1 id="header-1">Header 1</h1>\n' + '<h2 id="header-2">Header 2</h2>' + ) + + def testNoMarker(self): + """ Test TOC without a Marker. """ + text = '# Header 1\n\n## Header 2' + self.assertEqual( + self.md.convert(text), + '<h1 id="header-1">Header 1</h1>\n' + '<h2 id="header-2">Header 2</h2>' + ) + self.assertEqual( + self.md.toc, + '<div class="toc">\n' + '<ul>\n' # noqa + '<li><a href="#header-1">Header 1</a>' # noqa + '<ul>\n' # noqa + '<li><a href="#header-2">Header 2</a></li>\n' # noqa + '</ul>\n' # noqa + '</li>\n' # noqa + '</ul>\n' # noqa + '</div>\n' + ) + + def testAlternateMarker(self): + """ Test TOC with user defined marker. """ + md = markdown.Markdown( + extensions=[markdown.extensions.toc.TocExtension(marker='{{marker}}')] + ) + text = '{{marker}}\n\n# Header 1\n\n## Header 2' + self.assertEqual( + md.convert(text), + '<div class="toc">\n' + '<ul>\n' # noqa + '<li><a href="#header-1">Header 1</a>' # noqa + '<ul>\n' # noqa + '<li><a href="#header-2">Header 2</a></li>\n' # noqa + '</ul>\n' # noqa + '</li>\n' # noqa + '</ul>\n' # noqa + '</div>\n' + '<h1 id="header-1">Header 1</h1>\n' + '<h2 id="header-2">Header 2</h2>' + ) + + def testDisabledMarker(self): + """ Test TOC with disabled marker. """ + md = markdown.Markdown( + extensions=[markdown.extensions.toc.TocExtension(marker='')] + ) + text = '[TOC]\n\n# Header 1\n\n## Header 2' + self.assertEqual( + md.convert(text), + '<p>[TOC]</p>\n' + '<h1 id="header-1">Header 1</h1>\n' + '<h2 id="header-2">Header 2</h2>' + ) + self.assertStartsWith('<div class="toc">', md.toc) + + def testReset(self): + """ Test TOC Reset. """ + self.assertEqual(self.md.toc, '') + self.md.convert('# Header 1\n\n## Header 2') + self.assertStartsWith('<div class="toc">', self.md.toc) + self.md.reset() + self.assertEqual(self.md.toc, '') + self.assertEqual(self.md.toc_tokens, []) + + def testUniqueIds(self): + """ Test Unique IDs. """ + + text = '#Header\n#Header\n#Header' + self.assertEqual( + self.md.convert(text), + '<h1 id="header">Header</h1>\n' + '<h1 id="header_1">Header</h1>\n' + '<h1 id="header_2">Header</h1>' + ) + self.assertEqual( + self.md.toc, + '<div class="toc">\n' + '<ul>\n' # noqa + '<li><a href="#header">Header</a></li>\n' # noqa + '<li><a href="#header_1">Header</a></li>\n' # noqa + '<li><a href="#header_2">Header</a></li>\n' # noqa + '</ul>\n' # noqa + '</div>\n' + ) + self.assertEqual(self.md.toc_tokens, [ + {'level': 1, 'id': 'header', 'name': 'Header', 'children': []}, + {'level': 1, 'id': 'header_1', 'name': 'Header', 'children': []}, + {'level': 1, 'id': 'header_2', 'name': 'Header', 'children': []}, + ]) + + def testHtmlEntities(self): + """ Test Headers with HTML Entities. """ + text = '# Foo & bar' + self.assertEqual( + self.md.convert(text), + '<h1 id="foo-bar">Foo & bar</h1>' + ) + self.assertEqual( + self.md.toc, + '<div class="toc">\n' + '<ul>\n' # noqa + '<li><a href="#foo-bar">Foo & bar</a></li>\n' # noqa + '</ul>\n' # noqa + '</div>\n' + ) + self.assertEqual(self.md.toc_tokens, [ + {'level': 1, 'id': 'foo-bar', 'name': 'Foo & bar', 'children': []}, + ]) + + def testHtmlSpecialChars(self): + """ Test Headers with HTML special characters. """ + text = '# Foo > & bar' + self.assertEqual( + self.md.convert(text), + '<h1 id="foo-bar">Foo > & bar</h1>' + ) + self.assertEqual( + self.md.toc, + '<div class="toc">\n' + '<ul>\n' # noqa + '<li><a href="#foo-bar">Foo > & bar</a></li>\n' # noqa + '</ul>\n' # noqa + '</div>\n' + ) + self.assertEqual(self.md.toc_tokens, [ + {'level': 1, 'id': 'foo-bar', 'name': 'Foo > & bar', 'children': []}, + ]) + + def testRawHtml(self): + """ Test Headers with raw HTML. """ + text = '# Foo <b>Bar</b> Baz.' + self.assertEqual( + self.md.convert(text), + '<h1 id="foo-bar-baz">Foo <b>Bar</b> Baz.</h1>' + ) + self.assertEqual( + self.md.toc, + '<div class="toc">\n' + '<ul>\n' # noqa + '<li><a href="#foo-bar-baz">Foo Bar Baz.</a></li>\n' # noqa + '</ul>\n' # noqa + '</div>\n' + ) + self.assertEqual(self.md.toc_tokens, [ + {'level': 1, 'id': 'foo-bar-baz', 'name': 'Foo Bar Baz.', 'children': []}, + ]) + + def testBaseLevel(self): + """ Test Header Base Level. """ + md = markdown.Markdown( + extensions=[markdown.extensions.toc.TocExtension(baselevel=5)] + ) + text = '# Some Header\n\n## Next Level\n\n### Too High' + self.assertEqual( + md.convert(text), + '<h5 id="some-header">Some Header</h5>\n' + '<h6 id="next-level">Next Level</h6>\n' + '<h6 id="too-high">Too High</h6>' + ) + self.assertEqual( + md.toc, + '<div class="toc">\n' + '<ul>\n' # noqa + '<li><a href="#some-header">Some Header</a>' # noqa + '<ul>\n' # noqa + '<li><a href="#next-level">Next Level</a></li>\n' # noqa + '<li><a href="#too-high">Too High</a></li>\n' # noqa + '</ul>\n' # noqa + '</li>\n' # noqa + '</ul>\n' # noqa + '</div>\n' + ) + self.assertEqual(md.toc_tokens, [ + {'level': 5, 'id': 'some-header', 'name': 'Some Header', 'children': [ + {'level': 6, 'id': 'next-level', 'name': 'Next Level', 'children': []}, + {'level': 6, 'id': 'too-high', 'name': 'Too High', 'children': []}, + ]}, + ]) + + def testHeaderInlineMarkup(self): + """ Test Headers with inline markup. """ + + text = '#Some *Header* with [markup](http://example.com).' + self.assertEqual( + self.md.convert(text), + '<h1 id="some-header-with-markup">Some <em>Header</em> with ' + '<a href="http://example.com">markup</a>.</h1>' + ) + self.assertEqual( + self.md.toc, + '<div class="toc">\n' + '<ul>\n' # noqa + '<li><a href="#some-header-with-markup">' # noqa + 'Some Header with markup.</a></li>\n' # noqa + '</ul>\n' # noqa + '</div>\n' + ) + self.assertEqual(self.md.toc_tokens, [ + {'level': 1, 'id': 'some-header-with-markup', 'name': 'Some Header with markup.', 'children': []}, + ]) + + def testTitle(self): + """ Test TOC Title. """ + md = markdown.Markdown( + extensions=[markdown.extensions.toc.TocExtension(title='Table of Contents')] + ) + md.convert('# Header 1\n\n## Header 2') + self.assertStartsWith( + '<div class="toc"><span class="toctitle">Table of Contents</span><ul>', + md.toc + ) + + def testWithAttrList(self): + """ Test TOC with attr_list Extension. """ + md = markdown.Markdown(extensions=['toc', 'attr_list']) + text = ('# Header 1\n\n' + '## Header 2 { #foo }\n\n' + '## Header 3 { data-toc-label="Foo Bar" }\n\n' + '# Header 4 { data-toc-label="Foo > Baz" }\n\n' + '# Header 5 { data-toc-label="Foo <b>Quux</b>" }') + + self.assertEqual( + md.convert(text), + '<h1 id="header-1">Header 1</h1>\n' + '<h2 id="foo">Header 2</h2>\n' + '<h2 id="header-3">Header 3</h2>\n' + '<h1 id="header-4">Header 4</h1>\n' + '<h1 id="header-5">Header 5</h1>' + ) + self.assertEqual( + md.toc, + '<div class="toc">\n' + '<ul>\n' # noqa + '<li><a href="#header-1">Header 1</a>' # noqa + '<ul>\n' # noqa + '<li><a href="#foo">Header 2</a></li>\n' # noqa + '<li><a href="#header-3">Foo Bar</a></li>\n' # noqa + '</ul>\n' # noqa + '</li>\n' # noqa + '<li><a href="#header-4">Foo > Baz</a></li>\n' # noqa + '<li><a href="#header-5">Foo Quux</a></li>\n' # noqa + '</ul>\n' # noqa + '</div>\n' + ) + self.assertEqual(md.toc_tokens, [ + {'level': 1, 'id': 'header-1', 'name': 'Header 1', 'children': [ + {'level': 2, 'id': 'foo', 'name': 'Header 2', 'children': []}, + {'level': 2, 'id': 'header-3', 'name': 'Foo Bar', 'children': []} + ]}, + {'level': 1, 'id': 'header-4', 'name': 'Foo > Baz', 'children': []}, + {'level': 1, 'id': 'header-5', 'name': 'Foo Quux', 'children': []}, + ]) + + def testUniqueFunc(self): + """ Test 'unique' function. """ + from markdown.extensions.toc import unique + ids = {'foo'} + self.assertEqual(unique('foo', ids), 'foo_1') + self.assertEqual(ids, {'foo', 'foo_1'}) + + def testTocInHeaders(self): + + text = '[TOC]\n#[TOC]' + self.assertEqual( + self.md.convert(text), + '<div class="toc">\n' # noqa + '<ul>\n' # noqa + '<li><a href="#toc">[TOC]</a></li>\n' # noqa + '</ul>\n' # noqa + '</div>\n' # noqa + '<h1 id="toc">[TOC]</h1>' # noqa + ) + + text = '#[TOC]\n[TOC]' + self.assertEqual( + self.md.convert(text), + '<h1 id="toc">[TOC]</h1>\n' # noqa + '<div class="toc">\n' # noqa + '<ul>\n' # noqa + '<li><a href="#toc">[TOC]</a></li>\n' # noqa + '</ul>\n' # noqa + '</div>' # noqa + ) + + text = '[TOC]\n# *[TOC]*' + self.assertEqual( + self.md.convert(text), + '<div class="toc">\n' # noqa + '<ul>\n' # noqa + '<li><a href="#toc">[TOC]</a></li>\n' # noqa + '</ul>\n' # noqa + '</div>\n' # noqa + '<h1 id="toc"><em>[TOC]</em></h1>' # noqa + ) + + +class TestSmarty(unittest.TestCase): + def setUp(self): + config = { + 'smarty': [ + ('smart_angled_quotes', True), + ('substitutions', { + 'ndash': '\u2013', + 'mdash': '\u2014', + 'ellipsis': '\u2026', + 'left-single-quote': '‚', # sb is not a typo! + 'right-single-quote': '‘', + 'left-double-quote': '„', + 'right-double-quote': '“', + 'left-angle-quote': '[', + 'right-angle-quote': ']', + }), + ] + } + self.md = markdown.Markdown( + extensions=['smarty'], + extension_configs=config + ) + + def testCustomSubstitutions(self): + text = """<< The "Unicode char of the year 2014" +is the 'mdash': --- +Must not be confused with 'ndash' (--) ... >> +""" + correct = """<p>[ The „Unicode char of the year 2014“ +is the ‚mdash‘: \u2014 +Must not be confused with ‚ndash‘ (\u2013) \u2026 ]</p>""" + self.assertEqual(self.md.convert(text), correct) diff --git a/tests/test_legacy.py b/tests/test_legacy.py new file mode 100644 index 0000000..62bc075 --- /dev/null +++ b/tests/test_legacy.py @@ -0,0 +1,194 @@ +""" +Python Markdown + +A Python implementation of John Gruber's Markdown. + +Documentation: https://python-markdown.github.io/ +GitHub: https://github.com/Python-Markdown/markdown/ +PyPI: https://pypi.org/project/Markdown/ + +Started by Manfred Stienstra (http://www.dwerg.net/). +Maintained for a few years by Yuri Takhteyev (http://www.freewisdom.org). +Currently maintained by Waylan Limberg (https://github.com/waylan), +Dmitry Shachnev (https://github.com/mitya57) and Isaac Muse (https://github.com/facelessuser). + +Copyright 2007-2018 The Python Markdown Project (v. 1.7 and later) +Copyright 2004, 2005, 2006 Yuri Takhteyev (v. 0.2-1.6b) +Copyright 2004 Manfred Stienstra (the original version) + +License: BSD (see LICENSE.md for details). +""" + +from markdown.test_tools import LegacyTestCase, Kwargs +import os +import warnings + +# Warnings should cause tests to fail... +warnings.simplefilter('error') +# Except for the warnings that shouldn't +warnings.filterwarnings('default', category=PendingDeprecationWarning) +warnings.filterwarnings('default', category=DeprecationWarning, module='markdown') + +parent_test_dir = os.path.abspath(os.path.dirname(__file__)) + + +class TestBasic(LegacyTestCase): + location = os.path.join(parent_test_dir, 'basic') + + +class TestMisc(LegacyTestCase): + location = os.path.join(parent_test_dir, 'misc') + + +class TestPhp(LegacyTestCase): + """ + Notes on "excluded" tests: + + Quotes in attributes: attributes get output in different order + + Inline HTML (Span): Backtick in raw HTML attribute TODO: fixme + + Backslash escapes: Weird whitespace issue in output + + Ins & del: Our behavior follows markdown.pl I think PHP is wrong here + + Auto Links: TODO: fix raw HTML so is doesn't match <hr@example.com> as a <hr>. + + Empty List Item: We match markdown.pl here. Maybe someday we'll support this + + Headers: TODO: fix headers to not require blank line before + + Mixed OLs and ULs: We match markdown.pl here. I think PHP is wrong here + + Emphasis: We have various minor differences in combined & incorrect em markup. + Maybe fix a few of them - but most aren't too important + + Code block in a list item: We match markdown.pl - not sure how php gets that output?? + + PHP-Specific Bugs: Not sure what to make of the escaping stuff here. + Why is PHP not removing a blackslash? + """ + location = os.path.join(parent_test_dir, 'php') + normalize = True + input_ext = '.text' + output_ext = '.xhtml' + exclude = [ + 'Quotes_in_attributes', + 'Inline_HTML_(Span)', + 'Backslash_escapes', + 'Ins_&_del', + 'Auto_Links', + 'Empty_List_Item', + 'Headers', + 'Mixed_OLs_and_ULs', + 'Emphasis', + 'Code_block_in_a_list_item', + 'PHP_Specific_Bugs' + ] + + +# class TestPhpExtra(LegacyTestCase): +# location = os.path.join(parent_test_dir, 'php/extra') +# normalize = True +# input_ext = '.text' +# output_ext = '.xhtml' +# default_kwargs = Kwargs(extensions=['extra']) + + +class TestPl2004(LegacyTestCase): + location = os.path.join(parent_test_dir, 'pl/Tests_2004') + normalize = True + input_ext = '.text' + exclude = ['Yuri_Footnotes', 'Yuri_Attributes'] + + +class TestPl2007(LegacyTestCase): + """ + Notes on "excluded" tests: + + Images: the attributes don't get ordered the same so we skip this + + Code Blocks: some weird whitespace issue + + Links, reference style: weird issue with nested brackets TODO: fixme + + Backslash escapes: backticks in raw html attributes TODO: fixme + + Code Spans: more backticks in raw html attributes TODO: fixme + """ + location = os.path.join(parent_test_dir, 'pl/Tests_2007') + normalize = True + input_ext = '.text' + exclude = [ + 'Images', + 'Code_Blocks', + 'Links,_reference_style', + 'Backslash_escapes', + 'Code_Spans' + ] + + +class TestExtensions(LegacyTestCase): + location = os.path.join(parent_test_dir, 'extensions') + exclude = ['codehilite'] + + attr_list = Kwargs(extensions=['attr_list', 'def_list', 'smarty']) + + codehilite = Kwargs(extensions=['codehilite']) + + toc = Kwargs(extensions=['toc']) + + toc_invalid = Kwargs(extensions=['toc']) + + toc_out_of_order = Kwargs(extensions=['toc']) + + toc_nested = Kwargs( + extensions=['toc'], + extension_configs={'toc': {'permalink': True}} + ) + + toc_nested2 = Kwargs( + extensions=['toc'], + extension_configs={'toc': {'permalink': "[link]"}} + ) + + toc_nested_list = Kwargs(extensions=['toc']) + + wikilinks = Kwargs(extensions=['wikilinks']) + + github_flavored = Kwargs(extensions=['fenced_code']) + + sane_lists = Kwargs(extensions=['sane_lists']) + + nl2br_w_attr_list = Kwargs(extensions=['nl2br', 'attr_list']) + + admonition = Kwargs(extensions=['admonition']) + + smarty = Kwargs( + extensions=['smarty'], + extension_configs={'smarty': {'smart_angled_quotes': True}} + ) + + +class TestExtensionsExtra(LegacyTestCase): + location = os.path.join(parent_test_dir, 'extensions/extra') + default_kwargs = Kwargs(extensions=['extra']) + + loose_def_list = Kwargs(extensions=['def_list']) + + simple_def_lists = Kwargs(extensions=['def_list']) + + abbr = Kwargs(extensions=['abbr']) + + footnotes = Kwargs(extensions=['footnotes']) + + extra_config = Kwargs( + extensions=['extra'], + extension_configs={ + 'extra': { + 'footnotes': { + 'PLACE_MARKER': '~~~placemarker~~~' + } + } + } + ) diff --git a/tests/test_meta.py b/tests/test_meta.py new file mode 100644 index 0000000..10a2d33 --- /dev/null +++ b/tests/test_meta.py @@ -0,0 +1,24 @@ +import unittest +from markdown.__meta__ import _get_version, __version__ + + +class TestVersion(unittest.TestCase): + + def test_get_version(self): + """Test that _get_version formats __version_info__ as required by PEP 440.""" + + self.assertEqual(_get_version((1, 1, 2, 'dev', 0)), "1.1.2.dev0") + self.assertEqual(_get_version((1, 1, 2, 'alpha', 1)), "1.1.2a1") + self.assertEqual(_get_version((1, 2, 0, 'beta', 2)), "1.2b2") + self.assertEqual(_get_version((1, 2, 0, 'rc', 4)), "1.2rc4") + self.assertEqual(_get_version((1, 2, 0, 'final', 0)), "1.2") + + def test__version__IsValid(self): + """Test that __version__ is valid and normalized.""" + + try: + import packaging.version + except ImportError: + from pkg_resources.extern import packaging + + self.assertEqual(__version__, str(packaging.version.Version(__version__))) diff --git a/tests/test_syntax/__init__.py b/tests/test_syntax/__init__.py new file mode 100644 index 0000000..564ba3b --- /dev/null +++ b/tests/test_syntax/__init__.py @@ -0,0 +1,20 @@ +""" +Python Markdown + +A Python implementation of John Gruber's Markdown. + +Documentation: https://python-markdown.github.io/ +GitHub: https://github.com/Python-Markdown/markdown/ +PyPI: https://pypi.org/project/Markdown/ + +Started by Manfred Stienstra (http://www.dwerg.net/). +Maintained for a few years by Yuri Takhteyev (http://www.freewisdom.org). +Currently maintained by Waylan Limberg (https://github.com/waylan), +Dmitry Shachnev (https://github.com/mitya57) and Isaac Muse (https://github.com/facelessuser). + +Copyright 2007-2018 The Python Markdown Project (v. 1.7 and later) +Copyright 2004, 2005, 2006 Yuri Takhteyev (v. 0.2-1.6b) +Copyright 2004 Manfred Stienstra (the original version) + +License: BSD (see LICENSE.md for details). +""" diff --git a/tests/test_syntax/blocks/__init__.py b/tests/test_syntax/blocks/__init__.py new file mode 100644 index 0000000..564ba3b --- /dev/null +++ b/tests/test_syntax/blocks/__init__.py @@ -0,0 +1,20 @@ +""" +Python Markdown + +A Python implementation of John Gruber's Markdown. + +Documentation: https://python-markdown.github.io/ +GitHub: https://github.com/Python-Markdown/markdown/ +PyPI: https://pypi.org/project/Markdown/ + +Started by Manfred Stienstra (http://www.dwerg.net/). +Maintained for a few years by Yuri Takhteyev (http://www.freewisdom.org). +Currently maintained by Waylan Limberg (https://github.com/waylan), +Dmitry Shachnev (https://github.com/mitya57) and Isaac Muse (https://github.com/facelessuser). + +Copyright 2007-2018 The Python Markdown Project (v. 1.7 and later) +Copyright 2004, 2005, 2006 Yuri Takhteyev (v. 0.2-1.6b) +Copyright 2004 Manfred Stienstra (the original version) + +License: BSD (see LICENSE.md for details). +""" diff --git a/tests/test_syntax/blocks/test_blockquotes.py b/tests/test_syntax/blocks/test_blockquotes.py new file mode 100644 index 0000000..3422f9f --- /dev/null +++ b/tests/test_syntax/blocks/test_blockquotes.py @@ -0,0 +1,51 @@ +""" +Python Markdown + +A Python implementation of John Gruber's Markdown. + +Documentation: https://python-markdown.github.io/ +GitHub: https://github.com/Python-Markdown/markdown/ +PyPI: https://pypi.org/project/Markdown/ + +Started by Manfred Stienstra (http://www.dwerg.net/). +Maintained for a few years by Yuri Takhteyev (http://www.freewisdom.org). +Currently maintained by Waylan Limberg (https://github.com/waylan), +Dmitry Shachnev (https://github.com/mitya57) and Isaac Muse (https://github.com/facelessuser). + +Copyright 2007-2020 The Python Markdown Project (v. 1.7 and later) +Copyright 2004, 2005, 2006 Yuri Takhteyev (v. 0.2-1.6b) +Copyright 2004 Manfred Stienstra (the original version) + +License: BSD (see LICENSE.md for details). +""" + +from markdown.test_tools import TestCase, recursionlimit + + +class TestBlockquoteBlocks(TestCase): + + # TODO: Move legacy tests here + + def test_nesting_limit(self): + # Test that the nesting limit is within 100 levels of recursion limit. Future code changes could cause the + # recursion limit to need adjusted here. We need to account for all of Markdown's internal calls. Finally, we + # need to account for the 100 level cushion which we are testing. + with recursionlimit(120): + self.assertMarkdownRenders( + '>>>>>>>>>>', + self.dedent( + """ + <blockquote> + <blockquote> + <blockquote> + <blockquote> + <blockquote> + <p>>>>>></p> + </blockquote> + </blockquote> + </blockquote> + </blockquote> + </blockquote> + """ + ) + ) diff --git a/tests/test_syntax/blocks/test_code_blocks.py b/tests/test_syntax/blocks/test_code_blocks.py new file mode 100644 index 0000000..54b6860 --- /dev/null +++ b/tests/test_syntax/blocks/test_code_blocks.py @@ -0,0 +1,88 @@ +""" +Python Markdown + +A Python implementation of John Gruber's Markdown. + +Documentation: https://python-markdown.github.io/ +GitHub: https://github.com/Python-Markdown/markdown/ +PyPI: https://pypi.org/project/Markdown/ + +Started by Manfred Stienstra (http://www.dwerg.net/). +Maintained for a few years by Yuri Takhteyev (http://www.freewisdom.org). +Currently maintained by Waylan Limberg (https://github.com/waylan), +Dmitry Shachnev (https://github.com/mitya57) and Isaac Muse (https://github.com/facelessuser). + +Copyright 2007-2018 The Python Markdown Project (v. 1.7 and later) +Copyright 2004, 2005, 2006 Yuri Takhteyev (v. 0.2-1.6b) +Copyright 2004 Manfred Stienstra (the original version) + +License: BSD (see LICENSE.md for details). +""" + +from markdown.test_tools import TestCase + + +class TestCodeBlocks(TestCase): + + def test_spaced_codeblock(self): + self.assertMarkdownRenders( + ' # A code block.', + + self.dedent( + """ + <pre><code># A code block. + </code></pre> + """ + ) + ) + + def test_tabbed_codeblock(self): + self.assertMarkdownRenders( + '\t# A code block.', + + self.dedent( + """ + <pre><code># A code block. + </code></pre> + """ + ) + ) + + def test_multiline_codeblock(self): + self.assertMarkdownRenders( + ' # Line 1\n # Line 2\n', + + self.dedent( + """ + <pre><code># Line 1 + # Line 2 + </code></pre> + """ + ) + ) + + def test_codeblock_with_blankline(self): + self.assertMarkdownRenders( + ' # Line 1\n\n # Line 2\n', + + self.dedent( + """ + <pre><code># Line 1 + + # Line 2 + </code></pre> + """ + ) + ) + + def test_codeblock_escape(self): + self.assertMarkdownRenders( + ' <foo & bar>', + + self.dedent( + """ + <pre><code><foo & bar> + </code></pre> + """ + ) + ) diff --git a/tests/test_syntax/blocks/test_headers.py b/tests/test_syntax/blocks/test_headers.py new file mode 100644 index 0000000..ca065a5 --- /dev/null +++ b/tests/test_syntax/blocks/test_headers.py @@ -0,0 +1,729 @@ +""" +Python Markdown + +A Python implementation of John Gruber's Markdown. + +Documentation: https://python-markdown.github.io/ +GitHub: https://github.com/Python-Markdown/markdown/ +PyPI: https://pypi.org/project/Markdown/ + +Started by Manfred Stienstra (http://www.dwerg.net/). +Maintained for a few years by Yuri Takhteyev (http://www.freewisdom.org). +Currently maintained by Waylan Limberg (https://github.com/waylan), +Dmitry Shachnev (https://github.com/mitya57) and Isaac Muse (https://github.com/facelessuser). + +Copyright 2007-2018 The Python Markdown Project (v. 1.7 and later) +Copyright 2004, 2005, 2006 Yuri Takhteyev (v. 0.2-1.6b) +Copyright 2004 Manfred Stienstra (the original version) + +License: BSD (see LICENSE.md for details). +""" + +import unittest +from markdown.test_tools import TestCase + + +class TestSetextHeaders(TestCase): + + def test_setext_h1(self): + self.assertMarkdownRenders( + self.dedent( + """ + This is an H1 + ============= + """ + ), + + '<h1>This is an H1</h1>' + ) + + def test_setext_h2(self): + self.assertMarkdownRenders( + self.dedent( + """ + This is an H2 + ------------- + """ + ), + + '<h2>This is an H2</h2>' + ) + + def test_setext_h1_mismatched_length(self): + self.assertMarkdownRenders( + self.dedent( + """ + This is an H1 + === + """ + ), + + '<h1>This is an H1</h1>' + ) + + def test_setext_h2_mismatched_length(self): + self.assertMarkdownRenders( + self.dedent( + """ + This is an H2 + --- + """ + ), + + '<h2>This is an H2</h2>' + ) + + def test_setext_h1_followed_by_p(self): + self.assertMarkdownRenders( + self.dedent( + """ + This is an H1 + ============= + Followed by a Paragraph with no blank line. + """ + ), + self.dedent( + """ + <h1>This is an H1</h1> + <p>Followed by a Paragraph with no blank line.</p> + """ + ) + ) + + def test_setext_h2_followed_by_p(self): + self.assertMarkdownRenders( + self.dedent( + """ + This is an H2 + ------------- + Followed by a Paragraph with no blank line. + """ + ), + self.dedent( + """ + <h2>This is an H2</h2> + <p>Followed by a Paragraph with no blank line.</p> + """ + ) + ) + + # TODO: fix this + # see https://johnmacfarlane.net/babelmark2/?normalize=1&text=Paragraph%0AAn+H1%0A%3D%3D%3D%3D%3D + @unittest.skip('This is broken in Python-Markdown') + def test_p_followed_by_setext_h1(self): + self.assertMarkdownRenders( + self.dedent( + """ + This is a Paragraph. + Followed by an H1 with no blank line. + ===================================== + """ + ), + self.dedent( + """ + <p>This is a Paragraph.</p> + <h1>Followed by an H1 with no blank line.</h1> + """ + ) + ) + + # TODO: fix this + # see https://johnmacfarlane.net/babelmark2/?normalize=1&text=Paragraph%0AAn+H2%0A----- + @unittest.skip('This is broken in Python-Markdown') + def test_p_followed_by_setext_h2(self): + self.assertMarkdownRenders( + self.dedent( + """ + This is a Paragraph. + Followed by an H2 with no blank line. + ------------------------------------- + """ + ), + self.dedent( + """ + <p>This is a Paragraph.</p> + <h2>Followed by an H2 with no blank line.</h2> + """ + ) + ) + + +class TestHashHeaders(TestCase): + + def test_hash_h1_open(self): + self.assertMarkdownRenders( + '# This is an H1', + + '<h1>This is an H1</h1>' + ) + + def test_hash_h2_open(self): + self.assertMarkdownRenders( + '## This is an H2', + + '<h2>This is an H2</h2>' + ) + + def test_hash_h3_open(self): + self.assertMarkdownRenders( + '### This is an H3', + + '<h3>This is an H3</h3>' + ) + + def test_hash_h4_open(self): + self.assertMarkdownRenders( + '#### This is an H4', + + '<h4>This is an H4</h4>' + ) + + def test_hash_h5_open(self): + self.assertMarkdownRenders( + '##### This is an H5', + + '<h5>This is an H5</h5>' + ) + + def test_hash_h6_open(self): + self.assertMarkdownRenders( + '###### This is an H6', + + '<h6>This is an H6</h6>' + ) + + def test_hash_gt6_open(self): + self.assertMarkdownRenders( + '####### This is an H6', + + '<h6># This is an H6</h6>' + ) + + def test_hash_h1_open_missing_space(self): + self.assertMarkdownRenders( + '#This is an H1', + + '<h1>This is an H1</h1>' + ) + + def test_hash_h2_open_missing_space(self): + self.assertMarkdownRenders( + '##This is an H2', + + '<h2>This is an H2</h2>' + ) + + def test_hash_h3_open_missing_space(self): + self.assertMarkdownRenders( + '###This is an H3', + + '<h3>This is an H3</h3>' + ) + + def test_hash_h4_open_missing_space(self): + self.assertMarkdownRenders( + '####This is an H4', + + '<h4>This is an H4</h4>' + ) + + def test_hash_h5_open_missing_space(self): + self.assertMarkdownRenders( + '#####This is an H5', + + '<h5>This is an H5</h5>' + ) + + def test_hash_h6_open_missing_space(self): + self.assertMarkdownRenders( + '######This is an H6', + + '<h6>This is an H6</h6>' + ) + + def test_hash_gt6_open_missing_space(self): + self.assertMarkdownRenders( + '#######This is an H6', + + '<h6>#This is an H6</h6>' + ) + + def test_hash_h1_closed(self): + self.assertMarkdownRenders( + '# This is an H1 #', + + '<h1>This is an H1</h1>' + ) + + def test_hash_h2_closed(self): + self.assertMarkdownRenders( + '## This is an H2 ##', + + '<h2>This is an H2</h2>' + ) + + def test_hash_h3_closed(self): + self.assertMarkdownRenders( + '### This is an H3 ###', + + '<h3>This is an H3</h3>' + ) + + def test_hash_h4_closed(self): + self.assertMarkdownRenders( + '#### This is an H4 ####', + + '<h4>This is an H4</h4>' + ) + + def test_hash_h5_closed(self): + self.assertMarkdownRenders( + '##### This is an H5 #####', + + '<h5>This is an H5</h5>' + ) + + def test_hash_h6_closed(self): + self.assertMarkdownRenders( + '###### This is an H6 ######', + + '<h6>This is an H6</h6>' + ) + + def test_hash_gt6_closed(self): + self.assertMarkdownRenders( + '####### This is an H6 #######', + + '<h6># This is an H6</h6>' + ) + + def test_hash_h1_closed_missing_space(self): + self.assertMarkdownRenders( + '#This is an H1#', + + '<h1>This is an H1</h1>' + ) + + def test_hash_h2_closed_missing_space(self): + self.assertMarkdownRenders( + '##This is an H2##', + + '<h2>This is an H2</h2>' + ) + + def test_hash_h3_closed_missing_space(self): + self.assertMarkdownRenders( + '###This is an H3###', + + '<h3>This is an H3</h3>' + ) + + def test_hash_h4_closed_missing_space(self): + self.assertMarkdownRenders( + '####This is an H4####', + + '<h4>This is an H4</h4>' + ) + + def test_hash_h5_closed_missing_space(self): + self.assertMarkdownRenders( + '#####This is an H5#####', + + '<h5>This is an H5</h5>' + ) + + def test_hash_h6_closed_missing_space(self): + self.assertMarkdownRenders( + '######This is an H6######', + + '<h6>This is an H6</h6>' + ) + + def test_hash_gt6_closed_missing_space(self): + self.assertMarkdownRenders( + '#######This is an H6#######', + + '<h6>#This is an H6</h6>' + ) + + def test_hash_h1_closed_mismatch(self): + self.assertMarkdownRenders( + '# This is an H1 ##', + + '<h1>This is an H1</h1>' + ) + + def test_hash_h2_closed_mismatch(self): + self.assertMarkdownRenders( + '## This is an H2 #', + + '<h2>This is an H2</h2>' + ) + + def test_hash_h3_closed_mismatch(self): + self.assertMarkdownRenders( + '### This is an H3 #', + + '<h3>This is an H3</h3>' + ) + + def test_hash_h4_closed_mismatch(self): + self.assertMarkdownRenders( + '#### This is an H4 #', + + '<h4>This is an H4</h4>' + ) + + def test_hash_h5_closed_mismatch(self): + self.assertMarkdownRenders( + '##### This is an H5 #', + + '<h5>This is an H5</h5>' + ) + + def test_hash_h6_closed_mismatch(self): + self.assertMarkdownRenders( + '###### This is an H6 #', + + '<h6>This is an H6</h6>' + ) + + def test_hash_gt6_closed_mismatch(self): + self.assertMarkdownRenders( + '####### This is an H6 ##################', + + '<h6># This is an H6</h6>' + ) + + def test_hash_h1_followed_by_p(self): + self.assertMarkdownRenders( + self.dedent( + """ + # This is an H1 + Followed by a Paragraph with no blank line. + """ + ), + self.dedent( + """ + <h1>This is an H1</h1> + <p>Followed by a Paragraph with no blank line.</p> + """ + ) + ) + + def test_hash_h2_followed_by_p(self): + self.assertMarkdownRenders( + self.dedent( + """ + ## This is an H2 + Followed by a Paragraph with no blank line. + """ + ), + self.dedent( + """ + <h2>This is an H2</h2> + <p>Followed by a Paragraph with no blank line.</p> + """ + ) + ) + + def test_hash_h3_followed_by_p(self): + self.assertMarkdownRenders( + self.dedent( + """ + ### This is an H3 + Followed by a Paragraph with no blank line. + """ + ), + self.dedent( + """ + <h3>This is an H3</h3> + <p>Followed by a Paragraph with no blank line.</p> + """ + ) + ) + + def test_hash_h4_followed_by_p(self): + self.assertMarkdownRenders( + self.dedent( + """ + #### This is an H4 + Followed by a Paragraph with no blank line. + """ + ), + self.dedent( + """ + <h4>This is an H4</h4> + <p>Followed by a Paragraph with no blank line.</p> + """ + ) + ) + + def test_hash_h5_followed_by_p(self): + self.assertMarkdownRenders( + self.dedent( + """ + ##### This is an H5 + Followed by a Paragraph with no blank line. + """ + ), + self.dedent( + """ + <h5>This is an H5</h5> + <p>Followed by a Paragraph with no blank line.</p> + """ + ) + ) + + def test_hash_h6_followed_by_p(self): + self.assertMarkdownRenders( + self.dedent( + """ + ###### This is an H6 + Followed by a Paragraph with no blank line. + """ + ), + self.dedent( + """ + <h6>This is an H6</h6> + <p>Followed by a Paragraph with no blank line.</p> + """ + ) + ) + + def test_hash_h1_leading_space(self): + self.assertMarkdownRenders( + ' # This is an H1', + + '<p># This is an H1</p>' + ) + + def test_hash_h2_leading_space(self): + self.assertMarkdownRenders( + ' ## This is an H2', + + '<p>## This is an H2</p>' + ) + + def test_hash_h3_leading_space(self): + self.assertMarkdownRenders( + ' ### This is an H3', + + '<p>### This is an H3</p>' + ) + + def test_hash_h4_leading_space(self): + self.assertMarkdownRenders( + ' #### This is an H4', + + '<p>#### This is an H4</p>' + ) + + def test_hash_h5_leading_space(self): + self.assertMarkdownRenders( + ' ##### This is an H5', + + '<p>##### This is an H5</p>' + ) + + def test_hash_h6_leading_space(self): + self.assertMarkdownRenders( + ' ###### This is an H6', + + '<p>###### This is an H6</p>' + ) + + def test_hash_h1_open_trailing_space(self): + self.assertMarkdownRenders( + '# This is an H1 ', + + '<h1>This is an H1</h1>' + ) + + def test_hash_h2_open_trailing_space(self): + self.assertMarkdownRenders( + '## This is an H2 ', + + '<h2>This is an H2</h2>' + ) + + def test_hash_h3_open_trailing_space(self): + self.assertMarkdownRenders( + '### This is an H3 ', + + '<h3>This is an H3</h3>' + ) + + def test_hash_h4_open_trailing_space(self): + self.assertMarkdownRenders( + '#### This is an H4 ', + + '<h4>This is an H4</h4>' + ) + + def test_hash_h5_open_trailing_space(self): + self.assertMarkdownRenders( + '##### This is an H5 ', + + '<h5>This is an H5</h5>' + ) + + def test_hash_h6_open_trailing_space(self): + self.assertMarkdownRenders( + '###### This is an H6 ', + + '<h6>This is an H6</h6>' + ) + + def test_hash_gt6_open_trailing_space(self): + self.assertMarkdownRenders( + '####### This is an H6 ', + + '<h6># This is an H6</h6>' + ) + + # TODO: Possibly change the following behavior. While this follows the behavior + # of markdown.pl, it is rather uncommon and not necessarily intuitive. + # See: https://johnmacfarlane.net/babelmark2/?normalize=1&text=%23+This+is+an+H1+%23+ + def test_hash_h1_closed_trailing_space(self): + self.assertMarkdownRenders( + '# This is an H1 # ', + + '<h1>This is an H1 #</h1>' + ) + + def test_hash_h2_closed_trailing_space(self): + self.assertMarkdownRenders( + '## This is an H2 ## ', + + '<h2>This is an H2 ##</h2>' + ) + + def test_hash_h3_closed_trailing_space(self): + self.assertMarkdownRenders( + '### This is an H3 ### ', + + '<h3>This is an H3 ###</h3>' + ) + + def test_hash_h4_closed_trailing_space(self): + self.assertMarkdownRenders( + '#### This is an H4 #### ', + + '<h4>This is an H4 ####</h4>' + ) + + def test_hash_h5_closed_trailing_space(self): + self.assertMarkdownRenders( + '##### This is an H5 ##### ', + + '<h5>This is an H5 #####</h5>' + ) + + def test_hash_h6_closed_trailing_space(self): + self.assertMarkdownRenders( + '###### This is an H6 ###### ', + + '<h6>This is an H6 ######</h6>' + ) + + def test_hash_gt6_closed_trailing_space(self): + self.assertMarkdownRenders( + '####### This is an H6 ####### ', + + '<h6># This is an H6 #######</h6>' + ) + + def test_no_blank_lines_between_hashs(self): + self.assertMarkdownRenders( + self.dedent( + """ + # This is an H1 + ## This is an H2 + """ + ), + self.dedent( + """ + <h1>This is an H1</h1> + <h2>This is an H2</h2> + """ + ) + ) + + def test_random_hash_levels(self): + self.assertMarkdownRenders( + self.dedent( + """ + ### H3 + ###### H6 + # H1 + ##### H5 + #### H4 + ## H2 + ### H3 + """ + ), + self.dedent( + """ + <h3>H3</h3> + <h6>H6</h6> + <h1>H1</h1> + <h5>H5</h5> + <h4>H4</h4> + <h2>H2</h2> + <h3>H3</h3> + """ + ) + ) + + def test_hash_followed_by_p(self): + self.assertMarkdownRenders( + self.dedent( + """ + # This is an H1 + Followed by a Paragraph with no blank line. + """ + ), + self.dedent( + """ + <h1>This is an H1</h1> + <p>Followed by a Paragraph with no blank line.</p> + """ + ) + ) + + def test_p_followed_by_hash(self): + self.assertMarkdownRenders( + self.dedent( + """ + This is a Paragraph. + # Followed by an H1 with no blank line. + """ + ), + self.dedent( + """ + <p>This is a Paragraph.</p> + <h1>Followed by an H1 with no blank line.</h1> + """ + ) + ) + + def test_escaped_hash(self): + self.assertMarkdownRenders( + "### H3 \\###", + self.dedent( + """ + <h3>H3 #</h3> + """ + ) + ) + + def test_unescaped_hash(self): + self.assertMarkdownRenders( + "### H3 \\\\###", + self.dedent( + """ + <h3>H3 \\</h3> + """ + ) + ) diff --git a/tests/test_syntax/blocks/test_hr.py b/tests/test_syntax/blocks/test_hr.py new file mode 100644 index 0000000..85a51b3 --- /dev/null +++ b/tests/test_syntax/blocks/test_hr.py @@ -0,0 +1,402 @@ +""" +Python Markdown + +A Python implementation of John Gruber's Markdown. + +Documentation: https://python-markdown.github.io/ +GitHub: https://github.com/Python-Markdown/markdown/ +PyPI: https://pypi.org/project/Markdown/ + +Started by Manfred Stienstra (http://www.dwerg.net/). +Maintained for a few years by Yuri Takhteyev (http://www.freewisdom.org). +Currently maintained by Waylan Limberg (https://github.com/waylan), +Dmitry Shachnev (https://github.com/mitya57) and Isaac Muse (https://github.com/facelessuser). + +Copyright 2007-2018 The Python Markdown Project (v. 1.7 and later) +Copyright 2004, 2005, 2006 Yuri Takhteyev (v. 0.2-1.6b) +Copyright 2004 Manfred Stienstra (the original version) + +License: BSD (see LICENSE.md for details). +""" + +from markdown.test_tools import TestCase + + +class TestHorizontalRules(TestCase): + + def test_hr_asterisks(self): + self.assertMarkdownRenders( + '***', + + '<hr />' + ) + + def test_hr_asterisks_spaces(self): + self.assertMarkdownRenders( + '* * *', + + '<hr />' + ) + + def test_hr_asterisks_long(self): + self.assertMarkdownRenders( + '*******', + + '<hr />' + ) + + def test_hr_asterisks_spaces_long(self): + self.assertMarkdownRenders( + '* * * * * * *', + + '<hr />' + ) + + def test_hr_asterisks_1_indent(self): + self.assertMarkdownRenders( + ' ***', + + '<hr />' + ) + + def test_hr_asterisks_spaces_1_indent(self): + self.assertMarkdownRenders( + ' * * *', + + '<hr />' + ) + + def test_hr_asterisks_2_indent(self): + self.assertMarkdownRenders( + ' ***', + + '<hr />' + ) + + def test_hr_asterisks_spaces_2_indent(self): + self.assertMarkdownRenders( + ' * * *', + + '<hr />' + ) + + def test_hr_asterisks_3_indent(self): + self.assertMarkdownRenders( + ' ***', + + '<hr />' + ) + + def test_hr_asterisks_spaces_3_indent(self): + self.assertMarkdownRenders( + ' * * *', + + '<hr />' + ) + + def test_hr_asterisks_trailing_space(self): + self.assertMarkdownRenders( + '*** ', + + '<hr />' + ) + + def test_hr_asterisks_spaces_trailing_space(self): + self.assertMarkdownRenders( + '* * * ', + + '<hr />' + ) + + def test_hr_hyphens(self): + self.assertMarkdownRenders( + '---', + + '<hr />' + ) + + def test_hr_hyphens_spaces(self): + self.assertMarkdownRenders( + '- - -', + + '<hr />' + ) + + def test_hr_hyphens_long(self): + self.assertMarkdownRenders( + '-------', + + '<hr />' + ) + + def test_hr_hyphens_spaces_long(self): + self.assertMarkdownRenders( + '- - - - - - -', + + '<hr />' + ) + + def test_hr_hyphens_1_indent(self): + self.assertMarkdownRenders( + ' ---', + + '<hr />' + ) + + def test_hr_hyphens_spaces_1_indent(self): + self.assertMarkdownRenders( + ' - - -', + + '<hr />' + ) + + def test_hr_hyphens_2_indent(self): + self.assertMarkdownRenders( + ' ---', + + '<hr />' + ) + + def test_hr_hyphens_spaces_2_indent(self): + self.assertMarkdownRenders( + ' - - -', + + '<hr />' + ) + + def test_hr_hyphens_3_indent(self): + self.assertMarkdownRenders( + ' ---', + + '<hr />' + ) + + def test_hr_hyphens_spaces_3_indent(self): + self.assertMarkdownRenders( + ' - - -', + + '<hr />' + ) + + def test_hr_hyphens_trailing_space(self): + self.assertMarkdownRenders( + '--- ', + + '<hr />' + ) + + def test_hr_hyphens_spaces_trailing_space(self): + self.assertMarkdownRenders( + '- - - ', + + '<hr />' + ) + + def test_hr_underscores(self): + self.assertMarkdownRenders( + '___', + + '<hr />' + ) + + def test_hr_underscores_spaces(self): + self.assertMarkdownRenders( + '_ _ _', + + '<hr />' + ) + + def test_hr_underscores_long(self): + self.assertMarkdownRenders( + '_______', + + '<hr />' + ) + + def test_hr_underscores_spaces_long(self): + self.assertMarkdownRenders( + '_ _ _ _ _ _ _', + + '<hr />' + ) + + def test_hr_underscores_1_indent(self): + self.assertMarkdownRenders( + ' ___', + + '<hr />' + ) + + def test_hr_underscores_spaces_1_indent(self): + self.assertMarkdownRenders( + ' _ _ _', + + '<hr />' + ) + + def test_hr_underscores_2_indent(self): + self.assertMarkdownRenders( + ' ___', + + '<hr />' + ) + + def test_hr_underscores_spaces_2_indent(self): + self.assertMarkdownRenders( + ' _ _ _', + + '<hr />' + ) + + def test_hr_underscores_3_indent(self): + self.assertMarkdownRenders( + ' ___', + + '<hr />' + ) + + def test_hr_underscores_spaces_3_indent(self): + self.assertMarkdownRenders( + ' _ _ _', + + '<hr />' + ) + + def test_hr_underscores_trailing_space(self): + self.assertMarkdownRenders( + '___ ', + + '<hr />' + ) + + def test_hr_underscores_spaces_trailing_space(self): + self.assertMarkdownRenders( + '_ _ _ ', + + '<hr />' + ) + + def test_hr_before_paragraph(self): + self.assertMarkdownRenders( + self.dedent( + """ + *** + An HR followed by a paragraph with no blank line. + """ + ), + self.dedent( + """ + <hr /> + <p>An HR followed by a paragraph with no blank line.</p> + """ + ) + ) + + def test_hr_after_paragraph(self): + self.assertMarkdownRenders( + self.dedent( + """ + A paragraph followed by an HR with no blank line. + *** + """ + ), + self.dedent( + """ + <p>A paragraph followed by an HR with no blank line.</p> + <hr /> + """ + ) + ) + + def test_hr_after_emstrong(self): + self.assertMarkdownRenders( + self.dedent( + """ + ***text*** + *** + """ + ), + self.dedent( + """ + <p><strong><em>text</em></strong></p> + <hr /> + """ + ) + ) + + def test_not_hr_2_asterisks(self): + self.assertMarkdownRenders( + '**', + + '<p>**</p>' + ) + + def test_not_hr_2_asterisks_spaces(self): + self.assertMarkdownRenders( + '* *', + + self.dedent( + """ + <ul> + <li>*</li> + </ul> + """ + ) + ) + + def test_not_hr_2_hyphens(self): + self.assertMarkdownRenders( + '--', + + '<p>--</p>' + ) + + def test_not_hr_2_hyphens_spaces(self): + self.assertMarkdownRenders( + '- -', + + self.dedent( + """ + <ul> + <li>-</li> + </ul> + """ + ) + ) + + def test_not_hr_2_underscores(self): + self.assertMarkdownRenders( + '__', + + '<p>__</p>' + ) + + def test_not_hr_2_underscores_spaces(self): + self.assertMarkdownRenders( + '_ _', + + '<p>_ _</p>' + ) + + def test_2_consecutive_hr(self): + self.assertMarkdownRenders( + self.dedent( + """ + - - - + - - - + """ + ), + self.dedent( + """ + <hr /> + <hr /> + """ + ) + ) + + def test_not_hr_end_in_char(self): + self.assertMarkdownRenders( + '--------------------------------------c', + + '<p>--------------------------------------c</p>' + ) diff --git a/tests/test_syntax/blocks/test_html_blocks.py b/tests/test_syntax/blocks/test_html_blocks.py new file mode 100644 index 0000000..9ec0668 --- /dev/null +++ b/tests/test_syntax/blocks/test_html_blocks.py @@ -0,0 +1,1619 @@ +# -*- coding: utf-8 -*- +""" +Python Markdown + +A Python implementation of John Gruber's Markdown. + +Documentation: https://python-markdown.github.io/ +GitHub: https://github.com/Python-Markdown/markdown/ +PyPI: https://pypi.org/project/Markdown/ + +Started by Manfred Stienstra (http://www.dwerg.net/). +Maintained for a few years by Yuri Takhteyev (http://www.freewisdom.org). +Currently maintained by Waylan Limberg (https://github.com/waylan), +Dmitry Shachnev (https://github.com/mitya57) and Isaac Muse (https://github.com/facelessuser). + +Copyright 2007-2018 The Python Markdown Project (v. 1.7 and later) +Copyright 2004, 2005, 2006 Yuri Takhteyev (v. 0.2-1.6b) +Copyright 2004 Manfred Stienstra (the original version) + +License: BSD (see LICENSE.md for details). +""" + +from markdown.test_tools import TestCase +import markdown + + +class TestHTMLBlocks(TestCase): + + def test_raw_paragraph(self): + self.assertMarkdownRenders( + '<p>A raw paragraph.</p>', + '<p>A raw paragraph.</p>' + ) + + def test_raw_skip_inline_markdown(self): + self.assertMarkdownRenders( + '<p>A *raw* paragraph.</p>', + '<p>A *raw* paragraph.</p>' + ) + + def test_raw_indent_one_space(self): + self.assertMarkdownRenders( + ' <p>A *raw* paragraph.</p>', + '<p>A *raw* paragraph.</p>' + ) + + def test_raw_indent_two_spaces(self): + self.assertMarkdownRenders( + ' <p>A *raw* paragraph.</p>', + '<p>A *raw* paragraph.</p>' + ) + + def test_raw_indent_three_spaces(self): + self.assertMarkdownRenders( + ' <p>A *raw* paragraph.</p>', + '<p>A *raw* paragraph.</p>' + ) + + def test_raw_indent_four_spaces(self): + self.assertMarkdownRenders( + ' <p>code block</p>', + self.dedent( + """ + <pre><code><p>code block</p> + </code></pre> + """ + ) + ) + + def test_raw_span(self): + self.assertMarkdownRenders( + '<span>*inline*</span>', + '<p><span><em>inline</em></span></p>' + ) + + def test_code_span(self): + self.assertMarkdownRenders( + '`<p>code span</p>`', + '<p><code><p>code span</p></code></p>' + ) + + def test_code_span_open_gt(self): + self.assertMarkdownRenders( + '*bar* `<` *foo*', + '<p><em>bar</em> <code><</code> <em>foo</em></p>' + ) + + def test_raw_empty(self): + self.assertMarkdownRenders( + '<p></p>', + '<p></p>' + ) + + def test_raw_empty_space(self): + self.assertMarkdownRenders( + '<p> </p>', + '<p> </p>' + ) + + def test_raw_empty_newline(self): + self.assertMarkdownRenders( + '<p>\n</p>', + '<p>\n</p>' + ) + + def test_raw_empty_blank_line(self): + self.assertMarkdownRenders( + '<p>\n\n</p>', + '<p>\n\n</p>' + ) + + def test_raw_uppercase(self): + self.assertMarkdownRenders( + '<DIV>*foo*</DIV>', + '<DIV>*foo*</DIV>' + ) + + def test_raw_uppercase_multiline(self): + self.assertMarkdownRenders( + self.dedent( + """ + <DIV> + *foo* + </DIV> + """ + ), + self.dedent( + """ + <DIV> + *foo* + </DIV> + """ + ) + ) + + def test_multiple_raw_single_line(self): + self.assertMarkdownRenders( + '<p>*foo*</p><div>*bar*</div>', + self.dedent( + """ + <p>*foo*</p> + <div>*bar*</div> + """ + ) + ) + + def test_multiple_raw_single_line_with_pi(self): + self.assertMarkdownRenders( + "<p>*foo*</p><?php echo '>'; ?>", + self.dedent( + """ + <p>*foo*</p> + <?php echo '>'; ?> + """ + ) + ) + + def test_multiline_raw(self): + self.assertMarkdownRenders( + self.dedent( + """ + <p> + A raw paragraph + with multiple lines. + </p> + """ + ), + self.dedent( + """ + <p> + A raw paragraph + with multiple lines. + </p> + """ + ) + ) + + def test_blank_lines_in_raw(self): + self.assertMarkdownRenders( + self.dedent( + """ + <p> + + A raw paragraph... + + with many blank lines. + + </p> + """ + ), + self.dedent( + """ + <p> + + A raw paragraph... + + with many blank lines. + + </p> + """ + ) + ) + + def test_raw_surrounded_by_Markdown(self): + self.assertMarkdownRenders( + self.dedent( + """ + Some *Markdown* text. + + <p>*Raw* HTML.</p> + + More *Markdown* text. + """ + ), + self.dedent( + """ + <p>Some <em>Markdown</em> text.</p> + <p>*Raw* HTML.</p> + + <p>More <em>Markdown</em> text.</p> + """ + ) + ) + + def test_raw_surrounded_by_text_without_blank_lines(self): + self.assertMarkdownRenders( + self.dedent( + """ + Some *Markdown* text. + <p>*Raw* HTML.</p> + More *Markdown* text. + """ + ), + self.dedent( + """ + <p>Some <em>Markdown</em> text.</p> + <p>*Raw* HTML.</p> + <p>More <em>Markdown</em> text.</p> + """ + ) + ) + + def test_multiline_markdown_with_code_span(self): + self.assertMarkdownRenders( + self.dedent( + """ + A paragraph with a block-level + `<p>code span</p>`, which is + at the start of a line. + """ + ), + self.dedent( + """ + <p>A paragraph with a block-level + <code><p>code span</p></code>, which is + at the start of a line.</p> + """ + ) + ) + + def test_raw_block_preceded_by_markdown_code_span_with_unclosed_block_tag(self): + self.assertMarkdownRenders( + self.dedent( + """ + A paragraph with a block-level code span: `<div>`. + + <p>*not markdown*</p> + + This is *markdown* + """ + ), + self.dedent( + """ + <p>A paragraph with a block-level code span: <code><div></code>.</p> + <p>*not markdown*</p> + + <p>This is <em>markdown</em></p> + """ + ) + ) + + def test_raw_one_line_followed_by_text(self): + self.assertMarkdownRenders( + '<p>*foo*</p>*bar*', + self.dedent( + """ + <p>*foo*</p> + <p><em>bar</em></p> + """ + ) + ) + + def test_raw_one_line_followed_by_span(self): + self.assertMarkdownRenders( + "<p>*foo*</p><span>*bar*</span>", + self.dedent( + """ + <p>*foo*</p> + <p><span><em>bar</em></span></p> + """ + ) + ) + + def test_raw_with_markdown_blocks(self): + self.assertMarkdownRenders( + self.dedent( + """ + <div> + Not a Markdown paragraph. + + * Not a list item. + * Another non-list item. + + Another non-Markdown paragraph. + </div> + """ + ), + self.dedent( + """ + <div> + Not a Markdown paragraph. + + * Not a list item. + * Another non-list item. + + Another non-Markdown paragraph. + </div> + """ + ) + ) + + def test_adjacent_raw_blocks(self): + self.assertMarkdownRenders( + self.dedent( + """ + <p>A raw paragraph.</p> + <p>A second raw paragraph.</p> + """ + ), + self.dedent( + """ + <p>A raw paragraph.</p> + <p>A second raw paragraph.</p> + """ + ) + ) + + def test_adjacent_raw_blocks_with_blank_lines(self): + self.assertMarkdownRenders( + self.dedent( + """ + <p>A raw paragraph.</p> + + <p>A second raw paragraph.</p> + """ + ), + self.dedent( + """ + <p>A raw paragraph.</p> + + <p>A second raw paragraph.</p> + """ + ) + ) + + def test_nested_raw_one_line(self): + self.assertMarkdownRenders( + '<div><p>*foo*</p></div>', + '<div><p>*foo*</p></div>' + ) + + def test_nested_raw_block(self): + self.assertMarkdownRenders( + self.dedent( + """ + <div> + <p>A raw paragraph.</p> + </div> + """ + ), + self.dedent( + """ + <div> + <p>A raw paragraph.</p> + </div> + """ + ) + ) + + def test_nested_indented_raw_block(self): + self.assertMarkdownRenders( + self.dedent( + """ + <div> + <p>A raw paragraph.</p> + </div> + """ + ), + self.dedent( + """ + <div> + <p>A raw paragraph.</p> + </div> + """ + ) + ) + + def test_nested_raw_blocks(self): + self.assertMarkdownRenders( + self.dedent( + """ + <div> + <p>A raw paragraph.</p> + <p>A second raw paragraph.</p> + </div> + """ + ), + self.dedent( + """ + <div> + <p>A raw paragraph.</p> + <p>A second raw paragraph.</p> + </div> + """ + ) + ) + + def test_nested_raw_blocks_with_blank_lines(self): + self.assertMarkdownRenders( + self.dedent( + """ + <div> + + <p>A raw paragraph.</p> + + <p>A second raw paragraph.</p> + + </div> + """ + ), + self.dedent( + """ + <div> + + <p>A raw paragraph.</p> + + <p>A second raw paragraph.</p> + + </div> + """ + ) + ) + + def test_nested_inline_one_line(self): + self.assertMarkdownRenders( + '<p><em>foo</em><br></p>', + '<p><em>foo</em><br></p>' + ) + + def test_raw_nested_inline(self): + self.assertMarkdownRenders( + self.dedent( + """ + <div> + <p> + <span>*text*</span> + </p> + </div> + """ + ), + self.dedent( + """ + <div> + <p> + <span>*text*</span> + </p> + </div> + """ + ) + ) + + def test_raw_nested_inline_with_blank_lines(self): + self.assertMarkdownRenders( + self.dedent( + """ + <div> + + <p> + + <span>*text*</span> + + </p> + + </div> + """ + ), + self.dedent( + """ + <div> + + <p> + + <span>*text*</span> + + </p> + + </div> + """ + ) + ) + + def test_raw_html5(self): + self.assertMarkdownRenders( + self.dedent( + """ + <section> + <header> + <hgroup> + <h1>Hello :-)</h1> + </hgroup> + </header> + <figure> + <img src="image.png" alt="" /> + <figcaption>Caption</figcaption> + </figure> + <footer> + <p>Some footer</p> + </footer> + </section> + """ + ), + self.dedent( + """ + <section> + <header> + <hgroup> + <h1>Hello :-)</h1> + </hgroup> + </header> + <figure> + <img src="image.png" alt="" /> + <figcaption>Caption</figcaption> + </figure> + <footer> + <p>Some footer</p> + </footer> + </section> + """ + ) + ) + + def test_raw_pre_tag(self): + self.assertMarkdownRenders( + self.dedent( + """ + Preserve whitespace in raw html + + <pre> + class Foo(): + bar = 'bar' + + @property + def baz(self): + return self.bar + </pre> + """ + ), + self.dedent( + """ + <p>Preserve whitespace in raw html</p> + <pre> + class Foo(): + bar = 'bar' + + @property + def baz(self): + return self.bar + </pre> + """ + ) + ) + + def test_raw_pre_tag_nested_escaped_html(self): + self.assertMarkdownRenders( + self.dedent( + """ + <pre> + <p>foo</p> + </pre> + """ + ), + self.dedent( + """ + <pre> + <p>foo</p> + </pre> + """ + ) + ) + + def test_raw_p_no_end_tag(self): + self.assertMarkdownRenders( + '<p>*text*', + '<p>*text*' + ) + + def test_raw_multiple_p_no_end_tag(self): + self.assertMarkdownRenders( + self.dedent( + """ + <p>*text*' + + <p>more *text* + """ + ), + self.dedent( + """ + <p>*text*' + + <p>more *text* + """ + ) + ) + + def test_raw_p_no_end_tag_followed_by_blank_line(self): + self.assertMarkdownRenders( + self.dedent( + """ + <p>*raw text*' + + Still part of *raw* text. + """ + ), + self.dedent( + """ + <p>*raw text*' + + Still part of *raw* text. + """ + ) + ) + + def test_raw_nested_p_no_end_tag(self): + self.assertMarkdownRenders( + '<div><p>*text*</div>', + '<div><p>*text*</div>' + ) + + def test_raw_open_bracket_only(self): + self.assertMarkdownRenders( + '<', + '<p><</p>' + ) + + def test_raw_open_bracket_followed_by_space(self): + self.assertMarkdownRenders( + '< foo', + '<p>< foo</p>' + ) + + def test_raw_missing_close_bracket(self): + self.assertMarkdownRenders( + '<foo', + '<p><foo</p>' + ) + + def test_raw_unclosed_tag_in_code_span(self): + self.assertMarkdownRenders( + self.dedent( + """ + `<div`. + + <div> + hello + </div> + """ + ), + self.dedent( + """ + <p><code><div</code>.</p> + <div> + hello + </div> + """ + ) + ) + + def test_raw_unclosed_tag_in_code_span_space(self): + self.assertMarkdownRenders( + self.dedent( + """ + ` <div `. + + <div> + hello + </div> + """ + ), + self.dedent( + """ + <p><code><div</code>.</p> + <div> + hello + </div> + """ + ) + ) + + def test_raw_attributes(self): + self.assertMarkdownRenders( + '<p id="foo", class="bar baz", style="margin: 15px; line-height: 1.5; text-align: center;">text</p>', + '<p id="foo", class="bar baz", style="margin: 15px; line-height: 1.5; text-align: center;">text</p>' + ) + + def test_raw_attributes_nested(self): + self.assertMarkdownRenders( + self.dedent( + """ + <div id="foo, class="bar", style="background: #ffe7e8; border: 2px solid #e66465;"> + <p id="baz", style="margin: 15px; line-height: 1.5; text-align: center;"> + <img scr="../foo.jpg" title="with 'quoted' text." valueless_attr weirdness="<i>foo</i>" /> + </p> + </div> + """ + ), + self.dedent( + """ + <div id="foo, class="bar", style="background: #ffe7e8; border: 2px solid #e66465;"> + <p id="baz", style="margin: 15px; line-height: 1.5; text-align: center;"> + <img scr="../foo.jpg" title="with 'quoted' text." valueless_attr weirdness="<i>foo</i>" /> + </p> + </div> + """ + ) + ) + + def test_raw_comment_one_line(self): + self.assertMarkdownRenders( + '<!-- *foo* -->', + '<!-- *foo* -->' + ) + + def test_raw_comment_one_line_with_tag(self): + self.assertMarkdownRenders( + '<!-- <tag> -->', + '<!-- <tag> -->' + ) + + def test_comment_in_code_span(self): + self.assertMarkdownRenders( + '`<!-- *foo* -->`', + '<p><code><!-- *foo* --></code></p>' + ) + + def test_raw_comment_one_line_followed_by_text(self): + self.assertMarkdownRenders( + '<!-- *foo* -->*bar*', + self.dedent( + """ + <!-- *foo* --> + <p><em>bar</em></p> + """ + ) + ) + + def test_raw_comment_one_line_followed_by_html(self): + self.assertMarkdownRenders( + '<!-- *foo* --><p>*bar*</p>', + self.dedent( + """ + <!-- *foo* --> + <p>*bar*</p> + """ + ) + ) + + # Note: Trailing (insignificant) whitespace is not preserved, which does not match the + # reference implementation. However, it is not a change in behavior for Python-Markdown. + def test_raw_comment_trailing_whitespace(self): + self.assertMarkdownRenders( + '<!-- *foo* --> ', + '<!-- *foo* -->' + ) + + # Note: this is a change in behavior for Python-Markdown, which does *not* match the reference + # implementation. However, it does match the HTML5 spec. Declarations must start with either + # `<!DOCTYPE` or `<![`. Anything else that starts with `<!` is a comment. According to the + # HTML5 spec, a comment without the hyphens is a "bogus comment", but a comment nonetheless. + # See https://www.w3.org/TR/html52/syntax.html#markup-declaration-open-state. + # If we wanted to change this behavior, we could override `HTMLParser.parse_bogus_comment()`. + def test_bogus_comment(self): + self.assertMarkdownRenders( + '<!*foo*>', + '<!--*foo*-->' + ) + + def test_raw_multiline_comment(self): + self.assertMarkdownRenders( + self.dedent( + """ + <!-- + *foo* + --> + """ + ), + self.dedent( + """ + <!-- + *foo* + --> + """ + ) + ) + + def test_raw_multiline_comment_with_tag(self): + self.assertMarkdownRenders( + self.dedent( + """ + <!-- + <tag> + --> + """ + ), + self.dedent( + """ + <!-- + <tag> + --> + """ + ) + ) + + def test_raw_multiline_comment_first_line(self): + self.assertMarkdownRenders( + self.dedent( + """ + <!-- *foo* + --> + """ + ), + self.dedent( + """ + <!-- *foo* + --> + """ + ) + ) + + def test_raw_multiline_comment_last_line(self): + self.assertMarkdownRenders( + self.dedent( + """ + <!-- + *foo* --> + """ + ), + self.dedent( + """ + <!-- + *foo* --> + """ + ) + ) + + def test_raw_comment_with_blank_lines(self): + self.assertMarkdownRenders( + self.dedent( + """ + <!-- + + *foo* + + --> + """ + ), + self.dedent( + """ + <!-- + + *foo* + + --> + """ + ) + ) + + def test_raw_comment_with_blank_lines_with_tag(self): + self.assertMarkdownRenders( + self.dedent( + """ + <!-- + + <tag> + + --> + """ + ), + self.dedent( + """ + <!-- + + <tag> + + --> + """ + ) + ) + + def test_raw_comment_with_blank_lines_first_line(self): + self.assertMarkdownRenders( + self.dedent( + """ + <!-- *foo* + + --> + """ + ), + self.dedent( + """ + <!-- *foo* + + --> + """ + ) + ) + + def test_raw_comment_with_blank_lines_last_line(self): + self.assertMarkdownRenders( + self.dedent( + """ + <!-- + + *foo* --> + """ + ), + self.dedent( + """ + <!-- + + *foo* --> + """ + ) + ) + + def test_raw_comment_indented(self): + self.assertMarkdownRenders( + self.dedent( + """ + <!-- + + *foo* + + --> + """ + ), + self.dedent( + """ + <!-- + + *foo* + + --> + """ + ) + ) + + def test_raw_comment_indented_with_tag(self): + self.assertMarkdownRenders( + self.dedent( + """ + <!-- + + <tag> + + --> + """ + ), + self.dedent( + """ + <!-- + + <tag> + + --> + """ + ) + ) + + def test_raw_comment_nested(self): + self.assertMarkdownRenders( + self.dedent( + """ + <div> + <!-- *foo* --> + </div> + """ + ), + self.dedent( + """ + <div> + <!-- *foo* --> + </div> + """ + ) + ) + + def test_comment_in_code_block(self): + self.assertMarkdownRenders( + ' <!-- *foo* -->', + self.dedent( + """ + <pre><code><!-- *foo* --> + </code></pre> + """ + ) + ) + + # Note: This is a change in behavior. Previously, Python-Markdown interpreted this in the same manner + # as browsers and all text after the opening comment tag was considered to be in a comment. However, + # that did not match the reference implementation. The new behavior does. + def test_unclosed_comment_(self): + self.assertMarkdownRenders( + self.dedent( + """ + <!-- unclosed comment + + *not* a comment + """ + ), + self.dedent( + """ + <p><!-- unclosed comment</p> + <p><em>not</em> a comment</p> + """ + ) + ) + + def test_raw_processing_instruction_one_line(self): + self.assertMarkdownRenders( + "<?php echo '>'; ?>", + "<?php echo '>'; ?>" + ) + + # This is a change in behavior and does not match the reference implementation. + # We have no way to determine if text is on the same line, so we get this. TODO: reevaluate! + def test_raw_processing_instruction_one_line_followed_by_text(self): + self.assertMarkdownRenders( + "<?php echo '>'; ?>*bar*", + self.dedent( + """ + <?php echo '>'; ?> + <p><em>bar</em></p> + """ + ) + ) + + def test_raw_multiline_processing_instruction(self): + self.assertMarkdownRenders( + self.dedent( + """ + <?php + echo '>'; + ?> + """ + ), + self.dedent( + """ + <?php + echo '>'; + ?> + """ + ) + ) + + def test_raw_processing_instruction_with_blank_lines(self): + self.assertMarkdownRenders( + self.dedent( + """ + <?php + + echo '>'; + + ?> + """ + ), + self.dedent( + """ + <?php + + echo '>'; + + ?> + """ + ) + ) + + def test_raw_processing_instruction_indented(self): + self.assertMarkdownRenders( + self.dedent( + """ + <?php + + echo '>'; + + ?> + """ + ), + self.dedent( + """ + <?php + + echo '>'; + + ?> + """ + ) + ) + + def test_raw_processing_instruction_code_span(self): + self.assertMarkdownRenders( + self.dedent( + """ + `<?php` + + <div> + foo + </div> + """ + ), + self.dedent( + """ + <p><code><?php</code></p> + <div> + foo + </div> + """ + ) + ) + + def test_raw_declaration_one_line(self): + self.assertMarkdownRenders( + '<!DOCTYPE html>', + '<!DOCTYPE html>' + ) + + # This is a change in behavior and does not match the reference implementation. + # We have no way to determine if text is on the same line, so we get this. TODO: reevaluate! + def test_raw_declaration_one_line_followed_by_text(self): + self.assertMarkdownRenders( + '<!DOCTYPE html>*bar*', + self.dedent( + """ + <!DOCTYPE html> + <p><em>bar</em></p> + """ + ) + ) + + def test_raw_multiline_declaration(self): + self.assertMarkdownRenders( + self.dedent( + """ + <!DOCTYPE html PUBLIC + "-//W3C//DTD XHTML 1.1//EN" + "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> + """ + ), + self.dedent( + """ + <!DOCTYPE html PUBLIC + "-//W3C//DTD XHTML 1.1//EN" + "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> + """ + ) + ) + + def test_raw_declaration_code_span(self): + self.assertMarkdownRenders( + self.dedent( + """ + `<!` + + <div> + foo + </div> + """ + ), + self.dedent( + """ + <p><code><!</code></p> + <div> + foo + </div> + """ + ) + ) + + def test_raw_cdata_one_line(self): + self.assertMarkdownRenders( + '<![CDATA[ document.write(">"); ]]>', + '<![CDATA[ document.write(">"); ]]>' + ) + + # Note: this is a change. Neither previous output nor this match reference implementation. + def test_raw_cdata_one_line_followed_by_text(self): + self.assertMarkdownRenders( + '<![CDATA[ document.write(">"); ]]>*bar*', + self.dedent( + """ + <![CDATA[ document.write(">"); ]]> + <p><em>bar</em></p> + """ + ) + ) + + def test_raw_multiline_cdata(self): + self.assertMarkdownRenders( + self.dedent( + """ + <![CDATA[ + document.write(">"); + ]]> + """ + ), + self.dedent( + """ + <![CDATA[ + document.write(">"); + ]]> + """ + ) + ) + + def test_raw_cdata_with_blank_lines(self): + self.assertMarkdownRenders( + self.dedent( + """ + <![CDATA[ + + document.write(">"); + + ]]> + """ + ), + self.dedent( + """ + <![CDATA[ + + document.write(">"); + + ]]> + """ + ) + ) + + def test_raw_cdata_indented(self): + self.assertMarkdownRenders( + self.dedent( + """ + <![CDATA[ + + document.write(">"); + + ]]> + """ + ), + self.dedent( + """ + <![CDATA[ + + document.write(">"); + + ]]> + """ + ) + ) + + def test_raw_cdata_code_span(self): + self.assertMarkdownRenders( + self.dedent( + """ + `<![` + + <div> + foo + </div> + """ + ), + self.dedent( + """ + <p><code><![</code></p> + <div> + foo + </div> + """ + ) + ) + + def test_charref(self): + self.assertMarkdownRenders( + '§', + '<p>§</p>' + ) + + def test_nested_charref(self): + self.assertMarkdownRenders( + '<p>§</p>', + '<p>§</p>' + ) + + def test_entityref(self): + self.assertMarkdownRenders( + '§', + '<p>§</p>' + ) + + def test_nested_entityref(self): + self.assertMarkdownRenders( + '<p>§</p>', + '<p>§</p>' + ) + + def test_amperstand(self): + self.assertMarkdownRenders( + 'AT&T & AT&T', + '<p>AT&T & AT&T</p>' + ) + + def test_startendtag(self): + self.assertMarkdownRenders( + '<hr>', + '<hr>' + ) + + def test_startendtag_with_attrs(self): + self.assertMarkdownRenders( + '<hr id="foo" class="bar">', + '<hr id="foo" class="bar">' + ) + + def test_startendtag_with_space(self): + self.assertMarkdownRenders( + '<hr >', + '<hr >' + ) + + def test_closed_startendtag(self): + self.assertMarkdownRenders( + '<hr />', + '<hr />' + ) + + def test_closed_startendtag_without_space(self): + self.assertMarkdownRenders( + '<hr/>', + '<hr/>' + ) + + def test_closed_startendtag_with_attrs(self): + self.assertMarkdownRenders( + '<hr id="foo" class="bar" />', + '<hr id="foo" class="bar" />' + ) + + def test_nested_startendtag(self): + self.assertMarkdownRenders( + '<div><hr></div>', + '<div><hr></div>' + ) + + def test_nested_closed_startendtag(self): + self.assertMarkdownRenders( + '<div><hr /></div>', + '<div><hr /></div>' + ) + + def test_auto_links_dont_break_parser(self): + self.assertMarkdownRenders( + self.dedent( + """ + <https://example.com> + + <email@example.com> + """ + ), + '<p><a href="https://example.com">https://example.com</a></p>\n' + '<p><a href="mailto:em' + 'ail@example' + '.com">email@e' + 'xample.com</a></p>' + ) + + def test_text_links_ignored(self): + self.assertMarkdownRenders( + self.dedent( + """ + https://example.com + + email@example.com + """ + ), + self.dedent( + """ + <p>https://example.com</p> + <p>email@example.com</p> + """ + ), + ) + + def text_invalid_tags(self): + self.assertMarkdownRenders( + self.dedent( + """ + <some [weird](http://example.com) stuff> + + <some>> <<unbalanced>> <<brackets> + """ + ), + self.dedent( + """ + <p><some <a href="http://example.com">weird</a> stuff></p> + <p><some>> <<unbalanced>> <<brackets></p> + """ + ) + ) + + def test_script_tags(self): + self.assertMarkdownRenders( + self.dedent( + """ + <script> + *random stuff* <div> & + </script> + + <style> + **more stuff** + </style> + """ + ), + self.dedent( + """ + <script> + *random stuff* <div> & + </script> + + <style> + **more stuff** + </style> + """ + ) + ) + + def test_unclosed_script_tag(self): + # Ensure we have a working fix for https://bugs.python.org/issue41989 + self.assertMarkdownRenders( + self.dedent( + """ + <script> + *random stuff* <div> & + + Still part of the *script* tag + """ + ), + self.dedent( + """ + <script> + *random stuff* <div> & + + Still part of the *script* tag + """ + ) + ) + + def test_inline_script_tags(self): + # Ensure inline script tags doesn't cause the parser to eat content (see #1036). + self.assertMarkdownRenders( + self.dedent( + """ + Text `<script>` more *text*. + + <div> + *foo* + </div> + + <div> + + bar + + </div> + + A new paragraph with a closing `</script>` tag. + """ + ), + self.dedent( + """ + <p>Text <code><script></code> more <em>text</em>.</p> + <div> + *foo* + </div> + + <div> + + bar + + </div> + + <p>A new paragraph with a closing <code></script></code> tag.</p> + """ + ) + ) + + def test_hr_only_start(self): + self.assertMarkdownRenders( + self.dedent( + """ + *emphasis1* + <hr> + *emphasis2* + """ + ), + self.dedent( + """ + <p><em>emphasis1</em></p> + <hr> + <p><em>emphasis2</em></p> + """ + ) + ) + + def test_hr_self_close(self): + self.assertMarkdownRenders( + self.dedent( + """ + *emphasis1* + <hr/> + *emphasis2* + """ + ), + self.dedent( + """ + <p><em>emphasis1</em></p> + <hr/> + <p><em>emphasis2</em></p> + """ + ) + ) + + def test_hr_start_and_end(self): + # Browsers ignore ending hr tags, so we don't try to do anything to handle them special. + self.assertMarkdownRenders( + self.dedent( + """ + *emphasis1* + <hr></hr> + *emphasis2* + """ + ), + self.dedent( + """ + <p><em>emphasis1</em></p> + <hr> + <p></hr> + <em>emphasis2</em></p> + """ + ) + ) + + def test_hr_only_end(self): + # Browsers ignore ending hr tags, so we don't try to do anything to handle them special. + self.assertMarkdownRenders( + self.dedent( + """ + *emphasis1* + </hr> + *emphasis2* + """ + ), + self.dedent( + """ + <p><em>emphasis1</em> + </hr> + <em>emphasis2</em></p> + """ + ) + ) + + def test_hr_with_content(self): + # Browsers ignore ending hr tags, so we don't try to do anything to handle them special. + # Content is not allowed and will be treated as normal content between two hr tags. + self.assertMarkdownRenders( + self.dedent( + """ + *emphasis1* + <hr> + **content** + </hr> + *emphasis2* + """ + ), + self.dedent( + """ + <p><em>emphasis1</em></p> + <hr> + <p><strong>content</strong> + </hr> + <em>emphasis2</em></p> + """ + ) + ) + + def test_placeholder_in_source(self): + # This should never occur, but third party extensions could create weird edge cases. + md = markdown.Markdown() + # Ensure there is an htmlstash so relevant code (nested in `if replacements`) is run. + md.htmlStash.store('foo') + # Run with a placeholder which is not in the stash + placeholder = md.htmlStash.get_placeholder(md.htmlStash.html_counter + 1) + result = md.postprocessors['raw_html'].run(placeholder) + self.assertEqual(placeholder, result) diff --git a/tests/test_syntax/blocks/test_paragraphs.py b/tests/test_syntax/blocks/test_paragraphs.py new file mode 100644 index 0000000..9b7ba03 --- /dev/null +++ b/tests/test_syntax/blocks/test_paragraphs.py @@ -0,0 +1,229 @@ +""" +Python Markdown + +A Python implementation of John Gruber's Markdown. + +Documentation: https://python-markdown.github.io/ +GitHub: https://github.com/Python-Markdown/markdown/ +PyPI: https://pypi.org/project/Markdown/ + +Started by Manfred Stienstra (http://www.dwerg.net/). +Maintained for a few years by Yuri Takhteyev (http://www.freewisdom.org). +Currently maintained by Waylan Limberg (https://github.com/waylan), +Dmitry Shachnev (https://github.com/mitya57) and Isaac Muse (https://github.com/facelessuser). + +Copyright 2007-2018 The Python Markdown Project (v. 1.7 and later) +Copyright 2004, 2005, 2006 Yuri Takhteyev (v. 0.2-1.6b) +Copyright 2004 Manfred Stienstra (the original version) + +License: BSD (see LICENSE.md for details). +""" + +from markdown.test_tools import TestCase + + +class TestParagraphBlocks(TestCase): + + def test_simple_paragraph(self): + self.assertMarkdownRenders( + 'A simple paragraph.', + + '<p>A simple paragraph.</p>' + ) + + def test_blank_line_before_paragraph(self): + self.assertMarkdownRenders( + '\nA paragraph preceded by a blank line.', + + '<p>A paragraph preceded by a blank line.</p>' + ) + + def test_multiline_paragraph(self): + self.assertMarkdownRenders( + self.dedent( + """ + This is a paragraph + on multiple lines + with hard returns. + """ + ), + self.dedent( + """ + <p>This is a paragraph + on multiple lines + with hard returns.</p> + """ + ) + ) + + def test_paragraph_long_line(self): + self.assertMarkdownRenders( + 'A very long long long long long long long long long long long long long long long long long long long ' + 'long long long long long long long long long long long long long paragraph on 1 line.', + + '<p>A very long long long long long long long long long long long long long long long long long long ' + 'long long long long long long long long long long long long long long paragraph on 1 line.</p>' + ) + + def test_2_paragraphs_long_line(self): + self.assertMarkdownRenders( + 'A very long long long long long long long long long long long long long long long long long long long ' + 'long long long long long long long long long long long long long paragraph on 1 line.\n\n' + + 'A new long long long long long long long long long long long long long long long ' + 'long paragraph on 1 line.', + + '<p>A very long long long long long long long long long long long long long long long long long long ' + 'long long long long long long long long long long long long long long paragraph on 1 line.</p>\n' + '<p>A new long long long long long long long long long long long long long long long ' + 'long paragraph on 1 line.</p>' + ) + + def test_consecutive_paragraphs(self): + self.assertMarkdownRenders( + self.dedent( + """ + Paragraph 1. + + Paragraph 2. + """ + ), + self.dedent( + """ + <p>Paragraph 1.</p> + <p>Paragraph 2.</p> + """ + ) + ) + + def test_consecutive_paragraphs_tab(self): + self.assertMarkdownRenders( + self.dedent( + """ + Paragraph followed by a line with a tab only. + \t + Paragraph after a line with a tab only. + """ + ), + self.dedent( + """ + <p>Paragraph followed by a line with a tab only.</p> + <p>Paragraph after a line with a tab only.</p> + """ + ) + ) + + def test_consecutive_paragraphs_space(self): + self.assertMarkdownRenders( + self.dedent( + """ + Paragraph followed by a line with a space only. + + Paragraph after a line with a space only. + """ + ), + self.dedent( + """ + <p>Paragraph followed by a line with a space only.</p> + <p>Paragraph after a line with a space only.</p> + """ + ) + ) + + def test_consecutive_multiline_paragraphs(self): + self.assertMarkdownRenders( + self.dedent( + """ + Paragraph 1, line 1. + Paragraph 1, line 2. + + Paragraph 2, line 1. + Paragraph 2, line 2. + """ + ), + self.dedent( + """ + <p>Paragraph 1, line 1. + Paragraph 1, line 2.</p> + <p>Paragraph 2, line 1. + Paragraph 2, line 2.</p> + """ + ) + ) + + def test_paragraph_leading_space(self): + self.assertMarkdownRenders( + ' A paragraph with 1 leading space.', + + '<p>A paragraph with 1 leading space.</p>' + ) + + def test_paragraph_2_leading_spaces(self): + self.assertMarkdownRenders( + ' A paragraph with 2 leading spaces.', + + '<p>A paragraph with 2 leading spaces.</p>' + ) + + def test_paragraph_3_leading_spaces(self): + self.assertMarkdownRenders( + ' A paragraph with 3 leading spaces.', + + '<p>A paragraph with 3 leading spaces.</p>' + ) + + def test_paragraph_trailing_leading_space(self): + self.assertMarkdownRenders( + ' A paragraph with 1 trailing and 1 leading space. ', + + '<p>A paragraph with 1 trailing and 1 leading space. </p>' + ) + + def test_paragraph_trailing_tab(self): + self.assertMarkdownRenders( + 'A paragraph with 1 trailing tab.\t', + + '<p>A paragraph with 1 trailing tab. </p>' + ) + + def test_paragraphs_CR(self): + self.assertMarkdownRenders( + 'Paragraph 1, line 1.\rParagraph 1, line 2.\r\rParagraph 2, line 1.\rParagraph 2, line 2.\r', + + self.dedent( + """ + <p>Paragraph 1, line 1. + Paragraph 1, line 2.</p> + <p>Paragraph 2, line 1. + Paragraph 2, line 2.</p> + """ + ) + ) + + def test_paragraphs_LF(self): + self.assertMarkdownRenders( + 'Paragraph 1, line 1.\nParagraph 1, line 2.\n\nParagraph 2, line 1.\nParagraph 2, line 2.\n', + + self.dedent( + """ + <p>Paragraph 1, line 1. + Paragraph 1, line 2.</p> + <p>Paragraph 2, line 1. + Paragraph 2, line 2.</p> + """ + ) + ) + + def test_paragraphs_CR_LF(self): + self.assertMarkdownRenders( + 'Paragraph 1, line 1.\r\nParagraph 1, line 2.\r\n\r\nParagraph 2, line 1.\r\nParagraph 2, line 2.\r\n', + + self.dedent( + """ + <p>Paragraph 1, line 1. + Paragraph 1, line 2.</p> + <p>Paragraph 2, line 1. + Paragraph 2, line 2.</p> + """ + ) + ) diff --git a/tests/test_syntax/extensions/__init__.py b/tests/test_syntax/extensions/__init__.py new file mode 100644 index 0000000..564ba3b --- /dev/null +++ b/tests/test_syntax/extensions/__init__.py @@ -0,0 +1,20 @@ +""" +Python Markdown + +A Python implementation of John Gruber's Markdown. + +Documentation: https://python-markdown.github.io/ +GitHub: https://github.com/Python-Markdown/markdown/ +PyPI: https://pypi.org/project/Markdown/ + +Started by Manfred Stienstra (http://www.dwerg.net/). +Maintained for a few years by Yuri Takhteyev (http://www.freewisdom.org). +Currently maintained by Waylan Limberg (https://github.com/waylan), +Dmitry Shachnev (https://github.com/mitya57) and Isaac Muse (https://github.com/facelessuser). + +Copyright 2007-2018 The Python Markdown Project (v. 1.7 and later) +Copyright 2004, 2005, 2006 Yuri Takhteyev (v. 0.2-1.6b) +Copyright 2004 Manfred Stienstra (the original version) + +License: BSD (see LICENSE.md for details). +""" diff --git a/tests/test_syntax/extensions/test_abbr.py b/tests/test_syntax/extensions/test_abbr.py new file mode 100644 index 0000000..64388c2 --- /dev/null +++ b/tests/test_syntax/extensions/test_abbr.py @@ -0,0 +1,242 @@ +# -*- coding: utf-8 -*- +""" +Python Markdown + +A Python implementation of John Gruber's Markdown. + +Documentation: https://python-markdown.github.io/ +GitHub: https://github.com/Python-Markdown/markdown/ +PyPI: https://pypi.org/project/Markdown/ + +Started by Manfred Stienstra (http://www.dwerg.net/). +Maintained for a few years by Yuri Takhteyev (http://www.freewisdom.org). +Currently maintained by Waylan Limberg (https://github.com/waylan), +Dmitry Shachnev (https://github.com/mitya57) and Isaac Muse (https://github.com/facelessuser). + +Copyright 2007-2018 The Python Markdown Project (v. 1.7 and later) +Copyright 2004, 2005, 2006 Yuri Takhteyev (v. 0.2-1.6b) +Copyright 2004 Manfred Stienstra (the original version) + +License: BSD (see LICENSE.md for details). +""" + +from markdown.test_tools import TestCase + + +class TestAbbr(TestCase): + + default_kwargs = {'extensions': ['abbr']} + + def test_abbr_upper(self): + self.assertMarkdownRenders( + self.dedent( + """ + ABBR + + *[ABBR]: Abbreviation + """ + ), + self.dedent( + """ + <p><abbr title="Abbreviation">ABBR</abbr></p> + """ + ) + ) + + def test_abbr_lower(self): + self.assertMarkdownRenders( + self.dedent( + """ + abbr + + *[abbr]: Abbreviation + """ + ), + self.dedent( + """ + <p><abbr title="Abbreviation">abbr</abbr></p> + """ + ) + ) + + def test_abbr_multiple(self): + self.assertMarkdownRenders( + self.dedent( + """ + The HTML specification + is maintained by the W3C. + + *[HTML]: Hyper Text Markup Language + *[W3C]: World Wide Web Consortium + """ + ), + self.dedent( + """ + <p>The <abbr title="Hyper Text Markup Language">HTML</abbr> specification + is maintained by the <abbr title="World Wide Web Consortium">W3C</abbr>.</p> + """ + ) + ) + + def test_abbr_override(self): + self.assertMarkdownRenders( + self.dedent( + """ + ABBR + + *[ABBR]: Ignored + *[ABBR]: The override + """ + ), + self.dedent( + """ + <p><abbr title="The override">ABBR</abbr></p> + """ + ) + ) + + def test_abbr_no_blank_Lines(self): + self.assertMarkdownRenders( + self.dedent( + """ + ABBR + *[ABBR]: Abbreviation + ABBR + """ + ), + self.dedent( + """ + <p><abbr title="Abbreviation">ABBR</abbr></p> + <p><abbr title="Abbreviation">ABBR</abbr></p> + """ + ) + ) + + def test_abbr_no_space(self): + self.assertMarkdownRenders( + self.dedent( + """ + ABBR + + *[ABBR]:Abbreviation + """ + ), + self.dedent( + """ + <p><abbr title="Abbreviation">ABBR</abbr></p> + """ + ) + ) + + def test_abbr_extra_space(self): + self.assertMarkdownRenders( + self.dedent( + """ + ABBR + + *[ABBR] : Abbreviation + """ + ), + self.dedent( + """ + <p><abbr title="Abbreviation">ABBR</abbr></p> + """ + ) + ) + + def test_abbr_line_break(self): + self.assertMarkdownRenders( + self.dedent( + """ + ABBR + + *[ABBR]: + Abbreviation + """ + ), + self.dedent( + """ + <p><abbr title="Abbreviation">ABBR</abbr></p> + """ + ) + ) + + def test_abbr_ignore_unmatched_case(self): + self.assertMarkdownRenders( + self.dedent( + """ + ABBR abbr + + *[ABBR]: Abbreviation + """ + ), + self.dedent( + """ + <p><abbr title="Abbreviation">ABBR</abbr> abbr</p> + """ + ) + ) + + def test_abbr_partial_word(self): + self.assertMarkdownRenders( + self.dedent( + """ + ABBR ABBREVIATION + + *[ABBR]: Abbreviation + """ + ), + self.dedent( + """ + <p><abbr title="Abbreviation">ABBR</abbr> ABBREVIATION</p> + """ + ) + ) + + def test_abbr_unused(self): + self.assertMarkdownRenders( + self.dedent( + """ + foo bar + + *[ABBR]: Abbreviation + """ + ), + self.dedent( + """ + <p>foo bar</p> + """ + ) + ) + + def test_abbr_double_quoted(self): + self.assertMarkdownRenders( + self.dedent( + """ + ABBR + + *[ABBR]: "Abbreviation" + """ + ), + self.dedent( + """ + <p><abbr title=""Abbreviation"">ABBR</abbr></p> + """ + ) + ) + + def test_abbr_single_quoted(self): + self.assertMarkdownRenders( + self.dedent( + """ + ABBR + + *[ABBR]: 'Abbreviation' + """ + ), + self.dedent( + """ + <p><abbr title="'Abbreviation'">ABBR</abbr></p> + """ + ) + ) diff --git a/tests/test_syntax/extensions/test_admonition.py b/tests/test_syntax/extensions/test_admonition.py new file mode 100644 index 0000000..44c70d1 --- /dev/null +++ b/tests/test_syntax/extensions/test_admonition.py @@ -0,0 +1,245 @@ +""" +Python Markdown + +A Python implementation of John Gruber's Markdown. + +Documentation: https://python-markdown.github.io/ +GitHub: https://github.com/Python-Markdown/markdown/ +PyPI: https://pypi.org/project/Markdown/ + +Started by Manfred Stienstra (http://www.dwerg.net/). +Maintained for a few years by Yuri Takhteyev (http://www.freewisdom.org). +Currently maintained by Waylan Limberg (https://github.com/waylan), +Dmitry Shachnev (https://github.com/mitya57) and Isaac Muse (https://github.com/facelessuser). + +Copyright 2007-2019 The Python Markdown Project (v. 1.7 and later) +Copyright 2004, 2005, 2006 Yuri Takhteyev (v. 0.2-1.6b) +Copyright 2004 Manfred Stienstra (the original version) + +License: BSD (see LICENSE.md for details). +""" + +from markdown.test_tools import TestCase + + +class TestAdmonition(TestCase): + + def test_with_lists(self): + self.assertMarkdownRenders( + self.dedent( + ''' + - List + + !!! note "Admontion" + + - Paragraph + + Paragraph + ''' + ), + self.dedent( + ''' + <ul> + <li> + <p>List</p> + <div class="admonition note"> + <p class="admonition-title">Admontion</p> + <ul> + <li> + <p>Paragraph</p> + <p>Paragraph</p> + </li> + </ul> + </div> + </li> + </ul> + ''' + ), + extensions=['admonition'] + ) + + def test_with_big_lists(self): + self.assertMarkdownRenders( + self.dedent( + ''' + - List + + !!! note "Admontion" + + - Paragraph + + Paragraph + + - Paragraph + + paragraph + ''' + ), + self.dedent( + ''' + <ul> + <li> + <p>List</p> + <div class="admonition note"> + <p class="admonition-title">Admontion</p> + <ul> + <li> + <p>Paragraph</p> + <p>Paragraph</p> + </li> + <li> + <p>Paragraph</p> + <p>paragraph</p> + </li> + </ul> + </div> + </li> + </ul> + ''' + ), + extensions=['admonition'] + ) + + def test_with_complex_lists(self): + self.assertMarkdownRenders( + self.dedent( + ''' + - List + + !!! note "Admontion" + + - Paragraph + + !!! note "Admontion" + + 1. Paragraph + + Paragraph + ''' + ), + self.dedent( + ''' + <ul> + <li> + <p>List</p> + <div class="admonition note"> + <p class="admonition-title">Admontion</p> + <ul> + <li> + <p>Paragraph</p> + <div class="admonition note"> + <p class="admonition-title">Admontion</p> + <ol> + <li> + <p>Paragraph</p> + <p>Paragraph</p> + </li> + </ol> + </div> + </li> + </ul> + </div> + </li> + </ul> + ''' + ), + extensions=['admonition'] + ) + + def test_definition_list(self): + self.assertMarkdownRenders( + self.dedent( + ''' + - List + + !!! note "Admontion" + + Term + + : Definition + + More text + + : Another + definition + + Even more text + ''' + ), + self.dedent( + ''' + <ul> + <li> + <p>List</p> + <div class="admonition note"> + <p class="admonition-title">Admontion</p> + <dl> + <dt>Term</dt> + <dd> + <p>Definition</p> + <p>More text</p> + </dd> + <dd> + <p>Another + definition</p> + <p>Even more text</p> + </dd> + </dl> + </div> + </li> + </ul> + ''' + ), + extensions=['admonition', 'def_list'] + ) + + def test_with_preceding_text(self): + self.assertMarkdownRenders( + self.dedent( + ''' + foo + **foo** + !!! note "Admonition" + ''' + ), + self.dedent( + ''' + <p>foo + <strong>foo</strong></p> + <div class="admonition note"> + <p class="admonition-title">Admonition</p> + </div> + ''' + ), + extensions=['admonition'] + ) + + def test_admontion_detabbing(self): + self.assertMarkdownRenders( + self.dedent( + ''' + !!! note "Admonition" + - Parent 1 + + - Child 1 + - Child 2 + ''' + ), + self.dedent( + ''' + <div class="admonition note"> + <p class="admonition-title">Admonition</p> + <ul> + <li> + <p>Parent 1</p> + <ul> + <li>Child 1</li> + <li>Child 2</li> + </ul> + </li> + </ul> + </div> + ''' + ), + extensions=['admonition'] + ) diff --git a/tests/test_syntax/extensions/test_attr_list.py b/tests/test_syntax/extensions/test_attr_list.py new file mode 100644 index 0000000..6baaafb --- /dev/null +++ b/tests/test_syntax/extensions/test_attr_list.py @@ -0,0 +1,80 @@ +""" +Python Markdown + +A Python implementation of John Gruber's Markdown. + +Documentation: https://python-markdown.github.io/ +GitHub: https://github.com/Python-Markdown/markdown/ +PyPI: https://pypi.org/project/Markdown/ + +Started by Manfred Stienstra (http://www.dwerg.net/). +Maintained for a few years by Yuri Takhteyev (http://www.freewisdom.org). +Currently maintained by Waylan Limberg (https://github.com/waylan), +Dmitry Shachnev (https://github.com/mitya57) and Isaac Muse (https://github.com/facelessuser). + +Copyright 2007-2020 The Python Markdown Project (v. 1.7 and later) +Copyright 2004, 2005, 2006 Yuri Takhteyev (v. 0.2-1.6b) +Copyright 2004 Manfred Stienstra (the original version) + +License: BSD (see LICENSE.md for details). +""" + +from markdown.test_tools import TestCase + + +class TestAttrList(TestCase): + + maxDiff = None + + # TODO: Move the rest of the attr_list tests here. + + def test_empty_list(self): + self.assertMarkdownRenders( + '*foo*{ }', + '<p><em>foo</em>{ }</p>', + extensions=['attr_list'] + ) + + def test_table_td(self): + self.assertMarkdownRenders( + self.dedent( + """ + | A { .foo } | *B*{ .foo } | C { } | D{ .foo } | E { .foo } F | + |-------------|-------------|-------|---------------|--------------| + | a { .foo } | *b*{ .foo } | c { } | d{ .foo } | e { .foo } f | + | valid on td | inline | empty | missing space | not at end | + """ + ), + self.dedent( + """ + <table> + <thead> + <tr> + <th class="foo">A</th> + <th><em class="foo">B</em></th> + <th>C { }</th> + <th>D{ .foo }</th> + <th>E { .foo } F</th> + </tr> + </thead> + <tbody> + <tr> + <td class="foo">a</td> + <td><em class="foo">b</em></td> + <td>c { }</td> + <td>d{ .foo }</td> + <td>e { .foo } f</td> + </tr> + <tr> + <td>valid on td</td> + <td>inline</td> + <td>empty</td> + <td>missing space</td> + <td>not at end</td> + </tr> + </tbody> + </table> + """ + ), + extensions=['attr_list', 'tables'] + ) diff --git a/tests/test_syntax/extensions/test_code_hilite.py b/tests/test_syntax/extensions/test_code_hilite.py new file mode 100644 index 0000000..09dd523 --- /dev/null +++ b/tests/test_syntax/extensions/test_code_hilite.py @@ -0,0 +1,764 @@ +""" +Python Markdown + +A Python implementation of John Gruber's Markdown. + +Documentation: https://python-markdown.github.io/ +GitHub: https://github.com/Python-Markdown/markdown/ +PyPI: https://pypi.org/project/Markdown/ + +Started by Manfred Stienstra (http://www.dwerg.net/). +Maintained for a few years by Yuri Takhteyev (http://www.freewisdom.org). +Currently maintained by Waylan Limberg (https://github.com/waylan), +Dmitry Shachnev (https://github.com/mitya57) and Isaac Muse (https://github.com/facelessuser). + +Copyright 2007-2019 The Python Markdown Project (v. 1.7 and later) +Copyright 2004, 2005, 2006 Yuri Takhteyev (v. 0.2-1.6b) +Copyright 2004 Manfred Stienstra (the original version) + +License: BSD (see LICENSE.md for details). +""" + +from markdown.test_tools import TestCase +from markdown.extensions.codehilite import CodeHiliteExtension, CodeHilite +import os + +try: + import pygments # noqa + has_pygments = True +except ImportError: + has_pygments = False + +# The version required by the tests is the version specified and installed in the 'pygments' tox env. +# In any environment where the PYGMENTS_VERSION environment variable is either not defined or doesn't +# match the version of Pygments installed, all tests which rely in pygments will be skipped. +required_pygments_version = os.environ.get('PYGMENTS_VERSION', '') + + +class TestCodeHiliteClass(TestCase): + """ Test the markdown.extensions.codehilite.CodeHilite class. """ + + def setUp(self): + if has_pygments and pygments.__version__ != required_pygments_version: + self.skipTest(f'Pygments=={required_pygments_version} is required') + + maxDiff = None + + def assertOutputEquals(self, source, expected, **options): + """ + Test that source code block results in the expected output with given options. + """ + + output = CodeHilite(source, **options).hilite() + self.assertMultiLineEqual(output.strip(), expected) + + def test_codehilite_defaults(self): + if has_pygments: + # Odd result as no lang given and a single comment is not enough for guessing. + expected = ( + '<div class="codehilite"><pre><span></span><code><span class="err"># A Code Comment</span>\n' + '</code></pre></div>' + ) + else: + expected = ( + '<pre class="codehilite"><code># A Code Comment\n' + '</code></pre>' + ) + self.assertOutputEquals('# A Code Comment', expected) + + def test_codehilite_guess_lang(self): + if has_pygments: + expected = ( + '<div class="codehilite"><pre><span></span><code><span class="cp"><?php</span> ' + '<span class="k">print</span><span class="p">(</span><span class="s2">"Hello World"</span>' + '<span class="p">);</span> <span class="cp">?></span>\n' + '</code></pre></div>' + ) + else: + expected = ( + '<pre class="codehilite"><code><?php print("Hello World"); ?>\n' + '</code></pre>' + ) + # Use PHP as the the starting `<?php` tag ensures an accurate guess. + self.assertOutputEquals('<?php print("Hello World"); ?>', expected, guess_lang=True) + + def test_codehilite_guess_lang_plain_text(self): + if has_pygments: + expected = ( + '<div class="codehilite"><pre><span></span><code><span class="err">plain text</span>\n' + '</code></pre></div>' + ) + else: + expected = ( + '<pre class="codehilite"><code>plain text\n' + '</code></pre>' + ) + # This will be difficult to guess. + self.assertOutputEquals('plain text', expected, guess_lang=True) + + def test_codehilite_set_lang(self): + if has_pygments: + # Note an extra `<span class="x">` is added to end of code block when lang explicitly set. + # Compare with expected output for `test_guess_lang`. Not sure why this happens. + expected = ( + '<div class="codehilite"><pre><span></span><code><span class="cp"><?php</span> ' + '<span class="k">print</span><span class="p">(</span><span class="s2">"Hello World"</span>' + '<span class="p">);</span> <span class="cp">?></span><span class="x"></span>\n' + '</code></pre></div>' + ) + else: + expected = ( + '<pre class="codehilite"><code class="language-php"><?php print("Hello World"); ?>\n' + '</code></pre>' + ) + self.assertOutputEquals('<?php print("Hello World"); ?>', expected, lang='php') + + def test_codehilite_bad_lang(self): + if has_pygments: + expected = ( + '<div class="codehilite"><pre><span></span><code><span class="cp"><?php</span> ' + '<span class="k">print</span><span class="p">(</span><span class="s2">' + '"Hello World"</span><span class="p">);</span> <span class="cp">?></span>\n' + '</code></pre></div>' + ) + else: + # Note that without pygments there is no way to check that the language name is bad. + expected = ( + '<pre class="codehilite"><code class="language-unkown">' + '<?php print("Hello World"); ?>\n' + '</code></pre>' + ) + # The starting `<?php` tag ensures an accurate guess. + self.assertOutputEquals('<?php print("Hello World"); ?>', expected, lang='unkown') + + def test_codehilite_use_pygments_false(self): + expected = ( + '<pre class="codehilite"><code class="language-php"><?php print("Hello World"); ?>\n' + '</code></pre>' + ) + self.assertOutputEquals('<?php print("Hello World"); ?>', expected, lang='php', use_pygments=False) + + def test_codehilite_lang_prefix_empty(self): + expected = ( + '<pre class="codehilite"><code class="php"><?php print("Hello World"); ?>\n' + '</code></pre>' + ) + self.assertOutputEquals( + '<?php print("Hello World"); ?>', expected, lang='php', use_pygments=False, lang_prefix='' + ) + + def test_codehilite_lang_prefix(self): + expected = ( + '<pre class="codehilite"><code class="lang-php"><?php print("Hello World"); ?>\n' + '</code></pre>' + ) + self.assertOutputEquals( + '<?php print("Hello World"); ?>', expected, lang='php', use_pygments=False, lang_prefix='lang-' + ) + + def test_codehilite_linenos_true(self): + if has_pygments: + expected = ( + '<table class="codehilitetable"><tr><td class="linenos"><div class="linenodiv"><pre>1</pre></div>' + '</td><td class="code"><div class="codehilite"><pre><span></span><code>plain text\n' + '</code></pre></div>\n' + '</td></tr></table>' + ) + else: + expected = ( + '<pre class="codehilite"><code class="language-text linenums">plain text\n' + '</code></pre>' + ) + self.assertOutputEquals('plain text', expected, lang='text', linenos=True) + + def test_codehilite_linenos_false(self): + if has_pygments: + expected = ( + '<div class="codehilite"><pre><span></span><code>plain text\n' + '</code></pre></div>' + ) + else: + expected = ( + '<pre class="codehilite"><code class="language-text">plain text\n' + '</code></pre>' + ) + self.assertOutputEquals('plain text', expected, lang='text', linenos=False) + + def test_codehilite_linenos_none(self): + if has_pygments: + expected = ( + '<div class="codehilite"><pre><span></span><code>plain text\n' + '</code></pre></div>' + ) + else: + expected = ( + '<pre class="codehilite"><code class="language-text">plain text\n' + '</code></pre>' + ) + self.assertOutputEquals('plain text', expected, lang='text', linenos=None) + + def test_codehilite_linenos_table(self): + if has_pygments: + expected = ( + '<table class="codehilitetable"><tr><td class="linenos"><div class="linenodiv"><pre>1</pre></div>' + '</td><td class="code"><div class="codehilite"><pre><span></span><code>plain text\n' + '</code></pre></div>\n' + '</td></tr></table>' + ) + else: + expected = ( + '<pre class="codehilite"><code class="language-text linenums">plain text\n' + '</code></pre>' + ) + self.assertOutputEquals('plain text', expected, lang='text', linenos='table') + + def test_codehilite_linenos_inline(self): + if has_pygments: + expected = ( + '<div class="codehilite"><pre><span></span><code><span class="linenos">1</span>plain text\n' + '</code></pre></div>' + ) + else: + expected = ( + '<pre class="codehilite"><code class="language-text linenums">plain text\n' + '</code></pre>' + ) + self.assertOutputEquals('plain text', expected, lang='text', linenos='inline') + + def test_codehilite_linenums_true(self): + if has_pygments: + expected = ( + '<table class="codehilitetable"><tr><td class="linenos"><div class="linenodiv"><pre>1</pre></div>' + '</td><td class="code"><div class="codehilite"><pre><span></span><code>plain text\n' + '</code></pre></div>\n' + '</td></tr></table>' + ) + else: + expected = ( + '<pre class="codehilite"><code class="language-text linenums">plain text\n' + '</code></pre>' + ) + self.assertOutputEquals('plain text', expected, lang='text', linenums=True) + + def test_codehilite_set_cssclass(self): + if has_pygments: + expected = ( + '<div class="override"><pre><span></span><code>plain text\n' + '</code></pre></div>' + ) + else: + expected = ( + '<pre class="override"><code class="language-text">plain text\n' + '</code></pre>' + ) + self.assertOutputEquals('plain text', expected, lang='text', cssclass='override') + + def test_codehilite_set_css_class(self): + if has_pygments: + expected = ( + '<div class="override"><pre><span></span><code>plain text\n' + '</code></pre></div>' + ) + else: + expected = ( + '<pre class="override"><code class="language-text">plain text\n' + '</code></pre>' + ) + self.assertOutputEquals('plain text', expected, lang='text', css_class='override') + + def test_codehilite_linenostart(self): + if has_pygments: + expected = ( + '<div class="codehilite"><pre><span></span><code><span class="linenos">42</span>plain text\n' + '</code></pre></div>' + ) + else: + # TODO: Implement linenostart for no-pygments. Will need to check what JS libs look for. + expected = ( + '<pre class="codehilite"><code class="language-text linenums">plain text\n' + '</code></pre>' + ) + self.assertOutputEquals('plain text', expected, lang='text', linenos='inline', linenostart=42) + + def test_codehilite_linenos_hl_lines(self): + if has_pygments: + expected = ( + '<div class="codehilite"><pre><span></span><code>' + '<span class="linenos">1</span><span class="hll">line 1\n' + '</span><span class="linenos">2</span>line 2\n' + '<span class="linenos">3</span><span class="hll">line 3\n' + '</span></code></pre></div>' + ) + else: + expected = ( + '<pre class="codehilite"><code class="language-text linenums">line 1\n' + 'line 2\n' + 'line 3\n' + '</code></pre>' + ) + self.assertOutputEquals('line 1\nline 2\nline 3', expected, lang='text', linenos='inline', hl_lines=[1, 3]) + + def test_codehilite_linenos_linenostep(self): + if has_pygments: + expected = ( + '<div class="codehilite"><pre><span></span><code><span class="linenos"> </span>line 1\n' + '<span class="linenos">2</span>line 2\n' + '<span class="linenos"> </span>line 3\n' + '</code></pre></div>' + ) + else: + expected = ( + '<pre class="codehilite"><code class="language-text linenums">line 1\n' + 'line 2\n' + 'line 3\n' + '</code></pre>' + ) + self.assertOutputEquals('line 1\nline 2\nline 3', expected, lang='text', linenos='inline', linenostep=2) + + def test_codehilite_linenos_linenospecial(self): + if has_pygments: + expected = ( + '<div class="codehilite"><pre><span></span><code><span class="linenos">1</span>line 1\n' + '<span class="linenos special">2</span>line 2\n' + '<span class="linenos">3</span>line 3\n' + '</code></pre></div>' + ) + else: + expected = ( + '<pre class="codehilite"><code class="language-text linenums">line 1\n' + 'line 2\n' + 'line 3\n' + '</code></pre>' + ) + self.assertOutputEquals('line 1\nline 2\nline 3', expected, lang='text', linenos='inline', linenospecial=2) + + def test_codehilite_startinline(self): + if has_pygments: + expected = ( + '<div class="codehilite"><pre><span></span><code><span class="k">print</span><span class="p">(</span>' + '<span class="s2">"Hello World"</span><span class="p">);</span>\n' + '</code></pre></div>' + ) + else: + expected = ( + '<pre class="codehilite"><code class="language-php">print("Hello World");\n' + '</code></pre>' + ) + self.assertOutputEquals('print("Hello World");', expected, lang='php', startinline=True) + + +class TestCodeHiliteExtension(TestCase): + """ Test codehilite extension. """ + + def setUp(self): + if has_pygments and pygments.__version__ != required_pygments_version: + self.skipTest(f'Pygments=={required_pygments_version} is required') + + # Define a custom Pygments formatter (same example in the documentation) + if has_pygments: + class CustomAddLangHtmlFormatter(pygments.formatters.HtmlFormatter): + def __init__(self, lang_str='', **options): + super().__init__(**options) + self.lang_str = lang_str + + def _wrap_code(self, source): + yield 0, f'<code class="{self.lang_str}">' + yield from source + yield 0, '</code>' + else: + CustomAddLangHtmlFormatter = None + + self.custom_pygments_formatter = CustomAddLangHtmlFormatter + + maxDiff = None + + def testBasicCodeHilite(self): + if has_pygments: + # Odd result as no lang given and a single comment is not enough for guessing. + expected = ( + '<div class="codehilite"><pre><span></span><code><span class="err"># A Code Comment</span>\n' + '</code></pre></div>' + ) + else: + expected = ( + '<pre class="codehilite"><code># A Code Comment\n' + '</code></pre>' + ) + self.assertMarkdownRenders( + '\t# A Code Comment', + expected, + extensions=['codehilite'] + ) + + def testLinenumsTrue(self): + if has_pygments: + expected = ( + '<table class="codehilitetable"><tr>' + '<td class="linenos"><div class="linenodiv"><pre>1</pre></div></td>' + '<td class="code"><div class="codehilite"><pre><span></span>' + '<code><span class="err"># A Code Comment</span>\n' + '</code></pre></div>\n' + '</td></tr></table>' + ) + else: + expected = ( + '<pre class="codehilite"><code class="linenums"># A Code Comment\n' + '</code></pre>' + ) + self.assertMarkdownRenders( + '\t# A Code Comment', + expected, + extensions=[CodeHiliteExtension(linenums=True)] + ) + + def testLinenumsFalse(self): + if has_pygments: + expected = ( + '<div class="codehilite"><pre><span></span><code><span class="c1"># A Code Comment</span>\n' + '</code></pre></div>' + ) + else: + expected = ( + '<pre class="codehilite"><code class="language-python"># A Code Comment\n' + '</code></pre>' + ) + self.assertMarkdownRenders( + ( + '\t#!Python\n' + '\t# A Code Comment' + ), + expected, + extensions=[CodeHiliteExtension(linenums=False)] + ) + + def testLinenumsNone(self): + if has_pygments: + expected = ( + '<div class="codehilite"><pre><span></span><code><span class="err"># A Code Comment</span>\n' + '</code></pre></div>' + ) + else: + expected = ( + '<pre class="codehilite"><code># A Code Comment\n' + '</code></pre>' + ) + self.assertMarkdownRenders( + '\t# A Code Comment', + expected, + extensions=[CodeHiliteExtension(linenums=None)] + ) + + def testLinenumsNoneWithShebang(self): + if has_pygments: + expected = ( + '<table class="codehilitetable"><tr>' + '<td class="linenos"><div class="linenodiv"><pre>1</pre></div></td>' + '<td class="code"><div class="codehilite"><pre><span></span>' + '<code><span class="c1"># A Code Comment</span>\n' + '</code></pre></div>\n' + '</td></tr></table>' + ) + else: + expected = ( + '<pre class="codehilite"><code class="language-python linenums"># A Code Comment\n' + '</code></pre>' + ) + self.assertMarkdownRenders( + ( + '\t#!Python\n' + '\t# A Code Comment' + ), + expected, + extensions=[CodeHiliteExtension(linenums=None)] + ) + + def testLinenumsNoneWithColon(self): + if has_pygments: + expected = ( + '<div class="codehilite"><pre><span></span><code><span class="c1"># A Code Comment</span>\n' + '</code></pre></div>' + ) + else: + expected = ( + '<pre class="codehilite"><code class="language-python"># A Code Comment\n' + '</code></pre>' + ) + self.assertMarkdownRenders( + ( + '\t:::Python\n' + '\t# A Code Comment' + ), + expected, + extensions=[CodeHiliteExtension(linenums=None)] + ) + + def testHighlightLinesWithColon(self): + if has_pygments: + expected = ( + '<div class="codehilite"><pre><span></span><code><span class="hll"><span class="c1">#line 1</span>\n' + '</span><span class="c1">#line 2</span>\n' + '<span class="c1">#line 3</span>\n' + '</code></pre></div>' + ) + else: + expected = ( + '<pre class="codehilite"><code class="language-python">#line 1\n' + '#line 2\n' + '#line 3\n' + '</code></pre>' + ) + # Double quotes + self.assertMarkdownRenders( + ( + '\t:::Python hl_lines="1"\n' + '\t#line 1\n' + '\t#line 2\n' + '\t#line 3' + ), + expected, + extensions=['codehilite'] + ) + # Single quotes + self.assertMarkdownRenders( + ( + "\t:::Python hl_lines='1'\n" + '\t#line 1\n' + '\t#line 2\n' + '\t#line 3' + ), + expected, + extensions=['codehilite'] + ) + + def testUsePygmentsFalse(self): + self.assertMarkdownRenders( + ( + '\t:::Python\n' + '\t# A Code Comment' + ), + ( + '<pre class="codehilite"><code class="language-python"># A Code Comment\n' + '</code></pre>' + ), + extensions=[CodeHiliteExtension(use_pygments=False)] + ) + + def testLangPrefixEmpty(self): + self.assertMarkdownRenders( + ( + '\t:::Python\n' + '\t# A Code Comment' + ), + ( + '<pre class="codehilite"><code class="python"># A Code Comment\n' + '</code></pre>' + ), + extensions=[CodeHiliteExtension(use_pygments=False, lang_prefix='')] + ) + + def testLangPrefix(self): + self.assertMarkdownRenders( + ( + '\t:::Python\n' + '\t# A Code Comment' + ), + ( + '<pre class="codehilite"><code class="lang-python"># A Code Comment\n' + '</code></pre>' + ), + extensions=[CodeHiliteExtension(use_pygments=False, lang_prefix='lang-')] + ) + + def testDoubleEscape(self): + if has_pygments: + expected = ( + '<div class="codehilite"><pre>' + '<span></span>' + '<code><span class="p"><</span><span class="nt">span</span><span class="p">></span>' + 'This<span class="ni">&amp;</span>That' + '<span class="p"></</span><span class="nt">span</span><span class="p">></span>' + '\n</code></pre></div>' + ) + else: + expected = ( + '<pre class="codehilite"><code class="language-html">' + '<span>This&amp;That</span>\n' + '</code></pre>' + ) + self.assertMarkdownRenders( + ( + '\t:::html\n' + '\t<span>This&That</span>' + ), + expected, + extensions=['codehilite'] + ) + + def testEntitiesIntact(self): + if has_pygments: + expected = ( + '<div class="codehilite"><pre>' + '<span></span>' + '<code>< &lt; and > &gt;' + '\n</code></pre></div>' + ) + else: + expected = ( + '<pre class="codehilite"><code class="language-text">' + '< &lt; and > &gt;\n' + '</code></pre>' + ) + self.assertMarkdownRenders( + ( + '\t:::text\n' + '\t< < and > >' + ), + expected, + extensions=['codehilite'] + ) + + def testHighlightAmps(self): + if has_pygments: + expected = ( + '<div class="codehilite"><pre><span></span><code>&\n' + '&amp;\n' + '&amp;amp;\n' + '</code></pre></div>' + ) + else: + expected = ( + '<pre class="codehilite"><code class="language-text">&\n' + '&amp;\n' + '&amp;amp;\n' + '</code></pre>' + ) + self.assertMarkdownRenders( + ( + '\t:::text\n' + '\t&\n' + '\t&\n' + '\t&amp;' + ), + expected, + extensions=['codehilite'] + ) + + def testUnknownOption(self): + if has_pygments: + # Odd result as no lang given and a single comment is not enough for guessing. + expected = ( + '<div class="codehilite"><pre><span></span><code><span class="err"># A Code Comment</span>\n' + '</code></pre></div>' + ) + else: + expected = ( + '<pre class="codehilite"><code># A Code Comment\n' + '</code></pre>' + ) + self.assertMarkdownRenders( + '\t# A Code Comment', + expected, + extensions=[CodeHiliteExtension(unknown='some value')], + ) + + def testMultipleBlocksSameStyle(self): + if has_pygments: + # See also: https://github.com/Python-Markdown/markdown/issues/1240 + expected = ( + '<div class="codehilite" style="background: #202020"><pre style="line-height: 125%; margin: 0;">' + '<span></span><code><span style="color: #999999; font-style: italic"># First Code Block</span>\n' + '</code></pre></div>\n\n' + '<p>Normal paragraph</p>\n' + '<div class="codehilite" style="background: #202020"><pre style="line-height: 125%; margin: 0;">' + '<span></span><code><span style="color: #999999; font-style: italic"># Second Code Block</span>\n' + '</code></pre></div>' + ) + else: + expected = ( + '<pre class="codehilite"><code class="language-python"># First Code Block\n' + '</code></pre>\n\n' + '<p>Normal paragraph</p>\n' + '<pre class="codehilite"><code class="language-python"># Second Code Block\n' + '</code></pre>' + ) + self.assertMarkdownRenders( + ( + '\t:::Python\n' + '\t# First Code Block\n\n' + 'Normal paragraph\n\n' + '\t:::Python\n' + '\t# Second Code Block' + ), + expected, + extensions=[CodeHiliteExtension(pygments_style="native", noclasses=True)] + ) + + def testFormatterLangStr(self): + if has_pygments: + expected = ( + '<div class="codehilite"><pre><span></span><code class="language-python">' + '<span class="c1"># A Code Comment</span>\n' + '</code></pre></div>' + ) + else: + expected = ( + '<pre class="codehilite"><code class="language-python"># A Code Comment\n' + '</code></pre>' + ) + + self.assertMarkdownRenders( + '\t:::Python\n' + '\t# A Code Comment', + expected, + extensions=[ + CodeHiliteExtension( + guess_lang=False, + pygments_formatter=self.custom_pygments_formatter + ) + ] + ) + + def testFormatterLangStrGuessLang(self): + if has_pygments: + expected = ( + '<div class="codehilite"><pre><span></span>' + '<code class="language-js+php"><span class="cp"><?php</span> ' + '<span class="k">print</span><span class="p">(</span>' + '<span class="s2">"Hello World"</span>' + '<span class="p">);</span> <span class="cp">?></span>\n' + '</code></pre></div>' + ) + else: + expected = ( + '<pre class="codehilite"><code><?php print("Hello World"); ?>\n' + '</code></pre>' + ) + # Use PHP as the the starting `<?php` tag ensures an accurate guess. + self.assertMarkdownRenders( + '\t<?php print("Hello World"); ?>', + expected, + extensions=[CodeHiliteExtension(pygments_formatter=self.custom_pygments_formatter)] + ) + + def testFormatterLangStrEmptyLang(self): + if has_pygments: + expected = ( + '<div class="codehilite"><pre><span></span>' + '<code class="language-text"># A Code Comment\n' + '</code></pre></div>' + ) + else: + expected = ( + '<pre class="codehilite"><code># A Code Comment\n' + '</code></pre>' + ) + self.assertMarkdownRenders( + '\t# A Code Comment', + expected, + extensions=[ + CodeHiliteExtension( + guess_lang=False, + pygments_formatter=self.custom_pygments_formatter, + ) + ] + ) diff --git a/tests/test_syntax/extensions/test_def_list.py b/tests/test_syntax/extensions/test_def_list.py new file mode 100644 index 0000000..8273410 --- /dev/null +++ b/tests/test_syntax/extensions/test_def_list.py @@ -0,0 +1,323 @@ +""" +Python Markdown + +A Python implementation of John Gruber's Markdown. + +Documentation: https://python-markdown.github.io/ +GitHub: https://github.com/Python-Markdown/markdown/ +PyPI: https://pypi.org/project/Markdown/ + +Started by Manfred Stienstra (http://www.dwerg.net/). +Maintained for a few years by Yuri Takhteyev (http://www.freewisdom.org). +Currently maintained by Waylan Limberg (https://github.com/waylan), +Dmitry Shachnev (https://github.com/mitya57) and Isaac Muse (https://github.com/facelessuser). + +Copyright 2007-2019 The Python Markdown Project (v. 1.7 and later) +Copyright 2004, 2005, 2006 Yuri Takhteyev (v. 0.2-1.6b) +Copyright 2004 Manfred Stienstra (the original version) + +License: BSD (see LICENSE.md for details). +""" + +from markdown.test_tools import TestCase + + +class TestDefList(TestCase): + + def test_def_list_with_ol(self): + self.assertMarkdownRenders( + self.dedent( + ''' + + term + + : this is a definition for term. it has + multiple lines in the first paragraph. + + 1. first thing + + first thing details in a second paragraph. + + 1. second thing + + second thing details in a second paragraph. + + 1. third thing + + third thing details in a second paragraph. + ''' + ), + self.dedent( + ''' + <dl> + <dt>term</dt> + <dd> + <p>this is a definition for term. it has + multiple lines in the first paragraph.</p> + <ol> + <li> + <p>first thing</p> + <p>first thing details in a second paragraph.</p> + </li> + <li> + <p>second thing</p> + <p>second thing details in a second paragraph.</p> + </li> + <li> + <p>third thing</p> + <p>third thing details in a second paragraph.</p> + </li> + </ol> + </dd> + </dl> + ''' + ), + extensions=['def_list'] + ) + + def test_def_list_with_ul(self): + self.assertMarkdownRenders( + self.dedent( + ''' + + term + + : this is a definition for term. it has + multiple lines in the first paragraph. + + - first thing + + first thing details in a second paragraph. + + - second thing + + second thing details in a second paragraph. + + - third thing + + third thing details in a second paragraph. + ''' + ), + self.dedent( + ''' + <dl> + <dt>term</dt> + <dd> + <p>this is a definition for term. it has + multiple lines in the first paragraph.</p> + <ul> + <li> + <p>first thing</p> + <p>first thing details in a second paragraph.</p> + </li> + <li> + <p>second thing</p> + <p>second thing details in a second paragraph.</p> + </li> + <li> + <p>third thing</p> + <p>third thing details in a second paragraph.</p> + </li> + </ul> + </dd> + </dl> + ''' + ), + extensions=['def_list'] + ) + + def test_def_list_with_nesting(self): + self.assertMarkdownRenders( + self.dedent( + ''' + + term + + : this is a definition for term. it has + multiple lines in the first paragraph. + + 1. first thing + + first thing details in a second paragraph. + + - first nested thing + + second nested thing details + ''' + ), + self.dedent( + ''' + <dl> + <dt>term</dt> + <dd> + <p>this is a definition for term. it has + multiple lines in the first paragraph.</p> + <ol> + <li> + <p>first thing</p> + <p>first thing details in a second paragraph.</p> + <ul> + <li> + <p>first nested thing</p> + <p>second nested thing details</p> + </li> + </ul> + </li> + </ol> + </dd> + </dl> + ''' + ), + extensions=['def_list'] + ) + + def test_def_list_with_nesting_self(self): + self.assertMarkdownRenders( + self.dedent( + ''' + + term + + : this is a definition for term. it has + multiple lines in the first paragraph. + + inception + + : this is a definition for term. it has + multiple lines in the first paragraph. + + - bullet point + + another paragraph + ''' + ), + self.dedent( + ''' + <dl> + <dt>term</dt> + <dd> + <p>this is a definition for term. it has + multiple lines in the first paragraph.</p> + <dl> + <dt>inception</dt> + <dd> + <p>this is a definition for term. it has + multiple lines in the first paragraph.</p> + <ul> + <li>bullet point</li> + </ul> + <p>another paragraph</p> + </dd> + </dl> + </dd> + </dl> + ''' + ), + extensions=['def_list'] + ) + + def test_def_list_unreasonable_nesting(self): + self.assertMarkdownRenders( + self.dedent( + ''' + + turducken + + : this is a definition for term. it has + multiple lines in the first paragraph. + + 1. ordered list + + - nested list + + term + + : definition + + - item 1 paragraph 1 + + item 1 paragraph 2 + ''' + ), + self.dedent( + ''' + <dl> + <dt>turducken</dt> + <dd> + <p>this is a definition for term. it has + multiple lines in the first paragraph.</p> + <ol> + <li> + <p>ordered list</p> + <ul> + <li> + <p>nested list</p> + <dl> + <dt>term</dt> + <dd> + <p>definition</p> + <ul> + <li> + <p>item 1 paragraph 1</p> + <p>item 1 paragraph 2</p> + </li> + </ul> + </dd> + </dl> + </li> + </ul> + </li> + </ol> + </dd> + </dl> + ''' + ), + extensions=['def_list'] + ) + + def test_def_list_nested_admontions(self): + self.assertMarkdownRenders( + self.dedent( + ''' + term + + : definition + + !!! note "Admontion" + + term + + : definition + + 1. list + + continue + ''' + ), + self.dedent( + ''' + <dl> + <dt>term</dt> + <dd> + <p>definition</p> + <div class="admonition note"> + <p class="admonition-title">Admontion</p> + <dl> + <dt>term</dt> + <dd> + <p>definition</p> + <ol> + <li> + <p>list</p> + <p>continue</p> + </li> + </ol> + </dd> + </dl> + </div> + </dd> + </dl> + ''' + ), + extensions=['def_list', 'admonition'] + ) diff --git a/tests/test_syntax/extensions/test_fenced_code.py b/tests/test_syntax/extensions/test_fenced_code.py new file mode 100644 index 0000000..be3c215 --- /dev/null +++ b/tests/test_syntax/extensions/test_fenced_code.py @@ -0,0 +1,1020 @@ +""" +Python Markdown + +A Python implementation of John Gruber's Markdown. + +Documentation: https://python-markdown.github.io/ +GitHub: https://github.com/Python-Markdown/markdown/ +PyPI: https://pypi.org/project/Markdown/ + +Started by Manfred Stienstra (http://www.dwerg.net/). +Maintained for a few years by Yuri Takhteyev (http://www.freewisdom.org). +Currently maintained by Waylan Limberg (https://github.com/waylan), +Dmitry Shachnev (https://github.com/mitya57) and Isaac Muse (https://github.com/facelessuser). + +Copyright 2007-2019 The Python Markdown Project (v. 1.7 and later) +Copyright 2004, 2005, 2006 Yuri Takhteyev (v. 0.2-1.6b) +Copyright 2004 Manfred Stienstra (the original version) + +License: BSD (see LICENSE.md for details). +""" + +from markdown.test_tools import TestCase +import markdown +import markdown.extensions.codehilite +import os + +try: + import pygments # noqa + import pygments.formatters # noqa + has_pygments = True +except ImportError: + has_pygments = False + +# The version required by the tests is the version specified and installed in the 'pygments' tox env. +# In any environment where the PYGMENTS_VERSION environment variable is either not defined or doesn't +# match the version of Pygments installed, all tests which rely in pygments will be skipped. +required_pygments_version = os.environ.get('PYGMENTS_VERSION', '') + + +class TestFencedCode(TestCase): + + def testBasicFence(self): + self.assertMarkdownRenders( + self.dedent( + ''' + A paragraph before a fenced code block: + + ``` + Fenced code block + ``` + ''' + ), + self.dedent( + ''' + <p>A paragraph before a fenced code block:</p> + <pre><code>Fenced code block + </code></pre> + ''' + ), + extensions=['fenced_code'] + ) + + def testNestedFence(self): + self.assertMarkdownRenders( + self.dedent( + ''' + ```` + + ``` + ```` + ''' + ), + self.dedent( + ''' + <pre><code> + ``` + </code></pre> + ''' + ), + extensions=['fenced_code'] + ) + + def testFencedTildes(self): + self.assertMarkdownRenders( + self.dedent( + ''' + ~~~ + # Arbitrary code + ``` # these backticks will not close the block + ~~~ + ''' + ), + self.dedent( + ''' + <pre><code># Arbitrary code + ``` # these backticks will not close the block + </code></pre> + ''' + ), + extensions=['fenced_code'] + ) + + def testFencedLanguageNoDot(self): + self.assertMarkdownRenders( + self.dedent( + ''' + ``` python + # Some python code + ``` + ''' + ), + self.dedent( + ''' + <pre><code class="language-python"># Some python code + </code></pre> + ''' + ), + extensions=['fenced_code'] + ) + + def testFencedLanguageWithDot(self): + self.assertMarkdownRenders( + self.dedent( + ''' + ``` .python + # Some python code + ``` + ''' + ), + self.dedent( + ''' + <pre><code class="language-python"># Some python code + </code></pre> + ''' + ), + extensions=['fenced_code'] + ) + + def test_fenced_code_in_raw_html(self): + self.assertMarkdownRenders( + self.dedent( + """ + <details> + ``` + Begone placeholders! + ``` + </details> + """ + ), + self.dedent( + """ + <details> + + <pre><code>Begone placeholders! + </code></pre> + + </details> + """ + ), + extensions=['fenced_code'] + ) + + def testFencedLanguageInAttr(self): + self.assertMarkdownRenders( + self.dedent( + ''' + ``` {.python} + # Some python code + ``` + ''' + ), + self.dedent( + ''' + <pre><code class="language-python"># Some python code + </code></pre> + ''' + ), + extensions=['fenced_code'] + ) + + def testFencedMultipleClassesInAttr(self): + self.assertMarkdownRenders( + self.dedent( + ''' + ``` {.python .foo .bar} + # Some python code + ``` + ''' + ), + self.dedent( + ''' + <pre class="foo bar"><code class="language-python"># Some python code + </code></pre> + ''' + ), + extensions=['fenced_code'] + ) + + def testFencedIdInAttr(self): + self.assertMarkdownRenders( + self.dedent( + ''' + ``` { #foo } + # Some python code + ``` + ''' + ), + self.dedent( + ''' + <pre id="foo"><code># Some python code + </code></pre> + ''' + ), + extensions=['fenced_code'] + ) + + def testFencedIdAndLangInAttr(self): + self.assertMarkdownRenders( + self.dedent( + ''' + ``` { .python #foo } + # Some python code + ``` + ''' + ), + self.dedent( + ''' + <pre id="foo"><code class="language-python"># Some python code + </code></pre> + ''' + ), + extensions=['fenced_code'] + ) + + def testFencedIdAndLangAndClassInAttr(self): + self.assertMarkdownRenders( + self.dedent( + ''' + ``` { .python #foo .bar } + # Some python code + ``` + ''' + ), + self.dedent( + ''' + <pre id="foo" class="bar"><code class="language-python"># Some python code + </code></pre> + ''' + ), + extensions=['fenced_code'] + ) + + def testFencedLanguageIdAndPygmentsDisabledInAttrNoCodehilite(self): + self.assertMarkdownRenders( + self.dedent( + ''' + ``` { .python #foo use_pygments=False } + # Some python code + ``` + ''' + ), + self.dedent( + ''' + <pre id="foo"><code class="language-python"># Some python code + </code></pre> + ''' + ), + extensions=['fenced_code'] + ) + + def testFencedLanguageIdAndPygmentsEnabledInAttrNoCodehilite(self): + self.assertMarkdownRenders( + self.dedent( + ''' + ``` { .python #foo use_pygments=True } + # Some python code + ``` + ''' + ), + self.dedent( + ''' + <pre id="foo"><code class="language-python"># Some python code + </code></pre> + ''' + ), + extensions=['fenced_code'] + ) + + def testFencedLanguageNoCodehiliteWithAttrList(self): + self.assertMarkdownRenders( + self.dedent( + ''' + ``` { .python foo=bar } + # Some python code + ``` + ''' + ), + self.dedent( + ''' + <pre><code class="language-python" foo="bar"># Some python code + </code></pre> + ''' + ), + extensions=['fenced_code', 'attr_list'] + ) + + def testFencedLanguagePygmentsDisabledInAttrNoCodehiliteWithAttrList(self): + self.assertMarkdownRenders( + self.dedent( + ''' + ``` { .python foo=bar use_pygments=False } + # Some python code + ``` + ''' + ), + self.dedent( + ''' + <pre><code class="language-python" foo="bar"># Some python code + </code></pre> + ''' + ), + extensions=['fenced_code', 'attr_list'] + ) + + def testFencedLanguagePygmentsEnabledInAttrNoCodehiliteWithAttrList(self): + self.assertMarkdownRenders( + self.dedent( + ''' + ``` { .python foo=bar use_pygments=True } + # Some python code + ``` + ''' + ), + self.dedent( + ''' + <pre><code class="language-python"># Some python code + </code></pre> + ''' + ), + extensions=['fenced_code', 'attr_list'] + ) + + def testFencedLanguageNoPrefix(self): + self.assertMarkdownRenders( + self.dedent( + ''' + ``` python + # Some python code + ``` + ''' + ), + self.dedent( + ''' + <pre><code class="python"># Some python code + </code></pre> + ''' + ), + extensions=[markdown.extensions.fenced_code.FencedCodeExtension(lang_prefix='')] + ) + + def testFencedLanguageAltPrefix(self): + self.assertMarkdownRenders( + self.dedent( + ''' + ``` python + # Some python code + ``` + ''' + ), + self.dedent( + ''' + <pre><code class="lang-python"># Some python code + </code></pre> + ''' + ), + extensions=[markdown.extensions.fenced_code.FencedCodeExtension(lang_prefix='lang-')] + ) + + def testFencedCodeEscapedAttrs(self): + self.assertMarkdownRenders( + self.dedent( + ''' + ``` { ."weird #"foo bar=">baz } + # Some python code + ``` + ''' + ), + self.dedent( + ''' + <pre id=""foo"><code class="language-"weird" bar="">baz"># Some python code + </code></pre> + ''' + ), + extensions=['fenced_code', 'attr_list'] + ) + + +class TestFencedCodeWithCodehilite(TestCase): + + def setUp(self): + if has_pygments and pygments.__version__ != required_pygments_version: + self.skipTest(f'Pygments=={required_pygments_version} is required') + + def test_shebang(self): + + if has_pygments: + expected = ''' + <div class="codehilite"><pre><span></span><code>#!test + </code></pre></div> + ''' + else: + expected = ''' + <pre class="codehilite"><code>#!test + </code></pre> + ''' + + self.assertMarkdownRenders( + self.dedent( + ''' + ``` + #!test + ``` + ''' + ), + self.dedent( + expected + ), + extensions=[ + markdown.extensions.codehilite.CodeHiliteExtension(linenums=None, guess_lang=False), + 'fenced_code' + ] + ) + + def testFencedCodeWithHighlightLines(self): + if has_pygments: + expected = self.dedent( + ''' + <div class="codehilite"><pre><span></span><code><span class="hll">line 1 + </span>line 2 + <span class="hll">line 3 + </span></code></pre></div> + ''' + ) + else: + expected = self.dedent( + ''' + <pre class="codehilite"><code>line 1 + line 2 + line 3 + </code></pre> + ''' + ) + self.assertMarkdownRenders( + self.dedent( + ''' + ```hl_lines="1 3" + line 1 + line 2 + line 3 + ``` + ''' + ), + expected, + extensions=[ + markdown.extensions.codehilite.CodeHiliteExtension(linenums=None, guess_lang=False), + 'fenced_code' + ] + ) + + def testFencedLanguageAndHighlightLines(self): + if has_pygments: + expected = ( + '<div class="codehilite"><pre><span></span><code>' + '<span class="hll"><span class="n">line</span> <span class="mi">1</span>\n' + '</span><span class="n">line</span> <span class="mi">2</span>\n' + '<span class="hll"><span class="n">line</span> <span class="mi">3</span>\n' + '</span></code></pre></div>' + ) + else: + expected = self.dedent( + ''' + <pre class="codehilite"><code class="language-python">line 1 + line 2 + line 3 + </code></pre> + ''' + ) + self.assertMarkdownRenders( + self.dedent( + ''' + ``` .python hl_lines="1 3" + line 1 + line 2 + line 3 + ``` + ''' + ), + expected, + extensions=[ + markdown.extensions.codehilite.CodeHiliteExtension(linenums=None, guess_lang=False), + 'fenced_code' + ] + ) + + def testFencedLanguageAndPygmentsDisabled(self): + self.assertMarkdownRenders( + self.dedent( + ''' + ``` .python + # Some python code + ``` + ''' + ), + self.dedent( + ''' + <pre><code class="language-python"># Some python code + </code></pre> + ''' + ), + extensions=[ + markdown.extensions.codehilite.CodeHiliteExtension(use_pygments=False), + 'fenced_code' + ] + ) + + def testFencedLanguageDoubleEscape(self): + if has_pygments: + expected = ( + '<div class="codehilite"><pre><span></span><code>' + '<span class="p"><</span><span class="nt">span</span>' + '<span class="p">></span>This<span class="ni">&amp;</span>' + 'That<span class="p"></</span><span class="nt">span</span>' + '<span class="p">></span>\n' + '</code></pre></div>' + ) + else: + expected = ( + '<pre class="codehilite"><code class="language-html">' + '<span>This&amp;That</span>\n' + '</code></pre>' + ) + self.assertMarkdownRenders( + self.dedent( + ''' + ```html + <span>This&That</span> + ``` + ''' + ), + expected, + extensions=[ + markdown.extensions.codehilite.CodeHiliteExtension(), + 'fenced_code' + ] + ) + + def testFencedAmps(self): + if has_pygments: + expected = self.dedent( + ''' + <div class="codehilite"><pre><span></span><code>& + &amp; + &amp;amp; + </code></pre></div> + ''' + ) + else: + expected = self.dedent( + ''' + <pre class="codehilite"><code class="language-text">& + &amp; + &amp;amp; + </code></pre> + ''' + ) + self.assertMarkdownRenders( + self.dedent( + ''' + ```text + & + & + &amp; + ``` + ''' + ), + expected, + extensions=[ + markdown.extensions.codehilite.CodeHiliteExtension(), + 'fenced_code' + ] + ) + + def testFencedCodeWithHighlightLinesInAttr(self): + if has_pygments: + expected = self.dedent( + ''' + <div class="codehilite"><pre><span></span><code><span class="hll">line 1 + </span>line 2 + <span class="hll">line 3 + </span></code></pre></div> + ''' + ) + else: + expected = self.dedent( + ''' + <pre class="codehilite"><code>line 1 + line 2 + line 3 + </code></pre> + ''' + ) + self.assertMarkdownRenders( + self.dedent( + ''' + ```{ hl_lines="1 3" } + line 1 + line 2 + line 3 + ``` + ''' + ), + expected, + extensions=[ + markdown.extensions.codehilite.CodeHiliteExtension(linenums=None, guess_lang=False), + 'fenced_code' + ] + ) + + def testFencedLanguageAndHighlightLinesInAttr(self): + if has_pygments: + expected = ( + '<div class="codehilite"><pre><span></span><code>' + '<span class="hll"><span class="n">line</span> <span class="mi">1</span>\n' + '</span><span class="n">line</span> <span class="mi">2</span>\n' + '<span class="hll"><span class="n">line</span> <span class="mi">3</span>\n' + '</span></code></pre></div>' + ) + else: + expected = self.dedent( + ''' + <pre class="codehilite"><code class="language-python">line 1 + line 2 + line 3 + </code></pre> + ''' + ) + self.assertMarkdownRenders( + self.dedent( + ''' + ``` { .python hl_lines="1 3" } + line 1 + line 2 + line 3 + ``` + ''' + ), + expected, + extensions=[ + markdown.extensions.codehilite.CodeHiliteExtension(linenums=None, guess_lang=False), + 'fenced_code' + ] + ) + + def testFencedLanguageIdInAttrAndPygmentsDisabled(self): + self.assertMarkdownRenders( + self.dedent( + ''' + ``` { .python #foo } + # Some python code + ``` + ''' + ), + self.dedent( + ''' + <pre id="foo"><code class="language-python"># Some python code + </code></pre> + ''' + ), + extensions=[ + markdown.extensions.codehilite.CodeHiliteExtension(use_pygments=False), + 'fenced_code' + ] + ) + + def testFencedLanguageIdAndPygmentsDisabledInAttr(self): + self.assertMarkdownRenders( + self.dedent( + ''' + ``` { .python #foo use_pygments=False } + # Some python code + ``` + ''' + ), + self.dedent( + ''' + <pre id="foo"><code class="language-python"># Some python code + </code></pre> + ''' + ), + extensions=['codehilite', 'fenced_code'] + ) + + def testFencedLanguageAttrCssclass(self): + if has_pygments: + expected = self.dedent( + ''' + <div class="pygments"><pre><span></span><code><span class="c1"># Some python code</span> + </code></pre></div> + ''' + ) + else: + expected = ( + '<pre class="pygments"><code class="language-python"># Some python code\n' + '</code></pre>' + ) + self.assertMarkdownRenders( + self.dedent( + ''' + ``` { .python css_class='pygments' } + # Some python code + ``` + ''' + ), + expected, + extensions=['codehilite', 'fenced_code'] + ) + + def testFencedLanguageAttrLinenums(self): + if has_pygments: + expected = ( + '<table class="codehilitetable"><tr>' + '<td class="linenos"><div class="linenodiv"><pre>1</pre></div></td>' + '<td class="code"><div class="codehilite"><pre><span></span>' + '<code><span class="c1"># Some python code</span>\n' + '</code></pre></div>\n' + '</td></tr></table>' + ) + else: + expected = ( + '<pre class="codehilite"><code class="language-python linenums"># Some python code\n' + '</code></pre>' + ) + self.assertMarkdownRenders( + self.dedent( + ''' + ``` { .python linenums=True } + # Some python code + ``` + ''' + ), + expected, + extensions=['codehilite', 'fenced_code'] + ) + + def testFencedLanguageAttrGuesslang(self): + if has_pygments: + expected = self.dedent( + ''' + <div class="codehilite"><pre><span></span><code># Some python code + </code></pre></div> + ''' + ) + else: + expected = ( + '<pre class="codehilite"><code># Some python code\n' + '</code></pre>' + ) + self.assertMarkdownRenders( + self.dedent( + ''' + ``` { guess_lang=False } + # Some python code + ``` + ''' + ), + expected, + extensions=['codehilite', 'fenced_code'] + ) + + def testFencedLanguageAttrNoclasses(self): + if has_pygments: + expected = ( + '<div class="codehilite" style="background: #f8f8f8">' + '<pre style="line-height: 125%; margin: 0;"><span></span><code>' + '<span style="color: #408080; font-style: italic"># Some python code</span>\n' + '</code></pre></div>' + ) + else: + expected = ( + '<pre class="codehilite"><code class="language-python"># Some python code\n' + '</code></pre>' + ) + self.assertMarkdownRenders( + self.dedent( + ''' + ``` { .python noclasses=True } + # Some python code + ``` + ''' + ), + expected, + extensions=['codehilite', 'fenced_code'] + ) + + def testFencedMultipleBlocksSameStyle(self): + if has_pygments: + # See also: https://github.com/Python-Markdown/markdown/issues/1240 + expected = ( + '<div class="codehilite" style="background: #202020"><pre style="line-height: 125%; margin: 0;">' + '<span></span><code><span style="color: #999999; font-style: italic"># First Code Block</span>\n' + '</code></pre></div>\n\n' + '<p>Normal paragraph</p>\n' + '<div class="codehilite" style="background: #202020"><pre style="line-height: 125%; margin: 0;">' + '<span></span><code><span style="color: #999999; font-style: italic"># Second Code Block</span>\n' + '</code></pre></div>' + ) + else: + expected = ''' + <pre class="codehilite"><code class="language-python"># First Code Block + </code></pre> + + <p>Normal paragraph</p> + <pre class="codehilite"><code class="language-python"># Second Code Block + </code></pre> + ''' + + self.assertMarkdownRenders( + self.dedent( + ''' + ``` { .python } + # First Code Block + ``` + + Normal paragraph + + ``` { .python } + # Second Code Block + ``` + ''' + ), + self.dedent( + expected + ), + extensions=[ + markdown.extensions.codehilite.CodeHiliteExtension(pygments_style="native", noclasses=True), + 'fenced_code' + ] + ) + + def testCustomPygmentsFormatter(self): + if has_pygments: + class CustomFormatter(pygments.formatters.HtmlFormatter): + def wrap(self, source, outfile): + return self._wrap_div(self._wrap_code(source)) + + def _wrap_code(self, source): + yield 0, '<code>' + for i, t in source: + if i == 1: + t += '<br>' + yield i, t + yield 0, '</code>' + + expected = ''' + <div class="codehilite"><code>hello world + <br>hello another world + <br></code></div> + ''' + + else: + CustomFormatter = None + expected = ''' + <pre class="codehilite"><code>hello world + hello another world + </code></pre> + ''' + + self.assertMarkdownRenders( + self.dedent( + ''' + ``` + hello world + hello another world + ``` + ''' + ), + self.dedent( + expected + ), + extensions=[ + markdown.extensions.codehilite.CodeHiliteExtension( + pygments_formatter=CustomFormatter, + guess_lang=False, + ), + 'fenced_code' + ] + ) + + def testPygmentsAddLangClassFormatter(self): + if has_pygments: + class CustomAddLangHtmlFormatter(pygments.formatters.HtmlFormatter): + def __init__(self, lang_str='', **options): + super().__init__(**options) + self.lang_str = lang_str + + def _wrap_code(self, source): + yield 0, f'<code class="{self.lang_str}">' + yield from source + yield 0, '</code>' + + expected = ''' + <div class="codehilite"><pre><span></span><code class="language-text">hello world + hello another world + </code></pre></div> + ''' + else: + CustomAddLangHtmlFormatter = None + expected = ''' + <pre class="codehilite"><code class="language-text">hello world + hello another world + </code></pre> + ''' + + self.assertMarkdownRenders( + self.dedent( + ''' + ```text + hello world + hello another world + ``` + ''' + ), + self.dedent( + expected + ), + extensions=[ + markdown.extensions.codehilite.CodeHiliteExtension( + guess_lang=False, + pygments_formatter=CustomAddLangHtmlFormatter, + ), + 'fenced_code' + ] + ) + + def testSvgCustomPygmentsFormatter(self): + if has_pygments: + expected = ''' + <?xml version="1.0"?> + <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.0//EN" "http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd"> + <svg xmlns="http://www.w3.org/2000/svg"> + <g font-family="monospace" font-size="14px"> + <text x="0" y="14" xml:space="preserve">hello world</text> + <text x="0" y="33" xml:space="preserve">hello another world</text> + <text x="0" y="52" xml:space="preserve"></text></g></svg> + ''' + + else: + expected = ''' + <pre class="codehilite"><code>hello world + hello another world + </code></pre> + ''' + + self.assertMarkdownRenders( + self.dedent( + ''' + ``` + hello world + hello another world + ``` + ''' + ), + self.dedent( + expected + ), + extensions=[ + markdown.extensions.codehilite.CodeHiliteExtension( + pygments_formatter='svg', + linenos=False, + guess_lang=False, + ), + 'fenced_code' + ] + ) + + def testInvalidCustomPygmentsFormatter(self): + if has_pygments: + expected = ''' + <div class="codehilite"><pre><span></span><code>hello world + hello another world + </code></pre></div> + ''' + + else: + expected = ''' + <pre class="codehilite"><code>hello world + hello another world + </code></pre> + ''' + + self.assertMarkdownRenders( + self.dedent( + ''' + ``` + hello world + hello another world + ``` + ''' + ), + self.dedent( + expected + ), + extensions=[ + markdown.extensions.codehilite.CodeHiliteExtension( + pygments_formatter='invalid', + guess_lang=False, + ), + 'fenced_code' + ] + ) diff --git a/tests/test_syntax/extensions/test_footnotes.py b/tests/test_syntax/extensions/test_footnotes.py new file mode 100644 index 0000000..9a6b32a --- /dev/null +++ b/tests/test_syntax/extensions/test_footnotes.py @@ -0,0 +1,338 @@ +""" +Python Markdown + +A Python implementation of John Gruber's Markdown. + +Documentation: https://python-markdown.github.io/ +GitHub: https://github.com/Python-Markdown/markdown/ +PyPI: https://pypi.org/project/Markdown/ + +Started by Manfred Stienstra (http://www.dwerg.net/). +Maintained for a few years by Yuri Takhteyev (http://www.freewisdom.org). +Currently maintained by Waylan Limberg (https://github.com/waylan), +Dmitry Shachnev (https://github.com/mitya57) and Isaac Muse (https://github.com/facelessuser). + +Copyright 2007-2018 The Python Markdown Project (v. 1.7 and later) +Copyright 2004, 2005, 2006 Yuri Takhteyev (v. 0.2-1.6b) +Copyright 2004 Manfred Stienstra (the original version) + +License: BSD (see LICENSE.md for details). +""" + +from markdown.test_tools import TestCase + + +class TestFootnotes(TestCase): + + default_kwargs = {'extensions': ['footnotes']} + maxDiff = None + + def test_basic_footnote(self): + self.assertMarkdownRenders( + self.dedent( + """ + paragraph[^1] + + [^1]: A Footnote + """ + ), + '<p>paragraph<sup id="fnref:1"><a class="footnote-ref" href="#fn:1">1</a></sup></p>\n' + '<div class="footnote">\n' + '<hr />\n' + '<ol>\n' + '<li id="fn:1">\n' + '<p>A Footnote <a class="footnote-backref" href="#fnref:1"' + ' title="Jump back to footnote 1 in the text">↩</a></p>\n' + '</li>\n' + '</ol>\n' + '</div>' + ) + + def test_multiple_footnotes(self): + self.assertMarkdownRenders( + self.dedent( + """ + foo[^1] + + bar[^2] + + [^1]: Footnote 1 + [^2]: Footnote 2 + """ + ), + '<p>foo<sup id="fnref:1"><a class="footnote-ref" href="#fn:1">1</a></sup></p>\n' + '<p>bar<sup id="fnref:2"><a class="footnote-ref" href="#fn:2">2</a></sup></p>\n' + '<div class="footnote">\n' + '<hr />\n' + '<ol>\n' + '<li id="fn:1">\n' + '<p>Footnote 1 <a class="footnote-backref" href="#fnref:1"' + ' title="Jump back to footnote 1 in the text">↩</a></p>\n' + '</li>\n' + '<li id="fn:2">\n' + '<p>Footnote 2 <a class="footnote-backref" href="#fnref:2"' + ' title="Jump back to footnote 2 in the text">↩</a></p>\n' + '</li>\n' + '</ol>\n' + '</div>' + ) + + def test_multiple_footnotes_multiline(self): + self.assertMarkdownRenders( + self.dedent( + """ + foo[^1] + + bar[^2] + + [^1]: Footnote 1 + line 2 + [^2]: Footnote 2 + """ + ), + '<p>foo<sup id="fnref:1"><a class="footnote-ref" href="#fn:1">1</a></sup></p>\n' + '<p>bar<sup id="fnref:2"><a class="footnote-ref" href="#fn:2">2</a></sup></p>\n' + '<div class="footnote">\n' + '<hr />\n' + '<ol>\n' + '<li id="fn:1">\n' + '<p>Footnote 1\nline 2 <a class="footnote-backref" href="#fnref:1"' + ' title="Jump back to footnote 1 in the text">↩</a></p>\n' + '</li>\n' + '<li id="fn:2">\n' + '<p>Footnote 2 <a class="footnote-backref" href="#fnref:2"' + ' title="Jump back to footnote 2 in the text">↩</a></p>\n' + '</li>\n' + '</ol>\n' + '</div>' + ) + + def test_footnote_multi_line(self): + self.assertMarkdownRenders( + self.dedent( + """ + paragraph[^1] + [^1]: A Footnote + line 2 + """ + ), + '<p>paragraph<sup id="fnref:1"><a class="footnote-ref" href="#fn:1">1</a></sup></p>\n' + '<div class="footnote">\n' + '<hr />\n' + '<ol>\n' + '<li id="fn:1">\n' + '<p>A Footnote\nline 2 <a class="footnote-backref" href="#fnref:1"' + ' title="Jump back to footnote 1 in the text">↩</a></p>\n' + '</li>\n' + '</ol>\n' + '</div>' + ) + + def test_footnote_multi_line_lazy_indent(self): + self.assertMarkdownRenders( + self.dedent( + """ + paragraph[^1] + [^1]: A Footnote + line 2 + """ + ), + '<p>paragraph<sup id="fnref:1"><a class="footnote-ref" href="#fn:1">1</a></sup></p>\n' + '<div class="footnote">\n' + '<hr />\n' + '<ol>\n' + '<li id="fn:1">\n' + '<p>A Footnote\nline 2 <a class="footnote-backref" href="#fnref:1"' + ' title="Jump back to footnote 1 in the text">↩</a></p>\n' + '</li>\n' + '</ol>\n' + '</div>' + ) + + def test_footnote_multi_line_complex(self): + self.assertMarkdownRenders( + self.dedent( + """ + paragraph[^1] + + [^1]: + + A Footnote + line 2 + + * list item + + > blockquote + """ + ), + '<p>paragraph<sup id="fnref:1"><a class="footnote-ref" href="#fn:1">1</a></sup></p>\n' + '<div class="footnote">\n' + '<hr />\n' + '<ol>\n' + '<li id="fn:1">\n' + '<p>A Footnote\nline 2</p>\n' + '<ul>\n<li>list item</li>\n</ul>\n' + '<blockquote>\n<p>blockquote</p>\n</blockquote>\n' + '<p><a class="footnote-backref" href="#fnref:1"' + ' title="Jump back to footnote 1 in the text">↩</a></p>\n' + '</li>\n' + '</ol>\n' + '</div>' + ) + + def test_footnote_multple_complex(self): + self.assertMarkdownRenders( + self.dedent( + """ + foo[^1] + + bar[^2] + + [^1]: + + A Footnote + line 2 + + * list item + + > blockquote + + [^2]: Second footnote + + paragraph 2 + """ + ), + '<p>foo<sup id="fnref:1"><a class="footnote-ref" href="#fn:1">1</a></sup></p>\n' + '<p>bar<sup id="fnref:2"><a class="footnote-ref" href="#fn:2">2</a></sup></p>\n' + '<div class="footnote">\n' + '<hr />\n' + '<ol>\n' + '<li id="fn:1">\n' + '<p>A Footnote\nline 2</p>\n' + '<ul>\n<li>list item</li>\n</ul>\n' + '<blockquote>\n<p>blockquote</p>\n</blockquote>\n' + '<p><a class="footnote-backref" href="#fnref:1"' + ' title="Jump back to footnote 1 in the text">↩</a></p>\n' + '</li>\n' + '<li id="fn:2">\n' + '<p>Second footnote</p>\n' + '<p>paragraph 2 <a class="footnote-backref" href="#fnref:2"' + ' title="Jump back to footnote 2 in the text">↩</a></p>\n' + '</li>\n' + '</ol>\n' + '</div>' + ) + + def test_footnote_multple_complex_no_blank_line_between(self): + self.assertMarkdownRenders( + self.dedent( + """ + foo[^1] + + bar[^2] + + [^1]: + + A Footnote + line 2 + + * list item + + > blockquote + [^2]: Second footnote + + paragraph 2 + """ + ), + '<p>foo<sup id="fnref:1"><a class="footnote-ref" href="#fn:1">1</a></sup></p>\n' + '<p>bar<sup id="fnref:2"><a class="footnote-ref" href="#fn:2">2</a></sup></p>\n' + '<div class="footnote">\n' + '<hr />\n' + '<ol>\n' + '<li id="fn:1">\n' + '<p>A Footnote\nline 2</p>\n' + '<ul>\n<li>list item</li>\n</ul>\n' + '<blockquote>\n<p>blockquote</p>\n</blockquote>\n' + '<p><a class="footnote-backref" href="#fnref:1"' + ' title="Jump back to footnote 1 in the text">↩</a></p>\n' + '</li>\n' + '<li id="fn:2">\n' + '<p>Second footnote</p>\n' + '<p>paragraph 2 <a class="footnote-backref" href="#fnref:2"' + ' title="Jump back to footnote 2 in the text">↩</a></p>\n' + '</li>\n' + '</ol>\n' + '</div>' + ) + + def test_backlink_text(self): + """Test backlink configuration.""" + + self.assertMarkdownRenders( + 'paragraph[^1]\n\n[^1]: A Footnote', + '<p>paragraph<sup id="fnref:1"><a class="footnote-ref" href="#fn:1">1</a></sup></p>\n' + '<div class="footnote">\n' + '<hr />\n' + '<ol>\n' + '<li id="fn:1">\n' + '<p>A Footnote <a class="footnote-backref" href="#fnref:1"' + ' title="Jump back to footnote 1 in the text">back</a></p>\n' + '</li>\n' + '</ol>\n' + '</div>', + extension_configs={'footnotes': {'BACKLINK_TEXT': 'back'}} + ) + + def test_footnote_separator(self): + """Test separator configuration.""" + + self.assertMarkdownRenders( + 'paragraph[^1]\n\n[^1]: A Footnote', + '<p>paragraph<sup id="fnref-1"><a class="footnote-ref" href="#fn-1">1</a></sup></p>\n' + '<div class="footnote">\n' + '<hr />\n' + '<ol>\n' + '<li id="fn-1">\n' + '<p>A Footnote <a class="footnote-backref" href="#fnref-1"' + ' title="Jump back to footnote 1 in the text">↩</a></p>\n' + '</li>\n' + '</ol>\n' + '</div>', + extension_configs={'footnotes': {'SEPARATOR': '-'}} + ) + + def test_backlink_title(self): + """Test backlink title configuration without placeholder.""" + + self.assertMarkdownRenders( + 'paragraph[^1]\n\n[^1]: A Footnote', + '<p>paragraph<sup id="fnref:1"><a class="footnote-ref" href="#fn:1">1</a></sup></p>\n' + '<div class="footnote">\n' + '<hr />\n' + '<ol>\n' + '<li id="fn:1">\n' + '<p>A Footnote <a class="footnote-backref" href="#fnref:1"' + ' title="Jump back to footnote">↩</a></p>\n' + '</li>\n' + '</ol>\n' + '</div>', + extension_configs={'footnotes': {'BACKLINK_TITLE': 'Jump back to footnote'}} + ) + + def test_superscript_text(self): + """Test superscript text configuration.""" + + self.assertMarkdownRenders( + 'paragraph[^1]\n\n[^1]: A Footnote', + '<p>paragraph<sup id="fnref:1"><a class="footnote-ref" href="#fn:1">[1]</a></sup></p>\n' + '<div class="footnote">\n' + '<hr />\n' + '<ol>\n' + '<li id="fn:1">\n' + '<p>A Footnote <a class="footnote-backref" href="#fnref:1"' + ' title="Jump back to footnote 1 in the text">↩</a></p>\n' + '</li>\n' + '</ol>\n' + '</div>', + extension_configs={'footnotes': {'SUPERSCRIPT_TEXT': '[{}]'}} + ) diff --git a/tests/test_syntax/extensions/test_legacy_attrs.py b/tests/test_syntax/extensions/test_legacy_attrs.py new file mode 100644 index 0000000..b4ba5e7 --- /dev/null +++ b/tests/test_syntax/extensions/test_legacy_attrs.py @@ -0,0 +1,67 @@ +""" +Python Markdown + +A Python implementation of John Gruber's Markdown. + +Documentation: https://python-markdown.github.io/ +GitHub: https://github.com/Python-Markdown/markdown/ +PyPI: https://pypi.org/project/Markdown/ + +Started by Manfred Stienstra (http://www.dwerg.net/). +Maintained for a few years by Yuri Takhteyev (http://www.freewisdom.org). +Currently maintained by Waylan Limberg (https://github.com/waylan), +Dmitry Shachnev (https://github.com/mitya57) and Isaac Muse (https://github.com/facelessuser). + +Copyright 2007-2018 The Python Markdown Project (v. 1.7 and later) +Copyright 2004, 2005, 2006 Yuri Takhteyev (v. 0.2-1.6b) +Copyright 2004 Manfred Stienstra (the original version) + +License: BSD (see LICENSE.md for details). +""" + +from markdown.test_tools import TestCase + + +class TestLegacyAtrributes(TestCase): + + maxDiff = None + + def testLegacyAttrs(self): + self.assertMarkdownRenders( + self.dedent(""" + # Header {@id=inthebeginning} + + Now, let's try something *inline{@class=special}*, to see if it works + + @id=TABLE.OF.CONTENTS} + + + * {@id=TABLEOFCONTENTS} + + + Or in the middle of the text {@id=TABLEOFCONTENTS} + + {@id=tableofcontents} + + [![{@style=float: left; margin: 10px; border: + none;}](http://fourthought.com/images/ftlogo.png "Fourthought + logo")](http://fourthought.com/) + + ![img{@id=foo}][img] + + [img]: http://example.com/i.jpg + """), + self.dedent(""" + <h1 id="inthebeginning">Header </h1> + <p>Now, let's try something <em class="special">inline</em>, to see if it works</p> + <p>@id=TABLE.OF.CONTENTS}</p> + <ul> + <li id="TABLEOFCONTENTS"></li> + </ul> + <p id="TABLEOFCONTENTS">Or in the middle of the text </p> + <p id="tableofcontents"></p> + <p><a href="http://fourthought.com/"><img alt="" src="http://fourthought.com/images/ftlogo.png" style="float: left; margin: 10px; border: none;" title="Fourthought logo" /></a></p> + <p><img alt="img" id="foo" src="http://example.com/i.jpg" /></p> + """), # noqa: E501 + extensions=['legacy_attrs'] + ) diff --git a/tests/test_syntax/extensions/test_legacy_em.py b/tests/test_syntax/extensions/test_legacy_em.py new file mode 100644 index 0000000..c5daf1c --- /dev/null +++ b/tests/test_syntax/extensions/test_legacy_em.py @@ -0,0 +1,66 @@ +""" +Python Markdown + +A Python implementation of John Gruber's Markdown. + +Documentation: https://python-markdown.github.io/ +GitHub: https://github.com/Python-Markdown/markdown/ +PyPI: https://pypi.org/project/Markdown/ + +Started by Manfred Stienstra (http://www.dwerg.net/). +Maintained for a few years by Yuri Takhteyev (http://www.freewisdom.org). +Currently maintained by Waylan Limberg (https://github.com/waylan), +Dmitry Shachnev (https://github.com/mitya57) and Isaac Muse (https://github.com/facelessuser). + +Copyright 2007-2018 The Python Markdown Project (v. 1.7 and later) +Copyright 2004, 2005, 2006 Yuri Takhteyev (v. 0.2-1.6b) +Copyright 2004 Manfred Stienstra (the original version) + +License: BSD (see LICENSE.md for details). +""" + +from markdown.test_tools import TestCase + + +class TestLegacyEm(TestCase): + def test_legacy_emphasis(self): + self.assertMarkdownRenders( + '_connected_words_', + '<p><em>connected</em>words_</p>', + extensions=['legacy_em'] + ) + + def test_legacy_strong(self): + self.assertMarkdownRenders( + '__connected__words__', + '<p><strong>connected</strong>words__</p>', + extensions=['legacy_em'] + ) + + def test_complex_emphasis_underscore(self): + self.assertMarkdownRenders( + 'This is text __bold _italic bold___ with more text', + '<p>This is text <strong>bold <em>italic bold</em></strong> with more text</p>', + extensions=['legacy_em'] + ) + + def test_complex_emphasis_underscore_mid_word(self): + self.assertMarkdownRenders( + 'This is text __bold_italic bold___ with more text', + '<p>This is text <strong>bold<em>italic bold</em></strong> with more text</p>', + extensions=['legacy_em'] + ) + + def test_complex_multple_underscore_type(self): + + self.assertMarkdownRenders( + 'traced ___along___ bla __blocked__ if other ___or___', + '<p>traced <strong><em>along</em></strong> bla <strong>blocked</strong> if other <strong><em>or</em></strong></p>' # noqa: E501 + ) + + def test_complex_multple_underscore_type_variant2(self): + + self.assertMarkdownRenders( + 'on the __1-4 row__ of the AP Combat Table ___and___ receive', + '<p>on the <strong>1-4 row</strong> of the AP Combat Table <strong><em>and</em></strong> receive</p>' + ) diff --git a/tests/test_syntax/extensions/test_md_in_html.py b/tests/test_syntax/extensions/test_md_in_html.py new file mode 100644 index 0000000..6c13f11 --- /dev/null +++ b/tests/test_syntax/extensions/test_md_in_html.py @@ -0,0 +1,1216 @@ +# -*- coding: utf-8 -*- +""" +Python Markdown + +A Python implementation of John Gruber's Markdown. + +Documentation: https://python-markdown.github.io/ +GitHub: https://github.com/Python-Markdown/markdown/ +PyPI: https://pypi.org/project/Markdown/ + +Started by Manfred Stienstra (http://www.dwerg.net/). +Maintained for a few years by Yuri Takhteyev (http://www.freewisdom.org). +Currently maintained by Waylan Limberg (https://github.com/waylan), +Dmitry Shachnev (https://github.com/mitya57) and Isaac Muse (https://github.com/facelessuser). + +Copyright 2007-2018 The Python Markdown Project (v. 1.7 and later) +Copyright 2004, 2005, 2006 Yuri Takhteyev (v. 0.2-1.6b) +Copyright 2004 Manfred Stienstra (the original version) + +License: BSD (see LICENSE.md for details). +""" + +from unittest import TestSuite +from markdown.test_tools import TestCase +from ..blocks.test_html_blocks import TestHTMLBlocks +from markdown import Markdown +from xml.etree.ElementTree import Element + + +class TestMarkdownInHTMLPostProcessor(TestCase): + """ Ensure any remaining elements in HTML stash are properly serialized. """ + + def test_stash_to_string(self): + # There should be no known cases where this actually happens so we need to + # forcefully pass an etree Element to the method to ensure proper behavior. + element = Element('div') + element.text = 'Foo bar.' + md = Markdown(extensions=['md_in_html']) + result = md.postprocessors['raw_html'].stash_to_string(element) + self.assertEqual(result, '<div>Foo bar.</div>') + + +class TestDefaultwMdInHTML(TestHTMLBlocks): + """ Ensure the md_in_html extension does not break the default behavior. """ + + default_kwargs = {'extensions': ['md_in_html']} + + +class TestMdInHTML(TestCase): + + default_kwargs = {'extensions': ['md_in_html']} + + def test_md1_paragraph(self): + self.assertMarkdownRenders( + '<p markdown="1">*foo*</p>', + '<p><em>foo</em></p>' + ) + + def test_md1_p_linebreaks(self): + self.assertMarkdownRenders( + self.dedent( + """ + <p markdown="1"> + *foo* + </p> + """ + ), + self.dedent( + """ + <p> + <em>foo</em> + </p> + """ + ) + ) + + def test_md1_p_blank_lines(self): + self.assertMarkdownRenders( + self.dedent( + """ + <p markdown="1"> + + *foo* + + </p> + """ + ), + self.dedent( + """ + <p> + + <em>foo</em> + + </p> + """ + ) + ) + + def test_md1_div(self): + self.assertMarkdownRenders( + '<div markdown="1">*foo*</div>', + self.dedent( + """ + <div> + <p><em>foo</em></p> + </div> + """ + ) + ) + + def test_md1_div_linebreaks(self): + self.assertMarkdownRenders( + self.dedent( + """ + <div markdown="1"> + *foo* + </div> + """ + ), + self.dedent( + """ + <div> + <p><em>foo</em></p> + </div> + """ + ) + ) + + def test_md1_code_span(self): + self.assertMarkdownRenders( + self.dedent( + """ + <div markdown="1"> + `<h1>code span</h1>` + </div> + """ + ), + self.dedent( + """ + <div> + <p><code><h1>code span</h1></code></p> + </div> + """ + ) + ) + + def test_md1_code_span_oneline(self): + self.assertMarkdownRenders( + '<div markdown="1">`<h1>code span</h1>`</div>', + self.dedent( + """ + <div> + <p><code><h1>code span</h1></code></p> + </div> + """ + ) + ) + + def test_md1_code_span_unclosed(self): + self.assertMarkdownRenders( + self.dedent( + """ + <div markdown="1"> + `<p>` + </div> + """ + ), + self.dedent( + """ + <div> + <p><code><p></code></p> + </div> + """ + ) + ) + + def test_md1_code_span_script_tag(self): + self.assertMarkdownRenders( + self.dedent( + """ + <div markdown="1"> + `<script>` + </div> + """ + ), + self.dedent( + """ + <div> + <p><code><script></code></p> + </div> + """ + ) + ) + + def test_md1_div_blank_lines(self): + self.assertMarkdownRenders( + self.dedent( + """ + <div markdown="1"> + + *foo* + + </div> + """ + ), + self.dedent( + """ + <div> + <p><em>foo</em></p> + </div> + """ + ) + ) + + def test_md1_div_multi(self): + self.assertMarkdownRenders( + self.dedent( + """ + <div markdown="1"> + + *foo* + + __bar__ + + </div> + """ + ), + self.dedent( + """ + <div> + <p><em>foo</em></p> + <p><strong>bar</strong></p> + </div> + """ + ) + ) + + def test_md1_div_nested(self): + self.assertMarkdownRenders( + self.dedent( + """ + <div markdown="1"> + + <div markdown="1"> + *foo* + </div> + + </div> + """ + ), + self.dedent( + """ + <div> + <div> + <p><em>foo</em></p> + </div> + </div> + """ + ) + ) + + def test_md1_div_multi_nest(self): + self.assertMarkdownRenders( + self.dedent( + """ + <div markdown="1"> + + <div markdown="1"> + <p markdown="1">*foo*</p> + </div> + + </div> + """ + ), + self.dedent( + """ + <div> + <div> + <p><em>foo</em></p> + </div> + </div> + """ + ) + ) + + def text_md1_details(self): + self.assertMarkdownRenders( + self.dedent( + """ + <details markdown="1"> + <summary>Click to expand</summary> + *foo* + </details> + """ + ), + self.dedent( + """ + <details> + <summary>Click to expand</summary> + <p><em>foo</em></p> + </details> + """ + ) + ) + + def test_md1_mix(self): + self.assertMarkdownRenders( + self.dedent( + """ + <div markdown="1"> + A _Markdown_ paragraph before a raw child. + + <p markdown="1">A *raw* child.</p> + + A _Markdown_ tail to the raw child. + </div> + """ + ), + self.dedent( + """ + <div> + <p>A <em>Markdown</em> paragraph before a raw child.</p> + <p>A <em>raw</em> child.</p> + <p>A <em>Markdown</em> tail to the raw child.</p> + </div> + """ + ) + ) + + def test_md1_deep_mix(self): + self.assertMarkdownRenders( + self.dedent( + """ + <div markdown="1"> + + A _Markdown_ paragraph before a raw child. + + A second Markdown paragraph + with two lines. + + <div markdown="1"> + + A *raw* child. + + <p markdown="1">*foo*</p> + + Raw child tail. + + </div> + + A _Markdown_ tail to the raw child. + + A second tail item + with two lines. + + <p markdown="1">More raw.</p> + + </div> + """ + ), + self.dedent( + """ + <div> + <p>A <em>Markdown</em> paragraph before a raw child.</p> + <p>A second Markdown paragraph + with two lines.</p> + <div> + <p>A <em>raw</em> child.</p> + <p><em>foo</em></p> + <p>Raw child tail.</p> + </div> + <p>A <em>Markdown</em> tail to the raw child.</p> + <p>A second tail item + with two lines.</p> + <p>More raw.</p> + </div> + """ + ) + ) + + def test_md1_div_raw_inline(self): + self.assertMarkdownRenders( + self.dedent( + """ + <div markdown="1"> + + <em>foo</em> + + </div> + """ + ), + self.dedent( + """ + <div> + <p><em>foo</em></p> + </div> + """ + ) + ) + + def test_no_md1_paragraph(self): + self.assertMarkdownRenders( + '<p>*foo*</p>', + '<p>*foo*</p>' + ) + + def test_no_md1_nest(self): + self.assertMarkdownRenders( + self.dedent( + """ + <div markdown="1"> + A _Markdown_ paragraph before a raw child. + + <p>A *raw* child.</p> + + A _Markdown_ tail to the raw child. + </div> + """ + ), + self.dedent( + """ + <div> + <p>A <em>Markdown</em> paragraph before a raw child.</p> + <p>A *raw* child.</p> + <p>A <em>Markdown</em> tail to the raw child.</p> + </div> + """ + ) + ) + + def test_md1_nested_empty(self): + self.assertMarkdownRenders( + self.dedent( + """ + <div markdown="1"> + A _Markdown_ paragraph before a raw empty tag. + + <img src="image.png" alt="An image" /> + + A _Markdown_ tail to the raw empty tag. + </div> + """ + ), + self.dedent( + """ + <div> + <p>A <em>Markdown</em> paragraph before a raw empty tag.</p> + <p><img src="image.png" alt="An image" /></p> + <p>A <em>Markdown</em> tail to the raw empty tag.</p> + </div> + """ + ) + ) + + def test_md1_nested_empty_block(self): + self.assertMarkdownRenders( + self.dedent( + """ + <div markdown="1"> + A _Markdown_ paragraph before a raw empty tag. + + <hr /> + + A _Markdown_ tail to the raw empty tag. + </div> + """ + ), + self.dedent( + """ + <div> + <p>A <em>Markdown</em> paragraph before a raw empty tag.</p> + <hr /> + <p>A <em>Markdown</em> tail to the raw empty tag.</p> + </div> + """ + ) + ) + + def test_empty_tags(self): + self.assertMarkdownRenders( + self.dedent( + """ + <div markdown="1"> + <div></div> + </div> + """ + ), + self.dedent( + """ + <div> + <div></div> + </div> + """ + ) + ) + + def test_orphan_end_tag_in_raw_html(self): + self.assertMarkdownRenders( + self.dedent( + """ + <div markdown="1"> + <div> + Test + + </pre> + + Test + </div> + </div> + """ + ), + self.dedent( + """ + <div> + <div> + Test + + </pre> + + Test + </div> + </div> + """ + ) + ) + + def test_complex_nested_case(self): + self.assertMarkdownRenders( + self.dedent( + """ + <div markdown="1"> + **test** + <div> + **test** + <img src=""/> + <code>Test</code> + <span>**test**</span> + <p>Test 2</p> + </div> + </div> + """ + ), + self.dedent( + """ + <div> + <p><strong>test</strong></p> + <div> + **test** + <img src=""/> + <code>Test</code> + <span>**test**</span> + <p>Test 2</p> + </div> + </div> + """ + ) + ) + + def test_complex_nested_case_whitespace(self): + self.assertMarkdownRenders( + self.dedent( + """ + Text with space\t + <div markdown="1">\t + \t + <div> + **test** + <img src=""/> + <code>Test</code> + <span>**test**</span> + <div>With whitespace</div> + <p>Test 2</p> + </div> + **test** + </div> + """ + ), + self.dedent( + """ + <p>Text with space </p> + <div> + <div> + **test** + <img src=""/> + <code>Test</code> + <span>**test**</span> + <div>With whitespace</div> + <p>Test 2</p> + </div> + <p><strong>test</strong></p> + </div> + """ + ) + ) + + def test_md1_intail_md1(self): + self.assertMarkdownRenders( + '<div markdown="1">*foo*</div><div markdown="1">*bar*</div>', + self.dedent( + """ + <div> + <p><em>foo</em></p> + </div> + <div> + <p><em>bar</em></p> + </div> + """ + ) + ) + + def test_md1_no_blank_line_before(self): + self.assertMarkdownRenders( + self.dedent( + """ + A _Markdown_ paragraph with no blank line after. + <div markdown="1"> + A _Markdown_ paragraph in an HTML block with no blank line before. + </div> + """ + ), + self.dedent( + """ + <p>A <em>Markdown</em> paragraph with no blank line after.</p> + <div> + <p>A <em>Markdown</em> paragraph in an HTML block with no blank line before.</p> + </div> + """ + ) + ) + + def test_md1_no_line_break(self): + # The div here is parsed as a span-level element. Bad input equals bad output! + self.assertMarkdownRenders( + 'A _Markdown_ paragraph with <div markdown="1">no _line break_.</div>', + '<p>A <em>Markdown</em> paragraph with <div markdown="1">no <em>line break</em>.</div></p>' + ) + + def test_md1_in_tail(self): + self.assertMarkdownRenders( + self.dedent( + """ + <div></div><div markdown="1"> + A _Markdown_ paragraph in an HTML block in tail of previous element. + </div> + """ + ), + self.dedent( + """ + <div></div> + <div> + <p>A <em>Markdown</em> paragraph in an HTML block in tail of previous element.</p> + </div> + """ + ) + ) + + def test_md1_PI_oneliner(self): + self.assertMarkdownRenders( + '<div markdown="1"><?php print("foo"); ?></div>', + self.dedent( + """ + <div> + <?php print("foo"); ?> + </div> + """ + ) + ) + + def test_md1_PI_multiline(self): + self.assertMarkdownRenders( + self.dedent( + """ + <div markdown="1"> + <?php print("foo"); ?> + </div> + """ + ), + self.dedent( + """ + <div> + <?php print("foo"); ?> + </div> + """ + ) + ) + + def test_md1_PI_blank_lines(self): + self.assertMarkdownRenders( + self.dedent( + """ + <div markdown="1"> + + <?php print("foo"); ?> + + </div> + """ + ), + self.dedent( + """ + <div> + <?php print("foo"); ?> + </div> + """ + ) + ) + + def test_md_span_paragraph(self): + self.assertMarkdownRenders( + '<p markdown="span">*foo*</p>', + '<p><em>foo</em></p>' + ) + + def test_md_block_paragraph(self): + self.assertMarkdownRenders( + '<p markdown="block">*foo*</p>', + self.dedent( + """ + <p> + <p><em>foo</em></p> + </p> + """ + ) + ) + + def test_md_span_div(self): + self.assertMarkdownRenders( + '<div markdown="span">*foo*</div>', + '<div><em>foo</em></div>' + ) + + def test_md_block_div(self): + self.assertMarkdownRenders( + '<div markdown="block">*foo*</div>', + self.dedent( + """ + <div> + <p><em>foo</em></p> + </div> + """ + ) + ) + + def test_md_span_nested_in_block(self): + self.assertMarkdownRenders( + self.dedent( + """ + <div markdown="block"> + <div markdown="span">*foo*</div> + </div> + """ + ), + self.dedent( + """ + <div> + <div><em>foo</em></div> + </div> + """ + ) + ) + + def test_md_block_nested_in_span(self): + self.assertMarkdownRenders( + self.dedent( + """ + <div markdown="span"> + <div markdown="block">*foo*</div> + </div> + """ + ), + self.dedent( + """ + <div> + <div><em>foo</em></div> + </div> + """ + ) + ) + + def test_md_block_after_span_nested_in_block(self): + self.assertMarkdownRenders( + self.dedent( + """ + <div markdown="block"> + <div markdown="span">*foo*</div> + <div markdown="block">*bar*</div> + </div> + """ + ), + self.dedent( + """ + <div> + <div><em>foo</em></div> + <div> + <p><em>bar</em></p> + </div> + </div> + """ + ) + ) + + def test_nomd_nested_in_md1(self): + self.assertMarkdownRenders( + self.dedent( + """ + <div markdown="1"> + *foo* + <div> + *foo* + <p>*bar*</p> + *baz* + </div> + *bar* + </div> + """ + ), + self.dedent( + """ + <div> + <p><em>foo</em></p> + <div> + *foo* + <p>*bar*</p> + *baz* + </div> + <p><em>bar</em></p> + </div> + """ + ) + ) + + def test_md1_nested_in_nomd(self): + self.assertMarkdownRenders( + self.dedent( + """ + <div> + <div markdown="1">*foo*</div> + </div> + """ + ), + self.dedent( + """ + <div> + <div markdown="1">*foo*</div> + </div> + """ + ) + ) + + def test_md1_single_quotes(self): + self.assertMarkdownRenders( + "<p markdown='1'>*foo*</p>", + '<p><em>foo</em></p>' + ) + + def test_md1_no_quotes(self): + self.assertMarkdownRenders( + '<p markdown=1>*foo*</p>', + '<p><em>foo</em></p>' + ) + + def test_md_no_value(self): + self.assertMarkdownRenders( + '<p markdown>*foo*</p>', + '<p><em>foo</em></p>' + ) + + def test_md1_preserve_attrs(self): + self.assertMarkdownRenders( + self.dedent( + """ + <div markdown="1" id="parent"> + + <div markdown="1" class="foo"> + <p markdown="1" class="bar baz">*foo*</p> + </div> + + </div> + """ + ), + self.dedent( + """ + <div id="parent"> + <div class="foo"> + <p class="bar baz"><em>foo</em></p> + </div> + </div> + """ + ) + ) + + def test_md1_unclosed_div(self): + self.assertMarkdownRenders( + self.dedent( + """ + <div markdown="1"> + + _foo_ + + <div class="unclosed"> + + _bar_ + + </div> + """ + ), + self.dedent( + """ + <div> + <p><em>foo</em></p> + <div class="unclosed"> + + _bar_ + + </div> + </div> + """ + ) + ) + + def test_md1_orphan_endtag(self): + self.assertMarkdownRenders( + self.dedent( + """ + <div markdown="1"> + + _foo_ + + </p> + + _bar_ + + </div> + """ + ), + self.dedent( + """ + <div> + <p><em>foo</em></p> + </p> + <p><em>bar</em></p> + </div> + """ + ) + ) + + def test_md1_unclosed_p(self): + self.assertMarkdownRenders( + self.dedent( + """ + <p markdown="1">_foo_ + <p markdown="1">_bar_ + """ + ), + self.dedent( + """ + <p><em>foo</em> + </p> + <p><em>bar</em> + + </p> + """ + ) + ) + + def test_md1_nested_unclosed_p(self): + self.assertMarkdownRenders( + self.dedent( + """ + <div markdown="1"> + <p markdown="1">_foo_ + <p markdown="1">_bar_ + </div> + """ + ), + self.dedent( + """ + <div> + <p><em>foo</em> + </p> + <p><em>bar</em> + </p> + </div> + """ + ) + ) + + def test_md1_nested_comment(self): + self.assertMarkdownRenders( + self.dedent( + """ + <div markdown="1"> + A *Markdown* paragraph. + <!-- foobar --> + A *Markdown* paragraph. + </div> + """ + ), + self.dedent( + """ + <div> + <p>A <em>Markdown</em> paragraph.</p> + <!-- foobar --> + <p>A <em>Markdown</em> paragraph.</p> + </div> + """ + ) + ) + + def test_md1_nested_link_ref(self): + self.assertMarkdownRenders( + self.dedent( + """ + <div markdown="1"> + [link]: http://example.com + <div markdown="1"> + [link][link] + </div> + </div> + """ + ), + self.dedent( + """ + <div> + <div> + <p><a href="http://example.com">link</a></p> + </div> + </div> + """ + ) + ) + + def test_md1_hr_only_start(self): + self.assertMarkdownRenders( + self.dedent( + """ + *emphasis1* + <hr markdown="1"> + *emphasis2* + """ + ), + self.dedent( + """ + <p><em>emphasis1</em></p> + <hr> + <p><em>emphasis2</em></p> + """ + ) + ) + + def test_md1_hr_self_close(self): + self.assertMarkdownRenders( + self.dedent( + """ + *emphasis1* + <hr markdown="1" /> + *emphasis2* + """ + ), + self.dedent( + """ + <p><em>emphasis1</em></p> + <hr> + <p><em>emphasis2</em></p> + """ + ) + ) + + def test_md1_hr_start_and_end(self): + # Browsers ignore ending hr tags, so we don't try to do anything to handle them special. + self.assertMarkdownRenders( + self.dedent( + """ + *emphasis1* + <hr markdown="1"></hr> + *emphasis2* + """ + ), + self.dedent( + """ + <p><em>emphasis1</em></p> + <hr> + <p></hr> + <em>emphasis2</em></p> + """ + ) + ) + + def test_md1_hr_only_end(self): + # Browsers ignore ending hr tags, so we don't try to do anything to handle them special. + self.assertMarkdownRenders( + self.dedent( + """ + *emphasis1* + </hr> + *emphasis2* + """ + ), + self.dedent( + """ + <p><em>emphasis1</em> + </hr> + <em>emphasis2</em></p> + """ + ) + ) + + def test_md1_hr_with_content(self): + # Browsers ignore ending hr tags, so we don't try to do anything to handle them special. + # Content is not allowed and will be treated as normal content between two hr tags + self.assertMarkdownRenders( + self.dedent( + """ + *emphasis1* + <hr markdown="1"> + **content** + </hr> + *emphasis2* + """ + ), + self.dedent( + """ + <p><em>emphasis1</em></p> + <hr> + <p><strong>content</strong> + </hr> + <em>emphasis2</em></p> + """ + ) + ) + + def test_no_md1_hr_with_content(self): + # Browsers ignore ending hr tags, so we don't try to do anything to handle them special. + # Content is not allowed and will be treated as normal content between two hr tags + self.assertMarkdownRenders( + self.dedent( + """ + *emphasis1* + <hr> + **content** + </hr> + *emphasis2* + """ + ), + self.dedent( + """ + <p><em>emphasis1</em></p> + <hr> + <p><strong>content</strong> + </hr> + <em>emphasis2</em></p> + """ + ) + ) + + def test_md1_nested_abbr_ref(self): + self.assertMarkdownRenders( + self.dedent( + """ + <div markdown="1"> + *[abbr]: Abbreviation + <div markdown="1"> + abbr + </div> + </div> + """ + ), + self.dedent( + """ + <div> + <div> + <p><abbr title="Abbreviation">abbr</abbr></p> + </div> + </div> + """ + ), + extensions=['md_in_html', 'abbr'] + ) + + def test_md1_nested_footnote_ref(self): + self.assertMarkdownRenders( + self.dedent( + """ + <div markdown="1"> + [^1]: The footnote. + <div markdown="1"> + Paragraph with a footnote.[^1] + </div> + </div> + """ + ), + '<div>\n' + '<div>\n' + '<p>Paragraph with a footnote.<sup id="fnref:1"><a class="footnote-ref" href="#fn:1">1</a></sup></p>\n' + '</div>\n' + '</div>\n' + '<div class="footnote">\n' + '<hr />\n' + '<ol>\n' + '<li id="fn:1">\n' + '<p>The footnote. ' + '<a class="footnote-backref" href="#fnref:1" title="Jump back to footnote 1 in the text">↩</a>' + '</p>\n' + '</li>\n' + '</ol>\n' + '</div>', + extensions=['md_in_html', 'footnotes'] + ) + + +def load_tests(loader, tests, pattern): + ''' Ensure TestHTMLBlocks doesn't get run twice by excluding it here. ''' + suite = TestSuite() + for test_class in [TestDefaultwMdInHTML, TestMdInHTML, TestMarkdownInHTMLPostProcessor]: + tests = loader.loadTestsFromTestCase(test_class) + suite.addTests(tests) + return suite diff --git a/tests/test_syntax/extensions/test_smarty.py b/tests/test_syntax/extensions/test_smarty.py new file mode 100644 index 0000000..fc635ad --- /dev/null +++ b/tests/test_syntax/extensions/test_smarty.py @@ -0,0 +1,36 @@ +# -*- coding: utf-8 -*- +""" +Python Markdown + +A Python implementation of John Gruber's Markdown. + +Documentation: https://python-markdown.github.io/ +GitHub: https://github.com/Python-Markdown/markdown/ +PyPI: https://pypi.org/project/Markdown/ + +Started by Manfred Stienstra (http://www.dwerg.net/). +Maintained for a few years by Yuri Takhteyev (http://www.freewisdom.org). +Currently maintained by Waylan Limberg (https://github.com/waylan), +Dmitry Shachnev (https://github.com/mitya57) and Isaac Muse (https://github.com/facelessuser). + +Copyright 2007-2022 The Python Markdown Project (v. 1.7 and later) +Copyright 2004, 2005, 2006 Yuri Takhteyev (v. 0.2-1.6b) +Copyright 2004 Manfred Stienstra (the original version) + +License: BSD (see LICENSE.md for details). +""" + +from markdown.test_tools import TestCase + + +class TestSmarty(TestCase): + + default_kwargs = {'extensions': ['smarty']} + + def test_escaped_attr(self): + self.assertMarkdownRenders( + '![x\"x](x)', + '<p><img alt="x"x" src="x" /></p>' + ) + + # TODO: Move rest of smarty tests here. diff --git a/tests/test_syntax/extensions/test_tables.py b/tests/test_syntax/extensions/test_tables.py new file mode 100644 index 0000000..cd3fbe4 --- /dev/null +++ b/tests/test_syntax/extensions/test_tables.py @@ -0,0 +1,922 @@ +""" +Python Markdown + +A Python implementation of John Gruber's Markdown. + +Documentation: https://python-markdown.github.io/ +GitHub: https://github.com/Python-Markdown/markdown/ +PyPI: https://pypi.org/project/Markdown/ + +Started by Manfred Stienstra (http://www.dwerg.net/). +Maintained for a few years by Yuri Takhteyev (http://www.freewisdom.org). +Currently maintained by Waylan Limberg (https://github.com/waylan), +Dmitry Shachnev (https://github.com/mitya57) and Isaac Muse (https://github.com/facelessuser). + +Copyright 2007-2018 The Python Markdown Project (v. 1.7 and later) +Copyright 2004, 2005, 2006 Yuri Takhteyev (v. 0.2-1.6b) +Copyright 2004 Manfred Stienstra (the original version) + +License: BSD (see LICENSE.md for details). +""" + +from markdown.test_tools import TestCase +from markdown.extensions.tables import TableExtension + + +class TestTableBlocks(TestCase): + + def test_empty_cells(self): + """Empty cells (nbsp).""" + + text = """ + | Second Header +------------- | ------------- + | Content Cell +Content Cell | +""" + + self.assertMarkdownRenders( + text, + self.dedent( + """ + <table> + <thead> + <tr> + <th> </th> + <th>Second Header</th> + </tr> + </thead> + <tbody> + <tr> + <td> </td> + <td>Content Cell</td> + </tr> + <tr> + <td>Content Cell</td> + <td> </td> + </tr> + </tbody> + </table> + """ + ), + extensions=['tables'] + ) + + def test_no_sides(self): + self.assertMarkdownRenders( + self.dedent( + """ + First Header | Second Header + ------------- | ------------- + Content Cell | Content Cell + Content Cell | Content Cell + """ + ), + self.dedent( + """ + <table> + <thead> + <tr> + <th>First Header</th> + <th>Second Header</th> + </tr> + </thead> + <tbody> + <tr> + <td>Content Cell</td> + <td>Content Cell</td> + </tr> + <tr> + <td>Content Cell</td> + <td>Content Cell</td> + </tr> + </tbody> + </table> + """ + ), + extensions=['tables'] + ) + + def test_both_sides(self): + self.assertMarkdownRenders( + self.dedent( + """ + | First Header | Second Header | + | ------------- | ------------- | + | Content Cell | Content Cell | + | Content Cell | Content Cell | + """ + ), + self.dedent( + """ + <table> + <thead> + <tr> + <th>First Header</th> + <th>Second Header</th> + </tr> + </thead> + <tbody> + <tr> + <td>Content Cell</td> + <td>Content Cell</td> + </tr> + <tr> + <td>Content Cell</td> + <td>Content Cell</td> + </tr> + </tbody> + </table> + """ + ), + extensions=['tables'] + ) + + def test_align_columns(self): + self.assertMarkdownRenders( + self.dedent( + """ + | Item | Value | + | :-------- | -----:| + | Computer | $1600 | + | Phone | $12 | + | Pipe | $1 | + """ + ), + self.dedent( + """ + <table> + <thead> + <tr> + <th style="text-align: left;">Item</th> + <th style="text-align: right;">Value</th> + </tr> + </thead> + <tbody> + <tr> + <td style="text-align: left;">Computer</td> + <td style="text-align: right;">$1600</td> + </tr> + <tr> + <td style="text-align: left;">Phone</td> + <td style="text-align: right;">$12</td> + </tr> + <tr> + <td style="text-align: left;">Pipe</td> + <td style="text-align: right;">$1</td> + </tr> + </tbody> + </table> + """ + ), + extensions=['tables'] + ) + + def test_styles_in_tables(self): + self.assertMarkdownRenders( + self.dedent( + """ + | Function name | Description | + | ------------- | ------------------------------ | + | `help()` | Display the help window. | + | `destroy()` | **Destroy your computer!** | + """ + ), + self.dedent( + """ + <table> + <thead> + <tr> + <th>Function name</th> + <th>Description</th> + </tr> + </thead> + <tbody> + <tr> + <td><code>help()</code></td> + <td>Display the help window.</td> + </tr> + <tr> + <td><code>destroy()</code></td> + <td><strong>Destroy your computer!</strong></td> + </tr> + </tbody> + </table> + """ + ), + extensions=['tables'] + ) + + def test_align_three(self): + self.assertMarkdownRenders( + self.dedent( + """ + |foo|bar|baz| + |:--|:-:|--:| + | | Q | | + |W | | W| + """ + ), + self.dedent( + """ + <table> + <thead> + <tr> + <th style="text-align: left;">foo</th> + <th style="text-align: center;">bar</th> + <th style="text-align: right;">baz</th> + </tr> + </thead> + <tbody> + <tr> + <td style="text-align: left;"></td> + <td style="text-align: center;">Q</td> + <td style="text-align: right;"></td> + </tr> + <tr> + <td style="text-align: left;">W</td> + <td style="text-align: center;"></td> + <td style="text-align: right;">W</td> + </tr> + </tbody> + </table> + """ + ), + extensions=['tables'] + ) + + def test_three_columns(self): + self.assertMarkdownRenders( + self.dedent( + """ + foo|bar|baz + ---|---|--- + | Q | + W | | W + """ + ), + self.dedent( + """ + <table> + <thead> + <tr> + <th>foo</th> + <th>bar</th> + <th>baz</th> + </tr> + </thead> + <tbody> + <tr> + <td></td> + <td>Q</td> + <td></td> + </tr> + <tr> + <td>W</td> + <td></td> + <td>W</td> + </tr> + </tbody> + </table> + """ + ), + extensions=['tables'] + ) + + def test_three_spaces_prefix(self): + self.assertMarkdownRenders( + self.dedent( + """ + Three spaces in front of a table: + + First Header | Second Header + ------------ | ------------- + Content Cell | Content Cell + Content Cell | Content Cell + + | First Header | Second Header | + | ------------ | ------------- | + | Content Cell | Content Cell | + | Content Cell | Content Cell | + """), + self.dedent( + """ + <p>Three spaces in front of a table:</p> + <table> + <thead> + <tr> + <th>First Header</th> + <th>Second Header</th> + </tr> + </thead> + <tbody> + <tr> + <td>Content Cell</td> + <td>Content Cell</td> + </tr> + <tr> + <td>Content Cell</td> + <td>Content Cell</td> + </tr> + </tbody> + </table> + <table> + <thead> + <tr> + <th>First Header</th> + <th>Second Header</th> + </tr> + </thead> + <tbody> + <tr> + <td>Content Cell</td> + <td>Content Cell</td> + </tr> + <tr> + <td>Content Cell</td> + <td>Content Cell</td> + </tr> + </tbody> + </table> + """ + ), + extensions=['tables'] + ) + + def test_code_block_table(self): + self.assertMarkdownRenders( + self.dedent( + """ + Four spaces is a code block: + + First Header | Second Header + ------------ | ------------- + Content Cell | Content Cell + Content Cell | Content Cell + + | First Header | Second Header | + | ------------ | ------------- | + """), + self.dedent( + """ + <p>Four spaces is a code block:</p> + <pre><code>First Header | Second Header + ------------ | ------------- + Content Cell | Content Cell + Content Cell | Content Cell + </code></pre> + <table> + <thead> + <tr> + <th>First Header</th> + <th>Second Header</th> + </tr> + </thead> + <tbody> + <tr> + <td></td> + <td></td> + </tr> + </tbody> + </table> + """ + ), + extensions=['tables'] + ) + + def test_inline_code_blocks(self): + self.assertMarkdownRenders( + self.dedent( + """ + More inline code block tests + + Column 1 | Column 2 | Column 3 + ---------|----------|--------- + word 1 | word 2 | word 3 + word 1 | `word 2` | word 3 + word 1 | \\`word 2 | word 3 + word 1 | `word 2 | word 3 + word 1 | `word |2` | word 3 + words |`` some | code `` | more words + words |``` some | code ``` | more words + words |```` some | code ```` | more words + words |`` some ` | ` code `` | more words + words |``` some ` | ` code ``` | more words + words |```` some ` | ` code ```` | more words + """), + self.dedent( + """ + <p>More inline code block tests</p> + <table> + <thead> + <tr> + <th>Column 1</th> + <th>Column 2</th> + <th>Column 3</th> + </tr> + </thead> + <tbody> + <tr> + <td>word 1</td> + <td>word 2</td> + <td>word 3</td> + </tr> + <tr> + <td>word 1</td> + <td><code>word 2</code></td> + <td>word 3</td> + </tr> + <tr> + <td>word 1</td> + <td>`word 2</td> + <td>word 3</td> + </tr> + <tr> + <td>word 1</td> + <td>`word 2</td> + <td>word 3</td> + </tr> + <tr> + <td>word 1</td> + <td><code>word |2</code></td> + <td>word 3</td> + </tr> + <tr> + <td>words</td> + <td><code>some | code</code></td> + <td>more words</td> + </tr> + <tr> + <td>words</td> + <td><code>some | code</code></td> + <td>more words</td> + </tr> + <tr> + <td>words</td> + <td><code>some | code</code></td> + <td>more words</td> + </tr> + <tr> + <td>words</td> + <td><code>some ` | ` code</code></td> + <td>more words</td> + </tr> + <tr> + <td>words</td> + <td><code>some ` | ` code</code></td> + <td>more words</td> + </tr> + <tr> + <td>words</td> + <td><code>some ` | ` code</code></td> + <td>more words</td> + </tr> + </tbody> + </table> + """ + ), + extensions=['tables'] + ) + + def test_issue_440(self): + self.assertMarkdownRenders( + self.dedent( + """ + A test for issue #440: + + foo | bar + --- | --- + foo | (`bar`) and `baz`. + """), + self.dedent( + """ + <p>A test for issue #440:</p> + <table> + <thead> + <tr> + <th>foo</th> + <th>bar</th> + </tr> + </thead> + <tbody> + <tr> + <td>foo</td> + <td>(<code>bar</code>) and <code>baz</code>.</td> + </tr> + </tbody> + </table> + """ + ), + extensions=['tables'] + ) + + def test_lists_not_tables(self): + self.assertMarkdownRenders( + self.dedent( + """ + Lists are not tables + + - this | should | not + - be | a | table + """), + self.dedent( + """ + <p>Lists are not tables</p> + <ul> + <li>this | should | not</li> + <li>be | a | table</li> + </ul> + """ + ), + extensions=['tables'] + ) + + def test_issue_449(self): + self.assertMarkdownRenders( + self.dedent( + r""" + Add tests for issue #449 + + Odd backticks | Even backticks + ------------ | ------------- + ``[!\"\#$%&'()*+,\-./:;<=>?@\[\\\]^_`{|}~]`` | ``[!\"\#$%&'()*+,\-./:;<=>?@\[\\\]^`_`{|}~]`` + + Escapes | More Escapes + ------- | ------ + `` `\`` | `\` + + Only the first backtick can be escaped + + Escaped | Bacticks + ------- | ------ + \`` \` | \`\` + + Test escaped pipes + + Column 1 | Column 2 + -------- | -------- + `|` \| | Pipes are okay in code and escaped. \| + + | Column 1 | Column 2 | + | -------- | -------- | + | row1 | row1 \| + | row2 | row2 | + + Test header escapes + + | `` `\`` \| | `\` \| + | ---------- | ---- | + | row1 | row1 | + | row2 | row2 | + + Escaped pipes in format row should not be a table + + | Column1 | Column2 | + | ------- \|| ------- | + | row1 | row1 | + | row2 | row2 | + + Test escaped code in Table + + Should not be code | Should be code + ------------------ | -------------- + \`Not code\` | \\`code` + \\\`Not code\\\` | \\\\`code` + """), + self.dedent( + """ + <p>Add tests for issue #449</p> + <table> + <thead> + <tr> + <th>Odd backticks</th> + <th>Even backticks</th> + </tr> + </thead> + <tbody> + <tr> + <td><code>[!\\"\\#$%&'()*+,\\-./:;<=>?@\\[\\\\\\]^_`{|}~]</code></td> + <td><code>[!\\"\\#$%&'()*+,\\-./:;<=>?@\\[\\\\\\]^`_`{|}~]</code></td> + </tr> + </tbody> + </table> + <table> + <thead> + <tr> + <th>Escapes</th> + <th>More Escapes</th> + </tr> + </thead> + <tbody> + <tr> + <td><code>`\\</code></td> + <td><code>\\</code></td> + </tr> + </tbody> + </table> + <p>Only the first backtick can be escaped</p> + <table> + <thead> + <tr> + <th>Escaped</th> + <th>Bacticks</th> + </tr> + </thead> + <tbody> + <tr> + <td>`<code>\\</code></td> + <td>``</td> + </tr> + </tbody> + </table> + <p>Test escaped pipes</p> + <table> + <thead> + <tr> + <th>Column 1</th> + <th>Column 2</th> + </tr> + </thead> + <tbody> + <tr> + <td><code>|</code> |</td> + <td>Pipes are okay in code and escaped. |</td> + </tr> + </tbody> + </table> + <table> + <thead> + <tr> + <th>Column 1</th> + <th>Column 2</th> + </tr> + </thead> + <tbody> + <tr> + <td>row1</td> + <td>row1 |</td> + </tr> + <tr> + <td>row2</td> + <td>row2</td> + </tr> + </tbody> + </table> + <p>Test header escapes</p> + <table> + <thead> + <tr> + <th><code>`\\</code> |</th> + <th><code>\\</code> |</th> + </tr> + </thead> + <tbody> + <tr> + <td>row1</td> + <td>row1</td> + </tr> + <tr> + <td>row2</td> + <td>row2</td> + </tr> + </tbody> + </table> + <p>Escaped pipes in format row should not be a table</p> + <p>| Column1 | Column2 | + | ------- || ------- | + | row1 | row1 | + | row2 | row2 |</p> + <p>Test escaped code in Table</p> + <table> + <thead> + <tr> + <th>Should not be code</th> + <th>Should be code</th> + </tr> + </thead> + <tbody> + <tr> + <td>`Not code`</td> + <td>\\<code>code</code></td> + </tr> + <tr> + <td>\\`Not code\\`</td> + <td>\\\\<code>code</code></td> + </tr> + </tbody> + </table> + """ + ), + extensions=['tables'] + ) + + def test_single_column_tables(self): + self.assertMarkdownRenders( + self.dedent( + """ + Single column tables + + | Is a Table | + | ---------- | + + | Is a Table + | ---------- + + Is a Table | + ---------- | + + | Is a Table | + | ---------- | + | row | + + | Is a Table + | ---------- + | row + + Is a Table | + ---------- | + row | + + | Is not a Table + -------------- + | row + + Is not a Table | + -------------- + row | + + | Is not a Table + | -------------- + row + + Is not a Table | + -------------- | + row + """), + self.dedent( + """ + <p>Single column tables</p> + <table> + <thead> + <tr> + <th>Is a Table</th> + </tr> + </thead> + <tbody> + <tr> + <td></td> + </tr> + </tbody> + </table> + <table> + <thead> + <tr> + <th>Is a Table</th> + </tr> + </thead> + <tbody> + <tr> + <td></td> + </tr> + </tbody> + </table> + <table> + <thead> + <tr> + <th>Is a Table</th> + </tr> + </thead> + <tbody> + <tr> + <td></td> + </tr> + </tbody> + </table> + <table> + <thead> + <tr> + <th>Is a Table</th> + </tr> + </thead> + <tbody> + <tr> + <td>row</td> + </tr> + </tbody> + </table> + <table> + <thead> + <tr> + <th>Is a Table</th> + </tr> + </thead> + <tbody> + <tr> + <td>row</td> + </tr> + </tbody> + </table> + <table> + <thead> + <tr> + <th>Is a Table</th> + </tr> + </thead> + <tbody> + <tr> + <td>row</td> + </tr> + </tbody> + </table> + <h2>| Is not a Table</h2> + <p>| row</p> + <h2>Is not a Table |</h2> + <p>row |</p> + <p>| Is not a Table + | -------------- + row</p> + <p>Is not a Table | + -------------- | + row</p> + """ + ), + extensions=['tables'] + ) + + def test_align_columns_legacy(self): + self.assertMarkdownRenders( + self.dedent( + """ + | Item | Value | + | :-------- | -----:| + | Computer | $1600 | + | Phone | $12 | + | Pipe | $1 | + """ + ), + self.dedent( + """ + <table> + <thead> + <tr> + <th align="left">Item</th> + <th align="right">Value</th> + </tr> + </thead> + <tbody> + <tr> + <td align="left">Computer</td> + <td align="right">$1600</td> + </tr> + <tr> + <td align="left">Phone</td> + <td align="right">$12</td> + </tr> + <tr> + <td align="left">Pipe</td> + <td align="right">$1</td> + </tr> + </tbody> + </table> + """ + ), + extensions=[TableExtension(use_align_attribute=True)] + ) + + def test_align_three_legacy(self): + self.assertMarkdownRenders( + self.dedent( + """ + |foo|bar|baz| + |:--|:-:|--:| + | | Q | | + |W | | W| + """ + ), + self.dedent( + """ + <table> + <thead> + <tr> + <th align="left">foo</th> + <th align="center">bar</th> + <th align="right">baz</th> + </tr> + </thead> + <tbody> + <tr> + <td align="left"></td> + <td align="center">Q</td> + <td align="right"></td> + </tr> + <tr> + <td align="left">W</td> + <td align="center"></td> + <td align="right">W</td> + </tr> + </tbody> + </table> + """ + ), + extensions=[TableExtension(use_align_attribute=True)] + ) diff --git a/tests/test_syntax/extensions/test_toc.py b/tests/test_syntax/extensions/test_toc.py new file mode 100644 index 0000000..d879f6e --- /dev/null +++ b/tests/test_syntax/extensions/test_toc.py @@ -0,0 +1,614 @@ +""" +Python Markdown + +A Python implementation of John Gruber's Markdown. + +Documentation: https://python-markdown.github.io/ +GitHub: https://github.com/Python-Markdown/markdown/ +PyPI: https://pypi.org/project/Markdown/ + +Started by Manfred Stienstra (http://www.dwerg.net/). +Maintained for a few years by Yuri Takhteyev (http://www.freewisdom.org). +Currently maintained by Waylan Limberg (https://github.com/waylan), +Dmitry Shachnev (https://github.com/mitya57) and Isaac Muse (https://github.com/facelessuser). + +Copyright 2007-2019 The Python Markdown Project (v. 1.7 and later) +Copyright 2004, 2005, 2006 Yuri Takhteyev (v. 0.2-1.6b) +Copyright 2004 Manfred Stienstra (the original version) + +License: BSD (see LICENSE.md for details). +""" + +from markdown.test_tools import TestCase +from markdown.extensions.toc import TocExtension +from markdown.extensions.nl2br import Nl2BrExtension + + +class TestTOC(TestCase): + maxDiff = None + + # TODO: Move the rest of the TOC tests here. + + def testAnchorLink(self): + self.assertMarkdownRenders( + self.dedent( + ''' + # Header 1 + + ## Header *2* + ''' + ), + self.dedent( + ''' + <h1 id="header-1"><a class="toclink" href="#header-1">Header 1</a></h1> + <h2 id="header-2"><a class="toclink" href="#header-2">Header <em>2</em></a></h2> + ''' + ), + extensions=[TocExtension(anchorlink=True)] + ) + + def testAnchorLinkWithSingleInlineCode(self): + self.assertMarkdownRenders( + '# This is `code`.', + '<h1 id="this-is-code">' # noqa + '<a class="toclink" href="#this-is-code">' # noqa + 'This is <code>code</code>.' # noqa + '</a>' # noqa + '</h1>', # noqa + extensions=[TocExtension(anchorlink=True)] + ) + + def testAnchorLinkWithDoubleInlineCode(self): + self.assertMarkdownRenders( + '# This is `code` and `this` too.', + '<h1 id="this-is-code-and-this-too">' # noqa + '<a class="toclink" href="#this-is-code-and-this-too">' # noqa + 'This is <code>code</code> and <code>this</code> too.' # noqa + '</a>' # noqa + '</h1>', # noqa + extensions=[TocExtension(anchorlink=True)] + ) + + def testPermalink(self): + self.assertMarkdownRenders( + '# Header', + '<h1 id="header">' # noqa + 'Header' # noqa + '<a class="headerlink" href="#header" title="Permanent link">¶</a>' # noqa + '</h1>', # noqa + extensions=[TocExtension(permalink=True)] + ) + + def testPermalinkWithSingleInlineCode(self): + self.assertMarkdownRenders( + '# This is `code`.', + '<h1 id="this-is-code">' # noqa + 'This is <code>code</code>.' # noqa + '<a class="headerlink" href="#this-is-code" title="Permanent link">¶</a>' # noqa + '</h1>', # noqa + extensions=[TocExtension(permalink=True)] + ) + + def testPermalinkWithDoubleInlineCode(self): + self.assertMarkdownRenders( + '# This is `code` and `this` too.', + '<h1 id="this-is-code-and-this-too">' # noqa + 'This is <code>code</code> and <code>this</code> too.' # noqa + '<a class="headerlink" href="#this-is-code-and-this-too" title="Permanent link">¶</a>' # noqa + '</h1>', # noqa + extensions=[TocExtension(permalink=True)] + ) + + def testMinMaxLevel(self): + self.assertMarkdownRenders( + self.dedent( + ''' + # Header 1 not in TOC + + ## Header 2 not in TOC + + ### Header 3 + + #### Header 4 + + ##### Header 5 not in TOC + ''' + ), + self.dedent( + ''' + <h1 id="header-1-not-in-toc">Header 1 not in TOC</h1> + <h2 id="header-2-not-in-toc">Header 2 not in TOC</h2> + <h3 id="header-3">Header 3</h3> + <h4 id="header-4">Header 4</h4> + <h5 id="header-5-not-in-toc">Header 5 not in TOC</h5> + ''' + ), + expected_attrs={ + 'toc': ( + '<div class="toc">\n' + '<ul>\n' # noqa + '<li><a href="#header-3">Header 3</a>' # noqa + '<ul>\n' # noqa + '<li><a href="#header-4">Header 4</a></li>\n' # noqa + '</ul>\n' # noqa + '</li>\n' # noqa + '</ul>\n' # noqa + '</div>\n' # noqa + ), + 'toc_tokens': [ + { + 'level': 3, + 'id': 'header-3', + 'name': 'Header 3', + 'children': [ + { + 'level': 4, + 'id': 'header-4', + 'name': 'Header 4', + 'children': [] + } + ] + } + ] + }, + extensions=[TocExtension(toc_depth='3-4')] + ) + + def testMaxLevel(self): + self.assertMarkdownRenders( + self.dedent( + ''' + # Header 1 + + ## Header 2 + + ### Header 3 not in TOC + ''' + ), + self.dedent( + ''' + <h1 id="header-1">Header 1</h1> + <h2 id="header-2">Header 2</h2> + <h3 id="header-3-not-in-toc">Header 3 not in TOC</h3> + ''' + ), + expected_attrs={ + 'toc': ( + '<div class="toc">\n' + '<ul>\n' # noqa + '<li><a href="#header-1">Header 1</a>' # noqa + '<ul>\n' # noqa + '<li><a href="#header-2">Header 2</a></li>\n' # noqa + '</ul>\n' # noqa + '</li>\n' # noqa + '</ul>\n' # noqa + '</div>\n' # noqa + ), + 'toc_tokens': [ + { + 'level': 1, + 'id': 'header-1', + 'name': 'Header 1', + 'children': [ + { + 'level': 2, + 'id': 'header-2', + 'name': 'Header 2', + 'children': [] + } + ] + } + ] + }, + extensions=[TocExtension(toc_depth=2)] + ) + + def testMinMaxLevelwithAnchorLink(self): + self.assertMarkdownRenders( + self.dedent( + ''' + # Header 1 not in TOC + + ## Header 2 not in TOC + + ### Header 3 + + #### Header 4 + + ##### Header 5 not in TOC + ''' + ), + '<h1 id="header-1-not-in-toc">' # noqa + '<a class="toclink" href="#header-1-not-in-toc">Header 1 not in TOC</a></h1>\n' # noqa + '<h2 id="header-2-not-in-toc">' # noqa + '<a class="toclink" href="#header-2-not-in-toc">Header 2 not in TOC</a></h2>\n' # noqa + '<h3 id="header-3">' # noqa + '<a class="toclink" href="#header-3">Header 3</a></h3>\n' # noqa + '<h4 id="header-4">' # noqa + '<a class="toclink" href="#header-4">Header 4</a></h4>\n' # noqa + '<h5 id="header-5-not-in-toc">' # noqa + '<a class="toclink" href="#header-5-not-in-toc">Header 5 not in TOC</a></h5>', # noqa + expected_attrs={ + 'toc': ( + '<div class="toc">\n' + '<ul>\n' # noqa + '<li><a href="#header-3">Header 3</a>' # noqa + '<ul>\n' # noqa + '<li><a href="#header-4">Header 4</a></li>\n' # noqa + '</ul>\n' # noqa + '</li>\n' # noqa + '</ul>\n' # noqa + '</div>\n' # noqa + ), + 'toc_tokens': [ + { + 'level': 3, + 'id': 'header-3', + 'name': 'Header 3', + 'children': [ + { + 'level': 4, + 'id': 'header-4', + 'name': 'Header 4', + 'children': [] + } + ] + } + ] + }, + extensions=[TocExtension(toc_depth='3-4', anchorlink=True)] + ) + + def testMinMaxLevelwithPermalink(self): + self.assertMarkdownRenders( + self.dedent( + ''' + # Header 1 not in TOC + + ## Header 2 not in TOC + + ### Header 3 + + #### Header 4 + + ##### Header 5 not in TOC + ''' + ), + '<h1 id="header-1-not-in-toc">Header 1 not in TOC' # noqa + '<a class="headerlink" href="#header-1-not-in-toc" title="Permanent link">¶</a></h1>\n' # noqa + '<h2 id="header-2-not-in-toc">Header 2 not in TOC' # noqa + '<a class="headerlink" href="#header-2-not-in-toc" title="Permanent link">¶</a></h2>\n' # noqa + '<h3 id="header-3">Header 3' # noqa + '<a class="headerlink" href="#header-3" title="Permanent link">¶</a></h3>\n' # noqa + '<h4 id="header-4">Header 4' # noqa + '<a class="headerlink" href="#header-4" title="Permanent link">¶</a></h4>\n' # noqa + '<h5 id="header-5-not-in-toc">Header 5 not in TOC' # noqa + '<a class="headerlink" href="#header-5-not-in-toc" title="Permanent link">¶</a></h5>', # noqa + expected_attrs={ + 'toc': ( + '<div class="toc">\n' + '<ul>\n' # noqa + '<li><a href="#header-3">Header 3</a>' # noqa + '<ul>\n' # noqa + '<li><a href="#header-4">Header 4</a></li>\n' # noqa + '</ul>\n' # noqa + '</li>\n' # noqa + '</ul>\n' # noqa + '</div>\n' # noqa + ), + 'toc_tokens': [ + { + 'level': 3, + 'id': 'header-3', + 'name': 'Header 3', + 'children': [ + { + 'level': 4, + 'id': 'header-4', + 'name': 'Header 4', + 'children': [] + } + ] + } + ] + }, + extensions=[TocExtension(toc_depth='3-4', permalink=True)] + ) + + def testMinMaxLevelwithBaseLevel(self): + self.assertMarkdownRenders( + self.dedent( + ''' + # First Header + + ## Second Level + + ### Third Level + + #### Forth Level + ''' + ), + self.dedent( + ''' + <h3 id="first-header">First Header</h3> + <h4 id="second-level">Second Level</h4> + <h5 id="third-level">Third Level</h5> + <h6 id="forth-level">Forth Level</h6> + ''' + ), + expected_attrs={ + 'toc': ( + '<div class="toc">\n' + '<ul>\n' # noqa + '<li><a href="#second-level">Second Level</a>' # noqa + '<ul>\n' # noqa + '<li><a href="#third-level">Third Level</a></li>\n' # noqa + '</ul>\n' # noqa + '</li>\n' # noqa + '</ul>\n' # noqa + '</div>\n' # noqa + ), + 'toc_tokens': [ + { + 'level': 4, + 'id': 'second-level', + 'name': 'Second Level', + 'children': [ + { + 'level': 5, + 'id': 'third-level', + 'name': 'Third Level', + 'children': [] + } + ] + } + ] + }, + extensions=[TocExtension(toc_depth='4-5', baselevel=3)] + ) + + def testMaxLevelwithBaseLevel(self): + self.assertMarkdownRenders( + self.dedent( + ''' + # Some Header + + ## Next Level + + ### Too High + ''' + ), + self.dedent( + ''' + <h2 id="some-header">Some Header</h2> + <h3 id="next-level">Next Level</h3> + <h4 id="too-high">Too High</h4> + ''' + ), + expected_attrs={ + 'toc': ( + '<div class="toc">\n' + '<ul>\n' # noqa + '<li><a href="#some-header">Some Header</a>' # noqa + '<ul>\n' # noqa + '<li><a href="#next-level">Next Level</a></li>\n' # noqa + '</ul>\n' # noqa + '</li>\n' # noqa + '</ul>\n' # noqa + '</div>\n' # noqa + ), + 'toc_tokens': [ + { + 'level': 2, + 'id': 'some-header', + 'name': 'Some Header', + 'children': [ + { + 'level': 3, + 'id': 'next-level', + 'name': 'Next Level', + 'children': [] + } + ] + } + ] + }, + extensions=[TocExtension(toc_depth=3, baselevel=2)] + ) + + def test_escaped_code(self): + self.assertMarkdownRenders( + self.dedent( + ''' + [TOC] + + # `<test>` + ''' + ), + self.dedent( + ''' + <div class="toc"> + <ul> + <li><a href="#test"><test></a></li> + </ul> + </div> + <h1 id="test"><code><test></code></h1> + ''' + ), + extensions=['toc'] + ) + + def test_escaped_char_in_id(self): + self.assertMarkdownRenders( + r'# escaped\_character', + '<h1 id="escaped_character">escaped_character</h1>', + extensions=['toc'] + ) + + def testAnchorLinkWithCustomClass(self): + self.assertMarkdownRenders( + self.dedent( + ''' + # Header 1 + + ## Header *2* + ''' + ), + self.dedent( + ''' + <h1 id="header-1"><a class="custom" href="#header-1">Header 1</a></h1> + <h2 id="header-2"><a class="custom" href="#header-2">Header <em>2</em></a></h2> + ''' + ), + extensions=[TocExtension(anchorlink=True, anchorlink_class="custom")] + ) + + def testAnchorLinkWithCustomClasses(self): + self.assertMarkdownRenders( + self.dedent( + ''' + # Header 1 + + ## Header *2* + ''' + ), + self.dedent( + ''' + <h1 id="header-1"><a class="custom1 custom2" href="#header-1">Header 1</a></h1> + <h2 id="header-2"><a class="custom1 custom2" href="#header-2">Header <em>2</em></a></h2> + ''' + ), + extensions=[TocExtension(anchorlink=True, anchorlink_class="custom1 custom2")] + ) + + def testPermalinkWithEmptyText(self): + self.assertMarkdownRenders( + '# Header', + '<h1 id="header">' # noqa + 'Header' # noqa + '<a class="headerlink" href="#header" title="Permanent link"></a>' # noqa + '</h1>', # noqa + extensions=[TocExtension(permalink="")] + ) + + def testPermalinkWithCustomClass(self): + self.assertMarkdownRenders( + '# Header', + '<h1 id="header">' # noqa + 'Header' # noqa + '<a class="custom" href="#header" title="Permanent link">¶</a>' # noqa + '</h1>', # noqa + extensions=[TocExtension(permalink=True, permalink_class="custom")] + ) + + def testPermalinkWithCustomClasses(self): + self.assertMarkdownRenders( + '# Header', + '<h1 id="header">' # noqa + 'Header' # noqa + '<a class="custom1 custom2" href="#header" title="Permanent link">¶</a>' # noqa + '</h1>', # noqa + extensions=[TocExtension(permalink=True, permalink_class="custom1 custom2")] + ) + + def testPermalinkWithCustomTitle(self): + self.assertMarkdownRenders( + '# Header', + '<h1 id="header">' # noqa + 'Header' # noqa + '<a class="headerlink" href="#header" title="custom">¶</a>' # noqa + '</h1>', # noqa + extensions=[TocExtension(permalink=True, permalink_title="custom")] + ) + + def testPermalinkWithEmptyTitle(self): + self.assertMarkdownRenders( + '# Header', + '<h1 id="header">' # noqa + 'Header' # noqa + '<a class="headerlink" href="#header">¶</a>' # noqa + '</h1>', # noqa + extensions=[TocExtension(permalink=True, permalink_title="")] + ) + + def testPermalinkWithUnicodeInID(self): + from markdown.extensions.toc import slugify_unicode + self.assertMarkdownRenders( + '# Unicode ヘッダー', + '<h1 id="unicode-ヘッダー">' # noqa + 'Unicode ヘッダー' # noqa + '<a class="headerlink" href="#unicode-ヘッダー" title="Permanent link">¶</a>' # noqa + '</h1>', # noqa + extensions=[TocExtension(permalink=True, slugify=slugify_unicode)] + ) + + def testPermalinkWithUnicodeTitle(self): + from markdown.extensions.toc import slugify_unicode + self.assertMarkdownRenders( + '# Unicode ヘッダー', + '<h1 id="unicode-ヘッダー">' # noqa + 'Unicode ヘッダー' # noqa + '<a class="headerlink" href="#unicode-ヘッダー" title="パーマリンク">¶</a>' # noqa + '</h1>', # noqa + extensions=[TocExtension(permalink=True, permalink_title="パーマリンク", slugify=slugify_unicode)] + ) + + def testPermalinkWithExtendedLatinInID(self): + self.assertMarkdownRenders( + '# Théâtre', + '<h1 id="theatre">' # noqa + 'Théâtre' # noqa + '<a class="headerlink" href="#theatre" title="Permanent link">¶</a>' # noqa + '</h1>', # noqa + extensions=[TocExtension(permalink=True)] + ) + + def testNl2brCompatibility(self): + self.assertMarkdownRenders( + '[TOC]\ntext', + '<p>[TOC]<br />\ntext</p>', + extensions=[TocExtension(), Nl2BrExtension()] + ) + + def testTOCWithCustomClass(self): + + self.assertMarkdownRenders( + self.dedent( + ''' + [TOC] + # Header + ''' + ), + self.dedent( + ''' + <div class="custom"> + <ul> + <li><a href="#header">Header</a></li> + </ul> + </div> + <h1 id="header">Header</h1> + ''' + ), + extensions=[TocExtension(toc_class="custom")] + ) + + def testTOCWithCustomClasses(self): + self.assertMarkdownRenders( + self.dedent( + ''' + [TOC] + # Header + ''' + ), + self.dedent( + ''' + <div class="custom1 custom2"> + <ul> + <li><a href="#header">Header</a></li> + </ul> + </div> + <h1 id="header">Header</h1> + ''' + ), + extensions=[TocExtension(toc_class="custom1 custom2")] + ) diff --git a/tests/test_syntax/inline/__init__.py b/tests/test_syntax/inline/__init__.py new file mode 100644 index 0000000..564ba3b --- /dev/null +++ b/tests/test_syntax/inline/__init__.py @@ -0,0 +1,20 @@ +""" +Python Markdown + +A Python implementation of John Gruber's Markdown. + +Documentation: https://python-markdown.github.io/ +GitHub: https://github.com/Python-Markdown/markdown/ +PyPI: https://pypi.org/project/Markdown/ + +Started by Manfred Stienstra (http://www.dwerg.net/). +Maintained for a few years by Yuri Takhteyev (http://www.freewisdom.org). +Currently maintained by Waylan Limberg (https://github.com/waylan), +Dmitry Shachnev (https://github.com/mitya57) and Isaac Muse (https://github.com/facelessuser). + +Copyright 2007-2018 The Python Markdown Project (v. 1.7 and later) +Copyright 2004, 2005, 2006 Yuri Takhteyev (v. 0.2-1.6b) +Copyright 2004 Manfred Stienstra (the original version) + +License: BSD (see LICENSE.md for details). +""" diff --git a/tests/test_syntax/inline/test_autolinks.py b/tests/test_syntax/inline/test_autolinks.py new file mode 100644 index 0000000..b6bd1cf --- /dev/null +++ b/tests/test_syntax/inline/test_autolinks.py @@ -0,0 +1,63 @@ +""" +Python Markdown + +A Python implementation of John Gruber's Markdown. + +Documentation: https://python-markdown.github.io/ +GitHub: https://github.com/Python-Markdown/markdown/ +PyPI: https://pypi.org/project/Markdown/ + +Started by Manfred Stienstra (http://www.dwerg.net/). +Maintained for a few years by Yuri Takhteyev (http://www.freewisdom.org). +Currently maintained by Waylan Limberg (https://github.com/waylan), +Dmitry Shachnev (https://github.com/mitya57) and Isaac Muse (https://github.com/facelessuser). + +Copyright 2007-2021 The Python Markdown Project (v. 1.7 and later) +Copyright 2004, 2005, 2006 Yuri Takhteyev (v. 0.2-1.6b) +Copyright 2004 Manfred Stienstra (the original version) + +License: BSD (see LICENSE.md for details). +""" + +from markdown.test_tools import TestCase + + +class TestAutomaticLinks(TestCase): + + def test_email_address(self): + self.assertMarkdownRenders( + 'asdfasdfadsfasd <yuri@freewisdom.org> or you can say ', + '<p>asdfasdfadsfasd <a href="mailto:yur' + 'i@freewisdom.or' + 'g">yuri@freewisd' + 'om.org</a> or you can say </p>' + ) + + def test_mailto_email_address(self): + self.assertMarkdownRenders( + 'instead <mailto:yuri@freewisdom.org>', + '<p>instead <a href="mailto:yuri@' + 'freewisdom.org">' + 'yuri@freewisdom' + '.org</a></p>' + ) + + def test_email_address_with_ampersand(self): + self.assertMarkdownRenders( + '<bob&sue@example.com>', + '<p><a href="mailto:bob&sue' + '@example.com">bob&' + 'sue@example.com</a></p>' + ) + + def test_invalid_email_address_local_part(self): + self.assertMarkdownRenders( + 'Missing local-part <@domain>', + '<p>Missing local-part <@domain></p>' + ) + + def test_invalid_email_address_domain(self): + self.assertMarkdownRenders( + 'Missing domain <local-part@>', + '<p>Missing domain <local-part@></p>' + ) diff --git a/tests/test_syntax/inline/test_emphasis.py b/tests/test_syntax/inline/test_emphasis.py new file mode 100644 index 0000000..1e7fafa --- /dev/null +++ b/tests/test_syntax/inline/test_emphasis.py @@ -0,0 +1,130 @@ +""" +Python Markdown + +A Python implementation of John Gruber's Markdown. + +Documentation: https://python-markdown.github.io/ +GitHub: https://github.com/Python-Markdown/markdown/ +PyPI: https://pypi.org/project/Markdown/ + +Started by Manfred Stienstra (http://www.dwerg.net/). +Maintained for a few years by Yuri Takhteyev (http://www.freewisdom.org). +Currently maintained by Waylan Limberg (https://github.com/waylan), +Dmitry Shachnev (https://github.com/mitya57) and Isaac Muse (https://github.com/facelessuser). + +Copyright 2007-2019 The Python Markdown Project (v. 1.7 and later) +Copyright 2004, 2005, 2006 Yuri Takhteyev (v. 0.2-1.6b) +Copyright 2004 Manfred Stienstra (the original version) + +License: BSD (see LICENSE.md for details). +""" + +from markdown.test_tools import TestCase + + +class TestNotEmphasis(TestCase): + + def test_standalone_asterisk(self): + self.assertMarkdownRenders( + '*', + '<p>*</p>' + ) + + def test_standalone_understore(self): + self.assertMarkdownRenders( + '_', + '<p>_</p>' + ) + + def test_standalone_asterisk_in_text(self): + self.assertMarkdownRenders( + 'foo * bar', + '<p>foo * bar</p>' + ) + + def test_standalone_understore_in_text(self): + self.assertMarkdownRenders( + 'foo _ bar', + '<p>foo _ bar</p>' + ) + + def test_standalone_asterisks_in_text(self): + self.assertMarkdownRenders( + 'foo * bar * baz', + '<p>foo * bar * baz</p>' + ) + + def test_standalone_understores_in_text(self): + self.assertMarkdownRenders( + 'foo _ bar _ baz', + '<p>foo _ bar _ baz</p>' + ) + + def test_standalone_asterisks_with_newlines(self): + self.assertMarkdownRenders( + 'foo\n* bar *\nbaz', + '<p>foo\n* bar *\nbaz</p>' + ) + + def test_standalone_understores_with_newlines(self): + self.assertMarkdownRenders( + 'foo\n_ bar _\nbaz', + '<p>foo\n_ bar _\nbaz</p>' + ) + + def test_standalone_asterisks_at_end(self): + self.assertMarkdownRenders( + 'foo * bar *', + '<p>foo * bar *</p>' + ) + + def test_standalone_understores_at_begin_end(self): + self.assertMarkdownRenders( + '_ bar _', + '<p>_ bar _</p>' + ) + + def test_complex_emphasis_asterisk(self): + self.assertMarkdownRenders( + 'This is text **bold *italic bold*** with more text', + '<p>This is text <strong>bold <em>italic bold</em></strong> with more text</p>' + ) + + def test_complex_emphasis_asterisk_mid_word(self): + self.assertMarkdownRenders( + 'This is text **bold*italic bold*** with more text', + '<p>This is text <strong>bold<em>italic bold</em></strong> with more text</p>' + ) + + def test_complex_emphasis_smart_underscore(self): + self.assertMarkdownRenders( + 'This is text __bold _italic bold___ with more text', + '<p>This is text <strong>bold <em>italic bold</em></strong> with more text</p>' + ) + + def test_complex_emphasis_smart_underscore_mid_word(self): + self.assertMarkdownRenders( + 'This is text __bold_italic bold___ with more text', + '<p>This is text __bold_italic bold___ with more text</p>' + ) + + def test_nested_emphasis(self): + + self.assertMarkdownRenders( + 'This text is **bold *italic* *italic* bold**', + '<p>This text is <strong>bold <em>italic</em> <em>italic</em> bold</strong></p>' + ) + + def test_complex_multple_emphasis_type(self): + + self.assertMarkdownRenders( + 'traced ***along*** bla **blocked** if other ***or***', + '<p>traced <strong><em>along</em></strong> bla <strong>blocked</strong> if other <strong><em>or</em></strong></p>' # noqa: E501 + ) + + def test_complex_multple_emphasis_type_variant2(self): + + self.assertMarkdownRenders( + 'on the **1-4 row** of the AP Combat Table ***and*** receive', + '<p>on the <strong>1-4 row</strong> of the AP Combat Table <strong><em>and</em></strong> receive</p>' + ) diff --git a/tests/test_syntax/inline/test_entities.py b/tests/test_syntax/inline/test_entities.py new file mode 100644 index 0000000..34cc2e7 --- /dev/null +++ b/tests/test_syntax/inline/test_entities.py @@ -0,0 +1,43 @@ +""" +Python Markdown + +A Python implementation of John Gruber's Markdown. + +Documentation: https://python-markdown.github.io/ +GitHub: https://github.com/Python-Markdown/markdown/ +PyPI: https://pypi.org/project/Markdown/ + +Started by Manfred Stienstra (http://www.dwerg.net/). +Maintained for a few years by Yuri Takhteyev (http://www.freewisdom.org). +Currently maintained by Waylan Limberg (https://github.com/waylan), +Dmitry Shachnev (https://github.com/mitya57) and Isaac Muse (https://github.com/facelessuser). + +Copyright 2007-2018 The Python Markdown Project (v. 1.7 and later) +Copyright 2004, 2005, 2006 Yuri Takhteyev (v. 0.2-1.6b) +Copyright 2004 Manfred Stienstra (the original version) + +License: BSD (see LICENSE.md for details). +""" + +from markdown.test_tools import TestCase + + +class TestEntities(TestCase): + + def test_named_entities(self): + self.assertMarkdownRenders("&", "<p>&</p>") + self.assertMarkdownRenders("²", "<p>²</p>") + self.assertMarkdownRenders("Á", "<p>Á</p>") + + def test_decimal_entities(self): + self.assertMarkdownRenders("&", "<p>&</p>") + self.assertMarkdownRenders("²", "<p>²</p>") + + def test_hexadecimal_entities(self): + self.assertMarkdownRenders("&", "<p>&</p>") + self.assertMarkdownRenders("²", "<p>²</p>") + + def test_false_entities(self): + self.assertMarkdownRenders("¬ an entity;", "<p>&not an entity;</p>") + self.assertMarkdownRenders("&#B2;", "<p>&#B2;</p>") + self.assertMarkdownRenders("&#xnothex;", "<p>&#xnothex;</p>") diff --git a/tests/test_syntax/inline/test_images.py b/tests/test_syntax/inline/test_images.py new file mode 100644 index 0000000..c9c7cb8 --- /dev/null +++ b/tests/test_syntax/inline/test_images.py @@ -0,0 +1,184 @@ +""" +Python Markdown + +A Python implementation of John Gruber's Markdown. + +Documentation: https://python-markdown.github.io/ +GitHub: https://github.com/Python-Markdown/markdown/ +PyPI: https://pypi.org/project/Markdown/ + +Started by Manfred Stienstra (http://www.dwerg.net/). +Maintained for a few years by Yuri Takhteyev (http://www.freewisdom.org). +Currently maintained by Waylan Limberg (https://github.com/waylan), +Dmitry Shachnev (https://github.com/mitya57) and Isaac Muse (https://github.com/facelessuser). + +Copyright 2007-2018 The Python Markdown Project (v. 1.7 and later) +Copyright 2004, 2005, 2006 Yuri Takhteyev (v. 0.2-1.6b) +Copyright 2004 Manfred Stienstra (the original version) + +License: BSD (see LICENSE.md for details). +""" + +from markdown.test_tools import TestCase + + +class TestAdvancedImages(TestCase): + + def test_nested_square_brackets(self): + self.assertMarkdownRenders( + """![Text[[[[[[[]]]]]]][]](http://link.com/image.png) more text""", + """<p><img alt="Text[[[[[[[]]]]]]][]" src="http://link.com/image.png" /> more text</p>""" + ) + + def test_nested_round_brackets(self): + self.assertMarkdownRenders( + """![Text](http://link.com/(((((((()))))))()).png) more text""", + """<p><img alt="Text" src="http://link.com/(((((((()))))))()).png" /> more text</p>""" + ) + + def test_uneven_brackets_with_titles1(self): + self.assertMarkdownRenders( + """![Text](http://link.com/(.png"title") more text""", + """<p><img alt="Text" src="http://link.com/(.png" title="title" /> more text</p>""" + ) + + def test_uneven_brackets_with_titles2(self): + self.assertMarkdownRenders( + """![Text](http://link.com/('.png"title") more text""", + """<p><img alt="Text" src="http://link.com/('.png" title="title" /> more text</p>""" + ) + + def test_uneven_brackets_with_titles3(self): + self.assertMarkdownRenders( + """![Text](http://link.com/(.png"title)") more text""", + """<p><img alt="Text" src="http://link.com/(.png" title="title)" /> more text</p>""" + ) + + def test_uneven_brackets_with_titles4(self): + self.assertMarkdownRenders( + """![Text](http://link.com/(.png "title") more text""", + """<p><img alt="Text" src="http://link.com/(.png" title="title" /> more text</p>""" + ) + + def test_uneven_brackets_with_titles5(self): + self.assertMarkdownRenders( + """![Text](http://link.com/(.png "title)") more text""", + """<p><img alt="Text" src="http://link.com/(.png" title="title)" /> more text</p>""" + ) + + def test_mixed_title_quotes1(self): + self.assertMarkdownRenders( + """![Text](http://link.com/'.png"title") more text""", + """<p><img alt="Text" src="http://link.com/'.png" title="title" /> more text</p>""" + ) + + def test_mixed_title_quotes2(self): + self.assertMarkdownRenders( + """![Text](http://link.com/".png'title') more text""", + """<p><img alt="Text" src="http://link.com/".png" title="title" /> more text</p>""" + ) + + def test_mixed_title_quotes3(self): + self.assertMarkdownRenders( + """![Text](http://link.com/with spaces.png'"and quotes" 'and title') more text""", + """<p><img alt="Text" src="http://link.com/with spaces.png" title=""and quotes" 'and title" />""" + """ more text</p>""" + ) + + def test_mixed_title_quotes4(self): + self.assertMarkdownRenders( + """![Text](http://link.com/with spaces'.png"and quotes" 'and title") more text""", + """<p><img alt="Text" src="http://link.com/with spaces'.png" title="and quotes" 'and title" />""" + """ more text</p>""" + ) + + def test_mixed_title_quotes5(self): + self.assertMarkdownRenders( + """![Text](http://link.com/with spaces .png'"and quotes" 'and title') more text""", + """<p><img alt="Text" src="http://link.com/with spaces .png" title=""and quotes"""" + """ 'and title" /> more text</p>""" + ) + + def test_mixed_title_quotes6(self): + self.assertMarkdownRenders( + """![Text](http://link.com/with spaces "and quotes".png 'and title') more text""", + """<p><img alt="Text" src="http://link.com/with spaces "and quotes".png" title="and title" />""" + """ more text</p>""" + ) + + def test_single_quote(self): + self.assertMarkdownRenders( + """![test](link"notitle.png)""", + """<p><img alt="test" src="link"notitle.png" /></p>""" + ) + + def test_angle_with_mixed_title_quotes(self): + self.assertMarkdownRenders( + """![Text](<http://link.com/with spaces '"and quotes".png> 'and title') more text""", + """<p><img alt="Text" src="http://link.com/with spaces '"and quotes".png" title="and title" />""" + """ more text</p>""" + ) + + def test_misc(self): + self.assertMarkdownRenders( + """![Poster](http://humane_man.jpg "The most humane man.")""", + """<p><img alt="Poster" src="http://humane_man.jpg" title="The most humane man." /></p>""" + ) + + def test_misc_ref(self): + self.assertMarkdownRenders( + self.dedent( + """ + ![Poster][] + + [Poster]:http://humane_man.jpg "The most humane man." + """ + ), + self.dedent( + """ + <p><img alt="Poster" src="http://humane_man.jpg" title="The most humane man." /></p> + """ + ) + ) + + def test_misc_blank(self): + self.assertMarkdownRenders( + """![Blank]()""", + """<p><img alt="Blank" src="" /></p>""" + ) + + def test_misc_img_title(self): + self.assertMarkdownRenders( + """![Image](http://humane man.jpg "The most humane man.")""", + """<p><img alt="Image" src="http://humane man.jpg" title="The most humane man." /></p>""" + ) + + def test_misc_img(self): + self.assertMarkdownRenders( + """![Image](http://humane man.jpg)""", + """<p><img alt="Image" src="http://humane man.jpg" /></p>""" + ) + + def test_short_ref(self): + self.assertMarkdownRenders( + self.dedent( + """ + ![ref] + + [ref]: ./image.jpg + """ + ), + '<p><img alt="ref" src="./image.jpg" /></p>' + ) + + def test_short_ref_in_link(self): + self.assertMarkdownRenders( + self.dedent( + """ + [![img ref]](http://example.com/) + + [img ref]: ./image.jpg + """ + ), + '<p><a href="http://example.com/"><img alt="img ref" src="./image.jpg" /></a></p>' + ) diff --git a/tests/test_syntax/inline/test_links.py b/tests/test_syntax/inline/test_links.py new file mode 100644 index 0000000..0458756 --- /dev/null +++ b/tests/test_syntax/inline/test_links.py @@ -0,0 +1,386 @@ +""" +Python Markdown + +A Python implementation of John Gruber's Markdown. + +Documentation: https://python-markdown.github.io/ +GitHub: https://github.com/Python-Markdown/markdown/ +PyPI: https://pypi.org/project/Markdown/ + +Started by Manfred Stienstra (http://www.dwerg.net/). +Maintained for a few years by Yuri Takhteyev (http://www.freewisdom.org). +Currently maintained by Waylan Limberg (https://github.com/waylan), +Dmitry Shachnev (https://github.com/mitya57) and Isaac Muse (https://github.com/facelessuser). + +Copyright 2007-2018 The Python Markdown Project (v. 1.7 and later) +Copyright 2004, 2005, 2006 Yuri Takhteyev (v. 0.2-1.6b) +Copyright 2004 Manfred Stienstra (the original version) + +License: BSD (see LICENSE.md for details). +""" + +from markdown.test_tools import TestCase + + +class TestInlineLinks(TestCase): + + def test_nested_square_brackets(self): + self.assertMarkdownRenders( + """[Text[[[[[[[]]]]]]][]](http://link.com) more text""", + """<p><a href="http://link.com">Text[[[[[[[]]]]]]][]</a> more text</p>""" + ) + + def test_nested_round_brackets(self): + self.assertMarkdownRenders( + """[Text](http://link.com/(((((((()))))))())) more text""", + """<p><a href="http://link.com/(((((((()))))))())">Text</a> more text</p>""" + ) + + def test_uneven_brackets_with_titles1(self): + self.assertMarkdownRenders( + """[Text](http://link.com/("title") more text""", + """<p><a href="http://link.com/(" title="title">Text</a> more text</p>""" + ) + + def test_uneven_brackets_with_titles2(self): + self.assertMarkdownRenders( + """[Text](http://link.com/('"title") more text""", + """<p><a href="http://link.com/('" title="title">Text</a> more text</p>""" + ) + + def test_uneven_brackets_with_titles3(self): + self.assertMarkdownRenders( + """[Text](http://link.com/("title)") more text""", + """<p><a href="http://link.com/(" title="title)">Text</a> more text</p>""" + ) + + def test_uneven_brackets_with_titles4(self): + self.assertMarkdownRenders( + """[Text](http://link.com/( "title") more text""", + """<p><a href="http://link.com/(" title="title">Text</a> more text</p>""" + ) + + def test_uneven_brackets_with_titles5(self): + self.assertMarkdownRenders( + """[Text](http://link.com/( "title)") more text""", + """<p><a href="http://link.com/(" title="title)">Text</a> more text</p>""" + ) + + def test_mixed_title_quotes1(self): + self.assertMarkdownRenders( + """[Text](http://link.com/'"title") more text""", + """<p><a href="http://link.com/'" title="title">Text</a> more text</p>""" + ) + + def test_mixed_title_quotes2(self): + self.assertMarkdownRenders( + """[Text](http://link.com/"'title') more text""", + """<p><a href="http://link.com/"" title="title">Text</a> more text</p>""" + ) + + def test_mixed_title_quotes3(self): + self.assertMarkdownRenders( + """[Text](http://link.com/with spaces'"and quotes" 'and title') more text""", + """<p><a href="http://link.com/with spaces" title=""and quotes" 'and title">""" + """Text</a> more text</p>""" + ) + + def test_mixed_title_quotes4(self): + self.assertMarkdownRenders( + """[Text](http://link.com/with spaces'"and quotes" 'and title") more text""", + """<p><a href="http://link.com/with spaces'" title="and quotes" 'and title">Text</a> more text</p>""" + ) + + def test_mixed_title_quotes5(self): + self.assertMarkdownRenders( + """[Text](http://link.com/with spaces '"and quotes" 'and title') more text""", + """<p><a href="http://link.com/with spaces" title=""and quotes" 'and title">""" + """Text</a> more text</p>""" + ) + + def test_mixed_title_quotes6(self): + self.assertMarkdownRenders( + """[Text](http://link.com/with spaces "and quotes" 'and title') more text""", + """<p><a href="http://link.com/with spaces "and quotes"" title="and title">""" + """Text</a> more text</p>""" + ) + + def test_single_quote(self): + self.assertMarkdownRenders( + """[test](link"notitle)""", + """<p><a href="link"notitle">test</a></p>""" + ) + + def test_angle_with_mixed_title_quotes(self): + self.assertMarkdownRenders( + """[Text](<http://link.com/with spaces '"and quotes"> 'and title') more text""", + """<p><a href="http://link.com/with spaces '"and quotes"" title="and title">""" + """Text</a> more text</p>""" + ) + + def test_amp_in_url(self): + """Test amp in URLs.""" + + self.assertMarkdownRenders( + '[link](http://www.freewisdom.org/this&that)', + '<p><a href="http://www.freewisdom.org/this&that">link</a></p>' + ) + self.assertMarkdownRenders( + '[title](http://example.com/?a=1&b=2)', + '<p><a href="http://example.com/?a=1&b=2">title</a></p>' + ) + self.assertMarkdownRenders( + '[title](http://example.com/?a=1&b=2)', + '<p><a href="http://example.com/?a=1&b=2">title</a></p>' + ) + + +class TestReferenceLinks(TestCase): + + def test_ref_link(self): + self.assertMarkdownRenders( + self.dedent( + """ + [Text] + + [Text]: http://example.com + """ + ), + """<p><a href="http://example.com">Text</a></p>""" + ) + + def test_ref_link_angle_brackets(self): + self.assertMarkdownRenders( + self.dedent( + """ + [Text] + + [Text]: <http://example.com> + """ + ), + """<p><a href="http://example.com">Text</a></p>""" + ) + + def test_ref_link_no_space(self): + self.assertMarkdownRenders( + self.dedent( + """ + [Text] + + [Text]:http://example.com + """ + ), + """<p><a href="http://example.com">Text</a></p>""" + ) + + def test_ref_link_angle_brackets_no_space(self): + self.assertMarkdownRenders( + self.dedent( + """ + [Text] + + [Text]:<http://example.com> + """ + ), + """<p><a href="http://example.com">Text</a></p>""" + ) + + def test_ref_link_angle_brackets_title(self): + self.assertMarkdownRenders( + self.dedent( + """ + [Text] + + [Text]: <http://example.com> "title" + """ + ), + """<p><a href="http://example.com" title="title">Text</a></p>""" + ) + + def test_ref_link_title(self): + self.assertMarkdownRenders( + self.dedent( + """ + [Text] + + [Text]: http://example.com "title" + """ + ), + """<p><a href="http://example.com" title="title">Text</a></p>""" + ) + + def test_ref_link_angle_brackets_title_no_space(self): + # TODO: Maybe reevaluate this? + self.assertMarkdownRenders( + self.dedent( + """ + [Text] + + [Text]: <http://example.com>"title" + """ + ), + """<p><a href="http://example.com>"title"">Text</a></p>""" + ) + + def test_ref_link_title_no_space(self): + self.assertMarkdownRenders( + self.dedent( + """ + [Text] + + [Text]: http://example.com"title" + """ + ), + """<p><a href="http://example.com"title"">Text</a></p>""" + ) + + def test_ref_link_single_quoted_title(self): + self.assertMarkdownRenders( + self.dedent( + """ + [Text] + + [Text]: http://example.com 'title' + """ + ), + """<p><a href="http://example.com" title="title">Text</a></p>""" + ) + + def test_ref_link_title_nested_quote(self): + self.assertMarkdownRenders( + self.dedent( + """ + [Text] + + [Text]: http://example.com "title'" + """ + ), + """<p><a href="http://example.com" title="title'">Text</a></p>""" + ) + + def test_ref_link_single_quoted_title_nested_quote(self): + self.assertMarkdownRenders( + self.dedent( + """ + [Text] + + [Text]: http://example.com 'title"' + """ + ), + """<p><a href="http://example.com" title="title"">Text</a></p>""" + ) + + def test_ref_link_override(self): + self.assertMarkdownRenders( + self.dedent( + """ + [Text] + + [Text]: http://example.com 'ignore' + [Text]: https://example.com 'override' + """ + ), + """<p><a href="https://example.com" title="override">Text</a></p>""" + ) + + def test_ref_link_title_no_blank_lines(self): + self.assertMarkdownRenders( + self.dedent( + """ + [Text] + [Text]: http://example.com "title" + [Text] + """ + ), + self.dedent( + """ + <p><a href="http://example.com" title="title">Text</a></p> + <p><a href="http://example.com" title="title">Text</a></p> + """ + ) + ) + + def test_ref_link_multi_line(self): + self.assertMarkdownRenders( + self.dedent( + """ + [Text] + + [Text]: + http://example.com + "title" + """ + ), + """<p><a href="http://example.com" title="title">Text</a></p>""" + ) + + def test_reference_newlines(self): + """Test reference id whitespace cleanup.""" + + self.assertMarkdownRenders( + self.dedent( + """ + Two things: + + - I would like to tell you about the [code of + conduct][] we are using in this project. + - Only one in fact. + + [code of conduct]: https://github.com/Python-Markdown/markdown/blob/master/CODE_OF_CONDUCT.md + """ + ), + '<p>Two things:</p>\n<ul>\n<li>I would like to tell you about the ' + '<a href="https://github.com/Python-Markdown/markdown/blob/master/CODE_OF_CONDUCT.md">code of\n' + ' conduct</a> we are using in this project.</li>\n<li>Only one in fact.</li>\n</ul>' + ) + + def test_reference_across_blocks(self): + """Test references across blocks.""" + + self.assertMarkdownRenders( + self.dedent( + """ + I would like to tell you about the [code of + + conduct][] we are using in this project. + + [code of conduct]: https://github.com/Python-Markdown/markdown/blob/master/CODE_OF_CONDUCT.md + """ + ), + '<p>I would like to tell you about the [code of</p>\n' + '<p>conduct][] we are using in this project.</p>' + ) + + def test_ref_link_nested_left_bracket(self): + self.assertMarkdownRenders( + self.dedent( + """ + [Text[] + + [Text[]: http://example.com + """ + ), + self.dedent( + """ + <p>[Text[]</p> + <p>[Text[]: http://example.com</p> + """ + ) + ) + + def test_ref_link_nested_right_bracket(self): + self.assertMarkdownRenders( + self.dedent( + """ + [Text]] + + [Text]]: http://example.com + """ + ), + self.dedent( + """ + <p>[Text]]</p> + <p>[Text]]: http://example.com</p> + """ + ) + ) diff --git a/tests/test_syntax/inline/test_raw_html.py b/tests/test_syntax/inline/test_raw_html.py new file mode 100644 index 0000000..a9c4857 --- /dev/null +++ b/tests/test_syntax/inline/test_raw_html.py @@ -0,0 +1,30 @@ +""" +Python Markdown + +A Python implementation of John Gruber's Markdown. + +Documentation: https://python-markdown.github.io/ +GitHub: https://github.com/Python-Markdown/markdown/ +PyPI: https://pypi.org/project/Markdown/ + +Started by Manfred Stienstra (http://www.dwerg.net/). +Maintained for a few years by Yuri Takhteyev (http://www.freewisdom.org). +Currently maintained by Waylan Limberg (https://github.com/waylan), +Dmitry Shachnev (https://github.com/mitya57) and Isaac Muse (https://github.com/facelessuser). + +Copyright 2007-2018 The Python Markdown Project (v. 1.7 and later) +Copyright 2004, 2005, 2006 Yuri Takhteyev (v. 0.2-1.6b) +Copyright 2004 Manfred Stienstra (the original version) + +License: BSD (see LICENSE.md for details). +""" + +from markdown.test_tools import TestCase + + +class TestRawHtml(TestCase): + def test_inline_html_angle_brackets(self): + self.assertMarkdownRenders("<span>e<c</span>", "<p><span>e<c</span></p>") + self.assertMarkdownRenders("<span>e>c</span>", "<p><span>e>c</span></p>") + self.assertMarkdownRenders("<span>e < c</span>", "<p><span>e < c</span></p>") + self.assertMarkdownRenders("<span>e > c</span>", "<p><span>e > c</span></p>") |