Subversion Repositories SmartDukaan

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
15403 manish.sha 1
/*
2
 * typeahead.js
3
 * https://github.com/twitter/typeahead.js
4
 * Copyright 2013-2014 Twitter, Inc. and other contributors; Licensed MIT
5
 */
6
 
7
// inspired by https://github.com/jharding/bearhug
8
 
9
var highlight = (function(doc) {
10
  'use strict';
11
 
12
  var defaults = {
13
        node: null,
14
        pattern: null,
15
        tagName: 'strong',
16
        className: null,
17
        wordsOnly: false,
18
        caseSensitive: false
19
      };
20
 
21
  return function hightlight(o) {
22
    var regex;
23
 
24
    o = _.mixin({}, defaults, o);
25
 
26
    if (!o.node || !o.pattern) {
27
      // fail silently
28
      return;
29
    }
30
 
31
    // support wrapping multiple patterns
32
    o.pattern = _.isArray(o.pattern) ? o.pattern : [o.pattern];
33
 
34
    regex = getRegex(o.pattern, o.caseSensitive, o.wordsOnly);
35
    traverse(o.node, hightlightTextNode);
36
 
37
    function hightlightTextNode(textNode) {
38
      var match, patternNode, wrapperNode;
39
 
40
      if (match = regex.exec(textNode.data)) {
41
        wrapperNode = doc.createElement(o.tagName);
42
        o.className && (wrapperNode.className = o.className);
43
 
44
        patternNode = textNode.splitText(match.index);
45
        patternNode.splitText(match[0].length);
46
        wrapperNode.appendChild(patternNode.cloneNode(true));
47
 
48
        textNode.parentNode.replaceChild(wrapperNode, patternNode);
49
      }
50
 
51
      return !!match;
52
    }
53
 
54
    function traverse(el, hightlightTextNode) {
55
      var childNode, TEXT_NODE_TYPE = 3;
56
 
57
      for (var i = 0; i < el.childNodes.length; i++) {
58
        childNode = el.childNodes[i];
59
 
60
        if (childNode.nodeType === TEXT_NODE_TYPE) {
61
          i += hightlightTextNode(childNode) ? 1 : 0;
62
        }
63
 
64
        else {
65
          traverse(childNode, hightlightTextNode);
66
        }
67
      }
68
    }
69
  };
70
 
71
  function getRegex(patterns, caseSensitive, wordsOnly) {
72
    var escapedPatterns = [], regexStr;
73
 
74
    for (var i = 0, len = patterns.length; i < len; i++) {
75
      escapedPatterns.push(_.escapeRegExChars(patterns[i]));
76
    }
77
 
78
    regexStr = wordsOnly ?
79
      '\\b(' + escapedPatterns.join('|') + ')\\b' :
80
      '(' + escapedPatterns.join('|') + ')';
81
 
82
    return caseSensitive ? new RegExp(regexStr) : new RegExp(regexStr, 'i');
83
  }
84
})(window.document);