UNPKG

7.8 kBJavaScriptView Raw
1var fs = require('fs');
2var path = require('path');
3var mkdirp = require('mkdirp');
4var J = require("juicer");
5var walk = require('./util/walk.js');
6var _ = require('underscore');
7var iconv = require('iconv-lite');
8var conf = require('./config.js');
9var util = require('util');
10var debug = require('debug')('clam:page');
11var templateCenter = require('./template.js');
12
13var config = {
14 metaDir: '.clam',
15 suffix:['vm', 'php' , 'html'],
16 metaFile:'page.json',
17 templateDir:"../resource/page",
18 template:'template.html'
19};
20
21J.set("strip", false);
22/**
23 * 返回pages目录中的page,pageDir目录中的page需要递归获取。
24 *
25 * 如目录结果如下:
26 * tuipiao/index.html
27 * tuipiao/xxxReason/suceed.html
28 * tuipiao/xxxReason/suceed.html
29 * 应该返回三个页面,分别为这三个页面的全路经。
30 *
31 * 根据每个返回页面名获取页面额外信息,如:上线后URL
32 * 每个页面可以默认有一个同名js、css文件。
33 *
34 * page [js/css/img/header]
35 * mod [js/css/img]
36 * widget
37 *
38 */
39exports.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 //过滤掉非html文件
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 * 页面创建时要根据所选框架(jquery/yui/kissy),按照模板生成页面。
93 * info 格式如下:
94 {
95 "url":"abcde/abc",
96 "name":"abab/ddd",
97 "description":"cdcd",
98 "lib":["KISSY", "JQUERY", "YUI"]
99 }
100 */
101function 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 //创建模块HTML文件目录
124 var pageDir = path.join(pagePath, '..');
125 mkdirp.sync(pageDir);
126
127 //修改目录权限为775
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;//兼容windows
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 //记录page元信息
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
186exports.add = add;
187
188/**
189 * 修改页面对应的url
190 */
191exports.update = function () {
192
193}
194
195/**
196 * 删除页面
197 */
198exports.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//设置页面文件的扩展名,如果不是以下列表的,就改为.vm
222function computeExt(str) {
223 if ((/\.(html)$/).test(str)) {
224 return str;
225 }
226 //return str.replace(/\..*$/, "") + '.html';
227 return str + ".html";
228}
229
230//获取页面信息
231function 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 //页面的lib为空的话则取项目的lib
244 var jsLib = (info.lib && info.lib.length) > 0 ? info.lib : prjInfo.lib;
245
246 //处理css reset路径
247 cssBase = "http://a.tbcdn.cn/??p/global/1.0/global-min.css";
248
249 //处理js库
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 //console.log(JSON.stringify(data));
264 return data
265}
266/*
267function writeFile(path,str){
268 var prjInfo = conf.get('project');
269 var c = iconv.encode(str,prjInfo.charset[0]);
270 fs.writeFileSync(path, c);
271 fs.chmodSync(path, "777");
272}*/