210 lines
6.9 KiB
JavaScript

const fs = require('fs');
const { execSync } = require('child_process');
function create(file, fileName, emoji) {
const startTime = Date.now();
let data = fs.readFileSync(file, 'utf8');
const emojis = new Set(["🪟", "🍎", "🐧", "🟢", "⭐", "🤖"]);
let result = [];
let lineCount = 0;
const lines = data.split('\n');
const outputDir = './filter';
if (!fs.existsSync(outputDir)) {
fs.mkdirSync(outputDir);
}
for (let i = 0; i < lines.length; i++) {
let line = lines[i];
if (lineCount < 20) {
result.push(line);
lineCount++;
continue;
}
line = line.replace(/ /g, '');
if ([...emojis].some(emojiChar => line.includes(emojiChar)) && !line.includes(emoji)) {
continue;
}
result.push(lines[i]);
}
fs.writeFileSync(`${outputDir}/${fileName}.md`, result.join('\n').replaceAll('./filter/', '').replaceAll('href="./', 'href="../').replaceAll('src="./', 'src="../'));
console.log(`${fileName} time: \x1b[32m${Date.now() - startTime}ms\x1b[0m`);
}
function categorize() {
create("README.md", "windows-only", "🪟");
create("README.md","macOS-only", "🍎");
create("README.md","linux-only", "🐧");
create("README.md","open-source-only", "🟢");
create("README.md","recommended-only", "⭐");
create("MOBILE.md", "android-only", "🤖");
create("MOBILE.md","iOS-only", "🍎");
create("MOBILE.md","open-source-mobile-only", "🟢");
create("MOBILE.md","recommended-mobile-only", "⭐");
}
function format(file = "README.md") {
const data = fs.readFileSync(file, 'utf8');
const updatedData = data
.split('\n')
.map(line => {
line = line.replace(/https:\/\/www\./g, 'https://');
if (line.startsWith('- [')) {
const parts = line.split(' - ');
if (parts.length >= 2) {
let description = parts[1];
description = description.replace(/^A\s+/i, '').replace(/^An\s+/i, '');
description = description.charAt(0).toUpperCase() + description.slice(1);
parts[1] = description;
line = parts.join(' - ');
}
}
return line;
})
.join('\n');
fs.writeFileSync(file, updatedData, 'utf8');
console.log(`\x1b[32m${file} has been formatted.\x1b[0m`);
}
function countLinks(file = "README.md") {
const data = fs.readFileSync(file, 'utf8');
const linkCount = (data.match(/\[.*?\]\(https?:\/\/.*?\)/g) || []).length;
console.log(`Total links in ${file}: \x1b[32m${linkCount}\x1b[0m`);
}
function fastGit(message = "update") {
try {
execSync('git add -A', { stdio: 'inherit' });
execSync(`git commit -m "${message}"`, { stdio: 'inherit' });
execSync('git push', { stdio: 'inherit' });
console.log('Changes have been committed and pushed.');
} catch (error) {
console.error('Error running git commands:', error);
}
}
function runAll() {
countLinks("README.md");
countLinks("MOBILE.md");
// formatFiles();
createToC();
categorize();
countLinks("README.md");
countLinks("MOBILE.md");
}
function analyze(file = "README.md") {
const data = fs.readFileSync(file, 'utf8');
const words = data.match(/\b\w+\b/g);
const wordCount = words ? words.length : 0;
const linkCount = (data.match(/\[.*?\]\(https?:\/\/.*?\)/g) || []).length;
const characterCount = data.length;
console.log(`${file} Word Count: \x1b[32m${wordCount}\x1b[0m`);
console.log(`${file} Character Count: \x1b[32m${characterCount}\x1b[0m`);
console.log(`${file} Link Count: \x1b[32m${linkCount}\x1b[0m`);
}
function generateToc(filePath) {
const content = fs.readFileSync(filePath, 'utf-8');
const lines = content.split('\n');
let toc = [];
lines.forEach(line => {
const match = /^#{2,6}\s+(.+)/.exec(line);
if (match) {
const level = match[0].indexOf(' ') - 1;
const title = match[1].trim();
const anchor = title
.toLowerCase()
.replace(/[^a-z0-9]+/g, '-')
.replace(/^-+/, '')
.replace(/-+$/, '');
toc.push(`${' '.repeat(level - 1)}- [${title}](#${anchor})`);
}
});
const tocContent = toc.slice(1).join('\n');
return tocContent;
}
function findAF(file, name, message, suffix) {
const data = fs.readFileSync(file, 'utf8');
const startMarker = `<!-- AF-${name}`.trim();
const endMarker = `<!-- AF-END -->`.trim();
const startIndex = data.indexOf(startMarker);
if (startIndex !== -1) {
const cleanStartIndex = data.indexOf(">", startIndex) + 1;
const endIndex = data.indexOf(endMarker, cleanStartIndex);
if (endIndex !== -1) {
let newData = data.slice(0, cleanStartIndex) + message + data.slice(endIndex);
if (suffix) {
const newStartMarker = `<!-- AF-${name} ${suffix} -->`;
newData = newData.replace(data.slice(startIndex, cleanStartIndex), newStartMarker);
}
fs.writeFileSync(file, newData, 'utf8');
console.log(file + " updated successfully.");
} else {
console.log(`No end marker found for ${startMarker}`);
}
} else {
console.log(`No content found for ${startMarker}`);
}
}
function createToC() {
findAF("README.md", "TOC", "\n\n" + generateToc("README.md") + "\n\n", `: ${new Date().toLocaleString('en-US', { timeZoneName: 'short', weekday: 'long', year: 'numeric', month: 'long', day: 'numeric', hour: '2-digit', minute: '2-digit', second: '2-digit', hour12: true })}`);
findAF("MOBILE.md", "TOC", "\n\n" + generateToc("MOBILE.md") + "\n\n", `: ${new Date().toLocaleString('en-US', { timeZoneName: 'short', weekday: 'long', year: 'numeric', month: 'long', day: 'numeric', hour: '2-digit', minute: '2-digit', second: '2-digit', hour12: true })}`);
}
function formatFiles() {
format("README.md");
format("MOBILE.md");
}
const args = process.argv.slice(2);
if (args.includes('--analyze')) {
analyze("README.md");
analyze("MOBILE.md");
} else if (args.includes('--toc')) {
createToC();
} else if (args.includes('--categorize')) {
categorize();
} else if (args.includes('--format')) {
formatFiles();
} else if (args.includes('--links')) {
countLinks("README.md");
countLinks("MOBILE.md");
} else if (args.includes('--fastgit')) {
const commitMessage = args.slice(1).join(' ');
if (commitMessage) {
fastGit(commitMessage);
} else {
console.log('Please provide a commit message after --fastgit');
}
} else if (args.includes('--all')) {
runAll();
} else {
console.log("Usage:");
console.log(" node index.js --categorize Categorize based on icons");
console.log(" node index.js --format Format README.md");
console.log(" node index.js --links Count and display total links in README.md");
console.log(" node index.js --fastgit <msg> Run git commands with the specified commit message");
console.log(" node index.js --analyze Print some info about README.md");
console.log(" node index.js --toc Update the table of contents");
console.log(" node index.js --all Run all the commands (format, categorize, links)");
}