diff options
author | John MacFarlane <jgm@berkeley.edu> | 2015-01-09 15:36:53 -0800 |
---|---|---|
committer | John MacFarlane <jgm@berkeley.edu> | 2015-01-09 15:36:53 -0800 |
commit | 4d49f2befc95241abf8f5d7ef07ffd1ef4c23bfb (patch) | |
tree | 42233578f11949646cdd242f561266167f7fc4b0 | |
parent | bdf6f4fe614e1065b74622e7f359d998be5e491e (diff) |
Rewrote HTML escaping for big performance gain.
-rw-r--r-- | benchmarks.md | 8 | ||||
-rw-r--r-- | js/lib/html.js | 24 |
2 files changed, 20 insertions, 12 deletions
diff --git a/benchmarks.md b/benchmarks.md index f6324d7..bc0925f 100644 --- a/benchmarks.md +++ b/benchmarks.md @@ -38,7 +38,7 @@ They can be run using `make benchjs`: |Implementation | ops/sec | |-------------------|-------------| -| showdown.js | 173 ±1.43% | -| **commonmark.js** | 371 ±1.20% | -| marked.js | 554 ±0.48% | -| markdown-it | 694 ±0.97% | +| showdown.js | 169 ±1.72% | +| **commonmark.js** | 420 ±0.88% | +| marked.js | 548 ±0.66% | +| markdown-it | 690 ±1.00% | diff --git a/js/lib/html.js b/js/lib/html.js index 3c1ed4c..1f1b0ba 100644 --- a/js/lib/html.js +++ b/js/lib/html.js @@ -213,6 +213,20 @@ var renderNodes = function(block) { return buffer.join(''); }; +var sub = function(s) { + if (s === '&') { + return '&'; + } else if (s === '<') { + return '<'; + } else if (s === '>') { + return '>'; + } else if (s === '"') { + return '"'; + } else { + return s; + } +}; + // The HtmlRenderer object. function HtmlRenderer(){ @@ -225,15 +239,9 @@ function HtmlRenderer(){ // set to " " if you want to ignore line wrapping in source escape: function(s, preserve_entities) { if (preserve_entities) { - return s.replace(/[&](?![#](x[a-f0-9]{1,8}|[0-9]{1,8});|[a-z][a-z0-9]{1,31};)/gi, '&') - .replace(/[<]/g, '<') - .replace(/[>]/g, '>') - .replace(/["]/g, '"'); + return s.replace(/[&](?:[#](x[a-f0-9]{1,8}|[0-9]{1,8});|[a-z][a-z0-9]{1,31};)|[&<>"]/gi, sub); } else { - return s.replace(/[&]/g, '&') - .replace(/[<]/g, '<') - .replace(/[>]/g, '>') - .replace(/["]/g, '"'); + return s.replace(/[&<>"]/g, sub); } }, render: renderNodes |