weex-nuke
Version:
基于 Rax 、Weex 的高性能组件体系 ~~
159 lines (137 loc) • 5.13 kB
JavaScript
'use strict';
var _realpath = require('./realpath.js');
var _realpath2 = _interopRequireDefault(_realpath);
var _nukeEnv = require('../Env/index.js');
var _urlhelper = require('./urlhelper.js');
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
/**
* WxParam 是指 native 模板拦截规则的key,在这些规则下,对参数需要做相应处理。
*
* _wx_tpl 默认规则,
* _h5_tpl nuke 文档专用,离开文档本身没什么价值
* dd_wx_tpl 钉钉扫码规则
*
* 读取优先级依次降低
*/
var WxParam = ['_wx_tpl', '_h5_tpl', 'dd_wx_tpl'];
/**
* url
* @param {[type]} url qap://xxx.js 放弃相对路径支持
* @param {object} options
* @param {object} options.refer 来源页面
* @param {object} options.webRootPath 计算基准路径
* @param {object} options.contextQuery 需要持续传递的参数
* @return {[type]} url [description]
*/
/**
* polyfill for qn tabbar
*/
// RegExp author cite: http://stackoverflow.com/a/11976301
function convert(url) {
var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
// add qap:// & qap:/// support
if (typeof url !== 'string') return;
var reg = /(qap:\/{2,3})/g;
url = url.replace(reg, 'qap:///');
var realurl = void 0;
if (_nukeEnv.isWeex) {
realurl = (0, _realpath2.default)(url);
return realurl;
}
var targetObj = getTarget(url);
// 目标地址是 qap: 协议
if (targetObj.protocol === 'qap:') {
var referObj = window.location;
// console.log('targetBundleName',targetBundleName);
if (options.refer) {
referObj = (0, _urlhelper.urlParse)(options.refer);
}
if (referObj.search && (referObj.search.indexOf('_wx_tpl') > -1 || referObj.search.indexOf('_h5_tpl') > -1)) {
/**
* 这种情况是为 _wx_tpl 扫码规则跳转做的兼容
* refer 来源是 https://www.taobao.com?_wx_tpl=https://g.alicdn.com/nuke/tabbar/0.3.4/basic.js?id=76843
* 链接写的是 qap://aaa.js?bb=c
* 则拼接成 https://www.taobao.com?_wx_tpl=https://g.alicdn.com/nuke/tabbar/0.3.4/aaa.js?bb=c
*/
var wxParamObj = getSearchParameterAndKey(referObj.search, WxParam);
var wxParamKey = wxParamObj.key;
var wxTplUrl = decodeURIComponent(wxParamObj.val);
var _targetBundleName = targetObj.pathname.substring(1);
var wxTplObj = (0, _urlhelper.urlParse)(wxTplUrl);
var _pathNameArr = wxTplObj.pathname.substring(1).split('/');
var _path = wxTplObj.pathname.replace(_pathNameArr[_pathNameArr.length - 1], _targetBundleName);
var targetTpl = wxTplObj.protocol + '//' + wxTplObj.host + _path + targetObj.search;
var _targetUrl = referObj.protocol + '//' + referObj.host + referObj.pathname + replaceSearchParameter(referObj.search, wxParamKey, targetTpl);
return _targetUrl;
}
/**
* refer 来源是 https://g.alicdn.com/nuke/tabbar/0.3.4/basic.html?id=76843
* 链接写的是 qap://aaa.js?bb=c
* 则拼接成 https://g.alicdn.com/nuke/tabbar/0.3.4/aaa.html?bb=c
*/
var targetBundleName = targetObj.pathname.substring(1).replace('.js', '.html');
var pathNameArr = referObj.pathname.substring(1).split('/');
var path = referObj.pathname.replace(pathNameArr[pathNameArr.length - 1], targetBundleName);
var targetUrl = void 0;
if (options.webRootPath) {
targetUrl = options.webRootPath + targetBundleName + targetObj.search;
if (options.contextQuery) {
if (targetUrl.indexOf('?') > 0) {
targetUrl = targetUrl + '&' + options.contextQuery;
} else {
targetUrl = targetUrl + '?' + options.contextQuery;
}
}
} else {
targetUrl = referObj.protocol + '//' + referObj.host + path + targetObj.search;
}
return targetUrl;
}
return url;
// realurl = realpath(url);
// console.log(realurl);
// throw new Error('parse Target url error');
}
function getTarget(url) {
return (0, _urlhelper.urlParse)(url);
}
function getSearchParameterAndKey(search, paramObj) {
var searchString = search.substring(1);
var i = void 0;
var val = void 0;
var params = searchString.split('&');
var obj = {};
paramObj.forEach(function (item) {
if (searchString.indexOf(item) > -1) {
for (i = 0; i < params.length; i++) {
val = params[i].split('=');
if (val[0] === item) {
obj = {
key: item,
val: val[1]
};
break;
}
}
}
});
return obj;
}
function replaceSearchParameter(search, paramName, paramValue) {
var newSearch = '';
var searchString = search.substring(1);
var i = void 0;
var val = void 0;
var params = searchString.split('&');
for (i = 0; i < params.length; i++) {
val = params[i].split('=');
if (val[0] === paramName) {
newSearch = newSearch + '&' + val[0] + '=' + paramValue;
} else {
newSearch = newSearch + '&' + val[0] + '=' + val[1];
}
}
newSearch = '?' + newSearch.substring(1);
return newSearch;
}
module.exports = convert;