Greasy Fork

导出国际化词条(新方舟)

导出国际化词条 Excel

目前为 2023-10-07 提交的版本。查看 最新版本

// ==UserScript==
// @name       导出国际化词条(新方舟)
// @namespace    http://your-namespace.com
// @version      1.1.3
// @author       mlf
// @description  导出国际化词条 Excel
// @require      https://cdnjs.cloudflare.com/ajax/libs/xlsx/0.17.0/xlsx.full.min.js
// @require      https://greasyfork.org/scripts/430412-chinese-conversion-api/code/Chinese%20Conversion%20API.js?version=957744
// @grant        none
// @include      *
// @license MIT
// ==/UserScript==

;(function () {
  function doExport() {
    const { sc2tc } = window.ChineseConversionAPI

    // 示例 JSON 数据
    let vals = []
    console.error('window.i18', window.i18)
    if (window.i18) {
      vals = window.i18
      window.localStorage.setItem('i18Set', JSON.stringify(vals))
      delete window.i18
    } else {
      let data = window.localStorage.getItem('i18Set')
      if (!data) {
        alert('还没有输入词条')
        return
      }
      vals = JSON.parse(data)
    }
    if (!Array.isArray(vals)) {
      alert('值接受数组')
      return
    }
    console.warn('获得的词条', vals)
    const [groupkey, obj] = vals

    const jsonData = Object.entries(obj).map(([keys, val]) => {
      return {
        '*编码': groupkey + '_' + keys,
        '*类型': 'front',
        '*分组': groupkey,
        '*内容(zh_CN)': val,
        '*内容(hk_CN)': sc2tc(val), // 将内容(hk_CN)转为繁体中文
        '*内容(en_US)': keys.replace(/_([a-z])/g, function (match, letter) {
          return letter.toUpperCase()
        }), // 使用 val 的值作为 *内容(en_US)
      }
    })

    function exportToExcel(data, fileName) {
      const mappedData = data.map((obj) => {
        return {
          '*编码': obj['*编码'],
          '*类型': obj['*类型'],
          '*分组': obj['*分组'],
          '*内容(zh_CN)': obj['*内容(zh_CN)'],
          '*内容(hk_CN)': obj['*内容(hk_CN)'],
          '*内容(en_US)': obj['*内容(en_US)'],
        }
      })

      const worksheet = XLSX.utils.json_to_sheet(mappedData)
      const workbook = XLSX.utils.book_new()

      XLSX.utils.book_append_sheet(workbook, worksheet, '多语言')

      const excelBuffer = XLSX.write(workbook, { type: 'array' })
      const blob = new Blob([excelBuffer], {
        type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
      })

      const link = document.createElement('a')
      link.href = URL.createObjectURL(blob)
      link.download = fileName
      link.style.display = 'none'
      document.body.appendChild(link)
      link.click()
      document.body.removeChild(link)
    }

    exportToExcel(jsonData, `${groupkey}.xlsx`)
  }

  function addButton() {
    const button = document.createElement('button')
    button.textContent = '导出词条'
    button.style.position = 'fixed'
    button.style.top = '5px'
    button.style.right = '50%'
    button.style.zIndex = '9999' // 设置按钮的层级,确保在最前面显示
    button.style.appearance = 'none'
    button.style.backgroundColor = '#007fff'
    button.style.color = '#fff'
    button.style.borderRadius = '2px'
    button.style.border = 'none'
    button.style.cursor = 'pointer'
    button.style.transition = 'background-color .3s,color .3s'
    button.style.padding = '0.5rem 1.3rem'

    button.draggable = true
    button.addEventListener('click', function () {
      doExport()
    })

    document.body.appendChild(button)

    const closeButton = document.createElement('button')
    closeButton.textContent = 'X'
    closeButton.style.position = 'fixed'
    closeButton.style.top = '5px'
    closeButton.style.right = '50%'
    closeButton.style.zIndex = '9999'
    closeButton.style.appearance = 'none'
    closeButton.style.backgroundColor = 'transparent'
    closeButton.style.color = '#001'
    closeButton.style.border = 'none'
    closeButton.style.borderRadius = '50%'
    closeButton.style.cursor = 'pointer'
    closeButton.style.padding = '0.5rem'
    closeButton.style.marginLeft = '5px'

    closeButton.addEventListener('click', function () {
      document.body.removeChild(button)
      document.body.removeChild(closeButton)
    })

    document.body.appendChild(closeButton)
  }

  function saveButtonPosition() {
    const button = document.querySelector('button[data-export-to-excel]')
    if (button) {
      const { top, right } = button.getBoundingClientRect()
      localStorage.setItem(
        'exportButtonPosition',
        JSON.stringify({ top, right })
      )
    }
  }

  function restoreButtonPosition() {
    const savedPosition = localStorage.getItem('exportButtonPosition')
    if (savedPosition) {
      const { top, right } = JSON.parse(savedPosition)
      const button = document.querySelector('button[data-export-to-excel]')
      button.style.top = `${top}px`
      button.style.right = `${right}px`
    }
  }

  addButton()
  restoreButtonPosition()

  // 保存按钮位置到 localStorage
  window.addEventListener('beforeunload', saveButtonPosition)
})()