您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Adds a button to generate ruby code for furigana from <kanji>[furigana] or <kanji>{furigana} for spoilered furigana.
// ==UserScript== // @name Wanikani Forums: Easy Furigana // @namespace http://tampermonkey.net/ // @version 1.0.5 // @description Adds a button to generate ruby code for furigana from <kanji>[furigana] or <kanji>{furigana} for spoilered furigana. // @author Kumirei // @include https://community.wanikani.com/* // @grant none // ==/UserScript== /*jshint esversion: 8 */ (function() { waitForClass('d-editor-input', (elems)=>{ var elem = elems[0]; var btn = document.createElement('button'); btn.className = "rubyfy btn no-text btn-icon ember-view"; btn.title = "Click to generate ruby code from <kanji>[furigana] or <kanji>{furigana} for spoilered furigana"; btn.innerText = "R"; btn.onclick = ()=>{ var text = elem.value; text = replaceMatches(text, text.match(/<[^>]*>\[[^\]]*\]/g), (match)=>{var [kanji, furigana] = match.slice(1,-1).split('>['); return '<ruby>'+kanji+'<rp>(</rp><rt>'+furigana+'</rt><rp>)</rp></ruby>';}); text = replaceMatches(text, text.match(/<[^>]*>\{[^\}]*\}/g), (match)=>{var [kanji, furigana] = match.slice(1,-1).split('>{'); return '<ruby>'+kanji+'<rp>(</rp><rt><span class="spoiler">'+furigana+'</span></rt><rp>)</rp></ruby>';}); elem.value = text; elem.focus(); elem.blur(); elem.focus(); }; var refElem = document.getElementsByClassName('italic')[0]; refElem.parentElement.insertBefore(btn, refElem.nextElementSibling); }); function replaceMatches(text, matches, replaceFunction) { if (matches === null) return text; for (var i=0; i<matches.length; i++) { var str = matches[i]; var rb = replaceFunction(str); str = str.replace('[', '\\['); str = str.replace(']', '\\]'); var rgx = RegExp(str); text = text.replace(rgx, rb); } return text; } function waitForClass (className, callback) { var alreadyExists = 0; setInterval(()=>{ var elems = document.getElementsByClassName(className); var found = elems.length; if (!alreadyExists && found) callback(elems); alreadyExists = found; }, 333); } })();