// ==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 }) })();