| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140 | 
							- // Test if potential opening or closing delimieter
 
- // Assumes that there is a "$" at state.src[pos]
 
- function isValidDelim (state, pos) {
 
-   let prevChar
 
-   let nextChar
 
-   let max = state.posMax
 
-   let canOpen = true
 
-   let canClose = true
 
-   prevChar = pos > 0 ? state.src.charCodeAt(pos - 1) : -1
 
-   nextChar = pos + 1 <= max ? state.src.charCodeAt(pos + 1) : -1
 
-   // Check non-whitespace conditions for opening and closing, and
 
-   // check that closing delimeter isn't followed by a number
 
-   if (prevChar === 0x20/* " " */ || prevChar === 0x09/* \t */ ||
 
-           (nextChar >= 0x30/* "0" */ && nextChar <= 0x39/* "9" */)) {
 
-     canClose = false
 
-   }
 
-   if (nextChar === 0x20/* " " */ || nextChar === 0x09/* \t */) {
 
-     canOpen = false
 
-   }
 
-   return {
 
-     canOpen: canOpen,
 
-     canClose: canClose
 
-   }
 
- }
 
- export default {
 
-   katexInline (state, silent) {
 
-     let start, match, token, res, pos
 
-     if (state.src[state.pos] !== '$') { return false }
 
-     res = isValidDelim(state, state.pos)
 
-     if (!res.canOpen) {
 
-       if (!silent) { state.pending += '$' }
 
-       state.pos += 1
 
-       return true
 
-     }
 
-     // First check for and bypass all properly escaped delimieters
 
-     // This loop will assume that the first leading backtick can not
 
-     // be the first character in state.src, which is known since
 
-     // we have found an opening delimieter already.
 
-     start = state.pos + 1
 
-     match = start
 
-     while ((match = state.src.indexOf('$', match)) !== -1) {
 
-       // Found potential $, look for escapes, pos will point to
 
-       // first non escape when complete
 
-       pos = match - 1
 
-       while (state.src[pos] === '\\') { pos -= 1 }
 
-       // Even number of escapes, potential closing delimiter found
 
-       if (((match - pos) % 2) === 1) { break }
 
-       match += 1
 
-     }
 
-     // No closing delimter found.  Consume $ and continue.
 
-     if (match === -1) {
 
-       if (!silent) { state.pending += '$' }
 
-       state.pos = start
 
-       return true
 
-     }
 
-     // Check if we have empty content, ie: $$.  Do not parse.
 
-     if (match - start === 0) {
 
-       if (!silent) { state.pending += '$$' }
 
-       state.pos = start + 1
 
-       return true
 
-     }
 
-     // Check for valid closing delimiter
 
-     res = isValidDelim(state, match)
 
-     if (!res.canClose) {
 
-       if (!silent) { state.pending += '$' }
 
-       state.pos = start
 
-       return true
 
-     }
 
-     if (!silent) {
 
-       token = state.push('katex_inline', 'math', 0)
 
-       token.markup = '$'
 
-       token.content = state.src.slice(start, match)
 
-     }
 
-     state.pos = match + 1
 
-     return true
 
-   },
 
-   katexBlock (state, start, end, silent) {
 
-     let firstLine; let lastLine; let next; let lastPos; let found = false; let token
 
-     let pos = state.bMarks[start] + state.tShift[start]
 
-     let max = state.eMarks[start]
 
-     if (pos + 2 > max) { return false }
 
-     if (state.src.slice(pos, pos + 2) !== '$$') { return false }
 
-     pos += 2
 
-     firstLine = state.src.slice(pos, max)
 
-     if (silent) { return true }
 
-     if (firstLine.trim().slice(-2) === '$$') {
 
-       // Single line expression
 
-       firstLine = firstLine.trim().slice(0, -2)
 
-       found = true
 
-     }
 
-     for (next = start; !found;) {
 
-       next++
 
-       if (next >= end) { break }
 
-       pos = state.bMarks[next] + state.tShift[next]
 
-       max = state.eMarks[next]
 
-       if (pos < max && state.tShift[next] < state.blkIndent) {
 
-         // non-empty line with negative indent should stop the list:
 
-         break
 
-       }
 
-       if (state.src.slice(pos, max).trim().slice(-2) === '$$') {
 
-         lastPos = state.src.slice(0, max).lastIndexOf('$$')
 
-         lastLine = state.src.slice(pos, lastPos)
 
-         found = true
 
-       }
 
-     }
 
-     state.line = next + 1
 
-     token = state.push('katex_block', 'math', 0)
 
-     token.block = true
 
-     token.content = (firstLine && firstLine.trim() ? firstLine + '\n' : '') +
 
-     state.getLines(start + 1, next, state.tShift[start], true) +
 
-     (lastLine && lastLine.trim() ? lastLine : '')
 
-     token.map = [ start, state.line ]
 
-     token.markup = '$$'
 
-     return true
 
-   }
 
- }
 
 
  |