1 | var prj = require('./project.js');
|
2 | var fs = require('fs');
|
3 | var path = require('path');
|
4 | var walk = require('./util/walk.js');
|
5 | var _ = require('underscore');
|
6 | var J = require("juicer");
|
7 | var conf = require('./config.js');
|
8 | var debug = require('debug')('clam:mod');
|
9 | var templateCenter = require('./template.js');
|
10 | var mkdirp = require('mkdirp');
|
11 | var iconv = require('iconv-lite');
|
12 |
|
13 | var config = {
|
14 | metaDir: '.clam',
|
15 | metaFile : 'mod.json',
|
16 | suffix : ['vm', 'php', 'html'],
|
17 | templateDir : "../resource/mod/",
|
18 | assetsDir : "assets",
|
19 | coreName : "core",
|
20 | coreTemplate:"../resource/mod/core",
|
21 | headTemplate:"../resource/mod/head"
|
22 | };
|
23 | var appDir = path.resolve(__dirname);
|
24 |
|
25 | J.set("strip", false);
|
26 |
|
27 |
|
28 |
|
29 |
|
30 |
|
31 |
|
32 |
|
33 |
|
34 |
|
35 |
|
36 |
|
37 |
|
38 |
|
39 | exports.list = function() {
|
40 | var prjInfo = prj();
|
41 |
|
42 | var modsDir = path.join(conf.root(), prjInfo.modsDir);
|
43 | var metaFile = path.join(conf.root(), config.metaDir, config.metaFile);
|
44 | var modsFiles = walk.walkSync(modsDir);
|
45 | modsFiles = _.filter(modsFiles, function(file) {
|
46 | return _.any(config.suffix, function(value) {
|
47 |
|
48 | var fileSuffix = file.match(/.*\/.*\.(\w+)$/)[1];
|
49 | return fileSuffix == value;
|
50 | });
|
51 | });
|
52 |
|
53 |
|
54 | var metaInfo = conf.get('mod');
|
55 |
|
56 | var info = _.map(modsFiles, function(file) {
|
57 | var fileName = file.slice(modsDir.length+1, file.length);
|
58 | var modName = file.slice(modsDir.length+1, file.lastIndexOf('.'));
|
59 | var description = '';
|
60 | if(metaInfo){
|
61 | description = metaInfo[modName] ? metaInfo[modName].description : '';
|
62 | }
|
63 |
|
64 | return {
|
65 | name : modName,
|
66 | file : fileName,
|
67 | description : description
|
68 | };
|
69 | });
|
70 | return {succeed:true,
|
71 | msg:'获取模块信息',
|
72 | data:info
|
73 | };
|
74 | }
|
75 |
|
76 |
|
77 |
|
78 |
|
79 |
|
80 |
|
81 |
|
82 |
|
83 |
|
84 |
|
85 |
|
86 |
|
87 | var addMod = exports.add = function(modName, description, template) {
|
88 | var prjInfo = prj();
|
89 | var actions = [];
|
90 |
|
91 |
|
92 | var modFileName = computeExt(modName);
|
93 | if(modFileName.split('/').length === 1){
|
94 | var modNameSet = modFileName.replace(/\..*$/, '');
|
95 | modFileName = modNameSet + '/' + modFileName;
|
96 | }
|
97 | debug(modFileName);
|
98 |
|
99 | var modFilePath = path.join(conf.root(), prjInfo.modsDir, modFileName);
|
100 | if (fs.existsSync(modFilePath)) {
|
101 | return {
|
102 | succeed: false,
|
103 | msg: '已存在相同的模块,创建模块失败。',
|
104 | data: modFilePath
|
105 | };;
|
106 | }
|
107 |
|
108 |
|
109 | var modDir = path.join(modFilePath, '..');
|
110 | mkdirp.sync(modDir);
|
111 |
|
112 |
|
113 | var modDepsdirs = modFileName.split('/');
|
114 | var dir = '', j = 0;
|
115 | for(var i = 0; i < modDepsdirs.length-1; i++){
|
116 | dir = path.join(conf.root(), prjInfo.modsDir);
|
117 | j = 0;
|
118 | while(j <= i ){
|
119 | dir = path.join(dir, modDepsdirs[j]);
|
120 | j++;
|
121 | }
|
122 | debug('修改目录权限%s', dir);
|
123 | fs.chmodSync(dir,'775');
|
124 | }
|
125 |
|
126 |
|
127 | if(!template){
|
128 | template = 'default';
|
129 | }
|
130 | var userHome = process.env.HOME || process.env.HOMEPATH;
|
131 | var templateDir = path.join(userHome, '.clamconfig/templates', template,'mod');
|
132 | if(!fs.existsSync(templateDir)){
|
133 | return {
|
134 | succeed: false,
|
135 | msg: '模板'+template+'不存在',
|
136 | data: ''
|
137 | };
|
138 | }
|
139 |
|
140 |
|
141 | var bn = modDepsdirs[modDepsdirs.length-1];
|
142 | var baseModName = path.basename(bn, path.extname(bn));
|
143 | var modInfo = {
|
144 | name: baseModName,
|
145 | description: description
|
146 | };
|
147 | var param = {project: prjInfo, mod: modInfo};
|
148 | templateCenter.convert(templateDir, modDir, param, baseModName);
|
149 |
|
150 |
|
151 | var metaInfo = conf.get('mod');
|
152 | if(!metaInfo){
|
153 | metaInfo = {};
|
154 | }
|
155 |
|
156 | metaInfo[modFileName.replace(/\.(html)$/,'')] = modInfo;
|
157 | conf.set('mod', metaInfo);
|
158 | actions.push({action:'更新模块元信息', content: '.clam/mod.json'});
|
159 |
|
160 |
|
161 | return {
|
162 | succeed: true,
|
163 | msg: '模块创建',
|
164 | data: actions
|
165 | };
|
166 | }
|
167 |
|
168 |
|
169 |
|
170 |
|
171 | exports.del = function (data) {
|
172 | var prjInfo = prj();
|
173 | var dirName = path.dirname(data.name);
|
174 | var fileName = path.basename(data.name);
|
175 | var modDir = path.join(conf.root(), prjInfo.modsDir, dirName);
|
176 | var modPath = path.join(conf.root(), prjInfo.modsDir, dirName, fileName+'.'+prjInfo.pageext[0]);
|
177 | var actions = [];
|
178 | if(!fs.existsSync(modPath)){
|
179 | return {
|
180 | succeed:false,
|
181 | msg:modPath+"文件不存在"
|
182 | }
|
183 | }
|
184 |
|
185 | fs.unlinkSync(modPath);
|
186 | actions.push({action:'删除文件', content: modPath});
|
187 |
|
188 | var list = fs.readdirSync(modDir);
|
189 | list = _.filter(list,function(file){
|
190 | return _.any(config.suffix, function(value) {
|
191 | return file.lastIndexOf(value) !== -1;
|
192 | });
|
193 | });
|
194 | if(list.length==0){
|
195 | walk.rmrfSync(modDir);
|
196 | actions.push({action:'删除文件目录', content: modDir});
|
197 | }
|
198 | return {succeed:true,
|
199 | msg:'删除页面',
|
200 | data:actions
|
201 | };
|
202 |
|
203 | }
|
204 |
|
205 |
|
206 |
|
207 |
|
208 | exports.addCore = function(){
|
209 | var prjInfo = prj();
|
210 | var name = config.coreName;
|
211 |
|
212 | addMod({
|
213 | name:name,
|
214 | description:"项目核心模块,包含一些不依赖任何库的JS方法和页头页尾等通用模块",
|
215 | addjs:true,
|
216 | addcss:true,
|
217 | jsns:prjInfo.jsns
|
218 | },{
|
219 | templateDir : config.coreTemplate
|
220 | });
|
221 |
|
222 | addMod({
|
223 | name:name+"/head",
|
224 | description:"项目页面head标签部分内容",
|
225 | addjs:false,
|
226 | addcss:false
|
227 | },{
|
228 | templateDir : config.headTemplate
|
229 | });
|
230 | }
|
231 |
|
232 |
|
233 | function computeExt(str) {
|
234 | var prjInfo = prj();
|
235 | if ((/\.(vm|php|html|htm)$/).test(str)) {
|
236 | return str;
|
237 | }
|
238 | return str.replace(/\..*$/, "") + '.' + prjInfo.pageext[0];
|
239 | }
|
240 |
|
241 |
|
242 |
|
243 |
|
244 |
|
245 |
|
246 |
|