您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Keyboard shortcuts for HTML tags
// ==UserScript== // @name AO3 Formatting Shortcuts // @namespace http://tampermonkey.net/ // @version 1.4.2 // @license MIT // @description Keyboard shortcuts for HTML tags // @author Grumblesaur // @match https://archiveofourown.org/works/* // @match https://archiveofourown.org/comments/* // @match https://archiveofourown.org/chapters/* // @icon https://www.google.com/s2/favicons?sz=64&domain=archiveofourown.org // @grant none // ==/UserScript== /* * Introduces shortcuts to type HTML elements into Archive of our Own * (AO3) text boxes. The shortcuts are: * - Ctrl b: <b></b> – bold text * - Ctrl d: <details></details> – a hideable element * - Ctrl e: <em></em> – semantic emphatic italics * - Ctrl i: <i></i> – italics * - Ctrl k: <cite></cite> – semantic title italics * - Ctrl l: <li></li> – list item * - Ctrl m: <mark></mark> – highlighting * - Ctrl o: <ol></ol> – ordered list * - Ctrl p: <p></p> – paragraph * - Ctrl q: <q></q> – inline quote * - Ctrl s: <s></s> – strikethrough * - Ctrl u: <u></u> – underline * * - Ctrl Shift b: <blockquote></blockquote> – block quote * - Ctrl Shift c: <code></code> – monospace/code * - Ctrl Shift i: <img src="" alt="(image description here)" /> – image * - Ctrl Shift m: <summary></summary> – heading for a <details> element * - Ctrl Shift n: <br/> – forced line break * - Ctrl Shift s: <strong></strong> – semantic emphatic bold * - Ctrl Shift u: <ul></ul> – unordered list */ function getTagMap() { return { 'shifted': { 'b' : ['<blockquote>', '</blockquote>'], 'c' : ['<code>', '</code>'], 'i' : ['<img src="', '" alt="(image description here)" />'], 'm' : ['<summary>', '</summary>'], 'n' : ['', '<br/>'], 's' : ['<strong>', '</strong>'], 'u' : ['<ul>', '</ul>'] }, 'normal': { 'b' : ['<b>', '</b>'], 'd' : ['<details>', '</details>'], 'e' : ['<em>', '</em>'], 'i' : ['<i>', '</i>'], 'k' : ['<cite>', '</cite>'], 'l' : ['<li>', '</li>'], 'm' : ['<mark>', '</mark>'], 'o' : ['<ol>', '</ol>'], 'p' : ['<p>', '</p>'], 'q' : ['<quote>', '</quote>'], 's' : ['<s>', '</s>'], 'u' : ['<u>', '</u>'] } } } function localError(msg) { console.log("(AO3 Formatting Shortcuts): " + msg); } (function() { 'use strict'; // Insert a pair of HTML tags into the active text area, and rewind the // cursor to sit between them. function typeInTextarea(opening, closing, el = document.activeElement) { const [start, end] = [el.selectionStart, el.selectionEnd]; let selected = el.value.substring(start, end); el.setRangeText(opening + selected + closing, start, end, 'end'); el.selectionStart -= closing.length; el.selectionEnd -= closing.length; } const tagMap = getTagMap(); function formatting(event) { /* Separated shift key from capitalization to enable the use * of shortcuts when users have capslock on. */ let shiftState = event.shiftKey ? 'shifted' : 'normal'; let keyPress = event.key.toLowerCase(); if (event.ctrlKey && Object.keys(tagMap[shiftState]).includes(keyPress)) { event.preventDefault(); const tags = tagMap[shiftState][keyPress]; if (tags.includes(null) || tags.includes(undefined)) { /* This shouldn't happen. */ localError("Problem with command key: " + keyPress); return; } typeInTextarea(tags[0], tags[1]); } } document.addEventListener('keydown', formatting, false); })();