<commit_before>/*!
 * yo
 * Copyright(c) 2015 Hbomb
 * MIT Licensed
 */

'use strict';

/**
 * 模块依赖
 * @private
 */

var debug = require('debug')('mid-pjax');
var _ = require('lodash');
var md5 = require('MD5');

/**
 * pjax插件
 * @param  {Request} req 请求对象
 * @param  {Response} res 返回对象
 * @return {void}
 */
module.exports = function(req, res) {
    var accept = req.headers.accept || "",
        view, key;

    if (!req.input || req.input.error) {
        if (accept.indexOf("json") > -1) {
            res.status(404).send(JSON.stringify({
                code: 404,
                message: req.input ? req.input.message : ''
            }));
        } else {
            res.locals = {
                reloadUrl: req.url
            };
            res.render('error/error');
        }
        return;
    }

    view = req.input.config.view || getView(req.input.config.route);

    res.locals = res.proxyData;


    if (accept.indexOf("json") > -1) {
        res.send(JSON.stringify(res.proxyData));
        return;
    } else {
        if (req.headers['x-pjax']) {
            res.locals.layout = false;
        }
        key = genkey(res.locals);

        getPageCache(key, res, function(err, html) {
            if (!err && html) {
                debug('from pagecache :' + key + ' !');
                res.send(html);
                return;
            } else if (!html) {
                res.render(view, function(err, str) {
                    if (err) return req.next(err);
                    debug('save pagecache :' + key);
                    setPageCache(key, str, res);
                    res.send(str);
                    return;
                });
            } else {
                debug('view render err :' + err);
                return req.next(err);
            }
        });

    }
};
/**
 * 生成key
 * @private
 * @param  {object} data 需要序列化的界面数据
 * @return {string}      key
 */
function genkey(data) {
    return 'pagecache:' + md5(JSON.stringify(data));
}

/**
 * 获取页面缓存
 * @private
 * @param  {string}   key     键名
 * @param  {Response}   res   返回
 * @param  {Function} callback 回调
 */
function getPageCache(key, res, callback) {
    if (res.getCache) {
        res.getCache(key, function(err, html) {
            callback(err, html);
        });
    } else {
        callback(null, false);
    }
}

/**
 * 设置页面缓存
 * @private
 * @param {String} key  键名
 * @param {String} html 需要缓存的html
 * @param {Response} res 返回
 */
function setPageCache(key, html, res) {
    if (res.setCache) {
        res.setCache(key, html);
    }
}

/**
 * 得到默认的视图
 * @param  {string} 路由跳转
 * @return {string} 返回默认路由
 */
function getView(route) {<commit_msg>不用redis的缓存pagecache<commit_after>/*!
 * yo
 * Copyright(c) 2015 Hbomb
 * MIT Licensed
 */

'use strict';

/**
 * 模块依赖
 * @private
 */

var debug = require('debug')('mid-pjax');
var _ = require('lodash');
var md5 = require('MD5');
var pagecache = {};
/**
 * pjax插件
 * @param  {Request} req 请求对象
 * @param  {Response} res 返回对象
 * @return {void}
 */
module.exports = function(req, res) {
    var accept = req.headers.accept || "",
        view, key;

    if (!req.input || req.input.error) {
        if (accept.indexOf("json") > -1) {
            res.status(404).send(JSON.stringify({
                code: 404,
                message: req.input ? req.input.message : ''
            }));
        } else {
            res.locals = {
                reloadUrl: req.url
            };
            res.render('error/error');
        }
        return;
    }

    view = req.input.config.view || getView(req.input.config.route);

    res.locals = res.proxyData;


    if (accept.indexOf("json") > -1) {
        res.send(JSON.stringify(res.proxyData));
        return;
    } else {
        if (req.headers['x-pjax']) {
            res.locals.layout = false;
        }
        key = genkey(res.locals);

        getPageCache(key, res, function(err, html) {
            if (!err && html) {
                debug('from pagecache :' + key + ' !');
                res.send(html);
                return;
            } else if (!html) {
                res.render(view, function(err, str) {
                    if (err) return req.next(err);
                    debug('save pagecache :' + key);
                    setPageCache(key, str, res);
                    res.send(str);
                    return;
                });
            } else {
                debug('view render err :' + err);
                return req.next(err);
            }
        });

    }
};
/**
 * 生成key
 * @private
 * @param  {object} data 需要序列化的界面数据
 * @return {string}      key
 */
function genkey(data) {
    return 'pagecache:' + md5(JSON.stringify(data));
}

/**
 * 获取页面缓存
 * @private
 * @param  {string}   key     键名
 * @param  {Response}   res   返回
 * @param  {Function} callback 回调
 */
function getPageCache(key, res, callback) {
    // if (res.getCache) {
    //     res.getCache(key, function(err, html) {
    //         callback(err, html);
    //     });
    // } else {
    //     callback(null, false);
    // }
    callback(null, pagecache[key]);
}

/**
 * 设置页面缓存
 * @private
 * @param {String} key  键名
 * @param {String} html 需要缓存的html
 * @param {Response} res 返回
 */
function setPageCache(key, html, res) {
    // if (res.setCache) {
    //     res.setCache(key, html);
    // }
    pagecache[key] = html;
}

/**
 * 得到默认的视图
 * @param  {string} 路由跳转
 * @return {string} 返回默认路由
 */
function getView(route) {
{'fraction_non_alphanumeric': 0.15928231417063346, 'fraction_numerical': 0.005492493592090809, 'mean_word_length': 1.6661786237188874, 'pattern_counts': {'":': 0, '<': 3, '<?xml version=': 0, '>': 7, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '569774', 'n_tokens_mistral': 1892, 'n_tokens_neox': 1864, 'n_words': 372}