🏠 返回首頁 

Greasy Fork is available in English.

不背单词生词本导出

不背单词生词本导出,目前支持自动获取单词列表并导出为txt文件。


安装此脚本?
// ==UserScript==
// @name         不背单词生词本导出
// @namespace    http://tampermonkey.net/
// @version      0.2.3
// @description  不背单词生词本导出,目前支持自动获取单词列表并导出为txt文件。
// @author       shiquda
// @match        https://www.bbdc.cn/newword
// @namespace    https://github.com/shiquda/shiquda_UserScript
// @supportURL   https://github.com/shiquda/shiquda_UserScript/issues
// @icon         https://www.google.com/s2/favicons?sz=64&domain=bbdc.cn
// @grant        none
// @license      MIT
// ==/UserScript==
(function () {
'use strict';
let pages = 1;
let words = [];
let loadedPages = 0;
function createUI() {
const btn = document.createElement('button');
btn.id = 'export-btn';
btn.innerText = '导出单词为txt';
btn.addEventListener('click', downloadWords);
document.querySelector('.crumb-wrap').appendChild(btn);
const infotab = document.createElement('div');
infotab.id = 'info-tab';
infotab.innerText = ``;
infotab.style = 'margin: 10px';
document.querySelector('.crumb-wrap').appendChild(infotab);
const options = [
{ id: 'random-checkbox', text: '随机打乱', checked: false },
{ id: 'order-checkbox', text: '按顺序排列', checked: false },
{ id: 'phrase-checkbox', text: '去除词组', checked: true },
{ id: 'unique-checkbox', text: '去重', checked: true }
];
options.forEach(option => {
const checkbox = document.createElement('input');
checkbox.type = 'checkbox';
checkbox.id = option.id;
checkbox.checked = option.checked;
checkbox.style = 'margin: 10px';
const label = document.createElement('label');
label.htmlFor = option.id;
label.appendChild(document.createTextNode(option.text));
document.querySelector('.crumb-wrap').appendChild(checkbox);
document.querySelector('.crumb-wrap').appendChild(label);
});
}
function downloadWords() {
document.querySelector('#export-btn').innerText = '正在导出...';
document.querySelector('#export-btn').removeEventListener('click', downloadWords)
document.querySelector('#export-btn').addEventListener('click', manipulateWords);
document.querySelector('#export-btn').disabled = true;
loadWords().then(() => {
manipulateWords();
document.querySelector('#info-tab').innerText = `导出完成!可以重新勾选选项设置导出格式!`;
document.querySelector('#export-btn').disabled = false;
document.querySelector('#export-btn').innerText = '重新导出';
})
}
function loadWords() {
let promises = [];
for (let i = 0; i < pages; i++) {
promises.push(new Promise((resolve, reject) => {
let xhr = new XMLHttpRequest();
xhr.open('GET', `https://www.bbdc.cn/api/user-new-word?page=${i}`);
xhr.onload = function (e) {
const data = JSON.parse(e.target.responseText);
for (const item of data.data_body.wordList) {
words.push(item.word);
}
console.log(`page ${i + 1} loaded`);
loadedPages++;
document.querySelector('#info-tab').innerText = `正在加载单词列表...${loadedPages}/${pages}`;
resolve();
}
xhr.send();
}));
}
return Promise.all(promises); // 等待所有请求都完成
}
function manipulateWords() {
const cfg = {
random: document.querySelector('#random-checkbox').checked,
order: document.querySelector('#order-checkbox').checked,
phrase: document.querySelector('#phrase-checkbox').checked,
unique: document.querySelector('#unique-checkbox').checked,
}
if (cfg.random && cfg.order) {
alert('随机打乱和按顺序排列不能同时选择!');
return;
}
if (cfg.random) {
words.sort(() => Math.random() - 0.5);
}
if (cfg.order) {
words.sort((a, b) => a.toLowerCase().localeCompare(b.toLowerCase()));
}
if (cfg.phrase) {
words = words.filter(word => !word.includes(' '));
}
if (cfg.unique) {
words = [...new Set(words)];
}
const txt = words.join('\n');
const blob = new Blob([txt], { type: 'text/plain' });
const url = URL.createObjectURL(blob);
const a = document.createElement('a');
a.href = url;
a.download = `words.txt`;
a.click();
}
function init() {
return new Promise((resolve, reject) => {
let xhr = new XMLHttpRequest();
xhr.open('GET', `https://www.bbdc.cn/api/user-new-word?page=0`);
xhr.onload = function (e) {
// 读取页面数
let data = JSON.parse(e.target.responseText);
pages = data.data_body.pageInfo.totalPage;
// console.log(pages);
// console.log(data);
resolve();
}
xhr.send();
});
}
init().then(() => {
createUI();
});
})();