123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118 |
- (function() {
- CodeMirror.xmlHints = [];
- CodeMirror.xmlHint = function(cm) {
- var cursor = cm.getCursor();
- if (cursor.ch > 0) {
- var text = cm.getRange(CodeMirror.Pos(0, 0), cursor);
- var typed = '';
- var simbol = '';
- for(var i = text.length - 1; i >= 0; i--) {
- if(text[i] == ' ' || text[i] == '<') {
- simbol = text[i];
- break;
- }
- else {
- typed = text[i] + typed;
- }
- }
- text = text.slice(0, text.length - typed.length);
- var path = getActiveElement(text) + simbol;
- var hints = CodeMirror.xmlHints[path];
- if(typeof hints === 'undefined')
- hints = [''];
- else {
- hints = hints.slice(0);
- for (var i = hints.length - 1; i >= 0; i--) {
- if(hints[i].indexOf(typed) != 0)
- hints.splice(i, 1);
- }
- }
- return {
- list: hints,
- from: CodeMirror.Pos(cursor.line, cursor.ch - typed.length),
- to: cursor
- };
- }
- };
- var getActiveElement = function(text) {
- var element = '';
- if(text.length >= 0) {
- var regex = new RegExp('<([^!?][^\\s/>]*)[\\s\\S]*?>', 'g');
- var matches = [];
- var match;
- while ((match = regex.exec(text)) != null) {
- matches.push({
- tag: match[1],
- selfclose: (match[0].slice(match[0].length - 2) === '/>')
- });
- }
- for (var i = matches.length - 1, skip = 0; i >= 0; i--) {
- var item = matches[i];
- if (item.tag[0] == '/')
- {
- skip++;
- }
- else if (item.selfclose == false)
- {
- if (skip > 0)
- {
- skip--;
- }
- else
- {
- element = '<' + item.tag + '>' + element;
- }
- }
- }
- element += getOpenTag(text);
- }
- return element;
- };
- var getOpenTag = function(text) {
- var open = text.lastIndexOf('<');
- var close = text.lastIndexOf('>');
- if (close < open)
- {
- text = text.slice(open);
- if(text != '<') {
- var space = text.indexOf(' ');
- if(space < 0)
- space = text.indexOf('\t');
- if(space < 0)
- space = text.indexOf('\n');
- if (space < 0)
- space = text.length;
- return text.slice(0, space);
- }
- }
- return '';
- };
- })();
|