Advertisement
Guest User

Untitled

a guest
Sep 19th, 2019
116
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 19.40 KB | None | 0 0
  1. <script>
  2.  
  3. 'use strict';
  4. Sfdump = window.Sfdump || function(doc) {
  5. /**
  6. * @param {!Object} element
  7. * @param {boolean} status
  8. * @return {?}
  9. */
  10. function callback(element, status) {
  11. var c = element.nextSibling || {};
  12. var classes = c.className;
  13. var arrow;
  14. var i;
  15. if (/\bsf-dump-compact\b/.test(classes)) {
  16. /** @type {string} */
  17. arrow = "&#9660;";
  18. /** @type {string} */
  19. i = "sf-dump-expanded";
  20. } else {
  21. if (/\bsf-dump-expanded\b/.test(classes)) {
  22. /** @type {string} */
  23. arrow = "&#9654;";
  24. /** @type {string} */
  25. i = "sf-dump-compact";
  26. } else {
  27. return false;
  28. }
  29. }
  30. if (doc.createEvent && c.dispatchEvent) {
  31. /** @type {(Event|null)} */
  32. var event = doc.createEvent("Event");
  33. event.initEvent("sf-dump-expanded" === i ? "sfbeforedumpexpand" : "sfbeforedumpcollapse", true, false);
  34. c.dispatchEvent(event);
  35. }
  36. /** @type {string} */
  37. element.lastChild.innerHTML = arrow;
  38. c.className = c.className.replace(/\bsf-dump-(compact|expanded)\b/, i);
  39. if (status) {
  40. try {
  41. element = c.querySelectorAll("." + classes);
  42. /** @type {number} */
  43. c = 0;
  44. for (; c < element.length; ++c) {
  45. if (-1 == element[c].className.indexOf(i)) {
  46. /** @type {string} */
  47. element[c].className = i;
  48. /** @type {string} */
  49. element[c].previousSibling.lastChild.innerHTML = arrow;
  50. }
  51. }
  52. } catch (e) {
  53. }
  54. }
  55. return true;
  56. }
  57. /**
  58. * @param {!Object} a
  59. * @param {boolean} size
  60. * @return {?}
  61. */
  62. function remove(a, size) {
  63. var jsGridCell = a.nextSibling || {};
  64. var oldClass = jsGridCell.className;
  65. if (/\bsf-dump-expanded\b/.test(oldClass)) {
  66. callback(a, size);
  67. return true;
  68. }
  69. return false;
  70. }
  71. /**
  72. * @param {!Object} a
  73. * @param {boolean} size
  74. * @return {?}
  75. */
  76. function get(a, size) {
  77. var jsGridCell = a.nextSibling || {};
  78. var oldClass = jsGridCell.className;
  79. if (/\bsf-dump-compact\b/.test(oldClass)) {
  80. callback(a, size);
  81. return true;
  82. }
  83. return false;
  84. }
  85. /**
  86. * @param {!Element} row
  87. * @return {?}
  88. */
  89. function collapseAll(row) {
  90. var matches = row.querySelector("a.sf-dump-toggle");
  91. if (matches) {
  92. remove(matches, true);
  93. get(matches);
  94. return true;
  95. }
  96. return false;
  97. }
  98. /**
  99. * @param {!Object} prev
  100. * @return {?}
  101. */
  102. function show(prev) {
  103. var node;
  104. /** @type {!Array} */
  105. var allCustomElements = [];
  106. for (; (prev = prev.parentNode || {}) && (node = prev.previousSibling) && "A" === node.tagName;) {
  107. allCustomElements.push(node);
  108. }
  109. if (0 !== allCustomElements.length) {
  110. allCustomElements.forEach(function(parent) {
  111. get(parent);
  112. });
  113. return true;
  114. }
  115. return false;
  116. }
  117. /**
  118. * @param {!Node} node
  119. * @param {!Object} map
  120. * @param {number} keys
  121. * @return {undefined}
  122. */
  123. function build(node, map, keys) {
  124. closeChildAnimations(node);
  125. Array.from(keys || []).forEach(function(node) {
  126. if (!/\bsf-dump-highlight\b/.test(node.className)) {
  127. /** @type {string} */
  128. node.className = node.className + " sf-dump-highlight";
  129. }
  130. });
  131. if (!/\bsf-dump-highlight-active\b/.test(map.className)) {
  132. /** @type {string} */
  133. map.className = map.className + " sf-dump-highlight-active";
  134. }
  135. }
  136. /**
  137. * @param {!Node} node
  138. * @return {undefined}
  139. */
  140. function closeChildAnimations(node) {
  141. Array.from(node.querySelectorAll(".sf-dump-str, .sf-dump-key, .sf-dump-public, .sf-dump-protected, .sf-dump-private")).forEach(function(wrapAt) {
  142. wrapAt.className = wrapAt.className.replace(/\bsf-dump-highlight\b/, "");
  143. wrapAt.className = wrapAt.className.replace(/\bsf-dump-highlight-active\b/, "");
  144. });
  145. }
  146. /** @type {!Element} */
  147. var t = doc.createElement("style");
  148. /** @type {!RegExp} */
  149. var REGEX_ESCAPE_EXPR = /([.*+?^${}()|\[\]\/\\])/g;
  150. /** @type {!RegExp} */
  151. var rTest = /\bsf-dump-\d+-ref[012]\w+\b/;
  152. /** @type {string} */
  153. var key = 0 <= navigator.platform.toUpperCase().indexOf("MAC") ? "Cmd" : "Ctrl";
  154. /**
  155. * @param {!Node} element
  156. * @param {string} type
  157. * @param {!Function} fn
  158. * @return {undefined}
  159. */
  160. var addEvent = function(element, type, fn) {
  161. element.addEventListener(type, fn, false);
  162. };
  163. (doc.documentElement.firstElementChild || doc.documentElement.children[0]).appendChild(t);
  164. if (!doc.addEventListener) {
  165. /**
  166. * @param {!Element} element
  167. * @param {string} type
  168. * @param {!Function} callback
  169. * @return {undefined}
  170. */
  171. addEvent = function(element, type, callback) {
  172. element.attachEvent("on" + type, function(event) {
  173. /**
  174. * @return {undefined}
  175. */
  176. event.preventDefault = function() {
  177. /** @type {boolean} */
  178. event.returnValue = false;
  179. };
  180. event.target = event.srcElement;
  181. callback(event);
  182. });
  183. };
  184. }
  185. return function(node, i) {
  186. /**
  187. * @param {string} event
  188. * @param {!Function} $
  189. * @return {undefined}
  190. */
  191. function link(event, $) {
  192. addEvent(node, event, function(e) {
  193. if ("A" == e.target.tagName) {
  194. $(e.target, e);
  195. } else {
  196. if ("A" == e.target.parentNode.tagName) {
  197. $(e.target.parentNode, e);
  198. } else {
  199. if (e.target.nextElementSibling && "A" == e.target.nextElementSibling.tagName) {
  200. $(e.target.nextElementSibling, e, true);
  201. }
  202. }
  203. }
  204. });
  205. }
  206. /**
  207. * @param {!Object} event
  208. * @return {?}
  209. */
  210. function linkClickWillUnloadCurrentPage(event) {
  211. return event.ctrlKey || event.metaKey;
  212. }
  213. /**
  214. * @param {string} seq
  215. * @return {?}
  216. */
  217. function editor_update_input_group(seq) {
  218. var parts = seq.match(/[^'"]+|['"]/g).map(function(canCreateDiscussions) {
  219. if ("'" == canCreateDiscussions) {
  220. return '"\'"';
  221. }
  222. if ('"' == canCreateDiscussions) {
  223. return "'\"'";
  224. }
  225. return "'" + canCreateDiscussions + "'";
  226. });
  227. return "concat(" + parts.join(",") + ", '')";
  228. }
  229. /**
  230. * @param {string} canCreateDiscussions
  231. * @return {?}
  232. */
  233. function _jsModuleExtensions(canCreateDiscussions) {
  234. return "contains(concat(' ', normalize-space(@class), ' '), ' " + canCreateDiscussions + " ')";
  235. }
  236. /** @type {(Element|null)} */
  237. node = doc.getElementById(node);
  238. /** @type {!RegExp} */
  239. var reg = new RegExp("^(" + (node.getAttribute("data-indent-pad") || " ").replace(REGEX_ESCAPE_EXPR, "\\$1") + ")+", "m");
  240. var s = {
  241. "maxDepth" : 1,
  242. "maxStringLength" : 160,
  243. "fileLinkFormat" : false
  244. };
  245. /** @type {!NodeList<Element>} */
  246. var a = node.getElementsByTagName("A");
  247. /** @type {number} */
  248. var len = a.length;
  249. /** @type {number} */
  250. var j = 0;
  251. var r;
  252. var actual;
  253. /** @type {!Array} */
  254. var p = [];
  255. for (; j < len;) {
  256. p.push(a[j++]);
  257. }
  258. for (j in i) {
  259. s[j] = i[j];
  260. }
  261. addEvent(node, "mouseover", function(canCreateDiscussions) {
  262. if ("" != t.innerHTML) {
  263. /** @type {string} */
  264. t.innerHTML = "";
  265. }
  266. });
  267. link("mouseover", function(span, e, canCreateDiscussions) {
  268. if (canCreateDiscussions) {
  269. /** @type {string} */
  270. e.target.style.cursor = "pointer";
  271. } else {
  272. if (span = rTest.exec(span.className)) {
  273. try {
  274. /** @type {string} */
  275. t.innerHTML = "pre.sf-dump ." + span[0] + "{background-color: #B729D9; color: #FFF !important; border-radius: 2px}";
  276. } catch (e) {
  277. }
  278. }
  279. }
  280. });
  281. link("click", function(a, e, canCreateDiscussions) {
  282. if (/\bsf-dump-toggle\b/.test(a.className)) {
  283. e.preventDefault();
  284. if (!callback(a, linkClickWillUnloadCurrentPage(e))) {
  285. /** @type {(Element|null)} */
  286. var e = doc.getElementById(a.getAttribute("href").substr(1));
  287. /** @type {(Node|null)} */
  288. var p = e.previousSibling;
  289. /** @type {(Node|null)} */
  290. var n = e.parentNode;
  291. var r = a.parentNode;
  292. r.replaceChild(e, a);
  293. n.replaceChild(a, p);
  294. r.insertBefore(p, e);
  295. /** @type {(Array<string>|null)} */
  296. n = n.firstChild.nodeValue.match(reg);
  297. r = r.firstChild.nodeValue.match(reg);
  298. if (n && r && n[0] !== r[0]) {
  299. /** @type {string} */
  300. e.innerHTML = e.innerHTML.replace(new RegExp("^" + n[0].replace(REGEX_ESCAPE_EXPR, "\\$1"), "mg"), r[0]);
  301. }
  302. if (/\bsf-dump-compact\b/.test(e.className)) {
  303. callback(p, linkClickWillUnloadCurrentPage(e));
  304. }
  305. }
  306. if (canCreateDiscussions) {
  307. } else {
  308. if (doc.getSelection) {
  309. try {
  310. doc.getSelection().removeAllRanges();
  311. } catch (e) {
  312. doc.getSelection().empty();
  313. }
  314. } else {
  315. doc.selection.empty();
  316. }
  317. }
  318. } else {
  319. if (/\bsf-dump-str-toggle\b/.test(a.className)) {
  320. e.preventDefault();
  321. e = a.parentNode.parentNode;
  322. e.className = e.className.replace(/\bsf-dump-str-(expand|collapse)\b/, a.parentNode.className);
  323. }
  324. }
  325. });
  326. /** @type {!NodeList<Element>} */
  327. a = node.getElementsByTagName("SAMP");
  328. /** @type {number} */
  329. len = a.length;
  330. /** @type {number} */
  331. j = 0;
  332. for (; j < len;) {
  333. p.push(a[j++]);
  334. }
  335. /** @type {number} */
  336. len = p.length;
  337. /** @type {number} */
  338. j = 0;
  339. for (; j < len; ++j) {
  340. a = p[j];
  341. if ("SAMP" == a.tagName) {
  342. link = a.previousSibling || {};
  343. if ("A" != link.tagName) {
  344. /** @type {!Element} */
  345. link = doc.createElement("A");
  346. /** @type {string} */
  347. link.className = "sf-dump-ref";
  348. a.parentNode.insertBefore(link, a);
  349. } else {
  350. link.innerHTML += " ";
  351. }
  352. /** @type {string} */
  353. link.title = (link.title ? link.title + "\n[" : "[") + key + "+click] Expand all children";
  354. link.innerHTML += "<span>&#9660;</span>";
  355. link.className += " sf-dump-toggle";
  356. /** @type {number} */
  357. i = 1;
  358. if ("sf-dump" != a.parentNode.className) {
  359. /** @type {number} */
  360. i = i + a.parentNode.getAttribute("data-depth") / 1;
  361. }
  362. a.setAttribute("data-depth", i);
  363. var state = a.className;
  364. /** @type {string} */
  365. a.className = "sf-dump-expanded";
  366. if (state ? "sf-dump-expanded" !== state : i > s.maxDepth) {
  367. callback(link);
  368. }
  369. } else {
  370. if (/\bsf-dump-ref\b/.test(a.className) && (link = a.getAttribute("href"))) {
  371. link = link.substr(1);
  372. a.className += " " + link;
  373. if (/[\[{]$/.test(a.previousSibling.nodeValue)) {
  374. /** @type {(Element|boolean|null)} */
  375. link = link != a.nextSibling.id && doc.getElementById(link);
  376. try {
  377. /** @type {(Node|null)} */
  378. r = link.nextSibling;
  379. a.appendChild(link);
  380. r.parentNode.insertBefore(link, r);
  381. if (/^[@#]/.test(a.innerHTML)) {
  382. a.innerHTML += " <span>&#9654;</span>";
  383. } else {
  384. /** @type {string} */
  385. a.innerHTML = "<span>&#9654;</span>";
  386. /** @type {string} */
  387. a.className = "sf-dump-ref";
  388. }
  389. a.className += " sf-dump-toggle";
  390. } catch (e) {
  391. if ("&" == a.innerHTML.charAt(0)) {
  392. /** @type {string} */
  393. a.innerHTML = "&hellip;";
  394. /** @type {string} */
  395. a.className = "sf-dump-ref";
  396. }
  397. }
  398. }
  399. }
  400. }
  401. }
  402. if (doc.evaluate && Array.from && node.children.length > 1) {
  403. /**
  404. * @param {!Object} options
  405. * @return {undefined}
  406. */
  407. var displayCrumbs = function(options) {
  408. var main = options.current();
  409. if (main) {
  410. show(main);
  411. build(node, main, options.nodes);
  412. }
  413. td1b2.textContent = (options.isEmpty() ? 0 : options.idx + 1) + " of " + options.count();
  414. };
  415. node.setAttribute("tabindex", 0);
  416. /**
  417. * @return {undefined}
  418. */
  419. SearchState = function() {
  420. /** @type {!Array} */
  421. this.nodes = [];
  422. /** @type {number} */
  423. this.idx = 0;
  424. };
  425. SearchState.prototype = {
  426. next : function() {
  427. if (this.isEmpty()) {
  428. return this.current();
  429. }
  430. this.idx = this.idx < this.nodes.length - 1 ? this.idx + 1 : 0;
  431. return this.current();
  432. },
  433. previous : function() {
  434. if (this.isEmpty()) {
  435. return this.current();
  436. }
  437. /** @type {number} */
  438. this.idx = this.idx > 0 ? this.idx - 1 : this.nodes.length - 1;
  439. return this.current();
  440. },
  441. isEmpty : function() {
  442. return 0 === this.count();
  443. },
  444. current : function() {
  445. if (this.isEmpty()) {
  446. return null;
  447. }
  448. return this.nodes[this.idx];
  449. },
  450. reset : function() {
  451. /** @type {!Array} */
  452. this.nodes = [];
  453. /** @type {number} */
  454. this.idx = 0;
  455. },
  456. count : function() {
  457. return this.nodes.length;
  458. }
  459. };
  460. /** @type {!Element} */
  461. var search = doc.createElement("div");
  462. /** @type {string} */
  463. search.className = "sf-dump-search-wrapper sf-dump-search-hidden";
  464. /** @type {string} */
  465. search.innerHTML = ' <input type="text" class="sf-dump-search-input"> <span class="sf-dump-search-count">0 of 0</span> <button type="button" class="sf-dump-search-input-previous" tabindex="-1"> <svg viewBox="0 0 1792 1792" xmlns="http://www.w3.org/2000/svg"><path d="M1683 1331l-166 165q-19 19-45 19t-45-19L896 965l-531 531q-19 19-45 19t-45-19l-166-165q-19-19-19-45.5t19-45.5l742-741q19-19 45-19t45 19l742 741q19 19 19 45.5t-19 45.5z"/></svg> </button> <button type="button" class="sf-dump-search-input-next" tabindex="-1"> <svg viewBox="0 0 1792 1792" xmlns="http://www.w3.org/2000/svg"><path d="M1683 808l-742 741q-19 19-45 19t-45-19L109 808q-19-19-19-45.5t19-45.5l166-165q19-19 45-19t45 19l531 531 531-531q19-19 45-19t45 19l166 165q19 19 19 45.5t-19 45.5z"/></svg> </button> ';
  466. node.insertBefore(search, node.firstChild);
  467. var o = new SearchState;
  468. /** @type {(Element|null)} */
  469. var arcRange = search.querySelector(".sf-dump-search-input");
  470. /** @type {(Element|null)} */
  471. var td1b2 = search.querySelector(".sf-dump-search-count");
  472. /** @type {number} */
  473. var searchInputTimer = 0;
  474. /** @type {string} */
  475. var log_last_message = "";
  476. addEvent(arcRange, "keyup", function(e) {
  477. var message = e.target.value;
  478. if (message === log_last_message) {
  479. return;
  480. }
  481. log_last_message = message;
  482. clearTimeout(searchInputTimer);
  483. /** @type {number} */
  484. searchInputTimer = setTimeout(function() {
  485. o.reset();
  486. collapseAll(node);
  487. closeChildAnimations(node);
  488. if ("" === message) {
  489. /** @type {string} */
  490. td1b2.textContent = "0 of 0";
  491. return;
  492. }
  493. /** @type {string} */
  494. var classMatches = ["sf-dump-str", "sf-dump-key", "sf-dump-public", "sf-dump-protected", "sf-dump-private"].map(_jsModuleExtensions).join(" or ");
  495. var XPathResults = doc.evaluate(".//span[" + classMatches + "][contains(translate(child::text(), " + editor_update_input_group(message.toUpperCase()) + ", " + editor_update_input_group(message.toLowerCase()) + "), " + editor_update_input_group(message.toLowerCase()) + ")]", node, null, XPathResult.ORDERED_NODE_ITERATOR_TYPE, null);
  496. for (; node = XPathResults.iterateNext();) {
  497. o.nodes.push(node);
  498. }
  499. displayCrumbs(o);
  500. }, 400);
  501. });
  502. Array.from(search.querySelectorAll(".sf-dump-search-input-next, .sf-dump-search-input-previous")).forEach(function(nextElement) {
  503. addEvent(nextElement, "click", function(event) {
  504. event.preventDefault();
  505. if (-1 !== event.target.className.indexOf("next")) {
  506. o.next();
  507. } else {
  508. o.previous();
  509. }
  510. arcRange.focus();
  511. collapseAll(node);
  512. displayCrumbs(o);
  513. });
  514. });
  515. addEvent(node, "keydown", function(event) {
  516. /** @type {boolean} */
  517. var isSearchActive = !/\bsf-dump-search-hidden\b/.test(search.className);
  518. if (114 === event.keyCode && !isSearchActive || linkClickWillUnloadCurrentPage(event) && 70 === event.keyCode) {
  519. event.preventDefault();
  520. search.className = search.className.replace(/\bsf-dump-search-hidden\b/, "");
  521. arcRange.focus();
  522. } else {
  523. if (isSearchActive) {
  524. if (27 === event.keyCode) {
  525. search.className += " sf-dump-search-hidden";
  526. event.preventDefault();
  527. closeChildAnimations(node);
  528. /** @type {string} */
  529. arcRange.value = "";
  530. } else {
  531. if (linkClickWillUnloadCurrentPage(event) && 71 === event.keyCode || 13 === event.keyCode || 114 === event.keyCode) {
  532. event.preventDefault();
  533. if (event.shiftKey) {
  534. o.previous();
  535. } else {
  536. o.next();
  537. }
  538. collapseAll(node);
  539. displayCrumbs(o);
  540. }
  541. }
  542. }
  543. }
  544. });
  545. }
  546. if (0 >= s.maxStringLength) {
  547. return;
  548. }
  549. try {
  550. /** @type {!NodeList<Element>} */
  551. a = node.querySelectorAll(".sf-dump-str");
  552. /** @type {number} */
  553. len = a.length;
  554. /** @type {number} */
  555. j = 0;
  556. /** @type {!Array} */
  557. p = [];
  558. for (; j < len;) {
  559. p.push(a[j++]);
  560. }
  561. /** @type {number} */
  562. len = p.length;
  563. /** @type {number} */
  564. j = 0;
  565. for (; j < len; ++j) {
  566. a = p[j];
  567. r = a.innerText || a.textContent;
  568. /** @type {number} */
  569. i = r.length - s.maxStringLength;
  570. if (0 < i) {
  571. actual = a.innerHTML;
  572. a[a.innerText ? "innerText" : "textContent"] = r.substring(0, s.maxStringLength);
  573. a.className += " sf-dump-str-collapse";
  574. /** @type {string} */
  575. a.innerHTML = "<span class=sf-dump-str-collapse>" + actual + '<a class="sf-dump-ref sf-dump-str-toggle" title="Collapse"> &#9664;</a></span>' + "<span class=sf-dump-str-expand>" + a.innerHTML + '<a class="sf-dump-ref sf-dump-str-toggle" title="' + i + ' remaining characters"> &#9654;</a></span>';
  576. }
  577. }
  578. } catch (e) {
  579. }
  580. };
  581. }(document);
  582.  
  583.  
  584. </script>
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement