gulp-build-html
Version:
Used to process html files to automatically concat css and js files, and meanwhile update html references.
90 lines (76 loc) • 3.85 kB
JavaScript
var path = require("path"),
Transform = require("stream").Transform,
utils = require("wzh.node-utils"),
lib = require("./lib/lib"),
blockParserAndBuilder = require("./lib/blockParserAndBuilder");
/**
* @callback GeneratedFileInstaller 生成的css/js文件的安装器,亦即如何向html添加生成的文件的引用
* @param {String} generatedFilePath 生成的css/js文件的绝对路径
* @param {String} generatedFileContent 生成的css/js文件的正文
* @param {String} htmlFilePath 声明有构建指令的html文件的绝对路径
* @returns {String} 要安装在html正文中的字符串
*/
/**
* @callback GeneratedContentInstaller 生成的css/js正文的安装器,亦即如何向html添加生成的正文
* @param {String} generatedContent 生成的css/js的正文
* @param {String} htmlFilePath 声明有构建指令的html文件的绝对路径
* @returns {String} 要安装在html正文中的字符串
*/
/**
* @callback BuildCompleteListener 构建完成监听器
* @param {String} generatedFileAbsolutePath 生成文件的绝对路径
* @param {String[]} buildingFileAbsolutePathList 构建的文件的绝对路径列表
*/
/**
* @callback FileContentReader 文件正文读取器
* @param {String} filePath 文件路径
* @returns {String} 文件正文
*/
/**
* @callback ConcatFileContentWriter 合并文件正文写入器
* @param {String} fileType 文件类型。支持 css/js
* @param {String} fileContent 文件正文
* @param {String} htmlFileAbsolutePath html 文件的绝对路径
* @param {Number} groupIndex 文件分组序号,从 0 开始
* @returns {String} 在 html 中的引用地址
*/
/**
* @param {Object} [ops] 控制选项
* @param {GeneratedFileInstaller} [ops.generatedCssFileInstaller] 生成的css文件的安装器。当输出目标是 file 时有用。不影响文件的自动生成。
* @param {GeneratedFileInstaller} [ops.generatedJsFileInstaller] 生成的js文件的安装器。当输出目标是 file 时有用。不影响文件的自动生成。
* @param {GeneratedContentInstaller} [ops.generatedCssContentInstaller] 生成的css正文的安装器。当输出目标是 inline 时有用
* @param {GeneratedContentInstaller} [ops.generatedJsContentInstaller] 生成的js正文的安装器。当输出目标是 inline 时有用
* @param {BuildCompleteListener} [ops.oncomplete] 构建完成后要执行的方法
*/
var buildHtml = function(ops){
ops = utils.util.setDftValue(ops, {
generatedCssFileInstaller: null,
generatedCssContentInstaller: null,
generatedJsFileInstaller: null,
generatedJsContentInstaller: null,
oncomplete: null
});
var transformStream = new Transform({objectMode: true});
transformStream._transform = function(vinylFile, encoding, finish){
if(vinylFile.isNull() || vinylFile.isDirectory())
return finish(null, vinylFile);
if(vinylFile.isStream())
return finish(lib.newGulpPluginError("Stream file is not supported."));
if(!vinylFile.isBuffer())
return finish(lib.newGulpPluginError("Only buffer file is supported."));
/* 忽略不支持的文件 */
var extName = String(vinylFile.extname).toLowerCase();
var byPassingTypes = [".js", ".ts", ".css", ".scss", ".less", ".jpg", ".png", ".gif"];
if(byPassingTypes.indexOf(extName) !== -1)
return finish(null, vinylFile);
var result = blockParserAndBuilder.build(vinylFile.contents.toString("utf8"), vinylFile.path, ops);
vinylFile.contents = new Buffer(result.newFileContent);
if(Array.isArray(result.generatedVinylFiles))
for(var i = 0; i < result.generatedVinylFiles.length; i++)
this.push(result.generatedVinylFiles[i]);
finish(null, vinylFile);
};
transformStream.resume();
return transformStream;
};
module.exports = buildHtml;