diff --git a/spec/fixtures/md/spec.txt b/spec/fixtures/md/spec.txt index c66f93b77fc..08ce0a57ef9 100644 --- a/spec/fixtures/md/spec.txt +++ b/spec/fixtures/md/spec.txt @@ -1,8 +1,8 @@ --- title: CommonMark Spec author: John MacFarlane -version: 0.27 -date: '2016-11-18' +version: 0.28 +date: '2017-08-01' license: '[CC-BY-SA 4.0](http://creativecommons.org/licenses/by-sa/4.0/)' ... @@ -11,10 +11,12 @@ license: '[CC-BY-SA 4.0](http://creativecommons.org/licenses/by-sa/4.0/)' ## What is Markdown? Markdown is a plain text format for writing structured documents, -based on conventions used for indicating formatting in email and -usenet posts. It was developed in 2004 by John Gruber, who wrote -the first Markdown-to-HTML converter in Perl, and it soon became -ubiquitous. In the next decade, dozens of implementations were +based on conventions for indicating formatting in email +and usenet posts. It was developed by John Gruber (with +help from Aaron Swartz) and released in 2004 in the form of a +[syntax description](http://daringfireball.net/projects/markdown/syntax) +and a Perl script (`Markdown.pl`) for converting Markdown to +HTML. In the next decade, dozens of implementations were developed in many languages. Some extended the original Markdown syntax with conventions for footnotes, tables, and other document elements. Some allowed Markdown documents to be @@ -312,7 +314,7 @@ form feed (`U+000C`), or carriage return (`U+000D`). characters]. A [Unicode whitespace character](@) is -any code point in the Unicode `Zs` class, or a tab (`U+0009`), +any code point in the Unicode `Zs` general category, or a tab (`U+0009`), carriage return (`U+000D`), newline (`U+000A`), or form feed (`U+000C`). @@ -331,7 +333,7 @@ is `!`, `"`, `#`, `$`, `%`, `&`, `'`, `(`, `)`, A [punctuation character](@) is an [ASCII punctuation character] or anything in -the Unicode classes `Pc`, `Pd`, `Pe`, `Pf`, `Pi`, `Po`, or `Ps`. +the general Unicode categories `Pc`, `Pd`, `Pe`, `Pf`, `Pi`, `Po`, or `Ps`. ## Tabs @@ -402,8 +404,8 @@ as indentation with four spaces would: Normally the `>` that begins a block quote may be followed optionally by a space, which is not considered part of the content. In the following case `>` is followed by a tab, -which is treated as if it were expanded into spaces. -Since one of theses spaces is considered part of the +which is treated as if it were expanded into three spaces. +Since one of these spaces is considered part of the delimiter, `foo` is considered to be indented six spaces inside the block quote context, so we get an indented code block starting with two spaces. @@ -481,7 +483,7 @@ We can think of a document as a sequence of quotations, lists, headings, rules, and code blocks. Some blocks (like block quotes and list items) contain other blocks; others (like headings and paragraphs) contain [inline](@) content---text, -links, emphasized text, images, code, and so on. +links, emphasized text, images, code spans, and so on. ## Precedence @@ -525,7 +527,7 @@ Markdown document. A line consisting of 0-3 spaces of indentation, followed by a sequence of three or more matching `-`, `_`, or `*` characters, each followed -optionally by any number of spaces, forms a +optionally by any number of spaces or tabs, forms a [thematic break](@). ```````````````````````````````` example @@ -1582,7 +1584,7 @@ begins with a code fence, indented no more than three spaces. The line with the opening code fence may optionally contain some text following the code fence; this is trimmed of leading and trailing -spaces and called the [info string](@). +whitespace and called the [info string](@). The [info string] may not contain any backtick characters. (The reason for this restriction is that otherwise some inline code would be incorrectly interpreted as the @@ -1643,6 +1645,15 @@ With tildes: ```````````````````````````````` +Fewer than three backticks is not enough: + +```````````````````````````````` example +`` +foo +`` +. +

foo

+```````````````````````````````` The closing code fence must use the same character as the opening fence: @@ -2031,6 +2042,37 @@ or [closing tag] (with any [tag name] other than `script`, or the end of the line.\ **End condition:** line is followed by a [blank line]. +HTML blocks continue until they are closed by their appropriate +[end condition], or the last line of the document or other [container block]. +This means any HTML **within an HTML block** that might otherwise be recognised +as a start condition will be ignored by the parser and passed through as-is, +without changing the parser's state. + +For instance, `
` within a HTML block started by `` will not affect
+the parser state; as the HTML block was started in by start condition 6, it
+will end at any blank line. This can be surprising:
+
+```````````````````````````````` example
+
+
+**Hello**,
+
+_world_.
+
+
+. +
+
+**Hello**,
+

world. +

+
+```````````````````````````````` + +In this case, the HTML block is terminated by the newline — the `**Hello**` +text remains verbatim — and regular parsing resumes, with a paragraph, +emphasised `world` and inline and block HTML following. + All types of [HTML blocks] except type 7 may interrupt a paragraph. Blocks of type 7 may not interrupt a paragraph. (This restriction is intended to prevent unwanted interpretation @@ -3637,11 +3679,15 @@ The following rules define [list items]: If the list item is ordered, then it is also assigned a start number, based on the ordered list marker. - Exceptions: When the first list item in a [list] interrupts - a paragraph---that is, when it starts on a line that would - otherwise count as [paragraph continuation text]---then (a) - the lines *Ls* must not begin with a blank line, and (b) if - the list item is ordered, the start number must be 1. + Exceptions: + + 1. When the first list item in a [list] interrupts + a paragraph---that is, when it starts on a line that would + otherwise count as [paragraph continuation text]---then (a) + the lines *Ls* must not begin with a blank line, and (b) if + the list item is ordered, the start number must be 1. + 2. If any line is a [thematic break][thematic breaks] then + that line is not a list item. For example, let *Ls* be the lines @@ -5796,6 +5842,15 @@ we just have literal backticks:

`foo

```````````````````````````````` +The following case also illustrates the need for opening and +closing backtick strings to be equal in length: + +```````````````````````````````` example +`foo``bar`` +. +

`foobar

+```````````````````````````````` + ## Emphasis and strong emphasis @@ -5845,19 +5900,20 @@ for efficient parsing strategies that do not backtrack. First, some definitions. A [delimiter run](@) is either a sequence of one or more `*` characters that is not preceded or -followed by a `*` character, or a sequence of one or more `_` -characters that is not preceded or followed by a `_` character. +followed by a non-backslash-escaped `*` character, or a sequence +of one or more `_` characters that is not preceded or followed by +a non-backslash-escaped `_` character. A [left-flanking delimiter run](@) is a [delimiter run] that is (a) not followed by [Unicode whitespace], -and (b) either not followed by a [punctuation character], or +and (b) not followed by a [punctuation character], or preceded by [Unicode whitespace] or a [punctuation character]. For purposes of this definition, the beginning and the end of the line count as Unicode whitespace. A [right-flanking delimiter run](@) is a [delimiter run] that is (a) not preceded by [Unicode whitespace], -and (b) either not preceded by a [punctuation character], or +and (b) not preceded by a [punctuation character], or followed by [Unicode whitespace] or a [punctuation character]. For purposes of this definition, the beginning and the end of the line count as Unicode whitespace. @@ -5936,7 +5992,7 @@ The following rules define emphasis and strong emphasis: 7. A double `**` [can close strong emphasis](@) iff it is part of a [right-flanking delimiter run]. -8. A double `__` [can close strong emphasis] +8. A double `__` [can close strong emphasis] iff it is part of a [right-flanking delimiter run] and either (a) not part of a [left-flanking delimiter run] or (b) part of a [left-flanking delimiter run] @@ -5976,8 +6032,8 @@ the following principles resolve ambiguity: an interpretation `...` is always preferred to `...`. -14. An interpretation `...` is always - preferred to `..`. +14. An interpretation `...` is always + preferred to `...`. 15. When two potential emphasis or strong emphasis spans overlap, so that the second begins before the first ends and ends after @@ -7000,14 +7056,14 @@ Rule 14: ```````````````````````````````` example ***foo*** . -

foo

+

foo

```````````````````````````````` ```````````````````````````````` example _____foo_____ . -

foo

+

foo

```````````````````````````````` @@ -7148,8 +7204,9 @@ A [link destination](@) consists of either - a nonempty sequence of characters that does not include ASCII space or control characters, and includes parentheses only if (a) they are backslash-escaped or (b) they are part of - a balanced pair of unescaped parentheses that is not itself - inside a balanced pair of unescaped parentheses. + a balanced pair of unescaped parentheses. (Implementations + may impose limits on parentheses nesting to avoid performance + issues, but at least three levels of nesting should be supported.) A [link title](@) consists of either @@ -7255,35 +7312,29 @@ Parentheses inside the link destination may be escaped:

link

```````````````````````````````` -One level of balanced parentheses is allowed without escaping: - -```````````````````````````````` example -[link]((foo)and(bar)) -. -

link

-```````````````````````````````` - -However, if you have parentheses within parentheses, you need to escape -or use the `<...>` form: +Any number of parentheses are allowed without escaping, as long as they are +balanced: ```````````````````````````````` example [link](foo(and(bar))) . -

[link](foo(and(bar)))

+

link

+```````````````````````````````` + +However, if you have unbalanced parentheses, you need to escape or use the +`<...>` form: + +```````````````````````````````` example +[link](foo\(and\(bar\)) +. +

link

```````````````````````````````` ```````````````````````````````` example -[link](foo(and\(bar\))) +[link]() . -

link

-```````````````````````````````` - - -```````````````````````````````` example -[link]() -. -

link

+

link

```````````````````````````````` @@ -7567,13 +7618,16 @@ that [matches] a [link reference definition] elsewhere in the document. A [link label](@) begins with a left bracket (`[`) and ends with the first right bracket (`]`) that is not backslash-escaped. Between these brackets there must be at least one [non-whitespace character]. -Unescaped square bracket characters are not allowed in -[link labels]. A link label can have at most 999 -characters inside the square brackets. +Unescaped square bracket characters are not allowed inside the +opening and closing square brackets of [link labels]. A link +label can have at most 999 characters inside the square +brackets. One label [matches](@) another just in case their normalized forms are equal. To normalize a -label, perform the *Unicode case fold* and collapse consecutive internal +label, strip off the opening and closing brackets, +perform the *Unicode case fold*, strip leading and trailing +[whitespace] and collapse consecutive internal [whitespace] to a single space. If there are multiple matching reference link definitions, the one that comes first in the document is used. (It is desirable in such cases to emit a warning.) @@ -8326,11 +8380,11 @@ The link labels are case-insensitive: ```````````````````````````````` -If you just want bracketed text, you can backslash-escape the -opening `!` and `[`: +If you just want a literal `!` followed by bracketed text, you can +backslash-escape the opening `[`: ```````````````````````````````` example -\!\[foo] +!\[foo] [foo]: /url "title" . @@ -8570,7 +8624,7 @@ a [single-quoted attribute value], or a [double-quoted attribute value]. An [unquoted attribute value](@) is a nonempty string of characters not -including spaces, `"`, `'`, `=`, `<`, `>`, or `` ` ``. +including [whitespace], `"`, `'`, `=`, `<`, `>`, or `` ` ``. A [single-quoted attribute value](@) consists of `'`, zero or more @@ -8691,9 +8745,13 @@ Illegal [whitespace]: ```````````````````````````````` example < a>< foo> + .

< a>< -foo><bar/ >

+foo><bar/ > +<foo bar=baz +bim!bop />

```````````````````````````````` diff --git a/test/javascripts/lib/pretty-text-test.js.es6 b/test/javascripts/lib/pretty-text-test.js.es6 index 293871bb519..8d1d7afb2ae 100644 --- a/test/javascripts/lib/pretty-text-test.js.es6 +++ b/test/javascripts/lib/pretty-text-test.js.es6 @@ -67,7 +67,7 @@ QUnit.test("basic cooking", assert => { assert.cooked("__bold__", "

bold

", "it bolds text."); assert.cooked("*trout*", "

trout

", "it italicizes text."); assert.cooked("_trout_", "

trout

", "it italicizes text."); - assert.cooked("***hello***", "

hello

", "it can do bold and italics at once."); + assert.cooked("***hello***", "

hello

", "it can do bold and italics at once."); assert.cooked("word_with_underscores", "

word_with_underscores

", "it doesn't do intraword italics"); assert.cooked("common/_special_font_face.html.erb", "

common/_special_font_face.html.erb

", "it doesn't intraword with a slash"); assert.cooked("hello \\*evil\\*", "

hello *evil*

", "it supports escaping of asterisks"); diff --git a/vendor/assets/javascripts/markdown-it.js b/vendor/assets/javascripts/markdown-it.js index 2de3b1c16e4..c71e33057ae 100644 --- a/vendor/assets/javascripts/markdown-it.js +++ b/vendor/assets/javascripts/markdown-it.js @@ -1,4 +1,4 @@ -/*! markdown-it 8.3.1 https://github.com//markdown-it/markdown-it @license MIT */(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.markdownit = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o utf16string } // 'use strict'; @@ -64,10 +64,8 @@ module.exports = [ 'option', 'p', 'param', - 'pre', 'section', 'source', - 'title', 'summary', 'table', 'tbody', @@ -459,18 +457,18 @@ module.exports = function parseLinkDestination(str, pos, max) { if (code === 0x28 /* ( */) { level++; - if (level > 1) { break; } } if (code === 0x29 /* ) */) { + if (level === 0) { break; } level--; - if (level < 0) { break; } } pos++; } if (start === pos) { return result; } + if (level !== 0) { return result; } result.str = unescapeAll(str.slice(start, pos)); result.lines = lines; @@ -1185,7 +1183,7 @@ var _rules = [ [ 'table', require('./rules_block/table'), [ 'paragraph', 'reference' ] ], [ 'code', require('./rules_block/code') ], [ 'fence', require('./rules_block/fence'), [ 'paragraph', 'reference', 'blockquote', 'list' ] ], - [ 'blockquote', require('./rules_block/blockquote'), [ 'paragraph', 'reference', 'list' ] ], + [ 'blockquote', require('./rules_block/blockquote'), [ 'paragraph', 'reference', 'blockquote', 'list' ] ], [ 'hr', require('./rules_block/hr'), [ 'paragraph', 'reference', 'blockquote', 'list' ] ], [ 'list', require('./rules_block/list'), [ 'paragraph', 'reference', 'blockquote' ] ], [ 'reference', require('./rules_block/reference') ], @@ -1250,7 +1248,7 @@ ParserBlock.prototype.tokenize = function (state, startLine, endLine) { if (ok) { break; } } - // set state.tight iff we had an empty line before current tag + // set state.tight if we had an empty line before current tag // i.e. latest empty line should not count state.tight = !hasEmptyLines; @@ -1778,7 +1776,7 @@ default_rules.fence = function (tokens, idx, options, env, slf) { return highlighted + '\n'; } - // If language exists, inject class gently, without mudofying original token. + // If language exists, inject class gently, without modifying original token. // May be, one day we will add .clone() for token and simplify this part, but // now we prefer to keep things local. if (info) { @@ -1867,7 +1865,7 @@ function Renderer() { * var result = md.renderInline(...); * ``` * - * Each rule is called as independed static function with fixed signature: + * Each rule is called as independent static function with fixed signature: * * ```javascript * function my_token_render(tokens, idx, options, env, renderer) { @@ -2423,7 +2421,6 @@ module.exports = function blockquote(state, startLine, endLine, silent) { ch, i, initial, - isOutdented, l, lastLineEmpty, lines, @@ -2439,6 +2436,7 @@ module.exports = function blockquote(state, startLine, endLine, silent) { terminate, terminatorRules, token, + wasOutdented, oldLineMax = state.lineMax, pos = state.bMarks[startLine] + state.tShift[startLine], max = state.eMarks[startLine]; @@ -2519,6 +2517,7 @@ module.exports = function blockquote(state, startLine, endLine, silent) { oldParentType = state.parentType; state.parentType = 'blockquote'; + wasOutdented = false; // Search the end of the block // @@ -2547,7 +2546,7 @@ module.exports = function blockquote(state, startLine, endLine, silent) { // > current blockquote // 2. checking this line // ``` - isOutdented = state.sCount[nextLine] < state.blkIndent; + if (state.sCount[nextLine] < state.blkIndent) wasOutdented = true; pos = state.bMarks[nextLine] + state.tShift[nextLine]; max = state.eMarks[nextLine]; @@ -2557,7 +2556,7 @@ module.exports = function blockquote(state, startLine, endLine, silent) { break; } - if (state.src.charCodeAt(pos++) === 0x3E/* > */ && !isOutdented) { + if (state.src.charCodeAt(pos++) === 0x3E/* > */ && !wasOutdented) { // This line is inside the blockquote. // skip spaces after ">" and re-calculate offset @@ -2657,8 +2656,6 @@ module.exports = function blockquote(state, startLine, endLine, silent) { break; } - if (isOutdented) break; - oldBMarks.push(state.bMarks[nextLine]); oldBSCount.push(state.bsCount[nextLine]); oldTShift.push(state.tShift[nextLine]); @@ -3103,7 +3100,7 @@ module.exports = function lheading(state, startLine, endLine/*, silent*/) { var isSpace = require('../common/utils').isSpace; -// Search `[-+*][\n ]`, returns next pos arter marker on success +// Search `[-+*][\n ]`, returns next pos after marker on success // or -1 on fail. function skipBulletListMarker(state, startLine) { var marker, pos, max, ch; @@ -3131,7 +3128,7 @@ function skipBulletListMarker(state, startLine) { return pos; } -// Search `\d+[.)][\n ]`, returns next pos arter marker on success +// Search `\d+[.)][\n ]`, returns next pos after marker on success // or -1 on fail. function skipOrderedListMarker(state, startLine) { var ch, @@ -3308,12 +3305,10 @@ module.exports = function list(state, startLine, endLine, silent) { while (pos < max) { ch = state.src.charCodeAt(pos); - if (isSpace(ch)) { - if (ch === 0x09) { - offset += 4 - (offset + state.bsCount[nextLine]) % 4; - } else { - offset++; - } + if (ch === 0x09) { + offset += 4 - (offset + state.bsCount[nextLine]) % 4; + } else if (ch === 0x20) { + offset++; } else { break; } @@ -3414,7 +3409,7 @@ module.exports = function list(state, startLine, endLine, silent) { if (markerCharCode !== state.src.charCodeAt(posAfterMarker - 1)) { break; } } - // Finilize list + // Finalize list if (isOrdered) { token = state.push('ordered_list_close', 'ol', -1); } else { @@ -4480,7 +4475,8 @@ function process_inlines(tokens, state) { lastChar = text.charCodeAt(t.index - 1); } else { for (j = i - 1; j >= 0; j--) { - if (tokens[j].type !== 'text') { continue; } + if (tokens[j].type === 'softbreak' || tokens[j].type === 'hardbreak') break; // lastChar defaults to 0x20 + if (tokens[j].type !== 'text') continue; lastChar = tokens[j].content.charCodeAt(tokens[j].content.length - 1); break; @@ -4496,7 +4492,8 @@ function process_inlines(tokens, state) { nextChar = text.charCodeAt(pos); } else { for (j = i + 1; j < tokens.length; j++) { - if (tokens[j].type !== 'text') { continue; } + if (tokens[j].type === 'softbreak' || tokens[j].type === 'hardbreak') break; // nextChar defaults to 0x20 + if (tokens[j].type !== 'text') continue; nextChar = tokens[j].content.charCodeAt(0); break; @@ -4880,7 +4877,7 @@ module.exports.postProcess = function emphasis(state) { delimiters = state.delimiters, max = state.delimiters.length; - for (i = 0; i < max; i++) { + for (i = max - 1; i >= 0; i--) { startDelim = delimiters[i]; if (startDelim.marker !== 0x5F/* _ */ && startDelim.marker !== 0x2A/* * */) { @@ -4894,16 +4891,16 @@ module.exports.postProcess = function emphasis(state) { endDelim = delimiters[startDelim.end]; - // If the next delimiter has the same marker and is adjacent to this one, + // If the previous delimiter has the same marker and is adjacent to this one, // merge those into one strong delimiter. // // `whatever` -> `whatever` // - isStrong = i + 1 < max && - delimiters[i + 1].end === startDelim.end - 1 && - delimiters[i + 1].token === startDelim.token + 1 && - delimiters[startDelim.end - 1].token === endDelim.token - 1 && - delimiters[i + 1].marker === startDelim.marker; + isStrong = i > 0 && + delimiters[i - 1].end === startDelim.end + 1 && + delimiters[i - 1].token === startDelim.token - 1 && + delimiters[startDelim.end + 1].token === endDelim.token + 1 && + delimiters[i - 1].marker === startDelim.marker; ch = String.fromCharCode(startDelim.marker); @@ -4922,9 +4919,9 @@ module.exports.postProcess = function emphasis(state) { token.content = ''; if (isStrong) { - state.tokens[delimiters[i + 1].token].content = ''; - state.tokens[delimiters[startDelim.end - 1].token].content = ''; - i++; + state.tokens[delimiters[i - 1].token].content = ''; + state.tokens[delimiters[startDelim.end + 1].token].content = ''; + i--; } } }; @@ -4980,7 +4977,7 @@ module.exports = function entity(state, silent) { }; },{"../common/entities":1,"../common/utils":4}],42:[function(require,module,exports){ -// Proceess escaped chars and hardbreaks +// Process escaped chars and hardbreaks 'use strict'; @@ -7944,7 +7941,7 @@ module.exports=/[\0-\x1F\x7F-\x9F]/ },{}],62:[function(require,module,exports){ module.exports=/[\xAD\u0600-\u0605\u061C\u06DD\u070F\u08E2\u180E\u200B-\u200F\u202A-\u202E\u2060-\u2064\u2066-\u206F\uFEFF\uFFF9-\uFFFB]|\uD804\uDCBD|\uD82F[\uDCA0-\uDCA3]|\uD834[\uDD73-\uDD7A]|\uDB40[\uDC01\uDC20-\uDC7F]/ },{}],63:[function(require,module,exports){ -module.exports=/[!-#%-\*,-/:;\?@\[-\]_\{\}\xA1\xA7\xAB\xB6\xB7\xBB\xBF\u037E\u0387\u055A-\u055F\u0589\u058A\u05BE\u05C0\u05C3\u05C6\u05F3\u05F4\u0609\u060A\u060C\u060D\u061B\u061E\u061F\u066A-\u066D\u06D4\u0700-\u070D\u07F7-\u07F9\u0830-\u083E\u085E\u0964\u0965\u0970\u0AF0\u0DF4\u0E4F\u0E5A\u0E5B\u0F04-\u0F12\u0F14\u0F3A-\u0F3D\u0F85\u0FD0-\u0FD4\u0FD9\u0FDA\u104A-\u104F\u10FB\u1360-\u1368\u1400\u166D\u166E\u169B\u169C\u16EB-\u16ED\u1735\u1736\u17D4-\u17D6\u17D8-\u17DA\u1800-\u180A\u1944\u1945\u1A1E\u1A1F\u1AA0-\u1AA6\u1AA8-\u1AAD\u1B5A-\u1B60\u1BFC-\u1BFF\u1C3B-\u1C3F\u1C7E\u1C7F\u1CC0-\u1CC7\u1CD3\u2010-\u2027\u2030-\u2043\u2045-\u2051\u2053-\u205E\u207D\u207E\u208D\u208E\u2308-\u230B\u2329\u232A\u2768-\u2775\u27C5\u27C6\u27E6-\u27EF\u2983-\u2998\u29D8-\u29DB\u29FC\u29FD\u2CF9-\u2CFC\u2CFE\u2CFF\u2D70\u2E00-\u2E2E\u2E30-\u2E44\u3001-\u3003\u3008-\u3011\u3014-\u301F\u3030\u303D\u30A0\u30FB\uA4FE\uA4FF\uA60D-\uA60F\uA673\uA67E\uA6F2-\uA6F7\uA874-\uA877\uA8CE\uA8CF\uA8F8-\uA8FA\uA8FC\uA92E\uA92F\uA95F\uA9C1-\uA9CD\uA9DE\uA9DF\uAA5C-\uAA5F\uAADE\uAADF\uAAF0\uAAF1\uABEB\uFD3E\uFD3F\uFE10-\uFE19\uFE30-\uFE52\uFE54-\uFE61\uFE63\uFE68\uFE6A\uFE6B\uFF01-\uFF03\uFF05-\uFF0A\uFF0C-\uFF0F\uFF1A\uFF1B\uFF1F\uFF20\uFF3B-\uFF3D\uFF3F\uFF5B\uFF5D\uFF5F-\uFF65]|\uD800[\uDD00-\uDD02\uDF9F\uDFD0]|\uD801\uDD6F|\uD802[\uDC57\uDD1F\uDD3F\uDE50-\uDE58\uDE7F\uDEF0-\uDEF6\uDF39-\uDF3F\uDF99-\uDF9C]|\uD804[\uDC47-\uDC4D\uDCBB\uDCBC\uDCBE-\uDCC1\uDD40-\uDD43\uDD74\uDD75\uDDC5-\uDDC9\uDDCD\uDDDB\uDDDD-\uDDDF\uDE38-\uDE3D\uDEA9]|\uD805[\uDC4B-\uDC4F\uDC5B\uDC5D\uDCC6\uDDC1-\uDDD7\uDE41-\uDE43\uDE60-\uDE6C\uDF3C-\uDF3E]|\uD807[\uDC41-\uDC45\uDC70\uDC71]|\uD809[\uDC70-\uDC74]|\uD81A[\uDE6E\uDE6F\uDEF5\uDF37-\uDF3B\uDF44]|\uD82F\uDC9F|\uD836[\uDE87-\uDE8B]|\uD83A[\uDD5E\uDD5F]/ +module.exports=/[!-#%-\*,-/:;\?@\[-\]_\{\}\xA1\xA7\xAB\xB6\xB7\xBB\xBF\u037E\u0387\u055A-\u055F\u0589\u058A\u05BE\u05C0\u05C3\u05C6\u05F3\u05F4\u0609\u060A\u060C\u060D\u061B\u061E\u061F\u066A-\u066D\u06D4\u0700-\u070D\u07F7-\u07F9\u0830-\u083E\u085E\u0964\u0965\u0970\u09FD\u0AF0\u0DF4\u0E4F\u0E5A\u0E5B\u0F04-\u0F12\u0F14\u0F3A-\u0F3D\u0F85\u0FD0-\u0FD4\u0FD9\u0FDA\u104A-\u104F\u10FB\u1360-\u1368\u1400\u166D\u166E\u169B\u169C\u16EB-\u16ED\u1735\u1736\u17D4-\u17D6\u17D8-\u17DA\u1800-\u180A\u1944\u1945\u1A1E\u1A1F\u1AA0-\u1AA6\u1AA8-\u1AAD\u1B5A-\u1B60\u1BFC-\u1BFF\u1C3B-\u1C3F\u1C7E\u1C7F\u1CC0-\u1CC7\u1CD3\u2010-\u2027\u2030-\u2043\u2045-\u2051\u2053-\u205E\u207D\u207E\u208D\u208E\u2308-\u230B\u2329\u232A\u2768-\u2775\u27C5\u27C6\u27E6-\u27EF\u2983-\u2998\u29D8-\u29DB\u29FC\u29FD\u2CF9-\u2CFC\u2CFE\u2CFF\u2D70\u2E00-\u2E2E\u2E30-\u2E49\u3001-\u3003\u3008-\u3011\u3014-\u301F\u3030\u303D\u30A0\u30FB\uA4FE\uA4FF\uA60D-\uA60F\uA673\uA67E\uA6F2-\uA6F7\uA874-\uA877\uA8CE\uA8CF\uA8F8-\uA8FA\uA8FC\uA92E\uA92F\uA95F\uA9C1-\uA9CD\uA9DE\uA9DF\uAA5C-\uAA5F\uAADE\uAADF\uAAF0\uAAF1\uABEB\uFD3E\uFD3F\uFE10-\uFE19\uFE30-\uFE52\uFE54-\uFE61\uFE63\uFE68\uFE6A\uFE6B\uFF01-\uFF03\uFF05-\uFF0A\uFF0C-\uFF0F\uFF1A\uFF1B\uFF1F\uFF20\uFF3B-\uFF3D\uFF3F\uFF5B\uFF5D\uFF5F-\uFF65]|\uD800[\uDD00-\uDD02\uDF9F\uDFD0]|\uD801\uDD6F|\uD802[\uDC57\uDD1F\uDD3F\uDE50-\uDE58\uDE7F\uDEF0-\uDEF6\uDF39-\uDF3F\uDF99-\uDF9C]|\uD804[\uDC47-\uDC4D\uDCBB\uDCBC\uDCBE-\uDCC1\uDD40-\uDD43\uDD74\uDD75\uDDC5-\uDDC9\uDDCD\uDDDB\uDDDD-\uDDDF\uDE38-\uDE3D\uDEA9]|\uD805[\uDC4B-\uDC4F\uDC5B\uDC5D\uDCC6\uDDC1-\uDDD7\uDE41-\uDE43\uDE60-\uDE6C\uDF3C-\uDF3E]|\uD806[\uDE3F-\uDE46\uDE9A-\uDE9C\uDE9E-\uDEA2]|\uD807[\uDC41-\uDC45\uDC70\uDC71]|\uD809[\uDC70-\uDC74]|\uD81A[\uDE6E\uDE6F\uDEF5\uDF37-\uDF3B\uDF44]|\uD82F\uDC9F|\uD836[\uDE87-\uDE8B]|\uD83A[\uDD5E\uDD5F]/ },{}],64:[function(require,module,exports){ module.exports=/[ \xA0\u1680\u2000-\u200A\u202F\u205F\u3000]/ },{}],65:[function(require,module,exports){