src/cm/media/js/lib/yui/yui3-3.15.0/build/highlight-base/highlight-base.js
author gibus
Mon, 10 Mar 2014 15:19:48 +0100
changeset 602 e16a97fb364a
permissions -rw-r--r--
Use YUI 3.15
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
602
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
     1
YUI.add('highlight-base', function (Y, NAME) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
     2
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
     3
/**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
     4
Provides methods for highlighting strings within other strings by wrapping
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
     5
them in HTML.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
     6
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
     7
@module highlight
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
     8
@submodule highlight-base
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
     9
@main
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    10
@since 3.3.0
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    11
**/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    12
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    13
/**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    14
Provides methods for highlighting strings within other strings by wrapping
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    15
them in HTML.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    16
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    17
The highlight methods first escape any special HTML characters in the input
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    18
strings and then highlight the appropriate substrings by wrapping them in a
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    19
`<b class="yui3-highlight"></b>` element. The `<b>` element is used rather than
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    20
`<strong>` in accordance with HTML5's definition of `<b>` as being purely
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    21
presentational, which is exactly what highlighting is.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    22
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    23
@class Highlight
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    24
@static
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    25
**/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    26
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    27
var YArray    = Y.Array,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    28
    Escape    = Y.Escape,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    29
    WordBreak = Y.Text.WordBreak,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    30
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    31
    isArray = Y.Lang.isArray,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    32
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    33
    EMPTY_OBJECT = {},
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    34
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    35
    // Regex string that captures zero or one unclosed HTML entities. Used in
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    36
    // the static regex template properties below. The entity matching is
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    37
    // intentionally loose here, since there's a world of complexity involved in
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    38
    // doing strict matching for this use case.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    39
    UNCLOSED_ENTITY = '(&[^;\\s]*)?',
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    40
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    41
Highlight = {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    42
    // -- Protected Static Properties ------------------------------------------
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    43
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    44
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    45
    Regular expression template for highlighting a match that occurs anywhere
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    46
    in a string. The placeholder `%needles` will be replaced with a list of
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    47
    needles to match, joined by `|` characters.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    48
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    49
    This regex should have two capturing subpatterns:
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    50
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    51
      1. Zero or one unclosed HTML entity (e.g. "&amp" without a ";" at the
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    52
         end).
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    53
      2. The `%needles` placeholder.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    54
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    55
    The first subpattern match is used to emulate a negative lookbehind
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    56
    assertion in order to prevent highlighting inside HTML entities.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    57
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    58
    @property _REGEX
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    59
    @type String
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    60
    @protected
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    61
    @static
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    62
    @final
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    63
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    64
    _REGEX: UNCLOSED_ENTITY + '(%needles)',
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    65
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    66
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    67
    Regex replacer function or string for normal matches.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    68
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    69
    @property _REPLACER
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    70
    @type Function|String
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    71
    @protected
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    72
    @static
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    73
    @final
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    74
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    75
    _REPLACER: function (match, p1, p2) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    76
         // Mimicking a negative lookbehind assertion to prevent matches inside
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    77
         // HTML entities. Hat tip to Steven Levithan for the technique:
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    78
         // http://blog.stevenlevithan.com/archives/mimic-lookbehind-javascript
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    79
         return p1 && !(/\s/).test(p2) ? match :
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    80
                    Highlight._TEMPLATE.replace(/\{s\}/g, p2);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    81
     },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    82
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    83
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    84
    Regular expression template for highlighting start-of-string matches
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    85
    (i.e., only matches that occur at the beginning of a string). The
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    86
    placeholder `%needles` will be replaced with a list of needles to match,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    87
    joined by `|` characters.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    88
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    89
    See `_REGEX` for a description of the capturing subpatterns this regex
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    90
    string should contain.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    91
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    92
    @property _START_REGEX
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    93
    @type String
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    94
    @protected
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    95
    @static
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    96
    @final
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    97
     */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    98
    _START_REGEX: '^' + UNCLOSED_ENTITY + '(%needles)',
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    99
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   100
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   101
    Highlight template which will be used as a replacement for matched
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   102
    substrings. The placeholder `{s}` will be replaced with the matched
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   103
    substring.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   104
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   105
    @property _TEMPLATE
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   106
    @type String
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   107
    @default '<b class="yui3-highlight">{s}</b>'
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   108
    @protected
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   109
    @static
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   110
    @final
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   111
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   112
    _TEMPLATE: '<b class="' + Y.ClassNameManager.getClassName('highlight') + '">{s}</b>',
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   113
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   114
    // -- Public Static Methods ------------------------------------------------
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   115
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   116
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   117
    Highlights all occurrences in the _haystack_ string of the items in the
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   118
    _needles_ array, regardless of where they occur. The returned string will
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   119
    have all HTML characters escaped except for the highlighting markup.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   120
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   121
    @method all
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   122
    @param {String} haystack String to apply highlighting to.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   123
    @param {String|String[]} needles String or array of strings that should be
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   124
        highlighted.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   125
    @param {Object} [options] Options object.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   126
    @param {Boolean} [options.caseSensitive=false] If `true`, matching will
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   127
        be case-sensitive.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   128
    @param {Boolean} [options.startsWith=false] If `true`, matches must be
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   129
        anchored to the beginning of the string.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   130
    @return {String} Escaped and highlighted copy of _haystack_.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   131
    @static
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   132
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   133
    all: function (haystack, needles, options) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   134
        var validNeedles = [],
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   135
            esc, i, len, needle, regex, replacer;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   136
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   137
        if (!options) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   138
            options = EMPTY_OBJECT;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   139
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   140
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   141
        // TODO: document options.replacer
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   142
        esc      = options.escapeHTML !== false;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   143
        regex    = options.startsWith ? Highlight._START_REGEX : Highlight._REGEX;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   144
        replacer = options.replacer || Highlight._REPLACER;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   145
        needles  = isArray(needles) ? needles : [needles];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   146
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   147
        // Escape HTML characters and special regular expression characters in
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   148
        // the needles so they can be used in a regex and matched against the
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   149
        // escaped haystack.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   150
        for (i = 0, len = needles.length; i < len; ++i) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   151
            needle = needles[i];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   152
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   153
            if (needle) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   154
                validNeedles.push(Escape.regex(esc ? Escape.html(needle) : needle));
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   155
            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   156
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   157
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   158
        // Escape HTML characters in the haystack to prevent HTML injection.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   159
        if (esc) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   160
            haystack = Escape.html(haystack);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   161
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   162
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   163
        // No point continuing if there are no needles.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   164
        if (!validNeedles.length) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   165
            return haystack;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   166
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   167
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   168
        return haystack.replace(
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   169
            new RegExp(
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   170
                regex.replace('%needles', validNeedles.join('|')),
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   171
                options.caseSensitive ? 'g' : 'gi'
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   172
            ),
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   173
            replacer
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   174
        );
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   175
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   176
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   177
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   178
    Same as `all()`, but case-sensitive by default.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   179
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   180
    @method allCase
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   181
    @param {String} haystack String to apply highlighting to.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   182
    @param {String|String[]} needles String or array of strings that should be
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   183
      highlighted.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   184
    @param {Object} [options] Options object. See `all()` for details.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   185
    @return {String} Escaped and highlighted copy of _haystack_.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   186
    @static
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   187
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   188
    allCase: function (haystack, needles, options) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   189
        return Highlight.all(haystack, needles,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   190
                Y.merge(options || EMPTY_OBJECT, {caseSensitive: true}));
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   191
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   192
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   193
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   194
    Highlights _needles_ that occur at the start of _haystack_. The returned
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   195
    string will have all HTML characters escaped except for the highlighting
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   196
    markup.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   197
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   198
    @method start
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   199
    @param {String} haystack String to apply highlighting to.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   200
    @param {String|String[]} needles String or array of strings that should be
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   201
      highlighted.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   202
    @param {Object} [options] Options object.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   203
    @param {Boolean} [options.caseSensitive=false] If `true`, matching will
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   204
        be case-sensitive.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   205
    @return {String} Escaped and highlighted copy of _haystack_.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   206
    @static
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   207
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   208
    start: function (haystack, needles, options) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   209
        return Highlight.all(haystack, needles,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   210
                Y.merge(options || EMPTY_OBJECT, {startsWith: true}));
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   211
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   212
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   213
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   214
    Same as `start()`, but case-sensitive by default.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   215
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   216
    @method startCase
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   217
    @param {String} haystack String to apply highlighting to.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   218
    @param {String|String[]} needles String or array of strings that should be
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   219
      highlighted.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   220
    @return {String} Escaped and highlighted copy of _haystack_.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   221
    @static
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   222
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   223
    startCase: function (haystack, needles) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   224
        // No options passthru for now, since it would be redundant. If start()
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   225
        // ever supports more options than caseSensitive, then we'll start
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   226
        // passing the options through.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   227
        return Highlight.start(haystack, needles, {caseSensitive: true});
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   228
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   229
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   230
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   231
    Highlights complete words in the _haystack_ string that are also in the
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   232
    _needles_ array. The returned string will have all HTML characters escaped
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   233
    except for the highlighting markup.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   234
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   235
    @method words
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   236
    @param {String} haystack String to apply highlighting to.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   237
    @param {String|String[]} needles String or array of strings containing words
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   238
      that should be highlighted. If a string is passed, it will be split
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   239
      into words; if an array is passed, it is assumed to have already been
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   240
      split.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   241
    @param {Object} [options] Options object.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   242
    @param {Boolean} [options.caseSensitive=false] If `true`, matching will
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   243
        be case-sensitive.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   244
    @return {String} Escaped and highlighted copy of _haystack_.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   245
    @static
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   246
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   247
    words: function (haystack, needles, options) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   248
        var caseSensitive,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   249
            mapper,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   250
            template = Highlight._TEMPLATE,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   251
            words;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   252
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   253
        if (!options) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   254
            options = EMPTY_OBJECT;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   255
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   256
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   257
        caseSensitive = !!options.caseSensitive;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   258
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   259
        // Convert needles to a hash for faster lookups.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   260
        needles = YArray.hash(
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   261
            isArray(needles) ? needles : WordBreak.getUniqueWords(needles, {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   262
                ignoreCase: !caseSensitive
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   263
            })
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   264
        );
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   265
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   266
        // The default word mapping function can be overridden with a custom
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   267
        // one. This is used to implement accent-folded highlighting in the
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   268
        // highlight-accentfold module.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   269
        mapper = options.mapper || function (word, needles) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   270
            if (needles.hasOwnProperty(caseSensitive ? word : word.toLowerCase())) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   271
                return template.replace(/\{s\}/g, Escape.html(word));
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   272
            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   273
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   274
            return Escape.html(word);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   275
        };
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   276
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   277
        // Split the haystack into an array of words, including punctuation and
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   278
        // whitespace so we can rebuild the string later.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   279
        words = WordBreak.getWords(haystack, {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   280
            includePunctuation: true,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   281
            includeWhitespace : true
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   282
        });
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   283
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   284
        return YArray.map(words, function (word) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   285
            return mapper(word, needles);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   286
        }).join('');
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   287
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   288
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   289
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   290
    Same as `words()`, but case-sensitive by default.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   291
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   292
    @method wordsCase
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   293
    @param {String} haystack String to apply highlighting to.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   294
    @param {String|String[]} needles String or array of strings containing words
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   295
      that should be highlighted. If a string is passed, it will be split
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   296
      into words; if an array is passed, it is assumed to have already been
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   297
      split.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   298
    @return {String} Escaped and highlighted copy of _haystack_.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   299
    @static
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   300
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   301
    wordsCase: function (haystack, needles) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   302
        // No options passthru for now, since it would be redundant. If words()
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   303
        // ever supports more options than caseSensitive, then we'll start
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   304
        // passing the options through.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   305
        return Highlight.words(haystack, needles, {caseSensitive: true});
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   306
    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   307
};
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   308
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   309
Y.Highlight = Highlight;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   310
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   311
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   312
}, '@VERSION@', {"requires": ["array-extras", "classnamemanager", "escape", "text-wordbreak"]});