Selaa lähdekoodia

Refactor: get class title from right level

吴迪 3 vuotta sitten
vanhempi
commit
f1a817d45d
1 muutettua tiedostoa jossa 31 lisäystä ja 15 poistoa
  1. 31 15
      ocean-engine-doc-maker.user.js

+ 31 - 15
ocean-engine-doc-maker.user.js

@@ -1,7 +1,7 @@
 // ==UserScript==
-// @name         OceanEngine Table Transformer
+// @name         OceanEngine Table Transformer Kotlin
 // @namespace    http://tampermonkey.net/
-// @version      1.0
+// @version      2.0
 // @description  try to take over the world!
 // @author       You
 // @match        https://open.oceanengine.com/labels/7/docs/*
@@ -54,22 +54,38 @@
         const comment = tds[1].innerText.trim()
         return `${name === safeName ? '' : `  @SerializedName("${name}")\n`}  ${safeName}, // ${comment.replace(/\n/g, ' ')}\n`
     }
-    const parseTable = (table, selector, result) => {
-        let node = table.previousElementSibling
-        let title
-        while (node) {
-            if (/^H\d$/.test(node.tagName)) {
-                title = node.innerText.replace(/\s/g, '')
-                break
+    const parseTable = (table, selector, parentSelector, result) => {
+        const getOuterTitle = () => {
+            let node = table.previousElementSibling
+            let title = 'Root'
+            while (node) {
+                if (/^H\d$/.test(node.tagName)) {
+                    title = node.innerText.replace(/\s/g, '')
+                    break
+                }
+                node = node.previousElementSibling
             }
-            node = node.previousElementSibling
+            return title
         }
+        const boundaries = parentSelector ? Array.from(table.querySelectorAll(parentSelector)).map(node => [parseName(node.querySelector('div.tdData').childNodes)?.replace(/(?:_|^)([a-z])/g, g => g.substring(g.length - 1).toUpperCase()), node]) : [[getOuterTitle(), null]] // [title as string, boundary as Node]
+        console.log(boundaries)
         const isEnum = table.querySelector('th')?.innerText?.trim() === '值'
-        let content = isEnum ? `enum class ${title} {\n` : `data class ${title} (\n`
+        const closingTag = isEnum ? '}' : ')'
+        let content = ''
         table.querySelectorAll(selector).forEach(row => {
+            const prevNode = row.previousSibling
+            const boundary = boundaries.find(b => prevNode === b[1])
+            if (boundary) {
+                if (content) {
+                    // not first entity, close current item
+                    content += closingTag + '\n'
+                }
+                const title = boundary[0]
+                content += isEnum ? `enum class ${title} {\n` : `data class ${title} (\n`
+            }
             content += (isEnum ? parseEnumRow : parseRow)(row.querySelectorAll('td'))
         })
-        content += isEnum ? '}' : ')'
+        if (content) content += closingTag
         result.innerText = content
         result.style.display = ''
         GM_setClipboard(result.innerText)
@@ -128,13 +144,13 @@
         result.style.display = 'none'
         table.parentNode.insertBefore(container, table)
         table.parentNode.insertBefore(result, table)
-        const addBtn = (level) => {
+        const addBtn = (level, parentLevel) => {
             const btn = document.createElement('button')
             btn.append(document.createTextNode(level))
-            btn.addEventListener('click', () => parseTable(table, `tbody > tr.${level}`, result))
+            btn.addEventListener('click', () => parseTable(table, `tbody > tr.${level}`, parentLevel ? `tbody > tr.${parentLevel}` : undefined, result))
             container.append(btn)
         }
-        for (const level of levels.values()) addBtn(level)
+        Array.from(levels.values()).forEach((lv, i, a) => addBtn(lv, a[i - 1]))
     }
 
     const ob = new MutationObserver(mutations => {