2015-01-16 05:21:33 +08:00
|
|
|
/**
|
|
|
|
* Turn Markdown link shortcuts into XHTML <a> tags.
|
|
|
|
*/
|
|
|
|
showdown.subParser('anchors', function (text, config, globals) {
|
2015-01-19 19:37:21 +08:00
|
|
|
'use strict';
|
|
|
|
|
|
|
|
var writeAnchorTag = function (wholeMatch, m1, m2, m3, m4, m5, m6, m7) {
|
|
|
|
if (showdown.helper.isUndefined(m7)) {
|
|
|
|
m7 = '';
|
|
|
|
}
|
|
|
|
wholeMatch = m1;
|
|
|
|
var linkText = m2,
|
|
|
|
linkId = m3.toLowerCase(),
|
|
|
|
url = m4,
|
|
|
|
title = m7;
|
|
|
|
|
|
|
|
if (!url) {
|
|
|
|
if (!linkId) {
|
|
|
|
// lower-case and turn embedded newlines into spaces
|
|
|
|
linkId = linkText.toLowerCase().replace(/ ?\n/g, ' ');
|
|
|
|
}
|
|
|
|
url = '#' + linkId;
|
|
|
|
|
|
|
|
if (!showdown.helper.isUndefined(globals.gUrls[linkId])) {
|
|
|
|
url = globals.gUrls[linkId];
|
|
|
|
if (!showdown.helper.isUndefined(globals.gTitles[linkId])) {
|
|
|
|
title = globals.gTitles[linkId];
|
2015-01-16 05:21:33 +08:00
|
|
|
}
|
2015-01-19 19:37:21 +08:00
|
|
|
} else {
|
|
|
|
if (wholeMatch.search(/\(\s*\)$/m) > -1) {
|
|
|
|
// Special case for explicit empty url
|
|
|
|
url = '';
|
|
|
|
} else {
|
|
|
|
return wholeMatch;
|
2015-01-16 05:21:33 +08:00
|
|
|
}
|
2015-01-19 19:37:21 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2015-01-19 22:57:43 +08:00
|
|
|
url = showdown.helper.escapeCharacters(url, '*_', false);
|
2015-01-19 19:37:21 +08:00
|
|
|
var result = '<a href="' + url + '"';
|
|
|
|
|
|
|
|
if (title !== '' && title !== null) {
|
|
|
|
title = title.replace(/"/g, '"');
|
2015-01-19 22:57:43 +08:00
|
|
|
title = showdown.helper.escapeCharacters(title, '*_', false);
|
2015-01-19 19:37:21 +08:00
|
|
|
result += ' title="' + title + '"';
|
|
|
|
}
|
|
|
|
|
|
|
|
result += '>' + linkText + '</a>';
|
|
|
|
|
|
|
|
return result;
|
|
|
|
};
|
|
|
|
|
|
|
|
// First, handle reference-style links: [link text] [id]
|
|
|
|
/*
|
|
|
|
text = text.replace(/
|
|
|
|
( // wrap whole match in $1
|
|
|
|
\[
|
|
|
|
(
|
|
|
|
(?:
|
|
|
|
\[[^\]]*\] // allow brackets nested one level
|
|
|
|
|
|
|
|
|
[^\[] // or anything else
|
|
|
|
)*
|
|
|
|
)
|
|
|
|
\]
|
|
|
|
|
|
|
|
[ ]? // one optional space
|
|
|
|
(?:\n[ ]*)? // one optional newline followed by spaces
|
|
|
|
|
|
|
|
\[
|
|
|
|
(.*?) // id = $3
|
|
|
|
\]
|
|
|
|
)()()()() // pad remaining backreferences
|
|
|
|
/g,_DoAnchors_callback);
|
|
|
|
*/
|
|
|
|
text = text.replace(/(\[((?:\[[^\]]*\]|[^\[\]])*)\][ ]?(?:\n[ ]*)?\[(.*?)\])()()()()/g, writeAnchorTag);
|
|
|
|
|
|
|
|
//
|
|
|
|
// Next, inline-style links: [link text](url "optional title")
|
|
|
|
//
|
|
|
|
|
|
|
|
/*
|
|
|
|
text = text.replace(/
|
|
|
|
( // wrap whole match in $1
|
|
|
|
\[
|
|
|
|
(
|
|
|
|
(?:
|
|
|
|
\[[^\]]*\] // allow brackets nested one level
|
|
|
|
|
|
|
|
|
[^\[\]] // or anything else
|
|
|
|
)
|
|
|
|
)
|
|
|
|
\]
|
|
|
|
\( // literal paren
|
|
|
|
[ \t]*
|
|
|
|
() // no id, so leave $3 empty
|
|
|
|
<?(.*?)>? // href = $4
|
|
|
|
[ \t]*
|
|
|
|
( // $5
|
|
|
|
(['"]) // quote char = $6
|
|
|
|
(.*?) // Title = $7
|
|
|
|
\6 // matching quote
|
|
|
|
[ \t]* // ignore any spaces/tabs between closing quote and )
|
|
|
|
)? // title is optional
|
|
|
|
\)
|
|
|
|
)
|
|
|
|
/g,writeAnchorTag);
|
|
|
|
*/
|
|
|
|
text = text.replace(/(\[((?:\[[^\]]*\]|[^\[\]])*)\]\([ \t]*()<?(.*?(?:\(.*?\).*?)?)>?[ \t]*((['"])(.*?)\6[ \t]*)?\))/g,
|
|
|
|
writeAnchorTag);
|
|
|
|
|
|
|
|
//
|
|
|
|
// Last, handle reference-style shortcuts: [link text]
|
|
|
|
// These must come last in case you've also got [link test][1]
|
|
|
|
// or [link test](/foo)
|
|
|
|
//
|
|
|
|
|
|
|
|
/*
|
|
|
|
text = text.replace(/
|
2015-01-19 22:57:43 +08:00
|
|
|
( // wrap whole match in $1
|
2015-01-19 19:37:21 +08:00
|
|
|
\[
|
2015-01-19 22:57:43 +08:00
|
|
|
([^\[\]]+) // link text = $2; can't contain '[' or ']'
|
2015-01-19 19:37:21 +08:00
|
|
|
\]
|
2015-01-19 22:57:43 +08:00
|
|
|
)()()()()() // pad rest of backreferences
|
2015-01-19 19:37:21 +08:00
|
|
|
/g, writeAnchorTag);
|
|
|
|
*/
|
|
|
|
text = text.replace(/(\[([^\[\]]+)\])()()()()()/g, writeAnchorTag);
|
|
|
|
|
|
|
|
return text;
|
2015-01-16 05:21:33 +08:00
|
|
|
|
|
|
|
});
|