| @ -1,3 +1,4 @@ | |||||
| vendor | vendor | ||||
| composer.phar | composer.phar | ||||
| composer.lock | composer.lock | ||||
| .idea | |||||
| @ -1,15 +1,16 @@ | |||||
| language: php | language: php | ||||
| php: | php: | ||||
| - 5.3 | |||||
| - 5.4 | - 5.4 | ||||
| - 5.5 | - 5.5 | ||||
| - 5.6 | - 5.6 | ||||
| - 7.0 | - 7.0 | ||||
| - hhvm | |||||
| - 7.1 | |||||
| - 7.2 | |||||
| - 7.3 | |||||
| before_script: | before_script: | ||||
| - composer install --no-interaction --prefer-source | - composer install --no-interaction --prefer-source | ||||
| script: | 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 | <?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__) . '/MarkdownInterface.php'; | ||||
| require_once dirname(__FILE__) . '/Markdown.php'; | require_once dirname(__FILE__) . '/Markdown.php'; | ||||
| @ -1,10 +1,10 @@ | |||||
| <?php | <?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__) . '/MarkdownInterface.php'; | ||||
| require_once dirname(__FILE__) . '/Markdown.php'; | require_once dirname(__FILE__) . '/Markdown.php'; | ||||
| @ -1,9 +1,9 @@ | |||||
| <?php | <?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'; | require_once dirname(__FILE__) . '/MarkdownInterface.php'; | ||||
| @ -1,34 +1,38 @@ | |||||
| <?php | <?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 { | 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 | <?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){ | 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'); | $text = file_get_contents('Readme.md'); | ||||
| $html = Markdown::defaultTransform($text); | $html = Markdown::defaultTransform($text); | ||||
| ?> | ?> | ||||
| <!DOCTYPE html> | <!DOCTYPE html> | ||||
| <html> | <html> | ||||
| <head> | |||||
| <title>PHP Markdown Lib - Readme</title> | |||||
| </head> | |||||
| <body> | |||||
| <head> | |||||
| <title>PHP Markdown Lib - Readme</title> | |||||
| </head> | |||||
| <body> | |||||
| <?php | <?php | ||||
| # Put HTML content in the document | |||||
| // Put HTML content in the document | |||||
| echo $html; | echo $html; | ||||
| ?> | ?> | ||||
| </body> | |||||
| </body> | |||||
| </html> | </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> | |||||