- Explain your reasoning behind tagging that person.
-
- Preferably by citing objective examples, like PRs, Issues, and so on.
-
--->
-
-## As the one mentioned, I would like to:
-
-- [ ] accept the recommendation; or,
-- [ ] graciously decline; or,
-- [ ] dispute the recommendation
-
-within 30 days, if you have not indicated which option you are taking one of the following will happen:
-
-1. If adding a badge, we will assume you are graciously declining.
-2. If removing a badge, we will assume you do not want to dispute the recommendation; therefore, the badge will be removed.
-
-<!--
-
- Why would someone not accept a badge? Loads of reasons depending on the circumstances.
-
- 1. If you're a committer and someone puts a badge for you on having decision making authority in an area, do you really a) think you earned it and b) think you can do that *and* all the other stuff you got going as a committer, admin, or publisher (not to even mention your outside life)? Maybe not. And that's okay. Thank them for the recognition, explain you aren't able to take more on at the moment. It's cool to get recognized though.
- 2. Maybe you don't feel you actually earned it yet. I remember being in an interview once. The interviewer asked me to give an example of going above and beyond the call of duty. I said, "That's hard. Because what you consider going above and beyond may be what I consider to be 'just rising to'. If we're in battle and you get wounded and I pull you out of the frey before heading back into it, I don't consider that going above and beyond; I consider that rising to."
-
- Why would someone remove their own badge? Loads of reasons...
-
- 1. Maybe you got a lot going on right now and want to broadcast to the Marked community that, "Hey, I don't want to say I'm going to do this unless I can really commit to it right now in a way that serves the project well." That's awesome! That takes courage! Because a) saying "no" is hard for most humans ("people pleasers") and b) the alternative, well, for those of us here since about October of 2017 (and prior), we know what the alternative can look like.
- 2. Maybe you just think you've done all you can to help and learned all you can from the experience. Again, very awesome and courageous. It takes courage to know when to walk away on your own accord.
-
- Why would you want to remove someone's badge? Loads of reasons...
-
- 1. Maybe they have decision making authority on something. You asked for their advice. And, you ended up waiting almost a month before receiving a response.
- 2. Maybe it was relevant at the time (Master of Marked, for example) but you think they've lost their former level of skill (fell out of practice, for example). They could always get it back.
- 3. Maybe to signal to them that, "Hey, you seem to have forgotten about us. Are you still around (or alive)?"
-
- Anyway, you get the idea. This isn't about good or bad...it's just about giving the community a simple game mechanic by which to publicly say, "Thank you" or "Here's what my status is" in the community or "Hey, I think something's wrong here" in a civil manner.
-
--->
-
-Note: All committers must approve via review before merging, the disapproving committer can simply close the PR.
-### Warning: 🚨 Marked does not [sanitize](https://marked.js.org/#/USING_ADVANCED.md#options) the output HTML by default 🚨
+### Warning: 🚨 Marked does not [sanitize](https://marked.js.org/#/USING_ADVANCED.md#options) the output HTML. Please use a sanitize library, like [DOMPurify](https://github.com/cure53/DOMPurify) (recommended), [sanitize-html](https://github.com/apostrophecms/sanitize-html) or [insane](https://github.com/bevacqua/insane) on the output HTML! 🚨
+The only completely secure system is the one that doesn't exist in the first place.
+Having said that, we take the security of Marked very seriously.
+
+## Reporting a Vulnerability
+
+Please disclose potential security issues by email to the project [committers](https://marked.js.org/#/AUTHORS.md) as well as the [listed owners within NPM](https://docs.npmjs.com/cli/owner).
+We will provide an initial assessment of security reports within 48 hours and should apply patches within 2 weeks
+(also, feel free to contribute a fix for the issue).
-Marked takes an encompassing approach to its community. As such, you can think of these as [concentric circles](https://medium.com/the-node-js-collection/healthy-open-source-967fa8be7951), where each group encompases the following groups.
+Marked takes an encompassing approach to its community. As such, you can think of these as [concentric circles](https://medium.com/the-node-js-collection/healthy-open-source-967fa8be7951), where each group encompasses the following groups.
<table>
<table>
<tbody>
<tbody>
@@ -170,7 +170,7 @@ To be removed: You can remove yourself through the [GitHub UI](https://help.gith
A note on volunteering:
A note on volunteering:
1. Please do not volunteer unless you believe you can demonstrate to your peers you can do the work required.
1. Please do not volunteer unless you believe you can demonstrate to your peers you can do the work required.
-2. Please do not overcommit yourself; we count on those committed to the project to be responsive. Really consider, with all you have going on, wehther you able to really commit to it.
+2. Please do not overcommit yourself; we count on those committed to the project to be responsive. Really consider, with all you have going on, whether you able to really commit to it.
3. Don't let the previous frighten you away, it can always be changed later by you or your peers.
3. Don't let the previous frighten you away, it can always be changed later by you or your peers.
[Details on badges](#badges)
[Details on badges](#badges)
@@ -227,7 +227,7 @@ Badges? If you *want* 'em, we got 'em, and here's how you get 'em (and…dr
</blockquote>
</blockquote>
</dd>
</dd>
<dt>Dr. Docs</dt>
<dt>Dr. Docs</dt>
- <dd>Someone who has contributed a great deal to the creation and maintainance of the non-code areas of marked.</dd>
+ <dd>Someone who has contributed a great deal to the creation and maintenance of the non-code areas of marked.</dd>
<dt>Eye for the CLI</dt>
<dt>Eye for the CLI</dt>
<dd>At this point? Pretty much anyone who can update that `man` file to the current Marked version without regression in the CLI tool itself.</dd>
<dd>At this point? Pretty much anyone who can update that `man` file to the current Marked version without regression in the CLI tool itself.</dd>
<dt>GitHub Guru</dt>
<dt>GitHub Guru</dt>
@@ -259,9 +259,9 @@ Badges? If you *want* 'em, we got 'em, and here's how you get 'em (and…dr
<dl>
<dl>
<dt>Defibrillator</dt>
<dt>Defibrillator</dt>
- <dd>A contributor who stepped up to help bring Marked back to life by contriuting solutions to help Marked pass when compared against the CommonMark and GitHub Flavored Markdown specifications.</dd>
+ <dd>A contributor who stepped up to help bring Marked back to life by contributing solutions to help Marked pass when compared against the CommonMark and GitHub Flavored Markdown specifications.</dd>
<dt>Maker of the Marked mark</dt>
<dt>Maker of the Marked mark</dt>
- <dd>This badge is given to the person or oganization credited with creating the logo (or logotype) used in Marked communications for a given period of time. **Maker of the Marked mark from 2017 to present**, for example.</dd>
+ <dd>This badge is given to the person or organization credited with creating the logo (or logotype) used in Marked communications for a given period of time. **Maker of the Marked mark from 2017 to present**, for example.</dd>
- [ ] Be sure to run `npm install` or `npm update`.
- [ ] Be sure to run `npm install` or `npm update`.
- [ ] Create a branch.
- [ ] Create a branch.
-- [ ] Make as small a change as possible.
-- [ ] Run `npm test`, fix any broken things (for linting, you can run `npm run lint` to have the linter fix them for you).
-- [ ] Submit a PR.
+- [ ] Update code in `src` folder. (`lib` folder is for auto compiled code)
+- [ ] Run `npm run test:all`, fix any broken things (for linting, you can run `npm run lint` to have the linter fix them for you).
+- [ ] Run `npm run build:reset` to remove changes to compiled files.
+- [ ] Submit a Pull Request.
## Design principles
## Design principles
@@ -30,16 +31,19 @@ The following table lists the ticket type labels we use when there is work to be
|RR - refactor and re-engineer |Results in an improvement to developers using Marked (improved readability) or end-users (faster performance) or both. |
|RR - refactor and re-engineer |Results in an improvement to developers using Marked (improved readability) or end-users (faster performance) or both. |
|NFS - new feature (spec related) |A capability Marked does not currently provide but is in one of the [supported specifications](#/README.md#specifications) |
|NFS - new feature (spec related) |A capability Marked does not currently provide but is in one of the [supported specifications](#/README.md#specifications) |
|NFU - new feature (user requested) |A capability Marked does not currently provide but has been requested by users of Marked. |
|NFU - new feature (user requested) |A capability Marked does not currently provide but has been requested by users of Marked. |
+|NFE - new feature (should be an extension) |A capability Marked does not currently provide and is not part of a spec. |
## Test early, often, and everything
## Test early, often, and everything
We try to write test cases to validate output (writing tests based on the [supported specifications](#/README.md#specifications)) and minimize regression (writing tests for issues fixed). Therefore, if you would like to contribute, some things you should know regarding the test harness.
We try to write test cases to validate output (writing tests based on the [supported specifications](#/README.md#specifications)) and minimize regression (writing tests for issues fixed). Therefore, if you would like to contribute, some things you should know regarding the test harness.
+|/test/specs/commonmark|Tests for [CommonMark](https://spec.commonmark.org/current/) compliance |
+|/test/specs/gfm |Tests for [GFM](https://github.github.com/gfm/) compliance |
+|/test/specs/new |Tests not related to the original `markdown.pl`. |
+|/test/specs/original |Tests validating against the original `markdown.pl`. |
+|/test/specs/redos |Tests for [ReDOS](https://www.owasp.org/index.php/Regular_expression_Denial_of_Service_-_ReDoS) vulnerabilities|
If your test uses features or options, assuming `gfm` is set to `false`, for example, you can add [front-matter](https://www.npmjs.com/package/front-matter) to the top of
If your test uses features or options, assuming `gfm` is set to `false`, for example, you can add [front-matter](https://www.npmjs.com/package/front-matter) to the top of
your `.md` file
your `.md` file
@@ -84,9 +88,8 @@ To check for (and fix) standardized syntax (lint):
npm run lint
npm run lint
```
```
-To build your own minified version of Marked:
+To build your own es5, esm, and minified versions of Marked:
-**Master is always shippable:** We try to merge PRs in such a way that `master` is the only branch to really be concerned about *and* `master` can always be released. This allows smoother flow between new fetures, bug fixes, and so on. (Almost a continuous deployment setup, without automation.)
+**Master is always shippable:** We try to merge PRs in such a way that `master` is the only branch to really be concerned about *and* `master` can always be released. This allows smoother flow between new features, bug fixes, and so on. (Almost a continuous deployment setup, without automation.)
## Versioning
## Versioning
@@ -20,5 +20,5 @@ We follow [semantic versioning](https://semver.org) where the following sequence
What to expect while Marked is a zero-major (0.x.y):
What to expect while Marked is a zero-major (0.x.y):
1. The major will remain at zero; thereby, alerting consumers to the potentially volatile nature of the package.
1. The major will remain at zero; thereby, alerting consumers to the potentially volatile nature of the package.
-2. The minor will tend to be more analagous to a `major` release.
-3. The patch will tend to be more analagous to a `minor` release or a collection of bug fixes (patches).
+2. The minor will tend to be more analogous to a `major` release.
+3. The patch will tend to be more analogous to a `minor` release or a collection of bug fixes (patches).
@@ -25,7 +25,7 @@ These documentation pages are also rendered using marked 💯
<h2 id="usage">Usage</h2>
<h2 id="usage">Usage</h2>
-### Warning: 🚨 Marked does not [sanitize](https://marked.js.org/#/USING_ADVANCED.md#options) the output HTML by default 🚨
+### Warning: 🚨 Marked does not [sanitize](https://marked.js.org/#/USING_ADVANCED.md#options) the output HTML. Please use a sanitize library, like [DOMPurify](https://github.com/cure53/DOMPurify) (recommended), [sanitize-html](https://github.com/apostrophecms/sanitize-html) or [insane](https://github.com/bevacqua/insane) on the output HTML! 🚨
**CLI**
**CLI**
@@ -72,8 +72,8 @@ We actively support the features of the following [Markdown flavors](https://git
By supporting the above Markdown flavors, it's possible that Marked can help you use other flavors as well; however, these are not actively supported by the community.
By supporting the above Markdown flavors, it's possible that Marked can help you use other flavors as well; however, these are not actively supported by the community.
|headerIds |`boolean` |`true` |v0.4.0 |If true, include an `id` attribute when emitting headings (h1, h2, h3, etc).|
|headerIds |`boolean` |`true` |v0.4.0 |If true, include an `id` attribute when emitting headings (h1, h2, h3, etc).|
@@ -50,13 +51,12 @@ console.log(myMarked('I am using __markdown__.'));
|langPrefix |`string` |`'language-'`|v0.3.0|A string to prefix the className in a `<code>` block. Useful for syntax highlighting.|
|langPrefix |`string` |`'language-'`|v0.3.0|A string to prefix the className in a `<code>` block. Useful for syntax highlighting.|
|mangle |`boolean` |`true` |v0.3.4 |If true, autolinked email address is escaped with HTML character references.|
|mangle |`boolean` |`true` |v0.3.4 |If true, autolinked email address is escaped with HTML character references.|
|pedantic |`boolean` |`false` |v0.2.1 |If true, conform to the original `markdown.pl` as much as possible. Don't fix original markdown bugs or behavior. Turns off and overrides `gfm`.|
|pedantic |`boolean` |`false` |v0.2.1 |If true, conform to the original `markdown.pl` as much as possible. Don't fix original markdown bugs or behavior. Turns off and overrides `gfm`.|
-|renderer |`object` |`new Renderer()`|v0.3.0|An object containing functions to render tokens to HTML. See [extensibility](USING_PRO.md) for more details.|
-|sanitize |`boolean` |`false` |v0.2.1 |If true, sanitize the HTML passed into `markdownString` with the `sanitizer` function.|
+|renderer |`object` |`new Renderer()`|v0.3.0|An object containing functions to render tokens to HTML. See [extensibility](/#/USING_PRO.md) for more details.|
+|sanitize |`boolean` |`false` |v0.2.1 |If true, sanitize the HTML passed into `markdownString` with the `sanitizer` function.<br>**Warning**: This feature is deprecated and it should NOT be used as it cannot be considered secure.<br>Instead use a sanitize library, like [DOMPurify](https://github.com/cure53/DOMPurify) (recommended), [sanitize-html](https://github.com/apostrophecms/sanitize-html) or [insane](https://github.com/bevacqua/insane) on the output HTML! |
|sanitizer |`function`|`null` |v0.3.4 |A function to sanitize the HTML passed into `markdownString`.|
|sanitizer |`function`|`null` |v0.3.4 |A function to sanitize the HTML passed into `markdownString`.|
|silent |`boolean` |`false` |v0.2.7 |If true, the parser does not throw any exception.|
|silent |`boolean` |`false` |v0.2.7 |If true, the parser does not throw any exception.|
|smartLists |`boolean` |`false` |v0.2.8 |If true, use smarter list behavior than those found in `markdown.pl`.|
|smartLists |`boolean` |`false` |v0.2.8 |If true, use smarter list behavior than those found in `markdown.pl`.|
|smartypants |`boolean` |`false` |v0.2.9 |If true, use "smart" typographic punctuation for things like quotes and dashes.|
|smartypants |`boolean` |`false` |v0.2.9 |If true, use "smart" typographic punctuation for things like quotes and dashes.|
-|tables |`boolean` |`true` |v0.2.7 |If true and `gfm` is true, use [GFM Tables extension](https://github.github.com/gfm/#tables-extension-).|
|xhtml |`boolean` |`false` |v0.3.2 |If true, emit self-closing HTML tags for void elements (<br/>, <img/>, etc.) with a "/" as required by XHTML.|
|xhtml |`boolean` |`false` |v0.3.2 |If true, emit self-closing HTML tags for void elements (<br/>, <img/>, etc.) with a "/" as required by XHTML.|
<h2 id="highlight">Asynchronous highlighting</h2>
<h2 id="highlight">Asynchronous highlighting</h2>
@@ -64,7 +64,7 @@ console.log(myMarked('I am using __markdown__.'));
Unlike `highlight.js` the `pygmentize.js` library uses asynchronous highlighting. This example demonstrates that marked is agnostic when it comes to the highlighter you use.
Unlike `highlight.js` the `pygmentize.js` library uses asynchronous highlighting. This example demonstrates that marked is agnostic when it comes to the highlighter you use.
-In both examples, `code` is a `string` representing the section of code to pass to the highlighter. In this example, `lang` is a `string` informing the highlighter what programming lnaguage to use for the `code` and `callback` is the `function` the asynchronous highlighter will call once complete.
+In both examples, `code` is a `string` representing the section of code to pass to the highlighter. In this example, `lang` is a `string` informing the highlighter what programming language to use for the `code` and `callback` is the `function` the asynchronous highlighter will call once complete.
+
+<h2 id="workers">Workers</h2>
+
+To prevent ReDoS attacks you can run marked on a worker and terminate it when parsing takes longer than usual.
+
+Marked can be run in a [worker thread](https://nodejs.org/api/worker_threads.html) on a node server, or a [web worker](https://developer.mozilla.org/en-US/docs/Web/API/Web_Workers_API) in a browser.
-To champion the single-responsibility and open/closed prinicples, we have tried to make it relatively painless to extend marked. If you are looking to add custom functionality, this is the place to start.
+To champion the single-responsibility and open/closed principles, we have tried to make it relatively painless to extend marked. If you are looking to add custom functionality, this is the place to start.
<h2 id="renderer">The renderer</h2>
<h2 id="renderer">The renderer</h2>
@@ -10,14 +10,14 @@ The renderer is...
```js
```js
// Create reference instance
// Create reference instance
-var myMarked = require('marked');
+const marked = require('marked');
// Get reference
// Get reference
-var renderer = new myMarked.Renderer();
+const renderer = new marked.Renderer();
// Override function
// Override function
renderer.heading = function (text, level) {
renderer.heading = function (text, level) {
- var escapedText = text.toLowerCase().replace(/[^\w]+/g, '-');
+// Remove trailing 'c's. Equivalent to str.replace(/c*$/, '').
+// /c*$/ is vulnerable to REDOS.
+// invert: Remove suffix of non-c chars instead. Default falsey.
+function rtrim(str, c, invert) {
+ const l = str.length;
+ if (l === 0) {
+ return '';
+ }
+
+ // Length of suffix matching the invert condition.
+ let suffLen = 0;
+
+ // Step left until we fail to match the invert condition.
+ while (suffLen < l) {
+ const currChar = str.charAt(l - suffLen - 1);
+ if (currChar === c && !invert) {
+ suffLen++;
+ } else if (currChar !== c && invert) {
+ suffLen++;
+ } else {
+ break;
+ }
+ }
+
+ return str.substr(0, l - suffLen);
+}
+
+function findClosingBracket(str, b) {
+ if (str.indexOf(b[1]) === -1) {
+ return -1;
+ }
+ const l = str.length;
+ let level = 0,
+ i = 0;
+ for (; i < l; i++) {
+ if (str[i] === '\\') {
+ i++;
+ } else if (str[i] === b[0]) {
+ level++;
+ } else if (str[i] === b[1]) {
+ level--;
+ if (level < 0) {
+ return i;
+ }
+ }
+ }
+ return -1;
+}
+
+function checkSanitizeDeprecation(opt) {
+ if (opt && opt.sanitize && !opt.silent) {
+ console.warn('marked(): sanitize and sanitizer parameters are deprecated since version 0.7.0, should not be used and will be removed in the future. Read more here: https://marked.js.org/#/USING_ADVANCED.md#options');
+ console.warn('marked(): sanitize and sanitizer parameters are deprecated since version 0.7.0, should not be used and will be removed in the future. Read more here: https://marked.js.org/#/USING_ADVANCED.md#options');
-<p>Note that many strings that count as absolute URIs for purposes of this spec are not valid URIs, because their schemes are not registered or because of other problems with their syntax:</p>
-Note that many strings that count as absolute URIs for purposes of this spec are not valid URIs, because their schemes are not registered or because of other problems with their syntax:
-
-### Example 569
-
-<a+b+c:d>
-
-### Example 570
-
-<made-up-scheme://foo,bar>
-
-### Example 571
-
-<http://../>
-
-### Example 572
-
-<localhost:5001/foo>
-
-### Example 573
-
-Spaces are not allowed in autolinks:
-
-<http://foo.bar/baz bim>
-
-### Example 574
-
-Backslash-escapes do not work inside autolinks:
-
-<http://example.com/\[\>
-
-Examples of email autolinks:
-
-### Example 575
-
-<foo@bar.example.com>
-
-### Example 576
-
-<foo+special@Bar.baz-bar0.com>
-
-### Example 577
-
-Backslash-escapes do not work inside email autolinks:
-<p>The spaces after the <code>></code> characters can be omitted:</p>
-
-<blockquote>
-<h1 id="bar">Bar</h1>
-<p>bar
-baz</p>
-</blockquote>
-
-<h3 id="example-193">Example 193</h3>
-
-<p>The <code>></code> characters can be indented 1-3 spaces:</p>
-
-<blockquote>
-<h1 id="baz">Baz</h1>
-<p>bar
-baz</p>
-</blockquote>
-
-<h3 id="example-194">Example 194</h3>
-
-<p>Four spaces gives us a code block:</p>
-
-<pre><code>> # Qux
-> bar
-> baz</code></pre>
-
-<h3 id="example-195">Example 195</h3>
-
-<p>The Laziness clause allows us to omit the <code>></code> before paragraph continuation text:</p>
-
-<blockquote>
-<h1 id="quux">Quux</h1>
-<p>bar
-baz</p>
-</blockquote>
-
-<h3 id="example-196">Example 196</h3>
-
-<p>A block quote can contain some lazy and some non-lazy continuation lines:</p>
-
-<blockquote>
-<p>bar
-baz
-foo</p>
-</blockquote>
-
-<h3 id="example-197">Example 197</h3>
-
-<p>Laziness only applies to lines that would have been continuations of paragraphs had they been prepended with block quote markers. For example, the <code>></code> cannot be omitted in the second line of</p>
-
-<blockquote>
-<p>foo</p>
-</blockquote>
-<hr>
-
-<p>without changing the meaning.</p>
-
-<h3 id="example-198">Example 198</h3>
-
-<pre><code>Similarly, if we omit the `>` in the second line then the block quote ends after the first line:
-
-> - foo
-- bar</code></pre>
-
-<h3 id="example-199">Example 199</h3>
-
-<p>For the same reason, we can’t omit the <code>></code> in front of subsequent lines of an indented or fenced code block:</p>
-<p>A block quote can have initial or final blank lines:</p>
-
-<blockquote>
-<p>foo</p>
-</blockquote>
-
-
-<h3 id="example-205">Example 205</h3>
-
-<p>A blank line always separates block quotes:</p>
-
-<blockquote>
-<p>foo</p>
-</blockquote>
-<blockquote>
-<p>bar</p>
-</blockquote>
-
-<h3 id="example-206">Example 206</h3>
-
-<p>Consecutiveness means that if we put these block quotes together, we get a single block quote:</p>
-
-<blockquote>
-<p>foo
-bar</p>
-</blockquote>
-
-<h3 id="example-207">Example 207</h3>
-
-<p>To get a block quote with two paragraphs, use:</p>
-
-<blockquote>
-<p>foo</p>
-<p>bar</p>
-</blockquote>
-
-<h3 id="example-208">Example 208</h3>
-
-<p>Block quotes can interrupt paragraphs:</p>
-
-<p>foo</p>
-<blockquote>
-<p>bar</p>
-</blockquote>
-
-<h3 id="example-209">Example 209</h3>
-
-<p>In general, blank lines are not needed before or after block quotes:</p>
-
-<blockquote>
-<p>aaa</p>
-</blockquote>
-<hr>
-<blockquote>
-<p>bbb</p>
-</blockquote>
-
-<h3 id="example-210">Example 210</h3>
-
-<p>However, because of laziness, a blank line is needed between a block quote and a following paragraph:</p>
-
-<blockquote>
-<p>bar
-baz</p>
-</blockquote>
-
-<h3 id="example-211">Example 211</h3>
-
-<blockquote>
-<p>bar</p>
-</blockquote>
-<p>baz</p>
-
-<h3 id="example-212">Example 212</h3>
-
-<blockquote>
-<p>bar</p>
-</blockquote>
-<p>baz</p>
-
-<h3 id="example-213">Example 213</h3>
-
-<p>It is a consequence of the Laziness rule that any number of initial <code>></code>s may be omitted on a continuation line of a nested block quote:</p>
-
-<blockquote>
-<blockquote>
-<blockquote>
-<p>foo
-bar</p>
-</blockquote>
-</blockquote>
-</blockquote>
-
-<h3 id="example-214">Example 214</h3>
-
-<blockquote>
-<blockquote>
-<blockquote>
-<p>foo
-bar
-baz</p>
-</blockquote>
-</blockquote>
-</blockquote>
-
-<h3 id="example-215">Example 215</h3>
-
-<p>When including an indented code block in a block quote, remember that the block quote marker includes both the <code>></code> and a following space. So five spaces are needed after the <code>></code>:</p>
-The spaces after the `>` characters can be omitted:
-
-># Bar
->bar
-> baz
-
-### Example 193
-
-The `>` characters can be indented 1-3 spaces:
-
- > # Baz
- > bar
- > baz
-
-### Example 194
-
-Four spaces gives us a code block:
-
- > # Qux
- > bar
- > baz
-
-### Example 195
-
-The Laziness clause allows us to omit the `>` before paragraph continuation text:
-
-> # Quux
-> bar
-baz
-
-### Example 196
-
-A block quote can contain some lazy and some non-lazy continuation lines:
-
-> bar
-baz
-> foo
-
-### Example 197
-
-Laziness only applies to lines that would have been continuations of paragraphs had they been prepended with block quote markers. For example, the `>` cannot be omitted in the second line of
-
-> foo
----
-
-without changing the meaning.
-
-### Example 198
-
- Similarly, if we omit the `>` in the second line then the block quote ends after the first line:
-
- > - foo
- - bar
-
-### Example 199
-
-For the same reason, we can’t omit the `>` in front of subsequent lines of an indented or fenced code block:
-
-> foo
-
- bar
-
-### Example 200
-
- > ```
- foo
- ```
-
- <blockquote>
- <pre><code></code></pre>
- </blockquote>
- <p>foo</p>
- <pre><code></code></pre>
-
-### Example 201
-
- > foo
- - bar
-
- <blockquote>
- <p>foo
- - bar</p>
- </blockquote>
-
-### Example 202
-
-A block quote can be empty:
-
->
-
-### Example 203
-
->
->
->
-
-### Example 204
-
-A block quote can have initial or final blank lines:
-
->
-> foo
->
-
-### Example 205
-
-A blank line always separates block quotes:
-
-> foo
-
-> bar
-
-### Example 206
-
-Consecutiveness means that if we put these block quotes together, we get a single block quote:
-
-> foo
-> bar
-
-### Example 207
-
-To get a block quote with two paragraphs, use:
-
-> foo
->
-> bar
-
-### Example 208
-
-Block quotes can interrupt paragraphs:
-
-foo
-> bar
-
-### Example 209
-
-In general, blank lines are not needed before or after block quotes:
-
-> aaa
-***
-> bbb
-
-### Example 210
-
-However, because of laziness, a blank line is needed between a block quote and a following paragraph:
-
-> bar
-baz
-
-### Example 211
-
-> bar
-
-baz
-
-### Example 212
-
-> bar
->
-baz
-
-### Example 213
-
-It is a consequence of the Laziness rule that any number of initial `>`s may be omitted on a continuation line of a nested block quote:
-
-> > > foo
-bar
-
-### Example 214
-
->>> foo
-> bar
->>baz
-
-### Example 215
-
-When including an indented code block in a block quote, remember that the block quote marker includes both the `>` and a following space. So five spaces are needed after the `>`:
-<p>After a valid domain, zero or more non-space non-< characters may follow:</p>
-
-<p>Visit <a href="http://www.commonmark.org/help">www.commonmark.org/help</a> for more information.</p>
-
-<h3 id="example-599">Example 599</h3>
-
-<p>Trailing punctuation (specifically, ?, !, ., ,, :, *, _, and ~) will not be considered part of the autolink, though they may be included in the interior of the link:</p>
-After a valid domain, zero or more non-space non-< characters may follow:
-
-Visit www.commonmark.org/help for more information.
-
-### Example 599
-
-Trailing punctuation (specifically, ?, !, ., ,, :, \*, \_, and ~) will not be considered part of the autolink, though they may be included in the interior of the link: