Skip to content

Commit

Permalink
Avoid use of slow regex in trim() (#295)
Browse files Browse the repository at this point in the history
`trim()` as previously defined could take a long time on very long strings.
  • Loading branch information
tats-u authored Dec 14, 2024
1 parent f3145e8 commit 38d2938
Showing 1 changed file with 23 additions and 2 deletions.
25 changes: 23 additions & 2 deletions lib/inlines.js
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down

0 comments on commit 38d2938

Please sign in to comment.