diff options
author | GitLab Bot <gitlab-bot@gitlab.com> | 2022-10-20 09:40:42 +0000 |
---|---|---|
committer | GitLab Bot <gitlab-bot@gitlab.com> | 2022-10-20 09:40:42 +0000 |
commit | ee664acb356f8123f4f6b00b73c1e1cf0866c7fb (patch) | |
tree | f8479f94a28f66654c6a4f6fb99bad6b4e86a40e /glfm_specification | |
parent | 62f7d5c5b69180e82ae8196b7b429eeffc8e7b4f (diff) | |
download | gitlab-ce-ee664acb356f8123f4f6b00b73c1e1cf0866c7fb.tar.gz |
Add latest changes from gitlab-org/gitlab@15-5-stable-eev15.5.0-rc42
Diffstat (limited to 'glfm_specification')
13 files changed, 9624 insertions, 440 deletions
diff --git a/glfm_specification/example_snapshots/examples_index.yml b/glfm_specification/example_snapshots/examples_index.yml index fd3e350f58a..c0739912399 100644 --- a/glfm_specification/example_snapshots/examples_index.yml +++ b/glfm_specification/example_snapshots/examples_index.yml @@ -2012,75 +2012,75 @@ 06_15_00__inlines__textual_content__003: spec_txt_example_position: 673 source_specification: commonmark -07_01_00__gitlab_specific_markdown__footnotes__001: +07_01_00__gitlab_official_specification_markdown__footnotes__001: spec_txt_example_position: 674 source_specification: gitlab -07_02_00__gitlab_specific_markdown__task_list_items__001: +07_02_00__gitlab_official_specification_markdown__task_list_items__001: spec_txt_example_position: 675 source_specification: gitlab -07_02_00__gitlab_specific_markdown__task_list_items__002: +07_02_00__gitlab_official_specification_markdown__task_list_items__002: spec_txt_example_position: 676 source_specification: gitlab -07_02_00__gitlab_specific_markdown__task_list_items__003: +07_02_00__gitlab_official_specification_markdown__task_list_items__003: spec_txt_example_position: 677 source_specification: gitlab -07_02_00__gitlab_specific_markdown__task_list_items__004: +07_02_00__gitlab_official_specification_markdown__task_list_items__004: spec_txt_example_position: 678 source_specification: gitlab -07_03_00__gitlab_specific_markdown__front_matter__001: +07_03_00__gitlab_official_specification_markdown__front_matter__001: spec_txt_example_position: 679 source_specification: gitlab -07_03_00__gitlab_specific_markdown__front_matter__002: +07_03_00__gitlab_official_specification_markdown__front_matter__002: spec_txt_example_position: 680 source_specification: gitlab -07_03_00__gitlab_specific_markdown__front_matter__003: +07_03_00__gitlab_official_specification_markdown__front_matter__003: spec_txt_example_position: 681 source_specification: gitlab -07_03_00__gitlab_specific_markdown__front_matter__004: +07_03_00__gitlab_official_specification_markdown__front_matter__004: spec_txt_example_position: 682 source_specification: gitlab -07_03_00__gitlab_specific_markdown__front_matter__005: +07_03_00__gitlab_official_specification_markdown__front_matter__005: spec_txt_example_position: 683 source_specification: gitlab -07_04_00__gitlab_specific_markdown__audio__001: +07_04_00__gitlab_official_specification_markdown__table_of_contents__001: spec_txt_example_position: 684 source_specification: gitlab -07_04_00__gitlab_specific_markdown__audio__002: +07_04_00__gitlab_official_specification_markdown__table_of_contents__002: spec_txt_example_position: 685 source_specification: gitlab -07_05_00__gitlab_specific_markdown__video__001: +07_04_00__gitlab_official_specification_markdown__table_of_contents__003: spec_txt_example_position: 686 source_specification: gitlab -07_05_00__gitlab_specific_markdown__video__002: +07_04_00__gitlab_official_specification_markdown__table_of_contents__004: spec_txt_example_position: 687 source_specification: gitlab -07_06_00__gitlab_specific_markdown__table_of_contents__001: +08_01_00__gitlab_internal_extension_markdown__audio__001: spec_txt_example_position: 688 source_specification: gitlab -07_06_00__gitlab_specific_markdown__table_of_contents__002: +08_01_00__gitlab_internal_extension_markdown__audio__002: spec_txt_example_position: 689 source_specification: gitlab -07_06_00__gitlab_specific_markdown__table_of_contents__003: +08_02_00__gitlab_internal_extension_markdown__video__001: spec_txt_example_position: 690 source_specification: gitlab -07_06_00__gitlab_specific_markdown__table_of_contents__004: +08_02_00__gitlab_internal_extension_markdown__video__002: spec_txt_example_position: 691 source_specification: gitlab -08_01_00__examples_using_internal_extensions__markdown_preview_api_request_overrides__001: +08_03_00__gitlab_internal_extension_markdown__markdown_preview_api_request_overrides__001: spec_txt_example_position: 692 source_specification: gitlab -08_01_00__examples_using_internal_extensions__markdown_preview_api_request_overrides__002: +08_03_00__gitlab_internal_extension_markdown__markdown_preview_api_request_overrides__002: spec_txt_example_position: 693 source_specification: gitlab -08_01_00__examples_using_internal_extensions__markdown_preview_api_request_overrides__003: +08_03_00__gitlab_internal_extension_markdown__markdown_preview_api_request_overrides__003: spec_txt_example_position: 694 source_specification: gitlab -08_01_00__examples_using_internal_extensions__markdown_preview_api_request_overrides__004: +08_03_00__gitlab_internal_extension_markdown__markdown_preview_api_request_overrides__004: spec_txt_example_position: 695 source_specification: gitlab -08_01_00__examples_using_internal_extensions__markdown_preview_api_request_overrides__005: +08_03_00__gitlab_internal_extension_markdown__markdown_preview_api_request_overrides__005: spec_txt_example_position: 696 source_specification: gitlab -08_01_00__examples_using_internal_extensions__markdown_preview_api_request_overrides__006: +08_03_00__gitlab_internal_extension_markdown__markdown_preview_api_request_overrides__006: spec_txt_example_position: 697 source_specification: gitlab diff --git a/glfm_specification/example_snapshots/html.yml b/glfm_specification/example_snapshots/html.yml index e683c37a7ac..ef2ba39f925 100644 --- a/glfm_specification/example_snapshots/html.yml +++ b/glfm_specification/example_snapshots/html.yml @@ -7638,7 +7638,7 @@ <p data-sourcepos="1:1-1:19" dir="auto">Multiple spaces</p> wysiwyg: |- <p>Multiple spaces</p> -07_01_00__gitlab_specific_markdown__footnotes__001: +07_01_00__gitlab_official_specification_markdown__footnotes__001: canonical: | <p> footnote reference tag @@ -7671,7 +7671,7 @@ wysiwyg: |- <p>footnote reference tag <sup identifier="fortytwo">fortytwo</sup></p> <div node="footnoteDefinition(paragraph("footnote text"))" htmlattributes="[object Object]"><p>footnote text</p></div> -07_02_00__gitlab_specific_markdown__task_list_items__001: +07_02_00__gitlab_official_specification_markdown__task_list_items__001: canonical: | <ul> <li> @@ -7687,7 +7687,7 @@ </ul> wysiwyg: |- <ul start="1" parens="false" data-type="taskList"><li data-checked="false" data-type="taskItem"><label><input type="checkbox"><span></span></label><div><p>incomplete</p></div></li></ul> -07_02_00__gitlab_specific_markdown__task_list_items__002: +07_02_00__gitlab_official_specification_markdown__task_list_items__002: canonical: | <ul> <li> @@ -7703,7 +7703,7 @@ </ul> wysiwyg: |- <ul start="1" parens="false" data-type="taskList"><li data-checked="true" data-type="taskItem"><label><input type="checkbox" checked="checked"><span></span></label><div><p>completed</p></div></li></ul> -07_02_00__gitlab_specific_markdown__task_list_items__003: +07_02_00__gitlab_official_specification_markdown__task_list_items__003: canonical: | <ul> <li> @@ -7720,9 +7720,7 @@ <task-button></task-button><input type="checkbox" class="task-list-item-checkbox" data-inapplicable disabled> <s>inapplicable</s> </li> </ul> - wysiwyg: |- - <ul bullet="*"><li><p>[~] inapplicable</p></li></ul> -07_02_00__gitlab_specific_markdown__task_list_items__004: +07_02_00__gitlab_official_specification_markdown__task_list_items__004: canonical: | <ul> <li> @@ -7745,9 +7743,7 @@ <p data-sourcepos="3:3-3:20">text in loose list</p> </li> </ul> - wysiwyg: |- - Inapplicable task list items not yet implemented for WYSYWIG -07_03_00__gitlab_specific_markdown__front_matter__001: +07_03_00__gitlab_official_specification_markdown__front_matter__001: canonical: | <pre> <code> @@ -7761,7 +7757,7 @@ </div> wysiwyg: |- <pre language="yaml" class="content-editor-code-block undefined code highlight" isfrontmatter="true"><code>title: YAML front matter</code></pre> -07_03_00__gitlab_specific_markdown__front_matter__002: +07_03_00__gitlab_official_specification_markdown__front_matter__002: canonical: | <pre> <code> @@ -7775,7 +7771,7 @@ </div> wysiwyg: |- <pre language="toml" class="content-editor-code-block undefined code highlight" isfrontmatter="true"><code>title: TOML front matter</code></pre> -07_03_00__gitlab_specific_markdown__front_matter__003: +07_03_00__gitlab_official_specification_markdown__front_matter__003: canonical: | <pre> <code> @@ -7795,7 +7791,7 @@ <pre language="json" class="content-editor-code-block undefined code highlight" isfrontmatter="true"><code>{ "title": "JSON front matter" }</code></pre> -07_03_00__gitlab_specific_markdown__front_matter__004: +07_03_00__gitlab_official_specification_markdown__front_matter__004: canonical: | <p>text</p> <hr> @@ -7809,7 +7805,7 @@ <p>text</p> <hr> <h2>title: YAML front matter</h2> -07_03_00__gitlab_specific_markdown__front_matter__005: +07_03_00__gitlab_official_specification_markdown__front_matter__005: canonical: | <hr> <h2>title: YAML front matter</h2> @@ -7820,37 +7816,7 @@ wysiwyg: |- <hr> <h2>title: YAML front matter</h2> -07_04_00__gitlab_specific_markdown__audio__001: - canonical: | - <p><audio src="audio.oga" title="audio title"></audio></p> - static: |- - <p data-sourcepos="1:1-1:33" dir="auto"><span class="media-container audio-container"><audio src="audio.oga" controls="true" data-setup="{}" data-title="audio title"></audio><a href="audio.oga" target="_blank" rel="noopener noreferrer" title="Download 'audio title'">audio title</a></span></p> - wysiwyg: |- - <p><span class="media-container audio-container"><audio src="audio.oga" controls="true" data-setup="{}" data-title="audio"></audio><a href="audio.oga">audio</a></span></p> -07_04_00__gitlab_specific_markdown__audio__002: - canonical: | - <p><audio src="audio.oga" title="audio title"></audio></p> - static: |- - <p data-sourcepos="3:1-3:15" dir="auto"><span class="media-container audio-container"><audio src="audio.oga" controls="true" data-setup="{}" data-title="audio title"></audio><a href="audio.oga" target="_blank" rel="noopener noreferrer" title="Download 'audio title'">audio title</a></span></p> - wysiwyg: |- - <pre>[audio]: audio.oga "audio title"</pre> - <p><span class="media-container audio-container"><audio src="audio.oga" controls="true" data-setup="{}" data-title="audio"></audio><a href="audio.oga">audio</a></span></p> -07_05_00__gitlab_specific_markdown__video__001: - canonical: | - <p><video src="video.m4v" title="video title"></video></p> - static: |- - <p data-sourcepos="1:1-1:33" dir="auto"><span class="media-container video-container"><video src="video.m4v" controls="true" data-setup="{}" data-title="video title" width="400" preload="metadata"></video><a href="video.m4v" target="_blank" rel="noopener noreferrer" title="Download 'video title'">video title</a></span></p> - wysiwyg: |- - <p><span class="media-container video-container"><video src="video.m4v" controls="true" data-setup="{}" data-title="video"></video><a href="video.m4v">video</a></span></p> -07_05_00__gitlab_specific_markdown__video__002: - canonical: | - <p><video src="video.mov" title="video title"></video></p> - static: |- - <p data-sourcepos="3:1-3:15" dir="auto"><span class="media-container video-container"><video src="video.mov" controls="true" data-setup="{}" data-title="video title" width="400" preload="metadata"></video><a href="video.mov" target="_blank" rel="noopener noreferrer" title="Download 'video title'">video title</a></span></p> - wysiwyg: |- - <pre>[video]: video.mov "video title"</pre> - <p><span class="media-container video-container"><video src="video.mov" controls="true" data-setup="{}" data-title="video"></video><a href="video.mov">video</a></span></p> -07_06_00__gitlab_specific_markdown__table_of_contents__001: +07_04_00__gitlab_official_specification_markdown__table_of_contents__001: canonical: | <nav> <ul> @@ -7874,7 +7840,7 @@ <div class="table-of-contents gl-border-1 gl-border-solid gl-text-center gl-border-gray-100 gl-mb-5">Table of contents</div> <h1>Heading 1</h1> <h2>Heading 2</h2> -07_06_00__gitlab_specific_markdown__table_of_contents__002: +07_04_00__gitlab_official_specification_markdown__table_of_contents__002: canonical: | <nav> <ul> @@ -7898,7 +7864,7 @@ <div class="table-of-contents gl-border-1 gl-border-solid gl-text-center gl-border-gray-100 gl-mb-5">Table of contents</div> <h1>Heading 1</h1> <h2>Heading 2</h2> -07_06_00__gitlab_specific_markdown__table_of_contents__003: +07_04_00__gitlab_official_specification_markdown__table_of_contents__003: canonical: | <p>[[<em>TOC</em>]]text</p> <p>text[TOC]</p> @@ -7912,7 +7878,7 @@ text</p> <p>text [TOC]</p> -07_06_00__gitlab_specific_markdown__table_of_contents__004: +07_04_00__gitlab_official_specification_markdown__table_of_contents__004: canonical: | <nav> <ul> @@ -7927,45 +7893,63 @@ wysiwyg: |- <div class="table-of-contents gl-border-1 gl-border-solid gl-text-center gl-border-gray-100 gl-mb-5">Table of contents</div> <h1>Heading 1</h1> -08_01_00__examples_using_internal_extensions__markdown_preview_api_request_overrides__001: +08_01_00__gitlab_internal_extension_markdown__audio__001: + canonical: | + <p><audio src="audio.oga" title="audio title"></audio></p> + static: |- + <p data-sourcepos="1:1-1:33" dir="auto"><span class="media-container audio-container"><audio src="audio.oga" controls="true" data-setup="{}" data-title="audio title"></audio><a href="audio.oga" target="_blank" rel="noopener noreferrer" title="Download 'audio title'">audio title</a></span></p> + wysiwyg: |- + <p><span class="media-container audio-container"><audio src="audio.oga" controls="true" data-setup="{}" data-title="audio"></audio><a href="audio.oga">audio</a></span></p> +08_01_00__gitlab_internal_extension_markdown__audio__002: + canonical: | + <p><audio src="audio.oga" title="audio title"></audio></p> + static: |- + <p data-sourcepos="3:1-3:15" dir="auto"><span class="media-container audio-container"><audio src="audio.oga" controls="true" data-setup="{}" data-title="audio title"></audio><a href="audio.oga" target="_blank" rel="noopener noreferrer" title="Download 'audio title'">audio title</a></span></p> + wysiwyg: |- + <pre>[audio]: audio.oga "audio title"</pre> + <p><span class="media-container audio-container"><audio src="audio.oga" controls="true" data-setup="{}" data-title="audio"></audio><a href="audio.oga">audio</a></span></p> +08_02_00__gitlab_internal_extension_markdown__video__001: + canonical: | + <p><video src="video.m4v" title="video title"></video></p> + static: |- + <p data-sourcepos="1:1-1:33" dir="auto"><span class="media-container video-container"><video src="video.m4v" controls="true" data-setup="{}" data-title="video title" width="400" preload="metadata"></video><a href="video.m4v" target="_blank" rel="noopener noreferrer" title="Download 'video title'">video title</a></span></p> + wysiwyg: |- + <p><span class="media-container video-container"><video src="video.m4v" controls="true" data-setup="{}" data-title="video"></video><a href="video.m4v">video</a></span></p> +08_02_00__gitlab_internal_extension_markdown__video__002: + canonical: | + <p><video src="video.mov" title="video title"></video></p> + static: |- + <p data-sourcepos="3:1-3:15" dir="auto"><span class="media-container video-container"><video src="video.mov" controls="true" data-setup="{}" data-title="video title" width="400" preload="metadata"></video><a href="video.mov" target="_blank" rel="noopener noreferrer" title="Download 'video title'">video title</a></span></p> + wysiwyg: |- + <pre>[video]: video.mov "video title"</pre> + <p><span class="media-container video-container"><video src="video.mov" controls="true" data-setup="{}" data-title="video"></video><a href="video.mov">video</a></span></p> +08_03_00__gitlab_internal_extension_markdown__markdown_preview_api_request_overrides__001: canonical: | <p><a href="groups-test-file">groups-test-file</a></p> static: |- <p data-sourcepos="1:1-1:45" dir="auto"><a href="/groups/glfm_group/-/uploads/groups-test-file" data-canonical-src="/uploads/groups-test-file" data-link="true" class="gfm">groups-test-file</a></p> - wysiwyg: |- - Not yet implemented. See https://gitlab.com/gitlab-org/gitlab/-/merge_requests/92507#note_1068159236 -08_01_00__examples_using_internal_extensions__markdown_preview_api_request_overrides__002: +08_03_00__gitlab_internal_extension_markdown__markdown_preview_api_request_overrides__002: canonical: | <p><a href="projects-test-file">projects-test-file</a></p> static: |- <p data-sourcepos="1:1-1:40" dir="auto"><a href="/glfm_group/glfm_project/-/blob/master/projects-test-file">projects-test-file</a></p> - wysiwyg: |- - Not yet implemented. See https://gitlab.com/gitlab-org/gitlab/-/merge_requests/92507#note_1068159236 -08_01_00__examples_using_internal_extensions__markdown_preview_api_request_overrides__003: +08_03_00__gitlab_internal_extension_markdown__markdown_preview_api_request_overrides__003: canonical: | <p>This project snippet ID reference IS filtered: $88888</p> static: |- <p data-sourcepos="1:1-1:53" dir="auto">This project snippet ID reference IS filtered: <a href="/glfm_group/glfm_project/-/snippets/88888" data-reference-type="snippet" data-original="$88888" data-link="false" data-link-reference="false" data-project="77777" data-snippet="88888" data-container="body" data-placement="top" title="glfm_project_snippet" class="gfm gfm-snippet has-tooltip">$88888</a></p> - wysiwyg: |- - Not yet implemented. See https://gitlab.com/gitlab-org/gitlab/-/merge_requests/92507#note_1068159236 -08_01_00__examples_using_internal_extensions__markdown_preview_api_request_overrides__004: +08_03_00__gitlab_internal_extension_markdown__markdown_preview_api_request_overrides__004: canonical: | <p>This personal snippet ID reference is not filtered: $99999</p> static: |- <p data-sourcepos="1:1-1:58" dir="auto">This personal snippet ID reference is not filtered: $99999</p> - wysiwyg: |- - Not yet implemented. See https://gitlab.com/gitlab-org/gitlab/-/merge_requests/92507#note_1068159236 -08_01_00__examples_using_internal_extensions__markdown_preview_api_request_overrides__005: +08_03_00__gitlab_internal_extension_markdown__markdown_preview_api_request_overrides__005: canonical: | <p><a href="project-wikis-test-file">project-wikis-test-file</a></p> static: |- <p data-sourcepos="1:1-1:50" dir="auto"><a href="/glfm_group/glfm_project/-/wikis/project-wikis-test-file" data-canonical-src="project-wikis-test-file">project-wikis-test-file</a></p> - wysiwyg: |- - Not yet implemented. See https://gitlab.com/gitlab-org/gitlab/-/merge_requests/92507#note_1068159236 -08_01_00__examples_using_internal_extensions__markdown_preview_api_request_overrides__006: +08_03_00__gitlab_internal_extension_markdown__markdown_preview_api_request_overrides__006: canonical: | <p><a href="group-wikis-test-file">group-wikis-test-file</a></p> static: |- <p data-sourcepos="1:1-1:46" dir="auto"><a href="/groups/glfm_group/-/wikis/group-wikis-test-file" data-canonical-src="group-wikis-test-file">group-wikis-test-file</a></p> - wysiwyg: |- - Not yet implemented. See https://gitlab.com/gitlab-org/gitlab/-/merge_requests/92507#note_1068159236 diff --git a/glfm_specification/example_snapshots/markdown.yml b/glfm_specification/example_snapshots/markdown.yml index 9af824e120f..867108a6cc5 100644 --- a/glfm_specification/example_snapshots/markdown.yml +++ b/glfm_specification/example_snapshots/markdown.yml @@ -2189,87 +2189,87 @@ Foo χρῆν 06_15_00__inlines__textual_content__003: | Multiple spaces -07_01_00__gitlab_specific_markdown__footnotes__001: | +07_01_00__gitlab_official_specification_markdown__footnotes__001: | footnote reference tag [^fortytwo] [^fortytwo]: footnote text -07_02_00__gitlab_specific_markdown__task_list_items__001: | +07_02_00__gitlab_official_specification_markdown__task_list_items__001: | - [ ] incomplete -07_02_00__gitlab_specific_markdown__task_list_items__002: | +07_02_00__gitlab_official_specification_markdown__task_list_items__002: | - [x] completed -07_02_00__gitlab_specific_markdown__task_list_items__003: | +07_02_00__gitlab_official_specification_markdown__task_list_items__003: | - [~] inapplicable -07_02_00__gitlab_specific_markdown__task_list_items__004: | +07_02_00__gitlab_official_specification_markdown__task_list_items__004: | - [~] inapplicable text in loose list -07_03_00__gitlab_specific_markdown__front_matter__001: | +07_03_00__gitlab_official_specification_markdown__front_matter__001: | --- title: YAML front matter --- -07_03_00__gitlab_specific_markdown__front_matter__002: | +07_03_00__gitlab_official_specification_markdown__front_matter__002: | +++ title: TOML front matter +++ -07_03_00__gitlab_specific_markdown__front_matter__003: | +07_03_00__gitlab_official_specification_markdown__front_matter__003: | ;;; { "title": "JSON front matter" } ;;; -07_03_00__gitlab_specific_markdown__front_matter__004: | +07_03_00__gitlab_official_specification_markdown__front_matter__004: | text --- title: YAML front matter --- -07_03_00__gitlab_specific_markdown__front_matter__005: |2 +07_03_00__gitlab_official_specification_markdown__front_matter__005: |2 --- title: YAML front matter --- -07_04_00__gitlab_specific_markdown__audio__001: | - ![audio](audio.oga "audio title") -07_04_00__gitlab_specific_markdown__audio__002: | - [audio]: audio.oga "audio title" - - ![audio][audio] -07_05_00__gitlab_specific_markdown__video__001: | - ![video](video.m4v "video title") -07_05_00__gitlab_specific_markdown__video__002: | - [video]: video.mov "video title" - - ![video][video] -07_06_00__gitlab_specific_markdown__table_of_contents__001: | +07_04_00__gitlab_official_specification_markdown__table_of_contents__001: | [TOC] # Heading 1 ## Heading 2 -07_06_00__gitlab_specific_markdown__table_of_contents__002: | +07_04_00__gitlab_official_specification_markdown__table_of_contents__002: | [[_TOC_]] # Heading 1 ## Heading 2 -07_06_00__gitlab_specific_markdown__table_of_contents__003: | +07_04_00__gitlab_official_specification_markdown__table_of_contents__003: | [[_TOC_]] text text [TOC] -07_06_00__gitlab_specific_markdown__table_of_contents__004: |2 +07_04_00__gitlab_official_specification_markdown__table_of_contents__004: |2 [[_TOC_]] # Heading 1 -08_01_00__examples_using_internal_extensions__markdown_preview_api_request_overrides__001: | +08_01_00__gitlab_internal_extension_markdown__audio__001: | + ![audio](audio.oga "audio title") +08_01_00__gitlab_internal_extension_markdown__audio__002: | + [audio]: audio.oga "audio title" + + ![audio][audio] +08_02_00__gitlab_internal_extension_markdown__video__001: | + ![video](video.m4v "video title") +08_02_00__gitlab_internal_extension_markdown__video__002: | + [video]: video.mov "video title" + + ![video][video] +08_03_00__gitlab_internal_extension_markdown__markdown_preview_api_request_overrides__001: | [groups-test-file](/uploads/groups-test-file) -08_01_00__examples_using_internal_extensions__markdown_preview_api_request_overrides__002: | +08_03_00__gitlab_internal_extension_markdown__markdown_preview_api_request_overrides__002: | [projects-test-file](projects-test-file) -08_01_00__examples_using_internal_extensions__markdown_preview_api_request_overrides__003: | +08_03_00__gitlab_internal_extension_markdown__markdown_preview_api_request_overrides__003: | This project snippet ID reference IS filtered: $88888 -08_01_00__examples_using_internal_extensions__markdown_preview_api_request_overrides__004: | +08_03_00__gitlab_internal_extension_markdown__markdown_preview_api_request_overrides__004: | This personal snippet ID reference is not filtered: $99999 -08_01_00__examples_using_internal_extensions__markdown_preview_api_request_overrides__005: | +08_03_00__gitlab_internal_extension_markdown__markdown_preview_api_request_overrides__005: | [project-wikis-test-file](project-wikis-test-file) -08_01_00__examples_using_internal_extensions__markdown_preview_api_request_overrides__006: | +08_03_00__gitlab_internal_extension_markdown__markdown_preview_api_request_overrides__006: | [group-wikis-test-file](group-wikis-test-file) diff --git a/glfm_specification/example_snapshots/prosemirror_json.yml b/glfm_specification/example_snapshots/prosemirror_json.yml index 1051b5ccdd7..de54518a574 100644 --- a/glfm_specification/example_snapshots/prosemirror_json.yml +++ b/glfm_specification/example_snapshots/prosemirror_json.yml @@ -20561,7 +20561,7 @@ } ] } -07_01_00__gitlab_specific_markdown__footnotes__001: |- +07_01_00__gitlab_official_specification_markdown__footnotes__001: |- { "type": "doc", "content": [ @@ -20601,7 +20601,7 @@ } ] } -07_02_00__gitlab_specific_markdown__task_list_items__001: |- +07_02_00__gitlab_official_specification_markdown__task_list_items__001: |- { "type": "doc", "content": [ @@ -20634,7 +20634,7 @@ } ] } -07_02_00__gitlab_specific_markdown__task_list_items__002: |- +07_02_00__gitlab_official_specification_markdown__task_list_items__002: |- { "type": "doc", "content": [ @@ -20667,11 +20667,7 @@ } ] } -07_02_00__gitlab_specific_markdown__task_list_items__003: |- - Inapplicable task list items not yet implemented for WYSYWIG -07_02_00__gitlab_specific_markdown__task_list_items__004: |- - Inapplicable task list items not yet implemented for WYSYWIG -07_03_00__gitlab_specific_markdown__front_matter__001: |- +07_03_00__gitlab_official_specification_markdown__front_matter__001: |- { "type": "doc", "content": [ @@ -20691,7 +20687,7 @@ } ] } -07_03_00__gitlab_specific_markdown__front_matter__002: |- +07_03_00__gitlab_official_specification_markdown__front_matter__002: |- { "type": "doc", "content": [ @@ -20711,7 +20707,7 @@ } ] } -07_03_00__gitlab_specific_markdown__front_matter__003: |- +07_03_00__gitlab_official_specification_markdown__front_matter__003: |- { "type": "doc", "content": [ @@ -20731,7 +20727,7 @@ } ] } -07_03_00__gitlab_specific_markdown__front_matter__004: |- +07_03_00__gitlab_official_specification_markdown__front_matter__004: |- { "type": "doc", "content": [ @@ -20761,7 +20757,7 @@ } ] } -07_03_00__gitlab_specific_markdown__front_matter__005: |- +07_03_00__gitlab_official_specification_markdown__front_matter__005: |- { "type": "doc", "content": [ @@ -20782,61 +20778,73 @@ } ] } -07_04_00__gitlab_specific_markdown__audio__001: |- +07_04_00__gitlab_official_specification_markdown__table_of_contents__001: |- { "type": "doc", "content": [ { - "type": "paragraph", + "type": "tableOfContents" + }, + { + "type": "heading", + "attrs": { + "level": 1 + }, "content": [ { - "type": "audio", - "attrs": { - "uploading": false, - "src": "audio.oga", - "canonicalSrc": "audio.oga", - "alt": "audio" - } + "type": "text", + "text": "Heading 1" + } + ] + }, + { + "type": "heading", + "attrs": { + "level": 2 + }, + "content": [ + { + "type": "text", + "text": "Heading 2" } ] } ] } -07_04_00__gitlab_specific_markdown__audio__002: |- +07_04_00__gitlab_official_specification_markdown__table_of_contents__002: |- { "type": "doc", "content": [ { - "type": "referenceDefinition", + "type": "tableOfContents" + }, + { + "type": "heading", "attrs": { - "identifier": "audio", - "url": "audio.oga", - "title": "audio title" + "level": 1 }, "content": [ { "type": "text", - "text": "[audio]: audio.oga \"audio title\"" + "text": "Heading 1" } ] }, { - "type": "paragraph", + "type": "heading", + "attrs": { + "level": 2 + }, "content": [ { - "type": "audio", - "attrs": { - "uploading": false, - "src": "audio.oga", - "canonicalSrc": "audio", - "alt": "audio" - } + "type": "text", + "text": "Heading 2" } ] } ] } -07_05_00__gitlab_specific_markdown__video__001: |- +07_04_00__gitlab_official_specification_markdown__table_of_contents__003: |- { "type": "doc", "content": [ @@ -20844,33 +20852,21 @@ "type": "paragraph", "content": [ { - "type": "video", - "attrs": { - "uploading": false, - "src": "video.m4v", - "canonicalSrc": "video.m4v", - "alt": "video" - } - } - ] - } - ] - } -07_05_00__gitlab_specific_markdown__video__002: |- - { - "type": "doc", - "content": [ - { - "type": "referenceDefinition", - "attrs": { - "identifier": "video", - "url": "video.mov", - "title": "video title" - }, - "content": [ + "type": "text", + "text": "[[" + }, { "type": "text", - "text": "[video]: video.mov \"video title\"" + "marks": [ + { + "type": "italic" + } + ], + "text": "TOC" + }, + { + "type": "text", + "text": "]]\ntext" } ] }, @@ -20878,19 +20874,14 @@ "type": "paragraph", "content": [ { - "type": "video", - "attrs": { - "uploading": false, - "src": "video.mov", - "canonicalSrc": "video", - "alt": "video" - } + "type": "text", + "text": "text\n[TOC]" } ] } ] } -07_06_00__gitlab_specific_markdown__table_of_contents__001: |- +07_04_00__gitlab_official_specification_markdown__table_of_contents__004: |- { "type": "doc", "content": [ @@ -20908,55 +20899,64 @@ "text": "Heading 1" } ] - }, + } + ] + } +08_01_00__gitlab_internal_extension_markdown__audio__001: |- + { + "type": "doc", + "content": [ { - "type": "heading", - "attrs": { - "level": 2 - }, + "type": "paragraph", "content": [ { - "type": "text", - "text": "Heading 2" + "type": "audio", + "attrs": { + "uploading": false, + "src": "audio.oga", + "canonicalSrc": "audio.oga", + "alt": "audio" + } } ] } ] } -07_06_00__gitlab_specific_markdown__table_of_contents__002: |- +08_01_00__gitlab_internal_extension_markdown__audio__002: |- { "type": "doc", "content": [ { - "type": "tableOfContents" - }, - { - "type": "heading", + "type": "referenceDefinition", "attrs": { - "level": 1 + "identifier": "audio", + "url": "audio.oga", + "title": "audio title" }, "content": [ { "type": "text", - "text": "Heading 1" + "text": "[audio]: audio.oga \"audio title\"" } ] }, { - "type": "heading", - "attrs": { - "level": 2 - }, + "type": "paragraph", "content": [ { - "type": "text", - "text": "Heading 2" + "type": "audio", + "attrs": { + "uploading": false, + "src": "audio.oga", + "canonicalSrc": "audio", + "alt": "audio" + } } ] } ] } -07_06_00__gitlab_specific_markdown__table_of_contents__003: |- +08_02_00__gitlab_internal_extension_markdown__video__001: |- { "type": "doc", "content": [ @@ -20964,65 +20964,49 @@ "type": "paragraph", "content": [ { - "type": "text", - "text": "[[" - }, - { - "type": "text", - "marks": [ - { - "type": "italic" - } - ], - "text": "TOC" - }, - { - "type": "text", - "text": "]]\ntext" - } - ] - }, - { - "type": "paragraph", - "content": [ - { - "type": "text", - "text": "text\n[TOC]" + "type": "video", + "attrs": { + "uploading": false, + "src": "video.m4v", + "canonicalSrc": "video.m4v", + "alt": "video" + } } ] } ] } -07_06_00__gitlab_specific_markdown__table_of_contents__004: |- +08_02_00__gitlab_internal_extension_markdown__video__002: |- { "type": "doc", "content": [ { - "type": "tableOfContents" - }, - { - "type": "heading", + "type": "referenceDefinition", "attrs": { - "level": 1 + "identifier": "video", + "url": "video.mov", + "title": "video title" }, "content": [ { "type": "text", - "text": "Heading 1" + "text": "[video]: video.mov \"video title\"" + } + ] + }, + { + "type": "paragraph", + "content": [ + { + "type": "video", + "attrs": { + "uploading": false, + "src": "video.mov", + "canonicalSrc": "video", + "alt": "video" + } } ] } ] } -08_01_00__examples_using_internal_extensions__markdown_preview_api_request_overrides__001: |- - Not yet implemented. See https://gitlab.com/gitlab-org/gitlab/-/merge_requests/92507#note_1068159236 -08_01_00__examples_using_internal_extensions__markdown_preview_api_request_overrides__002: |- - Not yet implemented. See https://gitlab.com/gitlab-org/gitlab/-/merge_requests/92507#note_1068159236 -08_01_00__examples_using_internal_extensions__markdown_preview_api_request_overrides__003: |- - Not yet implemented. See https://gitlab.com/gitlab-org/gitlab/-/merge_requests/92507#note_1068159236 -08_01_00__examples_using_internal_extensions__markdown_preview_api_request_overrides__004: |- - Not yet implemented. See https://gitlab.com/gitlab-org/gitlab/-/merge_requests/92507#note_1068159236 -08_01_00__examples_using_internal_extensions__markdown_preview_api_request_overrides__005: |- - Not yet implemented. See https://gitlab.com/gitlab-org/gitlab/-/merge_requests/92507#note_1068159236 -08_01_00__examples_using_internal_extensions__markdown_preview_api_request_overrides__006: |- - Not yet implemented. See https://gitlab.com/gitlab-org/gitlab/-/merge_requests/92507#note_1068159236 diff --git a/glfm_specification/input/github_flavored_markdown/ghfm_spec_v_0.29.txt b/glfm_specification/input/github_flavored_markdown/ghfm_spec_v_0.29.md index 582131d700a..1702761563e 100644 --- a/glfm_specification/input/github_flavored_markdown/ghfm_spec_v_0.29.txt +++ b/glfm_specification/input/github_flavored_markdown/ghfm_spec_v_0.29.md @@ -2077,7 +2077,7 @@ followed by one of the strings (case-insensitive) `address`, `h1`, `h2`, `h3`, `h4`, `h5`, `h6`, `head`, `header`, `hr`, `html`, `iframe`, `legend`, `li`, `link`, `main`, `menu`, `menuitem`, `nav`, `noframes`, `ol`, `optgroup`, `option`, `p`, `param`, -`section`, `source`, `summary`, `table`, `tbody`, `td`, +`section`, `summary`, `table`, `tbody`, `td`, `tfoot`, `th`, `thead`, `title`, `tr`, `track`, `ul`, followed by [whitespace], the end of the line, the string `>`, or the string `/>`.\ @@ -10224,4 +10224,3 @@ closers: After we're done, we remove all delimiters above `stack_bottom` from the delimiter stack. - diff --git a/glfm_specification/input/gitlab_flavored_markdown/glfm_example_metadata.yml b/glfm_specification/input/gitlab_flavored_markdown/glfm_example_metadata.yml index 3c043f5fba1..7fc1f9d9be0 100644 --- a/glfm_specification/input/gitlab_flavored_markdown/glfm_example_metadata.yml +++ b/glfm_specification/input/gitlab_flavored_markdown/glfm_example_metadata.yml @@ -1,14 +1,14 @@ --- -08_01_00__examples_using_internal_extensions__markdown_preview_api_request_overrides__001: +08_03_00__gitlab_internal_extension_markdown__markdown_preview_api_request_overrides__001: api_request_override_path: /groups/glfm_group/preview_markdown -08_01_00__examples_using_internal_extensions__markdown_preview_api_request_overrides__002: +08_03_00__gitlab_internal_extension_markdown__markdown_preview_api_request_overrides__002: api_request_override_path: /glfm_group/glfm_project/preview_markdown -08_01_00__examples_using_internal_extensions__markdown_preview_api_request_overrides__003: +08_03_00__gitlab_internal_extension_markdown__markdown_preview_api_request_overrides__003: api_request_override_path: /glfm_group/glfm_project/preview_markdown -08_01_00__examples_using_internal_extensions__markdown_preview_api_request_overrides__004: +08_03_00__gitlab_internal_extension_markdown__markdown_preview_api_request_overrides__004: api_request_override_path: /-/snippets/preview_markdown -08_01_00__examples_using_internal_extensions__markdown_preview_api_request_overrides__005: +08_03_00__gitlab_internal_extension_markdown__markdown_preview_api_request_overrides__005: api_request_override_path: /glfm_group/glfm_project/-/wikis/new_page/preview_markdown -08_01_00__examples_using_internal_extensions__markdown_preview_api_request_overrides__006: +08_03_00__gitlab_internal_extension_markdown__markdown_preview_api_request_overrides__006: ee: true api_request_override_path: /groups/glfm_group/-/wikis/new_page/preview_markdown diff --git a/glfm_specification/input/gitlab_flavored_markdown/glfm_example_normalizations.yml b/glfm_specification/input/gitlab_flavored_markdown/glfm_example_normalizations.yml index d576a8ddb51..06de4e687af 100644 --- a/glfm_specification/input/gitlab_flavored_markdown/glfm_example_normalizations.yml +++ b/glfm_specification/input/gitlab_flavored_markdown/glfm_example_normalizations.yml @@ -5,6 +5,7 @@ # - https://docs.gitlab.com/ee/development/gitlab_flavored_markdown/specification_guide/#glfm_example_normalizationsyml # # NOTE: All YAML anchors which are shared across one or more entries are defined in the `00_shared` section. +# They must all start with `00_` in order to be skipped during example name validation. 00_shared: 00_uri: &00_uri - regex: '(href|data-src)(=")(.*?)(test-file\.(png|zip)")' diff --git a/glfm_specification/input/gitlab_flavored_markdown/glfm_example_status.yml b/glfm_specification/input/gitlab_flavored_markdown/glfm_example_status.yml index a74c3492324..a0ce7f44a3c 100644 --- a/glfm_specification/input/gitlab_flavored_markdown/glfm_example_status.yml +++ b/glfm_specification/input/gitlab_flavored_markdown/glfm_example_status.yml @@ -12,49 +12,49 @@ skip_running_snapshot_static_html_tests: false # NOT YET SUPPORTED skip_running_snapshot_wysiwyg_html_tests: false skip_running_snapshot_prosemirror_json_tests: false -07_02_00__gitlab_specific_markdown__task_list_items__003: +07_02_00__gitlab_official_specification_markdown__task_list_items__003: skip_update_example_snapshot_html_wysiwyg: Inapplicable task list items not yet implemented for WYSYWIG skip_update_example_snapshot_prosemirror_json: Inapplicable task list items not yet implemented for WYSYWIG skip_running_conformance_wysiwyg_tests: Inapplicable task list items not yet implemented for WYSYWIG skip_running_snapshot_wysiwyg_html_tests: Inapplicable task list items not yet implemented for WYSYWIG skip_running_snapshot_prosemirror_json_tests: Inapplicable task list items not yet implemented for WYSYWIG -07_02_00__gitlab_specific_markdown__task_list_items__004: +07_02_00__gitlab_official_specification_markdown__task_list_items__004: skip_update_example_snapshot_html_wysiwyg: Inapplicable task list items not yet implemented for WYSYWIG skip_update_example_snapshot_prosemirror_json: Inapplicable task list items not yet implemented for WYSYWIG skip_running_conformance_wysiwyg_tests: Inapplicable task list items not yet implemented for WYSYWIG skip_running_snapshot_wysiwyg_html_tests: Inapplicable task list items not yet implemented for WYSYWIG skip_running_snapshot_prosemirror_json_tests: Inapplicable task list items not yet implemented for WYSYWIG -08_01_00__examples_using_internal_extensions__markdown_preview_api_request_overrides__001: +08_03_00__gitlab_internal_extension_markdown__markdown_preview_api_request_overrides__001: skip_update_example_snapshot_html_wysiwyg: Not yet implemented. See https://gitlab.com/gitlab-org/gitlab/-/merge_requests/92507#note_1068159236 skip_update_example_snapshot_prosemirror_json: Not yet implemented. See https://gitlab.com/gitlab-org/gitlab/-/merge_requests/92507#note_1068159236 skip_running_conformance_wysiwyg_tests: Not yet implemented. See https://gitlab.com/gitlab-org/gitlab/-/merge_requests/92507#note_1068159236 skip_running_snapshot_wysiwyg_html_tests: Not yet implemented. See https://gitlab.com/gitlab-org/gitlab/-/merge_requests/92507#note_1068159236 skip_running_snapshot_prosemirror_json_tests: Not yet implemented. See https://gitlab.com/gitlab-org/gitlab/-/merge_requests/92507#note_1068159236 -08_01_00__examples_using_internal_extensions__markdown_preview_api_request_overrides__002: +08_03_00__gitlab_internal_extension_markdown__markdown_preview_api_request_overrides__002: skip_update_example_snapshot_html_wysiwyg: Not yet implemented. See https://gitlab.com/gitlab-org/gitlab/-/merge_requests/92507#note_1068159236 skip_update_example_snapshot_prosemirror_json: Not yet implemented. See https://gitlab.com/gitlab-org/gitlab/-/merge_requests/92507#note_1068159236 skip_running_conformance_wysiwyg_tests: Not yet implemented. See https://gitlab.com/gitlab-org/gitlab/-/merge_requests/92507#note_1068159236 skip_running_snapshot_wysiwyg_html_tests: Not yet implemented. See https://gitlab.com/gitlab-org/gitlab/-/merge_requests/92507#note_1068159236 skip_running_snapshot_prosemirror_json_tests: Not yet implemented. See https://gitlab.com/gitlab-org/gitlab/-/merge_requests/92507#note_1068159236 -08_01_00__examples_using_internal_extensions__markdown_preview_api_request_overrides__003: +08_03_00__gitlab_internal_extension_markdown__markdown_preview_api_request_overrides__003: skip_update_example_snapshot_html_wysiwyg: Not yet implemented. See https://gitlab.com/gitlab-org/gitlab/-/merge_requests/92507#note_1068159236 skip_update_example_snapshot_prosemirror_json: Not yet implemented. See https://gitlab.com/gitlab-org/gitlab/-/merge_requests/92507#note_1068159236 skip_running_conformance_wysiwyg_tests: Not yet implemented. See https://gitlab.com/gitlab-org/gitlab/-/merge_requests/92507#note_1068159236 skip_running_snapshot_wysiwyg_html_tests: Not yet implemented. See https://gitlab.com/gitlab-org/gitlab/-/merge_requests/92507#note_1068159236 skip_running_snapshot_prosemirror_json_tests: Not yet implemented. See https://gitlab.com/gitlab-org/gitlab/-/merge_requests/92507#note_1068159236 -08_01_00__examples_using_internal_extensions__markdown_preview_api_request_overrides__004: +08_03_00__gitlab_internal_extension_markdown__markdown_preview_api_request_overrides__004: skip_update_example_snapshot_html_wysiwyg: Not yet implemented. See https://gitlab.com/gitlab-org/gitlab/-/merge_requests/92507#note_1068159236 skip_update_example_snapshot_prosemirror_json: Not yet implemented. See https://gitlab.com/gitlab-org/gitlab/-/merge_requests/92507#note_1068159236 skip_running_conformance_wysiwyg_tests: Not yet implemented. See https://gitlab.com/gitlab-org/gitlab/-/merge_requests/92507#note_1068159236 skip_running_snapshot_wysiwyg_html_tests: Not yet implemented. See https://gitlab.com/gitlab-org/gitlab/-/merge_requests/92507#note_1068159236 skip_running_snapshot_prosemirror_json_tests: Not yet implemented. See https://gitlab.com/gitlab-org/gitlab/-/merge_requests/92507#note_1068159236 -08_01_00__examples_using_internal_extensions__markdown_preview_api_request_overrides__005: +08_03_00__gitlab_internal_extension_markdown__markdown_preview_api_request_overrides__005: skip_update_example_snapshot_html_wysiwyg: Not yet implemented. See https://gitlab.com/gitlab-org/gitlab/-/merge_requests/92507#note_1068159236 skip_update_example_snapshot_prosemirror_json: Not yet implemented. See https://gitlab.com/gitlab-org/gitlab/-/merge_requests/92507#note_1068159236 skip_running_conformance_wysiwyg_tests: Not yet implemented. See https://gitlab.com/gitlab-org/gitlab/-/merge_requests/92507#note_1068159236 skip_running_snapshot_wysiwyg_html_tests: Not yet implemented. See https://gitlab.com/gitlab-org/gitlab/-/merge_requests/92507#note_1068159236 skip_running_snapshot_prosemirror_json_tests: Not yet implemented. See https://gitlab.com/gitlab-org/gitlab/-/merge_requests/92507#note_1068159236 -08_01_00__examples_using_internal_extensions__markdown_preview_api_request_overrides__006: +08_03_00__gitlab_internal_extension_markdown__markdown_preview_api_request_overrides__006: skip_update_example_snapshot_html_wysiwyg: Not yet implemented. See https://gitlab.com/gitlab-org/gitlab/-/merge_requests/92507#note_1068159236 skip_update_example_snapshot_prosemirror_json: Not yet implemented. See https://gitlab.com/gitlab-org/gitlab/-/merge_requests/92507#note_1068159236 skip_running_conformance_wysiwyg_tests: Not yet implemented. See https://gitlab.com/gitlab-org/gitlab/-/merge_requests/92507#note_1068159236 diff --git a/glfm_specification/input/gitlab_flavored_markdown/glfm_internal_extension_examples.md b/glfm_specification/input/gitlab_flavored_markdown/glfm_internal_extension_examples.md new file mode 100644 index 00000000000..171a8e430d3 --- /dev/null +++ b/glfm_specification/input/gitlab_flavored_markdown/glfm_internal_extension_examples.md @@ -0,0 +1,111 @@ +# GitLab Internal Extension Markdown + +## Audio + +See +[audio](https://docs.gitlab.com/ee/user/markdown.html#audio) in the GitLab Flavored Markdown documentation. + +GLFM renders image elements as an audio player as long as the resource’s file extension is +one of the following supported audio extensions `.mp3`, `.oga`, `.ogg`, `.spx`, and `.wav`. +Audio ignore the alternative text part of an image declaration. + +```````````````````````````````` example gitlab +![audio](audio.oga "audio title") +. +<p><audio src="audio.oga" title="audio title"></audio></p> +```````````````````````````````` + +Reference definitions work audio as well: + +```````````````````````````````` example gitlab +[audio]: audio.oga "audio title" + +![audio][audio] +. +<p><audio src="audio.oga" title="audio title"></audio></p> +```````````````````````````````` + +## Video + +See +[videos](https://docs.gitlab.com/ee/user/markdown.html#videos) in the GitLab Flavored Markdown documentation. + +GLFM renders image elements as a video player as long as the resource’s file extension is +one of the following supported video extensions `.mp4`, `.m4v`, `.mov`, `.webm`, and `.ogv`. +Videos ignore the alternative text part of an image declaration. + + +```````````````````````````````` example gitlab +![video](video.m4v "video title") +. +<p><video src="video.m4v" title="video title"></video></p> +```````````````````````````````` + +Reference definitions work video as well: + +```````````````````````````````` example gitlab +[video]: video.mov "video title" + +![video][video] +. +<p><video src="video.mov" title="video title"></video></p> +```````````````````````````````` + +## Markdown Preview API Request Overrides + +This section contains examples of all controllers which use `PreviewMarkdown` module +and use different `markdown_context_params`. They exercise the various `preview_markdown` +endpoints via `glfm_example_metadata.yml`. + + +`preview_markdown` exercising `groups` API endpoint and `UploadLinkFilter`: + +```````````````````````````````` example gitlab +[groups-test-file](/uploads/groups-test-file) +. +<p><a href="groups-test-file">groups-test-file</a></p> +```````````````````````````````` + +`preview_markdown` exercising `projects` API endpoint and `RepositoryLinkFilter`: + +```````````````````````````````` example gitlab +[projects-test-file](projects-test-file) +. +<p><a href="projects-test-file">projects-test-file</a></p> +```````````````````````````````` + +`preview_markdown` exercising `projects` API endpoint and `SnippetReferenceFilter`: + +```````````````````````````````` example gitlab +This project snippet ID reference IS filtered: $88888 +. +<p>This project snippet ID reference IS filtered: $88888</p> +```````````````````````````````` + +`preview_markdown` exercising personal (non-project) `snippets` API endpoint. This is +only used by the comment field on personal snippets. It has no unique custom markdown +extension behavior, and specifically does not render snippet references via +`SnippetReferenceFilter`, even if the ID is valid. + +```````````````````````````````` example gitlab +This personal snippet ID reference is not filtered: $99999 +. +<p>This personal snippet ID reference is not filtered: $99999</p> +```````````````````````````````` + +`preview_markdown` exercising project `wikis` API endpoint and `WikiLinkFilter`: + +```````````````````````````````` example gitlab +[project-wikis-test-file](project-wikis-test-file) +. +<p><a href="project-wikis-test-file">project-wikis-test-file</a></p> +```````````````````````````````` + +`preview_markdown` exercising group `wikis` API endpoint and `WikiLinkFilter`. This example +also requires an EE license enabling the `group_wikis` feature: + +```````````````````````````````` example gitlab +[group-wikis-test-file](group-wikis-test-file) +. +<p><a href="group-wikis-test-file">group-wikis-test-file</a></p> +```````````````````````````````` diff --git a/glfm_specification/input/gitlab_flavored_markdown/glfm_intro.txt b/glfm_specification/input/gitlab_flavored_markdown/glfm_intro.md index b5351bf37de..b5351bf37de 100644 --- a/glfm_specification/input/gitlab_flavored_markdown/glfm_intro.txt +++ b/glfm_specification/input/gitlab_flavored_markdown/glfm_intro.md diff --git a/glfm_specification/input/gitlab_flavored_markdown/glfm_canonical_examples.txt b/glfm_specification/input/gitlab_flavored_markdown/glfm_official_specification_examples.md index 10a46dcca6b..f2b62b1a4ac 100644 --- a/glfm_specification/input/gitlab_flavored_markdown/glfm_canonical_examples.txt +++ b/glfm_specification/input/gitlab_flavored_markdown/glfm_official_specification_examples.md @@ -1,4 +1,4 @@ -# GitLab-Specific Markdown +# GitLab Official Specification Markdown Currently, only some of the GitLab-specific markdown features are listed in this section. We will eventually add all @@ -200,57 +200,6 @@ title: YAML front matter <h2>title: YAML front matter</h2> ```````````````````````````````` -## Audio - -See -[audio](https://docs.gitlab.com/ee/user/markdown.html#audio) in the GitLab Flavored Markdown documentation. - -GLFM renders image elements as an audio player as long as the resource’s file extension is -one of the following supported audio extensions `.mp3`, `.oga`, `.ogg`, `.spx`, and `.wav`. -Audio ignore the alternative text part of an image declaration. - -```````````````````````````````` example gitlab -![audio](audio.oga "audio title") -. -<p><audio src="audio.oga" title="audio title"></audio></p> -```````````````````````````````` - -Reference definitions work audio as well: - -```````````````````````````````` example gitlab -[audio]: audio.oga "audio title" - -![audio][audio] -. -<p><audio src="audio.oga" title="audio title"></audio></p> -```````````````````````````````` - -## Video - -See -[videos](https://docs.gitlab.com/ee/user/markdown.html#videos) in the GitLab Flavored Markdown documentation. - -GLFM renders image elements as a video player as long as the resource’s file extension is -one of the following supported video extensions `.mp4`, `.m4v`, `.mov`, `.webm`, and `.ogv`. -Videos ignore the alternative text part of an image declaration. - - -```````````````````````````````` example gitlab -![video](video.m4v "video title") -. -<p><video src="video.m4v" title="video title"></video></p> -```````````````````````````````` - -Reference definitions work video as well: - -```````````````````````````````` example gitlab -[video]: video.mov "video title" - -![video][video] -. -<p><video src="video.mov" title="video title"></video></p> -```````````````````````````````` - ## Table of contents See @@ -326,64 +275,3 @@ A table of contents can be indented with up to three spaces. </nav> <h1>Heading 1</h1> ```````````````````````````````` - -# Examples Using Internal Extensions - -## Markdown Preview API Request Overrides - -This section contains examples of all controllers which use `PreviewMarkdown` module -and use different `markdown_context_params`. They exercise the various `preview_markdown` -endpoints via `glfm_example_metadata.yml`. - - -`preview_markdown` exercising `groups` API endpoint and `UploadLinkFilter`: - -```````````````````````````````` example gitlab -[groups-test-file](/uploads/groups-test-file) -. -<p><a href="groups-test-file">groups-test-file</a></p> -```````````````````````````````` - -`preview_markdown` exercising `projects` API endpoint and `RepositoryLinkFilter`: - -```````````````````````````````` example gitlab -[projects-test-file](projects-test-file) -. -<p><a href="projects-test-file">projects-test-file</a></p> -```````````````````````````````` - -`preview_markdown` exercising `projects` API endpoint and `SnippetReferenceFilter`: - -```````````````````````````````` example gitlab -This project snippet ID reference IS filtered: $88888 -. -<p>This project snippet ID reference IS filtered: $88888</p> -```````````````````````````````` - -`preview_markdown` exercising personal (non-project) `snippets` API endpoint. This is -only used by the comment field on personal snippets. It has no unique custom markdown -extension behavior, and specifically does not render snippet references via -`SnippetReferenceFilter`, even if the ID is valid. - -```````````````````````````````` example gitlab -This personal snippet ID reference is not filtered: $99999 -. -<p>This personal snippet ID reference is not filtered: $99999</p> -```````````````````````````````` - -`preview_markdown` exercising project `wikis` API endpoint and `WikiLinkFilter`: - -```````````````````````````````` example gitlab -[project-wikis-test-file](project-wikis-test-file) -. -<p><a href="project-wikis-test-file">project-wikis-test-file</a></p> -```````````````````````````````` - -`preview_markdown` exercising group `wikis` API endpoint and `WikiLinkFilter`. This example -also requires an EE license enabling the `group_wikis` feature: - -```````````````````````````````` example gitlab -[group-wikis-test-file](group-wikis-test-file) -. -<p><a href="group-wikis-test-file">group-wikis-test-file</a></p> -```````````````````````````````` diff --git a/glfm_specification/output/spec.html b/glfm_specification/output/spec.html index b8315390200..e57cd344618 100644 --- a/glfm_specification/output/spec.html +++ b/glfm_specification/output/spec.html @@ -1 +1,9219 @@ -PLACEHOLDER FILE. Actual contents will be added in a future MR. +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="1:1-4:3" class="code highlight js-syntax-highlight language-yaml" lang="yaml" data-lang-params="frontmatter" v-pre="true"><code><span id="LC1" class="line" lang="yaml"><span class="na">title</span><span class="pi">:</span> <span class="s">GitLab Flavored Markdown (GLFM) Spec</span></span> +<span id="LC2" class="line" lang="yaml"><span class="na">version</span><span class="pi">:</span> <span class="s">alpha</span></span></code></pre> +<copy-code></copy-code> +</div> +<h1 data-sourcepos="6:1-6:14" dir="auto"> +<a id="user-content-introduction" class="anchor" href="#introduction" aria-hidden="true"></a>Introduction</h1> +<p data-sourcepos="8:1-8:84" dir="auto">TODO: Write a GitLab-specific version of the GitHub Flavored Markdown intro section.</p> +<h1 data-sourcepos="10:1-10:15" dir="auto"> +<a id="user-content-preliminaries" class="anchor" href="#preliminaries" aria-hidden="true"></a>Preliminaries</h1> +<h2 data-sourcepos="12:1-12:23" dir="auto"> +<a id="user-content-characters-and-lines" class="anchor" href="#characters-and-lines" aria-hidden="true"></a>Characters and lines</h2> +<p data-sourcepos="14:1-15:9" dir="auto">Any sequence of [characters] is a valid CommonMark +document.</p> +<p data-sourcepos="17:1-20:26" dir="auto">A <a href="@">character</a> is a Unicode code point. Although some +code points (for example, combining accents) do not correspond to +characters in an intuitive sense, all code points count as characters +for purposes of this spec.</p> +<p data-sourcepos="22:1-24:22" dir="auto">This spec does not specify an encoding; it thinks of lines as composed +of [characters] rather than bytes. A conforming parser may be limited +to a certain encoding.</p> +<p data-sourcepos="26:1-28:50" dir="auto">A <a href="@">line</a> is a sequence of zero or more [characters] +other than newline (<code>U+000A</code>) or carriage return (<code>U+000D</code>), +followed by a [line ending] or by the end of file.</p> +<p data-sourcepos="30:1-32:18" dir="auto">A <a href="@">line ending</a> is a newline (<code>U+000A</code>), a carriage return +(<code>U+000D</code>) not followed by a newline, or a carriage return and a +following newline.</p> +<p data-sourcepos="34:1-35:59" dir="auto">A line containing no characters, or a line containing only spaces +(<code>U+0020</code>) or tabs (<code>U+0009</code>), is called a <a href="@">blank line</a>.</p> +<p data-sourcepos="37:1-37:73" dir="auto">The following definitions of character classes will be used in this spec:</p> +<p data-sourcepos="39:1-41:52" dir="auto">A <a href="@">whitespace character</a> is a space +(<code>U+0020</code>), tab (<code>U+0009</code>), newline (<code>U+000A</code>), line tabulation (<code>U+000B</code>), +form feed (<code>U+000C</code>), or carriage return (<code>U+000D</code>).</p> +<p data-sourcepos="43:1-44:12" dir="auto"><a href="@">Whitespace</a> is a sequence of one or more [whitespace +characters].</p> +<p data-sourcepos="46:1-49:11" dir="auto">A <a href="@">Unicode whitespace character</a> is +any code point in the Unicode <code>Zs</code> general category, or a tab (<code>U+0009</code>), +carriage return (<code>U+000D</code>), newline (<code>U+000A</code>), or form feed +(<code>U+000C</code>).</p> +<p data-sourcepos="51:1-52:40" dir="auto"><a href="@">Unicode whitespace</a> is a sequence of one +or more [Unicode whitespace characters].</p> +<p data-sourcepos="54:1-54:25" dir="auto">A <a href="@">space</a> is <code>U+0020</code>.</p> +<p data-sourcepos="56:1-57:37" dir="auto">A <a href="@">non-whitespace character</a> is any character +that is not a [whitespace character].</p> +<p data-sourcepos="59:1-64:38" dir="auto">An <a href="@">ASCII punctuation character</a> +is <code>!</code>, <code>"</code>, <code>#</code>, <code>$</code>, <code>%</code>, <code>&</code>, <code>'</code>, <code>(</code>, <code>)</code>, +<code>*</code>, <code>+</code>, <code>,</code>, <code>-</code>, <code>.</code>, <code>/</code> (U+0021–2F), +<code>:</code>, <code>;</code>, <code><</code>, <code>=</code>, <code>></code>, <code>?</code>, <code>@</code> (U+003A–0040), +<code>[</code>, <code>\</code>, <code>]</code>, <code>^</code>, <code>_</code>, <code>`</code> (U+005B–0060), +<code>{</code>, <code>|</code>, <code>}</code>, or <code>~</code> (U+007B–007E).</p> +<p data-sourcepos="66:1-68:76" dir="auto">A <a href="@">punctuation character</a> is an [ASCII +punctuation character] or anything in +the general Unicode categories <code>Pc</code>, <code>Pd</code>, <code>Pe</code>, <code>Pf</code>, <code>Pi</code>, <code>Po</code>, or <code>Ps</code>.</p> +<h2 data-sourcepos="70:1-70:7" dir="auto"> +<a id="user-content-tabs" class="anchor" href="#tabs" aria-hidden="true"></a>Tabs</h2> +<p data-sourcepos="72:1-75:16" dir="auto">Tabs in lines are not expanded to [spaces]. However, +in contexts where whitespace helps to define block structure, +tabs behave as if they were replaced by spaces with a tab stop +of 4 characters.</p> +<p data-sourcepos="77:1-80:8" dir="auto">Thus, for example, a tab can be used instead of four spaces +in an indented code block. (Note, however, that internal +tabs are passed through as literal tabs, not expanded to +spaces.)</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="82:1-87:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">→foo→baz→→bim</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><pre><code>foo→baz→→bim</span> +<span id="LC4" class="line" lang="plaintext"></code></pre></span></code></pre> +<copy-code></copy-code> +</div> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="89:1-94:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext"> →foo→baz→→bim</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><pre><code>foo→baz→→bim</span> +<span id="LC4" class="line" lang="plaintext"></code></pre></span></code></pre> +<copy-code></copy-code> +</div> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="96:1-103:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext"> a→a</span> +<span id="LC2" class="line" lang="plaintext"> ὐ→a</span> +<span id="LC3" class="line" lang="plaintext">.</span> +<span id="LC4" class="line" lang="plaintext"><pre><code>a→a</span> +<span id="LC5" class="line" lang="plaintext">ὐ→a</span> +<span id="LC6" class="line" lang="plaintext"></code></pre></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="105:1-107:38" dir="auto">In the following example, a continuation paragraph of a list +item is indented with a tab; this has exactly the same effect +as indentation with four spaces would:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="109:1-120:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext"> - foo</span> +<span id="LC2" class="line" lang="plaintext"></span> +<span id="LC3" class="line" lang="plaintext">→bar</span> +<span id="LC4" class="line" lang="plaintext">.</span> +<span id="LC5" class="line" lang="plaintext"><ul></span> +<span id="LC6" class="line" lang="plaintext"><li></span> +<span id="LC7" class="line" lang="plaintext"><p>foo</p></span> +<span id="LC8" class="line" lang="plaintext"><p>bar</p></span> +<span id="LC9" class="line" lang="plaintext"></li></span> +<span id="LC10" class="line" lang="plaintext"></ul></span></code></pre> +<copy-code></copy-code> +</div> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="122:1-134:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">- foo</span> +<span id="LC2" class="line" lang="plaintext"></span> +<span id="LC3" class="line" lang="plaintext">→→bar</span> +<span id="LC4" class="line" lang="plaintext">.</span> +<span id="LC5" class="line" lang="plaintext"><ul></span> +<span id="LC6" class="line" lang="plaintext"><li></span> +<span id="LC7" class="line" lang="plaintext"><p>foo</p></span> +<span id="LC8" class="line" lang="plaintext"><pre><code> bar</span> +<span id="LC9" class="line" lang="plaintext"></code></pre></span> +<span id="LC10" class="line" lang="plaintext"></li></span> +<span id="LC11" class="line" lang="plaintext"></ul></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="136:1-143:36" dir="auto">Normally the <code>></code> that begins a block quote may be followed +optionally by a space, which is not considered part of the +content. In the following case <code>></code> is followed by a tab, +which is treated as if it were expanded into three spaces. +Since one of these spaces is considered part of the +delimiter, <code>foo</code> is considered to be indented six spaces +inside the block quote context, so we get an indented +code block starting with two spaces.</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="145:1-152:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">>→→foo</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><blockquote></span> +<span id="LC4" class="line" lang="plaintext"><pre><code> foo</span> +<span id="LC5" class="line" lang="plaintext"></code></pre></span> +<span id="LC6" class="line" lang="plaintext"></blockquote></span></code></pre> +<copy-code></copy-code> +</div> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="154:1-163:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">-→→foo</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><ul></span> +<span id="LC4" class="line" lang="plaintext"><li></span> +<span id="LC5" class="line" lang="plaintext"><pre><code> foo</span> +<span id="LC6" class="line" lang="plaintext"></code></pre></span> +<span id="LC7" class="line" lang="plaintext"></li></span> +<span id="LC8" class="line" lang="plaintext"></ul></span></code></pre> +<copy-code></copy-code> +</div> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="166:1-173:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext"> foo</span> +<span id="LC2" class="line" lang="plaintext">→bar</span> +<span id="LC3" class="line" lang="plaintext">.</span> +<span id="LC4" class="line" lang="plaintext"><pre><code>foo</span> +<span id="LC5" class="line" lang="plaintext">bar</span> +<span id="LC6" class="line" lang="plaintext"></code></pre></span></code></pre> +<copy-code></copy-code> +</div> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="175:1-191:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext"> - foo</span> +<span id="LC2" class="line" lang="plaintext"> - bar</span> +<span id="LC3" class="line" lang="plaintext">→ - baz</span> +<span id="LC4" class="line" lang="plaintext">.</span> +<span id="LC5" class="line" lang="plaintext"><ul></span> +<span id="LC6" class="line" lang="plaintext"><li>foo</span> +<span id="LC7" class="line" lang="plaintext"><ul></span> +<span id="LC8" class="line" lang="plaintext"><li>bar</span> +<span id="LC9" class="line" lang="plaintext"><ul></span> +<span id="LC10" class="line" lang="plaintext"><li>baz</li></span> +<span id="LC11" class="line" lang="plaintext"></ul></span> +<span id="LC12" class="line" lang="plaintext"></li></span> +<span id="LC13" class="line" lang="plaintext"></ul></span> +<span id="LC14" class="line" lang="plaintext"></li></span> +<span id="LC15" class="line" lang="plaintext"></ul></span></code></pre> +<copy-code></copy-code> +</div> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="193:1-197:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">#→Foo</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><h1>Foo</h1></span></code></pre> +<copy-code></copy-code> +</div> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="199:1-203:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">*→*→*→</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><hr /></span></code></pre> +<copy-code></copy-code> +</div> +<h2 data-sourcepos="206:1-206:22" dir="auto"> +<a id="user-content-insecure-characters" class="anchor" href="#insecure-characters" aria-hidden="true"></a>Insecure characters</h2> +<p data-sourcepos="208:1-209:42" dir="auto">For security reasons, the Unicode character <code>U+0000</code> must be replaced +with the REPLACEMENT CHARACTER (<code>U+FFFD</code>).</p> +<h1 data-sourcepos="211:1-211:20" dir="auto"> +<a id="user-content-blocks-and-inlines" class="anchor" href="#blocks-and-inlines" aria-hidden="true"></a>Blocks and inlines</h1> +<p data-sourcepos="213:1-218:54" dir="auto">We can think of a document as a sequence of +<a href="@">blocks</a>---structural elements like paragraphs, block +quotations, lists, headings, rules, and code blocks. Some blocks (like +block quotes and list items) contain other blocks; others (like +headings and paragraphs) contain <a href="@">inline</a> content---text, +links, emphasized text, images, code spans, and so on.</p> +<h2 data-sourcepos="220:1-220:13" dir="auto"> +<a id="user-content-precedence" class="anchor" href="#precedence" aria-hidden="true"></a>Precedence</h2> +<p data-sourcepos="222:1-224:59" dir="auto">Indicators of block structure always take precedence over indicators +of inline structure. So, for example, the following is a list with +two items, not a list with one item containing a code span:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="226:1-234:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">- `one</span> +<span id="LC2" class="line" lang="plaintext">- two`</span> +<span id="LC3" class="line" lang="plaintext">.</span> +<span id="LC4" class="line" lang="plaintext"><ul></span> +<span id="LC5" class="line" lang="plaintext"><li>`one</li></span> +<span id="LC6" class="line" lang="plaintext"><li>two`</li></span> +<span id="LC7" class="line" lang="plaintext"></ul></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="237:1-244:66" dir="auto">This means that parsing can proceed in two steps: first, the block +structure of the document can be discerned; second, text lines inside +paragraphs, headings, and other block constructs can be parsed for inline +structure. The second step requires information about link reference +definitions that will be available only at the end of the first +step. Note that the first step requires processing lines in sequence, +but the second can be parallelized, since the inline parsing of +one block element does not affect the inline parsing of any other.</p> +<h2 data-sourcepos="246:1-246:35" dir="auto"> +<a id="user-content-container-blocks-and-leaf-blocks" class="anchor" href="#container-blocks-and-leaf-blocks" aria-hidden="true"></a>Container blocks and leaf blocks</h2> +<p data-sourcepos="248:1-251:13" dir="auto">We can divide blocks into two types: +<a href="@">container blocks</a>, +which can contain other blocks, and <a href="@">leaf blocks</a>, +which cannot.</p> +<h1 data-sourcepos="253:1-253:13" dir="auto"> +<a id="user-content-leaf-blocks" class="anchor" href="#leaf-blocks" aria-hidden="true"></a>Leaf blocks</h1> +<p data-sourcepos="255:1-256:18" dir="auto">This section describes the different kinds of leaf block that make up a +Markdown document.</p> +<h2 data-sourcepos="258:1-258:18" dir="auto"> +<a id="user-content-thematic-breaks" class="anchor" href="#thematic-breaks" aria-hidden="true"></a>Thematic breaks</h2> +<p data-sourcepos="260:1-263:20" dir="auto">A line consisting of 0-3 spaces of indentation, followed by a sequence +of three or more matching <code>-</code>, <code>_</code>, or <code>*</code> characters, each followed +optionally by any number of spaces or tabs, forms a +<a href="@">thematic break</a>.</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="265:1-273:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">***</span> +<span id="LC2" class="line" lang="plaintext">---</span> +<span id="LC3" class="line" lang="plaintext">___</span> +<span id="LC4" class="line" lang="plaintext">.</span> +<span id="LC5" class="line" lang="plaintext"><hr /></span> +<span id="LC6" class="line" lang="plaintext"><hr /></span> +<span id="LC7" class="line" lang="plaintext"><hr /></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="276:1-276:17" dir="auto">Wrong characters:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="278:1-282:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">+++</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p>+++</p></span></code></pre> +<copy-code></copy-code> +</div> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="285:1-289:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">===</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p>===</p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="292:1-292:22" dir="auto">Not enough characters:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="294:1-302:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">--</span> +<span id="LC2" class="line" lang="plaintext">**</span> +<span id="LC3" class="line" lang="plaintext">__</span> +<span id="LC4" class="line" lang="plaintext">.</span> +<span id="LC5" class="line" lang="plaintext"><p>--</span> +<span id="LC6" class="line" lang="plaintext">**</span> +<span id="LC7" class="line" lang="plaintext">__</p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="305:1-305:39" dir="auto">One to three spaces indent are allowed:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="307:1-315:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext"> ***</span> +<span id="LC2" class="line" lang="plaintext"> ***</span> +<span id="LC3" class="line" lang="plaintext"> ***</span> +<span id="LC4" class="line" lang="plaintext">.</span> +<span id="LC5" class="line" lang="plaintext"><hr /></span> +<span id="LC6" class="line" lang="plaintext"><hr /></span> +<span id="LC7" class="line" lang="plaintext"><hr /></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="318:1-318:24" dir="auto">Four spaces is too many:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="320:1-325:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext"> ***</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><pre><code>***</span> +<span id="LC4" class="line" lang="plaintext"></code></pre></span></code></pre> +<copy-code></copy-code> +</div> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="328:1-334:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">Foo</span> +<span id="LC2" class="line" lang="plaintext"> ***</span> +<span id="LC3" class="line" lang="plaintext">.</span> +<span id="LC4" class="line" lang="plaintext"><p>Foo</span> +<span id="LC5" class="line" lang="plaintext">***</p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="337:1-337:39" dir="auto">More than three characters may be used:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="339:1-343:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">_____________________________________</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><hr /></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="346:1-346:42" dir="auto">Spaces are allowed between the characters:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="348:1-352:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext"> - - -</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><hr /></span></code></pre> +<copy-code></copy-code> +</div> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="355:1-359:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext"> ** * ** * ** * **</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><hr /></span></code></pre> +<copy-code></copy-code> +</div> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="362:1-366:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">- - - -</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><hr /></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="369:1-369:30" dir="auto">Spaces are allowed at the end:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="371:1-375:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">- - - - </span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><hr /></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="378:1-378:51" dir="auto">However, no other characters may occur in the line:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="380:1-390:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">_ _ _ _ a</span> +<span id="LC2" class="line" lang="plaintext"></span> +<span id="LC3" class="line" lang="plaintext">a------</span> +<span id="LC4" class="line" lang="plaintext"></span> +<span id="LC5" class="line" lang="plaintext">---a---</span> +<span id="LC6" class="line" lang="plaintext">.</span> +<span id="LC7" class="line" lang="plaintext"><p>_ _ _ _ a</p></span> +<span id="LC8" class="line" lang="plaintext"><p>a------</p></span> +<span id="LC9" class="line" lang="plaintext"><p>---a---</p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="393:1-394:33" dir="auto">It is required that all of the [non-whitespace characters] be the same. +So, this is not a thematic break:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="396:1-400:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext"> *-*</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p><em>-</em></p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="403:1-403:56" dir="auto">Thematic breaks do not need blank lines before or after:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="405:1-417:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">- foo</span> +<span id="LC2" class="line" lang="plaintext">***</span> +<span id="LC3" class="line" lang="plaintext">- bar</span> +<span id="LC4" class="line" lang="plaintext">.</span> +<span id="LC5" class="line" lang="plaintext"><ul></span> +<span id="LC6" class="line" lang="plaintext"><li>foo</li></span> +<span id="LC7" class="line" lang="plaintext"></ul></span> +<span id="LC8" class="line" lang="plaintext"><hr /></span> +<span id="LC9" class="line" lang="plaintext"><ul></span> +<span id="LC10" class="line" lang="plaintext"><li>bar</li></span> +<span id="LC11" class="line" lang="plaintext"></ul></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="420:1-420:42" dir="auto">Thematic breaks can interrupt a paragraph:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="422:1-430:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">Foo</span> +<span id="LC2" class="line" lang="plaintext">***</span> +<span id="LC3" class="line" lang="plaintext">bar</span> +<span id="LC4" class="line" lang="plaintext">.</span> +<span id="LC5" class="line" lang="plaintext"><p>Foo</p></span> +<span id="LC6" class="line" lang="plaintext"><hr /></span> +<span id="LC7" class="line" lang="plaintext"><p>bar</p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="433:1-437:71" dir="auto">If a line of dashes that meets the above conditions for being a +thematic break could also be interpreted as the underline of a [setext +heading], the interpretation as a +[setext heading] takes precedence. Thus, for example, +this is a setext heading, not a paragraph followed by a thematic break:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="439:1-446:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">Foo</span> +<span id="LC2" class="line" lang="plaintext">---</span> +<span id="LC3" class="line" lang="plaintext">bar</span> +<span id="LC4" class="line" lang="plaintext">.</span> +<span id="LC5" class="line" lang="plaintext"><h2>Foo</h2></span> +<span id="LC6" class="line" lang="plaintext"><p>bar</p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="449:1-450:63" dir="auto">When both a thematic break and a list item are possible +interpretations of a line, the thematic break takes precedence:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="452:1-464:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">* Foo</span> +<span id="LC2" class="line" lang="plaintext">* * *</span> +<span id="LC3" class="line" lang="plaintext">* Bar</span> +<span id="LC4" class="line" lang="plaintext">.</span> +<span id="LC5" class="line" lang="plaintext"><ul></span> +<span id="LC6" class="line" lang="plaintext"><li>Foo</li></span> +<span id="LC7" class="line" lang="plaintext"></ul></span> +<span id="LC8" class="line" lang="plaintext"><hr /></span> +<span id="LC9" class="line" lang="plaintext"><ul></span> +<span id="LC10" class="line" lang="plaintext"><li>Bar</li></span> +<span id="LC11" class="line" lang="plaintext"></ul></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="467:1-467:68" dir="auto">If you want a thematic break in a list item, use a different bullet:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="469:1-479:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">- Foo</span> +<span id="LC2" class="line" lang="plaintext">- * * *</span> +<span id="LC3" class="line" lang="plaintext">.</span> +<span id="LC4" class="line" lang="plaintext"><ul></span> +<span id="LC5" class="line" lang="plaintext"><li>Foo</li></span> +<span id="LC6" class="line" lang="plaintext"><li></span> +<span id="LC7" class="line" lang="plaintext"><hr /></span> +<span id="LC8" class="line" lang="plaintext"></li></span> +<span id="LC9" class="line" lang="plaintext"></ul></span></code></pre> +<copy-code></copy-code> +</div> +<h2 data-sourcepos="482:1-482:15" dir="auto"> +<a id="user-content-atx-headings" class="anchor" href="#atx-headings" aria-hidden="true"></a>ATX headings</h2> +<p data-sourcepos="484:1-494:35" dir="auto">An <a href="@">ATX heading</a> +consists of a string of characters, parsed as inline content, between an +opening sequence of 1--6 unescaped <code>#</code> characters and an optional +closing sequence of any number of unescaped <code>#</code> characters. +The opening sequence of <code>#</code> characters must be followed by a +[space] or by the end of line. The optional closing sequence of <code>#</code>s must be +preceded by a [space] and may be followed by spaces only. The opening +<code>#</code> character may be indented 0-3 spaces. The raw contents of the +heading are stripped of leading and trailing spaces before being parsed +as inline content. The heading level is equal to the number of <code>#</code> +characters in the opening sequence.</p> +<p data-sourcepos="496:1-496:16" dir="auto">Simple headings:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="498:1-512:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext"># foo</span> +<span id="LC2" class="line" lang="plaintext">## foo</span> +<span id="LC3" class="line" lang="plaintext">### foo</span> +<span id="LC4" class="line" lang="plaintext">#### foo</span> +<span id="LC5" class="line" lang="plaintext">##### foo</span> +<span id="LC6" class="line" lang="plaintext">###### foo</span> +<span id="LC7" class="line" lang="plaintext">.</span> +<span id="LC8" class="line" lang="plaintext"><h1>foo</h1></span> +<span id="LC9" class="line" lang="plaintext"><h2>foo</h2></span> +<span id="LC10" class="line" lang="plaintext"><h3>foo</h3></span> +<span id="LC11" class="line" lang="plaintext"><h4>foo</h4></span> +<span id="LC12" class="line" lang="plaintext"><h5>foo</h5></span> +<span id="LC13" class="line" lang="plaintext"><h6>foo</h6></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="515:1-515:46" dir="auto">More than six <code>#</code> characters is not a heading:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="517:1-521:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">####### foo</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p>####### foo</p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="524:1-530:9" dir="auto">At least one space is required between the <code>#</code> characters and the +heading's contents, unless the heading is empty. Note that many +implementations currently do not require the space. However, the +space was required by the +<a href="http://www.aaronsw.com/2002/atx/atx.py" rel="nofollow noreferrer noopener" target="_blank">original ATX implementation</a>, +and it helps prevent things like the following from being parsed as +headings:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="532:1-539:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">#5 bolt</span> +<span id="LC2" class="line" lang="plaintext"></span> +<span id="LC3" class="line" lang="plaintext">#hashtag</span> +<span id="LC4" class="line" lang="plaintext">.</span> +<span id="LC5" class="line" lang="plaintext"><p>#5 bolt</p></span> +<span id="LC6" class="line" lang="plaintext"><p>#hashtag</p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="542:1-542:56" dir="auto">This is not a heading, because the first <code>#</code> is escaped:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="544:1-548:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">\## foo</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p>## foo</p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="551:1-551:31" dir="auto">Contents are parsed as inlines:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="553:1-557:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext"># foo *bar* \*baz\*</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><h1>foo <em>bar</em> *baz*</h1></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="560:1-560:71" dir="auto">Leading and trailing [whitespace] is ignored in parsing inline content:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="562:1-566:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext"># foo </span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><h1>foo</h1></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="569:1-569:44" dir="auto">One to three spaces indentation are allowed:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="571:1-579:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext"> ### foo</span> +<span id="LC2" class="line" lang="plaintext"> ## foo</span> +<span id="LC3" class="line" lang="plaintext"> # foo</span> +<span id="LC4" class="line" lang="plaintext">.</span> +<span id="LC5" class="line" lang="plaintext"><h3>foo</h3></span> +<span id="LC6" class="line" lang="plaintext"><h2>foo</h2></span> +<span id="LC7" class="line" lang="plaintext"><h1>foo</h1></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="582:1-582:25" dir="auto">Four spaces are too much:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="584:1-589:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext"> # foo</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><pre><code># foo</span> +<span id="LC4" class="line" lang="plaintext"></code></pre></span></code></pre> +<copy-code></copy-code> +</div> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="592:1-598:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">foo</span> +<span id="LC2" class="line" lang="plaintext"> # bar</span> +<span id="LC3" class="line" lang="plaintext">.</span> +<span id="LC4" class="line" lang="plaintext"><p>foo</span> +<span id="LC5" class="line" lang="plaintext"># bar</p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="601:1-601:49" dir="auto">A closing sequence of <code>#</code> characters is optional:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="603:1-609:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">## foo ##</span> +<span id="LC2" class="line" lang="plaintext"> ### bar ###</span> +<span id="LC3" class="line" lang="plaintext">.</span> +<span id="LC4" class="line" lang="plaintext"><h2>foo</h2></span> +<span id="LC5" class="line" lang="plaintext"><h3>bar</h3></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="612:1-612:55" dir="auto">It need not be the same length as the opening sequence:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="614:1-620:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext"># foo ##################################</span> +<span id="LC2" class="line" lang="plaintext">##### foo ##</span> +<span id="LC3" class="line" lang="plaintext">.</span> +<span id="LC4" class="line" lang="plaintext"><h1>foo</h1></span> +<span id="LC5" class="line" lang="plaintext"><h5>foo</h5></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="623:1-623:46" dir="auto">Spaces are allowed after the closing sequence:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="625:1-629:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">### foo ### </span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><h3>foo</h3></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="632:1-634:8" dir="auto">A sequence of <code>#</code> characters with anything but [spaces] following it +is not a closing sequence, but counts as part of the contents of the +heading:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="636:1-640:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">### foo ### b</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><h3>foo ### b</h3></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="643:1-643:49" dir="auto">The closing sequence must be preceded by a space:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="645:1-649:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext"># foo#</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><h1>foo#</h1></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="652:1-653:24" dir="auto">Backslash-escaped <code>#</code> characters do not count as part +of the closing sequence:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="655:1-663:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">### foo \###</span> +<span id="LC2" class="line" lang="plaintext">## foo #\##</span> +<span id="LC3" class="line" lang="plaintext"># foo \#</span> +<span id="LC4" class="line" lang="plaintext">.</span> +<span id="LC5" class="line" lang="plaintext"><h3>foo ###</h3></span> +<span id="LC6" class="line" lang="plaintext"><h2>foo ###</h2></span> +<span id="LC7" class="line" lang="plaintext"><h1>foo #</h1></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="666:1-667:41" dir="auto">ATX headings need not be separated from surrounding content by blank +lines, and they can interrupt paragraphs:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="669:1-677:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">****</span> +<span id="LC2" class="line" lang="plaintext">## foo</span> +<span id="LC3" class="line" lang="plaintext">****</span> +<span id="LC4" class="line" lang="plaintext">.</span> +<span id="LC5" class="line" lang="plaintext"><hr /></span> +<span id="LC6" class="line" lang="plaintext"><h2>foo</h2></span> +<span id="LC7" class="line" lang="plaintext"><hr /></span></code></pre> +<copy-code></copy-code> +</div> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="680:1-688:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">Foo bar</span> +<span id="LC2" class="line" lang="plaintext"># baz</span> +<span id="LC3" class="line" lang="plaintext">Bar foo</span> +<span id="LC4" class="line" lang="plaintext">.</span> +<span id="LC5" class="line" lang="plaintext"><p>Foo bar</p></span> +<span id="LC6" class="line" lang="plaintext"><h1>baz</h1></span> +<span id="LC7" class="line" lang="plaintext"><p>Bar foo</p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="691:1-691:26" dir="auto">ATX headings can be empty:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="693:1-701:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">## </span> +<span id="LC2" class="line" lang="plaintext">#</span> +<span id="LC3" class="line" lang="plaintext">### ###</span> +<span id="LC4" class="line" lang="plaintext">.</span> +<span id="LC5" class="line" lang="plaintext"><h2></h2></span> +<span id="LC6" class="line" lang="plaintext"><h1></h1></span> +<span id="LC7" class="line" lang="plaintext"><h3></h3></span></code></pre> +<copy-code></copy-code> +</div> +<h2 data-sourcepos="704:1-704:18" dir="auto"> +<a id="user-content-setext-headings" class="anchor" href="#setext-headings" aria-hidden="true"></a>Setext headings</h2> +<p data-sourcepos="706:1-714:54" dir="auto">A <a href="@">setext heading</a> consists of one or more +lines of text, each containing at least one [non-whitespace +character], with no more than 3 spaces indentation, followed by +a [setext heading underline]. The lines of text must be such +that, were they not followed by the setext heading underline, +they would be interpreted as a paragraph: they cannot be +interpretable as a [code fence], [ATX heading][ATX headings], +[block quote][block quotes], [thematic break][thematic breaks], +[list item][list items], or [HTML block][HTML blocks].</p> +<p data-sourcepos="716:1-721:40" dir="auto">A <a href="@">setext heading underline</a> is a sequence of +<code>=</code> characters or a sequence of <code>-</code> characters, with no more than 3 +spaces indentation and any number of trailing spaces. If a line +containing a single <code>-</code> can be interpreted as an +empty [list items], it should be interpreted this way +and not as a [setext heading underline].</p> +<p data-sourcepos="723:1-727:8" dir="auto">The heading is a level 1 heading if <code>=</code> characters are used in +the [setext heading underline], and a level 2 heading if <code>-</code> +characters are used. The contents of the heading are the result +of parsing the preceding lines of text as CommonMark inline +content.</p> +<p data-sourcepos="729:1-732:5" dir="auto">In general, a setext heading need not be preceded or followed by a +blank line. However, it cannot interrupt a paragraph, so when a +setext heading comes after a paragraph, a blank line is needed between +them.</p> +<p data-sourcepos="734:1-734:16" dir="auto">Simple examples:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="736:1-745:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">Foo *bar*</span> +<span id="LC2" class="line" lang="plaintext">=========</span> +<span id="LC3" class="line" lang="plaintext"></span> +<span id="LC4" class="line" lang="plaintext">Foo *bar*</span> +<span id="LC5" class="line" lang="plaintext">---------</span> +<span id="LC6" class="line" lang="plaintext">.</span> +<span id="LC7" class="line" lang="plaintext"><h1>Foo <em>bar</em></h1></span> +<span id="LC8" class="line" lang="plaintext"><h2>Foo <em>bar</em></h2></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="748:1-748:54" dir="auto">The content of the header may span more than one line:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="750:1-757:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">Foo *bar</span> +<span id="LC2" class="line" lang="plaintext">baz*</span> +<span id="LC3" class="line" lang="plaintext">====</span> +<span id="LC4" class="line" lang="plaintext">.</span> +<span id="LC5" class="line" lang="plaintext"><h1>Foo <em>bar</span> +<span id="LC6" class="line" lang="plaintext">baz</em></h1></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="759:1-762:13" dir="auto">The contents are the result of parsing the headings's raw +content as inlines. The heading's raw content is formed by +concatenating the lines and removing initial and final +[whitespace].</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="764:1-771:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext"> Foo *bar</span> +<span id="LC2" class="line" lang="plaintext">baz*→</span> +<span id="LC3" class="line" lang="plaintext">====</span> +<span id="LC4" class="line" lang="plaintext">.</span> +<span id="LC5" class="line" lang="plaintext"><h1>Foo <em>bar</span> +<span id="LC6" class="line" lang="plaintext">baz</em></h1></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="774:1-774:34" dir="auto">The underlining can be any length:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="776:1-785:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">Foo</span> +<span id="LC2" class="line" lang="plaintext">-------------------------</span> +<span id="LC3" class="line" lang="plaintext"></span> +<span id="LC4" class="line" lang="plaintext">Foo</span> +<span id="LC5" class="line" lang="plaintext">=</span> +<span id="LC6" class="line" lang="plaintext">.</span> +<span id="LC7" class="line" lang="plaintext"><h2>Foo</h2></span> +<span id="LC8" class="line" lang="plaintext"><h1>Foo</h1></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="788:1-789:33" dir="auto">The heading content can be indented up to three spaces, and need +not line up with the underlining:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="791:1-804:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext"> Foo</span> +<span id="LC2" class="line" lang="plaintext">---</span> +<span id="LC3" class="line" lang="plaintext"></span> +<span id="LC4" class="line" lang="plaintext"> Foo</span> +<span id="LC5" class="line" lang="plaintext">-----</span> +<span id="LC6" class="line" lang="plaintext"></span> +<span id="LC7" class="line" lang="plaintext"> Foo</span> +<span id="LC8" class="line" lang="plaintext"> ===</span> +<span id="LC9" class="line" lang="plaintext">.</span> +<span id="LC10" class="line" lang="plaintext"><h2>Foo</h2></span> +<span id="LC11" class="line" lang="plaintext"><h2>Foo</h2></span> +<span id="LC12" class="line" lang="plaintext"><h1>Foo</h1></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="807:1-807:31" dir="auto">Four spaces indent is too much:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="809:1-822:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext"> Foo</span> +<span id="LC2" class="line" lang="plaintext"> ---</span> +<span id="LC3" class="line" lang="plaintext"></span> +<span id="LC4" class="line" lang="plaintext"> Foo</span> +<span id="LC5" class="line" lang="plaintext">---</span> +<span id="LC6" class="line" lang="plaintext">.</span> +<span id="LC7" class="line" lang="plaintext"><pre><code>Foo</span> +<span id="LC8" class="line" lang="plaintext">---</span> +<span id="LC9" class="line" lang="plaintext"></span> +<span id="LC10" class="line" lang="plaintext">Foo</span> +<span id="LC11" class="line" lang="plaintext"></code></pre></span> +<span id="LC12" class="line" lang="plaintext"><hr /></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="825:1-826:25" dir="auto">The setext heading underline can be indented up to three spaces, and +may have trailing spaces:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="828:1-833:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">Foo</span> +<span id="LC2" class="line" lang="plaintext"> ---- </span> +<span id="LC3" class="line" lang="plaintext">.</span> +<span id="LC4" class="line" lang="plaintext"><h2>Foo</h2></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="836:1-836:24" dir="auto">Four spaces is too much:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="838:1-844:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">Foo</span> +<span id="LC2" class="line" lang="plaintext"> ---</span> +<span id="LC3" class="line" lang="plaintext">.</span> +<span id="LC4" class="line" lang="plaintext"><p>Foo</span> +<span id="LC5" class="line" lang="plaintext">---</p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="847:1-847:60" dir="auto">The setext heading underline cannot contain internal spaces:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="849:1-860:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">Foo</span> +<span id="LC2" class="line" lang="plaintext">= =</span> +<span id="LC3" class="line" lang="plaintext"></span> +<span id="LC4" class="line" lang="plaintext">Foo</span> +<span id="LC5" class="line" lang="plaintext">--- -</span> +<span id="LC6" class="line" lang="plaintext">.</span> +<span id="LC7" class="line" lang="plaintext"><p>Foo</span> +<span id="LC8" class="line" lang="plaintext">= =</p></span> +<span id="LC9" class="line" lang="plaintext"><p>Foo</p></span> +<span id="LC10" class="line" lang="plaintext"><hr /></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="863:1-863:62" dir="auto">Trailing spaces in the content line do not cause a line break:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="865:1-870:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">Foo </span> +<span id="LC2" class="line" lang="plaintext">-----</span> +<span id="LC3" class="line" lang="plaintext">.</span> +<span id="LC4" class="line" lang="plaintext"><h2>Foo</h2></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="873:1-873:32" dir="auto">Nor does a backslash at the end:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="875:1-880:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">Foo\</span> +<span id="LC2" class="line" lang="plaintext">----</span> +<span id="LC3" class="line" lang="plaintext">.</span> +<span id="LC4" class="line" lang="plaintext"><h2>Foo\</h2></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="883:1-884:66" dir="auto">Since indicators of block structure take precedence over +indicators of inline structure, the following are setext headings:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="886:1-899:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">`Foo</span> +<span id="LC2" class="line" lang="plaintext">----</span> +<span id="LC3" class="line" lang="plaintext">`</span> +<span id="LC4" class="line" lang="plaintext"></span> +<span id="LC5" class="line" lang="plaintext"><a title="a lot</span> +<span id="LC6" class="line" lang="plaintext">---</span> +<span id="LC7" class="line" lang="plaintext">of dashes"/></span> +<span id="LC8" class="line" lang="plaintext">.</span> +<span id="LC9" class="line" lang="plaintext"><h2>`Foo</h2></span> +<span id="LC10" class="line" lang="plaintext"><p>`</p></span> +<span id="LC11" class="line" lang="plaintext"><h2>&lt;a title=&quot;a lot</h2></span> +<span id="LC12" class="line" lang="plaintext"><p>of dashes&quot;/&gt;</p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="902:1-903:36" dir="auto">The setext heading underline cannot be a [lazy continuation +line] in a list item or block quote:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="905:1-913:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">> Foo</span> +<span id="LC2" class="line" lang="plaintext">---</span> +<span id="LC3" class="line" lang="plaintext">.</span> +<span id="LC4" class="line" lang="plaintext"><blockquote></span> +<span id="LC5" class="line" lang="plaintext"><p>Foo</p></span> +<span id="LC6" class="line" lang="plaintext"></blockquote></span> +<span id="LC7" class="line" lang="plaintext"><hr /></span></code></pre> +<copy-code></copy-code> +</div> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="916:1-926:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">> foo</span> +<span id="LC2" class="line" lang="plaintext">bar</span> +<span id="LC3" class="line" lang="plaintext">===</span> +<span id="LC4" class="line" lang="plaintext">.</span> +<span id="LC5" class="line" lang="plaintext"><blockquote></span> +<span id="LC6" class="line" lang="plaintext"><p>foo</span> +<span id="LC7" class="line" lang="plaintext">bar</span> +<span id="LC8" class="line" lang="plaintext">===</p></span> +<span id="LC9" class="line" lang="plaintext"></blockquote></span></code></pre> +<copy-code></copy-code> +</div> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="929:1-937:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">- Foo</span> +<span id="LC2" class="line" lang="plaintext">---</span> +<span id="LC3" class="line" lang="plaintext">.</span> +<span id="LC4" class="line" lang="plaintext"><ul></span> +<span id="LC5" class="line" lang="plaintext"><li>Foo</li></span> +<span id="LC6" class="line" lang="plaintext"></ul></span> +<span id="LC7" class="line" lang="plaintext"><hr /></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="940:1-942:25" dir="auto">A blank line is needed between a paragraph and a following +setext heading, since otherwise the paragraph becomes part +of the heading's content:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="944:1-951:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">Foo</span> +<span id="LC2" class="line" lang="plaintext">Bar</span> +<span id="LC3" class="line" lang="plaintext">---</span> +<span id="LC4" class="line" lang="plaintext">.</span> +<span id="LC5" class="line" lang="plaintext"><h2>Foo</span> +<span id="LC6" class="line" lang="plaintext">Bar</h2></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="954:1-955:16" dir="auto">But in general a blank line is not required before or after +setext headings:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="957:1-969:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">---</span> +<span id="LC2" class="line" lang="plaintext">Foo</span> +<span id="LC3" class="line" lang="plaintext">---</span> +<span id="LC4" class="line" lang="plaintext">Bar</span> +<span id="LC5" class="line" lang="plaintext">---</span> +<span id="LC6" class="line" lang="plaintext">Baz</span> +<span id="LC7" class="line" lang="plaintext">.</span> +<span id="LC8" class="line" lang="plaintext"><hr /></span> +<span id="LC9" class="line" lang="plaintext"><h2>Foo</h2></span> +<span id="LC10" class="line" lang="plaintext"><h2>Bar</h2></span> +<span id="LC11" class="line" lang="plaintext"><p>Baz</p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="972:1-972:32" dir="auto">Setext headings cannot be empty:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="974:1-979:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext"></span> +<span id="LC2" class="line" lang="plaintext">====</span> +<span id="LC3" class="line" lang="plaintext">.</span> +<span id="LC4" class="line" lang="plaintext"><p>====</p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="982:1-984:55" dir="auto">Setext heading text lines must not be interpretable as block +constructs other than paragraphs. So, the line of dashes +in these examples gets interpreted as a thematic break:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="986:1-992:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">---</span> +<span id="LC2" class="line" lang="plaintext">---</span> +<span id="LC3" class="line" lang="plaintext">.</span> +<span id="LC4" class="line" lang="plaintext"><hr /></span> +<span id="LC5" class="line" lang="plaintext"><hr /></span></code></pre> +<copy-code></copy-code> +</div> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="995:1-1003:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">- foo</span> +<span id="LC2" class="line" lang="plaintext">-----</span> +<span id="LC3" class="line" lang="plaintext">.</span> +<span id="LC4" class="line" lang="plaintext"><ul></span> +<span id="LC5" class="line" lang="plaintext"><li>foo</li></span> +<span id="LC6" class="line" lang="plaintext"></ul></span> +<span id="LC7" class="line" lang="plaintext"><hr /></span></code></pre> +<copy-code></copy-code> +</div> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="1006:1-1013:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext"> foo</span> +<span id="LC2" class="line" lang="plaintext">---</span> +<span id="LC3" class="line" lang="plaintext">.</span> +<span id="LC4" class="line" lang="plaintext"><pre><code>foo</span> +<span id="LC5" class="line" lang="plaintext"></code></pre></span> +<span id="LC6" class="line" lang="plaintext"><hr /></span></code></pre> +<copy-code></copy-code> +</div> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="1016:1-1024:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">> foo</span> +<span id="LC2" class="line" lang="plaintext">-----</span> +<span id="LC3" class="line" lang="plaintext">.</span> +<span id="LC4" class="line" lang="plaintext"><blockquote></span> +<span id="LC5" class="line" lang="plaintext"><p>foo</p></span> +<span id="LC6" class="line" lang="plaintext"></blockquote></span> +<span id="LC7" class="line" lang="plaintext"><hr /></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="1027:1-1028:22" dir="auto">If you want a heading with <code>> foo</code> as its literal text, you can +use backslash escapes:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="1030:1-1035:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">\> foo</span> +<span id="LC2" class="line" lang="plaintext">------</span> +<span id="LC3" class="line" lang="plaintext">.</span> +<span id="LC4" class="line" lang="plaintext"><h2>&gt; foo</h2></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="1038:1-1040:48" dir="auto"><strong>Compatibility note:</strong> Most existing Markdown implementations +do not allow the text of setext headings to span multiple lines. +But there is no consensus about how to interpret</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="1042:1-1047:3" class="code highlight js-syntax-highlight language-markdown" lang="markdown" v-pre="true"><code><span id="LC1" class="line" lang="markdown">Foo</span> +<span id="LC2" class="line" lang="markdown"><span class="gh">bar</span></span> +<span id="LC3" class="line" lang="markdown"><span class="gh">---</span></span> +<span id="LC4" class="line" lang="markdown">baz</span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="1049:1-1049:44" dir="auto">One can find four different interpretations:</p> +<ol data-sourcepos="1051:1-1055:0" dir="auto"> +<li data-sourcepos="1051:1-1051:50">paragraph "Foo", heading "bar", paragraph "baz"</li> +<li data-sourcepos="1052:1-1052:55">paragraph "Foo bar", thematic break, paragraph "baz"</li> +<li data-sourcepos="1053:1-1053:30">paragraph "Foo bar --- baz"</li> +<li data-sourcepos="1054:1-1055:0">heading "Foo bar", paragraph "baz"</li> +</ol> +<p data-sourcepos="1056:1-1059:43" dir="auto">We find interpretation 4 most natural, and interpretation 4 +increases the expressive power of CommonMark, by allowing +multiline headings. Authors who want interpretation 1 can +put a blank line after the first paragraph:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="1061:1-1071:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">Foo</span> +<span id="LC2" class="line" lang="plaintext"></span> +<span id="LC3" class="line" lang="plaintext">bar</span> +<span id="LC4" class="line" lang="plaintext">---</span> +<span id="LC5" class="line" lang="plaintext">baz</span> +<span id="LC6" class="line" lang="plaintext">.</span> +<span id="LC7" class="line" lang="plaintext"><p>Foo</p></span> +<span id="LC8" class="line" lang="plaintext"><h2>bar</h2></span> +<span id="LC9" class="line" lang="plaintext"><p>baz</p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="1074:1-1075:19" dir="auto">Authors who want interpretation 2 can put blank lines around +the thematic break,</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="1077:1-1089:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">Foo</span> +<span id="LC2" class="line" lang="plaintext">bar</span> +<span id="LC3" class="line" lang="plaintext"></span> +<span id="LC4" class="line" lang="plaintext">---</span> +<span id="LC5" class="line" lang="plaintext"></span> +<span id="LC6" class="line" lang="plaintext">baz</span> +<span id="LC7" class="line" lang="plaintext">.</span> +<span id="LC8" class="line" lang="plaintext"><p>Foo</span> +<span id="LC9" class="line" lang="plaintext">bar</p></span> +<span id="LC10" class="line" lang="plaintext"><hr /></span> +<span id="LC11" class="line" lang="plaintext"><p>baz</p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="1092:1-1093:19" dir="auto">or use a thematic break that cannot count as a [setext heading +underline], such as</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="1095:1-1105:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">Foo</span> +<span id="LC2" class="line" lang="plaintext">bar</span> +<span id="LC3" class="line" lang="plaintext">* * *</span> +<span id="LC4" class="line" lang="plaintext">baz</span> +<span id="LC5" class="line" lang="plaintext">.</span> +<span id="LC6" class="line" lang="plaintext"><p>Foo</span> +<span id="LC7" class="line" lang="plaintext">bar</p></span> +<span id="LC8" class="line" lang="plaintext"><hr /></span> +<span id="LC9" class="line" lang="plaintext"><p>baz</p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="1108:1-1108:60" dir="auto">Authors who want interpretation 3 can use backslash escapes:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="1110:1-1120:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">Foo</span> +<span id="LC2" class="line" lang="plaintext">bar</span> +<span id="LC3" class="line" lang="plaintext">\---</span> +<span id="LC4" class="line" lang="plaintext">baz</span> +<span id="LC5" class="line" lang="plaintext">.</span> +<span id="LC6" class="line" lang="plaintext"><p>Foo</span> +<span id="LC7" class="line" lang="plaintext">bar</span> +<span id="LC8" class="line" lang="plaintext">---</span> +<span id="LC9" class="line" lang="plaintext">baz</p></span></code></pre> +<copy-code></copy-code> +</div> +<h2 data-sourcepos="1123:1-1123:23" dir="auto"> +<a id="user-content-indented-code-blocks" class="anchor" href="#indented-code-blocks" aria-hidden="true"></a>Indented code blocks</h2> +<p data-sourcepos="1125:1-1131:44" dir="auto">An <a href="@">indented code block</a> is composed of one or more +[indented chunks] separated by blank lines. +An <a href="@">indented chunk</a> is a sequence of non-blank lines, +each indented four or more spaces. The contents of the code block are +the literal contents of the lines, including trailing +[line endings], minus four spaces of indentation. +An indented code block has no [info string].</p> +<p data-sourcepos="1133:1-1136:11" dir="auto">An indented code block cannot interrupt a paragraph, so there must be +a blank line between a paragraph and a following indented code block. +(A blank line is not needed, however, between a code block and a following +paragraph.)</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="1138:1-1145:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext"> a simple</span> +<span id="LC2" class="line" lang="plaintext"> indented code block</span> +<span id="LC3" class="line" lang="plaintext">.</span> +<span id="LC4" class="line" lang="plaintext"><pre><code>a simple</span> +<span id="LC5" class="line" lang="plaintext"> indented code block</span> +<span id="LC6" class="line" lang="plaintext"></code></pre></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="1148:1-1150:65" dir="auto">If there is any ambiguity between an interpretation of indentation +as a code block and as indicating that material belongs to a [list +item][list items], the list item interpretation takes precedence:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="1152:1-1163:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext"> - foo</span> +<span id="LC2" class="line" lang="plaintext"></span> +<span id="LC3" class="line" lang="plaintext"> bar</span> +<span id="LC4" class="line" lang="plaintext">.</span> +<span id="LC5" class="line" lang="plaintext"><ul></span> +<span id="LC6" class="line" lang="plaintext"><li></span> +<span id="LC7" class="line" lang="plaintext"><p>foo</p></span> +<span id="LC8" class="line" lang="plaintext"><p>bar</p></span> +<span id="LC9" class="line" lang="plaintext"></li></span> +<span id="LC10" class="line" lang="plaintext"></ul></span></code></pre> +<copy-code></copy-code> +</div> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="1166:1-1179:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">1. foo</span> +<span id="LC2" class="line" lang="plaintext"></span> +<span id="LC3" class="line" lang="plaintext"> - bar</span> +<span id="LC4" class="line" lang="plaintext">.</span> +<span id="LC5" class="line" lang="plaintext"><ol></span> +<span id="LC6" class="line" lang="plaintext"><li></span> +<span id="LC7" class="line" lang="plaintext"><p>foo</p></span> +<span id="LC8" class="line" lang="plaintext"><ul></span> +<span id="LC9" class="line" lang="plaintext"><li>bar</li></span> +<span id="LC10" class="line" lang="plaintext"></ul></span> +<span id="LC11" class="line" lang="plaintext"></li></span> +<span id="LC12" class="line" lang="plaintext"></ol></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="1183:1-1184:12" dir="auto">The contents of a code block are literal text, and do not get parsed +as Markdown:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="1186:1-1197:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext"> <a/></span> +<span id="LC2" class="line" lang="plaintext"> *hi*</span> +<span id="LC3" class="line" lang="plaintext"></span> +<span id="LC4" class="line" lang="plaintext"> - one</span> +<span id="LC5" class="line" lang="plaintext">.</span> +<span id="LC6" class="line" lang="plaintext"><pre><code>&lt;a/&gt;</span> +<span id="LC7" class="line" lang="plaintext">*hi*</span> +<span id="LC8" class="line" lang="plaintext"></span> +<span id="LC9" class="line" lang="plaintext">- one</span> +<span id="LC10" class="line" lang="plaintext"></code></pre></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="1200:1-1200:51" dir="auto">Here we have three chunks separated by blank lines:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="1202:1-1219:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext"> chunk1</span> +<span id="LC2" class="line" lang="plaintext"></span> +<span id="LC3" class="line" lang="plaintext"> chunk2</span> +<span id="LC4" class="line" lang="plaintext"> </span> +<span id="LC5" class="line" lang="plaintext"> </span> +<span id="LC6" class="line" lang="plaintext"> </span> +<span id="LC7" class="line" lang="plaintext"> chunk3</span> +<span id="LC8" class="line" lang="plaintext">.</span> +<span id="LC9" class="line" lang="plaintext"><pre><code>chunk1</span> +<span id="LC10" class="line" lang="plaintext"></span> +<span id="LC11" class="line" lang="plaintext">chunk2</span> +<span id="LC12" class="line" lang="plaintext"></span> +<span id="LC13" class="line" lang="plaintext"></span> +<span id="LC14" class="line" lang="plaintext"></span> +<span id="LC15" class="line" lang="plaintext">chunk3</span> +<span id="LC16" class="line" lang="plaintext"></code></pre></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="1222:1-1223:24" dir="auto">Any initial spaces beyond four will be included in the content, even +in interior blank lines:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="1225:1-1234:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext"> chunk1</span> +<span id="LC2" class="line" lang="plaintext"> </span> +<span id="LC3" class="line" lang="plaintext"> chunk2</span> +<span id="LC4" class="line" lang="plaintext">.</span> +<span id="LC5" class="line" lang="plaintext"><pre><code>chunk1</span> +<span id="LC6" class="line" lang="plaintext"> </span> +<span id="LC7" class="line" lang="plaintext"> chunk2</span> +<span id="LC8" class="line" lang="plaintext"></code></pre></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="1237:1-1238:37" dir="auto">An indented code block cannot interrupt a paragraph. (This +allows hanging indents and the like.)</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="1240:1-1247:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">Foo</span> +<span id="LC2" class="line" lang="plaintext"> bar</span> +<span id="LC3" class="line" lang="plaintext"></span> +<span id="LC4" class="line" lang="plaintext">.</span> +<span id="LC5" class="line" lang="plaintext"><p>Foo</span> +<span id="LC6" class="line" lang="plaintext">bar</p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="1250:1-1252:20" dir="auto">However, any non-blank line with fewer than four leading spaces ends +the code block immediately. So a paragraph may occur immediately +after indented code:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="1254:1-1261:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext"> foo</span> +<span id="LC2" class="line" lang="plaintext">bar</span> +<span id="LC3" class="line" lang="plaintext">.</span> +<span id="LC4" class="line" lang="plaintext"><pre><code>foo</span> +<span id="LC5" class="line" lang="plaintext"></code></pre></span> +<span id="LC6" class="line" lang="plaintext"><p>bar</p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="1264:1-1265:7" dir="auto">And indented code can occur immediately before and after other kinds of +blocks:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="1267:1-1282:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext"># Heading</span> +<span id="LC2" class="line" lang="plaintext"> foo</span> +<span id="LC3" class="line" lang="plaintext">Heading</span> +<span id="LC4" class="line" lang="plaintext">------</span> +<span id="LC5" class="line" lang="plaintext"> foo</span> +<span id="LC6" class="line" lang="plaintext">----</span> +<span id="LC7" class="line" lang="plaintext">.</span> +<span id="LC8" class="line" lang="plaintext"><h1>Heading</h1></span> +<span id="LC9" class="line" lang="plaintext"><pre><code>foo</span> +<span id="LC10" class="line" lang="plaintext"></code></pre></span> +<span id="LC11" class="line" lang="plaintext"><h2>Heading</h2></span> +<span id="LC12" class="line" lang="plaintext"><pre><code>foo</span> +<span id="LC13" class="line" lang="plaintext"></code></pre></span> +<span id="LC14" class="line" lang="plaintext"><hr /></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="1285:1-1285:53" dir="auto">The first line can be indented more than four spaces:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="1287:1-1294:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext"> foo</span> +<span id="LC2" class="line" lang="plaintext"> bar</span> +<span id="LC3" class="line" lang="plaintext">.</span> +<span id="LC4" class="line" lang="plaintext"><pre><code> foo</span> +<span id="LC5" class="line" lang="plaintext">bar</span> +<span id="LC6" class="line" lang="plaintext"></code></pre></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="1297:1-1298:23" dir="auto">Blank lines preceding or following an indented code block +are not included in it:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="1300:1-1309:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext"></span> +<span id="LC2" class="line" lang="plaintext"> </span> +<span id="LC3" class="line" lang="plaintext"> foo</span> +<span id="LC4" class="line" lang="plaintext"> </span> +<span id="LC5" class="line" lang="plaintext"></span> +<span id="LC6" class="line" lang="plaintext">.</span> +<span id="LC7" class="line" lang="plaintext"><pre><code>foo</span> +<span id="LC8" class="line" lang="plaintext"></code></pre></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="1312:1-1312:57" dir="auto">Trailing spaces are included in the code block's content:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="1314:1-1319:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext"> foo </span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><pre><code>foo </span> +<span id="LC4" class="line" lang="plaintext"></code></pre></span></code></pre> +<copy-code></copy-code> +</div> +<h2 data-sourcepos="1323:1-1323:21" dir="auto"> +<a id="user-content-fenced-code-blocks" class="anchor" href="#fenced-code-blocks" aria-hidden="true"></a>Fenced code blocks</h2> +<p data-sourcepos="1325:1-1329:61" dir="auto">A <a href="@">code fence</a> is a sequence +of at least three consecutive backtick characters (<code>`</code>) or +tildes (<code>~</code>). (Tildes and backticks cannot be mixed.) +A <a href="@">fenced code block</a> +begins with a code fence, indented no more than three spaces.</p> +<p data-sourcepos="1331:1-1337:34" dir="auto">The line with the opening code fence may optionally contain some text +following the code fence; this is trimmed of leading and trailing +whitespace and called the <a href="@">info string</a>. If the [info string] comes +after a backtick fence, it may not contain any backtick +characters. (The reason for this restriction is that otherwise +some inline code would be incorrectly interpreted as the +beginning of a fenced code block.)</p> +<p data-sourcepos="1339:1-1346:43" dir="auto">The content of the code block consists of all subsequent lines, until +a closing [code fence] of the same type as the code block +began with (backticks or tildes), and with at least as many backticks +or tildes as the opening code fence. If the leading code fence is +indented N spaces, then up to N spaces of indentation are removed from +each line of the content (if present). (If a content line is not +indented, it is preserved unchanged. If it is indented less than N +spaces, all of the indentation is removed.)</p> +<p data-sourcepos="1348:1-1356:25" dir="auto">The closing code fence may be indented up to three spaces, and may be +followed only by spaces, which are ignored. If the end of the +containing block (or document) is reached and no closing code fence +has been found, the code block contains all of the lines after the +opening code fence until the end of the containing block (or +document). (An alternative spec would require backtracking in the +event that a closing code fence is not found. But this makes parsing +much less efficient, and there seems to be no real down side to the +behavior described here.)</p> +<p data-sourcepos="1358:1-1359:36" dir="auto">A fenced code block may interrupt a paragraph, and does not require +a blank line either before or after.</p> +<p data-sourcepos="1361:1-1365:42" dir="auto">The content of a code fence is treated as literal text, not parsed +as inlines. The first word of the [info string] is typically used to +specify the language of the code sample, and rendered in the <code>class</code> +attribute of the <code>code</code> tag. However, this spec does not mandate any +particular treatment of the [info string].</p> +<p data-sourcepos="1367:1-1367:40" dir="auto">Here is a simple example with backticks:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="1369:1-1378:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">```</span> +<span id="LC2" class="line" lang="plaintext"><</span> +<span id="LC3" class="line" lang="plaintext"> ></span> +<span id="LC4" class="line" lang="plaintext">```</span> +<span id="LC5" class="line" lang="plaintext">.</span> +<span id="LC6" class="line" lang="plaintext"><pre><code>&lt;</span> +<span id="LC7" class="line" lang="plaintext"> &gt;</span> +<span id="LC8" class="line" lang="plaintext"></code></pre></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="1381:1-1381:12" dir="auto">With tildes:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="1383:1-1392:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">~~~</span> +<span id="LC2" class="line" lang="plaintext"><</span> +<span id="LC3" class="line" lang="plaintext"> ></span> +<span id="LC4" class="line" lang="plaintext">~~~</span> +<span id="LC5" class="line" lang="plaintext">.</span> +<span id="LC6" class="line" lang="plaintext"><pre><code>&lt;</span> +<span id="LC7" class="line" lang="plaintext"> &gt;</span> +<span id="LC8" class="line" lang="plaintext"></code></pre></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="1394:1-1394:41" dir="auto">Fewer than three backticks is not enough:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="1396:1-1402:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">``</span> +<span id="LC2" class="line" lang="plaintext">foo</span> +<span id="LC3" class="line" lang="plaintext">``</span> +<span id="LC4" class="line" lang="plaintext">.</span> +<span id="LC5" class="line" lang="plaintext"><p><code>foo</code></p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="1404:1-1405:6" dir="auto">The closing code fence must use the same character as the opening +fence:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="1407:1-1416:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">```</span> +<span id="LC2" class="line" lang="plaintext">aaa</span> +<span id="LC3" class="line" lang="plaintext">~~~</span> +<span id="LC4" class="line" lang="plaintext">```</span> +<span id="LC5" class="line" lang="plaintext">.</span> +<span id="LC6" class="line" lang="plaintext"><pre><code>aaa</span> +<span id="LC7" class="line" lang="plaintext">~~~</span> +<span id="LC8" class="line" lang="plaintext"></code></pre></span></code></pre> +<copy-code></copy-code> +</div> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="1419:1-1428:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">~~~</span> +<span id="LC2" class="line" lang="plaintext">aaa</span> +<span id="LC3" class="line" lang="plaintext">```</span> +<span id="LC4" class="line" lang="plaintext">~~~</span> +<span id="LC5" class="line" lang="plaintext">.</span> +<span id="LC6" class="line" lang="plaintext"><pre><code>aaa</span> +<span id="LC7" class="line" lang="plaintext">```</span> +<span id="LC8" class="line" lang="plaintext"></code></pre></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="1431:1-1431:69" dir="auto">The closing code fence must be at least as long as the opening fence:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="1433:1-1442:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">````</span> +<span id="LC2" class="line" lang="plaintext">aaa</span> +<span id="LC3" class="line" lang="plaintext">```</span> +<span id="LC4" class="line" lang="plaintext">``````</span> +<span id="LC5" class="line" lang="plaintext">.</span> +<span id="LC6" class="line" lang="plaintext"><pre><code>aaa</span> +<span id="LC7" class="line" lang="plaintext">```</span> +<span id="LC8" class="line" lang="plaintext"></code></pre></span></code></pre> +<copy-code></copy-code> +</div> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="1445:1-1454:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">~~~~</span> +<span id="LC2" class="line" lang="plaintext">aaa</span> +<span id="LC3" class="line" lang="plaintext">~~~</span> +<span id="LC4" class="line" lang="plaintext">~~~~</span> +<span id="LC5" class="line" lang="plaintext">.</span> +<span id="LC6" class="line" lang="plaintext"><pre><code>aaa</span> +<span id="LC7" class="line" lang="plaintext">~~~</span> +<span id="LC8" class="line" lang="plaintext"></code></pre></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="1457:1-1458:74" dir="auto">Unclosed code blocks are closed by the end of the document +(or the enclosing [block quote][block quotes] or [list item][list items]):</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="1460:1-1464:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">```</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><pre><code></code></pre></span></code></pre> +<copy-code></copy-code> +</div> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="1467:1-1477:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">`````</span> +<span id="LC2" class="line" lang="plaintext"></span> +<span id="LC3" class="line" lang="plaintext">```</span> +<span id="LC4" class="line" lang="plaintext">aaa</span> +<span id="LC5" class="line" lang="plaintext">.</span> +<span id="LC6" class="line" lang="plaintext"><pre><code></span> +<span id="LC7" class="line" lang="plaintext">```</span> +<span id="LC8" class="line" lang="plaintext">aaa</span> +<span id="LC9" class="line" lang="plaintext"></code></pre></span></code></pre> +<copy-code></copy-code> +</div> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="1480:1-1491:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">> ```</span> +<span id="LC2" class="line" lang="plaintext">> aaa</span> +<span id="LC3" class="line" lang="plaintext"></span> +<span id="LC4" class="line" lang="plaintext">bbb</span> +<span id="LC5" class="line" lang="plaintext">.</span> +<span id="LC6" class="line" lang="plaintext"><blockquote></span> +<span id="LC7" class="line" lang="plaintext"><pre><code>aaa</span> +<span id="LC8" class="line" lang="plaintext"></code></pre></span> +<span id="LC9" class="line" lang="plaintext"></blockquote></span> +<span id="LC10" class="line" lang="plaintext"><p>bbb</p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="1494:1-1494:53" dir="auto">A code block can have all empty lines as its content:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="1496:1-1505:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">```</span> +<span id="LC2" class="line" lang="plaintext"></span> +<span id="LC3" class="line" lang="plaintext"> </span> +<span id="LC4" class="line" lang="plaintext">```</span> +<span id="LC5" class="line" lang="plaintext">.</span> +<span id="LC6" class="line" lang="plaintext"><pre><code></span> +<span id="LC7" class="line" lang="plaintext"> </span> +<span id="LC8" class="line" lang="plaintext"></code></pre></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="1508:1-1508:26" dir="auto">A code block can be empty:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="1510:1-1515:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">```</span> +<span id="LC2" class="line" lang="plaintext">```</span> +<span id="LC3" class="line" lang="plaintext">.</span> +<span id="LC4" class="line" lang="plaintext"><pre><code></code></pre></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="1518:1-1520:11" dir="auto">Fences can be indented. If the opening fence is indented, +content lines will have equivalent opening indentation removed, +if present:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="1522:1-1531:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext"> ```</span> +<span id="LC2" class="line" lang="plaintext"> aaa</span> +<span id="LC3" class="line" lang="plaintext">aaa</span> +<span id="LC4" class="line" lang="plaintext">```</span> +<span id="LC5" class="line" lang="plaintext">.</span> +<span id="LC6" class="line" lang="plaintext"><pre><code>aaa</span> +<span id="LC7" class="line" lang="plaintext">aaa</span> +<span id="LC8" class="line" lang="plaintext"></code></pre></span></code></pre> +<copy-code></copy-code> +</div> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="1534:1-1545:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext"> ```</span> +<span id="LC2" class="line" lang="plaintext">aaa</span> +<span id="LC3" class="line" lang="plaintext"> aaa</span> +<span id="LC4" class="line" lang="plaintext">aaa</span> +<span id="LC5" class="line" lang="plaintext"> ```</span> +<span id="LC6" class="line" lang="plaintext">.</span> +<span id="LC7" class="line" lang="plaintext"><pre><code>aaa</span> +<span id="LC8" class="line" lang="plaintext">aaa</span> +<span id="LC9" class="line" lang="plaintext">aaa</span> +<span id="LC10" class="line" lang="plaintext"></code></pre></span></code></pre> +<copy-code></copy-code> +</div> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="1548:1-1559:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext"> ```</span> +<span id="LC2" class="line" lang="plaintext"> aaa</span> +<span id="LC3" class="line" lang="plaintext"> aaa</span> +<span id="LC4" class="line" lang="plaintext"> aaa</span> +<span id="LC5" class="line" lang="plaintext"> ```</span> +<span id="LC6" class="line" lang="plaintext">.</span> +<span id="LC7" class="line" lang="plaintext"><pre><code>aaa</span> +<span id="LC8" class="line" lang="plaintext"> aaa</span> +<span id="LC9" class="line" lang="plaintext">aaa</span> +<span id="LC10" class="line" lang="plaintext"></code></pre></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="1562:1-1562:56" dir="auto">Four spaces indentation produces an indented code block:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="1564:1-1573:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext"> ```</span> +<span id="LC2" class="line" lang="plaintext"> aaa</span> +<span id="LC3" class="line" lang="plaintext"> ```</span> +<span id="LC4" class="line" lang="plaintext">.</span> +<span id="LC5" class="line" lang="plaintext"><pre><code>```</span> +<span id="LC6" class="line" lang="plaintext">aaa</span> +<span id="LC7" class="line" lang="plaintext">```</span> +<span id="LC8" class="line" lang="plaintext"></code></pre></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="1576:1-1577:41" dir="auto">Closing fences may be indented by 0-3 spaces, and their indentation +need not match that of the opening fence:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="1579:1-1586:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">```</span> +<span id="LC2" class="line" lang="plaintext">aaa</span> +<span id="LC3" class="line" lang="plaintext"> ```</span> +<span id="LC4" class="line" lang="plaintext">.</span> +<span id="LC5" class="line" lang="plaintext"><pre><code>aaa</span> +<span id="LC6" class="line" lang="plaintext"></code></pre></span></code></pre> +<copy-code></copy-code> +</div> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="1589:1-1596:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext"> ```</span> +<span id="LC2" class="line" lang="plaintext">aaa</span> +<span id="LC3" class="line" lang="plaintext"> ```</span> +<span id="LC4" class="line" lang="plaintext">.</span> +<span id="LC5" class="line" lang="plaintext"><pre><code>aaa</span> +<span id="LC6" class="line" lang="plaintext"></code></pre></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="1599:1-1599:61" dir="auto">This is not a closing fence, because it is indented 4 spaces:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="1601:1-1609:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">```</span> +<span id="LC2" class="line" lang="plaintext">aaa</span> +<span id="LC3" class="line" lang="plaintext"> ```</span> +<span id="LC4" class="line" lang="plaintext">.</span> +<span id="LC5" class="line" lang="plaintext"><pre><code>aaa</span> +<span id="LC6" class="line" lang="plaintext"> ```</span> +<span id="LC7" class="line" lang="plaintext"></code></pre></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="1613:1-1613:65" dir="auto">Code fences (opening and closing) cannot contain internal spaces:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="1615:1-1621:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">``` ```</span> +<span id="LC2" class="line" lang="plaintext">aaa</span> +<span id="LC3" class="line" lang="plaintext">.</span> +<span id="LC4" class="line" lang="plaintext"><p><code> </code></span> +<span id="LC5" class="line" lang="plaintext">aaa</p></span></code></pre> +<copy-code></copy-code> +</div> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="1624:1-1632:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">~~~~~~</span> +<span id="LC2" class="line" lang="plaintext">aaa</span> +<span id="LC3" class="line" lang="plaintext">~~~ ~~</span> +<span id="LC4" class="line" lang="plaintext">.</span> +<span id="LC5" class="line" lang="plaintext"><pre><code>aaa</span> +<span id="LC6" class="line" lang="plaintext">~~~ ~~</span> +<span id="LC7" class="line" lang="plaintext"></code></pre></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="1635:1-1636:53" dir="auto">Fenced code blocks can interrupt paragraphs, and can be followed +directly by paragraphs, without a blank line between:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="1638:1-1649:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">foo</span> +<span id="LC2" class="line" lang="plaintext">```</span> +<span id="LC3" class="line" lang="plaintext">bar</span> +<span id="LC4" class="line" lang="plaintext">```</span> +<span id="LC5" class="line" lang="plaintext">baz</span> +<span id="LC6" class="line" lang="plaintext">.</span> +<span id="LC7" class="line" lang="plaintext"><p>foo</p></span> +<span id="LC8" class="line" lang="plaintext"><pre><code>bar</span> +<span id="LC9" class="line" lang="plaintext"></code></pre></span> +<span id="LC10" class="line" lang="plaintext"><p>baz</p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="1652:1-1653:34" dir="auto">Other blocks can also occur before and after fenced code blocks +without an intervening blank line:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="1655:1-1667:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">foo</span> +<span id="LC2" class="line" lang="plaintext">---</span> +<span id="LC3" class="line" lang="plaintext">~~~</span> +<span id="LC4" class="line" lang="plaintext">bar</span> +<span id="LC5" class="line" lang="plaintext">~~~</span> +<span id="LC6" class="line" lang="plaintext"># baz</span> +<span id="LC7" class="line" lang="plaintext">.</span> +<span id="LC8" class="line" lang="plaintext"><h2>foo</h2></span> +<span id="LC9" class="line" lang="plaintext"><pre><code>bar</span> +<span id="LC10" class="line" lang="plaintext"></code></pre></span> +<span id="LC11" class="line" lang="plaintext"><h1>baz</h1></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="1670:1-1675:45" dir="auto">An [info string] can be provided after the opening code fence. +Although this spec doesn't mandate any particular treatment of +the info string, the first word is typically used to specify +the language of the code block. In HTML output, the language is +normally indicated by adding a class to the <code>code</code> element consisting +of <code>language-</code> followed by the language name.</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="1677:1-1688:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">```ruby</span> +<span id="LC2" class="line" lang="plaintext">def foo(x)</span> +<span id="LC3" class="line" lang="plaintext"> return 3</span> +<span id="LC4" class="line" lang="plaintext">end</span> +<span id="LC5" class="line" lang="plaintext">```</span> +<span id="LC6" class="line" lang="plaintext">.</span> +<span id="LC7" class="line" lang="plaintext"><pre><code class="language-ruby">def foo(x)</span> +<span id="LC8" class="line" lang="plaintext"> return 3</span> +<span id="LC9" class="line" lang="plaintext">end</span> +<span id="LC10" class="line" lang="plaintext"></code></pre></span></code></pre> +<copy-code></copy-code> +</div> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="1691:1-1702:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">~~~~ ruby startline=3 $%@#$</span> +<span id="LC2" class="line" lang="plaintext">def foo(x)</span> +<span id="LC3" class="line" lang="plaintext"> return 3</span> +<span id="LC4" class="line" lang="plaintext">end</span> +<span id="LC5" class="line" lang="plaintext">~~~~~~~</span> +<span id="LC6" class="line" lang="plaintext">.</span> +<span id="LC7" class="line" lang="plaintext"><pre><code class="language-ruby">def foo(x)</span> +<span id="LC8" class="line" lang="plaintext"> return 3</span> +<span id="LC9" class="line" lang="plaintext">end</span> +<span id="LC10" class="line" lang="plaintext"></code></pre></span></code></pre> +<copy-code></copy-code> +</div> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="1705:1-1710:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">````;</span> +<span id="LC2" class="line" lang="plaintext">````</span> +<span id="LC3" class="line" lang="plaintext">.</span> +<span id="LC4" class="line" lang="plaintext"><pre><code class="language-;"></code></pre></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="1713:1-1713:65" dir="auto">[Info strings] for backtick code blocks cannot contain backticks:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="1715:1-1721:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">``` aa ```</span> +<span id="LC2" class="line" lang="plaintext">foo</span> +<span id="LC3" class="line" lang="plaintext">.</span> +<span id="LC4" class="line" lang="plaintext"><p><code>aa</code></span> +<span id="LC5" class="line" lang="plaintext">foo</p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="1724:1-1724:70" dir="auto">[Info strings] for tilde code blocks can contain backticks and tildes:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="1726:1-1733:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">~~~ aa ``` ~~~</span> +<span id="LC2" class="line" lang="plaintext">foo</span> +<span id="LC3" class="line" lang="plaintext">~~~</span> +<span id="LC4" class="line" lang="plaintext">.</span> +<span id="LC5" class="line" lang="plaintext"><pre><code class="language-aa">foo</span> +<span id="LC6" class="line" lang="plaintext"></code></pre></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="1736:1-1736:47" dir="auto">Closing code fences cannot have [info strings]:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="1738:1-1745:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">```</span> +<span id="LC2" class="line" lang="plaintext">``` aaa</span> +<span id="LC3" class="line" lang="plaintext">```</span> +<span id="LC4" class="line" lang="plaintext">.</span> +<span id="LC5" class="line" lang="plaintext"><pre><code>``` aaa</span> +<span id="LC6" class="line" lang="plaintext"></code></pre></span></code></pre> +<copy-code></copy-code> +</div> +<h2 data-sourcepos="1749:1-1749:14" dir="auto"> +<a id="user-content-html-blocks" class="anchor" href="#html-blocks" aria-hidden="true"></a>HTML blocks</h2> +<p data-sourcepos="1751:1-1752:53" dir="auto">An <a href="@">HTML block</a> is a group of lines that is treated +as raw HTML (and will not be escaped in HTML output).</p> +<p data-sourcepos="1754:1-1762:50" dir="auto">There are seven kinds of [HTML block], which can be defined by their +start and end conditions. The block begins with a line that meets a +<a href="@">start condition</a> (after up to three spaces optional indentation). +It ends with the first subsequent line that meets a matching <a href="@">end +condition</a>, or the last line of the document, or the last line of +the <a href="#container-blocks">container block</a> containing the current HTML +block, if no line is encountered that meets the [end condition]. If +the first line meets both the [start condition] and the [end +condition], the block will contain just that line.</p> +<ol data-sourcepos="1764:1-1805:0" dir="auto"> +<li data-sourcepos="1764:1-1770:0"> +<p data-sourcepos="1764:5-1769:30"><strong>Start condition:</strong> line begins with the string <code><script</code>, +<code><pre</code>, or <code><style</code> (case-insensitive), followed by whitespace, +the string <code>></code>, or the end of the line.<br> +<strong>End condition:</strong> line contains an end tag +<code></script></code>, <code></pre></code>, or <code></style></code> (case-insensitive; it +need not match the start tag).</p> +</li> +<li data-sourcepos="1771:1-1773:0"> +<p data-sourcepos="1771:5-1772:51"><strong>Start condition:</strong> line begins with the string <code><!--</code>.<br> +<strong>End condition:</strong> line contains the string <code>--></code>.</p> +</li> +<li data-sourcepos="1774:1-1776:0"> +<p data-sourcepos="1774:5-1775:49"><strong>Start condition:</strong> line begins with the string <code><?</code>.<br> +<strong>End condition:</strong> line contains the string <code>?></code>.</p> +</li> +<li data-sourcepos="1777:1-1780:0"> +<p data-sourcepos="1777:5-1779:51"><strong>Start condition:</strong> line begins with the string <code><!</code> +followed by an uppercase ASCII letter.<br> +<strong>End condition:</strong> line contains the character <code>></code>.</p> +</li> +<li data-sourcepos="1781:1-1784:0"> +<p data-sourcepos="1781:5-1783:50"><strong>Start condition:</strong> line begins with the string +<code><![CDATA[</code>.<br> +<strong>End condition:</strong> line contains the string <code>]]></code>.</p> +</li> +<li data-sourcepos="1785:1-1799:0"> +<p data-sourcepos="1785:5-1798:54"><strong>Start condition:</strong> line begins the string <code><</code> or <code></</code> +followed by one of the strings (case-insensitive) <code>address</code>, +<code>article</code>, <code>aside</code>, <code>base</code>, <code>basefont</code>, <code>blockquote</code>, <code>body</code>, +<code>caption</code>, <code>center</code>, <code>col</code>, <code>colgroup</code>, <code>dd</code>, <code>details</code>, <code>dialog</code>, +<code>dir</code>, <code>div</code>, <code>dl</code>, <code>dt</code>, <code>fieldset</code>, <code>figcaption</code>, <code>figure</code>, +<code>footer</code>, <code>form</code>, <code>frame</code>, <code>frameset</code>, +<code>h1</code>, <code>h2</code>, <code>h3</code>, <code>h4</code>, <code>h5</code>, <code>h6</code>, <code>head</code>, <code>header</code>, <code>hr</code>, +<code>html</code>, <code>iframe</code>, <code>legend</code>, <code>li</code>, <code>link</code>, <code>main</code>, <code>menu</code>, <code>menuitem</code>, +<code>nav</code>, <code>noframes</code>, <code>ol</code>, <code>optgroup</code>, <code>option</code>, <code>p</code>, <code>param</code>, +<code>section</code>, <code>summary</code>, <code>table</code>, <code>tbody</code>, <code>td</code>, +<code>tfoot</code>, <code>th</code>, <code>thead</code>, <code>title</code>, <code>tr</code>, <code>track</code>, <code>ul</code>, followed +by [whitespace], the end of the line, the string <code>></code>, or +the string <code>/></code>.<br> +<strong>End condition:</strong> line is followed by a [blank line].</p> +</li> +<li data-sourcepos="1800:1-1805:0"> +<p data-sourcepos="1800:5-1804:54"><strong>Start condition:</strong> line begins with a complete [open tag] +(with any [tag name] other than <code>script</code>, +<code>style</code>, or <code>pre</code>) or a complete [closing tag], +followed only by [whitespace] or the end of the line.<br> +<strong>End condition:</strong> line is followed by a [blank line].</p> +</li> +</ol> +<p data-sourcepos="1806:1-1811:19" dir="auto">HTML blocks continue until they are closed by their appropriate +[end condition], or the last line of the document or other <a href="#container-blocks">container +block</a>. This means any HTML <strong>within an HTML +block</strong> that might otherwise be recognised as a start condition will +be ignored by the parser and passed through as-is, without changing +the parser's state.</p> +<p data-sourcepos="1813:1-1815:51" dir="auto">For instance, <code><pre></code> within a HTML block started by <code><table></code> will not affect +the parser state; as the HTML block was started in by start condition 6, it +will end at any blank line. This can be surprising:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="1817:1-1832:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext"><table><tr><td></span> +<span id="LC2" class="line" lang="plaintext"><pre></span> +<span id="LC3" class="line" lang="plaintext">**Hello**,</span> +<span id="LC4" class="line" lang="plaintext"></span> +<span id="LC5" class="line" lang="plaintext">_world_.</span> +<span id="LC6" class="line" lang="plaintext"></pre></span> +<span id="LC7" class="line" lang="plaintext"></td></tr></table></span> +<span id="LC8" class="line" lang="plaintext">.</span> +<span id="LC9" class="line" lang="plaintext"><table><tr><td></span> +<span id="LC10" class="line" lang="plaintext"><pre></span> +<span id="LC11" class="line" lang="plaintext">**Hello**,</span> +<span id="LC12" class="line" lang="plaintext"><p><em>world</em>.</span> +<span id="LC13" class="line" lang="plaintext"></pre></p></span> +<span id="LC14" class="line" lang="plaintext"></td></tr></table></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="1834:1-1836:55" dir="auto">In this case, the HTML block is terminated by the newline — the <code>**Hello**</code> +text remains verbatim — and regular parsing resumes, with a paragraph, +emphasised <code>world</code> and inline and block HTML following.</p> +<p data-sourcepos="1838:1-1841:65" dir="auto">All types of [HTML blocks] except type 7 may interrupt +a paragraph. Blocks of type 7 may not interrupt a paragraph. +(This restriction is intended to prevent unwanted interpretation +of long tags inside a wrapped paragraph as starting HTML blocks.)</p> +<p data-sourcepos="1843:1-1844:10" dir="auto">Some simple examples follow. Here are some basic HTML blocks +of type 6:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="1846:1-1865:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext"><table></span> +<span id="LC2" class="line" lang="plaintext"> <tr></span> +<span id="LC3" class="line" lang="plaintext"> <td></span> +<span id="LC4" class="line" lang="plaintext"> hi</span> +<span id="LC5" class="line" lang="plaintext"> </td></span> +<span id="LC6" class="line" lang="plaintext"> </tr></span> +<span id="LC7" class="line" lang="plaintext"></table></span> +<span id="LC8" class="line" lang="plaintext"></span> +<span id="LC9" class="line" lang="plaintext">okay.</span> +<span id="LC10" class="line" lang="plaintext">.</span> +<span id="LC11" class="line" lang="plaintext"><table></span> +<span id="LC12" class="line" lang="plaintext"> <tr></span> +<span id="LC13" class="line" lang="plaintext"> <td></span> +<span id="LC14" class="line" lang="plaintext"> hi</span> +<span id="LC15" class="line" lang="plaintext"> </td></span> +<span id="LC16" class="line" lang="plaintext"> </tr></span> +<span id="LC17" class="line" lang="plaintext"></table></span> +<span id="LC18" class="line" lang="plaintext"><p>okay.</p></span></code></pre> +<copy-code></copy-code> +</div> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="1868:1-1876:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext"> <div></span> +<span id="LC2" class="line" lang="plaintext"> *hello*</span> +<span id="LC3" class="line" lang="plaintext"> <foo><a></span> +<span id="LC4" class="line" lang="plaintext">.</span> +<span id="LC5" class="line" lang="plaintext"> <div></span> +<span id="LC6" class="line" lang="plaintext"> *hello*</span> +<span id="LC7" class="line" lang="plaintext"> <foo><a></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="1879:1-1879:42" dir="auto">A block can also start with a closing tag:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="1881:1-1887:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext"></div></span> +<span id="LC2" class="line" lang="plaintext">*foo*</span> +<span id="LC3" class="line" lang="plaintext">.</span> +<span id="LC4" class="line" lang="plaintext"></div></span> +<span id="LC5" class="line" lang="plaintext">*foo*</span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="1890:1-1890:68" dir="auto">Here we have two HTML blocks with a Markdown paragraph between them:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="1892:1-1902:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext"><DIV CLASS="foo"></span> +<span id="LC2" class="line" lang="plaintext"></span> +<span id="LC3" class="line" lang="plaintext">*Markdown*</span> +<span id="LC4" class="line" lang="plaintext"></span> +<span id="LC5" class="line" lang="plaintext"></DIV></span> +<span id="LC6" class="line" lang="plaintext">.</span> +<span id="LC7" class="line" lang="plaintext"><DIV CLASS="foo"></span> +<span id="LC8" class="line" lang="plaintext"><p><em>Markdown</em></p></span> +<span id="LC9" class="line" lang="plaintext"></DIV></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="1905:1-1906:47" dir="auto">The tag on the first line can be partial, as long +as it is split where there would be whitespace:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="1908:1-1916:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext"><div id="foo"</span> +<span id="LC2" class="line" lang="plaintext"> class="bar"></span> +<span id="LC3" class="line" lang="plaintext"></div></span> +<span id="LC4" class="line" lang="plaintext">.</span> +<span id="LC5" class="line" lang="plaintext"><div id="foo"</span> +<span id="LC6" class="line" lang="plaintext"> class="bar"></span> +<span id="LC7" class="line" lang="plaintext"></div></span></code></pre> +<copy-code></copy-code> +</div> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="1919:1-1927:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext"><div id="foo" class="bar</span> +<span id="LC2" class="line" lang="plaintext"> baz"></span> +<span id="LC3" class="line" lang="plaintext"></div></span> +<span id="LC4" class="line" lang="plaintext">.</span> +<span id="LC5" class="line" lang="plaintext"><div id="foo" class="bar</span> +<span id="LC6" class="line" lang="plaintext"> baz"></span> +<span id="LC7" class="line" lang="plaintext"></div></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="1930:1-1930:31" dir="auto">An open tag need not be closed:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="1931:1-1940:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext"><div></span> +<span id="LC2" class="line" lang="plaintext">*foo*</span> +<span id="LC3" class="line" lang="plaintext"></span> +<span id="LC4" class="line" lang="plaintext">*bar*</span> +<span id="LC5" class="line" lang="plaintext">.</span> +<span id="LC6" class="line" lang="plaintext"><div></span> +<span id="LC7" class="line" lang="plaintext">*foo*</span> +<span id="LC8" class="line" lang="plaintext"><p><em>bar</em></p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="1944:1-1945:17" dir="auto">A partial tag need not even be completed (garbage +in, garbage out):</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="1947:1-1953:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext"><div id="foo"</span> +<span id="LC2" class="line" lang="plaintext">*hi*</span> +<span id="LC3" class="line" lang="plaintext">.</span> +<span id="LC4" class="line" lang="plaintext"><div id="foo"</span> +<span id="LC5" class="line" lang="plaintext">*hi*</span></code></pre> +<copy-code></copy-code> +</div> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="1956:1-1962:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext"><div class</span> +<span id="LC2" class="line" lang="plaintext">foo</span> +<span id="LC3" class="line" lang="plaintext">.</span> +<span id="LC4" class="line" lang="plaintext"><div class</span> +<span id="LC5" class="line" lang="plaintext">foo</span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="1965:1-1966:35" dir="auto">The initial tag doesn't even need to be a valid +tag, as long as it starts like one:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="1968:1-1974:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext"><div *???-&&&-<---</span> +<span id="LC2" class="line" lang="plaintext">*foo*</span> +<span id="LC3" class="line" lang="plaintext">.</span> +<span id="LC4" class="line" lang="plaintext"><div *???-&&&-<---</span> +<span id="LC5" class="line" lang="plaintext">*foo*</span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="1977:1-1978:7" dir="auto">In type 6 blocks, the initial tag need not be on a line by +itself:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="1980:1-1984:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext"><div><a href="bar">*foo*</a></div></span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><div><a href="bar">*foo*</a></div></span></code></pre> +<copy-code></copy-code> +</div> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="1987:1-1995:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext"><table><tr><td></span> +<span id="LC2" class="line" lang="plaintext">foo</span> +<span id="LC3" class="line" lang="plaintext"></td></tr></table></span> +<span id="LC4" class="line" lang="plaintext">.</span> +<span id="LC5" class="line" lang="plaintext"><table><tr><td></span> +<span id="LC6" class="line" lang="plaintext">foo</span> +<span id="LC7" class="line" lang="plaintext"></td></tr></table></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="1998:1-2002:43" dir="auto">Everything until the next blank line or end of document +gets included in the HTML block. So, in the following +example, what looks like a Markdown code block +is actually part of the HTML block, which continues until a blank +line or the end of the document is reached:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="2004:1-2014:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext"><div></div></span> +<span id="LC2" class="line" lang="plaintext">``` c</span> +<span id="LC3" class="line" lang="plaintext">int x = 33;</span> +<span id="LC4" class="line" lang="plaintext">```</span> +<span id="LC5" class="line" lang="plaintext">.</span> +<span id="LC6" class="line" lang="plaintext"><div></div></span> +<span id="LC7" class="line" lang="plaintext">``` c</span> +<span id="LC8" class="line" lang="plaintext">int x = 33;</span> +<span id="LC9" class="line" lang="plaintext">```</span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="2017:1-2019:51" dir="auto">To start an [HTML block] with a tag that is <em>not</em> in the +list of block-level tags in (6), you must put the tag by +itself on the first line (and it must be complete):</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="2021:1-2029:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext"><a href="foo"></span> +<span id="LC2" class="line" lang="plaintext">*bar*</span> +<span id="LC3" class="line" lang="plaintext"></a></span> +<span id="LC4" class="line" lang="plaintext">.</span> +<span id="LC5" class="line" lang="plaintext"><a href="foo"></span> +<span id="LC6" class="line" lang="plaintext">*bar*</span> +<span id="LC7" class="line" lang="plaintext"></a></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="2032:1-2032:49" dir="auto">In type 7 blocks, the [tag name] can be anything:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="2034:1-2042:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext"><Warning></span> +<span id="LC2" class="line" lang="plaintext">*bar*</span> +<span id="LC3" class="line" lang="plaintext"></Warning></span> +<span id="LC4" class="line" lang="plaintext">.</span> +<span id="LC5" class="line" lang="plaintext"><Warning></span> +<span id="LC6" class="line" lang="plaintext">*bar*</span> +<span id="LC7" class="line" lang="plaintext"></Warning></span></code></pre> +<copy-code></copy-code> +</div> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="2045:1-2053:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext"><i class="foo"></span> +<span id="LC2" class="line" lang="plaintext">*bar*</span> +<span id="LC3" class="line" lang="plaintext"></i></span> +<span id="LC4" class="line" lang="plaintext">.</span> +<span id="LC5" class="line" lang="plaintext"><i class="foo"></span> +<span id="LC6" class="line" lang="plaintext">*bar*</span> +<span id="LC7" class="line" lang="plaintext"></i></span></code></pre> +<copy-code></copy-code> +</div> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="2056:1-2062:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext"></ins></span> +<span id="LC2" class="line" lang="plaintext">*bar*</span> +<span id="LC3" class="line" lang="plaintext">.</span> +<span id="LC4" class="line" lang="plaintext"></ins></span> +<span id="LC5" class="line" lang="plaintext">*bar*</span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="2065:1-2069:59" dir="auto">These rules are designed to allow us to work with tags that +can function as either block-level or inline-level tags. +The <code><del></code> tag is a nice example. We can surround content with +<code><del></code> tags in three different ways. In this case, we get a raw +HTML block, because the <code><del></code> tag is on a line by itself:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="2071:1-2079:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext"><del></span> +<span id="LC2" class="line" lang="plaintext">*foo*</span> +<span id="LC3" class="line" lang="plaintext"></del></span> +<span id="LC4" class="line" lang="plaintext">.</span> +<span id="LC5" class="line" lang="plaintext"><del></span> +<span id="LC6" class="line" lang="plaintext">*foo*</span> +<span id="LC7" class="line" lang="plaintext"></del></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="2082:1-2084:54" dir="auto">In this case, we get a raw HTML block that just includes +the <code><del></code> tag (because it ends with the following blank +line). So the contents get interpreted as CommonMark:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="2086:1-2096:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext"><del></span> +<span id="LC2" class="line" lang="plaintext"></span> +<span id="LC3" class="line" lang="plaintext">*foo*</span> +<span id="LC4" class="line" lang="plaintext"></span> +<span id="LC5" class="line" lang="plaintext"></del></span> +<span id="LC6" class="line" lang="plaintext">.</span> +<span id="LC7" class="line" lang="plaintext"><del></span> +<span id="LC8" class="line" lang="plaintext"><p><em>foo</em></p></span> +<span id="LC9" class="line" lang="plaintext"></del></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="2099:1-2102:29" dir="auto">Finally, in this case, the <code><del></code> tags are interpreted +as [raw HTML] <em>inside</em> the CommonMark paragraph. (Because +the tag is not on a line by itself, we get inline HTML +rather than an [HTML block].)</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="2104:1-2108:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext"><del>*foo*</del></span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p><del><em>foo</em></del></p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="2111:1-2116:50" dir="auto">HTML tags designed to contain literal content +(<code>script</code>, <code>style</code>, <code>pre</code>), comments, processing instructions, +and declarations are treated somewhat differently. +Instead of ending at the first blank line, these blocks +end at the first line containing a corresponding end tag. +As a result, these blocks can contain blank lines:</p> +<p data-sourcepos="2118:1-2118:19" dir="auto">A pre tag (type 1):</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="2120:1-2136:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext"><pre language="haskell"><code></span> +<span id="LC2" class="line" lang="plaintext">import Text.HTML.TagSoup</span> +<span id="LC3" class="line" lang="plaintext"></span> +<span id="LC4" class="line" lang="plaintext">main :: IO ()</span> +<span id="LC5" class="line" lang="plaintext">main = print $ parseTags tags</span> +<span id="LC6" class="line" lang="plaintext"></code></pre></span> +<span id="LC7" class="line" lang="plaintext">okay</span> +<span id="LC8" class="line" lang="plaintext">.</span> +<span id="LC9" class="line" lang="plaintext"><pre language="haskell"><code></span> +<span id="LC10" class="line" lang="plaintext">import Text.HTML.TagSoup</span> +<span id="LC11" class="line" lang="plaintext"></span> +<span id="LC12" class="line" lang="plaintext">main :: IO ()</span> +<span id="LC13" class="line" lang="plaintext">main = print $ parseTags tags</span> +<span id="LC14" class="line" lang="plaintext"></code></pre></span> +<span id="LC15" class="line" lang="plaintext"><p>okay</p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="2139:1-2139:22" dir="auto">A script tag (type 1):</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="2141:1-2155:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext"><script type="text/javascript"></span> +<span id="LC2" class="line" lang="plaintext">// JavaScript example</span> +<span id="LC3" class="line" lang="plaintext"></span> +<span id="LC4" class="line" lang="plaintext">document.getElementById("demo").innerHTML = "Hello JavaScript!";</span> +<span id="LC5" class="line" lang="plaintext"></script></span> +<span id="LC6" class="line" lang="plaintext">okay</span> +<span id="LC7" class="line" lang="plaintext">.</span> +<span id="LC8" class="line" lang="plaintext"><script type="text/javascript"></span> +<span id="LC9" class="line" lang="plaintext">// JavaScript example</span> +<span id="LC10" class="line" lang="plaintext"></span> +<span id="LC11" class="line" lang="plaintext">document.getElementById("demo").innerHTML = "Hello JavaScript!";</span> +<span id="LC12" class="line" lang="plaintext"></script></span> +<span id="LC13" class="line" lang="plaintext"><p>okay</p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="2158:1-2158:21" dir="auto">A style tag (type 1):</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="2160:1-2176:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext"><style</span> +<span id="LC2" class="line" lang="plaintext"> type="text/css"></span> +<span id="LC3" class="line" lang="plaintext">h1 {color:red;}</span> +<span id="LC4" class="line" lang="plaintext"></span> +<span id="LC5" class="line" lang="plaintext">p {color:blue;}</span> +<span id="LC6" class="line" lang="plaintext"></style></span> +<span id="LC7" class="line" lang="plaintext">okay</span> +<span id="LC8" class="line" lang="plaintext">.</span> +<span id="LC9" class="line" lang="plaintext"><style</span> +<span id="LC10" class="line" lang="plaintext"> type="text/css"></span> +<span id="LC11" class="line" lang="plaintext">h1 {color:red;}</span> +<span id="LC12" class="line" lang="plaintext"></span> +<span id="LC13" class="line" lang="plaintext">p {color:blue;}</span> +<span id="LC14" class="line" lang="plaintext"></style></span> +<span id="LC15" class="line" lang="plaintext"><p>okay</p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="2179:1-2181:28" dir="auto">If there is no matching end tag, the block will end at the +end of the document (or the enclosing [block quote][block quotes] +or [list item][list items]):</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="2183:1-2193:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext"><style</span> +<span id="LC2" class="line" lang="plaintext"> type="text/css"></span> +<span id="LC3" class="line" lang="plaintext"></span> +<span id="LC4" class="line" lang="plaintext">foo</span> +<span id="LC5" class="line" lang="plaintext">.</span> +<span id="LC6" class="line" lang="plaintext"><style</span> +<span id="LC7" class="line" lang="plaintext"> type="text/css"></span> +<span id="LC8" class="line" lang="plaintext"></span> +<span id="LC9" class="line" lang="plaintext">foo</span></code></pre> +<copy-code></copy-code> +</div> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="2196:1-2207:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">> <div></span> +<span id="LC2" class="line" lang="plaintext">> foo</span> +<span id="LC3" class="line" lang="plaintext"></span> +<span id="LC4" class="line" lang="plaintext">bar</span> +<span id="LC5" class="line" lang="plaintext">.</span> +<span id="LC6" class="line" lang="plaintext"><blockquote></span> +<span id="LC7" class="line" lang="plaintext"><div></span> +<span id="LC8" class="line" lang="plaintext">foo</span> +<span id="LC9" class="line" lang="plaintext"></blockquote></span> +<span id="LC10" class="line" lang="plaintext"><p>bar</p></span></code></pre> +<copy-code></copy-code> +</div> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="2210:1-2220:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">- <div></span> +<span id="LC2" class="line" lang="plaintext">- foo</span> +<span id="LC3" class="line" lang="plaintext">.</span> +<span id="LC4" class="line" lang="plaintext"><ul></span> +<span id="LC5" class="line" lang="plaintext"><li></span> +<span id="LC6" class="line" lang="plaintext"><div></span> +<span id="LC7" class="line" lang="plaintext"></li></span> +<span id="LC8" class="line" lang="plaintext"><li>foo</li></span> +<span id="LC9" class="line" lang="plaintext"></ul></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="2223:1-2223:56" dir="auto">The end tag can occur on the same line as the start tag:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="2225:1-2231:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext"><style>p{color:red;}</style></span> +<span id="LC2" class="line" lang="plaintext">*foo*</span> +<span id="LC3" class="line" lang="plaintext">.</span> +<span id="LC4" class="line" lang="plaintext"><style>p{color:red;}</style></span> +<span id="LC5" class="line" lang="plaintext"><p><em>foo</em></p></span></code></pre> +<copy-code></copy-code> +</div> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="2234:1-2240:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext"><!-- foo -->*bar*</span> +<span id="LC2" class="line" lang="plaintext">*baz*</span> +<span id="LC3" class="line" lang="plaintext">.</span> +<span id="LC4" class="line" lang="plaintext"><!-- foo -->*bar*</span> +<span id="LC5" class="line" lang="plaintext"><p><em>baz</em></p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="2243:1-2244:45" dir="auto">Note that anything on the last line after the +end tag will be included in the [HTML block]:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="2246:1-2254:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext"><script></span> +<span id="LC2" class="line" lang="plaintext">foo</span> +<span id="LC3" class="line" lang="plaintext"></script>1. *bar*</span> +<span id="LC4" class="line" lang="plaintext">.</span> +<span id="LC5" class="line" lang="plaintext"><script></span> +<span id="LC6" class="line" lang="plaintext">foo</span> +<span id="LC7" class="line" lang="plaintext"></script>1. *bar*</span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="2257:1-2257:19" dir="auto">A comment (type 2):</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="2259:1-2271:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext"><!-- Foo</span> +<span id="LC2" class="line" lang="plaintext"></span> +<span id="LC3" class="line" lang="plaintext">bar</span> +<span id="LC4" class="line" lang="plaintext"> baz --></span> +<span id="LC5" class="line" lang="plaintext">okay</span> +<span id="LC6" class="line" lang="plaintext">.</span> +<span id="LC7" class="line" lang="plaintext"><!-- Foo</span> +<span id="LC8" class="line" lang="plaintext"></span> +<span id="LC9" class="line" lang="plaintext">bar</span> +<span id="LC10" class="line" lang="plaintext"> baz --></span> +<span id="LC11" class="line" lang="plaintext"><p>okay</p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="2275:1-2275:34" dir="auto">A processing instruction (type 3):</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="2277:1-2291:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext"><?php</span> +<span id="LC2" class="line" lang="plaintext"></span> +<span id="LC3" class="line" lang="plaintext"> echo '>';</span> +<span id="LC4" class="line" lang="plaintext"></span> +<span id="LC5" class="line" lang="plaintext">?></span> +<span id="LC6" class="line" lang="plaintext">okay</span> +<span id="LC7" class="line" lang="plaintext">.</span> +<span id="LC8" class="line" lang="plaintext"><?php</span> +<span id="LC9" class="line" lang="plaintext"></span> +<span id="LC10" class="line" lang="plaintext"> echo '>';</span> +<span id="LC11" class="line" lang="plaintext"></span> +<span id="LC12" class="line" lang="plaintext">?></span> +<span id="LC13" class="line" lang="plaintext"><p>okay</p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="2294:1-2294:23" dir="auto">A declaration (type 4):</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="2296:1-2300:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext"><!DOCTYPE html></span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><!DOCTYPE html></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="2303:1-2303:15" dir="auto">CDATA (type 5):</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="2305:1-2333:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext"><![CDATA[</span> +<span id="LC2" class="line" lang="plaintext">function matchwo(a,b)</span> +<span id="LC3" class="line" lang="plaintext">{</span> +<span id="LC4" class="line" lang="plaintext"> if (a < b && a < 0) then {</span> +<span id="LC5" class="line" lang="plaintext"> return 1;</span> +<span id="LC6" class="line" lang="plaintext"></span> +<span id="LC7" class="line" lang="plaintext"> } else {</span> +<span id="LC8" class="line" lang="plaintext"></span> +<span id="LC9" class="line" lang="plaintext"> return 0;</span> +<span id="LC10" class="line" lang="plaintext"> }</span> +<span id="LC11" class="line" lang="plaintext">}</span> +<span id="LC12" class="line" lang="plaintext">]]></span> +<span id="LC13" class="line" lang="plaintext">okay</span> +<span id="LC14" class="line" lang="plaintext">.</span> +<span id="LC15" class="line" lang="plaintext"><![CDATA[</span> +<span id="LC16" class="line" lang="plaintext">function matchwo(a,b)</span> +<span id="LC17" class="line" lang="plaintext">{</span> +<span id="LC18" class="line" lang="plaintext"> if (a < b && a < 0) then {</span> +<span id="LC19" class="line" lang="plaintext"> return 1;</span> +<span id="LC20" class="line" lang="plaintext"></span> +<span id="LC21" class="line" lang="plaintext"> } else {</span> +<span id="LC22" class="line" lang="plaintext"></span> +<span id="LC23" class="line" lang="plaintext"> return 0;</span> +<span id="LC24" class="line" lang="plaintext"> }</span> +<span id="LC25" class="line" lang="plaintext">}</span> +<span id="LC26" class="line" lang="plaintext">]]></span> +<span id="LC27" class="line" lang="plaintext"><p>okay</p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="2336:1-2336:54" dir="auto">The opening tag can be indented 1-3 spaces, but not 4:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="2338:1-2346:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext"> <!-- foo --></span> +<span id="LC2" class="line" lang="plaintext"></span> +<span id="LC3" class="line" lang="plaintext"> <!-- foo --></span> +<span id="LC4" class="line" lang="plaintext">.</span> +<span id="LC5" class="line" lang="plaintext"> <!-- foo --></span> +<span id="LC6" class="line" lang="plaintext"><pre><code>&lt;!-- foo --&gt;</span> +<span id="LC7" class="line" lang="plaintext"></code></pre></span></code></pre> +<copy-code></copy-code> +</div> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="2349:1-2357:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext"> <div></span> +<span id="LC2" class="line" lang="plaintext"></span> +<span id="LC3" class="line" lang="plaintext"> <div></span> +<span id="LC4" class="line" lang="plaintext">.</span> +<span id="LC5" class="line" lang="plaintext"> <div></span> +<span id="LC6" class="line" lang="plaintext"><pre><code>&lt;div&gt;</span> +<span id="LC7" class="line" lang="plaintext"></code></pre></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="2360:1-2361:25" dir="auto">An HTML block of types 1--6 can interrupt a paragraph, and need not be +preceded by a blank line.</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="2363:1-2373:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">Foo</span> +<span id="LC2" class="line" lang="plaintext"><div></span> +<span id="LC3" class="line" lang="plaintext">bar</span> +<span id="LC4" class="line" lang="plaintext"></div></span> +<span id="LC5" class="line" lang="plaintext">.</span> +<span id="LC6" class="line" lang="plaintext"><p>Foo</p></span> +<span id="LC7" class="line" lang="plaintext"><div></span> +<span id="LC8" class="line" lang="plaintext">bar</span> +<span id="LC9" class="line" lang="plaintext"></div></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="2376:1-2378:7" dir="auto">However, a following blank line is needed, except at the end of +a document, and except for blocks of types 1--5, [above][HTML +block]:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="2380:1-2390:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext"><div></span> +<span id="LC2" class="line" lang="plaintext">bar</span> +<span id="LC3" class="line" lang="plaintext"></div></span> +<span id="LC4" class="line" lang="plaintext">*foo*</span> +<span id="LC5" class="line" lang="plaintext">.</span> +<span id="LC6" class="line" lang="plaintext"><div></span> +<span id="LC7" class="line" lang="plaintext">bar</span> +<span id="LC8" class="line" lang="plaintext"></div></span> +<span id="LC9" class="line" lang="plaintext">*foo*</span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="2393:1-2393:51" dir="auto">HTML blocks of type 7 cannot interrupt a paragraph:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="2395:1-2403:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">Foo</span> +<span id="LC2" class="line" lang="plaintext"><a href="bar"></span> +<span id="LC3" class="line" lang="plaintext">baz</span> +<span id="LC4" class="line" lang="plaintext">.</span> +<span id="LC5" class="line" lang="plaintext"><p>Foo</span> +<span id="LC6" class="line" lang="plaintext"><a href="bar"></span> +<span id="LC7" class="line" lang="plaintext">baz</p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="2406:1-2407:26" dir="auto">This rule differs from John Gruber's original Markdown syntax +specification, which says:</p> +<blockquote data-sourcepos="2409:1-2412:51" dir="auto"> +<p data-sourcepos="2409:3-2412:51">The only restrictions are that block-level HTML elements — +e.g. <code><div></code>, <code><table></code>, <code><pre></code>, <code><p></code>, etc. — must be separated from +surrounding content by blank lines, and the start and end tags of the +block should not be indented with tabs or spaces.</p> +</blockquote> +<p data-sourcepos="2414:1-2415:5" dir="auto">In some ways Gruber's rule is more restrictive than the one given +here:</p> +<ul data-sourcepos="2417:1-2421:0" dir="auto"> +<li data-sourcepos="2417:1-2417:61">It requires that an HTML block be preceded by a blank line.</li> +<li data-sourcepos="2418:1-2418:49">It does not allow the start tag to be indented.</li> +<li data-sourcepos="2419:1-2421:0">It requires a matching end tag, which it also does not allow to +be indented.</li> +</ul> +<p data-sourcepos="2422:1-2423:34" dir="auto">Most Markdown implementations (including some of Gruber's own) do not +respect all of these restrictions.</p> +<p data-sourcepos="2425:1-2432:61" dir="auto">There is one respect, however, in which Gruber's rule is more liberal +than the one given here, since it allows blank lines to occur inside +an HTML block. There are two reasons for disallowing them here. +First, it removes the need to parse balanced tags, which is +expensive and can require backtracking from the end of the document +if no matching end tag is found. Second, it provides a very simple +and flexible way of including Markdown content inside HTML tags: +simply separate the Markdown from the HTML using blank lines:</p> +<p data-sourcepos="2434:1-2434:8" dir="auto">Compare:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="2436:1-2446:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext"><div></span> +<span id="LC2" class="line" lang="plaintext"></span> +<span id="LC3" class="line" lang="plaintext">*Emphasized* text.</span> +<span id="LC4" class="line" lang="plaintext"></span> +<span id="LC5" class="line" lang="plaintext"></div></span> +<span id="LC6" class="line" lang="plaintext">.</span> +<span id="LC7" class="line" lang="plaintext"><div></span> +<span id="LC8" class="line" lang="plaintext"><p><em>Emphasized</em> text.</p></span> +<span id="LC9" class="line" lang="plaintext"></div></span></code></pre> +<copy-code></copy-code> +</div> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="2449:1-2457:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext"><div></span> +<span id="LC2" class="line" lang="plaintext">*Emphasized* text.</span> +<span id="LC3" class="line" lang="plaintext"></div></span> +<span id="LC4" class="line" lang="plaintext">.</span> +<span id="LC5" class="line" lang="plaintext"><div></span> +<span id="LC6" class="line" lang="plaintext">*Emphasized* text.</span> +<span id="LC7" class="line" lang="plaintext"></div></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="2460:1-2464:22" dir="auto">Some Markdown implementations have adopted a convention of +interpreting content inside tags as text if the open tag has +the attribute <code>markdown=1</code>. The rule given above seems a simpler and +more elegant way of achieving the same expressive power, which is also +much simpler to parse.</p> +<p data-sourcepos="2466:1-2469:59" dir="auto">The main potential drawback is that one can no longer paste HTML +blocks into Markdown documents with 100% reliability. However, +<em>in most cases</em> this will work fine, because the blank lines in +HTML are usually followed by HTML block tags. For example:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="2471:1-2491:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext"><table></span> +<span id="LC2" class="line" lang="plaintext"></span> +<span id="LC3" class="line" lang="plaintext"><tr></span> +<span id="LC4" class="line" lang="plaintext"></span> +<span id="LC5" class="line" lang="plaintext"><td></span> +<span id="LC6" class="line" lang="plaintext">Hi</span> +<span id="LC7" class="line" lang="plaintext"></td></span> +<span id="LC8" class="line" lang="plaintext"></span> +<span id="LC9" class="line" lang="plaintext"></tr></span> +<span id="LC10" class="line" lang="plaintext"></span> +<span id="LC11" class="line" lang="plaintext"></table></span> +<span id="LC12" class="line" lang="plaintext">.</span> +<span id="LC13" class="line" lang="plaintext"><table></span> +<span id="LC14" class="line" lang="plaintext"><tr></span> +<span id="LC15" class="line" lang="plaintext"><td></span> +<span id="LC16" class="line" lang="plaintext">Hi</span> +<span id="LC17" class="line" lang="plaintext"></td></span> +<span id="LC18" class="line" lang="plaintext"></tr></span> +<span id="LC19" class="line" lang="plaintext"></table></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="2494:1-2496:23" dir="auto">There are problems, however, if the inner tags are indented +<em>and</em> separated by spaces, as then they will be interpreted as +an indented code block:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="2498:1-2519:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext"><table></span> +<span id="LC2" class="line" lang="plaintext"></span> +<span id="LC3" class="line" lang="plaintext"> <tr></span> +<span id="LC4" class="line" lang="plaintext"></span> +<span id="LC5" class="line" lang="plaintext"> <td></span> +<span id="LC6" class="line" lang="plaintext"> Hi</span> +<span id="LC7" class="line" lang="plaintext"> </td></span> +<span id="LC8" class="line" lang="plaintext"></span> +<span id="LC9" class="line" lang="plaintext"> </tr></span> +<span id="LC10" class="line" lang="plaintext"></span> +<span id="LC11" class="line" lang="plaintext"></table></span> +<span id="LC12" class="line" lang="plaintext">.</span> +<span id="LC13" class="line" lang="plaintext"><table></span> +<span id="LC14" class="line" lang="plaintext"> <tr></span> +<span id="LC15" class="line" lang="plaintext"><pre><code>&lt;td&gt;</span> +<span id="LC16" class="line" lang="plaintext"> Hi</span> +<span id="LC17" class="line" lang="plaintext">&lt;/td&gt;</span> +<span id="LC18" class="line" lang="plaintext"></code></pre></span> +<span id="LC19" class="line" lang="plaintext"> </tr></span> +<span id="LC20" class="line" lang="plaintext"></table></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="2522:1-2525:26" dir="auto">Fortunately, blank lines are usually not necessary and can be +deleted. The exception is inside <code><pre></code> tags, but as described +[above][HTML blocks], raw HTML blocks starting with <code><pre></code> +<em>can</em> contain blank lines.</p> +<h2 data-sourcepos="2527:1-2527:29" dir="auto"> +<a id="user-content-link-reference-definitions" class="anchor" href="#link-reference-definitions" aria-hidden="true"></a>Link reference definitions</h2> +<p data-sourcepos="2529:1-2537:61" dir="auto">A <a href="@">link reference definition</a> +consists of a [link label], indented up to three spaces, followed +by a colon (<code>:</code>), optional [whitespace] (including up to one +[line ending]), a [link destination], +optional [whitespace] (including up to one +[line ending]), and an optional [link +title], which if it is present must be separated +from the [link destination] by [whitespace]. +No further [non-whitespace characters] may occur on the line.</p> +<p data-sourcepos="2539:1-2544:5" dir="auto">A [link reference definition] +does not correspond to a structural element of a document. Instead, it +defines a label which can be used in [reference links] +and reference-style [images] elsewhere in the document. [Link +reference definitions] can come either before or after the links that use +them.</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="2546:1-2552:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">[foo]: /url "title"</span> +<span id="LC2" class="line" lang="plaintext"></span> +<span id="LC3" class="line" lang="plaintext">[foo]</span> +<span id="LC4" class="line" lang="plaintext">.</span> +<span id="LC5" class="line" lang="plaintext"><p><a href="/url" title="title">foo</a></p></span></code></pre> +<copy-code></copy-code> +</div> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="2555:1-2563:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext"> [foo]: </span> +<span id="LC2" class="line" lang="plaintext"> /url </span> +<span id="LC3" class="line" lang="plaintext"> 'the title' </span> +<span id="LC4" class="line" lang="plaintext"></span> +<span id="LC5" class="line" lang="plaintext">[foo]</span> +<span id="LC6" class="line" lang="plaintext">.</span> +<span id="LC7" class="line" lang="plaintext"><p><a href="/url" title="the title">foo</a></p></span></code></pre> +<copy-code></copy-code> +</div> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="2566:1-2572:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">[Foo*bar\]]:my_(url) 'title (with parens)'</span> +<span id="LC2" class="line" lang="plaintext"></span> +<span id="LC3" class="line" lang="plaintext">[Foo*bar\]]</span> +<span id="LC4" class="line" lang="plaintext">.</span> +<span id="LC5" class="line" lang="plaintext"><p><a href="my_(url)" title="title (with parens)">Foo*bar]</a></p></span></code></pre> +<copy-code></copy-code> +</div> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="2575:1-2583:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">[Foo bar]:</span> +<span id="LC2" class="line" lang="plaintext"><my url></span> +<span id="LC3" class="line" lang="plaintext">'title'</span> +<span id="LC4" class="line" lang="plaintext"></span> +<span id="LC5" class="line" lang="plaintext">[Foo bar]</span> +<span id="LC6" class="line" lang="plaintext">.</span> +<span id="LC7" class="line" lang="plaintext"><p><a href="my%20url" title="title">Foo bar</a></p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="2586:1-2586:41" dir="auto">The title may extend over multiple lines:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="2588:1-2602:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">[foo]: /url '</span> +<span id="LC2" class="line" lang="plaintext">title</span> +<span id="LC3" class="line" lang="plaintext">line1</span> +<span id="LC4" class="line" lang="plaintext">line2</span> +<span id="LC5" class="line" lang="plaintext">'</span> +<span id="LC6" class="line" lang="plaintext"></span> +<span id="LC7" class="line" lang="plaintext">[foo]</span> +<span id="LC8" class="line" lang="plaintext">.</span> +<span id="LC9" class="line" lang="plaintext"><p><a href="/url" title="</span> +<span id="LC10" class="line" lang="plaintext">title</span> +<span id="LC11" class="line" lang="plaintext">line1</span> +<span id="LC12" class="line" lang="plaintext">line2</span> +<span id="LC13" class="line" lang="plaintext">">foo</a></p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="2605:1-2605:43" dir="auto">However, it may not contain a [blank line]:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="2607:1-2617:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">[foo]: /url 'title</span> +<span id="LC2" class="line" lang="plaintext"></span> +<span id="LC3" class="line" lang="plaintext">with blank line'</span> +<span id="LC4" class="line" lang="plaintext"></span> +<span id="LC5" class="line" lang="plaintext">[foo]</span> +<span id="LC6" class="line" lang="plaintext">.</span> +<span id="LC7" class="line" lang="plaintext"><p>[foo]: /url 'title</p></span> +<span id="LC8" class="line" lang="plaintext"><p>with blank line'</p></span> +<span id="LC9" class="line" lang="plaintext"><p>[foo]</p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="2620:1-2620:25" dir="auto">The title may be omitted:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="2622:1-2629:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">[foo]:</span> +<span id="LC2" class="line" lang="plaintext">/url</span> +<span id="LC3" class="line" lang="plaintext"></span> +<span id="LC4" class="line" lang="plaintext">[foo]</span> +<span id="LC5" class="line" lang="plaintext">.</span> +<span id="LC6" class="line" lang="plaintext"><p><a href="/url">foo</a></p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="2632:1-2632:40" dir="auto">The link destination may not be omitted:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="2634:1-2641:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">[foo]:</span> +<span id="LC2" class="line" lang="plaintext"></span> +<span id="LC3" class="line" lang="plaintext">[foo]</span> +<span id="LC4" class="line" lang="plaintext">.</span> +<span id="LC5" class="line" lang="plaintext"><p>[foo]:</p></span> +<span id="LC6" class="line" lang="plaintext"><p>[foo]</p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="2643:2-2644:16" dir="auto">However, an empty link destination may be specified using +angle brackets:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="2646:1-2652:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">[foo]: <></span> +<span id="LC2" class="line" lang="plaintext"></span> +<span id="LC3" class="line" lang="plaintext">[foo]</span> +<span id="LC4" class="line" lang="plaintext">.</span> +<span id="LC5" class="line" lang="plaintext"><p><a href="">foo</a></p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="2654:1-2655:11" dir="auto">The title must be separated from the link destination by +whitespace:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="2657:1-2664:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">[foo]: <bar>(baz)</span> +<span id="LC2" class="line" lang="plaintext"></span> +<span id="LC3" class="line" lang="plaintext">[foo]</span> +<span id="LC4" class="line" lang="plaintext">.</span> +<span id="LC5" class="line" lang="plaintext"><p>[foo]: <bar>(baz)</p></span> +<span id="LC6" class="line" lang="plaintext"><p>[foo]</p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="2667:1-2668:24" dir="auto">Both title and destination can contain backslash escapes +and literal backslashes:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="2670:1-2676:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">[foo]: /url\bar\*baz "foo\"bar\baz"</span> +<span id="LC2" class="line" lang="plaintext"></span> +<span id="LC3" class="line" lang="plaintext">[foo]</span> +<span id="LC4" class="line" lang="plaintext">.</span> +<span id="LC5" class="line" lang="plaintext"><p><a href="/url%5Cbar*baz" title="foo&quot;bar\baz">foo</a></p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="2679:1-2679:52" dir="auto">A link can come before its corresponding definition:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="2681:1-2687:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">[foo]</span> +<span id="LC2" class="line" lang="plaintext"></span> +<span id="LC3" class="line" lang="plaintext">[foo]: url</span> +<span id="LC4" class="line" lang="plaintext">.</span> +<span id="LC5" class="line" lang="plaintext"><p><a href="url">foo</a></p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="2690:1-2691:11" dir="auto">If there are several matching definitions, the first one takes +precedence:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="2693:1-2700:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">[foo]</span> +<span id="LC2" class="line" lang="plaintext"></span> +<span id="LC3" class="line" lang="plaintext">[foo]: first</span> +<span id="LC4" class="line" lang="plaintext">[foo]: second</span> +<span id="LC5" class="line" lang="plaintext">.</span> +<span id="LC6" class="line" lang="plaintext"><p><a href="first">foo</a></p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="2703:1-2704:33" dir="auto">As noted in the section on [Links], matching of labels is +case-insensitive (see [matches]).</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="2706:1-2712:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">[FOO]: /url</span> +<span id="LC2" class="line" lang="plaintext"></span> +<span id="LC3" class="line" lang="plaintext">[Foo]</span> +<span id="LC4" class="line" lang="plaintext">.</span> +<span id="LC5" class="line" lang="plaintext"><p><a href="/url">Foo</a></p></span></code></pre> +<copy-code></copy-code> +</div> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="2715:1-2721:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">[ΑΓΩ]: /φου</span> +<span id="LC2" class="line" lang="plaintext"></span> +<span id="LC3" class="line" lang="plaintext">[αγω]</span> +<span id="LC4" class="line" lang="plaintext">.</span> +<span id="LC5" class="line" lang="plaintext"><p><a href="/%CF%86%CE%BF%CF%85">αγω</a></p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="2724:1-2725:39" dir="auto">Here is a link reference definition with no corresponding link. +It contributes nothing to the document.</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="2727:1-2730:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">[foo]: /url</span> +<span id="LC2" class="line" lang="plaintext">.</span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="2733:1-2733:20" dir="auto">Here is another one:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="2735:1-2742:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">[</span> +<span id="LC2" class="line" lang="plaintext">foo</span> +<span id="LC3" class="line" lang="plaintext">]: /url</span> +<span id="LC4" class="line" lang="plaintext">bar</span> +<span id="LC5" class="line" lang="plaintext">.</span> +<span id="LC6" class="line" lang="plaintext"><p>bar</p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="2745:1-2746:44" dir="auto">This is not a link reference definition, because there are +[non-whitespace characters] after the title:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="2748:1-2752:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">[foo]: /url "title" ok</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p>[foo]: /url &quot;title&quot; ok</p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="2755:1-2755:57" dir="auto">This is a link reference definition, but it has no title:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="2757:1-2762:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">[foo]: /url</span> +<span id="LC2" class="line" lang="plaintext">"title" ok</span> +<span id="LC3" class="line" lang="plaintext">.</span> +<span id="LC4" class="line" lang="plaintext"><p>&quot;title&quot; ok</p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="2765:1-2766:12" dir="auto">This is not a link reference definition, because it is indented +four spaces:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="2768:1-2776:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext"> [foo]: /url "title"</span> +<span id="LC2" class="line" lang="plaintext"></span> +<span id="LC3" class="line" lang="plaintext">[foo]</span> +<span id="LC4" class="line" lang="plaintext">.</span> +<span id="LC5" class="line" lang="plaintext"><pre><code>[foo]: /url &quot;title&quot;</span> +<span id="LC6" class="line" lang="plaintext"></code></pre></span> +<span id="LC7" class="line" lang="plaintext"><p>[foo]</p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="2779:1-2780:13" dir="auto">This is not a link reference definition, because it occurs inside +a code block:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="2782:1-2792:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">```</span> +<span id="LC2" class="line" lang="plaintext">[foo]: /url</span> +<span id="LC3" class="line" lang="plaintext">```</span> +<span id="LC4" class="line" lang="plaintext"></span> +<span id="LC5" class="line" lang="plaintext">[foo]</span> +<span id="LC6" class="line" lang="plaintext">.</span> +<span id="LC7" class="line" lang="plaintext"><pre><code>[foo]: /url</span> +<span id="LC8" class="line" lang="plaintext"></code></pre></span> +<span id="LC9" class="line" lang="plaintext"><p>[foo]</p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="2795:1-2795:59" dir="auto">A [link reference definition] cannot interrupt a paragraph.</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="2797:1-2806:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">Foo</span> +<span id="LC2" class="line" lang="plaintext">[bar]: /baz</span> +<span id="LC3" class="line" lang="plaintext"></span> +<span id="LC4" class="line" lang="plaintext">[bar]</span> +<span id="LC5" class="line" lang="plaintext">.</span> +<span id="LC6" class="line" lang="plaintext"><p>Foo</span> +<span id="LC7" class="line" lang="plaintext">[bar]: /baz</p></span> +<span id="LC8" class="line" lang="plaintext"><p>[bar]</p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="2809:1-2810:65" dir="auto">However, it can directly follow other block elements, such as headings +and thematic breaks, and it need not be followed by a blank line.</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="2812:1-2821:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext"># [Foo]</span> +<span id="LC2" class="line" lang="plaintext">[foo]: /url</span> +<span id="LC3" class="line" lang="plaintext">> bar</span> +<span id="LC4" class="line" lang="plaintext">.</span> +<span id="LC5" class="line" lang="plaintext"><h1><a href="/url">Foo</a></h1></span> +<span id="LC6" class="line" lang="plaintext"><blockquote></span> +<span id="LC7" class="line" lang="plaintext"><p>bar</p></span> +<span id="LC8" class="line" lang="plaintext"></blockquote></span></code></pre> +<copy-code></copy-code> +</div> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="2823:1-2831:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">[foo]: /url</span> +<span id="LC2" class="line" lang="plaintext">bar</span> +<span id="LC3" class="line" lang="plaintext">===</span> +<span id="LC4" class="line" lang="plaintext">[foo]</span> +<span id="LC5" class="line" lang="plaintext">.</span> +<span id="LC6" class="line" lang="plaintext"><h1>bar</h1></span> +<span id="LC7" class="line" lang="plaintext"><p><a href="/url">foo</a></p></span></code></pre> +<copy-code></copy-code> +</div> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="2833:1-2840:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">[foo]: /url</span> +<span id="LC2" class="line" lang="plaintext">===</span> +<span id="LC3" class="line" lang="plaintext">[foo]</span> +<span id="LC4" class="line" lang="plaintext">.</span> +<span id="LC5" class="line" lang="plaintext"><p>===</span> +<span id="LC6" class="line" lang="plaintext"><a href="/url">foo</a></p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="2843:1-2844:61" dir="auto">Several [link reference definitions] +can occur one after another, without intervening blank lines.</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="2846:1-2859:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">[foo]: /foo-url "foo"</span> +<span id="LC2" class="line" lang="plaintext">[bar]: /bar-url</span> +<span id="LC3" class="line" lang="plaintext"> "bar"</span> +<span id="LC4" class="line" lang="plaintext">[baz]: /baz-url</span> +<span id="LC5" class="line" lang="plaintext"></span> +<span id="LC6" class="line" lang="plaintext">[foo],</span> +<span id="LC7" class="line" lang="plaintext">[bar],</span> +<span id="LC8" class="line" lang="plaintext">[baz]</span> +<span id="LC9" class="line" lang="plaintext">.</span> +<span id="LC10" class="line" lang="plaintext"><p><a href="/foo-url" title="foo">foo</a>,</span> +<span id="LC11" class="line" lang="plaintext"><a href="/bar-url" title="bar">bar</a>,</span> +<span id="LC12" class="line" lang="plaintext"><a href="/baz-url">baz</a></p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="2862:1-2865:12" dir="auto">[Link reference definitions] can occur +inside block containers, like lists and block quotations. They +affect the entire document, not just the container in which they +are defined:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="2867:1-2875:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">[foo]</span> +<span id="LC2" class="line" lang="plaintext"></span> +<span id="LC3" class="line" lang="plaintext">> [foo]: /url</span> +<span id="LC4" class="line" lang="plaintext">.</span> +<span id="LC5" class="line" lang="plaintext"><p><a href="/url">foo</a></p></span> +<span id="LC6" class="line" lang="plaintext"><blockquote></span> +<span id="LC7" class="line" lang="plaintext"></blockquote></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="2878:1-2882:19" dir="auto">Whether something is a [link reference definition] is +independent of whether the link reference it defines is +used in the document. Thus, for example, the following +document contains just a link reference definition, and +no visible content:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="2884:1-2887:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">[foo]: /url</span> +<span id="LC2" class="line" lang="plaintext">.</span></code></pre> +<copy-code></copy-code> +</div> +<h2 data-sourcepos="2890:1-2890:13" dir="auto"> +<a id="user-content-paragraphs" class="anchor" href="#paragraphs" aria-hidden="true"></a>Paragraphs</h2> +<p data-sourcepos="2892:1-2897:13" dir="auto">A sequence of non-blank lines that cannot be interpreted as other +kinds of blocks forms a <a href="@">paragraph</a>. +The contents of the paragraph are the result of parsing the +paragraph's raw content as inlines. The paragraph's raw content +is formed by concatenating the lines and removing initial and final +[whitespace].</p> +<p data-sourcepos="2899:1-2899:37" dir="auto">A simple example with two paragraphs:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="2901:1-2908:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">aaa</span> +<span id="LC2" class="line" lang="plaintext"></span> +<span id="LC3" class="line" lang="plaintext">bbb</span> +<span id="LC4" class="line" lang="plaintext">.</span> +<span id="LC5" class="line" lang="plaintext"><p>aaa</p></span> +<span id="LC6" class="line" lang="plaintext"><p>bbb</p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="2911:1-2911:58" dir="auto">Paragraphs can contain multiple lines, but no blank lines:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="2913:1-2924:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">aaa</span> +<span id="LC2" class="line" lang="plaintext">bbb</span> +<span id="LC3" class="line" lang="plaintext"></span> +<span id="LC4" class="line" lang="plaintext">ccc</span> +<span id="LC5" class="line" lang="plaintext">ddd</span> +<span id="LC6" class="line" lang="plaintext">.</span> +<span id="LC7" class="line" lang="plaintext"><p>aaa</span> +<span id="LC8" class="line" lang="plaintext">bbb</p></span> +<span id="LC9" class="line" lang="plaintext"><p>ccc</span> +<span id="LC10" class="line" lang="plaintext">ddd</p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="2927:1-2927:54" dir="auto">Multiple blank lines between paragraph have no effect:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="2929:1-2937:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">aaa</span> +<span id="LC2" class="line" lang="plaintext"></span> +<span id="LC3" class="line" lang="plaintext"></span> +<span id="LC4" class="line" lang="plaintext">bbb</span> +<span id="LC5" class="line" lang="plaintext">.</span> +<span id="LC6" class="line" lang="plaintext"><p>aaa</p></span> +<span id="LC7" class="line" lang="plaintext"><p>bbb</p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="2940:1-2940:27" dir="auto">Leading spaces are skipped:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="2942:1-2948:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext"> aaa</span> +<span id="LC2" class="line" lang="plaintext"> bbb</span> +<span id="LC3" class="line" lang="plaintext">.</span> +<span id="LC4" class="line" lang="plaintext"><p>aaa</span> +<span id="LC5" class="line" lang="plaintext">bbb</p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="2951:1-2952:40" dir="auto">Lines after the first may be indented any amount, since indented +code blocks cannot interrupt paragraphs.</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="2954:1-2962:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">aaa</span> +<span id="LC2" class="line" lang="plaintext"> bbb</span> +<span id="LC3" class="line" lang="plaintext"> ccc</span> +<span id="LC4" class="line" lang="plaintext">.</span> +<span id="LC5" class="line" lang="plaintext"><p>aaa</span> +<span id="LC6" class="line" lang="plaintext">bbb</span> +<span id="LC7" class="line" lang="plaintext">ccc</p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="2965:1-2966:44" dir="auto">However, the first line may be indented at most three spaces, +or an indented code block will be triggered:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="2968:1-2974:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext"> aaa</span> +<span id="LC2" class="line" lang="plaintext">bbb</span> +<span id="LC3" class="line" lang="plaintext">.</span> +<span id="LC4" class="line" lang="plaintext"><p>aaa</span> +<span id="LC5" class="line" lang="plaintext">bbb</p></span></code></pre> +<copy-code></copy-code> +</div> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="2977:1-2984:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext"> aaa</span> +<span id="LC2" class="line" lang="plaintext">bbb</span> +<span id="LC3" class="line" lang="plaintext">.</span> +<span id="LC4" class="line" lang="plaintext"><pre><code>aaa</span> +<span id="LC5" class="line" lang="plaintext"></code></pre></span> +<span id="LC6" class="line" lang="plaintext"><p>bbb</p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="2987:1-2989:7" dir="auto">Final spaces are stripped before inline parsing, so a paragraph +that ends with two or more spaces will not end with a [hard line +break]:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="2991:1-2997:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">aaa </span> +<span id="LC2" class="line" lang="plaintext">bbb </span> +<span id="LC3" class="line" lang="plaintext">.</span> +<span id="LC4" class="line" lang="plaintext"><p>aaa<br /></span> +<span id="LC5" class="line" lang="plaintext">bbb</p></span></code></pre> +<copy-code></copy-code> +</div> +<h2 data-sourcepos="3000:1-3000:14" dir="auto"> +<a id="user-content-blank-lines" class="anchor" href="#blank-lines" aria-hidden="true"></a>Blank lines</h2> +<p data-sourcepos="3002:1-3004:22" dir="auto">[Blank lines] between block-level elements are ignored, +except for the role they play in determining whether a [list] +is [tight] or [loose].</p> +<p data-sourcepos="3006:1-3006:70" dir="auto">Blank lines at the beginning and end of the document are also ignored.</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="3008:1-3020:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext"> </span> +<span id="LC2" class="line" lang="plaintext"></span> +<span id="LC3" class="line" lang="plaintext">aaa</span> +<span id="LC4" class="line" lang="plaintext"> </span> +<span id="LC5" class="line" lang="plaintext"></span> +<span id="LC6" class="line" lang="plaintext"># aaa</span> +<span id="LC7" class="line" lang="plaintext"></span> +<span id="LC8" class="line" lang="plaintext"> </span> +<span id="LC9" class="line" lang="plaintext">.</span> +<span id="LC10" class="line" lang="plaintext"><p>aaa</p></span> +<span id="LC11" class="line" lang="plaintext"><h1>aaa</h1></span></code></pre> +<copy-code></copy-code> +</div> +<div> +<h2 data-sourcepos="3024:1-3024:21"> +<a id="user-content-tables-extension" class="anchor" href="#tables-extension" aria-hidden="true"></a>Tables (extension)</h2> +<p data-sourcepos="3026:1-3027:10">GFM enables the <code>table</code> extension, where an additional leaf block type is +available.</p> +<p data-sourcepos="3029:1-3031:23">A <a href="@">table</a> is an arrangement of data with rows and columns, consisting of a +single header row, a [delimiter row] separating the header from the data, and +zero or more data rows.</p> +<p data-sourcepos="3033:1-3037:23">Each row consists of cells containing arbitrary text, in which [inlines] are +parsed, separated by pipes (<code>|</code>). A leading and trailing pipe is also +recommended for clarity of reading, and if there's otherwise parsing ambiguity. +Spaces between pipes and cell content are trimmed. Block-level elements cannot +be inserted in a table.</p> +<p data-sourcepos="3039:1-3041:40">The <a href="@">delimiter row</a> consists of cells whose only content are hyphens (<code>-</code>), +and optionally, a leading or trailing colon (<code>:</code>), or both, to indicate left, +right, or center alignment respectively.</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="3043:1-3062:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">| foo | bar |</span> +<span id="LC2" class="line" lang="plaintext">| --- | --- |</span> +<span id="LC3" class="line" lang="plaintext">| baz | bim |</span> +<span id="LC4" class="line" lang="plaintext">.</span> +<span id="LC5" class="line" lang="plaintext"><table></span> +<span id="LC6" class="line" lang="plaintext"><thead></span> +<span id="LC7" class="line" lang="plaintext"><tr></span> +<span id="LC8" class="line" lang="plaintext"><th>foo</th></span> +<span id="LC9" class="line" lang="plaintext"><th>bar</th></span> +<span id="LC10" class="line" lang="plaintext"></tr></span> +<span id="LC11" class="line" lang="plaintext"></thead></span> +<span id="LC12" class="line" lang="plaintext"><tbody></span> +<span id="LC13" class="line" lang="plaintext"><tr></span> +<span id="LC14" class="line" lang="plaintext"><td>baz</td></span> +<span id="LC15" class="line" lang="plaintext"><td>bim</td></span> +<span id="LC16" class="line" lang="plaintext"></tr></span> +<span id="LC17" class="line" lang="plaintext"></tbody></span> +<span id="LC18" class="line" lang="plaintext"></table></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="3064:1-3065:74">Cells in one column don't need to match length, though it's easier to read if +they are. Likewise, use of leading and trailing pipes may be inconsistent:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="3067:1-3086:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">| abc | defghi |</span> +<span id="LC2" class="line" lang="plaintext">:-: | -----------:</span> +<span id="LC3" class="line" lang="plaintext">bar | baz</span> +<span id="LC4" class="line" lang="plaintext">.</span> +<span id="LC5" class="line" lang="plaintext"><table></span> +<span id="LC6" class="line" lang="plaintext"><thead></span> +<span id="LC7" class="line" lang="plaintext"><tr></span> +<span id="LC8" class="line" lang="plaintext"><th align="center">abc</th></span> +<span id="LC9" class="line" lang="plaintext"><th align="right">defghi</th></span> +<span id="LC10" class="line" lang="plaintext"></tr></span> +<span id="LC11" class="line" lang="plaintext"></thead></span> +<span id="LC12" class="line" lang="plaintext"><tbody></span> +<span id="LC13" class="line" lang="plaintext"><tr></span> +<span id="LC14" class="line" lang="plaintext"><td align="center">bar</td></span> +<span id="LC15" class="line" lang="plaintext"><td align="right">baz</td></span> +<span id="LC16" class="line" lang="plaintext"></tr></span> +<span id="LC17" class="line" lang="plaintext"></tbody></span> +<span id="LC18" class="line" lang="plaintext"></table></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="3088:1-3089:13">Include a pipe in a cell's content by escaping it, including inside other +inline spans:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="3091:1-3112:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">| f\|oo |</span> +<span id="LC2" class="line" lang="plaintext">| ------ |</span> +<span id="LC3" class="line" lang="plaintext">| b `\|` az |</span> +<span id="LC4" class="line" lang="plaintext">| b **\|** im |</span> +<span id="LC5" class="line" lang="plaintext">.</span> +<span id="LC6" class="line" lang="plaintext"><table></span> +<span id="LC7" class="line" lang="plaintext"><thead></span> +<span id="LC8" class="line" lang="plaintext"><tr></span> +<span id="LC9" class="line" lang="plaintext"><th>f|oo</th></span> +<span id="LC10" class="line" lang="plaintext"></tr></span> +<span id="LC11" class="line" lang="plaintext"></thead></span> +<span id="LC12" class="line" lang="plaintext"><tbody></span> +<span id="LC13" class="line" lang="plaintext"><tr></span> +<span id="LC14" class="line" lang="plaintext"><td>b <code>|</code> az</td></span> +<span id="LC15" class="line" lang="plaintext"></tr></span> +<span id="LC16" class="line" lang="plaintext"><tr></span> +<span id="LC17" class="line" lang="plaintext"><td>b <strong>|</strong> im</td></span> +<span id="LC18" class="line" lang="plaintext"></tr></span> +<span id="LC19" class="line" lang="plaintext"></tbody></span> +<span id="LC20" class="line" lang="plaintext"></table></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="3114:1-3115:22">The table is broken at the first empty line, or beginning of another +block-level structure:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="3117:1-3140:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">| abc | def |</span> +<span id="LC2" class="line" lang="plaintext">| --- | --- |</span> +<span id="LC3" class="line" lang="plaintext">| bar | baz |</span> +<span id="LC4" class="line" lang="plaintext">> bar</span> +<span id="LC5" class="line" lang="plaintext">.</span> +<span id="LC6" class="line" lang="plaintext"><table></span> +<span id="LC7" class="line" lang="plaintext"><thead></span> +<span id="LC8" class="line" lang="plaintext"><tr></span> +<span id="LC9" class="line" lang="plaintext"><th>abc</th></span> +<span id="LC10" class="line" lang="plaintext"><th>def</th></span> +<span id="LC11" class="line" lang="plaintext"></tr></span> +<span id="LC12" class="line" lang="plaintext"></thead></span> +<span id="LC13" class="line" lang="plaintext"><tbody></span> +<span id="LC14" class="line" lang="plaintext"><tr></span> +<span id="LC15" class="line" lang="plaintext"><td>bar</td></span> +<span id="LC16" class="line" lang="plaintext"><td>baz</td></span> +<span id="LC17" class="line" lang="plaintext"></tr></span> +<span id="LC18" class="line" lang="plaintext"></tbody></span> +<span id="LC19" class="line" lang="plaintext"></table></span> +<span id="LC20" class="line" lang="plaintext"><blockquote></span> +<span id="LC21" class="line" lang="plaintext"><p>bar</p></span> +<span id="LC22" class="line" lang="plaintext"></blockquote></span></code></pre> +<copy-code></copy-code> +</div> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="3142:1-3169:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">| abc | def |</span> +<span id="LC2" class="line" lang="plaintext">| --- | --- |</span> +<span id="LC3" class="line" lang="plaintext">| bar | baz |</span> +<span id="LC4" class="line" lang="plaintext">bar</span> +<span id="LC5" class="line" lang="plaintext"></span> +<span id="LC6" class="line" lang="plaintext">bar</span> +<span id="LC7" class="line" lang="plaintext">.</span> +<span id="LC8" class="line" lang="plaintext"><table></span> +<span id="LC9" class="line" lang="plaintext"><thead></span> +<span id="LC10" class="line" lang="plaintext"><tr></span> +<span id="LC11" class="line" lang="plaintext"><th>abc</th></span> +<span id="LC12" class="line" lang="plaintext"><th>def</th></span> +<span id="LC13" class="line" lang="plaintext"></tr></span> +<span id="LC14" class="line" lang="plaintext"></thead></span> +<span id="LC15" class="line" lang="plaintext"><tbody></span> +<span id="LC16" class="line" lang="plaintext"><tr></span> +<span id="LC17" class="line" lang="plaintext"><td>bar</td></span> +<span id="LC18" class="line" lang="plaintext"><td>baz</td></span> +<span id="LC19" class="line" lang="plaintext"></tr></span> +<span id="LC20" class="line" lang="plaintext"><tr></span> +<span id="LC21" class="line" lang="plaintext"><td>bar</td></span> +<span id="LC22" class="line" lang="plaintext"><td></td></span> +<span id="LC23" class="line" lang="plaintext"></tr></span> +<span id="LC24" class="line" lang="plaintext"></tbody></span> +<span id="LC25" class="line" lang="plaintext"></table></span> +<span id="LC26" class="line" lang="plaintext"><p>bar</p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="3171:1-3172:31">The header row must match the [delimiter row] in the number of cells. If not, +a table will not be recognized:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="3174:1-3182:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">| abc | def |</span> +<span id="LC2" class="line" lang="plaintext">| --- |</span> +<span id="LC3" class="line" lang="plaintext">| bar |</span> +<span id="LC4" class="line" lang="plaintext">.</span> +<span id="LC5" class="line" lang="plaintext"><p>| abc | def |</span> +<span id="LC6" class="line" lang="plaintext">| --- |</span> +<span id="LC7" class="line" lang="plaintext">| bar |</p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="3184:1-3186:65">The remainder of the table's rows may vary in the number of cells. If there +are a number of cells fewer than the number of cells in the header row, empty +cells are inserted. If there are greater, the excess is ignored:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="3188:1-3212:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">| abc | def |</span> +<span id="LC2" class="line" lang="plaintext">| --- | --- |</span> +<span id="LC3" class="line" lang="plaintext">| bar |</span> +<span id="LC4" class="line" lang="plaintext">| bar | baz | boo |</span> +<span id="LC5" class="line" lang="plaintext">.</span> +<span id="LC6" class="line" lang="plaintext"><table></span> +<span id="LC7" class="line" lang="plaintext"><thead></span> +<span id="LC8" class="line" lang="plaintext"><tr></span> +<span id="LC9" class="line" lang="plaintext"><th>abc</th></span> +<span id="LC10" class="line" lang="plaintext"><th>def</th></span> +<span id="LC11" class="line" lang="plaintext"></tr></span> +<span id="LC12" class="line" lang="plaintext"></thead></span> +<span id="LC13" class="line" lang="plaintext"><tbody></span> +<span id="LC14" class="line" lang="plaintext"><tr></span> +<span id="LC15" class="line" lang="plaintext"><td>bar</td></span> +<span id="LC16" class="line" lang="plaintext"><td></td></span> +<span id="LC17" class="line" lang="plaintext"></tr></span> +<span id="LC18" class="line" lang="plaintext"><tr></span> +<span id="LC19" class="line" lang="plaintext"><td>bar</td></span> +<span id="LC20" class="line" lang="plaintext"><td>baz</td></span> +<span id="LC21" class="line" lang="plaintext"></tr></span> +<span id="LC22" class="line" lang="plaintext"></tbody></span> +<span id="LC23" class="line" lang="plaintext"></table></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="3214:1-3214:75">If there are no rows in the body, no <code><tbody></code> is generated in HTML output:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="3216:1-3228:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">| abc | def |</span> +<span id="LC2" class="line" lang="plaintext">| --- | --- |</span> +<span id="LC3" class="line" lang="plaintext">.</span> +<span id="LC4" class="line" lang="plaintext"><table></span> +<span id="LC5" class="line" lang="plaintext"><thead></span> +<span id="LC6" class="line" lang="plaintext"><tr></span> +<span id="LC7" class="line" lang="plaintext"><th>abc</th></span> +<span id="LC8" class="line" lang="plaintext"><th>def</th></span> +<span id="LC9" class="line" lang="plaintext"></tr></span> +<span id="LC10" class="line" lang="plaintext"></thead></span> +<span id="LC11" class="line" lang="plaintext"></table></span></code></pre> +<copy-code></copy-code> +</div> +</div> +<h1 data-sourcepos="3232:1-3232:18" dir="auto"> +<a id="user-content-container-blocks" class="anchor" href="#container-blocks" aria-hidden="true"></a>Container blocks</h1> +<p data-sourcepos="3234:1-3237:45" dir="auto">A <a href="#container-blocks">container block</a> is a block that has other +blocks as its contents. There are two basic kinds of container blocks: +[block quotes] and [list items]. +[Lists] are meta-containers for [list items].</p> +<p data-sourcepos="3239:1-3240:26" dir="auto">We define the syntax for container blocks recursively. The general +form of the definition is:</p> +<blockquote data-sourcepos="3242:1-3244:35" dir="auto"> +<p data-sourcepos="3242:3-3244:35">If X is a sequence of blocks, then the result of +transforming X in such-and-such a way is a container of type Y +with these blocks as its content.</p> +</blockquote> +<p data-sourcepos="3246:1-3250:52" dir="auto">So, we explain what counts as a block quote or list item by explaining +how these can be <em>generated</em> from their contents. This should suffice +to define the syntax, although it does not give a recipe for <em>parsing</em> +these constructions. (A recipe is provided below in the section entitled +<a href="#appendix-a-parsing-strategy">A parsing strategy</a>.)</p> +<h2 data-sourcepos="3252:1-3252:15" dir="auto"> +<a id="user-content-block-quotes" class="anchor" href="#block-quotes" aria-hidden="true"></a>Block quotes</h2> +<p data-sourcepos="3254:1-3256:78" dir="auto">A <a href="@">block quote marker</a> +consists of 0-3 spaces of initial indent, plus (a) the character <code>></code> together +with a following space, or (b) a single character <code>></code> not followed by a space.</p> +<p data-sourcepos="3258:1-3258:42" dir="auto">The following rules define [block quotes]:</p> +<ol data-sourcepos="3260:1-3277:0" dir="auto"> +<li data-sourcepos="3260:1-3264:0"> +<p data-sourcepos="3260:5-3263:54"><strong>Basic case.</strong> If a string of lines <em>Ls</em> constitute a sequence +of blocks <em>Bs</em>, then the result of prepending a [block quote +marker] to the beginning of each line in <em>Ls</em> +is a <a href="#block-quotes">block quote</a> containing <em>Bs</em>.</p> +</li> +<li data-sourcepos="3265:1-3274:0"> +<p data-sourcepos="3265:5-3273:48"><strong>Laziness.</strong> If a string of lines <em>Ls</em> constitute a <a href="#block-quotes">block +quote</a> with contents <em>Bs</em>, then the result of deleting +the initial [block quote marker] from one or +more lines in which the next [non-whitespace character] after the [block +quote marker] is [paragraph continuation +text] is a block quote with <em>Bs</em> as its content. +<a href="@">Paragraph continuation text</a> is text +that will be parsed as part of the content of a paragraph, but does +not occur at the beginning of the paragraph.</p> +</li> +<li data-sourcepos="3275:1-3277:0"> +<p data-sourcepos="3275:5-3276:65"><strong>Consecutiveness.</strong> A document cannot contain two [block +quotes] in a row unless there is a [blank line] between them.</p> +</li> +</ol> +<p data-sourcepos="3278:1-3278:54" dir="auto">Nothing else counts as a <a href="#block-quotes">block quote</a>.</p> +<p data-sourcepos="3280:1-3280:25" dir="auto">Here is a simple example:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="3282:1-3292:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">> # Foo</span> +<span id="LC2" class="line" lang="plaintext">> bar</span> +<span id="LC3" class="line" lang="plaintext">> baz</span> +<span id="LC4" class="line" lang="plaintext">.</span> +<span id="LC5" class="line" lang="plaintext"><blockquote></span> +<span id="LC6" class="line" lang="plaintext"><h1>Foo</h1></span> +<span id="LC7" class="line" lang="plaintext"><p>bar</span> +<span id="LC8" class="line" lang="plaintext">baz</p></span> +<span id="LC9" class="line" lang="plaintext"></blockquote></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="3295:1-3295:51" dir="auto">The spaces after the <code>></code> characters can be omitted:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="3297:1-3307:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">># Foo</span> +<span id="LC2" class="line" lang="plaintext">>bar</span> +<span id="LC3" class="line" lang="plaintext">> baz</span> +<span id="LC4" class="line" lang="plaintext">.</span> +<span id="LC5" class="line" lang="plaintext"><blockquote></span> +<span id="LC6" class="line" lang="plaintext"><h1>Foo</h1></span> +<span id="LC7" class="line" lang="plaintext"><p>bar</span> +<span id="LC8" class="line" lang="plaintext">baz</p></span> +<span id="LC9" class="line" lang="plaintext"></blockquote></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="3310:1-3310:46" dir="auto">The <code>></code> characters can be indented 1-3 spaces:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="3312:1-3322:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext"> > # Foo</span> +<span id="LC2" class="line" lang="plaintext"> > bar</span> +<span id="LC3" class="line" lang="plaintext"> > baz</span> +<span id="LC4" class="line" lang="plaintext">.</span> +<span id="LC5" class="line" lang="plaintext"><blockquote></span> +<span id="LC6" class="line" lang="plaintext"><h1>Foo</h1></span> +<span id="LC7" class="line" lang="plaintext"><p>bar</span> +<span id="LC8" class="line" lang="plaintext">baz</p></span> +<span id="LC9" class="line" lang="plaintext"></blockquote></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="3325:1-3325:34" dir="auto">Four spaces gives us a code block:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="3327:1-3336:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext"> > # Foo</span> +<span id="LC2" class="line" lang="plaintext"> > bar</span> +<span id="LC3" class="line" lang="plaintext"> > baz</span> +<span id="LC4" class="line" lang="plaintext">.</span> +<span id="LC5" class="line" lang="plaintext"><pre><code>&gt; # Foo</span> +<span id="LC6" class="line" lang="plaintext">&gt; bar</span> +<span id="LC7" class="line" lang="plaintext">&gt; baz</span> +<span id="LC8" class="line" lang="plaintext"></code></pre></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="3339:1-3340:30" dir="auto">The Laziness clause allows us to omit the <code>></code> before +[paragraph continuation text]:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="3342:1-3352:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">> # Foo</span> +<span id="LC2" class="line" lang="plaintext">> bar</span> +<span id="LC3" class="line" lang="plaintext">baz</span> +<span id="LC4" class="line" lang="plaintext">.</span> +<span id="LC5" class="line" lang="plaintext"><blockquote></span> +<span id="LC6" class="line" lang="plaintext"><h1>Foo</h1></span> +<span id="LC7" class="line" lang="plaintext"><p>bar</span> +<span id="LC8" class="line" lang="plaintext">baz</p></span> +<span id="LC9" class="line" lang="plaintext"></blockquote></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="3355:1-3356:19" dir="auto">A block quote can contain some lazy and some non-lazy +continuation lines:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="3358:1-3368:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">> bar</span> +<span id="LC2" class="line" lang="plaintext">baz</span> +<span id="LC3" class="line" lang="plaintext">> foo</span> +<span id="LC4" class="line" lang="plaintext">.</span> +<span id="LC5" class="line" lang="plaintext"><blockquote></span> +<span id="LC6" class="line" lang="plaintext"><p>bar</span> +<span id="LC7" class="line" lang="plaintext">baz</span> +<span id="LC8" class="line" lang="plaintext">foo</p></span> +<span id="LC9" class="line" lang="plaintext"></blockquote></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="3371:1-3373:61" dir="auto">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> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="3375:1-3378:3" class="code highlight js-syntax-highlight language-markdown" lang="markdown" v-pre="true"><code><span id="LC1" class="line" lang="markdown"><span class="gt">> foo</span></span> +<span id="LC2" class="line" lang="markdown"><span class="gt">> ---</span></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="3380:1-3380:29" dir="auto">without changing the meaning:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="3382:1-3390:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">> foo</span> +<span id="LC2" class="line" lang="plaintext">---</span> +<span id="LC3" class="line" lang="plaintext">.</span> +<span id="LC4" class="line" lang="plaintext"><blockquote></span> +<span id="LC5" class="line" lang="plaintext"><p>foo</p></span> +<span id="LC6" class="line" lang="plaintext"></blockquote></span> +<span id="LC7" class="line" lang="plaintext"><hr /></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="3393:1-3393:52" dir="auto">Similarly, if we omit the <code>> </code> in the second line of</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="3395:1-3398:3" class="code highlight js-syntax-highlight language-markdown" lang="markdown" v-pre="true"><code><span id="LC1" class="line" lang="markdown"><span class="gt">> - foo</span></span> +<span id="LC2" class="line" lang="markdown"><span class="gt">> - bar</span></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="3400:1-3400:47" dir="auto">then the block quote ends after the first line:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="3402:1-3414:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">> - foo</span> +<span id="LC2" class="line" lang="plaintext">- bar</span> +<span id="LC3" class="line" lang="plaintext">.</span> +<span id="LC4" class="line" lang="plaintext"><blockquote></span> +<span id="LC5" class="line" lang="plaintext"><ul></span> +<span id="LC6" class="line" lang="plaintext"><li>foo</li></span> +<span id="LC7" class="line" lang="plaintext"></ul></span> +<span id="LC8" class="line" lang="plaintext"></blockquote></span> +<span id="LC9" class="line" lang="plaintext"><ul></span> +<span id="LC10" class="line" lang="plaintext"><li>bar</li></span> +<span id="LC11" class="line" lang="plaintext"></ul></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="3417:1-3418:53" dir="auto">For the same reason, we can't omit the <code>> </code> in front of +subsequent lines of an indented or fenced code block:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="3420:1-3430:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">> foo</span> +<span id="LC2" class="line" lang="plaintext"> bar</span> +<span id="LC3" class="line" lang="plaintext">.</span> +<span id="LC4" class="line" lang="plaintext"><blockquote></span> +<span id="LC5" class="line" lang="plaintext"><pre><code>foo</span> +<span id="LC6" class="line" lang="plaintext"></code></pre></span> +<span id="LC7" class="line" lang="plaintext"></blockquote></span> +<span id="LC8" class="line" lang="plaintext"><pre><code>bar</span> +<span id="LC9" class="line" lang="plaintext"></code></pre></span></code></pre> +<copy-code></copy-code> +</div> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="3433:1-3443:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">> ```</span> +<span id="LC2" class="line" lang="plaintext">foo</span> +<span id="LC3" class="line" lang="plaintext">```</span> +<span id="LC4" class="line" lang="plaintext">.</span> +<span id="LC5" class="line" lang="plaintext"><blockquote></span> +<span id="LC6" class="line" lang="plaintext"><pre><code></code></pre></span> +<span id="LC7" class="line" lang="plaintext"></blockquote></span> +<span id="LC8" class="line" lang="plaintext"><p>foo</p></span> +<span id="LC9" class="line" lang="plaintext"><pre><code></code></pre></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="3446:1-3447:19" dir="auto">Note that in the following case, we have a [lazy +continuation line]:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="3449:1-3457:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">> foo</span> +<span id="LC2" class="line" lang="plaintext"> - bar</span> +<span id="LC3" class="line" lang="plaintext">.</span> +<span id="LC4" class="line" lang="plaintext"><blockquote></span> +<span id="LC5" class="line" lang="plaintext"><p>foo</span> +<span id="LC6" class="line" lang="plaintext">- bar</p></span> +<span id="LC7" class="line" lang="plaintext"></blockquote></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="3460:1-3460:24" dir="auto">To see why, note that in</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="3462:1-3465:3" class="code highlight js-syntax-highlight language-markdown" lang="markdown" v-pre="true"><code><span id="LC1" class="line" lang="markdown"><span class="gt">> foo</span></span> +<span id="LC2" class="line" lang="markdown"><span class="gt">> - bar</span></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="3467:1-3469:61" dir="auto">the <code>- bar</code> is indented too far to start a list, and can't +be an indented code block because indented code blocks cannot +interrupt paragraphs, so it is [paragraph continuation text].</p> +<p data-sourcepos="3471:1-3471:27" dir="auto">A block quote can be empty:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="3473:1-3478:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">></span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><blockquote></span> +<span id="LC4" class="line" lang="plaintext"></blockquote></span></code></pre> +<copy-code></copy-code> +</div> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="3481:1-3488:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">></span> +<span id="LC2" class="line" lang="plaintext">> </span> +<span id="LC3" class="line" lang="plaintext">> </span> +<span id="LC4" class="line" lang="plaintext">.</span> +<span id="LC5" class="line" lang="plaintext"><blockquote></span> +<span id="LC6" class="line" lang="plaintext"></blockquote></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="3491:1-3491:52" dir="auto">A block quote can have initial or final blank lines:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="3493:1-3501:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">></span> +<span id="LC2" class="line" lang="plaintext">> foo</span> +<span id="LC3" class="line" lang="plaintext">> </span> +<span id="LC4" class="line" lang="plaintext">.</span> +<span id="LC5" class="line" lang="plaintext"><blockquote></span> +<span id="LC6" class="line" lang="plaintext"><p>foo</p></span> +<span id="LC7" class="line" lang="plaintext"></blockquote></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="3504:1-3504:43" dir="auto">A blank line always separates block quotes:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="3506:1-3517:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">> foo</span> +<span id="LC2" class="line" lang="plaintext"></span> +<span id="LC3" class="line" lang="plaintext">> bar</span> +<span id="LC4" class="line" lang="plaintext">.</span> +<span id="LC5" class="line" lang="plaintext"><blockquote></span> +<span id="LC6" class="line" lang="plaintext"><p>foo</p></span> +<span id="LC7" class="line" lang="plaintext"></blockquote></span> +<span id="LC8" class="line" lang="plaintext"><blockquote></span> +<span id="LC9" class="line" lang="plaintext"><p>bar</p></span> +<span id="LC10" class="line" lang="plaintext"></blockquote></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="3520:1-3523:44" dir="auto">(Most current Markdown implementations, including John Gruber's +original <code>Markdown.pl</code>, will parse this example as a single block quote +with two paragraphs. But it seems better to allow the author to decide +whether two block quotes or one are wanted.)</p> +<p data-sourcepos="3525:1-3526:28" dir="auto">Consecutiveness means that if we put these block quotes together, +we get a single block quote:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="3528:1-3536:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">> foo</span> +<span id="LC2" class="line" lang="plaintext">> bar</span> +<span id="LC3" class="line" lang="plaintext">.</span> +<span id="LC4" class="line" lang="plaintext"><blockquote></span> +<span id="LC5" class="line" lang="plaintext"><p>foo</span> +<span id="LC6" class="line" lang="plaintext">bar</p></span> +<span id="LC7" class="line" lang="plaintext"></blockquote></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="3539:1-3539:46" dir="auto">To get a block quote with two paragraphs, use:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="3541:1-3550:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">> foo</span> +<span id="LC2" class="line" lang="plaintext">></span> +<span id="LC3" class="line" lang="plaintext">> bar</span> +<span id="LC4" class="line" lang="plaintext">.</span> +<span id="LC5" class="line" lang="plaintext"><blockquote></span> +<span id="LC6" class="line" lang="plaintext"><p>foo</p></span> +<span id="LC7" class="line" lang="plaintext"><p>bar</p></span> +<span id="LC8" class="line" lang="plaintext"></blockquote></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="3553:1-3553:38" dir="auto">Block quotes can interrupt paragraphs:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="3555:1-3563:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">foo</span> +<span id="LC2" class="line" lang="plaintext">> bar</span> +<span id="LC3" class="line" lang="plaintext">.</span> +<span id="LC4" class="line" lang="plaintext"><p>foo</p></span> +<span id="LC5" class="line" lang="plaintext"><blockquote></span> +<span id="LC6" class="line" lang="plaintext"><p>bar</p></span> +<span id="LC7" class="line" lang="plaintext"></blockquote></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="3566:1-3567:7" dir="auto">In general, blank lines are not needed before or after block +quotes:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="3569:1-3581:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">> aaa</span> +<span id="LC2" class="line" lang="plaintext">***</span> +<span id="LC3" class="line" lang="plaintext">> bbb</span> +<span id="LC4" class="line" lang="plaintext">.</span> +<span id="LC5" class="line" lang="plaintext"><blockquote></span> +<span id="LC6" class="line" lang="plaintext"><p>aaa</p></span> +<span id="LC7" class="line" lang="plaintext"></blockquote></span> +<span id="LC8" class="line" lang="plaintext"><hr /></span> +<span id="LC9" class="line" lang="plaintext"><blockquote></span> +<span id="LC10" class="line" lang="plaintext"><p>bbb</p></span> +<span id="LC11" class="line" lang="plaintext"></blockquote></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="3584:1-3585:40" dir="auto">However, because of laziness, a blank line is needed between +a block quote and a following paragraph:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="3587:1-3595:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">> bar</span> +<span id="LC2" class="line" lang="plaintext">baz</span> +<span id="LC3" class="line" lang="plaintext">.</span> +<span id="LC4" class="line" lang="plaintext"><blockquote></span> +<span id="LC5" class="line" lang="plaintext"><p>bar</span> +<span id="LC6" class="line" lang="plaintext">baz</p></span> +<span id="LC7" class="line" lang="plaintext"></blockquote></span></code></pre> +<copy-code></copy-code> +</div> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="3598:1-3607:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">> bar</span> +<span id="LC2" class="line" lang="plaintext"></span> +<span id="LC3" class="line" lang="plaintext">baz</span> +<span id="LC4" class="line" lang="plaintext">.</span> +<span id="LC5" class="line" lang="plaintext"><blockquote></span> +<span id="LC6" class="line" lang="plaintext"><p>bar</p></span> +<span id="LC7" class="line" lang="plaintext"></blockquote></span> +<span id="LC8" class="line" lang="plaintext"><p>baz</p></span></code></pre> +<copy-code></copy-code> +</div> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="3610:1-3619:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">> bar</span> +<span id="LC2" class="line" lang="plaintext">></span> +<span id="LC3" class="line" lang="plaintext">baz</span> +<span id="LC4" class="line" lang="plaintext">.</span> +<span id="LC5" class="line" lang="plaintext"><blockquote></span> +<span id="LC6" class="line" lang="plaintext"><p>bar</p></span> +<span id="LC7" class="line" lang="plaintext"></blockquote></span> +<span id="LC8" class="line" lang="plaintext"><p>baz</p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="3622:1-3624:19" dir="auto">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> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="3626:1-3638:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">> > > foo</span> +<span id="LC2" class="line" lang="plaintext">bar</span> +<span id="LC3" class="line" lang="plaintext">.</span> +<span id="LC4" class="line" lang="plaintext"><blockquote></span> +<span id="LC5" class="line" lang="plaintext"><blockquote></span> +<span id="LC6" class="line" lang="plaintext"><blockquote></span> +<span id="LC7" class="line" lang="plaintext"><p>foo</span> +<span id="LC8" class="line" lang="plaintext">bar</p></span> +<span id="LC9" class="line" lang="plaintext"></blockquote></span> +<span id="LC10" class="line" lang="plaintext"></blockquote></span> +<span id="LC11" class="line" lang="plaintext"></blockquote></span></code></pre> +<copy-code></copy-code> +</div> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="3641:1-3655:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">>>> foo</span> +<span id="LC2" class="line" lang="plaintext">> bar</span> +<span id="LC3" class="line" lang="plaintext">>>baz</span> +<span id="LC4" class="line" lang="plaintext">.</span> +<span id="LC5" class="line" lang="plaintext"><blockquote></span> +<span id="LC6" class="line" lang="plaintext"><blockquote></span> +<span id="LC7" class="line" lang="plaintext"><blockquote></span> +<span id="LC8" class="line" lang="plaintext"><p>foo</span> +<span id="LC9" class="line" lang="plaintext">bar</span> +<span id="LC10" class="line" lang="plaintext">baz</p></span> +<span id="LC11" class="line" lang="plaintext"></blockquote></span> +<span id="LC12" class="line" lang="plaintext"></blockquote></span> +<span id="LC13" class="line" lang="plaintext"></blockquote></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="3658:1-3661:8" dir="auto">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 <em>five spaces</em> are needed after +the <code>></code>:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="3663:1-3675:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">> code</span> +<span id="LC2" class="line" lang="plaintext"></span> +<span id="LC3" class="line" lang="plaintext">> not code</span> +<span id="LC4" class="line" lang="plaintext">.</span> +<span id="LC5" class="line" lang="plaintext"><blockquote></span> +<span id="LC6" class="line" lang="plaintext"><pre><code>code</span> +<span id="LC7" class="line" lang="plaintext"></code></pre></span> +<span id="LC8" class="line" lang="plaintext"></blockquote></span> +<span id="LC9" class="line" lang="plaintext"><blockquote></span> +<span id="LC10" class="line" lang="plaintext"><p>not code</p></span> +<span id="LC11" class="line" lang="plaintext"></blockquote></span></code></pre> +<copy-code></copy-code> +</div> +<h2 data-sourcepos="3679:1-3679:13" dir="auto"> +<a id="user-content-list-items" class="anchor" href="#list-items" aria-hidden="true"></a>List items</h2> +<p data-sourcepos="3681:1-3682:49" dir="auto">A <a href="@">list marker</a> is a +[bullet list marker] or an [ordered list marker].</p> +<p data-sourcepos="3684:1-3685:32" dir="auto">A <a href="@">bullet list marker</a> +is a <code>-</code>, <code>+</code>, or <code>*</code> character.</p> +<p data-sourcepos="3687:1-3691:18" dir="auto">An <a href="@">ordered list marker</a> +is a sequence of 1--9 arabic digits (<code>0-9</code>), followed by either a +<code>.</code> character or a <code>)</code> character. (The reason for the length +limit is that with 10 digits we start seeing integer overflows +in some browsers.)</p> +<p data-sourcepos="3693:1-3693:40" dir="auto">The following rules define [list items]:</p> +<ol data-sourcepos="3695:1-3714:0" dir="auto"> +<li data-sourcepos="3695:1-3714:0"> +<p data-sourcepos="3695:5-3703:45"><strong>Basic case.</strong> If a sequence of lines <em>Ls</em> constitute a sequence of +blocks <em>Bs</em> starting with a [non-whitespace character], and <em>M</em> is a +list marker of width <em>W</em> followed by 1 ≤ <em>N</em> ≤ 4 spaces, then the result +of prepending <em>M</em> and the following spaces to the first line of +<em>Ls</em>, and indenting subsequent lines of <em>Ls</em> by <em>W + N</em> spaces, is a +list item with <em>Bs</em> as its contents. The type of the list item +(bullet or ordered) is determined by the type of its list marker. +If the list item is ordered, then it is also assigned a start +number, based on the ordered list marker.</p> +<p data-sourcepos="3705:5-3705:15">Exceptions:</p> +<ol data-sourcepos="3707:5-3714:0"> +<li data-sourcepos="3707:5-3711:57">When the first list item in a [list] interrupts +a paragraph---that is, when it starts on a line that would +otherwise count as [paragraph continuation text]---then (a) +the lines <em>Ls</em> must not begin with a blank line, and (b) if +the list item is ordered, the start number must be 1.</li> +<li data-sourcepos="3712:5-3714:0">If any line is a [thematic break][thematic breaks] then +that line is not a list item.</li> +</ol> +</li> +</ol> +<p data-sourcepos="3715:1-3715:34" dir="auto">For example, let <em>Ls</em> be the lines</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="3717:1-3732:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">A paragraph</span> +<span id="LC2" class="line" lang="plaintext">with two lines.</span> +<span id="LC3" class="line" lang="plaintext"></span> +<span id="LC4" class="line" lang="plaintext"> indented code</span> +<span id="LC5" class="line" lang="plaintext"></span> +<span id="LC6" class="line" lang="plaintext">> A block quote.</span> +<span id="LC7" class="line" lang="plaintext">.</span> +<span id="LC8" class="line" lang="plaintext"><p>A paragraph</span> +<span id="LC9" class="line" lang="plaintext">with two lines.</p></span> +<span id="LC10" class="line" lang="plaintext"><pre><code>indented code</span> +<span id="LC11" class="line" lang="plaintext"></code></pre></span> +<span id="LC12" class="line" lang="plaintext"><blockquote></span> +<span id="LC13" class="line" lang="plaintext"><p>A block quote.</p></span> +<span id="LC14" class="line" lang="plaintext"></blockquote></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="3735:1-3737:30" dir="auto">And let <em>M</em> be the marker <code>1.</code>, and <em>N</em> = 2. Then rule #1 says +that the following is an ordered list item with start number 1, +and the same contents as <em>Ls</em>:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="3739:1-3758:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">1. A paragraph</span> +<span id="LC2" class="line" lang="plaintext"> with two lines.</span> +<span id="LC3" class="line" lang="plaintext"></span> +<span id="LC4" class="line" lang="plaintext"> indented code</span> +<span id="LC5" class="line" lang="plaintext"></span> +<span id="LC6" class="line" lang="plaintext"> > A block quote.</span> +<span id="LC7" class="line" lang="plaintext">.</span> +<span id="LC8" class="line" lang="plaintext"><ol></span> +<span id="LC9" class="line" lang="plaintext"><li></span> +<span id="LC10" class="line" lang="plaintext"><p>A paragraph</span> +<span id="LC11" class="line" lang="plaintext">with two lines.</p></span> +<span id="LC12" class="line" lang="plaintext"><pre><code>indented code</span> +<span id="LC13" class="line" lang="plaintext"></code></pre></span> +<span id="LC14" class="line" lang="plaintext"><blockquote></span> +<span id="LC15" class="line" lang="plaintext"><p>A block quote.</p></span> +<span id="LC16" class="line" lang="plaintext"></blockquote></span> +<span id="LC17" class="line" lang="plaintext"></li></span> +<span id="LC18" class="line" lang="plaintext"></ol></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="3761:1-3767:5" dir="auto">The most important thing to notice is that the position of +the text after the list marker determines how much indentation +is needed in subsequent blocks in the list item. If the list +marker takes up two spaces, and there are three spaces between +the list marker and the next [non-whitespace character], then blocks +must be indented five spaces in order to fall under the list +item.</p> +<p data-sourcepos="3769:1-3770:24" dir="auto">Here are some examples showing how far content must be indented to be +put under the list item:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="3772:1-3781:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">- one</span> +<span id="LC2" class="line" lang="plaintext"></span> +<span id="LC3" class="line" lang="plaintext"> two</span> +<span id="LC4" class="line" lang="plaintext">.</span> +<span id="LC5" class="line" lang="plaintext"><ul></span> +<span id="LC6" class="line" lang="plaintext"><li>one</li></span> +<span id="LC7" class="line" lang="plaintext"></ul></span> +<span id="LC8" class="line" lang="plaintext"><p>two</p></span></code></pre> +<copy-code></copy-code> +</div> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="3784:1-3795:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">- one</span> +<span id="LC2" class="line" lang="plaintext"></span> +<span id="LC3" class="line" lang="plaintext"> two</span> +<span id="LC4" class="line" lang="plaintext">.</span> +<span id="LC5" class="line" lang="plaintext"><ul></span> +<span id="LC6" class="line" lang="plaintext"><li></span> +<span id="LC7" class="line" lang="plaintext"><p>one</p></span> +<span id="LC8" class="line" lang="plaintext"><p>two</p></span> +<span id="LC9" class="line" lang="plaintext"></li></span> +<span id="LC10" class="line" lang="plaintext"></ul></span></code></pre> +<copy-code></copy-code> +</div> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="3798:1-3808:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext"> - one</span> +<span id="LC2" class="line" lang="plaintext"></span> +<span id="LC3" class="line" lang="plaintext"> two</span> +<span id="LC4" class="line" lang="plaintext">.</span> +<span id="LC5" class="line" lang="plaintext"><ul></span> +<span id="LC6" class="line" lang="plaintext"><li>one</li></span> +<span id="LC7" class="line" lang="plaintext"></ul></span> +<span id="LC8" class="line" lang="plaintext"><pre><code> two</span> +<span id="LC9" class="line" lang="plaintext"></code></pre></span></code></pre> +<copy-code></copy-code> +</div> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="3811:1-3822:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext"> - one</span> +<span id="LC2" class="line" lang="plaintext"></span> +<span id="LC3" class="line" lang="plaintext"> two</span> +<span id="LC4" class="line" lang="plaintext">.</span> +<span id="LC5" class="line" lang="plaintext"><ul></span> +<span id="LC6" class="line" lang="plaintext"><li></span> +<span id="LC7" class="line" lang="plaintext"><p>one</p></span> +<span id="LC8" class="line" lang="plaintext"><p>two</p></span> +<span id="LC9" class="line" lang="plaintext"></li></span> +<span id="LC10" class="line" lang="plaintext"></ul></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="3825:1-3831:13" dir="auto">It is tempting to think of this in terms of columns: the continuation +blocks must be indented at least to the column of the first +[non-whitespace character] after the list marker. However, that is not quite right. +The spaces after the list marker determine how much relative indentation +is needed. Which column this indentation reaches will depend on +how the list item is embedded in other constructions, as shown by +this example:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="3833:1-3848:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext"> > > 1. one</span> +<span id="LC2" class="line" lang="plaintext">>></span> +<span id="LC3" class="line" lang="plaintext">>> two</span> +<span id="LC4" class="line" lang="plaintext">.</span> +<span id="LC5" class="line" lang="plaintext"><blockquote></span> +<span id="LC6" class="line" lang="plaintext"><blockquote></span> +<span id="LC7" class="line" lang="plaintext"><ol></span> +<span id="LC8" class="line" lang="plaintext"><li></span> +<span id="LC9" class="line" lang="plaintext"><p>one</p></span> +<span id="LC10" class="line" lang="plaintext"><p>two</p></span> +<span id="LC11" class="line" lang="plaintext"></li></span> +<span id="LC12" class="line" lang="plaintext"></ol></span> +<span id="LC13" class="line" lang="plaintext"></blockquote></span> +<span id="LC14" class="line" lang="plaintext"></blockquote></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="3851:1-3853:67" dir="auto">Here <code>two</code> occurs in the same column as the list marker <code>1.</code>, +but is actually contained in the list item, because there is +sufficient indentation after the last containing blockquote marker.</p> +<p data-sourcepos="3855:1-3858:38" dir="auto">The converse is also possible. In the following example, the word <code>two</code> +occurs far to the right of the initial text of the list item, <code>one</code>, but +it is not considered part of the list item, because it is not indented +far enough past the blockquote marker:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="3860:1-3873:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">>>- one</span> +<span id="LC2" class="line" lang="plaintext">>></span> +<span id="LC3" class="line" lang="plaintext"> > > two</span> +<span id="LC4" class="line" lang="plaintext">.</span> +<span id="LC5" class="line" lang="plaintext"><blockquote></span> +<span id="LC6" class="line" lang="plaintext"><blockquote></span> +<span id="LC7" class="line" lang="plaintext"><ul></span> +<span id="LC8" class="line" lang="plaintext"><li>one</li></span> +<span id="LC9" class="line" lang="plaintext"></ul></span> +<span id="LC10" class="line" lang="plaintext"><p>two</p></span> +<span id="LC11" class="line" lang="plaintext"></blockquote></span> +<span id="LC12" class="line" lang="plaintext"></blockquote></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="3876:1-3877:51" dir="auto">Note that at least one space is needed between the list marker and +any following content, so these are not list items:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="3879:1-3886:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">-one</span> +<span id="LC2" class="line" lang="plaintext"></span> +<span id="LC3" class="line" lang="plaintext">2.two</span> +<span id="LC4" class="line" lang="plaintext">.</span> +<span id="LC5" class="line" lang="plaintext"><p>-one</p></span> +<span id="LC6" class="line" lang="plaintext"><p>2.two</p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="3889:1-3890:15" dir="auto">A list item may contain blocks that are separated by more than +one blank line.</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="3892:1-3904:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">- foo</span> +<span id="LC2" class="line" lang="plaintext"></span> +<span id="LC3" class="line" lang="plaintext"></span> +<span id="LC4" class="line" lang="plaintext"> bar</span> +<span id="LC5" class="line" lang="plaintext">.</span> +<span id="LC6" class="line" lang="plaintext"><ul></span> +<span id="LC7" class="line" lang="plaintext"><li></span> +<span id="LC8" class="line" lang="plaintext"><p>foo</p></span> +<span id="LC9" class="line" lang="plaintext"><p>bar</p></span> +<span id="LC10" class="line" lang="plaintext"></li></span> +<span id="LC11" class="line" lang="plaintext"></ul></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="3907:1-3907:42" dir="auto">A list item may contain any kind of block:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="3909:1-3931:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">1. foo</span> +<span id="LC2" class="line" lang="plaintext"></span> +<span id="LC3" class="line" lang="plaintext"> ```</span> +<span id="LC4" class="line" lang="plaintext"> bar</span> +<span id="LC5" class="line" lang="plaintext"> ```</span> +<span id="LC6" class="line" lang="plaintext"></span> +<span id="LC7" class="line" lang="plaintext"> baz</span> +<span id="LC8" class="line" lang="plaintext"></span> +<span id="LC9" class="line" lang="plaintext"> > bam</span> +<span id="LC10" class="line" lang="plaintext">.</span> +<span id="LC11" class="line" lang="plaintext"><ol></span> +<span id="LC12" class="line" lang="plaintext"><li></span> +<span id="LC13" class="line" lang="plaintext"><p>foo</p></span> +<span id="LC14" class="line" lang="plaintext"><pre><code>bar</span> +<span id="LC15" class="line" lang="plaintext"></code></pre></span> +<span id="LC16" class="line" lang="plaintext"><p>baz</p></span> +<span id="LC17" class="line" lang="plaintext"><blockquote></span> +<span id="LC18" class="line" lang="plaintext"><p>bam</p></span> +<span id="LC19" class="line" lang="plaintext"></blockquote></span> +<span id="LC20" class="line" lang="plaintext"></li></span> +<span id="LC21" class="line" lang="plaintext"></ol></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="3934:1-3935:43" dir="auto">A list item that contains an indented code block will preserve +empty lines within the code block verbatim.</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="3937:1-3955:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">- Foo</span> +<span id="LC2" class="line" lang="plaintext"></span> +<span id="LC3" class="line" lang="plaintext"> bar</span> +<span id="LC4" class="line" lang="plaintext"></span> +<span id="LC5" class="line" lang="plaintext"></span> +<span id="LC6" class="line" lang="plaintext"> baz</span> +<span id="LC7" class="line" lang="plaintext">.</span> +<span id="LC8" class="line" lang="plaintext"><ul></span> +<span id="LC9" class="line" lang="plaintext"><li></span> +<span id="LC10" class="line" lang="plaintext"><p>Foo</p></span> +<span id="LC11" class="line" lang="plaintext"><pre><code>bar</span> +<span id="LC12" class="line" lang="plaintext"></span> +<span id="LC13" class="line" lang="plaintext"></span> +<span id="LC14" class="line" lang="plaintext">baz</span> +<span id="LC15" class="line" lang="plaintext"></code></pre></span> +<span id="LC16" class="line" lang="plaintext"></li></span> +<span id="LC17" class="line" lang="plaintext"></ul></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="3957:1-3957:65" dir="auto">Note that ordered list start numbers must be nine digits or less:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="3959:1-3965:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">123456789. ok</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><ol start="123456789"></span> +<span id="LC4" class="line" lang="plaintext"><li>ok</li></span> +<span id="LC5" class="line" lang="plaintext"></ol></span></code></pre> +<copy-code></copy-code> +</div> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="3968:1-3972:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">1234567890. not ok</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p>1234567890. not ok</p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="3975:1-3975:33" dir="auto">A start number may begin with 0s:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="3977:1-3983:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">0. ok</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><ol start="0"></span> +<span id="LC4" class="line" lang="plaintext"><li>ok</li></span> +<span id="LC5" class="line" lang="plaintext"></ol></span></code></pre> +<copy-code></copy-code> +</div> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="3986:1-3992:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">003. ok</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><ol start="3"></span> +<span id="LC4" class="line" lang="plaintext"><li>ok</li></span> +<span id="LC5" class="line" lang="plaintext"></ol></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="3995:1-3995:35" dir="auto">A start number may not be negative:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="3997:1-4001:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">-1. not ok</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p>-1. not ok</p></span></code></pre> +<copy-code></copy-code> +</div> +<ol start="2" data-sourcepos="4005:1-4015:0" dir="auto"> +<li data-sourcepos="4005:1-4015:0"> +<strong>Item starting with indented code.</strong> If a sequence of lines <em>Ls</em> +constitute a sequence of blocks <em>Bs</em> starting with an indented code +block, and <em>M</em> is a list marker of width <em>W</em> followed by +one space, then the result of prepending <em>M</em> and the following +space to the first line of <em>Ls</em>, and indenting subsequent lines of +<em>Ls</em> by <em>W + 1</em> spaces, is a list item with <em>Bs</em> as its contents. +If a line is empty, then it need not be indented. The type of the +list item (bullet or ordered) is determined by the type of its list +marker. If the list item is ordered, then it is also assigned a +start number, based on the ordered list marker.</li> +</ol> +<p data-sourcepos="4016:1-4018:39" dir="auto">An indented code block will have to be indented four spaces beyond +the edge of the region where text will be included in the list item. +In the following case that is 6 spaces:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="4020:1-4032:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">- foo</span> +<span id="LC2" class="line" lang="plaintext"></span> +<span id="LC3" class="line" lang="plaintext"> bar</span> +<span id="LC4" class="line" lang="plaintext">.</span> +<span id="LC5" class="line" lang="plaintext"><ul></span> +<span id="LC6" class="line" lang="plaintext"><li></span> +<span id="LC7" class="line" lang="plaintext"><p>foo</p></span> +<span id="LC8" class="line" lang="plaintext"><pre><code>bar</span> +<span id="LC9" class="line" lang="plaintext"></code></pre></span> +<span id="LC10" class="line" lang="plaintext"></li></span> +<span id="LC11" class="line" lang="plaintext"></ul></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="4035:1-4035:33" dir="auto">And in this case it is 11 spaces:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="4037:1-4049:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext"> 10. foo</span> +<span id="LC2" class="line" lang="plaintext"></span> +<span id="LC3" class="line" lang="plaintext"> bar</span> +<span id="LC4" class="line" lang="plaintext">.</span> +<span id="LC5" class="line" lang="plaintext"><ol start="10"></span> +<span id="LC6" class="line" lang="plaintext"><li></span> +<span id="LC7" class="line" lang="plaintext"><p>foo</p></span> +<span id="LC8" class="line" lang="plaintext"><pre><code>bar</span> +<span id="LC9" class="line" lang="plaintext"></code></pre></span> +<span id="LC10" class="line" lang="plaintext"></li></span> +<span id="LC11" class="line" lang="plaintext"></ol></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="4052:1-4054:12" dir="auto">If the <em>first</em> block in the list item is an indented code block, +then by rule #2, the contents must be indented <em>one</em> space after the +list marker:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="4056:1-4068:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext"> indented code</span> +<span id="LC2" class="line" lang="plaintext"></span> +<span id="LC3" class="line" lang="plaintext">paragraph</span> +<span id="LC4" class="line" lang="plaintext"></span> +<span id="LC5" class="line" lang="plaintext"> more code</span> +<span id="LC6" class="line" lang="plaintext">.</span> +<span id="LC7" class="line" lang="plaintext"><pre><code>indented code</span> +<span id="LC8" class="line" lang="plaintext"></code></pre></span> +<span id="LC9" class="line" lang="plaintext"><p>paragraph</p></span> +<span id="LC10" class="line" lang="plaintext"><pre><code>more code</span> +<span id="LC11" class="line" lang="plaintext"></code></pre></span></code></pre> +<copy-code></copy-code> +</div> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="4071:1-4087:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">1. indented code</span> +<span id="LC2" class="line" lang="plaintext"></span> +<span id="LC3" class="line" lang="plaintext"> paragraph</span> +<span id="LC4" class="line" lang="plaintext"></span> +<span id="LC5" class="line" lang="plaintext"> more code</span> +<span id="LC6" class="line" lang="plaintext">.</span> +<span id="LC7" class="line" lang="plaintext"><ol></span> +<span id="LC8" class="line" lang="plaintext"><li></span> +<span id="LC9" class="line" lang="plaintext"><pre><code>indented code</span> +<span id="LC10" class="line" lang="plaintext"></code></pre></span> +<span id="LC11" class="line" lang="plaintext"><p>paragraph</p></span> +<span id="LC12" class="line" lang="plaintext"><pre><code>more code</span> +<span id="LC13" class="line" lang="plaintext"></code></pre></span> +<span id="LC14" class="line" lang="plaintext"></li></span> +<span id="LC15" class="line" lang="plaintext"></ol></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="4090:1-4091:22" dir="auto">Note that an additional space indent is interpreted as space +inside the code block:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="4093:1-4109:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">1. indented code</span> +<span id="LC2" class="line" lang="plaintext"></span> +<span id="LC3" class="line" lang="plaintext"> paragraph</span> +<span id="LC4" class="line" lang="plaintext"></span> +<span id="LC5" class="line" lang="plaintext"> more code</span> +<span id="LC6" class="line" lang="plaintext">.</span> +<span id="LC7" class="line" lang="plaintext"><ol></span> +<span id="LC8" class="line" lang="plaintext"><li></span> +<span id="LC9" class="line" lang="plaintext"><pre><code> indented code</span> +<span id="LC10" class="line" lang="plaintext"></code></pre></span> +<span id="LC11" class="line" lang="plaintext"><p>paragraph</p></span> +<span id="LC12" class="line" lang="plaintext"><pre><code>more code</span> +<span id="LC13" class="line" lang="plaintext"></code></pre></span> +<span id="LC14" class="line" lang="plaintext"></li></span> +<span id="LC15" class="line" lang="plaintext"></ol></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="4112:1-4118:55" dir="auto">Note that rules #1 and #2 only apply to two cases: (a) cases +in which the lines to be included in a list item begin with a +[non-whitespace character], and (b) cases in which +they begin with an indented code +block. In a case like the following, where the first block begins with +a three-space indent, the rules do not allow us to form a list item by +indenting the whole thing and prepending a list marker:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="4120:1-4127:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext"> foo</span> +<span id="LC2" class="line" lang="plaintext"></span> +<span id="LC3" class="line" lang="plaintext">bar</span> +<span id="LC4" class="line" lang="plaintext">.</span> +<span id="LC5" class="line" lang="plaintext"><p>foo</p></span> +<span id="LC6" class="line" lang="plaintext"><p>bar</p></span></code></pre> +<copy-code></copy-code> +</div> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="4130:1-4139:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">- foo</span> +<span id="LC2" class="line" lang="plaintext"></span> +<span id="LC3" class="line" lang="plaintext"> bar</span> +<span id="LC4" class="line" lang="plaintext">.</span> +<span id="LC5" class="line" lang="plaintext"><ul></span> +<span id="LC6" class="line" lang="plaintext"><li>foo</li></span> +<span id="LC7" class="line" lang="plaintext"></ul></span> +<span id="LC8" class="line" lang="plaintext"><p>bar</p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="4142:1-4145:15" dir="auto">This is not a significant restriction, because when a block begins +with 1-3 spaces indent, the indentation can always be removed without +a change in interpretation, allowing rule #1 to be applied. So, in +the above case:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="4147:1-4158:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">- foo</span> +<span id="LC2" class="line" lang="plaintext"></span> +<span id="LC3" class="line" lang="plaintext"> bar</span> +<span id="LC4" class="line" lang="plaintext">.</span> +<span id="LC5" class="line" lang="plaintext"><ul></span> +<span id="LC6" class="line" lang="plaintext"><li></span> +<span id="LC7" class="line" lang="plaintext"><p>foo</p></span> +<span id="LC8" class="line" lang="plaintext"><p>bar</p></span> +<span id="LC9" class="line" lang="plaintext"></li></span> +<span id="LC10" class="line" lang="plaintext"></ul></span></code></pre> +<copy-code></copy-code> +</div> +<ol start="3" data-sourcepos="4161:1-4172:0" dir="auto"> +<li data-sourcepos="4161:1-4172:0"> +<strong>Item starting with a blank line.</strong> If a sequence of lines <em>Ls</em> +starting with a single [blank line] constitute a (possibly empty) +sequence of blocks <em>Bs</em>, not separated from each other by more than +one blank line, and <em>M</em> is a list marker of width <em>W</em>, +then the result of prepending <em>M</em> to the first line of <em>Ls</em>, and +indenting subsequent lines of <em>Ls</em> by <em>W + 1</em> spaces, is a list +item with <em>Bs</em> as its contents. +If a line is empty, then it need not be indented. The type of the +list item (bullet or ordered) is determined by the type of its list +marker. If the list item is ordered, then it is also assigned a +start number, based on the ordered list marker.</li> +</ol> +<p data-sourcepos="4173:1-4173:72" dir="auto">Here are some list items that start with a blank line but are not empty:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="4175:1-4196:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">-</span> +<span id="LC2" class="line" lang="plaintext"> foo</span> +<span id="LC3" class="line" lang="plaintext">-</span> +<span id="LC4" class="line" lang="plaintext"> ```</span> +<span id="LC5" class="line" lang="plaintext"> bar</span> +<span id="LC6" class="line" lang="plaintext"> ```</span> +<span id="LC7" class="line" lang="plaintext">-</span> +<span id="LC8" class="line" lang="plaintext"> baz</span> +<span id="LC9" class="line" lang="plaintext">.</span> +<span id="LC10" class="line" lang="plaintext"><ul></span> +<span id="LC11" class="line" lang="plaintext"><li>foo</li></span> +<span id="LC12" class="line" lang="plaintext"><li></span> +<span id="LC13" class="line" lang="plaintext"><pre><code>bar</span> +<span id="LC14" class="line" lang="plaintext"></code></pre></span> +<span id="LC15" class="line" lang="plaintext"></li></span> +<span id="LC16" class="line" lang="plaintext"><li></span> +<span id="LC17" class="line" lang="plaintext"><pre><code>baz</span> +<span id="LC18" class="line" lang="plaintext"></code></pre></span> +<span id="LC19" class="line" lang="plaintext"></li></span> +<span id="LC20" class="line" lang="plaintext"></ul></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="4198:1-4199:66" dir="auto">When the list item starts with a blank line, the number of spaces +following the list marker doesn't change the required indentation:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="4201:1-4208:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">- </span> +<span id="LC2" class="line" lang="plaintext"> foo</span> +<span id="LC3" class="line" lang="plaintext">.</span> +<span id="LC4" class="line" lang="plaintext"><ul></span> +<span id="LC5" class="line" lang="plaintext"><li>foo</li></span> +<span id="LC6" class="line" lang="plaintext"></ul></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="4211:1-4213:5" dir="auto">A list item can begin with at most one blank line. +In the following example, <code>foo</code> is not part of the list +item:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="4215:1-4224:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">-</span> +<span id="LC2" class="line" lang="plaintext"></span> +<span id="LC3" class="line" lang="plaintext"> foo</span> +<span id="LC4" class="line" lang="plaintext">.</span> +<span id="LC5" class="line" lang="plaintext"><ul></span> +<span id="LC6" class="line" lang="plaintext"><li></li></span> +<span id="LC7" class="line" lang="plaintext"></ul></span> +<span id="LC8" class="line" lang="plaintext"><p>foo</p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="4227:1-4227:34" dir="auto">Here is an empty bullet list item:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="4229:1-4239:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">- foo</span> +<span id="LC2" class="line" lang="plaintext">-</span> +<span id="LC3" class="line" lang="plaintext">- bar</span> +<span id="LC4" class="line" lang="plaintext">.</span> +<span id="LC5" class="line" lang="plaintext"><ul></span> +<span id="LC6" class="line" lang="plaintext"><li>foo</li></span> +<span id="LC7" class="line" lang="plaintext"><li></li></span> +<span id="LC8" class="line" lang="plaintext"><li>bar</li></span> +<span id="LC9" class="line" lang="plaintext"></ul></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="4242:1-4242:72" dir="auto">It does not matter whether there are spaces following the [list marker]:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="4244:1-4254:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">- foo</span> +<span id="LC2" class="line" lang="plaintext">- </span> +<span id="LC3" class="line" lang="plaintext">- bar</span> +<span id="LC4" class="line" lang="plaintext">.</span> +<span id="LC5" class="line" lang="plaintext"><ul></span> +<span id="LC6" class="line" lang="plaintext"><li>foo</li></span> +<span id="LC7" class="line" lang="plaintext"><li></li></span> +<span id="LC8" class="line" lang="plaintext"><li>bar</li></span> +<span id="LC9" class="line" lang="plaintext"></ul></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="4257:1-4257:35" dir="auto">Here is an empty ordered list item:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="4259:1-4269:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">1. foo</span> +<span id="LC2" class="line" lang="plaintext">2.</span> +<span id="LC3" class="line" lang="plaintext">3. bar</span> +<span id="LC4" class="line" lang="plaintext">.</span> +<span id="LC5" class="line" lang="plaintext"><ol></span> +<span id="LC6" class="line" lang="plaintext"><li>foo</li></span> +<span id="LC7" class="line" lang="plaintext"><li></li></span> +<span id="LC8" class="line" lang="plaintext"><li>bar</li></span> +<span id="LC9" class="line" lang="plaintext"></ol></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="4272:1-4272:48" dir="auto">A list may start or end with an empty list item:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="4274:1-4280:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">*</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><ul></span> +<span id="LC4" class="line" lang="plaintext"><li></li></span> +<span id="LC5" class="line" lang="plaintext"></ul></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="4282:1-4282:57" dir="auto">However, an empty list item cannot interrupt a paragraph:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="4284:1-4295:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">foo</span> +<span id="LC2" class="line" lang="plaintext">*</span> +<span id="LC3" class="line" lang="plaintext"></span> +<span id="LC4" class="line" lang="plaintext">foo</span> +<span id="LC5" class="line" lang="plaintext">1.</span> +<span id="LC6" class="line" lang="plaintext">.</span> +<span id="LC7" class="line" lang="plaintext"><p>foo</span> +<span id="LC8" class="line" lang="plaintext">*</p></span> +<span id="LC9" class="line" lang="plaintext"><p>foo</span> +<span id="LC10" class="line" lang="plaintext">1.</p></span></code></pre> +<copy-code></copy-code> +</div> +<ol start="4" data-sourcepos="4298:1-4303:0" dir="auto"> +<li data-sourcepos="4298:1-4303:0"> +<strong>Indentation.</strong> If a sequence of lines <em>Ls</em> constitutes a list item +according to rule #1, #2, or #3, then the result of indenting each line +of <em>Ls</em> by 1-3 spaces (the same for each line) also constitutes a +list item with the same contents and attributes. If a line is +empty, then it need not be indented.</li> +</ol> +<p data-sourcepos="4304:1-4304:19" dir="auto">Indented one space:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="4306:1-4325:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext"> 1. A paragraph</span> +<span id="LC2" class="line" lang="plaintext"> with two lines.</span> +<span id="LC3" class="line" lang="plaintext"></span> +<span id="LC4" class="line" lang="plaintext"> indented code</span> +<span id="LC5" class="line" lang="plaintext"></span> +<span id="LC6" class="line" lang="plaintext"> > A block quote.</span> +<span id="LC7" class="line" lang="plaintext">.</span> +<span id="LC8" class="line" lang="plaintext"><ol></span> +<span id="LC9" class="line" lang="plaintext"><li></span> +<span id="LC10" class="line" lang="plaintext"><p>A paragraph</span> +<span id="LC11" class="line" lang="plaintext">with two lines.</p></span> +<span id="LC12" class="line" lang="plaintext"><pre><code>indented code</span> +<span id="LC13" class="line" lang="plaintext"></code></pre></span> +<span id="LC14" class="line" lang="plaintext"><blockquote></span> +<span id="LC15" class="line" lang="plaintext"><p>A block quote.</p></span> +<span id="LC16" class="line" lang="plaintext"></blockquote></span> +<span id="LC17" class="line" lang="plaintext"></li></span> +<span id="LC18" class="line" lang="plaintext"></ol></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="4328:1-4328:20" dir="auto">Indented two spaces:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="4330:1-4349:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext"> 1. A paragraph</span> +<span id="LC2" class="line" lang="plaintext"> with two lines.</span> +<span id="LC3" class="line" lang="plaintext"></span> +<span id="LC4" class="line" lang="plaintext"> indented code</span> +<span id="LC5" class="line" lang="plaintext"></span> +<span id="LC6" class="line" lang="plaintext"> > A block quote.</span> +<span id="LC7" class="line" lang="plaintext">.</span> +<span id="LC8" class="line" lang="plaintext"><ol></span> +<span id="LC9" class="line" lang="plaintext"><li></span> +<span id="LC10" class="line" lang="plaintext"><p>A paragraph</span> +<span id="LC11" class="line" lang="plaintext">with two lines.</p></span> +<span id="LC12" class="line" lang="plaintext"><pre><code>indented code</span> +<span id="LC13" class="line" lang="plaintext"></code></pre></span> +<span id="LC14" class="line" lang="plaintext"><blockquote></span> +<span id="LC15" class="line" lang="plaintext"><p>A block quote.</p></span> +<span id="LC16" class="line" lang="plaintext"></blockquote></span> +<span id="LC17" class="line" lang="plaintext"></li></span> +<span id="LC18" class="line" lang="plaintext"></ol></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="4352:1-4352:22" dir="auto">Indented three spaces:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="4354:1-4373:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext"> 1. A paragraph</span> +<span id="LC2" class="line" lang="plaintext"> with two lines.</span> +<span id="LC3" class="line" lang="plaintext"></span> +<span id="LC4" class="line" lang="plaintext"> indented code</span> +<span id="LC5" class="line" lang="plaintext"></span> +<span id="LC6" class="line" lang="plaintext"> > A block quote.</span> +<span id="LC7" class="line" lang="plaintext">.</span> +<span id="LC8" class="line" lang="plaintext"><ol></span> +<span id="LC9" class="line" lang="plaintext"><li></span> +<span id="LC10" class="line" lang="plaintext"><p>A paragraph</span> +<span id="LC11" class="line" lang="plaintext">with two lines.</p></span> +<span id="LC12" class="line" lang="plaintext"><pre><code>indented code</span> +<span id="LC13" class="line" lang="plaintext"></code></pre></span> +<span id="LC14" class="line" lang="plaintext"><blockquote></span> +<span id="LC15" class="line" lang="plaintext"><p>A block quote.</p></span> +<span id="LC16" class="line" lang="plaintext"></blockquote></span> +<span id="LC17" class="line" lang="plaintext"></li></span> +<span id="LC18" class="line" lang="plaintext"></ol></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="4376:1-4376:38" dir="auto">Four spaces indent gives a code block:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="4378:1-4393:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext"> 1. A paragraph</span> +<span id="LC2" class="line" lang="plaintext"> with two lines.</span> +<span id="LC3" class="line" lang="plaintext"></span> +<span id="LC4" class="line" lang="plaintext"> indented code</span> +<span id="LC5" class="line" lang="plaintext"></span> +<span id="LC6" class="line" lang="plaintext"> > A block quote.</span> +<span id="LC7" class="line" lang="plaintext">.</span> +<span id="LC8" class="line" lang="plaintext"><pre><code>1. A paragraph</span> +<span id="LC9" class="line" lang="plaintext"> with two lines.</span> +<span id="LC10" class="line" lang="plaintext"></span> +<span id="LC11" class="line" lang="plaintext"> indented code</span> +<span id="LC12" class="line" lang="plaintext"></span> +<span id="LC13" class="line" lang="plaintext"> &gt; A block quote.</span> +<span id="LC14" class="line" lang="plaintext"></code></pre></span></code></pre> +<copy-code></copy-code> +</div> +<ol start="5" data-sourcepos="4397:1-4405:0" dir="auto"> +<li data-sourcepos="4397:1-4405:0"> +<strong>Laziness.</strong> If a string of lines <em>Ls</em> constitute a <a href="#list-items">list +item</a> with contents <em>Bs</em>, then the result of deleting +some or all of the indentation from one or more lines in which the +next [non-whitespace character] after the indentation is +[paragraph continuation text] is a +list item with the same contents and attributes. The unindented +lines are called +<a href="@">lazy continuation line</a>s.</li> +</ol> +<p data-sourcepos="4406:1-4406:50" dir="auto">Here is an example with [lazy continuation lines]:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="4408:1-4427:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext"> 1. A paragraph</span> +<span id="LC2" class="line" lang="plaintext">with two lines.</span> +<span id="LC3" class="line" lang="plaintext"></span> +<span id="LC4" class="line" lang="plaintext"> indented code</span> +<span id="LC5" class="line" lang="plaintext"></span> +<span id="LC6" class="line" lang="plaintext"> > A block quote.</span> +<span id="LC7" class="line" lang="plaintext">.</span> +<span id="LC8" class="line" lang="plaintext"><ol></span> +<span id="LC9" class="line" lang="plaintext"><li></span> +<span id="LC10" class="line" lang="plaintext"><p>A paragraph</span> +<span id="LC11" class="line" lang="plaintext">with two lines.</p></span> +<span id="LC12" class="line" lang="plaintext"><pre><code>indented code</span> +<span id="LC13" class="line" lang="plaintext"></code></pre></span> +<span id="LC14" class="line" lang="plaintext"><blockquote></span> +<span id="LC15" class="line" lang="plaintext"><p>A block quote.</p></span> +<span id="LC16" class="line" lang="plaintext"></blockquote></span> +<span id="LC17" class="line" lang="plaintext"></li></span> +<span id="LC18" class="line" lang="plaintext"></ol></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="4430:1-4430:37" dir="auto">Indentation can be partially deleted:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="4432:1-4440:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext"> 1. A paragraph</span> +<span id="LC2" class="line" lang="plaintext"> with two lines.</span> +<span id="LC3" class="line" lang="plaintext">.</span> +<span id="LC4" class="line" lang="plaintext"><ol></span> +<span id="LC5" class="line" lang="plaintext"><li>A paragraph</span> +<span id="LC6" class="line" lang="plaintext">with two lines.</li></span> +<span id="LC7" class="line" lang="plaintext"></ol></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="4443:1-4443:63" dir="auto">These examples show how laziness can work in nested structures:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="4445:1-4459:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">> 1. > Blockquote</span> +<span id="LC2" class="line" lang="plaintext">continued here.</span> +<span id="LC3" class="line" lang="plaintext">.</span> +<span id="LC4" class="line" lang="plaintext"><blockquote></span> +<span id="LC5" class="line" lang="plaintext"><ol></span> +<span id="LC6" class="line" lang="plaintext"><li></span> +<span id="LC7" class="line" lang="plaintext"><blockquote></span> +<span id="LC8" class="line" lang="plaintext"><p>Blockquote</span> +<span id="LC9" class="line" lang="plaintext">continued here.</p></span> +<span id="LC10" class="line" lang="plaintext"></blockquote></span> +<span id="LC11" class="line" lang="plaintext"></li></span> +<span id="LC12" class="line" lang="plaintext"></ol></span> +<span id="LC13" class="line" lang="plaintext"></blockquote></span></code></pre> +<copy-code></copy-code> +</div> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="4462:1-4476:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">> 1. > Blockquote</span> +<span id="LC2" class="line" lang="plaintext">> continued here.</span> +<span id="LC3" class="line" lang="plaintext">.</span> +<span id="LC4" class="line" lang="plaintext"><blockquote></span> +<span id="LC5" class="line" lang="plaintext"><ol></span> +<span id="LC6" class="line" lang="plaintext"><li></span> +<span id="LC7" class="line" lang="plaintext"><blockquote></span> +<span id="LC8" class="line" lang="plaintext"><p>Blockquote</span> +<span id="LC9" class="line" lang="plaintext">continued here.</p></span> +<span id="LC10" class="line" lang="plaintext"></blockquote></span> +<span id="LC11" class="line" lang="plaintext"></li></span> +<span id="LC12" class="line" lang="plaintext"></ol></span> +<span id="LC13" class="line" lang="plaintext"></blockquote></span></code></pre> +<copy-code></copy-code> +</div> +<ol start="6" data-sourcepos="4480:1-4482:0" dir="auto"> +<li data-sourcepos="4480:1-4482:0"> +<strong>That's all.</strong> Nothing that is not counted as a list item by rules +#1--5 counts as a <a href="#list-items">list item</a>.</li> +</ol> +<p data-sourcepos="4483:1-4486:17" dir="auto">The rules for sublists follow from the general rules +[above][List items]. A sublist must be indented the same number +of spaces a paragraph would need to be in order to be included +in the list item.</p> +<p data-sourcepos="4488:1-4488:43" dir="auto">So, in this case we need two spaces indent:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="4490:1-4511:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">- foo</span> +<span id="LC2" class="line" lang="plaintext"> - bar</span> +<span id="LC3" class="line" lang="plaintext"> - baz</span> +<span id="LC4" class="line" lang="plaintext"> - boo</span> +<span id="LC5" class="line" lang="plaintext">.</span> +<span id="LC6" class="line" lang="plaintext"><ul></span> +<span id="LC7" class="line" lang="plaintext"><li>foo</span> +<span id="LC8" class="line" lang="plaintext"><ul></span> +<span id="LC9" class="line" lang="plaintext"><li>bar</span> +<span id="LC10" class="line" lang="plaintext"><ul></span> +<span id="LC11" class="line" lang="plaintext"><li>baz</span> +<span id="LC12" class="line" lang="plaintext"><ul></span> +<span id="LC13" class="line" lang="plaintext"><li>boo</li></span> +<span id="LC14" class="line" lang="plaintext"></ul></span> +<span id="LC15" class="line" lang="plaintext"></li></span> +<span id="LC16" class="line" lang="plaintext"></ul></span> +<span id="LC17" class="line" lang="plaintext"></li></span> +<span id="LC18" class="line" lang="plaintext"></ul></span> +<span id="LC19" class="line" lang="plaintext"></li></span> +<span id="LC20" class="line" lang="plaintext"></ul></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="4514:1-4514:18" dir="auto">One is not enough:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="4516:1-4528:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">- foo</span> +<span id="LC2" class="line" lang="plaintext"> - bar</span> +<span id="LC3" class="line" lang="plaintext"> - baz</span> +<span id="LC4" class="line" lang="plaintext"> - boo</span> +<span id="LC5" class="line" lang="plaintext">.</span> +<span id="LC6" class="line" lang="plaintext"><ul></span> +<span id="LC7" class="line" lang="plaintext"><li>foo</li></span> +<span id="LC8" class="line" lang="plaintext"><li>bar</li></span> +<span id="LC9" class="line" lang="plaintext"><li>baz</li></span> +<span id="LC10" class="line" lang="plaintext"><li>boo</li></span> +<span id="LC11" class="line" lang="plaintext"></ul></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="4531:1-4531:52" dir="auto">Here we need four, because the list marker is wider:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="4533:1-4544:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">10) foo</span> +<span id="LC2" class="line" lang="plaintext"> - bar</span> +<span id="LC3" class="line" lang="plaintext">.</span> +<span id="LC4" class="line" lang="plaintext"><ol start="10"></span> +<span id="LC5" class="line" lang="plaintext"><li>foo</span> +<span id="LC6" class="line" lang="plaintext"><ul></span> +<span id="LC7" class="line" lang="plaintext"><li>bar</li></span> +<span id="LC8" class="line" lang="plaintext"></ul></span> +<span id="LC9" class="line" lang="plaintext"></li></span> +<span id="LC10" class="line" lang="plaintext"></ol></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="4547:1-4547:20" dir="auto">Three is not enough:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="4549:1-4559:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">10) foo</span> +<span id="LC2" class="line" lang="plaintext"> - bar</span> +<span id="LC3" class="line" lang="plaintext">.</span> +<span id="LC4" class="line" lang="plaintext"><ol start="10"></span> +<span id="LC5" class="line" lang="plaintext"><li>foo</li></span> +<span id="LC6" class="line" lang="plaintext"></ol></span> +<span id="LC7" class="line" lang="plaintext"><ul></span> +<span id="LC8" class="line" lang="plaintext"><li>bar</li></span> +<span id="LC9" class="line" lang="plaintext"></ul></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="4562:1-4562:45" dir="auto">A list may be the first block in a list item:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="4564:1-4574:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">- - foo</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><ul></span> +<span id="LC4" class="line" lang="plaintext"><li></span> +<span id="LC5" class="line" lang="plaintext"><ul></span> +<span id="LC6" class="line" lang="plaintext"><li>foo</li></span> +<span id="LC7" class="line" lang="plaintext"></ul></span> +<span id="LC8" class="line" lang="plaintext"></li></span> +<span id="LC9" class="line" lang="plaintext"></ul></span></code></pre> +<copy-code></copy-code> +</div> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="4577:1-4591:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">1. - 2. foo</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><ol></span> +<span id="LC4" class="line" lang="plaintext"><li></span> +<span id="LC5" class="line" lang="plaintext"><ul></span> +<span id="LC6" class="line" lang="plaintext"><li></span> +<span id="LC7" class="line" lang="plaintext"><ol start="2"></span> +<span id="LC8" class="line" lang="plaintext"><li>foo</li></span> +<span id="LC9" class="line" lang="plaintext"></ol></span> +<span id="LC10" class="line" lang="plaintext"></li></span> +<span id="LC11" class="line" lang="plaintext"></ul></span> +<span id="LC12" class="line" lang="plaintext"></li></span> +<span id="LC13" class="line" lang="plaintext"></ol></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="4594:1-4594:34" dir="auto">A list item can contain a heading:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="4596:1-4610:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">- # Foo</span> +<span id="LC2" class="line" lang="plaintext">- Bar</span> +<span id="LC3" class="line" lang="plaintext"> ---</span> +<span id="LC4" class="line" lang="plaintext"> baz</span> +<span id="LC5" class="line" lang="plaintext">.</span> +<span id="LC6" class="line" lang="plaintext"><ul></span> +<span id="LC7" class="line" lang="plaintext"><li></span> +<span id="LC8" class="line" lang="plaintext"><h1>Foo</h1></span> +<span id="LC9" class="line" lang="plaintext"></li></span> +<span id="LC10" class="line" lang="plaintext"><li></span> +<span id="LC11" class="line" lang="plaintext"><h2>Bar</h2></span> +<span id="LC12" class="line" lang="plaintext">baz</li></span> +<span id="LC13" class="line" lang="plaintext"></ul></span></code></pre> +<copy-code></copy-code> +</div> +<h3 data-sourcepos="4613:1-4613:14" dir="auto"> +<a id="user-content-motivation" class="anchor" href="#motivation" aria-hidden="true"></a>Motivation</h3> +<p data-sourcepos="4615:1-4615:64" dir="auto">John Gruber's Markdown spec says the following about list items:</p> +<ol data-sourcepos="4617:1-4636:0" dir="auto"> +<li data-sourcepos="4617:1-4620:0"> +<p data-sourcepos="4617:4-4619:20">"List markers typically start at the left margin, but may be indented +by up to three spaces. List markers must be followed by one or more +spaces or a tab."</p> +</li> +<li data-sourcepos="4621:1-4623:0"> +<p data-sourcepos="4621:4-4622:48">"To make lists look nice, you can wrap items with hanging indents.... +But if you don't want to, you don't have to."</p> +</li> +<li data-sourcepos="4624:1-4627:0"> +<p data-sourcepos="4624:4-4626:8">"List items may consist of multiple paragraphs. Each subsequent +paragraph in a list item must be indented by either 4 spaces or one +tab."</p> +</li> +<li data-sourcepos="4628:1-4630:0"> +<p data-sourcepos="4628:4-4629:55">"It looks nice if you indent every line of the subsequent paragraphs, +but here again, Markdown will allow you to be lazy."</p> +</li> +<li data-sourcepos="4631:1-4633:0"> +<p data-sourcepos="4631:4-4632:35">"To put a blockquote within a list item, the blockquote's <code>></code> +delimiters need to be indented."</p> +</li> +<li data-sourcepos="4634:1-4636:0"> +<p data-sourcepos="4634:4-4635:44">"To put a code block within a list item, the code block needs to be +indented twice — 8 spaces or two tabs."</p> +</li> +</ol> +<p data-sourcepos="4637:1-4646:18" dir="auto">These rules specify that a paragraph under a list item must be indented +four spaces (presumably, from the left margin, rather than the start of +the list marker, but this is not said), and that code under a list item +must be indented eight spaces instead of the usual four. They also say +that a block quote must be indented, but not by how much; however, the +example given has four spaces indentation. Although nothing is said +about other kinds of block-level content, it is certainly reasonable to +infer that <em>all</em> block elements under a list item, including other +lists, must be indented four spaces. This principle has been called the +<em>four-space rule</em>.</p> +<p data-sourcepos="4648:1-4659:48" dir="auto">The four-space rule is clear and principled, and if the reference +implementation <code>Markdown.pl</code> had followed it, it probably would have +become the standard. However, <code>Markdown.pl</code> allowed paragraphs and +sublists to start with only two spaces indentation, at least on the +outer level. Worse, its behavior was inconsistent: a sublist of an +outer-level list needed two spaces indentation, but a sublist of this +sublist needed three spaces. It is not surprising, then, that different +implementations of Markdown have developed very different rules for +determining what comes under a list item. (Pandoc and python-Markdown, +for example, stuck with Gruber's syntax description and the four-space +rule, while discount, redcarpet, marked, PHP Markdown, and others +followed <code>Markdown.pl</code>'s behavior more closely.)</p> +<p data-sourcepos="4661:1-4666:45" dir="auto">Unfortunately, given the divergences between implementations, there +is no way to give a spec for list items that will be guaranteed not +to break any existing documents. However, the spec given here should +correctly handle lists formatted with either the four-space rule or +the more forgiving <code>Markdown.pl</code> behavior, provided they are laid out +in a way that is natural for a human to read.</p> +<p data-sourcepos="4668:1-4674:22" dir="auto">The strategy here is to let the width and indentation of the list marker +determine the indentation necessary for blocks to fall under the list +item, rather than having a fixed and arbitrary number. The writer can +think of the body of the list item as a unit which gets indented to the +right enough to fit the list marker (and any indentation on the list +marker). (The laziness rule, #5, then allows continuation lines to be +unindented if needed.)</p> +<p data-sourcepos="4676:1-4678:39" dir="auto">This rule is superior, we claim, to any rule requiring a fixed level of +indentation from the margin. The four-space rule is clear but +unnatural. It is quite unintuitive that</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="4680:1-4686:3" class="code highlight js-syntax-highlight language-markdown" lang="markdown" v-pre="true"><code><span id="LC1" class="line" lang="markdown"><span class="p">-</span> foo</span> +<span id="LC2" class="line" lang="markdown"></span> +<span id="LC3" class="line" lang="markdown"> bar</span> +<span id="LC4" class="line" lang="markdown"></span> +<span id="LC5" class="line" lang="markdown"><span class="p"> -</span> baz</span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="4688:1-4688:60" dir="auto">should be parsed as two lists with an intervening paragraph,</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="4690:1-4698:3" class="code highlight js-syntax-highlight language-html" lang="html" v-pre="true"><code><span id="LC1" class="line" lang="html"><span class="nt"><ul></span></span> +<span id="LC2" class="line" lang="html"><span class="nt"><li></span>foo<span class="nt"></li></span></span> +<span id="LC3" class="line" lang="html"><span class="nt"></ul></span></span> +<span id="LC4" class="line" lang="html"><span class="nt"><p></span>bar<span class="nt"></p></span></span> +<span id="LC5" class="line" lang="html"><span class="nt"><ul></span></span> +<span id="LC6" class="line" lang="html"><span class="nt"><li></span>baz<span class="nt"></li></span></span> +<span id="LC7" class="line" lang="html"><span class="nt"></ul></span></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="4700:1-4700:58" dir="auto">as the four-space rule demands, rather than a single list,</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="4702:1-4712:3" class="code highlight js-syntax-highlight language-html" lang="html" v-pre="true"><code><span id="LC1" class="line" lang="html"><span class="nt"><ul></span></span> +<span id="LC2" class="line" lang="html"><span class="nt"><li></span></span> +<span id="LC3" class="line" lang="html"><span class="nt"><p></span>foo<span class="nt"></p></span></span> +<span id="LC4" class="line" lang="html"><span class="nt"><p></span>bar<span class="nt"></p></span></span> +<span id="LC5" class="line" lang="html"><span class="nt"><ul></span></span> +<span id="LC6" class="line" lang="html"><span class="nt"><li></span>baz<span class="nt"></li></span></span> +<span id="LC7" class="line" lang="html"><span class="nt"></ul></span></span> +<span id="LC8" class="line" lang="html"><span class="nt"></li></span></span> +<span id="LC9" class="line" lang="html"><span class="nt"></ul></span></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="4714:1-4715:62" dir="auto">The choice of four spaces is arbitrary. It can be learned, but it is +not likely to be guessed, and it trips up beginners regularly.</p> +<p data-sourcepos="4717:1-4721:20" dir="auto">Would it help to adopt a two-space rule? The problem is that such +a rule, together with the rule allowing 1--3 spaces indentation of the +initial list marker, allows text that is indented <em>less than</em> the +original list marker to be included in the list item. For example, +<code>Markdown.pl</code> parses</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="4723:1-4727:3" class="code highlight js-syntax-highlight language-markdown" lang="markdown" v-pre="true"><code><span id="LC1" class="line" lang="markdown"><span class="p"> -</span> one</span> +<span id="LC2" class="line" lang="markdown"></span> +<span id="LC3" class="line" lang="markdown"> two</span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="4729:1-4729:59" dir="auto">as a single list item, with <code>two</code> a continuation paragraph:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="4731:1-4738:3" class="code highlight js-syntax-highlight language-html" lang="html" v-pre="true"><code><span id="LC1" class="line" lang="html"><span class="nt"><ul></span></span> +<span id="LC2" class="line" lang="html"><span class="nt"><li></span></span> +<span id="LC3" class="line" lang="html"><span class="nt"><p></span>one<span class="nt"></p></span></span> +<span id="LC4" class="line" lang="html"><span class="nt"><p></span>two<span class="nt"></p></span></span> +<span id="LC5" class="line" lang="html"><span class="nt"></li></span></span> +<span id="LC6" class="line" lang="html"><span class="nt"></ul></span></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="4740:1-4740:13" dir="auto">and similarly</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="4742:1-4746:3" class="code highlight js-syntax-highlight language-markdown" lang="markdown" v-pre="true"><code><span id="LC1" class="line" lang="markdown"><span class="gt">> - one</span></span> +<span id="LC2" class="line" lang="markdown"><span class="gt">></span></span> +<span id="LC3" class="line" lang="markdown"><span class="gt">> two</span></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="4748:1-4748:2" dir="auto">as</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="4750:1-4759:3" class="code highlight js-syntax-highlight language-html" lang="html" v-pre="true"><code><span id="LC1" class="line" lang="html"><span class="nt"><blockquote></span></span> +<span id="LC2" class="line" lang="html"><span class="nt"><ul></span></span> +<span id="LC3" class="line" lang="html"><span class="nt"><li></span></span> +<span id="LC4" class="line" lang="html"><span class="nt"><p></span>one<span class="nt"></p></span></span> +<span id="LC5" class="line" lang="html"><span class="nt"><p></span>two<span class="nt"></p></span></span> +<span id="LC6" class="line" lang="html"><span class="nt"></li></span></span> +<span id="LC7" class="line" lang="html"><span class="nt"></ul></span></span> +<span id="LC8" class="line" lang="html"><span class="nt"></blockquote></span></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="4761:1-4761:30" dir="auto">This is extremely unintuitive.</p> +<p data-sourcepos="4763:1-4768:52" dir="auto">Rather than requiring a fixed indent from the margin, we could require +a fixed indent (say, two spaces, or even one space) from the list marker (which +may itself be indented). This proposal would remove the last anomaly +discussed. Unlike the spec presented above, it would count the following +as a list item with a subparagraph, even though the paragraph <code>bar</code> +is not indented as far as the first paragraph <code>foo</code>:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="4770:1-4774:3" class="code highlight js-syntax-highlight language-markdown" lang="markdown" v-pre="true"><code><span id="LC1" class="line" lang="markdown"><span class="p"> 10.</span> foo</span> +<span id="LC2" class="line" lang="markdown"></span> +<span id="LC3" class="line" lang="markdown"> bar </span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="4776:1-4779:62" dir="auto">Arguably this text does read like a list item with <code>bar</code> as a subparagraph, +which may count in favor of the proposal. However, on this proposal indented +code would have to be indented six spaces after the list marker. And this +would break a lot of existing Markdown, which has the pattern:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="4781:1-4785:3" class="code highlight js-syntax-highlight language-markdown" lang="markdown" v-pre="true"><code><span id="LC1" class="line" lang="markdown"><span class="p">1.</span> foo</span> +<span id="LC2" class="line" lang="markdown"></span> +<span id="LC3" class="line" lang="markdown"><span class="sb"> indented code</span></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="4787:1-4789:28" dir="auto">where the code is indented eight spaces. The spec above, by contrast, will +parse this text as expected, since the code block's indentation is measured +from the beginning of <code>foo</code>.</p> +<p data-sourcepos="4791:1-4797:62" dir="auto">The one case that needs special treatment is a list item that <em>starts</em> +with indented code. How much indentation is required in that case, since +we don't have a "first paragraph" to measure from? Rule #2 simply stipulates +that in such cases, we require one space indentation from the list marker +(and then the normal four spaces for the indented code). This will match the +four-space rule in cases where the list marker plus its initial indentation +takes four spaces (a common case), but diverge in other cases.</p> +<div> +<h2 data-sourcepos="4801:1-4801:30"> +<a id="user-content-task-list-items-extension" class="anchor" href="#task-list-items-extension" aria-hidden="true"></a>Task list items (extension)</h2> +<p data-sourcepos="4803:1-4804:26">GFM enables the <code>tasklist</code> extension, where an additional processing step is +performed on [list items].</p> +<p data-sourcepos="4806:1-4808:46">A <a href="@">task list item</a> is a [list item][list items] where the first block in it +is a paragraph which begins with a [task list item marker] and at least one +whitespace character before any other content.</p> +<p data-sourcepos="4810:1-4812:55">A <a href="@">task list item marker</a> consists of an optional number of spaces, a left +bracket (<code>[</code>), either a whitespace character or the letter <code>x</code> in either +lowercase or uppercase, and then a right bracket (<code>]</code>).</p> +<p data-sourcepos="4814:1-4815:70">When rendered, the [task list item marker] is replaced with a semantic checkbox element; +in an HTML output, this would be an <code><input type="checkbox"></code> element.</p> +<p data-sourcepos="4817:1-4818:50">If the character between the brackets is a whitespace character, the checkbox +is unchecked. Otherwise, the checkbox is checked.</p> +<p data-sourcepos="4820:1-4823:28">This spec does not define how the checkbox elements are interacted with: in practice, +implementors are free to render the checkboxes as disabled or inmutable elements, +or they may dynamically handle dynamic interactions (i.e. checking, unchecking) in +the final rendered document.</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="4825:1-4833:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">- [ ] foo</span> +<span id="LC2" class="line" lang="plaintext">- [x] bar</span> +<span id="LC3" class="line" lang="plaintext">.</span> +<span id="LC4" class="line" lang="plaintext"><ul></span> +<span id="LC5" class="line" lang="plaintext"><li><input disabled="" type="checkbox"> foo</li></span> +<span id="LC6" class="line" lang="plaintext"><li><input checked="" disabled="" type="checkbox"> bar</li></span> +<span id="LC7" class="line" lang="plaintext"></ul></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="4835:1-4835:37">Task lists can be arbitrarily nested:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="4837:1-4852:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">- [x] foo</span> +<span id="LC2" class="line" lang="plaintext"> - [ ] bar</span> +<span id="LC3" class="line" lang="plaintext"> - [x] baz</span> +<span id="LC4" class="line" lang="plaintext">- [ ] bim</span> +<span id="LC5" class="line" lang="plaintext">.</span> +<span id="LC6" class="line" lang="plaintext"><ul></span> +<span id="LC7" class="line" lang="plaintext"><li><input checked="" disabled="" type="checkbox"> foo</span> +<span id="LC8" class="line" lang="plaintext"><ul></span> +<span id="LC9" class="line" lang="plaintext"><li><input disabled="" type="checkbox"> bar</li></span> +<span id="LC10" class="line" lang="plaintext"><li><input checked="" disabled="" type="checkbox"> baz</li></span> +<span id="LC11" class="line" lang="plaintext"></ul></span> +<span id="LC12" class="line" lang="plaintext"></li></span> +<span id="LC13" class="line" lang="plaintext"><li><input disabled="" type="checkbox"> bim</li></span> +<span id="LC14" class="line" lang="plaintext"></ul></span></code></pre> +<copy-code></copy-code> +</div> +</div> +<h2 data-sourcepos="4856:1-4856:8" dir="auto"> +<a id="user-content-lists" class="anchor" href="#lists" aria-hidden="true"></a>Lists</h2> +<p data-sourcepos="4858:1-4860:46" dir="auto">A <a href="@">list</a> is a sequence of one or more +list items [of the same type]. The list items +may be separated by any number of blank lines.</p> +<p data-sourcepos="4862:1-4867:30" dir="auto">Two list items are <a href="@">of the same type</a> +if they begin with a [list marker] of the same type. +Two list markers are of the +same type if (a) they are bullet list markers using the same character +(<code>-</code>, <code>+</code>, or <code>*</code>) or (b) they are ordered list numbers with the same +delimiter (either <code>.</code> or <code>)</code>).</p> +<p data-sourcepos="4869:1-4873:39" dir="auto">A list is an <a href="@">ordered list</a> +if its constituent list items begin with +[ordered list markers], and a +<a href="@">bullet list</a> if its constituent list +items begin with [bullet list markers].</p> +<p data-sourcepos="4875:1-4878:12" dir="auto">The <a href="@">start number</a> +of an [ordered list] is determined by the list number of +its initial list item. The numbers of subsequent list items are +disregarded.</p> +<p data-sourcepos="4880:1-4885:65" dir="auto">A list is <a href="@">loose</a> if any of its constituent +list items are separated by blank lines, or if any of its constituent +list items directly contain two block-level elements with a blank line +between them. Otherwise a list is <a href="@">tight</a>. +(The difference in HTML output is that paragraphs in a loose list are +wrapped in <code><p></code> tags, while paragraphs in a tight list are not.)</p> +<p data-sourcepos="4887:1-4887:64" dir="auto">Changing the bullet or ordered list delimiter starts a new list:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="4889:1-4901:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">- foo</span> +<span id="LC2" class="line" lang="plaintext">- bar</span> +<span id="LC3" class="line" lang="plaintext">+ baz</span> +<span id="LC4" class="line" lang="plaintext">.</span> +<span id="LC5" class="line" lang="plaintext"><ul></span> +<span id="LC6" class="line" lang="plaintext"><li>foo</li></span> +<span id="LC7" class="line" lang="plaintext"><li>bar</li></span> +<span id="LC8" class="line" lang="plaintext"></ul></span> +<span id="LC9" class="line" lang="plaintext"><ul></span> +<span id="LC10" class="line" lang="plaintext"><li>baz</li></span> +<span id="LC11" class="line" lang="plaintext"></ul></span></code></pre> +<copy-code></copy-code> +</div> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="4904:1-4916:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">1. foo</span> +<span id="LC2" class="line" lang="plaintext">2. bar</span> +<span id="LC3" class="line" lang="plaintext">3) baz</span> +<span id="LC4" class="line" lang="plaintext">.</span> +<span id="LC5" class="line" lang="plaintext"><ol></span> +<span id="LC6" class="line" lang="plaintext"><li>foo</li></span> +<span id="LC7" class="line" lang="plaintext"><li>bar</li></span> +<span id="LC8" class="line" lang="plaintext"></ol></span> +<span id="LC9" class="line" lang="plaintext"><ol start="3"></span> +<span id="LC10" class="line" lang="plaintext"><li>baz</li></span> +<span id="LC11" class="line" lang="plaintext"></ol></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="4919:1-4921:5" dir="auto">In CommonMark, a list can interrupt a paragraph. That is, +no blank line is needed to separate a paragraph from a following +list:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="4923:1-4933:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">Foo</span> +<span id="LC2" class="line" lang="plaintext">- bar</span> +<span id="LC3" class="line" lang="plaintext">- baz</span> +<span id="LC4" class="line" lang="plaintext">.</span> +<span id="LC5" class="line" lang="plaintext"><p>Foo</p></span> +<span id="LC6" class="line" lang="plaintext"><ul></span> +<span id="LC7" class="line" lang="plaintext"><li>bar</li></span> +<span id="LC8" class="line" lang="plaintext"><li>baz</li></span> +<span id="LC9" class="line" lang="plaintext"></ul></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="4935:1-4936:37" dir="auto"><code>Markdown.pl</code> does not allow this, through fear of triggering a list +via a numeral in a hard-wrapped line:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="4938:1-4941:3" class="code highlight js-syntax-highlight language-markdown" lang="markdown" v-pre="true"><code><span id="LC1" class="line" lang="markdown">The number of windows in my house is</span> +<span id="LC2" class="line" lang="markdown"><span class="p">14.</span> The number of doors is 6.</span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="4943:1-4945:6" dir="auto">Oddly, though, <code>Markdown.pl</code> <em>does</em> allow a blockquote to +interrupt a paragraph, even though the same considerations might +apply.</p> +<p data-sourcepos="4947:1-4949:35" dir="auto">In CommonMark, we do allow lists to interrupt paragraphs, for +two reasons. First, it is natural and not uncommon for people +to start lists without blank lines:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="4951:1-4956:3" class="code highlight js-syntax-highlight language-markdown" lang="markdown" v-pre="true"><code><span id="LC1" class="line" lang="markdown">I need to buy</span> +<span id="LC2" class="line" lang="markdown"><span class="p">-</span> new shoes</span> +<span id="LC3" class="line" lang="markdown"><span class="p">-</span> a coat</span> +<span id="LC4" class="line" lang="markdown"><span class="p">-</span> a plane ticket</span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="4958:1-4958:29" dir="auto">Second, we are attracted to a</p> +<blockquote data-sourcepos="4960:1-4963:54" dir="auto"> +<p data-sourcepos="4960:3-4963:54"><a href="@">principle of uniformity</a>: +if a chunk of text has a certain +meaning, it will continue to have the same meaning when put into a +container block (such as a list item or blockquote).</p> +</blockquote> +<p data-sourcepos="4965:1-4966:47" dir="auto">(Indeed, the spec for [list items] and [block quotes] presupposes +this principle.) This principle implies that if</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="4968:1-4973:3" class="code highlight js-syntax-highlight language-markdown" lang="markdown" v-pre="true"><code><span id="LC1" class="line" lang="markdown"><span class="p"> *</span> I need to buy</span> +<span id="LC2" class="line" lang="markdown"><span class="p"> -</span> new shoes</span> +<span id="LC3" class="line" lang="markdown"><span class="p"> -</span> a coat</span> +<span id="LC4" class="line" lang="markdown"><span class="p"> -</span> a plane ticket</span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="4975:1-4978:4" dir="auto">is a list item containing a paragraph followed by a nested sublist, +as all Markdown implementations agree it is (though the paragraph +may be rendered without <code><p></code> tags, since the list is "tight"), +then</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="4980:1-4985:3" class="code highlight js-syntax-highlight language-markdown" lang="markdown" v-pre="true"><code><span id="LC1" class="line" lang="markdown">I need to buy</span> +<span id="LC2" class="line" lang="markdown"><span class="p">-</span> new shoes</span> +<span id="LC3" class="line" lang="markdown"><span class="p">-</span> a coat</span> +<span id="LC4" class="line" lang="markdown"><span class="p">-</span> a plane ticket</span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="4987:1-4987:61" dir="auto">by itself should be a paragraph followed by a nested sublist.</p> +<p data-sourcepos="4989:1-4994:30" dir="auto">Since it is well established Markdown practice to allow lists to +interrupt paragraphs inside list items, the [principle of +uniformity] requires us to allow this outside list items as +well. (<a href="http://docutils.sourceforge.net/rst.html" rel="nofollow noreferrer noopener" target="_blank">reStructuredText</a> +takes a different approach, requiring blank lines before lists +even inside other list items.)</p> +<p data-sourcepos="4996:1-4998:28" dir="auto">In order to solve of unwanted lists in paragraphs with +hard-wrapped numerals, we allow only lists starting with <code>1</code> to +interrupt paragraphs. Thus,</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="5000:1-5006:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">The number of windows in my house is</span> +<span id="LC2" class="line" lang="plaintext">14. The number of doors is 6.</span> +<span id="LC3" class="line" lang="plaintext">.</span> +<span id="LC4" class="line" lang="plaintext"><p>The number of windows in my house is</span> +<span id="LC5" class="line" lang="plaintext">14. The number of doors is 6.</p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="5008:1-5008:51" dir="auto">We may still get an unintended result in cases like</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="5010:1-5018:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">The number of windows in my house is</span> +<span id="LC2" class="line" lang="plaintext">1. The number of doors is 6.</span> +<span id="LC3" class="line" lang="plaintext">.</span> +<span id="LC4" class="line" lang="plaintext"><p>The number of windows in my house is</p></span> +<span id="LC5" class="line" lang="plaintext"><ol></span> +<span id="LC6" class="line" lang="plaintext"><li>The number of doors is 6.</li></span> +<span id="LC7" class="line" lang="plaintext"></ol></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="5020:1-5020:57" dir="auto">but this rule should prevent most spurious list captures.</p> +<p data-sourcepos="5022:1-5022:53" dir="auto">There can be any number of blank lines between items:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="5024:1-5043:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">- foo</span> +<span id="LC2" class="line" lang="plaintext"></span> +<span id="LC3" class="line" lang="plaintext">- bar</span> +<span id="LC4" class="line" lang="plaintext"></span> +<span id="LC5" class="line" lang="plaintext"></span> +<span id="LC6" class="line" lang="plaintext">- baz</span> +<span id="LC7" class="line" lang="plaintext">.</span> +<span id="LC8" class="line" lang="plaintext"><ul></span> +<span id="LC9" class="line" lang="plaintext"><li></span> +<span id="LC10" class="line" lang="plaintext"><p>foo</p></span> +<span id="LC11" class="line" lang="plaintext"></li></span> +<span id="LC12" class="line" lang="plaintext"><li></span> +<span id="LC13" class="line" lang="plaintext"><p>bar</p></span> +<span id="LC14" class="line" lang="plaintext"></li></span> +<span id="LC15" class="line" lang="plaintext"><li></span> +<span id="LC16" class="line" lang="plaintext"><p>baz</p></span> +<span id="LC17" class="line" lang="plaintext"></li></span> +<span id="LC18" class="line" lang="plaintext"></ul></span></code></pre> +<copy-code></copy-code> +</div> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="5045:1-5067:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">- foo</span> +<span id="LC2" class="line" lang="plaintext"> - bar</span> +<span id="LC3" class="line" lang="plaintext"> - baz</span> +<span id="LC4" class="line" lang="plaintext"></span> +<span id="LC5" class="line" lang="plaintext"></span> +<span id="LC6" class="line" lang="plaintext"> bim</span> +<span id="LC7" class="line" lang="plaintext">.</span> +<span id="LC8" class="line" lang="plaintext"><ul></span> +<span id="LC9" class="line" lang="plaintext"><li>foo</span> +<span id="LC10" class="line" lang="plaintext"><ul></span> +<span id="LC11" class="line" lang="plaintext"><li>bar</span> +<span id="LC12" class="line" lang="plaintext"><ul></span> +<span id="LC13" class="line" lang="plaintext"><li></span> +<span id="LC14" class="line" lang="plaintext"><p>baz</p></span> +<span id="LC15" class="line" lang="plaintext"><p>bim</p></span> +<span id="LC16" class="line" lang="plaintext"></li></span> +<span id="LC17" class="line" lang="plaintext"></ul></span> +<span id="LC18" class="line" lang="plaintext"></li></span> +<span id="LC19" class="line" lang="plaintext"></ul></span> +<span id="LC20" class="line" lang="plaintext"></li></span> +<span id="LC21" class="line" lang="plaintext"></ul></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="5070:1-5073:8" dir="auto">To separate consecutive lists of the same type, or to separate a +list from an indented code block that would otherwise be parsed +as a subparagraph of the final list item, you can insert a blank HTML +comment:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="5075:1-5093:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">- foo</span> +<span id="LC2" class="line" lang="plaintext">- bar</span> +<span id="LC3" class="line" lang="plaintext"></span> +<span id="LC4" class="line" lang="plaintext"><!-- --></span> +<span id="LC5" class="line" lang="plaintext"></span> +<span id="LC6" class="line" lang="plaintext">- baz</span> +<span id="LC7" class="line" lang="plaintext">- bim</span> +<span id="LC8" class="line" lang="plaintext">.</span> +<span id="LC9" class="line" lang="plaintext"><ul></span> +<span id="LC10" class="line" lang="plaintext"><li>foo</li></span> +<span id="LC11" class="line" lang="plaintext"><li>bar</li></span> +<span id="LC12" class="line" lang="plaintext"></ul></span> +<span id="LC13" class="line" lang="plaintext"><!-- --></span> +<span id="LC14" class="line" lang="plaintext"><ul></span> +<span id="LC15" class="line" lang="plaintext"><li>baz</li></span> +<span id="LC16" class="line" lang="plaintext"><li>bim</li></span> +<span id="LC17" class="line" lang="plaintext"></ul></span></code></pre> +<copy-code></copy-code> +</div> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="5096:1-5119:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">- foo</span> +<span id="LC2" class="line" lang="plaintext"></span> +<span id="LC3" class="line" lang="plaintext"> notcode</span> +<span id="LC4" class="line" lang="plaintext"></span> +<span id="LC5" class="line" lang="plaintext">- foo</span> +<span id="LC6" class="line" lang="plaintext"></span> +<span id="LC7" class="line" lang="plaintext"><!-- --></span> +<span id="LC8" class="line" lang="plaintext"></span> +<span id="LC9" class="line" lang="plaintext"> code</span> +<span id="LC10" class="line" lang="plaintext">.</span> +<span id="LC11" class="line" lang="plaintext"><ul></span> +<span id="LC12" class="line" lang="plaintext"><li></span> +<span id="LC13" class="line" lang="plaintext"><p>foo</p></span> +<span id="LC14" class="line" lang="plaintext"><p>notcode</p></span> +<span id="LC15" class="line" lang="plaintext"></li></span> +<span id="LC16" class="line" lang="plaintext"><li></span> +<span id="LC17" class="line" lang="plaintext"><p>foo</p></span> +<span id="LC18" class="line" lang="plaintext"></li></span> +<span id="LC19" class="line" lang="plaintext"></ul></span> +<span id="LC20" class="line" lang="plaintext"><!-- --></span> +<span id="LC21" class="line" lang="plaintext"><pre><code>code</span> +<span id="LC22" class="line" lang="plaintext"></code></pre></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="5122:1-5125:5" dir="auto">List items need not be indented to the same level. The following +list items will be treated as items at the same list level, +since none is indented enough to belong to the previous list +item:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="5127:1-5145:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">- a</span> +<span id="LC2" class="line" lang="plaintext"> - b</span> +<span id="LC3" class="line" lang="plaintext"> - c</span> +<span id="LC4" class="line" lang="plaintext"> - d</span> +<span id="LC5" class="line" lang="plaintext"> - e</span> +<span id="LC6" class="line" lang="plaintext"> - f</span> +<span id="LC7" class="line" lang="plaintext">- g</span> +<span id="LC8" class="line" lang="plaintext">.</span> +<span id="LC9" class="line" lang="plaintext"><ul></span> +<span id="LC10" class="line" lang="plaintext"><li>a</li></span> +<span id="LC11" class="line" lang="plaintext"><li>b</li></span> +<span id="LC12" class="line" lang="plaintext"><li>c</li></span> +<span id="LC13" class="line" lang="plaintext"><li>d</li></span> +<span id="LC14" class="line" lang="plaintext"><li>e</li></span> +<span id="LC15" class="line" lang="plaintext"><li>f</li></span> +<span id="LC16" class="line" lang="plaintext"><li>g</li></span> +<span id="LC17" class="line" lang="plaintext"></ul></span></code></pre> +<copy-code></copy-code> +</div> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="5148:1-5166:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">1. a</span> +<span id="LC2" class="line" lang="plaintext"></span> +<span id="LC3" class="line" lang="plaintext"> 2. b</span> +<span id="LC4" class="line" lang="plaintext"></span> +<span id="LC5" class="line" lang="plaintext"> 3. c</span> +<span id="LC6" class="line" lang="plaintext">.</span> +<span id="LC7" class="line" lang="plaintext"><ol></span> +<span id="LC8" class="line" lang="plaintext"><li></span> +<span id="LC9" class="line" lang="plaintext"><p>a</p></span> +<span id="LC10" class="line" lang="plaintext"></li></span> +<span id="LC11" class="line" lang="plaintext"><li></span> +<span id="LC12" class="line" lang="plaintext"><p>b</p></span> +<span id="LC13" class="line" lang="plaintext"></li></span> +<span id="LC14" class="line" lang="plaintext"><li></span> +<span id="LC15" class="line" lang="plaintext"><p>c</p></span> +<span id="LC16" class="line" lang="plaintext"></li></span> +<span id="LC17" class="line" lang="plaintext"></ol></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="5168:1-5170:52" dir="auto">Note, however, that list items may not be indented more than +three spaces. Here <code>- e</code> is treated as a paragraph continuation +line, because it is indented more than three spaces:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="5172:1-5186:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">- a</span> +<span id="LC2" class="line" lang="plaintext"> - b</span> +<span id="LC3" class="line" lang="plaintext"> - c</span> +<span id="LC4" class="line" lang="plaintext"> - d</span> +<span id="LC5" class="line" lang="plaintext"> - e</span> +<span id="LC6" class="line" lang="plaintext">.</span> +<span id="LC7" class="line" lang="plaintext"><ul></span> +<span id="LC8" class="line" lang="plaintext"><li>a</li></span> +<span id="LC9" class="line" lang="plaintext"><li>b</li></span> +<span id="LC10" class="line" lang="plaintext"><li>c</li></span> +<span id="LC11" class="line" lang="plaintext"><li>d</span> +<span id="LC12" class="line" lang="plaintext">- e</li></span> +<span id="LC13" class="line" lang="plaintext"></ul></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="5188:1-5190:11" dir="auto">And here, <code>3. c</code> is treated as in indented code block, +because it is indented four spaces and preceded by a +blank line.</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="5192:1-5209:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">1. a</span> +<span id="LC2" class="line" lang="plaintext"></span> +<span id="LC3" class="line" lang="plaintext"> 2. b</span> +<span id="LC4" class="line" lang="plaintext"></span> +<span id="LC5" class="line" lang="plaintext"> 3. c</span> +<span id="LC6" class="line" lang="plaintext">.</span> +<span id="LC7" class="line" lang="plaintext"><ol></span> +<span id="LC8" class="line" lang="plaintext"><li></span> +<span id="LC9" class="line" lang="plaintext"><p>a</p></span> +<span id="LC10" class="line" lang="plaintext"></li></span> +<span id="LC11" class="line" lang="plaintext"><li></span> +<span id="LC12" class="line" lang="plaintext"><p>b</p></span> +<span id="LC13" class="line" lang="plaintext"></li></span> +<span id="LC14" class="line" lang="plaintext"></ol></span> +<span id="LC15" class="line" lang="plaintext"><pre><code>3. c</span> +<span id="LC16" class="line" lang="plaintext"></code></pre></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="5212:1-5213:22" dir="auto">This is a loose list, because there is a blank line between +two of the list items:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="5215:1-5232:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">- a</span> +<span id="LC2" class="line" lang="plaintext">- b</span> +<span id="LC3" class="line" lang="plaintext"></span> +<span id="LC4" class="line" lang="plaintext">- c</span> +<span id="LC5" class="line" lang="plaintext">.</span> +<span id="LC6" class="line" lang="plaintext"><ul></span> +<span id="LC7" class="line" lang="plaintext"><li></span> +<span id="LC8" class="line" lang="plaintext"><p>a</p></span> +<span id="LC9" class="line" lang="plaintext"></li></span> +<span id="LC10" class="line" lang="plaintext"><li></span> +<span id="LC11" class="line" lang="plaintext"><p>b</p></span> +<span id="LC12" class="line" lang="plaintext"></li></span> +<span id="LC13" class="line" lang="plaintext"><li></span> +<span id="LC14" class="line" lang="plaintext"><p>c</p></span> +<span id="LC15" class="line" lang="plaintext"></li></span> +<span id="LC16" class="line" lang="plaintext"></ul></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="5235:1-5235:37" dir="auto">So is this, with a empty second item:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="5237:1-5252:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">* a</span> +<span id="LC2" class="line" lang="plaintext">*</span> +<span id="LC3" class="line" lang="plaintext"></span> +<span id="LC4" class="line" lang="plaintext">* c</span> +<span id="LC5" class="line" lang="plaintext">.</span> +<span id="LC6" class="line" lang="plaintext"><ul></span> +<span id="LC7" class="line" lang="plaintext"><li></span> +<span id="LC8" class="line" lang="plaintext"><p>a</p></span> +<span id="LC9" class="line" lang="plaintext"></li></span> +<span id="LC10" class="line" lang="plaintext"><li></li></span> +<span id="LC11" class="line" lang="plaintext"><li></span> +<span id="LC12" class="line" lang="plaintext"><p>c</p></span> +<span id="LC13" class="line" lang="plaintext"></li></span> +<span id="LC14" class="line" lang="plaintext"></ul></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="5255:1-5257:31" dir="auto">These are loose lists, even though there is no space between the items, +because one of the items directly contains two block-level elements +with a blank line between them:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="5259:1-5278:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">- a</span> +<span id="LC2" class="line" lang="plaintext">- b</span> +<span id="LC3" class="line" lang="plaintext"></span> +<span id="LC4" class="line" lang="plaintext"> c</span> +<span id="LC5" class="line" lang="plaintext">- d</span> +<span id="LC6" class="line" lang="plaintext">.</span> +<span id="LC7" class="line" lang="plaintext"><ul></span> +<span id="LC8" class="line" lang="plaintext"><li></span> +<span id="LC9" class="line" lang="plaintext"><p>a</p></span> +<span id="LC10" class="line" lang="plaintext"></li></span> +<span id="LC11" class="line" lang="plaintext"><li></span> +<span id="LC12" class="line" lang="plaintext"><p>b</p></span> +<span id="LC13" class="line" lang="plaintext"><p>c</p></span> +<span id="LC14" class="line" lang="plaintext"></li></span> +<span id="LC15" class="line" lang="plaintext"><li></span> +<span id="LC16" class="line" lang="plaintext"><p>d</p></span> +<span id="LC17" class="line" lang="plaintext"></li></span> +<span id="LC18" class="line" lang="plaintext"></ul></span></code></pre> +<copy-code></copy-code> +</div> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="5281:1-5299:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">- a</span> +<span id="LC2" class="line" lang="plaintext">- b</span> +<span id="LC3" class="line" lang="plaintext"></span> +<span id="LC4" class="line" lang="plaintext"> [ref]: /url</span> +<span id="LC5" class="line" lang="plaintext">- d</span> +<span id="LC6" class="line" lang="plaintext">.</span> +<span id="LC7" class="line" lang="plaintext"><ul></span> +<span id="LC8" class="line" lang="plaintext"><li></span> +<span id="LC9" class="line" lang="plaintext"><p>a</p></span> +<span id="LC10" class="line" lang="plaintext"></li></span> +<span id="LC11" class="line" lang="plaintext"><li></span> +<span id="LC12" class="line" lang="plaintext"><p>b</p></span> +<span id="LC13" class="line" lang="plaintext"></li></span> +<span id="LC14" class="line" lang="plaintext"><li></span> +<span id="LC15" class="line" lang="plaintext"><p>d</p></span> +<span id="LC16" class="line" lang="plaintext"></li></span> +<span id="LC17" class="line" lang="plaintext"></ul></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="5302:1-5302:66" dir="auto">This is a tight list, because the blank lines are in a code block:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="5304:1-5323:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">- a</span> +<span id="LC2" class="line" lang="plaintext">- ```</span> +<span id="LC3" class="line" lang="plaintext"> b</span> +<span id="LC4" class="line" lang="plaintext"></span> +<span id="LC5" class="line" lang="plaintext"></span> +<span id="LC6" class="line" lang="plaintext"> ```</span> +<span id="LC7" class="line" lang="plaintext">- c</span> +<span id="LC8" class="line" lang="plaintext">.</span> +<span id="LC9" class="line" lang="plaintext"><ul></span> +<span id="LC10" class="line" lang="plaintext"><li>a</li></span> +<span id="LC11" class="line" lang="plaintext"><li></span> +<span id="LC12" class="line" lang="plaintext"><pre><code>b</span> +<span id="LC13" class="line" lang="plaintext"></span> +<span id="LC14" class="line" lang="plaintext"></span> +<span id="LC15" class="line" lang="plaintext"></code></pre></span> +<span id="LC16" class="line" lang="plaintext"></li></span> +<span id="LC17" class="line" lang="plaintext"><li>c</li></span> +<span id="LC18" class="line" lang="plaintext"></ul></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="5326:1-5328:24" dir="auto">This is a tight list, because the blank line is between two +paragraphs of a sublist. So the sublist is loose while +the outer list is tight:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="5330:1-5348:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">- a</span> +<span id="LC2" class="line" lang="plaintext"> - b</span> +<span id="LC3" class="line" lang="plaintext"></span> +<span id="LC4" class="line" lang="plaintext"> c</span> +<span id="LC5" class="line" lang="plaintext">- d</span> +<span id="LC6" class="line" lang="plaintext">.</span> +<span id="LC7" class="line" lang="plaintext"><ul></span> +<span id="LC8" class="line" lang="plaintext"><li>a</span> +<span id="LC9" class="line" lang="plaintext"><ul></span> +<span id="LC10" class="line" lang="plaintext"><li></span> +<span id="LC11" class="line" lang="plaintext"><p>b</p></span> +<span id="LC12" class="line" lang="plaintext"><p>c</p></span> +<span id="LC13" class="line" lang="plaintext"></li></span> +<span id="LC14" class="line" lang="plaintext"></ul></span> +<span id="LC15" class="line" lang="plaintext"></li></span> +<span id="LC16" class="line" lang="plaintext"><li>d</li></span> +<span id="LC17" class="line" lang="plaintext"></ul></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="5351:1-5352:12" dir="auto">This is a tight list, because the blank line is inside the +block quote:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="5354:1-5368:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">* a</span> +<span id="LC2" class="line" lang="plaintext"> > b</span> +<span id="LC3" class="line" lang="plaintext"> ></span> +<span id="LC4" class="line" lang="plaintext">* c</span> +<span id="LC5" class="line" lang="plaintext">.</span> +<span id="LC6" class="line" lang="plaintext"><ul></span> +<span id="LC7" class="line" lang="plaintext"><li>a</span> +<span id="LC8" class="line" lang="plaintext"><blockquote></span> +<span id="LC9" class="line" lang="plaintext"><p>b</p></span> +<span id="LC10" class="line" lang="plaintext"></blockquote></span> +<span id="LC11" class="line" lang="plaintext"></li></span> +<span id="LC12" class="line" lang="plaintext"><li>c</li></span> +<span id="LC13" class="line" lang="plaintext"></ul></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="5371:1-5372:33" dir="auto">This list is tight, because the consecutive block elements +are not separated by blank lines:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="5374:1-5392:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">- a</span> +<span id="LC2" class="line" lang="plaintext"> > b</span> +<span id="LC3" class="line" lang="plaintext"> ```</span> +<span id="LC4" class="line" lang="plaintext"> c</span> +<span id="LC5" class="line" lang="plaintext"> ```</span> +<span id="LC6" class="line" lang="plaintext">- d</span> +<span id="LC7" class="line" lang="plaintext">.</span> +<span id="LC8" class="line" lang="plaintext"><ul></span> +<span id="LC9" class="line" lang="plaintext"><li>a</span> +<span id="LC10" class="line" lang="plaintext"><blockquote></span> +<span id="LC11" class="line" lang="plaintext"><p>b</p></span> +<span id="LC12" class="line" lang="plaintext"></blockquote></span> +<span id="LC13" class="line" lang="plaintext"><pre><code>c</span> +<span id="LC14" class="line" lang="plaintext"></code></pre></span> +<span id="LC15" class="line" lang="plaintext"></li></span> +<span id="LC16" class="line" lang="plaintext"><li>d</li></span> +<span id="LC17" class="line" lang="plaintext"></ul></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="5395:1-5395:33" dir="auto">A single-paragraph list is tight:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="5397:1-5403:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">- a</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><ul></span> +<span id="LC4" class="line" lang="plaintext"><li>a</li></span> +<span id="LC5" class="line" lang="plaintext"></ul></span></code></pre> +<copy-code></copy-code> +</div> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="5406:1-5417:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">- a</span> +<span id="LC2" class="line" lang="plaintext"> - b</span> +<span id="LC3" class="line" lang="plaintext">.</span> +<span id="LC4" class="line" lang="plaintext"><ul></span> +<span id="LC5" class="line" lang="plaintext"><li>a</span> +<span id="LC6" class="line" lang="plaintext"><ul></span> +<span id="LC7" class="line" lang="plaintext"><li>b</li></span> +<span id="LC8" class="line" lang="plaintext"></ul></span> +<span id="LC9" class="line" lang="plaintext"></li></span> +<span id="LC10" class="line" lang="plaintext"></ul></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="5420:1-5421:36" dir="auto">This list is loose, because of the blank line between the +two block elements in the list item:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="5423:1-5437:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">1. ```</span> +<span id="LC2" class="line" lang="plaintext"> foo</span> +<span id="LC3" class="line" lang="plaintext"> ```</span> +<span id="LC4" class="line" lang="plaintext"></span> +<span id="LC5" class="line" lang="plaintext"> bar</span> +<span id="LC6" class="line" lang="plaintext">.</span> +<span id="LC7" class="line" lang="plaintext"><ol></span> +<span id="LC8" class="line" lang="plaintext"><li></span> +<span id="LC9" class="line" lang="plaintext"><pre><code>foo</span> +<span id="LC10" class="line" lang="plaintext"></code></pre></span> +<span id="LC11" class="line" lang="plaintext"><p>bar</p></span> +<span id="LC12" class="line" lang="plaintext"></li></span> +<span id="LC13" class="line" lang="plaintext"></ol></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="5440:1-5440:51" dir="auto">Here the outer list is loose, the inner list tight:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="5442:1-5457:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">* foo</span> +<span id="LC2" class="line" lang="plaintext"> * bar</span> +<span id="LC3" class="line" lang="plaintext"></span> +<span id="LC4" class="line" lang="plaintext"> baz</span> +<span id="LC5" class="line" lang="plaintext">.</span> +<span id="LC6" class="line" lang="plaintext"><ul></span> +<span id="LC7" class="line" lang="plaintext"><li></span> +<span id="LC8" class="line" lang="plaintext"><p>foo</p></span> +<span id="LC9" class="line" lang="plaintext"><ul></span> +<span id="LC10" class="line" lang="plaintext"><li>bar</li></span> +<span id="LC11" class="line" lang="plaintext"></ul></span> +<span id="LC12" class="line" lang="plaintext"><p>baz</p></span> +<span id="LC13" class="line" lang="plaintext"></li></span> +<span id="LC14" class="line" lang="plaintext"></ul></span></code></pre> +<copy-code></copy-code> +</div> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="5460:1-5485:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">- a</span> +<span id="LC2" class="line" lang="plaintext"> - b</span> +<span id="LC3" class="line" lang="plaintext"> - c</span> +<span id="LC4" class="line" lang="plaintext"></span> +<span id="LC5" class="line" lang="plaintext">- d</span> +<span id="LC6" class="line" lang="plaintext"> - e</span> +<span id="LC7" class="line" lang="plaintext"> - f</span> +<span id="LC8" class="line" lang="plaintext">.</span> +<span id="LC9" class="line" lang="plaintext"><ul></span> +<span id="LC10" class="line" lang="plaintext"><li></span> +<span id="LC11" class="line" lang="plaintext"><p>a</p></span> +<span id="LC12" class="line" lang="plaintext"><ul></span> +<span id="LC13" class="line" lang="plaintext"><li>b</li></span> +<span id="LC14" class="line" lang="plaintext"><li>c</li></span> +<span id="LC15" class="line" lang="plaintext"></ul></span> +<span id="LC16" class="line" lang="plaintext"></li></span> +<span id="LC17" class="line" lang="plaintext"><li></span> +<span id="LC18" class="line" lang="plaintext"><p>d</p></span> +<span id="LC19" class="line" lang="plaintext"><ul></span> +<span id="LC20" class="line" lang="plaintext"><li>e</li></span> +<span id="LC21" class="line" lang="plaintext"><li>f</li></span> +<span id="LC22" class="line" lang="plaintext"></ul></span> +<span id="LC23" class="line" lang="plaintext"></li></span> +<span id="LC24" class="line" lang="plaintext"></ul></span></code></pre> +<copy-code></copy-code> +</div> +<h1 data-sourcepos="5488:1-5488:9" dir="auto"> +<a id="user-content-inlines" class="anchor" href="#inlines" aria-hidden="true"></a>Inlines</h1> +<p data-sourcepos="5490:1-5492:21" dir="auto">Inlines are parsed sequentially from the beginning of the character +stream to the end (left to right, in left-to-right languages). +Thus, for example, in</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="5494:1-5498:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">`hi`lo`</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p><code>hi</code>lo`</p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="5500:1-5501:9" dir="auto"><code>hi</code> is parsed as code, leaving the backtick at the end as a literal +backtick.</p> +<h2 data-sourcepos="5504:1-5504:20" dir="auto"> +<a id="user-content-backslash-escapes" class="anchor" href="#backslash-escapes" aria-hidden="true"></a>Backslash escapes</h2> +<p data-sourcepos="5506:1-5506:57" dir="auto">Any ASCII punctuation character may be backslash-escaped:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="5508:1-5512:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">\!\"\#\$\%\&\'\(\)\*\+\,\-\.\/\:\;\<\=\>\?\@\[\\\]\^\_\`\{\|\}\~</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p>!&quot;#$%&amp;'()*+,-./:;&lt;=&gt;?@[\]^_`{|}~</p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="5515:1-5516:12" dir="auto">Backslashes before other characters are treated as literal +backslashes:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="5518:1-5522:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">\→\A\a\ \3\φ\«</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p>\→\A\a\ \3\φ\«</p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="5525:1-5526:39" dir="auto">Escaped characters are treated as regular characters and do +not have their usual Markdown meanings:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="5528:1-5548:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">\*not emphasized*</span> +<span id="LC2" class="line" lang="plaintext">\<br/> not a tag</span> +<span id="LC3" class="line" lang="plaintext">\[not a link](/foo)</span> +<span id="LC4" class="line" lang="plaintext">\`not code`</span> +<span id="LC5" class="line" lang="plaintext">1\. not a list</span> +<span id="LC6" class="line" lang="plaintext">\* not a list</span> +<span id="LC7" class="line" lang="plaintext">\# not a heading</span> +<span id="LC8" class="line" lang="plaintext">\[foo]: /url "not a reference"</span> +<span id="LC9" class="line" lang="plaintext">\&ouml; not a character entity</span> +<span id="LC10" class="line" lang="plaintext">.</span> +<span id="LC11" class="line" lang="plaintext"><p>*not emphasized*</span> +<span id="LC12" class="line" lang="plaintext">&lt;br/&gt; not a tag</span> +<span id="LC13" class="line" lang="plaintext">[not a link](/foo)</span> +<span id="LC14" class="line" lang="plaintext">`not code`</span> +<span id="LC15" class="line" lang="plaintext">1. not a list</span> +<span id="LC16" class="line" lang="plaintext">* not a list</span> +<span id="LC17" class="line" lang="plaintext"># not a heading</span> +<span id="LC18" class="line" lang="plaintext">[foo]: /url &quot;not a reference&quot;</span> +<span id="LC19" class="line" lang="plaintext">&amp;ouml; not a character entity</p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="5551:1-5551:65" dir="auto">If a backslash is itself escaped, the following character is not:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="5553:1-5557:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">\\*emphasis*</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p>\<em>emphasis</em></p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="5560:1-5560:58" dir="auto">A backslash at the end of the line is a [hard line break]:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="5562:1-5568:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">foo\</span> +<span id="LC2" class="line" lang="plaintext">bar</span> +<span id="LC3" class="line" lang="plaintext">.</span> +<span id="LC4" class="line" lang="plaintext"><p>foo<br /></span> +<span id="LC5" class="line" lang="plaintext">bar</p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="5571:1-5572:9" dir="auto">Backslash escapes do not work in code blocks, code spans, autolinks, or +raw HTML:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="5574:1-5578:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">`` \[\` ``</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p><code>\[\`</code></p></span></code></pre> +<copy-code></copy-code> +</div> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="5581:1-5586:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext"> \[\]</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><pre><code>\[\]</span> +<span id="LC4" class="line" lang="plaintext"></code></pre></span></code></pre> +<copy-code></copy-code> +</div> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="5589:1-5596:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">~~~</span> +<span id="LC2" class="line" lang="plaintext">\[\]</span> +<span id="LC3" class="line" lang="plaintext">~~~</span> +<span id="LC4" class="line" lang="plaintext">.</span> +<span id="LC5" class="line" lang="plaintext"><pre><code>\[\]</span> +<span id="LC6" class="line" lang="plaintext"></code></pre></span></code></pre> +<copy-code></copy-code> +</div> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="5599:1-5603:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext"><http://example.com?find=\*></span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p><a href="http://example.com?find=%5C*">http://example.com?find=\*</a></p></span></code></pre> +<copy-code></copy-code> +</div> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="5606:1-5610:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext"><a href="/bar\/)"></span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><a href="/bar\/)"></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="5613:1-5614:60" dir="auto">But they work in all other contexts, including URLs and link titles, +link references, and [info strings] in [fenced code blocks]:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="5616:1-5620:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">[foo](/bar\* "ti\*tle")</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p><a href="/bar*" title="ti*tle">foo</a></p></span></code></pre> +<copy-code></copy-code> +</div> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="5623:1-5629:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">[foo]</span> +<span id="LC2" class="line" lang="plaintext"></span> +<span id="LC3" class="line" lang="plaintext">[foo]: /bar\* "ti\*tle"</span> +<span id="LC4" class="line" lang="plaintext">.</span> +<span id="LC5" class="line" lang="plaintext"><p><a href="/bar*" title="ti*tle">foo</a></p></span></code></pre> +<copy-code></copy-code> +</div> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="5632:1-5639:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">``` foo\+bar</span> +<span id="LC2" class="line" lang="plaintext">foo</span> +<span id="LC3" class="line" lang="plaintext">```</span> +<span id="LC4" class="line" lang="plaintext">.</span> +<span id="LC5" class="line" lang="plaintext"><pre><code class="language-foo+bar">foo</span> +<span id="LC6" class="line" lang="plaintext"></code></pre></span></code></pre> +<copy-code></copy-code> +</div> +<h2 data-sourcepos="5643:1-5643:42" dir="auto"> +<a id="user-content-entity-and-numeric-character-references" class="anchor" href="#entity-and-numeric-character-references" aria-hidden="true"></a>Entity and numeric character references</h2> +<p data-sourcepos="5645:1-5647:30" dir="auto">Valid HTML entity references and numeric character references +can be used in place of the corresponding Unicode character, +with the following exceptions:</p> +<ul data-sourcepos="5649:1-5658:0" dir="auto"> +<li data-sourcepos="5649:1-5651:0"> +<p data-sourcepos="5649:3-5650:24">Entity and character references are not recognized in code +blocks and code spans.</p> +</li> +<li data-sourcepos="5652:1-5658:0"> +<p data-sourcepos="5652:3-5657:9">Entity and character references cannot stand in place of +special characters that define structural elements in +CommonMark. For example, although <code>&#42;</code> can be used +in place of a literal <code>*</code> character, <code>&#42;</code> cannot replace +<code>*</code> in emphasis delimiters, bullet list markers, or thematic +breaks.</p> +</li> +</ul> +<p data-sourcepos="5659:1-5661:49" dir="auto">Conforming CommonMark parsers need not store information about +whether a particular character was represented in the source +using a Unicode character or an entity reference.</p> +<p data-sourcepos="5663:1-5667:47" dir="auto"><a href="@">Entity references</a> consist of <code>&</code> + any of the valid +HTML5 entity names + <code>;</code>. The +document <a href="https://html.spec.whatwg.org/multipage/entities.json" rel="nofollow noreferrer noopener" target="_blank">https://html.spec.whatwg.org/multipage/entities.json</a> +is used as an authoritative source for the valid entity +references and their corresponding code points.</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="5669:1-5677:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">&nbsp; &amp; &copy; &AElig; &Dcaron;</span> +<span id="LC2" class="line" lang="plaintext">&frac34; &HilbertSpace; &DifferentialD;</span> +<span id="LC3" class="line" lang="plaintext">&ClockwiseContourIntegral; &ngE;</span> +<span id="LC4" class="line" lang="plaintext">.</span> +<span id="LC5" class="line" lang="plaintext"><p> &amp; © Æ Ď</span> +<span id="LC6" class="line" lang="plaintext">¾ ℋ ⅆ</span> +<span id="LC7" class="line" lang="plaintext">∲ ≧̸</p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="5680:1-5686:58" dir="auto"><a href="@">Decimal numeric character +references</a> +consist of <code>&#</code> + a string of 1--7 arabic digits + <code>;</code>. A +numeric character reference is parsed as the corresponding +Unicode character. Invalid Unicode code points will be replaced by +the REPLACEMENT CHARACTER (<code>U+FFFD</code>). For security reasons, +the code point <code>U+0000</code> will also be replaced by <code>U+FFFD</code>.</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="5688:1-5692:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">&#35; &#1234; &#992; &#0;</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p># Ӓ Ϡ �</p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="5695:1-5699:62" dir="auto"><a href="@">Hexadecimal numeric character +references</a> consist of <code>&#</code> + +either <code>X</code> or <code>x</code> + a string of 1-6 hexadecimal digits + <code>;</code>. +They too are parsed as the corresponding Unicode character (this +time specified with a hexadecimal numeral instead of decimal).</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="5701:1-5705:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">&#X22; &#XD06; &#xcab;</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p>&quot; ആ ಫ</p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="5708:1-5708:26" dir="auto">Here are some nonentities:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="5710:1-5720:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">&nbsp &x; &#; &#x;</span> +<span id="LC2" class="line" lang="plaintext">&#987654321;</span> +<span id="LC3" class="line" lang="plaintext">&#abcdef0;</span> +<span id="LC4" class="line" lang="plaintext">&ThisIsNotDefined; &hi?;</span> +<span id="LC5" class="line" lang="plaintext">.</span> +<span id="LC6" class="line" lang="plaintext"><p>&amp;nbsp &amp;x; &amp;#; &amp;#x;</span> +<span id="LC7" class="line" lang="plaintext">&amp;#987654321;</span> +<span id="LC8" class="line" lang="plaintext">&amp;#abcdef0;</span> +<span id="LC9" class="line" lang="plaintext">&amp;ThisIsNotDefined; &amp;hi?;</p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="5723:1-5725:60" dir="auto">Although HTML5 does accept some entity references +without a trailing semicolon (such as <code>&copy</code>), these are not +recognized here, because it makes the grammar too ambiguous:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="5727:1-5731:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">&copy</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p>&amp;copy</p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="5734:1-5735:39" dir="auto">Strings that are not on the list of HTML5 named entities are not +recognized as entity references either:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="5737:1-5741:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">&MadeUpEntity;</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p>&amp;MadeUpEntity;</p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="5744:1-5746:62" dir="auto">Entity and numeric character references are recognized in any +context besides code spans or code blocks, including +URLs, [link titles], and [fenced code block][] [info strings]:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="5748:1-5752:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext"><a href="&ouml;&ouml;.html"></span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><a href="&ouml;&ouml;.html"></span></code></pre> +<copy-code></copy-code> +</div> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="5755:1-5759:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">[foo](/f&ouml;&ouml; "f&ouml;&ouml;")</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p><a href="/f%C3%B6%C3%B6" title="föö">foo</a></p></span></code></pre> +<copy-code></copy-code> +</div> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="5762:1-5768:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">[foo]</span> +<span id="LC2" class="line" lang="plaintext"></span> +<span id="LC3" class="line" lang="plaintext">[foo]: /f&ouml;&ouml; "f&ouml;&ouml;"</span> +<span id="LC4" class="line" lang="plaintext">.</span> +<span id="LC5" class="line" lang="plaintext"><p><a href="/f%C3%B6%C3%B6" title="föö">foo</a></p></span></code></pre> +<copy-code></copy-code> +</div> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="5771:1-5778:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">``` f&ouml;&ouml;</span> +<span id="LC2" class="line" lang="plaintext">foo</span> +<span id="LC3" class="line" lang="plaintext">```</span> +<span id="LC4" class="line" lang="plaintext">.</span> +<span id="LC5" class="line" lang="plaintext"><pre><code class="language-föö">foo</span> +<span id="LC6" class="line" lang="plaintext"></code></pre></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="5781:1-5782:35" dir="auto">Entity and numeric character references are treated as literal +text in code spans and code blocks:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="5784:1-5788:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">`f&ouml;&ouml;`</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p><code>f&amp;ouml;&amp;ouml;</code></p></span></code></pre> +<copy-code></copy-code> +</div> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="5791:1-5796:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext"> f&ouml;f&ouml;</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><pre><code>f&amp;ouml;f&amp;ouml;</span> +<span id="LC4" class="line" lang="plaintext"></code></pre></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="5799:1-5801:10" dir="auto">Entity and numeric character references cannot be used +in place of symbols indicating structure in CommonMark +documents.</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="5803:1-5809:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">&#42;foo&#42;</span> +<span id="LC2" class="line" lang="plaintext">*foo*</span> +<span id="LC3" class="line" lang="plaintext">.</span> +<span id="LC4" class="line" lang="plaintext"><p>*foo*</span> +<span id="LC5" class="line" lang="plaintext"><em>foo</em></p></span></code></pre> +<copy-code></copy-code> +</div> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="5811:1-5820:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">&#42; foo</span> +<span id="LC2" class="line" lang="plaintext"></span> +<span id="LC3" class="line" lang="plaintext">* foo</span> +<span id="LC4" class="line" lang="plaintext">.</span> +<span id="LC5" class="line" lang="plaintext"><p>* foo</p></span> +<span id="LC6" class="line" lang="plaintext"><ul></span> +<span id="LC7" class="line" lang="plaintext"><li>foo</li></span> +<span id="LC8" class="line" lang="plaintext"></ul></span></code></pre> +<copy-code></copy-code> +</div> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="5822:1-5828:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">foo&#10;&#10;bar</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p>foo</span> +<span id="LC4" class="line" lang="plaintext"></span> +<span id="LC5" class="line" lang="plaintext">bar</p></span></code></pre> +<copy-code></copy-code> +</div> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="5830:1-5834:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">&#9;foo</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p>→foo</p></span></code></pre> +<copy-code></copy-code> +</div> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="5837:1-5841:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">[a](url &quot;tit&quot;)</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p>[a](url &quot;tit&quot;)</p></span></code></pre> +<copy-code></copy-code> +</div> +<h2 data-sourcepos="5844:1-5844:13" dir="auto"> +<a id="user-content-code-spans" class="anchor" href="#code-spans" aria-hidden="true"></a>Code spans</h2> +<p data-sourcepos="5846:1-5848:36" dir="auto">A <a href="@">backtick string</a> +is a string of one or more backtick characters (<code>`</code>) that is neither +preceded nor followed by a backtick.</p> +<p data-sourcepos="5850:1-5853:15" dir="auto">A <a href="@">code span</a> begins with a backtick string and ends with +a backtick string of equal length. The contents of the code span are +the characters between the two backtick strings, normalized in the +following ways:</p> +<ul data-sourcepos="5855:1-5862:0" dir="auto"> +<li data-sourcepos="5855:1-5855:50">First, [line endings] are converted to [spaces].</li> +<li data-sourcepos="5856:1-5862:0">If the resulting string both begins <em>and</em> ends with a [space] +character, but does not consist entirely of [space] +characters, a single [space] character is removed from the +front and back. This allows you to include code that begins +or ends with backtick characters, which must be separated by +whitespace from the opening or closing backtick strings.</li> +</ul> +<p data-sourcepos="5863:1-5863:27" dir="auto">This is a simple code span:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="5865:1-5869:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">`foo`</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p><code>foo</code></p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="5872:1-5874:15" dir="auto">Here two backticks are used, because the code contains a backtick. +This example also illustrates stripping of a single leading and +trailing space:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="5876:1-5880:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">`` foo ` bar ``</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p><code>foo ` bar</code></p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="5883:1-5884:7" dir="auto">This example shows the motivation for stripping leading and trailing +spaces:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="5886:1-5890:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">` `` `</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p><code>``</code></p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="5892:1-5892:39" dir="auto">Note that only <em>one</em> space is stripped:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="5894:1-5898:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">` `` `</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p><code> `` </code></p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="5900:1-5901:20" dir="auto">The stripping only happens if the space is on both +sides of the string:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="5903:1-5907:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">` a`</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p><code> a</code></p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="5909:1-5910:21" dir="auto">Only [spaces], and not [unicode whitespace] in general, are +stripped in this way:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="5912:1-5916:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">` b `</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p><code> b </code></p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="5918:1-5918:58" dir="auto">No stripping occurs if the code span contains only spaces:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="5920:1-5926:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">` `</span> +<span id="LC2" class="line" lang="plaintext">` `</span> +<span id="LC3" class="line" lang="plaintext">.</span> +<span id="LC4" class="line" lang="plaintext"><p><code> </code></span> +<span id="LC5" class="line" lang="plaintext"><code> </code></p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="5929:1-5929:39" dir="auto">[Line endings] are treated like spaces:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="5931:1-5939:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">``</span> +<span id="LC2" class="line" lang="plaintext">foo</span> +<span id="LC3" class="line" lang="plaintext">bar </span> +<span id="LC4" class="line" lang="plaintext">baz</span> +<span id="LC5" class="line" lang="plaintext">``</span> +<span id="LC6" class="line" lang="plaintext">.</span> +<span id="LC7" class="line" lang="plaintext"><p><code>foo bar baz</code></p></span></code></pre> +<copy-code></copy-code> +</div> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="5941:1-5947:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">``</span> +<span id="LC2" class="line" lang="plaintext">foo </span> +<span id="LC3" class="line" lang="plaintext">``</span> +<span id="LC4" class="line" lang="plaintext">.</span> +<span id="LC5" class="line" lang="plaintext"><p><code>foo </code></p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="5950:1-5950:34" dir="auto">Interior spaces are not collapsed:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="5952:1-5957:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">`foo bar </span> +<span id="LC2" class="line" lang="plaintext">baz`</span> +<span id="LC3" class="line" lang="plaintext">.</span> +<span id="LC4" class="line" lang="plaintext"><p><code>foo bar baz</code></p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="5959:1-5961:26" dir="auto">Note that browsers will typically collapse consecutive spaces +when rendering <code><code></code> elements, so it is recommended that +the following CSS be used:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="5963:5-5965:0" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">code{white-space: pre-wrap;}</span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="5966:1-5967:22" dir="auto">Note that backslash escapes do not work in code spans. All backslashes +are treated literally:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="5969:1-5973:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">`foo\`bar`</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p><code>foo\</code>bar`</p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="5976:1-5978:59" dir="auto">Backslash escapes are never needed, because one can always choose a +string of <em>n</em> backtick characters as delimiters, where the code does +not contain any strings of exactly <em>n</em> backtick characters.</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="5980:1-5984:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">``foo`bar``</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p><code>foo`bar</code></p></span></code></pre> +<copy-code></copy-code> +</div> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="5986:1-5990:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">` foo `` bar `</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p><code>foo `` bar</code></p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="5993:1-5996:5" dir="auto">Code span backticks have higher precedence than any other inline +constructs except HTML tags and autolinks. Thus, for example, this is +not parsed as emphasized text, since the second <code>*</code> is part of a code +span:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="5998:1-6002:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">*foo`*`</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p>*foo<code>*</code></p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="6005:1-6005:33" dir="auto">And this is not parsed as a link:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="6007:1-6011:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">[not a `link](/foo`)</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p>[not a <code>link](/foo</code>)</p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="6014:1-6015:19" dir="auto">Code spans, HTML tags, and autolinks have the same precedence. +Thus, this is code:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="6017:1-6021:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">`<a href="`">`</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p><code>&lt;a href=&quot;</code>&quot;&gt;`</p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="6024:1-6024:24" dir="auto">But this is an HTML tag:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="6026:1-6030:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext"><a href="`">`</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p><a href="`">`</p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="6033:1-6033:17" dir="auto">And this is code:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="6035:1-6039:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">`<http://foo.bar.`baz>`</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p><code>&lt;http://foo.bar.</code>baz&gt;`</p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="6042:1-6042:24" dir="auto">But this is an autolink:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="6044:1-6048:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext"><http://foo.bar.`baz>`</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p><a href="http://foo.bar.%60baz">http://foo.bar.`baz</a>`</p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="6051:1-6052:31" dir="auto">When a backtick string is not closed by a matching backtick string, +we just have literal backticks:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="6054:1-6058:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">```foo``</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p>```foo``</p></span></code></pre> +<copy-code></copy-code> +</div> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="6061:1-6065:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">`foo</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p>`foo</p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="6067:1-6068:47" dir="auto">The following case also illustrates the need for opening and +closing backtick strings to be equal in length:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="6070:1-6074:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">`foo``bar``</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p>`foo<code>bar</code></p></span></code></pre> +<copy-code></copy-code> +</div> +<h2 data-sourcepos="6077:1-6077:31" dir="auto"> +<a id="user-content-emphasis-and-strong-emphasis" class="anchor" href="#emphasis-and-strong-emphasis" aria-hidden="true"></a>Emphasis and strong emphasis</h2> +<p data-sourcepos="6079:1-6080:73" dir="auto">John Gruber's original <a href="http://daringfireball.net/projects/markdown/syntax#em" rel="nofollow noreferrer noopener" target="_blank">Markdown syntax +description</a> says:</p> +<blockquote data-sourcepos="6082:1-6085:6" dir="auto"> +<p data-sourcepos="6082:3-6085:6">Markdown treats asterisks (<code>*</code>) and underscores (<code>_</code>) as indicators of +emphasis. Text wrapped with one <code>*</code> or <code>_</code> will be wrapped with an HTML +<code><em></code> tag; double <code>*</code>'s or <code>_</code>'s will be wrapped with an HTML <code><strong></code> +tag.</p> +</blockquote> +<p data-sourcepos="6087:1-6091:57" dir="auto">This is enough for most users, but these rules leave much undecided, +especially when it comes to nested emphasis. The original +<code>Markdown.pl</code> test suite makes it clear that triple <code>***</code> and +<code>___</code> delimiters can be used for strong emphasis, and most +implementations have also allowed the following patterns:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="6093:1-6099:3" class="code highlight js-syntax-highlight language-markdown" lang="markdown" v-pre="true"><code><span id="LC1" class="line" lang="markdown"><span class="gs">***strong emph**</span><span class="err">*</span></span> +<span id="LC2" class="line" lang="markdown"><span class="gs">***strong**</span> in emph<span class="err">*</span></span> +<span id="LC3" class="line" lang="markdown"><span class="gs">***emph* in strong**</span></span> +<span id="LC4" class="line" lang="markdown"><span class="gs">**in strong *emph**</span><span class="err">*</span></span> +<span id="LC5" class="line" lang="markdown"><span class="ge">*in emph **strong***</span></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="6101:1-6103:9" dir="auto">The following patterns are less widely supported, but the intent +is clear and they are useful (especially in contexts like bibliography +entries):</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="6105:1-6108:3" class="code highlight js-syntax-highlight language-markdown" lang="markdown" v-pre="true"><code><span id="LC1" class="line" lang="markdown"><span class="ge">*emph *</span>with emph<span class="ge">* in it*</span></span> +<span id="LC2" class="line" lang="markdown"><span class="gs">**strong **</span>with strong<span class="gs">** in it**</span></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="6110:1-6113:31" dir="auto">Many implementations have also restricted intraword emphasis to +the <code>*</code> forms, to avoid unwanted emphasis in words containing +internal underscores. (It is best practice to put these in code +spans, but users often do not.)</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="6115:1-6118:3" class="code highlight js-syntax-highlight language-markdown" lang="markdown" v-pre="true"><code><span id="LC1" class="line" lang="markdown">internal emphasis: foo<span class="ge">*bar*</span>baz</span> +<span id="LC2" class="line" lang="markdown">no emphasis: foo_bar_baz</span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="6120:1-6121:55" dir="auto">The rules given below capture all of these patterns, while allowing +for efficient parsing strategies that do not backtrack.</p> +<p data-sourcepos="6123:1-6127:38" dir="auto">First, some definitions. A <a href="@">delimiter run</a> is either +a sequence of one or more <code>*</code> characters that is not preceded or +followed by a non-backslash-escaped <code>*</code> character, or a sequence +of one or more <code>_</code> characters that is not preceded or followed by +a non-backslash-escaped <code>_</code> character.</p> +<p data-sourcepos="6129:1-6135:37" dir="auto">A <a href="@">left-flanking delimiter run</a> is +a [delimiter run] that is (1) not followed by [Unicode whitespace], +and either (2a) not followed by a [punctuation character], or +(2b) followed by a [punctuation character] and +preceded by [Unicode whitespace] or a [punctuation character]. +For purposes of this definition, the beginning and the end of +the line count as Unicode whitespace.</p> +<p data-sourcepos="6137:1-6143:37" dir="auto">A <a href="@">right-flanking delimiter run</a> is +a [delimiter run] that is (1) not preceded by [Unicode whitespace], +and either (2a) not preceded by a [punctuation character], or +(2b) preceded by a [punctuation character] and +followed by [Unicode whitespace] or a [punctuation character]. +For purposes of this definition, the beginning and the end of +the line count as Unicode whitespace.</p> +<p data-sourcepos="6145:1-6145:41" dir="auto">Here are some examples of delimiter runs.</p> +<ul data-sourcepos="6147:3-6178:0" dir="auto"> +<li data-sourcepos="6147:3-6155:0"> +<p data-sourcepos="6147:5-6147:41">left-flanking but not right-flanking:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="6149:5-6154:7" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">***abc</span> +<span id="LC2" class="line" lang="plaintext"> _abc</span> +<span id="LC3" class="line" lang="plaintext">**"abc"</span> +<span id="LC4" class="line" lang="plaintext"> _"abc"</span></code></pre> +<copy-code></copy-code> +</div> +</li> +<li data-sourcepos="6156:3-6164:0"> +<p data-sourcepos="6156:5-6156:41">right-flanking but not left-flanking:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="6158:5-6163:7" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="" v-pre="true"><code><span id="LC1" class="line" lang="plaintext"> abc***</span> +<span id="LC2" class="line" lang="plaintext"> abc_</span> +<span id="LC3" class="line" lang="plaintext">"abc"**</span> +<span id="LC4" class="line" lang="plaintext">"abc"_</span></code></pre> +<copy-code></copy-code> +</div> +</li> +<li data-sourcepos="6165:3-6171:0"> +<p data-sourcepos="6165:5-6165:33">Both left and right-flanking:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="6167:5-6170:7" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="" v-pre="true"><code><span id="LC1" class="line" lang="plaintext"> abc***def</span> +<span id="LC2" class="line" lang="plaintext">"abc"_"def"</span></code></pre> +<copy-code></copy-code> +</div> +</li> +<li data-sourcepos="6172:3-6178:0"> +<p data-sourcepos="6172:5-6172:36">Neither left nor right-flanking:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="6174:5-6177:7" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">abc *** def</span> +<span id="LC2" class="line" lang="plaintext">a _ b</span></code></pre> +<copy-code></copy-code> +</div> +</li> +</ul> +<p data-sourcepos="6179:1-6185:49" dir="auto">(The idea of distinguishing left-flanking and right-flanking +delimiter runs based on the character before and the character +after comes from Roopesh Chander's +<a href="http://www.vfmd.org/vfmd-spec/specification/#procedure-for-identifying-emphasis-tags" rel="nofollow noreferrer noopener" target="_blank">vfmd</a>. +vfmd uses the terminology "emphasis indicator string" instead of "delimiter +run," and its rules for distinguishing left- and right-flanking runs +are a bit more complex than the ones given here.)</p> +<p data-sourcepos="6187:1-6187:56" dir="auto">The following rules define emphasis and strong emphasis:</p> +<ol data-sourcepos="6189:1-6253:0" dir="auto"> +<li data-sourcepos="6189:1-6191:0"> +<p data-sourcepos="6189:5-6190:71">A single <code>*</code> character <a href="@">can open emphasis</a> +iff (if and only if) it is part of a [left-flanking delimiter run].</p> +</li> +<li data-sourcepos="6192:1-6197:0"> +<p data-sourcepos="6192:5-6196:28">A single <code>_</code> character [can open emphasis] iff +it is part of a [left-flanking delimiter run] +and either (a) not part of a [right-flanking delimiter run] +or (b) part of a [right-flanking delimiter run] +preceded by punctuation.</p> +</li> +<li data-sourcepos="6198:1-6200:0"> +<p data-sourcepos="6198:5-6199:55">A single <code>*</code> character <a href="@">can close emphasis</a> +iff it is part of a [right-flanking delimiter run].</p> +</li> +<li data-sourcepos="6201:1-6206:0"> +<p data-sourcepos="6201:5-6205:28">A single <code>_</code> character [can close emphasis] iff +it is part of a [right-flanking delimiter run] +and either (a) not part of a [left-flanking delimiter run] +or (b) part of a [left-flanking delimiter run] +followed by punctuation.</p> +</li> +<li data-sourcepos="6207:1-6209:0"> +<p data-sourcepos="6207:5-6208:54">A double <code>**</code> <a href="@">can open strong emphasis</a> +iff it is part of a [left-flanking delimiter run].</p> +</li> +<li data-sourcepos="6210:1-6215:0"> +<p data-sourcepos="6210:5-6214:28">A double <code>__</code> [can open strong emphasis] iff +it is part of a [left-flanking delimiter run] +and either (a) not part of a [right-flanking delimiter run] +or (b) part of a [right-flanking delimiter run] +preceded by punctuation.</p> +</li> +<li data-sourcepos="6216:1-6218:0"> +<p data-sourcepos="6216:5-6217:55">A double <code>**</code> <a href="@">can close strong emphasis</a> +iff it is part of a [right-flanking delimiter run].</p> +</li> +<li data-sourcepos="6219:1-6224:0"> +<p data-sourcepos="6219:5-6223:28">A double <code>__</code> [can close strong emphasis] iff +it is part of a [right-flanking delimiter run] +and either (a) not part of a [left-flanking delimiter run] +or (b) part of a [left-flanking delimiter run] +followed by punctuation.</p> +</li> +<li data-sourcepos="6225:1-6234:0"> +<p data-sourcepos="6225:5-6233:19">Emphasis begins with a delimiter that [can open emphasis] and ends +with a delimiter that [can close emphasis], and that uses the same +character (<code>_</code> or <code>*</code>) as the opening delimiter. The +opening and closing delimiters must belong to separate +[delimiter runs]. If one of the delimiters can both +open and close emphasis, then the sum of the lengths of the +delimiter runs containing the opening and closing delimiters +must not be a multiple of 3 unless both lengths are +multiples of 3.</p> +</li> +<li data-sourcepos="6235:1-6245:0"> +<p data-sourcepos="6235:5-6244:23">Strong emphasis begins with a delimiter that +[can open strong emphasis] and ends with a delimiter that +[can close strong emphasis], and that uses the same character +(<code>_</code> or <code>*</code>) as the opening delimiter. The +opening and closing delimiters must belong to separate +[delimiter runs]. If one of the delimiters can both open +and close strong emphasis, then the sum of the lengths of +the delimiter runs containing the opening and closing +delimiters must not be a multiple of 3 unless both lengths +are multiples of 3.</p> +</li> +<li data-sourcepos="6246:1-6249:0"> +<p data-sourcepos="6246:5-6248:25">A literal <code>*</code> character cannot occur at the beginning or end of +<code>*</code>-delimited emphasis or <code>**</code>-delimited strong emphasis, unless it +is backslash-escaped.</p> +</li> +<li data-sourcepos="6250:1-6253:0"> +<p data-sourcepos="6250:5-6252:25">A literal <code>_</code> character cannot occur at the beginning or end of +<code>_</code>-delimited emphasis or <code>__</code>-delimited strong emphasis, unless it +is backslash-escaped.</p> +</li> +</ol> +<p data-sourcepos="6254:1-6255:43" dir="auto">Where rules 1--12 above are compatible with multiple parsings, +the following principles resolve ambiguity:</p> +<ol start="13" data-sourcepos="6257:1-6282:0" dir="auto"> +<li data-sourcepos="6257:1-6260:0"> +<p data-sourcepos="6257:5-6259:28">The number of nestings should be minimized. Thus, for example, +an interpretation <code><strong>...</strong></code> is always preferred to +<code><em><em>...</em></em></code>.</p> +</li> +<li data-sourcepos="6261:1-6263:0"> +<p data-sourcepos="6261:5-6262:49">An interpretation <code><em><strong>...</strong></em></code> is always +preferred to <code><strong><em>...</em></strong></code>.</p> +</li> +<li data-sourcepos="6264:1-6269:0"> +<p data-sourcepos="6264:5-6268:34">When two potential emphasis or strong emphasis spans overlap, +so that the second begins before the first ends and ends after +the first ends, the first takes precedence. Thus, for example, +<code>*foo _bar* baz_</code> is parsed as <code><em>foo _bar</em> baz_</code> rather +than <code>*foo <em>bar* baz</em></code>.</p> +</li> +<li data-sourcepos="6270:1-6275:0"> +<p data-sourcepos="6270:5-6274:49">When there are two potential emphasis or strong emphasis spans +with the same closing delimiter, the shorter one (the one that +opens later) takes precedence. Thus, for example, +<code>**foo **bar baz**</code> is parsed as <code>**foo <strong>bar baz</strong></code> +rather than <code><strong>foo **bar baz</strong></code>.</p> +</li> +<li data-sourcepos="6276:1-6282:0"> +<p data-sourcepos="6276:5-6281:26">Inline code spans, links, images, and HTML tags group more tightly +than emphasis. So, when there is a choice between an interpretation +that contains one of these elements and one that does not, the +former always wins. Thus, for example, <code>*[foo*](bar)</code> is +parsed as <code>*<a href="bar">foo*</a></code> rather than as +<code><em>[foo</em>](bar)</code>.</p> +</li> +</ol> +<p data-sourcepos="6283:1-6283:60" dir="auto">These rules can be illustrated through a series of examples.</p> +<p data-sourcepos="6285:1-6285:7" dir="auto">Rule 1:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="6287:1-6291:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">*foo bar*</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p><em>foo bar</em></p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="6294:1-6295:66" dir="auto">This is not emphasis, because the opening <code>*</code> is followed by +whitespace, and hence not part of a [left-flanking delimiter run]:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="6297:1-6301:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">a * foo bar*</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p>a * foo bar*</p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="6304:1-6306:44" dir="auto">This is not emphasis, because the opening <code>*</code> is preceded +by an alphanumeric and followed by punctuation, and hence +not part of a [left-flanking delimiter run]:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="6308:1-6312:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">a*"foo"*</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p>a*&quot;foo&quot;*</p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="6315:1-6315:52" dir="auto">Unicode nonbreaking spaces count as whitespace, too:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="6317:1-6321:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">* a *</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p>* a *</p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="6324:1-6324:41" dir="auto">Intraword emphasis with <code>*</code> is permitted:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="6326:1-6330:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">foo*bar*</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p>foo<em>bar</em></p></span></code></pre> +<copy-code></copy-code> +</div> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="6333:1-6337:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">5*6*78</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p>5<em>6</em>78</p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="6340:1-6340:7" dir="auto">Rule 2:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="6342:1-6346:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">_foo bar_</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p><em>foo bar</em></p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="6349:1-6350:11" dir="auto">This is not emphasis, because the opening <code>_</code> is followed by +whitespace:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="6352:1-6356:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">_ foo bar_</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p>_ foo bar_</p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="6359:1-6360:47" dir="auto">This is not emphasis, because the opening <code>_</code> is preceded +by an alphanumeric and followed by punctuation:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="6362:1-6366:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">a_"foo"_</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p>a_&quot;foo&quot;_</p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="6369:1-6369:46" dir="auto">Emphasis with <code>_</code> is not allowed inside words:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="6371:1-6375:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">foo_bar_</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p>foo_bar_</p></span></code></pre> +<copy-code></copy-code> +</div> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="6378:1-6382:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">5_6_78</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p>5_6_78</p></span></code></pre> +<copy-code></copy-code> +</div> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="6385:1-6389:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">пристаням_стремятся_</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p>пристаням_стремятся_</p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="6392:1-6393:47" dir="auto">Here <code>_</code> does not generate emphasis, because the first delimiter run +is right-flanking and the second left-flanking:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="6395:1-6399:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">aa_"bb"_cc</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p>aa_&quot;bb&quot;_cc</p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="6402:1-6404:12" dir="auto">This is emphasis, even though the opening delimiter is +both left- and right-flanking, because it is preceded by +punctuation:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="6406:1-6410:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">foo-_(bar)_</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p>foo-<em>(bar)</em></p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="6413:1-6413:7" dir="auto">Rule 3:</p> +<p data-sourcepos="6415:1-6416:32" dir="auto">This is not emphasis, because the closing delimiter does +not match the opening delimiter:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="6418:1-6422:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">_foo*</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p>_foo*</p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="6425:1-6426:11" dir="auto">This is not emphasis, because the closing <code>*</code> is preceded by +whitespace:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="6428:1-6432:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">*foo bar *</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p>*foo bar *</p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="6435:1-6435:36" dir="auto">A newline also counts as whitespace:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="6437:1-6443:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">*foo bar</span> +<span id="LC2" class="line" lang="plaintext">*</span> +<span id="LC3" class="line" lang="plaintext">.</span> +<span id="LC4" class="line" lang="plaintext"><p>*foo bar</span> +<span id="LC5" class="line" lang="plaintext">*</p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="6446:1-6448:58" dir="auto">This is not emphasis, because the second <code>*</code> is +preceded by punctuation and followed by an alphanumeric +(hence it is not part of a [right-flanking delimiter run]:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="6450:1-6454:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">*(*foo)</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p>*(*foo)</p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="6457:1-6458:18" dir="auto">The point of this restriction is more easily appreciated +with this example:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="6460:1-6464:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">*(*foo*)*</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p><em>(<em>foo</em>)</em></p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="6467:1-6467:39" dir="auto">Intraword emphasis with <code>*</code> is allowed:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="6469:1-6473:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">*foo*bar</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p><em>foo</em>bar</p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="6477:1-6477:7" dir="auto">Rule 4:</p> +<p data-sourcepos="6479:1-6480:11" dir="auto">This is not emphasis, because the closing <code>_</code> is preceded by +whitespace:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="6482:1-6486:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">_foo bar _</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p>_foo bar _</p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="6489:1-6490:56" dir="auto">This is not emphasis, because the second <code>_</code> is +preceded by punctuation and followed by an alphanumeric:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="6492:1-6496:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">_(_foo)</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p>_(_foo)</p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="6499:1-6499:33" dir="auto">This is emphasis within emphasis:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="6501:1-6505:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">_(_foo_)_</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p><em>(<em>foo</em>)</em></p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="6508:1-6508:41" dir="auto">Intraword emphasis is disallowed for <code>_</code>:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="6510:1-6514:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">_foo_bar</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p>_foo_bar</p></span></code></pre> +<copy-code></copy-code> +</div> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="6517:1-6521:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">_пристаням_стремятся</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p>_пристаням_стремятся</p></span></code></pre> +<copy-code></copy-code> +</div> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="6524:1-6528:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">_foo_bar_baz_</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p><em>foo_bar_baz</em></p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="6531:1-6533:12" dir="auto">This is emphasis, even though the closing delimiter is +both left- and right-flanking, because it is followed by +punctuation:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="6535:1-6539:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">_(bar)_.</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p><em>(bar)</em>.</p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="6542:1-6542:7" dir="auto">Rule 5:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="6544:1-6548:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">**foo bar**</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p><strong>foo bar</strong></p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="6551:1-6552:23" dir="auto">This is not strong emphasis, because the opening delimiter is +followed by whitespace:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="6554:1-6558:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">** foo bar**</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p>** foo bar**</p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="6561:1-6563:44" dir="auto">This is not strong emphasis, because the opening <code>**</code> is preceded +by an alphanumeric and followed by punctuation, and hence +not part of a [left-flanking delimiter run]:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="6565:1-6569:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">a**"foo"**</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p>a**&quot;foo&quot;**</p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="6572:1-6572:49" dir="auto">Intraword strong emphasis with <code>**</code> is permitted:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="6574:1-6578:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">foo**bar**</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p>foo<strong>bar</strong></p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="6581:1-6581:7" dir="auto">Rule 6:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="6583:1-6587:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">__foo bar__</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p><strong>foo bar</strong></p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="6590:1-6591:23" dir="auto">This is not strong emphasis, because the opening delimiter is +followed by whitespace:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="6593:1-6597:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">__ foo bar__</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p>__ foo bar__</p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="6600:1-6600:31" dir="auto">A newline counts as whitespace:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="6601:1-6607:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">__</span> +<span id="LC2" class="line" lang="plaintext">foo bar__</span> +<span id="LC3" class="line" lang="plaintext">.</span> +<span id="LC4" class="line" lang="plaintext"><p>__</span> +<span id="LC5" class="line" lang="plaintext">foo bar__</p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="6610:1-6611:47" dir="auto">This is not strong emphasis, because the opening <code>__</code> is preceded +by an alphanumeric and followed by punctuation:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="6613:1-6617:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">a__"foo"__</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p>a__&quot;foo&quot;__</p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="6620:1-6620:49" dir="auto">Intraword strong emphasis is forbidden with <code>__</code>:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="6622:1-6626:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">foo__bar__</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p>foo__bar__</p></span></code></pre> +<copy-code></copy-code> +</div> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="6629:1-6633:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">5__6__78</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p>5__6__78</p></span></code></pre> +<copy-code></copy-code> +</div> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="6636:1-6640:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">пристаням__стремятся__</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p>пристаням__стремятся__</p></span></code></pre> +<copy-code></copy-code> +</div> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="6643:1-6647:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">__foo, __bar__, baz__</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p><strong>foo, <strong>bar</strong>, baz</strong></p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="6650:1-6652:12" dir="auto">This is strong emphasis, even though the opening delimiter is +both left- and right-flanking, because it is preceded by +punctuation:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="6654:1-6658:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">foo-__(bar)__</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p>foo-<strong>(bar)</strong></p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="6662:1-6662:7" dir="auto">Rule 7:</p> +<p data-sourcepos="6664:1-6665:14" dir="auto">This is not strong emphasis, because the closing delimiter is preceded +by whitespace:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="6667:1-6671:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">**foo bar **</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p>**foo bar **</p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="6674:1-6675:9" dir="auto">(Nor can it be interpreted as an emphasized <code>*foo bar *</code>, because of +Rule 11.)</p> +<p data-sourcepos="6677:1-6678:56" dir="auto">This is not strong emphasis, because the second <code>**</code> is +preceded by punctuation and followed by an alphanumeric:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="6680:1-6684:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">**(**foo)</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p>**(**foo)</p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="6687:1-6688:20" dir="auto">The point of this restriction is more easily appreciated +with these examples:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="6690:1-6694:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">*(**foo**)*</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p><em>(<strong>foo</strong>)</em></p></span></code></pre> +<copy-code></copy-code> +</div> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="6697:1-6703:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">**Gomphocarpus (*Gomphocarpus physocarpus*, syn.</span> +<span id="LC2" class="line" lang="plaintext">*Asclepias physocarpa*)**</span> +<span id="LC3" class="line" lang="plaintext">.</span> +<span id="LC4" class="line" lang="plaintext"><p><strong>Gomphocarpus (<em>Gomphocarpus physocarpus</em>, syn.</span> +<span id="LC5" class="line" lang="plaintext"><em>Asclepias physocarpa</em>)</strong></p></span></code></pre> +<copy-code></copy-code> +</div> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="6706:1-6710:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">**foo "*bar*" foo**</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p><strong>foo &quot;<em>bar</em>&quot; foo</strong></p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="6713:1-6713:19" dir="auto">Intraword emphasis:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="6715:1-6719:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">**foo**bar</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p><strong>foo</strong>bar</p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="6722:1-6722:7" dir="auto">Rule 8:</p> +<p data-sourcepos="6724:1-6725:23" dir="auto">This is not strong emphasis, because the closing delimiter is +preceded by whitespace:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="6727:1-6731:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">__foo bar __</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p>__foo bar __</p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="6734:1-6735:56" dir="auto">This is not strong emphasis, because the second <code>__</code> is +preceded by punctuation and followed by an alphanumeric:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="6737:1-6741:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">__(__foo)</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p>__(__foo)</p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="6744:1-6745:18" dir="auto">The point of this restriction is more easily appreciated +with this example:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="6747:1-6751:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">_(__foo__)_</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p><em>(<strong>foo</strong>)</em></p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="6754:1-6754:49" dir="auto">Intraword strong emphasis is forbidden with <code>__</code>:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="6756:1-6760:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">__foo__bar</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p>__foo__bar</p></span></code></pre> +<copy-code></copy-code> +</div> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="6763:1-6767:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">__пристаням__стремятся</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p>__пристаням__стремятся</p></span></code></pre> +<copy-code></copy-code> +</div> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="6770:1-6774:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">__foo__bar__baz__</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p><strong>foo__bar__baz</strong></p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="6777:1-6779:12" dir="auto">This is strong emphasis, even though the closing delimiter is +both left- and right-flanking, because it is followed by +punctuation:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="6781:1-6785:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">__(bar)__.</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p><strong>(bar)</strong>.</p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="6788:1-6788:7" dir="auto">Rule 9:</p> +<p data-sourcepos="6790:1-6791:16" dir="auto">Any nonempty sequence of inline elements can be the contents of an +emphasized span.</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="6793:1-6797:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">*foo [bar](/url)*</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p><em>foo <a href="/url">bar</a></em></p></span></code></pre> +<copy-code></copy-code> +</div> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="6800:1-6806:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">*foo</span> +<span id="LC2" class="line" lang="plaintext">bar*</span> +<span id="LC3" class="line" lang="plaintext">.</span> +<span id="LC4" class="line" lang="plaintext"><p><em>foo</span> +<span id="LC5" class="line" lang="plaintext">bar</em></p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="6809:1-6810:16" dir="auto">In particular, emphasis and strong emphasis can be nested +inside emphasis:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="6812:1-6816:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">_foo __bar__ baz_</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p><em>foo <strong>bar</strong> baz</em></p></span></code></pre> +<copy-code></copy-code> +</div> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="6819:1-6823:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">_foo _bar_ baz_</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p><em>foo <em>bar</em> baz</em></p></span></code></pre> +<copy-code></copy-code> +</div> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="6826:1-6830:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">__foo_ bar_</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p><em><em>foo</em> bar</em></p></span></code></pre> +<copy-code></copy-code> +</div> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="6833:1-6837:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">*foo *bar**</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p><em>foo <em>bar</em></em></p></span></code></pre> +<copy-code></copy-code> +</div> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="6840:1-6844:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">*foo **bar** baz*</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p><em>foo <strong>bar</strong> baz</em></p></span></code></pre> +<copy-code></copy-code> +</div> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="6846:1-6850:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">*foo**bar**baz*</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p><em>foo<strong>bar</strong>baz</em></p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="6852:1-6852:51" dir="auto">Note that in the preceding case, the interpretation</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="6854:1-6856:3" class="code highlight js-syntax-highlight language-markdown" lang="markdown" v-pre="true"><code><span id="LC1" class="line" lang="markdown"><span class="nt"><p><em></span>foo<span class="nt"></em><em></span>bar<span class="nt"><em></em></span>baz<span class="nt"></em></p></span></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="6859:1-6864:32" dir="auto">is precluded by the condition that a delimiter that +can both open and close (like the <code>*</code> after <code>foo</code>) +cannot form emphasis if the sum of the lengths of +the delimiter runs containing the opening and +closing delimiters is a multiple of 3 unless +both lengths are multiples of 3.</p> +<p data-sourcepos="6867:1-6868:34" dir="auto">For the same reason, we don't get two consecutive +emphasis sections in this example:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="6870:1-6874:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">*foo**bar*</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p><em>foo**bar</em></p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="6877:1-6880:8" dir="auto">The same condition ensures that the following +cases are all strong emphasis nested inside +emphasis, even when the interior spaces are +omitted:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="6883:1-6887:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">***foo** bar*</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p><em><strong>foo</strong> bar</em></p></span></code></pre> +<copy-code></copy-code> +</div> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="6890:1-6894:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">*foo **bar***</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p><em>foo <strong>bar</strong></em></p></span></code></pre> +<copy-code></copy-code> +</div> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="6897:1-6901:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">*foo**bar***</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p><em>foo<strong>bar</strong></em></p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="6904:1-6906:34" dir="auto">When the lengths of the interior closing and opening +delimiter runs are <em>both</em> multiples of 3, though, +they can match to create emphasis:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="6908:1-6912:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">foo***bar***baz</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p>foo<em><strong>bar</strong></em>baz</p></span></code></pre> +<copy-code></copy-code> +</div> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="6914:1-6918:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">foo******bar*********baz</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p>foo<strong><strong><strong>bar</strong></strong></strong>***baz</p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="6921:1-6921:42" dir="auto">Indefinite levels of nesting are possible:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="6923:1-6927:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">*foo **bar *baz* bim** bop*</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p><em>foo <strong>bar <em>baz</em> bim</strong> bop</em></p></span></code></pre> +<copy-code></copy-code> +</div> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="6930:1-6934:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">*foo [*bar*](/url)*</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p><em>foo <a href="/url"><em>bar</em></a></em></p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="6937:1-6937:50" dir="auto">There can be no empty emphasis or strong emphasis:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="6939:1-6943:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">** is not an empty emphasis</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p>** is not an empty emphasis</p></span></code></pre> +<copy-code></copy-code> +</div> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="6946:1-6950:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">**** is not an empty strong emphasis</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p>**** is not an empty strong emphasis</p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="6954:1-6954:8" dir="auto">Rule 10:</p> +<p data-sourcepos="6956:1-6957:25" dir="auto">Any nonempty sequence of inline elements can be the contents of an +strongly emphasized span.</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="6959:1-6963:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">**foo [bar](/url)**</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p><strong>foo <a href="/url">bar</a></strong></p></span></code></pre> +<copy-code></copy-code> +</div> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="6966:1-6972:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">**foo</span> +<span id="LC2" class="line" lang="plaintext">bar**</span> +<span id="LC3" class="line" lang="plaintext">.</span> +<span id="LC4" class="line" lang="plaintext"><p><strong>foo</span> +<span id="LC5" class="line" lang="plaintext">bar</strong></p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="6975:1-6976:23" dir="auto">In particular, emphasis and strong emphasis can be nested +inside strong emphasis:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="6978:1-6982:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">__foo _bar_ baz__</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p><strong>foo <em>bar</em> baz</strong></p></span></code></pre> +<copy-code></copy-code> +</div> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="6985:1-6989:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">__foo __bar__ baz__</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p><strong>foo <strong>bar</strong> baz</strong></p></span></code></pre> +<copy-code></copy-code> +</div> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="6992:1-6996:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">____foo__ bar__</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p><strong><strong>foo</strong> bar</strong></p></span></code></pre> +<copy-code></copy-code> +</div> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="6999:1-7003:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">**foo **bar****</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p><strong>foo <strong>bar</strong></strong></p></span></code></pre> +<copy-code></copy-code> +</div> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="7006:1-7010:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">**foo *bar* baz**</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p><strong>foo <em>bar</em> baz</strong></p></span></code></pre> +<copy-code></copy-code> +</div> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="7013:1-7017:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">**foo*bar*baz**</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p><strong>foo<em>bar</em>baz</strong></p></span></code></pre> +<copy-code></copy-code> +</div> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="7020:1-7024:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">***foo* bar**</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p><strong><em>foo</em> bar</strong></p></span></code></pre> +<copy-code></copy-code> +</div> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="7027:1-7031:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">**foo *bar***</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p><strong>foo <em>bar</em></strong></p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="7034:1-7034:42" dir="auto">Indefinite levels of nesting are possible:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="7036:1-7042:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">**foo *bar **baz**</span> +<span id="LC2" class="line" lang="plaintext">bim* bop**</span> +<span id="LC3" class="line" lang="plaintext">.</span> +<span id="LC4" class="line" lang="plaintext"><p><strong>foo <em>bar <strong>baz</strong></span> +<span id="LC5" class="line" lang="plaintext">bim</em> bop</strong></p></span></code></pre> +<copy-code></copy-code> +</div> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="7045:1-7049:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">**foo [*bar*](/url)**</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p><strong>foo <a href="/url"><em>bar</em></a></strong></p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="7052:1-7052:50" dir="auto">There can be no empty emphasis or strong emphasis:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="7054:1-7058:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">__ is not an empty emphasis</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p>__ is not an empty emphasis</p></span></code></pre> +<copy-code></copy-code> +</div> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="7061:1-7065:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">____ is not an empty strong emphasis</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p>____ is not an empty strong emphasis</p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="7069:1-7069:8" dir="auto">Rule 11:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="7071:1-7075:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">foo ***</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p>foo ***</p></span></code></pre> +<copy-code></copy-code> +</div> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="7078:1-7082:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">foo *\**</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p>foo <em>*</em></p></span></code></pre> +<copy-code></copy-code> +</div> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="7085:1-7089:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">foo *_*</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p>foo <em>_</em></p></span></code></pre> +<copy-code></copy-code> +</div> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="7092:1-7096:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">foo *****</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p>foo *****</p></span></code></pre> +<copy-code></copy-code> +</div> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="7099:1-7103:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">foo **\***</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p>foo <strong>*</strong></p></span></code></pre> +<copy-code></copy-code> +</div> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="7106:1-7110:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">foo **_**</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p>foo <strong>_</strong></p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="7113:1-7115:32" dir="auto">Note that when delimiters do not match evenly, Rule 11 determines +that the excess literal <code>*</code> characters will appear outside of the +emphasis, rather than inside it:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="7117:1-7121:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">**foo*</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p>*<em>foo</em></p></span></code></pre> +<copy-code></copy-code> +</div> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="7124:1-7128:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">*foo**</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p><em>foo</em>*</p></span></code></pre> +<copy-code></copy-code> +</div> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="7131:1-7135:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">***foo**</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p>*<strong>foo</strong></p></span></code></pre> +<copy-code></copy-code> +</div> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="7138:1-7142:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">****foo*</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p>***<em>foo</em></p></span></code></pre> +<copy-code></copy-code> +</div> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="7145:1-7149:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">**foo***</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p><strong>foo</strong>*</p></span></code></pre> +<copy-code></copy-code> +</div> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="7152:1-7156:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">*foo****</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p><em>foo</em>***</p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="7160:1-7160:8" dir="auto">Rule 12:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="7162:1-7166:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">foo ___</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p>foo ___</p></span></code></pre> +<copy-code></copy-code> +</div> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="7169:1-7173:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">foo _\__</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p>foo <em>_</em></p></span></code></pre> +<copy-code></copy-code> +</div> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="7176:1-7180:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">foo _*_</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p>foo <em>*</em></p></span></code></pre> +<copy-code></copy-code> +</div> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="7183:1-7187:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">foo _____</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p>foo _____</p></span></code></pre> +<copy-code></copy-code> +</div> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="7190:1-7194:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">foo __\___</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p>foo <strong>_</strong></p></span></code></pre> +<copy-code></copy-code> +</div> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="7197:1-7201:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">foo __*__</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p>foo <strong>*</strong></p></span></code></pre> +<copy-code></copy-code> +</div> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="7204:1-7208:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">__foo_</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p>_<em>foo</em></p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="7211:1-7213:32" dir="auto">Note that when delimiters do not match evenly, Rule 12 determines +that the excess literal <code>_</code> characters will appear outside of the +emphasis, rather than inside it:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="7215:1-7219:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">_foo__</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p><em>foo</em>_</p></span></code></pre> +<copy-code></copy-code> +</div> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="7222:1-7226:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">___foo__</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p>_<strong>foo</strong></p></span></code></pre> +<copy-code></copy-code> +</div> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="7229:1-7233:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">____foo_</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p>___<em>foo</em></p></span></code></pre> +<copy-code></copy-code> +</div> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="7236:1-7240:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">__foo___</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p><strong>foo</strong>_</p></span></code></pre> +<copy-code></copy-code> +</div> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="7243:1-7247:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">_foo____</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p><em>foo</em>___</p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="7250:1-7251:44" dir="auto">Rule 13 implies that if you want emphasis nested directly inside +emphasis, you must use different delimiters:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="7253:1-7257:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">**foo**</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p><strong>foo</strong></p></span></code></pre> +<copy-code></copy-code> +</div> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="7260:1-7264:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">*_foo_*</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p><em><em>foo</em></em></p></span></code></pre> +<copy-code></copy-code> +</div> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="7267:1-7271:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">__foo__</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p><strong>foo</strong></p></span></code></pre> +<copy-code></copy-code> +</div> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="7274:1-7278:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">_*foo*_</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p><em><em>foo</em></em></p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="7281:1-7282:21" dir="auto">However, strong emphasis within strong emphasis is possible without +switching delimiters:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="7284:1-7288:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">****foo****</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p><strong><strong>foo</strong></strong></p></span></code></pre> +<copy-code></copy-code> +</div> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="7291:1-7295:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">____foo____</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p><strong><strong>foo</strong></strong></p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="7299:1-7300:11" dir="auto">Rule 13 can be applied to arbitrarily long sequences of +delimiters:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="7302:1-7306:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">******foo******</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p><strong><strong><strong>foo</strong></strong></strong></p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="7309:1-7309:8" dir="auto">Rule 14:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="7311:1-7315:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">***foo***</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p><em><strong>foo</strong></em></p></span></code></pre> +<copy-code></copy-code> +</div> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="7318:1-7322:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">_____foo_____</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p><em><strong><strong>foo</strong></strong></em></p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="7325:1-7325:8" dir="auto">Rule 15:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="7327:1-7331:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">*foo _bar* baz_</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p><em>foo _bar</em> baz_</p></span></code></pre> +<copy-code></copy-code> +</div> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="7334:1-7338:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">*foo __bar *baz bim__ bam*</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p><em>foo <strong>bar *baz bim</strong> bam</em></p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="7341:1-7341:8" dir="auto">Rule 16:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="7343:1-7347:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">**foo **bar baz**</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p>**foo <strong>bar baz</strong></p></span></code></pre> +<copy-code></copy-code> +</div> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="7350:1-7354:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">*foo *bar baz*</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p>*foo <em>bar baz</em></p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="7357:1-7357:8" dir="auto">Rule 17:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="7359:1-7363:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">*[bar*](/url)</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p>*<a href="/url">bar*</a></p></span></code></pre> +<copy-code></copy-code> +</div> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="7366:1-7370:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">_foo [bar_](/url)</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p>_foo <a href="/url">bar_</a></p></span></code></pre> +<copy-code></copy-code> +</div> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="7373:1-7377:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">*<img src="foo" title="*"/></span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p>*<img src="foo" title="*"/></p></span></code></pre> +<copy-code></copy-code> +</div> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="7380:1-7384:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">**<a href="**"></span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p>**<a href="**"></p></span></code></pre> +<copy-code></copy-code> +</div> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="7387:1-7391:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">__<a href="__"></span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p>__<a href="__"></p></span></code></pre> +<copy-code></copy-code> +</div> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="7394:1-7398:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">*a `*`*</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p><em>a <code>*</code></em></p></span></code></pre> +<copy-code></copy-code> +</div> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="7401:1-7405:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">_a `_`_</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p><em>a <code>_</code></em></p></span></code></pre> +<copy-code></copy-code> +</div> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="7408:1-7412:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">**a<http://foo.bar/?q=**></span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p>**a<a href="http://foo.bar/?q=**">http://foo.bar/?q=**</a></p></span></code></pre> +<copy-code></copy-code> +</div> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="7415:1-7419:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">__a<http://foo.bar/?q=__></span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p>__a<a href="http://foo.bar/?q=__">http://foo.bar/?q=__</a></p></span></code></pre> +<copy-code></copy-code> +</div> +<div> +<h2 data-sourcepos="7424:1-7424:28"> +<a id="user-content-strikethrough-extension" class="anchor" href="#strikethrough-extension" aria-hidden="true"></a>Strikethrough (extension)</h2> +<p data-sourcepos="7426:1-7427:10">GFM enables the <code>strikethrough</code> extension, where an additional emphasis type is +available.</p> +<p data-sourcepos="7429:1-7429:59">Strikethrough text is any text wrapped in two tildes (<code>~</code>).</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="7431:1-7435:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">~~Hi~~ Hello, world!</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p><del>Hi</del> Hello, world!</p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="7437:1-7438:17">As with regular emphasis delimiters, a new paragraph will cause strikethrough +parsing to cease:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="7440:1-7447:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">This ~~has a</span> +<span id="LC2" class="line" lang="plaintext"></span> +<span id="LC3" class="line" lang="plaintext">new paragraph~~.</span> +<span id="LC4" class="line" lang="plaintext">.</span> +<span id="LC5" class="line" lang="plaintext"><p>This ~~has a</p></span> +<span id="LC6" class="line" lang="plaintext"><p>new paragraph~~.</p></span></code></pre> +<copy-code></copy-code> +</div> +</div> +<h2 data-sourcepos="7451:1-7451:8" dir="auto"> +<a id="user-content-links" class="anchor" href="#links" aria-hidden="true"></a>Links</h2> +<p data-sourcepos="7453:1-7458:13" dir="auto">A link contains [link text] (the visible text), a [link destination] +(the URI that is the link destination), and optionally a [link title]. +There are two basic kinds of links in Markdown. In [inline links] the +destination and title are given immediately after the link text. In +[reference links] the destination and title are defined elsewhere in +the document.</p> +<p data-sourcepos="7460:1-7462:22" dir="auto">A <a href="@">link text</a> consists of a sequence of zero or more +inline elements enclosed by square brackets (<code>[</code> and <code>]</code>). The +following rules apply:</p> +<ul data-sourcepos="7464:1-7480:0" dir="auto"> +<li data-sourcepos="7464:1-7467:0"> +<p data-sourcepos="7464:3-7466:43">Links may not contain other links, at any level of nesting. If +multiple otherwise valid link definitions appear nested inside each +other, the inner-most definition is used.</p> +</li> +<li data-sourcepos="7468:1-7472:0"> +<p data-sourcepos="7468:3-7471:22">Brackets are allowed in the [link text] only if (a) they +are backslash-escaped or (b) they appear as a matched pair of brackets, +with an open bracket <code>[</code>, a sequence of zero or more inlines, and +a close bracket <code>]</code>.</p> +</li> +<li data-sourcepos="7473:1-7477:0"> +<p data-sourcepos="7473:3-7476:25">Backtick [code spans], [autolinks], and raw [HTML tags] bind more tightly +than the brackets in link text. Thus, for example, +<code>[foo`]`</code> could not be a link text, since the second <code>]</code> +is part of a code span.</p> +</li> +<li data-sourcepos="7478:1-7480:0"> +<p data-sourcepos="7478:3-7479:78">The brackets in link text bind more tightly than markers for +[emphasis and strong emphasis]. Thus, for example, <code>*[foo*](url)</code> is a link.</p> +</li> +</ul> +<p data-sourcepos="7481:1-7481:42" dir="auto">A <a href="@">link destination</a> consists of either</p> +<ul data-sourcepos="7483:1-7494:0" dir="auto"> +<li data-sourcepos="7483:1-7486:0"> +<p data-sourcepos="7483:3-7485:27">a sequence of zero or more characters between an opening <code><</code> and a +closing <code>></code> that contains no line breaks or unescaped +<code><</code> or <code>></code> characters, or</p> +</li> +<li data-sourcepos="7487:1-7494:0"> +<p data-sourcepos="7487:3-7493:23">a nonempty sequence of characters that does not start with +<code><</code>, does not include ASCII space or control characters, and +includes parentheses only if (a) they are backslash-escaped or +(b) they are part of a balanced pair of unescaped parentheses. +(Implementations may impose limits on parentheses nesting to +avoid performance issues, but at least three levels of nesting +should be supported.)</p> +</li> +</ul> +<p data-sourcepos="7495:1-7495:37" dir="auto">A <a href="@">link title</a> consists of either</p> +<ul data-sourcepos="7497:1-7508:0" dir="auto"> +<li data-sourcepos="7497:1-7500:0"> +<p data-sourcepos="7497:3-7499:23">a sequence of zero or more characters between straight double-quote +characters (<code>"</code>), including a <code>"</code> character only if it is +backslash-escaped, or</p> +</li> +<li data-sourcepos="7501:1-7504:0"> +<p data-sourcepos="7501:3-7503:23">a sequence of zero or more characters between straight single-quote +characters (<code>'</code>), including a <code>'</code> character only if it is +backslash-escaped, or</p> +</li> +<li data-sourcepos="7505:1-7508:0"> +<p data-sourcepos="7505:3-7507:20">a sequence of zero or more characters between matching parentheses +(<code>(...)</code>), including a <code>(</code> or <code>)</code> character only if it is +backslash-escaped.</p> +</li> +</ul> +<p data-sourcepos="7509:1-7510:15" dir="auto">Although [link titles] may span multiple lines, they may not contain +a [blank line].</p> +<p data-sourcepos="7512:1-7522:6" dir="auto">An <a href="@">inline link</a> consists of a [link text] followed immediately +by a left parenthesis <code>(</code>, optional [whitespace], an optional +[link destination], an optional [link title] separated from the link +destination by [whitespace], optional [whitespace], and a right +parenthesis <code>)</code>. The link's text consists of the inlines contained +in the [link text] (excluding the enclosing square brackets). +The link's URI consists of the link destination, excluding enclosing +<code><...></code> if present, with backslash-escapes in effect as described +above. The link's title consists of the link title, excluding its +enclosing delimiters, with backslash-escapes in effect as described +above.</p> +<p data-sourcepos="7524:1-7524:29" dir="auto">Here is a simple inline link:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="7526:1-7530:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">[link](/uri "title")</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p><a href="/uri" title="title">link</a></p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="7533:1-7533:25" dir="auto">The title may be omitted:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="7535:1-7539:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">[link](/uri)</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p><a href="/uri">link</a></p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="7542:1-7542:50" dir="auto">Both the title and the destination may be omitted:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="7544:1-7548:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">[link]()</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p><a href="">link</a></p></span></code></pre> +<copy-code></copy-code> +</div> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="7551:1-7555:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">[link](<>)</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p><a href="">link</a></p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="7557:1-7558:28" dir="auto">The destination can only contain spaces if it is +enclosed in pointy brackets:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="7560:1-7564:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">[link](/my uri)</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p>[link](/my uri)</p></span></code></pre> +<copy-code></copy-code> +</div> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="7566:1-7570:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">[link](</my uri>)</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p><a href="/my%20uri">link</a></p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="7572:1-7573:36" dir="auto">The destination cannot contain line breaks, +even if enclosed in pointy brackets:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="7575:1-7581:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">[link](foo</span> +<span id="LC2" class="line" lang="plaintext">bar)</span> +<span id="LC3" class="line" lang="plaintext">.</span> +<span id="LC4" class="line" lang="plaintext"><p>[link](foo</span> +<span id="LC5" class="line" lang="plaintext">bar)</p></span></code></pre> +<copy-code></copy-code> +</div> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="7583:1-7589:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">[link](<foo</span> +<span id="LC2" class="line" lang="plaintext">bar>)</span> +<span id="LC3" class="line" lang="plaintext">.</span> +<span id="LC4" class="line" lang="plaintext"><p>[link](<foo</span> +<span id="LC5" class="line" lang="plaintext">bar>)</p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="7591:1-7592:19" dir="auto">The destination can contain <code>)</code> if it is enclosed +in pointy brackets:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="7594:1-7598:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">[a](<b)c>)</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p><a href="b)c">a</a></p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="7600:1-7600:53" dir="auto">Pointy brackets that enclose links must be unescaped:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="7602:1-7606:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">[link](<foo\>)</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p>[link](&lt;foo&gt;)</p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="7608:1-7609:24" dir="auto">These are not links, because the opening pointy bracket +is not matched properly:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="7611:1-7619:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">[a](<b)c</span> +<span id="LC2" class="line" lang="plaintext">[a](<b)c></span> +<span id="LC3" class="line" lang="plaintext">[a](<b>c)</span> +<span id="LC4" class="line" lang="plaintext">.</span> +<span id="LC5" class="line" lang="plaintext"><p>[a](&lt;b)c</span> +<span id="LC6" class="line" lang="plaintext">[a](&lt;b)c&gt;</span> +<span id="LC7" class="line" lang="plaintext">[a](<b>c)</p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="7621:1-7621:55" dir="auto">Parentheses inside the link destination may be escaped:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="7623:1-7627:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">[link](\(foo\))</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p><a href="(foo)">link</a></p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="7629:1-7630:9" dir="auto">Any number of parentheses are allowed without escaping, as long as they are +balanced:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="7632:1-7636:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">[link](foo(and(bar)))</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p><a href="foo(and(bar))">link</a></p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="7638:1-7639:13" dir="auto">However, if you have unbalanced parentheses, you need to escape or use the +<code><...></code> form:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="7641:1-7645:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">[link](foo\(and\(bar\))</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p><a href="foo(and(bar)">link</a></p></span></code></pre> +<copy-code></copy-code> +</div> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="7648:1-7652:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">[link](<foo(and(bar)>)</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p><a href="foo(and(bar)">link</a></p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="7655:1-7656:12" dir="auto">Parentheses and other symbols can also be escaped, as usual +in Markdown:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="7658:1-7662:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">[link](foo\)\:)</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p><a href="foo):">link</a></p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="7665:1-7665:52" dir="auto">A link can contain fragment identifiers and queries:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="7667:1-7677:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">[link](#fragment)</span> +<span id="LC2" class="line" lang="plaintext"></span> +<span id="LC3" class="line" lang="plaintext">[link](http://example.com#fragment)</span> +<span id="LC4" class="line" lang="plaintext"></span> +<span id="LC5" class="line" lang="plaintext">[link](http://example.com?foo=3#frag)</span> +<span id="LC6" class="line" lang="plaintext">.</span> +<span id="LC7" class="line" lang="plaintext"><p><a href="#fragment">link</a></p></span> +<span id="LC8" class="line" lang="plaintext"><p><a href="http://example.com#fragment">link</a></p></span> +<span id="LC9" class="line" lang="plaintext"><p><a href="http://example.com?foo=3#frag">link</a></p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="7680:1-7681:17" dir="auto">Note that a backslash before a non-escapable character is +just a backslash:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="7683:1-7687:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">[link](foo\bar)</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p><a href="foo%5Cbar">link</a></p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="7690:1-7697:52" dir="auto">URL-escaping should be left alone inside the destination, as all +URL-escaped characters are also valid URL characters. Entity and +numerical character references in the destination will be parsed +into the corresponding Unicode code points, as usual. These may +be optionally URL-escaped when written as HTML, but this spec +does not enforce any particular policy for rendering URLs in +HTML or other formats. Renderers may make different decisions +about how to escape or normalize URLs in the output.</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="7699:1-7703:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">[link](foo%20b&auml;)</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p><a href="foo%20b%C3%A4">link</a></p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="7706:1-7708:23" dir="auto">Note that, because titles can often be parsed as destinations, +if you try to omit the destination and keep the title, you'll +get unexpected results:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="7710:1-7714:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">[link]("title")</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p><a href="%22title%22">link</a></p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="7717:1-7717:62" dir="auto">Titles may be in single quotes, double quotes, or parentheses:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="7719:1-7727:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">[link](/url "title")</span> +<span id="LC2" class="line" lang="plaintext">[link](/url 'title')</span> +<span id="LC3" class="line" lang="plaintext">[link](/url (title))</span> +<span id="LC4" class="line" lang="plaintext">.</span> +<span id="LC5" class="line" lang="plaintext"><p><a href="/url" title="title">link</a></span> +<span id="LC6" class="line" lang="plaintext"><a href="/url" title="title">link</a></span> +<span id="LC7" class="line" lang="plaintext"><a href="/url" title="title">link</a></p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="7730:1-7731:22" dir="auto">Backslash escapes and entity and numeric character references +may be used in titles:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="7733:1-7737:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">[link](/url "title \"&quot;")</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p><a href="/url" title="title &quot;&quot;">link</a></p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="7740:1-7741:64" dir="auto">Titles must be separated from the link using a [whitespace]. +Other [Unicode whitespace] like non-breaking space doesn't work.</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="7743:1-7747:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">[link](/url "title")</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p><a href="/url%C2%A0%22title%22">link</a></p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="7750:1-7750:56" dir="auto">Nested balanced quotes are not allowed without escaping:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="7752:1-7756:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">[link](/url "title "and" title")</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p>[link](/url &quot;title &quot;and&quot; title&quot;)</p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="7759:1-7759:67" dir="auto">But it is easy to work around this by using a different quote type:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="7761:1-7765:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">[link](/url 'title "and" title')</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p><a href="/url" title="title &quot;and&quot; title">link</a></p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="7768:1-7781:61" dir="auto">(Note: <code>Markdown.pl</code> did allow double quotes inside a double-quoted +title, and its test suite included a test demonstrating this. +But it is hard to see a good rationale for the extra complexity this +brings, since there are already many ways---backslash escaping, +entity and numeric character references, or using a different +quote type for the enclosing title---to write titles containing +double quotes. <code>Markdown.pl</code>'s handling of titles has a number +of other strange features. For example, it allows single-quoted +titles in inline links, but not reference links. And, in +reference links but not inline links, it allows a title to begin +with <code>"</code> and end with <code>)</code>. <code>Markdown.pl</code> 1.0.1 even allows +titles with no closing quotation mark, though 1.0.2b8 does not. +It seems preferable to adopt a simple, rational rule that works +the same way in inline links and link reference definitions.)</p> +<p data-sourcepos="7783:1-7783:57" dir="auto">[Whitespace] is allowed around the destination and title:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="7785:1-7790:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">[link]( /uri</span> +<span id="LC2" class="line" lang="plaintext"> "title" )</span> +<span id="LC3" class="line" lang="plaintext">.</span> +<span id="LC4" class="line" lang="plaintext"><p><a href="/uri" title="title">link</a></p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="7793:1-7794:22" dir="auto">But it is not allowed between the link text and the +following parenthesis:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="7796:1-7800:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">[link] (/uri)</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p>[link] (/uri)</p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="7803:1-7804:24" dir="auto">The link text may contain balanced brackets, but not unbalanced ones, +unless they are escaped:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="7806:1-7810:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">[link [foo [bar]]](/uri)</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p><a href="/uri">link [foo [bar]]</a></p></span></code></pre> +<copy-code></copy-code> +</div> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="7813:1-7817:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">[link] bar](/uri)</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p>[link] bar](/uri)</p></span></code></pre> +<copy-code></copy-code> +</div> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="7820:1-7824:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">[link [bar](/uri)</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p>[link <a href="/uri">bar</a></p></span></code></pre> +<copy-code></copy-code> +</div> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="7827:1-7831:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">[link \[bar](/uri)</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p><a href="/uri">link [bar</a></p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="7834:1-7834:41" dir="auto">The link text may contain inline content:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="7836:1-7840:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">[link *foo **bar** `#`*](/uri)</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p><a href="/uri">link <em>foo <strong>bar</strong> <code>#</code></em></a></p></span></code></pre> +<copy-code></copy-code> +</div> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="7843:1-7847:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">[![moon](moon.jpg)](/uri)</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p><a href="/uri"><img src="moon.jpg" alt="moon" /></a></p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="7850:1-7850:68" dir="auto">However, links may not contain other links, at any level of nesting.</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="7852:1-7856:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">[foo [bar](/uri)](/uri)</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p>[foo <a href="/uri">bar</a>](/uri)</p></span></code></pre> +<copy-code></copy-code> +</div> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="7859:1-7863:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">[foo *[bar [baz](/uri)](/uri)*](/uri)</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p>[foo <em>[bar <a href="/uri">baz</a>](/uri)</em>](/uri)</p></span></code></pre> +<copy-code></copy-code> +</div> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="7866:1-7870:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">![[[foo](uri1)](uri2)](uri3)</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p><img src="uri3" alt="[foo](uri2)" /></p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="7873:1-7874:18" dir="auto">These cases illustrate the precedence of link text grouping over +emphasis grouping:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="7876:1-7880:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">*[foo*](/uri)</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p>*<a href="/uri">foo*</a></p></span></code></pre> +<copy-code></copy-code> +</div> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="7883:1-7887:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">[foo *bar](baz*)</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p><a href="baz*">foo *bar</a></p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="7890:1-7891:11" dir="auto">Note that brackets that <em>aren't</em> part of links do not take +precedence:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="7893:1-7897:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">*foo [bar* baz]</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p><em>foo [bar</em> baz]</p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="7900:1-7901:33" dir="auto">These cases illustrate the precedence of HTML tags, code spans, +and autolinks over link grouping:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="7903:1-7907:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">[foo <bar attr="](baz)"></span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p>[foo <bar attr="](baz)"></p></span></code></pre> +<copy-code></copy-code> +</div> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="7910:1-7914:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">[foo`](/uri)`</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p>[foo<code>](/uri)</code></p></span></code></pre> +<copy-code></copy-code> +</div> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="7917:1-7921:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">[foo<http://example.com/?search=](uri)></span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p>[foo<a href="http://example.com/?search=%5D(uri)">http://example.com/?search=](uri)</a></p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="7924:1-7926:41" dir="auto">There are three kinds of <a href="@">reference link</a>s: +<a href="#full-reference-link">full</a>, <a href="#collapsed-reference-link">collapsed</a>, +and <a href="#shortcut-reference-link">shortcut</a>.</p> +<p data-sourcepos="7928:1-7930:71" dir="auto">A <a href="@">full reference link</a> +consists of a [link text] immediately followed by a [link label] +that [matches] a [link reference definition] elsewhere in the document.</p> +<p data-sourcepos="7932:1-7938:9" dir="auto">A <a href="@">link label</a> begins with a left bracket (<code>[</code>) and ends +with the first right bracket (<code>]</code>) that is not backslash-escaped. +Between these brackets there must be at least one [non-whitespace character]. +Unescaped square bracket characters are not allowed inside the +opening and closing square brackets of [link labels]. A link +label can have at most 999 characters inside the square +brackets.</p> +<p data-sourcepos="7940:1-7947:69" dir="auto">One label <a href="@">matches</a> +another just in case their normalized forms are equal. To normalize a +label, strip off the opening and closing brackets, +perform the <em>Unicode case fold</em>, strip leading and trailing +[whitespace] and collapse consecutive internal +[whitespace] to a single space. If there are multiple +matching reference link definitions, the one that comes first in the +document is used. (It is desirable in such cases to emit a warning.)</p> +<p data-sourcepos="7949:1-7951:37" dir="auto">The contents of the first link label are parsed as inlines, which are +used as the link's text. The link's URI and title are provided by the +matching [link reference definition].</p> +<p data-sourcepos="7953:1-7953:25" dir="auto">Here is a simple example:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="7955:1-7961:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">[foo][bar]</span> +<span id="LC2" class="line" lang="plaintext"></span> +<span id="LC3" class="line" lang="plaintext">[bar]: /url "title"</span> +<span id="LC4" class="line" lang="plaintext">.</span> +<span id="LC5" class="line" lang="plaintext"><p><a href="/url" title="title">foo</a></p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="7964:1-7965:22" dir="auto">The rules for the [link text] are the same as with +[inline links]. Thus:</p> +<p data-sourcepos="7967:1-7968:24" dir="auto">The link text may contain balanced brackets, but not unbalanced ones, +unless they are escaped:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="7970:1-7976:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">[link [foo [bar]]][ref]</span> +<span id="LC2" class="line" lang="plaintext"></span> +<span id="LC3" class="line" lang="plaintext">[ref]: /uri</span> +<span id="LC4" class="line" lang="plaintext">.</span> +<span id="LC5" class="line" lang="plaintext"><p><a href="/uri">link [foo [bar]]</a></p></span></code></pre> +<copy-code></copy-code> +</div> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="7979:1-7985:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">[link \[bar][ref]</span> +<span id="LC2" class="line" lang="plaintext"></span> +<span id="LC3" class="line" lang="plaintext">[ref]: /uri</span> +<span id="LC4" class="line" lang="plaintext">.</span> +<span id="LC5" class="line" lang="plaintext"><p><a href="/uri">link [bar</a></p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="7988:1-7988:41" dir="auto">The link text may contain inline content:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="7990:1-7996:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">[link *foo **bar** `#`*][ref]</span> +<span id="LC2" class="line" lang="plaintext"></span> +<span id="LC3" class="line" lang="plaintext">[ref]: /uri</span> +<span id="LC4" class="line" lang="plaintext">.</span> +<span id="LC5" class="line" lang="plaintext"><p><a href="/uri">link <em>foo <strong>bar</strong> <code>#</code></em></a></p></span></code></pre> +<copy-code></copy-code> +</div> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="7999:1-8005:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">[![moon](moon.jpg)][ref]</span> +<span id="LC2" class="line" lang="plaintext"></span> +<span id="LC3" class="line" lang="plaintext">[ref]: /uri</span> +<span id="LC4" class="line" lang="plaintext">.</span> +<span id="LC5" class="line" lang="plaintext"><p><a href="/uri"><img src="moon.jpg" alt="moon" /></a></p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="8008:1-8008:68" dir="auto">However, links may not contain other links, at any level of nesting.</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="8010:1-8016:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">[foo [bar](/uri)][ref]</span> +<span id="LC2" class="line" lang="plaintext"></span> +<span id="LC3" class="line" lang="plaintext">[ref]: /uri</span> +<span id="LC4" class="line" lang="plaintext">.</span> +<span id="LC5" class="line" lang="plaintext"><p>[foo <a href="/uri">bar</a>]<a href="/uri">ref</a></p></span></code></pre> +<copy-code></copy-code> +</div> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="8019:1-8025:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">[foo *bar [baz][ref]*][ref]</span> +<span id="LC2" class="line" lang="plaintext"></span> +<span id="LC3" class="line" lang="plaintext">[ref]: /uri</span> +<span id="LC4" class="line" lang="plaintext">.</span> +<span id="LC5" class="line" lang="plaintext"><p>[foo <em>bar <a href="/uri">baz</a></em>]<a href="/uri">ref</a></p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="8028:1-8029:38" dir="auto">(In the examples above, we have two [shortcut reference links] +instead of one [full reference link].)</p> +<p data-sourcepos="8031:1-8032:18" dir="auto">The following cases illustrate the precedence of link text grouping over +emphasis grouping:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="8034:1-8040:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">*[foo*][ref]</span> +<span id="LC2" class="line" lang="plaintext"></span> +<span id="LC3" class="line" lang="plaintext">[ref]: /uri</span> +<span id="LC4" class="line" lang="plaintext">.</span> +<span id="LC5" class="line" lang="plaintext"><p>*<a href="/uri">foo*</a></p></span></code></pre> +<copy-code></copy-code> +</div> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="8043:1-8049:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">[foo *bar][ref]</span> +<span id="LC2" class="line" lang="plaintext"></span> +<span id="LC3" class="line" lang="plaintext">[ref]: /uri</span> +<span id="LC4" class="line" lang="plaintext">.</span> +<span id="LC5" class="line" lang="plaintext"><p><a href="/uri">foo *bar</a></p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="8052:1-8053:33" dir="auto">These cases illustrate the precedence of HTML tags, code spans, +and autolinks over link grouping:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="8055:1-8061:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">[foo <bar attr="][ref]"></span> +<span id="LC2" class="line" lang="plaintext"></span> +<span id="LC3" class="line" lang="plaintext">[ref]: /uri</span> +<span id="LC4" class="line" lang="plaintext">.</span> +<span id="LC5" class="line" lang="plaintext"><p>[foo <bar attr="][ref]"></p></span></code></pre> +<copy-code></copy-code> +</div> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="8064:1-8070:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">[foo`][ref]`</span> +<span id="LC2" class="line" lang="plaintext"></span> +<span id="LC3" class="line" lang="plaintext">[ref]: /uri</span> +<span id="LC4" class="line" lang="plaintext">.</span> +<span id="LC5" class="line" lang="plaintext"><p>[foo<code>][ref]</code></p></span></code></pre> +<copy-code></copy-code> +</div> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="8073:1-8079:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">[foo<http://example.com/?search=][ref]></span> +<span id="LC2" class="line" lang="plaintext"></span> +<span id="LC3" class="line" lang="plaintext">[ref]: /uri</span> +<span id="LC4" class="line" lang="plaintext">.</span> +<span id="LC5" class="line" lang="plaintext"><p>[foo<a href="http://example.com/?search=%5D%5Bref%5D">http://example.com/?search=][ref]</a></p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="8082:1-8082:29" dir="auto">Matching is case-insensitive:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="8084:1-8090:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">[foo][BaR]</span> +<span id="LC2" class="line" lang="plaintext"></span> +<span id="LC3" class="line" lang="plaintext">[bar]: /url "title"</span> +<span id="LC4" class="line" lang="plaintext">.</span> +<span id="LC5" class="line" lang="plaintext"><p><a href="/url" title="title">foo</a></p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="8093:1-8093:26" dir="auto">Unicode case fold is used:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="8095:1-8101:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">[Толпой][Толпой] is a Russian word.</span> +<span id="LC2" class="line" lang="plaintext"></span> +<span id="LC3" class="line" lang="plaintext">[ТОЛПОЙ]: /url</span> +<span id="LC4" class="line" lang="plaintext">.</span> +<span id="LC5" class="line" lang="plaintext"><p><a href="/url">Толпой</a> is a Russian word.</p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="8104:1-8105:33" dir="auto">Consecutive internal [whitespace] is treated as one space for +purposes of determining matching:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="8107:1-8114:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">[Foo</span> +<span id="LC2" class="line" lang="plaintext"> bar]: /url</span> +<span id="LC3" class="line" lang="plaintext"></span> +<span id="LC4" class="line" lang="plaintext">[Baz][Foo bar]</span> +<span id="LC5" class="line" lang="plaintext">.</span> +<span id="LC6" class="line" lang="plaintext"><p><a href="/url">Baz</a></p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="8117:1-8118:13" dir="auto">No [whitespace] is allowed between the [link text] and the +[link label]:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="8120:1-8126:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">[foo] [bar]</span> +<span id="LC2" class="line" lang="plaintext"></span> +<span id="LC3" class="line" lang="plaintext">[bar]: /url "title"</span> +<span id="LC4" class="line" lang="plaintext">.</span> +<span id="LC5" class="line" lang="plaintext"><p>[foo] <a href="/url" title="title">bar</a></p></span></code></pre> +<copy-code></copy-code> +</div> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="8129:1-8137:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">[foo]</span> +<span id="LC2" class="line" lang="plaintext">[bar]</span> +<span id="LC3" class="line" lang="plaintext"></span> +<span id="LC4" class="line" lang="plaintext">[bar]: /url "title"</span> +<span id="LC5" class="line" lang="plaintext">.</span> +<span id="LC6" class="line" lang="plaintext"><p>[foo]</span> +<span id="LC7" class="line" lang="plaintext"><a href="/url" title="title">bar</a></p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="8140:1-8149:9" dir="auto">This is a departure from John Gruber's original Markdown syntax +description, which explicitly allows whitespace between the link +text and the link label. It brings reference links in line with +[inline links], which (according to both original Markdown and +this spec) cannot have whitespace after the link text. More +importantly, it prevents inadvertent capture of consecutive +[shortcut reference links]. If whitespace is allowed between the +link text and the link label, then in the following we will have +a single reference link, not two shortcut reference links, as +intended:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="8151:1-8157:3" class="code highlight js-syntax-highlight language-markdown" lang="markdown" v-pre="true"><code><span id="LC1" class="line" lang="markdown">[foo]</span> +<span id="LC2" class="line" lang="markdown">[bar]</span> +<span id="LC3" class="line" lang="markdown"></span> +<span id="LC4" class="line" lang="markdown"><span class="p">[</span><span class="ss">foo</span><span class="p">]:</span> <span class="sx">/url1</span></span> +<span id="LC5" class="line" lang="markdown"><span class="p">[</span><span class="ss">bar</span><span class="p">]:</span> <span class="sx">/url2</span></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="8159:1-8165:20" dir="auto">(Note that [shortcut reference links] were introduced by Gruber +himself in a beta version of <code>Markdown.pl</code>, but never included +in the official syntax description. Without shortcut reference +links, it is harmless to allow space between the link text and +link label; but once shortcut references are introduced, it is +too dangerous to allow this, as it frequently leads to +unintended results.)</p> +<p data-sourcepos="8167:1-8168:18" dir="auto">When there are multiple matching [link reference definitions], +the first is used:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="8170:1-8178:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">[foo]: /url1</span> +<span id="LC2" class="line" lang="plaintext"></span> +<span id="LC3" class="line" lang="plaintext">[foo]: /url2</span> +<span id="LC4" class="line" lang="plaintext"></span> +<span id="LC5" class="line" lang="plaintext">[bar][foo]</span> +<span id="LC6" class="line" lang="plaintext">.</span> +<span id="LC7" class="line" lang="plaintext"><p><a href="/url1">bar</a></p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="8181:1-8183:40" dir="auto">Note that matching is performed on normalized strings, not parsed +inline content. So the following does not match, even though the +labels define equivalent inline content:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="8185:1-8191:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">[bar][foo\!]</span> +<span id="LC2" class="line" lang="plaintext"></span> +<span id="LC3" class="line" lang="plaintext">[foo!]: /url</span> +<span id="LC4" class="line" lang="plaintext">.</span> +<span id="LC5" class="line" lang="plaintext"><p>[bar][foo!]</p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="8194:1-8195:18" dir="auto">[Link labels] cannot contain brackets, unless they are +backslash-escaped:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="8197:1-8204:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">[foo][ref[]</span> +<span id="LC2" class="line" lang="plaintext"></span> +<span id="LC3" class="line" lang="plaintext">[ref[]: /uri</span> +<span id="LC4" class="line" lang="plaintext">.</span> +<span id="LC5" class="line" lang="plaintext"><p>[foo][ref[]</p></span> +<span id="LC6" class="line" lang="plaintext"><p>[ref[]: /uri</p></span></code></pre> +<copy-code></copy-code> +</div> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="8207:1-8214:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">[foo][ref[bar]]</span> +<span id="LC2" class="line" lang="plaintext"></span> +<span id="LC3" class="line" lang="plaintext">[ref[bar]]: /uri</span> +<span id="LC4" class="line" lang="plaintext">.</span> +<span id="LC5" class="line" lang="plaintext"><p>[foo][ref[bar]]</p></span> +<span id="LC6" class="line" lang="plaintext"><p>[ref[bar]]: /uri</p></span></code></pre> +<copy-code></copy-code> +</div> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="8217:1-8224:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">[[[foo]]]</span> +<span id="LC2" class="line" lang="plaintext"></span> +<span id="LC3" class="line" lang="plaintext">[[[foo]]]: /url</span> +<span id="LC4" class="line" lang="plaintext">.</span> +<span id="LC5" class="line" lang="plaintext"><p>[[[foo]]]</p></span> +<span id="LC6" class="line" lang="plaintext"><p>[[[foo]]]: /url</p></span></code></pre> +<copy-code></copy-code> +</div> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="8227:1-8233:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">[foo][ref\[]</span> +<span id="LC2" class="line" lang="plaintext"></span> +<span id="LC3" class="line" lang="plaintext">[ref\[]: /uri</span> +<span id="LC4" class="line" lang="plaintext">.</span> +<span id="LC5" class="line" lang="plaintext"><p><a href="/uri">foo</a></p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="8236:1-8236:55" dir="auto">Note that in this example <code>]</code> is not backslash-escaped:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="8238:1-8244:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">[bar\\]: /uri</span> +<span id="LC2" class="line" lang="plaintext"></span> +<span id="LC3" class="line" lang="plaintext">[bar\\]</span> +<span id="LC4" class="line" lang="plaintext">.</span> +<span id="LC5" class="line" lang="plaintext"><p><a href="/uri">bar\</a></p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="8247:1-8247:68" dir="auto">A [link label] must contain at least one [non-whitespace character]:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="8249:1-8256:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">[]</span> +<span id="LC2" class="line" lang="plaintext"></span> +<span id="LC3" class="line" lang="plaintext">[]: /uri</span> +<span id="LC4" class="line" lang="plaintext">.</span> +<span id="LC5" class="line" lang="plaintext"><p>[]</p></span> +<span id="LC6" class="line" lang="plaintext"><p>[]: /uri</p></span></code></pre> +<copy-code></copy-code> +</div> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="8259:1-8270:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">[</span> +<span id="LC2" class="line" lang="plaintext"> ]</span> +<span id="LC3" class="line" lang="plaintext"></span> +<span id="LC4" class="line" lang="plaintext">[</span> +<span id="LC5" class="line" lang="plaintext"> ]: /uri</span> +<span id="LC6" class="line" lang="plaintext">.</span> +<span id="LC7" class="line" lang="plaintext"><p>[</span> +<span id="LC8" class="line" lang="plaintext">]</p></span> +<span id="LC9" class="line" lang="plaintext"><p>[</span> +<span id="LC10" class="line" lang="plaintext">]: /uri</p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="8273:1-8280:40" dir="auto">A <a href="@">collapsed reference link</a> +consists of a [link label] that [matches] a +[link reference definition] elsewhere in the +document, followed by the string <code>[]</code>. +The contents of the first link label are parsed as inlines, +which are used as the link's text. The link's URI and title are +provided by the matching reference link definition. Thus, +<code>[foo][]</code> is equivalent to <code>[foo][foo]</code>.</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="8282:1-8288:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">[foo][]</span> +<span id="LC2" class="line" lang="plaintext"></span> +<span id="LC3" class="line" lang="plaintext">[foo]: /url "title"</span> +<span id="LC4" class="line" lang="plaintext">.</span> +<span id="LC5" class="line" lang="plaintext"><p><a href="/url" title="title">foo</a></p></span></code></pre> +<copy-code></copy-code> +</div> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="8291:1-8297:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">[*foo* bar][]</span> +<span id="LC2" class="line" lang="plaintext"></span> +<span id="LC3" class="line" lang="plaintext">[*foo* bar]: /url "title"</span> +<span id="LC4" class="line" lang="plaintext">.</span> +<span id="LC5" class="line" lang="plaintext"><p><a href="/url" title="title"><em>foo</em> bar</a></p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="8300:1-8300:37" dir="auto">The link labels are case-insensitive:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="8302:1-8308:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">[Foo][]</span> +<span id="LC2" class="line" lang="plaintext"></span> +<span id="LC3" class="line" lang="plaintext">[foo]: /url "title"</span> +<span id="LC4" class="line" lang="plaintext">.</span> +<span id="LC5" class="line" lang="plaintext"><p><a href="/url" title="title">Foo</a></p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="8312:1-8313:41" dir="auto">As with full reference links, [whitespace] is not +allowed between the two sets of brackets:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="8315:1-8323:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">[foo] </span> +<span id="LC2" class="line" lang="plaintext">[]</span> +<span id="LC3" class="line" lang="plaintext"></span> +<span id="LC4" class="line" lang="plaintext">[foo]: /url "title"</span> +<span id="LC5" class="line" lang="plaintext">.</span> +<span id="LC6" class="line" lang="plaintext"><p><a href="/url" title="title">foo</a></span> +<span id="LC7" class="line" lang="plaintext">[]</p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="8326:1-8333:41" dir="auto">A <a href="@">shortcut reference link</a> +consists of a [link label] that [matches] a +[link reference definition] elsewhere in the +document and is not followed by <code>[]</code> or a link label. +The contents of the first link label are parsed as inlines, +which are used as the link's text. The link's URI and title +are provided by the matching link reference definition. +Thus, <code>[foo]</code> is equivalent to <code>[foo][]</code>.</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="8335:1-8341:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">[foo]</span> +<span id="LC2" class="line" lang="plaintext"></span> +<span id="LC3" class="line" lang="plaintext">[foo]: /url "title"</span> +<span id="LC4" class="line" lang="plaintext">.</span> +<span id="LC5" class="line" lang="plaintext"><p><a href="/url" title="title">foo</a></p></span></code></pre> +<copy-code></copy-code> +</div> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="8344:1-8350:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">[*foo* bar]</span> +<span id="LC2" class="line" lang="plaintext"></span> +<span id="LC3" class="line" lang="plaintext">[*foo* bar]: /url "title"</span> +<span id="LC4" class="line" lang="plaintext">.</span> +<span id="LC5" class="line" lang="plaintext"><p><a href="/url" title="title"><em>foo</em> bar</a></p></span></code></pre> +<copy-code></copy-code> +</div> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="8353:1-8359:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">[[*foo* bar]]</span> +<span id="LC2" class="line" lang="plaintext"></span> +<span id="LC3" class="line" lang="plaintext">[*foo* bar]: /url "title"</span> +<span id="LC4" class="line" lang="plaintext">.</span> +<span id="LC5" class="line" lang="plaintext"><p>[<a href="/url" title="title"><em>foo</em> bar</a>]</p></span></code></pre> +<copy-code></copy-code> +</div> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="8362:1-8368:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">[[bar [foo]</span> +<span id="LC2" class="line" lang="plaintext"></span> +<span id="LC3" class="line" lang="plaintext">[foo]: /url</span> +<span id="LC4" class="line" lang="plaintext">.</span> +<span id="LC5" class="line" lang="plaintext"><p>[[bar <a href="/url">foo</a></p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="8371:1-8371:37" dir="auto">The link labels are case-insensitive:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="8373:1-8379:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">[Foo]</span> +<span id="LC2" class="line" lang="plaintext"></span> +<span id="LC3" class="line" lang="plaintext">[foo]: /url "title"</span> +<span id="LC4" class="line" lang="plaintext">.</span> +<span id="LC5" class="line" lang="plaintext"><p><a href="/url" title="title">Foo</a></p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="8382:1-8382:48" dir="auto">A space after the link text should be preserved:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="8384:1-8390:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">[foo] bar</span> +<span id="LC2" class="line" lang="plaintext"></span> +<span id="LC3" class="line" lang="plaintext">[foo]: /url</span> +<span id="LC4" class="line" lang="plaintext">.</span> +<span id="LC5" class="line" lang="plaintext"><p><a href="/url">foo</a> bar</p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="8393:1-8394:31" dir="auto">If you just want bracketed text, you can backslash-escape the +opening bracket to avoid links:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="8396:1-8402:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">\[foo]</span> +<span id="LC2" class="line" lang="plaintext"></span> +<span id="LC3" class="line" lang="plaintext">[foo]: /url "title"</span> +<span id="LC4" class="line" lang="plaintext">.</span> +<span id="LC5" class="line" lang="plaintext"><p>[foo]</p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="8405:1-8406:26" dir="auto">Note that this is a link, because a link label ends with the first +following closing bracket:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="8408:1-8414:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">[foo*]: /url</span> +<span id="LC2" class="line" lang="plaintext"></span> +<span id="LC3" class="line" lang="plaintext">*[foo*]</span> +<span id="LC4" class="line" lang="plaintext">.</span> +<span id="LC5" class="line" lang="plaintext"><p>*<a href="/url">foo*</a></p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="8417:1-8418:11" dir="auto">Full and compact references take precedence over shortcut +references:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="8420:1-8427:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">[foo][bar]</span> +<span id="LC2" class="line" lang="plaintext"></span> +<span id="LC3" class="line" lang="plaintext">[foo]: /url1</span> +<span id="LC4" class="line" lang="plaintext">[bar]: /url2</span> +<span id="LC5" class="line" lang="plaintext">.</span> +<span id="LC6" class="line" lang="plaintext"><p><a href="/url2">foo</a></p></span></code></pre> +<copy-code></copy-code> +</div> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="8429:1-8435:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">[foo][]</span> +<span id="LC2" class="line" lang="plaintext"></span> +<span id="LC3" class="line" lang="plaintext">[foo]: /url1</span> +<span id="LC4" class="line" lang="plaintext">.</span> +<span id="LC5" class="line" lang="plaintext"><p><a href="/url1">foo</a></p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="8437:1-8437:34" dir="auto">Inline links also take precedence:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="8439:1-8445:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">[foo]()</span> +<span id="LC2" class="line" lang="plaintext"></span> +<span id="LC3" class="line" lang="plaintext">[foo]: /url1</span> +<span id="LC4" class="line" lang="plaintext">.</span> +<span id="LC5" class="line" lang="plaintext"><p><a href="">foo</a></p></span></code></pre> +<copy-code></copy-code> +</div> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="8447:1-8453:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">[foo](not a link)</span> +<span id="LC2" class="line" lang="plaintext"></span> +<span id="LC3" class="line" lang="plaintext">[foo]: /url1</span> +<span id="LC4" class="line" lang="plaintext">.</span> +<span id="LC5" class="line" lang="plaintext"><p><a href="/url1">foo</a>(not a link)</p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="8455:1-8456:23" dir="auto">In the following case <code>[bar][baz]</code> is parsed as a reference, +<code>[foo]</code> as normal text:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="8458:1-8464:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">[foo][bar][baz]</span> +<span id="LC2" class="line" lang="plaintext"></span> +<span id="LC3" class="line" lang="plaintext">[baz]: /url</span> +<span id="LC4" class="line" lang="plaintext">.</span> +<span id="LC5" class="line" lang="plaintext"><p>[foo]<a href="/url">bar</a></p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="8467:1-8468:19" dir="auto">Here, though, <code>[foo][bar]</code> is parsed as a reference, since +<code>[bar]</code> is defined:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="8470:1-8477:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">[foo][bar][baz]</span> +<span id="LC2" class="line" lang="plaintext"></span> +<span id="LC3" class="line" lang="plaintext">[baz]: /url1</span> +<span id="LC4" class="line" lang="plaintext">[bar]: /url2</span> +<span id="LC5" class="line" lang="plaintext">.</span> +<span id="LC6" class="line" lang="plaintext"><p><a href="/url2">foo</a><a href="/url1">baz</a></p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="8480:1-8481:65" dir="auto">Here <code>[foo]</code> is not parsed as a shortcut reference, because it +is followed by a link label (even though <code>[bar]</code> is not defined):</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="8483:1-8490:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">[foo][bar][baz]</span> +<span id="LC2" class="line" lang="plaintext"></span> +<span id="LC3" class="line" lang="plaintext">[baz]: /url1</span> +<span id="LC4" class="line" lang="plaintext">[foo]: /url2</span> +<span id="LC5" class="line" lang="plaintext">.</span> +<span id="LC6" class="line" lang="plaintext"><p>[foo]<a href="/url1">bar</a></p></span></code></pre> +<copy-code></copy-code> +</div> +<h2 data-sourcepos="8494:1-8494:9" dir="auto"> +<a id="user-content-images" class="anchor" href="#images" aria-hidden="true"></a>Images</h2> +<p data-sourcepos="8496:1-8504:55" dir="auto">Syntax for images is like the syntax for links, with one +difference. Instead of [link text], we have an +<a href="@">image description</a>. The rules for this are the +same as for [link text], except that (a) an +image description starts with <code>![</code> rather than <code>[</code>, and +(b) an image description may contain links. +An image description has inline elements +as its contents. When an image is rendered to HTML, +this is standardly used as the image's <code>alt</code> attribute.</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="8506:1-8510:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">![foo](/url "title")</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p><img src="/url" alt="foo" title="title" /></p></span></code></pre> +<copy-code></copy-code> +</div> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="8513:1-8519:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">![foo *bar*]</span> +<span id="LC2" class="line" lang="plaintext"></span> +<span id="LC3" class="line" lang="plaintext">[foo *bar*]: train.jpg "train & tracks"</span> +<span id="LC4" class="line" lang="plaintext">.</span> +<span id="LC5" class="line" lang="plaintext"><p><img src="train.jpg" alt="foo bar" title="train &amp; tracks" /></p></span></code></pre> +<copy-code></copy-code> +</div> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="8522:1-8526:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">![foo ![bar](/url)](/url2)</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p><img src="/url2" alt="foo bar" /></p></span></code></pre> +<copy-code></copy-code> +</div> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="8529:1-8533:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">![foo [bar](/url)](/url2)</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p><img src="/url2" alt="foo bar" /></p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="8536:1-8541:40" dir="auto">Though this spec is concerned with parsing, not rendering, it is +recommended that in rendering to HTML, only the plain string content +of the [image description] be used. Note that in +the above example, the alt attribute's value is <code>foo bar</code>, not <code>foo [bar](/url)</code> or <code>foo <a href="/url">bar</a></code>. Only the plain string +content is rendered, without formatting.</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="8543:1-8549:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">![foo *bar*][]</span> +<span id="LC2" class="line" lang="plaintext"></span> +<span id="LC3" class="line" lang="plaintext">[foo *bar*]: train.jpg "train & tracks"</span> +<span id="LC4" class="line" lang="plaintext">.</span> +<span id="LC5" class="line" lang="plaintext"><p><img src="train.jpg" alt="foo bar" title="train &amp; tracks" /></p></span></code></pre> +<copy-code></copy-code> +</div> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="8552:1-8558:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">![foo *bar*][foobar]</span> +<span id="LC2" class="line" lang="plaintext"></span> +<span id="LC3" class="line" lang="plaintext">[FOOBAR]: train.jpg "train & tracks"</span> +<span id="LC4" class="line" lang="plaintext">.</span> +<span id="LC5" class="line" lang="plaintext"><p><img src="train.jpg" alt="foo bar" title="train &amp; tracks" /></p></span></code></pre> +<copy-code></copy-code> +</div> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="8561:1-8565:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">![foo](train.jpg)</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p><img src="train.jpg" alt="foo" /></p></span></code></pre> +<copy-code></copy-code> +</div> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="8568:1-8572:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">My ![foo bar](/path/to/train.jpg "title" )</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p>My <img src="/path/to/train.jpg" alt="foo bar" title="title" /></p></span></code></pre> +<copy-code></copy-code> +</div> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="8575:1-8579:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">![foo](<url>)</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p><img src="url" alt="foo" /></p></span></code></pre> +<copy-code></copy-code> +</div> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="8582:1-8586:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">![](/url)</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p><img src="/url" alt="" /></p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="8589:1-8589:16" dir="auto">Reference-style:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="8591:1-8597:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">![foo][bar]</span> +<span id="LC2" class="line" lang="plaintext"></span> +<span id="LC3" class="line" lang="plaintext">[bar]: /url</span> +<span id="LC4" class="line" lang="plaintext">.</span> +<span id="LC5" class="line" lang="plaintext"><p><img src="/url" alt="foo" /></p></span></code></pre> +<copy-code></copy-code> +</div> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="8600:1-8606:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">![foo][bar]</span> +<span id="LC2" class="line" lang="plaintext"></span> +<span id="LC3" class="line" lang="plaintext">[BAR]: /url</span> +<span id="LC4" class="line" lang="plaintext">.</span> +<span id="LC5" class="line" lang="plaintext"><p><img src="/url" alt="foo" /></p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="8609:1-8609:10" dir="auto">Collapsed:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="8611:1-8617:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">![foo][]</span> +<span id="LC2" class="line" lang="plaintext"></span> +<span id="LC3" class="line" lang="plaintext">[foo]: /url "title"</span> +<span id="LC4" class="line" lang="plaintext">.</span> +<span id="LC5" class="line" lang="plaintext"><p><img src="/url" alt="foo" title="title" /></p></span></code></pre> +<copy-code></copy-code> +</div> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="8620:1-8626:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">![*foo* bar][]</span> +<span id="LC2" class="line" lang="plaintext"></span> +<span id="LC3" class="line" lang="plaintext">[*foo* bar]: /url "title"</span> +<span id="LC4" class="line" lang="plaintext">.</span> +<span id="LC5" class="line" lang="plaintext"><p><img src="/url" alt="foo bar" title="title" /></p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="8629:1-8629:32" dir="auto">The labels are case-insensitive:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="8631:1-8637:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">![Foo][]</span> +<span id="LC2" class="line" lang="plaintext"></span> +<span id="LC3" class="line" lang="plaintext">[foo]: /url "title"</span> +<span id="LC4" class="line" lang="plaintext">.</span> +<span id="LC5" class="line" lang="plaintext"><p><img src="/url" alt="Foo" title="title" /></p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="8640:1-8641:33" dir="auto">As with reference links, [whitespace] is not allowed +between the two sets of brackets:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="8643:1-8651:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">![foo] </span> +<span id="LC2" class="line" lang="plaintext">[]</span> +<span id="LC3" class="line" lang="plaintext"></span> +<span id="LC4" class="line" lang="plaintext">[foo]: /url "title"</span> +<span id="LC5" class="line" lang="plaintext">.</span> +<span id="LC6" class="line" lang="plaintext"><p><img src="/url" alt="foo" title="title" /></span> +<span id="LC7" class="line" lang="plaintext">[]</p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="8654:1-8654:9" dir="auto">Shortcut:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="8656:1-8662:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">![foo]</span> +<span id="LC2" class="line" lang="plaintext"></span> +<span id="LC3" class="line" lang="plaintext">[foo]: /url "title"</span> +<span id="LC4" class="line" lang="plaintext">.</span> +<span id="LC5" class="line" lang="plaintext"><p><img src="/url" alt="foo" title="title" /></p></span></code></pre> +<copy-code></copy-code> +</div> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="8665:1-8671:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">![*foo* bar]</span> +<span id="LC2" class="line" lang="plaintext"></span> +<span id="LC3" class="line" lang="plaintext">[*foo* bar]: /url "title"</span> +<span id="LC4" class="line" lang="plaintext">.</span> +<span id="LC5" class="line" lang="plaintext"><p><img src="/url" alt="foo bar" title="title" /></p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="8674:1-8674:56" dir="auto">Note that link labels cannot contain unescaped brackets:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="8676:1-8683:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">![[foo]]</span> +<span id="LC2" class="line" lang="plaintext"></span> +<span id="LC3" class="line" lang="plaintext">[[foo]]: /url "title"</span> +<span id="LC4" class="line" lang="plaintext">.</span> +<span id="LC5" class="line" lang="plaintext"><p>![[foo]]</p></span> +<span id="LC6" class="line" lang="plaintext"><p>[[foo]]: /url &quot;title&quot;</p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="8686:1-8686:37" dir="auto">The link labels are case-insensitive:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="8688:1-8694:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">![Foo]</span> +<span id="LC2" class="line" lang="plaintext"></span> +<span id="LC3" class="line" lang="plaintext">[foo]: /url "title"</span> +<span id="LC4" class="line" lang="plaintext">.</span> +<span id="LC5" class="line" lang="plaintext"><p><img src="/url" alt="Foo" title="title" /></p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="8697:1-8698:33" dir="auto">If you just want a literal <code>!</code> followed by bracketed text, you can +backslash-escape the opening <code>[</code>:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="8700:1-8706:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">!\[foo]</span> +<span id="LC2" class="line" lang="plaintext"></span> +<span id="LC3" class="line" lang="plaintext">[foo]: /url "title"</span> +<span id="LC4" class="line" lang="plaintext">.</span> +<span id="LC5" class="line" lang="plaintext"><p>![foo]</p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="8709:1-8710:4" dir="auto">If you want a link after a literal <code>!</code>, backslash-escape the +<code>!</code>:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="8712:1-8718:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">\![foo]</span> +<span id="LC2" class="line" lang="plaintext"></span> +<span id="LC3" class="line" lang="plaintext">[foo]: /url "title"</span> +<span id="LC4" class="line" lang="plaintext">.</span> +<span id="LC5" class="line" lang="plaintext"><p>!<a href="/url" title="title">foo</a></p></span></code></pre> +<copy-code></copy-code> +</div> +<h2 data-sourcepos="8721:1-8721:12" dir="auto"> +<a id="user-content-autolinks" class="anchor" href="#autolinks" aria-hidden="true"></a>Autolinks</h2> +<p data-sourcepos="8723:1-8725:18" dir="auto"><a href="@">Autolink</a>s are absolute URIs and email addresses inside +<code><</code> and <code>></code>. They are parsed as links, with the URL or email address +as the link label.</p> +<p data-sourcepos="8727:1-8729:52" dir="auto">A <a href="@">URI autolink</a> consists of <code><</code>, followed by an +[absolute URI] followed by <code>></code>. It is parsed as +a link to the URI, with the URI as the link's label.</p> +<p data-sourcepos="8731:1-8736:25" dir="auto">An <a href="@">absolute URI</a>, +for these purposes, consists of a [scheme] followed by a colon (<code>:</code>) +followed by zero or more characters other than ASCII +[whitespace] and control characters, <code><</code>, and <code>></code>. If +the URI includes these characters, they must be percent-encoded +(e.g. <code>%20</code> for a space).</p> +<p data-sourcepos="8738:1-8741:37" dir="auto">For purposes of this spec, a <a href="@">scheme</a> is any sequence +of 2--32 characters beginning with an ASCII letter and followed +by any combination of ASCII letters, digits, or the symbols plus +("+"), period ("."), or hyphen ("-").</p> +<p data-sourcepos="8743:1-8743:30" dir="auto">Here are some valid autolinks:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="8745:1-8749:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext"><http://foo.bar.baz></span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p><a href="http://foo.bar.baz">http://foo.bar.baz</a></p></span></code></pre> +<copy-code></copy-code> +</div> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="8752:1-8756:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext"><http://foo.bar.baz/test?q=hello&id=22&boolean></span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p><a href="http://foo.bar.baz/test?q=hello&amp;id=22&amp;boolean">http://foo.bar.baz/test?q=hello&amp;id=22&amp;boolean</a></p></span></code></pre> +<copy-code></copy-code> +</div> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="8759:1-8763:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext"><irc://foo.bar:2233/baz></span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p><a href="irc://foo.bar:2233/baz">irc://foo.bar:2233/baz</a></p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="8766:1-8766:23" dir="auto">Uppercase is also fine:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="8768:1-8772:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext"><MAILTO:FOO@BAR.BAZ></span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p><a href="MAILTO:FOO@BAR.BAZ">MAILTO:FOO@BAR.BAZ</a></p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="8775:1-8778:18" dir="auto">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> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="8780:1-8784:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext"><a+b+c:d></span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p><a href="a+b+c:d">a+b+c:d</a></p></span></code></pre> +<copy-code></copy-code> +</div> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="8787:1-8791:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext"><made-up-scheme://foo,bar></span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p><a href="made-up-scheme://foo,bar">made-up-scheme://foo,bar</a></p></span></code></pre> +<copy-code></copy-code> +</div> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="8794:1-8798:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext"><http://../></span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p><a href="http://../">http://../</a></p></span></code></pre> +<copy-code></copy-code> +</div> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="8801:1-8805:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext"><localhost:5001/foo></span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p><a href="localhost:5001/foo">localhost:5001/foo</a></p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="8808:1-8808:36" dir="auto">Spaces are not allowed in autolinks:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="8810:1-8814:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext"><http://foo.bar/baz bim></span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p>&lt;http://foo.bar/baz bim&gt;</p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="8817:1-8817:47" dir="auto">Backslash-escapes do not work inside autolinks:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="8819:1-8823:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext"><http://example.com/\[\></span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p><a href="http://example.com/%5C%5B%5C">http://example.com/\[\</a></p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="8826:1-8829:55" dir="auto">An <a href="@">email autolink</a> +consists of <code><</code>, followed by an [email address], +followed by <code>></code>. The link's label is the email address, +and the URL is <code>mailto:</code> followed by the email address.</p> +<p data-sourcepos="8831:1-8834:83" dir="auto">An <a href="@">email address</a>, +for these purposes, is anything that matches +the <a href="https://html.spec.whatwg.org/multipage/forms.html#e-mail-state-(type=email)" rel="nofollow noreferrer noopener" target="_blank">non-normative regex from the HTML5 +spec</a>:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="8836:5-8838:0" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">/^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?</span> +<span id="LC2" class="line" lang="plaintext">(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/</span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="8839:1-8839:28" dir="auto">Examples of email autolinks:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="8841:1-8845:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext"><foo@bar.example.com></span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p><a href="mailto:foo@bar.example.com">foo@bar.example.com</a></p></span></code></pre> +<copy-code></copy-code> +</div> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="8848:1-8852:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext"><foo+special@Bar.baz-bar0.com></span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p><a href="mailto:foo+special@Bar.baz-bar0.com">foo+special@Bar.baz-bar0.com</a></p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="8855:1-8855:53" dir="auto">Backslash-escapes do not work inside email autolinks:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="8857:1-8861:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext"><foo\+@bar.example.com></span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p>&lt;foo+@bar.example.com&gt;</p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="8864:1-8864:24" dir="auto">These are not autolinks:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="8866:1-8870:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext"><></span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p>&lt;&gt;</p></span></code></pre> +<copy-code></copy-code> +</div> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="8873:1-8877:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">< http://foo.bar ></span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p>&lt; http://foo.bar &gt;</p></span></code></pre> +<copy-code></copy-code> +</div> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="8880:1-8884:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext"><m:abc></span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p>&lt;m:abc&gt;</p></span></code></pre> +<copy-code></copy-code> +</div> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="8887:1-8891:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext"><foo.bar.baz></span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p>&lt;foo.bar.baz&gt;</p></span></code></pre> +<copy-code></copy-code> +</div> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="8894:1-8898:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">http://example.com</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p>http://example.com</p></span></code></pre> +<copy-code></copy-code> +</div> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="8901:1-8905:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">foo@bar.example.com</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p>foo@bar.example.com</p></span></code></pre> +<copy-code></copy-code> +</div> +<div> +<h2 data-sourcepos="8909:1-8909:24"> +<a id="user-content-autolinks-extension" class="anchor" href="#autolinks-extension" aria-hidden="true"></a>Autolinks (extension)</h2> +<p data-sourcepos="8911:1-8912:29">GFM enables the <code>autolink</code> extension, where autolinks will be recognised in a +greater number of conditions.</p> +<p data-sourcepos="8914:1-8918:8">[Autolink]s can also be constructed without requiring the use of <code><</code> and to <code>></code> +to delimit them, although they will be recognized under a smaller set of +circumstances. All such recognized autolinks can only come at the beginning of +a line, after whitespace, or any of the delimiting characters <code>*</code>, <code>_</code>, <code>~</code>, +and <code>(</code>.</p> +<p data-sourcepos="8920:1-8926:73">An <a href="@">extended www autolink</a> will be recognized +when the text <code>www.</code> is found followed by a [valid domain]. +A <a href="@">valid domain</a> consists of segments +of alphanumeric characters, underscores (<code>_</code>) and hyphens (<code>-</code>) +separated by periods (<code>.</code>). +There must be at least one period, +and no underscores may be present in the last two segments of the domain.</p> +<p data-sourcepos="8928:1-8928:49">The scheme <code>http</code> will be inserted automatically:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="8930:1-8934:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">www.commonmark.org</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p><a href="http://www.commonmark.org">www.commonmark.org</a></p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="8936:1-8936:77">After a [valid domain], zero or more non-space non-<code><</code> characters may follow:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="8938:1-8942:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">Visit www.commonmark.org/help for more information.</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p>Visit <a href="http://www.commonmark.org/help">www.commonmark.org/help</a> for more information.</p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="8944:1-8944:64">We then apply <a href="@">extended autolink path validation</a> as follows:</p> +<p data-sourcepos="8946:1-8948:21">Trailing punctuation (specifically, <code>?</code>, <code>!</code>, <code>.</code>, <code>,</code>, <code>:</code>, <code>*</code>, <code>_</code>, and <code>~</code>) +will not be considered part of the autolink, though they may be included in the +interior of the link:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="8950:1-8957:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">Visit www.commonmark.org.</span> +<span id="LC2" class="line" lang="plaintext"></span> +<span id="LC3" class="line" lang="plaintext">Visit www.commonmark.org/a.b.</span> +<span id="LC4" class="line" lang="plaintext">.</span> +<span id="LC5" class="line" lang="plaintext"><p>Visit <a href="http://www.commonmark.org">www.commonmark.org</a>.</p></span> +<span id="LC6" class="line" lang="plaintext"><p>Visit <a href="http://www.commonmark.org/a.b">www.commonmark.org/a.b</a>.</p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="8959:1-8962:76">When an autolink ends in <code>)</code>, we scan the entire autolink for the total number +of parentheses. If there is a greater number of closing parentheses than +opening ones, we don't consider the unmatched trailing parentheses part of the +autolink, in order to facilitate including an autolink inside a parenthesis:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="8964:1-8977:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">www.google.com/search?q=Markup+(business)</span> +<span id="LC2" class="line" lang="plaintext"></span> +<span id="LC3" class="line" lang="plaintext">www.google.com/search?q=Markup+(business)))</span> +<span id="LC4" class="line" lang="plaintext"></span> +<span id="LC5" class="line" lang="plaintext">(www.google.com/search?q=Markup+(business))</span> +<span id="LC6" class="line" lang="plaintext"></span> +<span id="LC7" class="line" lang="plaintext">(www.google.com/search?q=Markup+(business)</span> +<span id="LC8" class="line" lang="plaintext">.</span> +<span id="LC9" class="line" lang="plaintext"><p><a href="http://www.google.com/search?q=Markup+(business)">www.google.com/search?q=Markup+(business)</a></p></span> +<span id="LC10" class="line" lang="plaintext"><p><a href="http://www.google.com/search?q=Markup+(business)">www.google.com/search?q=Markup+(business)</a>))</p></span> +<span id="LC11" class="line" lang="plaintext"><p>(<a href="http://www.google.com/search?q=Markup+(business)">www.google.com/search?q=Markup+(business)</a>)</p></span> +<span id="LC12" class="line" lang="plaintext"><p>(<a href="http://www.google.com/search?q=Markup+(business)">www.google.com/search?q=Markup+(business)</a></p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="8979:1-8981:8">This check is only done when the link ends in a closing parentheses <code>)</code>, so if +the only parentheses are in the interior of the autolink, no special rules are +applied:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="8983:1-8987:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">www.google.com/search?q=(business))+ok</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p><a href="http://www.google.com/search?q=(business))+ok">www.google.com/search?q=(business))+ok</a></p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="8989:1-8992:13">If an autolink ends in a semicolon (<code>;</code>), we check to see if it appears to +resemble an [entity reference][entity references]; if the preceding text is <code>&</code> +followed by one or more alphanumeric characters. If so, it is excluded from +the autolink:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="8994:1-9001:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">www.google.com/search?q=commonmark&hl=en</span> +<span id="LC2" class="line" lang="plaintext"></span> +<span id="LC3" class="line" lang="plaintext">www.google.com/search?q=commonmark&hl;</span> +<span id="LC4" class="line" lang="plaintext">.</span> +<span id="LC5" class="line" lang="plaintext"><p><a href="http://www.google.com/search?q=commonmark&amp;hl=en">www.google.com/search?q=commonmark&amp;hl=en</a></p></span> +<span id="LC6" class="line" lang="plaintext"><p><a href="http://www.google.com/search?q=commonmark">www.google.com/search?q=commonmark</a>&amp;hl;</p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="9003:1-9003:33"><code><</code> immediately ends an autolink.</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="9005:1-9009:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">www.commonmark.org/he<lp</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p><a href="http://www.commonmark.org/he">www.commonmark.org/he</a>&lt;lp</p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="9011:1-9014:36">An <a href="@">extended url autolink</a> will be recognised when one of the schemes +<code>http://</code>, <code>https://</code>, or <code>ftp://</code>, followed by a [valid domain], then zero or +more non-space non-<code><</code> characters according to +[extended autolink path validation]:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="9016:1-9026:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">http://commonmark.org</span> +<span id="LC2" class="line" lang="plaintext"></span> +<span id="LC3" class="line" lang="plaintext">(Visit https://encrypted.google.com/search?q=Markup+(business))</span> +<span id="LC4" class="line" lang="plaintext"></span> +<span id="LC5" class="line" lang="plaintext">Anonymous FTP is available at ftp://foo.bar.baz.</span> +<span id="LC6" class="line" lang="plaintext">.</span> +<span id="LC7" class="line" lang="plaintext"><p><a href="http://commonmark.org">http://commonmark.org</a></p></span> +<span id="LC8" class="line" lang="plaintext"><p>(Visit <a href="https://encrypted.google.com/search?q=Markup+(business)">https://encrypted.google.com/search?q=Markup+(business)</a>)</p></span> +<span id="LC9" class="line" lang="plaintext"><p>Anonymous FTP is available at <a href="ftp://foo.bar.baz">ftp://foo.bar.baz</a>.</p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="9029:1-9031:20">An <a href="@">extended email autolink</a> will be recognised when an email address is +recognised within any text node. Email addresses are recognised according to +the following rules:</p> +<ul data-sourcepos="9033:1-9039:0"> +<li data-sourcepos="9033:1-9033:75">One ore more characters which are alphanumeric, or <code>.</code>, <code>-</code>, <code>_</code>, or <code>+</code>.</li> +<li data-sourcepos="9034:1-9034:16">An <code>@</code> symbol.</li> +<li data-sourcepos="9035:1-9039:0">One or more characters which are alphanumeric, or <code>-</code> or <code>_</code>, +separated by periods (<code>.</code>). +There must be at least one period. +The last character must not be one of <code>-</code> or <code>_</code>.</li> +</ul> +<p data-sourcepos="9040:1-9040:71">The scheme <code>mailto:</code> will automatically be added to the generated link:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="9042:1-9046:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">foo@bar.baz</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p><a href="mailto:foo@bar.baz">foo@bar.baz</a></p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="9048:1-9048:44"><code>+</code> can occur before the <code>@</code>, but not after.</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="9050:1-9054:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">hello@mail+xyz.example isn't valid, but hello+xyz@mail.example is.</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p>hello@mail+xyz.example isn't valid, but <a href="mailto:hello+xyz@mail.example">hello+xyz@mail.example</a> is.</p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="9056:1-9058:12"><code>.</code>, <code>-</code>, and <code>_</code> can occur on both sides of the <code>@</code>, but only <code>.</code> may occur at +the end of the email address, in which case it will not be considered part of +the address:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="9060:1-9073:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">a.b-c_d@a.b</span> +<span id="LC2" class="line" lang="plaintext"></span> +<span id="LC3" class="line" lang="plaintext">a.b-c_d@a.b.</span> +<span id="LC4" class="line" lang="plaintext"></span> +<span id="LC5" class="line" lang="plaintext">a.b-c_d@a.b-</span> +<span id="LC6" class="line" lang="plaintext"></span> +<span id="LC7" class="line" lang="plaintext">a.b-c_d@a.b_</span> +<span id="LC8" class="line" lang="plaintext">.</span> +<span id="LC9" class="line" lang="plaintext"><p><a href="mailto:a.b-c_d@a.b">a.b-c_d@a.b</a></p></span> +<span id="LC10" class="line" lang="plaintext"><p><a href="mailto:a.b-c_d@a.b">a.b-c_d@a.b</a>.</p></span> +<span id="LC11" class="line" lang="plaintext"><p>a.b-c_d@a.b-</p></span> +<span id="LC12" class="line" lang="plaintext"><p>a.b-c_d@a.b_</p></span></code></pre> +<copy-code></copy-code> +</div> +</div> +<h2 data-sourcepos="9077:1-9077:11" dir="auto"> +<a id="user-content-raw-html" class="anchor" href="#raw-html" aria-hidden="true"></a>Raw HTML</h2> +<p data-sourcepos="9079:1-9082:57" dir="auto">Text between <code><</code> and <code>></code> that looks like an HTML tag is parsed as a +raw HTML tag and will be rendered in HTML without escaping. +Tag and attribute names are not limited to current HTML tags, +so custom tags (and even, say, DocBook tags) may be used.</p> +<p data-sourcepos="9084:1-9084:29" dir="auto">Here is the grammar for tags:</p> +<p data-sourcepos="9086:1-9088:14" dir="auto">A <a href="@">tag name</a> consists of an ASCII letter +followed by zero or more ASCII letters, digits, or +hyphens (<code>-</code>).</p> +<p data-sourcepos="9090:1-9092:32" dir="auto">An <a href="@">attribute</a> consists of [whitespace], +an [attribute name], and an optional +[attribute value specification].</p> +<p data-sourcepos="9094:1-9097:52" dir="auto">An <a href="@">attribute name</a> +consists of an ASCII letter, <code>_</code>, or <code>:</code>, followed by zero or more ASCII +letters, digits, <code>_</code>, <code>.</code>, <code>:</code>, or <code>-</code>. (Note: This is the XML +specification restricted to ASCII. HTML5 is laxer.)</p> +<p data-sourcepos="9099:1-9102:7" dir="auto">An <a href="@">attribute value specification</a> +consists of optional [whitespace], +a <code>=</code> character, optional [whitespace], and an [attribute +value].</p> +<p data-sourcepos="9104:1-9106:72" dir="auto">An <a href="@">attribute value</a> +consists of an [unquoted attribute value], +a [single-quoted attribute value], or a [double-quoted attribute value].</p> +<p data-sourcepos="9108:1-9110:60" dir="auto">An <a href="@">unquoted attribute value</a> +is a nonempty string of characters not +including [whitespace], <code>"</code>, <code>'</code>, <code>=</code>, <code><</code>, <code>></code>, or <code>`</code>.</p> +<p data-sourcepos="9112:1-9114:46" dir="auto">A <a href="@">single-quoted attribute value</a> +consists of <code>'</code>, zero or more +characters not including <code>'</code>, and a final <code>'</code>.</p> +<p data-sourcepos="9116:1-9118:46" dir="auto">A <a href="@">double-quoted attribute value</a> +consists of <code>"</code>, zero or more +characters not including <code>"</code>, and a final <code>"</code>.</p> +<p data-sourcepos="9120:1-9122:31" dir="auto">An <a href="@">open tag</a> consists of a <code><</code> character, a [tag name], +zero or more [attributes], optional [whitespace], an optional <code>/</code> +character, and a <code>></code> character.</p> +<p data-sourcepos="9124:1-9125:57" dir="auto">A <a href="@">closing tag</a> consists of the string <code></</code>, a +[tag name], optional [whitespace], and the character <code>></code>.</p> +<p data-sourcepos="9127:1-9130:63" dir="auto">An <a href="@">HTML comment</a> consists of <code><!--</code> + <em>text</em> + <code>--></code>, +where <em>text</em> does not start with <code>></code> or <code>-></code>, does not end with <code>-</code>, +and does not contain <code>--</code>. (See the +<a href="http://www.w3.org/TR/html5/syntax.html#comments" rel="nofollow noreferrer noopener" target="_blank">HTML5 spec</a>.)</p> +<p data-sourcepos="9132:1-9135:5" dir="auto">A <a href="@">processing instruction</a> +consists of the string <code><?</code>, a string +of characters not including the string <code>?></code>, and the string +<code>?></code>.</p> +<p data-sourcepos="9137:1-9140:37" dir="auto">A <a href="@">declaration</a> consists of the +string <code><!</code>, a name consisting of one or more uppercase ASCII letters, +[whitespace], a string of characters not including the +character <code>></code>, and the character <code>></code>.</p> +<p data-sourcepos="9142:1-9144:28" dir="auto">A <a href="@">CDATA section</a> consists of +the string <code><![CDATA[</code>, a string of characters not including the string +<code>]]></code>, and the string <code>]]></code>.</p> +<p data-sourcepos="9146:1-9148:21" dir="auto">An <a href="@">HTML tag</a> consists of an [open tag], a [closing tag], +an [HTML comment], a [processing instruction], a [declaration], +or a [CDATA section].</p> +<p data-sourcepos="9150:1-9150:31" dir="auto">Here are some simple open tags:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="9152:1-9156:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext"><a><bab><c2c></span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p><a><bab><c2c></p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="9159:1-9159:15" dir="auto">Empty elements:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="9161:1-9165:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext"><a/><b2/></span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p><a/><b2/></p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="9168:1-9168:24" dir="auto">[Whitespace] is allowed:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="9170:1-9176:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext"><a /><b2</span> +<span id="LC2" class="line" lang="plaintext">data="foo" ></span> +<span id="LC3" class="line" lang="plaintext">.</span> +<span id="LC4" class="line" lang="plaintext"><p><a /><b2</span> +<span id="LC5" class="line" lang="plaintext">data="foo" ></p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="9179:1-9179:16" dir="auto">With attributes:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="9181:1-9187:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext"><a foo="bar" bam = 'baz <em>"</em>'</span> +<span id="LC2" class="line" lang="plaintext">_boolean zoop:33=zoop:33 /></span> +<span id="LC3" class="line" lang="plaintext">.</span> +<span id="LC4" class="line" lang="plaintext"><p><a foo="bar" bam = 'baz <em>"</em>'</span> +<span id="LC5" class="line" lang="plaintext">_boolean zoop:33=zoop:33 /></p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="9190:1-9190:29" dir="auto">Custom tag names can be used:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="9192:1-9196:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">Foo <responsive-image src="foo.jpg" /></span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p>Foo <responsive-image src="foo.jpg" /></p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="9199:1-9199:38" dir="auto">Illegal tag names, not parsed as HTML:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="9201:1-9205:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext"><33> <__></span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p>&lt;33&gt; &lt;__&gt;</p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="9208:1-9208:24" dir="auto">Illegal attribute names:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="9210:1-9214:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext"><a h*#ref="hi"></span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p>&lt;a h*#ref=&quot;hi&quot;&gt;</p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="9217:1-9217:25" dir="auto">Illegal attribute values:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="9219:1-9223:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext"><a href="hi'> <a href=hi'></span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p>&lt;a href=&quot;hi'&gt; &lt;a href=hi'&gt;</p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="9226:1-9226:21" dir="auto">Illegal [whitespace]:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="9228:1-9238:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">< a><</span> +<span id="LC2" class="line" lang="plaintext">foo><bar/ ></span> +<span id="LC3" class="line" lang="plaintext"><foo bar=baz</span> +<span id="LC4" class="line" lang="plaintext">bim!bop /></span> +<span id="LC5" class="line" lang="plaintext">.</span> +<span id="LC6" class="line" lang="plaintext"><p>&lt; a&gt;&lt;</span> +<span id="LC7" class="line" lang="plaintext">foo&gt;&lt;bar/ &gt;</span> +<span id="LC8" class="line" lang="plaintext">&lt;foo bar=baz</span> +<span id="LC9" class="line" lang="plaintext">bim!bop /&gt;</p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="9241:1-9241:21" dir="auto">Missing [whitespace]:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="9243:1-9247:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext"><a href='bar'title=title></span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p>&lt;a href='bar'title=title&gt;</p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="9250:1-9250:13" dir="auto">Closing tags:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="9252:1-9256:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext"></a></foo ></span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p></a></foo ></p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="9259:1-9259:34" dir="auto">Illegal attributes in closing tag:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="9261:1-9265:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext"></a href="foo"></span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p>&lt;/a href=&quot;foo&quot;&gt;</p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="9268:1-9268:9" dir="auto">Comments:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="9270:1-9276:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">foo <!-- this is a</span> +<span id="LC2" class="line" lang="plaintext">comment - with hyphen --></span> +<span id="LC3" class="line" lang="plaintext">.</span> +<span id="LC4" class="line" lang="plaintext"><p>foo <!-- this is a</span> +<span id="LC5" class="line" lang="plaintext">comment - with hyphen --></p></span></code></pre> +<copy-code></copy-code> +</div> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="9279:1-9283:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">foo <!-- not a comment -- two hyphens --></span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p>foo &lt;!-- not a comment -- two hyphens --&gt;</p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="9286:1-9286:13" dir="auto">Not comments:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="9288:1-9295:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">foo <!--> foo --></span> +<span id="LC2" class="line" lang="plaintext"></span> +<span id="LC3" class="line" lang="plaintext">foo <!-- foo---></span> +<span id="LC4" class="line" lang="plaintext">.</span> +<span id="LC5" class="line" lang="plaintext"><p>foo &lt;!--&gt; foo --&gt;</p></span> +<span id="LC6" class="line" lang="plaintext"><p>foo &lt;!-- foo---&gt;</p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="9298:1-9298:24" dir="auto">Processing instructions:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="9300:1-9304:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">foo <?php echo $a; ?></span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p>foo <?php echo $a; ?></p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="9307:1-9307:13" dir="auto">Declarations:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="9309:1-9313:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">foo <!ELEMENT br EMPTY></span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p>foo <!ELEMENT br EMPTY></p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="9316:1-9316:15" dir="auto">CDATA sections:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="9318:1-9322:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">foo <![CDATA[>&<]]></span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p>foo <![CDATA[>&<]]></p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="9325:1-9326:11" dir="auto">Entity and numeric character references are preserved in HTML +attributes:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="9328:1-9332:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">foo <a href="&ouml;"></span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p>foo <a href="&ouml;"></p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="9335:1-9335:49" dir="auto">Backslash escapes do not work in HTML attributes:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="9337:1-9341:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">foo <a href="\*"></span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p>foo <a href="\*"></p></span></code></pre> +<copy-code></copy-code> +</div> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="9344:1-9348:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext"><a href="\""></span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p>&lt;a href=&quot;&quot;&quot;&gt;</p></span></code></pre> +<copy-code></copy-code> +</div> +<div> +<h2 data-sourcepos="9353:1-9353:34"> +<a id="user-content-disallowed-raw-html-extension" class="anchor" href="#disallowed-raw-html-extension" aria-hidden="true"></a>Disallowed Raw HTML (extension)</h2> +<p data-sourcepos="9355:1-9356:36">GFM enables the <code>tagfilter</code> extension, where the following HTML tags will be +filtered when rendering HTML output:</p> +<ul data-sourcepos="9358:1-9367:0"> +<li data-sourcepos="9358:1-9358:11"><code><title></code></li> +<li data-sourcepos="9359:1-9359:14"><code><textarea></code></li> +<li data-sourcepos="9360:1-9360:11"><code><style></code></li> +<li data-sourcepos="9361:1-9361:9"><code><xmp></code></li> +<li data-sourcepos="9362:1-9362:12"><code><iframe></code></li> +<li data-sourcepos="9363:1-9363:13"><code><noembed></code></li> +<li data-sourcepos="9364:1-9364:14"><code><noframes></code></li> +<li data-sourcepos="9365:1-9365:12"><code><script></code></li> +<li data-sourcepos="9366:1-9367:0"><code><plaintext></code></li> +</ul> +<p data-sourcepos="9368:1-9371:71">Filtering is done by replacing the leading <code><</code> with the entity <code>&lt;</code>. These +tags are chosen in particular as they change how HTML is interpreted in a way +unique to them (i.e. nested HTML is interpreted differently), and this is +usually undesireable in the context of other rendered Markdown content.</p> +<p data-sourcepos="9373:1-9373:39">All other HTML tags are left untouched.</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="9375:1-9386:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext"><strong> <title> <style> <em></span> +<span id="LC2" class="line" lang="plaintext"></span> +<span id="LC3" class="line" lang="plaintext"><blockquote></span> +<span id="LC4" class="line" lang="plaintext"> <xmp> is disallowed. <XMP> is also disallowed.</span> +<span id="LC5" class="line" lang="plaintext"></blockquote></span> +<span id="LC6" class="line" lang="plaintext">.</span> +<span id="LC7" class="line" lang="plaintext"><p><strong> &lt;title> &lt;style> <em></p></span> +<span id="LC8" class="line" lang="plaintext"><blockquote></span> +<span id="LC9" class="line" lang="plaintext"> &lt;xmp> is disallowed. &lt;XMP> is also disallowed.</span> +<span id="LC10" class="line" lang="plaintext"></blockquote></span></code></pre> +<copy-code></copy-code> +</div> +</div> +<h2 data-sourcepos="9390:1-9390:19" dir="auto"> +<a id="user-content-hard-line-breaks" class="anchor" href="#hard-line-breaks" aria-hidden="true"></a>Hard line breaks</h2> +<p data-sourcepos="9392:1-9395:27" dir="auto">A line break (not in a code span or HTML tag) that is preceded +by two or more spaces and does not occur at the end of a block +is parsed as a <a href="@">hard line break</a> (rendered +in HTML as a <code><br /></code> tag):</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="9397:1-9403:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">foo </span> +<span id="LC2" class="line" lang="plaintext">baz</span> +<span id="LC3" class="line" lang="plaintext">.</span> +<span id="LC4" class="line" lang="plaintext"><p>foo<br /></span> +<span id="LC5" class="line" lang="plaintext">baz</p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="9406:1-9407:48" dir="auto">For a more visible alternative, a backslash before the +[line ending] may be used instead of two spaces:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="9409:1-9415:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">foo\</span> +<span id="LC2" class="line" lang="plaintext">baz</span> +<span id="LC3" class="line" lang="plaintext">.</span> +<span id="LC4" class="line" lang="plaintext"><p>foo<br /></span> +<span id="LC5" class="line" lang="plaintext">baz</p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="9418:1-9418:33" dir="auto">More than two spaces can be used:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="9420:1-9426:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">foo </span> +<span id="LC2" class="line" lang="plaintext">baz</span> +<span id="LC3" class="line" lang="plaintext">.</span> +<span id="LC4" class="line" lang="plaintext"><p>foo<br /></span> +<span id="LC5" class="line" lang="plaintext">baz</p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="9429:1-9429:61" dir="auto">Leading spaces at the beginning of the next line are ignored:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="9431:1-9437:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">foo </span> +<span id="LC2" class="line" lang="plaintext"> bar</span> +<span id="LC3" class="line" lang="plaintext">.</span> +<span id="LC4" class="line" lang="plaintext"><p>foo<br /></span> +<span id="LC5" class="line" lang="plaintext">bar</p></span></code></pre> +<copy-code></copy-code> +</div> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="9440:1-9446:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">foo\</span> +<span id="LC2" class="line" lang="plaintext"> bar</span> +<span id="LC3" class="line" lang="plaintext">.</span> +<span id="LC4" class="line" lang="plaintext"><p>foo<br /></span> +<span id="LC5" class="line" lang="plaintext">bar</p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="9449:1-9450:26" dir="auto">Line breaks can occur inside emphasis, links, and other constructs +that allow inline content:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="9452:1-9458:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">*foo </span> +<span id="LC2" class="line" lang="plaintext">bar*</span> +<span id="LC3" class="line" lang="plaintext">.</span> +<span id="LC4" class="line" lang="plaintext"><p><em>foo<br /></span> +<span id="LC5" class="line" lang="plaintext">bar</em></p></span></code></pre> +<copy-code></copy-code> +</div> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="9461:1-9467:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">*foo\</span> +<span id="LC2" class="line" lang="plaintext">bar*</span> +<span id="LC3" class="line" lang="plaintext">.</span> +<span id="LC4" class="line" lang="plaintext"><p><em>foo<br /></span> +<span id="LC5" class="line" lang="plaintext">bar</em></p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="9470:1-9470:42" dir="auto">Line breaks do not occur inside code spans</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="9472:1-9477:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">`code </span> +<span id="LC2" class="line" lang="plaintext">span`</span> +<span id="LC3" class="line" lang="plaintext">.</span> +<span id="LC4" class="line" lang="plaintext"><p><code>code span</code></p></span></code></pre> +<copy-code></copy-code> +</div> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="9480:1-9485:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">`code\</span> +<span id="LC2" class="line" lang="plaintext">span`</span> +<span id="LC3" class="line" lang="plaintext">.</span> +<span id="LC4" class="line" lang="plaintext"><p><code>code\ span</code></p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="9488:1-9488:13" dir="auto">or HTML tags:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="9490:1-9496:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext"><a href="foo </span> +<span id="LC2" class="line" lang="plaintext">bar"></span> +<span id="LC3" class="line" lang="plaintext">.</span> +<span id="LC4" class="line" lang="plaintext"><p><a href="foo </span> +<span id="LC5" class="line" lang="plaintext">bar"></p></span></code></pre> +<copy-code></copy-code> +</div> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="9499:1-9505:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext"><a href="foo\</span> +<span id="LC2" class="line" lang="plaintext">bar"></span> +<span id="LC3" class="line" lang="plaintext">.</span> +<span id="LC4" class="line" lang="plaintext"><p><a href="foo\</span> +<span id="LC5" class="line" lang="plaintext">bar"></p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="9508:1-9510:20" dir="auto">Hard line breaks are for separating inline content within a block. +Neither syntax for hard line breaks works at the end of a paragraph or +other block element:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="9512:1-9516:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">foo\</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p>foo\</p></span></code></pre> +<copy-code></copy-code> +</div> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="9519:1-9523:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">foo </span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p>foo</p></span></code></pre> +<copy-code></copy-code> +</div> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="9526:1-9530:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">### foo\</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><h3>foo\</h3></span></code></pre> +<copy-code></copy-code> +</div> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="9533:1-9537:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">### foo </span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><h3>foo</h3></span></code></pre> +<copy-code></copy-code> +</div> +<h2 data-sourcepos="9540:1-9540:19" dir="auto"> +<a id="user-content-soft-line-breaks" class="anchor" href="#soft-line-breaks" aria-hidden="true"></a>Soft line breaks</h2> +<p data-sourcepos="9542:1-9546:62" dir="auto">A regular line break (not in a code span or HTML tag) that is not +preceded by two or more spaces or a backslash is parsed as a +<a href="@">softbreak</a>. (A softbreak may be rendered in HTML either as a +[line ending] or as a space. The result will be the same in +browsers. In the examples here, a [line ending] will be used.)</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="9548:1-9554:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">foo</span> +<span id="LC2" class="line" lang="plaintext">baz</span> +<span id="LC3" class="line" lang="plaintext">.</span> +<span id="LC4" class="line" lang="plaintext"><p>foo</span> +<span id="LC5" class="line" lang="plaintext">baz</p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="9557:1-9558:8" dir="auto">Spaces at the end of the line and beginning of the next line are +removed:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="9560:1-9566:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">foo </span> +<span id="LC2" class="line" lang="plaintext"> baz</span> +<span id="LC3" class="line" lang="plaintext">.</span> +<span id="LC4" class="line" lang="plaintext"><p>foo</span> +<span id="LC5" class="line" lang="plaintext">baz</p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="9569:1-9570:25" dir="auto">A conforming parser may render a soft line break in HTML either as a +line break or as a space.</p> +<p data-sourcepos="9572:1-9573:20" dir="auto">A renderer may also provide an option to render soft line breaks +as hard line breaks.</p> +<h2 data-sourcepos="9575:1-9575:18" dir="auto"> +<a id="user-content-textual-content" class="anchor" href="#textual-content" aria-hidden="true"></a>Textual content</h2> +<p data-sourcepos="9577:1-9578:35" dir="auto">Any characters not given an interpretation by the above rules will +be parsed as plain textual content.</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="9580:1-9584:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">hello $.;'there</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p>hello $.;'there</p></span></code></pre> +<copy-code></copy-code> +</div> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="9587:1-9591:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">Foo χρῆν</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p>Foo χρῆν</p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="9594:1-9594:39" dir="auto">Internal spaces are preserved verbatim:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="9596:1-9600:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">Multiple spaces</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p>Multiple spaces</p></span></code></pre> +<copy-code></copy-code> +</div> +<h1 data-sourcepos="9603:1-9603:40" dir="auto"> +<a id="user-content-gitlab-official-specification-markdown" class="anchor" href="#gitlab-official-specification-markdown" aria-hidden="true"></a>GitLab Official Specification Markdown</h1> +<p data-sourcepos="9605:1-9608:104" dir="auto">Currently, only some of the GitLab-specific markdown features are +listed in this section. We will eventually add all +GitLab-specific features currently listed as supported in the +<a href="https://docs.gitlab.com/ee/user/markdown.html" rel="nofollow noreferrer noopener" target="_blank">user-facing documentation for GitLab Flavored Markdown</a>.</p> +<p data-sourcepos="9610:1-9611:69" dir="auto">There is currently only this single top-level heading, but the +examples may be split into multiple top-level headings in the future.</p> +<h2 data-sourcepos="9613:1-9613:12" dir="auto"> +<a id="user-content-footnotes" class="anchor" href="#footnotes" aria-hidden="true"></a>Footnotes</h2> +<p data-sourcepos="9615:1-9616:143" dir="auto">See +<a href="https://docs.gitlab.com/ee/user/markdown.html#footnotes" rel="nofollow noreferrer noopener" target="_blank">the footnotes section of the user-facing documentation for GitLab Flavored Markdown</a>.</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="9618:1-9642:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">footnote reference tag [^fortytwo]</span> +<span id="LC2" class="line" lang="plaintext"></span> +<span id="LC3" class="line" lang="plaintext">[^fortytwo]: footnote text</span> +<span id="LC4" class="line" lang="plaintext">.</span> +<span id="LC5" class="line" lang="plaintext"><p></span> +<span id="LC6" class="line" lang="plaintext">footnote reference tag</span> +<span id="LC7" class="line" lang="plaintext"><sup></span> +<span id="LC8" class="line" lang="plaintext"><a href="#fn-fortytwo-42" id="fnref-fortytwo-42" data-footnote-ref></span> +<span id="LC9" class="line" lang="plaintext">1</span> +<span id="LC10" class="line" lang="plaintext"></a></span> +<span id="LC11" class="line" lang="plaintext"></sup></span> +<span id="LC12" class="line" lang="plaintext"></p></span> +<span id="LC13" class="line" lang="plaintext"><section data-footnotes></span> +<span id="LC14" class="line" lang="plaintext"><ol></span> +<span id="LC15" class="line" lang="plaintext"><li id="fn-fortytwo-42"></span> +<span id="LC16" class="line" lang="plaintext"><p></span> +<span id="LC17" class="line" lang="plaintext">footnote text</span> +<span id="LC18" class="line" lang="plaintext"><a href="#fnref-fortytwo-42" data-footnote-backref></span> +<span id="LC19" class="line" lang="plaintext"></a></span> +<span id="LC20" class="line" lang="plaintext"></p></span> +<span id="LC21" class="line" lang="plaintext"></li></span> +<span id="LC22" class="line" lang="plaintext"></ol></span> +<span id="LC23" class="line" lang="plaintext"></section></span></code></pre> +<copy-code></copy-code> +</div> +<h2 data-sourcepos="9644:1-9644:18" dir="auto"> +<a id="user-content-task-list-items" class="anchor" href="#task-list-items" aria-hidden="true"></a>Task list items</h2> +<p data-sourcepos="9646:1-9647:117" dir="auto">See +<a href="https://docs.gitlab.com/ee/user/markdown.html#task-lists" rel="nofollow noreferrer noopener" target="_blank">Task lists</a> in the GitLab Flavored Markdown documentation.</p> +<p data-sourcepos="9649:1-9652:39" dir="auto">Task list items (checkboxes) are defined as a GitHub Flavored Markdown extension in a section above. +GitLab extends the behavior of task list items to support additional features. +Some of these features are in-progress, and should not yet be considered part of the official +GitLab Flavored Markdown specification.</p> +<p data-sourcepos="9654:1-9654:85" dir="auto">Some of the behavior of task list items is implemented as client-side JavaScript/CSS.</p> +<p data-sourcepos="9656:1-9656:80" dir="auto">The following are some basic examples; more examples may be added in the future.</p> +<p data-sourcepos="9658:1-9658:16" dir="auto">Incomplete task:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="9660:1-9670:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">- [ ] incomplete</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><ul></span> +<span id="LC4" class="line" lang="plaintext"><li></span> +<span id="LC5" class="line" lang="plaintext"><task-button/></span> +<span id="LC6" class="line" lang="plaintext"><input type="checkbox" disabled/></span> +<span id="LC7" class="line" lang="plaintext">incomplete</span> +<span id="LC8" class="line" lang="plaintext"></li></span> +<span id="LC9" class="line" lang="plaintext"></ul></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="9672:1-9672:15" dir="auto">Completed task:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="9674:1-9684:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">- [x] completed</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><ul></span> +<span id="LC4" class="line" lang="plaintext"><li></span> +<span id="LC5" class="line" lang="plaintext"><task-button/></span> +<span id="LC6" class="line" lang="plaintext"><input type="checkbox" checked disabled/></span> +<span id="LC7" class="line" lang="plaintext">completed</span> +<span id="LC8" class="line" lang="plaintext"></li></span> +<span id="LC9" class="line" lang="plaintext"></ul></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="9686:1-9686:18" dir="auto">Inapplicable task:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="9688:1-9700:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">- [~] inapplicable</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><ul></span> +<span id="LC4" class="line" lang="plaintext"><li></span> +<span id="LC5" class="line" lang="plaintext"><task-button/></span> +<span id="LC6" class="line" lang="plaintext"><input type="checkbox" data-inapplicable disabled></span> +<span id="LC7" class="line" lang="plaintext"><s></span> +<span id="LC8" class="line" lang="plaintext">inapplicable</span> +<span id="LC9" class="line" lang="plaintext"></s></span> +<span id="LC10" class="line" lang="plaintext"></li></span> +<span id="LC11" class="line" lang="plaintext"></ul></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="9702:1-9703:50" dir="auto">Inapplicable task in a "loose" list. Note that the <code><del></code> tag is not applied to the +loose text; it has strikethrough applied with CSS.</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="9705:1-9724:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">- [~] inapplicable</span> +<span id="LC2" class="line" lang="plaintext"></span> +<span id="LC3" class="line" lang="plaintext"> text in loose list</span> +<span id="LC4" class="line" lang="plaintext">.</span> +<span id="LC5" class="line" lang="plaintext"><ul></span> +<span id="LC6" class="line" lang="plaintext"><li></span> +<span id="LC7" class="line" lang="plaintext"><p></span> +<span id="LC8" class="line" lang="plaintext"><task-button/></span> +<span id="LC9" class="line" lang="plaintext"><input type="checkbox" data-inapplicable disabled></span> +<span id="LC10" class="line" lang="plaintext"><s></span> +<span id="LC11" class="line" lang="plaintext">inapplicable</span> +<span id="LC12" class="line" lang="plaintext"></s></span> +<span id="LC13" class="line" lang="plaintext"></p></span> +<span id="LC14" class="line" lang="plaintext"><p></span> +<span id="LC15" class="line" lang="plaintext">text in loose list</span> +<span id="LC16" class="line" lang="plaintext"></p></span> +<span id="LC17" class="line" lang="plaintext"></li></span> +<span id="LC18" class="line" lang="plaintext"></ul></span></code></pre> +<copy-code></copy-code> +</div> +<h2 data-sourcepos="9726:1-9726:15" dir="auto"> +<a id="user-content-front-matter" class="anchor" href="#front-matter" aria-hidden="true"></a>Front matter</h2> +<p data-sourcepos="9728:1-9729:121" dir="auto">See +<a href="https://docs.gitlab.com/ee/user/markdown.html#front-matter" rel="nofollow noreferrer noopener" target="_blank">Front matter</a> in the GitLab Flavored Markdown documentation.</p> +<p data-sourcepos="9731:1-9732:95" dir="auto">Front matter is metadata included at the beginning of a Markdown document, preceding the content. +This data can be used by static site generators like Jekyll, Hugo, and many other applications.</p> +<p data-sourcepos="9734:1-9734:18" dir="auto">YAML front matter:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="9736:1-9746:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">---</span> +<span id="LC2" class="line" lang="plaintext">title: YAML front matter</span> +<span id="LC3" class="line" lang="plaintext">---</span> +<span id="LC4" class="line" lang="plaintext">.</span> +<span id="LC5" class="line" lang="plaintext"><pre></span> +<span id="LC6" class="line" lang="plaintext"><code></span> +<span id="LC7" class="line" lang="plaintext">title: YAML front matter</span> +<span id="LC8" class="line" lang="plaintext"></code></span> +<span id="LC9" class="line" lang="plaintext"></pre></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="9748:1-9748:18" dir="auto">TOML front matter:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="9750:1-9760:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">+++</span> +<span id="LC2" class="line" lang="plaintext">title: TOML front matter</span> +<span id="LC3" class="line" lang="plaintext">+++</span> +<span id="LC4" class="line" lang="plaintext">.</span> +<span id="LC5" class="line" lang="plaintext"><pre></span> +<span id="LC6" class="line" lang="plaintext"><code></span> +<span id="LC7" class="line" lang="plaintext">title: TOML front matter</span> +<span id="LC8" class="line" lang="plaintext"></code></span> +<span id="LC9" class="line" lang="plaintext"></pre></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="9762:1-9762:18" dir="auto">JSON front matter:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="9764:1-9778:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">;;;</span> +<span id="LC2" class="line" lang="plaintext">{</span> +<span id="LC3" class="line" lang="plaintext"> "title": "JSON front matter"</span> +<span id="LC4" class="line" lang="plaintext">}</span> +<span id="LC5" class="line" lang="plaintext">;;;</span> +<span id="LC6" class="line" lang="plaintext">.</span> +<span id="LC7" class="line" lang="plaintext"><pre></span> +<span id="LC8" class="line" lang="plaintext"><code></span> +<span id="LC9" class="line" lang="plaintext">{</span> +<span id="LC10" class="line" lang="plaintext"> "title": "JSON front matter"</span> +<span id="LC11" class="line" lang="plaintext">}</span> +<span id="LC12" class="line" lang="plaintext"></code></span> +<span id="LC13" class="line" lang="plaintext"></pre></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="9780:1-9780:66" dir="auto">Front matter blocks should be inserted at the top of the document:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="9782:1-9792:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">text</span> +<span id="LC2" class="line" lang="plaintext"></span> +<span id="LC3" class="line" lang="plaintext">---</span> +<span id="LC4" class="line" lang="plaintext">title: YAML front matter</span> +<span id="LC5" class="line" lang="plaintext">---</span> +<span id="LC6" class="line" lang="plaintext">.</span> +<span id="LC7" class="line" lang="plaintext"><p>text</p></span> +<span id="LC8" class="line" lang="plaintext"><hr></span> +<span id="LC9" class="line" lang="plaintext"><h2>title: YAML front matter</h2></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="9794:1-9794:74" dir="auto">Front matter block delimiters shouldn’t be preceded by space characters:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="9796:1-9803:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext"> ---</span> +<span id="LC2" class="line" lang="plaintext">title: YAML front matter</span> +<span id="LC3" class="line" lang="plaintext">---</span> +<span id="LC4" class="line" lang="plaintext">.</span> +<span id="LC5" class="line" lang="plaintext"><hr></span> +<span id="LC6" class="line" lang="plaintext"><h2>title: YAML front matter</h2></span></code></pre> +<copy-code></copy-code> +</div> +<h2 data-sourcepos="9805:1-9805:20" dir="auto"> +<a id="user-content-table-of-contents" class="anchor" href="#table-of-contents" aria-hidden="true"></a>Table of contents</h2> +<p data-sourcepos="9807:1-9809:46" dir="auto">See +<a href="https://docs.gitlab.com/ee/user/markdown.html#table-of-contents" rel="nofollow noreferrer noopener" target="_blank">table of contents</a> +in the GitLab Flavored Markdown documentation.</p> +<p data-sourcepos="9811:1-9812:58" dir="auto">A table of contents is an unordered list that links to subheadings in the document. +Add either the <code>[[_TOC_]]</code> or </p><ul class="section-nav"> +<li><a href="#introduction">Introduction</a></li> +<li> +<a href="#preliminaries">Preliminaries</a><ul> +<li><a href="#characters-and-lines">Characters and lines</a></li> +<li><a href="#tabs">Tabs</a></li> +<li><a href="#insecure-characters">Insecure characters</a></li> +</ul> +</li> +<li> +<a href="#blocks-and-inlines">Blocks and inlines</a><ul> +<li><a href="#precedence">Precedence</a></li> +<li><a href="#container-blocks-and-leaf-blocks">Container blocks and leaf blocks</a></li> +</ul> +</li> +<li> +<a href="#leaf-blocks">Leaf blocks</a><ul> +<li><a href="#thematic-breaks">Thematic breaks</a></li> +<li><a href="#atx-headings">ATX headings</a></li> +<li><a href="#setext-headings">Setext headings</a></li> +<li><a href="#indented-code-blocks">Indented code blocks</a></li> +<li><a href="#fenced-code-blocks">Fenced code blocks</a></li> +<li><a href="#html-blocks">HTML blocks</a></li> +<li><a href="#link-reference-definitions">Link reference definitions</a></li> +<li><a href="#paragraphs">Paragraphs</a></li> +<li><a href="#blank-lines">Blank lines</a></li> +<li><a href="#tables-extension">Tables (extension)</a></li> +</ul> +</li> +<li> +<a href="#container-blocks">Container blocks</a><ul> +<li><a href="#block-quotes">Block quotes</a></li> +<li> +<a href="#list-items">List items</a><ul><li><a href="#motivation">Motivation</a></li></ul> +</li> +<li><a href="#task-list-items-extension">Task list items (extension)</a></li> +<li><a href="#lists">Lists</a></li> +</ul> +</li> +<li> +<a href="#inlines">Inlines</a><ul> +<li><a href="#backslash-escapes">Backslash escapes</a></li> +<li><a href="#entity-and-numeric-character-references">Entity and numeric character references</a></li> +<li><a href="#code-spans">Code spans</a></li> +<li><a href="#emphasis-and-strong-emphasis">Emphasis and strong emphasis</a></li> +<li><a href="#strikethrough-extension">Strikethrough (extension)</a></li> +<li><a href="#links">Links</a></li> +<li><a href="#images">Images</a></li> +<li><a href="#autolinks">Autolinks</a></li> +<li><a href="#autolinks-extension">Autolinks (extension)</a></li> +<li><a href="#raw-html">Raw HTML</a></li> +<li><a href="#disallowed-raw-html-extension">Disallowed Raw HTML (extension)</a></li> +<li><a href="#hard-line-breaks">Hard line breaks</a></li> +<li><a href="#soft-line-breaks">Soft line breaks</a></li> +<li><a href="#textual-content">Textual content</a></li> +</ul> +</li> +<li> +<a href="#gitlab-official-specification-markdown">GitLab Official Specification Markdown</a><ul> +<li><a href="#footnotes">Footnotes</a></li> +<li><a href="#task-list-items">Task list items</a></li> +<li><a href="#front-matter">Front matter</a></li> +<li><a href="#table-of-contents">Table of contents</a></li> +</ul> +</li> +<li> +<a href="#gitlab-internal-extension-markdown">GitLab Internal Extension Markdown</a><ul> +<li><a href="#audio">Audio</a></li> +<li><a href="#video">Video</a></li> +<li><a href="#markdown-preview-api-request-overrides">Markdown Preview API Request Overrides</a></li> +</ul> +</li> +<li> +<a href="#appendix-a-parsing-strategy">Appendix: A parsing strategy</a><ul> +<li><a href="#overview">Overview</a></li> +<li><a href="#phase-1-block-structure">Phase 1: block structure</a></li> +<li> +<a href="#phase-2-inline-structure">Phase 2: inline structure</a><ul><li> +<a href="#an-algorithm-for-parsing-nested-emphasis-and-links">An algorithm for parsing nested emphasis and links</a><ul> +<li><a href="#look-for-link-or-image">look for link or image</a></li> +<li><a href="#process-emphasis">process emphasis</a></li> +</ul> +</li></ul> +</li> +</ul> +</li> +</ul> tag on its own line. +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="9814:1-9831:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">[TOC]</span> +<span id="LC2" class="line" lang="plaintext"></span> +<span id="LC3" class="line" lang="plaintext"># Heading 1</span> +<span id="LC4" class="line" lang="plaintext"></span> +<span id="LC5" class="line" lang="plaintext">## Heading 2</span> +<span id="LC6" class="line" lang="plaintext">.</span> +<span id="LC7" class="line" lang="plaintext"><nav></span> +<span id="LC8" class="line" lang="plaintext"> <ul></span> +<span id="LC9" class="line" lang="plaintext"> <li><a href="#heading-1">Heading 1</a></li></span> +<span id="LC10" class="line" lang="plaintext"> <ul></span> +<span id="LC11" class="line" lang="plaintext"> <li><a href="#heading-2">Heading 2</a></li></span> +<span id="LC12" class="line" lang="plaintext"> </ul></span> +<span id="LC13" class="line" lang="plaintext"> </ul></span> +<span id="LC14" class="line" lang="plaintext"></nav></span> +<span id="LC15" class="line" lang="plaintext"><h1>Heading 1</h1></span> +<span id="LC16" class="line" lang="plaintext"><h2>Heading 2</h2></span></code></pre> +<copy-code></copy-code> +</div> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="9833:1-9850:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">[[_TOC_]]</span> +<span id="LC2" class="line" lang="plaintext"></span> +<span id="LC3" class="line" lang="plaintext"># Heading 1</span> +<span id="LC4" class="line" lang="plaintext"></span> +<span id="LC5" class="line" lang="plaintext">## Heading 2</span> +<span id="LC6" class="line" lang="plaintext">.</span> +<span id="LC7" class="line" lang="plaintext"><nav></span> +<span id="LC8" class="line" lang="plaintext"> <ul></span> +<span id="LC9" class="line" lang="plaintext"> <li><a href="#heading-1">Heading 1</a></li></span> +<span id="LC10" class="line" lang="plaintext"> <ul></span> +<span id="LC11" class="line" lang="plaintext"> <li><a href="#heading-2">Heading 2</a></li></span> +<span id="LC12" class="line" lang="plaintext"> </ul></span> +<span id="LC13" class="line" lang="plaintext"> </ul></span> +<span id="LC14" class="line" lang="plaintext"></nav></span> +<span id="LC15" class="line" lang="plaintext"><h1>Heading 1</h1></span> +<span id="LC16" class="line" lang="plaintext"><h2>Heading 2</h2></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="9852:1-9853:5" dir="auto">A table of contents is a block element. It should preceded and followed by a blank +line.</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="9855:1-9864:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">[[_TOC_]]</span> +<span id="LC2" class="line" lang="plaintext">text</span> +<span id="LC3" class="line" lang="plaintext"></span> +<span id="LC4" class="line" lang="plaintext">text</span> +<span id="LC5" class="line" lang="plaintext">[TOC]</span> +<span id="LC6" class="line" lang="plaintext">.</span> +<span id="LC7" class="line" lang="plaintext"><p>[[<em>TOC</em>]]text</p></span> +<span id="LC8" class="line" lang="plaintext"><p>text[TOC]</p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="9866:1-9866:60" dir="auto">A table of contents can be indented with up to three spaces.</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="9868:1-9879:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext"> [[_TOC_]]</span> +<span id="LC2" class="line" lang="plaintext"></span> +<span id="LC3" class="line" lang="plaintext"># Heading 1</span> +<span id="LC4" class="line" lang="plaintext">.</span> +<span id="LC5" class="line" lang="plaintext"><nav></span> +<span id="LC6" class="line" lang="plaintext"> <ul></span> +<span id="LC7" class="line" lang="plaintext"> <li><a href="#heading-1">Heading 1</a></li></span> +<span id="LC8" class="line" lang="plaintext"> </ul></span> +<span id="LC9" class="line" lang="plaintext"></nav></span> +<span id="LC10" class="line" lang="plaintext"><h1>Heading 1</h1></span></code></pre> +<copy-code></copy-code> +</div> +<h1 data-sourcepos="9881:1-9881:36" dir="auto"> +<a id="user-content-gitlab-internal-extension-markdown" class="anchor" href="#gitlab-internal-extension-markdown" aria-hidden="true"></a>GitLab Internal Extension Markdown</h1> +<h2 data-sourcepos="9883:1-9883:8" dir="auto"> +<a id="user-content-audio" class="anchor" href="#audio" aria-hidden="true"></a>Audio</h2> +<p data-sourcepos="9885:1-9886:107" dir="auto">See +<a href="https://docs.gitlab.com/ee/user/markdown.html#audio" rel="nofollow noreferrer noopener" target="_blank">audio</a> in the GitLab Flavored Markdown documentation.</p> +<p data-sourcepos="9888:1-9890:63" dir="auto">GLFM renders image elements as an audio player as long as the resource’s file extension is +one of the following supported audio extensions <code>.mp3</code>, <code>.oga</code>, <code>.ogg</code>, <code>.spx</code>, and <code>.wav</code>. +Audio ignore the alternative text part of an image declaration.</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="9892:1-9896:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">![audio](audio.oga "audio title")</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p><audio src="audio.oga" title="audio title"></audio></p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="9898:1-9898:41" dir="auto">Reference definitions work audio as well:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="9900:1-9906:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">[audio]: audio.oga "audio title"</span> +<span id="LC2" class="line" lang="plaintext"></span> +<span id="LC3" class="line" lang="plaintext">![audio][audio]</span> +<span id="LC4" class="line" lang="plaintext">.</span> +<span id="LC5" class="line" lang="plaintext"><p><audio src="audio.oga" title="audio title"></audio></p></span></code></pre> +<copy-code></copy-code> +</div> +<h2 data-sourcepos="9908:1-9908:8" dir="auto"> +<a id="user-content-video" class="anchor" href="#video" aria-hidden="true"></a>Video</h2> +<p data-sourcepos="9910:1-9911:109" dir="auto">See +<a href="https://docs.gitlab.com/ee/user/markdown.html#videos" rel="nofollow noreferrer noopener" target="_blank">videos</a> in the GitLab Flavored Markdown documentation.</p> +<p data-sourcepos="9913:1-9915:64" dir="auto">GLFM renders image elements as a video player as long as the resource’s file extension is +one of the following supported video extensions <code>.mp4</code>, <code>.m4v</code>, <code>.mov</code>, <code>.webm</code>, and <code>.ogv</code>. +Videos ignore the alternative text part of an image declaration.</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="9918:1-9922:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">![video](video.m4v "video title")</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p><video src="video.m4v" title="video title"></video></p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="9924:1-9924:41" dir="auto">Reference definitions work video as well:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="9926:1-9932:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">[video]: video.mov "video title"</span> +<span id="LC2" class="line" lang="plaintext"></span> +<span id="LC3" class="line" lang="plaintext">![video][video]</span> +<span id="LC4" class="line" lang="plaintext">.</span> +<span id="LC5" class="line" lang="plaintext"><p><video src="video.mov" title="video title"></video></p></span></code></pre> +<copy-code></copy-code> +</div> +<h2 data-sourcepos="9934:1-9934:41" dir="auto"> +<a id="user-content-markdown-preview-api-request-overrides" class="anchor" href="#markdown-preview-api-request-overrides" aria-hidden="true"></a>Markdown Preview API Request Overrides</h2> +<p data-sourcepos="9936:1-9938:42" dir="auto">This section contains examples of all controllers which use <code>PreviewMarkdown</code> module +and use different <code>markdown_context_params</code>. They exercise the various <code>preview_markdown</code> +endpoints via <code>glfm_example_metadata.yml</code>.</p> +<p data-sourcepos="9941:1-9941:75" dir="auto"><code>preview_markdown</code> exercising <code>groups</code> API endpoint and <code>UploadLinkFilter</code>:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="9943:1-9947:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">[groups-test-file](/uploads/groups-test-file)</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p><a href="groups-test-file">groups-test-file</a></p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="9949:1-9949:81" dir="auto"><code>preview_markdown</code> exercising <code>projects</code> API endpoint and <code>RepositoryLinkFilter</code>:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="9951:1-9955:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">[projects-test-file](projects-test-file)</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p><a href="projects-test-file">projects-test-file</a></p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="9957:1-9957:83" dir="auto"><code>preview_markdown</code> exercising <code>projects</code> API endpoint and <code>SnippetReferenceFilter</code>:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="9959:1-9963:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">This project snippet ID reference IS filtered: $88888</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p>This project snippet ID reference IS filtered: $88888</p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="9965:1-9968:50" dir="auto"><code>preview_markdown</code> exercising personal (non-project) <code>snippets</code> API endpoint. This is +only used by the comment field on personal snippets. It has no unique custom markdown +extension behavior, and specifically does not render snippet references via +<code>SnippetReferenceFilter</code>, even if the ID is valid.</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="9970:1-9974:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">This personal snippet ID reference is not filtered: $99999</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p>This personal snippet ID reference is not filtered: $99999</p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="9976:1-9976:80" dir="auto"><code>preview_markdown</code> exercising project <code>wikis</code> API endpoint and <code>WikiLinkFilter</code>:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="9978:1-9982:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">[project-wikis-test-file](project-wikis-test-file)</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p><a href="project-wikis-test-file">project-wikis-test-file</a></p></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="9984:1-9985:63" dir="auto"><code>preview_markdown</code> exercising group <code>wikis</code> API endpoint and <code>WikiLinkFilter</code>. This example +also requires an EE license enabling the <code>group_wikis</code> feature:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="9987:1-9991:32" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="example" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">[group-wikis-test-file](group-wikis-test-file)</span> +<span id="LC2" class="line" lang="plaintext">.</span> +<span id="LC3" class="line" lang="plaintext"><p><a href="group-wikis-test-file">group-wikis-test-file</a></p></span></code></pre> +<copy-code></copy-code> +</div> + +<h1 data-sourcepos="9995:1-9995:30" dir="auto"> +<a id="user-content-appendix-a-parsing-strategy" class="anchor" href="#appendix-a-parsing-strategy" aria-hidden="true"></a>Appendix: A parsing strategy</h1> +<p data-sourcepos="9997:1-9998:49" dir="auto">In this appendix we describe some features of the parsing strategy +used in the CommonMark reference implementations.</p> +<h2 data-sourcepos="10000:1-10000:11" dir="auto"> +<a id="user-content-overview" class="anchor" href="#overview" aria-hidden="true"></a>Overview</h2> +<p data-sourcepos="10002:1-10002:23" dir="auto">Parsing has two phases:</p> +<ol data-sourcepos="10004:1-10014:0" dir="auto"> +<li data-sourcepos="10004:1-10009:0"> +<p data-sourcepos="10004:4-10008:28">In the first phase, lines of input are consumed and the block +structure of the document---its division into paragraphs, block quotes, +list items, and so on---is constructed. Text is assigned to these +blocks but not parsed. Link reference definitions are parsed and a +map of links is constructed.</p> +</li> +<li data-sourcepos="10010:1-10014:0"> +<p data-sourcepos="10010:4-10013:34">In the second phase, the raw text contents of paragraphs and headings +are parsed into sequences of Markdown inline elements (strings, +code spans, links, emphasis, and so on), using the map of link +references constructed in phase 1.</p> +</li> +</ol> +<p data-sourcepos="10015:1-10022:17" dir="auto">At each point in processing, the document is represented as a tree of +<strong>blocks</strong>. The root of the tree is a <code>document</code> block. The <code>document</code> +may have any number of other blocks as <strong>children</strong>. These children +may, in turn, have other blocks as children. The last child of a block +is normally considered <strong>open</strong>, meaning that subsequent lines of input +can alter its contents. (Blocks that are not open are <strong>closed</strong>.) +Here, for example, is a possible document tree, with the open blocks +marked by arrows:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="10024:1-10036:3" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="tree" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">-> document</span> +<span id="LC2" class="line" lang="plaintext"> -> block_quote</span> +<span id="LC3" class="line" lang="plaintext"> paragraph</span> +<span id="LC4" class="line" lang="plaintext"> "Lorem ipsum dolor\nsit amet."</span> +<span id="LC5" class="line" lang="plaintext"> -> list (type=bullet tight=true bullet_char=-)</span> +<span id="LC6" class="line" lang="plaintext"> list_item</span> +<span id="LC7" class="line" lang="plaintext"> paragraph</span> +<span id="LC8" class="line" lang="plaintext"> "Qui *quodsi iracundia*"</span> +<span id="LC9" class="line" lang="plaintext"> -> list_item</span> +<span id="LC10" class="line" lang="plaintext"> -> paragraph</span> +<span id="LC11" class="line" lang="plaintext"> "aliquando id"</span></code></pre> +<copy-code></copy-code> +</div> +<h2 data-sourcepos="10038:1-10038:27" dir="auto"> +<a id="user-content-phase-1-block-structure" class="anchor" href="#phase-1-block-structure" aria-hidden="true"></a>Phase 1: block structure</h2> +<p data-sourcepos="10040:1-10042:37" dir="auto">Each line that is processed has an effect on this tree. The line is +analyzed and, depending on its contents, the document may be altered +in one or more of the following ways:</p> +<ol data-sourcepos="10044:1-10049:0" dir="auto"> +<li data-sourcepos="10044:1-10044:41">One or more open blocks may be closed.</li> +<li data-sourcepos="10045:1-10046:19">One or more new blocks may be created as children of the +last open block.</li> +<li data-sourcepos="10047:1-10049:0">Text may be added to the last (deepest) open block remaining +on the tree.</li> +</ol> +<p data-sourcepos="10050:1-10051:54" dir="auto">Once a line has been incorporated into the tree in this way, +it can be discarded, so input can be read in a stream.</p> +<p data-sourcepos="10053:1-10053:40" dir="auto">For each line, we follow this procedure:</p> +<ol data-sourcepos="10055:1-10074:0" dir="auto"> +<li data-sourcepos="10055:1-10063:0"> +<p data-sourcepos="10055:4-10062:25">First we iterate through the open blocks, starting with the +root document, and descending through last children down to the last +open block. Each block imposes a condition that the line must satisfy +if the block is to remain open. For example, a block quote requires a +<code>></code> character. A paragraph requires a non-blank line. +In this phase we may match all or just some of the open +blocks. But we cannot close unmatched blocks yet, because we may have a +[lazy continuation line].</p> +</li> +<li data-sourcepos="10064:1-10069:0"> +<p data-sourcepos="10064:5-10068:14">Next, after consuming the continuation markers for existing +blocks, we look for new block starts (e.g. <code>></code> for a block quote). +If we encounter a new block start, we close any blocks unmatched +in step 1 before creating the new block as a child of the last +matched block.</p> +</li> +<li data-sourcepos="10070:1-10074:0"> +<p data-sourcepos="10070:5-10073:54">Finally, we look at the remainder of the line (after block +markers like <code>></code>, list markers, and indentation have been consumed). +This is text that can be incorporated into the last open +block (a paragraph, code block, heading, or raw HTML).</p> +</li> +</ol> +<p data-sourcepos="10075:1-10076:37" dir="auto">Setext headings are formed when we see a line of a paragraph +that is a [setext heading underline].</p> +<p data-sourcepos="10078:1-10081:17" dir="auto">Reference link definitions are detected when a paragraph is closed; +the accumulated text lines are parsed to see if they begin with +one or more reference link definitions. Any remainder becomes a +normal paragraph.</p> +<p data-sourcepos="10083:1-10084:36" dir="auto">We can see how this works by considering how the tree above is +generated by four lines of Markdown:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="10086:1-10091:3" class="code highlight js-syntax-highlight language-markdown" lang="markdown" v-pre="true"><code><span id="LC1" class="line" lang="markdown"><span class="gt">> Lorem ipsum dolor</span></span> +<span id="LC2" class="line" lang="markdown">sit amet.</span> +<span id="LC3" class="line" lang="markdown"><span class="gt">> - Qui *quodsi iracundia*</span></span> +<span id="LC4" class="line" lang="markdown"><span class="gt">> - aliquando id</span></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="10093:1-10093:41" dir="auto">At the outset, our document model is just</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="10095:1-10097:3" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="tree" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">-> document</span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="10099:1-10099:27" dir="auto">The first line of our text,</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="10101:1-10103:3" class="code highlight js-syntax-highlight language-markdown" lang="markdown" v-pre="true"><code><span id="LC1" class="line" lang="markdown"><span class="gt">> Lorem ipsum dolor</span></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="10105:1-10108:23" dir="auto">causes a <code>block_quote</code> block to be created as a child of our +open <code>document</code> block, and a <code>paragraph</code> block as a child of +the <code>block_quote</code>. Then the text is added to the last open +block, the <code>paragraph</code>:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="10110:1-10115:3" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="tree" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">-> document</span> +<span id="LC2" class="line" lang="plaintext"> -> block_quote</span> +<span id="LC3" class="line" lang="plaintext"> -> paragraph</span> +<span id="LC4" class="line" lang="plaintext"> "Lorem ipsum dolor"</span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="10117:1-10117:14" dir="auto">The next line,</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="10119:1-10121:3" class="code highlight js-syntax-highlight language-markdown" lang="markdown" v-pre="true"><code><span id="LC1" class="line" lang="markdown">sit amet.</span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="10123:1-10124:24" dir="auto">is a "lazy continuation" of the open <code>paragraph</code>, so it gets added +to the paragraph's text:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="10126:1-10131:3" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="tree" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">-> document</span> +<span id="LC2" class="line" lang="plaintext"> -> block_quote</span> +<span id="LC3" class="line" lang="plaintext"> -> paragraph</span> +<span id="LC4" class="line" lang="plaintext"> "Lorem ipsum dolor\nsit amet."</span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="10133:1-10133:15" dir="auto">The third line,</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="10135:1-10137:3" class="code highlight js-syntax-highlight language-markdown" lang="markdown" v-pre="true"><code><span id="LC1" class="line" lang="markdown"><span class="gt">> - Qui *quodsi iracundia*</span></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="10139:1-10142:64" dir="auto">causes the <code>paragraph</code> block to be closed, and a new <code>list</code> block +opened as a child of the <code>block_quote</code>. A <code>list_item</code> is also +added as a child of the <code>list</code>, and a <code>paragraph</code> as a child of +the <code>list_item</code>. The text is then added to the new <code>paragraph</code>:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="10144:1-10153:3" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="tree" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">-> document</span> +<span id="LC2" class="line" lang="plaintext"> -> block_quote</span> +<span id="LC3" class="line" lang="plaintext"> paragraph</span> +<span id="LC4" class="line" lang="plaintext"> "Lorem ipsum dolor\nsit amet."</span> +<span id="LC5" class="line" lang="plaintext"> -> list (type=bullet tight=true bullet_char=-)</span> +<span id="LC6" class="line" lang="plaintext"> -> list_item</span> +<span id="LC7" class="line" lang="plaintext"> -> paragraph</span> +<span id="LC8" class="line" lang="plaintext"> "Qui *quodsi iracundia*"</span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="10155:1-10155:16" dir="auto">The fourth line,</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="10157:1-10159:3" class="code highlight js-syntax-highlight language-markdown" lang="markdown" v-pre="true"><code><span id="LC1" class="line" lang="markdown"><span class="gt">> - aliquando id</span></span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="10161:1-10164:30" dir="auto">causes the <code>list_item</code> (and its child the <code>paragraph</code>) to be closed, +and a new <code>list_item</code> opened up as child of the <code>list</code>. A <code>paragraph</code> +is added as a child of the new <code>list_item</code>, to contain the text. +We thus obtain the final tree:</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="10166:1-10178:3" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="tree" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">-> document</span> +<span id="LC2" class="line" lang="plaintext"> -> block_quote</span> +<span id="LC3" class="line" lang="plaintext"> paragraph</span> +<span id="LC4" class="line" lang="plaintext"> "Lorem ipsum dolor\nsit amet."</span> +<span id="LC5" class="line" lang="plaintext"> -> list (type=bullet tight=true bullet_char=-)</span> +<span id="LC6" class="line" lang="plaintext"> list_item</span> +<span id="LC7" class="line" lang="plaintext"> paragraph</span> +<span id="LC8" class="line" lang="plaintext"> "Qui *quodsi iracundia*"</span> +<span id="LC9" class="line" lang="plaintext"> -> list_item</span> +<span id="LC10" class="line" lang="plaintext"> -> paragraph</span> +<span id="LC11" class="line" lang="plaintext"> "aliquando id"</span></code></pre> +<copy-code></copy-code> +</div> +<h2 data-sourcepos="10180:1-10180:28" dir="auto"> +<a id="user-content-phase-2-inline-structure" class="anchor" href="#phase-2-inline-structure" aria-hidden="true"></a>Phase 2: inline structure</h2> +<p data-sourcepos="10182:1-10182:66" dir="auto">Once all of the input has been parsed, all open blocks are closed.</p> +<p data-sourcepos="10184:1-10187:33" dir="auto">We then "walk the tree," visiting every node, and parse raw +string contents of paragraphs and headings as inlines. At this +point we have seen all the link reference definitions, so we can +resolve reference links as we go.</p> +<div class="gl-relative markdown-code-block js-markdown-code"> +<pre data-sourcepos="10189:1-10205:3" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" data-canonical-lang="tree" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">document</span> +<span id="LC2" class="line" lang="plaintext"> block_quote</span> +<span id="LC3" class="line" lang="plaintext"> paragraph</span> +<span id="LC4" class="line" lang="plaintext"> str "Lorem ipsum dolor"</span> +<span id="LC5" class="line" lang="plaintext"> softbreak</span> +<span id="LC6" class="line" lang="plaintext"> str "sit amet."</span> +<span id="LC7" class="line" lang="plaintext"> list (type=bullet tight=true bullet_char=-)</span> +<span id="LC8" class="line" lang="plaintext"> list_item</span> +<span id="LC9" class="line" lang="plaintext"> paragraph</span> +<span id="LC10" class="line" lang="plaintext"> str "Qui "</span> +<span id="LC11" class="line" lang="plaintext"> emph</span> +<span id="LC12" class="line" lang="plaintext"> str "quodsi iracundia"</span> +<span id="LC13" class="line" lang="plaintext"> list_item</span> +<span id="LC14" class="line" lang="plaintext"> paragraph</span> +<span id="LC15" class="line" lang="plaintext"> str "aliquando id"</span></code></pre> +<copy-code></copy-code> +</div> +<p data-sourcepos="10207:1-10209:22" dir="auto">Notice how the [line ending] in the first paragraph has +been parsed as a <code>softbreak</code>, and the asterisks in the first list item +have become an <code>emph</code>.</p> +<h3 data-sourcepos="10211:1-10211:54" dir="auto"> +<a id="user-content-an-algorithm-for-parsing-nested-emphasis-and-links" class="anchor" href="#an-algorithm-for-parsing-nested-emphasis-and-links" aria-hidden="true"></a>An algorithm for parsing nested emphasis and links</h3> +<p data-sourcepos="10213:1-10215:10" dir="auto">By far the trickiest part of inline parsing is handling emphasis, +strong emphasis, links, and images. This is done using the following +algorithm.</p> +<p data-sourcepos="10217:1-10217:44" dir="auto">When we're parsing inlines and we hit either</p> +<ul data-sourcepos="10219:1-10221:0" dir="auto"> +<li data-sourcepos="10219:1-10219:36">a run of <code>*</code> or <code>_</code> characters, or</li> +<li data-sourcepos="10220:1-10221:0">a <code>[</code> or <code>![</code> +</li> +</ul> +<p data-sourcepos="10222:1-10223:60" dir="auto">we insert a text node with these symbols as its literal content, and we +add a pointer to this text node to the <a href="@">delimiter stack</a>.</p> +<p data-sourcepos="10225:1-10226:65" dir="auto">The [delimiter stack] is a doubly linked list. Each +element contains a pointer to a text node, plus information about</p> +<ul data-sourcepos="10228:1-10234:0" dir="auto"> +<li data-sourcepos="10228:1-10228:45">the type of delimiter (<code>[</code>, <code>![</code>, <code>*</code>, <code>_</code>)</li> +<li data-sourcepos="10229:1-10229:27">the number of delimiters,</li> +<li data-sourcepos="10230:1-10230:66">whether the delimiter is "active" (all are active to start), and</li> +<li data-sourcepos="10231:1-10234:0">whether the delimiter is a potential opener, a potential closer, +or both (which depends on what sort of characters precede +and follow the delimiters).</li> +</ul> +<p data-sourcepos="10235:1-10236:22" dir="auto">When we hit a <code>]</code> character, we call the <em>look for link or image</em> +procedure (see below).</p> +<p data-sourcepos="10238:1-10239:50" dir="auto">When we hit the end of the input, we call the <em>process emphasis</em> +procedure (see below), with <code>stack_bottom</code> = NULL.</p> +<h4 data-sourcepos="10241:1-10241:29" dir="auto"> +<a id="user-content-look-for-link-or-image" class="anchor" href="#look-for-link-or-image" aria-hidden="true"></a><em>look for link or image</em> +</h4> +<p data-sourcepos="10243:1-10244:55" dir="auto">Starting at the top of the delimiter stack, we look backwards +through the stack for an opening <code>[</code> or <code>![</code> delimiter.</p> +<ul data-sourcepos="10246:1-10271:0" dir="auto"> +<li data-sourcepos="10246:1-10247:0"> +<p data-sourcepos="10246:3-10246:58">If we don't find one, we return a literal text node <code>]</code>.</p> +</li> +<li data-sourcepos="10248:1-10250:0"> +<p data-sourcepos="10248:3-10249:63">If we do find one, but it's not <em>active</em>, we remove the inactive +delimiter from the stack, and return a literal text node <code>]</code>.</p> +</li> +<li data-sourcepos="10251:1-10271:0"> +<p data-sourcepos="10251:3-10253:47">If we find one and it's active, then we parse ahead to see if +we have an inline link/image, reference link/image, compact reference +link/image, or shortcut reference link/image.</p> +<ul data-sourcepos="10255:3-10271:0"> +<li data-sourcepos="10255:3-10257:0"> +<p data-sourcepos="10255:5-10256:55">If we don't, then we remove the opening delimiter from the +delimiter stack and return a literal text node <code>]</code>.</p> +</li> +<li data-sourcepos="10258:3-10271:0"> +<p data-sourcepos="10258:5-10258:18">If we do, then</p> +<ul data-sourcepos="10260:5-10271:0"> +<li data-sourcepos="10260:5-10262:0"> +<p data-sourcepos="10260:7-10261:62">We return a link or image node whose children are the inlines +after the text node pointed to by the opening delimiter.</p> +</li> +<li data-sourcepos="10263:5-10265:0"> +<p data-sourcepos="10263:7-10264:24">We run <em>process emphasis</em> on these inlines, with the <code>[</code> opener +as <code>stack_bottom</code>.</p> +</li> +<li data-sourcepos="10266:5-10267:0"> +<p data-sourcepos="10266:7-10266:38">We remove the opening delimiter.</p> +</li> +<li data-sourcepos="10268:5-10271:0"> +<p data-sourcepos="10268:7-10270:55">If we have a link (and not an image), we also set all +<code>[</code> delimiters before the opening delimiter to <em>inactive</em>. (This +will prevent us from getting links within links.)</p> +</li> +</ul> +</li> +</ul> +</li> +</ul> +<h4 data-sourcepos="10272:1-10272:23" dir="auto"> +<a id="user-content-process-emphasis" class="anchor" href="#process-emphasis" aria-hidden="true"></a><em>process emphasis</em> +</h4> +<p data-sourcepos="10274:1-10277:24" dir="auto">Parameter <code>stack_bottom</code> sets a lower bound to how far we +descend in the [delimiter stack]. If it is NULL, we can +go all the way to the bottom. Otherwise, we stop before +visiting <code>stack_bottom</code>.</p> +<p data-sourcepos="10279:1-10281:9" dir="auto">Let <code>current_position</code> point to the element on the [delimiter stack] +just above <code>stack_bottom</code> (or the first element if <code>stack_bottom</code> +is NULL).</p> +<p data-sourcepos="10283:1-10285:47" dir="auto">We keep track of the <code>openers_bottom</code> for each delimiter +type (<code>*</code>, <code>_</code>) and each length of the closing delimiter run +(modulo 3). Initialize this to <code>stack_bottom</code>.</p> +<p data-sourcepos="10287:1-10288:8" dir="auto">Then we repeat the following until we run out of potential +closers:</p> +<ul data-sourcepos="10290:1-10328:0" dir="auto"> +<li data-sourcepos="10290:1-10294:0"> +<p data-sourcepos="10290:3-10293:65">Move <code>current_position</code> forward in the delimiter stack (if needed) +until we find the first potential closer with delimiter <code>*</code> or <code>_</code>. +(This will be the potential closer closest +to the beginning of the input -- the first one in parse order.)</p> +</li> +<li data-sourcepos="10295:1-10298:0"> +<p data-sourcepos="10295:3-10297:68">Now, look back in the stack (staying above <code>stack_bottom</code> and +the <code>openers_bottom</code> for this delimiter type) for the +first matching potential opener ("matching" means same delimiter).</p> +</li> +<li data-sourcepos="10299:1-10316:0"> +<p data-sourcepos="10299:3-10299:18">If one is found:</p> +<ul data-sourcepos="10301:3-10316:0"> +<li data-sourcepos="10301:3-10304:0"> +<p data-sourcepos="10301:5-10303:30">Figure out whether we have emphasis or strong emphasis: +if both closer and opener spans have length >= 2, we have +strong, otherwise regular.</p> +</li> +<li data-sourcepos="10305:3-10307:0"> +<p data-sourcepos="10305:5-10306:46">Insert an emph or strong emph node accordingly, after +the text node corresponding to the opener.</p> +</li> +<li data-sourcepos="10308:3-10310:0"> +<p data-sourcepos="10308:5-10309:24">Remove any delimiters between the opener and closer from +the delimiter stack.</p> +</li> +<li data-sourcepos="10311:3-10316:0"> +<p data-sourcepos="10311:5-10315:56">Remove 1 (for regular emph) or 2 (for strong emph) delimiters +from the opening and closing text nodes. If they become empty +as a result, remove them and remove the corresponding element +of the delimiter stack. If the closing node is removed, reset +<code>current_position</code> to the next element in the stack.</p> +</li> +</ul> +</li> +<li data-sourcepos="10317:1-10328:0"> +<p data-sourcepos="10317:3-10317:19">If none is found:</p> +<ul data-sourcepos="10319:3-10328:0"> +<li data-sourcepos="10319:3-10322:0"> +<p data-sourcepos="10319:5-10321:73">Set <code>openers_bottom</code> to the element before <code>current_position</code>. +(We know that there are no openers for this kind of closer up to and +including this point, so this puts a lower bound on future searches.)</p> +</li> +<li data-sourcepos="10323:3-10326:0"> +<p data-sourcepos="10323:5-10325:24">If the closer at <code>current_position</code> is not a potential opener, +remove it from the delimiter stack (since we know it can't +be a closer either).</p> +</li> +<li data-sourcepos="10327:3-10328:0"> +<p data-sourcepos="10327:5-10327:64">Advance <code>current_position</code> to the next element in the stack.</p> +</li> +</ul> +</li> +</ul> +<p data-sourcepos="10329:1-10330:16" dir="auto">After we're done, we remove all delimiters above <code>stack_bottom</code> from the +delimiter stack.</p> diff --git a/glfm_specification/output/spec.txt b/glfm_specification/output/spec.txt index af4eba06758..a8565b15bc3 100644 --- a/glfm_specification/output/spec.txt +++ b/glfm_specification/output/spec.txt @@ -1791,7 +1791,7 @@ followed by one of the strings (case-insensitive) `address`, `h1`, `h2`, `h3`, `h4`, `h5`, `h6`, `head`, `header`, `hr`, `html`, `iframe`, `legend`, `li`, `link`, `main`, `menu`, `menuitem`, `nav`, `noframes`, `ol`, `optgroup`, `option`, `p`, `param`, -`section`, `source`, `summary`, `table`, `tbody`, `td`, +`section`, `summary`, `table`, `tbody`, `td`, `tfoot`, `th`, `thead`, `title`, `tr`, `track`, `ul`, followed by [whitespace], the end of the line, the string `>`, or the string `/>`.\ @@ -9600,7 +9600,7 @@ Multiple spaces ```````````````````````````````` -# GitLab-Specific Markdown +# GitLab Official Specification Markdown Currently, only some of the GitLab-specific markdown features are listed in this section. We will eventually add all @@ -9802,57 +9802,6 @@ title: YAML front matter <h2>title: YAML front matter</h2> ```````````````````````````````` -## Audio - -See -[audio](https://docs.gitlab.com/ee/user/markdown.html#audio) in the GitLab Flavored Markdown documentation. - -GLFM renders image elements as an audio player as long as the resource’s file extension is -one of the following supported audio extensions `.mp3`, `.oga`, `.ogg`, `.spx`, and `.wav`. -Audio ignore the alternative text part of an image declaration. - -```````````````````````````````` example gitlab -![audio](audio.oga "audio title") -. -<p><audio src="audio.oga" title="audio title"></audio></p> -```````````````````````````````` - -Reference definitions work audio as well: - -```````````````````````````````` example gitlab -[audio]: audio.oga "audio title" - -![audio][audio] -. -<p><audio src="audio.oga" title="audio title"></audio></p> -```````````````````````````````` - -## Video - -See -[videos](https://docs.gitlab.com/ee/user/markdown.html#videos) in the GitLab Flavored Markdown documentation. - -GLFM renders image elements as a video player as long as the resource’s file extension is -one of the following supported video extensions `.mp4`, `.m4v`, `.mov`, `.webm`, and `.ogv`. -Videos ignore the alternative text part of an image declaration. - - -```````````````````````````````` example gitlab -![video](video.m4v "video title") -. -<p><video src="video.m4v" title="video title"></video></p> -```````````````````````````````` - -Reference definitions work video as well: - -```````````````````````````````` example gitlab -[video]: video.mov "video title" - -![video][video] -. -<p><video src="video.mov" title="video title"></video></p> -```````````````````````````````` - ## Table of contents See @@ -9929,7 +9878,58 @@ A table of contents can be indented with up to three spaces. <h1>Heading 1</h1> ```````````````````````````````` -# Examples Using Internal Extensions +# GitLab Internal Extension Markdown + +## Audio + +See +[audio](https://docs.gitlab.com/ee/user/markdown.html#audio) in the GitLab Flavored Markdown documentation. + +GLFM renders image elements as an audio player as long as the resource’s file extension is +one of the following supported audio extensions `.mp3`, `.oga`, `.ogg`, `.spx`, and `.wav`. +Audio ignore the alternative text part of an image declaration. + +```````````````````````````````` example gitlab +![audio](audio.oga "audio title") +. +<p><audio src="audio.oga" title="audio title"></audio></p> +```````````````````````````````` + +Reference definitions work audio as well: + +```````````````````````````````` example gitlab +[audio]: audio.oga "audio title" + +![audio][audio] +. +<p><audio src="audio.oga" title="audio title"></audio></p> +```````````````````````````````` + +## Video + +See +[videos](https://docs.gitlab.com/ee/user/markdown.html#videos) in the GitLab Flavored Markdown documentation. + +GLFM renders image elements as a video player as long as the resource’s file extension is +one of the following supported video extensions `.mp4`, `.m4v`, `.mov`, `.webm`, and `.ogv`. +Videos ignore the alternative text part of an image declaration. + + +```````````````````````````````` example gitlab +![video](video.m4v "video title") +. +<p><video src="video.m4v" title="video title"></video></p> +```````````````````````````````` + +Reference definitions work video as well: + +```````````````````````````````` example gitlab +[video]: video.mov "video title" + +![video][video] +. +<p><video src="video.mov" title="video title"></video></p> +```````````````````````````````` ## Markdown Preview API Request Overrides @@ -10328,4 +10328,3 @@ closers: After we're done, we remove all delimiters above `stack_bottom` from the delimiter stack. - |