-
-
Notifications
You must be signed in to change notification settings - Fork 105
Expand file tree
/
Copy pathcat.js
More file actions
67 lines (61 loc) · 1.42 KB
/
Copy pathcat.js
File metadata and controls
67 lines (61 loc) · 1.42 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
import { program } from "commander";
import { promises as fs } from "node:fs";
program
.name("cat")
.description("Concatenate and print files")
.argument("<paths...>", "The file paths to process")
.option("-n", "Number lines")
.option("-b", "Number non-blank lines");
program.parse();
function parseNumberMode(options) {
if (options.b) {
return "non-blank";
} else if (options.n) {
return "all";
} else {
return "none";
}
}
function calculatePrefix(
numberMode,
nonBlankLineNumber,
lineNumberIncludingBlanks,
thisLineIsBlank,
) {
if (numberMode === "none") {
return "";
}
let lineNumber;
if (numberMode === "all") {
lineNumber = lineNumberIncludingBlanks;
} else {
if (thisLineIsBlank) {
return "";
} else {
lineNumber = nonBlankLineNumber;
}
}
return lineNumber.toString().padStart(6, " ") + " ";
}
const numberMode = parseNumberMode(program.opts());
for (const path of program.args) {
const content = await fs.readFile(path, "utf-8");
const lines = content.split("\n");
let nonBlankLineNumber = 1;
for (let i = 0; i < lines.length; i++) {
const line = lines[i];
if (i === lines.length - 1 && line === "") {
break;
}
const prefix = calculatePrefix(
numberMode,
nonBlankLineNumber,
i + 1,
line === "",
);
console.log(`${prefix}${line}`);
if (line !== "") {
nonBlankLineNumber += 1;
}
}
}