135 lines
3.7 KiB
TypeScript
135 lines
3.7 KiB
TypeScript
import { readAll } from "https://deno.land/std@0.143.0/streams/mod.ts";
|
|
import * as log from "https://deno.land/std@0.143.0/log/mod.ts";
|
|
import { WriterHandler } from "https://deno.land/std@0.143.0/log/handlers.ts";
|
|
import * as Eta from "https://deno.land/x/eta@v1.12.3/mod.ts";
|
|
import { Issue } from "./githubType.ts";
|
|
|
|
import testcaseData from "./testcases.json" assert { type: "json"};
|
|
|
|
type Testcase = {
|
|
id: number,
|
|
subId: number | null,
|
|
content: string,
|
|
procedure: string,
|
|
testData: string| null,
|
|
expected: string,
|
|
actual: string,
|
|
pass: boolean
|
|
}
|
|
const testcases = testcaseData as Testcase[];
|
|
|
|
class StderrHandler extends WriterHandler {
|
|
protected _writer: Deno.Writer;
|
|
#encoder: TextEncoder;
|
|
constructor(levelName: log.LevelName, options: log.HandlerOptions = {}){
|
|
super(levelName, options);
|
|
this.#encoder = new TextEncoder();
|
|
this._writer = Deno.stderr;
|
|
}
|
|
log(msg: string): void {
|
|
const encoded = this.#encoder.encode(msg);
|
|
Deno.stderr.writeSync(encoded);
|
|
}
|
|
}
|
|
|
|
interface Book {
|
|
sections: BookItem[];
|
|
}
|
|
type Separator = "Separator";
|
|
//type PartTitle = ;
|
|
type BookItem = Separator | {
|
|
Chapter: Chapter;
|
|
}
|
|
|
|
interface Chapter {
|
|
name: string;
|
|
content: string;
|
|
/** section number */
|
|
number?: number[];
|
|
sub_items: BookItem[];
|
|
path?: string;
|
|
source_path?: string;
|
|
parent_names: string[];
|
|
}
|
|
|
|
if (import.meta.main) {
|
|
await log.setup({
|
|
handlers: {
|
|
console: new StderrHandler("INFO", {
|
|
formatter: "{levelName} {msg}",
|
|
}),
|
|
},
|
|
loggers: {
|
|
default: {
|
|
level: "INFO",
|
|
handlers: ["console"],
|
|
}
|
|
}
|
|
}
|
|
);
|
|
main(Deno.args);
|
|
}
|
|
|
|
async function getIssues(){
|
|
const issue_path = "cache/issues.json";
|
|
const c = await Deno.readTextFile(issue_path);
|
|
const issues = JSON.parse(c) as Issue[];
|
|
issues.sort((a, b) => a.number - b.number);
|
|
return issues;
|
|
}
|
|
|
|
function toHeadId(name: string){
|
|
return name.replaceAll(/[^A-Za-z\s0-9]/gi,"").toLocaleLowerCase().replaceAll(" ","-");
|
|
}
|
|
|
|
async function getCurrentGitHash() {
|
|
const res = await Deno.run({cmd:["git", "rev-parse", "HEAD"], stdout:"piped"});
|
|
const hash = new TextDecoder().decode(await res.output()).trim();
|
|
res.close();
|
|
return hash;;
|
|
}
|
|
|
|
async function main(args: string[]) {
|
|
if (args.length > 1) {
|
|
//log.info(`args: ${JSON.stringify(args)}`);
|
|
if (args[0] === "supports") {
|
|
Deno.exit(0);
|
|
}
|
|
}
|
|
const issues = await getIssues();
|
|
const table = new Map();
|
|
issues.forEach((x)=>{
|
|
const category = x.title.split(":")[0];
|
|
if(!category) return;
|
|
let c = table.get(category)
|
|
if(!c){
|
|
c = [];
|
|
table.set(category,c);
|
|
}
|
|
c.push(x);
|
|
});
|
|
const gitHash = await getCurrentGitHash();
|
|
|
|
log.info(`start\n`);
|
|
const data = await readAll(Deno.stdin);
|
|
const jsonText = new TextDecoder().decode(data);
|
|
await Deno.writeTextFile("log.json", jsonText);
|
|
const [context, book] = JSON.parse(jsonText) as [any, Book];
|
|
book.sections.forEach(x=>{
|
|
if(x === "Separator"){
|
|
//skip
|
|
}
|
|
else {
|
|
log.info(`render ${x.Chapter.name}\n`);
|
|
x.Chapter.content = Eta.render(x.Chapter.content, {
|
|
issues: issues,
|
|
table: table,
|
|
gitHash: gitHash,
|
|
toHeadId: toHeadId,
|
|
testcases: testcases
|
|
}) as string;
|
|
}
|
|
})
|
|
//Deno.stderr.writeSync(new TextEncoder().encode(`context: ${JSON.stringify(context)}\n`));
|
|
console.log(JSON.stringify(book));
|
|
} |