Skip to content

Instantly share code, notes, and snippets.

@tippfehlr
Last active February 25, 2026 15:29
Show Gist options
  • Select an option

  • Save tippfehlr/d1d1ff434020c609cf4fb13d07719be9 to your computer and use it in GitHub Desktop.

Select an option

Save tippfehlr/d1d1ff434020c609cf4fb13d07719be9 to your computer and use it in GitHub Desktop.
Hide Furigana for known Kanji
#!/usr/bin/python
# SPDX-FileCopyrightText: 2026 tippfehlr <tippfehlr@tippfehlr.dev>
# SPDX-License-Identifier: MIT
#
# Export KanjiGrid as json, and use this script to generate a _known_kanji.js from it.
# Place _known_kanji.js in Anki’s collection.media folder and include it with
# <script src="_known_kanji.js"/>
# in the card template html.
import json
import argparse
parser = argparse.ArgumentParser("parse_anki_grid.py")
parser.add_argument("kanjigrid", help="The kanjigrid file.", type=str)
parser.add_argument('--min-interval', help="The minimum average inteval of cards.", type=int, default=180)
parser.add_argument('--min-seen', help="The minimum number of seen cards.", type=int, default=1)
parser.add_argument('--no-unseen', help="Don’t consider kanji with unseen cards known.", type=bool, default=False)
parser.add_argument('-o', '--output', help="Where to save the javascript file.", type=str, default="_known_kanji.js")
parser.add_argument('-a', '--add', help="Additional Kanji to hide furigana for.", type=list, default="")
args = parser.parse_args()
with open(args.kanjigrid, "r", encoding="utf-8") as f:
data = json.load(f)
units = data["units"]
known_kanji = []
for kanji, values in units.items():
avg_interval = values[2]
seen = values[3]
unseen = values[4]
is_known = (
avg_interval >= args.min_interval and
seen >= args.min_seen and
(not args.no_unseen or unseen == 0)
)
if is_known:
known_kanji.append(kanji)
for kanji in args.add:
if kanji != ',':
known_kanji.append(kanji)
known_kanji = sorted(known_kanji)
js_content = """function hideKanji() {
// Known kanji from Kanji Grid
const knownKanji = new Set([%s]);
// Hide furigana for known kanji
const rubyElements = document.querySelectorAll("ruby");
rubyElements.forEach(ruby => {
const firstNode = ruby.childNodes[0];
if (!firstNode) return;
const kanjiChar = firstNode.textContent.trim();
const rtTag = ruby.querySelector("rt");
if (kanjiChar && rtTag && knownKanji.has(kanjiChar)) {
rtTag.style.display = "none";
}
});
}
hideKanji();
""" % ",".join(f'"{k}"' for k in known_kanji)
with open(args.output, "w", encoding="utf-8") as f:
f.write(js_content)
print(f"Exported {len(known_kanji)} kanji to {args.output}")
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment