Skip to content

Instantly share code, notes, and snippets.

@tw3
Last active August 22, 2018 19:43
Show Gist options
  • Save tw3/dbaa86960e4c13e4f3bcfbdd1c849880 to your computer and use it in GitHub Desktop.
Save tw3/dbaa86960e4c13e4f3bcfbdd1c849880 to your computer and use it in GitHub Desktop.
A node script that inserts a portion of a snippet file into a section of another file
// Example usage:
// node replace_file_snippet.js \
// inputFile.html '<!--InsertionAreaStart-->' '<!--InsertionAreaEnd-->' \
// snippetFile.html '<!--OptionalSnippetStart-->' '<!--OptionalSnippetEnd-->' \
// outputFile.html
const fs = require('fs');
const path = require('path');
function main() {
const args = process.argv.slice(2);
const numArgs = args.length;
const hasEnoughArgs = (numArgs === 5 || numArgs === 7);
if (!hasEnoughArgs) {
console.error('Usage: ',
path.basename(process.argv[0]),
path.basename(process.argv[1]),
'<read_filename>',
'<read_start_text>',
'<read_end_text>',
'<snippet_filename>',
'[<snippet_start_text>',
'<snippet_end_text>]',
'<write_filename>');
return;
}
const readFilename = args[0];
const readStartText = args[1];
const readEndText = args[2];
const snippetFilename = args[3];
let snippetStartText;
let snippetEndText;
let writeFilename;
if (numArgs === 5) {
writeFilename = args[4];
} else {
snippetStartText = args[4];
snippetEndText = args[5];
writeFilename = args[6];
}
changeConfig(readFilename, readStartText, readEndText,
snippetFilename, snippetStartText, snippetEndText,
writeFilename);
}
function changeConfig(readFilename, readStartText, readEndText,
snippetFilename, snippetStartText, snippetEndText,
writeFilename) {
fs.readFile(readFilename, 'utf8', (err1, readData) => {
if (err1) {
console.error('Error reading', readFilename, ': ', err1);
process.exit();
}
const readStartREP = escapeREP(readStartText);
const readEndREP = escapeREP(readEndText);
const readREP = `${readStartREP}[\\s\\S]*${readEndREP}`;
const readRegExp = new RegExp(readREP, 'g');
const hasReadPattern = readRegExp.test(readData);
if (!hasReadPattern) {
console.log('The pattern', readREP, 'does not exist in', readFilename);
process.exit();
}
fs.readFile(snippetFilename, 'utf8', (err2, snippetData) => {
if (err2) {
console.error('Error reading', snippetFilename, ': ', err2);
process.exit();
}
let innerSnippetData = snippetData;
if (!!snippetStartText && !!snippetEndText) {
const snippetStartREP = escapeREP(snippetStartText);
const snippetEndREP = escapeREP(snippetEndText);
const innerSnippetREP = `${snippetStartREP}([\\s\\S]*)${snippetEndREP}`;
const innerSnippetRegExp = new RegExp(innerSnippetREP);
const matches = snippetData.match(innerSnippetRegExp);
if (matches.length > 1) {
innerSnippetData = matches[1];
}
}
const replacement = `${readStartText}\r\n${innerSnippetData}${readEndText}`;
const result = readData.replace(readRegExp, replacement);
fs.writeFile(writeFilename, result, 'utf8', (err3) => {
if (err3) {
console.error('Error reading', snippetFilename, ': ', err2);
process.exit();
}
console.log('Updated', writeFilename);
});
});
});
}
function escapeREP(rep) {
return rep.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string
}
main();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment