Gruntfile.js 8.3 KB

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