-
-
Notifications
You must be signed in to change notification settings - Fork 27
/
Copy pathjquery.syntax.core.js
34 lines (34 loc) · 12.9 KB
/
jquery.syntax.core.js
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
// This file is part of the "jQuery.Syntax" project, and is distributed under the MIT License.
RegExp.prototype.indexOf||(RegExp.indexOf=function(b,a){return b[0].indexOf(b[a])+b.index});RegExp.prototype.escape||(RegExp.escape=function(b){return b.replace(/[\-\[\]{}()*+?.\\\^$|,#\s]/g,"\\$&")});String.prototype.repeat||(String.prototype.repeat=function(b){return Array(b+1).join(this)});Syntax.innerText=function(b){if(!b)return"";if("BR"==b.nodeName)return"\n";if(b.textContent)var a=b.textContent;else document.body.innerText&&(a=b.innerText);return a.replace(/\r\n?/g,"\n")};
Syntax.extractTextFromSelection=function(b){for(var a="",c=0;c<b.rangeCount;c+=1){var d=b.getRangeAt(c).toString();a+=d}return a};Syntax.copyCode=function(b){var a=window.getSelection();a=Syntax.extractTextFromSelection(a);b.clipboardData.setData("text/plain",a);return!1};
Syntax.extractElementMatches=function(b,a){var c=[];a=a||0;(function(b){for(var d=0;b[d];d++){var f=b[d];if(3===f.nodeType||4===f.nodeType)a+=f.nodeValue.length;else if(1===f.nodeType){var g=Syntax.innerText(f);c.push(new Syntax.Match(a,g.length,{klass:f.className,force:!0,element:f,allow:"*"},g))}8!==f.nodeType&&f.children&&arguments.callee(f.childNodes,a)}})(b);c.shift();return c};
Syntax.extractMatches=function(){var b=arguments;return function(a,c){for(var d=[],e=0;e<b.length;e+=1){var f=b[e],g=e+1;null!=f&&("undefined"!=typeof f.index&&(g=f.index),f.debug&&console.log("extractMatches",f,g,a[g],a),0<a[g].length&&(f.brush?d.push(Syntax.Brush.buildTree(f,a[g],RegExp.indexOf(a,g))):(f=jQuery.extend({owner:c.owner},f),d.push(new Syntax.Match(RegExp.indexOf(a,g),a[g].length,f,a[g])))))}return d}};
Syntax.lib.webLinkProcess=function(b,a){a&&(b="http://www.google.com/search?btnI=I&q="+encodeURIComponent(b+" "));return function(a,d,e){if(!1===e.linkify)return a;d=document.createElement("a");d.href=b+encodeURIComponent(Syntax.innerText(a));for(d.className=a.className;0<a.childNodes.length;)d.appendChild(a.childNodes[0]);return d}};Syntax.register=function(b,a){var c=Syntax.brushes[b]=new Syntax.Brush;c.klass=b;a(c)};Syntax.lib.cStyleComment={pattern:/\/\*[\s\S]*?\*\//gm,klass:"comment",allow:["href"]};
Syntax.lib.cppStyleComment={pattern:/\/\/.*$/gm,klass:"comment",allow:["href"]};Syntax.lib.perlStyleComment={pattern:/#.*$/gm,klass:"comment",allow:["href"]};Syntax.lib.perlStyleRegularExpression={pattern:/\B\/([^\\\/]|\\.)*\/[a-z]*(?=\s*($|[^\w\s'"\(]))/gm,klass:"constant",incremental:!0};Syntax.lib.rubyStyleRegularExpression={pattern:/\B\/([^\\\/]|\\.)*\/[a-z]*(?=\s*($|[^\w\s'"\(]|do))/gm,klass:"constant",incremental:!0};Syntax.lib.cStyleFunction={pattern:/([a-z_][a-z0-9_]*)\s*\(/gi,matches:Syntax.extractMatches({klass:"function"})};
Syntax.lib.camelCaseType={pattern:/\b_*[A-Z][\w]*\b/g,klass:"type"};Syntax.lib.cStyleType={pattern:/\b[_a-z][_\w]*_t\b/gi,klass:"type"};Syntax.lib.xmlComment={pattern:/(<|<)!--[\s\S]*?--(>|>)/gm,klass:"comment"};Syntax.lib.webLink={pattern:/\w+:\/\/[\w\-.\/?%&=@:;#]*/g,klass:"href"};Syntax.lib.hexNumber={pattern:/\b0x[0-9a-fA-F]+/g,klass:"constant"};Syntax.lib.decimalNumber={pattern:/\b[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?/g,klass:"constant"};
Syntax.lib.doubleQuotedString={pattern:/"([^\\"\n]|\\.)*"/g,klass:"string"};Syntax.lib.singleQuotedString={pattern:/'([^\\'\n]|\\.)*'/g,klass:"string"};Syntax.lib.multiLineDoubleQuotedString={pattern:/"([^\\"]|\\.)*"/g,klass:"string"};Syntax.lib.multiLineSingleQuotedString={pattern:/'([^\\']|\\.)*'/g,klass:"string"};Syntax.lib.stringEscape={pattern:/\\./g,klass:"escape",only:["string"]};
Syntax.Match=function(b,a,c,d){this.offset=b;this.endOffset=b+a;this.length=a;this.expression=c;this.value=d;this.children=[];this.next=this.parent=null};Syntax.Match.prototype.shift=function(b,a){this.adjust(b,null,a);for(var c=0;c<this.children.length;c++)this.children[c].shift(b,a)};Syntax.Match.prototype.adjust=function(b,a,c){this.offset+=b;this.endOffset+=b;a&&(this.length=a,this.endOffset=this.offset+a);c&&(this.value=c.substr(this.offset,this.length))};
Syntax.Match.sort=function(b,a){return b.offset-a.offset||a.length-b.length};Syntax.Match.prototype.contains=function(b){return b.offset>=this.offset&&b.endOffset<=this.endOffset};Syntax.Match.defaultReduceCallback=function(b,a){"string"===typeof b&&(b=document.createTextNode(b));a.appendChild(b)};
Syntax.Match.prototype.reduce=function(b,a){var c=this.offset;var d=this.expression&&this.expression.element?this.expression.element.cloneNode(!1):document.createElement("span");b=b||Syntax.Match.defaultReduceCallback;this.expression&&this.expression.klass&&(0<d.className.length&&(d.className+=" "),d.className+=this.expression.klass);this.className&&(d.className+=" ",d.className+=this.className);for(var e=0;e<this.children.length;e+=1){var f=this.children[e],g=f.offset;f.offset<this.offset&&console.log("Syntax Warning: Offset of child",
f,"is before offset of parent",this);c=this.value.substr(c-this.offset,g-c);b(c,d);b(f.reduce(b,a),d);c=f.endOffset}c===this.offset?b(this.value,d):c<this.endOffset?b(this.value.substr(c-this.offset,this.endOffset-c),d):c>this.endOffset&&console.log("Syntax Warning: Start position "+c+" exceeds end of value "+this.endOffset);a&&(d=a(d,this));return d};
Syntax.Match.prototype.canContain=function(b){return b.expression.force?!0:this.complete?!1:b.expression.only?!0:"undefined"===typeof this.expression.allow||jQuery.isArray(this.expression.disallow)&&-1!==jQuery.inArray(b.expression.klass,this.expression.disallow)?!1:"*"===this.expression.allow||jQuery.isArray(this.expression.allow)&&-1!==jQuery.inArray(b.expression.klass,this.expression.allow)?!0:!1};
Syntax.Match.prototype.canHaveChild=function(b){if(b=b.expression.only){for(var a=this;null!==a;){if(-1!==jQuery.inArray(a.expression.klass,b))return!0;if((a=a.parent)&&a.complete)break}return!1}return!0};Syntax.Match.prototype._splice=function(b,a){return this.canHaveChild(a)?(this.children.splice(b,0,a),a.parent=this,a.expression.owner||(a.expression.owner=this.expression.owner),this):null};
Syntax.Match.prototype.insert=function(b,a){if(!this.contains(b))return null;if(a){a=this;for(var c=0;c<a.children.length;)a.children[c].contains(b)?(a=a.children[c],c=0):c+=1;return a._insertWhole(b)}return this._insert(b)};
Syntax.Match.prototype._insertWhole=function(b){var a=this.bisectAtOffsets([b.offset,b.endOffset]);this.children=[];a[0]&&(this.children=this.children.concat(a[0].children));if(a[1]){b.children=[];this.expression&&this.expression.owner&&(b.expression=this.expression.owner.getRuleForKlass(b.expression.klass)||b.expression);for(var c=0;c<a[1].children.length;c+=1){var d=a[1].children[c];b.canContain(d)&&b.children.push(d)}this.children.push(b)}a[2]&&(this.children=this.children.concat(a[2].children));
return this};Syntax.Match.prototype.insertAtEnd=function(b){if(!this.contains(b))return console.log("Syntax Error: Child is not contained in parent node!"),null;if(!this.canContain(b))return null;if(0<this.children.length){var a=this.children.length-1,c=this.children[a];return b.offset<c.offset?b.force?this._insert(b):null:b.offset<c.endOffset?b.endOffset<=c.endOffset?c.insertAtEnd(b):b.force?this._insert(b):null:this._splice(a+1,b)}return this._splice(0,b)};
Syntax.Match.prototype._insert=function(b){if(0==this.children.length)return this._splice(0,b);for(var a=0;a<this.children.length;a+=1){var c=this.children[a];if(b.endOffset<=c.offset)return this._splice(a,b);if(!(b.offset>=c.endOffset)){if(c.contains(b))return c._insert(b);b=b.bisectAtOffsets([c.offset,c.endOffset]);b[0]&&this._splice(a,b[0]);b[1]&&c.insert(b[1]);if(b[2])b=b[2];else return this}}this._splice(this.children.length,b)};
Syntax.Match.prototype.bisectAtOffsets=function(b){var a=[],c=this.offset,d=null,e=jQuery.merge([],this.children);b=b.slice(0);b.push(this.endOffset);b.sort(function(a,b){return a-b});for(var f=0;f<b.length;f+=1){var g=b[f];if(g>this.endOffset)break;g<this.offset||0==g-c?(a.push(null),c=g):(c<this.offset&&(c=this.offset),g=new Syntax.Match(c,g-c,this.expression),g.value=this.value.substr(c-this.offset,g.length),d&&(d.next=g),d=g,c=g.endOffset,a.push(g))}b.length=a.length;for(f=0;f<a.length;f+=1)if(null!=
a[f]){for(g=b[0];0<e.length;)if(e[0].endOffset<=a[f].endOffset)a[f].children.push(e.shift());else break;if(e.length&&e[0].offset<a[f].endOffset){c=e.shift().bisectAtOffsets(b);for(d=0;d<c.length;d+=1)null!=c[d]&&a[f+d].children.push(c[d]);f+=c.length-2;b.splice(0,c.length-2)}b.shift()}e.length&&console.log("Syntax Error: Children nodes not consumed",e.length," remaining!");return a};
Syntax.Match.prototype.split=function(b){for(var a=[];null!==b.exec(this.value);)a.push(b.lastIndex);b=this.bisectAtOffsets(a);return jQuery.grep(b,function(a,b){return a})};
Syntax.Match.prototype.splitLines=function(){for(var b=this.split(/\n/g),a=0;a<b.length;a+=1){var c=b[a],d=c.value.search(/\S/),e=new Syntax.Match(c.offset,c.length,c.expression,c.value);0<d?(c=c.bisectAtOffsets([c.offset+d]),e.children=c,c[0].expression={klass:"indent"},c[1].expression={klass:"text"}):(c.expression={klass:"text"},e.children=[c]);b[a]=e}return b};Syntax.Brush=function(){this.klass=null;this.rules=[];this.parents=[];this.processes={}};
Syntax.Brush.prototype.derives=function(b){this.parents.push(b);this.rules.push({apply:function(a,c){return Syntax.brushes[b].getMatches(a)}})};Syntax.Brush.prototype.allKlasses=function(){for(var b=[this.klass],a=0;a<this.parents.length;a+=1)b=b.concat(Syntax.brushes[this.parents[a]].allKlasses());return b};Syntax.Brush.convertStringToTokenPattern=function(b,a){var c="\\b",d="\\b";b.match(/^\w/)?b.match(/\w$/)||(d="\\B"):c=b.match(/\w$/)?"\\B":d="";a&&(b=RegExp.escape(b));return c+b+d};
Syntax.Brush.MatchPattern=function(b,a){if(!a.pattern)return[];var c=[],d=RegExp();for(d.compile(a.pattern);null!==(match=d.exec(b));)a.matches?c=c.concat(a.matches(match,a)):a.brush?c.push(Syntax.Brush.buildTree(a,match[0],match.index)):c.push(new Syntax.Match(match.index,match[0].length,a,match[0])),a.incremental&&(d.lastIndex=match.index+1);return c};
Syntax.Brush.prototype.push=function(b,a){if(jQuery.isArray(b)){for(var c="(",d=0;d<b.length;d+=1){0<d&&(c+="|");var e=b[d];c=e instanceof RegExp?c+e.source:c+Syntax.Brush.convertStringToTokenPattern(e,!0)}this.push(jQuery.extend({pattern:new RegExp(c+")",a.options||"g")},a))}else a=b,"string"===typeof a.pattern&&(a.string=a.pattern,a.pattern=new RegExp(Syntax.Brush.convertStringToTokenPattern(a.string,!0),a.options||"g")),"undefined"!==typeof XRegExp&&(a.pattern=new XRegExp(a.pattern)),a.apply=a.apply||
Syntax.Brush.MatchPattern,a.pattern&&a.pattern.global||"undefined"==typeof a.pattern?this.rules.push(jQuery.extend({owner:this},a)):console.log("Syntax Error: Malformed rule: ",a)};Syntax.Brush.prototype.getMatchesForRule=function(b,a){var c=[];"undefined"!=typeof a.apply&&(c=a.apply(b,a));a.debug&&console.log("Syntax matches:",a,b,c);return c};Syntax.Brush.prototype.getRuleForKlass=function(b){for(var a=0;a<this.rules.length;a+=1)if(this.rules[a].klass==b)return this.rules[a];return null};
Syntax.Brush.prototype.getMatches=function(b){for(var a=[],c=0;c<this.rules.length;c+=1)a=a.concat(this.getMatchesForRule(b,this.rules[c]));return a};Syntax.Brush.buildTree=function(b,a,c,d){a=Syntax.brushes[b.brush].buildTree(a,c,d);jQuery.extend(a.expression,b);return a};
Syntax.Brush.prototype.buildTree=function(b,a,c){a=a||0;b=b.replace(/\r/g,"");var d=this.getMatches(b);if(a&&0<a)for(var e=0;e<d.length;e+=1)d[e].shift(a);b=new Syntax.Match(a,b.length,{klass:this.allKlasses().join(" "),allow:"*",owner:this},b);d.sort(Syntax.Match.sort);for(e=0;e<d.length;e+=1)b.insertAtEnd(d[e]);if(c)for(e=0;e<c.length;e+=1)b.insert(c[e],!0);b.complete=!0;return b};
Syntax.Brush.prototype.process=function(b,a,c){b=this.buildTree(b,0,a).splitLines();a=document.createElement("code");a.className="syntax highlighted";for(var d=0;d<b.length;d+=1){var e=b[d].reduce(null,function(a,b){if(b.expression&&(b.expression.process&&(a=b.expression.process(a,b,c)),b.expression.owner)){var d=b.expression.owner.processes[b.expression.klass];d&&(a=d(a,b,c))}return a});a.appendChild(e)}return a};
Syntax.highlightText=function(b,a,c,d,e){a=(a||"plain").toLowerCase();a=Syntax.aliases[a]||a;Syntax.brushes.get(a,function(a){var f=a.process(b,c,d);d.linkify&&jQuery("span.href",f).each(function(){jQuery(this).replaceWith(jQuery("<a>").attr("href",this.innerHTML).text(this.innerHTML))});e(f,a,b,d)})};
Syntax.extractBrushName=function(b){b=b.toLowerCase();var a=b.match(/(brush|language)-([\S]+)/);if(a)return a[2];b=b.split(/ /);if(-1!==jQuery.inArray("syntax",b))for(a=0;a<b.length;a+=1){var c=Syntax.aliases[b[a]];if(c)return c}return null};
Syntax.highlight=function(b,a,c){b.each(function(){var b=jQuery(this),e=a.brush||Syntax.extractBrushName(this.className),f=Syntax.innerText(this),g=Syntax.extractElementMatches(b);a.matches&&Array.prototype.push(g,a.matches);Syntax.highlightText(f,e,g,a,function(d,e){d.oncopy=Syntax.copyCode;d=jQuery(d);if(a.theme){for(var f=Syntax.themes[a.theme],g=0;g<f.length;g+=1)d.addClass("syntax-theme-"+f[g]);d.addClass("syntax-theme-"+a.theme)}e.postprocess&&(d=e.postprocess(a,d,b));c&&(d=c(a,d,b));d&&!0===
a.replace&&b.replaceWith(d)})})};Syntax.loader.core=!0;