From 7566bf86125fe737bc6df9692a8bcda44d983d14 Mon Sep 17 00:00:00 2001 From: monoid Date: Fri, 22 Apr 2022 22:51:41 +0900 Subject: [PATCH] copy other --- tools/printDocument.ts | 63 ++++++++++++++++++++--------------- tools/reactivity.ts | 28 ++++++++++++++++ tools/template/interface.png | Bin 0 -> 13679 bytes tools/template/specific.md | 2 +- 4 files changed, 66 insertions(+), 27 deletions(-) create mode 100644 tools/reactivity.ts create mode 100644 tools/template/interface.png diff --git a/tools/printDocument.ts b/tools/printDocument.ts index 5c031bb..a9f8124 100644 --- a/tools/printDocument.ts +++ b/tools/printDocument.ts @@ -3,9 +3,12 @@ import { Issue } from "./githubType.ts"; import { copy } from "https://deno.land/std@0.136.0/fs/mod.ts"; import { readAll } from "https://deno.land/std@0.135.0/streams/mod.ts" import { parse as argParse } from "https://deno.land/std@0.135.0/flags/mod.ts"; -import { normalize, join as pathJoin, fromFileUrl, parse as parsePath -, relative } from "https://deno.land/std@0.135.0/path/mod.ts"; +import { + normalize, join as pathJoin, fromFileUrl, parse as parsePath + , relative +} from "https://deno.land/std@0.135.0/path/mod.ts"; import * as Eta from "https://deno.land/x/eta@v1.12.3/mod.ts"; +import { createReactive } from "./reactivity.ts"; async function readContent(path?: string): Promise { let content = "[]"; @@ -69,16 +72,17 @@ async function readAndPrint(args: { async function main() { const parsedArg = argParse(Deno.args); - const { issue_path, outDir, w, watch } = parsedArg; + const { issue_path, outDirArg, w, watch } = parsedArg; const watchMode = w || watch; if (typeof issue_path !== "undefined" && typeof issue_path !== "string") { console.log("Please provide a path to the json file."); Deno.exit(1); } - if (typeof outDir !== "undefined" && typeof outDir !== "string") { + if (typeof outDirArg !== "undefined" && typeof outDirArg !== "string") { console.log("Please provide a path to the output file."); Deno.exit(1); } + const outDir = (outDirArg ?? "build"); if (typeof watchMode !== "undefined" && typeof watchMode !== "boolean") { console.log("Please provide a boolean value for w."); Deno.exit(1); @@ -95,14 +99,29 @@ async function main() { views: viewPath, "view cache": false, }); - - const c = await readContent(issue_path); - const issues = JSON.parse(c) as Issue[]; - issues.sort((a, b) => a.number - b.number); + const issuesR = await createReactive(async () => { + const c = await readContent(issue_path); + const issues = JSON.parse(c) as Issue[]; + issues.sort((a, b) => a.number - b.number); + return issues; + }); const targets = ["SUMMARY.md", "overall.md", "specific.md", "intro.md", "support.md"]; - await readAndPrint({ issue_path, outDir, targets }); + const targetsR = await Promise.all(targets.map(async (t) => { + return await createReactive(() => { + return readAndPrint({ issue_path, outDir, targets:[t] }); + }); + } + + )); + issuesR.wireTo(...targetsR); + const copyOp = await createReactive(async () => { + const files = [...Deno.readDirSync(viewPath)].map(x => x.name).filter(x => !x.endsWith(".md")); + const op = files.map(x => copy(pathJoin(viewPath, x), pathJoin(outDir, x), { overwrite: true })); + await Promise.all(op); + }); + if (watchMode) { const watcher = Deno.watchFs([viewPath, issue_path as string]); for await (const event of watcher) { @@ -111,28 +130,20 @@ async function main() { new TextEncoder().encode("\x1b[2J\x1b[0f"), ); console.log(`reloading ${event.paths.join(", ")}`); - let reloadAll = false; for (const path of event.paths) { const p = parsePath(path); - if (targets.includes(p.base)) { - readAndPrint({ - issue_path: issue_path as string, - outDir: outDir as string, - targets: [p.base] - }); + if (p.dir === viewPath) { + if(p.ext === ".md") { + targetsR[targets.indexOf(p.base)].update(); + } + else{ + copyOp.update(); + } } - else{ - reloadAll = true; - break; + else if (p.base === "issues.json") { + await issuesR.update(); } } - if (reloadAll) { - readAndPrint({ - issue_path: issue_path as string, - outDir: outDir as string, - targets: targets - }); - } } } } diff --git a/tools/reactivity.ts b/tools/reactivity.ts new file mode 100644 index 0000000..701fe69 --- /dev/null +++ b/tools/reactivity.ts @@ -0,0 +1,28 @@ +interface Reactive{ + readonly value: T; + update: () => Promise; + wireTo(...r: Reactive[]): void; + unwireTo(r: Reactive): void; +} + +export async function createReactive(fn: () => Promise): Promise> { + let v = await fn(); + let listeners: Reactive[] = []; + + return { + get value() : T { + return v; + }, + async update(){ + const ret = await fn(); + v = ret; + await Promise.all(listeners.map(o => o.update())); + }, + wireTo(...r: Reactive[]) { + listeners.push(...r); + }, + unwireTo(r: Reactive) { + listeners = listeners.filter(o => o !== r); + } + }; +} \ No newline at end of file diff --git a/tools/template/interface.png b/tools/template/interface.png new file mode 100644 index 0000000000000000000000000000000000000000..fb31e77e3fb0a083e49850eece10c59ec18237ae GIT binary patch literal 13679 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 literal 0 HcmV?d00001 diff --git a/tools/template/specific.md b/tools/template/specific.md index ae7b7d5..5d03147 100644 --- a/tools/template/specific.md +++ b/tools/template/specific.md @@ -125,7 +125,7 @@ classDiagram ### 3.7.2. 사용자 인터페이스 상세 - +![interface](./interface.png) ### 3.7.4. 특징(Feature)