From e2fab60c51464d288b43917c65a64f625f79cacc Mon Sep 17 00:00:00 2001 From: Ella Iseulde Van Dorpe Date: Tue, 21 Jul 2015 15:23:45 +0000 Subject: [PATCH] Editor: word count: exclude HTML comments and entities Also make sure `type` is one of the three allowed types and remove unnecessary regex flags. See #30966. git-svn-id: https://develop.svn.wordpress.org/trunk@33344 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-admin/js/word-count.js | 17 +++++++++++++---- tests/qunit/wp-admin/js/word-count.js | 14 ++++++++++++++ 2 files changed, 27 insertions(+), 4 deletions(-) diff --git a/src/wp-admin/js/word-count.js b/src/wp-admin/js/word-count.js index 025412e346..c8cfb2f52d 100644 --- a/src/wp-admin/js/word-count.js +++ b/src/wp-admin/js/word-count.js @@ -14,14 +14,16 @@ shortcodes = this.settings.l10n.shortcodes; if ( shortcodes && shortcodes.length ) { - this.settings.shortcodesRegExp = new RegExp( '\\[\\/?(?:' + shortcodes.join( '|' ) + ')[^\\]]*?\\]', 'gi' ); + this.settings.shortcodesRegExp = new RegExp( '\\[\\/?(?:' + shortcodes.join( '|' ) + ')[^\\]]*?\\]', 'g' ); } } WordCounter.prototype.settings = { HTMLRegExp: /<\/?[a-z][^>]*?>/gi, + HTMLcommentRegExp: //g, spaceRegExp: / | /gi, - connectorRegExp: /--|\u2014/gi, + HTMLEntityRegExp: /&\S+?;/g, + connectorRegExp: /--|\u2014/g, removeRegExp: new RegExp( [ '[', // Basic Latin (extract) @@ -60,19 +62,24 @@ astralRegExp: /[\uD800-\uDBFF][\uDC00-\uDFFF]/g, wordsRegExp: /\S\s+/g, charactersRegExp: /\S/g, - allRegExp: /[^\f\n\r\t\v\u00ad\u2028\u2029]/g, + allRegExp: /[^\f\n\r\t\v\u00AD\u2028\u2029]/g, l10n: window.wordCountL10n || {} }; WordCounter.prototype.count = function( text, type ) { var count = 0; - type = type || this.settings.l10n.type || 'words'; + type = type || this.settings.l10n.type; + + if ( type !== 'characters' && type !== 'all' ) { + type = 'words'; + } if ( text ) { text = text + '\n'; text = text.replace( this.settings.HTMLRegExp, '\n' ); + text = text.replace( this.settings.HTMLcommentRegExp, '' ); if ( this.settings.shortcodesRegExp ) { text = text.replace( this.settings.shortcodesRegExp, '\n' ); @@ -81,9 +88,11 @@ text = text.replace( this.settings.spaceRegExp, ' ' ); if ( type === 'words' ) { + text = text.replace( this.settings.HTMLEntityRegExp, '' ); text = text.replace( this.settings.connectorRegExp, ' ' ); text = text.replace( this.settings.removeRegExp, '' ); } else { + text = text.replace( this.settings.HTMLEntityRegExp, 'a' ); text = text.replace( this.settings.astralRegExp, 'a' ); } diff --git a/tests/qunit/wp-admin/js/word-count.js b/tests/qunit/wp-admin/js/word-count.js index a31fc09668..07100e885f 100644 --- a/tests/qunit/wp-admin/js/word-count.js +++ b/tests/qunit/wp-admin/js/word-count.js @@ -58,6 +58,20 @@ words: 1, characters: 1, all: 1 + }, + { + message: 'HTML comment.', + string: 'onetwo three', + words: 2, + characters: 11, + all: 12 + }, + { + message: 'HTML entity.', + string: '> test', + words: 1, + characters: 5, + all: 6 } ], function( test ) { _.each( [ 'words', 'characters', 'all' ], function( type ) {