|
|
@@ -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 => {
|