Bläddra i källkod

添加 'e360-doc-table.user.js'

吴迪 3 år sedan
förälder
incheckning
defbbc5449
1 ändrade filer med 92 tillägg och 0 borttagningar
  1. 92 0
      e360-doc-table.user.js

+ 92 - 0
e360-doc-table.user.js

@@ -0,0 +1,92 @@
+// ==UserScript==
+// @name         E360 Table Transformer
+// @namespace    http://tampermonkey.net/
+// @version      1.0
+// @description  try to take over the world!
+// @author       You
+// @match        https://open.e.360.cn/*
+// @grant        GM_setClipboard
+// ==/UserScript==
+
+(function() {
+    'use strict';
+    const regexpGeneric = /^(?:List|Set)<([^>]+)>$/i
+    const convertType = (type) => {
+        let isList = false
+        if (type.endsWith('[]')) {
+            isList = true
+            type = type.substring(0, type.length - 2)
+        } else if (regexpGeneric.test(type)) {
+            isList = true
+            type = regexpGeneric.exec(type)[1]
+        }
+        switch (type.toLowerCase()) {
+            case 'long':
+            case 'float':
+            case 'double':
+            case 'int':
+            case 'number':
+            case 'integer': type = 'number'; break
+            case 'boolean': type = 'boolean'; break
+            case 'string': type = 'string'; break
+        }
+        if (isList) type += '[]'
+        return type
+    }
+    const parseRow = (row) => {
+        const tds = row.querySelectorAll('td')
+        const tdl = tds.length;
+        const hasOptional = tdl === 4
+        if (tdl < 3) return ''
+        const name = tds[0].innerText.trim()
+        if (!name) return ''
+        const type = tds[1].innerText.trim()
+        const optional = hasOptional && tds[2].innerText.trim().toLowerCase().includes('no')
+        const comment = tds[hasOptional ? 3 : 2].innerText.trim()
+        return `  ${name.replace(/\n/g, '')}${optional ? '?' : ''}: ${convertType(type)} // ${comment.replace(/\n/g, ' ')}\n`
+    }
+    const parseRows = (rows) => {
+        if (!rows.length) return
+        let content = ''
+        rows.forEach(row => {
+            content += parseRow(row)
+        })
+        GM_setClipboard(content)
+        return content
+    }
+
+    const parseTable = (tableDiv) => {
+        const result = document.createElement('pre')
+        result.append(document.createTextNode(parseRows(tableDiv.querySelectorAll('tr:nth-child(n+1)'))))
+        tableDiv.parentElement.insertBefore(result, tableDiv)
+    }
+
+    const createButton = (container) => {
+        if (container?.dataset?.dump) return
+        container.dataset.dump = true
+        container.style.position = 'relative'
+        const btn = document.createElement('button')
+        btn.append(document.createTextNode('Dump'))
+        btn.addEventListener('click', () => {
+            parseTable(container)
+            btn.remove()
+        })
+        btn.style.position = 'absolute'
+        btn.style.top = '0'
+        btn.style.right = '2em'
+        btn.style.zIndex = 10000
+        container.prepend(btn)
+    }
+
+    const ob = new MutationObserver(mutations => {
+        mutations.forEach(({ target }) => {
+            if (target?.tagName === 'BODY') {
+                setTimeout(() => {
+                    document.querySelectorAll(".markdown-section table").forEach(createButton)
+                }, 1000)
+            }
+        })
+    })
+    ob.observe(document.body, { subtree: true, childList: true })
+
+})();