1/* 2 * jQuery Textarea Characters Counter Plugin v 2.0 3 * Examples and documentation at: http://roy-jin.appspot.com/jsp/textareaCounter.jsp 4 * Copyright (c) 2010 Roy Jin 5 * Version: 2.0 (11-JUN-2010) 6 * Dual licensed under the MIT and GPL licenses: 7 * http://www.opensource.org/licenses/mit-license.php 8 * http://www.gnu.org/licenses/gpl.html 9 * Requires: jQuery v1.4.2 or later 10 */ 11(function($){ 12 $.fn.textareaCount = function(options, fn) { 13 var defaults = { 14 maxCharacterSize: -1, 15 originalStyle: 'originalTextareaInfo', 16 warningStyle: 'warningTextareaInfo', 17 warningNumber: 20, 18 displayFormat: '#input characters | #words words' 19 }; 20 21 var options = $.extend(defaults, options); 22 23 var container = $(this); 24 25 $("<div class='charleft'> </div>").insertAfter(container); 26 27 28 //create charleft css 29 var charLeftCss = { 30 'width' : container.width() 31 }; 32 33 var charLeftInfo = getNextCharLeftInformation(container); 34 charLeftInfo.addClass(options.originalStyle); 35 //charLeftInfo.css(charLeftCss); 36 37 38 var numInput = 0; 39 var maxCharacters = options.maxCharacterSize; 40 var numLeft = 0; 41 var numWords = 0; 42 43 container.bind('keyup', function(event){limitTextAreaByCharacterCount();}) 44 .bind('mouseover', function(event){setTimeout(function(){limitTextAreaByCharacterCount();}, 10);}) 45 .bind('paste', function(event){setTimeout(function(){limitTextAreaByCharacterCount();}, 10);}); 46 47 limitTextAreaByCharacterCount(); 48 49 function limitTextAreaByCharacterCount(){ 50 charLeftInfo.html(countByCharacters()); 51 52 //function call back 53 if(typeof fn != 'undefined'){ 54 fn.call(this, getInfo()); 55 } 56 return true; 57 } 58 59 function countByCharacters(){ 60 var content = container.val(); 61 var contentLength = content.length; 62 //Start Cut 63 if(options.maxCharacterSize > 0){ 64 //If copied content is already more than maxCharacterSize, chop it to maxCharacterSize. 65 if(contentLength >= options.maxCharacterSize) { 66 content = content.substring(0, options.maxCharacterSize); 67 } 68 69 var newlineCount = getNewlineCount(content); 70 71 // newlineCount new line character. For windows, it occupies 2 characters 72 var systemmaxCharacterSize = options.maxCharacterSize - newlineCount; 73 if (!isWin()){ 74 systemmaxCharacterSize = options.maxCharacterSize 75 } 76 if(contentLength > systemmaxCharacterSize){ 77 //avoid scroll bar moving 78 var originalScrollTopPosition = this.scrollTop; 79 container.val(content.substring(0, systemmaxCharacterSize)); 80 this.scrollTop = originalScrollTopPosition; 81 } 82 charLeftInfo.removeClass(options.warningStyle); 83 if(systemmaxCharacterSize - contentLength <= options.warningNumber){ 84 charLeftInfo.addClass(options.warningStyle); 85 } 86 87 numInput = container.val().length + newlineCount; 88 if(!isWin()){ 89 numInput = container.val().length; 90 } 91 92 numWords = countWord(getCleanedWordString(container.val())); 93 94 numLeft = maxCharacters - numInput; 95 } else { 96 //normal count, no cut 97 var newlineCount = getNewlineCount(content); 98 numInput = container.val().length + newlineCount; 99 if(!isWin()){ 100 numInput = container.val().length; 101 } 102 numWords = countWord(getCleanedWordString(container.val())); 103 } 104 105 return formatDisplayInfo(); 106 } 107 108 function formatDisplayInfo(){ 109 var format = options.displayFormat; 110 format = format.replace('#input', numInput); 111 format = format.replace('#words', numWords); 112 //When maxCharacters <= 0, #max, #left cannot be substituted. 113 if(maxCharacters > 0){ 114 format = format.replace('#max', maxCharacters); 115 format = format.replace('#left', numLeft); 116 } 117 return format; 118 } 119 120 function getInfo(){ 121 var info = { 122 input: numInput, 123 max: maxCharacters, 124 left: numLeft, 125 words: numWords 126 }; 127 return info; 128 } 129 130 function getNextCharLeftInformation(container){ 131 return container.next('.charleft'); 132 } 133 134 function isWin(){ 135 var strOS = navigator.appVersion; 136 if (strOS.toLowerCase().indexOf('win') != -1){ 137 return true; 138 } 139 return false; 140 } 141 142 function getNewlineCount(content){ 143 var newlineCount = 0; 144 for(var i=0; i<content.length;i++){ 145 if(content.charAt(i) == '\n'){ 146 newlineCount++; 147 } 148 } 149 return newlineCount; 150 } 151 152 function getCleanedWordString(content){ 153 var fullStr = content + " "; 154 var initial_whitespace_rExp = /^[^A-Za-z0-9]+/gi; 155 var left_trimmedStr = fullStr.replace(initial_whitespace_rExp, ""); 156 var non_alphanumerics_rExp = rExp = /[^A-Za-z0-9]+/gi; 157 var cleanedStr = left_trimmedStr.replace(non_alphanumerics_rExp, " "); 158 var splitString = cleanedStr.split(" "); 159 return splitString; 160 } 161 162 function countWord(cleanedWordString){ 163 var word_count = cleanedWordString.length-1; 164 return word_count; 165 } 166 }; 167})(jQuery);
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.