123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869 |
- 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 '`'
- }
|