Nenhuma Descrição

admin-bar.js 9.5KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346
  1. /**
  2. * CssSelectorGenerator
  3. */
  4. (function () {
  5. var CssSelectorGenerator, root,
  6. indexOf = [].indexOf || function (item) {
  7. for (var i = 0, l = this.length; i < l; i++) {
  8. if (i in this && this[i] === item) return i;
  9. }
  10. return -1;
  11. };
  12. CssSelectorGenerator = (function () {
  13. CssSelectorGenerator.prototype.default_options = {
  14. selectors: ['id', 'class', 'tag', 'nthchild']
  15. };
  16. function CssSelectorGenerator(options) {
  17. if (options == null) {
  18. options = {};
  19. }
  20. this.options = {};
  21. this.setOptions(this.default_options);
  22. this.setOptions(options);
  23. }
  24. CssSelectorGenerator.prototype.setOptions = function (options) {
  25. var key, results, val;
  26. if (options == null) {
  27. options = {};
  28. }
  29. results = [];
  30. for (key in options) {
  31. val = options[key];
  32. if (this.default_options.hasOwnProperty(key)) {
  33. results.push(this.options[key] = val);
  34. } else {
  35. results.push(void 0);
  36. }
  37. }
  38. return results;
  39. };
  40. CssSelectorGenerator.prototype.isElement = function (element) {
  41. return !!((element != null ? element.nodeType : void 0) === 1);
  42. };
  43. CssSelectorGenerator.prototype.getParents = function (element) {
  44. var current_element, result;
  45. result = [];
  46. if (this.isElement(element)) {
  47. current_element = element;
  48. while (this.isElement(current_element)) {
  49. result.push(current_element);
  50. current_element = current_element.parentNode;
  51. }
  52. }
  53. return result;
  54. };
  55. CssSelectorGenerator.prototype.getTagSelector = function (element) {
  56. return this.sanitizeItem(element.tagName.toLowerCase());
  57. };
  58. CssSelectorGenerator.prototype.sanitizeItem = function (item) {
  59. var characters;
  60. characters = (item.split('')).map(function (character) {
  61. if (character === ':') {
  62. return "\\" + (':'.charCodeAt(0).toString(16).toUpperCase()) + " ";
  63. } else if (/[ !"#$%&'()*+,.\/;<=>?@\[\\\]^`{|}~]/.test(character)) {
  64. return "\\" + character;
  65. } else {
  66. return escape(character).replace(/\%/g, '\\');
  67. }
  68. });
  69. return characters.join('');
  70. };
  71. CssSelectorGenerator.prototype.getIdSelector = function (element) {
  72. var id, sanitized_id;
  73. id = element.getAttribute('id');
  74. if ((id != null) && (id !== '') && !(/\s/.exec(id)) && !(/^\d/.exec(id))) {
  75. sanitized_id = "#" + (this.sanitizeItem(id));
  76. if (element.ownerDocument.querySelectorAll(sanitized_id).length === 1) {
  77. return sanitized_id;
  78. }
  79. }
  80. return null;
  81. };
  82. CssSelectorGenerator.prototype.getClassSelectors = function (element) {
  83. var class_string, item, result;
  84. result = [];
  85. class_string = element.getAttribute('class');
  86. if (class_string != null) {
  87. class_string = class_string.replace(/\s+/g, ' ');
  88. class_string = class_string.replace(/^\s|\s$/g, '');
  89. if (class_string !== '') {
  90. result = (function () {
  91. var k, len, ref, results;
  92. ref = class_string.split(/\s+/);
  93. results = [];
  94. for (k = 0, len = ref.length; k < len; k++) {
  95. item = ref[k];
  96. results.push("." + (this.sanitizeItem(item)));
  97. }
  98. return results;
  99. }).call(this);
  100. }
  101. }
  102. return result;
  103. };
  104. CssSelectorGenerator.prototype.getAttributeSelectors = function (element) {
  105. var attribute, blacklist, k, len, ref, ref1, result;
  106. result = [];
  107. blacklist = ['id', 'class'];
  108. ref = element.attributes;
  109. for (k = 0, len = ref.length; k < len; k++) {
  110. attribute = ref[k];
  111. if (ref1 = attribute.nodeName, indexOf.call(blacklist, ref1) < 0) {
  112. result.push("[" + attribute.nodeName + "=" + attribute.nodeValue + "]");
  113. }
  114. }
  115. return result;
  116. };
  117. CssSelectorGenerator.prototype.getNthChildSelector = function (element) {
  118. var counter, k, len, parent_element, sibling, siblings;
  119. parent_element = element.parentNode;
  120. if (parent_element != null) {
  121. counter = 0;
  122. siblings = parent_element.childNodes;
  123. for (k = 0, len = siblings.length; k < len; k++) {
  124. sibling = siblings[k];
  125. if (this.isElement(sibling)) {
  126. counter++;
  127. if (sibling === element) {
  128. return ":nth-child(" + counter + ")";
  129. }
  130. }
  131. }
  132. }
  133. return null;
  134. };
  135. CssSelectorGenerator.prototype.testSelector = function (element, selector) {
  136. var is_unique, result;
  137. is_unique = false;
  138. if ((selector != null) && selector !== '') {
  139. result = element.ownerDocument.querySelectorAll(selector);
  140. if (result.length === 1 && result[0] === element) {
  141. is_unique = true;
  142. }
  143. }
  144. return is_unique;
  145. };
  146. CssSelectorGenerator.prototype.getAllSelectors = function (element) {
  147. var result;
  148. result = {
  149. t: null,
  150. i: null,
  151. c: null,
  152. a: null,
  153. n: null
  154. };
  155. if (indexOf.call(this.options.selectors, 'tag') >= 0) {
  156. result.t = this.getTagSelector(element);
  157. }
  158. if (indexOf.call(this.options.selectors, 'id') >= 0) {
  159. result.i = this.getIdSelector(element);
  160. }
  161. if (indexOf.call(this.options.selectors, 'class') >= 0) {
  162. result.c = this.getClassSelectors(element);
  163. }
  164. if (indexOf.call(this.options.selectors, 'attribute') >= 0) {
  165. result.a = this.getAttributeSelectors(element);
  166. }
  167. if (indexOf.call(this.options.selectors, 'nthchild') >= 0) {
  168. result.n = this.getNthChildSelector(element);
  169. }
  170. return result;
  171. };
  172. CssSelectorGenerator.prototype.testUniqueness = function (element, selector) {
  173. var found_elements, parent;
  174. parent = element.parentNode;
  175. found_elements = parent.querySelectorAll(selector);
  176. return found_elements.length === 1 && found_elements[0] === element;
  177. };
  178. CssSelectorGenerator.prototype.testCombinations = function (element, items, tag) {
  179. var item, k, l, len, len1, ref, ref1;
  180. ref = this.getCombinations(items);
  181. for (k = 0, len = ref.length; k < len; k++) {
  182. item = ref[k];
  183. if (this.testUniqueness(element, item)) {
  184. return item;
  185. }
  186. }
  187. if (tag != null) {
  188. ref1 = items.map(function (item) {
  189. return tag + item;
  190. });
  191. for (l = 0, len1 = ref1.length; l < len1; l++) {
  192. item = ref1[l];
  193. if (this.testUniqueness(element, item)) {
  194. return item;
  195. }
  196. }
  197. }
  198. return null;
  199. };
  200. CssSelectorGenerator.prototype.getUniqueSelector = function (element) {
  201. var found_selector, k, len, ref, selector_type, selectors;
  202. selectors = this.getAllSelectors(element);
  203. ref = this.options.selectors;
  204. for (k = 0, len = ref.length; k < len; k++) {
  205. selector_type = ref[k];
  206. switch (selector_type) {
  207. case 'id':
  208. if (selectors.i != null) {
  209. return selectors.i;
  210. }
  211. break;
  212. case 'tag':
  213. if (selectors.t != null) {
  214. if (this.testUniqueness(element, selectors.t)) {
  215. return selectors.t;
  216. }
  217. }
  218. break;
  219. case 'class':
  220. if ((selectors.c != null) && selectors.c.length !== 0) {
  221. found_selector = this.testCombinations(element, selectors.c, selectors.t);
  222. if (found_selector) {
  223. return found_selector;
  224. }
  225. }
  226. break;
  227. case 'attribute':
  228. if ((selectors.a != null) && selectors.a.length !== 0) {
  229. found_selector = this.testCombinations(element, selectors.a, selectors.t);
  230. if (found_selector) {
  231. return found_selector;
  232. }
  233. }
  234. break;
  235. case 'nthchild':
  236. if (selectors.n != null) {
  237. return selectors.n;
  238. }
  239. }
  240. }
  241. return '*';
  242. };
  243. CssSelectorGenerator.prototype.getSelector = function (element) {
  244. var all_selectors, item, k, l, len, len1, parents, result, selector, selectors;
  245. all_selectors = [];
  246. parents = this.getParents(element);
  247. for (k = 0, len = parents.length; k < len; k++) {
  248. item = parents[k];
  249. selector = this.getUniqueSelector(item);
  250. if (selector != null) {
  251. all_selectors.push(selector);
  252. }
  253. }
  254. selectors = [];
  255. for (l = 0, len1 = all_selectors.length; l < len1; l++) {
  256. item = all_selectors[l];
  257. selectors.unshift(item);
  258. result = selectors.join(' > ');
  259. if (this.testSelector(element, result)) {
  260. return result;
  261. }
  262. }
  263. return null;
  264. };
  265. CssSelectorGenerator.prototype.getCombinations = function (items) {
  266. var i, j, k, l, ref, ref1, result;
  267. if (items == null) {
  268. items = [];
  269. }
  270. result = [[]];
  271. for (i = k = 0, ref = items.length - 1; 0 <= ref ? k <= ref : k >= ref; i = 0 <= ref ? ++k : --k) {
  272. for (j = l = 0, ref1 = result.length - 1; 0 <= ref1 ? l <= ref1 : l >= ref1; j = 0 <= ref1 ? ++l : --l) {
  273. result.push(result[j].concat(items[i]));
  274. }
  275. }
  276. result.shift();
  277. result = result.sort(function (a, b) {
  278. return a.length - b.length;
  279. });
  280. result = result.map(function (item) {
  281. return item.join('');
  282. });
  283. return result;
  284. };
  285. return CssSelectorGenerator;
  286. })();
  287. if (typeof define !== "undefined" && define !== null ? define.amd : void 0) {
  288. define([], function () {
  289. return CssSelectorGenerator;
  290. });
  291. } else {
  292. root = typeof exports !== "undefined" && exports !== null ? exports : this;
  293. root.CssSelectorGenerator = CssSelectorGenerator;
  294. }
  295. }).call(this);
  296. (function ($) {
  297. var selector_generator = new CssSelectorGenerator;
  298. var pumAdminBarText = pumAdminBarText || {
  299. instructions: 'After clicking ok, click the element you want a selector for.',
  300. results: 'Selector'
  301. };
  302. $(document).on('click', '#wp-admin-bar-pum-get-selector', function (event) {
  303. alert(pumAdminBarText.instructions);
  304. event.preventDefault();
  305. event.stopPropagation();
  306. $(document).one('click', function (event) {
  307. // get reference to the element user clicked on
  308. var element = event.target,
  309. // get unique CSS selector for that element
  310. selector = selector_generator.getSelector(element);
  311. alert( pumAdminBarText.results + ": " + selector);
  312. event.preventDefault();
  313. event.stopPropagation();
  314. });
  315. });
  316. }(jQuery));