` tags in the HTML output. For example, this input:
-
- * Bird
- * Magic
-
-will turn into:
-
-
-
-
-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.
-
-
-
-Code Blocks
-
-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 `` and `` 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:
-
- This is a normal paragraph:
-
- This is a code block.
-
-
-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:
-
- Here is an example of AppleScript:
-
- tell application "Foo"
- beep
- end tell
-
-
-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:
-
-
-
-will turn into:
-
- <div class="footer">
- © 2004 Foo Corporation
- </div>
-
-
-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.
-
-
-
-Horizontal Rules
-
-You can produce a horizontal rule tag (` `) 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:
-
- * * *
-
- ***
-
- *****
-
- - - -
-
- ---------------------------------------
-
- _ _ _
-
-
-* * *
-
-Span Elements
-
-Links
-
-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:
-
- This is
- an example inline link.
-
- This link has no
- title attribute.
-
-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]: "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:
-
- I get 10 times more traffic from Google than from
- Yahoo
- or MSN .
-
-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.
-
-
-Emphasis
-
-Markdown treats asterisks (`*`) and underscores (`_`) as indicators of
-emphasis. Text wrapped with one `*` or `_` will be wrapped with an
-HTML `` tag; double `*`'s or `_`'s will be wrapped with an HTML
-`` tag. E.g., this input:
-
- *single asterisks*
-
- _single underscores_
-
- **double asterisks**
-
- __double underscores__
-
-will produce:
-
- single asterisks
-
- single underscores
-
- double asterisks
-
- double underscores
-
-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\*
-
-
-
-Code
-
-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:
-
- Use the printf()
function.
-
-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:
-
- There is a literal backtick (`) here.
-
-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:
-
- A single backtick in a code span: `
-
- A backtick-delimited string in a code span: `foo`
-
-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 `` tags.
-
-into:
-
- Please don't use any <blink>
tags.
-
-You can write this:
-
- `—` is the decimal-encoded equivalent of `—`.
-
-to produce:
-
- —
is the decimal-encoded
- equivalent of —
.
-
-
-
-Images
-
-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 ` ` tags.
-
-
-* * *
-
-
-Miscellaneous
-
-Automatic Links
-
-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:
-
-
-
-Markdown will turn this into:
-
- http://example.com/
-
-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:
-
-
-
-into something like this:
-
- address@exa
- mple.com
-
-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.)
-
-
-
-Backslash Escapes
-
-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 `` 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/test/tests/nested_blockquotes.html b/test/tests/nested_blockquotes.html
deleted file mode 100644
index d8ec7f8e03..0000000000
--- a/test/tests/nested_blockquotes.html
+++ /dev/null
@@ -1,9 +0,0 @@
-
- foo
-
-
- bar
-
-
- foo
-
diff --git a/test/tests/nested_blockquotes.md b/test/tests/nested_blockquotes.md
deleted file mode 100644
index ed3c624ffb..0000000000
--- a/test/tests/nested_blockquotes.md
+++ /dev/null
@@ -1,5 +0,0 @@
-> foo
->
-> > bar
->
-> foo
diff --git a/test/tests/nested_code.html b/test/tests/nested_code.html
deleted file mode 100644
index c370592015..0000000000
--- a/test/tests/nested_code.html
+++ /dev/null
@@ -1 +0,0 @@
-hi ther `` ok ```
diff --git a/test/tests/nested_code.md b/test/tests/nested_code.md
deleted file mode 100644
index 910e3d4628..0000000000
--- a/test/tests/nested_code.md
+++ /dev/null
@@ -1 +0,0 @@
-````` hi ther `` ok ``` `````
diff --git a/test/tests/nested_em.html b/test/tests/nested_em.html
deleted file mode 100644
index 3ab4ec89cd..0000000000
--- a/test/tests/nested_em.html
+++ /dev/null
@@ -1,3 +0,0 @@
-test test test
-
-test test test
diff --git a/test/tests/nested_em.md b/test/tests/nested_em.md
deleted file mode 100644
index 550d0eb998..0000000000
--- a/test/tests/nested_em.md
+++ /dev/null
@@ -1,3 +0,0 @@
-*test **test** test*
-
-_test __test__ test_
diff --git a/test/tests/nested_square_link.html b/test/tests/nested_square_link.html
deleted file mode 100644
index c8b7940831..0000000000
--- a/test/tests/nested_square_link.html
+++ /dev/null
@@ -1 +0,0 @@
-the ]
character
diff --git a/test/tests/nested_square_link.md b/test/tests/nested_square_link.md
deleted file mode 100644
index 82226ed5f6..0000000000
--- a/test/tests/nested_square_link.md
+++ /dev/null
@@ -1 +0,0 @@
-[the `]` character](/url)
diff --git a/test/tests/not_a_link.html b/test/tests/not_a_link.html
deleted file mode 100644
index a01685d241..0000000000
--- a/test/tests/not_a_link.html
+++ /dev/null
@@ -1 +0,0 @@
-[test](not a link)
diff --git a/test/tests/not_a_link.md b/test/tests/not_a_link.md
deleted file mode 100644
index 26f60437df..0000000000
--- a/test/tests/not_a_link.md
+++ /dev/null
@@ -1 +0,0 @@
-\[test](not a link)
diff --git a/test/tests/ordered_and_unordered_lists.html b/test/tests/ordered_and_unordered_lists.html
deleted file mode 100644
index 3ab61229ae..0000000000
--- a/test/tests/ordered_and_unordered_lists.html
+++ /dev/null
@@ -1,148 +0,0 @@
-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:
-
-
-First
-Second
-Third
-
-
-and:
-
-
-One
-Two
-Three
-
-
-Loose using tabs:
-
-
-First
-Second
-Third
-
-
-and using spaces:
-
-
-One
-Two
-Three
-
-
-Multiple paragraphs:
-
-
-Item 1, graf one.
-
-Item 2. graf two. The quick brown fox jumped over the lazy dog's
-back.
-Item 2.
-Item 3.
-
-
-Nested
-
-
-
-Here's another:
-
-
-First
-Second:
-
-Third
-
-
-Same thing but with paragraphs:
-
-
-First
-Second:
-
-
-Third
-
-
-
-This was an error in Markdown 1.0.1:
-
-
diff --git a/test/tests/ordered_and_unordered_lists.md b/test/tests/ordered_and_unordered_lists.md
deleted file mode 100644
index 7f3b49777f..0000000000
--- a/test/tests/ordered_and_unordered_lists.md
+++ /dev/null
@@ -1,131 +0,0 @@
-## 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/test/tests/ref_paren.html b/test/tests/ref_paren.html
deleted file mode 100644
index cff6977fb5..0000000000
--- a/test/tests/ref_paren.html
+++ /dev/null
@@ -1 +0,0 @@
-hi
diff --git a/test/tests/ref_paren.md b/test/tests/ref_paren.md
deleted file mode 100644
index aa97c91ae4..0000000000
--- a/test/tests/ref_paren.md
+++ /dev/null
@@ -1,3 +0,0 @@
-[hi]
-
-[hi]: /url (there)
diff --git a/test/tests/relative_urls.baseUrl=http%3A%2F%2Fexample%2Ecom%2Fbase%2F.html b/test/tests/relative_urls.baseUrl=http%3A%2F%2Fexample%2Ecom%2Fbase%2F.html
deleted file mode 100644
index ee7f3bff0e..0000000000
--- a/test/tests/relative_urls.baseUrl=http%3A%2F%2Fexample%2Ecom%2Fbase%2F.html
+++ /dev/null
@@ -1,35 +0,0 @@
-Absolutization of RFC 3986 URIs
-
-Absolute URI
-
-
-
-Network-path reference
-
-
-
-Absolute path
-
-
-
-Relative path
-
-
-
-Dot-relative path
-
-
-
-
-
-Same-document query
-
-
-
-Same-document fragment
-
-
-
-Empty
-
-section 4.2
diff --git a/test/tests/relative_urls.baseUrl=http%3A%2F%2Fexample%2Ecom%2Fbase%2F.md b/test/tests/relative_urls.baseUrl=http%3A%2F%2Fexample%2Ecom%2Fbase%2F.md
deleted file mode 100644
index 56f81820b1..0000000000
--- a/test/tests/relative_urls.baseUrl=http%3A%2F%2Fexample%2Ecom%2Fbase%2F.md
+++ /dev/null
@@ -1,27 +0,0 @@
-# Absolutization of RFC 3986 URIs
-
-## Absolute URI
-[![section 4.3](http://example.com/logo)](http://example.com/)
-
-## Network-path reference
-[![section 4.2](//example.com/logo)](//example.com/)
-
-## Absolute path
-[![section 4.2](/path/to/img)](/path/to/content)
-
-## Relative path
-[![section 4.2](img)](content)
-
-## Dot-relative path
-[![section 3.3](./img)](./content)
-
-[![section 3.3](../img)](../content)
-
-## Same-document query
-[![section 4.4](?type=image)](?)
-
-## Same-document fragment
-[![section 4.4](#img)](#)
-
-## Empty
-[section 4.2]()
diff --git a/test/tests/same_bullet.html b/test/tests/same_bullet.html
deleted file mode 100644
index 9220741c00..0000000000
--- a/test/tests/same_bullet.html
+++ /dev/null
@@ -1,5 +0,0 @@
-
diff --git a/test/tests/same_bullet.md b/test/tests/same_bullet.md
deleted file mode 100644
index 27a89675ab..0000000000
--- a/test/tests/same_bullet.md
+++ /dev/null
@@ -1,3 +0,0 @@
-* test
-+ test
-- test
diff --git a/test/tests/strong_and_em_together.html b/test/tests/strong_and_em_together.html
deleted file mode 100644
index 71ec78c709..0000000000
--- a/test/tests/strong_and_em_together.html
+++ /dev/null
@@ -1,7 +0,0 @@
-This is strong and em.
-
-So is this word.
-
-This is strong and em.
-
-So is this word.
diff --git a/test/tests/strong_and_em_together.md b/test/tests/strong_and_em_together.md
deleted file mode 100644
index 95ee690dbe..0000000000
--- a/test/tests/strong_and_em_together.md
+++ /dev/null
@@ -1,7 +0,0 @@
-***This is strong and em.***
-
-So is ***this*** word.
-
-___This is strong and em.___
-
-So is ___this___ word.
diff --git a/test/tests/tabs.html b/test/tests/tabs.html
deleted file mode 100644
index 3301ba803b..0000000000
--- a/test/tests/tabs.html
+++ /dev/null
@@ -1,25 +0,0 @@
-
-
-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/test/tests/tabs.md b/test/tests/tabs.md
deleted file mode 100644
index 589d1136e1..0000000000
--- a/test/tests/tabs.md
+++ /dev/null
@@ -1,21 +0,0 @@
-+ 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/test/tests/text.smartypants.html b/test/tests/text.smartypants.html
deleted file mode 100644
index 33718eeac9..0000000000
--- a/test/tests/text.smartypants.html
+++ /dev/null
@@ -1,6 +0,0 @@
-Hello world ‘how’ “are” you – today…
-
-“It’s a more ‘challenging’ smartypants test…”
-
-‘And,’ as a bonus — “one
-multiline” test!
diff --git a/test/tests/text.smartypants.md b/test/tests/text.smartypants.md
deleted file mode 100644
index 24e204643e..0000000000
--- a/test/tests/text.smartypants.md
+++ /dev/null
@@ -1,6 +0,0 @@
-Hello world 'how' "are" you -- today...
-
-"It's a more 'challenging' smartypants test..."
-
-'And,' as a bonus --- "one
-multiline" test!
diff --git a/test/tests/tidyness.html b/test/tests/tidyness.html
deleted file mode 100644
index f2a8ce70f5..0000000000
--- a/test/tests/tidyness.html
+++ /dev/null
@@ -1,8 +0,0 @@
-
-A list within a blockquote:
-
-asterisk 1
-asterisk 2
-asterisk 3
-
-
diff --git a/test/tests/tidyness.md b/test/tests/tidyness.md
deleted file mode 100644
index 5f18b8da21..0000000000
--- a/test/tests/tidyness.md
+++ /dev/null
@@ -1,5 +0,0 @@
-> A list within a blockquote:
->
-> * asterisk 1
-> * asterisk 2
-> * asterisk 3
diff --git a/test/tests/toplevel_paragraphs.gfm.html b/test/tests/toplevel_paragraphs.gfm.html
deleted file mode 100644
index d15bfccef0..0000000000
--- a/test/tests/toplevel_paragraphs.gfm.html
+++ /dev/null
@@ -1,34 +0,0 @@
-hello world
- text after spaces
- text after spaces
-
-paragraph before code
-text inside block code
-
-paragraph before hr
-
-
-paragraph before head with hash
-how are you
-
-paragraph before head with equals
-how are you
-
-paragraph before blockquote
-text for blockquote
-
-paragraph before list
-
-
-paragraph before div
-text inside div
-
-paragraph with span
-text inside span
-
-hello world
-
-
-hello
-
-hello
diff --git a/test/tests/toplevel_paragraphs.gfm.md b/test/tests/toplevel_paragraphs.gfm.md
deleted file mode 100644
index 8430b9f86c..0000000000
--- a/test/tests/toplevel_paragraphs.gfm.md
+++ /dev/null
@@ -1,38 +0,0 @@
-hello world
- text after spaces
- text after spaces
-
-paragraph before code
-```
-text inside block code
-```
-
-paragraph before hr
-* * *
-
-paragraph before head with hash
-# how are you
-
-paragraph before head with equals
-how are you
-===========
-
-paragraph before blockquote
-> text for blockquote
-
-paragraph before list
-* text inside list
-
-paragraph before div
-text inside div
-
-paragraph with span
-text inside span
-
-hello [world][how]
-
-[how]: /are/you
-
-hello
-
-hello
diff --git a/test/tests/tricky_list.html b/test/tests/tricky_list.html
deleted file mode 100644
index 764a3352be..0000000000
--- a/test/tests/tricky_list.html
+++ /dev/null
@@ -1,23 +0,0 @@
-hello world
-
-
-
-hello world
-
-
-
-hello world
-
-
-
-hello world
-
-
diff --git a/test/tests/tricky_list.md b/test/tests/tricky_list.md
deleted file mode 100644
index 9aa76ceb9f..0000000000
--- a/test/tests/tricky_list.md
+++ /dev/null
@@ -1,15 +0,0 @@
-**hello** _world_
-
-* hello world
-
-**hello** _world_
-
-* hello world
-
-**hello** _world_
-
-* Hello world
-
-**hello** _world_
-
-* hello world
diff --git a/test/tests/uppercase_hex.sanitize.html b/test/tests/uppercase_hex.sanitize.html
deleted file mode 100644
index 15b722bfe9..0000000000
--- a/test/tests/uppercase_hex.sanitize.html
+++ /dev/null
@@ -1,2 +0,0 @@
-lowerlower
-upperupper
diff --git a/test/tests/uppercase_hex.sanitize.md b/test/tests/uppercase_hex.sanitize.md
deleted file mode 100644
index bea65b9b82..0000000000
--- a/test/tests/uppercase_hex.sanitize.md
+++ /dev/null
@@ -1,2 +0,0 @@
-lower[click me](javascript:...)lower
-upper[click me](javascript:...)upper
From 31005193a7b67fcfe87533a259c0254d3dc05a22 Mon Sep 17 00:00:00 2001
From: Tony Brix
Date: Tue, 2 Jan 2018 13:53:05 -0600
Subject: [PATCH 05/17] always "fix" tests before testing
---
test/index.js | 22 ++++++++++++++++------
1 file changed, 16 insertions(+), 6 deletions(-)
diff --git a/test/index.js b/test/index.js
index 3a350398f5..142582f28f 100644
--- a/test/index.js
+++ b/test/index.js
@@ -101,7 +101,7 @@ main:
});
flags.forEach(function(key) {
var val = true;
- if(key.indexOf('=') !== -1) {
+ if (key.indexOf('=') !== -1) {
val = decodeURIComponent(key.substring(key.indexOf('=') + 1));
key = key.substring(0, key.indexOf('='));
} else if (key.indexOf('no') === 0) {
@@ -117,7 +117,7 @@ main:
try {
text = engine(file.text).replace(/\s/g, '');
html = file.html.replace(/\s/g, '');
- } catch(e) {
+ } catch (e) {
console.log('%s failed.', filename);
throw e;
}
@@ -319,7 +319,7 @@ function time(options) {
* conformance.
*/
-function fix(options) {
+function fix() {
['tests', 'original', 'new'].forEach(function(dir) {
try {
fs.mkdirSync(path.resolve(__dirname, dir), 0755);
@@ -449,7 +449,13 @@ function parseArg(argv) {
case '-f':
case '--fix':
case 'fix':
- options.fix = true;
+ if (options.fix !== false) {
+ options.fix = true;
+ }
+ break;
+ case '--no-fix':
+ case 'no-fix':
+ options.fix = false;
break;
case '-b':
case '--bench':
@@ -465,7 +471,7 @@ function parseArg(argv) {
break;
default:
if (arg.indexOf('--') === 0) {
- opt = camelize(arg.replace(/^--(no-)?/, ''));
+ var opt = camelize(arg.replace(/^--(no-)?/, ''));
if (!marked.defaults.hasOwnProperty(opt)) {
continue;
}
@@ -506,8 +512,12 @@ function camelize(text) {
function main(argv) {
var opt = parseArg();
+ if (opt.fix !== false) {
+ fix();
+ }
+
if (opt.fix) {
- return fix(opt);
+ return;
}
if (opt.bench) {
From 951f2c391696f3937b2895c86eae01e1b52ef8ac Mon Sep 17 00:00:00 2001
From: Tony Brix
Date: Tue, 2 Jan 2018 13:57:24 -0600
Subject: [PATCH 06/17] change folder name to compiled_tests
---
.gitignore | 2 +-
test/index.js | 14 +++++++-------
2 files changed, 8 insertions(+), 8 deletions(-)
diff --git a/.gitignore b/.gitignore
index 8f7082c4f5..14a781d96f 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,2 +1,2 @@
node_modules/
-test/tests
+test/compiled_tests
diff --git a/test/index.js b/test/index.js
index 142582f28f..9b2469bfb4 100644
--- a/test/index.js
+++ b/test/index.js
@@ -19,7 +19,7 @@ var fs = require('fs')
*/
function load() {
- var dir = __dirname + '/tests'
+ var dir = __dirname + '/compiled_tests'
, files = {}
, list
, file
@@ -320,7 +320,7 @@ function time(options) {
*/
function fix() {
- ['tests', 'original', 'new'].forEach(function(dir) {
+ ['compiled_tests', 'original', 'new'].forEach(function(dir) {
try {
fs.mkdirSync(path.resolve(__dirname, dir), 0755);
} catch (e) {
@@ -329,8 +329,8 @@ function fix() {
});
// rm -rf tests
- fs.readdirSync(path.resolve(__dirname, 'tests')).forEach(function(file) {
- fs.unlinkSync(path.resolve(__dirname, 'tests', file));
+ fs.readdirSync(path.resolve(__dirname, 'compiled_tests')).forEach(function(file) {
+ fs.unlinkSync(path.resolve(__dirname, 'compiled_tests', file));
});
// cp -r original tests
@@ -339,12 +339,12 @@ function fix() {
if (file.indexOf('hard_wrapped_paragraphs_with_list_like_lines.') === 0) {
nfile = file.replace(/([^.]+)$/, 'nogfm.$1');
}
- fs.writeFileSync(path.resolve(__dirname, 'tests', nfile),
+ fs.writeFileSync(path.resolve(__dirname, 'compiled_tests', nfile),
fs.readFileSync(path.resolve(__dirname, 'original', file)));
});
// node fix.js
- var dir = __dirname + '/tests';
+ var dir = __dirname + '/compiled_tests';
fs.readdirSync(dir).filter(function(file) {
return path.extname(file) === '.html';
@@ -400,7 +400,7 @@ function fix() {
// cp new/* tests/
fs.readdirSync(path.resolve(__dirname, 'new')).forEach(function(file) {
- fs.writeFileSync(path.resolve(__dirname, 'tests', file),
+ fs.writeFileSync(path.resolve(__dirname, 'compiled_tests', file),
fs.readFileSync(path.resolve(__dirname, 'new', file)));
});
}
From 52bfc9c4db6755edc6f59d0857c07ba662d6a05d Mon Sep 17 00:00:00 2001
From: Tony Brix
Date: Sat, 6 Jan 2018 01:11:16 -0600
Subject: [PATCH 07/17] use front-matter for test options
---
package-lock.json | 40 +++++++++++++++++++
package.json | 1 +
test/index.js | 36 ++++++++---------
.../{gfm_break.breaks.html => gfm_break.html} | 0
.../new/{gfm_break.breaks.md => gfm_break.md} | 3 ++
...{gfm_hashtag.gfm.html => gfm_hashtag.html} | 0
.../{gfm_hashtag.gfm.md => gfm_hashtag.md} | 3 ++
test/new/{links.sanitize.html => links.html} | 0
test/new/{links.sanitize.md => links.md} | 5 ++-
...sanatize.nomangle.html => mangle_xss.html} | 0
...xss.sanatize.nomangle.md => mangle_xss.md} | 4 ++
..._hashtag.nogfm.html => nogfm_hashtag.html} | 0
...{gfm_hashtag.nogfm.md => nogfm_hashtag.md} | 3 ++
...Ecom%2Fbase%2F.html => relative_urls.html} | 0
...le%2Ecom%2Fbase%2F.md => relative_urls.md} | 3 ++
...text.smartypants.html => smartypants.html} | 0
.../{text.smartypants.md => smartypants.md} | 3 ++
...aphs.gfm.html => toplevel_paragraphs.html} | 0
...ragraphs.gfm.md => toplevel_paragraphs.md} | 3 ++
...e_hex.sanitize.html => uppercase_hex.html} | 0
...rcase_hex.sanitize.md => uppercase_hex.md} | 3 ++
21 files changed, 87 insertions(+), 20 deletions(-)
rename test/new/{gfm_break.breaks.html => gfm_break.html} (100%)
rename test/new/{gfm_break.breaks.md => gfm_break.md} (60%)
rename test/new/{gfm_hashtag.gfm.html => gfm_hashtag.html} (100%)
rename test/new/{gfm_hashtag.gfm.md => gfm_hashtag.md} (63%)
rename test/new/{links.sanitize.html => links.html} (100%)
rename test/new/{links.sanitize.md => links.md} (87%)
rename test/new/{mangle_xss.sanatize.nomangle.html => mangle_xss.html} (100%)
rename test/new/{mangle_xss.sanatize.nomangle.md => mangle_xss.md} (63%)
rename test/new/{gfm_hashtag.nogfm.html => nogfm_hashtag.html} (100%)
rename test/new/{gfm_hashtag.nogfm.md => nogfm_hashtag.md} (62%)
rename test/new/{relative_urls.baseUrl=http%3A%2F%2Fexample%2Ecom%2Fbase%2F.html => relative_urls.html} (100%)
rename test/new/{relative_urls.baseUrl=http%3A%2F%2Fexample%2Ecom%2Fbase%2F.md => relative_urls.md} (92%)
rename test/new/{text.smartypants.html => smartypants.html} (100%)
rename test/new/{text.smartypants.md => smartypants.md} (83%)
rename test/new/{toplevel_paragraphs.gfm.html => toplevel_paragraphs.html} (100%)
rename test/new/{toplevel_paragraphs.gfm.md => toplevel_paragraphs.md} (96%)
rename test/new/{uppercase_hex.sanitize.html => uppercase_hex.html} (100%)
rename test/new/{uppercase_hex.sanitize.md => uppercase_hex.md} (78%)
diff --git a/package-lock.json b/package-lock.json
index 87347086a8..3b5e916592 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -39,6 +39,15 @@
"integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=",
"dev": true
},
+ "argparse": {
+ "version": "1.0.9",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.9.tgz",
+ "integrity": "sha1-c9g7wmP4bpf4zE9rrhsOkKfSLIY=",
+ "dev": true,
+ "requires": {
+ "sprintf-js": "1.0.3"
+ }
+ },
"arr-diff": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz",
@@ -308,6 +317,12 @@
"integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
"dev": true
},
+ "esprima": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.0.tgz",
+ "integrity": "sha512-oftTcaMu/EGrEIu904mWteKIv8vMuOgGYo7EhVJJN00R/EED9DCua/xxHRdYnKtcECzVg7xOWhflvJMnqcFZjw==",
+ "dev": true
+ },
"execa": {
"version": "0.7.0",
"resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz",
@@ -472,6 +487,15 @@
"for-in": "1.0.2"
}
},
+ "front-matter": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/front-matter/-/front-matter-2.3.0.tgz",
+ "integrity": "sha1-cgOviWzjV+4E4qpFFp6pHtf2dQQ=",
+ "dev": true,
+ "requires": {
+ "js-yaml": "3.10.0"
+ }
+ },
"fs-exists-sync": {
"version": "0.1.0",
"resolved": "https://registry.npmjs.org/fs-exists-sync/-/fs-exists-sync-0.1.0.tgz",
@@ -1014,6 +1038,16 @@
}
}
},
+ "js-yaml": {
+ "version": "3.10.0",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.10.0.tgz",
+ "integrity": "sha512-O2v52ffjLa9VeM43J4XocZE//WT9N0IiwDa3KSHH7Tu8CtH+1qM8SIZvnsTh6v+4yFy5KUY3BHUVwjpfAWsjIA==",
+ "dev": true,
+ "requires": {
+ "argparse": "1.0.9",
+ "esprima": "4.0.0"
+ }
+ },
"kind-of": {
"version": "3.2.2",
"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
@@ -1816,6 +1850,12 @@
"integrity": "sha1-Gsu/tZJDbRC76PeFt8xvgoFQEsM=",
"dev": true
},
+ "sprintf-js": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
+ "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=",
+ "dev": true
+ },
"stream-consume": {
"version": "0.1.0",
"resolved": "https://registry.npmjs.org/stream-consume/-/stream-consume-0.1.0.tgz",
diff --git a/package.json b/package.json
index 13a9a88fab..99aa5bef5f 100644
--- a/package.json
+++ b/package.json
@@ -25,6 +25,7 @@
"devDependencies": {
"markdown": "*",
"showdown": "*",
+ "front-matter": "^2.3.0",
"gulp": "^3.8.11",
"gulp-uglify": "^1.1.0",
"gulp-concat": "^2.5.2"
diff --git a/test/index.js b/test/index.js
index 9b2469bfb4..f6cf608bc1 100644
--- a/test/index.js
+++ b/test/index.js
@@ -12,6 +12,7 @@
var fs = require('fs')
, path = require('path')
+ , fm = require('front-matter')
, marked = require('../');
/**
@@ -23,6 +24,7 @@ function load() {
, files = {}
, list
, file
+ , content
, i
, l;
@@ -42,8 +44,12 @@ function load() {
for (; i < l; i++) {
file = path.join(dir, list[i]);
+ content = fm(fs.readFileSync(file, 'utf8'));
+
+
files[path.basename(file)] = {
- text: fs.readFileSync(file, 'utf8'),
+ options: content.attributes,
+ text: content.body,
html: fs.readFileSync(file.replace(/[^.]+$/, 'html'), 'utf8')
};
}
@@ -72,7 +78,7 @@ function runTests(engine, options) {
, len = keys.length
, filename
, file
- , flags
+ , opts
, text
, html
, j
@@ -86,30 +92,22 @@ main:
for (; i < len; i++) {
filename = keys[i];
file = files[filename];
+ opts = Object.keys(file.options);
if (marked._original) {
marked.defaults = marked._original;
delete marked._original;
}
- flags = filename.split('.').slice(1, -1);
- if (flags.length) {
+ if (opts.length) {
marked._original = marked.defaults;
marked.defaults = {};
Object.keys(marked._original).forEach(function(key) {
marked.defaults[key] = marked._original[key];
});
- flags.forEach(function(key) {
- var val = true;
- if (key.indexOf('=') !== -1) {
- val = decodeURIComponent(key.substring(key.indexOf('=') + 1));
- key = key.substring(0, key.indexOf('='));
- } else if (key.indexOf('no') === 0) {
- key = key.substring(2);
- val = false;
- }
+ opts.forEach(function(key) {
if (marked.defaults.hasOwnProperty(key)) {
- marked.defaults[key] = val;
+ marked.defaults[key] = file.options[key];
}
});
}
@@ -335,12 +333,12 @@ function fix() {
// cp -r original tests
fs.readdirSync(path.resolve(__dirname, 'original')).forEach(function(file) {
- var nfile = file;
- if (file.indexOf('hard_wrapped_paragraphs_with_list_like_lines.') === 0) {
- nfile = file.replace(/([^.]+)$/, 'nogfm.$1');
+ var text = fs.readFileSync(path.resolve(__dirname, 'original', file));
+
+ if (file.indexOf('hard_wrapped_paragraphs_with_list_like_lines.md') === 0) {
+ text = "---\ngfm: false\n---\n" + text;
}
- fs.writeFileSync(path.resolve(__dirname, 'compiled_tests', nfile),
- fs.readFileSync(path.resolve(__dirname, 'original', file)));
+ fs.writeFileSync(path.resolve(__dirname, 'compiled_tests', file), text);
});
// node fix.js
diff --git a/test/new/gfm_break.breaks.html b/test/new/gfm_break.html
similarity index 100%
rename from test/new/gfm_break.breaks.html
rename to test/new/gfm_break.html
diff --git a/test/new/gfm_break.breaks.md b/test/new/gfm_break.md
similarity index 60%
rename from test/new/gfm_break.breaks.md
rename to test/new/gfm_break.md
index 71097d23bc..5bf79a2b43 100644
--- a/test/new/gfm_break.breaks.md
+++ b/test/new/gfm_break.md
@@ -1,3 +1,6 @@
+---
+breaks: true
+---
Look at the
pretty line
breaks.
diff --git a/test/new/gfm_hashtag.gfm.html b/test/new/gfm_hashtag.html
similarity index 100%
rename from test/new/gfm_hashtag.gfm.html
rename to test/new/gfm_hashtag.html
diff --git a/test/new/gfm_hashtag.gfm.md b/test/new/gfm_hashtag.md
similarity index 63%
rename from test/new/gfm_hashtag.gfm.md
rename to test/new/gfm_hashtag.md
index 7656ecfd7c..5eb26bf185 100644
--- a/test/new/gfm_hashtag.gfm.md
+++ b/test/new/gfm_hashtag.md
@@ -1,3 +1,6 @@
+---
+gfm: true
+---
#header
# header1
diff --git a/test/new/links.sanitize.html b/test/new/links.html
similarity index 100%
rename from test/new/links.sanitize.html
rename to test/new/links.html
diff --git a/test/new/links.sanitize.md b/test/new/links.md
similarity index 87%
rename from test/new/links.sanitize.md
rename to test/new/links.md
index ba5d09fed7..1850be4e9f 100644
--- a/test/new/links.sanitize.md
+++ b/test/new/links.md
@@ -1,3 +1,6 @@
+---
+sanitize: true
+---
[URL](javascript:alert)
[URL](vbscript:alert)
@@ -6,4 +9,4 @@
[URL](javascript:document;alert(1))
-[URL](data:text/html;base64,PHNjcmlwdD5hbGVydCgnWFNTJyk8L3NjcmlwdD4K)
\ No newline at end of file
+[URL](data:text/html;base64,PHNjcmlwdD5hbGVydCgnWFNTJyk8L3NjcmlwdD4K)
diff --git a/test/new/mangle_xss.sanatize.nomangle.html b/test/new/mangle_xss.html
similarity index 100%
rename from test/new/mangle_xss.sanatize.nomangle.html
rename to test/new/mangle_xss.html
diff --git a/test/new/mangle_xss.sanatize.nomangle.md b/test/new/mangle_xss.md
similarity index 63%
rename from test/new/mangle_xss.sanatize.nomangle.md
rename to test/new/mangle_xss.md
index c44503da00..419bd124d7 100644
--- a/test/new/mangle_xss.sanatize.nomangle.md
+++ b/test/new/mangle_xss.md
@@ -1,3 +1,7 @@
+---
+sanatize: true
+mangle: false
+---
<
diff --git a/test/new/gfm_hashtag.nogfm.html b/test/new/nogfm_hashtag.html
similarity index 100%
rename from test/new/gfm_hashtag.nogfm.html
rename to test/new/nogfm_hashtag.html
diff --git a/test/new/gfm_hashtag.nogfm.md b/test/new/nogfm_hashtag.md
similarity index 62%
rename from test/new/gfm_hashtag.nogfm.md
rename to test/new/nogfm_hashtag.md
index 7656ecfd7c..4b805db481 100644
--- a/test/new/gfm_hashtag.nogfm.md
+++ b/test/new/nogfm_hashtag.md
@@ -1,3 +1,6 @@
+---
+gfm: false
+---
#header
# header1
diff --git a/test/new/relative_urls.baseUrl=http%3A%2F%2Fexample%2Ecom%2Fbase%2F.html b/test/new/relative_urls.html
similarity index 100%
rename from test/new/relative_urls.baseUrl=http%3A%2F%2Fexample%2Ecom%2Fbase%2F.html
rename to test/new/relative_urls.html
diff --git a/test/new/relative_urls.baseUrl=http%3A%2F%2Fexample%2Ecom%2Fbase%2F.md b/test/new/relative_urls.md
similarity index 92%
rename from test/new/relative_urls.baseUrl=http%3A%2F%2Fexample%2Ecom%2Fbase%2F.md
rename to test/new/relative_urls.md
index 56f81820b1..5ced8915af 100644
--- a/test/new/relative_urls.baseUrl=http%3A%2F%2Fexample%2Ecom%2Fbase%2F.md
+++ b/test/new/relative_urls.md
@@ -1,3 +1,6 @@
+---
+baseUrl: "http://example.com/base/"
+---
# Absolutization of RFC 3986 URIs
## Absolute URI
diff --git a/test/new/text.smartypants.html b/test/new/smartypants.html
similarity index 100%
rename from test/new/text.smartypants.html
rename to test/new/smartypants.html
diff --git a/test/new/text.smartypants.md b/test/new/smartypants.md
similarity index 83%
rename from test/new/text.smartypants.md
rename to test/new/smartypants.md
index 24e204643e..6922554605 100644
--- a/test/new/text.smartypants.md
+++ b/test/new/smartypants.md
@@ -1,3 +1,6 @@
+---
+smartypants: true
+---
Hello world 'how' "are" you -- today...
"It's a more 'challenging' smartypants test..."
diff --git a/test/new/toplevel_paragraphs.gfm.html b/test/new/toplevel_paragraphs.html
similarity index 100%
rename from test/new/toplevel_paragraphs.gfm.html
rename to test/new/toplevel_paragraphs.html
diff --git a/test/new/toplevel_paragraphs.gfm.md b/test/new/toplevel_paragraphs.md
similarity index 96%
rename from test/new/toplevel_paragraphs.gfm.md
rename to test/new/toplevel_paragraphs.md
index 8430b9f86c..de29be7557 100644
--- a/test/new/toplevel_paragraphs.gfm.md
+++ b/test/new/toplevel_paragraphs.md
@@ -1,3 +1,6 @@
+---
+gfm: true
+---
hello world
text after spaces
text after spaces
diff --git a/test/new/uppercase_hex.sanitize.html b/test/new/uppercase_hex.html
similarity index 100%
rename from test/new/uppercase_hex.sanitize.html
rename to test/new/uppercase_hex.html
diff --git a/test/new/uppercase_hex.sanitize.md b/test/new/uppercase_hex.md
similarity index 78%
rename from test/new/uppercase_hex.sanitize.md
rename to test/new/uppercase_hex.md
index bea65b9b82..b4b228ab6a 100644
--- a/test/new/uppercase_hex.sanitize.md
+++ b/test/new/uppercase_hex.md
@@ -1,2 +1,5 @@
+---
+sanitize: true
+---
lower[click me](javascript:...)lower
upper[click me](javascript:...)upper
From 9e0ec53ebb9fa19b9d7a26640d92ffc70203a917 Mon Sep 17 00:00:00 2001
From: Tony Brix
Date: Sat, 6 Jan 2018 01:16:46 -0600
Subject: [PATCH 08/17] fix bench
---
test/index.js | 17 ++---------------
1 file changed, 2 insertions(+), 15 deletions(-)
diff --git a/test/index.js b/test/index.js
index f6cf608bc1..276251daf0 100644
--- a/test/index.js
+++ b/test/index.js
@@ -254,24 +254,11 @@ function runBench(options) {
}
bench('marked (pedantic)', marked);
- // robotskirt
- try {
- bench('robotskirt', (function() {
- var rs = require('robotskirt');
- return function(text) {
- var parser = rs.Markdown.std();
- return parser.render(text);
- };
- })());
- } catch (e) {
- console.log('Could not bench robotskirt.');
- }
-
// showdown
try {
bench('showdown (reuse converter)', (function() {
var Showdown = require('showdown');
- var convert = new Showdown.converter();
+ var convert = new Showdown.Converter();
return function(text) {
return convert.makeHtml(text);
};
@@ -279,7 +266,7 @@ function runBench(options) {
bench('showdown (new converter)', (function() {
var Showdown = require('showdown');
return function(text) {
- var convert = new Showdown.converter();
+ var convert = new Showdown.Converter();
return convert.makeHtml(text);
};
})());
From e5571beb525396597b7d08c6c20bd7f6dfd802c7 Mon Sep 17 00:00:00 2001
From: Tony Brix
Date: Sat, 6 Jan 2018 01:19:43 -0600
Subject: [PATCH 09/17] linting
---
test/index.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/test/index.js b/test/index.js
index 276251daf0..42f0a8266a 100644
--- a/test/index.js
+++ b/test/index.js
@@ -323,7 +323,7 @@ function fix() {
var text = fs.readFileSync(path.resolve(__dirname, 'original', file));
if (file.indexOf('hard_wrapped_paragraphs_with_list_like_lines.md') === 0) {
- text = "---\ngfm: false\n---\n" + text;
+ text = '---\ngfm: false\n---\n' + text;
}
fs.writeFileSync(path.resolve(__dirname, 'compiled_tests', file), text);
});
From 03f510d5b719b5869d16e9ba2790062328c6445a Mon Sep 17 00:00:00 2001
From: Tony Brix
Date: Sat, 6 Jan 2018 01:44:10 -0600
Subject: [PATCH 10/17] add markdown-it to bench
---
package-lock.json | 40 ++++++++++++++++++++++++++++++++++++++++
package.json | 1 +
test/index.js | 22 +++++++++++++++++++++-
3 files changed, 62 insertions(+), 1 deletion(-)
diff --git a/package-lock.json b/package-lock.json
index 3b5e916592..9aa6dcc8c2 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -311,6 +311,12 @@
"once": "1.3.3"
}
},
+ "entities": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.1.tgz",
+ "integrity": "sha1-blwtClYhtdra7O+AuQ7ftc13cvA=",
+ "dev": true
+ },
"escape-string-regexp": {
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
@@ -1089,6 +1095,15 @@
"resolve": "1.5.0"
}
},
+ "linkify-it": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-2.0.3.tgz",
+ "integrity": "sha1-2UpGSPmxwXnWT6lykSaL22zpQ08=",
+ "dev": true,
+ "requires": {
+ "uc.micro": "1.0.3"
+ }
+ },
"locate-path": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz",
@@ -1269,6 +1284,25 @@
"nopt": "2.1.2"
}
},
+ "markdown-it": {
+ "version": "8.4.0",
+ "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-8.4.0.tgz",
+ "integrity": "sha512-tNuOCCfunY5v5uhcO2AUMArvKAyKMygX8tfup/JrgnsDqcCATQsAExBq7o5Ml9iMmO82bk6jYNLj6khcrl0JGA==",
+ "dev": true,
+ "requires": {
+ "argparse": "1.0.9",
+ "entities": "1.1.1",
+ "linkify-it": "2.0.3",
+ "mdurl": "1.0.1",
+ "uc.micro": "1.0.3"
+ }
+ },
+ "mdurl": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz",
+ "integrity": "sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4=",
+ "dev": true
+ },
"mem": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz",
@@ -1989,6 +2023,12 @@
"integrity": "sha1-dkpaEa9QVhkhsTPztE5hhofg9cM=",
"dev": true
},
+ "uc.micro": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.3.tgz",
+ "integrity": "sha1-ftUNXg+an7ClczeSWfKndFjVAZI=",
+ "dev": true
+ },
"uglify-js": {
"version": "2.6.4",
"resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.6.4.tgz",
diff --git a/package.json b/package.json
index 99aa5bef5f..1102e45861 100644
--- a/package.json
+++ b/package.json
@@ -25,6 +25,7 @@
"devDependencies": {
"markdown": "*",
"showdown": "*",
+ "markdown-it": "*",
"front-matter": "^2.3.0",
"gulp": "^3.8.11",
"gulp-uglify": "^1.1.0",
diff --git a/test/index.js b/test/index.js
index 42f0a8266a..22e5fd41bc 100644
--- a/test/index.js
+++ b/test/index.js
@@ -274,12 +274,32 @@ function runBench(options) {
console.log('Could not bench showdown.');
}
+ // markdown-it
+ try {
+ bench('markdown-it', (function() {
+ var MarkdownIt = require('markdown-it');
+ var md = new MarkdownIt();
+ return function(text) {
+ return md.render(text);
+ };
+ })());
+ } catch (e) {
+ console.log('Could not bench markdown-it.');
+ }
+
// markdown.js
try {
- bench('markdown.js', require('markdown').parse);
+ bench('markdown.js', (function() {
+ var markdown = require('markdown').markdown;
+ return function(text) {
+ return markdown.toHTML(text);
+ };
+ })());
} catch (e) {
console.log('Could not bench markdown.js.');
}
+
+ return true;
}
/**
From 26de4f1298c296f61563bb96d648a394ffaf0446 Mon Sep 17 00:00:00 2001
From: Tony Brix
Date: Sat, 6 Jan 2018 01:44:32 -0600
Subject: [PATCH 11/17] fix octal literal
---
test/index.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/test/index.js b/test/index.js
index 22e5fd41bc..bc33c0dfe9 100644
--- a/test/index.js
+++ b/test/index.js
@@ -327,7 +327,7 @@ function time(options) {
function fix() {
['compiled_tests', 'original', 'new'].forEach(function(dir) {
try {
- fs.mkdirSync(path.resolve(__dirname, dir), 0755);
+ fs.mkdirSync(path.resolve(__dirname, dir), 0o755);
} catch (e) {
;
}
From 253d97587a0f9962bc0b21dbe6dc7a6740cccb63 Mon Sep 17 00:00:00 2001
From: Tony Brix
Date: Sat, 6 Jan 2018 01:52:59 -0600
Subject: [PATCH 12/17] update readme with new bench
---
README.md | 18 +++++++-----------
1 file changed, 7 insertions(+), 11 deletions(-)
diff --git a/README.md b/README.md
index 68bb9204f6..ca1b811f04 100644
--- a/README.md
+++ b/README.md
@@ -325,19 +325,15 @@ node v0.8.x
``` bash
$ node test --bench
-marked completed in 3411ms.
-marked (gfm) completed in 3727ms.
-marked (pedantic) completed in 3201ms.
-robotskirt completed in 808ms.
-showdown (reuse converter) completed in 11954ms.
-showdown (new converter) completed in 17774ms.
-markdown-js completed in 17191ms.
+marked completed in 3408ms.
+marked (gfm) completed in 3465ms.
+marked (pedantic) completed in 3032ms.
+showdown (reuse converter) completed in 21444ms.
+showdown (new converter) completed in 23058ms.
+markdown-it completed in 3364ms.
+markdown.js completed in 12090ms.
```
-__Marked is now faster than Discount, which is written in C.__
-
-For those feeling skeptical: These benchmarks run the entire markdown test suite 1000 times. The test suite tests every feature. It doesn't cater to specific aspects.
-
### Pro level
You also have direct access to the lexer and parser if you so desire.
From 59846d973316055b2ed4ff61840ee1d23bfa5ec0 Mon Sep 17 00:00:00 2001
From: Tony Brix
Date: Sat, 6 Jan 2018 01:54:16 -0600
Subject: [PATCH 13/17] update texting description
---
README.md | 26 +++++++++++++-------------
1 file changed, 13 insertions(+), 13 deletions(-)
diff --git a/README.md b/README.md
index ca1b811f04..8c9ae42aab 100644
--- a/README.md
+++ b/README.md
@@ -321,10 +321,10 @@ features][gfmf].
## Benchmarks
-node v0.8.x
+node v8.9.4
``` bash
-$ node test --bench
+$ npm run bench
marked completed in 3408ms.
marked (gfm) completed in 3465ms.
marked (pedantic) completed in 3032ms.
@@ -368,23 +368,23 @@ suite. If you're adding a new feature, be sure to add your own test.
The marked test suite is set up slightly strangely: `test/new` is for all tests
that are not part of the original markdown.pl test suite (this is where your
test should go if you make one). `test/original` is only for the original
-markdown.pl tests. `test/tests` houses both types of tests after they have been
-combined and moved/generated by running `node test --fix` or `marked --test
---fix`.
+markdown.pl tests.
-In other words, if you have a test to add, add it to `test/new/` and then
-regenerate the tests with `node test --fix`. Commit the result. If your test
+In other words, if you have a test to add, add it to `test/new/`. If your test
uses a certain feature, for example, maybe it assumes GFM is *not* enabled, you
-can add `.nogfm` to the filename. So, `my-test.text` becomes
-`my-test.nogfm.text`. You can do this with any marked option. Say you want
-line breaks and smartypants enabled, your filename should be:
-`my-test.breaks.smartypants.text`.
+can add [front-matter](https://www.npmjs.com/package/front-matter) to the top of
+your .md file
+
+``` yml
+---
+gfm: false
+---
+```
To run the tests:
``` bash
-cd marked/
-node test
+npm run test
```
### Contribution and License Agreement
From b61af2a2c30650511dfa23ae54adbc6d17f9b827 Mon Sep 17 00:00:00 2001
From: Tony Brix
Date: Sat, 6 Jan 2018 10:46:21 -0600
Subject: [PATCH 14/17] clean up
---
test/index.js | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/test/index.js b/test/index.js
index bc33c0dfe9..9a79ab27fa 100644
--- a/test/index.js
+++ b/test/index.js
@@ -342,9 +342,10 @@ function fix() {
fs.readdirSync(path.resolve(__dirname, 'original')).forEach(function(file) {
var text = fs.readFileSync(path.resolve(__dirname, 'original', file));
- if (file.indexOf('hard_wrapped_paragraphs_with_list_like_lines.md') === 0) {
+ if (file === 'hard_wrapped_paragraphs_with_list_like_lines.md') {
text = '---\ngfm: false\n---\n' + text;
}
+
fs.writeFileSync(path.resolve(__dirname, 'compiled_tests', file), text);
});
From 7ee001a88cf401c8bba88c8936dd918b7f2ee43e Mon Sep 17 00:00:00 2001
From: Tony Brix
Date: Sat, 6 Jan 2018 10:58:38 -0600
Subject: [PATCH 15/17] minify
---
marked.min.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/marked.min.js b/marked.min.js
index e0c8dd0fd5..9d330d3264 100644
--- a/marked.min.js
+++ b/marked.min.js
@@ -3,4 +3,4 @@
* Copyright (c) 2011-2014, Christopher Jeffrey. (MIT Licensed)
* https://github.com/chjj/marked
*/
-(function(){function e(e){this.tokens=[],this.tokens.links={},this.options=e||p.defaults,this.rules=u.normal,this.options.gfm&&(this.options.tables?this.rules=u.tables:this.rules=u.gfm)}function t(e,t){if(this.options=t||p.defaults,this.links=e,this.rules=c.normal,this.renderer=this.options.renderer||new n,this.renderer.options=this.options,!this.links)throw new Error("Tokens array requires a `links` property.");this.options.gfm?this.options.breaks?this.rules=c.breaks:this.rules=c.gfm:this.options.pedantic&&(this.rules=c.pedantic)}function n(e){this.options=e||{}}function r(e){this.tokens=[],this.token=null,this.options=e||p.defaults,this.options.renderer=this.options.renderer||new n,this.renderer=this.options.renderer,this.renderer.options=this.options}function s(e,t){return e.replace(t?/&/g:/&(?!#?\w+;)/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'")}function i(e){return e.replace(/&(#(?:\d+)|(?:#x[0-9A-Fa-f]+)|(?:\w+));?/gi,function(e,t){return t=t.toLowerCase(),"colon"===t?":":"#"===t.charAt(0)?"x"===t.charAt(1)?String.fromCharCode(parseInt(t.substring(2),16)):String.fromCharCode(+t.substring(1)):""})}function l(e,t){return e=e.source,t=t||"",function n(r,s){return r?(s=s.source||s,s=s.replace(/(^|[^\[])\^/g,"$1"),e=e.replace(r,s),n):new RegExp(e,t)}}function o(e,t){return baseUrls[" "+e]||(/^[^:]+:\/*[^\/]*$/.test(e)?baseUrls[" "+e]=e+"/":baseUrls[" "+e]=e.replace(/[^\/]*$/,"")),e=baseUrls[" "+e],"//"===t.slice(0,2)?e.replace(/:[^]*/,":")+t:"/"===t.charAt(0)?e.replace(/(:\/*[^\/]*)[^]*/,"$1")+t:e+t}function h(){}function a(e){for(var t,n,r=1;rAn error occured:"+s(c.message+"",!0)+" ";throw c}}var u={newline:/^\n+/,code:/^( {4}[^\n]+\n*)+/,fences:h,hr:/^( *[-*_]){3,} *(?:\n+|$)/,heading:/^ *(#{1,6}) *([^\n]+?) *#* *(?:\n+|$)/,nptable:h,lheading:/^([^\n]+)\n *(=|-){2,} *(?:\n+|$)/,blockquote:/^( *>[^\n]+(\n(?!def)[^\n]+)*\n*)+/,list:/^( *)(bull) [\s\S]+?(?:hr|def|\n{2,}(?! )(?!\1bull )\n*|\s*$)/,html:/^ *(?:comment *(?:\n|\s*$)|closed *(?:\n{2,}|\s*$)|closing *(?:\n{2,}|\s*$))/,def:/^ *\[([^\]]+)\]: *([^\s>]+)>?(?: +["(]([^\n]+)[")])? *(?:\n+|$)/,table:h,paragraph:/^((?:[^\n]+\n?(?!hr|heading|lheading|blockquote|tag|def))+)\n*/,text:/^[^\n]+/};u.bullet=/(?:[*+-]|\d+\.)/,u.item=/^( *)(bull) [^\n]*(?:\n(?!\1bull )[^\n]*)*/,u.item=l(u.item,"gm")(/bull/g,u.bullet)(),u.list=l(u.list)(/bull/g,u.bullet)("hr","\\n+(?=\\1?(?:[-*_] *){3,}(?:\\n+|$))")("def","\\n+(?="+u.def.source+")")(),u._tag="(?!(?:a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)\\b)\\w+(?!:/|[^\\w\\s@]*@)\\b",u.html=l(u.html)("comment",//)("closed",/<(tag)[\s\S]+?<\/\1>/)("closing",/])*?>/)(/tag/g,u._tag)(),u.paragraph=l(u.paragraph)("hr",u.hr)("heading",u.heading)("lheading",u.lheading)("blockquote",u.blockquote)("tag","<"+u._tag)("def",u.def)(),u.normal=a({},u),u.gfm=a({},u.normal,{fences:/^ *(`{3,}|~{3,})[ \.]*(\S+)? *\n([\s\S]*?)\s*\1 *(?:\n+|$)/,paragraph:/^/,heading:/^ *(#{1,6}) +([^\n]+?) *#* *(?:\n+|$)/}),u.gfm.paragraph=l(u.paragraph)("(?!","(?!"+u.gfm.fences.source.replace("\\1","\\2")+"|"+u.list.source.replace("\\1","\\3")+"|")(),u.tables=a({},u.gfm,{nptable:/^ *(\S.*\|.*)\n *([-:]+ *\|[-| :]*)\n((?:.*\|.*(?:\n|$))*)\n*/,table:/^ *\|(.+)\n *\|( *[-:]+[-| :]*)\n((?: *\|.*(?:\n|$))*)\n*/}),e.rules=u,e.lex=function(t,n){var r=new e(n);return r.lex(t)},e.prototype.lex=function(e){return e=e.replace(/\r\n|\r/g,"\n").replace(/\t/g," ").replace(/\u00a0/g," ").replace(/\u2424/g,"\n"),this.token(e,!0)},e.prototype.token=function(e,t,n){for(var r,s,i,l,o,h,a,p,c,e=e.replace(/^ +$/gm,"");e;)if((i=this.rules.newline.exec(e))&&(e=e.substring(i[0].length),i[0].length>1&&this.tokens.push({type:"space"})),i=this.rules.code.exec(e))e=e.substring(i[0].length),i=i[0].replace(/^ {4}/gm,""),this.tokens.push({type:"code",text:this.options.pedantic?i:i.replace(/\n+$/,"")});else if(i=this.rules.fences.exec(e))e=e.substring(i[0].length),this.tokens.push({type:"code",lang:i[2],text:i[3]||""});else if(i=this.rules.heading.exec(e))e=e.substring(i[0].length),this.tokens.push({type:"heading",depth:i[1].length,text:i[2]});else if(t&&(i=this.rules.nptable.exec(e))){for(e=e.substring(i[0].length),h={type:"table",header:i[1].replace(/^ *| *\| *$/g,"").split(/ *\| */),align:i[2].replace(/^ *|\| *$/g,"").split(/ *\| */),cells:i[3].replace(/\n$/,"").split("\n")},p=0;p ?/gm,""),this.token(i,t,!0),this.tokens.push({type:"blockquote_end"});else if(i=this.rules.list.exec(e)){for(e=e.substring(i[0].length),l=i[2],this.tokens.push({type:"list_start",ordered:l.length>1}),i=i[0].match(this.rules.item),r=!1,c=i.length,p=0;p1&&o.length>1||(e=i.slice(p+1).join("\n")+e,p=c-1)),s=r||/\n\n(?!\s*$)/.test(h),p!==c-1&&(r="\n"===h.charAt(h.length-1),s||(s=r)),this.tokens.push({type:s?"loose_item_start":"list_item_start"}),this.token(h,!1,n),this.tokens.push({type:"list_item_end"});this.tokens.push({type:"list_end"})}else if(i=this.rules.html.exec(e))e=e.substring(i[0].length),this.tokens.push({type:this.options.sanitize?"paragraph":"html",pre:!this.options.sanitizer&&("pre"===i[1]||"script"===i[1]||"style"===i[1]),text:i[0]});else if(!n&&t&&(i=this.rules.def.exec(e)))e=e.substring(i[0].length),this.tokens.links[i[1].toLowerCase()]={href:i[2],title:i[3]};else if(t&&(i=this.rules.table.exec(e))){for(e=e.substring(i[0].length),h={type:"table",header:i[1].replace(/^ *| *\| *$/g,"").split(/ *\| */),align:i[2].replace(/^ *|\| *$/g,"").split(/ *\| */),cells:i[3].replace(/(?: *\| *)?\n$/,"").split("\n")},p=0;p])/,autolink:/^<([^ >]+(@|:\/)[^ >]+)>/,url:h,tag:/^|^<\/?\w+(?:"[^"]*"|'[^']*'|[^'">])*?>/,link:/^!?\[(inside)\]\(href\)/,reflink:/^!?\[(inside)\]\s*\[([^\]]*)\]/,nolink:/^!?\[((?:\[[^\]]*\]|[^\[\]])*)\]/,strong:/^__([\s\S]+?)__(?!_)|^\*\*([\s\S]+?)\*\*(?!\*)/,em:/^\b_((?:[^_]|__)+?)_\b|^\*((?:\*\*|[\s\S])+?)\*(?!\*)/,code:/^(`+)([\s\S]*?[^`])\1(?!`)/,br:/^ {2,}\n(?!\s*$)/,del:h,text:/^[\s\S]+?(?=[\\?(?:\s+['"]([\s\S]*?)['"])?\s*/,c.link=l(c.link)("inside",c._inside)("href",c._href)(),c.reflink=l(c.reflink)("inside",c._inside)(),c.normal=a({},c),c.pedantic=a({},c.normal,{strong:/^__(?=\S)([\s\S]*?\S)__(?!_)|^\*\*(?=\S)([\s\S]*?\S)\*\*(?!\*)/,em:/^_(?=\S)([\s\S]*?\S)_(?!_)|^\*(?=\S)([\s\S]*?\S)\*(?!\*)/}),c.gfm=a({},c.normal,{escape:l(c.escape)("])","~|])")(),url:/^(https?:\/\/[^\s<]+[^<.,:;"')\]\s])/,del:/^~~(?=\S)([\s\S]*?\S)~~/,text:l(c.text)("]|","~]|")("|","|https?://|")()}),c.breaks=a({},c.gfm,{br:l(c.br)("{2,}","*")(),text:l(c.gfm.text)("{2,}","*")()}),t.rules=c,t.output=function(e,n,r){var s=new t(n,r);return s.output(e)},t.prototype.output=function(e){for(var t,n,r,i,l="";e;)if(i=this.rules.escape.exec(e))e=e.substring(i[0].length),l+=i[1];else if(i=this.rules.autolink.exec(e))e=e.substring(i[0].length),"@"===i[2]?(n=s(":"===i[1].charAt(6)?this.mangle(i[1].substring(7)):this.mangle(i[1])),r=this.mangle("mailto:")+n):(n=s(i[1]),r=n),l+=this.renderer.link(r,null,n);else if(this.inLink||!(i=this.rules.url.exec(e))){if(i=this.rules.tag.exec(e))!this.inLink&&/^/i.test(i[0])&&(this.inLink=!1),e=e.substring(i[0].length),l+=this.options.sanitize?this.options.sanitizer?this.options.sanitizer(i[0]):s(i[0]):i[0];else if(i=this.rules.link.exec(e))e=e.substring(i[0].length),this.inLink=!0,l+=this.outputLink(i,{href:i[2],title:i[3]}),this.inLink=!1;else if((i=this.rules.reflink.exec(e))||(i=this.rules.nolink.exec(e))){if(e=e.substring(i[0].length),t=(i[2]||i[1]).replace(/\s+/g," "),t=this.links[t.toLowerCase()],!t||!t.href){l+=i[0].charAt(0),e=i[0].substring(1)+e;continue}this.inLink=!0,l+=this.outputLink(i,t),this.inLink=!1}else if(i=this.rules.strong.exec(e))e=e.substring(i[0].length),l+=this.renderer.strong(this.output(i[2]||i[1]));else if(i=this.rules.em.exec(e))e=e.substring(i[0].length),l+=this.renderer.em(this.output(i[2]||i[1]));else if(i=this.rules.code.exec(e))e=e.substring(i[0].length),l+=this.renderer.codespan(s(i[2].trim(),!0));else if(i=this.rules.br.exec(e))e=e.substring(i[0].length),l+=this.renderer.br();else if(i=this.rules.del.exec(e))e=e.substring(i[0].length),l+=this.renderer.del(this.output(i[1]));else if(i=this.rules.text.exec(e))e=e.substring(i[0].length),l+=this.renderer.text(s(this.smartypants(i[0])));else if(e)throw new Error("Infinite loop on byte: "+e.charCodeAt(0))}else e=e.substring(i[0].length),n=s(i[1]),r=n,l+=this.renderer.link(r,null,n);return l},t.prototype.outputLink=function(e,t){var n=s(t.href),r=t.title?s(t.title):null;return"!"!==e[0].charAt(0)?this.renderer.link(n,r,this.output(e[1])):this.renderer.image(n,r,s(e[1]))},t.prototype.smartypants=function(e){return this.options.smartypants?e.replace(/---/g,"—").replace(/--/g,"–").replace(/(^|[-\u2014\/(\[{"\s])'/g,"$1‘").replace(/'/g,"’").replace(/(^|[-\u2014\/(\[{\u2018\s])"/g,"$1“").replace(/"/g,"”").replace(/\.{3}/g,"…"):e},t.prototype.mangle=function(e){if(!this.options.mangle)return e;for(var t,n="",r=e.length,s=0;s.5&&(t="x"+t.toString(16)),n+=""+t+";";return n},n.prototype.code=function(e,t,n){if(this.options.highlight){var r=this.options.highlight(e,t);null!=r&&r!==e&&(n=!0,e=r)}return t?''+(n?e:s(e,!0))+"\n
\n":""+(n?e:s(e,!0))+"\n
"},n.prototype.blockquote=function(e){return"\n"+e+" \n"},n.prototype.html=function(e){return e},n.prototype.heading=function(e,t,n){return"\n"},n.prototype.hr=function(){return this.options.xhtml?" \n":" \n"},n.prototype.list=function(e,t){var n=t?"ol":"ul";return"<"+n+">\n"+e+""+n+">\n"},n.prototype.listitem=function(e){return""+e+" \n"},n.prototype.paragraph=function(e){return""+e+"
\n"},n.prototype.table=function(e,t){return"\n"},n.prototype.tablerow=function(e){return"\n"+e+" \n"},n.prototype.tablecell=function(e,t){var n=t.header?"th":"td",r=t.align?"<"+n+' style="text-align:'+t.align+'">':"<"+n+">";return r+e+""+n+">\n"},n.prototype.strong=function(e){return""+e+" "},n.prototype.em=function(e){return""+e+" "},n.prototype.codespan=function(e){return""+e+"
"},n.prototype.br=function(){return this.options.xhtml?" ":" "},n.prototype.del=function(e){return""+e+""},n.prototype.link=function(e,t,n){if(this.options.sanitize){try{var r=decodeURIComponent(i(e)).replace(/[^\w:]/g,"").toLowerCase()}catch(s){return""}if(0===r.indexOf("javascript:")||0===r.indexOf("vbscript:")||0===r.indexOf("data:"))return""}this.options.baseUrl&&!originIndependentUrl.test(e)&&(e=o(this.options.baseUrl,e));var l='"+n+" "},n.prototype.image=function(e,t,n){this.options.baseUrl&&!originIndependentUrl.test(e)&&(e=o(this.options.baseUrl,e));var r=' ":">"},n.prototype.text=function(e){return e},r.parse=function(e,t,n){var s=new r(t,n);return s.parse(e)},r.prototype.parse=function(e){this.inline=new t(e.links,this.options,this.renderer),this.tokens=e.reverse();for(var n="";this.next();)n+=this.tok();return n},r.prototype.next=function(){return this.token=this.tokens.pop()},r.prototype.peek=function(){return this.tokens[this.tokens.length-1]||0},r.prototype.parseText=function(){for(var e=this.token.text;"text"===this.peek().type;)e+="\n"+this.next().text;return this.inline.output(e)},r.prototype.tok=function(){switch(this.token.type){case"space":return"";case"hr":return this.renderer.hr();case"heading":return this.renderer.heading(this.inline.output(this.token.text),this.token.depth,this.token.text);case"code":return this.renderer.code(this.token.text,this.token.lang,this.token.escaped);case"table":var e,t,n,r,s,i="",l="";for(n="",e=0;e /g,">").replace(/"/g,""").replace(/'/g,"'")}function i(e){return e.replace(/&(#(?:\d+)|(?:#x[0-9A-Fa-f]+)|(?:\w+));?/gi,function(e,t){return t=t.toLowerCase(),"colon"===t?":":"#"===t.charAt(0)?"x"===t.charAt(1)?String.fromCharCode(parseInt(t.substring(2),16)):String.fromCharCode(+t.substring(1)):""})}function l(e,t){return e=e.source,t=t||"",function n(r,s){return r?(s=s.source||s,s=s.replace(/(^|[^\[])\^/g,"$1"),e=e.replace(r,s),n):new RegExp(e,t)}}function o(e,t){return g[" "+e]||(/^[^:]+:\/*[^\/]*$/.test(e)?g[" "+e]=e+"/":g[" "+e]=e.replace(/[^\/]*$/,"")),e=g[" "+e],"//"===t.slice(0,2)?e.replace(/:[\s\S]*/,":")+t:"/"===t.charAt(0)?e.replace(/(:\/*[^\/]*)[\s\S]*/,"$1")+t:e+t}function h(){}function a(e){for(var t,n,r=1;rAn error occurred:"+s(c.message+"",!0)+" ";throw c}}var u={newline:/^\n+/,code:/^( {4}[^\n]+\n*)+/,fences:h,hr:/^( *[-*_]){3,} *(?:\n+|$)/,heading:/^ *(#{1,6}) *([^\n]+?) *#* *(?:\n+|$)/,nptable:h,lheading:/^([^\n]+)\n *(=|-){2,} *(?:\n+|$)/,blockquote:/^( *>[^\n]+(\n(?!def)[^\n]+)*\n*)+/,list:/^( *)(bull) [\s\S]+?(?:hr|def|\n{2,}(?! )(?!\1bull )\n*|\s*$)/,html:/^ *(?:comment *(?:\n|\s*$)|closed *(?:\n{2,}|\s*$)|closing *(?:\n{2,}|\s*$))/,def:/^ *\[([^\]]+)\]: *([^\s>]+)>?(?: +["(]([^\n]+)[")])? *(?:\n+|$)/,table:h,paragraph:/^((?:[^\n]+\n?(?!hr|heading|lheading|blockquote|tag|def))+)\n*/,text:/^[^\n]+/};u.bullet=/(?:[*+-]|\d+\.)/,u.item=/^( *)(bull) [^\n]*(?:\n(?!\1bull )[^\n]*)*/,u.item=l(u.item,"gm")(/bull/g,u.bullet)(),u.list=l(u.list)(/bull/g,u.bullet)("hr","\\n+(?=\\1?(?:[-*_] *){3,}(?:\\n+|$))")("def","\\n+(?="+u.def.source+")")(),u._tag="(?!(?:a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)\\b)\\w+(?!:/|[^\\w\\s@]*@)\\b",u.html=l(u.html)("comment",//)("closed",/<(tag)[\s\S]+?<\/\1>/)("closing",/])*?>/)(/tag/g,u._tag)(),u.paragraph=l(u.paragraph)("hr",u.hr)("heading",u.heading)("lheading",u.lheading)("blockquote",u.blockquote)("tag","<"+u._tag)("def",u.def)(),u.normal=a({},u),u.gfm=a({},u.normal,{fences:/^ *(`{3,}|~{3,})[ \.]*(\S+)? *\n([\s\S]*?)\s*\1 *(?:\n+|$)/,paragraph:/^/,heading:/^ *(#{1,6}) +([^\n]+?) *#* *(?:\n+|$)/}),u.gfm.paragraph=l(u.paragraph)("(?!","(?!"+u.gfm.fences.source.replace("\\1","\\2")+"|"+u.list.source.replace("\\1","\\3")+"|")(),u.tables=a({},u.gfm,{nptable:/^ *(\S.*\|.*)\n *([-:]+ *\|[-| :]*)\n((?:.*\|.*(?:\n|$))*)\n*/,table:/^ *\|(.+)\n *\|( *[-:]+[-| :]*)\n((?: *\|.*(?:\n|$))*)\n*/}),e.rules=u,e.lex=function(t,n){var r=new e(n);return r.lex(t)},e.prototype.lex=function(e){return e=e.replace(/\r\n|\r/g,"\n").replace(/\t/g," ").replace(/\u00a0/g," ").replace(/\u2424/g,"\n"),this.token(e,!0)},e.prototype.token=function(e,t,n){for(var r,s,i,l,o,h,a,p,c,e=e.replace(/^ +$/gm,"");e;)if((i=this.rules.newline.exec(e))&&(e=e.substring(i[0].length),i[0].length>1&&this.tokens.push({type:"space"})),i=this.rules.code.exec(e))e=e.substring(i[0].length),i=i[0].replace(/^ {4}/gm,""),this.tokens.push({type:"code",text:this.options.pedantic?i:i.replace(/\n+$/,"")});else if(i=this.rules.fences.exec(e))e=e.substring(i[0].length),this.tokens.push({type:"code",lang:i[2],text:i[3]||""});else if(i=this.rules.heading.exec(e))e=e.substring(i[0].length),this.tokens.push({type:"heading",depth:i[1].length,text:i[2]});else if(t&&(i=this.rules.nptable.exec(e))){for(e=e.substring(i[0].length),h={type:"table",header:i[1].replace(/^ *| *\| *$/g,"").split(/ *\| */),align:i[2].replace(/^ *|\| *$/g,"").split(/ *\| */),cells:i[3].replace(/\n$/,"").split("\n")},p=0;p ?/gm,""),this.token(i,t,!0),this.tokens.push({type:"blockquote_end"});else if(i=this.rules.list.exec(e)){for(e=e.substring(i[0].length),l=i[2],this.tokens.push({type:"list_start",ordered:l.length>1}),i=i[0].match(this.rules.item),r=!1,c=i.length,p=0;p1&&o.length>1||(e=i.slice(p+1).join("\n")+e,p=c-1)),s=r||/\n\n(?!\s*$)/.test(h),p!==c-1&&(r="\n"===h.charAt(h.length-1),s||(s=r)),this.tokens.push({type:s?"loose_item_start":"list_item_start"}),this.token(h,!1,n),this.tokens.push({type:"list_item_end"});this.tokens.push({type:"list_end"})}else if(i=this.rules.html.exec(e))e=e.substring(i[0].length),this.tokens.push({type:this.options.sanitize?"paragraph":"html",pre:!this.options.sanitizer&&("pre"===i[1]||"script"===i[1]||"style"===i[1]),text:i[0]});else if(!n&&t&&(i=this.rules.def.exec(e)))e=e.substring(i[0].length),this.tokens.links[i[1].toLowerCase()]={href:i[2],title:i[3]};else if(t&&(i=this.rules.table.exec(e))){for(e=e.substring(i[0].length),h={type:"table",header:i[1].replace(/^ *| *\| *$/g,"").split(/ *\| */),align:i[2].replace(/^ *|\| *$/g,"").split(/ *\| */),cells:i[3].replace(/(?: *\| *)?\n$/,"").split("\n")},p=0;p])/,autolink:/^<([^ <>]+(@|:\/)[^ <>]+)>/,url:h,tag:/^|^<\/?\w+(?:"[^"]*"|'[^']*'|[^<'">])*?>/,link:/^!?\[(inside)\]\(href\)/,reflink:/^!?\[(inside)\]\s*\[([^\]]*)\]/,nolink:/^!?\[((?:\[[^\]]*\]|[^\[\]])*)\]/,strong:/^__([\s\S]+?)__(?!_)|^\*\*([\s\S]+?)\*\*(?!\*)/,em:/^\b_((?:[^_]|__)+?)_\b|^\*((?:\*\*|[\s\S])+?)\*(?!\*)/,code:/^(`+)([\s\S]*?[^`])\1(?!`)/,br:/^ {2,}\n(?!\s*$)/,del:h,text:/^[\s\S]+?(?=[\\?(?:\s+['"]([\s\S]*?)['"])?\s*/,c.link=l(c.link)("inside",c._inside)("href",c._href)(),c.reflink=l(c.reflink)("inside",c._inside)(),c.normal=a({},c),c.pedantic=a({},c.normal,{strong:/^__(?=\S)([\s\S]*?\S)__(?!_)|^\*\*(?=\S)([\s\S]*?\S)\*\*(?!\*)/,em:/^_(?=\S)([\s\S]*?\S)_(?!_)|^\*(?=\S)([\s\S]*?\S)\*(?!\*)/}),c.gfm=a({},c.normal,{escape:l(c.escape)("])","~|])")(),url:/^(https?:\/\/[^\s<]+[^<.,:;"')\]\s])/,del:/^~~(?=\S)([\s\S]*?\S)~~/,text:l(c.text)("]|","~]|")("|","|https?://|")()}),c.breaks=a({},c.gfm,{br:l(c.br)("{2,}","*")(),text:l(c.gfm.text)("{2,}","*")()}),t.rules=c,t.output=function(e,n,r){var s=new t(n,r);return s.output(e)},t.prototype.output=function(e){for(var t,n,r,i,l="";e;)if(i=this.rules.escape.exec(e))e=e.substring(i[0].length),l+=i[1];else if(i=this.rules.autolink.exec(e))e=e.substring(i[0].length),"@"===i[2]?(n=s(":"===i[1].charAt(6)?this.mangle(i[1].substring(7)):this.mangle(i[1])),r=this.mangle("mailto:")+n):(n=s(i[1]),r=n),l+=this.renderer.link(r,null,n);else if(this.inLink||!(i=this.rules.url.exec(e))){if(i=this.rules.tag.exec(e))!this.inLink&&/^/i.test(i[0])&&(this.inLink=!1),e=e.substring(i[0].length),l+=this.options.sanitize?this.options.sanitizer?this.options.sanitizer(i[0]):s(i[0]):i[0];else if(i=this.rules.link.exec(e))e=e.substring(i[0].length),this.inLink=!0,l+=this.outputLink(i,{href:i[2],title:i[3]}),this.inLink=!1;else if((i=this.rules.reflink.exec(e))||(i=this.rules.nolink.exec(e))){if(e=e.substring(i[0].length),t=(i[2]||i[1]).replace(/\s+/g," "),t=this.links[t.toLowerCase()],!t||!t.href){l+=i[0].charAt(0),e=i[0].substring(1)+e;continue}this.inLink=!0,l+=this.outputLink(i,t),this.inLink=!1}else if(i=this.rules.strong.exec(e))e=e.substring(i[0].length),l+=this.renderer.strong(this.output(i[2]||i[1]));else if(i=this.rules.em.exec(e))e=e.substring(i[0].length),l+=this.renderer.em(this.output(i[2]||i[1]));else if(i=this.rules.code.exec(e))e=e.substring(i[0].length),l+=this.renderer.codespan(s(i[2].trim(),!0));else if(i=this.rules.br.exec(e))e=e.substring(i[0].length),l+=this.renderer.br();else if(i=this.rules.del.exec(e))e=e.substring(i[0].length),l+=this.renderer.del(this.output(i[1]));else if(i=this.rules.text.exec(e))e=e.substring(i[0].length),l+=this.renderer.text(s(this.smartypants(i[0])));else if(e)throw new Error("Infinite loop on byte: "+e.charCodeAt(0))}else e=e.substring(i[0].length),n=s(i[1]),r=n,l+=this.renderer.link(r,null,n);return l},t.prototype.outputLink=function(e,t){var n=s(t.href),r=t.title?s(t.title):null;return"!"!==e[0].charAt(0)?this.renderer.link(n,r,this.output(e[1])):this.renderer.image(n,r,s(e[1]))},t.prototype.smartypants=function(e){return this.options.smartypants?e.replace(/---/g,"—").replace(/--/g,"–").replace(/(^|[-\u2014\/(\[{"\s])'/g,"$1‘").replace(/'/g,"’").replace(/(^|[-\u2014\/(\[{\u2018\s])"/g,"$1“").replace(/"/g,"”").replace(/\.{3}/g,"…"):e},t.prototype.mangle=function(e){if(!this.options.mangle)return e;for(var t,n="",r=e.length,s=0;s.5&&(t="x"+t.toString(16)),n+=""+t+";";return n},n.prototype.code=function(e,t,n){if(this.options.highlight){var r=this.options.highlight(e,t);null!=r&&r!==e&&(n=!0,e=r)}return t?''+(n?e:s(e,!0))+"\n
\n":""+(n?e:s(e,!0))+"\n
"},n.prototype.blockquote=function(e){return"\n"+e+" \n"},n.prototype.html=function(e){return e},n.prototype.heading=function(e,t,n){return"\n"},n.prototype.hr=function(){return this.options.xhtml?" \n":" \n"},n.prototype.list=function(e,t){var n=t?"ol":"ul";return"<"+n+">\n"+e+""+n+">\n"},n.prototype.listitem=function(e){return""+e+" \n"},n.prototype.paragraph=function(e){return""+e+"
\n"},n.prototype.table=function(e,t){return"\n"},n.prototype.tablerow=function(e){return"\n"+e+" \n"},n.prototype.tablecell=function(e,t){var n=t.header?"th":"td",r=t.align?"<"+n+' style="text-align:'+t.align+'">':"<"+n+">";return r+e+""+n+">\n"},n.prototype.strong=function(e){return""+e+" "},n.prototype.em=function(e){return""+e+" "},n.prototype.codespan=function(e){return""+e+"
"},n.prototype.br=function(){return this.options.xhtml?" ":" "},n.prototype.del=function(e){return""+e+""},n.prototype.link=function(e,t,n){if(this.options.sanitize){try{var r=decodeURIComponent(i(e)).replace(/[^\w:]/g,"").toLowerCase()}catch(s){return n}if(0===r.indexOf("javascript:")||0===r.indexOf("vbscript:")||0===r.indexOf("data:"))return n}this.options.baseUrl&&!f.test(e)&&(e=o(this.options.baseUrl,e));var l='"+n+" "},n.prototype.image=function(e,t,n){this.options.baseUrl&&!f.test(e)&&(e=o(this.options.baseUrl,e));var r=' ":">"},n.prototype.text=function(e){return e},r.parse=function(e,t,n){var s=new r(t,n);return s.parse(e)},r.prototype.parse=function(e){this.inline=new t(e.links,this.options,this.renderer),this.tokens=e.reverse();for(var n="";this.next();)n+=this.tok();return n},r.prototype.next=function(){return this.token=this.tokens.pop()},r.prototype.peek=function(){return this.tokens[this.tokens.length-1]||0},r.prototype.parseText=function(){for(var e=this.token.text;"text"===this.peek().type;)e+="\n"+this.next().text;return this.inline.output(e)},r.prototype.tok=function(){switch(this.token.type){case"space":return"";case"hr":return this.renderer.hr();case"heading":return this.renderer.heading(this.inline.output(this.token.text),this.token.depth,this.token.text);case"code":return this.renderer.code(this.token.text,this.token.lang,this.token.escaped);case"table":var e,t,n,r,s,i="",l="";for(n="",e=0;e
Date: Sat, 6 Jan 2018 11:56:47 -0600
Subject: [PATCH 16/17] clean up
---
README.md | 2 +-
test/index.js | 5 +++--
2 files changed, 4 insertions(+), 3 deletions(-)
diff --git a/README.md b/README.md
index 5450d26f25..8cfec5cc35 100644
--- a/README.md
+++ b/README.md
@@ -374,7 +374,7 @@ markdown.pl tests.
In other words, if you have a test to add, add it to `test/new/`. If your test
uses a certain feature, for example, maybe it assumes GFM is *not* enabled, you
can add [front-matter](https://www.npmjs.com/package/front-matter) to the top of
-your .md file
+your `.md` file
``` yml
---
diff --git a/test/index.js b/test/index.js
index 9a79ab27fa..91916d9883 100644
--- a/test/index.js
+++ b/test/index.js
@@ -46,7 +46,6 @@ function load() {
file = path.join(dir, list[i]);
content = fm(fs.readFileSync(file, 'utf8'));
-
files[path.basename(file)] = {
options: content.attributes,
text: content.body,
@@ -418,6 +417,7 @@ function fix() {
function parseArg(argv) {
var argv = process.argv.slice(2)
, options = {}
+ , opt = ""
, orphans = []
, arg;
@@ -477,7 +477,7 @@ function parseArg(argv) {
break;
default:
if (arg.indexOf('--') === 0) {
- var opt = camelize(arg.replace(/^--(no-)?/, ''));
+ opt = camelize(arg.replace(/^--(no-)?/, ''));
if (!marked.defaults.hasOwnProperty(opt)) {
continue;
}
@@ -523,6 +523,7 @@ function main(argv) {
}
if (opt.fix) {
+ // only run fix
return;
}
From 33b8848964111dd254d230b4502d98f0b5933fc7 Mon Sep 17 00:00:00 2001
From: Tony Brix
Date: Sat, 6 Jan 2018 14:59:21 -0600
Subject: [PATCH 17/17] add error message on bench
---
test/index.js | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/test/index.js b/test/index.js
index 91916d9883..26f3952296 100644
--- a/test/index.js
+++ b/test/index.js
@@ -270,7 +270,7 @@ function runBench(options) {
};
})());
} catch (e) {
- console.log('Could not bench showdown.');
+ console.log('Could not bench showdown. (Error: %s)', e.message);
}
// markdown-it
@@ -283,7 +283,7 @@ function runBench(options) {
};
})());
} catch (e) {
- console.log('Could not bench markdown-it.');
+ console.log('Could not bench markdown-it. (Error: %s)', e.message);
}
// markdown.js
@@ -295,7 +295,7 @@ function runBench(options) {
};
})());
} catch (e) {
- console.log('Could not bench markdown.js.');
+ console.log('Could not bench markdown.js. (Error: %s)', e.message);
}
return true;