Advertisement
azcn2503

suggest

Jul 25th, 2014
267
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. var suggest = 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.         tags: {},
  88.         classes: {},
  89.         ids: {}
  90.     }
  91.     var lastTypePositions = {
  92.         dot: selector.lastIndexOf('.'),
  93.         hash: selector.lastIndexOf('#'),
  94.         arrow: selector.lastIndexOf('>')
  95.     }
  96.     var lastType = getLastType(lastTypePositions);
  97.     var lookingFor = 'tag';
  98.     if (lastType == 'dot') {
  99.         lookingFor = 'class';
  100.     }
  101.     if (lastType == 'hash') {
  102.         lookingFor = 'id';
  103.     }
  104.     if (lastType == 'arrow') {
  105.         lookingFor = 'innerTag';
  106.     }
  107.     var selector = selector.replace(/( )*>\1*/g, '>').split(' ');
  108.     var selectorString = '';
  109.     var els = null;
  110.     for (var i in selector) {
  111.         if (i < selector.length - 1) {
  112.             selectorString += selector[i] + ' ';
  113.             continue;
  114.         }
  115.         var tagName = selector[i].match(/^[a-z0-9>*]+/i);
  116.         tagName = !tagName ? '*' : tagName[0];
  117.         var tagNameRegex = tagName == '*' ? null : new RegExp('^' + tagName, 'i');
  118.         var classString = selector[i].match(/\.[a-z0-9\-_.]+/i);
  119.         classString = !classString ? '' : classString[0];
  120.         var id = selector[i].match(/#[a-z0-9\-_]+/i);
  121.         id = !id ? '' : id[0];
  122.         if (lookingFor == 'tag') {
  123.             els = document.querySelectorAll(selectorString + tagName);
  124.             if (els.length == 0) {
  125.                 els = document.querySelectorAll('*');
  126.             }
  127.             var tmp = {};
  128.             for (var i in els) {
  129.                 if (!els[i].tagName) {
  130.                     continue;
  131.                 }
  132.                 tmp[els[i].tagName] = true;
  133.             }
  134.             if (Object.keys(tmp).length == 1) {
  135.                 els = document.querySelectorAll('*');
  136.             }
  137.             for (var i in els) {
  138.                 if (!els[i].tagName) {
  139.                     continue;
  140.                 }
  141.                 if (tagName == '*') {
  142.                     res.tags[els[i].tagName] = true;
  143.                     continue;
  144.                 }
  145.                 if (tagNameRegex.test(els[i].tagName)) {
  146.                     res.tags[els[i].tagName] = true;
  147.                 }
  148.             }
  149.         }
  150.         if (lookingFor == 'class') {
  151.             var classes = self.getClasses(tagName, classString);
  152.             res.classes = classes;
  153.         }
  154.         if (lookingFor == 'id') {
  155.             var id = selector[selector.length - 1].split('#')[1];
  156.             var ids = self.getIds(tagName, id);
  157.             res.ids = ids;
  158.         }
  159.         if (lookingFor == 'innerTag') {
  160.             var tags = self.getInnerTags(tagName);
  161.             res.tags = tags;
  162.         }
  163.     }
  164.     return res;
  165. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement