Commit | Line | Data |
---|---|---|
6a1aa64f DV |
1 | dp.sh.Brushes.Xml = function() |
2 | { | |
3 | this.CssClass = 'dp-xml'; | |
4 | } | |
5 | ||
6 | dp.sh.Brushes.Xml.prototype = new dp.sh.Highlighter(); | |
7 | dp.sh.Brushes.Xml.Aliases = ['xml', 'xhtml', 'xslt', 'html', 'xhtml']; | |
8 | ||
9 | dp.sh.Brushes.Xml.prototype.ProcessRegexList = function() | |
10 | { | |
11 | function push(array, value) | |
12 | { | |
13 | array[array.length] = value; | |
14 | } | |
15 | ||
16 | /* If only there was a way to get index of a group within a match, the whole XML | |
17 | could be matched with the expression looking something like that: | |
18 | ||
19 | (<!\[CDATA\[\s*.*\s*\]\]>) | |
20 | | (<!--\s*.*\s*?-->) | |
21 | | (<)*(\w+)*\s*(\w+)\s*=\s*(".*?"|'.*?'|\w+)(/*>)* | |
22 | | (</?)(.*?)(/?>) | |
23 | */ | |
24 | var index = 0; | |
25 | var match = null; | |
26 | var regex = null; | |
27 | ||
28 | // Match CDATA in the following format <![ ... [ ... ]]> | |
29 | // <\!\[[\w\s]*?\[(.|\s)*?\]\]> | |
30 | this.GetMatches(new RegExp('<\\!\\[[\\w\\s]*?\\[(.|\\s)*?\\]\\]>', 'gm'), 'cdata'); | |
31 | ||
32 | // Match comments | |
33 | // <!--\s*.*\s*?--> | |
34 | this.GetMatches(new RegExp('<!--\\s*.*\\s*?-->', 'gm'), 'comments'); | |
35 | ||
36 | // Match attributes and their values | |
37 | // (\w+)\s*=\s*(".*?"|\'.*?\'|\w+)* | |
38 | regex = new RegExp('([\\w-\.]+)\\s*=\\s*(".*?"|\'.*?\'|\\w+)*', 'gm'); | |
39 | while((match = regex.exec(this.code)) != null) | |
40 | { | |
41 | push(this.matches, new dp.sh.Match(match[1], match.index, 'attribute')); | |
42 | ||
43 | // if xml is invalid and attribute has no property value, ignore it | |
44 | if(match[2] != undefined) | |
45 | { | |
46 | push(this.matches, new dp.sh.Match(match[2], match.index + match[0].indexOf(match[2]), 'attribute-value')); | |
47 | } | |
48 | } | |
49 | ||
50 | // Match opening and closing tag brackets | |
51 | // </*\?*(?!\!)|/*\?*> | |
52 | this.GetMatches(new RegExp('</*\\?*(?!\\!)|/*\\?*>', 'gm'), 'tag'); | |
53 | ||
54 | // Match tag names | |
55 | // </*\?*\s*(\w+) | |
56 | regex = new RegExp('</*\\?*\\s*([\\w-\.]+)', 'gm'); | |
57 | while((match = regex.exec(this.code)) != null) | |
58 | { | |
59 | push(this.matches, new dp.sh.Match(match[1], match.index + match[0].indexOf(match[1]), 'tag-name')); | |
60 | } | |
61 | } |