cyra-pure
Version:
single page application view engine
101 lines (100 loc) • 2.96 kB
JavaScript
var config_1 = require('./config');
// type check
function isObject(o) {
return o instanceof Object;
}
/**
* encodeData
* @param {object} data - 需要encode的对象(键值对)
* @return {string}
*/
function encodeData(data) {
if (!isObject(data)) {
return '';
}
var dataSplit = config_1.default.URL_DATA_SPLIT;
var keys = Object.keys(data);
var keyValues = keys.map(function (key) {
return key + dataSplit.key + encodeURIComponent(data[key]);
});
return encodeURIComponent(keyValues.join(dataSplit.item));
}
/**
* decodeData
* @param {string} str - encodeData函数返回的string
* @return {object}
*/
function decodeData(str) {
if (!str)
return {};
str = decodeURIComponent(str);
var dataSplit = config_1.default.URL_DATA_SPLIT;
var keyValues = str.split(dataSplit.item);
var data = {};
keyValues.forEach(function (kv) {
var item = kv.split(dataSplit.key);
data[item[0]] = decodeURIComponent(item[1]);
});
return data;
}
/**
* set hash value with path and encoded data string
*/
function setHashData(hashData) {
var dataSplit = config_1.default.URL_DATA_SPLIT;
var dataStr = encodeData(hashData.data);
var hash = hashData.path + dataSplit.start + dataStr;
if (hashData.copyIndex) {
hash += ('?!p=' + hashData.copyIndex);
}
if (hashData.pageIndex) {
hash += ('?!crpi=' + hashData.pageIndex);
}
window.location.hash = hash;
}
exports.setHashData = setHashData;
/**
* get path and data from url hash
*/
function getHashData() {
var hash = window.location.hash.slice(1);
var hashData = {
path: '',
data: {},
};
/**
* 处理 hash 部分
* 比如 path/data=3?!p=1?!crpi=2
* / 之前的 path 用于路由页面,确定是哪个 pageIde
* / 之后,?! 之前是数据部分,需要传输的页面数据
* ?!p= 后面的数字是同一个 page 的副本 index
* ?!crpi= 后面的数字是 Cyra page index, 即访问了多少个页面
*/
hashData.pageIndex = Number(hash.split('?!crpi=')[1]) || 1;
hash = hash.split('?!crpi=')[0];
hashData.copyIndex = Number(hash.split('?!p=')[1]) || 0;
hash = hash.split('?!p=')[0];
var dataSplit = config_1.default.URL_DATA_SPLIT;
var startIndex = hash.lastIndexOf(dataSplit.start);
if (startIndex > 0) {
hashData.path = hash.slice(0, startIndex);
hashData.data = decodeData(hash.slice(startIndex + 1));
}
else {
hashData.path = hash;
}
return hashData;
}
exports.getHashData = getHashData;
/**
* bind function context and give the function ability to call next function
*/
function sequence(seq, ctx) {
var funs = seq.reverse();
var noop = function () { };
var start = funs.reduce(function (prev, curr) {
return curr.bind(ctx, prev);
}, noop);
start();
}
exports.sequence = sequence;