GreasyFork Search

To search scripts using Google Search

  1. // ==UserScript==
  2. // @name GreasyFork Search
  3. // @namespace http://tampermonkey.net/
  4. // @version 0.6.9
  5. // @description To search scripts using Google Search
  6. // @author CY Fung
  7. // @match https://gf.qytechs.cn/*
  8. // @icon https://www.google.com/s2/favicons?sz=64&domain=gf.qytechs.cn
  9. // @require https://fastly.jsdelivr.net/npm/jstat@1.9.6/dist/jstat.min.js
  10. // @grant none
  11. // @license MIT
  12. // ==/UserScript==
  13.  
  14.  
  15.  
  16. (() => {
  17.  
  18. function jacobi(a) {
  19. var n = a.length;
  20. var trial = n * n * 2;
  21. var e = jStat.identity(n, n);
  22. var ev = [];
  23. var i, j, p, q, maxim, s;
  24. let vaildResult = false;
  25. outer: while (trial-- > 0) {
  26. maxim = a[0][1];
  27. p = 0;
  28. q = 1;
  29. for (i = 0; i < n; i++) {
  30. for (j = 0; j < n; j++) {
  31. if (i != j) {
  32. let t = Math.abs(a[i][j]);
  33. if (maxim < t) {
  34. maxim = t;
  35. p = i;
  36. q = j
  37. }
  38. }
  39. }
  40. }
  41.  
  42. s = jStat.identity(n, n);
  43.  
  44. let tanValue = 2 * a[p][q] / (a[p][p] - a[q][q]);
  45.  
  46. let cosTwoTheta = Math.sqrt(1 / (1 + tanValue * tanValue));
  47. let cosTheta = Math.sqrt(.5 * (1 + cosTwoTheta));
  48. let sinTheta = Math.sqrt(.5 * (1 - cosTwoTheta));
  49.  
  50. s[p][p] = cosTheta;
  51. s[p][q] = -sinTheta;
  52. s[q][p] = sinTheta;
  53. s[q][q] = cosTheta;
  54.  
  55. e = jStat.multiply(e, s);
  56. a = jStat.multiply(jStat.multiply(jStat.transpose(s), a), s);
  57.  
  58. for (i = 0; i < n; i++) {
  59. for (j = i + 1; j < n; j++) {
  60. if (Math.abs(a[i][j]) > .0004) {
  61. continue outer;
  62. }
  63. }
  64. }
  65.  
  66. vaildResult = true;
  67. break;
  68. }
  69. if (!vaildResult) {
  70. console.warn("The matrix is not symmetric.")
  71. return null;
  72. }
  73. for (i = 0; i < n; i++) ev.push(a[i][i]);
  74. //returns both the eigenvalue and eigenmatrix
  75. return [e, ev];
  76. }
  77.  
  78.  
  79.  
  80. function getVN(A) {
  81. // normalized the matrix values such that det(A) will be a finite value close to 1.0
  82. // vn = sqrt( ( column_vector_1 ^2 + column_vector_2 ^2 + ... + column_vector_n ^2 ) / n )
  83. let vn = 0;
  84. const AT = jStat.transpose(A);
  85. let N = AT.length;
  86. for (let i = 0; i < N; i++) {
  87. vn += jStat.dot(AT[i], AT[i]);
  88. }
  89. vn = Math.sqrt(vn / N);
  90. return vn;
  91. }
  92.  
  93. function subtractLambdaFromDiagonal(matrix, lambda) {
  94. // A - lambda I
  95. return matrix.map((row, rowIndex) => row.map((val, colIndex) => rowIndex === colIndex ? val - lambda : val));
  96. }
  97.  
  98.  
  99. function eigenvalueNewton(A, lambda0) {
  100. const N = A.length;
  101. const epsilon = 1e-5; // epsilon is applied on the normalized scale of lambda
  102. const maxTrial = 8;
  103.  
  104. function f(lambda) {
  105. return jStat.det(subtractLambdaFromDiagonal(A, lambda));
  106. }
  107.  
  108. function fPrime(lambda) {
  109. return (f(lambda + epsilon) - f(lambda)) / epsilon;
  110. }
  111.  
  112. let x_k = lambda0;
  113. let positiveSign = 0;
  114. let negativeSign = 0;
  115. for (let i = 0; i < maxTrial; i++) {
  116. const fx = f(x_k);
  117. const fxPrime = fPrime(x_k);
  118. const diff = fx / fxPrime;
  119. if (isNaN(diff)) return x_k; // ignore f/f'
  120. const x_k1 = x_k - diff;
  121. if ((diff > 0 ? diff : -diff) < epsilon) {
  122. return x_k1;
  123. }
  124. x_k = x_k1;
  125. if (fx > 0) positiveSign = 1;
  126. else if (fx < 0) negativeSign = 1;
  127. }
  128. return positiveSign && negativeSign ? x_k : lambda0; // avoid diverging iterations
  129. }
  130.  
  131. function vectorNorm(v) {
  132. // Math.sqrt(v dot v), same as jStat.norm(jStat.transpose(v))
  133. let s = 0;
  134. for (const k of v) s += k[0] * k[0];
  135. return Math.sqrt(s);
  136. }
  137.  
  138. function isUnitVector(v, tol = 0.01) {
  139. // Check if it is likely a unit vector
  140. let s = 0;
  141. for (const k of v) {
  142. s += k[0] * k[0];
  143. if (s > 1 + tol) return false;
  144. }
  145. return s > 1 - tol;
  146. }
  147.  
  148. jStat.jacobiOri = jStat.jacobi;
  149. // https://www.statskingdom.com/pca-calculator.html
  150. jStat.jacobi = function (C) {
  151.  
  152. const vn = getVN(C);
  153. C = jStat.multiply(C, 1 / vn);
  154. let r1 = jacobi(C);
  155. // let r0 = JSON.parse(JSON.stringify(r1))
  156. // r0[1] = r0[1].map(v => vn * v);
  157. let A = C;
  158. let eigenvectors = r1[0];
  159. let eigenvalues = r1[1];
  160. const iterationCount = 4;
  161.  
  162. for (let i = 0; i < eigenvalues.length; i++) {
  163. let q, m;
  164. q = jStat.transpose(eigenvectors[i]);
  165. if (!isUnitVector(q)) break;
  166. eigenvalues[i] = eigenvalueNewton(A, eigenvalues[i]); // refine eigenvalues obtained in jacobiOri
  167.  
  168. // inverse power method (A-lambda I) y_k = b_{k-1}
  169. // b_k = y_k / norm(y_k)
  170. let M = subtractLambdaFromDiagonal(A, eigenvalues[i]);
  171. for (let j = 0; j < iterationCount; j++) {
  172. m = jStat.transpose(jStat.gauss_elimination(M, q));
  173. m = jStat.multiply(m, 1 / vectorNorm(m))
  174. if (!isUnitVector(m)) break; // avoid Inf / NaN error
  175. q = m;
  176. }
  177. eigenvectors[i] = jStat.transpose(q);
  178.  
  179. }
  180. r1[1] = r1[1].map(v => vn * v);
  181. return r1;
  182. };
  183.  
  184.  
  185.  
  186. })();
  187.  
  188.  
  189. jStat.PCA = function PCA(X) {
  190. var m = X.length;
  191. var n = X[0].length;
  192. var i = 0;
  193. var j, temp1;
  194. var u = [];
  195. var D = [];
  196. var result = [];
  197. var temp2 = [];
  198. var Y = [];
  199. var Bt = [];
  200. var B = [];
  201. var C = [];
  202. var V = [];
  203. var Vt = [];
  204. for (i = 0; i < m; i++) {
  205. u[i] = jStat.sum(X[i]) / n;
  206. }
  207. for (i = 0; i < n; i++) {
  208. B[i] = [];
  209. for (j = 0; j < m; j++) {
  210. B[i][j] = X[j][i] - u[j];
  211. }
  212. }
  213. B = jStat.transpose(B);
  214. for (i = 0; i < m; i++) {
  215. C[i] = [];
  216. for (j = 0; j < m; j++) {
  217. C[i][j] = (jStat.dot([B[i]], [B[j]])) / (n - 1);
  218. }
  219. }
  220. result = jStat.jacobi(C);
  221. V = result[0];
  222. D = result[1];
  223.  
  224. Vt = jStat.transpose(V);
  225.  
  226.  
  227. let vd = [];
  228. for (i = 0; i < D.length; i++) {
  229. vd[i] = {
  230. Vt: Vt[i],
  231. D: D[i],
  232. k: D[i] * D[i]
  233. };
  234. }
  235.  
  236. vd.sort((a, b) => {
  237. return b.k - a.k
  238. })
  239.  
  240. Vt = vd.map(e => e.Vt);
  241. D = vd.map(e => e.D);
  242.  
  243.  
  244.  
  245. V = null;
  246.  
  247.  
  248. Bt = jStat.transpose(B);
  249.  
  250. let pcs_11 = [];
  251. let pt_11 = [1, 1];
  252. for (i = 0; i < m; i++) {
  253.  
  254.  
  255. pcs_11[i] = jStat.dot([Vt[i]], [pt_11]);
  256. if (pcs_11[i] < 0) Vt[i] = jStat.multiply(Vt[i], -1);
  257. pcs_11[i] = jStat.dot([Vt[i]], [pt_11]);
  258. }
  259.  
  260.  
  261.  
  262.  
  263.  
  264. for (i = 0; i < m; i++) {
  265. Y[i] = [];
  266. for (j = 0; j < Bt.length; j++) {
  267. Y[i][j] = jStat.dot([Vt[i]], [Bt[j]]);
  268. }
  269. }
  270. return [X, D, Vt, Y];
  271. };
  272.  
  273. (function () {
  274. 'use strict';
  275.  
  276. let input = document.querySelector('form input[name="q"]');
  277. if (!(input instanceof HTMLInputElement)) return;
  278. let form = input.closest('form');
  279. if (!(form instanceof HTMLFormElement)) return;
  280.  
  281.  
  282. let locales = [...document.querySelectorAll('select#language-selector-locale > option')].map(x => x.value)
  283.  
  284. document.head.appendChild(document.createElement('style')).textContent = `
  285.  
  286.  
  287. @keyframes rs1tmAnimation {
  288. 0% {
  289. background-position-x: 3px;
  290. }
  291. 100% {
  292. background-position-x: 4px;
  293. }
  294. }
  295.  
  296. form.rs1tm{
  297. position: fixed;
  298. top:-300px;
  299. left:-300px;
  300. width: 1px;
  301. height: 1px;
  302. contain: strict;
  303. display: flex;
  304. overflow: hidden;
  305. animation: rs1tmAnimation 1ms linear 1ms 1 normal forwards;
  306. }
  307.  
  308. `
  309. document.addEventListener('animationstart', (evt) => {
  310.  
  311. if (evt.animationName === 'rs1tmAnimation') {
  312. const target = evt.target;
  313. target && target.parentNode && target.remove();
  314. }
  315.  
  316. }, true);
  317.  
  318. window.callback947 = function (rainijpolynomialRegressionJs) {
  319. if (!rainijpolynomialRegressionJs) return;
  320. const { PolynomialFeatures, PolynomialRegressor, RegressionError } = rainijpolynomialRegressionJs;
  321. if (!PolynomialFeatures || !PolynomialRegressor || !RegressionError) return;
  322.  
  323. console.log(rainijpolynomialRegressionJs)
  324. }
  325.  
  326. form.addEventListener('submit', function (evt) {
  327.  
  328. try {
  329.  
  330.  
  331. let form = evt.target;
  332. if (!(form instanceof HTMLFormElement)) return;
  333. let input = form.querySelector('input[name="q"]');
  334. if (!(input instanceof HTMLInputElement)) return;
  335.  
  336. if (form.classList.contains('rs1tm')) return;
  337.  
  338. let value = input.value;
  339. const lang = document.documentElement.lang || '';
  340.  
  341. let useLang = false;
  342.  
  343.  
  344. let u = 0;
  345. let isGoogleSearch = false;
  346.  
  347. let sites = [];
  348.  
  349. const split = value.split(/\s+/);
  350. let forceLang = 'all';
  351. let reformedSplit = [];
  352. for (const s of split) {
  353.  
  354. if (!isGoogleSearch && /^[a-z][a-z0-9_-]{2,}(\.[a-z][a-z0-9_-]{2,})*(\.[a-z-]{2,4})+$/.test(s)) {
  355. if (/\.(js|css|html|htm|xml|img|svg|txt|php|cgi|xhtml|ini|vue|xhr|ajax)$/.test(s)) {
  356. reformedSplit.push(s);
  357. } else {
  358. sites.push(s);
  359. }
  360. } else if (s === 'js') {
  361. forceLang = 'js'; reformedSplit.push(s);
  362. } else if (s === 'css') {
  363. forceLang = 'css'; reformedSplit.push(s);
  364. } else if (s === 'user.js') {
  365. forceLang = 'js';
  366. } else if (s === 'user.css') {
  367. forceLang = 'css';
  368. } else if (s === '"js"') {
  369. reformedSplit.push('js');
  370. } else if (s === '"css"') {
  371. reformedSplit.push('css');
  372. } else if (u === 0 && s === 'g') {
  373. isGoogleSearch = true;
  374. } else if (locales.indexOf(s) >= 0 || s === lang) {
  375. useLang = s;
  376. } else {
  377. reformedSplit.push(s);
  378. }
  379. u++;
  380. }
  381. console.log(sites)
  382.  
  383. value = reformedSplit.join(' ')
  384.  
  385. let onlySite = '';
  386.  
  387. if (sites.length === 1 && sites[0]) {
  388. onlySite = sites[0];
  389. }
  390.  
  391. /*
  392. if (!isGoogleSearch && onlySite && /\.\w+\.\w+/.test(onlySite)) {
  393. alert('Greasy Fork镜像 only lists eTLD+1.');
  394. evt.preventDefault();
  395. evt.stopImmediatePropagation();
  396. evt.stopPropagation();
  397. return;
  398. }
  399. */
  400.  
  401.  
  402. if (isGoogleSearch && value) {
  403. let q = value.replace('g ', '');
  404.  
  405. let m = "-inurl%3A%22%2Fusers%2F%22+-inurl%3A%22%2Fdiscussions%22-inurl%3A%22%2Fstats%22+-inurl%3A%22%2Ffeedback%22+-inurl%3A%22%2Fcode%22+-inurl%3A%22q%3D%22+-inurl%3A%22%2Fby-site%2F%22+inurl%3A%22%2Fscripts%2F%22+site%3Agf.qytechs.cn";
  406.  
  407.  
  408.  
  409. let lr = useLang ? `&lr=lang_${useLang}` : '';
  410. evt.preventDefault();
  411. evt.stopImmediatePropagation();
  412. evt.stopPropagation();
  413. location.href = `https://www.google.com/search?q=${encodeURIComponent(q)}+${m}${lr}`
  414.  
  415. } else if (!isGoogleSearch && (value || onlySite)) {
  416.  
  417.  
  418. let newForm = document.createElement('form');
  419. newForm.className = 'rs1tm';
  420. const copyAttr = (x) => {
  421. let t = form.getAttribute(x);
  422. if (typeof t === 'string') newForm.setAttribute(x, t);
  423. }
  424. copyAttr('action');
  425. copyAttr('accept-charset');
  426. copyAttr('method');
  427. newForm.innerHTML = `<input name="q" type="hidden" value="" /><input name="site" type="hidden" /><input name="language" type="hidden" value="all" /><input name="sort" type="hidden" /><input name="vl" type="hidden" value="">`
  428.  
  429.  
  430. const nq = newForm.querySelector('input[name="q"]');
  431. const language = newForm.querySelector('input[name="language"]');
  432. const site = newForm.querySelector('input[name="site"]');
  433. const sort = newForm.querySelector('input[name="sort"]');
  434.  
  435. value = value.replace(/\s+/g, ' ');
  436. site.value = onlySite;
  437.  
  438. if (form.getAttribute('action') === `/${lang}/scripts` && useLang && useLang !== lang) {
  439. form.setAttribute('action', `/${useLang}/scripts`)
  440. }
  441.  
  442.  
  443. if (site.value === '') site.remove();
  444.  
  445. nq.value = value;
  446.  
  447. language.value = forceLang;
  448.  
  449. if (language.value === '') language.remove();
  450.  
  451.  
  452. sort.value = 'updated';
  453.  
  454. let sorting = document.querySelector('#script-list-sort');
  455. if (sorting) {
  456. let sorts1 = {
  457. nil: 0,
  458. daily_installs: 0,
  459. total_installs: 0,
  460. ratings: 0,
  461. created: 0,
  462. updated: 0,
  463. name: 0
  464. }
  465. let sorts2 = {
  466. daily_installs: 0,
  467. total_installs: 0,
  468. ratings: 0,
  469. created: 0,
  470. updated: 0,
  471. name: 0
  472. }
  473. const allOptions = sorting.querySelectorAll('.list-option');
  474. const sorts = allOptions.length === 6 ? (sorts2) : (sorts1);
  475. const keys = Object.keys(sorts)
  476.  
  477. if (allOptions.length === keys.length) {
  478.  
  479.  
  480. for (const key of keys) {
  481. let e = `.list-option:not(.list-current) a[href$="sort=${key}"]`
  482. if (key === 'nil') {
  483. e = `.list-option:not(.list-current) a[href]:not([href*="sort="])`
  484. e = sorting.querySelector(e)
  485. } else {
  486. e = sorting.querySelector(e)
  487. }
  488.  
  489. if (e) {
  490. sorts[key] = 1;
  491. }
  492.  
  493. }
  494.  
  495.  
  496.  
  497. let p = Object.entries(sorts).filter(r => !r[1])
  498. if (p.length === 1) {
  499. sort.value = p[0][0]
  500. }
  501.  
  502. }
  503.  
  504. }
  505.  
  506.  
  507.  
  508.  
  509. if (sort.value === '') sort.remove();
  510.  
  511. evt.preventDefault();
  512. evt.stopImmediatePropagation();
  513. evt.stopPropagation();
  514.  
  515. form.parentNode.insertBefore(newForm, form);
  516. newForm.submit();
  517. Promise.resolve().then(() => {
  518. newForm.remove();
  519. })
  520.  
  521.  
  522. } else {
  523. evt.preventDefault();
  524. evt.stopImmediatePropagation();
  525. evt.stopPropagation();
  526. }
  527.  
  528. } catch (e) {
  529. console.log(e);
  530.  
  531. evt.preventDefault();
  532. evt.stopImmediatePropagation();
  533. evt.stopPropagation();
  534. }
  535.  
  536. })
  537.  
  538. // Your code here...
  539. })();
  540.  
  541. (() => {
  542.  
  543. function prettyMatrix(A) {
  544. let w = '';
  545. for (let i = 0; i < A.length; i++) {
  546. for (let j = 0; j < A[i].length; j++) {
  547. w += A[i][j].toFixed(4) + '\t'
  548. }
  549. w += '\n\t';
  550. }
  551. return '[\n\t' + w.trim() + '\n]';
  552. }
  553.  
  554. const getY = (data) => {
  555.  
  556. const daily = data.map(d => d.daily * 100 + Math.round(25 + 50 * Math.random()));
  557. const total = data.map(d => d.total * 100 + Math.round(25 + 50 * Math.random()));
  558. const dailyMean = jStat.mean(daily);
  559. const dailySD = jStat.stdev(daily, true);
  560. const totalMean = jStat.mean(total);
  561. const totalSD = jStat.stdev(total, true);
  562.  
  563. const uDaily = jStat.multiply(jStat.subtract(daily, dailyMean), 1 / dailySD);
  564. const uTotal = jStat.multiply(jStat.subtract(total, totalMean), 1 / totalSD);
  565.  
  566. const dataA = data.map((d, i) => [uDaily[i], uTotal[i]]);
  567.  
  568. // dataA = dataA.slice(0, 4)
  569. // console.log(dataA)
  570.  
  571. const matrixA = jStat.transpose(dataA)
  572.  
  573.  
  574. const result = jStat.PCA(matrixA);
  575. const [X, D, Vt, Y] = result;
  576.  
  577. return Y;
  578.  
  579. }
  580.  
  581. class AvgMap {
  582. constructor() {
  583. this.map = new Map();
  584. }
  585. add(key, val) {
  586. let m = this.map.get(key);
  587. if (!m) this.map.set(key, (m = [0, 0]));
  588. m[0] += val;
  589. m[1]++;
  590. }
  591. avg(key) {
  592. let m = this.map.get(key);
  593. if (!m) return 0;
  594. return m[0] / m[1];
  595. }
  596. }
  597.  
  598.  
  599. requestAnimationFrame(() => {
  600.  
  601. setTimeout(() => {
  602.  
  603. if ((location.search.includes('sort=updated') || location.search.includes('sort=created')) && location.pathname.endsWith('/scripts')) { } else return;
  604. if (!/[?&]vl=/.test(location.search)) return;
  605. let items = document.querySelectorAll('[data-script-id][data-script-daily-installs][data-script-total-installs]');
  606.  
  607. let data = [...items].map(e => ({
  608. id: parseInt(e.getAttribute('data-script-id')),
  609. daily: parseInt(e.getAttribute('data-script-daily-installs')),
  610. total: parseInt(e.getAttribute('data-script-total-installs'))
  611. })).filter(e => e.id && !isNaN(e.daily) && !isNaN(e.total));
  612. const Y = getY(data);
  613.  
  614.  
  615.  
  616. let q = null;
  617. let qSet = null;
  618. if (location.search.includes('q=')) {
  619. q = new URLSearchParams(location.search)
  620. q = q.get('q')
  621.  
  622. }
  623.  
  624. function makeQA(q) {
  625. let qSet = new Set();
  626. q.replace(/_-/g, ' ').replace(/\b\S+\b/g, (_) => {
  627. qSet.add(_.toLowerCase())
  628. });
  629. return qSet;
  630. }
  631.  
  632. if (q) {
  633. qSet = makeQA(q);
  634. }
  635.  
  636. let mr = new Map();
  637. let u = 0;
  638.  
  639. const pcaScoreMap = new AvgMap();
  640. for (const d of data) {
  641. const k = `${d.daily}|${d.total}`;
  642. pcaScoreMap.add(k, Y[0][u++]);
  643. }
  644.  
  645. for (const d of data) {
  646. const k = `${d.daily}|${d.total}`;
  647. d.pcaScore = pcaScoreMap.avg(k);
  648. let elm = document.querySelector(`[data-script-id="${d.id}"]`);
  649. if (elm) {
  650.  
  651. let order = 0;
  652. order -= Math.floor(d.pcaScore * 1000);
  653.  
  654. let u1 = new Set(), u2 = new Set();
  655.  
  656. if (qSet) {
  657.  
  658. const pSet = qSet;
  659.  
  660. let elp = elm.querySelector('.script-link')
  661. if (elp) {
  662. let t = elp.textContent
  663.  
  664. t.replace(/_-/g, ' ').replace(/\b\S+\b/g, (_) => {
  665. if (pSet.has(_.toLowerCase())) u1.add(_.toLowerCase());
  666. });
  667.  
  668.  
  669. }
  670.  
  671.  
  672.  
  673. let elq = elm.querySelector('.script-description')
  674.  
  675. if (elq) {
  676. let t = elq.textContent
  677.  
  678. t.replace(/_-/g, ' ').replace(/\b\S+\b/g, (_) => {
  679. if (pSet.has(_.toLowerCase())) u2.add(_.toLowerCase());
  680. });
  681.  
  682.  
  683. }
  684.  
  685.  
  686. }
  687. u1 = u1.size;
  688. u2 = u2.size;
  689.  
  690. if (u1 > 0 && u2 > 0 && u1 > 3 * u2 + 2) order -= 58000
  691. else if (u1 > 0 && u2 > 0 && u2 > 3 * u1 + 2) order -= 54000
  692. else if (u1 > 0 && u2 > 0 && u1 > 2 * u2 + 1) order -= 48000
  693. else if (u1 > 0 && u2 > 0 && u2 > 2 * u1 + 1) order -= 44000
  694. else if (u1 > 0 && u2 > 0 && u1 > u2) order -= 38000
  695. else if (u1 > 0 && u2 > 0 && u2 > u1) order -= 34000
  696. else if (u1 && u2) order -= 30000
  697. else if (u1) order -= 20000
  698. else if (u2) order -= 10000
  699.  
  700.  
  701. mr.set(d.id, order);
  702. // elm.style.order = order;
  703. // elm.parentNode.style.display = 'flex';
  704.  
  705.  
  706. // elm.parentNode.style.flexDirection = 'column';
  707.  
  708.  
  709. }
  710. }
  711.  
  712.  
  713. let lists = [...new Set([...document.querySelectorAll(`[data-script-id]`)].map(p => p.parentNode))];
  714. for (const list of lists) {
  715.  
  716. let m = [...list.childNodes].map((e, originalIdx) => ({
  717. originalIdx,
  718. element: e,
  719. order: mr.get(e instanceof HTMLElement ? (+e.getAttribute('data-script-id') || '') : '') || 0
  720. }));
  721.  
  722. m.sort((a, b) => {
  723. return a.order - b.order || a.originalIdx - b.originalIdx
  724. });
  725. let newNodes = m.map(e => e.element);
  726.  
  727. list.replaceChildren(...newNodes);
  728. }
  729.  
  730.  
  731. // console.log(prettyMatrix(X))
  732.  
  733. // console.log(prettyMatrix(Y))
  734.  
  735.  
  736.  
  737.  
  738.  
  739. }, 300);
  740.  
  741. });
  742.  
  743.  
  744.  
  745. })();

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址