1 | var fs = require('fs');
|
2 | var path = require('path');
|
3 | var mkdirp = require('mkdirp');
|
4 | var J = require("juicer");
|
5 | var walk = require('./util/walk.js');
|
6 | var _ = require('underscore');
|
7 | var iconv = require('iconv-lite');
|
8 | var conf = require('./config.js');
|
9 | var util = require('util');
|
10 | var debug = require('debug')('clam:page');
|
11 | var templateCenter = require('./template.js');
|
12 |
|
13 | var config = {
|
14 | metaDir: '.clam',
|
15 | suffix:['vm', 'php' , 'html'],
|
16 | metaFile:'page.json',
|
17 | templateDir:"../resource/page",
|
18 | template:'template.html'
|
19 | };
|
20 |
|
21 | J.set("strip", false);
|
22 |
|
23 |
|
24 |
|
25 |
|
26 |
|
27 |
|
28 |
|
29 |
|
30 |
|
31 |
|
32 |
|
33 |
|
34 |
|
35 |
|
36 |
|
37 |
|
38 |
|
39 | exports.list = function () {
|
40 | var prjInfo = conf.get('project');
|
41 | var root = conf.root();
|
42 | var pageDir = path.join(root, 'src');
|
43 | var metaFile = path.join(root, config.metaDir, config.metaFile);
|
44 | var pageFiles = walk.walkSync(pageDir);
|
45 |
|
46 |
|
47 | var filter_page = new RegExp(path.join(root, prjInfo.pagesDir).replace(/\\/g, '/')+".+\\.html$"),
|
48 | filter_root = new RegExp(path.join(root, prjInfo.pagesDir+"/..").replace(/\\/g, '/')+"/([^\/]*?)\\.html$");
|
49 | pageFiles = _.filter(pageFiles, function (file) {
|
50 | if (file.match(filter_page)) {
|
51 | return true;
|
52 | }
|
53 | else {
|
54 | return file.match(filter_root) ? true : false;
|
55 | }
|
56 | });
|
57 | debug('页面%s', util.inspect(pageFiles));
|
58 | pageFiles = pageFiles.sort(function (a, b) {
|
59 | return a < b;
|
60 | });
|
61 | var metaInfo = conf.get('page');
|
62 | var info = _.map(pageFiles, function (file) {
|
63 | var pageName = file.slice(pageDir.length+1, file.lastIndexOf('.'));
|
64 | var pageFileName = file.slice(pageDir.length+1, file.length);
|
65 | var description = '';
|
66 | var onlineurl = '';
|
67 | var pagelib = '';
|
68 | if(metaInfo){
|
69 | description = metaInfo[pageName] ? metaInfo[pageName].description : '';
|
70 | onlineurl = metaInfo[pageName] ? metaInfo[pageName].url : '';
|
71 | pagelib = metaInfo[pageName] ? metaInfo[pageName].lib : '';
|
72 | }
|
73 |
|
74 | return {
|
75 | name: pageName,
|
76 | file: pageFileName,
|
77 | description: description,
|
78 | url: onlineurl,
|
79 | lib: pagelib,
|
80 | fileExt: 'html'
|
81 | };
|
82 | });
|
83 | return {
|
84 | succeed:true,
|
85 | msg:'获取页面信息',
|
86 | data:info
|
87 | };
|
88 | }
|
89 |
|
90 |
|
91 |
|
92 |
|
93 |
|
94 |
|
95 |
|
96 |
|
97 |
|
98 |
|
99 |
|
100 |
|
101 | function add(name, url, description, template) {
|
102 | var prjInfo = conf.get('project');
|
103 | var root = conf.root();
|
104 | var metaFile = path.join(root, config.metaDir, config.metaFile);
|
105 | var actions = [];
|
106 |
|
107 | var pageFileName = computeExt(name);
|
108 |
|
109 | |
110 |
|
111 |
|
112 |
|
113 | var pagePath = path.join(root, prjInfo.pagesDir, pageFileName);
|
114 |
|
115 | if (fs.existsSync(pagePath)) {
|
116 | return {succeed:false,
|
117 | msg:'存在相同的页面,创建页面失败。',
|
118 | data:pagePath
|
119 | };
|
120 | }
|
121 | console.log("Creating page:"+pagePath);
|
122 |
|
123 |
|
124 | var pageDir = path.join(pagePath, '..');
|
125 | mkdirp.sync(pageDir);
|
126 |
|
127 |
|
128 | var pageDepsdirs = pageFileName.split('/');
|
129 | var dir = '', j=0;
|
130 | for(var i = 0; i < pageDepsdirs.length-1; i++){
|
131 | dir = path.join(conf.root(), prjInfo.pagesDir);
|
132 | j = 0;
|
133 | while(j <= i ){
|
134 | dir = path.join(dir, pageDepsdirs[j]);
|
135 | j++;
|
136 | }
|
137 | debug('修改目录权限%s', dir);
|
138 | fs.chmodSync(dir,'775');
|
139 | }
|
140 |
|
141 |
|
142 | if(!template){
|
143 | template = 'default';
|
144 | }
|
145 | var userHome = process.env.HOME || process.env.HOMEPATH;
|
146 | var templateDir = path.join(userHome, '.clamconfig/templates', template,'page');
|
147 | if(!fs.existsSync(templateDir)){
|
148 | return {
|
149 | succeed: false,
|
150 | msg: '模板'+template+'不存在',
|
151 | data: ''
|
152 | };
|
153 | }
|
154 |
|
155 |
|
156 | var bn = pageDepsdirs[pageDepsdirs.length-1];
|
157 | var pageName = path.basename(bn, path.extname(bn));
|
158 | var pageInfo = {
|
159 | name: pageName,
|
160 | url: url,
|
161 | description: description
|
162 | };
|
163 | debug('变量信息:%s', util.inspect(pageInfo));
|
164 | var param = {project: prjInfo, page: pageInfo};
|
165 | templateCenter.convert(templateDir, pageDir, param, pageName);
|
166 |
|
167 | actions.push({action:'创建页面', content: pagePath});
|
168 |
|
169 |
|
170 | var metaInfo = conf.get('page');
|
171 | if(!metaInfo){
|
172 | metaInfo = {};
|
173 | }
|
174 |
|
175 | metaInfo[pageFileName.replace(/\.(html)$/,'')] = pageInfo;
|
176 | conf.set('page', metaInfo);
|
177 | actions.push({action:'更新页面元信息', content: metaFile});
|
178 |
|
179 | return {
|
180 | succeed: true,
|
181 | msg: '创建页面',
|
182 | data: actions
|
183 | };
|
184 | }
|
185 |
|
186 | exports.add = add;
|
187 |
|
188 |
|
189 |
|
190 |
|
191 | exports.update = function () {
|
192 |
|
193 | }
|
194 |
|
195 |
|
196 |
|
197 |
|
198 | exports.del = function (data) {
|
199 | var prjInfo = conf.get('project');
|
200 | var root = conf.root();
|
201 | var dirName = path.dirname(data.name);
|
202 | var fileName = path.basename(data.name);
|
203 | var pageDir = path.join(root, 'src', dirName);
|
204 | var pagePath = path.join(root, 'src', dirName, fileName + '.html');
|
205 | var actions = [];
|
206 |
|
207 | fs.unlinkSync(pagePath);
|
208 | actions.push({action:'删除页面文件', content: pagePath});
|
209 |
|
210 | var list = fs.readdirSync(pageDir);
|
211 | if(list.length==0 && path.basename(pageDir) != path.basename('src')){
|
212 | fs.rmdirSync(pageDir);
|
213 | actions.push({action:'删除页面文件目录', content: pagePath});
|
214 | }
|
215 | return {succeed:true,
|
216 | msg:'删除页面',
|
217 | data:actions
|
218 | };
|
219 | }
|
220 |
|
221 |
|
222 | function computeExt(str) {
|
223 | if ((/\.(html)$/).test(str)) {
|
224 | return str;
|
225 | }
|
226 |
|
227 | return str + ".html";
|
228 | }
|
229 |
|
230 |
|
231 | function makePageParam(info) {
|
232 | var cssBase, jsBase, data;
|
233 | var prjInfo = conf.get('project');
|
234 |
|
235 | var libPath = {
|
236 | JQUERY:"jquery",
|
237 | ZEPTO:"zepto",
|
238 | KISSY:"s/kissy/1.3.0rc/kissy-min.js",
|
239 | YUI:"s/yui/3.5.1/build/yui/yui-min.js",
|
240 | SEAJS:"seajs"
|
241 | };
|
242 |
|
243 |
|
244 | var jsLib = (info.lib && info.lib.length) > 0 ? info.lib : prjInfo.lib;
|
245 |
|
246 |
|
247 | cssBase = "http://a.tbcdn.cn/??p/global/1.0/global-min.css";
|
248 |
|
249 |
|
250 | jsBase = "http://a.tbcdn.cn/??";
|
251 | _.each(jsLib, function (v, i) {
|
252 | jsBase += libPath[v] + ","
|
253 | });
|
254 | jsBase = jsBase.slice(0, -1);
|
255 | data = {
|
256 | cssBase:cssBase,
|
257 | jsBase:jsBase,
|
258 | title:prjInfo.description,
|
259 | description:info.description,
|
260 | pageext: 'html',
|
261 | charset: prjInfo.charset[0]
|
262 | };
|
263 |
|
264 | return data
|
265 | }
|
266 |
|
267 |
|
268 |
|
269 |
|
270 |
|
271 |
|
272 |
|