"use strict"; module.exports = function(grunt) { var fs = require("fs"), Util = { jsBasePath: "_src/", parseBasePath: "_parse/", cssBasePath: "themes/default/_css/", fetchScripts: function(readFile, basePath) { var sources = fs.readFileSync(readFile); sources = /\[([^\]]+\.js'[^\]]+)\]/.exec(sources); sources = sources[1] .replace(/\/\/.*\n/g, "\n") .replace(/'|"|\n|\t|\s/g, ""); sources = sources.split(","); sources.forEach(function(filepath, index) { sources[index] = basePath + filepath; }); return sources; }, fetchStyles: function() { var sources = fs.readFileSync(this.cssBasePath + "ueditor.css"), filepath = null, pattern = /@import\s+([^;]+)*;/g, src = []; while ((filepath = pattern.exec(sources))) { src.push(this.cssBasePath + filepath[1].replace(/'|"/g, "")); } return src; } }, packageJson = grunt.file.readJSON("package.json"), server = grunt.option("server") || "php", encode = grunt.option("encode") || "utf8", disDir = "dist/", banner = "/*!\n * " + packageJson.name + "\n * version: " + packageJson.version + "\n * build: <%= new Date() %>\n */\n\n"; //init (function() { server = typeof server === "string" ? server.toLowerCase() : "php"; encode = typeof encode === "string" ? encode.toLowerCase() : "utf8"; disDir = "dist/" + encode + "-" + server + "/"; })(); grunt.initConfig({ pkg: packageJson, concat: { js: { options: { banner: "/*!\n * " + packageJson.name + "\n * version: " + packageJson.version + "\n * build: <%= new Date() %>\n */\n\n" + "(function(){\n\n", footer: "\n\n})();\n", process: function(src, s) { var filename = s.substr(s.indexOf("/") + 1); return ( "// " + filename + "\n" + src.replace("/_css/", "/css/") + "\n" ); } }, src: Util.fetchScripts("_examples/editor_api.js", Util.jsBasePath), dest: disDir + packageJson.name + ".all.js" }, parse: { options: { banner: "/*!\n * " + packageJson.name + " parse\n * version: " + packageJson.version + "\n * build: <%= new Date() %>\n */\n\n" + "(function(){\n\n", footer: "\n\n})();\n" }, src: Util.fetchScripts("ueditor.parse.js", Util.parseBasePath), dest: disDir + packageJson.name + ".parse.js" }, css: { src: Util.fetchStyles(), dest: disDir + "themes/default/css/ueditor.css" } }, cssmin: { options: { banner: banner }, files: { expand: true, cwd: disDir + "themes/default/css/", src: ["*.css", "!*.min.css"], dest: disDir + "themes/default/css/", ext: ".min.css" } }, uglify: { dist: { options: { banner: "/*!\n * " + packageJson.name + "\n * version: " + packageJson.version + "\n * build: <%= new Date() %>\n */" }, src: disDir + "<%= pkg.name %>.all.js", dest: disDir + "<%= pkg.name %>.all.min.js" }, parse: { options: { banner: "/*!\n * " + packageJson.name + " parse\n * version: " + packageJson.version + "\n * build: <%= new Date() %>\n */" }, src: disDir + "<%= pkg.name %>.parse.js", dest: disDir + "<%= pkg.name %>.parse.min.js" } }, copy: { base: { files: [ { src: [ "*.html", "themes/iframe.css", "themes/default/dialogbase.css", "themes/default/images/**", "dialogs/**", "lang/**", "third-party/**" ], dest: disDir } ] }, demo: { files: [ { src: "_examples/completeDemo.html", dest: disDir + "index.html" } ] }, php: { expand: true, src: "php/**", dest: disDir }, asp: { expand: true, src: "asp/**", dest: disDir }, jsp: { expand: true, src: "jsp/**", dest: disDir }, net: { expand: true, src: "net/**", dest: disDir } }, transcoding: { options: { charset: encode }, src: [ disDir + "**/*.html", disDir + "**/*.js", disDir + "**/*.css", disDir + "**/*.json", disDir + "**/*.jsp", disDir + "**/*.asp" ] }, replace: { fileEncode: { src: [ disDir + "**/*.html", disDir + "dialogs/**/*.js", disDir + "**/*.css", disDir + "**/*.php", disDir + "**/*.jsp", disDir + "**/*.ashx", disDir + "**/*.asp" ], overwrite: true, replacements: [ { from: /utf-8/gi, to: "gbk" } ] }, demo: { src: disDir + "index.html", overwrite: true, replacements: [ { from: /\.\.\//gi, to: "" }, { from: "editor_api.js", to: packageJson.name + ".all.min.js" } ] }, gbkasp: { src: [disDir + "asp/*.asp"], overwrite: true, replacements: [ { from: /65001/gi, to: "936" } ] } }, clean: { build: { src: [ disDir + "jsp/src", disDir + "*/upload", disDir + ".DS_Store", disDir + "**/.DS_Store", disDir + ".git", disDir + "**/.git" ] } } }); grunt.loadNpmTasks("grunt-text-replace"); grunt.loadNpmTasks("grunt-contrib-concat"); grunt.loadNpmTasks("grunt-contrib-cssmin"); grunt.loadNpmTasks("grunt-contrib-uglify"); grunt.loadNpmTasks("grunt-contrib-copy"); grunt.loadNpmTasks("grunt-transcoding"); grunt.loadNpmTasks("grunt-contrib-clean"); grunt.registerTask("default", "UEditor build", function() { var tasks = [ "concat", "cssmin", "uglify", "copy:base", "copy:" + server, "copy:demo", "replace:demo", "clean" ]; if (encode === "gbk") { tasks.push("replace:fileEncode"); if (server === "asp") { tasks.push("replace:gbkasp"); } } tasks.push("transcoding"); //config修改 updateConfigFile(); grunt.task.run(tasks); }); function updateConfigFile() { var filename = "ueditor.config.js", file = grunt.file.read(filename), path = server + "/", suffix = server === "net" ? ".ashx" : "." + server; file = file.replace(/php\//ig, path).replace(/\.php/ig, suffix); if (encode == "gbk") { file = file.replace(/utf-8/gi, "gbk"); } //写入到dist if (grunt.file.write(disDir + filename, file)) { grunt.log.writeln("config file update success"); } else { grunt.log.warn("config file update error"); } } };