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