huawei-doc-table.user.js 2.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. // ==UserScript==
  2. // @name HuaWei Table Transformer
  3. // @namespace http://tampermonkey.net/
  4. // @version 1.0
  5. // @description try to take over the world!
  6. // @author You
  7. // @match https://developer.huawei.com/consumer/cn/doc/distribution/promotion/*
  8. // @grant none
  9. // ==/UserScript==
  10. (function() {
  11. 'use strict';
  12. const convertType = (type) => {
  13. const isList = type.endsWith('[]')
  14. if (isList) type = type.substring(0, type.length - 2)
  15. switch (type.toLowerCase()) {
  16. case 'long':
  17. case 'float':
  18. case 'double':
  19. case 'int':
  20. case 'integer': type = 'number'; break
  21. case 'boolean': type = 'boolean'; break
  22. case 'string': type = 'string'; break
  23. }
  24. if (isList) type += '[]'
  25. return type
  26. }
  27. const parseRow = (row) => {
  28. const tds = row.querySelectorAll('td')
  29. if (tds.length < 3 || tds > 4) return ''
  30. const withOptional = tds.length === 4
  31. const name = tds[0].innerText.trim()
  32. if (!name) return ''
  33. const type = tds[1].innerText.trim()
  34. const optional = withOptional ? tds[2].innerText === '是' : false
  35. const comment = tds[withOptional ? 3 : 2].innerText.trim()
  36. return ` ${name.replace(/\n/g, '')}${optional ? '?' : ''}: ${convertType(type)} // ${comment.replace(/\n/g, ' ')}\n`
  37. }
  38. const parseRows = (header, rows) => {
  39. if (!rows.length) return
  40. let content = `interface ${header} {\n`
  41. rows.forEach(row => {
  42. content += parseRow(row)
  43. })
  44. content += '}'
  45. return content
  46. }
  47. const parseTable = (tableDiv) => {
  48. // Has a header?
  49. const header = tableDiv.previousElementSibling?.innerText?.trim()
  50. if (header) {
  51. const result = document.createElement('pre')
  52. result.append(document.createTextNode(parseRows(header, tableDiv.querySelectorAll('tr:nth-child(n+2)'))))
  53. tableDiv.prepend(result)
  54. }
  55. }
  56. const createButton = (container) => {
  57. container.style.position = 'relative'
  58. const btn = document.createElement('button')
  59. btn.append(document.createTextNode('Dump'))
  60. btn.addEventListener('click', () => {
  61. parseTable(container)
  62. btn.remove()
  63. })
  64. btn.style.position = 'absolute'
  65. btn.style.top = '0'
  66. btn.style.right = '-2em'
  67. btn.style.zIndex = 10000
  68. container.prepend(btn)
  69. }
  70. const ob = new MutationObserver(mutations => {
  71. mutations.forEach(({ target }) => {
  72. if (target?.tagName === 'DIV' && target?.classList?.contains('markdown-body')) {
  73. target.querySelectorAll('div.tablenoborder').forEach(createButton)
  74. }
  75. })
  76. })
  77. ob.observe(document.body, { subtree: true, childList: true })
  78. })();