From 38d2938fb2ead542a5119c1085d2248eb59537d1 Mon Sep 17 00:00:00 2001 From: Tatsunori Uchino Date: Sun, 15 Dec 2024 04:41:12 +0900 Subject: [PATCH] Avoid use of slow regex in `trim()` (#295) `trim()` as previously defined could take a long time on very long strings. --- lib/inlines.js | 25 +++++++++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/lib/inlines.js b/lib/inlines.js index 1f0cbb7c..a37d1665 100644 --- a/lib/inlines.js +++ b/lib/inlines.js @@ -980,17 +980,38 @@ var parseInline = function(block) { // Parse string content in block into inline children, // using refmap to resolve references. var parseInlines = function(block) { - // trim() removes non-ASCII whitespaces, vertical tab, form feed and so on. + // String.protoype.trim() removes non-ASCII whitespaces, vertical tab, form feed and so on. // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/trim#return_value // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Lexical_grammar#white_space // Removes only ASCII tab and space. - this.subject = block._string_content.replace(/^[\t \r\n]+|[\t \r\n]+$/g, "") + this.subject = trim(block._string_content) this.pos = 0; this.delimiters = null; this.brackets = null; while (this.parseInline(block)) {} block._string_content = null; // allow raw string to be garbage collected this.processEmphasis(null); + + function trim(str) { + var start = 0; + for(; start < str.length; start++) { + if (!isSpace(str.charCodeAt(start))) { + break; + } + } + var end = str.length - 1; + for(; end >= start; end--) { + if (!isSpace(str.charCodeAt(end))) { + break; + } + } + return str.slice(start, end + 1); + + function isSpace(c) { + // U+0020 = space, U+0009 = tab, U+000A = LF, U+000D = CR + return c === 0x20 || c === 9 || c === 0xa || c === 0xd; + } + } }; // The InlineParser object.