Last active
August 22, 2018 19:43
-
-
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
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// 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