struggle
This commit is contained in:
parent
7d42920dcb
commit
2634f40f2b
@ -27,6 +27,10 @@ export class TerminalLayout {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
getBlock(name: string) {
|
||||||
|
return this.blocks[name];
|
||||||
|
}
|
||||||
|
|
||||||
requestRender() {
|
requestRender() {
|
||||||
if (this.debounceTimer !== null) {
|
if (this.debounceTimer !== null) {
|
||||||
clearTimeout(this.debounceTimer);
|
clearTimeout(this.debounceTimer);
|
||||||
|
45
cli/index.ts
45
cli/index.ts
@ -3,9 +3,13 @@ import { toCase } from "util/caseManagement.ts";
|
|||||||
import { ArgParser } from "./argParser.ts";
|
import { ArgParser } from "./argParser.ts";
|
||||||
import { colorize } from "./colorize.ts";
|
import { colorize } from "./colorize.ts";
|
||||||
import { selectMenuInteractive } from "./selectMenu.ts";
|
import { selectMenuInteractive } from "./selectMenu.ts";
|
||||||
|
import { TerminalBlock, TerminalLayout } from "./TerminalLayout.ts";
|
||||||
|
|
||||||
export class PdfToolsCli {
|
export class PdfToolsCli {
|
||||||
private tools: Map<string, ITool> = new Map();
|
private tools: Map<string, ITool> = new Map();
|
||||||
|
private terminalLayout = new TerminalLayout();
|
||||||
|
|
||||||
|
private args = ArgParser.parse(Deno.args);
|
||||||
|
|
||||||
async importTools(tools?: string) {
|
async importTools(tools?: string) {
|
||||||
tools = tools?.replace(/\/$/, "").replace(/^\.?\//, "") || "tools";
|
tools = tools?.replace(/\/$/, "").replace(/^\.?\//, "") || "tools";
|
||||||
@ -34,31 +38,48 @@ export class PdfToolsCli {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public async run() {
|
public async run() {
|
||||||
console.clear();
|
try {
|
||||||
let lineCount = 0;
|
const lines: string[] = [];
|
||||||
for (const t of ["bearmetal:porple", "pdftools:cyan"]) {
|
for (const t of ["bearmetal:porple", "pdftools:cyan"]) {
|
||||||
const [name, color] = t.split(":");
|
const [name, color] = t.split(":");
|
||||||
const asciiArt = await getAsciiArt(name);
|
const asciiArt = await getAsciiArt(name);
|
||||||
console.log(colorize(asciiArt, color));
|
lines.push(...colorize(asciiArt, color).split("\n"));
|
||||||
lineCount += asciiArt.split("\n").length;
|
|
||||||
}
|
}
|
||||||
|
const titleBlock = new TerminalBlock();
|
||||||
|
this.terminalLayout.register("title", titleBlock);
|
||||||
|
const bodyBlock = new TerminalBlock();
|
||||||
|
this.terminalLayout.register("body", bodyBlock);
|
||||||
|
titleBlock.setFixedHeight(lines.length);
|
||||||
|
titleBlock.setLines(lines);
|
||||||
if (Deno.args.length === 0) {
|
if (Deno.args.length === 0) {
|
||||||
console.log(
|
// console.log(
|
||||||
colorize("No tool specified. Importing all tools...", "gray"),
|
// colorize("No tool specified. Importing all tools...", "gray"),
|
||||||
);
|
// );
|
||||||
await this.importTools();
|
await this.importTools();
|
||||||
}
|
}
|
||||||
const args = ArgParser.parse(Deno.args);
|
this.toolMenu();
|
||||||
this.toolMenu(Deno.consoleSize().rows - lineCount);
|
} finally {
|
||||||
|
this.terminalLayout.clearAll();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private async toolMenu(space?: number) {
|
private async toolMenu() {
|
||||||
const tools = this.tools.keys().toArray();
|
const tools = this.tools.keys().toArray();
|
||||||
const selected = await selectMenuInteractive("Choose a tool", tools);
|
const bodyBlock = this.terminalLayout.getBlock("body");
|
||||||
|
const selected = await selectMenuInteractive("Choose a tool", tools, {
|
||||||
|
terminalBlock: bodyBlock,
|
||||||
|
});
|
||||||
|
bodyBlock.clear();
|
||||||
if (!selected) return;
|
if (!selected) return;
|
||||||
const tool = this.tools.get(toCase(selected, "camel"));
|
await this.runTool(selected);
|
||||||
|
this.toolMenu();
|
||||||
|
}
|
||||||
|
|
||||||
|
private async runTool(toolName: string) {
|
||||||
|
const tool = this.tools.get(toolName);
|
||||||
if (tool) {
|
if (tool) {
|
||||||
await tool.run();
|
await tool.run();
|
||||||
|
await tool.done?.();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,9 +1,10 @@
|
|||||||
{
|
{
|
||||||
"name": "@bearmetal/pdf-tools",
|
"name": "@bearmetal/pdf-tools",
|
||||||
"tasks": {
|
"tasks": {
|
||||||
"dev": "deno run -A --watch main.ts",
|
"dev": "deno run -A --env-file=.env --watch main.ts",
|
||||||
"compile": "deno compile -o compare-form-fields.exe --target x86_64-pc-windows-msvc -R ./main.ts",
|
"compile": "deno compile -o compare-form-fields.exe --target x86_64-pc-windows-msvc -R ./main.ts",
|
||||||
"install": "deno install -fgq --import-map ./deno.json -n checkfields -R ./main.ts"
|
"install": "deno install -fgq --import-map ./deno.json -n checkfields -R ./main.ts",
|
||||||
|
"debug": "deno run -A --env-file=.env --inspect-wait --watch main.ts"
|
||||||
},
|
},
|
||||||
"imports": {
|
"imports": {
|
||||||
"@std/assert": "jsr:@std/assert@1",
|
"@std/assert": "jsr:@std/assert@1",
|
||||||
|
@ -80,6 +80,22 @@ async function renameFields(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class RenameFields implements ITool {
|
||||||
|
name = "renamefields";
|
||||||
|
description = "Renames fields in a PDF form";
|
||||||
|
help() {
|
||||||
|
console.log("Usage: renamefields <pdfPath> <pattern> <change>");
|
||||||
|
}
|
||||||
|
async run(pdfPath: string = "", pattern: string = "", change: string = "") {
|
||||||
|
await callWithArgPrompt(renameFields, [
|
||||||
|
["Please provide path to PDF:", (p) => !!p && p.endsWith(".pdf")],
|
||||||
|
"Please provide search string:",
|
||||||
|
"Please provide requested change:",
|
||||||
|
], [pdfPath, pattern, change]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
export default new RenameFields();
|
||||||
|
|
||||||
if (import.meta.main) {
|
if (import.meta.main) {
|
||||||
// await call(renameFields)
|
// await call(renameFields)
|
||||||
// while (!path || !path.endsWith('.pdf')) path = prompt("Please provide path to PDF:") || '';
|
// while (!path || !path.endsWith('.pdf')) path = prompt("Please provide path to PDF:") || '';
|
||||||
|
1
types.ts
1
types.ts
@ -5,5 +5,6 @@ declare global {
|
|||||||
description: string;
|
description: string;
|
||||||
run: ToolFunc<any[]>;
|
run: ToolFunc<any[]>;
|
||||||
help?: () => Promise<void> | void;
|
help?: () => Promise<void> | void;
|
||||||
|
done?: () => Promise<void> | void;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -15,7 +15,11 @@ export async function call<T extends unknown[]>(
|
|||||||
Object.assign(config, conf);
|
Object.assign(config, conf);
|
||||||
}
|
}
|
||||||
|
|
||||||
const args = config.args || Deno.args;
|
let args = config.args || Deno.args;
|
||||||
|
if (!args.length && transforms.length) {
|
||||||
|
config.multiTransform ? args = transforms.map(() => "") : args = [""];
|
||||||
|
}
|
||||||
|
|
||||||
const shouldPair = transforms.length === args.length;
|
const shouldPair = transforms.length === args.length;
|
||||||
const multiTransform = config.multiTransform ||
|
const multiTransform = config.multiTransform ||
|
||||||
!shouldPair && transforms.length > 1;
|
!shouldPair && transforms.length > 1;
|
||||||
|
@ -99,10 +99,8 @@ function coerceCaseToLower(str: string, caseType: CaseType) {
|
|||||||
|
|
||||||
export function toCase(str: string, toCase: CaseType) {
|
export function toCase(str: string, toCase: CaseType) {
|
||||||
const caseType = parseCase(str) || "";
|
const caseType = parseCase(str) || "";
|
||||||
console.log(caseType);
|
|
||||||
if (caseType === toCase) return str;
|
if (caseType === toCase) return str;
|
||||||
const lowerStr = coerceCaseToLower(str, caseType);
|
const lowerStr = coerceCaseToLower(str, caseType);
|
||||||
console.log(lowerStr);
|
|
||||||
switch (toCase) {
|
switch (toCase) {
|
||||||
case "pascal":
|
case "pascal":
|
||||||
return lowerToPascalCase(lowerStr);
|
return lowerToPascalCase(lowerStr);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user