Gruntfile.js 8.1 KB

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