Merge branch 'develop' into hotfix/issue_142

This commit is contained in:
Estevao Soares dos Santos 2015-06-11 01:33:55 +01:00
commit 00db9d1c09
221 changed files with 693 additions and 102 deletions

View File

@ -95,6 +95,15 @@ module.exports = function (grunt) {
reporter: 'spec'
}
},
karlcow: {
src: 'test/node/testsuite.karlcow.js',
options: {
globals: ['should'],
timeout: 3000,
ignoreLeaks: false,
reporter: 'spec'
}
},
browser: {
src: 'test/browser/**/*.js',
options: {

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

@ -45,6 +45,7 @@
"grunt-conventional-changelog": "^1.1.0",
"grunt-jscs": "^1.2.0",
"grunt-simple-mocha": "^0.4.0",
"js-beautify": "^1.5.6",
"jscs": "^1.10.0",
"load-grunt-tasks": "^3.2.0",
"mocha": "*",

View File

@ -24,7 +24,8 @@ showdown.Converter = function (converterOptions) {
*/
options = {
omitExtraWLInCodeBlocks: false,
prefixHeaderId: false
prefixHeaderId: false,
noHeaderId: false
},
/**

View File

@ -8,7 +8,8 @@ var showdown = {},
extensions = {},
defaultOptions = {
omitExtraWLInCodeBlocks: false,
prefixHeaderId: false
prefixHeaderId: false,
noHeaderId: false
},
globalOptions = JSON.parse(JSON.stringify(defaultOptions)); //clone default options out of laziness =P

View File

@ -11,14 +11,17 @@ showdown.subParser('headers', function (text, options, globals) {
// --------
//
text = text.replace(/^(.+)[ \t]*\n=+[ \t]*\n+/gm, function (wholeMatch, m1) {
var spanGamut = showdown.subParser('spanGamut')(m1, options, globals),
hashBlock = '<h1 id="' + headerId(m1) + '">' + spanGamut + '</h1>';
hID = (options.noHeaderId) ? '' : ' id="' + headerId(m1) + '"',
hashBlock = '<h1' + hID + '>' + spanGamut + '</h1>';
return showdown.subParser('hashBlock')(hashBlock, options, globals);
});
text = text.replace(/^(.+)[ \t]*\n-+[ \t]*\n+/gm, function (matchFound, m1) {
var spanGamut = showdown.subParser('spanGamut')(m1, options, globals),
hashBlock = '<h2 id="' + headerId(m1) + '">' + spanGamut + '</h2>';
hID = (options.noHeaderId) ? '' : ' id="' + headerId(m1) + '"',
hashBlock = '<h2' + hID + '>' + spanGamut + '</h2>';
return showdown.subParser('hashBlock')(hashBlock, options, globals);
});
@ -41,9 +44,10 @@ showdown.subParser('headers', function (text, options, globals) {
/gm, function() {...});
*/
text = text.replace(/^(\#{1,6})[ \t]*(.+?)[ \t]*\#*\n+/gm, function (wholeMatch, m1, m2) {
text = text.replace(/^(#{1,6})[ \t]*(.+?)[ \t]*#*\n+/gm, function (wholeMatch, m1, m2) {
var span = showdown.subParser('spanGamut')(m2, options, globals),
header = '<h' + m1.length + ' id="' + headerId(m2) + '">' + span + '</h' + m1.length + '>';
hID = (options.noHeaderId) ? '' : ' id="' + headerId(m2) + '"',
header = '<h' + m1.length + hID + '>' + span + '</h' + m1.length + '>';
return showdown.subParser('hashBlock')(header, options, globals);
});

View File

@ -39,14 +39,11 @@ showdown.subParser('images', function (text, options, globals) {
url = showdown.helper.escapeCharacters(url, '*_', false);
var result = '<img src="' + url + '" alt="' + altText + '"';
// attacklab: Markdown.pl adds empty title attributes to images.
// Replicate this bug.
//if (title != "") {
title = title.replace(/"/g, '&quot;');
title = showdown.helper.escapeCharacters(title, '*_', false);
result += ' title="' + title + '"';
//}
if (title) {
title = title.replace(/"/g, '&quot;');
title = showdown.helper.escapeCharacters(title, '*_', false);
result += ' title="' + title + '"';
}
result += ' />';

View File

@ -26,7 +26,7 @@
showdown.subParser('stripLinkDefinitions', function (text, options, globals) {
'use strict';
var regex = /^[ ]{0,3}\[(.+)]:[ \t]*\n?[ \t]*<?(\S+?)>?[ \t]*\n?[ \t]*(?:(\n*)["(](.+?)[")][ \t]*)?(?:\n+|(?=~0))/gm;
var regex = /^[ ]{0,3}\[(.+)]:[ \t]*\n?[ \t]*<?(\S+?)>?[ \t]*\n?[ \t]*(?:(\n*)["|'(](.+?)["|')][ \t]*)?(?:\n+|(?=~0))/gm;
// attacklab: sentinel workarounds for lack of \A and \Z, safari\khtml bug
text += '~0';
@ -40,7 +40,7 @@ showdown.subParser('stripLinkDefinitions', function (text, options, globals) {
return m3 + m4;
} else if (m4) {
globals.gTitles[m1] = m4.replace(/"/g, '&quot;');
globals.gTitles[m1] = m4.replace(/"|'/g, '&quot;');
}
// Completely remove the definition from the text

89
test/bootstrap.js vendored Normal file
View File

@ -0,0 +1,89 @@
/**
* Created by Estevao on 08-06-2015.
*/
//jscs:disable requireCamelCaseOrUpperCaseIdentifiers
require('source-map-support').install();
require('chai').should();
var fs = require('fs'),
os = require('os'),
beautify = require('js-beautify').html_beautify,
beauOptions = {
eol: os.EOL,
indent_size: 2,
preserve_newlines: false
};
function getTestSuite(dir) {
return fs.readdirSync(dir)
.filter(filter())
.map(map(dir));
}
function filter() {
return function (file) {
var ext = file.slice(-3);
return (ext === '.md');
};
}
function map(dir) {
return function (file) {
var name = file.replace('.md', ''),
htmlPath = dir + name + '.html',
html = fs.readFileSync(htmlPath, 'utf8'),
mdPath = dir + name + '.md',
md = fs.readFileSync(mdPath, 'utf8');
return {
name: name,
input: md,
expected: html
};
};
}
function assertion(testCase, converter) {
return function () {
testCase.actual = converter.makeHtml(testCase.input);
testCase = normalize(testCase);
// Compare
testCase.actual.should.equal(testCase.expected);
};
}
//Normalize input/output
function normalize(testCase) {
// Normalize line returns
testCase.expected = testCase.expected.replace(/(\r\n)|\n|\r/g, '\n');
testCase.actual = testCase.actual.replace(/(\r\n)|\n|\r/g, '\n');
// Ignore all leading/trailing whitespace
testCase.expected = testCase.expected.split('\n').map(function (x) {
return x.trim();
}).join('\n');
testCase.actual = testCase.actual.split('\n').map(function (x) {
return x.trim();
}).join('\n');
// Remove extra lines
testCase.expected = testCase.expected.trim();
testCase.actual = testCase.actual.trim();
//Beautify
testCase.expected = beautify(testCase.expected, beauOptions);
testCase.actual = beautify(testCase.actual, beauOptions);
// Normalize line returns
testCase.expected = testCase.expected.replace(/(\r\n)|\n|\r/g, os.EOL);
testCase.actual = testCase.actual.replace(/(\r\n)|\n|\r/g, os.EOL);
return testCase;
}
module.exports = {
getTestSuite: getTestSuite,
assertion: assertion
};

View File

@ -1,4 +1,4 @@
<p><img src="/path/to/img.jpg" alt="Alt text" title="" /></p>
<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>

View File

@ -0,0 +1,5 @@
<p>This is a first paragraph,
on multiple lines.</p>
<p>This is a second paragraph.
There are spaces in between the two.</p>

View File

@ -0,0 +1,5 @@
This is a first paragraph,
on multiple lines.
This is a second paragraph.
There are spaces in between the two.

View File

@ -0,0 +1,5 @@
<p>This is a first paragraph,
on multiple lines.</p>
<p>This is a second paragraph
which has multiple lines too.</p>

View File

@ -0,0 +1,5 @@
This is a first paragraph,
on multiple lines.
This is a second paragraph
which has multiple lines too.

View File

@ -0,0 +1,3 @@
<p>A first paragraph.</p>
<p>A second paragraph after 3 CR (carriage return).</p>

View File

@ -0,0 +1,5 @@
A first paragraph.
A second paragraph after 3 CR (carriage return).

View File

@ -0,0 +1,3 @@
<p>This a very long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long paragraph on 1 line.</p>
<p>A few spaces and a new long long long long long long long long long long long long long long long long paragraph on 1 line.</p>

View File

@ -0,0 +1,3 @@
This a very long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long paragraph on 1 line.
A few spaces and a new long long long long long long long long long long long long long long long long paragraph on 1 line.

View File

@ -0,0 +1,3 @@
<p>This a very long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long paragraph on 1 line.</p>
<p>1 tab to separate them and a new long long long long long long long long long long long long long long long long paragraph on 1 line.</p>

View File

@ -0,0 +1,3 @@
This a very long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long paragraph on 1 line.
1 tab to separate them and a new long long long long long long long long long long long long long long long long paragraph on 1 line.

View File

@ -0,0 +1,3 @@
<p>This a very long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long paragraph on 1 line.</p>
<p>A new long long long long long long long long long long long long long long long long paragraph on 1 line.</p>

View File

@ -0,0 +1,3 @@
This a very long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long paragraph on 1 line.
A new long long long long long long long long long long long long long long long long paragraph on 1 line.

View File

@ -0,0 +1,5 @@
<p>These lines all end with end of line (EOL) sequences.</p>
<p>Seriously, they really do.</p>
<p>If you don't believe me: HEX EDIT!</p>

View File

@ -0,0 +1,6 @@
These lines all end with end of line (EOL) sequences.
Seriously, they really do.
If you don't believe me: HEX EDIT!

1
test/karlcow/EOL-CR.html Normal file
View File

@ -0,0 +1 @@
<p>These lines all end with end of line (EOL) sequences.</p> <p>Seriously, they really do.</p> <p>If you don't believe me: HEX EDIT!</p>

1
test/karlcow/EOL-CR.md Normal file
View File

@ -0,0 +1 @@
These lines all end with end of line (EOL) sequences. Seriously, they really do. If you don't believe me: HEX EDIT!

5
test/karlcow/EOL-LF.html Normal file
View File

@ -0,0 +1,5 @@
<p>These lines all end with end of line (EOL) sequences.</p>
<p>Seriously, they really do.</p>
<p>If you don't believe me: HEX EDIT!</p>

6
test/karlcow/EOL-LF.md Normal file
View File

@ -0,0 +1,6 @@
These lines all end with end of line (EOL) sequences.
Seriously, they really do.
If you don't believe me: HEX EDIT!

View File

@ -0,0 +1 @@
<p>An ampersand &amp; in the text flow is escaped as an html entity.</p>

View File

@ -0,0 +1 @@
An ampersand & in the text flow is escaped as an html entity.

View File

@ -0,0 +1 @@
<p>There is an <a href="http://validator.w3.org/check?uri=http://www.w3.org/&amp;verbose=1">ampersand</a> in the URI.</p>

View File

@ -0,0 +1 @@
There is an [ampersand](http://validator.w3.org/check?uri=http://www.w3.org/&verbose=1) in the URI.

View File

@ -0,0 +1 @@
<p>This is *an asterisk which should stay as is.</p>

View File

@ -0,0 +1 @@
This is \*an asterisk which should stay as is.

View File

@ -0,0 +1 @@
<p>This is * an asterisk which should stay as is.</p>

1
test/karlcow/asterisk.md Normal file
View File

@ -0,0 +1 @@
This is * an asterisk which should stay as is.

View File

@ -0,0 +1,12 @@
<p>\ backslash
` backtick
* asterisk
_ underscore
{} curly braces
[] square brackets
() parentheses
# hash mark
+ plus sign
- minus sign (hyphen)
. dot
! exclamation mark</p>

View File

@ -0,0 +1,12 @@
\\ backslash
\` backtick
\* asterisk
\_ underscore
\{\} curly braces
\[\] square brackets
\(\) parentheses
\# hash mark
\+ plus sign
\- minus sign (hyphen)
\. dot
\! exclamation mark

View File

@ -0,0 +1,5 @@
<blockquote>
<h1>heading level 1</h1>
<p>paragraph</p>
</blockquote>

View File

@ -0,0 +1,3 @@
> # heading level 1
>
> paragraph

View File

@ -0,0 +1,5 @@
<blockquote>
<p>A blockquote with a very long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long line.</p>
<p>and a second very long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long line.</p>
</blockquote>

View File

@ -0,0 +1,3 @@
>A blockquote with a very long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long line.
>and a second very long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long line.

View File

@ -0,0 +1,3 @@
<blockquote>
<p>This a very long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long paragraph in a blockquote.</p>
</blockquote>

View File

@ -0,0 +1 @@
>This a very long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long paragraph in a blockquote.

View File

@ -0,0 +1,5 @@
<blockquote>
<p>A blockquote
on multiple lines
like this.</p>
</blockquote>

View File

@ -0,0 +1,3 @@
> A blockquote
> on multiple lines
> like this.

View File

@ -0,0 +1,5 @@
<blockquote>
<p>A blockquote
on multiple lines
like this. </p>
</blockquote>

View File

@ -0,0 +1,3 @@
>A blockquote
>on multiple lines
>like this.

View File

@ -0,0 +1,8 @@
<blockquote>
<p>A blockquote
on multiple lines
like this.</p>
<p>But it has
two paragraphs.</p>
</blockquote>

View File

@ -0,0 +1,6 @@
>A blockquote
>on multiple lines
>like this.
>
>But it has
>two paragraphs.

View File

@ -0,0 +1,5 @@
<blockquote>
<p>A blockquote
on multiple lines
like this</p>
</blockquote>

View File

@ -0,0 +1,3 @@
>A blockquote
>on multiple lines
>like this

View File

@ -0,0 +1,9 @@
<blockquote>
<p>This is the first level of quoting.</p>
<blockquote>
<p>This is nested blockquote.</p>
</blockquote>
<p>Back to the first level.</p>
</blockquote>

View File

@ -0,0 +1,5 @@
> This is the first level of quoting.
>
> > This is nested blockquote.
>
> Back to the first level.

View File

@ -0,0 +1,7 @@
<blockquote>
<p>This is the first level of quoting.</p>
<blockquote>
<p>This is nested blockquote.</p>
</blockquote>
</blockquote>

View File

@ -0,0 +1,3 @@
> This is the first level of quoting.
>
> > This is nested blockquote.

View File

@ -0,0 +1,8 @@
<blockquote>
<p>This is the first level of quoting.</p>
<blockquote>
<p>This is nested blockquote.
Back to the first level.</p>
</blockquote>
</blockquote>

View File

@ -0,0 +1,3 @@
> This is the first level of quoting.
> > This is nested blockquote.
> Back to the first level.

View File

@ -0,0 +1,7 @@
<blockquote>
<p>This is the first level of quoting.</p>
<blockquote>
<p>This is nested blockquote.</p>
</blockquote>
</blockquote>

View File

@ -0,0 +1,2 @@
> This is the first level of quoting.
> > This is nested blockquote.

View File

@ -0,0 +1,3 @@
<pre><code>10 PRINT HELLO INFINITE
20 GOTO 10
</code></pre>

View File

@ -0,0 +1,2 @@
10 PRINT HELLO INFINITE
20 GOTO 10

View File

@ -0,0 +1,3 @@
<pre><code>10 PRINT &lt; &gt; &amp;
20 GOTO 10
</code></pre>

View File

@ -0,0 +1,2 @@
10 PRINT < > &
20 GOTO 10

View File

@ -0,0 +1,3 @@
<pre><code>10 PRINT HELLO INFINITE
20 GOTO 10
</code></pre>

View File

@ -0,0 +1,2 @@
10 PRINT HELLO INFINITE
20 GOTO 10

View File

@ -0,0 +1 @@
<p>as<em>te</em>risks</p>

View File

@ -0,0 +1 @@
as*te*risks

View File

@ -0,0 +1 @@
<p><em>single asterisks</em></p>

1
test/karlcow/em-star.md Normal file
View File

@ -0,0 +1 @@
*single asterisks*

View File

@ -0,0 +1 @@
<p><em>single underscores</em></p>

View File

@ -0,0 +1 @@
_single underscores_

View File

@ -0,0 +1 @@
<p>HTML entities are written using ampersand notation: &copy;</p>

View File

@ -0,0 +1 @@
HTML entities are written using ampersand notation: &copy;

View File

@ -0,0 +1 @@
<h1>This is an H1</h1>

View File

@ -0,0 +1,2 @@
This is an H1
=============

View File

@ -0,0 +1 @@
<h1>This is an H1</h1>

View File

@ -0,0 +1 @@
# This is an H1 #

View File

@ -0,0 +1 @@
<p># This is an H1</p>

View File

@ -0,0 +1 @@
# This is an H1

View File

@ -0,0 +1,3 @@
<h1>this is an h1 with two trailing spaces</h1>
<p>A new paragraph.</p>

View File

@ -0,0 +1,2 @@
# this is an h1 with two trailing spaces
A new paragraph.

View File

@ -0,0 +1 @@
<h1>This is an H1</h1>

View File

@ -0,0 +1 @@
# This is an H1

View File

@ -0,0 +1 @@
<h2>This is an H2</h2>

View File

@ -0,0 +1,2 @@
This is an H2
-------------

View File

@ -0,0 +1 @@
<h2>This is an H2</h2>

View File

@ -0,0 +1 @@
## This is an H2 ##

View File

@ -0,0 +1 @@
<h2>This is an H2</h2>

View File

@ -0,0 +1 @@
## This is an H2

View File

@ -0,0 +1 @@
<h3>This is an H3</h3>

View File

@ -0,0 +1 @@
### This is an H3 ###

View File

@ -0,0 +1 @@
<h3>This is an H3</h3>

View File

@ -0,0 +1 @@
### This is an H3

View File

@ -0,0 +1 @@
<h4>This is an H4</h4>

View File

@ -0,0 +1 @@
#### This is an H4 ####

View File

@ -0,0 +1 @@
<h4>This is an H4</h4>

Some files were not shown because too many files have changed in this diff Show More