您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Adds Anki Connect functionality to the Zhongwen browser extension
// ==UserScript== // @name Zhongwen Anki Addon // @description Adds Anki Connect functionality to the Zhongwen browser extension // @version 0.6 // @include * // @grant GM_xmlhttpRequest // @connect 127.0.0.1 // @namespace https://greasyfork.org/users/683917 // ==/UserScript== (async function() { /* ====================SETUP==================== */ // The name of the deck where to look for and add cards const DECK = ">汉语<"; // The type of card to add in case no card was found const CARD_TYPE = "Chinese (Advanced)"; // The name of the field where the word (i.e. the highlighted text, just like with ALT+X/Skritter) // should be inserted. All other fields are left blank. // (I use an Anki addon called "Chinese Support Redux" to fill out the rest of the fields) const WORD_FIELD = "Hanzi"; /* ===================OPTIONS=================== */ // Which key to use to add the current word to Anki. const KEY = 'q'; // Whether or not to open the Anki card browser when pressing the key. const OPEN_BROWSER = true; /* ============================================= */ function anki(action, params={}, version=6) { return new Promise((resolve, reject) => { GM_xmlhttpRequest({ method: "POST", url: "http://127.0.0.1:8765", data: JSON.stringify({action, version, params}), headers: { "Content-Type": "application/x-www-form-urlencoded" }, onload: (response) => { response = JSON.parse(response.responseText); // console.log(response); try { if (Object.getOwnPropertyNames(response).length != 2) { throw 'response has an unexpected number of fields'; } if (!response.hasOwnProperty('error')) { throw 'response is missing required error field'; } if (!response.hasOwnProperty('result')) { throw 'response is missing required result field'; } if (response.error) { throw response.error; } resolve(response.result); } catch (e) { reject(e); } }, onerror: () => { reject('failed to issue request'); } }); }); } window.addEventListener('keydown',async (ev) => { console.log(ev); const zhongwen_window = document.getElementById('zhongwen-window'); if(zhongwen_window != null && zhongwen_window.style.display != 'none') { if(ev.key == KEY) { ev.preventDefault(); const word = window.getSelection().toString(); if(word != "") { const query = 'deck:"'+DECK+'" '+WORD_FIELD+':"'+word+'"'; const notes = await anki('findNotes',{"query":query}); console.log(notes); if(notes.length == 0) { const field_names = await anki('modelFieldNames',{'modelName': CARD_TYPE}); if(field_names.indexOf(WORD_FIELD) > -1) { const fields = {}; for(const fn in field_names) { fields[fn] = ""; } fields[WORD_FIELD] = word; console.log(await anki('addNote',{'note':{ 'deckName':DECK, 'modelName':CARD_TYPE, 'fields':fields, 'options':{},'tags':[]}})); } else { console.log("Zhongwen Anki Addon ERROR: The provided CARD_TYPE does not contain the field WORD_FIELD!"); } } if(OPEN_BROWSER) { anki('guiBrowse',{'query':query}); } } } } }); })();