UNPKG

cyra-pure

Version:

single page application view engine

101 lines (100 loc) 2.96 kB
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;