Merge branch 'master' into feature/reverse_convert

# Conflicts:
#	dist/showdown.js
#	dist/showdown.js.map
#	dist/showdown.min.js
#	dist/showdown.min.js.map
This commit is contained in:
Estevao Soares dos Santos 2017-12-10 19:17:29 +00:00
commit 53255fd7a1
41 changed files with 656 additions and 26 deletions

View File

@ -1,3 +1,24 @@
<a name="1.8.5"></a>
# [1.8.5](https://github.com/showdownjs/showdown/compare/1.8.4...1.8.5) (2017-12-10)
### Features
* **completeHTMLDocument:** add option to output a complete HTML document ([a8427c9](https://github.com/showdownjs/showdown/commit/a8427c9))
* **metadata:** add support for embedded metadata ([63d949f](https://github.com/showdownjs/showdown/commit/63d949f)), closes [#260](https://github.com/showdownjs/showdown/issues/260)
<a name="1.8.4"></a>
## [1.8.4](https://github.com/showdownjs/showdown/compare/1.8.3...1.8.4) (2017-12-05)
### Bug Fixes
* **tables:** raw html inside code tags in tables no longer breaks tables ([4ef4c5e](https://github.com/showdownjs/showdown/commit/4ef4c5e)), closes [#471](https://github.com/showdownjs/showdown/issues/471)
<a name="1.8.3"></a> <a name="1.8.3"></a>
## [1.8.3](https://github.com/showdownjs/showdown/compare/1.8.2...1.8.3) (2017-11-28) ## [1.8.3](https://github.com/showdownjs/showdown/compare/1.8.2...1.8.3) (2017-11-28)

View File

@ -17,3 +17,5 @@ We would like to thank everyone that contributed to this library. If you find ou
- **Walter Schnell** (10$) - **Walter Schnell** (10$)
- [**Learn on demand Systems**](http://www.learnondemandsystems.com/) (1000$) - [**Learn on demand Systems**](http://www.learnondemandsystems.com/) (1000$)
- **ivanhjc** (5$)

View File

@ -360,8 +360,15 @@ var defaultOptions = showdown.getDefaultOptions();
* **underline**: (boolean) [default false] ***EXPERIMENTAL FEATURE*** Enable support for underline. * **underline**: (boolean) [default false] ***EXPERIMENTAL FEATURE*** Enable support for underline.
Syntax is **double** or **triple** **underscores** ex: `__underlined word__`. With this option enabled, underscores are no longer parses into `<em>` and `<strong>`. Syntax is **double** or **triple** **underscores** ex: `__underlined word__`. With this option enabled, underscores are no longer parses into `<em>` and `<strong>`.
* **completeHTMLDocument**: (boolean) [default false] Outputs a complete html document,
including `<html>`, `<head>` and `<body>` tags' instead of an HTML fragment. (since v.1.8.5)
* **metadata**: (boolean) [default false] Enable support for document metadata (defined at the top of the document
between `«««` and `»»»` or between `---` and `---`). (since v.1.8.5)
**NOTE**: Please note that until **version 1.6.0**, all of these options are ***DISABLED*** by default in the cli tool. **NOTE**: Please note that until **version 1.6.0**, all of these options are ***DISABLED*** by default in the cli tool.
## Flavors ## Flavors
You can also use flavors or presets to set the correct options automatically, so that showdown behaves like popular markdown flavors. You can also use flavors or presets to set the correct options automatically, so that showdown behaves like popular markdown flavors.

BIN
dist/showdown.js vendored

Binary file not shown.

BIN
dist/showdown.js.map vendored

Binary file not shown.

BIN
dist/showdown.min.js vendored

Binary file not shown.

Binary file not shown.

View File

@ -1,9 +1,9 @@
{ {
"name": "showdown", "name": "showdown",
"version": "1.8.3", "version": "1.8.5",
"description": "A Markdown to HTML converter written in Javascript", "description": "A Markdown to HTML converter written in Javascript",
"author": "Estevão Santos", "author": "Estevão Santos",
"homepage": "http://showdownjs.github.io/showdown/", "homepage": "http://showdownjs.com/",
"keywords": [ "keywords": [
"markdown", "markdown",
"converter" "converter"

File diff suppressed because one or more lines are too long

View File

@ -1,6 +1,88 @@
# Performance Tests for showdown # Performance Tests for showdown
## [version 1.9.0](https://github.com/showdownjs/showdown/tree/1.9.0)
### Test Suite: Basic (50 cycles)
| test | avgTime | max | min |
|:-----|--------:|----:|----:|
|Simple "Hello World"|0.476|9.945|0.088|
|performance.testfile.md|32.208|61.885|28.234|
### Test Suite: subParsers (20 cycles)
| test | avgTime | max | min |
|:-----|--------:|----:|----:|
|hashHTMLBlocks|5.827|23.030|2.429|
|anchors|0.363|0.636|0.294|
|autoLinks|0.120|0.319|0.071|
|blockQuotes|2.884|6.237|2.040|
|codeBlocks|0.290|1.131|0.189|
|codeSpans|0.314|0.875|0.234|
|detab|0.095|0.141|0.086|
|encodeAmpsAndAngles|0.155|1.186|0.095|
|encodeBackslashEscapes|0.087|0.144|0.069|
|encodeCode|0.918|1.279|0.865|
|escapeSpecialCharsWithinTagAttributes|0.245|0.711|0.156|
|githubCodeBlocks|0.160|0.291|0.142|
|hashBlock|0.043|0.067|0.038|
|hashElement|0.003|0.035|0.000|
|hashHTMLSpans|4.273|6.304|3.983|
|hashPreCodeTags|0.133|0.344|0.110|
|headers|1.454|3.874|1.098|
|horizontalRule|0.230|0.300|0.202|
|images|0.191|0.476|0.135|
|italicsAndBold|0.310|0.866|0.236|
|lists|3.135|4.249|2.662|
|outdent|0.167|0.262|0.140|
|paragraphs|6.383|7.885|5.680|
|spanGamut|4.106|5.310|3.698|
|strikethrough|0.005|0.087|0.000|
|stripLinkDefinitions|0.245|0.376|0.221|
|tables|0.003|0.049|0.001|
|unescapeSpecialChars|0.010|0.057|0.007|
## [version 1.8.4](https://github.com/showdownjs/showdown/tree/1.8.4)
### Test Suite: Basic (50 cycles)
| test | avgTime | max | min |
|:-----|--------:|----:|----:|
|Simple "Hello World"|0.736|11.076|0.117|
|performance.testfile.md|32.918|62.427|27.941|
### Test Suite: subParsers (20 cycles)
| test | avgTime | max | min |
|:-----|--------:|----:|----:|
|hashHTMLBlocks|5.260|17.333|2.340|
|anchors|0.522|2.898|0.307|
|autoLinks|0.124|0.300|0.071|
|blockQuotes|2.244|3.333|2.015|
|codeBlocks|0.244|0.817|0.190|
|codeSpans|0.354|1.201|0.243|
|detab|0.096|0.143|0.088|
|encodeAmpsAndAngles|0.138|0.198|0.096|
|encodeBackslashEscapes|0.093|0.184|0.071|
|encodeCode|0.961|1.611|0.858|
|escapeSpecialCharsWithinTagAttributes|0.252|0.520|0.158|
|githubCodeBlocks|0.262|0.390|0.161|
|hashBlock|0.052|0.129|0.037|
|hashElement|0.003|0.040|0.000|
|hashHTMLSpans|4.240|4.673|4.044|
|hashPreCodeTags|0.134|0.337|0.113|
|headers|1.412|4.475|1.077|
|horizontalRule|0.358|2.686|0.196|
|images|0.184|0.480|0.130|
|italicsAndBold|0.300|0.458|0.234|
|lists|3.074|4.651|2.626|
|outdent|0.204|0.931|0.137|
|paragraphs|6.406|8.020|5.821|
|spanGamut|4.136|6.038|3.840|
|strikethrough|0.007|0.132|0.000|
|stripLinkDefinitions|0.248|0.403|0.217|
|tables|0.003|0.040|0.001|
|unescapeSpecialChars|0.009|0.039|0.007|
## [version 1.8.3](https://github.com/showdownjs/showdown/tree/1.8.3) ## [version 1.8.3](https://github.com/showdownjs/showdown/tree/1.8.3)
### Test Suite: Basic (50 cycles) ### Test Suite: Basic (50 cycles)

View File

@ -43,7 +43,17 @@ showdown.Converter = function (converterOptions) {
/** /**
* The flavor set in this converter * The flavor set in this converter
*/ */
setConvFlavor = setFlavor; setConvFlavor = setFlavor,
/**
* Metadata of the document
* @type {{parsed: {}, raw: string, format: string}}
*/
metadata = {
parsed: {},
raw: '',
format: ''
};
_constructor(); _constructor();
@ -255,7 +265,12 @@ showdown.Converter = function (converterOptions) {
langExtensions: langExtensions, langExtensions: langExtensions,
outputModifiers: outputModifiers, outputModifiers: outputModifiers,
converter: this, converter: this,
ghCodeBlocks: [] ghCodeBlocks: [],
metadata: {
parsed: {},
raw: '',
format: ''
}
}; };
// This lets us use ¨ trema as an escape char to avoid md5 hashes // This lets us use ¨ trema as an escape char to avoid md5 hashes
@ -299,6 +314,7 @@ showdown.Converter = function (converterOptions) {
}); });
// run the sub parsers // run the sub parsers
text = showdown.subParser('metadata')(text, options, globals);
text = showdown.subParser('hashPreCodeTags')(text, options, globals); text = showdown.subParser('hashPreCodeTags')(text, options, globals);
text = showdown.subParser('githubCodeBlocks')(text, options, globals); text = showdown.subParser('githubCodeBlocks')(text, options, globals);
text = showdown.subParser('hashHTMLBlocks')(text, options, globals); text = showdown.subParser('hashHTMLBlocks')(text, options, globals);
@ -314,11 +330,16 @@ showdown.Converter = function (converterOptions) {
// attacklab: Restore tremas // attacklab: Restore tremas
text = text.replace(/¨T/g, '¨'); text = text.replace(/¨T/g, '¨');
// render a complete html document instead of a partial if the option is enabled
text = showdown.subParser('completeHTMLDocument')(text, options, globals);
// Run output modifiers // Run output modifiers
showdown.helper.forEach(outputModifiers, function (ext) { showdown.helper.forEach(outputModifiers, function (ext) {
text = showdown.subParser('runExtension')(ext, text, options, globals); text = showdown.subParser('runExtension')(ext, text, options, globals);
}); });
// update metadata
metadata = globals.metadata;
return text; return text;
}; };
@ -928,4 +949,50 @@ showdown.Converter = function (converterOptions) {
output: outputModifiers output: outputModifiers
}; };
}; };
/**
* Get the metadata of the previously parsed document
* @param raw
* @returns {string|{}}
*/
this.getMetadata = function (raw) {
if (raw) {
return metadata.raw;
} else {
return metadata.parsed;
}
};
/**
* Get the metadata format of the previously parsed document
* @returns {string}
*/
this.getMetadataFormat = function () {
return metadata.format;
};
/**
* Private: set a single key, value metadata pair
* @param {string} key
* @param {string} value
*/
this._setMetadataPair = function (key, value) {
metadata.parsed[key] = value;
};
/**
* Private: set metadata format
* @param {string} format
*/
this._setMetadataFormat = function (format) {
metadata.format = format;
};
/**
* Private: set metadata raw text
* @param {string} raw
*/
this._setMetadataRaw = function (raw) {
metadata.raw = raw;
};
}; };

View File

@ -150,6 +150,16 @@ function getDefaultOpts (simple) {
defaultValue: false, defaultValue: false,
description: 'Enable support for underline. Syntax is double or triple underscores: `__underline word__`. With this option enabled, underscores no longer parses into `<em>` and `<strong>`', description: 'Enable support for underline. Syntax is double or triple underscores: `__underline word__`. With this option enabled, underscores no longer parses into `<em>` and `<strong>`',
type: 'boolean' type: 'boolean'
},
completeHTMLDocument: {
defaultValue: false,
description: 'Outputs a complete html document, including `<html>`, `<head>` and `<body>` tags',
type: 'boolean'
},
metadata: {
defaultValue: false,
description: 'Enable support for document metadata (defined at the top of the document between `«««` and `»»»` or between `---` and `---`).',
type: 'boolean'
} }
}; };
if (simple === false) { if (simple === false) {

View File

@ -0,0 +1,62 @@
/**
* Turn Markdown link shortcuts into XHTML <a> tags.
*/
showdown.subParser('completeHTMLDocument', function (text, options, globals) {
'use strict';
if (!options.completeHTMLDocument) {
return text;
}
text = globals.converter._dispatch('completeHTMLDocument.before', text, options, globals);
var doctype = 'html',
doctypeParsed = '<!DOCTYPE HTML>\n',
title = '',
charset = '<meta charset="utf-8">\n',
lang = '',
metadata = '';
if (typeof globals.metadata.parsed.doctype !== 'undefined') {
doctypeParsed = '<!DOCTYPE ' + globals.metadata.parsed.doctype + '>\n';
doctype = globals.metadata.parsed.doctype.toString().toLowerCase();
if (doctype === 'html' || doctype === 'html5') {
charset = '<meta charset="utf-8">';
}
}
for (var meta in globals.metadata.parsed) {
if (globals.metadata.parsed.hasOwnProperty(meta)) {
switch (meta.toLowerCase()) {
case 'doctype':
break;
case 'title':
title = '<title>' + globals.metadata.parsed.title + '</title>\n';
break;
case 'charset':
if (doctype === 'html' || doctype === 'html5') {
charset = '<meta charset="' + globals.metadata.parsed.charset + '">\n';
} else {
charset = '<meta name="charset" content="' + globals.metadata.parsed.charset + '">\n';
}
break;
case 'language':
case 'lang':
lang = ' lang="' + globals.metadata.parsed[meta] + '"';
metadata += '<meta name="' + meta + '" content="' + globals.metadata.parsed[meta] + '">\n';
break;
default:
metadata += '<meta name="' + meta + '" content="' + globals.metadata.parsed[meta] + '">\n';
}
}
}
text = doctypeParsed + '<html' + lang + '>\n<head>\n' + title + charset + metadata + '</head>\n<body>\n' + text.trim() + '\n</body>\n</html>';
text = globals.converter._dispatch('completeHTMLDocument.after', text, options, globals);
return text;
});

View File

@ -154,7 +154,7 @@ showdown.subParser('lists', function (text, options, globals) {
style = styleStartNumber(list, listType); style = styleStartNumber(list, listType);
if (pos !== -1) { if (pos !== -1) {
// slice // slice
result += '\n<' + listType + style + '>\n' + processListItems(txt.slice(0, pos), !!trimTrailing) + '</' + listType + '>\n'; result += '\n\n<' + listType + style + '>\n' + processListItems(txt.slice(0, pos), !!trimTrailing) + '</' + listType + '>\n';
// invert counterType and listType // invert counterType and listType
listType = (listType === 'ul') ? 'ol' : 'ul'; listType = (listType === 'ul') ? 'ol' : 'ul';
@ -163,12 +163,12 @@ showdown.subParser('lists', function (text, options, globals) {
//recurse //recurse
parseCL(txt.slice(pos)); parseCL(txt.slice(pos));
} else { } else {
result += '\n<' + listType + style + '>\n' + processListItems(txt, !!trimTrailing) + '</' + listType + '>\n'; result += '\n\n<' + listType + style + '>\n' + processListItems(txt, !!trimTrailing) + '</' + listType + '>\n';
} }
})(list); })(list);
} else { } else {
var style = styleStartNumber(list, listType); var style = styleStartNumber(list, listType);
result = '\n<' + listType + style + '>\n' + processListItems(list, !!trimTrailing) + '</' + listType + '>\n'; result = '\n\n<' + listType + style + '>\n' + processListItems(list, !!trimTrailing) + '</' + listType + '>\n';
} }
return result; return result;

View File

@ -0,0 +1,49 @@
/**
* Parse metadata at the top of the document
*/
showdown.subParser('metadata', function (text, options, globals) {
'use strict';
if (!options.metadata) {
return text;
}
text = globals.converter._dispatch('metadata.before', text, options, globals);
function parseMetadataContents (content) {
// raw is raw so it's not changed in any way
globals.metadata.raw = content;
// escape chars forbidden in html attributes
// double quotes
content = content
// ampersand first
.replace(/&/g, '&amp;')
// double quotes
.replace(/"/g, '&quot;');
content = content.replace(/\n {4}/g, ' ');
content.replace(/^([\S ]+): +([\s\S]+?)$/gm, function (wm, key, value) {
globals.metadata.parsed[key] = value;
return '';
});
}
text = text.replace(/^\s*«««+(\S*?)\n([\s\S]+?)\n»»»+\n/, function (wholematch, format, content) {
parseMetadataContents(content);
return '¨M';
});
text = text.replace(/^\s*---+(\S*?)\n([\s\S]+?)\n---+\n/, function (wholematch, format, content) {
if (format) {
globals.metadata.format = format;
}
parseMetadataContents(content);
return '¨M';
});
text = text.replace(/¨M/g, '');
text = globals.converter._dispatch('metadata.after', text, options, globals);
return text;
});

View File

@ -5,9 +5,9 @@ showdown.subParser('tables', function (text, options, globals) {
return text; return text;
} }
var tableRgx = /^ {0,3}\|?.+\|.+\n {0,3}\|?[ \t]*:?[ \t]*(?:[-=]){2,}[ \t]*:?[ \t]*\|[ \t]*:?[ \t]*(?:[-=]){2,}[\s\S]+?(?:\n\n|<ol|<ul|¨0)/gm, var tableRgx = /^ {0,3}\|?.+\|.+\n {0,3}\|?[ \t]*:?[ \t]*(?:[-=]){2,}[ \t]*:?[ \t]*\|[ \t]*:?[ \t]*(?:[-=]){2,}[\s\S]+?(?:\n\n|¨0)/gm,
//singeColTblRgx = /^ {0,3}\|.+\|\n {0,3}\|[ \t]*:?[ \t]*(?:[-=]){2,}[ \t]*:?[ \t]*\|[ \t]*\n(?: {0,3}\|.+\|\n)+(?:\n\n|¨0)/gm; //singeColTblRgx = /^ {0,3}\|.+\|\n {0,3}\|[ \t]*:?[ \t]*(?:[-=]){2,}[ \t]*:?[ \t]*\|[ \t]*\n(?: {0,3}\|.+\|\n)+(?:\n\n|¨0)/gm;
singeColTblRgx = /^ {0,3}\|.+\|[ \t]*\n {0,3}\|[ \t]*:?[ \t]*(?:[-=]){2,}[ \t]*:?[ \t]*\|[ \t]*\n( {0,3}\|.+\|[ \t]*\n)*(?:\n|<ol|<ul|¨0)/gm; singeColTblRgx = /^ {0,3}\|.+\|[ \t]*\n {0,3}\|[ \t]*:?[ \t]*(?:[-=]){2,}[ \t]*:?[ \t]*\|[ \t]*\n( {0,3}\|.+\|[ \t]*\n)*(?:\n|¨0)/gm;
function parseStyles (sLine) { function parseStyles (sLine) {
if (/^:[ \t]*--*$/.test(sLine)) { if (/^:[ \t]*--*$/.test(sLine)) {
@ -24,7 +24,7 @@ showdown.subParser('tables', function (text, options, globals) {
function parseHeaders (header, style) { function parseHeaders (header, style) {
var id = ''; var id = '';
header = header.trim(); header = header.trim();
// support both tablesHeaderId and tableHeaderId due to error in documention so we don't break backwards compatibility // support both tablesHeaderId and tableHeaderId due to error in documentation so we don't break backwards compatibility
if (options.tablesHeaderId || options.tableHeaderId) { if (options.tablesHeaderId || options.tableHeaderId) {
id = ' id="' + header.replace(/ /g, '_').toLowerCase() + '"'; id = ' id="' + header.replace(/ /g, '_').toLowerCase() + '"';
} }
@ -125,24 +125,11 @@ showdown.subParser('tables', function (text, options, globals) {
return buildTable(headers, cells); return buildTable(headers, cells);
} }
function hackFixTableFollowedByList (rawTable) {
var lastChars = rawTable.slice(-3);
if (lastChars === '<ol' || lastChars === '<ul') {
rawTable = rawTable.slice(0, -3) + '\n\n' + rawTable.slice(-3);
}
return rawTable;
}
text = globals.converter._dispatch('tables.before', text, options, globals); text = globals.converter._dispatch('tables.before', text, options, globals);
// find escaped pipe characters // find escaped pipe characters
text = text.replace(/\\(\|)/g, showdown.helper.escapeCharactersCallback); text = text.replace(/\\(\|)/g, showdown.helper.escapeCharactersCallback);
// hackfix issue #443. Due to lists only having a linebreak before them, we need to manually insert a linebreak to prevent
// tables not being parsed when followed by a list
text = text.replace(tableRgx, hackFixTableFollowedByList);
text = text.replace(singeColTblRgx, hackFixTableFollowedByList);
// parse multi column tables // parse multi column tables
text = text.replace(tableRgx, parseTable); text = text.replace(tableRgx, parseTable);

View File

@ -0,0 +1,15 @@
<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8">
</head>
<body>
<p>This is a <strong>markdown</strong> file</p>
<p>Converted into a full HTML document</p>
<ul>
<li>this</li>
<li>is</li>
<li>awesome</li>
</ul>
</body>
</html>

View File

@ -0,0 +1,7 @@
This is a **markdown** file
Converted into a full HTML document
- this
- is
- awesome

View File

@ -0,0 +1,8 @@
<p><strong>some</strong> markdown text</p>
<ul>
<li>a list</li>
<li>another list ---</li>
<li>and stuff</li>
</ul>
<p>a paragraph --- with dashes</p>
<hr />

View File

@ -0,0 +1,16 @@
---
title: This is the document title
language: en
author: Tivie
---
**some** markdown text
- a list
- another list ---
- and stuff
a paragraph --- with dashes
---

View File

@ -0,0 +1,16 @@
<!DOCTYPE HTML>
<html lang="en">
<head>
<title>This is the document title</title>
<meta charset="utf-8">
<meta name="language" content="en">
<meta name="author" content="Tivie">
<meta name="contributors" content="John, Mary, Steve">
<meta name="description" content="This is a long text and so it spans on multiple lines. It must be indented, for showdown to parse it correctly. Markdown **such as bold** is not parsed and it will be rendered as plain text.">
<meta name="date" content="01-01-2010">
<meta name="keywords" content="foo, bar, baz">
</head>
<body>
<p><strong>some</strong> markdown text</p>
</body>
</html>

View File

@ -0,0 +1,16 @@
«««
title: This is the document title
language: en
author: Tivie
contributors: John, Mary, Steve
description: This is a long text and so it
spans on multiple lines.
It must be indented,
for showdown to parse it correctly.
Markdown **such as bold** is not parsed
and it will be rendered as plain text.
date: 01-01-2010
keywords: foo, bar, baz
»»»
**some** markdown text

View File

@ -0,0 +1,22 @@
<!DOCTYPE HTML>
<html lang="en">
<head>
<title>This is the document title</title>
<meta charset="utf-8">
<meta name="language" content="en">
<meta name="author" content="Tivie">
<meta name="contributors" content="John, Mary, Steve">
<meta name="keywords" content="foo, bar, baz">
</head>
<body>
<hr />
<p>description: This is a long text and so it
spans on multiple lines.
It must be indented,
for showdown to parse it correctly.
Markdown <strong>such as bold</strong> is not parsed
and it will be rendered as plain text.</p>
<h2 id="date01012010">date: 01-01-2010</h2>
<p><strong>some</strong> markdown text</p>
</body>
</html>

View File

@ -0,0 +1,18 @@
«««
title: This is the document title
language: en
author: Tivie
contributors: John, Mary, Steve
keywords: foo, bar, baz
»»»
---
description: This is a long text and so it
spans on multiple lines.
It must be indented,
for showdown to parse it correctly.
Markdown **such as bold** is not parsed
and it will be rendered as plain text.
date: 01-01-2010
---
**some** markdown text

View File

@ -0,0 +1,22 @@
<!DOCTYPE HTML>
<html lang="en">
<head>
<title>This is the document title</title>
<meta charset="utf-8">
<meta name="language" content="en">
<meta name="author" content="Tivie">
<meta name="contributors" content="John, Mary, Steve">
<meta name="keywords" content="foo, bar, baz">
</head>
<body>
<hr />
<p>description: This is a long text and so it
spans on multiple lines.
It must be indented,
for showdown to parse it correctly.
Markdown <strong>such as bold</strong> is not parsed
and it will be rendered as plain text.</p>
<h2 id="date01012010">date: 01-01-2010</h2>
<p><strong>some</strong> markdown text</p>
</body>
</html>

View File

@ -0,0 +1,18 @@
---
title: This is the document title
language: en
author: Tivie
contributors: John, Mary, Steve
keywords: foo, bar, baz
---
---
description: This is a long text and so it
spans on multiple lines.
It must be indented,
for showdown to parse it correctly.
Markdown **such as bold** is not parsed
and it will be rendered as plain text.
date: 01-01-2010
---
**some** markdown text

View File

@ -0,0 +1,15 @@
<hr />
<p>title: This is the document title
language: en
author: Tivie
contributors: John, Mary, Steve
description: This is a long text and so it
spans on multiple lines.
It must be indented,
for showdown to parse it correctly.
Markdown <strong>such as bold</strong> is not parsed
and it will be rendered as plain text.
date: 01-01-2010
keywords: foo, bar, baz</p>
<hr />
<p><strong>some</strong> markdown text</p>

View File

@ -0,0 +1,18 @@
---
title: This is the document title
language: en
author: Tivie
contributors: John, Mary, Steve
description: This is a long text and so it
spans on multiple lines.
It must be indented,
for showdown to parse it correctly.
Markdown **such as bold** is not parsed
and it will be rendered as plain text.
date: 01-01-2010
keywords: foo, bar, baz
---
**some** markdown text

View File

@ -0,0 +1 @@
<p>some <strong>text</strong></p>

View File

@ -0,0 +1,6 @@
«««
foo: bar
baz: bazinga
»»»
some **text**

View File

@ -0,0 +1 @@
<p><strong>some</strong> markdown text</p>

View File

@ -0,0 +1,16 @@
«««
title: This is the document title
language: en
author: Tivie
contributors: John, Mary, Steve
description: This is a long text and so it
spans on multiple lines.
It must be indented,
for showdown to parse it correctly.
Markdown **such as bold** is not parsed
and it will be rendered as plain text.
date: 01-01-2010
keywords: foo, bar, baz
»»»
**some** markdown text

View File

@ -0,0 +1 @@
<p><strong>some</strong> markdown text</p>

View File

@ -0,0 +1,16 @@
---
title: This is the document title
language: en
author: Tivie
contributors: John, Mary, Steve
description: This is a long text and so it
spans on multiple lines.
It must be indented,
for showdown to parse it correctly.
Markdown **such as bold** is not parsed
and it will be rendered as plain text.
date: 01-01-2010
keywords: foo, bar, baz
---
**some** markdown text

View File

@ -0,0 +1 @@
<p><strong>some</strong> markdown text</p>

View File

@ -0,0 +1,9 @@
---YAML
foo: bar
baz:
- bazinga
- bling
- blang
---
**some** markdown text

View File

@ -0,0 +1,14 @@
<table>
<thead>
<tr>
<th style="text-align:right;">h1</th>
<th style="text-align:left;">h2</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:right;">asdf</td>
<td style="text-align:left;">one <code>two &lt;ol&gt; three</code></td>
</tr>
</tbody>
</table>

View File

@ -0,0 +1,3 @@
| h1 | h2 |
|--------:|:---------------------|
| asdf | one `two <ol> three` |

View File

@ -27,6 +27,20 @@ describe('showdown.Converter', function () {
}); });
}); });
describe('metadata methods', function () {
var converter = new showdown.Converter();
it('_setMetadataPair() should set foo to bar', function () {
converter._setMetadataPair('foo', 'bar');
converter.getMetadata().should.eql({foo: 'bar'});
});
it('_setMetadata should set metadata to {baz: bazinga}', function () {
converter._setMetadataRaw('{baz: bazinga}');
converter.getMetadata(true).should.eql('{baz: bazinga}');
});
});
describe('converter.setFlavor()', function () { describe('converter.setFlavor()', function () {
/** /**

View File

@ -59,4 +59,41 @@ describe('showdown.Converter', function () {
html.should.equal(expectedHtml); html.should.equal(expectedHtml);
}); });
}); });
describe('makeHtml() with option metadata', function () {
var converter = new showdown.Converter(),
text1 =
'---SIMPLE\n' +
'foo: bar\n' +
'baz: bazinga\n' +
'---\n',
text2 =
'---TIVIE\n' +
'a: b\n' +
'c: 123\n' +
'---\n';
it('should correctly set metadata', function () {
converter.setOption('metadata', true);
var expectedHtml = '',
expectedObj = {foo: 'bar', baz: 'bazinga'},
expectedRaw = 'foo: bar\nbaz: bazinga',
expectedFormat = 'SIMPLE';
converter.makeHtml(text1).should.equal(expectedHtml);
converter.getMetadata().should.eql(expectedObj);
converter.getMetadata(true).should.equal(expectedRaw);
converter.getMetadataFormat().should.equal(expectedFormat);
});
it('consecutive calls should reset metadata', function () {
converter.makeHtml(text2);
var expectedObj = {a: 'b', c: '123'},
expectedRaw = 'a: b\nc: 123',
expectedFormat = 'TIVIE';
converter.getMetadata().should.eql(expectedObj);
converter.getMetadata(true).should.equal(expectedRaw);
converter.getMetadataFormat().should.equal(expectedFormat);
});
});
}); });

View File

@ -14,7 +14,9 @@ var bootstrap = require('../bootstrap.js'),
emojisSuite = bootstrap.getTestSuite('test/features/emojis/'), emojisSuite = bootstrap.getTestSuite('test/features/emojis/'),
underlineSuite = bootstrap.getTestSuite('test/features/underline/'), underlineSuite = bootstrap.getTestSuite('test/features/underline/'),
literalMidWordUnderscoresSuite = bootstrap.getTestSuite('test/features/literalMidWordUnderscores/'), literalMidWordUnderscoresSuite = bootstrap.getTestSuite('test/features/literalMidWordUnderscores/'),
literalMidWordAsterisksSuite = bootstrap.getTestSuite('test/features/literalMidWordAsterisks/'); literalMidWordAsterisksSuite = bootstrap.getTestSuite('test/features/literalMidWordAsterisks/'),
completeHTMLOutputSuite = bootstrap.getTestSuite('test/features/completeHTMLOutput/'),
metadataSuite = bootstrap.getTestSuite('test/features/metadata/');
describe('makeHtml() features testsuite', function () { describe('makeHtml() features testsuite', function () {
'use strict'; 'use strict';
@ -231,4 +233,35 @@ describe('makeHtml() features testsuite', function () {
it(suite[i].name.replace(/-/g, ' '), assertion(suite[i], converter)); it(suite[i].name.replace(/-/g, ' '), assertion(suite[i], converter));
} }
}); });
/** test completeHTMLDocument option **/
describe('completeHTMLDocument option', function () {
var converter,
suite = completeHTMLOutputSuite;
for (var i = 0; i < suite.length; ++i) {
converter = new showdown.Converter({completeHTMLDocument: true});
it(suite[i].name.replace(/-/g, ' '), assertion(suite[i], converter));
}
});
/** test metadata option **/
describe('metadata option', function () {
var converter,
suite = metadataSuite;
for (var i = 0; i < suite.length; ++i) {
if (suite[i].name === 'embeded-in-output' ||
suite[i].name === 'embeded-two-consecutive-metadata-blocks' ||
suite[i].name === 'embeded-two-consecutive-metadata-blocks-different-symbols') {
converter = new showdown.Converter({metadata: true, completeHTMLDocument: true});
} else if (suite[i].name === 'ignore-metadata') {
converter = new showdown.Converter({metadata: false});
} else {
converter = new showdown.Converter({metadata: true});
}
it(suite[i].name.replace(/-/g, ' '), assertion(suite[i], converter));
}
});
}); });