ADDED modules/markdown/markdown.man Index: modules/markdown/markdown.man ================================================================== --- /dev/null +++ modules/markdown/markdown.man @@ -0,0 +1,22 @@ +[comment {-*- tcl -*- doctools manpage}] +[manpage_begin markdown n 1.0] +[moddesc {Markdown to HTML Converter}] +[titledesc {Converts Markdown text to HTML}] +[category {Text processing}] +[require Tcl 8.5] +[require textutil [opt 0.8]] +[description] + +The package [package Markdown] provides a command to convert +Markdown annotated text into HMTL. + +[list_begin definitions] +[call [cmd ::Markdown::convert] [arg "markdown"]] + +This command takes in a block of Markdown text, and returns a block +of HTML. +[list_end] + +[vset CATEGORY textutil] +[include ../doctools2base/include/feedback.inc] +[manpage_end] ADDED modules/markdown/markdown.md Index: modules/markdown/markdown.md ================================================================== --- /dev/null +++ modules/markdown/markdown.md @@ -0,0 +1,93 @@ +# Markdown + +*Markdown* is a Markdown to XHTML processor. It supports the original +basic syntax as defined by John Gruber on his homepage at [http://daringfireball.net/projects/markdown/syntax](http://daringfireball.net/projects/markdown/syntax). + +# Markdown Dialect + +Tcl-markdown is intended to support the same range of inputs and outputs +as John Gruber's original Markdown processor. + +Common extensions are not supported at this time. + +## Known Bugs + +Per Markdown.mdtest, reflink text can contain brackets. This input +should produce a link to the "/url/"; at present it does not +(see Tcl-markdown test mdtest-1.3): +``` +With [embedded [brackets]] [b]. + +[b]: /url/ +``` + +Simple reference links are ignored. The following link should be +expanded, but it isn't (see Tcl-markdown test mdtest-1.4): + +``` +Simple link [this]. + +[this]: /url/ +``` + +Oddly, a line beginning and ending with brackets can contain +reference links within it. The following links should be expanded, +but are not (see Tcl-markdown tests mdtest-1.5 and 1.6): + +``` +[Links can be [embedded][] in brackets] +[Links can be [embedded] in brackets] + +[embedded]: /url/ + +``` + +Simple reflinks can have line breaks in them; these are currently not +supported (see Tcl-markdown tests mdtest-1.7 and 1.8): + +``` +The [link +breaks] across lines. + +The [link +breaks] across lines, but with a line-ending space. + +[link breaks]: /url/ + +``` + +## Mdtest Results + +Tcl-markdown has been run against the Markdown.mdtest test set provided by +[mdtest](https://github.com/michelf/mdtest) test suite, with mixed +results. + +* Running the test suite on OSX 10.8.5, using PHP 5.3.28, most + tests fail. Examination of the results reveals that most of the + "failures" involve whitespace differences with no effect on the rendered + appearance of the output. + +* Running the test suite on OSX 10.9, using PHP 5.4.30, most tests pass. + The test files and Tcl-markdown outputs are identical on both platforms. + My conjecture is that an XML-parser is used to compare the actual and + expected results, and that the comparison is a little more forgiving on + PHP 5.4.30. + +I am trying to fix substantive bugs; but see the mdtest-\*.\* tests +in test/markdown/markdown.test that are tagged with the constraint +"knownbug". + +## CommonMark Results + +Tcl-markdown has not been run against the CommonMark test suite as yet. +I would like to evolve it into a CommonMark compliant processor, but that +will take some time. + +# Provenance + +This module originated as the Tcl-Markdown project by Tobias Koch and Danyil Bohdan, +as part of the Caius Test Tool. [https://github.com/tobijk/caius/](https://github.com/tobijk/caius/) + +That module incorporated into Tcllib is based on a version that modifed and enhanced +by Will Duquette. [https://github.com/wduquette/tcl-markdown](https://github.com/wduquette/tcl-markdown) + ADDED modules/markdown/markdown.test Index: modules/markdown/markdown.test ================================================================== --- /dev/null +++ modules/markdown/markdown.test @@ -0,0 +1,418 @@ +# tool.test - Copyright (c) 2016 Sean Woods, Will DuQuette, Caius Project +# ------------------------------------------------------------------------- +#------------------------------------------------------------------------- +# TITLE: +# markdown.test +# +# PROJECT: +# tcl-markdown: Your project description +# +# DESCRIPTION: +# markdown: Test Suite +#------------------------------------------------------------------------- + +source [file join \ + [file dirname [file dirname [file join [pwd] [info script]]]] \ + devtools testutilities.tcl] + +testsNeedTcl 8.5 +testsNeedTcltest 2 + +support { + + use textutil/textutil.tcl textutil +} +testing { + useLocal markdown.tcl Markdown +} + +#------------------------------------------------------------------------- +# Setup + +tcltest::testConstraint knownbug 0 + + +# outdent text +# +# text - A multi-line text string +# +# This command outdents a multi-line text string to the left margin. + +proc outdent {text} { + # FIRST, remove any leading blank lines + regsub {\A(\s*\n)} $text "" text + + # NEXT, remove any trailing whitespace + set text [string trimright $text] + + # NEXT, get the length of the leading on the first line. + if {[regexp {\A(\s*)\S} $text dummy leader]} { + + # Remove the leader from the beginning of each indented + # line, and update the string. + regsub -all -line "^$leader" $text "" text + } + + return $text +} + + +proc cmp {s1 s2} { + set s1 [string trim $s1] + set s2 [string trim $s2] + + return [expr {$s1 eq $s2}] +} + +proc dumpcmp {s1 s2} { + set s1 [string trim $s1] + set s2 [string trim $s2] + + puts "# START S1" + puts $s1 + puts "# START S2" + puts $s2 + puts "# END TEXT" + puts "# LENGTH = [string length $s1], [string length $s2]" +} + +# convert in +# +# in - markdown input, possibly indented. +# +# Outdents the input and converts it to HTML. Indents it for inclusion +# in a result. +proc convert {in} { + set lines [split [string trim [Markdown::convert [outdent $in]]] \n] + + set out [join $lines "\n "] + return "\n $out\n" +} + +#========================================================================= +# Tcl-markdown tests + +#------------------------------------------------------------------------- +# Conversion tests + +test basic-1.1 {basic text} -body { + convert { + A line of text. + + Another line of text. + } +} -result { +
A line of text.
+ +Another line of text.
+} + +test basic-1.2 {multi-line paragraphs} -body { + convert { + Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do + eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut + enim ad minim veniam, quis nostrud exercitation ullamco laboris + nisi ut aliquip ex ea commodo consequat. + + Duis aute irure dolor in reprehenderit in voluptate velit esse + cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat + cupidatat non proident, sunt in culpa qui officia deserunt mollit + anim id est laborum. + } +} -result { +Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do + eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut + enim ad minim veniam, quis nostrud exercitation ullamco laboris + nisi ut aliquip ex ea commodo consequat.
+ +Duis aute irure dolor in reprehenderit in voluptate velit esse + cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat + cupidatat non proident, sunt in culpa qui officia deserunt mollit + anim id est laborum.
+} + +test bquote-1.1 {simple blockquote} -body { + convert { + > + > A line of text. + > + } +} -result { +++} + +test bquote-1.2 {">" on first line only.} -body { + convert { + > Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do + eiusmod tempor incididunt ut labore et dolore magna aliqua. + } +} -result { +A line of text.
+
++} + +test bquote-1.3 {block quote with markup} -body { + convert { + > ### Heading 3 + > + > Lorem ipsum dolor sit amet, consectetur adipiscing elit + } +} -result { +Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do + eiusmod tempor incididunt ut labore et dolore magna aliqua.
+
++} + +test bquote-1.4 {nested block quotes} -body { + convert { + > First this. + > + > > And then this and this + > > and this. + > + > And then this. + } +} -result { +Heading 3
+ +Lorem ipsum dolor sit amet, consectetur adipiscing elit
+
++} + +test bquote-1.5 {complex case (from Caius test suite)} -body { + convert { + > + > > This is what he said. This is what she said. This is what + > > he said. This is what she said. + > > + > > ### Heading 3 ##### + > > + > > This is what he said. This is what she said. This is what + > > he said. This is what she said. + > > + > > import os + > > os.path.listdir() + > > + > > This is what he said. This is what she said. This is what + > > he said. This is what she said. + > + > ## Heading 2 + > + > This is what he said. This is what she said. This is what + > he said. This is what she said. + + This is a test. + } +} -result { +First this.
+ +++ +And then this and this + and this.
+And then this.
+
++ +++ +This is what he said. This is what she said. This is what + he said. This is what she said.
+ +Heading 3
+ +This is what he said. This is what she said. This is what + he said. This is what she said.
+ ++ +import os + os.path.listdir()
This is what he said. This is what she said. This is what + he said. This is what she said.
+Heading 2
+ +This is what he said. This is what she said. This is what + he said. This is what she said.
+
This is a test.
+} + + + +test convert-2.2 {refs} -body { + convert { + Find it [here][foo]! + + [foo]: http://example.com/ "Optional Title Here" + } +} -result { +Find it here!
+} + + +#========================================================================= +# Tests related to other processors or test suites + +#------------------------------------------------------------------------- +# Caius Markdown Tests +# +# These tests translate entire files. I prefer tests for individual +# features; when a test fails, you don't need to go hunting for the +# specifics. But I'm keeping these to show compatibility with the +# Caius processor. + +# 1.* - Caius markdown tests + +test caius-1.1 {bq test} -body { + set md [::tcltest::viewFile test/bq.md] + set html [::tcltest::viewFile test/bq.html] + + cmp $html [Markdown::convert $md] +} -result {1} + +test caius-1.2 {code test} -body { + set md [::tcltest::viewFile test/code.md] + set html [::tcltest::viewFile test/code.html] + + cmp $html [Markdown::convert $md] +} -result {1} + +test caius-1.3 {comments test} -body { + set md [::tcltest::viewFile test/comments.md] + set html [::tcltest::viewFile test/comments.html] + cmp $html [Markdown::convert $md] +} -result {1} + +test caius-1.4 {inline test} -body { + set md [::tcltest::viewFile test/inline.md] + set html [::tcltest::viewFile test/inline.html] + cmp $html [Markdown::convert $md] +} -result {1} + +test caius-1.5 {lists test} -body { + set md [::tcltest::viewFile test/lists.md] + set html [::tcltest::viewFile test/lists.html] + cmp $html [Markdown::convert $md] +} -result {1} + +test caius-1.6 {p_br_h_hr test} -body { + set md [::tcltest::viewFile test/p_br_h_hr.md] + set html [::tcltest::viewFile test/p_br_h_hr.html] + cmp $html [Markdown::convert $md] +} -result {1} + +test caius-1.7 {indent test} -body { + set md [::tcltest::viewFile test/indent.md] + set html [::tcltest::viewFile test/indent.html] + cmp $html [Markdown::convert $md] +} -result {1} + +#------------------------------------------------------------------------- +# mdtest: Bugs found while running michelf/mdtest + + +test mdtest-1.1 {AL: Auto links: & not escaped in URL} -body { + convert { + Auto-link with ampersand:Auto-link with ampersand: http://example.com/?foo=1&bar=2
+} + +test mdtest-1.2 {Undefined refs cause syntax error} -body { + convert { + Undefined ref: [foo] + } +} -result { +Undefined ref: [foo]
+} + +test mdtest-1.3 {LRS: Embedded brackets in link} -constraints knownbug -body { + convert { + With [embedded [brackets]] [b]. + + [b]: /url/ + } +} -result { +With embedded [brackets].
+} + +test mdtest-1.4 {LRS: Simple reflink} -constraints knownbug -body { + convert { + Simple link [this]. + + [this]: /url/ + } +} -result { +Simple link this.
+} + + +test mdtest-1.5 {LRS: Reflink embedded in brackets 1} -constraints knownbug -body { + convert { + [Links can be [embedded][] in brackets] + + [embedded]: /url/ + } +} -result { +[Links can be embedded in brackets]
+} + +test mdtest-1.6 {LRS: Reflink embedded in brackets 2} -constraints knownbug -body { + convert { + [Links can be [embedded] in brackets] + + [embedded]: /url/ + } +} -result { +[Links can be embedded in brackets]
+} + +test mdtest-1.7 {LRS: link breaks across lines, 1} -constraints knownbug -body { + convert { + The [link + breaks] across lines. + + [link breaks]: /url/ + } +} -result { +The link + breaks across lines.
+} + +test mdtest-1.8 {LRS: link breaks across lines, 2} -constraints knownbug -body { + convert { + The [link + breaks] across lines, but with a line-ending space. + + [link breaks]: /url/ + } +} -result { +The link + breaks across lines, but with a line-ending space.
+} + +test mdtest-1.9 {OAUL: "* * *" line after unordered list} -body { + # This causes the processor to hang. + convert { + * asterisk 1 + + * * * + } +} -result { +asterisk 1
+ +* *
++ +Heading 1
+ +This is what he said. This is what she said. This is what +he said. This is what she said.
+ +++ +This is what he said. This is what she said. This is what +he said. This is what she said.
+ +Heading 3
+ +This is what he said. This is what she said. This is what +he said. This is what she said.
+ ++ +import os +os.path.listdir()
This is what he said. This is what she said. This is what +he said. This is what she said.
+Heading 2
+ +This is what he said. This is what she said. This is what +he said. This is what she said.
+
This is a test.
ADDED modules/markdown/test/bq.md Index: modules/markdown/test/bq.md ================================================================== --- /dev/null +++ modules/markdown/test/bq.md @@ -0,0 +1,32 @@ +Heading 1 +===== + +> +> Heading 1 +> ==== + + +> This is what he said. This is what she said. This is what +he said. This is what she said. + +> +> > This is what he said. This is what she said. This is what +> > he said. This is what she said. +> > +> > ### Heading 3 ##### +> > +> > This is what he said. This is what she said. This is what +> > he said. This is what she said. +> > +> > import os +> > os.path.listdir() +> > +> > This is what he said. This is what she said. This is what +> > he said. This is what she said. +> +> ## Heading 2 +> +> This is what he said. This is what she said. This is what +> he said. This is what she said. + +This is a test. ADDED modules/markdown/test/code.html Index: modules/markdown/test/code.html ================================================================== --- /dev/null +++ modules/markdown/test/code.html @@ -0,0 +1,24 @@ +There is some code coming up. There is some code +coming up. There is some code coming up. There is +some code coming up.
+ +import os
+
+fp = file("test.text", "rb")
+buf = fp.read()
+
+There is some code coming up. There is some code +coming up. There is some code coming up. There is +some code coming up.
+ +<?xml version="1.0" encoding="utf-8"?>
+<html>
+ <head>
+ <title>Title</title>
+ </head>
+ <body>
+ Body text...
+ </body>
+</html>
ADDED modules/markdown/test/code.md
Index: modules/markdown/test/code.md
==================================================================
--- /dev/null
+++ modules/markdown/test/code.md
@@ -0,0 +1,25 @@
+Test code blocks
+===
+
+There is some code coming up. There is some code
+coming up. There is some code coming up. There is
+some code coming up.
+
+ import os
+
+ fp = file("test.text", "rb")
+ buf = fp.read()
+
+There is some code coming up. There is some code
+coming up. There is some code coming up. There is
+some code coming up.
+
+
+
+
+ There is a paragraph. There is a paragraph. There is +a paragraph. There is a paragraph. +There is a paragraph. There is a paragraph. There is a paragraph. +There is a paragraph.
+ + + +There is a paragraph. There is a paragraph. There is +a paragraph. There is a paragraph. There is a paragraph. +There is a paragraph. There is a paragraph. There is a +paragraph.
+ +There is a paragraph. There is a paragraph. There is +a paragraph. There is a paragraph. There is a paragraph. +There is a paragraph. There is a paragraph. There is a +paragraph. +
+ ++There is a paragraph. There is a paragraph. There is +a paragraph. There is a paragraph. There is a paragraph. +There is a paragraph. There is a paragraph. There is a +paragraph.
+ +There is a paragraph. There is a paragraph. There is +a paragraph. There is a paragraph. There is a paragraph. +There is a paragraph. There is a paragraph. There is a +paragraph.
+ + + +There is a paragraph. There is a paragraph. There is +a paragraph. There is a paragraph. There is a paragraph. +There is a paragraph. There is a paragraph. There is a +paragraph.
+ ++There is a paragraph. There is a paragraph. There is +a paragraph. There is a paragraph. There is a paragraph. +There is a paragraph. There is a paragraph. There is a +paragraph.
+ +There is a paragraph. There is a paragraph. There is +a paragraph. There is a paragraph. There is a paragraph. +There is a paragraph. There is a paragraph. There is a +paragraph.
+ + + + +There is a paragraph. There is a paragraph. There is +a paragraph. There is a paragraph. There is a paragraph. +There is a paragraph. There is a paragraph. There is a +paragraph.
+ +There is a paragraph. There is a paragraph. +There is a paragraph. There is a paragraph. There is a +paragraph. There is a paragraph. There is a paragraph. +There is a paragraph.
ADDED modules/markdown/test/comments.md Index: modules/markdown/test/comments.md ================================================================== --- /dev/null +++ modules/markdown/test/comments.md @@ -0,0 +1,82 @@ +There is a paragraph. There is a paragraph. There is +a paragraph. There is a paragraph. +There is a paragraph. There is a paragraph. There is a paragraph. +There is a paragraph. + + + +There is a paragraph. There is a paragraph. There is +a paragraph. There is a paragraph. There is a paragraph. +There is a paragraph. There is a paragraph. There is a +paragraph. + +There is a paragraph. There is a paragraph. There is +a paragraph. There is a paragraph. There is a paragraph. +There is a paragraph. There is a paragraph. There is a +paragraph. + + + +There is a paragraph. There is a paragraph. There is +a paragraph. There is a paragraph. There is a paragraph. +There is a paragraph. There is a paragraph. There is a +paragraph. + +There is a paragraph. There is a paragraph. There is +a paragraph. There is a paragraph. There is a paragraph. +There is a paragraph. There is a paragraph. There is a +paragraph. + + + +There is a paragraph. There is a paragraph. There is +a paragraph. There is a paragraph. There is a paragraph. +There is a paragraph. There is a paragraph. There is a +paragraph. + + +There is a paragraph. There is a paragraph. There is +a paragraph. There is a paragraph. There is a paragraph. +There is a paragraph. There is a paragraph. There is a +paragraph. + +There is a paragraph. There is a paragraph. There is +a paragraph. There is a paragraph. There is a paragraph. +There is a paragraph. There is a paragraph. There is a +paragraph. + + + + +There is a paragraph. There is a paragraph. There is +a paragraph. There is a paragraph. There is a paragraph. +There is a paragraph. There is a paragraph. There is a +paragraph. + +There is a paragraph. There is a paragraph. +There is a paragraph. There is a paragraph. There is a +paragraph. There is a paragraph. There is a paragraph. +There is a paragraph. + ADDED modules/markdown/test/indent.html Index: modules/markdown/test/indent.html ================================================================== --- /dev/null +++ modules/markdown/test/indent.html @@ -0,0 +1,7 @@ +This code segment is indented with a tab
+ +#include <stdio.h>
+
+This code segment is indented with four spaces
+ +#include <stdio.h>
ADDED modules/markdown/test/indent.md
Index: modules/markdown/test/indent.md
==================================================================
--- /dev/null
+++ modules/markdown/test/indent.md
@@ -0,0 +1,10 @@
+
+This code segment is indented with a tab
+
+ #include This one is emphasized with *
. This one is strongly emphasized with __
.
+This one has its delimiter e*s*c*a*p*e*d as content. This is a free *
+asterisk and a free _ underscore. This is a strong one.
Use Google and Yahoo for search and read News for Nerds and +Hacker News. Watch videos at Youtube. +News for Nerds.
+ + + +Unknown ref: [bla][foo]
+ +An XML declaration looks like this: <?xml version="1.0" encoding="utf-8"?>
.
+The printf()
function is used for printing to the screen. Show a single
+`
.
Here comes an inline graphic . Here comes a reference .
+ + + +Here is a copyright symbol: ©. AT&T operator talk. 4 < 5 or 5 > 4.
+ +Write to me@example.com and visit http://www.example.com. +This is an auto-link with ampersand: http://example.com/?foo=1&bar=2.
+ +Here is some text in bold. An image tag . And here comes a table:
+ +Column A | Column B | +
Here comes some text. Here comes some text. Here comes some text. Here +comes some text. Here comes some text. Here comes some text. Here comes +some text.
+ +Here is an inline email link with mailto: max@example.com. And +here is an inline email link without mailto: max@example.com. This is +not a valid email link <something@> neither is this <@example.com>.
ADDED modules/markdown/test/inline.md Index: modules/markdown/test/inline.md ================================================================== --- /dev/null +++ modules/markdown/test/inline.md @@ -0,0 +1,71 @@ +Test inline Elements +=== + +Emphasis +--- + + +This one is *emphasized* with `*`. This one is __strongly emphasized__ with `__`. +This one has its delimiter *e\*s\*c\*a\*p\*e\*d* as content. This is a free * +asterisk and a free _ underscore. This is a **strong one**. + +Links +--- + +Use [Google][] and [Yahoo] [] for search and read [News for Nerds][Slashdot] and +[Hacker News] [HN]. Watch videos at [Youtube](http://www.youtube.com "Youtube"). +[News for Nerds][Slashdot]. + +[Google]: http://www.google.de + "Google Homepage" +[Yahoo]: http://www.yahoo.com +[Slashdot]:Column A | Column B | +
This is a paragraph of test followed by a list. This is +a paragraph of text followed by a list. This is a paragraph +of text followed by a list. This is a paragraph of text.
+ +This is +a test
+ +This is a +test
+ +A
B
+ +C
test
test
test
+ +test
+ +test
Another list
+ +++ +Quote me +me me me
+ +Quote me +me me me
+ +++Quote quote me
+
Normal paragraph
+ +import os
+os.path.listdir()
+
+eins
+ +zwei
This is a list item with two paragraphs.
+ +This is the second paragraph in the list item. You're +only required to indent the first line. Lorem ipsum dolor +sit amet, consectetuer adipiscing elit.
+ +Another item in the same list.
+ +* * Test that this does not recurse
+ +- - Test that this does not recurse
+ ++ + Test that this does not recurse
This is a paragraph of text. This is a paragraph
+of text. This is a paragraph of text. This is a
+paragraph of text.
This is a paragraph of text. This is a paragraph +of text. This is a paragraph of text. This is a +paragraph of text.
+ +This is a paragraph of text. This is a paragraph +of text. This is a paragraph of text. This is a +paragraph of text.
+ +This is a paragraph of text. This is a paragraph +of text. This is a paragraph of text. This is a +paragraph of text.
+ +This is a paragraph of text. This is a paragraph +of text. This is a paragraph of text. This is a +paragraph of text.
+ +This is a paragraph of text. This is a paragraph +of text. This is a paragraph of text. This is a +paragraph of text.
+ +This is a paragraph of text. This is a paragraph +of text. This is a paragraph of text. This is a +paragraph of text.
+ +This is a paragraph of text. This is a paragraph +of text. This is a paragraph of text. This is a +paragraph of text.
+ +This is a paragraph of text. This is a paragraph +of text. This is a paragraph of text. This is a +paragraph of text.
+ +This is a paragraph of text. This is a paragraph +of text. This is a paragraph of text. This is a +paragraph of text.
+ +This is a paragraph of text. This is a paragraph +of text. This is a paragraph of text. This is a +paragraph of text.
ADDED modules/markdown/test/p_br_h_hr.md Index: modules/markdown/test/p_br_h_hr.md ================================================================== --- /dev/null +++ modules/markdown/test/p_br_h_hr.md @@ -0,0 +1,76 @@ +H1 Setext style heading +==== + + + +This is a paragraph of text. This is a paragraph +of text. This is a paragraph of text. This is a +paragraph of text. + + +H2 Setext style heading +---- + + +This is a paragraph of text. This is a paragraph +of text. This is a paragraph of text. This is a +paragraph of text. + + +# H1 Atx style heading + + + + +This is a paragraph of text. This is a paragraph +of text. This is a paragraph of text. This is a +paragraph of text. + +## H2 Atx style heading + +This is a paragraph of text. This is a paragraph +of text. This is a paragraph of text. This is a +paragraph of text. + +### H3 Atx style heading + +This is a paragraph of text. This is a paragraph +of text. This is a paragraph of text. This is a +paragraph of text. + +#### H4 Atx style heading + +This is a paragraph of text. This is a paragraph +of text. This is a paragraph of text. This is a +paragraph of text. + +##### H5 Atx style heading + +This is a paragraph of text. This is a paragraph +of text. This is a paragraph of text. This is a +paragraph of text. + +###### H6 Atx style heading + +This is a paragraph of text. This is a paragraph +of text. This is a paragraph of text. This is a +paragraph of text. + + - - - + +This is a paragraph of text. This is a paragraph +of text. This is a paragraph of text. This is a +paragraph of text. + + * * * + +This is a paragraph of text. This is a paragraph +of text. This is a paragraph of text. This is a +paragraph of text. + + _ ____ + +This is a paragraph of text. This is a paragraph +of text. This is a paragraph of text. This is a +paragraph of text. +