213 lines
6.4 KiB
JavaScript
213 lines
6.4 KiB
JavaScript
goog.loadJs('common', () => {
|
||
|
||
goog.require('Mixly');
|
||
goog.provide('Mixly.Url');
|
||
|
||
const { Url } = Mixly;
|
||
|
||
/**
|
||
* @function 输入url,返回json
|
||
* @param url {String} 输入的url字符串
|
||
* @return object
|
||
*/
|
||
Url.urlToJson = (url) => {
|
||
// 递归字符串生成json对象
|
||
function strToObj(obj, str, value) {
|
||
if(str.indexOf('.') !== -1) {
|
||
let key = str.substring(0, str.indexOf('.'));
|
||
str = str.substring(str.indexOf('.') + 1, str.length);
|
||
if (obj[key] === undefined) {
|
||
obj[key] = {};
|
||
}
|
||
obj[key] = strToObj(obj[key], str, value);
|
||
return obj;
|
||
} else {
|
||
const decodeValue = decodeURIComponent(value);
|
||
const decodeKey = decodeURIComponent(str);
|
||
if (isNaN(decodeValue)) {
|
||
const decodeValueLower = decodeValue.toLowerCase();
|
||
switch (decodeValueLower) {
|
||
case 'true':
|
||
obj[decodeKey] = true;
|
||
break;
|
||
case 'false':
|
||
obj[decodeKey] = false;
|
||
break;
|
||
case 'undefined':
|
||
obj[decodeKey] = undefined;
|
||
break;
|
||
case 'null':
|
||
obj[decodeKey] = null;
|
||
break;
|
||
default:
|
||
obj[decodeKey] = decodeValue;
|
||
}
|
||
} else {
|
||
obj[decodeKey] = decodeValue-0;
|
||
}
|
||
return obj;
|
||
}
|
||
}
|
||
var hash;
|
||
var myJson = {};
|
||
var hashes = url.slice(url.indexOf('?') + 1).split('&');
|
||
for (var i = 0; i < hashes.length; i++) {
|
||
hash = hashes[i].split('=');
|
||
try {
|
||
var hash0 = hash[0].replaceAll('@', '=');
|
||
hash0 = hash0.replaceAll('$', '&');
|
||
var hash1 = hash[1].replaceAll('@', '=');
|
||
hash1 = hash1.replaceAll('$', '&');
|
||
myJson = strToObj(myJson, hash0, hash1);
|
||
} catch (e) {
|
||
myJson = strToObj(myJson, hash[0], hash[1]);
|
||
}
|
||
}
|
||
return myJson;
|
||
}
|
||
|
||
/**
|
||
* @function JSON对象转Url字符串
|
||
* @param param {object | array | string | number | boolean} 传入的JSON对象或者是转换过程中某个键的对应值
|
||
* @param key {null | string} 转换过程中传入的JSON对象中的某个键
|
||
* @return {string} 转换后的Url字符串
|
||
**/
|
||
Url.jsonToUrl = (param, key = null) => {
|
||
var paramStr = '';
|
||
if (param instanceof String || param instanceof Number || param instanceof Boolean) {
|
||
try {
|
||
var newKey = key.toString().replaceAll('=', '@');
|
||
newKey = newKey.replaceAll('&', '$');
|
||
var newParam = param.toString().replaceAll('=', '@')
|
||
newParam = newParam.replaceAll('&', '$');
|
||
paramStr += '&' + newKey + '=' + encodeURIComponent(newParam);
|
||
} catch (e) {
|
||
//console.log(e);
|
||
paramStr += '&' + key + '=' + encodeURIComponent(param);
|
||
}
|
||
} else {
|
||
$.each(param, function (i) {
|
||
var k = key == null ? i : key + (param instanceof Array ? '[' + i + ']' : '.' + i);
|
||
paramStr += '&' + Url.jsonToUrl(this, k);
|
||
});
|
||
}
|
||
return paramStr.substr(1);
|
||
};
|
||
|
||
/**
|
||
* @function 获取主页面传递的配置信息
|
||
* @return {object}
|
||
*/
|
||
Url.getConfig = () => {
|
||
var href = '';
|
||
try {
|
||
href = window.location.href.replaceAll('#', '');
|
||
} catch (e) {
|
||
//console.log(e);
|
||
href = window.location.href;
|
||
}
|
||
href = href.substring(href.indexOf('?') + 1, href.length);
|
||
var boardConfig = Url.urlToJson(href);
|
||
return boardConfig;
|
||
}
|
||
|
||
/**
|
||
* @function 更改传入Url字符串中某个参数的值,如果没有则添加该参数
|
||
* @param url {string} Url字符串
|
||
* @param arg {string} 参数名
|
||
* @param argVal {string} 参数名对应值
|
||
* @return {string} 修改后的Url字符串
|
||
**/
|
||
Url.changeURLArg = (url, arg, argVal) => {
|
||
var pattern = arg + '=([^&]*)';
|
||
var replaceText = arg + '=' + argVal;
|
||
if (url.match(pattern)) {
|
||
var tmp = '/(' + arg + '=)([^&]*)/gi';
|
||
tmp = url.replace(eval(tmp), replaceText);
|
||
return tmp;
|
||
} else {
|
||
if (url.match('[\?]')) {
|
||
return url + '&' + replaceText;
|
||
} else {
|
||
return url + '?' + replaceText;
|
||
}
|
||
}
|
||
}
|
||
|
||
/**
|
||
* @function 求解某个字符串的CRC32值
|
||
* @param str {string} 传入的字符串
|
||
* @param radix {number} 返回文本的进制,默认十进制
|
||
* @return {string}
|
||
**/
|
||
Url.CRC32 = (str, radix = 10) => {
|
||
const Utf8Encode = function (string) {
|
||
string = string.replace(/\r\n/g, '\n');
|
||
let text = '';
|
||
for (let n = 0; n < string.length; n++) {
|
||
const c = string.charCodeAt(n);
|
||
if (c < 128) {
|
||
text += String.fromCharCode(c);
|
||
} else if ((c > 127) && (c < 2048)) {
|
||
text += String.fromCharCode((c >> 6) | 192);
|
||
text += String.fromCharCode((c & 63) | 128);
|
||
} else {
|
||
text += String.fromCharCode((c >> 12) | 224);
|
||
text += String.fromCharCode(((c >> 6) & 63) | 128);
|
||
text += String.fromCharCode((c & 63) | 128);
|
||
}
|
||
}
|
||
return text;
|
||
}
|
||
|
||
const makeCRCTable = function () {
|
||
let c;
|
||
const crcTable = [];
|
||
for (let n = 0; n < 256; n++) {
|
||
c = n;
|
||
for (let k = 0; k < 8; k++) {
|
||
c = ((c & 1) ? (0xEDB88320 ^ (c >>> 1)) : (c >>> 1));
|
||
}
|
||
crcTable[n] = c;
|
||
}
|
||
return crcTable;
|
||
}
|
||
|
||
const crcTable = makeCRCTable();
|
||
const strUTF8 = Utf8Encode(str);
|
||
let crc = 0 ^ (-1);
|
||
for (let i = 0; i < strUTF8.length; i++) {
|
||
crc = (crc >>> 8) ^ crcTable[(crc ^ strUTF8.charCodeAt(i)) & 0xFF];
|
||
}
|
||
crc = (crc ^ (-1)) >>> 0;
|
||
return crc.toString(radix);
|
||
};
|
||
|
||
/**
|
||
* @function 获取当前网页的IP地址
|
||
* @return {string | null}
|
||
**/
|
||
Url.getIPAddress = () => {
|
||
const url = window.location.host;
|
||
const IPList = url.match(/[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(\.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+\.?/g);
|
||
if (IPList && IPList.length > 0) {
|
||
return IPList[0];
|
||
}
|
||
return null;
|
||
}
|
||
|
||
/**
|
||
* @function 在新窗口打开某个网址
|
||
* @param href {string} 传入的网址
|
||
* @return {void}
|
||
**/
|
||
Url.open = (href) => {
|
||
if (goog.isElectron) {
|
||
const { shell } = Mixly.require('electron');
|
||
shell.openExternal(href);
|
||
} else {
|
||
window.open(href, '_blank');
|
||
}
|
||
}
|
||
|
||
}); |