Compare commits

...

7 commits

Author SHA1 Message Date
lauchmelder 303879145b update links to repo 2025-03-09 20:01:03 +01:00
lauchmelder 18d679476e fix unstable behaviour for non static websites 2025-03-09 20:00:20 +01:00
Lauchmelder 8df65ea893
Update README.md 2022-04-01 15:08:44 +02:00
Lauchmelder 64634405be
Update README.md 2022-04-01 14:27:46 +02:00
Lauchmelder 1cb190d2e8
Update README.md 2022-04-01 14:24:43 +02:00
Lauchmelder c8dd677f4a
Merge pull request #6 from Lauchmelder23/v0.7
V0.7
2022-04-01 14:10:19 +02:00
Lauchmelder 60a2943d2d
v0.7 2022-04-01 14:09:24 +02:00
6 changed files with 57 additions and 37 deletions

View file

@ -8,6 +8,8 @@ This is a chrome extension that automatically removes furigana from websites bas
## Installation
[Download it from the Chrome Web Store](https://chrome.google.com/webstore/detail/furikani/lbjenjfljjnlkbdfbgmgcnkfnddaeccl)
[Download it from the Firefox Add-On Store](https://addons.mozilla.org/en-US/firefox/addon/furikani/)
---
## How to use

View file

@ -10,4 +10,11 @@
## v0.6.3
* Startup sync check is now more consistent
* Level number updates in realtime after sync
* Fixed bug where internal Kanji list would get reset on sync
* Fixed bug where internal Kanji list would get reset on sync
# v0.7
* FuriKani now supports Firefox!
* Fixed potential innerHTML risks
## v0.7.1
* Add support for non-static websites

0
build.sh Normal file → Executable file
View file

View file

@ -1,7 +1,7 @@
{
"name": "FuriKani",
"description": "Removes furigana on websites based on your WaniKani level",
"version": "0.6.3",
"version": "0.7",
"icons": {
"16": "res/icon16.png",
"48": "res/icon48.png",
@ -21,4 +21,4 @@
"scripts": ["src/background.js"]
},
"permissions": ["storage"]
}
}

View file

@ -19,6 +19,35 @@ var kanjiStyleSheet = document.createElement("style")
document.head.appendChild(vocabStyleSheet)
document.head.appendChild(kanjiStyleSheet)
function handleRubyTag(tag, vocabulary, kanji) {
// Copy the ruby element into a new ruby element so we can modify it
// without modifying the website
var ruby = document.createElement("ruby")
ruby.innerHTML = tag.innerHTML;
// Remove all tags (except for <rb>, <span>)
while(ruby.lastElementChild)
{
if(ruby.lastElementChild.tagName.toLowerCase() === "rb" ||
ruby.lastElementChild.tagName.toLowerCase() === "span")
{
ruby.innerHTML = ruby.lastElementChild.innerHTML
break
}
ruby.removeChild(ruby.lastElementChild)
}
// If the contents of the <ruby> tag are in the word list, tag the <rt> tag
// with the correct class
var rtTag = tag.getElementsByTagName("rt").item(0)
if(vocabulary.includes(ruby.innerText))
rtTag.classList.add("furikani-vocabulary")
if(kanji.includes(ruby.innerText))
rtTag.classList.add("furikani-kanji")
}
// Get stored word list from chrome storage
chrome.storage.local.get(["vocabulary", "kanji", "validUserLevel", "enabled", "enabledVocab", "enabledKanji"], (data) => {
// The users level is not valid, e.g. it exceeds the maximum allowed level
@ -39,37 +68,19 @@ chrome.storage.local.get(["vocabulary", "kanji", "validUserLevel", "enabled", "e
const vocabulary = data.vocabulary
const kanji = data.kanji
// Fetch all <ruby> tags on the website
var rubyTags = document.body.getElementsByTagName("ruby")
let observer = new MutationObserver((mutations) => {
mutations.forEach((mutation) => {
mutation.addedNodes.forEach((node, _key, _parent) => {
if (node.tagName?.toLowerCase() !== "ruby") {
return;
}
for(let tag in rubyTags)
{
// Copy the ruby element into a new ruby element so we can modify it
// without modifying the website
var ruby = document.createElement("ruby")
ruby.innerHTML = rubyTags.item(tag).innerHTML
handleRubyTag(node, vocabulary, kanji)
})
});
})
// Remove all tags (except for <rb>, <span>)
while(ruby.lastElementChild)
{
if(ruby.lastElementChild.tagName.toLowerCase() === "rb" ||
ruby.lastElementChild.tagName.toLowerCase() === "span")
{
ruby.innerHTML = ruby.lastElementChild.innerHTML
break
}
ruby.removeChild(ruby.lastElementChild)
}
// If the contents of the <ruby> tag are in the word list, tag the <rt> tag
// with the correct class
var rtTag = rubyTags.item(tag).getElementsByTagName("rt").item(0)
if(vocabulary.includes(ruby.innerText))
rtTag.classList.add("furikani-vocabulary")
if(kanji.includes(ruby.innerText))
rtTag.classList.add("furikani-kanji")
}
observer.observe(document.documentElement, { subtree: true, childList: true });
})
chrome.runtime.onMessage.addListener((msg, sender, sendResponse) => {
@ -96,4 +107,4 @@ chrome.runtime.onMessage.addListener((msg, sender, sendResponse) => {
}
return true;
})
})

View file

@ -6,7 +6,7 @@
<body>
<header>
<h1>FuriKani</h1>
<h2>v0.6.3</h2>
<h2>v0.7</h2>
</header>
<div id="token-area">
@ -53,10 +53,10 @@
<footer>
<span id="level-text">Using WaniKani Level <span id="level"></span></span>
<span id="author" >Made by <a target="_blank" href="https://github.com/Lauchmelder23">Lauchmelder</a></span>
<a id="source" target="_blank" href="https://github.com/Lauchmelder23/FuriKani">Source Code</a>
<span id="author" >Made by <a target="_blank" href="https://repos.einweckglas.com/lauchmelder">Lauchmelder</a></span>
<a id="source" target="_blank" href="https://repos.einweckglas.com/lauchmelder/FuriKani">Source Code</a>
</footer>
<script src="popup.js"></script>
</body>
</html>
</html>