UNPKG

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
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;