1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
  | 
/*
 * jQuery Highlight Regex Plugin v0.1.2
 *
 * Based on highlight v3 by Johann Burkard
 * http://johannburkard.de/blog/programming/javascript/highlight-javascript-text-higlighting-jquery-plugin.html
 *
 * (c) 2009-13 Jacob Rothstein
 * MIT license
 */
;(function( $ ) {
  var normalize = function( node ) {
    if ( ! ( node && node.childNodes )) return
    var children     = $.makeArray( node.childNodes )
    ,   prevTextNode = null
    $.each( children, function( i, child ) {
      if ( child.nodeType === 3 ) {
        if ( child.nodeValue === "" ) {
          node.removeChild( child )
        } else if ( prevTextNode !== null ) {
          prevTextNode.nodeValue += child.nodeValue;
          node.removeChild( child )
        } else {
          prevTextNode = child
        }
      } else {
        prevTextNode = null
        if ( child.childNodes ) {
          normalize( child )
        }
      }
    })
  }
  $.fn.highlightRegex = function( regex, options ) {
    if ( typeof regex === 'object' && !(regex.constructor.name == 'RegExp' || regex instanceof RegExp ) ) {
      options = regex
      regex = undefined
    }
    if ( typeof options === 'undefined' ) options = {}
    options.className = options.className || 'highlight'
    options.tagType   = options.tagType   || 'span'
    options.attrs     = options.attrs     || {}
    if ( typeof regex === 'undefined' || regex.source === '' ) {
      $( this ).find( options.tagType + '.' + options.className ).each( function() {
        $( this ).replaceWith( $( this ).text() )
        normalize( $( this ).parent().get( 0 ))
      })
    } else {
      $( this ).each( function() {
        var elt = $( this ).get( 0 )
        normalize( elt )
        $.each( $.makeArray( elt.childNodes ), function( i, searchnode ) {
          var spannode, middlebit, middleclone, pos, match, parent
          normalize( searchnode )
          if ( searchnode.nodeType == 3 ) {
            
            // don't re-highlight the same node over and over
            if ( $(searchnode).parent(options.tagType + '.' + options.className).length ) {
                return;
            }
            while ( searchnode.data &&
                    ( pos = searchnode.data.search( regex )) >= 0 ) {
              match = searchnode.data.slice( pos ).match( regex )[ 0 ]
              if ( match.length > 0 ) {
                spannode = document.createElement( options.tagType )
                spannode.className = options.className
                $(spannode).attr(options.attrs)
                parent      = searchnode.parentNode
                middlebit   = searchnode.splitText( pos )
                searchnode  = middlebit.splitText( match.length )
                middleclone = middlebit.cloneNode( true )
                spannode.appendChild( middleclone )
                parent.replaceChild( spannode, middlebit )
              } else break
            }
          } else {
            $( searchnode ).highlightRegex( regex, options )
          }
        })
      })
    }
    return $( this )
  }
})( jQuery );
  |