1/** 2 * @file 3 * JavaScript behaviors for jQuery Text Counter integration. 4 */ 5 6(function ($, Drupal, once) { 7 // @see https://github.com/ractoon/jQuery-Text-Counter#options 8 Drupal.webform = Drupal.webform || {}; 9 Drupal.webform.counter = Drupal.webform.counter || {}; 10 Drupal.webform.counter.options = Drupal.webform.counter.options || {}; 11 12 /** 13 * Initialize text field and textarea word and character counter. 14 * 15 * @type {Drupal~behavior} 16 */ 17 Drupal.behaviors.webformCounter = { 18 attach(context) { 19 if (!$.fn.textcounter) { 20 return; 21 } 22 23 $(once('webform-counter', '.js-webform-counter', context)).each(function () { 24 var options = { 25 type: $(this).data('counter-type'), 26 max: $(this).data('counter-maximum'), 27 min: $(this).data('counter-minimum') || 0, 28 counterText: $(this).data('counter-minimum-message'), 29 countDownText: $(this).data('counter-maximum-message'), 30 inputErrorClass: 'webform-counter-warning', 31 counterErrorClass: 'webform-counter-warning', 32 countSpaces: true, 33 twoCharCarriageReturn: true, 34 stopInputAtMaximum: false, 35 // Don't display min/max message since server-side validation will 36 // display these messages. 37 minimumErrorText: '', 38 maximumErrorText: '' 39 }; 40 41 options.countDown = (options.max) ? true : false; 42 if (!options.counterText) { 43 options.counterText = (options.type === 'word') ? Drupal.t('%d word(s) entered') : Drupal.t('%d character(s) entered'); 44 } 45 if (!options.countDownText) { 46 options.countDownText = (options.type === 'word') ? Drupal.t('%d word(s) remaining') : Drupal.t('%d character(s) remaining'); 47 } 48 49 options = $.extend(options, Drupal.webform.counter.options); 50 51 // Allow custom options. 52 if ($(this).attr('data-options')) { 53 options = $.extend(true, options, JSON.parse($(this).attr('data-options'))); 54 } 55 56 // The text counter plugin builds counter HTML from string options. 57 // @see https://github.com/ractoon/jQuery-Text-Counter#options 58 // Prevent custom options from changing element names used to build HTML. 59 delete options.countContainerElement; 60 delete options.errorTextElement; 61 62 // Escape remaining text and class options before they are used in HTML. 63 Object.keys(options).forEach(function (key) { 64 if (typeof options[key] === 'string') { 65 options[key] = Drupal.checkPlain(options[key]); 66 } 67 }); 68 69 $(this).textcounter(options); 70 }); 71 72 } 73 }; 74 75})(jQuery, Drupal, once);
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.