您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Copy specific parts of HTML text and send them to Anki, converting relative URLs to absolute URLs. Trigger with Ctrl+Shift+Y or via Tampermonkey menu.
当前为
- // ==UserScript==
- // @name Copy HTML to Anki
- // @namespace http://tampermonkey.net/
- // @version 2.8
- // @description Copy specific parts of HTML text and send them to Anki, converting relative URLs to absolute URLs. Trigger with Ctrl+Shift+Y or via Tampermonkey menu.
- // @author nabe
- // @match *://*/*
- // @grant GM_xmlhttpRequest
- // @grant GM_registerMenuCommand
- // @connect localhost
- // @run-at document-end
- // @license MIT
- // ==/UserScript==
- (function() {
- 'use strict';
- function copyHtmlToAnki() {
- // Function to convert relative URLs to absolute URLs
- function makeAbsolute(url) {
- return new URL(url, document.baseURI).href;
- }
- // Clone the document to manipulate it
- let docClone = document.documentElement.cloneNode(true);
- // Convert all relative URLs to absolute URLs
- let elements = docClone.querySelectorAll('[src], [href]');
- elements.forEach(function(element) {
- if (element.hasAttribute('src')) {
- element.setAttribute('src', makeAbsolute(element.getAttribute('src')));
- }
- if (element.hasAttribute('href')) {
- element.setAttribute('href', makeAbsolute(element.getAttribute('href')));
- }
- });
- // Extract the text content of specific parts needed
- let frontElement = docClone.querySelector('.container.card');
- let frontField = frontElement ? frontElement.innerHTML : '';
- console.log("Front Field:", frontField);
- let questionField = docClone.querySelector('form.question h3')?.innerText.trim() || '';
- console.log("Question Field:", questionField);
- let optionField = Array.from(docClone.querySelectorAll('.options .option'))
- .map(option => option.innerText.trim())
- .filter(text => text)
- .map(text => `<li>${text}</lis>`)
- .join('') || '';
- console.log("Option Field:", optionField);
- let backField = Array.from(docClone.querySelectorAll('.options .option.correct'))
- .map(option => option.innerText.trim())
- .filter(text => text)
- .map(text => `<p>${text}</p>`)
- .join('') || '';
- console.log("Answer Field:", backField);
- let extraField = docClone.querySelector('.results.container.collected .feedback-container .text')?.innerText.trim() || '';
- console.log("Additional Info Field:", extraField);
- // Create the note fields
- let noteFields = {
- "Front": frontField,
- "Question": questionField,
- "Options": optionField,
- "Back": backField,
- "Extra": extraField
- };
- console.log("Note fields to be sent to Anki:", noteFields);
- GM_xmlhttpRequest({
- method: "POST",
- url: "http://localhost:8765",
- data: JSON.stringify({
- "action": "addNote",
- "version": 6,
- "params": {
- "note": {
- "deckName": "Default",
- "modelName": "Basic Build",
- "fields": noteFields,
- "tags": ["newimport"]
- }
- }
- }),
- headers: {
- "Content-Type": "application/json"
- },
- onload: function(response) {
- console.log("Response from AnkiConnect:", response);
- if (response.status === 200) {
- console.log("Note fields sent to Anki successfully!");
- } else {
- console.error("Failed to send note fields to Anki.");
- }
- }
- });
- }
- // Add event listener for the keyboard shortcut (Ctrl+Shift+Y)
- document.addEventListener('keydown', function(event) {
- if (event.ctrlKey && event.shiftKey && event.code === 'KeyY') {
- copyHtmlToAnki();
- }
- });
- // Register the menu command to Tampermonkey menu
- GM_registerMenuCommand("Copy HTML to Anki", copyHtmlToAnki);
- })();