Skip to content

Commit 65e60ae

Browse files
committed
refactored cat
1 parent 769706f commit 65e60ae

1 file changed

Lines changed: 68 additions & 53 deletions

File tree

  • implement-shell-tools/cat

‎implement-shell-tools/cat/cat.js‎

Lines changed: 68 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -1,83 +1,98 @@
11
const fs = require("fs");
22

3-
const arguments = process.argv;
4-
const userArguments = arguments.slice(2);
5-
6-
const index = arguments[1].lastIndexOf("/");
7-
const currentWorkingDirectory = arguments[1].slice(0, index + 1);
8-
9-
const flags = userArguments
10-
.filter((argument) => argument.startsWith("-"))
11-
.map((argument) => argument.slice(1))
12-
.join("");
13-
14-
const flagHandlers = {
15-
b: bFlag,
16-
n: nFlag,
17-
};
3+
//
4+
// ===== cat Procedure =====
5+
function cat(args) {
6+
const userArgs = args.slice(2);
7+
const currentWorkingDirectory = getCurrentWorkingDirectory(args);
8+
const fileNames = getFileNames(userArgs, currentWorkingDirectory);
9+
10+
const allFilesContents = readFiles(fileNames, currentWorkingDirectory);
11+
executeFlags(getFlags(userArgs), allFilesContents);
12+
printLines(allFilesContents);
13+
}
1814

19-
const fileNames = userArguments.filter((argument) => !argument.startsWith("-"));
20-
let allFilesContents = [];
15+
//
16+
// ===== Extracting Data From Arguments =====
17+
function getCurrentWorkingDirectory(args) {
18+
const index = args[1].lastIndexOf("/");
19+
return args[1].slice(0, index + 1);
20+
}
2121

22-
readFiles();
23-
executeFlags();
24-
printLines();
22+
function getFileNames(userArgs) {
23+
return userArgs.filter((argument) => !argument.startsWith("-"));
24+
}
2525

26-
function readFiles() {
26+
function readFiles(fileNames, currentWorkingDirectory) {
27+
const allFilesContents = [];
2728
fileNames.forEach((fileName) => {
28-
fileContent = readFile(fileName);
29+
fileContent = readFile(fileName, currentWorkingDirectory);
2930
allFilesContents.push(fileContent.split("\n"));
3031
});
32+
return allFilesContents;
3133
}
3234

33-
function readFile(fileName) {
35+
function readFile(fileName, currentWorkingDirectory) {
3436
const filePath = currentWorkingDirectory + fileName;
3537
return fs.readFileSync(filePath, "utf8").trimEnd();
3638
}
3739

38-
function executeFlags() {
40+
//
41+
// ===== Flag Handling =====
42+
const flagHandlers = {
43+
b: bFlag,
44+
n: nFlag,
45+
};
46+
47+
function getFlags(userArgs) {
48+
return userArgs
49+
.filter((arg) => arg.startsWith("-"))
50+
.map((arg) => arg.slice(1))
51+
.join("");
52+
}
53+
54+
function executeFlags(flags, allFilesContents) {
3955
for (const flag of flags) {
40-
if (flagHandlers[flag]) {
41-
allFilesContents = flagHandlers[flag]();
42-
} else {
43-
console.error(`cat: illegal option -- ${flag}\nusage: cat [-belnstuv] [file ...]`);
44-
process.exit(1);
45-
}
56+
if (flagHandlers[flag]) flagHandlers[flag](allFilesContents, flags);
57+
else invalidFlagError();
4658
}
4759
}
4860

49-
function bFlag() {
50-
const resultFiles = [];
51-
52-
for (const fileContent of allFilesContents) {
53-
const formattedLines = [];
54-
let lineNumber = 1;
61+
function invalidFlagError() {
62+
console.error(`cat: illegal option -- ${flag}\nusage: cat [-belnstuv] [file ...]`);
63+
process.exit(1);
64+
}
5565

56-
for (const line of fileContent) {
57-
if (line === "") {
58-
formattedLines.push(line);
59-
} else {
60-
const formattedLine = `${String(lineNumber++).padStart(6, " ")} ${line}`;
61-
formattedLines.push(formattedLine);
66+
function bFlag(allFilesContents) {
67+
let linenumber = 1;
68+
allFilesContents.forEach((fileContent) => {
69+
fileContent.forEach((line, index) => {
70+
if (line !== "") {
71+
fileContent[index] = `${String(linenumber).padStart(6, " ")} ${line}`;
72+
linenumber += 1;
6273
}
63-
}
64-
65-
resultFiles.push(formattedLines);
66-
}
67-
68-
return resultFiles;
74+
});
75+
});
6976
}
7077

71-
function nFlag() {
72-
return allFilesContents.map((fileContent) => {
73-
return fileContent.map((line, index) => `${String(index + 1).padStart(6, " ")} ${line}`);
74-
});
78+
function nFlag(allFilesContents, flags) {
79+
if (!flags.includes("b")) {
80+
allFilesContents.forEach((fileContent) => {
81+
fileContent.forEach((line, index) => (fileContent[index] = `${String(index + 1).padStart(6, " ")} ${line}`));
82+
});
83+
}
7584
}
7685

77-
function printLines() {
86+
//
87+
// ==== Print Output =====
88+
function printLines(allFilesContents) {
7889
allFilesContents.forEach((fileContent) => {
7990
fileContent.forEach((line) => {
8091
console.log(line);
8192
});
8293
});
8394
}
95+
96+
//
97+
// ===== Run cat =====
98+
cat(process.argv);

0 commit comments

Comments
 (0)