Wanikani Part-of-Speech Filter

Part-of-Speech filter for Wanikani Open Framework

  1. // ==UserScript==
  2. // @name Wanikani Part-of-Speech Filter
  3. // @namespace rfindley
  4. // @description Part-of-Speech filter for Wanikani Open Framework
  5. // @version 1.0.1
  6. // @include https://www.wanikani.com/*
  7. // @copyright 2018+, Robin Findley
  8. // @license MIT; http://opensource.org/licenses/MIT
  9. // @run-at document-end
  10. // @grant none
  11. // ==/UserScript==
  12.  
  13. window.pos_filter = {};
  14.  
  15. (function(gobj) {
  16.  
  17. /* global $, wkof */
  18.  
  19. // Only load if Open Framework is installed.
  20. if (!window.wkof) return
  21.  
  22. wkof.ready('ItemData')
  23. .then(GetPartsOfSpeech)
  24. .then(AddFilter);
  25.  
  26. var parts_of_speech = {};
  27.  
  28. // Extract the list of parts of speech from all vocabulary.
  29. function GetPartsOfSpeech()
  30. {
  31. return wkof.ItemData.get_items().then(function(items) {
  32. var pos_list = {};
  33. for (var item_idx in items) {
  34. var item = items[item_idx];
  35. if (item.object !== 'vocabulary') continue;
  36. var item_pos = item.data.parts_of_speech;
  37. for (var pos_idx in item_pos) {
  38. pos_list[item_pos[pos_idx]] = 1;
  39. }
  40. }
  41. pos_list = Object.keys(pos_list).sort();
  42. for (pos_idx in pos_list) {
  43. var pos = pos_list[pos_idx];
  44. parts_of_speech[pos] = pos;
  45. }
  46. return parts_of_speech;
  47. });
  48. }
  49.  
  50. // Add the filter to the Open Framework registry.
  51. function AddFilter() {
  52. wkof.ItemData.registry.sources.wk_items.filters.part_of_speech = {
  53. type: 'multi',
  54. label: 'Part of speech',
  55. content: parts_of_speech,
  56. default: [],
  57. filter_func: function(filter_value, item){
  58. window.filter_value = filter_value;
  59. if (item.object !== 'vocabulary') return false;
  60. var item_pos = item.data.parts_of_speech;
  61. for (var pos_idx in item_pos) {
  62. var pos = item_pos[pos_idx];
  63. if (filter_value[pos]) return true;
  64. }
  65. return false;
  66. },
  67. hover_tip: 'Filter by part of speech (noun, i-adjective, ...)',
  68. };
  69.  
  70. wkof.set_state('pos_filter', 'ready');
  71. }
  72.  
  73. })(window.pos_filter);