You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
69 lines
1.9 KiB
69 lines
1.9 KiB
module.exports = inlineCode |
|
inlineCode.peek = inlineCodePeek |
|
|
|
var patternCompile = require('../util/pattern-compile') |
|
|
|
function inlineCode(node, parent, context) { |
|
var value = node.value || '' |
|
var sequence = '`' |
|
var index = -1 |
|
var pattern |
|
var expression |
|
var match |
|
var position |
|
|
|
// If there is a single grave accent on its own in the code, use a fence of |
|
// two. |
|
// If there are two in a row, use one. |
|
while (new RegExp('(^|[^`])' + sequence + '([^`]|$)').test(value)) { |
|
sequence += '`' |
|
} |
|
|
|
// If this is not just spaces or eols (tabs don’t count), and either the |
|
// first or last character are a space, eol, or tick, then pad with spaces. |
|
if ( |
|
/[^ \r\n]/.test(value) && |
|
(/[ \r\n`]/.test(value.charAt(0)) || |
|
/[ \r\n`]/.test(value.charAt(value.length - 1))) |
|
) { |
|
value = ' ' + value + ' ' |
|
} |
|
|
|
// We have a potential problem: certain characters after eols could result in |
|
// blocks being seen. |
|
// For example, if someone injected the string `'\n# b'`, then that would |
|
// result in an ATX heading. |
|
// We can’t escape characters in `inlineCode`, but because eols are |
|
// transformed to spaces when going from markdown to HTML anyway, we can swap |
|
// them out. |
|
while (++index < context.unsafe.length) { |
|
pattern = context.unsafe[index] |
|
|
|
// Only look for `atBreak`s. |
|
// Btw: note that `atBreak` patterns will always start the regex at LF or |
|
// CR. |
|
if (!pattern.atBreak) continue |
|
|
|
expression = patternCompile(pattern) |
|
|
|
while ((match = expression.exec(value))) { |
|
position = match.index |
|
|
|
// Support CRLF (patterns only look for one of the characters). |
|
if ( |
|
value.charCodeAt(position) === 10 /* `\n` */ && |
|
value.charCodeAt(position - 1) === 13 /* `\r` */ |
|
) { |
|
position-- |
|
} |
|
|
|
value = value.slice(0, position) + ' ' + value.slice(match.index + 1) |
|
} |
|
} |
|
|
|
return sequence + value + sequence |
|
} |
|
|
|
function inlineCodePeek() { |
|
return '`' |
|
}
|
|
|