Skip to content

Instantly share code, notes, and snippets.

@purtuga
Last active June 14, 2019 13:11
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 2 You must be signed in to fork a gist
  • Save purtuga/85ee689f0d3d90484ce3 to your computer and use it in GitHub Desktop.
Save purtuga/85ee689f0d3d90484ce3 to your computer and use it in GitHub Desktop.
A Grunt Copy process function to embed content of files into other files.
/**
* includeFile() - embeds a file content within another. Meant to be
* used from the copy task as a 'processContent' function. The following
* tokens can be used in files: <br>
*
* - BUILD_INCLUDE('file')
* - /* BUILD_INCLUDE('file') *\x47
* - &lt;!-- BUILD_INCLUDE("file") --&gt;
*
* In addition, options can be added to the token above that further
* process the file being included:
*
* - BUILD_INCLUDE('file')[option1,option2,option3]
*
* Supported options:
*
* - asJsString : Escapes all double-quotes and new line characters
* in the file
*
* @param {String} fileContent
* @param {String} filePath
*
* @return {String} fileContent
*
* @example
*
* ...
* copy: {
* options: {
* expand: true,
* process: includeFile
* }
* }
* ...
*
*/
function includeFile(fileContent, filePath){
if (fileContent.indexOf("BUILD_INCLUDE") > -1) {
grunt.log.write("includeFile(): [" + filePath + "] has BUILD_INCLUDE: ");
// Match:
// // BUILD_INCLUDE('file')
// /* BUILD_INCLUDE('file') */
// <!-- BUILD_INCLUDE("file") -->
//
// Token OPtions:
// // BUILD_INCLUDE('file')[options,here,as,array]
//
// asJsString
//
var re = /(?:(?:\/\/)|(?:<\!\-\-)|(?:\/\*)) {0,}BUILD_INCLUDE\(['"](.*)['"]\)(?:\[(.*)\])?(?: {0,}(?:\-\-\>)| {0,}(?:\*\/))?/i,
match, file, fileIncludeOptions;
while ((match = re.exec(fileContent)) !== null) {
grunt.log.write(".");
grunt.verbose.writeln(" Match array: " + match );
file = grunt.template.process( match[1] );
grunt.verbose.writeln(" File to embed: " + file );
file = grunt.file.read( file );
// If options were set, then parse them
if (match[2]) {
fileIncludeOptions = match[2].split(',');
// If option: asJsString
if (
fileIncludeOptions.some(function(option){
return String(option).toLowerCase() === "asjsstring";
})
) {
file = file
.replace(/\"/g, '\\x22')
.replace(/\r\n|\n/g, "\\n");
}
}
fileContent = fileContent.replace(match[0], function(){ return file; });
}
grunt.log.writeln("");
return fileContent;
}
return fileContent;
}
@arturmamedov
Copy link

Thank u so much! 👍

@Amourspirit
Copy link

Thank you!
I changed my version to include tabs and spaces. here
Regular expression on regex
Used in my userscript project TinyMce-for-Evernote

@Amourspirit
Copy link

I wrote a plugin that his much more extensive and can be found npmjs.com named grunt-build-include also on GitHub

@purtuga
Copy link
Author

purtuga commented Jun 14, 2019

@Amourspirit - thanks for sharing 👍

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment