import path from 'path';
|
|
|
|
import { AnkiConnect, IAnkiConnectActions } from '@/ankiconnect';
|
|
import {
|
|
ensureDirSync,
|
|
readFileSync,
|
|
readdirSync,
|
|
writeFileSync,
|
|
} from 'fs-extra';
|
|
|
|
export class AnkiTemplateEditor {
|
|
$connect = new AnkiConnect();
|
|
|
|
templateDir = 'template';
|
|
rootDir = path.resolve(this.templateDir, this.modelName);
|
|
styleFilename = 'style.css';
|
|
|
|
constructor(public modelName: string) {
|
|
ensureDirSync(this.rootDir);
|
|
}
|
|
|
|
async get() {
|
|
const d = await this.$connect.api('modelTemplates', {
|
|
modelName: this.modelName,
|
|
});
|
|
|
|
Object.entries(d).map(([cardName, sideDict]) => {
|
|
const folderDir = path.resolve(this.rootDir, cardName);
|
|
ensureDirSync(folderDir);
|
|
Object.entries(sideDict).map(([side, html]) => {
|
|
writeFileSync(path.resolve(folderDir, side + '.html'), html);
|
|
});
|
|
});
|
|
|
|
const s = await this.$connect.api('modelStyling', {
|
|
modelName: this.modelName,
|
|
});
|
|
|
|
writeFileSync(path.resolve(this.rootDir, this.styleFilename), s.css);
|
|
}
|
|
|
|
async set() {
|
|
const templates: IAnkiConnectActions['updateModelTemplates']['params']['model']['templates'] =
|
|
{};
|
|
|
|
for (const p of readdirSync(this.rootDir)) {
|
|
if (p === this.styleFilename) {
|
|
await this.$connect.api('updateModelStyling', {
|
|
model: {
|
|
name: this.modelName,
|
|
css: readFileSync(
|
|
path.resolve(this.rootDir, this.styleFilename),
|
|
'utf-8',
|
|
),
|
|
},
|
|
});
|
|
continue;
|
|
}
|
|
|
|
readdirSync(path.resolve(this.rootDir, p)).map((p1) => {
|
|
const side = p1.replace(/\.[^\.]+$/, '') as 'Front' | 'Back';
|
|
const sideMap = templates[p] || {};
|
|
sideMap[side] = readFileSync(
|
|
path.resolve(this.rootDir, p, p1),
|
|
'utf-8',
|
|
);
|
|
templates[p] = sideMap;
|
|
});
|
|
}
|
|
|
|
await this.$connect.api('updateModelTemplates', {
|
|
model: {
|
|
name: this.modelName,
|
|
templates,
|
|
},
|
|
});
|
|
}
|
|
}
|
|
|
|
if (require.main === module) {
|
|
new AnkiTemplateEditor('jp.takoboto').set();
|
|
}
|