-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy pathbunpro2cvs.js
109 lines (94 loc) · 4.55 KB
/
bunpro2cvs.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
// ==UserScript==
// @name BunPRO to CVS downloader
// @namespace http://tampermonkey.net/
// @version 0.2
// @description Download current grammar point and example as CSV for easy anki importation
// @author You
// @match https://bunpro.jp/grammar_points/*
// @grant none
// ==/UserScript==
//var CSV_SEP = ";"
var CSV_SEP = "|";
function download_grammar_point() {
'use strict';
var JLPT_level = document.querySelector(".header__lesson-progress").innerText.slice(0,2);
var lesson_id = (function(){
var txt = document.querySelector(".header__lesson-progress").innerText.trim();
var lesson_num = txt.slice(10, txt.search(":")).trim();
var lesson_section = txt.slice(txt.search(": ")+2, txt.search("/")).trim();
if (lesson_num.length == 1) { lesson_num = "0" + lesson_num; }
if (lesson_section.length == 1) { lesson_section = "0" + lesson_section; }
// str->int: integers must not start by 0; convert N5 to 1, N4 to 2....
var first_digit = parseFloat(JLPT_level[1]) * -1 + 5 + 1;
return "" + first_digit + lesson_num + lesson_section;
})();
var pattern = document.querySelector(".grammar-point__title").innerText.trim();
var sources_html = (function() {
var formed_html = "";
var sources = Array.from(document.querySelectorAll(".supplemental-links > div > div")).
filter(function (el) { return el.id.startsWith("supplemental_link");});
while (sources.length > 0) {
var resource_link = sources.pop().innerHTML;
var description = sources.pop().innerText;
formed_html = "<div class=\"sources_description\">" + description + "</div>" + resource_link + formed_html;
}
formed_html = "<div class=\"sources\">" + formed_html + "</div>";
return formed_html;
})();
var csv = (function(){
var grammar_left = document.querySelector(".grammar-point__meaning").innerHTML.replace(/\n/g, "").trim();
var grammar_right = document.querySelector(".meaning__structure").innerHTML.replace(/\n/g, "").trim();
var grammar = "<div class=\"grammar_meaning\">" + grammar_left + "</div><div class=\"grammar_pattern\">" + grammar_right + "</div>";
csv = lesson_id + "00" + CSV_SEP +
JLPT_level + CSV_SEP +
"rule" + CSV_SEP +
pattern + CSV_SEP +
pattern + CSV_SEP +
grammar + CSV_SEP +
sources_html + CSV_SEP +
"bunpro, rule, " + JLPT_level + ", " + pattern.replace(/[~{}()\s\s+\[\]!!【】()、。;:;]/g, "_") + "\n";
var elems = document.querySelectorAll(".example-sentence")
for (var i=0;i<elems.length;i+=2) {
var exampleNode = elems[i];
var lid = "" + (i/2+1);
if (lid.length == 1) { lid = "0" + lid; }
var japanese = elems[i].innerHTML;
var english = elems[i+1].innerHTML;
console.log("Lesson ID", lesson_id);
console.log(lid);
csv = csv +
lesson_id + lid + CSV_SEP +
JLPT_level + CSV_SEP +
"example" + CSV_SEP +
pattern + CSV_SEP +
japanese + CSV_SEP +
english + CSV_SEP +
sources_html + CSV_SEP +
"bunpro, example, " + JLPT_level + ", " + pattern.replace(/[~{}()\s\s+\[\]!!【】()、。;:;]/g, "_") + "\n";
}
return csv;
})();
function download(filename, text) {
var element = document.createElement('a');
element.setAttribute('href', 'data:text/csv;charset=utf-8,' + encodeURIComponent(text));
element.setAttribute('download', filename);
element.style.display = 'none';
document.body.appendChild(element);
element.click();
console.log("freedom of information and freedom of SRS");
document.body.removeChild(element);
}
var filename = JLPT_level + "_" + lesson_id + "_" + pattern + ".csv";
download(filename, csv);
}
(function() {
var button = document.createElement('div');
button.setAttribute("class", "review-button btn");
button.innerText = button.innerText + "Download CSV for anki";
button.onclick = function(event) {
download_grammar_point();
event.stopPropagation();
};
var toolbox = document.getElementsByClassName("review-button")[0].parentElement;
toolbox.appendChild(button);
})()