Kanji Counter

Displays statistics of known kanji on JPDB's wall of kanji page

您需要先安装一个扩展,例如 篡改猴Greasemonkey暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴Userscripts ,之后才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。

您需要先安装用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name         Kanji Counter
// @namespace    http://tampermonkey.net/
// @version      1.0.0
// @description  Displays statistics of known kanji on JPDB's wall of kanji page
// @author       Sacus
// @match        https://jpdb.io/labs/wall-of-kanji
// @grant        none
// @license      MIT
// ==/UserScript==

/*jshint esversion: 11 */

(function () {
	'use strict';

	// Dictionary mapping kanji to their grade level
	const jouyou = {"一": "1","右": "1","雨": "1","円": "1","王": "1","音": "1","下": "1","火": "1","花": "1","貝": "1","学": "1","気": "1","九": "1","休": "1","玉": "1","金": "1","空": "1","月": "1","犬": "1","見": "1","五": "1","口": "1","校": "1","左": "1","三": "1","山": "1","子": "1","四": "1","糸": "1","字": "1","耳": "1","七": "1","車": "1","手": "1","十": "1","出": "1","女": "1","小": "1","上": "1","森": "1","人": "1","水": "1","正": "1","生": "1","青": "1","夕": "1","石": "1","赤": "1","千": "1","川": "1","先": "1","早": "1","草": "1","足": "1","村": "1","大": "1","男": "1","竹": "1","中": "1","虫": "1","町": "1","天": "1","田": "1","土": "1","二": "1","日": "1","入": "1","年": "1","白": "1","八": "1","百": "1","文": "1","木": "1","本": "1","名": "1","目": "1","立": "1","力": "1","林": "1","六": "1","引": "2","羽": "2","雲": "2","園": "2","遠": "2","何": "2","科": "2","夏": "2","家": "2","歌": "2","画": "2","回": "2","会": "2","海": "2","絵": "2","外": "2","角": "2","楽": "2","活": "2","間": "2","丸": "2","岩": "2","顔": "2","汽": "2","記": "2","帰": "2","弓": "2","牛": "2","魚": "2","京": "2","強": "2","教": "2","近": "2","兄": "2","形": "2","計": "2","元": "2","言": "2","原": "2","戸": "2","古": "2","午": "2","後": "2","語": "2","工": "2","公": "2","広": "2","交": "2","光": "2","考": "2","行": "2","高": "2","黄": "2","合": "2","谷": "2","国": "2","黒": "2","今": "2","才": "2","細": "2","作": "2","算": "2","止": "2","市": "2","矢": "2","姉": "2","思": "2","紙": "2","寺": "2","自": "2","時": "2","室": "2","社": "2","弱": "2","首": "2","秋": "2","週": "2","春": "2","書": "2","少": "2","場": "2","色": "2","食": "2","心": "2","新": "2","親": "2","図": "2","数": "2","西": "2","声": "2","星": "2","晴": "2","切": "2","雪": "2","船": "2","線": "2","前": "2","組": "2","走": "2","多": "2","太": "2","体": "2","台": "2","地": "2","池": "2","知": "2","茶": "2","昼": "2","長": "2","鳥": "2","朝": "2","直": "2","通": "2","弟": "2","店": "2","点": "2","電": "2","刀": "2","冬": "2","当": "2","東": "2","答": "2","頭": "2","同": "2","道": "2","読": "2","内": "2","南": "2","肉": "2","馬": "2","売": "2","買": "2","麦": "2","半": "2","番": "2","父": "2","風": "2","分": "2","聞": "2","米": "2","歩": "2","母": "2","方": "2","北": "2","毎": "2","妹": "2","万": "2","明": "2","鳴": "2","毛": "2","門": "2","夜": "2","野": "2","友": "2","用": "2","曜": "2","来": "2","里": "2","理": "2","話": "2","悪": "3","安": "3","暗": "3","医": "3","委": "3","意": "3","育": "3","員": "3","院": "3","飲": "3","運": "3","泳": "3","駅": "3","央": "3","横": "3","屋": "3","温": "3","化": "3","荷": "3","界": "3","開": "3","階": "3","寒": "3","感": "3","漢": "3","館": "3","岸": "3","起": "3","期": "3","客": "3","究": "3","急": "3","級": "3","宮": "3","球": "3","去": "3","橋": "3","業": "3","曲": "3","局": "3","銀": "3","区": "3","苦": "3","具": "3","君": "3","係": "3","軽": "3","血": "3","決": "3","研": "3","県": "3","庫": "3","湖": "3","向": "3","幸": "3","港": "3","号": "3","根": "3","祭": "3","皿": "3","仕": "3","死": "3","使": "3","始": "3","指": "3","歯": "3","詩": "3","次": "3","事": "3","持": "3","式": "3","実": "3","写": "3","者": "3","主": "3","守": "3","取": "3","酒": "3","受": "3","州": "3","拾": "3","終": "3","習": "3","集": "3","住": "3","重": "3","宿": "3","所": "3","暑": "3","助": "3","昭": "3","消": "3","商": "3","章": "3","勝": "3","乗": "3","植": "3","申": "3","身": "3","神": "3","真": "3","深": "3","進": "3","世": "3","整": "3","昔": "3","全": "3","相": "3","送": "3","想": "3","息": "3","速": "3","族": "3","他": "3","打": "3","対": "3","待": "3","代": "3","第": "3","題": "3","炭": "3","短": "3","談": "3","着": "3","注": "3","柱": "3","丁": "3","帳": "3","調": "3","追": "3","定": "3","庭": "3","笛": "3","鉄": "3","転": "3","都": "3","度": "3","投": "3","豆": "3","島": "3","湯": "3","登": "3","等": "3","動": "3","童": "3","農": "3","波": "3","配": "3","倍": "3","箱": "3","畑": "3","発": "3","反": "3","坂": "3","板": "3","皮": "3","悲": "3","美": "3","鼻": "3","筆": "3","氷": "3","表": "3","秒": "3","病": "3","品": "3","負": "3","部": "3","服": "3","福": "3","物": "3","平": "3","返": "3","勉": "3","放": "3","味": "3","命": "3","面": "3","問": "3","役": "3","薬": "3","由": "3","油": "3","有": "3","遊": "3","予": "3","羊": "3","洋": "3","葉": "3","陽": "3","様": "3","落": "3","流": "3","旅": "3","両": "3","緑": "3","礼": "3","列": "3","練": "3","路": "3","和": "3","愛": "4","案": "4","以": "4","衣": "4","位": "4","茨 [5]": "4","印": "4","英": "4","栄": "4","媛": "4","塩": "4","岡": "4","億": "4","加": "4","果": "4","貨": "4","課": "4","芽": "4","賀": "4","改": "4","械": "4","害": "4","街": "4","各": "4","覚": "4","潟": "4","完": "4","官": "4","管": "4","関": "4","観": "4","願": "4","岐": "4","希": "4","季": "4","旗": "4","器": "4","機": "4","議": "4","求": "4","泣": "4","給": "4","挙": "4","漁": "4","共": "4","協": "4","鏡": "4","競": "4","極": "4","熊": "4","訓": "4","軍": "4","郡": "4","群": "4","径": "4","景": "4","芸": "4","欠": "4","結": "4","建": "4","健": "4","験": "4","固": "4","功": "4","好": "4","香": "4","候": "4","康": "4","佐": "4","差": "4","菜": "4","最": "4","埼": "4","材": "4","崎": "4","昨": "4","札": "4","刷": "4","察": "4","参": "4","産": "4","散": "4","残": "4","氏": "4","司": "4","試": "4","児": "4","治": "4","滋": "4","辞": "4","鹿": "4","失": "4","借": "4","種": "4","周": "4","祝": "4","順": "4","初": "4","松": "4","笑": "4","唱": "4","焼": "4","照": "4","城": "4","縄": "4","臣": "4","信": "4","井": "4","成": "4","省": "4","清": "4","静": "4","席": "4","積": "4","折": "4","節": "4","説": "4","浅": "4","戦": "4","選": "4","然": "4","争": "4","倉": "4","巣": "4","束": "4","側": "4","続": "4","卒": "4","孫": "4","帯": "4","隊": "4","達": "4","単": "4","置": "4","仲": "4","沖": "4","兆": "4","低": "4","底": "4","的": "4","典": "4","伝": "4","徒": "4","努": "4","灯": "4","働": "4","特": "4","徳": "4","栃 [5]": "4","奈": "4","梨": "4","熱": "4","念": "4","敗": "4","梅": "4","博": "4","阪": "4","飯": "4","飛": "4","必": "4","票": "4","標": "4","不": "4","夫": "4","付": "4","府": "4","阜": "4","富": "4","副": "4","兵": "4","別": "4","辺": "4","変": "4","便": "4","包": "4","法": "4","望": "4","牧": "4","末": "4","満": "4","未": "4","民": "4","無": "4","約": "4","勇": "4","要": "4","養": "4","浴": "4","利": "4","陸": "4","良": "4","料": "4","量": "4","輪": "4","類": "4","令": "4","冷": "4","例": "4","連": "4","老": "4","労": "4","録": "4","圧": "5","囲": "5","移": "5","因": "5","永": "5","営": "5","衛": "5","易": "5","益": "5","液": "5","演": "5","応": "5","往": "5","桜": "5","可": "5","仮": "5","価": "5","河": "5","過": "5","快": "5","解": "5","格": "5","確": "5","額": "5","刊": "5","幹": "5","慣": "5","眼": "5","紀": "5","基": "5","寄": "5","規": "5","喜": "5","技": "5","義": "5","逆": "5","久": "5","旧": "5","救": "5","居": "5","許": "5","境": "5","均": "5","禁": "5","句": "5","型": "5","経": "5","潔": "5","件": "5","険": "5","検": "5","限": "5","現": "5","減": "5","故": "5","個": "5","護": "5","効": "5","厚": "5","耕": "5","航": "5","鉱": "5","構": "5","興": "5","講": "5","告": "5","混": "5","査": "5","再": "5","災": "5","妻": "5","採": "5","際": "5","在": "5","財": "5","罪": "5","殺": "5","雑": "5","酸": "5","賛": "5","士": "5","支": "5","史": "5","志": "5","枝": "5","師": "5","資": "5","飼": "5","示": "5","似": "5","識": "5","質": "5","舎": "5","謝": "5","授": "5","修": "5","述": "5","術": "5","準": "5","序": "5","招": "5","証": "5","象": "5","賞": "5","条": "5","状": "5","常": "5","情": "5","織": "5","職": "5","制": "5","性": "5","政": "5","勢": "5","精": "5","製": "5","税": "5","責": "5","績": "5","接": "5","設": "5","絶": "5","祖": "5","素": "5","総": "5","造": "5","像": "5","増": "5","則": "5","測": "5","属": "5","率": "5","損": "5","貸": "5","態": "5","団": "5","断": "5","築": "5","貯": "5","張": "5","停": "5","提": "5","程": "5","適": "5","統": "5","堂": "5","銅": "5","導": "5","得": "5","毒": "5","独": "5","任": "5","燃": "5","能": "5","破": "5","犯": "5","判": "5","版": "5","比": "5","肥": "5","非": "5","費": "5","備": "5","評": "5","貧": "5","布": "5","婦": "5","武": "5","復": "5","複": "5","仏": "5","粉": "5","編": "5","弁": "5","保": "5","墓": "5","報": "5","豊": "5","防": "5","貿": "5","暴": "5","脈": "5","務": "5","夢": "5","迷": "5","綿": "5","輸": "5","余": "5","容": "5","略": "5","留": "5","領": "5","歴": "5","胃": "6","異": "6","遺": "6","域": "6","宇": "6","映": "6","延": "6","沿": "6","恩": "6","我": "6","灰": "6","拡": "6","革": "6","閣": "6","割": "6","株": "6","干": "6","巻": "6","看": "6","簡": "6","危": "6","机": "6","揮": "6","貴": "6","疑": "6","吸": "6","供": "6","胸": "6","郷": "6","勤": "6","筋": "6","系": "6","敬": "6","警": "6","劇": "6","激": "6","穴": "6","券": "6","絹": "6","権": "6","憲": "6","源": "6","厳": "6","己": "6","呼": "6","誤": "6","后": "6","孝": "6","皇": "6","紅": "6","降": "6","鋼": "6","刻": "6","穀": "6","骨": "6","困": "6","砂": "6","座": "6","済": "6","裁": "6","策": "6","冊": "6","蚕": "6","至": "6","私": "6","姿": "6","視": "6","詞": "6","誌": "6","磁": "6","射": "6","捨": "6","尺": "6","若": "6","樹": "6","収": "6","宗": "6","就": "6","衆": "6","従": "6","縦": "6","縮": "6","熟": "6","純": "6","処": "6","署": "6","諸": "6","除": "6","承": "6","将": "6","傷": "6","障": "6","蒸": "6","針": "6","仁": "6","垂": "6","推": "6","寸": "6","盛": "6","聖": "6","誠": "6","舌": "6","宣": "6","専": "6","泉": "6","洗": "6","染": "6","銭": "6","善": "6","奏": "6","窓": "6","創": "6","装": "6","層": "6","操": "6","蔵": "6","臓": "6","存": "6","尊": "6","退": "6","宅": "6","担": "6","探": "6","誕": "6","段": "6","暖": "6","値": "6","宙": "6","忠": "6","著": "6","庁": "6","頂": "6","腸": "6","潮": "6","賃": "6","痛": "6","敵": "6","展": "6","討": "6","党": "6","糖": "6","届": "6","難": "6","乳": "6","認": "6","納": "6","脳": "6","派": "6","拝": "6","背": "6","肺": "6","俳": "6","班": "6","晩": "6","否": "6","批": "6","秘": "6","俵": "6","腹": "6","奮": "6","並": "6","陛": "6","閉": "6","片": "6","補": "6","暮": "6","宝": "6","訪": "6","亡": "6","忘": "6","棒": "6","枚": "6","幕": "6","密": "6","盟": "6","模": "6","訳": "6","郵": "6","優": "6","預": "6","幼": "6","欲": "6","翌": "6","乱": "6","卵": "6","覧": "6","裏": "6","律": "6","臨": "6","朗": "6","論": "6","亜": "S","哀": "S","挨": "S","曖": "S","握": "S","扱": "S","宛": "S","嵐": "S","依": "S","威": "S","為": "S","畏": "S","尉": "S","萎": "S","偉": "S","椅": "S","彙": "S","違": "S","維": "S","慰": "S","緯": "S","壱": "S","逸": "S","芋": "S","咽": "S","姻": "S","淫 [7]": "S","陰": "S","隠": "S","韻": "S","唄": "S","鬱": "S","畝": "S","浦": "S","詠": "S","影": "S","鋭": "S","疫": "S","悦": "S","越": "S","謁": "S","閲": "S","炎": "S","怨": "S","宴": "S","援": "S","煙": "S","猿": "S","鉛": "S","縁": "S","艶": "S","汚": "S","凹": "S","押": "S","旺": "S","欧": "S","殴": "S","翁": "S","奥": "S","憶": "S","臆": "S","虞": "S","乙": "S","俺": "S","卸": "S","穏": "S","佳": "S","苛": "S","架": "S","華": "S","菓": "S","渦": "S","嫁": "S","暇": "S","禍": "S","靴": "S","寡": "S","箇": "S","稼": "S","蚊": "S","牙 [5]": "S","瓦": "S","雅": "S","餓": "S","介": "S","戒": "S","怪": "S","拐": "S","悔": "S","皆": "S","塊": "S","楷": "S","潰": "S","壊": "S","懐": "S","諧": "S","劾": "S","崖": "S","涯": "S","慨": "S","蓋": "S","該": "S","概": "S","骸": "S","垣": "S","柿": "S","核": "S","殻": "S","郭": "S","較": "S","隔": "S","獲": "S","嚇": "S","穫": "S","岳": "S","顎": "S","掛": "S","括": "S","喝": "S","渇": "S","葛 [7]": "S","滑": "S","褐": "S","轄": "S","且": "S","釜": "S","鎌": "S","刈": "S","甘": "S","汗": "S","缶": "S","肝": "S","冠": "S","陥": "S","乾": "S","勘": "S","患": "S","貫": "S","喚": "S","堪": "S","換": "S","敢": "S","棺": "S","款": "S","閑": "S","勧": "S","寛": "S","歓": "S","監": "S","緩": "S","憾": "S","還": "S","環": "S","韓 [5]": "S","艦": "S","鑑": "S","含": "S","玩": "S","頑": "S","企": "S","伎": "S","忌": "S","奇": "S","祈": "S","軌": "S","既": "S","飢": "S","鬼": "S","亀": "S","幾": "S","棋": "S","棄": "S","毀": "S","畿": "S","輝": "S","騎": "S","宜": "S","偽": "S","欺": "S","儀": "S","戯": "S","擬": "S","犠": "S","菊": "S","吉": "S","喫": "S","詰": "S","却": "S","脚": "S","虐": "S","及": "S","丘": "S","朽": "S","臼": "S","糾": "S","嗅": "S","窮": "S","巨": "S","拒": "S","拠": "S","虚": "S","距": "S","御": "S","凶": "S","叫": "S","狂": "S","享": "S","況": "S","峡": "S","挟": "S","狭": "S","恐": "S","恭": "S","脅": "S","矯": "S","響": "S","驚": "S","仰": "S","暁": "S","凝": "S","巾": "S","斤": "S","菌": "S","琴": "S","僅 [7]": "S","緊": "S","錦": "S","謹": "S","襟": "S","吟": "S","駆": "S","惧": "S","愚": "S","偶": "S","遇": "S","隅": "S","串": "S","屈": "S","掘": "S","窟": "S","繰": "S","勲": "S","薫": "S","刑": "S","茎": "S","契": "S","恵": "S","啓": "S","掲": "S","渓": "S","蛍": "S","傾": "S","携": "S","継": "S","詣": "S","慶": "S","憬": "S","稽": "S","憩": "S","鶏": "S","迎": "S","鯨": "S","隙": "S","撃": "S","桁": "S","傑": "S","肩": "S","倹": "S","兼": "S","剣": "S","拳": "S","軒": "S","圏": "S","堅": "S","嫌": "S","献": "S","遣": "S","賢": "S","謙": "S","鍵": "S","繭": "S","顕": "S","懸": "S","幻": "S","玄": "S","弦": "S","舷": "S","股": "S","虎": "S","孤": "S","弧": "S","枯": "S","雇": "S","誇": "S","鼓": "S","錮": "S","顧": "S","互": "S","呉": "S","娯": "S","悟": "S","碁": "S","勾": "S","孔": "S","巧": "S","甲": "S","江": "S","坑": "S","抗": "S","攻": "S","更": "S","拘": "S","肯": "S","侯": "S","恒": "S","洪": "S","荒": "S","郊": "S","貢": "S","控": "S","梗": "S","喉": "S","慌": "S","硬": "S","絞": "S","項": "S","溝": "S","綱": "S","酵": "S","稿": "S","衡": "S","購": "S","乞": "S","拷": "S","剛": "S","傲": "S","豪": "S","克": "S","酷": "S","獄": "S","駒": "S","込": "S","頃": "S","昆": "S","恨": "S","婚": "S","痕": "S","紺": "S","魂": "S","墾": "S","懇": "S","沙": "S","唆": "S","詐": "S","鎖": "S","挫": "S","采": "S","砕": "S","宰": "S","栽": "S","彩": "S","斎": "S","債": "S","催": "S","塞": "S","歳": "S","載": "S","剤": "S","削": "S","柵": "S","索": "S","酢": "S","搾": "S","錯": "S","咲": "S","刹": "S","拶": "S","撮": "S","擦": "S","桟": "S","惨": "S","傘": "S","斬": "S","暫": "S","旨": "S","伺": "S","刺": "S","祉": "S","肢": "S","施": "S","恣": "S","脂": "S","紫": "S","嗣": "S","雌": "S","摯": "S","賜": "S","諮": "S","侍": "S","慈": "S","餌 [8]": "S","璽": "S","軸": "S","𠮟 [5]": "S","疾": "S","執": "S","湿": "S","嫉": "S","漆": "S","芝": "S","赦": "S","斜": "S","煮": "S","遮": "S","邪": "S","蛇": "S","酌": "S","釈": "S","爵": "S","寂": "S","朱": "S","狩": "S","殊": "S","珠": "S","腫": "S","趣": "S","寿": "S","呪": "S","需": "S","儒": "S","囚": "S","舟": "S","秀": "S","臭": "S","袖": "S","羞": "S","愁": "S","酬": "S","醜": "S","蹴": "S","襲": "S","汁": "S","充": "S","柔": "S","渋": "S","銃": "S","獣": "S","叔": "S","淑": "S","粛": "S","塾": "S","俊": "S","瞬": "S","旬": "S","巡": "S","盾": "S","准": "S","殉": "S","循": "S","潤": "S","遵": "S","庶": "S","緒": "S","如": "S","叙": "S","徐": "S","升": "S","召": "S","匠": "S","床": "S","抄": "S","肖": "S","尚": "S","昇": "S","沼": "S","宵": "S","症": "S","祥": "S","称": "S","渉": "S","紹": "S","訟": "S","掌": "S","晶": "S","焦": "S","硝": "S","粧": "S","詔": "S","奨": "S","詳": "S","彰": "S","憧": "S","衝": "S","償": "S","礁": "S","鐘": "S","丈": "S","冗": "S","浄": "S","剰": "S","畳": "S","壌": "S","嬢": "S","錠": "S","譲": "S","醸": "S","拭": "S","殖": "S","飾": "S","触": "S","嘱": "S","辱": "S","尻": "S","伸": "S","芯": "S","辛": "S","侵": "S","津": "S","唇": "S","娠": "S","振": "S","浸": "S","紳": "S","診": "S","寝": "S","慎": "S","審": "S","震": "S","薪": "S","刃": "S","尽": "S","迅": "S","甚": "S","陣": "S","尋": "S","腎": "S","須": "S","吹": "S","炊": "S","帥": "S","粋": "S","衰": "S","酔": "S","遂": "S","睡": "S","穂": "S","随": "S","髄": "S","枢": "S","崇": "S","据": "S","杉": "S","裾": "S","瀬": "S","是": "S","姓": "S","征": "S","斉": "S","牲": "S","凄": "S","逝": "S","婿": "S","誓": "S","請": "S","醒": "S","斥": "S","析": "S","脊": "S","隻": "S","惜": "S","戚": "S","跡": "S","籍": "S","拙": "S","窃": "S","摂": "S","仙": "S","占": "S","扇": "S","栓": "S","旋": "S","煎 [7]": "S","羨": "S","腺": "S","詮 [7]": "S","践": "S","箋": "S","潜": "S","遷": "S","薦": "S","繊": "S","鮮": "S","禅": "S","漸": "S","膳": "S","繕": "S","狙": "S","阻": "S","租": "S","措": "S","粗": "S","疎": "S","訴": "S","塑": "S","遡 [8]": "S","礎": "S","双": "S","壮": "S","荘": "S","捜": "S","挿": "S","桑": "S","掃": "S","曹": "S","曽": "S","爽": "S","喪": "S","痩": "S","葬": "S","僧": "S","遭": "S","槽": "S","踪": "S","燥": "S","霜": "S","騒": "S","藻": "S","憎": "S","贈": "S","即": "S","促": "S","捉": "S","俗": "S","賊": "S","遜 [8]": "S","汰": "S","妥": "S","唾": "S","堕": "S","惰": "S","駄": "S","耐": "S","怠": "S","胎": "S","泰": "S","堆": "S","袋": "S","逮": "S","替": "S","滞": "S","戴": "S","滝": "S","択": "S","沢": "S","卓": "S","拓": "S","託": "S","濯": "S","諾": "S","濁": "S","但": "S","脱": "S","奪": "S","棚": "S","誰": "S","丹": "S","旦": "S","胆": "S","淡": "S","嘆": "S","端": "S","綻": "S","鍛": "S","弾": "S","壇": "S","恥": "S","致": "S","遅": "S","痴": "S","稚": "S","緻": "S","畜": "S","逐": "S","蓄": "S","秩": "S","窒": "S","嫡": "S","抽": "S","衷": "S","酎": "S","鋳": "S","駐": "S","弔": "S","挑": "S","彫": "S","眺": "S","釣": "S","貼": "S","超": "S","跳": "S","徴": "S","嘲 [7]": "S","澄": "S","聴": "S","懲": "S","勅": "S","捗 [7]": "S","沈": "S","珍": "S","朕": "S","陳": "S","鎮": "S","椎": "S","墜": "S","塚": "S","漬": "S","坪": "S","爪": "S","鶴": "S","呈": "S","廷": "S","抵": "S","邸": "S","亭": "S","貞": "S","帝": "S","訂": "S","逓": "S","偵": "S","堤": "S","艇": "S","締": "S","諦": "S","泥": "S","摘": "S","滴": "S","溺 [7]": "S","迭": "S","哲": "S","徹": "S","撤": "S","添": "S","塡 [7]": "S","殿": "S","斗": "S","吐": "S","妬": "S","途": "S","渡": "S","塗": "S","賭 [7]": "S","奴": "S","怒": "S","到": "S","逃": "S","倒": "S","凍": "S","唐": "S","桃": "S","透": "S","悼": "S","盗": "S","陶": "S","塔": "S","搭": "S","棟": "S","痘": "S","筒": "S","稲": "S","踏": "S","謄": "S","藤": "S","闘": "S","騰": "S","洞": "S","胴": "S","瞳": "S","峠": "S","匿": "S","督": "S","篤": "S","凸": "S","突": "S","屯": "S","豚": "S","頓": "S","貪": "S","鈍": "S","曇": "S","丼": "S","那": "S","謎 [8]": "S","鍋": "S","軟": "S","尼": "S","弐": "S","匂": "S","虹": "S","尿": "S","妊": "S","忍": "S","寧": "S","捻": "S","粘": "S","悩": "S","濃": "S","把": "S","覇": "S","婆": "S","罵": "S","杯": "S","排": "S","廃": "S","輩": "S","培": "S","陪": "S","媒": "S","賠": "S","伯": "S","拍": "S","泊": "S","迫": "S","剝 [7]": "S","舶": "S","薄": "S","漠": "S","縛": "S","爆": "S","箸 [7]": "S","肌": "S","鉢": "S","髪": "S","伐": "S","抜": "S","罰": "S","閥": "S","氾": "S","帆": "S","汎": "S","伴": "S","畔": "S","般": "S","販": "S","斑": "S","搬": "S","煩": "S","頒": "S","範": "S","繁": "S","藩": "S","蛮": "S","盤": "S","妃": "S","彼": "S","披": "S","卑": "S","疲": "S","被": "S","扉": "S","碑": "S","罷": "S","避": "S","尾": "S","眉": "S","微": "S","膝": "S","肘": "S","匹": "S","泌": "S","姫": "S","漂": "S","苗": "S","描": "S","猫": "S","浜": "S","賓": "S","頻": "S","敏": "S","瓶": "S","扶": "S","怖": "S","附": "S","訃": "S","赴": "S","浮": "S","符": "S","普": "S","腐": "S","敷": "S","膚": "S","賦": "S","譜": "S","侮": "S","舞": "S","封": "S","伏": "S","幅": "S","覆": "S","払": "S","沸": "S","紛": "S","雰": "S","噴": "S","墳": "S","憤": "S","丙": "S","併": "S","柄": "S","塀": "S","幣": "S","弊": "S","蔽 [7]": "S","餅 [8]": "S","壁": "S","璧": "S","癖": "S","蔑": "S","偏": "S","遍": "S","哺": "S","捕": "S","舗": "S","募": "S","慕": "S","簿": "S","芳": "S","邦": "S","奉": "S","抱": "S","泡": "S","胞": "S","俸": "S","倣": "S","峰": "S","砲": "S","崩": "S","蜂": "S","飽": "S","褒": "S","縫": "S","乏": "S","忙": "S","坊": "S","妨": "S","房": "S","肪": "S","某": "S","冒": "S","剖": "S","紡": "S","傍": "S","帽": "S","貌": "S","膨": "S","謀": "S","頰 [7]": "S","朴": "S","睦": "S","僕": "S","墨": "S","撲": "S","没": "S","勃": "S","堀": "S","奔": "S","翻": "S","凡": "S","盆": "S","麻": "S","摩": "S","磨": "S","魔": "S","昧": "S","埋": "S","膜": "S","枕": "S","又": "S","抹": "S","慢": "S","漫": "S","魅": "S","岬": "S","蜜": "S","妙": "S","眠": "S","矛": "S","霧": "S","娘": "S","冥": "S","銘": "S","滅": "S","免": "S","麺": "S","茂": "S","妄": "S","盲": "S","耗": "S","猛": "S","網": "S","黙": "S","紋": "S","冶": "S","弥": "S","厄": "S","躍": "S","闇": "S","喩": "S","愉": "S","諭": "S","癒": "S","唯": "S","幽": "S","悠": "S","湧": "S","猶": "S","裕": "S","雄": "S","誘": "S","憂": "S","融": "S","与": "S","誉": "S","妖": "S","庸": "S","揚": "S","揺": "S","溶": "S","腰": "S","瘍": "S","踊": "S","窯": "S","擁": "S","謡": "S","抑": "S","沃": "S","翼": "S","拉": "S","裸": "S","羅": "S","雷": "S","頼": "S","絡": "S","酪": "S","辣": "S","濫": "S","藍": "S","欄": "S","吏": "S","痢": "S","履": "S","璃": "S","離": "S","慄": "S","柳": "S","竜": "S","粒": "S","隆": "S","硫": "S","侶": "S","虜": "S","慮": "S","了": "S","涼": "S","猟": "S","陵": "S","僚": "S","寮": "S","療": "S","瞭": "S","糧": "S","厘": "S","倫": "S","隣": "S","瑠": "S","涙": "S","累": "S","塁": "S","励": "S","戻": "S","鈴": "S","零": "S","霊": "S","隷": "S","齢": "S","麗": "S","暦": "S","劣": "S","烈": "S","裂": "S","恋": "S","廉": "S","錬": "S","呂": "S","炉": "S","賂": "S","露": "S","弄": "S","郎": "S","浪": "S","廊": "S","楼": "S","漏": "S","籠": "S","麓": "S","賄": "S","脇": "S","惑": "S","枠": "S","湾": "S","腕": "S"};

 // Constants and configuration
 const GRADE_LEVELS = ["1", "2", "3", "4", "5", "6", "S"]; // S = Secondary school
 const NOT_JOUYOU = "Not jouyou";
 const TOTAL_KEY = "Total";
 const VIEW_MODES = {
     SEPARATE: 'separate',
     CUMULATIVE: 'cumulative'
 };
 let currentViewMode = VIEW_MODES.SEPARATE;

	// DOM elements
	const knownKanjiElements = document.querySelectorAll('.wall-of-kanji > div:not([style="background-color: #dd4444"])');

	// Find the header element to place our stats below
	let headerElement;
	for (const element of document.querySelectorAll('h5')) {
		if (element.textContent.includes('Wall of kanji')) {
			headerElement = element;
			break;
		}
	}

	// Initialize counters
	const learnedCount = Object.fromEntries([...GRADE_LEVELS, NOT_JOUYOU].map(level => [level, 0]));
	const totalCount = Object.fromEntries(GRADE_LEVELS.map(level => [level, 0]));
	const completionRatio = Object.fromEntries([...GRADE_LEVELS, TOTAL_KEY].map(level => [level, 0]));

	// Extract learned kanji from the page
	const learnedKanji = Array.from(knownKanjiElements, element => element.firstChild.textContent.trim());

	// Count total kanji by grade level
	Object.entries(jouyou).forEach(([kanji, level]) => {
		totalCount[level]++;
	});

	// Count learned kanji by grade level
	learnedKanji.forEach(kanji => {
		const level = jouyou[kanji];
		learnedCount[level || NOT_JOUYOU]++;
	});

	// Calculate completion ratio for each grade level
	Object.keys(learnedCount).forEach(key => {
		completionRatio[key] = totalCount[key] ? Math.round((learnedCount[key] / totalCount[key]) * 100) / 100 : 0;
	});

	// Calculate total jouyou kanji and overall completion ratio
	const totalJouyouKanji = Object.values(totalCount).reduce((sum, val) => sum + val, 0);
	completionRatio.Total = Math.round((learnedKanji.length - learnedCount[NOT_JOUYOU]) / totalJouyouKanji * 100) / 100;

	// Calculate cumulative counts and ratios
	const cumulativeLearnedCount = { ...learnedCount };
	const cumulativeCompletionRatio = { ...completionRatio };

	// Calculate cumulative values for each grade level
	for (let i = 1; i < GRADE_LEVELS.length; i++) {
		const currentGrade = GRADE_LEVELS[i];
		const previousGrade = GRADE_LEVELS[i - 1];
		cumulativeLearnedCount[currentGrade] += cumulativeLearnedCount[previousGrade];

		// Calculate the cumulative total count for this grade level
		let cumulativeTotalCount = 0;
		for (let j = 0; j <= i; j++) {
			cumulativeTotalCount += totalCount[GRADE_LEVELS[j]];
		}

		// Calculate the cumulative completion ratio
		cumulativeCompletionRatio[currentGrade] = cumulativeTotalCount ? 
			Math.round((cumulativeLearnedCount[currentGrade] / cumulativeTotalCount) * 100) / 100 : 0;
	}

	// Create stats display
	const statsDisplayStyles = {
		margin: '10px',
		fontSize: '1.2em',
		fontWeight: 'bold',
		padding: '0',
		borderRadius: '5px',
	};

	const statsDisplay = document.createElement('div');
	Object.assign(statsDisplay.style, statsDisplayStyles);

	// Format percentage with one decimal place
	const formatPercentage = (ratio) => (ratio * 100).toFixed(1);

	// Function to create table HTML
	const createTableHTML = (viewMode) => {
		const data = viewMode === VIEW_MODES.CUMULATIVE ? 
			{ counts: cumulativeLearnedCount, ratios: cumulativeCompletionRatio } : 
			{ counts: learnedCount, ratios: completionRatio };

		const gradeNames = {
			"1": "First grade",
			"2": "Second grade",
			"3": "Third grade",
			"4": "Fourth grade",
			"5": "Fifth grade",
			"6": "Sixth grade",
			"S": "Secondary school"
		};

		let tableHTML = `
			<table style="width: 100%; border-collapse: collapse; margin-bottom: 10px;">
				<thead>
					<tr>
						<th style="text-align: left; padding: 8px; border-bottom: 1px solid #ddd;">Grade</th>
						<th style="text-align: right; padding: 8px; border-bottom: 1px solid #ddd;">Count</th>
						<th style="text-align: right; padding: 8px; border-bottom: 1px solid #ddd;">Percentage</th>
					</tr>
				</thead>
				<tbody>
		`;

		// Add rows for each grade level
		GRADE_LEVELS.forEach(grade => {
			tableHTML += `
				<tr>
					<td style="text-align: left; padding: 8px; border-bottom: 1px solid #ddd;">${gradeNames[grade]}</td>
					<td style="text-align: right; padding: 8px; border-bottom: 1px solid #ddd;">${data.counts[grade]}</td>
					<td style="text-align: right; padding: 8px; border-bottom: 1px solid #ddd;">${formatPercentage(data.ratios[grade])}%</td>
				</tr>
			`;
		});

		// Add total row
		tableHTML += `
				<tr style="font-weight: bold;">
					<td style="text-align: left; padding: 8px; border-bottom: 1px solid #ddd;">Total Jouyou</td>
					<td style="text-align: right; padding: 8px; border-bottom: 1px solid #ddd;">${learnedKanji.length - learnedCount[NOT_JOUYOU]}</td>
					<td style="text-align: right; padding: 8px; border-bottom: 1px solid #ddd;">${formatPercentage(completionRatio.Total)}%</td>
				</tr>
				<tr>
					<td style="text-align: left; padding: 8px; border-bottom: 1px solid #ddd;">Non-Jouyou</td>
					<td style="text-align: right; padding: 8px; border-bottom: 1px solid #ddd;">${learnedCount[NOT_JOUYOU]}</td>
					<td style="text-align: right; padding: 8px; border-bottom: 1px solid #ddd;">-</td>
				</tr>
			</tbody>
		</table>
		`;

		return tableHTML;
	};

	// Create tab-like view mode toggle
	const createViewToggle = () => {
		const tabContainer = document.createElement('div');
		tabContainer.style.marginBottom = '0';
		tabContainer.style.display = 'flex';

		// Style for the tab container
		tabContainer.style.borderBottom = '1px solid #ccc';
		tabContainer.style.width = '100%';

		const createTab = (text, mode) => {
			const tab = document.createElement('div');
			tab.textContent = text;
			tab.style.padding = '8px 15px';
			tab.style.cursor = 'pointer';
			tab.style.borderTopLeftRadius = '5px';
			tab.style.borderTopRightRadius = '5px';
			tab.style.marginRight = '2px';

			// Set initial tab styles based on active state
			if (currentViewMode === mode) {
				tab.style.borderTop = '1px solid #ccc';
				tab.style.borderLeft = '1px solid #ccc';
				tab.style.borderRight = '1px solid #ccc';
				tab.style.borderBottom = '1px solid #fff';
				tab.style.marginBottom = '-1px';
				tab.style.fontWeight = 'bold';
			} else {
				tab.style.border = '1px solid #ccc';
				tab.style.borderBottom = '1px solid #ccc';
			}

			tab.addEventListener('click', () => {
				if (currentViewMode !== mode) {
					currentViewMode = mode;
					updateDisplay();
				}
			});

			return tab;
		};

		const separateTab = createTab('Separate', VIEW_MODES.SEPARATE);
		const cumulativeTab = createTab('Cumulative', VIEW_MODES.CUMULATIVE);

		tabContainer.appendChild(separateTab);
		tabContainer.appendChild(cumulativeTab);

		return tabContainer;
	};

	// Function to update the display based on the current view mode
	const updateDisplay = () => {
		// Update the table content
		const tableContainer = statsDisplay.querySelector('.table-container');
		tableContainer.innerHTML = createTableHTML(currentViewMode);

		// Update tab styles
		const tabs = statsDisplay.querySelectorAll('div > div');
		tabs.forEach(tab => {
			const isActive = (tab.textContent.toLowerCase() === currentViewMode);

			if (isActive) {
				tab.style.borderTop = '1px solid #ccc';
				tab.style.borderLeft = '1px solid #ccc';
				tab.style.borderRight = '1px solid #ccc';
				tab.style.borderBottom = '1px solid #fff';
				tab.style.marginBottom = '-1px';
				tab.style.fontWeight = 'bold';
			} else {
				tab.style.border = '1px solid #ccc';
				tab.style.borderBottom = '1px solid #ccc';
				tab.style.marginBottom = '0';
				tab.style.fontWeight = 'normal';
			}
		});
	};

	// Build the HTML content
	statsDisplay.innerHTML = `
		<p style="margin: 0 0 10px 0; font-size: 1.1em; padding: 0 5px;">Learned Kanji Statistics:</p>
	`;

	// Add the view toggle buttons
	statsDisplay.appendChild(createViewToggle());

	// Add the table container
	const tableContainer = document.createElement('div');
	tableContainer.className = 'table-container';
	tableContainer.style.border = '1px solid #ccc';
	tableContainer.style.borderTop = 'none';
	tableContainer.style.padding = '15px';
	tableContainer.style.borderBottomLeftRadius = '5px';
	tableContainer.style.borderBottomRightRadius = '5px';
	statsDisplay.appendChild(tableContainer);

	// Initialize the display
	updateDisplay();

	// Insert the stats display after the header
	headerElement.insertAdjacentElement('afterend', statsDisplay);

})();