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 Caracteres | #words Palavras' 19 }; 20 var options = $.extend(defaults, options); 21 22 var container = $(this); 23 24 $("<div align='right' class='charleft'> </div>").insertAfter(container); 25 26 //create charleft css 27 var charLeftCss = { 28 //'width' : container.width() 29 }; 30 31 var charLeftInfo = getNextCharLeftInformation(container); 32 charLeftInfo.addClass(options.originalStyle); 33 charLeftInfo.css(charLeftCss); 34 35 var numInput = 0; 36 var maxCharacters = options.maxCharacterSize; 37 var numLeft = 0; 38 var numWords = 0; 39 40 container.bind('keyup', function(event){limitTextAreaByCharacterCount();}) 41 .bind('mouseover', function(event){setTimeout(function(){limitTextAreaByCharacterCount();}, 10);}) 42 .bind('paste', function(event){setTimeout(function(){limitTextAreaByCharacterCount();}, 10);}); 43 44 45 function limitTextAreaByCharacterCount(){ 46 charLeftInfo.html(countByCharacters()); 47 //function call back 48 if(typeof fn != 'undefined'){ 49 fn.call(this, getInfo()); 50 } 51 return true; 52 } 53 54 function countByCharacters(){ 55 var content = container.val(); 56 var contentLength = content.length; 57 58 //Start Cut 59 if(options.maxCharacterSize > 0){ 60 //If copied content is already more than maxCharacterSize, chop it to maxCharacterSize. 61 if(contentLength >= options.maxCharacterSize) { 62 content = content.substring(0, options.maxCharacterSize); 63 } 64 65 var newlineCount = getNewlineCount(content); 66 67 // newlineCount new line character. For windows, it occupies 2 characters 68 var systemmaxCharacterSize = options.maxCharacterSize - newlineCount; 69 if (!isWin()){ 70 systemmaxCharacterSize = options.maxCharacterSize 71 } 72 if(contentLength > systemmaxCharacterSize){ 73 //avoid scroll bar moving 74 var originalScrollTopPosition = this.scrollTop; 75 container.val(content.substring(0, systemmaxCharacterSize)); 76 this.scrollTop = originalScrollTopPosition; 77 } 78 charLeftInfo.removeClass(options.warningStyle); 79 if(systemmaxCharacterSize - contentLength <= options.warningNumber){ 80 charLeftInfo.addClass(options.warningStyle); 81 } 82 83 numInput = container.val().length + newlineCount; 84 if(!isWin()){ 85 numInput = container.val().length; 86 } 87 88 numWords = countWord(getCleanedWordString(container.val())); 89 90 numLeft = maxCharacters - numInput; 91 } else { 92 //normal count, no cut 93 var newlineCount = getNewlineCount(content); 94 numInput = container.val().length + newlineCount; 95 if(!isWin()){ 96 numInput = container.val().length; 97 } 98 numWords = countWord(getCleanedWordString(container.val())); 99 } 100 101 return formatDisplayInfo(); 102 } 103 104 function formatDisplayInfo(){ 105 var format = options.displayFormat; 106 format = format.replace('#input', numInput); 107 format = format.replace('#words', numWords); 108 //When maxCharacters <= 0, #max, #left cannot be substituted. 109 if(maxCharacters > 0){ 110 format = format.replace('#max', maxCharacters); 111 format = format.replace('#left', numLeft); 112 } 113 return format; 114 } 115 116 function getInfo(){ 117 var info = { 118 input: numInput, 119 max: maxCharacters, 120 left: numLeft, 121 words: numWords 122 }; 123 return info; 124 } 125 126 function getNextCharLeftInformation(container){ 127 return container.next('.charleft'); 128 } 129 130 function isWin(){ 131 var strOS = navigator.appVersion; 132 if (strOS.toLowerCase().indexOf('win') != -1){ 133 return true; 134 } 135 return false; 136 } 137 138 function getNewlineCount(content){ 139 var newlineCount = 0; 140 for(var i=0; i<content.length;i++){ 141 if(content.charAt(i) == '\n'){ 142 newlineCount++; 143 } 144 } 145 return newlineCount; 146 } 147 148 function getCleanedWordString(content){ 149 var fullStr = content + " "; 150 var initial_whitespace_rExp = /^[^A-Za-z0-9]+/gi; 151 var left_trimmedStr = fullStr.replace(initial_whitespace_rExp, ""); 152 var non_alphanumerics_rExp = rExp = /[^A-Za-z0-9]+/gi; 153 var cleanedStr = left_trimmedStr.replace(non_alphanumerics_rExp, " "); 154 var splitString = cleanedStr.split(" "); 155 return splitString; 156 } 157 158 function countWord(cleanedWordString){ 159 var word_count = cleanedWordString.length-1; 160 return word_count; 161 } 162 }; 163})(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.