// ==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);
})();