X-Git-Url: https://scripts.mit.edu/gitweb/autoinstalls/wordpress.git/blobdiff_plain/8a06f4f9392d1ac373442f82ee40428a3cb81395..d3947bc013df7edd54b46deed8230d2eeafc5ecb:/wp-admin/js/word-count.js diff --git a/wp-admin/js/word-count.js b/wp-admin/js/word-count.js index 9e3c1dff..c0255fd2 100644 --- a/wp-admin/js/word-count.js +++ b/wp-admin/js/word-count.js @@ -1,39 +1,112 @@ -// Word count -(function(JQ) { - wpWordCount = { - - init : function() { - var t = this, last = 0, co = JQ('#content'); - - JQ('#wp-word-count').html( wordCountL10n.count.replace( /%d/, '0' ) ); - t.block = 0; - t.wc(co.val()); - co.keyup( function(e) { - if ( e.keyCode == last ) return true; - if ( 13 == e.keyCode || 8 == last || 46 == last ) t.wc(co.val()); - last = e.keyCode; - return true; - }); - }, - - wc : function(tx) { - var t = this, w = JQ('#word-count'), tc = 0; - - if ( t.block ) return; - t.block = 1; - - setTimeout( function() { - if ( tx ) { - tx = tx.replace( /<.[^<>]*?>/g, ' ' ).replace( / /gi, ' ' ); - tx = tx.replace( /[0-9.(),;:!?%#$¿'"_+=\\/-]*/g, '' ); - tx.replace( /\S\s+/g, function(){tc++;} ); +( function() { + function WordCounter( settings ) { + var key, + shortcodes; + + if ( settings ) { + for ( key in settings ) { + if ( settings.hasOwnProperty( key ) ) { + this.settings[ key ] = settings[ key ]; } - w.html(tc.toString()); + } + } + + shortcodes = this.settings.l10n.shortcodes; - setTimeout( function() { t.block = 0; }, 2000 ); - }, 1 ); + if ( shortcodes && shortcodes.length ) { + this.settings.shortcodesRegExp = new RegExp( '\\[\\/?(?:' + shortcodes.join( '|' ) + ')[^\\]]*?\\]', 'g' ); } - } -}(jQuery)); + } + + WordCounter.prototype.settings = { + HTMLRegExp: /<\/?[a-z][^>]*?>/gi, + HTMLcommentRegExp: //g, + spaceRegExp: / | /gi, + HTMLEntityRegExp: /&\S+?;/g, + connectorRegExp: /--|\u2014/g, + removeRegExp: new RegExp( [ + '[', + // Basic Latin (extract) + '\u0021-\u0040\u005B-\u0060\u007B-\u007E', + // Latin-1 Supplement (extract) + '\u0080-\u00BF\u00D7\u00F7', + // General Punctuation + // Superscripts and Subscripts + // Currency Symbols + // Combining Diacritical Marks for Symbols + // Letterlike Symbols + // Number Forms + // Arrows + // Mathematical Operators + // Miscellaneous Technical + // Control Pictures + // Optical Character Recognition + // Enclosed Alphanumerics + // Box Drawing + // Block Elements + // Geometric Shapes + // Miscellaneous Symbols + // Dingbats + // Miscellaneous Mathematical Symbols-A + // Supplemental Arrows-A + // Braille Patterns + // Supplemental Arrows-B + // Miscellaneous Mathematical Symbols-B + // Supplemental Mathematical Operators + // Miscellaneous Symbols and Arrows + '\u2000-\u2BFF', + // Supplemental Punctuation + '\u2E00-\u2E7F', + ']' + ].join( '' ), 'g' ), + astralRegExp: /[\uD800-\uDBFF][\uDC00-\uDFFF]/g, + wordsRegExp: /\S\s+/g, + characters_excluding_spacesRegExp: /\S/g, + characters_including_spacesRegExp: /[^\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; + + if ( type !== 'characters_excluding_spaces' && type !== 'characters_including_spaces' ) { + 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' ); + } + + 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' ); + } + + text = text.match( this.settings[ type + 'RegExp' ] ); + + if ( text ) { + count = text.length; + } + } + + return count; + }; -jQuery(document).ready( function(){ wpWordCount.init(); } ); + window.wp = window.wp || {}; + window.wp.utils = window.wp.utils || {}; + window.wp.utils.WordCounter = WordCounter; +} )();