/* YUI 3.17.2 (build 9c3c78e) Copyright 2014 Yahoo! Inc. All rights reserved. Licensed under the BSD License. http://yuilibrary.com/license/ */ YUI.add('highlight-accentfold', function (Y, NAME) { /** Adds accent-folding highlighters to `Y.Highlight`. @module highlight @submodule highlight-accentfold **/ /** @class Highlight @static **/ var AccentFold = Y.Text.AccentFold, Escape = Y.Escape, EMPTY_OBJECT = {}, Highlight = Y.mix(Y.Highlight, { // -- Public Static Methods ------------------------------------------------ /** Accent-folding version of `all()`. @method allFold @param {String} haystack String to apply highlighting to. @param {String|String[]} needles String or array of strings that should be highlighted. @param {Object} [options] Options object. @param {Boolean} [options.startsWith=false] If `true`, matches must be anchored to the beginning of the string. @return {String} Escaped and highlighted copy of _haystack_. @static **/ allFold: function (haystack, needles, options) { var template = Highlight._TEMPLATE, results = [], startPos = 0, chunk, i, len, match, result; options = Y.merge({ // This tells Highlight.all() not to escape HTML, in order to ensure // usable match offsets. The output of all() is discarded, and we // perform our own escaping before returning the highlighted string. escapeHTML: false, // While the highlight regex operates on the accent-folded strings, // this replacer will highlight the matched positions in the // original string. // // Note: this implementation doesn't handle multi-character folds, // like "æ" -> "ae". Doing so correctly would be prohibitively // expensive both in terms of code size and runtime performance, so // I've chosen to take the pragmatic route and just not do it at // all. This is one of many reasons why accent folding is best done // on the server. replacer: function (match, p1, foldedNeedle, pos) { var len; // Ignore matches inside HTML entities. if (p1 && !(/\s/).test(foldedNeedle)) { return match; } len = foldedNeedle.length; results.push([ haystack.substring(startPos, pos), // substring between previous match and this match haystack.substr(pos, len) // match to be highlighted ]); startPos = pos + len; } }, options || EMPTY_OBJECT); // Run the highlighter on the folded strings. We don't care about the // output; our replacer function will build the canonical highlighted // string, with original accented characters. Highlight.all(AccentFold.fold(haystack), AccentFold.fold(needles), options); // Tack on the remainder of the haystack that wasn't highlighted, if // any. if (startPos < haystack.length) { results.push([haystack.substr(startPos)]); } // Highlight and escape the string. for (i = 0, len = results.length; i < len; ++i) { chunk = Escape.html(results[i][0]); if ((match = results[i][1])) { chunk += template.replace(/\{s\}/g, Escape.html(match)); } results[i] = chunk; } return results.join(''); }, /** Accent-folding version of `start()`. @method startFold @param {String} haystack String to apply highlighting to. @param {String|String[]} needles String or array of strings that should be highlighted. @return {String} Escaped and highlighted copy of _haystack_. @static **/ startFold: function (haystack, needles) { return Highlight.allFold(haystack, needles, {startsWith: true}); }, /** Accent-folding version of `words()`. @method wordsFold @param {String} haystack String to apply highlighting to. @param {String|String[]} needles String or array of strings containing words that should be highlighted. If a string is passed, it will be split into words; if an array is passed, it is assumed to have already been split. @return {String} Escaped and highlighted copy of _haystack_. @static **/ wordsFold: function (haystack, needles) { var template = Highlight._TEMPLATE; return Highlight.words(haystack, AccentFold.fold(needles), { mapper: function (word, needles) { if (needles.hasOwnProperty(AccentFold.fold(word))) { return template.replace(/\{s\}/g, Escape.html(word)); } return Escape.html(word); } }); } }); }, '3.17.2', {"requires": ["highlight-base", "text-accentfold"]});