Gruntfile.js 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303
  1. "use strict";
  2. module.exports = function(grunt) {
  3. var fs = require("fs"),
  4. Util = {
  5. jsBasePath: "_src/",
  6. parseBasePath: "_parse/",
  7. cssBasePath: "themes/default/_css/",
  8. fetchScripts: function(readFile, basePath) {
  9. var sources = fs.readFileSync(readFile);
  10. sources = /\[([^\]]+\.js'[^\]]+)\]/.exec(sources);
  11. sources = sources[1]
  12. .replace(/\/\/.*\n/g, "\n")
  13. .replace(/'|"|\n|\t|\s/g, "");
  14. sources = sources.split(",");
  15. sources.forEach(function(filepath, index) {
  16. sources[index] = basePath + filepath;
  17. });
  18. return sources;
  19. },
  20. fetchStyles: function() {
  21. var sources = fs.readFileSync(this.cssBasePath + "ueditor.css"),
  22. filepath = null,
  23. pattern = /@import\s+([^;]+)*;/g,
  24. src = [];
  25. while ((filepath = pattern.exec(sources))) {
  26. src.push(this.cssBasePath + filepath[1].replace(/'|"/g, ""));
  27. }
  28. return src;
  29. }
  30. },
  31. packageJson = grunt.file.readJSON("package.json"),
  32. server = grunt.option("server") || "php",
  33. encode = grunt.option("encode") || "utf8",
  34. disDir = "dist/",
  35. banner =
  36. "/*!\n * " +
  37. packageJson.name +
  38. "\n * version: " +
  39. packageJson.version +
  40. "\n * build: <%= new Date() %>\n */\n\n";
  41. //init
  42. (function() {
  43. server = typeof server === "string" ? server.toLowerCase() : "php";
  44. encode = typeof encode === "string" ? encode.toLowerCase() : "utf8";
  45. disDir = "dist/" + encode + "-" + server + "/";
  46. })();
  47. grunt.initConfig({
  48. pkg: packageJson,
  49. concat: {
  50. js: {
  51. options: {
  52. banner: "/*!\n * " +
  53. packageJson.name +
  54. "\n * version: " +
  55. packageJson.version +
  56. "\n * build: <%= new Date() %>\n */\n\n" +
  57. "(function(){\n\n",
  58. footer: "\n\n})();\n",
  59. process: function(src, s) {
  60. var filename = s.substr(s.indexOf("/") + 1);
  61. return (
  62. "// " + filename + "\n" + src.replace("/_css/", "/css/") + "\n"
  63. );
  64. }
  65. },
  66. src: Util.fetchScripts("_examples/editor_api.js", Util.jsBasePath),
  67. dest: disDir + packageJson.name + ".all.js"
  68. },
  69. parse: {
  70. options: {
  71. banner: "/*!\n * " +
  72. packageJson.name +
  73. " parse\n * version: " +
  74. packageJson.version +
  75. "\n * build: <%= new Date() %>\n */\n\n" +
  76. "(function(){\n\n",
  77. footer: "\n\n})();\n"
  78. },
  79. src: Util.fetchScripts("ueditor.parse.js", Util.parseBasePath),
  80. dest: disDir + packageJson.name + ".parse.js"
  81. },
  82. css: {
  83. src: Util.fetchStyles(),
  84. dest: disDir + "themes/default/css/ueditor.css"
  85. }
  86. },
  87. cssmin: {
  88. options: {
  89. banner: banner
  90. },
  91. files: {
  92. expand: true,
  93. cwd: disDir + "themes/default/css/",
  94. src: ["*.css", "!*.min.css"],
  95. dest: disDir + "themes/default/css/",
  96. ext: ".min.css"
  97. }
  98. },
  99. uglify: {
  100. dist: {
  101. options: {
  102. banner: "/*!\n * " +
  103. packageJson.name +
  104. "\n * version: " +
  105. packageJson.version +
  106. "\n * build: <%= new Date() %>\n */"
  107. },
  108. src: disDir + "<%= pkg.name %>.all.js",
  109. dest: disDir + "<%= pkg.name %>.all.min.js"
  110. },
  111. parse: {
  112. options: {
  113. banner: "/*!\n * " +
  114. packageJson.name +
  115. " parse\n * version: " +
  116. packageJson.version +
  117. "\n * build: <%= new Date() %>\n */"
  118. },
  119. src: disDir + "<%= pkg.name %>.parse.js",
  120. dest: disDir + "<%= pkg.name %>.parse.min.js"
  121. }
  122. },
  123. copy: {
  124. base: {
  125. files: [
  126. {
  127. src: [
  128. "*.html",
  129. "themes/iframe.css",
  130. "themes/default/dialogbase.css",
  131. "themes/default/images/**",
  132. "dialogs/**",
  133. "lang/**",
  134. "third-party/**"
  135. ],
  136. dest: disDir
  137. }
  138. ]
  139. },
  140. demo: {
  141. files: [
  142. {
  143. src: "_examples/completeDemo.html",
  144. dest: disDir + "index.html"
  145. }
  146. ]
  147. },
  148. php: {
  149. expand: true,
  150. src: "php/**",
  151. dest: disDir
  152. },
  153. asp: {
  154. expand: true,
  155. src: "asp/**",
  156. dest: disDir
  157. },
  158. jsp: {
  159. expand: true,
  160. src: "jsp/**",
  161. dest: disDir
  162. },
  163. net: {
  164. expand: true,
  165. src: "net/**",
  166. dest: disDir
  167. }
  168. },
  169. transcoding: {
  170. options: {
  171. charset: encode
  172. },
  173. src: [
  174. disDir + "**/*.html",
  175. disDir + "**/*.js",
  176. disDir + "**/*.css",
  177. disDir + "**/*.json",
  178. disDir + "**/*.jsp",
  179. disDir + "**/*.asp"
  180. ]
  181. },
  182. replace: {
  183. fileEncode: {
  184. src: [
  185. disDir + "**/*.html",
  186. disDir + "dialogs/**/*.js",
  187. disDir + "**/*.css",
  188. disDir + "**/*.php",
  189. disDir + "**/*.jsp",
  190. disDir + "**/*.ashx",
  191. disDir + "**/*.asp"
  192. ],
  193. overwrite: true,
  194. replacements: [
  195. {
  196. from: /utf-8/gi,
  197. to: "gbk"
  198. }
  199. ]
  200. },
  201. demo: {
  202. src: disDir + "index.html",
  203. overwrite: true,
  204. replacements: [
  205. {
  206. from: /\.\.\//gi,
  207. to: ""
  208. },
  209. {
  210. from: "editor_api.js",
  211. to: packageJson.name + ".all.min.js"
  212. }
  213. ]
  214. },
  215. gbkasp: {
  216. src: [disDir + "asp/*.asp"],
  217. overwrite: true,
  218. replacements: [
  219. {
  220. from: /65001/gi,
  221. to: "936"
  222. }
  223. ]
  224. }
  225. },
  226. clean: {
  227. build: {
  228. src: [
  229. disDir + "jsp/src",
  230. disDir + "*/upload",
  231. disDir + ".DS_Store",
  232. disDir + "**/.DS_Store",
  233. disDir + ".git",
  234. disDir + "**/.git"
  235. ]
  236. }
  237. }
  238. });
  239. grunt.loadNpmTasks("grunt-text-replace");
  240. grunt.loadNpmTasks("grunt-contrib-concat");
  241. grunt.loadNpmTasks("grunt-contrib-cssmin");
  242. grunt.loadNpmTasks("grunt-contrib-uglify");
  243. grunt.loadNpmTasks("grunt-contrib-copy");
  244. grunt.loadNpmTasks("grunt-transcoding");
  245. grunt.loadNpmTasks("grunt-contrib-clean");
  246. grunt.registerTask("default", "UEditor build", function() {
  247. var tasks = [
  248. "concat",
  249. "cssmin",
  250. "uglify",
  251. "copy:base",
  252. "copy:" + server,
  253. "copy:demo",
  254. "replace:demo",
  255. "clean"
  256. ];
  257. if (encode === "gbk") {
  258. tasks.push("replace:fileEncode");
  259. if (server === "asp") {
  260. tasks.push("replace:gbkasp");
  261. }
  262. }
  263. tasks.push("transcoding");
  264. //config修改
  265. updateConfigFile();
  266. grunt.task.run(tasks);
  267. });
  268. function updateConfigFile() {
  269. var filename = "ueditor.config.js",
  270. file = grunt.file.read(filename),
  271. path = server + "/",
  272. suffix = server === "net" ? ".ashx" : "." + server;
  273. file = file.replace(/php\//ig, path).replace(/\.php/ig, suffix);
  274. if (encode == "gbk") {
  275. file = file.replace(/utf-8/gi, "gbk");
  276. }
  277. //写入到dist
  278. if (grunt.file.write(disDir + filename, file)) {
  279. grunt.log.writeln("config file update success");
  280. } else {
  281. grunt.log.warn("config file update error");
  282. }
  283. }
  284. };