Wanikani Open Framework: Visually similar kanji filter

Adds a wkof filter for visually similar kanji

Versão de: 25/11/2019. Veja: a última versão.

Você precisará instalar uma extensão como Tampermonkey, Greasemonkey ou Violentmonkey para instalar este script.

Você precisará instalar uma extensão como Tampermonkey ou Violentmonkey para instalar este script.

Você precisará instalar uma extensão como Tampermonkey ou Violentmonkey para instalar este script.

Você precisará instalar uma extensão como Tampermonkey ou Userscripts para instalar este script.

Você precisará instalar uma extensão como o Tampermonkey para instalar este script.

Você precisará instalar um gerenciador de scripts de usuário para instalar este script.

(Eu já tenho um gerenciador de scripts de usuário, me deixe instalá-lo!)

Você precisará instalar uma extensão como o Stylus para instalar este estilo.

Você precisará instalar uma extensão como o Stylus para instalar este estilo.

Você precisará instalar uma extensão como o Stylus para instalar este estilo.

Você precisará instalar um gerenciador de estilos de usuário para instalar este estilo.

Você precisará instalar um gerenciador de estilos de usuário para instalar este estilo.

Você precisará instalar um gerenciador de estilos de usuário para instalar este estilo.

(Eu já possuo um gerenciador de estilos de usuário, me deixar fazer a instalação!)

// ==UserScript==
// @name         Wanikani Open Framework: Visually similar kanji filter
// @namespace    http://tampermonkey.net/
// @version      1.1.1
// @description  Adds a wkof filter for visually similar kanji
// @author       Kumirei
// @include      https://www.wanikani.com/*
// @include      *preview.wanikani.com*
// @grant        GM.getResourceText
// @resource     stroke_dist_db    https://raw.githubusercontent.com/mwil/wanikani-userscripts/master/wanikani-similar-kanji/db/stroke_edit_dist_esc.json
// ==/UserScript==

(function() {
		var wkof = unsafeWindow.wkof;
		if (!wkof) return;

		var kanji_list = {};

		// Install menu
		wkof.include('Menu,Settings');
		wkof.ready('Menu,Settings')
				.then(load_settings)
				.then(install_menu)
				.then(get_data)
				.then(register_filter);

		function get_data() {
				var resolve, promise = new Promise((res, rej)=>{resolve = res;});
				var JSON = unsafeWindow.JSON;
				GM.getResourceText("stroke_dist_db").then((data)=>{
						data = JSON.parse(data);
						resolve(data);
				});
				return promise;
		}

		// Adds the filter to wkof
		function register_filter(data) {
				for (var key in wkof.settings.wanikani_visually_similar_filter.kanji_list) kanji_list[key] = key;
				wkof.ready('ItemData.registry').then(()=>{
						wkof.ItemData.registry.sources.wk_items.filters.include_visually_similar_kanji = {
								filter_func: function(filter_value, item){if (item.object != "kanji") return true; item.visually_similar_kanji = data[item.data.characters]; return true;}
						};
						wkof.ItemData.registry.sources.wk_items.filters.visually_similar_kanji = {
								type: 'multi',
								label: 'Visually similar kanji',
								hover_tip: 'Select the kanji whose similar kanji you want to study',
								content: kanji_list,
								filter_func: function(filter_value, item){
										var similar_kanji = "";
										for (var char in filter_value) {
												if (filter_value[char]) {
														for (var i=0; i<10; i++) {
																if (data[char] && data[char][i]) similar_kanji += data[char][i].kan;
														}
												}
										}
										if (item.object == 'kanji' && similar_kanji.includes(item.data.characters)) return true;
										return false;
								}
						};
						wkof.set_state('wkof.Kumirei.VSKFilter', 'ready');
				});
		}

		// Load stored settings or set defaults
		function load_settings() {
				var resolve, promise = new Promise((res, rej)=>{resolve = res;});
				wkof.Settings.load('wanikani_visually_similar_filter').then(()=>{resolve();});
				return promise;
		}

		// Installs the options button in the menu
		function install_menu() {
				var config = {
						name: 'wanikani_visually_similar_filter',
						submenu: 'Settings',
						title: 'Visually Similar Filter',
						on_click: open_settings
				};
				wkof.Menu.insert_script_link(config);
		}

		// Creates the options
		function open_settings(items) {
				for (var key in wkof.settings.wanikani_visually_similar_filter.kanji_list) kanji_list[key] = key;
				var config = {
						script_id: 'wanikani_visually_similar_filter',
						title: 'Visually Similar Filter',
						on_save: function(){window.location.reload(false);},
						content: {
								kanji_input: {
										type: 'input',
										label: 'Kanji input',
										hover_tip: 'Type in a kanji and click the add button to add the kanji to the list'
								},
								add_button: {
										type: 'button',
										label: 'Add kanji to list',
										text: 'Add',
										hover_tip: 'Click this button to add the input above to the list of kanji below',
										on_click: function(name, config, on_change){
												var val = wkof.settings.wanikani_visually_similar_filter.kanji_input;
												var matches = val.match(/[\u3005-\u9F8D]/g);
												for (var key in matches) {
														if (!(matches[key] in kanji_list)) {
																kanji_list[matches[key]] = false;
																wkof.settings.wanikani_visually_similar_filter.kanji_list[matches[key]] = false;
																$('#wanikani_visually_similar_filter_kanji_list').append('<option name="'+matches[key]+'">'+matches[key]+'</option>');														}
												}
												wkof.settings.wanikani_visually_similar_filter.kanji_input = "";
												config.dialog.refresh();
												config.dialog.save();
										}
								},
								divider: {
										type: 'divider'
								},
								kanji_list: {
										type: 'list',
										label: 'Kanji list',
										multi: true,
										hover_tip: 'List of kanji whose visually similar kanji you can choose to study with the self study script',
										content: kanji_list
								},
								remove_button: {
										type: 'button',
										label: 'Remove selected kanji',
										text: 'Remove',
										hover_tip: 'Click this button to remove the above selected kanji from the list',
										on_click: function(name, config, on_change){
												var selected = wkof.settings.wanikani_visually_similar_filter.kanji_list;
												for (var char in selected) {
														if (selected[char]) {
																$('#wanikani_visually_similar_filter_kanji_list option[name="'+char+'"]').remove();
																delete selected[char];
																delete kanji_list[char];
														}
												}
												config.dialog.save();
										}
								}
						}
				}

				var dialog = new wkof.Settings(config);
				config.content.add_button.dialog = dialog;
				config.content.remove_button.dialog = dialog;
				dialog.open();
		}

})();