Advertisement
azcn2503

Mate / Suggest

Jul 25th, 2014
252
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1.         var evalSuggest = function(selector) {
  2.             selector = selector || '*';
  3.             var self = this;
  4.             this.getClasses = function(selector, classHint) {
  5.                 classHint = classHint || '';
  6.                 var lastClassHint = classHint.substr(classHint.lastIndexOf('.') + 1);
  7.                 classHint = classHint.replace(/\.$/, '');
  8.                 var classHintRegex = new RegExp('^' + classHint.replace(/\./, ''));
  9.                 var res = {};
  10.                 var els = document.querySelectorAll(selector + classHint);
  11.                 if (els.length == 0) {
  12.                     els = document.querySelectorAll(selector);
  13.                 }
  14.                 var classNames = [];
  15.                 for (var i in els) {
  16.                     classNames = els[i].className;
  17.                     if (!classNames) {
  18.                         continue;
  19.                     }
  20.                     classNames = classNames.split(' ');
  21.                     for (var i in classNames) {
  22.                         if (classHintRegex.test(classNames[i])) {
  23.                             res[classNames[i]] = true;
  24.                         }
  25.                         if (lastClassHint == '') {
  26.                             res[classNames[i]] = true;
  27.                         }
  28.                     }
  29.                 }
  30.                 return res;
  31.             };
  32.             this.getIds = function(selector, idHint) {
  33.                 idHint = idHint || '';
  34.                 var idHintRegex = new RegExp('^' + idHint);
  35.                 var res = {};
  36.                 var els = document.querySelectorAll(selector);
  37.                 var id = null;
  38.                 for (var i in els) {
  39.                     id = els[i].id || null;
  40.                     if (!id) {
  41.                         continue;
  42.                     }
  43.                     if (idHintRegex.test(id)) {
  44.                         res[id] = true;
  45.                     }
  46.                 }
  47.                 return res;
  48.             };
  49.             this.getInnerTags = function(selector) {
  50.                 var res = {};
  51.                 if (selector.charAt(selector.length - 1) == '>') {
  52.                     selector += '*';
  53.                 }
  54.                 var innerTagName = selector.substr(selector.lastIndexOf('>') + 1);
  55.                 var innerTagNameRegex = tagName == '*' ? null : new RegExp('^' + innerTagName, 'i');
  56.                 els = document.querySelectorAll(selector);
  57.                 if (els.length == 0) {
  58.                     selector = selector.substr(0, selector.lastIndexOf('>')) + '>*';
  59.                     els = document.querySelectorAll(selector);
  60.                 }
  61.                 for (var i in els) {
  62.                     if (!els[i].tagName) {
  63.                         continue;
  64.                     }
  65.                     if (innerTagName == '*') {
  66.                         res[els[i].tagName] = true;
  67.                         continue;
  68.                     }
  69.                     if (innerTagNameRegex.test(els[i].tagName)) {
  70.                         res[els[i].tagName] = true;
  71.                     }
  72.                 }
  73.                 return res;
  74.             };
  75.             this.getLastType = function(obj) {
  76.                 var key = '';
  77.                 var highest = -1;
  78.                 for (var i in obj) {
  79.                     if (obj[i] > highest) {
  80.                         highest = obj[i];
  81.                         key = i;
  82.                     }
  83.                 }
  84.                 return key;
  85.             };
  86.             var res = {};
  87.             var lastTypePositions = {
  88.                 dot: selector.lastIndexOf('.'),
  89.                 hash: selector.lastIndexOf('#'),
  90.                 arrow: selector.lastIndexOf('>')
  91.             }
  92.             var lastType = getLastType(lastTypePositions);
  93.             var lookingFor = 'tag';
  94.             if (lastType == 'dot') {
  95.                 lookingFor = 'class';
  96.             }
  97.             if (lastType == 'hash') {
  98.                 lookingFor = 'id';
  99.             }
  100.             if (lastType == 'arrow') {
  101.                 lookingFor = 'innerTag';
  102.             }
  103.             var selector = selector.replace(/( )*>\1*/g, '>').split(' ');
  104.             var selectorString = '';
  105.             var els = null;
  106.             for (var i in selector) {
  107.                 if (i < selector.length - 1) {
  108.                     selectorString += selector[i] + ' ';
  109.                     continue;
  110.                 }
  111.                 var tagName = selector[i].match(/^[a-z0-9>*]+/i);
  112.                 tagName = !tagName ? '*' : tagName[0];
  113.                 var tagNameRegex = tagName == '*' ? null : new RegExp('^' + tagName, 'i');
  114.                 var classString = selector[i].match(/\.[a-z0-9\-_.]+/i);
  115.                 classString = !classString ? '' : classString[0];
  116.                 var id = selector[i].match(/#[a-z0-9\-_]+/i);
  117.                 id = !id ? '' : id[0];
  118.                 if (lookingFor == 'tag') {
  119.                     els = document.querySelectorAll(selectorString + tagName);
  120.                     if (els.length == 0) {
  121.                         els = document.querySelectorAll('*');
  122.                     }
  123.                     var tmp = {};
  124.                     for (var i in els) {
  125.                         if (!els[i].tagName) {
  126.                             continue;
  127.                         }
  128.                         tmp[els[i].tagName] = true;
  129.                     }
  130.                     if (Object.keys(tmp).length == 1) {
  131.                         els = document.querySelectorAll('*');
  132.                     }
  133.                     for (var i in els) {
  134.                         if (!els[i].tagName) {
  135.                             continue;
  136.                         }
  137.                         if (tagName == '*') {
  138.                             res[els[i].tagName] = true;
  139.                             continue;
  140.                         }
  141.                         if (tagNameRegex.test(els[i].tagName)) {
  142.                             res[els[i].tagName] = true;
  143.                         }
  144.                     }
  145.                 }
  146.                 if (lookingFor == 'class') {
  147.                     var classes = self.getClasses(tagName, classString);
  148.                     res = classes;
  149.                 }
  150.                 if (lookingFor == 'id') {
  151.                     var id = selector[selector.length - 1].split('#')[1];
  152.                     var ids = self.getIds(tagName, id);
  153.                     res = ids;
  154.                 }
  155.                 if (lookingFor == 'innerTag') {
  156.                     var tags = self.getInnerTags(tagName);
  157.                     res = tags;
  158.                 }
  159.             }
  160.             var resArr = [];
  161.             for(var i in res) {
  162.                 resArr.push(i);
  163.             }
  164.             return resArr;
  165.         }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement