UNPKG

weex-nuke

Version:

基于 Rax 、Weex 的高性能组件体系 ~~

159 lines (137 loc) 5.13 kB
'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;