| @ -1,3 +1,4 @@ | |||
| vendor | |||
| composer.phar | |||
| composer.lock | |||
| .idea | |||
| @ -1,15 +1,16 @@ | |||
| language: php | |||
| php: | |||
| - 5.3 | |||
| - 5.4 | |||
| - 5.5 | |||
| - 5.6 | |||
| - 7.0 | |||
| - hhvm | |||
| - 7.1 | |||
| - 7.2 | |||
| - 7.3 | |||
| before_script: | |||
| - composer install --no-interaction --prefer-source | |||
| script: | |||
| - phpunit --coverage-text --verbose | |||
| - vendor/bin/phpunit --coverage-text --verbose | |||
| @ -1,10 +1,13 @@ | |||
| To install URLify, you can add it as a dependency ar by downloading the composer.phar executable. | |||
| To install URLify, you can add it as a dependency by downloading Composer, the PHP package manager. | |||
| $ curl -s http://getcomposer.org/installer | php | |||
| `$ curl -s http://getcomposer.org/installer | php` | |||
| and run install | |||
| Then run this command to install Composer: | |||
| $ php composer.phar install | |||
| `$ php composer.phar install` | |||
| For more details, see http://getcomposer.org. | |||
| For more details, see https://getcomposer.org/ | |||
| Then run this command to install the URLify library: | |||
| `$ composer require jbroadway/urlify` | |||
| @ -0,0 +1,11 @@ | |||
| # EditorConfig is awesome: https://EditorConfig.org | |||
| root = true | |||
| [*] | |||
| end_of_line = lf | |||
| charset = utf-8 | |||
| trim_trailing_whitespace = false | |||
| [*.php] | |||
| indent_style = tab | |||
| insert_final_newline = true | |||
| @ -0,0 +1,3 @@ | |||
| *~ | |||
| /composer.lock | |||
| /vendor/ | |||
| @ -0,0 +1,36 @@ | |||
| build: | |||
| environment: | |||
| php: | |||
| version: '7.0.20' | |||
| nodes: | |||
| analysis: | |||
| project_setup: | |||
| override: | |||
| - 'true' | |||
| tests: | |||
| override: | |||
| - | |||
| command: 'vendor/bin/phpunit --coverage-clover=clover.xml' | |||
| coverage: | |||
| file: 'clover.xml' | |||
| format: 'clover' | |||
| - | |||
| command: phpcs-run | |||
| use_website_config: true | |||
| environment: | |||
| node: | |||
| version: 6.0.0 | |||
| tests: true | |||
| filter: | |||
| excluded_paths: | |||
| - 'test/*' | |||
| checks: | |||
| php: true | |||
| coding_style: | |||
| php: | |||
| indentation: | |||
| general: | |||
| use_tabs: true | |||
| spaces: | |||
| around_operators: | |||
| concatenation: true | |||
| @ -0,0 +1,29 @@ | |||
| language: php | |||
| sudo: false | |||
| cache: | |||
| directories: | |||
| - $HOME/.composer/ | |||
| # Run tests against all these PHP versions | |||
| # TODO: When it becomes possible in TravisCI, switch 7.4snapshot to plain 7.4 | |||
| php: | |||
| - 5.4 | |||
| - 5.5 | |||
| - 5.6 | |||
| - 7.0 | |||
| - 7.1 | |||
| - 7.2 | |||
| - 7.3 | |||
| - 7.4snapshot | |||
| - hhvm | |||
| before_script: | |||
| - composer install --prefer-dist | |||
| script: | |||
| - vendor/bin/phpunit --log-junit=phpunit.log | |||
| notifications: | |||
| email: false | |||
| @ -1,10 +1,10 @@ | |||
| <?php | |||
| # Use this file if you cannot use class autoloading. It will include all the | |||
| # files needed for the Markdown parser. | |||
| # | |||
| # Take a look at the PSR-0-compatible class autoloading implementation | |||
| # in the Readme.php file if you want a simple autoloader setup. | |||
| // Use this file if you cannot use class autoloading. It will include all the | |||
| // files needed for the Markdown parser. | |||
| // | |||
| // Take a look at the PSR-0-compatible class autoloading implementation | |||
| // in the Readme.php file if you want a simple autoloader setup. | |||
| require_once dirname(__FILE__) . '/MarkdownInterface.php'; | |||
| require_once dirname(__FILE__) . '/Markdown.php'; | |||
| @ -1,10 +1,10 @@ | |||
| <?php | |||
| # Use this file if you cannot use class autoloading. It will include all the | |||
| # files needed for the MarkdownExtra parser. | |||
| # | |||
| # Take a look at the PSR-0-compatible class autoloading implementation | |||
| # in the Readme.php file if you want a simple autoloader setup. | |||
| // Use this file if you cannot use class autoloading. It will include all the | |||
| // files needed for the MarkdownExtra parser. | |||
| // | |||
| // Take a look at the PSR-0-compatible class autoloading implementation | |||
| // in the Readme.php file if you want a simple autoloader setup. | |||
| require_once dirname(__FILE__) . '/MarkdownInterface.php'; | |||
| require_once dirname(__FILE__) . '/Markdown.php'; | |||
| @ -1,9 +1,9 @@ | |||
| <?php | |||
| # Use this file if you cannot use class autoloading. It will include all the | |||
| # files needed for the MarkdownInterface interface. | |||
| # | |||
| # Take a look at the PSR-0-compatible class autoloading implementation | |||
| # in the Readme.php file if you want a simple autoloader setup. | |||
| // Use this file if you cannot use class autoloading. It will include all the | |||
| // files needed for the MarkdownInterface interface. | |||
| // | |||
| // Take a look at the PSR-0-compatible class autoloading implementation | |||
| // in the Readme.php file if you want a simple autoloader setup. | |||
| require_once dirname(__FILE__) . '/MarkdownInterface.php'; | |||
| @ -1,34 +1,38 @@ | |||
| <?php | |||
| # | |||
| # Markdown - A text-to-HTML conversion tool for web writers | |||
| # | |||
| # PHP Markdown | |||
| # Copyright (c) 2004-2015 Michel Fortin | |||
| # <https://michelf.ca/projects/php-markdown/> | |||
| # | |||
| # Original Markdown | |||
| # Copyright (c) 2004-2006 John Gruber | |||
| # <https://daringfireball.net/projects/markdown/> | |||
| # | |||
| namespace Michelf; | |||
| /** | |||
| * Markdown - A text-to-HTML conversion tool for web writers | |||
| * | |||
| * @package php-markdown | |||
| * @author Michel Fortin <michel.fortin@michelf.com> | |||
| * @copyright 2004-2019 Michel Fortin <https://michelf.com/projects/php-markdown/> | |||
| * @copyright (Original Markdown) 2004-2006 John Gruber <https://daringfireball.net/projects/markdown/> | |||
| */ | |||
| # | |||
| # Markdown Parser Interface | |||
| # | |||
| namespace Michelf; | |||
| /** | |||
| * Markdown Parser Interface | |||
| */ | |||
| interface MarkdownInterface { | |||
| /** | |||
| * Initialize the parser and return the result of its transform method. | |||
| * This will work fine for derived classes too. | |||
| * | |||
| * @api | |||
| * | |||
| * @param string $text | |||
| * @return string | |||
| */ | |||
| public static function defaultTransform($text); | |||
| # | |||
| # Initialize the parser and return the result of its transform method. | |||
| # This will work fine for derived classes too. | |||
| # | |||
| public static function defaultTransform($text); | |||
| # | |||
| # Main function. Performs some preprocessing on the input text | |||
| # and pass it through the document gamut. | |||
| # | |||
| public function transform($text); | |||
| /** | |||
| * Main function. Performs some preprocessing on the input text | |||
| * and pass it through the document gamut. | |||
| * | |||
| * @api | |||
| * | |||
| * @param string $text | |||
| * @return string | |||
| */ | |||
| public function transform($text); | |||
| } | |||
| @ -1,31 +1,33 @@ | |||
| <?php | |||
| # This file passes the content of the Readme.md file in the same directory | |||
| # through the Markdown filter. You can adapt this sample code in any way | |||
| # you like. | |||
| // This file passes the content of the Readme.md file in the same directory | |||
| // through the Markdown filter. You can adapt this sample code in any way | |||
| // you like. | |||
| # Install PSR-0-compatible class autoloader | |||
| // Install PSR-4-compatible class autoloader | |||
| spl_autoload_register(function($class){ | |||
| require preg_replace('{\\\\|_(?!.*\\\\)}', DIRECTORY_SEPARATOR, ltrim($class, '\\')).'.php'; | |||
| require str_replace('\\', DIRECTORY_SEPARATOR, ltrim($class, '\\')).'.php'; | |||
| }); | |||
| // If using Composer, use this instead: | |||
| //require 'vendor/autoload.php'; | |||
| # Get Markdown class | |||
| use \Michelf\Markdown; | |||
| // Get Markdown class | |||
| use Michelf\Markdown; | |||
| # Read file and pass content through the Markdown parser | |||
| // Read file and pass content through the Markdown parser | |||
| $text = file_get_contents('Readme.md'); | |||
| $html = Markdown::defaultTransform($text); | |||
| ?> | |||
| <!DOCTYPE html> | |||
| <html> | |||
| <head> | |||
| <title>PHP Markdown Lib - Readme</title> | |||
| </head> | |||
| <body> | |||
| <head> | |||
| <title>PHP Markdown Lib - Readme</title> | |||
| </head> | |||
| <body> | |||
| <?php | |||
| # Put HTML content in the document | |||
| // Put HTML content in the document | |||
| echo $html; | |||
| ?> | |||
| </body> | |||
| </body> | |||
| </html> | |||
| @ -0,0 +1,24 @@ | |||
| <?xml version="1.0" encoding="UTF-8"?> | |||
| <phpunit backupGlobals="false" | |||
| backupStaticAttributes="false" | |||
| bootstrap="./test/bootstrap.php" | |||
| colors="true" | |||
| convertErrorsToExceptions="true" | |||
| convertNoticesToExceptions="true" | |||
| convertWarningsToExceptions="true" | |||
| > | |||
| <testsuites> | |||
| <testsuite name="php-markdown Unit Tests"> | |||
| <directory>./test/unit/</directory> | |||
| </testsuite> | |||
| <testsuite name="php-markdown Integration Tests"> | |||
| <directory>./test/integration/</directory> | |||
| </testsuite> | |||
| </testsuites> | |||
| <filter> | |||
| <whitelist processUncoveredFilesFromWhitelist="true"> | |||
| <directory suffix=".php">Michelf</directory> | |||
| </whitelist> | |||
| </filter> | |||
| </phpunit> | |||
| @ -0,0 +1,6 @@ | |||
| <?php | |||
| define('TEST_ROOT', __DIR__); | |||
| define('TEST_RESOURCES_ROOT', __DIR__ . '/resources'); | |||
| require_once __DIR__ . '/helpers/MarkdownTestHelper.php'; | |||
| @ -0,0 +1,267 @@ | |||
| <?php | |||
| use PHPUnit\Framework\TestCase; | |||
| class MarkdownTestHelper | |||
| { | |||
| /** | |||
| * Takes an input directory containing .text and .(x)html files, and returns an array | |||
| * of .text files and the corresponding output xhtml or html file. Can be used in a unit test data provider. | |||
| * | |||
| * @param string $directory Input directory | |||
| * | |||
| * @return array | |||
| */ | |||
| public static function getInputOutputPaths($directory) { | |||
| $iterator = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($directory)); | |||
| $regexIterator = new RegexIterator( | |||
| $iterator, | |||
| '/^.+\.text$/', | |||
| RecursiveRegexIterator::GET_MATCH | |||
| ); | |||
| $dataValues = []; | |||
| /** @var SplFileInfo $inputFile */ | |||
| foreach ($regexIterator as $inputFiles) { | |||
| foreach ($inputFiles as $inputMarkdownPath) { | |||
| $xhtml = true; | |||
| $expectedHtmlPath = substr($inputMarkdownPath, 0, -4) . 'xhtml'; | |||
| if (!file_exists($expectedHtmlPath)) { | |||
| $expectedHtmlPath = substr($inputMarkdownPath, 0, -4) . 'html'; | |||
| $xhtml = false; | |||
| } | |||
| $dataValues[] = [$inputMarkdownPath, $expectedHtmlPath, $xhtml]; | |||
| } | |||
| } | |||
| return $dataValues; | |||
| } | |||
| /** | |||
| * Applies PHPUnit's assertSame after normalizing both strings (e.g. ignoring whitespace differences). | |||
| * Uses logic found originally in MDTest. | |||
| * | |||
| * @param string $string1 | |||
| * @param string $string2 | |||
| * @param string $message Positive message to print when test fails (e.g. "String1 matches String2") | |||
| * @param bool $xhtml | |||
| */ | |||
| public static function assertSameNormalized($string1, $string2, $message, $xhtml = true) { | |||
| $t_result = $string1; | |||
| $t_output = $string2; | |||
| // DOMDocuments | |||
| if ($xhtml) { | |||
| $document = new DOMDocument(); | |||
| $doc_result = $document->loadXML('<!DOCTYPE html>' . | |||
| "<html xmlns='http://www.w3.org/1999/xhtml'>" . | |||
| "<body>$t_result</body></html>"); | |||
| $document2 = new DOMDocument(); | |||
| $doc_output = $document2->loadXML('<!DOCTYPE html>' . | |||
| "<html xmlns='http://www.w3.org/1999/xhtml'>" . | |||
| "<body>$t_output</body></html>"); | |||
| if ($doc_result) { | |||
| static::normalizeElementContent($document->documentElement, false); | |||
| $n_result = $document->saveXML(); | |||
| } else { | |||
| $n_result = '--- Expected Result: XML Parse Error ---'; | |||
| } | |||
| if ($doc_output) { | |||
| static::normalizeElementContent($document2->documentElement, false); | |||
| $n_output = $document2->saveXML(); | |||
| } else { | |||
| $n_output = '--- Output: XML Parse Error ---'; | |||
| } | |||
| } else { | |||
| // '@' suppressors used because some tests have invalid HTML (multiple elements with the same id attribute) | |||
| // Perhaps isolate to a separate test and remove this? | |||
| $document = new DOMDocument(); | |||
| $doc_result = @$document->loadHTML($t_result); | |||
| $document2 = new DOMDocument(); | |||
| $doc_output = @$document2->loadHTML($t_output); | |||
| if ($doc_result) { | |||
| static::normalizeElementContent($document->documentElement, false); | |||
| $n_result = $document->saveHTML(); | |||
| } else { | |||
| $n_result = '--- Expected Result: HTML Parse Error ---'; | |||
| } | |||
| if ($doc_output) { | |||
| static::normalizeElementContent($document2->documentElement, false); | |||
| $n_output = $document2->saveHTML(); | |||
| } else { | |||
| $n_output = '--- Output: HTML Parse Error ---'; | |||
| } | |||
| } | |||
| $n_result = preg_replace('{^.*?<body>|</body>.*?$}is', '', $n_result); | |||
| $n_output = preg_replace('{^.*?<body>|</body>.*?$}is', '', $n_output); | |||
| $c_result = $n_result; | |||
| $c_output = $n_output; | |||
| $c_result = trim($c_result) . "\n"; | |||
| $c_output = trim($c_output) . "\n"; | |||
| // This will throw a test exception if the strings don't exactly match | |||
| TestCase::assertSame($c_result, $c_output, $message); | |||
| } | |||
| /** | |||
| * @param DOMElement $element Modifies this element by reference | |||
| * @param bool $whitespace_preserve Preserve Whitespace | |||
| * @return void | |||
| */ | |||
| protected static function normalizeElementContent($element, $whitespace_preserve) { | |||
| # | |||
| # Normalize content of HTML DOM $element. The $whitespace_preserve | |||
| # argument indicates that whitespace is significant and shouldn't be | |||
| # normalized; it should be used for the content of certain elements like | |||
| # <pre> or <script>. | |||
| # | |||
| $node_list = $element->childNodes; | |||
| switch (strtolower($element->nodeName)) { | |||
| case 'body': | |||
| case 'div': | |||
| case 'blockquote': | |||
| case 'ul': | |||
| case 'ol': | |||
| case 'dl': | |||
| case 'h1': | |||
| case 'h2': | |||
| case 'h3': | |||
| case 'h4': | |||
| case 'h5': | |||
| case 'h6': | |||
| $whitespace = "\n\n"; | |||
| break; | |||
| case 'table': | |||
| $whitespace = "\n"; | |||
| break; | |||
| case 'pre': | |||
| case 'script': | |||
| case 'style': | |||
| case 'title': | |||
| $whitespace_preserve = true; | |||
| $whitespace = ""; | |||
| break; | |||
| default: | |||
| $whitespace = ""; | |||
| break; | |||
| } | |||
| foreach ($node_list as $node) { | |||
| switch ($node->nodeType) { | |||
| case XML_ELEMENT_NODE: | |||
| static::normalizeElementContent($node, $whitespace_preserve); | |||
| static::normalizeElementAttributes($node); | |||
| switch (strtolower($node->nodeName)) { | |||
| case 'p': | |||
| case 'div': | |||
| case 'hr': | |||
| case 'blockquote': | |||
| case 'ul': | |||
| case 'ol': | |||
| case 'dl': | |||
| case 'li': | |||
| case 'address': | |||
| case 'table': | |||
| case 'dd': | |||
| case 'pre': | |||
| case 'h1': | |||
| case 'h2': | |||
| case 'h3': | |||
| case 'h4': | |||
| case 'h5': | |||
| case 'h6': | |||
| $whitespace = "\n\n"; | |||
| break; | |||
| case 'tr': | |||
| case 'td': | |||
| case 'dt': | |||
| $whitespace = "\n"; | |||
| break; | |||
| default: | |||
| $whitespace = ""; | |||
| break; | |||
| } | |||
| if (($whitespace === "\n\n" || $whitespace === "\n") && | |||
| $node->nextSibling && | |||
| $node->nextSibling->nodeType != XML_TEXT_NODE) { | |||
| $element->insertBefore(new DOMText($whitespace), $node->nextSibling); | |||
| } | |||
| break; | |||
| case XML_TEXT_NODE: | |||
| if (!$whitespace_preserve) { | |||
| if (trim($node->data) === "") { | |||
| $node->data = $whitespace; | |||
| } | |||
| else { | |||
| $node->data = preg_replace('{\s+}', ' ', $node->data); | |||
| } | |||
| } | |||
| break; | |||
| } | |||
| } | |||
| if (!$whitespace_preserve && | |||
| ($whitespace === "\n\n" || $whitespace === "\n")) { | |||
| if ($element->firstChild) { | |||
| if ($element->firstChild->nodeType == XML_TEXT_NODE) { | |||
| $element->firstChild->data = | |||
| preg_replace('{^\s+}', "\n", $element->firstChild->data); | |||
| } | |||
| else { | |||
| $element->insertBefore(new DOMText("\n"), $element->firstChild); | |||
| } | |||
| } | |||
| if ($element->lastChild) { | |||
| if ($element->lastChild->nodeType == XML_TEXT_NODE) { | |||
| $element->lastChild->data = | |||
| preg_replace('{\s+$}', "\n", $element->lastChild->data); | |||
| } | |||
| else { | |||
| $element->insertBefore(new DOMText("\n"), null); | |||
| } | |||
| } | |||
| } | |||
| } | |||
| /** | |||
| * @param DOMElement $element Modifies this element by reference | |||
| */ | |||
| protected static function normalizeElementAttributes (DOMElement $element) | |||
| { | |||
| # | |||
| # Sort attributes by name. | |||
| # | |||
| // Gather the list of attributes as an array. | |||
| $attr_list = array(); | |||
| foreach ($element->attributes as $attr_node) { | |||
| $attr_list[$attr_node->name] = $attr_node; | |||
| } | |||
| // Sort attribute list by name. | |||
| ksort($attr_list); | |||
| // Remove then put back each attribute following sort order. | |||
| foreach ($attr_list as $attr_node) { | |||
| $element->removeAttributeNode($attr_node); | |||
| $element->setAttributeNode($attr_node); | |||
| } | |||
| } | |||
| } | |||
| @ -0,0 +1,173 @@ | |||
| <?php | |||
| use PHPUnit\Framework\TestCase; | |||
| use Michelf\Markdown; | |||
| use Michelf\MarkdownExtra; | |||
| class PhpMarkdownTest extends TestCase | |||
| { | |||
| /** | |||
| * Returns all php-markdown.mdtest tests | |||
| * @return array | |||
| */ | |||
| public function dataProviderForPhpMarkdown() { | |||
| $dir = TEST_RESOURCES_ROOT . '/php-markdown.mdtest'; | |||
| return MarkdownTestHelper::getInputOutputPaths($dir); | |||
| } | |||
| /** | |||
| * Runs php-markdown.mdtest against Markdown::defaultTransform | |||
| * | |||
| * @dataProvider dataProviderForPhpMarkdown | |||
| * | |||
| * @param string $inputPath Input markdown path | |||
| * @param string $htmlPath File path of expected transformed output (X)HTML | |||
| * | |||
| * @param bool $xhtml True if XHTML. Otherwise, HTML is assumed. | |||
| * | |||
| * @return void | |||
| */ | |||
| public function testTransformingOfPhpMarkdown($inputPath, $htmlPath, $xhtml = false) { | |||
| $inputMarkdown = file_get_contents($inputPath); | |||
| $expectedHtml = file_get_contents($htmlPath); | |||
| $result = Markdown::defaultTransform($inputMarkdown); | |||
| MarkdownTestHelper::assertSameNormalized( | |||
| $expectedHtml, | |||
| $result, | |||
| "Markdown in $inputPath converts exactly to expected $htmlPath", | |||
| $xhtml | |||
| ); | |||
| } | |||
| /** | |||
| * Returns all php-markdown.mdtest tests EXCEPT Emphasis test. | |||
| * @return array | |||
| */ | |||
| public function dataProviderForPhpMarkdownExceptEmphasis() | |||
| { | |||
| $dir = TEST_RESOURCES_ROOT . '/php-markdown.mdtest'; | |||
| $allTests = MarkdownTestHelper::getInputOutputPaths($dir); | |||
| foreach ($allTests as $index => $test) { | |||
| // Because MarkdownExtra treats underscore emphasis differently, this one test has to be excluded | |||
| if (preg_match('~/Emphasis\.text$~', $test[0])) { | |||
| unset($allTests[$index]); | |||
| } | |||
| } | |||
| return array_values($allTests); | |||
| } | |||
| /** | |||
| * Runs php-markdown.mdtest against MarkdownExtra::defaultTransform | |||
| * | |||
| * @dataProvider dataProviderForPhpMarkdownExceptEmphasis | |||
| * | |||
| * @param $inputPath | |||
| * @param $htmlPath | |||
| * @param bool $xhtml | |||
| */ | |||
| public function testPhpMarkdownMdTestWithMarkdownExtra($inputPath, $htmlPath, $xhtml = false) | |||
| { | |||
| $inputMarkdown = file_get_contents($inputPath); | |||
| $expectedHtml = file_get_contents($htmlPath); | |||
| $result = MarkdownExtra::defaultTransform($inputMarkdown); | |||
| MarkdownTestHelper::assertSameNormalized( | |||
| $expectedHtml, | |||
| $result, | |||
| "Markdown in $inputPath converts exactly to expected $htmlPath", | |||
| $xhtml | |||
| ); | |||
| } | |||
| /** | |||
| * @return array | |||
| */ | |||
| public function dataProviderForMarkdownExtra() { | |||
| $dir = TEST_RESOURCES_ROOT . '/php-markdown-extra.mdtest'; | |||
| return MarkdownTestHelper::getInputOutputPaths($dir); | |||
| } | |||
| /** | |||
| * @dataProvider dataProviderForMarkdownExtra | |||
| * | |||
| * @param string $inputPath Input markdown path | |||
| * @param string $htmlPath File path of expected transformed output (X)HTML | |||
| * | |||
| * @param bool $xhtml True if XHTML. Otherwise, HTML is assumed. | |||
| * | |||
| * @return void | |||
| */ | |||
| public function testTransformingOfMarkdownExtra($inputPath, $htmlPath, $xhtml = false) { | |||
| $inputMarkdown = file_get_contents($inputPath); | |||
| $expectedHtml = file_get_contents($htmlPath); | |||
| $result = MarkdownExtra::defaultTransform($inputMarkdown); | |||
| MarkdownTestHelper::assertSameNormalized( | |||
| $expectedHtml, | |||
| $result, | |||
| "Markdown in $inputPath converts exactly to expected $htmlPath", | |||
| $xhtml | |||
| ); | |||
| } | |||
| /** | |||
| * @return array | |||
| */ | |||
| public function dataProviderForRegularMarkdown() | |||
| { | |||
| $dir = TEST_RESOURCES_ROOT . '/markdown.mdtest'; | |||
| return MarkdownTestHelper::getInputOutputPaths($dir); | |||
| } | |||
| /** | |||
| * @dataProvider dataProviderForRegularMarkdown | |||
| * | |||
| * @param string $inputPath Input markdown path | |||
| * @param string $htmlPath File path of expected transformed output (X)HTML | |||
| * | |||
| * @param bool $xhtml True if XHTML. Otherwise, HTML is assumed. | |||
| * | |||
| * @return void | |||
| */ | |||
| public function testTransformingOfRegularMarkdown($inputPath, $htmlPath, $xhtml = false) | |||
| { | |||
| $inputMarkdown = file_get_contents($inputPath); | |||
| $expectedHtml = file_get_contents($htmlPath); | |||
| $result = Markdown::defaultTransform($inputMarkdown); | |||
| MarkdownTestHelper::assertSameNormalized( | |||
| $expectedHtml, | |||
| $result, | |||
| "Markdown in $inputPath converts exactly to expected $htmlPath", | |||
| $xhtml | |||
| ); | |||
| } | |||
| /** | |||
| * Runs markdown.mdtest against MarkdownExtra::defaultTransform | |||
| * | |||
| * @dataProvider dataProviderForRegularMarkdown | |||
| * | |||
| * @param $inputPath | |||
| * @param $htmlPath | |||
| * @param bool $xhtml | |||
| */ | |||
| public function testMarkdownMdTestWithMarkdownExtra($inputPath, $htmlPath, $xhtml = false) | |||
| { | |||
| $inputMarkdown = file_get_contents($inputPath); | |||
| $expectedHtml = file_get_contents($htmlPath); | |||
| $result = MarkdownExtra::defaultTransform($inputMarkdown); | |||
| MarkdownTestHelper::assertSameNormalized( | |||
| $expectedHtml, | |||
| $result, | |||
| "Markdown in $inputPath converts exactly to expected $htmlPath", | |||
| $xhtml | |||
| ); | |||
| } | |||
| } | |||
| @ -0,0 +1,21 @@ | |||
| AT&T has an ampersand in their name. | |||
| AT&T is another way to write it. | |||
| This & that. | |||
| 4 < 5. | |||
| 6 > 5. | |||
| Here's a [link] [1] with an ampersand in the URL. | |||
| Here's a link with an amersand in the link text: [AT&T] [2]. | |||
| Here's an inline [link](/script?foo=1&bar=2). | |||
| Here's an inline [link](</script?foo=1&bar=2>). | |||
| [1]: http://example.com/?foo=1&bar=2 | |||
| [2]: http://att.com/ "AT&T" | |||
| @ -0,0 +1,17 @@ | |||
| <p>AT&T has an ampersand in their name.</p> | |||
| <p>AT&T is another way to write it.</p> | |||
| <p>This & that.</p> | |||
| <p>4 < 5.</p> | |||
| <p>6 > 5.</p> | |||
| <p>Here's a <a href="http://example.com/?foo=1&bar=2">link</a> with an ampersand in the URL.</p> | |||
| <p>Here's a link with an amersand in the link text: <a href="http://att.com/" title="AT&T">AT&T</a>.</p> | |||
| <p>Here's an inline <a href="/script?foo=1&bar=2">link</a>.</p> | |||
| <p>Here's an inline <a href="/script?foo=1&bar=2">link</a>.</p> | |||
| @ -0,0 +1,13 @@ | |||
| Link: <http://example.com/>. | |||
| With an ampersand: <http://example.com/?foo=1&bar=2> | |||
| * In a list? | |||
| * <http://example.com/> | |||
| * It should. | |||
| > Blockquoted: <http://example.com/> | |||
| Auto-links should not occur here: `<http://example.com/>` | |||
| or here: <http://example.com/> | |||
| @ -0,0 +1,18 @@ | |||
| <p>Link: <a href="http://example.com/">http://example.com/</a>.</p> | |||
| <p>With an ampersand: <a href="http://example.com/?foo=1&bar=2">http://example.com/?foo=1&bar=2</a></p> | |||
| <ul> | |||
| <li>In a list?</li> | |||
| <li><a href="http://example.com/">http://example.com/</a></li> | |||
| <li>It should.</li> | |||
| </ul> | |||
| <blockquote> | |||
| <p>Blockquoted: <a href="http://example.com/">http://example.com/</a></p> | |||
| </blockquote> | |||
| <p>Auto-links should not occur here: <code><http://example.com/></code></p> | |||
| <pre><code>or here: <http://example.com/> | |||
| </code></pre> | |||
| @ -0,0 +1,120 @@ | |||
| These should all get escaped: | |||
| Backslash: \\ | |||
| Backtick: \` | |||
| Asterisk: \* | |||
| Underscore: \_ | |||
| Left brace: \{ | |||
| Right brace: \} | |||
| Left bracket: \[ | |||
| Right bracket: \] | |||
| Left paren: \( | |||
| Right paren: \) | |||
| Greater-than: \> | |||
| Hash: \# | |||
| Period: \. | |||
| Bang: \! | |||
| Plus: \+ | |||
| Minus: \- | |||
| These should not, because they occur within a code block: | |||
| Backslash: \\ | |||
| Backtick: \` | |||
| Asterisk: \* | |||
| Underscore: \_ | |||
| Left brace: \{ | |||
| Right brace: \} | |||
| Left bracket: \[ | |||
| Right bracket: \] | |||
| Left paren: \( | |||
| Right paren: \) | |||
| Greater-than: \> | |||
| Hash: \# | |||
| Period: \. | |||
| Bang: \! | |||
| Plus: \+ | |||
| Minus: \- | |||
| Nor should these, which occur in code spans: | |||
| Backslash: `\\` | |||
| Backtick: `` \` `` | |||
| Asterisk: `\*` | |||
| Underscore: `\_` | |||
| Left brace: `\{` | |||
| Right brace: `\}` | |||
| Left bracket: `\[` | |||
| Right bracket: `\]` | |||
| Left paren: `\(` | |||
| Right paren: `\)` | |||
| Greater-than: `\>` | |||
| Hash: `\#` | |||
| Period: `\.` | |||
| Bang: `\!` | |||
| Plus: `\+` | |||
| Minus: `\-` | |||
| These should get escaped, even though they're matching pairs for | |||
| other Markdown constructs: | |||
| \*asterisks\* | |||
| \_underscores\_ | |||
| \`backticks\` | |||
| This is a code span with a literal backslash-backtick sequence: `` \` `` | |||
| This is a tag with unescaped backticks <span attr='`ticks`'>bar</span>. | |||
| This is a tag with backslashes <span attr='\\backslashes\\'>bar</span>. | |||
| @ -0,0 +1,118 @@ | |||
| <p>These should all get escaped:</p> | |||
| <p>Backslash: \</p> | |||
| <p>Backtick: `</p> | |||
| <p>Asterisk: *</p> | |||
| <p>Underscore: _</p> | |||
| <p>Left brace: {</p> | |||
| <p>Right brace: }</p> | |||
| <p>Left bracket: [</p> | |||
| <p>Right bracket: ]</p> | |||
| <p>Left paren: (</p> | |||
| <p>Right paren: )</p> | |||
| <p>Greater-than: ></p> | |||
| <p>Hash: #</p> | |||
| <p>Period: .</p> | |||
| <p>Bang: !</p> | |||
| <p>Plus: +</p> | |||
| <p>Minus: -</p> | |||
| <p>These should not, because they occur within a code block:</p> | |||
| <pre><code>Backslash: \\ | |||
| Backtick: \` | |||
| Asterisk: \* | |||
| Underscore: \_ | |||
| Left brace: \{ | |||
| Right brace: \} | |||
| Left bracket: \[ | |||
| Right bracket: \] | |||
| Left paren: \( | |||
| Right paren: \) | |||
| Greater-than: \> | |||
| Hash: \# | |||
| Period: \. | |||
| Bang: \! | |||
| Plus: \+ | |||
| Minus: \- | |||
| </code></pre> | |||
| <p>Nor should these, which occur in code spans:</p> | |||
| <p>Backslash: <code>\\</code></p> | |||
| <p>Backtick: <code>\`</code></p> | |||
| <p>Asterisk: <code>\*</code></p> | |||
| <p>Underscore: <code>\_</code></p> | |||
| <p>Left brace: <code>\{</code></p> | |||
| <p>Right brace: <code>\}</code></p> | |||
| <p>Left bracket: <code>\[</code></p> | |||
| <p>Right bracket: <code>\]</code></p> | |||
| <p>Left paren: <code>\(</code></p> | |||
| <p>Right paren: <code>\)</code></p> | |||
| <p>Greater-than: <code>\></code></p> | |||
| <p>Hash: <code>\#</code></p> | |||
| <p>Period: <code>\.</code></p> | |||
| <p>Bang: <code>\!</code></p> | |||
| <p>Plus: <code>\+</code></p> | |||
| <p>Minus: <code>\-</code></p> | |||
| <p>These should get escaped, even though they're matching pairs for | |||
| other Markdown constructs:</p> | |||
| <p>*asterisks*</p> | |||
| <p>_underscores_</p> | |||
| <p>`backticks`</p> | |||
| <p>This is a code span with a literal backslash-backtick sequence: <code>\`</code></p> | |||
| <p>This is a tag with unescaped backticks <span attr='`ticks`'>bar</span>.</p> | |||
| <p>This is a tag with backslashes <span attr='\\backslashes\\'>bar</span>.</p> | |||
| @ -0,0 +1,11 @@ | |||
| > Example: | |||
| > | |||
| > sub status { | |||
| > print "working"; | |||
| > } | |||
| > | |||
| > Or: | |||
| > | |||
| > sub status { | |||
| > return "working"; | |||
| > } | |||
| @ -0,0 +1,15 @@ | |||
| <blockquote> | |||
| <p>Example:</p> | |||
| <pre><code>sub status { | |||
| print "working"; | |||
| } | |||
| </code></pre> | |||
| <p>Or:</p> | |||
| <pre><code>sub status { | |||
| return "working"; | |||
| } | |||
| </code></pre> | |||
| </blockquote> | |||
| @ -0,0 +1,14 @@ | |||
| code block on the first line | |||
| Regular text. | |||
| code block indented by spaces | |||
| Regular text. | |||
| the lines in this block | |||
| all contain trailing spaces | |||
| Regular Text. | |||
| code block on the last line | |||
| @ -0,0 +1,18 @@ | |||
| <pre><code>code block on the first line | |||
| </code></pre> | |||
| <p>Regular text.</p> | |||
| <pre><code>code block indented by spaces | |||
| </code></pre> | |||
| <p>Regular text.</p> | |||
| <pre><code>the lines in this block | |||
| all contain trailing spaces | |||
| </code></pre> | |||
| <p>Regular Text.</p> | |||
| <pre><code>code block on the last line | |||
| </code></pre> | |||
| @ -0,0 +1,5 @@ | |||
| `<test a="` content of attribute `">` | |||
| Fix for backticks within HTML tag: <span attr='`ticks`'>like this</span> | |||
| Here's how you put `` `backticks` `` in a code span. | |||
| @ -0,0 +1,5 @@ | |||
| <p><code><test a="</code> content of attribute <code>"></code></p> | |||
| <p>Fix for backticks within HTML tag: <span attr='`ticks`'>like this</span></p> | |||
| <p>Here's how you put <code>`backticks`</code> in a code span.</p> | |||
| @ -0,0 +1,8 @@ | |||
| In Markdown 1.0.0 and earlier. Version | |||
| 8. This line turns into a list item. | |||
| Because a hard-wrapped line in the | |||
| middle of a paragraph looked like a | |||
| list item. | |||
| Here's one with a bullet. | |||
| * criminey. | |||
| @ -0,0 +1,8 @@ | |||
| <p>In Markdown 1.0.0 and earlier. Version | |||
| 8. This line turns into a list item. | |||
| Because a hard-wrapped line in the | |||
| middle of a paragraph looked like a | |||
| list item.</p> | |||
| <p>Here's one with a bullet. | |||
| * criminey.</p> | |||
| @ -0,0 +1,67 @@ | |||
| Dashes: | |||
| --- | |||
| --- | |||
| --- | |||
| --- | |||
| --- | |||
| - - - | |||
| - - - | |||
| - - - | |||
| - - - | |||
| - - - | |||
| Asterisks: | |||
| *** | |||
| *** | |||
| *** | |||
| *** | |||
| *** | |||
| * * * | |||
| * * * | |||
| * * * | |||
| * * * | |||
| * * * | |||
| Underscores: | |||
| ___ | |||
| ___ | |||
| ___ | |||
| ___ | |||
| ___ | |||
| _ _ _ | |||
| _ _ _ | |||
| _ _ _ | |||
| _ _ _ | |||
| _ _ _ | |||
| @ -0,0 +1,71 @@ | |||
| <p>Dashes:</p> | |||
| <hr /> | |||
| <hr /> | |||
| <hr /> | |||
| <hr /> | |||
| <pre><code>--- | |||
| </code></pre> | |||
| <hr /> | |||
| <hr /> | |||
| <hr /> | |||
| <hr /> | |||
| <pre><code>- - - | |||
| </code></pre> | |||
| <p>Asterisks:</p> | |||
| <hr /> | |||
| <hr /> | |||
| <hr /> | |||
| <hr /> | |||
| <pre><code>*** | |||
| </code></pre> | |||
| <hr /> | |||
| <hr /> | |||
| <hr /> | |||
| <hr /> | |||
| <pre><code>* * * | |||
| </code></pre> | |||
| <p>Underscores:</p> | |||
| <hr /> | |||
| <hr /> | |||
| <hr /> | |||
| <hr /> | |||
| <pre><code>___ | |||
| </code></pre> | |||
| <hr /> | |||
| <hr /> | |||
| <hr /> | |||
| <hr /> | |||
| <pre><code>_ _ _ | |||
| </code></pre> | |||
| @ -0,0 +1,26 @@ | |||
|  | |||
|  | |||
| Inline within a paragraph: [alt text](/url/). | |||
|  | |||
|  | |||
|  | |||
| . | |||
| ![Empty]() | |||
| .jpg) | |||
| ![alt text][foo] | |||
| [foo]: /url/ | |||
| ![alt text][bar] | |||
| [bar]: /url/ "Title here" | |||
| @ -0,0 +1,21 @@ | |||
| <p><img src="/path/to/img.jpg" alt="Alt text" /></p> | |||
| <p><img src="/path/to/img.jpg" alt="Alt text" title="Optional title" /></p> | |||
| <p>Inline within a paragraph: <a href="/url/">alt text</a>.</p> | |||
| <p><img src="/url/" alt="alt text" title="title preceded by two spaces" /></p> | |||
| <p><img src="/url/" alt="alt text" title="title has spaces afterward" /></p> | |||
| <p><img src="/url/" alt="alt text" /></p> | |||
| <p><img src="/url/" alt="alt text" title="with a title" />.</p> | |||
| <p><img src="" alt="Empty" /></p> | |||
| <p><img src="http://example.com/(parens).jpg" alt="this is a stupid URL" /></p> | |||
| <p><img src="/url/" alt="alt text" /></p> | |||
| <p><img src="/url/" alt="alt text" title="Title here" /></p> | |||
| @ -0,0 +1,30 @@ | |||
| Simple block on one line: | |||
| <div>foo</div> | |||
| And nested without indentation: | |||
| <div> | |||
| <div> | |||
| <div> | |||
| foo | |||
| </div> | |||
| <div style=">"/> | |||
| </div> | |||
| <div>bar</div> | |||
| </div> | |||
| And with attributes: | |||
| <div> | |||
| <div id="foo"> | |||
| </div> | |||
| </div> | |||
| This was broken in 1.0.2b7: | |||
| <div class="inlinepage"> | |||
| <div class="toggleableend"> | |||
| foo | |||
| </div> | |||
| </div> | |||
| @ -0,0 +1,30 @@ | |||
| <p>Simple block on one line:</p> | |||
| <div>foo</div> | |||
| <p>And nested without indentation:</p> | |||
| <div> | |||
| <div> | |||
| <div> | |||
| foo | |||
| </div> | |||
| <div style=">"/> | |||
| </div> | |||
| <div>bar</div> | |||
| </div> | |||
| <p>And with attributes:</p> | |||
| <div> | |||
| <div id="foo"> | |||
| </div> | |||
| </div> | |||
| <p>This was broken in 1.0.2b7:</p> | |||
| <div class="inlinepage"> | |||
| <div class="toggleableend"> | |||
| foo | |||
| </div> | |||
| </div> | |||
| @ -0,0 +1,72 @@ | |||
| <p>Here's a simple block:</p> | |||
| <div> | |||
| foo | |||
| </div> | |||
| <p>This should be a code block, though:</p> | |||
| <pre><code><div> | |||
| foo | |||
| </div> | |||
| </code></pre> | |||
| <p>As should this:</p> | |||
| <pre><code><div>foo</div> | |||
| </code></pre> | |||
| <p>Now, nested:</p> | |||
| <div> | |||
| <div> | |||
| <div> | |||
| foo | |||
| </div> | |||
| </div> | |||
| </div> | |||
| <p>This should just be an HTML comment:</p> | |||
| <!-- Comment --> | |||
| <p>Multiline:</p> | |||
| <!-- | |||
| Blah | |||
| Blah | |||
| --> | |||
| <p>Code block:</p> | |||
| <pre><code><!-- Comment --> | |||
| </code></pre> | |||
| <p>Just plain comment, with trailing spaces on the line:</p> | |||
| <!-- foo --> | |||
| <p>Code:</p> | |||
| <pre><code><hr /> | |||
| </code></pre> | |||
| <p>Hr's:</p> | |||
| <hr> | |||
| <hr/> | |||
| <hr /> | |||
| <hr> | |||
| <hr/> | |||
| <hr /> | |||
| <hr class="foo" id="bar" /> | |||
| <hr class="foo" id="bar"/> | |||
| <hr class="foo" id="bar" > | |||
| @ -0,0 +1,69 @@ | |||
| Here's a simple block: | |||
| <div> | |||
| foo | |||
| </div> | |||
| This should be a code block, though: | |||
| <div> | |||
| foo | |||
| </div> | |||
| As should this: | |||
| <div>foo</div> | |||
| Now, nested: | |||
| <div> | |||
| <div> | |||
| <div> | |||
| foo | |||
| </div> | |||
| </div> | |||
| </div> | |||
| This should just be an HTML comment: | |||
| <!-- Comment --> | |||
| Multiline: | |||
| <!-- | |||
| Blah | |||
| Blah | |||
| --> | |||
| Code block: | |||
| <!-- Comment --> | |||
| Just plain comment, with trailing spaces on the line: | |||
| <!-- foo --> | |||
| Code: | |||
| <hr /> | |||
| Hr's: | |||
| <hr> | |||
| <hr/> | |||
| <hr /> | |||
| <hr> | |||
| <hr/> | |||
| <hr /> | |||
| <hr class="foo" id="bar" /> | |||
| <hr class="foo" id="bar"/> | |||
| <hr class="foo" id="bar" > | |||
| @ -0,0 +1,13 @@ | |||
| <p>Paragraph one.</p> | |||
| <!-- This is a simple comment --> | |||
| <!-- | |||
| This is another comment. | |||
| --> | |||
| <p>Paragraph two.</p> | |||
| <!-- one comment block -- -- with two comments --> | |||
| <p>The end.</p> | |||
| @ -0,0 +1,13 @@ | |||
| Paragraph one. | |||
| <!-- This is a simple comment --> | |||
| <!-- | |||
| This is another comment. | |||
| --> | |||
| Paragraph two. | |||
| <!-- one comment block -- -- with two comments --> | |||
| The end. | |||
| @ -0,0 +1,24 @@ | |||
| Just a [URL](/url/). | |||
| [URL and title](/url/ "title"). | |||
| [URL and title](/url/ "title preceded by two spaces"). | |||
| [URL and title](/url/ "title preceded by a tab"). | |||
| [URL and title](/url/ "title has spaces afterward" ). | |||
| [URL wrapped in angle brackets](</url/>). | |||
| [URL w/ angle brackets + title](</url/> "Here's the title"). | |||
| [Empty](). | |||
| [With parens in the URL](http://en.wikipedia.org/wiki/WIMP_(computing)) | |||
| (With outer parens and [parens in url](/foo(bar))) | |||
| [With parens in the URL](/foo(bar) "and a title") | |||
| (With outer parens and [parens in url](/foo(bar) "and a title")) | |||
| @ -0,0 +1,23 @@ | |||
| <p>Just a <a href="/url/">URL</a>.</p> | |||
| <p><a href="/url/" title="title">URL and title</a>.</p> | |||
| <p><a href="/url/" title="title preceded by two spaces">URL and title</a>.</p> | |||
| <p><a href="/url/" title="title preceded by a tab">URL and title</a>.</p> | |||
| <p><a href="/url/" title="title has spaces afterward">URL and title</a>.</p> | |||
| <p><a href="/url/">URL wrapped in angle brackets</a>.</p> | |||
| <p><a href="/url/" title="Here's the title">URL w/ angle brackets + title</a>.</p> | |||
| <p><a href="">Empty</a>.</p> | |||
| <p><a href="http://en.wikipedia.org/wiki/WIMP_(computing)">With parens in the URL</a></p> | |||
| <p>(With outer parens and <a href="/foo(bar)">parens in url</a>)</p> | |||
| <p><a href="/foo(bar)" title="and a title">With parens in the URL</a></p> | |||
| <p>(With outer parens and <a href="/foo(bar)" title="and a title">parens in url</a>)</p> | |||
| @ -0,0 +1,71 @@ | |||
| Foo [bar] [1]. | |||
| Foo [bar][1]. | |||
| Foo [bar] | |||
| [1]. | |||
| [1]: /url/ "Title" | |||
| With [embedded [brackets]] [b]. | |||
| Indented [once][]. | |||
| Indented [twice][]. | |||
| Indented [thrice][]. | |||
| Indented [four][] times. | |||
| [once]: /url | |||
| [twice]: /url | |||
| [thrice]: /url | |||
| [four]: /url | |||
| [b]: /url/ | |||
| * * * | |||
| [this] [this] should work | |||
| So should [this][this]. | |||
| And [this] []. | |||
| And [this][]. | |||
| And [this]. | |||
| But not [that] []. | |||
| Nor [that][]. | |||
| Nor [that]. | |||
| [Something in brackets like [this][] should work] | |||
| [Same with [this].] | |||
| In this case, [this](/somethingelse/) points to something else. | |||
| Backslashing should suppress \[this] and [this\]. | |||
| [this]: foo | |||
| * * * | |||
| Here's one where the [link | |||
| breaks] across lines. | |||
| Here's another where the [link | |||
| breaks] across lines, but with a line-ending space. | |||
| [link breaks]: /url/ | |||
| @ -0,0 +1,52 @@ | |||
| <p>Foo <a href="/url/" title="Title">bar</a>.</p> | |||
| <p>Foo <a href="/url/" title="Title">bar</a>.</p> | |||
| <p>Foo <a href="/url/" title="Title">bar</a>.</p> | |||
| <p>With <a href="/url/">embedded [brackets]</a>.</p> | |||
| <p>Indented <a href="/url">once</a>.</p> | |||
| <p>Indented <a href="/url">twice</a>.</p> | |||
| <p>Indented <a href="/url">thrice</a>.</p> | |||
| <p>Indented [four][] times.</p> | |||
| <pre><code>[four]: /url | |||
| </code></pre> | |||
| <hr /> | |||
| <p><a href="foo">this</a> should work</p> | |||
| <p>So should <a href="foo">this</a>.</p> | |||
| <p>And <a href="foo">this</a>.</p> | |||
| <p>And <a href="foo">this</a>.</p> | |||
| <p>And <a href="foo">this</a>.</p> | |||
| <p>But not [that] [].</p> | |||
| <p>Nor [that][].</p> | |||
| <p>Nor [that].</p> | |||
| <p>[Something in brackets like <a href="foo">this</a> should work]</p> | |||
| <p>[Same with <a href="foo">this</a>.]</p> | |||
| <p>In this case, <a href="/somethingelse/">this</a> points to something else.</p> | |||
| <p>Backslashing should suppress [this] and [this].</p> | |||
| <hr /> | |||
| <p>Here's one where the <a href="/url/">link | |||
| breaks</a> across lines.</p> | |||
| <p>Here's another where the <a href="/url/">link | |||
| breaks</a> across lines, but with a line-ending space.</p> | |||
| @ -0,0 +1,20 @@ | |||
| This is the [simple case]. | |||
| [simple case]: /simple | |||
| This one has a [line | |||
| break]. | |||
| This one has a [line | |||
| break] with a line-ending space. | |||
| [line break]: /foo | |||
| [this] [that] and the [other] | |||
| [this]: /this | |||
| [that]: /that | |||
| [other]: /other | |||
| @ -0,0 +1,9 @@ | |||
| <p>This is the <a href="/simple">simple case</a>.</p> | |||
| <p>This one has a <a href="/foo">line | |||
| break</a>.</p> | |||
| <p>This one has a <a href="/foo">line | |||
| break</a> with a line-ending space.</p> | |||
| <p><a href="/that">this</a> and the <a href="/other">other</a></p> | |||
| @ -0,0 +1,7 @@ | |||
| Foo [bar][]. | |||
| Foo [bar](/url/ "Title with "quotes" inside"). | |||
| [bar]: /url/ "Title with "quotes" inside" | |||
| @ -0,0 +1,3 @@ | |||
| <p>Foo <a href="/url/" title="Title with "quotes" inside">bar</a>.</p> | |||
| <p>Foo <a href="/url/" title="Title with "quotes" inside">bar</a>.</p> | |||
| @ -0,0 +1,306 @@ | |||
| Markdown: Basics | |||
| ================ | |||
| <ul id="ProjectSubmenu"> | |||
| <li><a href="/projects/markdown/" title="Markdown Project Page">Main</a></li> | |||
| <li><a class="selected" title="Markdown Basics">Basics</a></li> | |||
| <li><a href="/projects/markdown/syntax" title="Markdown Syntax Documentation">Syntax</a></li> | |||
| <li><a href="/projects/markdown/license" title="Pricing and License Information">License</a></li> | |||
| <li><a href="/projects/markdown/dingus" title="Online Markdown Web Form">Dingus</a></li> | |||
| </ul> | |||
| Getting the Gist of Markdown's Formatting Syntax | |||
| ------------------------------------------------ | |||
| This page offers a brief overview of what it's like to use Markdown. | |||
| The [syntax page] [s] provides complete, detailed documentation for | |||
| every feature, but Markdown should be very easy to pick up simply by | |||
| looking at a few examples of it in action. The examples on this page | |||
| are written in a before/after style, showing example syntax and the | |||
| HTML output produced by Markdown. | |||
| It's also helpful to simply try Markdown out; the [Dingus] [d] is a | |||
| web application that allows you type your own Markdown-formatted text | |||
| and translate it to XHTML. | |||
| **Note:** This document is itself written using Markdown; you | |||
| can [see the source for it by adding '.text' to the URL] [src]. | |||
| [s]: /projects/markdown/syntax "Markdown Syntax" | |||
| [d]: /projects/markdown/dingus "Markdown Dingus" | |||
| [src]: /projects/markdown/basics.text | |||
| ## Paragraphs, Headers, Blockquotes ## | |||
| A paragraph is simply one or more consecutive lines of text, separated | |||
| by one or more blank lines. (A blank line is any line that looks like a | |||
| blank line -- a line containing nothing spaces or tabs is considered | |||
| blank.) Normal paragraphs should not be intended with spaces or tabs. | |||
| Markdown offers two styles of headers: *Setext* and *atx*. | |||
| Setext-style headers for `<h1>` and `<h2>` are created by | |||
| "underlining" with equal signs (`=`) and hyphens (`-`), respectively. | |||
| To create an atx-style header, you put 1-6 hash marks (`#`) at the | |||
| beginning of the line -- the number of hashes equals the resulting | |||
| HTML header level. | |||
| Blockquotes are indicated using email-style '`>`' angle brackets. | |||
| Markdown: | |||
| A First Level Header | |||
| ==================== | |||
| A Second Level Header | |||
| --------------------- | |||
| Now is the time for all good men to come to | |||
| the aid of their country. This is just a | |||
| regular paragraph. | |||
| The quick brown fox jumped over the lazy | |||
| dog's back. | |||
| ### Header 3 | |||
| > This is a blockquote. | |||
| > | |||
| > This is the second paragraph in the blockquote. | |||
| > | |||
| > ## This is an H2 in a blockquote | |||
| Output: | |||
| <h1>A First Level Header</h1> | |||
| <h2>A Second Level Header</h2> | |||
| <p>Now is the time for all good men to come to | |||
| the aid of their country. This is just a | |||
| regular paragraph.</p> | |||
| <p>The quick brown fox jumped over the lazy | |||
| dog's back.</p> | |||
| <h3>Header 3</h3> | |||
| <blockquote> | |||
| <p>This is a blockquote.</p> | |||
| <p>This is the second paragraph in the blockquote.</p> | |||
| <h2>This is an H2 in a blockquote</h2> | |||
| </blockquote> | |||
| ### Phrase Emphasis ### | |||
| Markdown uses asterisks and underscores to indicate spans of emphasis. | |||
| Markdown: | |||
| Some of these words *are emphasized*. | |||
| Some of these words _are emphasized also_. | |||
| Use two asterisks for **strong emphasis**. | |||
| Or, if you prefer, __use two underscores instead__. | |||
| Output: | |||
| <p>Some of these words <em>are emphasized</em>. | |||
| Some of these words <em>are emphasized also</em>.</p> | |||
| <p>Use two asterisks for <strong>strong emphasis</strong>. | |||
| Or, if you prefer, <strong>use two underscores instead</strong>.</p> | |||
| ## Lists ## | |||
| Unordered (bulleted) lists use asterisks, pluses, and hyphens (`*`, | |||
| `+`, and `-`) as list markers. These three markers are | |||
| interchangable; this: | |||
| * Candy. | |||
| * Gum. | |||
| * Booze. | |||
| this: | |||
| + Candy. | |||
| + Gum. | |||
| + Booze. | |||
| and this: | |||
| - Candy. | |||
| - Gum. | |||
| - Booze. | |||
| all produce the same output: | |||
| <ul> | |||
| <li>Candy.</li> | |||
| <li>Gum.</li> | |||
| <li>Booze.</li> | |||
| </ul> | |||
| Ordered (numbered) lists use regular numbers, followed by periods, as | |||
| list markers: | |||
| 1. Red | |||
| 2. Green | |||
| 3. Blue | |||
| Output: | |||
| <ol> | |||
| <li>Red</li> | |||
| <li>Green</li> | |||
| <li>Blue</li> | |||
| </ol> | |||
| If you put blank lines between items, you'll get `<p>` tags for the | |||
| list item text. You can create multi-paragraph list items by indenting | |||
| the paragraphs by 4 spaces or 1 tab: | |||
| * A list item. | |||
| With multiple paragraphs. | |||
| * Another item in the list. | |||
| Output: | |||
| <ul> | |||
| <li><p>A list item.</p> | |||
| <p>With multiple paragraphs.</p></li> | |||
| <li><p>Another item in the list.</p></li> | |||
| </ul> | |||
| ### Links ### | |||
| Markdown supports two styles for creating links: *inline* and | |||
| *reference*. With both styles, you use square brackets to delimit the | |||
| text you want to turn into a link. | |||
| Inline-style links use parentheses immediately after the link text. | |||
| For example: | |||
| This is an [example link](http://example.com/). | |||
| Output: | |||
| <p>This is an <a href="http://example.com/"> | |||
| example link</a>.</p> | |||
| Optionally, you may include a title attribute in the parentheses: | |||
| This is an [example link](http://example.com/ "With a Title"). | |||
| Output: | |||
| <p>This is an <a href="http://example.com/" title="With a Title"> | |||
| example link</a>.</p> | |||
| Reference-style links allow you to refer to your links by names, which | |||
| you define elsewhere in your document: | |||
| I get 10 times more traffic from [Google][1] than from | |||
| [Yahoo][2] or [MSN][3]. | |||
| [1]: http://google.com/ "Google" | |||
| [2]: http://search.yahoo.com/ "Yahoo Search" | |||
| [3]: http://search.msn.com/ "MSN Search" | |||
| Output: | |||
| <p>I get 10 times more traffic from <a href="http://google.com/" | |||
| title="Google">Google</a> than from <a href="http://search.yahoo.com/" | |||
| title="Yahoo Search">Yahoo</a> or <a href="http://search.msn.com/" | |||
| title="MSN Search">MSN</a>.</p> | |||
| The title attribute is optional. Link names may contain letters, | |||
| numbers and spaces, but are *not* case sensitive: | |||
| I start my morning with a cup of coffee and | |||
| [The New York Times][NY Times]. | |||
| [ny times]: http://www.nytimes.com/ | |||
| Output: | |||
| <p>I start my morning with a cup of coffee and | |||
| <a href="http://www.nytimes.com/">The New York Times</a>.</p> | |||
| ### Images ### | |||
| Image syntax is very much like link syntax. | |||
| Inline (titles are optional): | |||
|  | |||
| Reference-style: | |||
| ![alt text][id] | |||
| [id]: /path/to/img.jpg "Title" | |||
| Both of the above examples produce the same output: | |||
| <img src="/path/to/img.jpg" alt="alt text" title="Title" /> | |||
| ### Code ### | |||
| In a regular paragraph, you can create code span by wrapping text in | |||
| backtick quotes. Any ampersands (`&`) and angle brackets (`<` or | |||
| `>`) will automatically be translated into HTML entities. This makes | |||
| it easy to use Markdown to write about HTML example code: | |||
| I strongly recommend against using any `<blink>` tags. | |||
| I wish SmartyPants used named entities like `—` | |||
| instead of decimal-encoded entites like `—`. | |||
| Output: | |||
| <p>I strongly recommend against using any | |||
| <code><blink></code> tags.</p> | |||
| <p>I wish SmartyPants used named entities like | |||
| <code>&mdash;</code> instead of decimal-encoded | |||
| entites like <code>&#8212;</code>.</p> | |||
| To specify an entire block of pre-formatted code, indent every line of | |||
| the block by 4 spaces or 1 tab. Just like with code spans, `&`, `<`, | |||
| and `>` characters will be escaped automatically. | |||
| Markdown: | |||
| If you want your page to validate under XHTML 1.0 Strict, | |||
| you've got to put paragraph tags in your blockquotes: | |||
| <blockquote> | |||
| <p>For example.</p> | |||
| </blockquote> | |||
| Output: | |||
| <p>If you want your page to validate under XHTML 1.0 Strict, | |||
| you've got to put paragraph tags in your blockquotes:</p> | |||
| <pre><code><blockquote> | |||
| <p>For example.</p> | |||
| </blockquote> | |||
| </code></pre> | |||
| @ -0,0 +1,314 @@ | |||
| <h1>Markdown: Basics</h1> | |||
| <ul id="ProjectSubmenu"> | |||
| <li><a href="/projects/markdown/" title="Markdown Project Page">Main</a></li> | |||
| <li><a class="selected" title="Markdown Basics">Basics</a></li> | |||
| <li><a href="/projects/markdown/syntax" title="Markdown Syntax Documentation">Syntax</a></li> | |||
| <li><a href="/projects/markdown/license" title="Pricing and License Information">License</a></li> | |||
| <li><a href="/projects/markdown/dingus" title="Online Markdown Web Form">Dingus</a></li> | |||
| </ul> | |||
| <h2>Getting the Gist of Markdown's Formatting Syntax</h2> | |||
| <p>This page offers a brief overview of what it's like to use Markdown. | |||
| The <a href="/projects/markdown/syntax" title="Markdown Syntax">syntax page</a> provides complete, detailed documentation for | |||
| every feature, but Markdown should be very easy to pick up simply by | |||
| looking at a few examples of it in action. The examples on this page | |||
| are written in a before/after style, showing example syntax and the | |||
| HTML output produced by Markdown.</p> | |||
| <p>It's also helpful to simply try Markdown out; the <a href="/projects/markdown/dingus" title="Markdown Dingus">Dingus</a> is a | |||
| web application that allows you type your own Markdown-formatted text | |||
| and translate it to XHTML.</p> | |||
| <p><strong>Note:</strong> This document is itself written using Markdown; you | |||
| can <a href="/projects/markdown/basics.text">see the source for it by adding '.text' to the URL</a>.</p> | |||
| <h2>Paragraphs, Headers, Blockquotes</h2> | |||
| <p>A paragraph is simply one or more consecutive lines of text, separated | |||
| by one or more blank lines. (A blank line is any line that looks like a | |||
| blank line -- a line containing nothing spaces or tabs is considered | |||
| blank.) Normal paragraphs should not be intended with spaces or tabs.</p> | |||
| <p>Markdown offers two styles of headers: <em>Setext</em> and <em>atx</em>. | |||
| Setext-style headers for <code><h1></code> and <code><h2></code> are created by | |||
| "underlining" with equal signs (<code>=</code>) and hyphens (<code>-</code>), respectively. | |||
| To create an atx-style header, you put 1-6 hash marks (<code>#</code>) at the | |||
| beginning of the line -- the number of hashes equals the resulting | |||
| HTML header level.</p> | |||
| <p>Blockquotes are indicated using email-style '<code>></code>' angle brackets.</p> | |||
| <p>Markdown:</p> | |||
| <pre><code>A First Level Header | |||
| ==================== | |||
| A Second Level Header | |||
| --------------------- | |||
| Now is the time for all good men to come to | |||
| the aid of their country. This is just a | |||
| regular paragraph. | |||
| The quick brown fox jumped over the lazy | |||
| dog's back. | |||
| ### Header 3 | |||
| > This is a blockquote. | |||
| > | |||
| > This is the second paragraph in the blockquote. | |||
| > | |||
| > ## This is an H2 in a blockquote | |||
| </code></pre> | |||
| <p>Output:</p> | |||
| <pre><code><h1>A First Level Header</h1> | |||
| <h2>A Second Level Header</h2> | |||
| <p>Now is the time for all good men to come to | |||
| the aid of their country. This is just a | |||
| regular paragraph.</p> | |||
| <p>The quick brown fox jumped over the lazy | |||
| dog's back.</p> | |||
| <h3>Header 3</h3> | |||
| <blockquote> | |||
| <p>This is a blockquote.</p> | |||
| <p>This is the second paragraph in the blockquote.</p> | |||
| <h2>This is an H2 in a blockquote</h2> | |||
| </blockquote> | |||
| </code></pre> | |||
| <h3>Phrase Emphasis</h3> | |||
| <p>Markdown uses asterisks and underscores to indicate spans of emphasis.</p> | |||
| <p>Markdown:</p> | |||
| <pre><code>Some of these words *are emphasized*. | |||
| Some of these words _are emphasized also_. | |||
| Use two asterisks for **strong emphasis**. | |||
| Or, if you prefer, __use two underscores instead__. | |||
| </code></pre> | |||
| <p>Output:</p> | |||
| <pre><code><p>Some of these words <em>are emphasized</em>. | |||
| Some of these words <em>are emphasized also</em>.</p> | |||
| <p>Use two asterisks for <strong>strong emphasis</strong>. | |||
| Or, if you prefer, <strong>use two underscores instead</strong>.</p> | |||
| </code></pre> | |||
| <h2>Lists</h2> | |||
| <p>Unordered (bulleted) lists use asterisks, pluses, and hyphens (<code>*</code>, | |||
| <code>+</code>, and <code>-</code>) as list markers. These three markers are | |||
| interchangable; this:</p> | |||
| <pre><code>* Candy. | |||
| * Gum. | |||
| * Booze. | |||
| </code></pre> | |||
| <p>this:</p> | |||
| <pre><code>+ Candy. | |||
| + Gum. | |||
| + Booze. | |||
| </code></pre> | |||
| <p>and this:</p> | |||
| <pre><code>- Candy. | |||
| - Gum. | |||
| - Booze. | |||
| </code></pre> | |||
| <p>all produce the same output:</p> | |||
| <pre><code><ul> | |||
| <li>Candy.</li> | |||
| <li>Gum.</li> | |||
| <li>Booze.</li> | |||
| </ul> | |||
| </code></pre> | |||
| <p>Ordered (numbered) lists use regular numbers, followed by periods, as | |||
| list markers:</p> | |||
| <pre><code>1. Red | |||
| 2. Green | |||
| 3. Blue | |||
| </code></pre> | |||
| <p>Output:</p> | |||
| <pre><code><ol> | |||
| <li>Red</li> | |||
| <li>Green</li> | |||
| <li>Blue</li> | |||
| </ol> | |||
| </code></pre> | |||
| <p>If you put blank lines between items, you'll get <code><p></code> tags for the | |||
| list item text. You can create multi-paragraph list items by indenting | |||
| the paragraphs by 4 spaces or 1 tab:</p> | |||
| <pre><code>* A list item. | |||
| With multiple paragraphs. | |||
| * Another item in the list. | |||
| </code></pre> | |||
| <p>Output:</p> | |||
| <pre><code><ul> | |||
| <li><p>A list item.</p> | |||
| <p>With multiple paragraphs.</p></li> | |||
| <li><p>Another item in the list.</p></li> | |||
| </ul> | |||
| </code></pre> | |||
| <h3>Links</h3> | |||
| <p>Markdown supports two styles for creating links: <em>inline</em> and | |||
| <em>reference</em>. With both styles, you use square brackets to delimit the | |||
| text you want to turn into a link.</p> | |||
| <p>Inline-style links use parentheses immediately after the link text. | |||
| For example:</p> | |||
| <pre><code>This is an [example link](http://example.com/). | |||
| </code></pre> | |||
| <p>Output:</p> | |||
| <pre><code><p>This is an <a href="http://example.com/"> | |||
| example link</a>.</p> | |||
| </code></pre> | |||
| <p>Optionally, you may include a title attribute in the parentheses:</p> | |||
| <pre><code>This is an [example link](http://example.com/ "With a Title"). | |||
| </code></pre> | |||
| <p>Output:</p> | |||
| <pre><code><p>This is an <a href="http://example.com/" title="With a Title"> | |||
| example link</a>.</p> | |||
| </code></pre> | |||
| <p>Reference-style links allow you to refer to your links by names, which | |||
| you define elsewhere in your document:</p> | |||
| <pre><code>I get 10 times more traffic from [Google][1] than from | |||
| [Yahoo][2] or [MSN][3]. | |||
| [1]: http://google.com/ "Google" | |||
| [2]: http://search.yahoo.com/ "Yahoo Search" | |||
| [3]: http://search.msn.com/ "MSN Search" | |||
| </code></pre> | |||
| <p>Output:</p> | |||
| <pre><code><p>I get 10 times more traffic from <a href="http://google.com/" | |||
| title="Google">Google</a> than from <a href="http://search.yahoo.com/" | |||
| title="Yahoo Search">Yahoo</a> or <a href="http://search.msn.com/" | |||
| title="MSN Search">MSN</a>.</p> | |||
| </code></pre> | |||
| <p>The title attribute is optional. Link names may contain letters, | |||
| numbers and spaces, but are <em>not</em> case sensitive:</p> | |||
| <pre><code>I start my morning with a cup of coffee and | |||
| [The New York Times][NY Times]. | |||
| [ny times]: http://www.nytimes.com/ | |||
| </code></pre> | |||
| <p>Output:</p> | |||
| <pre><code><p>I start my morning with a cup of coffee and | |||
| <a href="http://www.nytimes.com/">The New York Times</a>.</p> | |||
| </code></pre> | |||
| <h3>Images</h3> | |||
| <p>Image syntax is very much like link syntax.</p> | |||
| <p>Inline (titles are optional):</p> | |||
| <pre><code> | |||
| </code></pre> | |||
| <p>Reference-style:</p> | |||
| <pre><code>![alt text][id] | |||
| [id]: /path/to/img.jpg "Title" | |||
| </code></pre> | |||
| <p>Both of the above examples produce the same output:</p> | |||
| <pre><code><img src="/path/to/img.jpg" alt="alt text" title="Title" /> | |||
| </code></pre> | |||
| <h3>Code</h3> | |||
| <p>In a regular paragraph, you can create code span by wrapping text in | |||
| backtick quotes. Any ampersands (<code>&</code>) and angle brackets (<code><</code> or | |||
| <code>></code>) will automatically be translated into HTML entities. This makes | |||
| it easy to use Markdown to write about HTML example code:</p> | |||
| <pre><code>I strongly recommend against using any `<blink>` tags. | |||
| I wish SmartyPants used named entities like `&mdash;` | |||
| instead of decimal-encoded entites like `&#8212;`. | |||
| </code></pre> | |||
| <p>Output:</p> | |||
| <pre><code><p>I strongly recommend against using any | |||
| <code>&lt;blink&gt;</code> tags.</p> | |||
| <p>I wish SmartyPants used named entities like | |||
| <code>&amp;mdash;</code> instead of decimal-encoded | |||
| entites like <code>&amp;#8212;</code>.</p> | |||
| </code></pre> | |||
| <p>To specify an entire block of pre-formatted code, indent every line of | |||
| the block by 4 spaces or 1 tab. Just like with code spans, <code>&</code>, <code><</code>, | |||
| and <code>></code> characters will be escaped automatically.</p> | |||
| <p>Markdown:</p> | |||
| <pre><code>If you want your page to validate under XHTML 1.0 Strict, | |||
| you've got to put paragraph tags in your blockquotes: | |||
| <blockquote> | |||
| <p>For example.</p> | |||
| </blockquote> | |||
| </code></pre> | |||
| <p>Output:</p> | |||
| <pre><code><p>If you want your page to validate under XHTML 1.0 Strict, | |||
| you've got to put paragraph tags in your blockquotes:</p> | |||
| <pre><code>&lt;blockquote&gt; | |||
| &lt;p&gt;For example.&lt;/p&gt; | |||
| &lt;/blockquote&gt; | |||
| </code></pre> | |||
| </code></pre> | |||
| @ -0,0 +1,888 @@ | |||
| Markdown: Syntax | |||
| ================ | |||
| <ul id="ProjectSubmenu"> | |||
| <li><a href="/projects/markdown/" title="Markdown Project Page">Main</a></li> | |||
| <li><a href="/projects/markdown/basics" title="Markdown Basics">Basics</a></li> | |||
| <li><a class="selected" title="Markdown Syntax Documentation">Syntax</a></li> | |||
| <li><a href="/projects/markdown/license" title="Pricing and License Information">License</a></li> | |||
| <li><a href="/projects/markdown/dingus" title="Online Markdown Web Form">Dingus</a></li> | |||
| </ul> | |||
| * [Overview](#overview) | |||
| * [Philosophy](#philosophy) | |||
| * [Inline HTML](#html) | |||
| * [Automatic Escaping for Special Characters](#autoescape) | |||
| * [Block Elements](#block) | |||
| * [Paragraphs and Line Breaks](#p) | |||
| * [Headers](#header) | |||
| * [Blockquotes](#blockquote) | |||
| * [Lists](#list) | |||
| * [Code Blocks](#precode) | |||
| * [Horizontal Rules](#hr) | |||
| * [Span Elements](#span) | |||
| * [Links](#link) | |||
| * [Emphasis](#em) | |||
| * [Code](#code) | |||
| * [Images](#img) | |||
| * [Miscellaneous](#misc) | |||
| * [Backslash Escapes](#backslash) | |||
| * [Automatic Links](#autolink) | |||
| **Note:** This document is itself written using Markdown; you | |||
| can [see the source for it by adding '.text' to the URL][src]. | |||
| [src]: /projects/markdown/syntax.text | |||
| * * * | |||
| <h2 id="overview">Overview</h2> | |||
| <h3 id="philosophy">Philosophy</h3> | |||
| Markdown is intended to be as easy-to-read and easy-to-write as is feasible. | |||
| Readability, however, is emphasized above all else. A Markdown-formatted | |||
| document should be publishable as-is, as plain text, without looking | |||
| like it's been marked up with tags or formatting instructions. While | |||
| Markdown's syntax has been influenced by several existing text-to-HTML | |||
| filters -- including [Setext] [1], [atx] [2], [Textile] [3], [reStructuredText] [4], | |||
| [Grutatext] [5], and [EtText] [6] -- the single biggest source of | |||
| inspiration for Markdown's syntax is the format of plain text email. | |||
| [1]: http://docutils.sourceforge.net/mirror/setext.html | |||
| [2]: http://www.aaronsw.com/2002/atx/ | |||
| [3]: http://textism.com/tools/textile/ | |||
| [4]: http://docutils.sourceforge.net/rst.html | |||
| [5]: http://www.triptico.com/software/grutatxt.html | |||
| [6]: http://ettext.taint.org/doc/ | |||
| To this end, Markdown's syntax is comprised entirely of punctuation | |||
| characters, which punctuation characters have been carefully chosen so | |||
| as to look like what they mean. E.g., asterisks around a word actually | |||
| look like \*emphasis\*. Markdown lists look like, well, lists. Even | |||
| blockquotes look like quoted passages of text, assuming you've ever | |||
| used email. | |||
| <h3 id="html">Inline HTML</h3> | |||
| Markdown's syntax is intended for one purpose: to be used as a | |||
| format for *writing* for the web. | |||
| Markdown is not a replacement for HTML, or even close to it. Its | |||
| syntax is very small, corresponding only to a very small subset of | |||
| HTML tags. The idea is *not* to create a syntax that makes it easier | |||
| to insert HTML tags. In my opinion, HTML tags are already easy to | |||
| insert. The idea for Markdown is to make it easy to read, write, and | |||
| edit prose. HTML is a *publishing* format; Markdown is a *writing* | |||
| format. Thus, Markdown's formatting syntax only addresses issues that | |||
| can be conveyed in plain text. | |||
| For any markup that is not covered by Markdown's syntax, you simply | |||
| use HTML itself. There's no need to preface it or delimit it to | |||
| indicate that you're switching from Markdown to HTML; you just use | |||
| the tags. | |||
| The only restrictions are that block-level HTML elements -- e.g. `<div>`, | |||
| `<table>`, `<pre>`, `<p>`, etc. -- must be separated from surrounding | |||
| content by blank lines, and the start and end tags of the block should | |||
| not be indented with tabs or spaces. Markdown is smart enough not | |||
| to add extra (unwanted) `<p>` tags around HTML block-level tags. | |||
| For example, to add an HTML table to a Markdown article: | |||
| This is a regular paragraph. | |||
| <table> | |||
| <tr> | |||
| <td>Foo</td> | |||
| </tr> | |||
| </table> | |||
| This is another regular paragraph. | |||
| Note that Markdown formatting syntax is not processed within block-level | |||
| HTML tags. E.g., you can't use Markdown-style `*emphasis*` inside an | |||
| HTML block. | |||
| Span-level HTML tags -- e.g. `<span>`, `<cite>`, or `<del>` -- can be | |||
| used anywhere in a Markdown paragraph, list item, or header. If you | |||
| want, you can even use HTML tags instead of Markdown formatting; e.g. if | |||
| you'd prefer to use HTML `<a>` or `<img>` tags instead of Markdown's | |||
| link or image syntax, go right ahead. | |||
| Unlike block-level HTML tags, Markdown syntax *is* processed within | |||
| span-level tags. | |||
| <h3 id="autoescape">Automatic Escaping for Special Characters</h3> | |||
| In HTML, there are two characters that demand special treatment: `<` | |||
| and `&`. Left angle brackets are used to start tags; ampersands are | |||
| used to denote HTML entities. If you want to use them as literal | |||
| characters, you must escape them as entities, e.g. `<`, and | |||
| `&`. | |||
| Ampersands in particular are bedeviling for web writers. If you want to | |||
| write about 'AT&T', you need to write '`AT&T`'. You even need to | |||
| escape ampersands within URLs. Thus, if you want to link to: | |||
| http://images.google.com/images?num=30&q=larry+bird | |||
| you need to encode the URL as: | |||
| http://images.google.com/images?num=30&q=larry+bird | |||
| in your anchor tag `href` attribute. Needless to say, this is easy to | |||
| forget, and is probably the single most common source of HTML validation | |||
| errors in otherwise well-marked-up web sites. | |||
| Markdown allows you to use these characters naturally, taking care of | |||
| all the necessary escaping for you. If you use an ampersand as part of | |||
| an HTML entity, it remains unchanged; otherwise it will be translated | |||
| into `&`. | |||
| So, if you want to include a copyright symbol in your article, you can write: | |||
| © | |||
| and Markdown will leave it alone. But if you write: | |||
| AT&T | |||
| Markdown will translate it to: | |||
| AT&T | |||
| Similarly, because Markdown supports [inline HTML](#html), if you use | |||
| angle brackets as delimiters for HTML tags, Markdown will treat them as | |||
| such. But if you write: | |||
| 4 < 5 | |||
| Markdown will translate it to: | |||
| 4 < 5 | |||
| However, inside Markdown code spans and blocks, angle brackets and | |||
| ampersands are *always* encoded automatically. This makes it easy to use | |||
| Markdown to write about HTML code. (As opposed to raw HTML, which is a | |||
| terrible format for writing about HTML syntax, because every single `<` | |||
| and `&` in your example code needs to be escaped.) | |||
| * * * | |||
| <h2 id="block">Block Elements</h2> | |||
| <h3 id="p">Paragraphs and Line Breaks</h3> | |||
| A paragraph is simply one or more consecutive lines of text, separated | |||
| by one or more blank lines. (A blank line is any line that looks like a | |||
| blank line -- a line containing nothing but spaces or tabs is considered | |||
| blank.) Normal paragraphs should not be intended with spaces or tabs. | |||
| The implication of the "one or more consecutive lines of text" rule is | |||
| that Markdown supports "hard-wrapped" text paragraphs. This differs | |||
| significantly from most other text-to-HTML formatters (including Movable | |||
| Type's "Convert Line Breaks" option) which translate every line break | |||
| character in a paragraph into a `<br />` tag. | |||
| When you *do* want to insert a `<br />` break tag using Markdown, you | |||
| end a line with two or more spaces, then type return. | |||
| Yes, this takes a tad more effort to create a `<br />`, but a simplistic | |||
| "every line break is a `<br />`" rule wouldn't work for Markdown. | |||
| Markdown's email-style [blockquoting][bq] and multi-paragraph [list items][l] | |||
| work best -- and look better -- when you format them with hard breaks. | |||
| [bq]: #blockquote | |||
| [l]: #list | |||
| <h3 id="header">Headers</h3> | |||
| Markdown supports two styles of headers, [Setext] [1] and [atx] [2]. | |||
| Setext-style headers are "underlined" using equal signs (for first-level | |||
| headers) and dashes (for second-level headers). For example: | |||
| This is an H1 | |||
| ============= | |||
| This is an H2 | |||
| ------------- | |||
| Any number of underlining `=`'s or `-`'s will work. | |||
| Atx-style headers use 1-6 hash characters at the start of the line, | |||
| corresponding to header levels 1-6. For example: | |||
| # This is an H1 | |||
| ## This is an H2 | |||
| ###### This is an H6 | |||
| Optionally, you may "close" atx-style headers. This is purely | |||
| cosmetic -- you can use this if you think it looks better. The | |||
| closing hashes don't even need to match the number of hashes | |||
| used to open the header. (The number of opening hashes | |||
| determines the header level.) : | |||
| # This is an H1 # | |||
| ## This is an H2 ## | |||
| ### This is an H3 ###### | |||
| <h3 id="blockquote">Blockquotes</h3> | |||
| Markdown uses email-style `>` characters for blockquoting. If you're | |||
| familiar with quoting passages of text in an email message, then you | |||
| know how to create a blockquote in Markdown. It looks best if you hard | |||
| wrap the text and put a `>` before every line: | |||
| > This is a blockquote with two paragraphs. Lorem ipsum dolor sit amet, | |||
| > consectetuer adipiscing elit. Aliquam hendrerit mi posuere lectus. | |||
| > Vestibulum enim wisi, viverra nec, fringilla in, laoreet vitae, risus. | |||
| > | |||
| > Donec sit amet nisl. Aliquam semper ipsum sit amet velit. Suspendisse | |||
| > id sem consectetuer libero luctus adipiscing. | |||
| Markdown allows you to be lazy and only put the `>` before the first | |||
| line of a hard-wrapped paragraph: | |||
| > This is a blockquote with two paragraphs. Lorem ipsum dolor sit amet, | |||
| consectetuer adipiscing elit. Aliquam hendrerit mi posuere lectus. | |||
| Vestibulum enim wisi, viverra nec, fringilla in, laoreet vitae, risus. | |||
| > Donec sit amet nisl. Aliquam semper ipsum sit amet velit. Suspendisse | |||
| id sem consectetuer libero luctus adipiscing. | |||
| Blockquotes can be nested (i.e. a blockquote-in-a-blockquote) by | |||
| adding additional levels of `>`: | |||
| > This is the first level of quoting. | |||
| > | |||
| > > This is nested blockquote. | |||
| > | |||
| > Back to the first level. | |||
| Blockquotes can contain other Markdown elements, including headers, lists, | |||
| and code blocks: | |||
| > ## This is a header. | |||
| > | |||
| > 1. This is the first list item. | |||
| > 2. This is the second list item. | |||
| > | |||
| > Here's some example code: | |||
| > | |||
| > return shell_exec("echo $input | $markdown_script"); | |||
| Any decent text editor should make email-style quoting easy. For | |||
| example, with BBEdit, you can make a selection and choose Increase | |||
| Quote Level from the Text menu. | |||
| <h3 id="list">Lists</h3> | |||
| Markdown supports ordered (numbered) and unordered (bulleted) lists. | |||
| Unordered lists use asterisks, pluses, and hyphens -- interchangably | |||
| -- as list markers: | |||
| * Red | |||
| * Green | |||
| * Blue | |||
| is equivalent to: | |||
| + Red | |||
| + Green | |||
| + Blue | |||
| and: | |||
| - Red | |||
| - Green | |||
| - Blue | |||
| Ordered lists use numbers followed by periods: | |||
| 1. Bird | |||
| 2. McHale | |||
| 3. Parish | |||
| It's important to note that the actual numbers you use to mark the | |||
| list have no effect on the HTML output Markdown produces. The HTML | |||
| Markdown produces from the above list is: | |||
| <ol> | |||
| <li>Bird</li> | |||
| <li>McHale</li> | |||
| <li>Parish</li> | |||
| </ol> | |||
| If you instead wrote the list in Markdown like this: | |||
| 1. Bird | |||
| 1. McHale | |||
| 1. Parish | |||
| or even: | |||
| 3. Bird | |||
| 1. McHale | |||
| 8. Parish | |||
| you'd get the exact same HTML output. The point is, if you want to, | |||
| you can use ordinal numbers in your ordered Markdown lists, so that | |||
| the numbers in your source match the numbers in your published HTML. | |||
| But if you want to be lazy, you don't have to. | |||
| If you do use lazy list numbering, however, you should still start the | |||
| list with the number 1. At some point in the future, Markdown may support | |||
| starting ordered lists at an arbitrary number. | |||
| List markers typically start at the left margin, but may be indented by | |||
| up to three spaces. List markers must be followed by one or more spaces | |||
| or a tab. | |||
| To make lists look nice, you can wrap items with hanging indents: | |||
| * Lorem ipsum dolor sit amet, consectetuer adipiscing elit. | |||
| Aliquam hendrerit mi posuere lectus. Vestibulum enim wisi, | |||
| viverra nec, fringilla in, laoreet vitae, risus. | |||
| * Donec sit amet nisl. Aliquam semper ipsum sit amet velit. | |||
| Suspendisse id sem consectetuer libero luctus adipiscing. | |||
| But if you want to be lazy, you don't have to: | |||
| * Lorem ipsum dolor sit amet, consectetuer adipiscing elit. | |||
| Aliquam hendrerit mi posuere lectus. Vestibulum enim wisi, | |||
| viverra nec, fringilla in, laoreet vitae, risus. | |||
| * Donec sit amet nisl. Aliquam semper ipsum sit amet velit. | |||
| Suspendisse id sem consectetuer libero luctus adipiscing. | |||
| If list items are separated by blank lines, Markdown will wrap the | |||
| items in `<p>` tags in the HTML output. For example, this input: | |||
| * Bird | |||
| * Magic | |||
| will turn into: | |||
| <ul> | |||
| <li>Bird</li> | |||
| <li>Magic</li> | |||
| </ul> | |||
| But this: | |||
| * Bird | |||
| * Magic | |||
| will turn into: | |||
| <ul> | |||
| <li><p>Bird</p></li> | |||
| <li><p>Magic</p></li> | |||
| </ul> | |||
| List items may consist of multiple paragraphs. Each subsequent | |||
| paragraph in a list item must be intended by either 4 spaces | |||
| or one tab: | |||
| 1. This is a list item with two paragraphs. Lorem ipsum dolor | |||
| sit amet, consectetuer adipiscing elit. Aliquam hendrerit | |||
| mi posuere lectus. | |||
| Vestibulum enim wisi, viverra nec, fringilla in, laoreet | |||
| vitae, risus. Donec sit amet nisl. Aliquam semper ipsum | |||
| sit amet velit. | |||
| 2. Suspendisse id sem consectetuer libero luctus adipiscing. | |||
| It looks nice if you indent every line of the subsequent | |||
| paragraphs, but here again, Markdown will allow you to be | |||
| lazy: | |||
| * This is a list item with two paragraphs. | |||
| This is the second paragraph in the list item. You're | |||
| only required to indent the first line. Lorem ipsum dolor | |||
| sit amet, consectetuer adipiscing elit. | |||
| * Another item in the same list. | |||
| To put a blockquote within a list item, the blockquote's `>` | |||
| delimiters need to be indented: | |||
| * A list item with a blockquote: | |||
| > This is a blockquote | |||
| > inside a list item. | |||
| To put a code block within a list item, the code block needs | |||
| to be indented *twice* -- 8 spaces or two tabs: | |||
| * A list item with a code block: | |||
| <code goes here> | |||
| It's worth noting that it's possible to trigger an ordered list by | |||
| accident, by writing something like this: | |||
| 1986. What a great season. | |||
| In other words, a *number-period-space* sequence at the beginning of a | |||
| line. To avoid this, you can backslash-escape the period: | |||
| 1986\. What a great season. | |||
| <h3 id="precode">Code Blocks</h3> | |||
| Pre-formatted code blocks are used for writing about programming or | |||
| markup source code. Rather than forming normal paragraphs, the lines | |||
| of a code block are interpreted literally. Markdown wraps a code block | |||
| in both `<pre>` and `<code>` tags. | |||
| To produce a code block in Markdown, simply indent every line of the | |||
| block by at least 4 spaces or 1 tab. For example, given this input: | |||
| This is a normal paragraph: | |||
| This is a code block. | |||
| Markdown will generate: | |||
| <p>This is a normal paragraph:</p> | |||
| <pre><code>This is a code block. | |||
| </code></pre> | |||
| One level of indentation -- 4 spaces or 1 tab -- is removed from each | |||
| line of the code block. For example, this: | |||
| Here is an example of AppleScript: | |||
| tell application "Foo" | |||
| beep | |||
| end tell | |||
| will turn into: | |||
| <p>Here is an example of AppleScript:</p> | |||
| <pre><code>tell application "Foo" | |||
| beep | |||
| end tell | |||
| </code></pre> | |||
| A code block continues until it reaches a line that is not indented | |||
| (or the end of the article). | |||
| Within a code block, ampersands (`&`) and angle brackets (`<` and `>`) | |||
| are automatically converted into HTML entities. This makes it very | |||
| easy to include example HTML source code using Markdown -- just paste | |||
| it and indent it, and Markdown will handle the hassle of encoding the | |||
| ampersands and angle brackets. For example, this: | |||
| <div class="footer"> | |||
| © 2004 Foo Corporation | |||
| </div> | |||
| will turn into: | |||
| <pre><code><div class="footer"> | |||
| &copy; 2004 Foo Corporation | |||
| </div> | |||
| </code></pre> | |||
| Regular Markdown syntax is not processed within code blocks. E.g., | |||
| asterisks are just literal asterisks within a code block. This means | |||
| it's also easy to use Markdown to write about Markdown's own syntax. | |||
| <h3 id="hr">Horizontal Rules</h3> | |||
| You can produce a horizontal rule tag (`<hr />`) by placing three or | |||
| more hyphens, asterisks, or underscores on a line by themselves. If you | |||
| wish, you may use spaces between the hyphens or asterisks. Each of the | |||
| following lines will produce a horizontal rule: | |||
| * * * | |||
| *** | |||
| ***** | |||
| - - - | |||
| --------------------------------------- | |||
| _ _ _ | |||
| * * * | |||
| <h2 id="span">Span Elements</h2> | |||
| <h3 id="link">Links</h3> | |||
| Markdown supports two style of links: *inline* and *reference*. | |||
| In both styles, the link text is delimited by [square brackets]. | |||
| To create an inline link, use a set of regular parentheses immediately | |||
| after the link text's closing square bracket. Inside the parentheses, | |||
| put the URL where you want the link to point, along with an *optional* | |||
| title for the link, surrounded in quotes. For example: | |||
| This is [an example](http://example.com/ "Title") inline link. | |||
| [This link](http://example.net/) has no title attribute. | |||
| Will produce: | |||
| <p>This is <a href="http://example.com/" title="Title"> | |||
| an example</a> inline link.</p> | |||
| <p><a href="http://example.net/">This link</a> has no | |||
| title attribute.</p> | |||
| If you're referring to a local resource on the same server, you can | |||
| use relative paths: | |||
| See my [About](/about/) page for details. | |||
| Reference-style links use a second set of square brackets, inside | |||
| which you place a label of your choosing to identify the link: | |||
| This is [an example][id] reference-style link. | |||
| You can optionally use a space to separate the sets of brackets: | |||
| This is [an example] [id] reference-style link. | |||
| Then, anywhere in the document, you define your link label like this, | |||
| on a line by itself: | |||
| [id]: http://example.com/ "Optional Title Here" | |||
| That is: | |||
| * Square brackets containing the link identifier (optionally | |||
| indented from the left margin using up to three spaces); | |||
| * followed by a colon; | |||
| * followed by one or more spaces (or tabs); | |||
| * followed by the URL for the link; | |||
| * optionally followed by a title attribute for the link, enclosed | |||
| in double or single quotes. | |||
| The link URL may, optionally, be surrounded by angle brackets: | |||
| [id]: <http://example.com/> "Optional Title Here" | |||
| You can put the title attribute on the next line and use extra spaces | |||
| or tabs for padding, which tends to look better with longer URLs: | |||
| [id]: http://example.com/longish/path/to/resource/here | |||
| "Optional Title Here" | |||
| Link definitions are only used for creating links during Markdown | |||
| processing, and are stripped from your document in the HTML output. | |||
| Link definition names may constist of letters, numbers, spaces, and punctuation -- but they are *not* case sensitive. E.g. these two links: | |||
| [link text][a] | |||
| [link text][A] | |||
| are equivalent. | |||
| The *implicit link name* shortcut allows you to omit the name of the | |||
| link, in which case the link text itself is used as the name. | |||
| Just use an empty set of square brackets -- e.g., to link the word | |||
| "Google" to the google.com web site, you could simply write: | |||
| [Google][] | |||
| And then define the link: | |||
| [Google]: http://google.com/ | |||
| Because link names may contain spaces, this shortcut even works for | |||
| multiple words in the link text: | |||
| Visit [Daring Fireball][] for more information. | |||
| And then define the link: | |||
| [Daring Fireball]: http://daringfireball.net/ | |||
| Link definitions can be placed anywhere in your Markdown document. I | |||
| tend to put them immediately after each paragraph in which they're | |||
| used, but if you want, you can put them all at the end of your | |||
| document, sort of like footnotes. | |||
| Here's an example of reference links in action: | |||
| I get 10 times more traffic from [Google] [1] than from | |||
| [Yahoo] [2] or [MSN] [3]. | |||
| [1]: http://google.com/ "Google" | |||
| [2]: http://search.yahoo.com/ "Yahoo Search" | |||
| [3]: http://search.msn.com/ "MSN Search" | |||
| Using the implicit link name shortcut, you could instead write: | |||
| I get 10 times more traffic from [Google][] than from | |||
| [Yahoo][] or [MSN][]. | |||
| [google]: http://google.com/ "Google" | |||
| [yahoo]: http://search.yahoo.com/ "Yahoo Search" | |||
| [msn]: http://search.msn.com/ "MSN Search" | |||
| Both of the above examples will produce the following HTML output: | |||
| <p>I get 10 times more traffic from <a href="http://google.com/" | |||
| title="Google">Google</a> than from | |||
| <a href="http://search.yahoo.com/" title="Yahoo Search">Yahoo</a> | |||
| or <a href="http://search.msn.com/" title="MSN Search">MSN</a>.</p> | |||
| For comparison, here is the same paragraph written using | |||
| Markdown's inline link style: | |||
| I get 10 times more traffic from [Google](http://google.com/ "Google") | |||
| than from [Yahoo](http://search.yahoo.com/ "Yahoo Search") or | |||
| [MSN](http://search.msn.com/ "MSN Search"). | |||
| The point of reference-style links is not that they're easier to | |||
| write. The point is that with reference-style links, your document | |||
| source is vastly more readable. Compare the above examples: using | |||
| reference-style links, the paragraph itself is only 81 characters | |||
| long; with inline-style links, it's 176 characters; and as raw HTML, | |||
| it's 234 characters. In the raw HTML, there's more markup than there | |||
| is text. | |||
| With Markdown's reference-style links, a source document much more | |||
| closely resembles the final output, as rendered in a browser. By | |||
| allowing you to move the markup-related metadata out of the paragraph, | |||
| you can add links without interrupting the narrative flow of your | |||
| prose. | |||
| <h3 id="em">Emphasis</h3> | |||
| Markdown treats asterisks (`*`) and underscores (`_`) as indicators of | |||
| emphasis. Text wrapped with one `*` or `_` will be wrapped with an | |||
| HTML `<em>` tag; double `*`'s or `_`'s will be wrapped with an HTML | |||
| `<strong>` tag. E.g., this input: | |||
| *single asterisks* | |||
| _single underscores_ | |||
| **double asterisks** | |||
| __double underscores__ | |||
| will produce: | |||
| <em>single asterisks</em> | |||
| <em>single underscores</em> | |||
| <strong>double asterisks</strong> | |||
| <strong>double underscores</strong> | |||
| You can use whichever style you prefer; the lone restriction is that | |||
| the same character must be used to open and close an emphasis span. | |||
| Emphasis can be used in the middle of a word: | |||
| un*fucking*believable | |||
| But if you surround an `*` or `_` with spaces, it'll be treated as a | |||
| literal asterisk or underscore. | |||
| To produce a literal asterisk or underscore at a position where it | |||
| would otherwise be used as an emphasis delimiter, you can backslash | |||
| escape it: | |||
| \*this text is surrounded by literal asterisks\* | |||
| <h3 id="code">Code</h3> | |||
| To indicate a span of code, wrap it with backtick quotes (`` ` ``). | |||
| Unlike a pre-formatted code block, a code span indicates code within a | |||
| normal paragraph. For example: | |||
| Use the `printf()` function. | |||
| will produce: | |||
| <p>Use the <code>printf()</code> function.</p> | |||
| To include a literal backtick character within a code span, you can use | |||
| multiple backticks as the opening and closing delimiters: | |||
| ``There is a literal backtick (`) here.`` | |||
| which will produce this: | |||
| <p><code>There is a literal backtick (`) here.</code></p> | |||
| The backtick delimiters surrounding a code span may include spaces -- | |||
| one after the opening, one before the closing. This allows you to place | |||
| literal backtick characters at the beginning or end of a code span: | |||
| A single backtick in a code span: `` ` `` | |||
| A backtick-delimited string in a code span: `` `foo` `` | |||
| will produce: | |||
| <p>A single backtick in a code span: <code>`</code></p> | |||
| <p>A backtick-delimited string in a code span: <code>`foo`</code></p> | |||
| With a code span, ampersands and angle brackets are encoded as HTML | |||
| entities automatically, which makes it easy to include example HTML | |||
| tags. Markdown will turn this: | |||
| Please don't use any `<blink>` tags. | |||
| into: | |||
| <p>Please don't use any <code><blink></code> tags.</p> | |||
| You can write this: | |||
| `—` is the decimal-encoded equivalent of `—`. | |||
| to produce: | |||
| <p><code>&#8212;</code> is the decimal-encoded | |||
| equivalent of <code>&mdash;</code>.</p> | |||
| <h3 id="img">Images</h3> | |||
| Admittedly, it's fairly difficult to devise a "natural" syntax for | |||
| placing images into a plain text document format. | |||
| Markdown uses an image syntax that is intended to resemble the syntax | |||
| for links, allowing for two styles: *inline* and *reference*. | |||
| Inline image syntax looks like this: | |||
|  | |||
|  | |||
| That is: | |||
| * An exclamation mark: `!`; | |||
| * followed by a set of square brackets, containing the `alt` | |||
| attribute text for the image; | |||
| * followed by a set of parentheses, containing the URL or path to | |||
| the image, and an optional `title` attribute enclosed in double | |||
| or single quotes. | |||
| Reference-style image syntax looks like this: | |||
| ![Alt text][id] | |||
| Where "id" is the name of a defined image reference. Image references | |||
| are defined using syntax identical to link references: | |||
| [id]: url/to/image "Optional title attribute" | |||
| As of this writing, Markdown has no syntax for specifying the | |||
| dimensions of an image; if this is important to you, you can simply | |||
| use regular HTML `<img>` tags. | |||
| * * * | |||
| <h2 id="misc">Miscellaneous</h2> | |||
| <h3 id="autolink">Automatic Links</h3> | |||
| Markdown supports a shortcut style for creating "automatic" links for URLs and email addresses: simply surround the URL or email address with angle brackets. What this means is that if you want to show the actual text of a URL or email address, and also have it be a clickable link, you can do this: | |||
| <http://example.com/> | |||
| Markdown will turn this into: | |||
| <a href="http://example.com/">http://example.com/</a> | |||
| Automatic links for email addresses work similarly, except that | |||
| Markdown will also perform a bit of randomized decimal and hex | |||
| entity-encoding to help obscure your address from address-harvesting | |||
| spambots. For example, Markdown will turn this: | |||
| <address@example.com> | |||
| into something like this: | |||
| <a href="mailto:addre | |||
| ss@example.co | |||
| m">address@exa | |||
| mple.com</a> | |||
| which will render in a browser as a clickable link to "address@example.com". | |||
| (This sort of entity-encoding trick will indeed fool many, if not | |||
| most, address-harvesting bots, but it definitely won't fool all of | |||
| them. It's better than nothing, but an address published in this way | |||
| will probably eventually start receiving spam.) | |||
| <h3 id="backslash">Backslash Escapes</h3> | |||
| Markdown allows you to use backslash escapes to generate literal | |||
| characters which would otherwise have special meaning in Markdown's | |||
| formatting syntax. For example, if you wanted to surround a word with | |||
| literal asterisks (instead of an HTML `<em>` tag), you can backslashes | |||
| before the asterisks, like this: | |||
| \*literal asterisks\* | |||
| Markdown provides backslash escapes for the following characters: | |||
| \ backslash | |||
| ` backtick | |||
| * asterisk | |||
| _ underscore | |||
| {} curly braces | |||
| [] square brackets | |||
| () parentheses | |||
| # hash mark | |||
| + plus sign | |||
| - minus sign (hyphen) | |||
| . dot | |||
| ! exclamation mark | |||
| @ -0,0 +1,942 @@ | |||
| <h1>Markdown: Syntax</h1> | |||
| <ul id="ProjectSubmenu"> | |||
| <li><a href="/projects/markdown/" title="Markdown Project Page">Main</a></li> | |||
| <li><a href="/projects/markdown/basics" title="Markdown Basics">Basics</a></li> | |||
| <li><a class="selected" title="Markdown Syntax Documentation">Syntax</a></li> | |||
| <li><a href="/projects/markdown/license" title="Pricing and License Information">License</a></li> | |||
| <li><a href="/projects/markdown/dingus" title="Online Markdown Web Form">Dingus</a></li> | |||
| </ul> | |||
| <ul> | |||
| <li><a href="#overview">Overview</a> | |||
| <ul> | |||
| <li><a href="#philosophy">Philosophy</a></li> | |||
| <li><a href="#html">Inline HTML</a></li> | |||
| <li><a href="#autoescape">Automatic Escaping for Special Characters</a></li> | |||
| </ul></li> | |||
| <li><a href="#block">Block Elements</a> | |||
| <ul> | |||
| <li><a href="#p">Paragraphs and Line Breaks</a></li> | |||
| <li><a href="#header">Headers</a></li> | |||
| <li><a href="#blockquote">Blockquotes</a></li> | |||
| <li><a href="#list">Lists</a></li> | |||
| <li><a href="#precode">Code Blocks</a></li> | |||
| <li><a href="#hr">Horizontal Rules</a></li> | |||
| </ul></li> | |||
| <li><a href="#span">Span Elements</a> | |||
| <ul> | |||
| <li><a href="#link">Links</a></li> | |||
| <li><a href="#em">Emphasis</a></li> | |||
| <li><a href="#code">Code</a></li> | |||
| <li><a href="#img">Images</a></li> | |||
| </ul></li> | |||
| <li><a href="#misc">Miscellaneous</a> | |||
| <ul> | |||
| <li><a href="#backslash">Backslash Escapes</a></li> | |||
| <li><a href="#autolink">Automatic Links</a></li> | |||
| </ul></li> | |||
| </ul> | |||
| <p><strong>Note:</strong> This document is itself written using Markdown; you | |||
| can <a href="/projects/markdown/syntax.text">see the source for it by adding '.text' to the URL</a>.</p> | |||
| <hr /> | |||
| <h2 id="overview">Overview</h2> | |||
| <h3 id="philosophy">Philosophy</h3> | |||
| <p>Markdown is intended to be as easy-to-read and easy-to-write as is feasible.</p> | |||
| <p>Readability, however, is emphasized above all else. A Markdown-formatted | |||
| document should be publishable as-is, as plain text, without looking | |||
| like it's been marked up with tags or formatting instructions. While | |||
| Markdown's syntax has been influenced by several existing text-to-HTML | |||
| filters -- including <a href="http://docutils.sourceforge.net/mirror/setext.html">Setext</a>, <a href="http://www.aaronsw.com/2002/atx/">atx</a>, <a href="http://textism.com/tools/textile/">Textile</a>, <a href="http://docutils.sourceforge.net/rst.html">reStructuredText</a>, | |||
| <a href="http://www.triptico.com/software/grutatxt.html">Grutatext</a>, and <a href="http://ettext.taint.org/doc/">EtText</a> -- the single biggest source of | |||
| inspiration for Markdown's syntax is the format of plain text email.</p> | |||
| <p>To this end, Markdown's syntax is comprised entirely of punctuation | |||
| characters, which punctuation characters have been carefully chosen so | |||
| as to look like what they mean. E.g., asterisks around a word actually | |||
| look like *emphasis*. Markdown lists look like, well, lists. Even | |||
| blockquotes look like quoted passages of text, assuming you've ever | |||
| used email.</p> | |||
| <h3 id="html">Inline HTML</h3> | |||
| <p>Markdown's syntax is intended for one purpose: to be used as a | |||
| format for <em>writing</em> for the web.</p> | |||
| <p>Markdown is not a replacement for HTML, or even close to it. Its | |||
| syntax is very small, corresponding only to a very small subset of | |||
| HTML tags. The idea is <em>not</em> to create a syntax that makes it easier | |||
| to insert HTML tags. In my opinion, HTML tags are already easy to | |||
| insert. The idea for Markdown is to make it easy to read, write, and | |||
| edit prose. HTML is a <em>publishing</em> format; Markdown is a <em>writing</em> | |||
| format. Thus, Markdown's formatting syntax only addresses issues that | |||
| can be conveyed in plain text.</p> | |||
| <p>For any markup that is not covered by Markdown's syntax, you simply | |||
| use HTML itself. There's no need to preface it or delimit it to | |||
| indicate that you're switching from Markdown to HTML; you just use | |||
| the tags.</p> | |||
| <p>The only restrictions are that block-level HTML elements -- e.g. <code><div></code>, | |||
| <code><table></code>, <code><pre></code>, <code><p></code>, etc. -- must be separated from surrounding | |||
| content by blank lines, and the start and end tags of the block should | |||
| not be indented with tabs or spaces. Markdown is smart enough not | |||
| to add extra (unwanted) <code><p></code> tags around HTML block-level tags.</p> | |||
| <p>For example, to add an HTML table to a Markdown article:</p> | |||
| <pre><code>This is a regular paragraph. | |||
| <table> | |||
| <tr> | |||
| <td>Foo</td> | |||
| </tr> | |||
| </table> | |||
| This is another regular paragraph. | |||
| </code></pre> | |||
| <p>Note that Markdown formatting syntax is not processed within block-level | |||
| HTML tags. E.g., you can't use Markdown-style <code>*emphasis*</code> inside an | |||
| HTML block.</p> | |||
| <p>Span-level HTML tags -- e.g. <code><span></code>, <code><cite></code>, or <code><del></code> -- can be | |||
| used anywhere in a Markdown paragraph, list item, or header. If you | |||
| want, you can even use HTML tags instead of Markdown formatting; e.g. if | |||
| you'd prefer to use HTML <code><a></code> or <code><img></code> tags instead of Markdown's | |||
| link or image syntax, go right ahead.</p> | |||
| <p>Unlike block-level HTML tags, Markdown syntax <em>is</em> processed within | |||
| span-level tags.</p> | |||
| <h3 id="autoescape">Automatic Escaping for Special Characters</h3> | |||
| <p>In HTML, there are two characters that demand special treatment: <code><</code> | |||
| and <code>&</code>. Left angle brackets are used to start tags; ampersands are | |||
| used to denote HTML entities. If you want to use them as literal | |||
| characters, you must escape them as entities, e.g. <code>&lt;</code>, and | |||
| <code>&amp;</code>.</p> | |||
| <p>Ampersands in particular are bedeviling for web writers. If you want to | |||
| write about 'AT&T', you need to write '<code>AT&amp;T</code>'. You even need to | |||
| escape ampersands within URLs. Thus, if you want to link to:</p> | |||
| <pre><code>http://images.google.com/images?num=30&q=larry+bird | |||
| </code></pre> | |||
| <p>you need to encode the URL as:</p> | |||
| <pre><code>http://images.google.com/images?num=30&amp;q=larry+bird | |||
| </code></pre> | |||
| <p>in your anchor tag <code>href</code> attribute. Needless to say, this is easy to | |||
| forget, and is probably the single most common source of HTML validation | |||
| errors in otherwise well-marked-up web sites.</p> | |||
| <p>Markdown allows you to use these characters naturally, taking care of | |||
| all the necessary escaping for you. If you use an ampersand as part of | |||
| an HTML entity, it remains unchanged; otherwise it will be translated | |||
| into <code>&amp;</code>.</p> | |||
| <p>So, if you want to include a copyright symbol in your article, you can write:</p> | |||
| <pre><code>&copy; | |||
| </code></pre> | |||
| <p>and Markdown will leave it alone. But if you write:</p> | |||
| <pre><code>AT&T | |||
| </code></pre> | |||
| <p>Markdown will translate it to:</p> | |||
| <pre><code>AT&amp;T | |||
| </code></pre> | |||
| <p>Similarly, because Markdown supports <a href="#html">inline HTML</a>, if you use | |||
| angle brackets as delimiters for HTML tags, Markdown will treat them as | |||
| such. But if you write:</p> | |||
| <pre><code>4 < 5 | |||
| </code></pre> | |||
| <p>Markdown will translate it to:</p> | |||
| <pre><code>4 &lt; 5 | |||
| </code></pre> | |||
| <p>However, inside Markdown code spans and blocks, angle brackets and | |||
| ampersands are <em>always</em> encoded automatically. This makes it easy to use | |||
| Markdown to write about HTML code. (As opposed to raw HTML, which is a | |||
| terrible format for writing about HTML syntax, because every single <code><</code> | |||
| and <code>&</code> in your example code needs to be escaped.)</p> | |||
| <hr /> | |||
| <h2 id="block">Block Elements</h2> | |||
| <h3 id="p">Paragraphs and Line Breaks</h3> | |||
| <p>A paragraph is simply one or more consecutive lines of text, separated | |||
| by one or more blank lines. (A blank line is any line that looks like a | |||
| blank line -- a line containing nothing but spaces or tabs is considered | |||
| blank.) Normal paragraphs should not be intended with spaces or tabs.</p> | |||
| <p>The implication of the "one or more consecutive lines of text" rule is | |||
| that Markdown supports "hard-wrapped" text paragraphs. This differs | |||
| significantly from most other text-to-HTML formatters (including Movable | |||
| Type's "Convert Line Breaks" option) which translate every line break | |||
| character in a paragraph into a <code><br /></code> tag.</p> | |||
| <p>When you <em>do</em> want to insert a <code><br /></code> break tag using Markdown, you | |||
| end a line with two or more spaces, then type return.</p> | |||
| <p>Yes, this takes a tad more effort to create a <code><br /></code>, but a simplistic | |||
| "every line break is a <code><br /></code>" rule wouldn't work for Markdown. | |||
| Markdown's email-style <a href="#blockquote">blockquoting</a> and multi-paragraph <a href="#list">list items</a> | |||
| work best -- and look better -- when you format them with hard breaks.</p> | |||
| <h3 id="header">Headers</h3> | |||
| <p>Markdown supports two styles of headers, <a href="http://docutils.sourceforge.net/mirror/setext.html">Setext</a> and <a href="http://www.aaronsw.com/2002/atx/">atx</a>.</p> | |||
| <p>Setext-style headers are "underlined" using equal signs (for first-level | |||
| headers) and dashes (for second-level headers). For example:</p> | |||
| <pre><code>This is an H1 | |||
| ============= | |||
| This is an H2 | |||
| ------------- | |||
| </code></pre> | |||
| <p>Any number of underlining <code>=</code>'s or <code>-</code>'s will work.</p> | |||
| <p>Atx-style headers use 1-6 hash characters at the start of the line, | |||
| corresponding to header levels 1-6. For example:</p> | |||
| <pre><code># This is an H1 | |||
| ## This is an H2 | |||
| ###### This is an H6 | |||
| </code></pre> | |||
| <p>Optionally, you may "close" atx-style headers. This is purely | |||
| cosmetic -- you can use this if you think it looks better. The | |||
| closing hashes don't even need to match the number of hashes | |||
| used to open the header. (The number of opening hashes | |||
| determines the header level.) :</p> | |||
| <pre><code># This is an H1 # | |||
| ## This is an H2 ## | |||
| ### This is an H3 ###### | |||
| </code></pre> | |||
| <h3 id="blockquote">Blockquotes</h3> | |||
| <p>Markdown uses email-style <code>></code> characters for blockquoting. If you're | |||
| familiar with quoting passages of text in an email message, then you | |||
| know how to create a blockquote in Markdown. It looks best if you hard | |||
| wrap the text and put a <code>></code> before every line:</p> | |||
| <pre><code>> This is a blockquote with two paragraphs. Lorem ipsum dolor sit amet, | |||
| > consectetuer adipiscing elit. Aliquam hendrerit mi posuere lectus. | |||
| > Vestibulum enim wisi, viverra nec, fringilla in, laoreet vitae, risus. | |||
| > | |||
| > Donec sit amet nisl. Aliquam semper ipsum sit amet velit. Suspendisse | |||
| > id sem consectetuer libero luctus adipiscing. | |||
| </code></pre> | |||
| <p>Markdown allows you to be lazy and only put the <code>></code> before the first | |||
| line of a hard-wrapped paragraph:</p> | |||
| <pre><code>> This is a blockquote with two paragraphs. Lorem ipsum dolor sit amet, | |||
| consectetuer adipiscing elit. Aliquam hendrerit mi posuere lectus. | |||
| Vestibulum enim wisi, viverra nec, fringilla in, laoreet vitae, risus. | |||
| > Donec sit amet nisl. Aliquam semper ipsum sit amet velit. Suspendisse | |||
| id sem consectetuer libero luctus adipiscing. | |||
| </code></pre> | |||
| <p>Blockquotes can be nested (i.e. a blockquote-in-a-blockquote) by | |||
| adding additional levels of <code>></code>:</p> | |||
| <pre><code>> This is the first level of quoting. | |||
| > | |||
| > > This is nested blockquote. | |||
| > | |||
| > Back to the first level. | |||
| </code></pre> | |||
| <p>Blockquotes can contain other Markdown elements, including headers, lists, | |||
| and code blocks:</p> | |||
| <pre><code>> ## This is a header. | |||
| > | |||
| > 1. This is the first list item. | |||
| > 2. This is the second list item. | |||
| > | |||
| > Here's some example code: | |||
| > | |||
| > return shell_exec("echo $input | $markdown_script"); | |||
| </code></pre> | |||
| <p>Any decent text editor should make email-style quoting easy. For | |||
| example, with BBEdit, you can make a selection and choose Increase | |||
| Quote Level from the Text menu.</p> | |||
| <h3 id="list">Lists</h3> | |||
| <p>Markdown supports ordered (numbered) and unordered (bulleted) lists.</p> | |||
| <p>Unordered lists use asterisks, pluses, and hyphens -- interchangably | |||
| -- as list markers:</p> | |||
| <pre><code>* Red | |||
| * Green | |||
| * Blue | |||
| </code></pre> | |||
| <p>is equivalent to:</p> | |||
| <pre><code>+ Red | |||
| + Green | |||
| + Blue | |||
| </code></pre> | |||
| <p>and:</p> | |||
| <pre><code>- Red | |||
| - Green | |||
| - Blue | |||
| </code></pre> | |||
| <p>Ordered lists use numbers followed by periods:</p> | |||
| <pre><code>1. Bird | |||
| 2. McHale | |||
| 3. Parish | |||
| </code></pre> | |||
| <p>It's important to note that the actual numbers you use to mark the | |||
| list have no effect on the HTML output Markdown produces. The HTML | |||
| Markdown produces from the above list is:</p> | |||
| <pre><code><ol> | |||
| <li>Bird</li> | |||
| <li>McHale</li> | |||
| <li>Parish</li> | |||
| </ol> | |||
| </code></pre> | |||
| <p>If you instead wrote the list in Markdown like this:</p> | |||
| <pre><code>1. Bird | |||
| 1. McHale | |||
| 1. Parish | |||
| </code></pre> | |||
| <p>or even:</p> | |||
| <pre><code>3. Bird | |||
| 1. McHale | |||
| 8. Parish | |||
| </code></pre> | |||
| <p>you'd get the exact same HTML output. The point is, if you want to, | |||
| you can use ordinal numbers in your ordered Markdown lists, so that | |||
| the numbers in your source match the numbers in your published HTML. | |||
| But if you want to be lazy, you don't have to.</p> | |||
| <p>If you do use lazy list numbering, however, you should still start the | |||
| list with the number 1. At some point in the future, Markdown may support | |||
| starting ordered lists at an arbitrary number.</p> | |||
| <p>List markers typically start at the left margin, but may be indented by | |||
| up to three spaces. List markers must be followed by one or more spaces | |||
| or a tab.</p> | |||
| <p>To make lists look nice, you can wrap items with hanging indents:</p> | |||
| <pre><code>* Lorem ipsum dolor sit amet, consectetuer adipiscing elit. | |||
| Aliquam hendrerit mi posuere lectus. Vestibulum enim wisi, | |||
| viverra nec, fringilla in, laoreet vitae, risus. | |||
| * Donec sit amet nisl. Aliquam semper ipsum sit amet velit. | |||
| Suspendisse id sem consectetuer libero luctus adipiscing. | |||
| </code></pre> | |||
| <p>But if you want to be lazy, you don't have to:</p> | |||
| <pre><code>* Lorem ipsum dolor sit amet, consectetuer adipiscing elit. | |||
| Aliquam hendrerit mi posuere lectus. Vestibulum enim wisi, | |||
| viverra nec, fringilla in, laoreet vitae, risus. | |||
| * Donec sit amet nisl. Aliquam semper ipsum sit amet velit. | |||
| Suspendisse id sem consectetuer libero luctus adipiscing. | |||
| </code></pre> | |||
| <p>If list items are separated by blank lines, Markdown will wrap the | |||
| items in <code><p></code> tags in the HTML output. For example, this input:</p> | |||
| <pre><code>* Bird | |||
| * Magic | |||
| </code></pre> | |||
| <p>will turn into:</p> | |||
| <pre><code><ul> | |||
| <li>Bird</li> | |||
| <li>Magic</li> | |||
| </ul> | |||
| </code></pre> | |||
| <p>But this:</p> | |||
| <pre><code>* Bird | |||
| * Magic | |||
| </code></pre> | |||
| <p>will turn into:</p> | |||
| <pre><code><ul> | |||
| <li><p>Bird</p></li> | |||
| <li><p>Magic</p></li> | |||
| </ul> | |||
| </code></pre> | |||
| <p>List items may consist of multiple paragraphs. Each subsequent | |||
| paragraph in a list item must be intended by either 4 spaces | |||
| or one tab:</p> | |||
| <pre><code>1. This is a list item with two paragraphs. Lorem ipsum dolor | |||
| sit amet, consectetuer adipiscing elit. Aliquam hendrerit | |||
| mi posuere lectus. | |||
| Vestibulum enim wisi, viverra nec, fringilla in, laoreet | |||
| vitae, risus. Donec sit amet nisl. Aliquam semper ipsum | |||
| sit amet velit. | |||
| 2. Suspendisse id sem consectetuer libero luctus adipiscing. | |||
| </code></pre> | |||
| <p>It looks nice if you indent every line of the subsequent | |||
| paragraphs, but here again, Markdown will allow you to be | |||
| lazy:</p> | |||
| <pre><code>* This is a list item with two paragraphs. | |||
| This is the second paragraph in the list item. You're | |||
| only required to indent the first line. Lorem ipsum dolor | |||
| sit amet, consectetuer adipiscing elit. | |||
| * Another item in the same list. | |||
| </code></pre> | |||
| <p>To put a blockquote within a list item, the blockquote's <code>></code> | |||
| delimiters need to be indented:</p> | |||
| <pre><code>* A list item with a blockquote: | |||
| > This is a blockquote | |||
| > inside a list item. | |||
| </code></pre> | |||
| <p>To put a code block within a list item, the code block needs | |||
| to be indented <em>twice</em> -- 8 spaces or two tabs:</p> | |||
| <pre><code>* A list item with a code block: | |||
| <code goes here> | |||
| </code></pre> | |||
| <p>It's worth noting that it's possible to trigger an ordered list by | |||
| accident, by writing something like this:</p> | |||
| <pre><code>1986. What a great season. | |||
| </code></pre> | |||
| <p>In other words, a <em>number-period-space</em> sequence at the beginning of a | |||
| line. To avoid this, you can backslash-escape the period:</p> | |||
| <pre><code>1986\. What a great season. | |||
| </code></pre> | |||
| <h3 id="precode">Code Blocks</h3> | |||
| <p>Pre-formatted code blocks are used for writing about programming or | |||
| markup source code. Rather than forming normal paragraphs, the lines | |||
| of a code block are interpreted literally. Markdown wraps a code block | |||
| in both <code><pre></code> and <code><code></code> tags.</p> | |||
| <p>To produce a code block in Markdown, simply indent every line of the | |||
| block by at least 4 spaces or 1 tab. For example, given this input:</p> | |||
| <pre><code>This is a normal paragraph: | |||
| This is a code block. | |||
| </code></pre> | |||
| <p>Markdown will generate:</p> | |||
| <pre><code><p>This is a normal paragraph:</p> | |||
| <pre><code>This is a code block. | |||
| </code></pre> | |||
| </code></pre> | |||
| <p>One level of indentation -- 4 spaces or 1 tab -- is removed from each | |||
| line of the code block. For example, this:</p> | |||
| <pre><code>Here is an example of AppleScript: | |||
| tell application "Foo" | |||
| beep | |||
| end tell | |||
| </code></pre> | |||
| <p>will turn into:</p> | |||
| <pre><code><p>Here is an example of AppleScript:</p> | |||
| <pre><code>tell application "Foo" | |||
| beep | |||
| end tell | |||
| </code></pre> | |||
| </code></pre> | |||
| <p>A code block continues until it reaches a line that is not indented | |||
| (or the end of the article).</p> | |||
| <p>Within a code block, ampersands (<code>&</code>) and angle brackets (<code><</code> and <code>></code>) | |||
| are automatically converted into HTML entities. This makes it very | |||
| easy to include example HTML source code using Markdown -- just paste | |||
| it and indent it, and Markdown will handle the hassle of encoding the | |||
| ampersands and angle brackets. For example, this:</p> | |||
| <pre><code> <div class="footer"> | |||
| &copy; 2004 Foo Corporation | |||
| </div> | |||
| </code></pre> | |||
| <p>will turn into:</p> | |||
| <pre><code><pre><code>&lt;div class="footer"&gt; | |||
| &amp;copy; 2004 Foo Corporation | |||
| &lt;/div&gt; | |||
| </code></pre> | |||
| </code></pre> | |||
| <p>Regular Markdown syntax is not processed within code blocks. E.g., | |||
| asterisks are just literal asterisks within a code block. This means | |||
| it's also easy to use Markdown to write about Markdown's own syntax.</p> | |||
| <h3 id="hr">Horizontal Rules</h3> | |||
| <p>You can produce a horizontal rule tag (<code><hr /></code>) by placing three or | |||
| more hyphens, asterisks, or underscores on a line by themselves. If you | |||
| wish, you may use spaces between the hyphens or asterisks. Each of the | |||
| following lines will produce a horizontal rule:</p> | |||
| <pre><code>* * * | |||
| *** | |||
| ***** | |||
| - - - | |||
| --------------------------------------- | |||
| _ _ _ | |||
| </code></pre> | |||
| <hr /> | |||
| <h2 id="span">Span Elements</h2> | |||
| <h3 id="link">Links</h3> | |||
| <p>Markdown supports two style of links: <em>inline</em> and <em>reference</em>.</p> | |||
| <p>In both styles, the link text is delimited by [square brackets].</p> | |||
| <p>To create an inline link, use a set of regular parentheses immediately | |||
| after the link text's closing square bracket. Inside the parentheses, | |||
| put the URL where you want the link to point, along with an <em>optional</em> | |||
| title for the link, surrounded in quotes. For example:</p> | |||
| <pre><code>This is [an example](http://example.com/ "Title") inline link. | |||
| [This link](http://example.net/) has no title attribute. | |||
| </code></pre> | |||
| <p>Will produce:</p> | |||
| <pre><code><p>This is <a href="http://example.com/" title="Title"> | |||
| an example</a> inline link.</p> | |||
| <p><a href="http://example.net/">This link</a> has no | |||
| title attribute.</p> | |||
| </code></pre> | |||
| <p>If you're referring to a local resource on the same server, you can | |||
| use relative paths:</p> | |||
| <pre><code>See my [About](/about/) page for details. | |||
| </code></pre> | |||
| <p>Reference-style links use a second set of square brackets, inside | |||
| which you place a label of your choosing to identify the link:</p> | |||
| <pre><code>This is [an example][id] reference-style link. | |||
| </code></pre> | |||
| <p>You can optionally use a space to separate the sets of brackets:</p> | |||
| <pre><code>This is [an example] [id] reference-style link. | |||
| </code></pre> | |||
| <p>Then, anywhere in the document, you define your link label like this, | |||
| on a line by itself:</p> | |||
| <pre><code>[id]: http://example.com/ "Optional Title Here" | |||
| </code></pre> | |||
| <p>That is:</p> | |||
| <ul> | |||
| <li>Square brackets containing the link identifier (optionally | |||
| indented from the left margin using up to three spaces);</li> | |||
| <li>followed by a colon;</li> | |||
| <li>followed by one or more spaces (or tabs);</li> | |||
| <li>followed by the URL for the link;</li> | |||
| <li>optionally followed by a title attribute for the link, enclosed | |||
| in double or single quotes.</li> | |||
| </ul> | |||
| <p>The link URL may, optionally, be surrounded by angle brackets:</p> | |||
| <pre><code>[id]: <http://example.com/> "Optional Title Here" | |||
| </code></pre> | |||
| <p>You can put the title attribute on the next line and use extra spaces | |||
| or tabs for padding, which tends to look better with longer URLs:</p> | |||
| <pre><code>[id]: http://example.com/longish/path/to/resource/here | |||
| "Optional Title Here" | |||
| </code></pre> | |||
| <p>Link definitions are only used for creating links during Markdown | |||
| processing, and are stripped from your document in the HTML output.</p> | |||
| <p>Link definition names may constist of letters, numbers, spaces, and punctuation -- but they are <em>not</em> case sensitive. E.g. these two links:</p> | |||
| <pre><code>[link text][a] | |||
| [link text][A] | |||
| </code></pre> | |||
| <p>are equivalent.</p> | |||
| <p>The <em>implicit link name</em> shortcut allows you to omit the name of the | |||
| link, in which case the link text itself is used as the name. | |||
| Just use an empty set of square brackets -- e.g., to link the word | |||
| "Google" to the google.com web site, you could simply write:</p> | |||
| <pre><code>[Google][] | |||
| </code></pre> | |||
| <p>And then define the link:</p> | |||
| <pre><code>[Google]: http://google.com/ | |||
| </code></pre> | |||
| <p>Because link names may contain spaces, this shortcut even works for | |||
| multiple words in the link text:</p> | |||
| <pre><code>Visit [Daring Fireball][] for more information. | |||
| </code></pre> | |||
| <p>And then define the link:</p> | |||
| <pre><code>[Daring Fireball]: http://daringfireball.net/ | |||
| </code></pre> | |||
| <p>Link definitions can be placed anywhere in your Markdown document. I | |||
| tend to put them immediately after each paragraph in which they're | |||
| used, but if you want, you can put them all at the end of your | |||
| document, sort of like footnotes.</p> | |||
| <p>Here's an example of reference links in action:</p> | |||
| <pre><code>I get 10 times more traffic from [Google] [1] than from | |||
| [Yahoo] [2] or [MSN] [3]. | |||
| [1]: http://google.com/ "Google" | |||
| [2]: http://search.yahoo.com/ "Yahoo Search" | |||
| [3]: http://search.msn.com/ "MSN Search" | |||
| </code></pre> | |||
| <p>Using the implicit link name shortcut, you could instead write:</p> | |||
| <pre><code>I get 10 times more traffic from [Google][] than from | |||
| [Yahoo][] or [MSN][]. | |||
| [google]: http://google.com/ "Google" | |||
| [yahoo]: http://search.yahoo.com/ "Yahoo Search" | |||
| [msn]: http://search.msn.com/ "MSN Search" | |||
| </code></pre> | |||
| <p>Both of the above examples will produce the following HTML output:</p> | |||
| <pre><code><p>I get 10 times more traffic from <a href="http://google.com/" | |||
| title="Google">Google</a> than from | |||
| <a href="http://search.yahoo.com/" title="Yahoo Search">Yahoo</a> | |||
| or <a href="http://search.msn.com/" title="MSN Search">MSN</a>.</p> | |||
| </code></pre> | |||
| <p>For comparison, here is the same paragraph written using | |||
| Markdown's inline link style:</p> | |||
| <pre><code>I get 10 times more traffic from [Google](http://google.com/ "Google") | |||
| than from [Yahoo](http://search.yahoo.com/ "Yahoo Search") or | |||
| [MSN](http://search.msn.com/ "MSN Search"). | |||
| </code></pre> | |||
| <p>The point of reference-style links is not that they're easier to | |||
| write. The point is that with reference-style links, your document | |||
| source is vastly more readable. Compare the above examples: using | |||
| reference-style links, the paragraph itself is only 81 characters | |||
| long; with inline-style links, it's 176 characters; and as raw HTML, | |||
| it's 234 characters. In the raw HTML, there's more markup than there | |||
| is text.</p> | |||
| <p>With Markdown's reference-style links, a source document much more | |||
| closely resembles the final output, as rendered in a browser. By | |||
| allowing you to move the markup-related metadata out of the paragraph, | |||
| you can add links without interrupting the narrative flow of your | |||
| prose.</p> | |||
| <h3 id="em">Emphasis</h3> | |||
| <p>Markdown treats asterisks (<code>*</code>) and underscores (<code>_</code>) as indicators of | |||
| emphasis. Text wrapped with one <code>*</code> or <code>_</code> will be wrapped with an | |||
| HTML <code><em></code> tag; double <code>*</code>'s or <code>_</code>'s will be wrapped with an HTML | |||
| <code><strong></code> tag. E.g., this input:</p> | |||
| <pre><code>*single asterisks* | |||
| _single underscores_ | |||
| **double asterisks** | |||
| __double underscores__ | |||
| </code></pre> | |||
| <p>will produce:</p> | |||
| <pre><code><em>single asterisks</em> | |||
| <em>single underscores</em> | |||
| <strong>double asterisks</strong> | |||
| <strong>double underscores</strong> | |||
| </code></pre> | |||
| <p>You can use whichever style you prefer; the lone restriction is that | |||
| the same character must be used to open and close an emphasis span.</p> | |||
| <p>Emphasis can be used in the middle of a word:</p> | |||
| <pre><code>un*fucking*believable | |||
| </code></pre> | |||
| <p>But if you surround an <code>*</code> or <code>_</code> with spaces, it'll be treated as a | |||
| literal asterisk or underscore.</p> | |||
| <p>To produce a literal asterisk or underscore at a position where it | |||
| would otherwise be used as an emphasis delimiter, you can backslash | |||
| escape it:</p> | |||
| <pre><code>\*this text is surrounded by literal asterisks\* | |||
| </code></pre> | |||
| <h3 id="code">Code</h3> | |||
| <p>To indicate a span of code, wrap it with backtick quotes (<code>`</code>). | |||
| Unlike a pre-formatted code block, a code span indicates code within a | |||
| normal paragraph. For example:</p> | |||
| <pre><code>Use the `printf()` function. | |||
| </code></pre> | |||
| <p>will produce:</p> | |||
| <pre><code><p>Use the <code>printf()</code> function.</p> | |||
| </code></pre> | |||
| <p>To include a literal backtick character within a code span, you can use | |||
| multiple backticks as the opening and closing delimiters:</p> | |||
| <pre><code>``There is a literal backtick (`) here.`` | |||
| </code></pre> | |||
| <p>which will produce this:</p> | |||
| <pre><code><p><code>There is a literal backtick (`) here.</code></p> | |||
| </code></pre> | |||
| <p>The backtick delimiters surrounding a code span may include spaces -- | |||
| one after the opening, one before the closing. This allows you to place | |||
| literal backtick characters at the beginning or end of a code span:</p> | |||
| <pre><code>A single backtick in a code span: `` ` `` | |||
| A backtick-delimited string in a code span: `` `foo` `` | |||
| </code></pre> | |||
| <p>will produce:</p> | |||
| <pre><code><p>A single backtick in a code span: <code>`</code></p> | |||
| <p>A backtick-delimited string in a code span: <code>`foo`</code></p> | |||
| </code></pre> | |||
| <p>With a code span, ampersands and angle brackets are encoded as HTML | |||
| entities automatically, which makes it easy to include example HTML | |||
| tags. Markdown will turn this:</p> | |||
| <pre><code>Please don't use any `<blink>` tags. | |||
| </code></pre> | |||
| <p>into:</p> | |||
| <pre><code><p>Please don't use any <code>&lt;blink&gt;</code> tags.</p> | |||
| </code></pre> | |||
| <p>You can write this:</p> | |||
| <pre><code>`&#8212;` is the decimal-encoded equivalent of `&mdash;`. | |||
| </code></pre> | |||
| <p>to produce:</p> | |||
| <pre><code><p><code>&amp;#8212;</code> is the decimal-encoded | |||
| equivalent of <code>&amp;mdash;</code>.</p> | |||
| </code></pre> | |||
| <h3 id="img">Images</h3> | |||
| <p>Admittedly, it's fairly difficult to devise a "natural" syntax for | |||
| placing images into a plain text document format.</p> | |||
| <p>Markdown uses an image syntax that is intended to resemble the syntax | |||
| for links, allowing for two styles: <em>inline</em> and <em>reference</em>.</p> | |||
| <p>Inline image syntax looks like this:</p> | |||
| <pre><code> | |||
|  | |||
| </code></pre> | |||
| <p>That is:</p> | |||
| <ul> | |||
| <li>An exclamation mark: <code>!</code>;</li> | |||
| <li>followed by a set of square brackets, containing the <code>alt</code> | |||
| attribute text for the image;</li> | |||
| <li>followed by a set of parentheses, containing the URL or path to | |||
| the image, and an optional <code>title</code> attribute enclosed in double | |||
| or single quotes.</li> | |||
| </ul> | |||
| <p>Reference-style image syntax looks like this:</p> | |||
| <pre><code>![Alt text][id] | |||
| </code></pre> | |||
| <p>Where "id" is the name of a defined image reference. Image references | |||
| are defined using syntax identical to link references:</p> | |||
| <pre><code>[id]: url/to/image "Optional title attribute" | |||
| </code></pre> | |||
| <p>As of this writing, Markdown has no syntax for specifying the | |||
| dimensions of an image; if this is important to you, you can simply | |||
| use regular HTML <code><img></code> tags.</p> | |||
| <hr /> | |||
| <h2 id="misc">Miscellaneous</h2> | |||
| <h3 id="autolink">Automatic Links</h3> | |||
| <p>Markdown supports a shortcut style for creating "automatic" links for URLs and email addresses: simply surround the URL or email address with angle brackets. What this means is that if you want to show the actual text of a URL or email address, and also have it be a clickable link, you can do this:</p> | |||
| <pre><code><http://example.com/> | |||
| </code></pre> | |||
| <p>Markdown will turn this into:</p> | |||
| <pre><code><a href="http://example.com/">http://example.com/</a> | |||
| </code></pre> | |||
| <p>Automatic links for email addresses work similarly, except that | |||
| Markdown will also perform a bit of randomized decimal and hex | |||
| entity-encoding to help obscure your address from address-harvesting | |||
| spambots. For example, Markdown will turn this:</p> | |||
| <pre><code><address@example.com> | |||
| </code></pre> | |||
| <p>into something like this:</p> | |||
| <pre><code><a href="&#x6D;&#x61;i&#x6C;&#x74;&#x6F;:&#x61;&#x64;&#x64;&#x72;&#x65; | |||
| &#115;&#115;&#64;&#101;&#120;&#x61;&#109;&#x70;&#x6C;e&#x2E;&#99;&#111; | |||
| &#109;">&#x61;&#x64;&#x64;&#x72;&#x65;&#115;&#115;&#64;&#101;&#120;&#x61; | |||
| &#109;&#x70;&#x6C;e&#x2E;&#99;&#111;&#109;</a> | |||
| </code></pre> | |||
| <p>which will render in a browser as a clickable link to "address@example.com".</p> | |||
| <p>(This sort of entity-encoding trick will indeed fool many, if not | |||
| most, address-harvesting bots, but it definitely won't fool all of | |||
| them. It's better than nothing, but an address published in this way | |||
| will probably eventually start receiving spam.)</p> | |||
| <h3 id="backslash">Backslash Escapes</h3> | |||
| <p>Markdown allows you to use backslash escapes to generate literal | |||
| characters which would otherwise have special meaning in Markdown's | |||
| formatting syntax. For example, if you wanted to surround a word with | |||
| literal asterisks (instead of an HTML <code><em></code> tag), you can backslashes | |||
| before the asterisks, like this:</p> | |||
| <pre><code>\*literal asterisks\* | |||
| </code></pre> | |||
| <p>Markdown provides backslash escapes for the following characters:</p> | |||
| <pre><code>\ backslash | |||
| ` backtick | |||
| * asterisk | |||
| _ underscore | |||
| {} curly braces | |||
| [] square brackets | |||
| () parentheses | |||
| # hash mark | |||
| + plus sign | |||
| - minus sign (hyphen) | |||
| . dot | |||
| ! exclamation mark | |||
| </code></pre> | |||
| @ -0,0 +1,5 @@ | |||
| > foo | |||
| > | |||
| > > bar | |||
| > | |||
| > foo | |||
| @ -0,0 +1,9 @@ | |||
| <blockquote> | |||
| <p>foo</p> | |||
| <blockquote> | |||
| <p>bar</p> | |||
| </blockquote> | |||
| <p>foo</p> | |||
| </blockquote> | |||
| @ -0,0 +1,131 @@ | |||
| ## Unordered | |||
| Asterisks tight: | |||
| * asterisk 1 | |||
| * asterisk 2 | |||
| * asterisk 3 | |||
| Asterisks loose: | |||
| * asterisk 1 | |||
| * asterisk 2 | |||
| * asterisk 3 | |||
| * * * | |||
| Pluses tight: | |||
| + Plus 1 | |||
| + Plus 2 | |||
| + Plus 3 | |||
| Pluses loose: | |||
| + Plus 1 | |||
| + Plus 2 | |||
| + Plus 3 | |||
| * * * | |||
| Minuses tight: | |||
| - Minus 1 | |||
| - Minus 2 | |||
| - Minus 3 | |||
| Minuses loose: | |||
| - Minus 1 | |||
| - Minus 2 | |||
| - Minus 3 | |||
| ## Ordered | |||
| Tight: | |||
| 1. First | |||
| 2. Second | |||
| 3. Third | |||
| and: | |||
| 1. One | |||
| 2. Two | |||
| 3. Three | |||
| Loose using tabs: | |||
| 1. First | |||
| 2. Second | |||
| 3. Third | |||
| and using spaces: | |||
| 1. One | |||
| 2. Two | |||
| 3. Three | |||
| Multiple paragraphs: | |||
| 1. Item 1, graf one. | |||
| Item 2. graf two. The quick brown fox jumped over the lazy dog's | |||
| back. | |||
| 2. Item 2. | |||
| 3. Item 3. | |||
| ## Nested | |||
| * Tab | |||
| * Tab | |||
| * Tab | |||
| Here's another: | |||
| 1. First | |||
| 2. Second: | |||
| * Fee | |||
| * Fie | |||
| * Foe | |||
| 3. Third | |||
| Same thing but with paragraphs: | |||
| 1. First | |||
| 2. Second: | |||
| * Fee | |||
| * Fie | |||
| * Foe | |||
| 3. Third | |||
| This was an error in Markdown 1.0.1: | |||
| * this | |||
| * sub | |||
| that | |||
| @ -0,0 +1,148 @@ | |||
| <h2>Unordered</h2> | |||
| <p>Asterisks tight:</p> | |||
| <ul> | |||
| <li>asterisk 1</li> | |||
| <li>asterisk 2</li> | |||
| <li>asterisk 3</li> | |||
| </ul> | |||
| <p>Asterisks loose:</p> | |||
| <ul> | |||
| <li><p>asterisk 1</p></li> | |||
| <li><p>asterisk 2</p></li> | |||
| <li><p>asterisk 3</p></li> | |||
| </ul> | |||
| <hr /> | |||
| <p>Pluses tight:</p> | |||
| <ul> | |||
| <li>Plus 1</li> | |||
| <li>Plus 2</li> | |||
| <li>Plus 3</li> | |||
| </ul> | |||
| <p>Pluses loose:</p> | |||
| <ul> | |||
| <li><p>Plus 1</p></li> | |||
| <li><p>Plus 2</p></li> | |||
| <li><p>Plus 3</p></li> | |||
| </ul> | |||
| <hr /> | |||
| <p>Minuses tight:</p> | |||
| <ul> | |||
| <li>Minus 1</li> | |||
| <li>Minus 2</li> | |||
| <li>Minus 3</li> | |||
| </ul> | |||
| <p>Minuses loose:</p> | |||
| <ul> | |||
| <li><p>Minus 1</p></li> | |||
| <li><p>Minus 2</p></li> | |||
| <li><p>Minus 3</p></li> | |||
| </ul> | |||
| <h2>Ordered</h2> | |||
| <p>Tight:</p> | |||
| <ol> | |||
| <li>First</li> | |||
| <li>Second</li> | |||
| <li>Third</li> | |||
| </ol> | |||
| <p>and:</p> | |||
| <ol> | |||
| <li>One</li> | |||
| <li>Two</li> | |||
| <li>Three</li> | |||
| </ol> | |||
| <p>Loose using tabs:</p> | |||
| <ol> | |||
| <li><p>First</p></li> | |||
| <li><p>Second</p></li> | |||
| <li><p>Third</p></li> | |||
| </ol> | |||
| <p>and using spaces:</p> | |||
| <ol> | |||
| <li><p>One</p></li> | |||
| <li><p>Two</p></li> | |||
| <li><p>Three</p></li> | |||
| </ol> | |||
| <p>Multiple paragraphs:</p> | |||
| <ol> | |||
| <li><p>Item 1, graf one.</p> | |||
| <p>Item 2. graf two. The quick brown fox jumped over the lazy dog's | |||
| back.</p></li> | |||
| <li><p>Item 2.</p></li> | |||
| <li><p>Item 3.</p></li> | |||
| </ol> | |||
| <h2>Nested</h2> | |||
| <ul> | |||
| <li>Tab | |||
| <ul> | |||
| <li>Tab | |||
| <ul> | |||
| <li>Tab</li> | |||
| </ul></li> | |||
| </ul></li> | |||
| </ul> | |||
| <p>Here's another:</p> | |||
| <ol> | |||
| <li>First</li> | |||
| <li>Second: | |||
| <ul> | |||
| <li>Fee</li> | |||
| <li>Fie</li> | |||
| <li>Foe</li> | |||
| </ul></li> | |||
| <li>Third</li> | |||
| </ol> | |||
| <p>Same thing but with paragraphs:</p> | |||
| <ol> | |||
| <li><p>First</p></li> | |||
| <li><p>Second:</p> | |||
| <ul> | |||
| <li>Fee</li> | |||
| <li>Fie</li> | |||
| <li>Foe</li> | |||
| </ul></li> | |||
| <li><p>Third</p></li> | |||
| </ol> | |||
| <p>This was an error in Markdown 1.0.1:</p> | |||
| <ul> | |||
| <li><p>this</p> | |||
| <ul><li>sub</li></ul> | |||
| <p>that</p></li> | |||
| </ul> | |||
| @ -0,0 +1,7 @@ | |||
| ***This is strong and em.*** | |||
| So is ***this*** word. | |||
| ___This is strong and em.___ | |||
| So is ___this___ word. | |||
| @ -0,0 +1,7 @@ | |||
| <p><strong><em>This is strong and em.</em></strong></p> | |||
| <p>So is <strong><em>this</em></strong> word.</p> | |||
| <p><strong><em>This is strong and em.</em></strong></p> | |||
| <p>So is <strong><em>this</em></strong> word.</p> | |||
| @ -0,0 +1,21 @@ | |||
| + this is a list item | |||
| indented with tabs | |||
| + this is a list item | |||
| indented with spaces | |||
| Code: | |||
| this code block is indented by one tab | |||
| And: | |||
| this code block is indented by two tabs | |||
| And: | |||
| + this is an example list item | |||
| indented with tabs | |||
| + this is an example list item | |||
| indented with spaces | |||
| @ -0,0 +1,25 @@ | |||
| <ul> | |||
| <li><p>this is a list item | |||
| indented with tabs</p></li> | |||
| <li><p>this is a list item | |||
| indented with spaces</p></li> | |||
| </ul> | |||
| <p>Code:</p> | |||
| <pre><code>this code block is indented by one tab | |||
| </code></pre> | |||
| <p>And:</p> | |||
| <pre><code> this code block is indented by two tabs | |||
| </code></pre> | |||
| <p>And:</p> | |||
| <pre><code>+ this is an example list item | |||
| indented with tabs | |||
| + this is an example list item | |||
| indented with spaces | |||
| </code></pre> | |||
| @ -0,0 +1,5 @@ | |||
| > A list within a blockquote: | |||
| > | |||
| > * asterisk 1 | |||
| > * asterisk 2 | |||
| > * asterisk 3 | |||
| @ -0,0 +1,8 @@ | |||
| <blockquote> | |||
| <p>A list within a blockquote:</p> | |||
| <ul> | |||
| <li>asterisk 1</li> | |||
| <li>asterisk 2</li> | |||
| <li>asterisk 3</li> | |||
| </ul> | |||
| </blockquote> | |||
| @ -0,0 +1,31 @@ | |||
| Some text about HTML, SGML and HTML4. | |||
| Let's talk about the U.S.A., (É.U. or É.-U. d'A. in French). | |||
| *[HTML4]: Hyper Text Markup Language version 4 | |||
| *[HTML]: Hyper Text Markup Language | |||
| *[SGML]: Standard Generalized Markup Language | |||
| *[U.S.A.]: United States of America | |||
| *[É.U.] : États-Unis d'Amérique | |||
| *[É.-U. d'A.] : États-Unis d'Amérique | |||
| And here we have a CD, some CDs, and some other CD's. | |||
| *[CD]: Compact Disk | |||
| Let's transfert documents through TCP/IP, using TCP packets. | |||
| *[IP]: Internet Protocol | |||
| *[TCP]: Transmission Control Protocol | |||
| --- | |||
| Bienvenue sur [CMS](http://www.bidulecms.com "Bidule CMS"). | |||
| *[CMS]: Content Management System | |||
| --- | |||
| ATCCE | |||
| *[ATCCE]: Abbreviation "Testing" Correct 'Character' < Escapes > | |||
| @ -0,0 +1,15 @@ | |||
| <p>Some text about <abbr title="Hyper Text Markup Language">HTML</abbr>, <abbr title="Standard Generalized Markup Language">SGML</abbr> and <abbr title="Hyper Text Markup Language version 4">HTML4</abbr>.</p> | |||
| <p>Let's talk about the <abbr title="United States of America">U.S.A.</abbr>, (<abbr title="États-Unis d'Amérique">É.U.</abbr> or <abbr title="États-Unis d'Amérique">É.-U. d'A.</abbr> in French).</p> | |||
| <p>And here we have a <abbr title="Compact Disk">CD</abbr>, some CDs, and some other <abbr title="Compact Disk">CD</abbr>'s.</p> | |||
| <p>Let's transfert documents through <abbr title="Transmission Control Protocol">TCP</abbr>/<abbr title="Internet Protocol">IP</abbr>, using <abbr title="Transmission Control Protocol">TCP</abbr> packets.</p> | |||
| <hr /> | |||
| <p>Bienvenue sur <a href="http://www.bidulecms.com" title="Bidule CMS"><abbr title="Content Management System">CMS</abbr></a>.</p> | |||
| <hr /> | |||
| <p><abbr title="Abbreviation "Testing" Correct 'Character' < Escapes >">ATCCE</abbr></p> | |||
| @ -0,0 +1,69 @@ | |||
| ``` .html | |||
| <ul> | |||
| <li>Code block first in file</li> | |||
| <li>doesn't work under some circumstances</li> | |||
| </ul> | |||
| ``` | |||
| As above: checking for bad interractions with the HTML block parser: | |||
| ``` html | |||
| <div> | |||
| ``` | |||
| Some *markdown* `formatting`. | |||
| ``` html | |||
| </div> | |||
| ``` | |||
| Some *markdown* | |||
| ``` | |||
| <div> | |||
| <html> | |||
| ``` | |||
| ``` | |||
| function test(); | |||
| ``` | |||
| <div markdown="1"> | |||
| <html> | |||
| <title> | |||
| </div> | |||
| <div markdown="1"> | |||
| ``` | |||
| <html> | |||
| <title> | |||
| ``` | |||
| </div> | |||
| Two code blocks with no blank line between them: | |||
| ``` | |||
| <div> | |||
| ``` | |||
| ``` | |||
| <div> | |||
| ``` | |||
| Testing *confusion* with code spans at the HTML block parser: | |||
| ``` | |||
| <div>```</div> | |||
| ``` | |||
| Testing mixing with title code blocks | |||
| ``` | |||
| <p>``` | |||
| ~~~ | |||
| <p>``` | |||
| ``` | |||
| ~~~ | |||
| <p>``` | |||
| ``` | |||
| <p>``` | |||
| ~~~ | |||
| @ -0,0 +1,61 @@ | |||
| <pre><code class="html"><ul> | |||
| <li>Code block first in file</li> | |||
| <li>doesn't work under some circumstances</li> | |||
| </ul> | |||
| </code></pre> | |||
| <p>As above: checking for bad interractions with the HTML block parser:</p> | |||
| <pre><code class="html"><div> | |||
| </code></pre> | |||
| <p>Some <em>markdown</em><code>formatting</code>.</p> | |||
| <pre><code class="html"></div> | |||
| </code></pre> | |||
| <p>Some <em>markdown</em></p> | |||
| <pre><code><div> | |||
| <html> | |||
| </code></pre> | |||
| <pre><code>function test(); | |||
| </code></pre> | |||
| <div> | |||
| <pre><code><html> | |||
| <title> | |||
| </code></pre> | |||
| </div> | |||
| <div> | |||
| <pre><code><html> | |||
| <title> | |||
| </code></pre> | |||
| </div> | |||
| <p>Two code blocks with no blank line between them:</p> | |||
| <pre><code><div> | |||
| </code></pre> | |||
| <pre><code><div> | |||
| </code></pre> | |||
| <p>Testing <em>confusion</em> with code spans at the HTML block parser:</p> | |||
| <pre><code><div>```</div> | |||
| </code></pre> | |||
| <p>Testing mixing with title code blocks</p> | |||
| <pre><code><p>``` | |||
| ~~~ | |||
| <p>``` | |||
| </code></pre> | |||
| <pre><code><p>``` | |||
| ``` | |||
| <p>``` | |||
| </code></pre> | |||
| @ -0,0 +1,123 @@ | |||
| ``` | |||
| <Fenced> | |||
| ``` | |||
| Code block starting and ending with empty lines: | |||
| ``` | |||
| <Fenced> | |||
| ``` | |||
| Indented code block containing fenced code block sample: | |||
| ``` | |||
| <Fenced> | |||
| ``` | |||
| Fenced code block with indented code block sample: | |||
| ``` | |||
| Some text | |||
| Indented code block sample code | |||
| ``` | |||
| Fenced code block with long markers: | |||
| `````````````````` | |||
| Fenced | |||
| `````````````````` | |||
| Fenced code block with fenced code block markers of different length in it: | |||
| ```` | |||
| In code block | |||
| ``` | |||
| Still in code block | |||
| ````` | |||
| Still in code block | |||
| ```` | |||
| Fenced code block with Markdown header and horizontal rule: | |||
| ``` | |||
| #test | |||
| --- | |||
| ``` | |||
| Fenced code block with link definitions, footnote definition and | |||
| abbreviation definitions: | |||
| ``` | |||
| [example]: http://example.com/ | |||
| [^1]: Footnote def | |||
| *[HTML]: HyperText Markup Language | |||
| ``` | |||
| * In a list item with smalish indent: | |||
| ````` | |||
| #!/bin/sh | |||
| # | |||
| # Preload driver binary | |||
| LD_PRELOAD=libusb-driver.so $0.bin $* | |||
| ````` | |||
| With HTML content. | |||
| ````` | |||
| <b>bold</b> | |||
| ````` | |||
| Bug with block level elements in this case: | |||
| ``` | |||
| <div> | |||
| </div> | |||
| ``` | |||
| Indented code block of a fenced code block: | |||
| ``` | |||
| haha! | |||
| ``` | |||
| With class: | |||
| `````html | |||
| <b>bold</b> | |||
| ````` | |||
| ````` html | |||
| <b>bold</b> | |||
| ````` | |||
| `````.html | |||
| <b>bold</b> | |||
| ````` | |||
| ````` .html | |||
| <b>bold</b> | |||
| ````` | |||
| With extra attribute block: | |||
| `````{.html} | |||
| <b>bold</b> | |||
| ````` | |||
| ````` {.html #codeid} | |||
| <b>bold</b> | |||
| ````` | |||
| ````` .html{.bold} | |||
| <div> | |||
| ````` | |||
| `````` .html {#codeid} | |||
| </div> | |||
| `````` | |||
| @ -0,0 +1,109 @@ | |||
| <pre><code><Fenced> | |||
| </code></pre> | |||
| <p>Code block starting and ending with empty lines:</p> | |||
| <pre><code><br /><br /><Fenced> | |||
| </code></pre> | |||
| <p>Indented code block containing fenced code block sample:</p> | |||
| <pre><code>``` | |||
| <Fenced> | |||
| ``` | |||
| </code></pre> | |||
| <p>Fenced code block with indented code block sample:</p> | |||
| <pre><code>Some text | |||
| Indented code block sample code | |||
| </code></pre> | |||
| <p>Fenced code block with long markers:</p> | |||
| <pre><code>Fenced | |||
| </code></pre> | |||
| <p>Fenced code block with fenced code block markers of different length in it:</p> | |||
| <pre><code>In code block | |||
| ``` | |||
| Still in code block | |||
| ````` | |||
| Still in code block | |||
| </code></pre> | |||
| <p>Fenced code block with Markdown header and horizontal rule:</p> | |||
| <pre><code>#test | |||
| --- | |||
| </code></pre> | |||
| <p>Fenced code block with link definitions, footnote definition and | |||
| abbreviation definitions:</p> | |||
| <pre><code>[example]: http://example.com/ | |||
| [^1]: Footnote def | |||
| *[HTML]: HyperText Markup Language | |||
| </code></pre> | |||
| <ul> | |||
| <li><p>In a list item with smalish indent:</p> | |||
| <pre><code>#!/bin/sh | |||
| # | |||
| # Preload driver binary | |||
| LD_PRELOAD=libusb-driver.so $0.bin $* | |||
| </code></pre> | |||
| </li> | |||
| </ul> | |||
| <p>With HTML content.</p> | |||
| <pre><code><b>bold</b> | |||
| </code></pre> | |||
| <p>Bug with block level elements in this case:</p> | |||
| <pre><code> <div> | |||
| </div> | |||
| </code></pre> | |||
| <p>Indented code block of a fenced code block:</p> | |||
| <pre><code>``` | |||
| haha! | |||
| ``` | |||
| </code></pre> | |||
| <p>With class:</p> | |||
| <pre><code class="html"><b>bold</b> | |||
| </code></pre> | |||
| <pre><code class="html"><b>bold</b> | |||
| </code></pre> | |||
| <pre><code class="html"><b>bold</b> | |||
| </code></pre> | |||
| <pre><code class="html"><b>bold</b> | |||
| </code></pre> | |||
| <p>With extra attribute block:</p> | |||
| <pre><code class="html"><b>bold</b> | |||
| </code></pre> | |||
| <pre><code class="html" id="codeid"><b>bold</b> | |||
| </code></pre> | |||
| <pre><code class="html bold"><div> | |||
| </code></pre> | |||
| <pre><code class="html" id="codeid"></div> | |||
| </code></pre> | |||
| @ -0,0 +1,115 @@ | |||
| A simple definition list: | |||
| Term 1 | |||
| : Definition 1 | |||
| Term 2 | |||
| : Definition 2 | |||
| With multiple terms: | |||
| Term 1 | |||
| Term 2 | |||
| : Definition 1 | |||
| Term 3 | |||
| Term 4 | |||
| : Definition 2 | |||
| With multiple definitions: | |||
| Term 1 | |||
| : Definition 1 | |||
| : Definition 2 | |||
| Term 2 | |||
| : Definition 3 | |||
| : Definition 4 | |||
| With multiple lines per definition: | |||
| Term 1 | |||
| : Definition 1 line 1 ... | |||
| Definition 1 line 2 | |||
| : Definition 2 line 1 ... | |||
| Definition 2 line 2 | |||
| Term 2 | |||
| : Definition 3 line 2 ... | |||
| Definition 3 line 2 | |||
| : Definition 4 line 2 ... | |||
| Definition 4 line 2 | |||
| With paragraphs: | |||
| Term 1 | |||
| : Definition 1 (paragraph) | |||
| Term 2 | |||
| : Definition 2 (paragraph) | |||
| With multiple paragraphs: | |||
| Term 1 | |||
| : Definition 1 paragraph 1 line 1 ... | |||
| Definition 1 paragraph 1 line 2 | |||
| Definition 1 paragraph 2 line 1 ... | |||
| Definition 1 paragraph 2 line 2 | |||
| Term 2 | |||
| : Definition 1 paragraph 1 line 1 ... | |||
| Definition 1 paragraph 1 line 2 (lazy) | |||
| Definition 1 paragraph 2 line 1 ... | |||
| Definition 1 paragraph 2 line 2 (lazy) | |||
| * * * | |||
| A mix: | |||
| Term 1 | |||
| Term 2 | |||
| : Definition 1 paragraph 1 line 1 ... | |||
| Definition 1 paragraph 1 line 2 (lazy) | |||
| Definition 1 paragraph 2 line 1 ... | |||
| Definition 1 paragraph 2 line 2 | |||
| : Definition 2 paragraph 1 line 1 ... | |||
| Definition 2 paragraph 1 line 2 (lazy) | |||
| Term 3 | |||
| : Definition 3 (no paragraph) | |||
| : Definition 4 (no paragraph) | |||
| : Definition 5 line 1 ... | |||
| Definition 5 line 2 (no paragraph) | |||
| : Definition 6 paragraph 1 line 1 ... | |||
| Definition 6 paragraph 1 line 2 | |||
| : Definition 7 (no paragraph) | |||
| : Definition 8 paragraph 1 line 1 (forced paragraph) ... | |||
| Definition 8 paragraph 1 line 2 | |||
| Definition 8 paragraph 2 line 1 | |||
| Term 4 | |||
| : Definition 9 paragraph 1 line 1 (forced paragraph) ... | |||
| Definition 9 paragraph 1 line 2 | |||
| Definition 9 paragraph 2 line 1 | |||
| : Definition 10 (no paragraph) | |||
| * * * | |||
| Special cases: | |||
| Term | |||
| : code block | |||
| as first element of a definition | |||
| @ -0,0 +1,155 @@ | |||
| <p>A simple definition list:</p> | |||
| <dl> | |||
| <dt>Term 1</dt> | |||
| <dd>Definition 1</dd> | |||
| <dt>Term 2</dt> | |||
| <dd>Definition 2</dd> | |||
| </dl> | |||
| <p>With multiple terms:</p> | |||
| <dl> | |||
| <dt>Term 1</dt> | |||
| <dt>Term 2</dt> | |||
| <dd>Definition 1</dd> | |||
| <dt>Term 3</dt> | |||
| <dt>Term 4</dt> | |||
| <dd>Definition 2</dd> | |||
| </dl> | |||
| <p>With multiple definitions:</p> | |||
| <dl> | |||
| <dt>Term 1</dt> | |||
| <dd>Definition 1</dd> | |||
| <dd>Definition 2</dd> | |||
| <dt>Term 2</dt> | |||
| <dd>Definition 3</dd> | |||
| <dd>Definition 4</dd> | |||
| </dl> | |||
| <p>With multiple lines per definition:</p> | |||
| <dl> | |||
| <dt>Term 1</dt> | |||
| <dd>Definition 1 line 1 ... | |||
| Definition 1 line 2</dd> | |||
| <dd>Definition 2 line 1 ... | |||
| Definition 2 line 2</dd> | |||
| <dt>Term 2</dt> | |||
| <dd>Definition 3 line 2 ... | |||
| Definition 3 line 2</dd> | |||
| <dd>Definition 4 line 2 ... | |||
| Definition 4 line 2</dd> | |||
| </dl> | |||
| <p>With paragraphs:</p> | |||
| <dl> | |||
| <dt>Term 1</dt> | |||
| <dd> | |||
| <p>Definition 1 (paragraph)</p> | |||
| </dd> | |||
| <dt>Term 2</dt> | |||
| <dd> | |||
| <p>Definition 2 (paragraph)</p> | |||
| </dd> | |||
| </dl> | |||
| <p>With multiple paragraphs:</p> | |||
| <dl> | |||
| <dt>Term 1</dt> | |||
| <dd> | |||
| <p>Definition 1 paragraph 1 line 1 ... | |||
| Definition 1 paragraph 1 line 2</p> | |||
| <p>Definition 1 paragraph 2 line 1 ... | |||
| Definition 1 paragraph 2 line 2</p> | |||
| </dd> | |||
| <dt>Term 2</dt> | |||
| <dd> | |||
| <p>Definition 1 paragraph 1 line 1 ... | |||
| Definition 1 paragraph 1 line 2 (lazy)</p> | |||
| <p>Definition 1 paragraph 2 line 1 ... | |||
| Definition 1 paragraph 2 line 2 (lazy)</p> | |||
| </dd> | |||
| </dl> | |||
| <hr /> | |||
| <p>A mix:</p> | |||
| <dl> | |||
| <dt>Term 1</dt> | |||
| <dt>Term 2</dt> | |||
| <dd> | |||
| <p>Definition 1 paragraph 1 line 1 ... | |||
| Definition 1 paragraph 1 line 2 (lazy)</p> | |||
| <p>Definition 1 paragraph 2 line 1 ... | |||
| Definition 1 paragraph 2 line 2</p> | |||
| </dd> | |||
| <dd> | |||
| <p>Definition 2 paragraph 1 line 1 ... | |||
| Definition 2 paragraph 1 line 2 (lazy)</p> | |||
| </dd> | |||
| <dt>Term 3</dt> | |||
| <dd>Definition 3 (no paragraph)</dd> | |||
| <dd>Definition 4 (no paragraph)</dd> | |||
| <dd>Definition 5 line 1 ... | |||
| Definition 5 line 2 (no paragraph)</dd> | |||
| <dd> | |||
| <p>Definition 6 paragraph 1 line 1 ... | |||
| Definition 6 paragraph 1 line 2</p> | |||
| </dd> | |||
| <dd>Definition 7 (no paragraph)</dd> | |||
| <dd> | |||
| <p>Definition 8 paragraph 1 line 1 (forced paragraph) ... | |||
| Definition 8 paragraph 1 line 2</p> | |||
| <p>Definition 8 paragraph 2 line 1</p> | |||
| </dd> | |||
| <dt>Term 4</dt> | |||
| <dd> | |||
| <p>Definition 9 paragraph 1 line 1 (forced paragraph) ... | |||
| Definition 9 paragraph 1 line 2</p> | |||
| <p>Definition 9 paragraph 2 line 1</p> | |||
| </dd> | |||
| <dd>Definition 10 (no paragraph)</dd> | |||
| </dl> | |||
| <hr /> | |||
| <p>Special cases:</p> | |||
| <dl> | |||
| <dt>Term</dt> | |||
| <dd> | |||
| <pre><code>code block | |||
| as first element of a definition | |||
| </code></pre> | |||
| </dd> | |||
| </dl> | |||
| @ -0,0 +1,100 @@ | |||
| Combined emphasis: | |||
| 1. ***test test*** | |||
| 2. ___test test___ | |||
| 3. *test **test*** | |||
| 4. **test *test*** | |||
| 5. ***test* test** | |||
| 6. ***test** test* | |||
| 7. ***test* test** | |||
| 8. **test *test*** | |||
| 9. *test **test*** | |||
| 10. _test __test___ | |||
| 11. __test _test___ | |||
| 12. ___test_ test__ | |||
| 13. ___test__ test_ | |||
| 14. ___test_ test__ | |||
| 15. __test _test___ | |||
| 16. _test __test___ | |||
| 17. *test __test__* | |||
| 18. **test _test_** | |||
| 19. **_test_ test** | |||
| 20. *__test__ test* | |||
| 21. **_test_ test** | |||
| 22. **test _test_** | |||
| 23. *test __test__* | |||
| 24. _test **test**_ | |||
| 25. __test *test*__ | |||
| 26. __*test* test__ | |||
| 27. _**test** test_ | |||
| 28. __*test* test__ | |||
| 29. __test *test*__ | |||
| 30. _test **test**_ | |||
| Incorrect nesting: | |||
| 1. *test **test* test** | |||
| 2. _test __test_ test__ | |||
| 3. **test *test** test* | |||
| 4. __test _test__ test_ | |||
| 5. *test *test* test* | |||
| 6. _test _test_ test_ | |||
| 7. **test **test** test** | |||
| 8. __test __test__ test__ | |||
| 9. _**some text_** | |||
| 10. *__some text*__ | |||
| 11. **_some text**_ | |||
| 12. *__some text*__ | |||
| No emphasis: | |||
| 1. test* test *test | |||
| 2. test** test **test | |||
| 3. test_ test _test | |||
| 4. test__ test __test | |||
| Middle-word emphasis (asterisks): | |||
| 1. *a*b | |||
| 2. a*b* | |||
| 3. a*b*c | |||
| 4. **a**b | |||
| 5. a**b** | |||
| 6. a**b**c | |||
| Middle-word emphasis (underscore): | |||
| 1. _a_b | |||
| 2. a_b_ | |||
| 3. a_b_c | |||
| 4. __a__b | |||
| 5. a__b__ | |||
| 6. a__b__c | |||
| my_precious_file.txt | |||
| ## Tricky Cases | |||
| E**. **Test** TestTestTest | |||
| E**. **Test** Test Test Test | |||
| ## Overlong emphasis | |||
| Name: ____________ | |||
| Organization: ____ | |||
| Region/Country: __ | |||
| _____Cut here_____ | |||
| ____Cut here____ | |||
| # Regression | |||
| _**Note**_: This _is emphasis_. | |||
| @ -0,0 +1,106 @@ | |||
| <p>Combined emphasis:</p> | |||
| <ol> | |||
| <li><strong><em>test test</em></strong></li> | |||
| <li><strong><em>test test</em></strong></li> | |||
| <li><em>test <strong>test</strong></em></li> | |||
| <li><strong>test <em>test</em></strong></li> | |||
| <li><strong><em>test</em> test</strong></li> | |||
| <li><em><strong>test</strong> test</em></li> | |||
| <li><strong><em>test</em> test</strong></li> | |||
| <li><strong>test <em>test</em></strong></li> | |||
| <li><em>test <strong>test</strong></em></li> | |||
| <li><em>test <strong>test</strong></em></li> | |||
| <li><strong>test <em>test</em></strong></li> | |||
| <li><strong><em>test</em> test</strong></li> | |||
| <li><em><strong>test</strong> test</em></li> | |||
| <li><strong><em>test</em> test</strong></li> | |||
| <li><strong>test <em>test</em></strong></li> | |||
| <li><em>test <strong>test</strong></em></li> | |||
| <li><em>test <strong>test</strong></em></li> | |||
| <li><strong>test <em>test</em></strong></li> | |||
| <li><strong><em>test</em> test</strong></li> | |||
| <li><em><strong>test</strong> test</em></li> | |||
| <li><strong><em>test</em> test</strong></li> | |||
| <li><strong>test <em>test</em></strong></li> | |||
| <li><em>test <strong>test</strong></em></li> | |||
| <li><em>test <strong>test</strong></em></li> | |||
| <li><strong>test <em>test</em></strong></li> | |||
| <li><strong><em>test</em> test</strong></li> | |||
| <li><em><strong>test</strong> test</em></li> | |||
| <li><strong><em>test</em> test</strong></li> | |||
| <li><strong>test <em>test</em></strong></li> | |||
| <li><em>test <strong>test</strong></em></li> | |||
| </ol> | |||
| <p>Incorrect nesting:</p> | |||
| <ol> | |||
| <li>*test <strong>test* test</strong></li> | |||
| <li>_test <strong>test_ test</strong></li> | |||
| <li><strong>test *test</strong> test*</li> | |||
| <li><strong>test _test</strong> test_</li> | |||
| <li><em>test *test</em> test*</li> | |||
| <li><em>test _test</em> test_</li> | |||
| <li><strong>test **test</strong> test**</li> | |||
| <li><strong>test __test</strong> test__</li> | |||
| <li>_<strong>some text_</strong></li> | |||
| <li>*<strong>some text*</strong></li> | |||
| <li><strong>_some text</strong>_</li> | |||
| <li>*<strong>some text*</strong></li> | |||
| </ol> | |||
| <p>No emphasis:</p> | |||
| <ol> | |||
| <li>test* test *test</li> | |||
| <li>test** test **test</li> | |||
| <li>test_ test _test</li> | |||
| <li>test__ test __test</li> | |||
| </ol> | |||
| <p>Middle-word emphasis (asterisks):</p> | |||
| <ol> | |||
| <li><em>a</em>b</li> | |||
| <li>a<em>b</em></li> | |||
| <li>a<em>b</em>c</li> | |||
| <li><strong>a</strong>b</li> | |||
| <li>a<strong>b</strong></li> | |||
| <li>a<strong>b</strong>c</li> | |||
| </ol> | |||
| <p>Middle-word emphasis (underscore):</p> | |||
| <ol> | |||
| <li>_a_b</li> | |||
| <li>a_b_</li> | |||
| <li>a_b_c</li> | |||
| <li>__a__b</li> | |||
| <li>a__b__</li> | |||
| <li>a__b__c</li> | |||
| </ol> | |||
| <p>my_precious_file.txt</p> | |||
| <h2>Tricky Cases</h2> | |||
| <p>E**. <strong>Test</strong> TestTestTest</p> | |||
| <p>E**. <strong>Test</strong> Test Test Test</p> | |||
| <h2>Overlong emphasis</h2> | |||
| <p>Name: ____________<br /> | |||
| Organization: ____<br /> | |||
| Region/Country: __</p> | |||
| <p>_____Cut here_____</p> | |||
| <p>____Cut here____</p> | |||
| <h1>Regression</h1> | |||
| <p><em><strong>Note</strong></em>: This <em>is emphasis</em>.</p> | |||
| @ -0,0 +1,70 @@ | |||
| This is the first paragraph.[^first] | |||
| [^first]: This is the first note. | |||
| * List item one.[^second] | |||
| * List item two.[^third] | |||
| [^third]: This is the third note, defined out of order. | |||
| [^second]: This is the second note. | |||
| [^fourth]: This is the fourth note. | |||
| # Header[^fourth] | |||
| Some paragraph with a footnote[^1], and another[^2]. | |||
| [^1]: Content for fifth footnote. | |||
| [^2]: Content for sixth footnote spaning on | |||
| three lines, with some span-level markup like | |||
| _emphasis_, a [link][]. | |||
| [link]: http://michelf.ca/ | |||
| Another paragraph with a named footnote[^fn-name]. | |||
| [^fn-name]: | |||
| Footnote beginning on the line next to the marker. | |||
| This paragraph should not have a footnote marker since | |||
| the footnote is undefined.[^3] | |||
| This paragraph has a second footnote marker to footnote number one.[^1] | |||
| This paragraph links to a footnote with plenty of | |||
| block-level content.[^block] | |||
| [^block]: | |||
| Paragraph. | |||
| * List item | |||
| > Blockquote | |||
| Code block | |||
| This paragraph host the footnote reference within a | |||
| footnote test[^reference]. | |||
| [^reference]: | |||
| This footnote has a footnote of its own.[^nested] | |||
| [^nested]: | |||
| This footnote should appear even though it is referenced | |||
| from another footnote. But [^reference] should be litteral | |||
| since the footnote with that name has already been used. | |||
| - - - | |||
| Testing unusual footnote name[^1$^!"']. | |||
| [^1$^!"']: Haha! | |||
| - - - | |||
| Footnotes mixed with images[^image-mixed] | |||
| ![1800 Travel][img6] | |||
| ![1830 Travel][img7] | |||
| [img6]: images/MGR-1800-travel.jpeg "Travel Speeds in 1800" | |||
| [^image-mixed]: Footnote Content | |||
| [img7]: images/MGR-1830-travel.jpeg "Travel Speeds in 1830" | |||
| @ -0,0 +1,103 @@ | |||
| <p>This is the first paragraph.<sup id="fnref:first"><a href="#fn:first" class="footnote-ref" role="doc-noteref">1</a></sup></p> | |||
| <ul> | |||
| <li>List item one.<sup id="fnref:second"><a href="#fn:second" class="footnote-ref" role="doc-noteref">2</a></sup></li> | |||
| <li>List item two.<sup id="fnref:third"><a href="#fn:third" class="footnote-ref" role="doc-noteref">3</a></sup></li> | |||
| </ul> | |||
| <h1>Header<sup id="fnref:fourth"><a href="#fn:fourth" class="footnote-ref" role="doc-noteref">4</a></sup></h1> | |||
| <p>Some paragraph with a footnote<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">5</a></sup>, and another<sup id="fnref:2"><a href="#fn:2" class="footnote-ref" role="doc-noteref">6</a></sup>.</p> | |||
| <p>Another paragraph with a named footnote<sup id="fnref:fn-name"><a href="#fn:fn-name" class="footnote-ref" role="doc-noteref">7</a></sup>.</p> | |||
| <p>This paragraph should not have a footnote marker since | |||
| the footnote is undefined.[^3]</p> | |||
| <p>This paragraph has a second footnote marker to footnote number one.<sup id="fnref2:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">5</a></sup></p> | |||
| <p>This paragraph links to a footnote with plenty of | |||
| block-level content.<sup id="fnref:block"><a href="#fn:block" class="footnote-ref" role="doc-noteref">8</a></sup></p> | |||
| <p>This paragraph host the footnote reference within a | |||
| footnote test<sup id="fnref:reference"><a href="#fn:reference" class="footnote-ref" role="doc-noteref">9</a></sup>.</p> | |||
| <hr /> | |||
| <p>Testing unusual footnote name<sup id="fnref:1$^!"'"><a href="#fn:1$^!"'" class="footnote-ref" role="doc-noteref">10</a></sup>.</p> | |||
| <hr /> | |||
| <p>Footnotes mixed with images<sup id="fnref:image-mixed"><a class="footnote-ref" role="doc-noteref" href="#fn:image-mixed">11</a></sup><img alt="1800 Travel" src="images/MGR-1800-travel.jpeg" title="Travel Speeds in 1800"/><img alt="1830 Travel" src="images/MGR-1830-travel.jpeg" title="Travel Speeds in 1830"/></p> | |||
| <div class="footnotes" role="doc-endnotes"> | |||
| <hr /> | |||
| <ol> | |||
| <li id="fn:first" role="doc-endnote"> | |||
| <p>This is the first note. <a href="#fnref:first" class="footnote-backref" role="doc-backlink">↩︎</a></p> | |||
| </li> | |||
| <li id="fn:second" role="doc-endnote"> | |||
| <p>This is the second note. <a href="#fnref:second" class="footnote-backref" role="doc-backlink">↩︎</a></p> | |||
| </li> | |||
| <li id="fn:third" role="doc-endnote"> | |||
| <p>This is the third note, defined out of order. <a href="#fnref:third" class="footnote-backref" role="doc-backlink">↩︎</a></p> | |||
| </li> | |||
| <li id="fn:fourth" role="doc-endnote"> | |||
| <p>This is the fourth note. <a href="#fnref:fourth" class="footnote-backref" role="doc-backlink">↩︎</a></p> | |||
| </li> | |||
| <li id="fn:1" role="doc-endnote"> | |||
| <p>Content for fifth footnote. <a href="#fnref:1" class="footnote-backref" role="doc-backlink">↩︎</a> <a href="#fnref2:1" class="footnote-backref" role="doc-backlink">↩︎</a></p> | |||
| </li> | |||
| <li id="fn:2" role="doc-endnote"> | |||
| <p>Content for sixth footnote spaning on | |||
| three lines, with some span-level markup like | |||
| <em>emphasis</em>, a <a href="http://michelf.ca/">link</a>. <a href="#fnref:2" class="footnote-backref" role="doc-backlink">↩︎</a></p> | |||
| </li> | |||
| <li id="fn:fn-name" role="doc-endnote"> | |||
| <p>Footnote beginning on the line next to the marker. <a href="#fnref:fn-name" class="footnote-backref" role="doc-backlink">↩︎</a></p> | |||
| </li> | |||
| <li id="fn:block" role="doc-endnote"> | |||
| <p>Paragraph.</p> | |||
| <ul> | |||
| <li>List item</li> | |||
| </ul> | |||
| <blockquote> | |||
| <p>Blockquote</p> | |||
| </blockquote> | |||
| <pre><code>Code block | |||
| </code></pre> | |||
| <p><a href="#fnref:block" class="footnote-backref" role="doc-backlink">↩︎</a></p> | |||
| </li> | |||
| <li id="fn:reference" role="doc-endnote"> | |||
| <p>This footnote has a footnote of its own.<sup id="fnref:nested"><a href="#fn:nested" class="footnote-ref" role="doc-noteref">12</a></sup> <a href="#fnref:reference" class="footnote-backref" role="doc-backlink">↩︎</a></p> | |||
| </li> | |||
| <li id="fn:1$^!"'" role="doc-endnote"> | |||
| <p>Haha! <a href="#fnref:1$^!"'" class="footnote-backref" role="doc-backlink">↩︎</a></p> | |||
| </li> | |||
| <li id="fn:image-mixed" role="doc-endnote"> | |||
| <p>Footnote Content <a class="footnote-backref" role="doc-backlink" href="#fnref:image-mixed">↩︎</a></p> | |||
| </li> | |||
| <li id="fn:nested" role="doc-endnote"> | |||
| <p>This footnote should appear even though it is referenced | |||
| from another footnote. But [^reference] should be litteral | |||
| since the footnote with that name has already been used. <a href="#fnref:nested" class="footnote-backref" role="doc-backlink">↩︎</a></p> | |||
| </li> | |||
| </ol> | |||
| </div> | |||
| @ -0,0 +1,41 @@ | |||
| Header {#id1} | |||
| ====== | |||
| Header { #id2} | |||
| ------ | |||
| ### Header {#id3 } | |||
| #### Header ## { #id4 } | |||
| - - - | |||
| Header {.cl} | |||
| ====== | |||
| Header { .cl} | |||
| ------ | |||
| ### Header {.cl } | |||
| #### Header ## { .cl } | |||
| - - - | |||
| Header {.cl.class} | |||
| ====== | |||
| Header { .cl .class} | |||
| ------ | |||
| ### Header {.cl .class } | |||
| #### Header ## { .cl.class } | |||
| - - - | |||
| Header {#id5.cl.class} | |||
| ====== | |||
| Header { #id6 .cl .class} | |||
| ------ | |||
| ### Header {.cl.class#id7 } | |||
| #### Header ## { .cl.class#id8 } | |||
| @ -0,0 +1,37 @@ | |||
| <h1 id="id1">Header</h1> | |||
| <h2 id="id2">Header</h2> | |||
| <h3 id="id3">Header</h3> | |||
| <h4 id="id4">Header</h4> | |||
| <hr /> | |||
| <h1 class="cl">Header</h1> | |||
| <h2 class="cl">Header</h2> | |||
| <h3 class="cl">Header</h3> | |||
| <h4 class="cl">Header</h4> | |||
| <hr /> | |||
| <h1 class="cl class">Header</h1> | |||
| <h2 class="cl class">Header</h2> | |||
| <h3 class="cl class">Header</h3> | |||
| <h4 class="cl class">Header</h4> | |||
| <hr /> | |||
| <h1 class="cl class" id="id5">Header</h1> | |||
| <h2 class="cl class" id="id6">Header</h2> | |||
| <h3 class="cl class" id="id7">Header</h3> | |||
| <h4 class="cl class" id="id8">Header</h4> | |||
| @ -0,0 +1,110 @@ | |||
| # Markdown inside code blocks | |||
| <div markdown="1"> | |||
| foo | |||
| </div> | |||
| <div markdown='1'> | |||
| foo | |||
| </div> | |||
| <div markdown=1> | |||
| foo | |||
| </div> | |||
| <table> | |||
| <tr><td markdown="1">test _emphasis_ (span)</td></tr> | |||
| </table> | |||
| <table> | |||
| <tr><td markdown="span">test _emphasis_ (span)</td></tr> | |||
| </table> | |||
| <table> | |||
| <tr><td markdown="block">test _emphasis_ (block)</td></tr> | |||
| </table> | |||
| ## More complicated | |||
| <table> | |||
| <tr><td markdown="1"> | |||
| * this is _not_ a list item</td></tr> | |||
| <tr><td markdown="span"> | |||
| * this is _not_ a list item</td></tr> | |||
| <tr><td markdown="block"> | |||
| * this _is_ a list item | |||
| </td></tr> | |||
| </table> | |||
| ## With indent | |||
| <div> | |||
| <div markdown="1"> | |||
| This text is no code block: if it was, the | |||
| closing `<div>` would be too and the HTML block | |||
| would be invalid. | |||
| Markdown content in HTML blocks is assumed to be | |||
| indented the same as the block opening tag. | |||
| **This should be the third paragraph after the header.** | |||
| </div> | |||
| </div> | |||
| ## Code block with rogue `</div>`s in Markdown code span and block | |||
| <div> | |||
| <div markdown="1"> | |||
| This is a code block however: | |||
| </div> | |||
| Funny isn't it? Here is a code span: `</div>`. | |||
| </div> | |||
| </div> | |||
| <div> | |||
| <div markdown="1"> | |||
| * List item, not a code block | |||
| Some text | |||
| This is a code block. | |||
| </div> | |||
| </div> | |||
| ## No code block in markdown span mode | |||
| <p markdown="1"> | |||
| This is not a code block since Markdown parse paragraph | |||
| content as span. Code spans like `</p>` are allowed though. | |||
| </p> | |||
| <p markdown="1">_Hello_ _world_</p> | |||
| <p markdown="1" class="poem"> | |||
| line 1 | |||
| line 2 | |||
| line 3 | |||
| </p> | |||
| ## Preserving attributes and tags on more than one line: | |||
| <p class="test" markdown="1" | |||
| id="12"> | |||
| Some _span_ content. | |||
| </p> | |||
| ## Header confusion bug | |||
| <table class="canvas"> | |||
| <tr> | |||
| <td id="main" markdown="1">Hello World! | |||
| ============ | |||
| Hello World!</td> | |||
| </tr> | |||
| </table> | |||
| @ -0,0 +1,131 @@ | |||
| <h1>Markdown inside code blocks</h1> | |||
| <div> | |||
| <p>foo</p> | |||
| </div> | |||
| <div> | |||
| <p>foo</p> | |||
| </div> | |||
| <div> | |||
| <p>foo</p> | |||
| </div> | |||
| <table> | |||
| <tr><td>test <em>emphasis</em> (span)</td></tr> | |||
| </table> | |||
| <table> | |||
| <tr><td>test <em>emphasis</em> (span)</td></tr> | |||
| </table> | |||
| <table> | |||
| <tr><td> | |||
| <p>test <em>emphasis</em> (block)</p> | |||
| </td></tr> | |||
| </table> | |||
| <h2>More complicated</h2> | |||
| <table> | |||
| <tr><td> | |||
| * this is <em>not</em> a list item</td></tr> | |||
| <tr><td> | |||
| * this is <em>not</em> a list item</td></tr> | |||
| <tr><td> | |||
| <ul> | |||
| <li>this <em>is</em> a list item</li> | |||
| </ul> | |||
| </td></tr> | |||
| </table> | |||
| <h2>With indent</h2> | |||
| <div> | |||
| <div> | |||
| <p>This text is no code block: if it was, the | |||
| closing <code><div></code> would be too and the HTML block | |||
| would be invalid.</p> | |||
| <p>Markdown content in HTML blocks is assumed to be | |||
| indented the same as the block opening tag.</p> | |||
| <p><strong>This should be the third paragraph after the header.</strong></p> | |||
| </div> | |||
| </div> | |||
| <h2>Code block with rogue <code></div></code>s in Markdown code span and block</h2> | |||
| <div> | |||
| <div> | |||
| <p>This is a code block however:</p> | |||
| <pre><code></div> | |||
| </code></pre> | |||
| <p>Funny isn't it? Here is a code span: <code></div></code>.</p> | |||
| </div> | |||
| </div> | |||
| <div> | |||
| <div> | |||
| <ul> | |||
| <li>List item, not a code block</li> | |||
| </ul> | |||
| <p>Some text</p> | |||
| <pre><code>This is a code block. | |||
| </code></pre> | |||
| </div> | |||
| </div> | |||
| <h2>No code block in markdown span mode</h2> | |||
| <p> | |||
| This is not a code block since Markdown parse paragraph | |||
| content as span. Code spans like <code></p></code> are allowed though. | |||
| </p> | |||
| <p><em>Hello</em> <em>world</em></p> | |||
| <p class="poem"> | |||
| line 1<br /> | |||
| line 2<br /> | |||
| line 3 | |||
| </p> | |||
| <h2>Preserving attributes and tags on more than one line:</h2> | |||
| <p class="test" | |||
| id="12"> | |||
| Some <em>span</em> content. | |||
| </p> | |||
| <h2>Header confusion bug</h2> | |||
| <table class="canvas"> | |||
| <tr> | |||
| <td id="main">Hello World! | |||
| ============ | |||
| Hello World!</td> | |||
| </tr> | |||
| </table> | |||
| @ -0,0 +1,10 @@ | |||
| This is an [inline link](/url "title"){.class #inline-link}. | |||
| This is a [reference link][refid]. | |||
| This is an {.class #inline-img}. | |||
| This is a ![reference image][refid]. | |||
| [refid]: /path/to/something (Title) { .class #ref data-key=val } | |||
| @ -0,0 +1,8 @@ | |||
| <p>This is an <a href="/url" title="title" class="class" id="inline-link">inline link</a>.</p> | |||
| <p>This is a <a href="/path/to/something" title="Title" class="class" id="ref" data-key="val">reference link</a>.</p> | |||
| <p>This is an <img alt="inline image" src="/img" title="title" class="class" id="inline-img" />.</p> | |||
| <p>This is a <img alt="reference image" src="/path/to/something" title="Title" class="class" id="ref" data-key="val" />.</p> | |||
| @ -0,0 +1,113 @@ | |||
| # Simple tables | |||
| Header 1 | Header 2 | |||
| --------- | --------- | |||
| Cell 1 | Cell 2 | |||
| Cell 3 | Cell 4 | |||
| With leading pipes: | |||
| | Header 1 | Header 2 | |||
| | --------- | --------- | |||
| | Cell 1 | Cell 2 | |||
| | Cell 3 | Cell 4 | |||
| With tailing pipes: | |||
| Header 1 | Header 2 | | |||
| --------- | --------- | | |||
| Cell 1 | Cell 2 | | |||
| Cell 3 | Cell 4 | | |||
| With leading and tailing pipes: | |||
| | Header 1 | Header 2 | | |||
| | --------- | --------- | | |||
| | Cell 1 | Cell 2 | | |||
| | Cell 3 | Cell 4 | | |||
| * * * | |||
| # One-column one-row table | |||
| With leading pipes: | |||
| | Header | |||
| | ------- | |||
| | Cell | |||
| With tailing pipes: | |||
| Header | | |||
| ------- | | |||
| Cell | | |||
| With leading and tailing pipes: | |||
| | Header | | |||
| | ------- | | |||
| | Cell | | |||
| * * * | |||
| Table alignement: | |||
| | Default | Right | Center | Left | | |||
| | --------- |:--------- |:---------:| ---------:| | |||
| | Long Cell | Long Cell | Long Cell | Long Cell | | |||
| | Cell | Cell | Cell | Cell | | |||
| Table alignement (alternate spacing): | |||
| | Default | Right | Center | Left | | |||
| | --------- | :-------- | :-------: | --------: | | |||
| | Long Cell | Long Cell | Long Cell | Long Cell | | |||
| | Cell | Cell | Cell | Cell | | |||
| * * * | |||
| # Empty cells | |||
| | Header 1 | Header 2 | | |||
| | --------- | --------- | | |||
| | A | B | | |||
| | C | | | |||
| Header 1 | Header 2 | |||
| --------- | --------- | |||
| A | B | |||
| | D | |||
| * * * | |||
| # Missing tailing pipe | |||
| Header 1 | Header 2 | |||
| --------- | --------- | | |||
| Cell | Cell | | |||
| Cell | Cell | | |||
| Header 1 | Header 2 | | |||
| --------- | --------- | |||
| Cell | Cell | | |||
| Cell | Cell | | |||
| Header 1 | Header 2 | | |||
| --------- | --------- | | |||
| Cell | Cell | |||
| Cell | Cell | | |||
| Header 1 | Header 2 | | |||
| --------- | --------- | | |||
| Cell | Cell | | |||
| Cell | Cell | |||
| * * * | |||
| # Too many pipes in rows | |||
| | Header 1 | Header 2 | | |||
| | --------- | |||
| | Cell | Cell | Extra cell? | | |||
| | Cell | Cell | Extra cell? | | |||
| @ -0,0 +1,333 @@ | |||
| <h1>Simple tables</h1> | |||
| <table> | |||
| <thead> | |||
| <tr> | |||
| <th>Header 1</th> | |||
| <th>Header 2</th> | |||
| </tr> | |||
| </thead> | |||
| <tbody> | |||
| <tr> | |||
| <td>Cell 1</td> | |||
| <td>Cell 2</td> | |||
| </tr> | |||
| <tr> | |||
| <td>Cell 3</td> | |||
| <td>Cell 4</td> | |||
| </tr> | |||
| </tbody> | |||
| </table> | |||
| <p>With leading pipes:</p> | |||
| <table> | |||
| <thead> | |||
| <tr> | |||
| <th>Header 1</th> | |||
| <th>Header 2</th> | |||
| </tr> | |||
| </thead> | |||
| <tbody> | |||
| <tr> | |||
| <td>Cell 1</td> | |||
| <td>Cell 2</td> | |||
| </tr> | |||
| <tr> | |||
| <td>Cell 3</td> | |||
| <td>Cell 4</td> | |||
| </tr> | |||
| </tbody> | |||
| </table> | |||
| <p>With tailing pipes:</p> | |||
| <table> | |||
| <thead> | |||
| <tr> | |||
| <th>Header 1</th> | |||
| <th>Header 2</th> | |||
| </tr> | |||
| </thead> | |||
| <tbody> | |||
| <tr> | |||
| <td>Cell 1</td> | |||
| <td>Cell 2</td> | |||
| </tr> | |||
| <tr> | |||
| <td>Cell 3</td> | |||
| <td>Cell 4</td> | |||
| </tr> | |||
| </tbody> | |||
| </table> | |||
| <p>With leading and tailing pipes:</p> | |||
| <table> | |||
| <thead> | |||
| <tr> | |||
| <th>Header 1</th> | |||
| <th>Header 2</th> | |||
| </tr> | |||
| </thead> | |||
| <tbody> | |||
| <tr> | |||
| <td>Cell 1</td> | |||
| <td>Cell 2</td> | |||
| </tr> | |||
| <tr> | |||
| <td>Cell 3</td> | |||
| <td>Cell 4</td> | |||
| </tr> | |||
| </tbody> | |||
| </table> | |||
| <hr /> | |||
| <h1>One-column one-row table</h1> | |||
| <p>With leading pipes:</p> | |||
| <table> | |||
| <thead> | |||
| <tr> | |||
| <th>Header</th> | |||
| </tr> | |||
| </thead> | |||
| <tbody> | |||
| <tr> | |||
| <td>Cell</td> | |||
| </tr> | |||
| </tbody> | |||
| </table> | |||
| <p>With tailing pipes:</p> | |||
| <table> | |||
| <thead> | |||
| <tr> | |||
| <th>Header</th> | |||
| </tr> | |||
| </thead> | |||
| <tbody> | |||
| <tr> | |||
| <td>Cell</td> | |||
| </tr> | |||
| </tbody> | |||
| </table> | |||
| <p>With leading and tailing pipes:</p> | |||
| <table> | |||
| <thead> | |||
| <tr> | |||
| <th>Header</th> | |||
| </tr> | |||
| </thead> | |||
| <tbody> | |||
| <tr> | |||
| <td>Cell</td> | |||
| </tr> | |||
| </tbody> | |||
| </table> | |||
| <hr /> | |||
| <p>Table alignement:</p> | |||
| <table> | |||
| <thead> | |||
| <tr> | |||
| <th>Default</th> | |||
| <th align="left">Right</th> | |||
| <th align="center">Center</th> | |||
| <th align="right">Left</th> | |||
| </tr> | |||
| </thead> | |||
| <tbody> | |||
| <tr> | |||
| <td>Long Cell</td> | |||
| <td align="left">Long Cell</td> | |||
| <td align="center">Long Cell</td> | |||
| <td align="right">Long Cell</td> | |||
| </tr> | |||
| <tr> | |||
| <td>Cell</td> | |||
| <td align="left">Cell</td> | |||
| <td align="center">Cell</td> | |||
| <td align="right">Cell</td> | |||
| </tr> | |||
| </tbody> | |||
| </table> | |||
| <p>Table alignement (alternate spacing):</p> | |||
| <table> | |||
| <thead> | |||
| <tr> | |||
| <th>Default</th> | |||
| <th align="left">Right</th> | |||
| <th align="center">Center</th> | |||
| <th align="right">Left</th> | |||
| </tr> | |||
| </thead> | |||
| <tbody> | |||
| <tr> | |||
| <td>Long Cell</td> | |||
| <td align="left">Long Cell</td> | |||
| <td align="center">Long Cell</td> | |||
| <td align="right">Long Cell</td> | |||
| </tr> | |||
| <tr> | |||
| <td>Cell</td> | |||
| <td align="left">Cell</td> | |||
| <td align="center">Cell</td> | |||
| <td align="right">Cell</td> | |||
| </tr> | |||
| </tbody> | |||
| </table> | |||
| <hr /> | |||
| <h1>Empty cells</h1> | |||
| <table> | |||
| <thead> | |||
| <tr> | |||
| <th>Header 1</th> | |||
| <th>Header 2</th> | |||
| </tr> | |||
| </thead> | |||
| <tbody> | |||
| <tr> | |||
| <td>A</td> | |||
| <td>B</td> | |||
| </tr> | |||
| <tr> | |||
| <td>C</td> | |||
| <td></td> | |||
| </tr> | |||
| </tbody> | |||
| </table> | |||
| <table> | |||
| <thead> | |||
| <tr> | |||
| <th>Header 1</th> | |||
| <th>Header 2</th> | |||
| </tr> | |||
| </thead> | |||
| <tbody> | |||
| <tr> | |||
| <td>A</td> | |||
| <td>B</td> | |||
| </tr> | |||
| <tr> | |||
| <td></td> | |||
| <td>D</td> | |||
| </tr> | |||
| </tbody> | |||
| </table> | |||
| <hr /> | |||
| <h1>Missing tailing pipe</h1> | |||
| <table> | |||
| <thead> | |||
| <tr> | |||
| <th>Header 1</th> | |||
| <th>Header 2</th> | |||
| </tr> | |||
| </thead> | |||
| <tbody> | |||
| <tr> | |||
| <td>Cell</td> | |||
| <td>Cell</td> | |||
| </tr> | |||
| <tr> | |||
| <td>Cell</td> | |||
| <td>Cell</td> | |||
| </tr> | |||
| </tbody> | |||
| </table> | |||
| <table> | |||
| <thead> | |||
| <tr> | |||
| <th>Header 1</th> | |||
| <th>Header 2</th> | |||
| </tr> | |||
| </thead> | |||
| <tbody> | |||
| <tr> | |||
| <td>Cell</td> | |||
| <td>Cell</td> | |||
| </tr> | |||
| <tr> | |||
| <td>Cell</td> | |||
| <td>Cell</td> | |||
| </tr> | |||
| </tbody> | |||
| </table> | |||
| <table> | |||
| <thead> | |||
| <tr> | |||
| <th>Header 1</th> | |||
| <th>Header 2</th> | |||
| </tr> | |||
| </thead> | |||
| <tbody> | |||
| <tr> | |||
| <td>Cell</td> | |||
| <td>Cell</td> | |||
| </tr> | |||
| <tr> | |||
| <td>Cell</td> | |||
| <td>Cell</td> | |||
| </tr> | |||
| </tbody> | |||
| </table> | |||
| <table> | |||
| <thead> | |||
| <tr> | |||
| <th>Header 1</th> | |||
| <th>Header 2</th> | |||
| </tr> | |||
| </thead> | |||
| <tbody> | |||
| <tr> | |||
| <td>Cell</td> | |||
| <td>Cell</td> | |||
| </tr> | |||
| <tr> | |||
| <td>Cell</td> | |||
| <td>Cell</td> | |||
| </tr> | |||
| </tbody> | |||
| </table> | |||
| <hr /> | |||
| <h1>Too many pipes in rows</h1> | |||
| <table> | |||
| <thead> | |||
| <tr> | |||
| <th>Header 1</th> | |||
| <th>Header 2</th> | |||
| </tr> | |||
| </thead> | |||
| <tbody> | |||
| <tr> | |||
| <td>Cell</td> | |||
| <td>Cell | Extra cell?</td> | |||
| </tr> | |||
| <tr> | |||
| <td>Cell</td> | |||
| <td>Cell | Extra cell?</td> | |||
| </tr> | |||
| </tbody> | |||
| </table> | |||