|
1 | 1 | const fs = require("fs"); |
2 | 2 |
|
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 | +} |
18 | 14 |
|
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 | +} |
21 | 21 |
|
22 | | -readFiles(); |
23 | | -executeFlags(); |
24 | | -printLines(); |
| 22 | +function getFileNames(userArgs) { |
| 23 | + return userArgs.filter((argument) => !argument.startsWith("-")); |
| 24 | +} |
25 | 25 |
|
26 | | -function readFiles() { |
| 26 | +function readFiles(fileNames, currentWorkingDirectory) { |
| 27 | + const allFilesContents = []; |
27 | 28 | fileNames.forEach((fileName) => { |
28 | | - fileContent = readFile(fileName); |
| 29 | + fileContent = readFile(fileName, currentWorkingDirectory); |
29 | 30 | allFilesContents.push(fileContent.split("\n")); |
30 | 31 | }); |
| 32 | + return allFilesContents; |
31 | 33 | } |
32 | 34 |
|
33 | | -function readFile(fileName) { |
| 35 | +function readFile(fileName, currentWorkingDirectory) { |
34 | 36 | const filePath = currentWorkingDirectory + fileName; |
35 | 37 | return fs.readFileSync(filePath, "utf8").trimEnd(); |
36 | 38 | } |
37 | 39 |
|
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) { |
39 | 55 | 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(); |
46 | 58 | } |
47 | 59 | } |
48 | 60 |
|
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 | +} |
55 | 65 |
|
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; |
62 | 73 | } |
63 | | - } |
64 | | - |
65 | | - resultFiles.push(formattedLines); |
66 | | - } |
67 | | - |
68 | | - return resultFiles; |
| 74 | + }); |
| 75 | + }); |
69 | 76 | } |
70 | 77 |
|
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 | + } |
75 | 84 | } |
76 | 85 |
|
77 | | -function printLines() { |
| 86 | +// |
| 87 | +// ==== Print Output ===== |
| 88 | +function printLines(allFilesContents) { |
78 | 89 | allFilesContents.forEach((fileContent) => { |
79 | 90 | fileContent.forEach((line) => { |
80 | 91 | console.log(line); |
81 | 92 | }); |
82 | 93 | }); |
83 | 94 | } |
| 95 | + |
| 96 | +// |
| 97 | +// ===== Run cat ===== |
| 98 | +cat(process.argv); |
0 commit comments