mirror of
https://github.com/showdownjs/showdown.git
synced 2024-03-22 13:30:55 +08:00
132 lines
4.8 KiB
JavaScript
132 lines
4.8 KiB
JavaScript
|
/**
|
||
|
* Created by Estevao on 11-01-2015.
|
||
|
*/
|
||
|
|
||
|
showdown.subParser('hashHTMLBlocks', function (text, options, globals) {
|
||
|
'use strict';
|
||
|
|
||
|
// attacklab: Double up blank lines to reduce lookaround
|
||
|
text = text.replace(/\n/g, '\n\n');
|
||
|
|
||
|
// Hashify HTML blocks:
|
||
|
// We only want to do this for block-level HTML tags, such as headers,
|
||
|
// lists, and tables. That's because we still want to wrap <p>s around
|
||
|
// "paragraphs" that are wrapped in non-block-level tags, such as anchors,
|
||
|
// phrase emphasis, and spans. The list of tags we're looking for is
|
||
|
// hard-coded:
|
||
|
//var block_tags_a = 'p|div|h[1-6]|blockquote|pre|table|dl|ol|ul|script|noscript|form|fieldset|iframe|math|ins|del|style|section|header|footer|nav|article|aside';
|
||
|
//var block_tags_b = 'p|div|h[1-6]|blockquote|pre|table|dl|ol|ul|script|noscript|form|fieldset|iframe|math|style|section|header|footer|nav|article|aside';
|
||
|
|
||
|
// First, look for nested blocks, e.g.:
|
||
|
// <div>
|
||
|
// <div>
|
||
|
// tags for inner block must be indented.
|
||
|
// </div>
|
||
|
// </div>
|
||
|
//
|
||
|
// The outermost tags must start at the left margin for this to match, and
|
||
|
// the inner nested divs must be indented.
|
||
|
// We need to do this before the next, more liberal match, because the next
|
||
|
// match will start at the first `<div>` and stop at the first `</div>`.
|
||
|
|
||
|
// attacklab: This regex can be expensive when it fails.
|
||
|
/*
|
||
|
var text = text.replace(/
|
||
|
( // save in $1
|
||
|
^ // start of line (with /m)
|
||
|
<($block_tags_a) // start tag = $2
|
||
|
\b // word break
|
||
|
// attacklab: hack around khtml/pcre bug...
|
||
|
[^\r]*?\n // any number of lines, minimally matching
|
||
|
</\2> // the matching end tag
|
||
|
[ \t]* // trailing spaces/tabs
|
||
|
(?=\n+) // followed by a newline
|
||
|
) // attacklab: there are sentinel newlines at end of document
|
||
|
/gm,function(){...}};
|
||
|
*/
|
||
|
text = text.replace(/^(<(p|div|h[1-6]|blockquote|pre|table|dl|ol|ul|script|noscript|form|fieldset|iframe|math|ins|del)\b[^\r]*?\n<\/\2>[ \t]*(?=\n+))/gm, showdown.subParser('hashElement')(text, options, globals));
|
||
|
|
||
|
//
|
||
|
// Now match more liberally, simply from `\n<tag>` to `</tag>\n`
|
||
|
//
|
||
|
|
||
|
/*
|
||
|
var text = text.replace(/
|
||
|
( // save in $1
|
||
|
^ // start of line (with /m)
|
||
|
<($block_tags_b) // start tag = $2
|
||
|
\b // word break
|
||
|
// attacklab: hack around khtml/pcre bug...
|
||
|
[^\r]*? // any number of lines, minimally matching
|
||
|
</\2> // the matching end tag
|
||
|
[ \t]* // trailing spaces/tabs
|
||
|
(?=\n+) // followed by a newline
|
||
|
) // attacklab: there are sentinel newlines at end of document
|
||
|
/gm,function(){...}};
|
||
|
*/
|
||
|
text = text.replace(/^(<(p|div|h[1-6]|blockquote|pre|table|dl|ol|ul|script|noscript|form|fieldset|iframe|math|style|section|header|footer|nav|article|aside)\b[^\r]*?<\/\2>[ \t]*(?=\n+)\n)/gm, showdown.subParser('hashElement')(text, options, globals));
|
||
|
|
||
|
// Special case just for <hr />. It was easier to make a special case than
|
||
|
// to make the other regex more complicated.
|
||
|
|
||
|
/*
|
||
|
text = text.replace(/
|
||
|
( // save in $1
|
||
|
\n\n // Starting after a blank line
|
||
|
[ ]{0,3}
|
||
|
(<(hr) // start tag = $2
|
||
|
\b // word break
|
||
|
([^<>])*? //
|
||
|
\/?>) // the matching end tag
|
||
|
[ \t]*
|
||
|
(?=\n{2,}) // followed by a blank line
|
||
|
)
|
||
|
/g,showdown.subParser('hashElement')(text, options, globals));
|
||
|
*/
|
||
|
text = text.replace(/(\n[ ]{0,3}(<(hr)\b([^<>])*?\/?>)[ \t]*(?=\n{2,}))/g, showdown.subParser('hashElement')(text, options, globals));
|
||
|
|
||
|
// Special case for standalone HTML comments:
|
||
|
|
||
|
/*
|
||
|
text = text.replace(/
|
||
|
( // save in $1
|
||
|
\n\n // Starting after a blank line
|
||
|
[ ]{0,3} // attacklab: g_tab_width - 1
|
||
|
<!
|
||
|
(--[^\r]*?--\s*)+
|
||
|
>
|
||
|
[ \t]*
|
||
|
(?=\n{2,}) // followed by a blank line
|
||
|
)
|
||
|
/g,showdown.subParser('hashElement')(text, options, globals));
|
||
|
*/
|
||
|
text = text.replace(/(\n\n[ ]{0,3}<!(--[^\r]*?--\s*)+>[ \t]*(?=\n{2,}))/g, showdown.subParser('hashElement')(text, options, globals));
|
||
|
|
||
|
// PHP and ASP-style processor instructions (<?...?> and <%...%>)
|
||
|
|
||
|
/*
|
||
|
text = text.replace(/
|
||
|
(?:
|
||
|
\n\n // Starting after a blank line
|
||
|
)
|
||
|
( // save in $1
|
||
|
[ ]{0,3} // attacklab: g_tab_width - 1
|
||
|
(?:
|
||
|
<([?%]) // $2
|
||
|
[^\r]*?
|
||
|
\2>
|
||
|
)
|
||
|
[ \t]*
|
||
|
(?=\n{2,}) // followed by a blank line
|
||
|
)
|
||
|
/g,showdown.subParser('hashElement')(text, options, globals));
|
||
|
*/
|
||
|
text = text.replace(/(?:\n\n)([ ]{0,3}(?:<([?%])[^\r]*?\2>)[ \t]*(?=\n{2,}))/g, showdown.subParser('hashElement')(text, options, globals));
|
||
|
|
||
|
// attacklab: Undo double lines (see comment at top of this function)
|
||
|
text = text.replace(/\n\n/g, '\n');
|
||
|
return text;
|
||
|
|
||
|
|
||
|
});
|