Пример #1
0
    ], function () {

        program.pkg.clean = program.clean;
        if (program.pkg.clean) {
            shelljs.rm(path.join(process.env.PEACHES_HOME, 'hash.json'));
        }
        if (typeof program.retina !== "undefined" && program.retina !== false) {
            program.pkg.retina = !!program.retina;

        }
        if (program.pkg.retina) {
            logger.info('支持Retina显示');
        }
        cli.main(program.pkg);
        if (program.pkg.autoReload) {
            logger.info('启动autoReload');

            watchOutput();
            fs.watchFile(program.pkgFile, function (curr, prev) {
                if (curr.mtime.getTime() !== prev.mtime.getTime()) {
                    program.pkg = {};
                    watchFileList.forEach(function (file) {
                        fs.unwatchFile(file, watchFile);
                    });
                    watchFileList = [];
                    watchOutput();
                    main();
                }
            });
        }
    });
Пример #2
0
 async.forEach(image_urls, function (image_url, next) {
     var image = self.images[image_url], match, image_name;
     match = image_url.match(self.options.onlineRegex);
     if (match) {
         // 如果图片url带有参数,那么指定一个随机的图片名称
         image_name = md5(image_url);
         //image_name 图片保存的完整路径
         image_name = path.join(self.peaches.options.server.tmp, '/' + image_name + '.' + self.images[image_url].extname);
         if (fs.existsSync(image_name) && !self.peaches.options.clean) {
             logger.debug('存在图片:%s,不再下载', image_url);
             image.file = image_name;
             next();
         }
         else {
             logger.debug('下载图片:%s', image_url);
             download(image_url, image_name, function (err, file) {
                 if (err) {
                     logger.warn('下载文件出现错误');
                     logger.error('请检测文件:%s 是否存在。程序退出!', image_url);
                     process.exit(1);
                 }
                 image.file = file;
                 next();
             });
         }
     }
     //如果是本地地址,需要将相对地址转换成绝对地址
     else {
         image.file = path.join(self.peaches.options.baseDir, image_url);
         next();
     }
 }, function () {
Пример #3
0
 }).on('error', function (err) {
     if (err && err.code === 'EADDRINUSE') {
         logger.error('端口号:%s 被占用。静态服务器无法启动', server.port);
         logger.info('是否还有另外一个Peaches在运行?');
         process.exit(1);
     }
 });
Пример #4
0
 async.forEach(image_urls, function (image_url, next) {
     var image = self.images[image_url], match, image_name;
     match = image_url.match(self.options.onlineRegex);
     if (match) {
         // 如果图片url带有参数,那么指定一个随机的图片名称
         image_name = md5(image_url);
         //image_name 图片保存的完整路径
         image_name = path.join(self.options.server.tmp, '/' + image_name + '.' + self.images[image_url].extname);
         if (fs.existsSync(image_name) && !self.options.clean) {
             logger.debug('存在图片:%s,不再下载', image_url);
             image.file = image_name;
             next();
         }
         else {
             logger.debug('下载图片:%s', image_url);
             download(image_url, image_name, function (err, file) {
                 if (err) {
                     err = new errors.CanNotDownloadFile('无法下载: ' + image_url);
                     asyncError.push(err);
                     return next();
                 }
                 image.file = file;
                 next();
             });
         }
     }
     //如果是本地地址,需要将相对地址转换成绝对地址
     else {
         image.file = path.join(self.options.baseDir, image_url);
         next();
     }
 }, function () {
Пример #5
0
        async.forEach(this.packers, function (packer, callback) {
            index += 1;
            packer.index = index;
            /**
             * 如果没有背景图片,则不进行图片的拼接
             */
            if (packer.blocks.length === 0) {
                return callback();
            }

            try {
                Server = require('./plugin/' + self.options.server.name);
            }
            catch (e) {
                logger.error('无法加载:%s,使用默认配置', self.options.server.name);
                logger.error('error:%s', e);
                Server = require('./plugin/local');
            }

            packer.server = new Server(self.options.spriteName + '-' + index, self.options.server);
            packer.token = packer.server.token + index + self.options.spriteName;
            self.drawImage(packer);
            packer.server.write(packer.canvas, function (err) {
                return callback();
            });
        }, function () {
Пример #6
0
function init(program, next) {
    'use strict';
    var pkg = program.pkg;
    process.env.PEACHES_HOME = path.join(process.env.HOME, '.peaches');
    var defaultPkg = path.join(process.env.PEACHES_HOME, 'package.json');

    // 读取 系统默认package.json;
    if (!fs.existsSync(defaultPkg)) {
        try {
            //TODO: 系统升级更新package.json时的处理。
            shelljs.mkdir('-p', path.join(process.env.PEACHES_HOME, 'images'));
            shelljs.mkdir('-p', path.join(process.env.PEACHES_HOME, 'tmp'));
            shelljs.cp(path.resolve(__dirname, './package.json'), defaultPkg);
        }
        catch (e) {
            logger.error('无法创建系统目录:error:%s', e);
        }
    }
    // 设置pkg为系统默认配置
    program.pkg = require(defaultPkg);
    pkg = path.resolve(pkg);

    if (pkg !== './package.json') {
        try {
            pkg = fs.readFileSync(pkg);
        } catch (e) {
            logger.error('无法读取package.json,系统退出!');
            process.exit(1);
        }

        try {
            pkg = JSON.parse(pkg);
        } catch (ex) {
            logger.error('package.json 定义似乎有问题,检查一下!');
            process.exit(1);
        }
        program.pkg = _.extend(program.pkg, pkg);
    }
    // 默认加载当前目录下的配置。
    else {
        var exists = true;
        try {
            pkg = fs.readFileSync(pkg);
        } catch (e) {
            exists = false;
        }

        if (exists) {
            try {
                pkg = JSON.parse(pkg);
            } catch (ex) {
                logger.error('package.json 定义似乎有问题,检查一下!');
                process.exit(1);
            }
            program.pkg = _.extend(program.pkg, pkg);
        }
    }
    return next();
}
Пример #7
0
 fs.writeFile(dist, styleText, function (err) {
     if (err) {
         logger.error('%s处理错误;Error:%s', dist, err);
     }
     logger.debug('写入样式:', dist);
     logger.end('处理结束');
     callback();
 });
Пример #8
0
 download(image_url, image_name, function (err, file) {
     if (err) {
         logger.warn('下载文件出现错误');
         logger.error('请检测文件:%s 是否存在。程序退出!', image_url);
         process.exit(1);
     }
     image.file = file;
     next();
 });
Пример #9
0
  render: function(obj) {
    var filepath = pathlib.relative(
      this.storage.config.output, obj.destination
    );
    filepath = filepath.toLowerCase();
    obj.params = obj.params || {};
    obj.params.writer = {
      name: this.writerName,
      filepath: filepath
    };
    obj.params.config = this.storage.config;

    // swig don't support context functions
    obj.params = this.registerContextFunctions(obj.params);

    var tpl = swig.compileFile(obj.template);
    var html = tpl.render(obj.params);

    if (filepath.slice(-1) === '/') {
      filepath += 'index.html';
    } else if (!/\.(ht|x)ml$/.test(filepath)) {
      filepath += '.html';
    }
    logging.debug('writing content to %s', filepath);

    var destination = path.join(this.storage.config.output, filepath);
    this.write(destination, html);

    // swig don't support context filter, we can only inject code here.
    if (obj.iframes && !_.isEmpty(obj.iframes)) {
      this.writeIframes(destination, obj.iframes);
    }
  },
Пример #10
0
    }, function (next) {
        /**
         * 处理 图片排序。
         * 1. 如果命令行中没有sort,那么使用config的配置。
         * 2. 如果命令行中有sort,那么覆盖config配置。
         * 3. 都没有设置,默认设置为 h,纵向排序。
         */
        var sortList = ['h', 'v'];
        if (typeof program.sort !== 'undefined') {
            program.pkg.sort = program.sort;
        }

        if (sortList.indexOf(program.pkg.sort) > -1) {
            return next();
        }

        logger.warn('输入的图片排序 "' + program.pkg.sort + '" 格式不正确,请选择:');
        program.choose(sortList, function (i) {
            program.confirm('您选择了将图片图片排序为 "' + sortList[i] + '"', function (ok) {
                if (!ok) {
                    logger.warn('退出');
                    process.exit(1);
                }
                program.pkg.sort = sortList[i];
                next();
            });
        });
    }, function (next) {
Пример #11
0
 start: function() {
   logging.start('Starting %s', this.writerName);
   if (this.setup) {
     this.setup();
   }
   return this;
 },
Пример #12
0
        }, function (err, rsp, body) {
            if (err) {
                logger.error(err);
                return next(err);
            }
            var encode = 'utf-8';
            var content_type = rsp.headers['content-type'] || '';

            var match = content_type.match(/charset=(.*)$/);
            if (match) {
                encode = match[1];
            }
            page = iconv.decode(body, encode).trim();
            $ = cheerio.load(page);
            var inputs = {};
            $('#J_UploadForm input').each(function (idx, input) {
                switch (input.attribs.name) {
                    case 'nick':
                        inputs['nick'] = encodeURIComponent(input.attribs.value);
                        break;
                    case 'force_opt':
                        inputs['force_opt'] = encodeURIComponent(1);
                        break;
                    default:
                        inputs[input.attribs.name] = input.attribs.value;
                        break;
                }

            });
            next(null, inputs);
        });
Пример #13
0
exports.getSwigConfig = function(config) {
  var swigConfig = {};
  swigConfig.filters = config.filters || {};

  _.extend(swigConfig.filters, filters.filters);
  swigConfig.contextfilters = config.contextfilters || {};
  _.extend(swigConfig.contextfilters, filters.contextfilters);
  swigConfig.functions = config.functions || {};
  _.extend(swigConfig.functions, filters.functions);
  swigConfig.contextfunctions = config.contextfunctions || {};
  _.extend(swigConfig.contextfunctions, filters.contextfunctions);

  swigConfig.globals = swigConfig.globals || {};
  swigConfig.globals.system = require('../package.json');
  var theme;
  try {
    theme = require(path.join(config.theme, 'theme.js'));
  } catch (e) {
    logging.warn('There is no theme config file');
  }
  if (theme) {
    swigConfig.globals.theme = theme;
    _.extend(swigConfig.filters, theme.filters || {});
    _.extend(swigConfig.contextfilters, theme.contextfilters || {});
    _.extend(swigConfig.functions, theme.functions|| {});
    _.extend(swigConfig.contextfunctions, theme.contextfunctions|| {});
  }
  return swigConfig;
};
Пример #14
0
    }, function (next) {
        /**
         * 处理 format。
         * 1. 如果命令行中没有format,那么使用config的配置。
         * 2. 如果命令行中有format,那么覆盖config配置。
         * 3. 都没有设置,默认设置为 png8
         *
         */
        var formatList = ['png8', 'png24'];
        // 如果输入了 program.format ,覆盖配置
        if (typeof program.format !== 'undefined') {
            program.pkg.format = program.format;
        }

        if (formatList.indexOf(program.pkg.format) > -1) {
            // 如果 config.format 配置正确,next
            return next();
        }

        // 剩余的情况为:输入格式错误的情况,需要提醒用户。
        logger.warn('输入的图片 "' + program.pkg.format + '" 格式不正确,请选择:');
        program.choose(formatList, function (i) {
            program.confirm('您选择了将图片压缩为 "' + formatList[i] + '" 格式', function (ok) {
                if (!ok) {
                    logger.warn('退出');
                    process.exit(1);
                }

                program.pkg.format = formatList[i];
                next();
            });
        });

    }, function (next) {
Пример #15
0
 async.series([function (next) {
     /**
      * 配置logger
      */
     program.pkgFile = program.pkg;
     logger.config(program);
     next();
 }, function (next) {
Пример #16
0
 scp.on('exit', function (code) {
     if (self.options.baseURI.slice(-1) !== '/') {
         self.options.baseURI += '/';
     }
     self.url = self.options.baseURI + name;
     logger.info('生成图片:%s', self.url);
     next(null, self.url);
 });
Пример #17
0
 program.confirm('您选择了将图片图片排序为 "' + sortList[i] + '"', function (ok) {
     if (!ok) {
         logger.warn('退出');
         process.exit(1);
     }
     program.pkg.sort = sortList[i];
     next();
 });
Пример #18
0
 program.confirm('您选择了将图片托管模式为 "' + modelList[i] + '"', function (ok) {
     if (!ok) {
         logger.warn('退出');
         process.exit(1);
     }
     program.pkg.model = modelList[i];
     next();
 });
Пример #19
0
function initSwig(obj) {
  if (isInitSwig) return;
  obj.swigConfig = obj.swigConfig || {};
  _.extend(obj.swigConfig, obj.config.swigConfig || {});
  var swigConfig = obj.swigConfig;

  // find swig root
  if (!swigConfig.root) {
    swigConfig.root = [];
    var templates = path.join(process.cwd(), '_templates');
    if (fs.existsSync(templates)) swigConfig.root.push(templates);
    if (obj.config && obj.config.theme) {
      swigConfig.root.push(path.join(obj.config.theme, 'templates'));
    }
    if (!swigConfig.root.length) {
      logging.error('no theme is assigned.');
      process.exit(1);
    }
  }

  var key, func;
  // find swig filters
  swigConfig.filters = swigConfig.filters || {};
  for (key in swigConfig.filters) {
    func = swigConfig.filters[key];
    if (_.isString(func)) {
      func = utils.require(func);
    }
    swigConfig.filters[key] = func;
  }

  // register globals
  swigConfig.globals = swigConfig.globals || {};
  if (obj.resource) swigConfig.globals.resource = obj.resource;
  if (obj.config) swigConfig.globals.config = obj.config;

  // register functions
  for (key in swigConfig.functions) {
    func = swigConfig.functions[key];
    if (_.isString(func)) {
      func = utils.require(func);
    }
    swigConfig.globals[key] = func;
  }

  swig.init({
    autoescape: false,
    cache: false,
    allowErrors: false,
    encoding: swigConfig.encoding || 'utf8',
    filters: swigConfig.filters,
    globals: swigConfig.globals,
    root: swigConfig.root,
    tzOffset: swigConfig.tzOffset || 0
  });
  isInitSwig = true;
}
Пример #20
0
            program.confirm('您选择了将图片压缩为 "' + formatList[i] + '" 格式', function (ok) {
                if (!ok) {
                    logger.warn('退出');
                    process.exit(1);
                }

                program.pkg.format = formatList[i];
                next();
            });
Пример #21
0
exports.getConfig = function(prog) {
  var configfile, storage = {};
  if (!prog.config) {
    if (fs.existsSync('nico.js')) {
      logging.debug('use config file nico.js');
      configfile = path.join(process.cwd(), 'nico.js');
    } else if (fs.existsSync('nico.json')) {
      logging.debug('use config file nico.json');
      configfile = path.join(process.cwd(), 'nico.json');
    }
  } else {
    if (pathlib.isroot(prog.config)) {
      configfile = prog.config;
    } else {
      configfile = path.join(process.cwd(), prog.config);
    }
  }
  if (!configfile) {
    logging.warn('No config file is assigned, use default settings.');
    storage.config = {};
  } else {
    logging.info('Reading config file: %s', configfile);
    storage.config = parseConfig(configfile);
  }

  // merge config from config file and process args
  storage.config.theme = prog.theme || storage.config.theme;
  storage.config.permalink = prog.permalink || storage.config.permalink || '{{directory}}/{{filename}}.html';
  storage.config.source = prog.source || storage.config.source || 'content';
  storage.config.output = prog.output || storage.config.output || '_site';
  storage.config.args = prog.args;

  var config = storage.config;
  if (config.theme && !pathlib.isroot(config.theme)) {
    storage.config.theme = path.join(process.cwd(), config.theme);
  }
  storage.config.source = pathlib.abspath(config.source);
  storage.config.output = pathlib.abspath(config.output);
  return storage;
};
Пример #22
0
 }, function (next) {
     if (typeof program.autoReload !== 'undefined') {
         program.pkg.autoReload = program.autoReload;
     }
     if (typeof program.beautify !== 'undefined') {
         program.pkg.beautify = true;
     }
     if (typeof program.cloud !== 'undefined') {
         program.pkg.cloud = program.cloud;
         logger.info('云端模式:', program.pkg.cloud);
     }
     next();
 }, function (next) {
Пример #23
0
 }, function (next) {
     /**
      * 创建目录
      * */
     if (!fs.existsSync(program.pkg.server.root)) {
         try {
             shelljs.mkdir('-p', program.pkg.server.root);
         }
         catch (e) {
             logger.error('无法创建目录:%s', program.pkg.server.root);
             process.exit(1);
         }
     }
     if (!fs.existsSync(program.pkg.server.tmp)) {
         try {
             shelljs.mkdir('-p', program.pkg.server.tmp);
         }
         catch (e) {
             logger.error('无法创建目录:%s', program.pkg.server.tmp);
             process.exit(1);
         }
     }
     next();
 }
Пример #24
0
 var r = request.post(url.format(uploadUrl), function (err, rsp, body) {
     var result = JSON.parse(body);
     if (result.stat !== 'ok') {
         logger.error('文件上传失败:%s', result);
         return next(new Error('文件上传失败'));
     }
     var file = result.info[0];
     //uploadPath 会跟apimg目录,需要移除。
     self.url = file.uploadPath.replace('apimg/', '');
     self.url += file.newName;
     var baseUrl = url.parse(self.options.baseURI);
     baseUrl.pathname = path.join(baseUrl.pathname, self.url);
     self.url = url.format(baseUrl);
     next();
 });
Пример #25
0
function main(config) {
    "use strict";
    try {
        var canvas = require('canvas');
    }
    catch (e) {
        logger.warn('无法加载canvas,使用在线模式');
    }

    concat(config.output, function (err, styles) {
        var spriteName, styleText, dirname;

        function makePeaches(dist, spriteName, callback) {
            logger.start('正在处理', dist);
            styleText = styles[dist];
            peaches(styleText, config, function (err, styleText) {

                dirname = path.dirname(dist);
                if (!fs.existsSync(dirname)) {
                    fs.mkdirSync(dirname);
                }
                fs.writeFile(dist, styleText, function (err) {
                    if (err) {
                        logger.error('%s处理错误;Error:%s', dist, err);
                    }
                    logger.debug('写入样式:', dist);
                    logger.end('处理结束');
                    callback();
                });

            }, spriteName);
        }

        logger.start('开始主进程');
        var dists = [];
        for (var dist in styles) {
            if (styles.hasOwnProperty(dist)) {
                dists.push(dist);
            }
        }
        async.forEachSeries(dists, function (dist, callback) {
            spriteName = path.basename(dist).replace('.css', '');
            makePeaches(dist, spriteName, callback);
        }, function () {
            logger.end('全部完成');
        });
    });
}
Пример #26
0
        function makePeaches(dist, spriteName, callback) {
            logger.start('正在处理', dist);
            styleText = styles[dist];
            peaches(styleText, config, function (err, styleText) {

                dirname = path.dirname(dist);
                if (!fs.existsSync(dirname)) {
                    fs.mkdirSync(dirname);
                }
                fs.writeFile(dist, styleText, function (err) {
                    if (err) {
                        logger.error('%s处理错误;Error:%s', dist, err);
                    }
                    logger.debug('写入样式:', dist);
                    logger.end('处理结束');
                    callback();
                });

            }, spriteName);
        }
Пример #27
0
    }, function (next) {
        var modelList = ['local', 'alipay', 'scp', 'upyun', 'tfsdaily', 'tfs'];
        if (typeof program.model !== 'undefined') {
            program.pkg.model = program.model;
        }

        if (modelList.indexOf(program.pkg.model) > -1) {
            return next();
        }
        logger.warn('输入的图片托管模式 "' + program.pkg.model + '" 格式不正确,请选择:');
        program.choose(modelList, function (i) {
            program.confirm('您选择了将图片托管模式为 "' + modelList[i] + '"', function (ok) {
                if (!ok) {
                    logger.warn('退出');
                    process.exit(1);
                }
                program.pkg.model = modelList[i];
                next();
            });
        });
    }, function (next) {
Пример #28
0
 _init: function () {
     'use strict';
     if (this.options.cloud) {
         return this.cloud();
     }
     var canUseLocal = false;
     try {
         require('canvas');
         canUseLocal = true;
     }
     catch (e) {
         canUseLocal = false;
         logger.warn('无法加载canvas,使用云模式');
     }
     if (canUseLocal) {
         this.local();
     }
     else {
         this.cloud();
     }
 },
Пример #29
0
 bucket.downloadImageFile(function (err) {
     if (err) {
         asyncErrors.push(err);
         logger.error(err);
     }
     if (asyncErrors.length > 0) {
         return self.done(asyncErrors);
     }
     combine(bucket, options, bucket.stylesheet, function (err, packers, sheet) {
         stylesheet = sheet;
         if (packers) {
             packers.forEach(function (packer) {
                 if (packer.server) {
                     self.tokenList[packer.token] = packer.server.url;
                 }
             });
         }
         stylesheet.rules = stylesheet.rules.concat(mediasheet);
         self.pom.stylesheet = stylesheet;
         self.done(null);
     });
 });
Пример #30
0
 scp.stderr.on('data', function (data) {
     logger.info('正在上传图片..');
 });