Add Docker Compose setup
This commit is contained in:
commit
91e67968ca
17 changed files with 2683 additions and 0 deletions
70
conjugate.js
Normal file
70
conjugate.js
Normal file
|
|
@ -0,0 +1,70 @@
|
|||
// Generates the present-tense conjugation for every -er verb in verbs.db
|
||||
// and stores it in a `conjugations` table. Run: node conjugate.js
|
||||
//
|
||||
// Regular -er endings are computed; spelling-change verbs are overridden
|
||||
// so the data stays accurate.
|
||||
|
||||
const { execFileSync } = require("child_process");
|
||||
const path = require("path");
|
||||
|
||||
const DB = path.join(__dirname, "verbs.db");
|
||||
|
||||
// Verbs whose present tense is NOT the plain regular pattern.
|
||||
const OVERRIDES = {
|
||||
manger: ["mange", "manges", "mange", "mangeons", "mangez", "mangent"],
|
||||
voyager: ["voyage", "voyages", "voyage", "voyageons", "voyagez", "voyagent"],
|
||||
changer: ["change", "changes", "change", "changeons", "changez", "changent"],
|
||||
commencer: ["commence", "commences", "commence", "commençons", "commencez", "commencent"],
|
||||
acheter: ["achète", "achètes", "achète", "achetons", "achetez", "achètent"],
|
||||
appeler: ["appelle", "appelles", "appelle", "appelons", "appelez", "appellent"],
|
||||
payer: ["paie", "paies", "paie", "payons", "payez", "paient"],
|
||||
nettoyer: ["nettoie", "nettoies", "nettoie", "nettoyons", "nettoyez", "nettoient"],
|
||||
répéter: ["répète", "répètes", "répète", "répétons", "répétez", "répètent"],
|
||||
};
|
||||
|
||||
function regular(inf) {
|
||||
const stem = inf.slice(0, -2); // drop "er"
|
||||
const nousStem = inf.endsWith("ger")
|
||||
? stem + "e"
|
||||
: inf.endsWith("cer")
|
||||
? stem.slice(0, -1) + "ç"
|
||||
: stem;
|
||||
return [stem + "e", stem + "es", stem + "e", nousStem + "ons", stem + "ez", stem + "ent"];
|
||||
}
|
||||
|
||||
function present(inf) {
|
||||
return OVERRIDES[inf] || regular(inf);
|
||||
}
|
||||
|
||||
function getInfinitives() {
|
||||
const out = execFileSync("sqlite3", [DB, "SELECT infinitif FROM verbs ORDER BY infinitif;"], {
|
||||
encoding: "utf8",
|
||||
});
|
||||
return out.split("\n").map((s) => s.trim()).filter(Boolean);
|
||||
}
|
||||
|
||||
function esc(s) {
|
||||
return s.replace(/'/g, "''");
|
||||
}
|
||||
|
||||
function build() {
|
||||
const verbs = getInfinitives();
|
||||
let sql = `
|
||||
DROP TABLE IF EXISTS conjugations;
|
||||
CREATE TABLE conjugations (
|
||||
infinitif TEXT NOT NULL,
|
||||
tense TEXT NOT NULL,
|
||||
p1 TEXT, p2 TEXT, p3 TEXT, p4 TEXT, p5 TEXT, p6 TEXT,
|
||||
PRIMARY KEY (infinitif, tense)
|
||||
);
|
||||
`;
|
||||
for (const inf of verbs) {
|
||||
const f = present(inf).map(esc);
|
||||
sql += `INSERT INTO conjugations VALUES ('${esc(inf)}','présent','${f[0]}','${f[1]}','${f[2]}','${f[3]}','${f[4]}','${f[5]}');\n`;
|
||||
}
|
||||
execFileSync("sqlite3", [DB], { input: sql });
|
||||
const n = execFileSync("sqlite3", [DB, "SELECT COUNT(*) FROM conjugations;"], { encoding: "utf8" }).trim();
|
||||
console.log(`conjugations written: ${n} rows`);
|
||||
}
|
||||
|
||||
build();
|
||||
Loading…
Add table
Add a link
Reference in a new issue