| 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 '';    };})();
 |