68 lines
1.8 KiB
JavaScript
68 lines
1.8 KiB
JavaScript
/*
|
|
---
|
|
description: XML parser engine for EnlighterJS
|
|
|
|
license: MIT-style
|
|
|
|
authors:
|
|
- Andi Dittrich
|
|
- Jose Prado
|
|
|
|
requires:
|
|
- Core/1.4.5
|
|
|
|
provides: [EnlighterJS.Tokenizer.Xml]
|
|
...
|
|
*/
|
|
EnlighterJS.Tokenizer.Xml = new Class({
|
|
|
|
Extends : EnlighterJS.Tokenizer.Standard,
|
|
|
|
code: null,
|
|
|
|
/**
|
|
* Store code to pre-process XML
|
|
*/
|
|
getTokens : function(language, code){
|
|
this.code = code;
|
|
return this.parent(language, code);
|
|
},
|
|
|
|
/**
|
|
* XML Syntax is preprocessed
|
|
*/
|
|
getPreprocessedTokens: function(token){
|
|
// token list
|
|
var rawTokens = [];
|
|
|
|
// Tags + attributes matching and preprocessing.
|
|
var tagPattern = /((?:\<|<)[A-Z:_][A-Z0-9:.-]*)([\s\S]*?)(\/?(?:\>|>))/gi;
|
|
var attPattern = /\b([\w:-]+)([ \t]*)(=)([ \t]*)(['"][^'"]+['"]|[^'" \t]+)/gi;
|
|
|
|
// tmp storage
|
|
var match = null;
|
|
var attMatch = null;
|
|
var index = 0;
|
|
|
|
// Create array of matches containing opening tags, attributes, values, and separators.
|
|
while ((match = tagPattern.exec(this.code)) != null){
|
|
rawTokens.push(token(match[1], 'kw1', match.index));
|
|
while ((attMatch = attPattern.exec(match[2])) != null){
|
|
// Attributes
|
|
index = match.index + match[1].length + attMatch.index;
|
|
rawTokens.push(token(attMatch[1], 'kw2', index));
|
|
|
|
// Separators (=)
|
|
index += attMatch[1].length + attMatch[2].length;
|
|
rawTokens.push(token(attMatch[3], 'kw1', index));
|
|
|
|
// Values
|
|
index += attMatch[3].length + attMatch[4].length;
|
|
rawTokens.push(token(attMatch[5], 'st0', index));
|
|
}
|
|
rawTokens.push(token(match[3], 'kw1', match.index + match[1].length + match[2].length));
|
|
}
|
|
|
|
return rawTokens;
|
|
}
|
|
});
|