您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Vocabulary to Anki Cards.
// ==UserScript== // @name Vocabulary Builder // @namespace derjoker // @version 0.0.6 // @description Vocabulary to Anki Cards. // @author Feng Ya // @match https://www.duden.de/rechtschreibung/* // @require https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js // ==/UserScript== (function() { 'use strict'; // Your code here... /* global $ */ const KEY_ID = 'kvb'; $(`button.${KEY_ID}`).remove(); // storage function storage() { function get(key) { const item = window.localStorage.getItem(key) || '[]'; return new Set(JSON.parse(item)); } function set(key, item) { window.localStorage.setItem(key, JSON.stringify(Array.from(item))); } function add(key, value) { const item = get(key); item.add(value); set(key, item); } function remove(key, value) { const item = get(key); item.delete(value); if (item.size) set(key, item); else window.localStorage.removeItem(key); } function keys() { const keys = []; for (let i = 0; i < window.localStorage.length; i++) { const key = window.localStorage.key(i); if (key.startsWith(KEY_ID)) keys.push(key); } return keys; } function items() { return keys().map(key => ({ key, value: JSON.parse(window.localStorage.getItem(key)), })); } function clear() { keys().forEach(key => { window.localStorage.removeItem(key); }); } return { add, remove, items, clear }; } // const names = window.location.pathname.split('/') // const stem = names[names.length - 1] const stem = window.location.pathname.split('/').pop(); const word = $('section#block-system-main > h1') .text() .replace(/\u00AD/g, ''); let contents = []; const section = $('h2:contains("Bedeutungsübersicht")').parents('section'); section.find('div.entry').each((_, entry) => { const clone = $(entry).clone(); clone.find('figure').remove(); clone.find('.term-section').remove(); const definition = clone.text().trim(); $(entry) .find('.term-section') .each((_, el) => { const b = $(el).find('h3:contains("Beispiel") + span'); if (b.length) { contents.push({ definition, example: b.text().trim(), }); } const w = $(el).find( 'h3:contains("Wendungen, Redensarten, Sprichwörter") + span' ); const clone = w.parent().clone(); clone.find('h3').remove(); if (w.length) { contents.push({ definition, example: clone.text().trim(), }); } $(el) .find('ul > li') .each((_, li) => { const example = $(li) .text() .trim(); contents.push({ definition, example, }); }); }); }); section.find('ol > li > a').each((_, a) => { const definition = $(a) .text() .trim(); const href = $(a).attr('href'); // $(href).prepend('<input type="checkbox" />') $(href) .find('.term-section') .each((_, el) => { const b = $(el).find('h3:contains("Beispiel") + span'); if (b.length) { contents.push({ definition, example: b.text().trim(), }); } const w = $(el).find( 'h3:contains("Wendungen, Redensarten, Sprichwörter") + span' ); const clone = w.parent().clone(); clone.find('h3').remove(); if (w.length) { contents.push({ definition, example: clone.text().trim(), }); } $(el) .find('ul > li') .each((_, li) => { const example = $(li) .text() .trim(); contents.push({ definition, example, }); }); }); }); const key = KEY_ID + '-' + stem; window.localStorage.setItem( key, JSON.stringify(contents.map(data => Object.assign({ word }, data))) ); console.log(key); const save = $(`<button class="${KEY_ID}">Save</button>`).click(() => { const s = storage(); console.log('click'); console.log(s.items()); const items = [].concat(...s.items().map(item => item.value)); console.log(items); const csv = new CsvWriter(); const encodedUri = 'data:text/csv;charset=utf-8,' + encodeURIComponent( csv.arrayToCSV(items.map(item => Object.values(item))) ); const w = window.open(null, 'CSV'); w.location.href = encodedUri; s.clear(); }); $('body').prepend(save); // CSV Writer function CsvWriter(del, enc) { this.del = del || ','; // CSV Delimiter this.enc = enc || '"'; // CSV Enclosure // Convert Object to CSV column this.escapeCol = function(col) { if (isNaN(col)) { // is not boolean or numeric if (!col) { // is null or undefined col = ''; } else { // is string or object col = String(col); if (col.length > 0) { // use regex to test for del, enc, \r or \n // if(new RegExp( '[' + this.del + this.enc + '\r\n]' ).test(col)) { // escape inline enclosure col = col.split(this.enc).join(this.enc + this.enc); // wrap with enclosure col = this.enc + col + this.enc; } } } return col; }; // Convert an Array of columns into an escaped CSV row this.arrayToRow = function(arr) { var arr2 = arr.slice(0); var i; var ii = arr2.length; for (i = 0; i < ii; i++) { arr2[i] = this.escapeCol(arr2[i]); } return arr2.join(this.del); }; // Convert a two-dimensional Array into an escaped multi-row CSV this.arrayToCSV = function(arr) { var arr2 = arr.slice(0); var i; var ii = arr2.length; for (i = 0; i < ii; i++) { arr2[i] = this.arrayToRow(arr2[i]); } return arr2.join('\r\n'); }; } })();