<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
		<id>https://w.hil.su/index.php?action=history&amp;feed=atom&amp;title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA%3AMailGik%2FsyntaxHighlight.js</id>
		<title>Участник:MailGik/syntaxHighlight.js - История изменений</title>
		<link rel="self" type="application/atom+xml" href="https://w.hil.su/index.php?action=history&amp;feed=atom&amp;title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA%3AMailGik%2FsyntaxHighlight.js"/>
		<link rel="alternate" type="text/html" href="https://w.hil.su/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:MailGik/syntaxHighlight.js&amp;action=history"/>
		<updated>2026-04-27T00:36:04Z</updated>
		<subtitle>История изменений этой страницы в вики</subtitle>
		<generator>MediaWiki 1.27.1</generator>

	<entry>
		<id>https://w.hil.su/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:MailGik/syntaxHighlight.js&amp;diff=2128&amp;oldid=prev</id>
		<title>MailGik: Новая страница: «/* SHJS - Syntax Highlighting in JavaScript Copyright (C) 2007, 2008 gnombat@users.sourceforge.net License: http://shjs.sourceforge.net/doc/gplv3.html Original sc…»</title>
		<link rel="alternate" type="text/html" href="https://w.hil.su/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:MailGik/syntaxHighlight.js&amp;diff=2128&amp;oldid=prev"/>
				<updated>2016-08-17T23:10:10Z</updated>
		
		<summary type="html">&lt;p&gt;Новая страница: «/* SHJS - Syntax Highlighting in JavaScript Copyright (C) 2007, 2008 gnombat@users.sourceforge.net License: http://shjs.sourceforge.net/doc/gplv3.html Original sc…»&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая страница&lt;/b&gt;&lt;/p&gt;&lt;div&gt;/*&lt;br /&gt;
SHJS - Syntax Highlighting in JavaScript&lt;br /&gt;
Copyright (C) 2007, 2008 gnombat@users.sourceforge.net&lt;br /&gt;
License: http://shjs.sourceforge.net/doc/gplv3.html&lt;br /&gt;
Original script: http://shjs.sourceforge.net/&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
if (! this.sh_languages) {&lt;br /&gt;
  this.sh_languages = {};&lt;br /&gt;
}&lt;br /&gt;
var sh_requests = {};&lt;br /&gt;
&lt;br /&gt;
function sh_isEmailAddress(url) {&lt;br /&gt;
  if (/^mailto:/.test(url)) {&lt;br /&gt;
    return false;&lt;br /&gt;
  }&lt;br /&gt;
  return url.indexOf(&amp;#039;@&amp;#039;) !== -1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function sh_setHref(tags, numTags, inputString) {&lt;br /&gt;
  var url = inputString.substring(tags[numTags - 2].pos, tags[numTags - 1].pos);&lt;br /&gt;
  if (url.length &amp;gt;= 2 &amp;amp;&amp;amp; url.charAt(0) === &amp;#039;&amp;lt;&amp;#039; &amp;amp;&amp;amp; url.charAt(url.length - 1) === &amp;#039;&amp;gt;&amp;#039;) {&lt;br /&gt;
    url = url.substr(1, url.length - 2);&lt;br /&gt;
  }&lt;br /&gt;
  if (sh_isEmailAddress(url)) {&lt;br /&gt;
    url = &amp;#039;mailto:&amp;#039; + url;&lt;br /&gt;
  }&lt;br /&gt;
  tags[numTags - 2].node.href = url;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
Konqueror has a bug where the regular expression /$/g will not match at the end&lt;br /&gt;
of a line more than once:&lt;br /&gt;
&lt;br /&gt;
  var regex = /$/g;&lt;br /&gt;
  var match;&lt;br /&gt;
&lt;br /&gt;
  var line = &amp;#039;1234567890&amp;#039;;&lt;br /&gt;
  regex.lastIndex = 10;&lt;br /&gt;
  match = regex.exec(line);&lt;br /&gt;
&lt;br /&gt;
  var line2 = &amp;#039;abcde&amp;#039;;&lt;br /&gt;
  regex.lastIndex = 5;&lt;br /&gt;
  match = regex.exec(line2);  // fails&lt;br /&gt;
*/&lt;br /&gt;
function sh_konquerorExec(s) {&lt;br /&gt;
  var result = [&amp;#039;&amp;#039;];&lt;br /&gt;
  result.index = s.length;&lt;br /&gt;
  result.input = s;&lt;br /&gt;
  return result;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
Highlights all elements containing source code in a text string.  The return&lt;br /&gt;
value is an array of objects, each representing an HTML start or end tag.  Each&lt;br /&gt;
object has a property named pos, which is an integer representing the text&lt;br /&gt;
offset of the tag. Every start tag also has a property named node, which is the&lt;br /&gt;
DOM element started by the tag. End tags do not have this property.&lt;br /&gt;
@param  inputString  a text string&lt;br /&gt;
@param  language  a language definition object&lt;br /&gt;
@return  an array of tag objects&lt;br /&gt;
*/&lt;br /&gt;
function sh_highlightString(inputString, language) {&lt;br /&gt;
  if (/Konqueror/.test(navigator.userAgent)) {&lt;br /&gt;
    if (! language.konquered) {&lt;br /&gt;
      for (var s = 0; s &amp;lt; language.length; s++) {&lt;br /&gt;
        for (var p = 0; p &amp;lt; language[s].length; p++) {&lt;br /&gt;
          var r = language[s][p][0];&lt;br /&gt;
          if (r.source === &amp;#039;$&amp;#039;) {&lt;br /&gt;
            r.exec = sh_konquerorExec;&lt;br /&gt;
          }&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
      language.konquered = true;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  var a = document.createElement(&amp;#039;a&amp;#039;);&lt;br /&gt;
  var span = document.createElement(&amp;#039;span&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
  // the result&lt;br /&gt;
  var tags = [];&lt;br /&gt;
  var numTags = 0;&lt;br /&gt;
&lt;br /&gt;
  // each element is a pattern object from language&lt;br /&gt;
  var patternStack = [];&lt;br /&gt;
&lt;br /&gt;
  // the current position within inputString&lt;br /&gt;
  var pos = 0;&lt;br /&gt;
&lt;br /&gt;
  // the name of the current style, or null if there is no current style&lt;br /&gt;
  var currentStyle = null;&lt;br /&gt;
&lt;br /&gt;
  var output = function(s, style) {&lt;br /&gt;
    var length = s.length;&lt;br /&gt;
    // this is more than just an optimization - we don&amp;#039;t want to output empty &amp;lt;span&amp;gt;&amp;lt;/span&amp;gt; elements&lt;br /&gt;
    if (length === 0) {&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
    if (! style) {&lt;br /&gt;
      var stackLength = patternStack.length;&lt;br /&gt;
      if (stackLength !== 0) {&lt;br /&gt;
        var pattern = patternStack[stackLength - 1];&lt;br /&gt;
        // check whether this is a state or an environment&lt;br /&gt;
        if (! pattern[3]) {&lt;br /&gt;
          // it&amp;#039;s not a state - it&amp;#039;s an environment; use the style for this environment&lt;br /&gt;
          style = pattern[1];&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
    if (currentStyle !== style) {&lt;br /&gt;
      if (currentStyle) {&lt;br /&gt;
        tags[numTags++] = {pos: pos};&lt;br /&gt;
        if (currentStyle === &amp;#039;sh_url&amp;#039;) {&lt;br /&gt;
          sh_setHref(tags, numTags, inputString);&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
      if (style) {&lt;br /&gt;
        var clone;&lt;br /&gt;
        if (style === &amp;#039;sh_url&amp;#039;) {&lt;br /&gt;
          clone = a.cloneNode(false);&lt;br /&gt;
        }&lt;br /&gt;
        else {&lt;br /&gt;
          clone = span.cloneNode(false);&lt;br /&gt;
        }&lt;br /&gt;
        clone.className = style;&lt;br /&gt;
        tags[numTags++] = {node: clone, pos: pos};&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
    pos += length;&lt;br /&gt;
    currentStyle = style;&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
  var endOfLinePattern = /\r\n|\r|\n/g;&lt;br /&gt;
  endOfLinePattern.lastIndex = 0;&lt;br /&gt;
  var inputStringLength = inputString.length;&lt;br /&gt;
  while (pos &amp;lt; inputStringLength) {&lt;br /&gt;
    var start = pos;&lt;br /&gt;
    var end;&lt;br /&gt;
    var startOfNextLine;&lt;br /&gt;
    var endOfLineMatch = endOfLinePattern.exec(inputString);&lt;br /&gt;
    if (endOfLineMatch === null) {&lt;br /&gt;
      end = inputStringLength;&lt;br /&gt;
      startOfNextLine = inputStringLength;&lt;br /&gt;
    }&lt;br /&gt;
    else {&lt;br /&gt;
      end = endOfLineMatch.index;&lt;br /&gt;
      startOfNextLine = endOfLinePattern.lastIndex;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    var line = inputString.substring(start, end);&lt;br /&gt;
&lt;br /&gt;
    var matchCache = [];&lt;br /&gt;
    for (;;) {&lt;br /&gt;
      var posWithinLine = pos - start;&lt;br /&gt;
&lt;br /&gt;
      var stateIndex;&lt;br /&gt;
      var stackLength = patternStack.length;&lt;br /&gt;
      if (stackLength === 0) {&lt;br /&gt;
        stateIndex = 0;&lt;br /&gt;
      }&lt;br /&gt;
      else {&lt;br /&gt;
        // get the next state&lt;br /&gt;
        stateIndex = patternStack[stackLength - 1][2];&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      var state = language[stateIndex];&lt;br /&gt;
      var numPatterns = state.length;&lt;br /&gt;
      var mc = matchCache[stateIndex];&lt;br /&gt;
      if (! mc) {&lt;br /&gt;
        mc = matchCache[stateIndex] = [];&lt;br /&gt;
      }&lt;br /&gt;
      var bestMatch = null;&lt;br /&gt;
      var bestPatternIndex = -1;&lt;br /&gt;
      for (var i = 0; i &amp;lt; numPatterns; i++) {&lt;br /&gt;
        var match;&lt;br /&gt;
        if (i &amp;lt; mc.length &amp;amp;&amp;amp; (mc[i] === null || posWithinLine &amp;lt;= mc[i].index)) {&lt;br /&gt;
          match = mc[i];&lt;br /&gt;
        }&lt;br /&gt;
        else {&lt;br /&gt;
          var regex = state[i][0];&lt;br /&gt;
          regex.lastIndex = posWithinLine;&lt;br /&gt;
          match = regex.exec(line);&lt;br /&gt;
          mc[i] = match;&lt;br /&gt;
        }&lt;br /&gt;
        if (match !== null &amp;amp;&amp;amp; (bestMatch === null || match.index &amp;lt; bestMatch.index)) {&lt;br /&gt;
          bestMatch = match;&lt;br /&gt;
          bestPatternIndex = i;&lt;br /&gt;
          if (match.index === posWithinLine) {&lt;br /&gt;
            break;&lt;br /&gt;
          }&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      if (bestMatch === null) {&lt;br /&gt;
        output(line.substring(posWithinLine), null);&lt;br /&gt;
        break;&lt;br /&gt;
      }&lt;br /&gt;
      else {&lt;br /&gt;
        // got a match&lt;br /&gt;
        if (bestMatch.index &amp;gt; posWithinLine) {&lt;br /&gt;
          output(line.substring(posWithinLine, bestMatch.index), null);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        var pattern = state[bestPatternIndex];&lt;br /&gt;
&lt;br /&gt;
        var newStyle = pattern[1];&lt;br /&gt;
        var matchedString;&lt;br /&gt;
        if (newStyle instanceof Array) {&lt;br /&gt;
          for (var subexpression = 0; subexpression &amp;lt; newStyle.length; subexpression++) {&lt;br /&gt;
            matchedString = bestMatch[subexpression + 1];&lt;br /&gt;
            output(matchedString, newStyle[subexpression]);&lt;br /&gt;
          }&lt;br /&gt;
        }&lt;br /&gt;
        else {&lt;br /&gt;
          matchedString = bestMatch[0];&lt;br /&gt;
          output(matchedString, newStyle);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        switch (pattern[2]) {&lt;br /&gt;
        case -1:&lt;br /&gt;
          // do nothing&lt;br /&gt;
          break;&lt;br /&gt;
        case -2:&lt;br /&gt;
          // exit&lt;br /&gt;
          patternStack.pop();&lt;br /&gt;
          break;&lt;br /&gt;
        case -3:&lt;br /&gt;
          // exitall&lt;br /&gt;
          patternStack.length = 0;&lt;br /&gt;
          break;&lt;br /&gt;
        default:&lt;br /&gt;
          // this was the start of a delimited pattern or a state/environment&lt;br /&gt;
          patternStack.push(pattern);&lt;br /&gt;
          break;&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // end of the line&lt;br /&gt;
    if (currentStyle) {&lt;br /&gt;
      tags[numTags++] = {pos: pos};&lt;br /&gt;
      if (currentStyle === &amp;#039;sh_url&amp;#039;) {&lt;br /&gt;
        sh_setHref(tags, numTags, inputString);&lt;br /&gt;
      }&lt;br /&gt;
      currentStyle = null;&lt;br /&gt;
    }&lt;br /&gt;
    pos = startOfNextLine;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  return tags;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
// DOM-dependent functions&lt;br /&gt;
&lt;br /&gt;
function sh_getClasses(element) {&lt;br /&gt;
  var result = [];&lt;br /&gt;
  var htmlClass = element.className;&lt;br /&gt;
  if (htmlClass &amp;amp;&amp;amp; htmlClass.length &amp;gt; 0) {&lt;br /&gt;
    var htmlClasses = htmlClass.split(&amp;#039; &amp;#039;);&lt;br /&gt;
    for (var i = 0; i &amp;lt; htmlClasses.length; i++) {&lt;br /&gt;
      if (htmlClasses[i].length &amp;gt; 0) {&lt;br /&gt;
        result.push(htmlClasses[i]);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  return result;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function sh_addClass(element, name) {&lt;br /&gt;
  var htmlClasses = sh_getClasses(element);&lt;br /&gt;
  for (var i = 0; i &amp;lt; htmlClasses.length; i++) {&lt;br /&gt;
    if (name.toLowerCase() === htmlClasses[i].toLowerCase()) {&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  htmlClasses.push(name);&lt;br /&gt;
  element.className = htmlClasses.join(&amp;#039; &amp;#039;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
Extracts the tags from an HTML DOM NodeList.&lt;br /&gt;
@param  nodeList  a DOM NodeList&lt;br /&gt;
@param  result  an object with text, tags and pos properties&lt;br /&gt;
*/&lt;br /&gt;
function sh_extractTagsFromNodeList(nodeList, result) {&lt;br /&gt;
  var length = nodeList.length;&lt;br /&gt;
  for (var i = 0; i &amp;lt; length; i++) {&lt;br /&gt;
    var node = nodeList.item(i);&lt;br /&gt;
    switch (node.nodeType) {&lt;br /&gt;
    case 1:&lt;br /&gt;
      if (node.nodeName.toLowerCase() === &amp;#039;br&amp;#039;) {&lt;br /&gt;
        var terminator;&lt;br /&gt;
        if (/MSIE/.test(navigator.userAgent)) {&lt;br /&gt;
          terminator = &amp;#039;\r&amp;#039;;&lt;br /&gt;
        }&lt;br /&gt;
        else {&lt;br /&gt;
          terminator = &amp;#039;\n&amp;#039;;&lt;br /&gt;
        }&lt;br /&gt;
        result.text.push(terminator);&lt;br /&gt;
        result.pos++;&lt;br /&gt;
      }&lt;br /&gt;
      else {&lt;br /&gt;
        result.tags.push({node: node.cloneNode(false), pos: result.pos});&lt;br /&gt;
        sh_extractTagsFromNodeList(node.childNodes, result);&lt;br /&gt;
        result.tags.push({pos: result.pos});&lt;br /&gt;
      }&lt;br /&gt;
      break;&lt;br /&gt;
    case 3:&lt;br /&gt;
    case 4:&lt;br /&gt;
      result.text.push(node.data);&lt;br /&gt;
      result.pos += node.length;&lt;br /&gt;
      break;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
Extracts the tags from the text of an HTML element. The extracted tags will be&lt;br /&gt;
returned as an array of tag objects. See sh_highlightString for the format of&lt;br /&gt;
the tag objects.&lt;br /&gt;
@param  element  a DOM element&lt;br /&gt;
@param  tags  an empty array; the extracted tag objects will be returned in it&lt;br /&gt;
@return  the text of the element&lt;br /&gt;
@see  sh_highlightString&lt;br /&gt;
*/&lt;br /&gt;
function sh_extractTags(element, tags) {&lt;br /&gt;
  var result = {};&lt;br /&gt;
  result.text = [];&lt;br /&gt;
  result.tags = tags;&lt;br /&gt;
  result.pos = 0;&lt;br /&gt;
  sh_extractTagsFromNodeList(element.childNodes, result);&lt;br /&gt;
  return result.text.join(&amp;#039;&amp;#039;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
Merges the original tags from an element with the tags produced by highlighting.&lt;br /&gt;
@param  originalTags  an array containing the original tags&lt;br /&gt;
@param  highlightTags  an array containing the highlighting tags - these must not overlap&lt;br /&gt;
@result  an array containing the merged tags&lt;br /&gt;
*/&lt;br /&gt;
function sh_mergeTags(originalTags, highlightTags) {&lt;br /&gt;
  var numOriginalTags = originalTags.length;&lt;br /&gt;
  if (numOriginalTags === 0) {&lt;br /&gt;
    return highlightTags;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  var numHighlightTags = highlightTags.length;&lt;br /&gt;
  if (numHighlightTags === 0) {&lt;br /&gt;
    return originalTags;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  var result = [];&lt;br /&gt;
  var originalIndex = 0;&lt;br /&gt;
  var highlightIndex = 0;&lt;br /&gt;
&lt;br /&gt;
  while (originalIndex &amp;lt; numOriginalTags &amp;amp;&amp;amp; highlightIndex &amp;lt; numHighlightTags) {&lt;br /&gt;
    var originalTag = originalTags[originalIndex];&lt;br /&gt;
    var highlightTag = highlightTags[highlightIndex];&lt;br /&gt;
&lt;br /&gt;
    if (originalTag.pos &amp;lt;= highlightTag.pos) {&lt;br /&gt;
      result.push(originalTag);&lt;br /&gt;
      originalIndex++;&lt;br /&gt;
    }&lt;br /&gt;
    else {&lt;br /&gt;
      result.push(highlightTag);&lt;br /&gt;
      if (highlightTags[highlightIndex + 1].pos &amp;lt;= originalTag.pos) {&lt;br /&gt;
        highlightIndex++;&lt;br /&gt;
        result.push(highlightTags[highlightIndex]);&lt;br /&gt;
        highlightIndex++;&lt;br /&gt;
      }&lt;br /&gt;
      else {&lt;br /&gt;
        // new end tag&lt;br /&gt;
        result.push({pos: originalTag.pos});&lt;br /&gt;
&lt;br /&gt;
        // new start tag&lt;br /&gt;
        highlightTags[highlightIndex] = {node: highlightTag.node.cloneNode(false), pos: originalTag.pos};&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  while (originalIndex &amp;lt; numOriginalTags) {&lt;br /&gt;
    result.push(originalTags[originalIndex]);&lt;br /&gt;
    originalIndex++;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  while (highlightIndex &amp;lt; numHighlightTags) {&lt;br /&gt;
    result.push(highlightTags[highlightIndex]);&lt;br /&gt;
    highlightIndex++;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  return result;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
Inserts tags into text.&lt;br /&gt;
@param  tags  an array of tag objects&lt;br /&gt;
@param  text  a string representing the text&lt;br /&gt;
@return  a DOM DocumentFragment representing the resulting HTML&lt;br /&gt;
*/&lt;br /&gt;
function sh_insertTags(tags, text) {&lt;br /&gt;
  var doc = document;&lt;br /&gt;
&lt;br /&gt;
  var result = document.createDocumentFragment();&lt;br /&gt;
  var tagIndex = 0;&lt;br /&gt;
  var numTags = tags.length;&lt;br /&gt;
  var textPos = 0;&lt;br /&gt;
  var textLength = text.length;&lt;br /&gt;
  var currentNode = result;&lt;br /&gt;
&lt;br /&gt;
  // output one tag or text node every iteration&lt;br /&gt;
  while (textPos &amp;lt; textLength || tagIndex &amp;lt; numTags) {&lt;br /&gt;
    var tag;&lt;br /&gt;
    var tagPos;&lt;br /&gt;
    if (tagIndex &amp;lt; numTags) {&lt;br /&gt;
      tag = tags[tagIndex];&lt;br /&gt;
      tagPos = tag.pos;&lt;br /&gt;
    }&lt;br /&gt;
    else {&lt;br /&gt;
      tagPos = textLength;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (tagPos &amp;lt;= textPos) {&lt;br /&gt;
      // output the tag&lt;br /&gt;
      if (tag.node) {&lt;br /&gt;
        // start tag&lt;br /&gt;
        var newNode = tag.node;&lt;br /&gt;
        currentNode.appendChild(newNode);&lt;br /&gt;
        currentNode = newNode;&lt;br /&gt;
      }&lt;br /&gt;
      else {&lt;br /&gt;
        // end tag&lt;br /&gt;
        currentNode = currentNode.parentNode;&lt;br /&gt;
      }&lt;br /&gt;
      tagIndex++;&lt;br /&gt;
    }&lt;br /&gt;
    else {&lt;br /&gt;
      // output text&lt;br /&gt;
      currentNode.appendChild(doc.createTextNode(text.substring(textPos, tagPos)));&lt;br /&gt;
      textPos = tagPos;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  return result;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
Highlights an element containing source code.  Upon completion of this function,&lt;br /&gt;
the element will have been placed in the &amp;quot;sh_sourceCode&amp;quot; class.&lt;br /&gt;
@param  element  a DOM &amp;lt;pre&amp;gt; element containing the source code to be highlighted&lt;br /&gt;
@param  language  a language definition object&lt;br /&gt;
*/&lt;br /&gt;
function sh_highlightElement(element, language) {&lt;br /&gt;
  sh_addClass(element, &amp;#039;sh_sourceCode&amp;#039;);&lt;br /&gt;
  var originalTags = [];&lt;br /&gt;
  var inputString = sh_extractTags(element, originalTags);&lt;br /&gt;
  var highlightTags = sh_highlightString(inputString, language);&lt;br /&gt;
  var tags = sh_mergeTags(originalTags, highlightTags);&lt;br /&gt;
  var documentFragment = sh_insertTags(tags, inputString);&lt;br /&gt;
  while (element.hasChildNodes()) {&lt;br /&gt;
    element.removeChild(element.firstChild);&lt;br /&gt;
  }&lt;br /&gt;
  element.appendChild(documentFragment);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function sh_getXMLHttpRequest() {&lt;br /&gt;
  if (window.ActiveXObject) {&lt;br /&gt;
    return new ActiveXObject(&amp;#039;Msxml2.XMLHTTP&amp;#039;);&lt;br /&gt;
  }&lt;br /&gt;
  else if (window.XMLHttpRequest) {&lt;br /&gt;
    return new XMLHttpRequest();&lt;br /&gt;
  }&lt;br /&gt;
  throw &amp;#039;No XMLHttpRequest implementation available&amp;#039;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function sh_load(language, element, prefix, suffix) {&lt;br /&gt;
  if (language in sh_requests) {&lt;br /&gt;
    sh_requests[language].push(element);&lt;br /&gt;
    return;&lt;br /&gt;
  }&lt;br /&gt;
  sh_requests[language] = [element];&lt;br /&gt;
  var request = sh_getXMLHttpRequest();&lt;br /&gt;
  var url = prefix + &amp;#039;sh_&amp;#039; + language + suffix;&lt;br /&gt;
  request.open(&amp;#039;GET&amp;#039;, url, true);&lt;br /&gt;
  request.onreadystatechange = function () {&lt;br /&gt;
    if (request.readyState === 4) {&lt;br /&gt;
      try {&lt;br /&gt;
        if (! request.status || request.status === 200) {&lt;br /&gt;
          eval(request.responseText);&lt;br /&gt;
          var elements = sh_requests[language];&lt;br /&gt;
          for (var i = 0; i &amp;lt; elements.length; i++) {&lt;br /&gt;
            sh_highlightElement(elements[i], sh_languages[language]);&lt;br /&gt;
          }&lt;br /&gt;
        }&lt;br /&gt;
        else {&lt;br /&gt;
          throw &amp;#039;HTTP error: status &amp;#039; + request.status;&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
      finally {&lt;br /&gt;
        request = null;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  };&lt;br /&gt;
  request.send(null);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
Highlights all elements containing source code on the current page. Elements&lt;br /&gt;
containing source code must be &amp;quot;pre&amp;quot; elements with a &amp;quot;class&amp;quot; attribute of&lt;br /&gt;
&amp;quot;sh_LANGUAGE&amp;quot;, where LANGUAGE is a valid language identifier; e.g., &amp;quot;sh_java&amp;quot;&lt;br /&gt;
identifies the element as containing &amp;quot;java&amp;quot; language source code.&lt;br /&gt;
*/&lt;br /&gt;
function sh_highlightDocument(prefix, suffix) {&lt;br /&gt;
  var nodeList = document.getElementsByTagName(&amp;#039;pre&amp;#039;);&lt;br /&gt;
  for (var i = 0; i &amp;lt; nodeList.length; i++) {&lt;br /&gt;
    var element = nodeList.item(i);&lt;br /&gt;
    var htmlClasses = sh_getClasses(element);&lt;br /&gt;
    for (var j = 1; j &amp;lt; htmlClasses.length; j++) {&lt;br /&gt;
      var htmlClass = htmlClasses[j].toLowerCase();&lt;br /&gt;
      if (htmlClass === &amp;#039;sh_sourcecode&amp;#039;) {&lt;br /&gt;
        continue;&lt;br /&gt;
      }&lt;br /&gt;
      if (htmlClass.substr(0, 3) === &amp;#039;mw-&amp;#039;) {&lt;br /&gt;
        var language = htmlClass.substring(3);&lt;br /&gt;
        if (language in sh_languages) {&lt;br /&gt;
          sh_highlightElement(element, sh_languages[language]);&lt;br /&gt;
        }&lt;br /&gt;
        else if (typeof(prefix) === &amp;#039;string&amp;#039; &amp;amp;&amp;amp; typeof(suffix) === &amp;#039;string&amp;#039;) {&lt;br /&gt;
          sh_load(language, element, prefix, suffix);&lt;br /&gt;
        }&lt;br /&gt;
        else {&lt;br /&gt;
          throw &amp;#039;Found &amp;lt;pre&amp;gt; element with class=&amp;quot;&amp;#039; + htmlClass + &amp;#039;&amp;quot;, but no such language exists&amp;#039;;&lt;br /&gt;
        }&lt;br /&gt;
        break;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
addOnloadHook(sh_highlightDocument);&lt;/div&gt;</summary>
		<author><name>MailGik</name></author>	</entry>

	</feed>