`;
} else {
asideTitle = /*html*/
`
${ruleName}
`;
}
}
let headerTitleText = ruleName;
if (netDiskRuleConfig.isUserRule) {
headerTitleText += /*html*/
`
${__pops.config.iconSVG.edit}
`;
headerTitleText += /*html*/
`
${__pops.config.iconSVG.delete}
`;
}
this.$data.ruleContent.push({
id: "netdisk-panel-config-" + ruleKey,
title: asideTitle,
headerTitle: headerTitleText,
attributes: {
"data-key": ruleKey
},
forms: viewConfig,
afterRender: (data) => {
data.$asideLiElement.setAttribute(
"data-function-enable",
NetDiskRuleData.function.enable(ruleKey, true).toString()
);
}
});
});
},
/**
* 解析规则的匹配规则
*
* 解析以下内容
*
* 1. 替换字符串类型的内部关键字
*/
parseRuleMatchRule(netDiskRuleConfig) {
let netDiskMatchRule = netDiskRuleConfig.rule;
let netDiskMatchRuleHandler = [];
let ruleKey = netDiskRuleConfig.setting.key;
for (let index = 0; index < netDiskMatchRule.length; index++) {
const netDiskMatchRuleOption = netDiskMatchRule[index];
if (typeof netDiskMatchRuleOption.link_innerText === "string") {
netDiskMatchRuleOption.link_innerText = NetDiskRuleUtils.replaceParam(
netDiskMatchRuleOption.link_innerText,
NetDiskUserRuleReplaceParam_matchRange_text(ruleKey)
);
}
if (typeof netDiskMatchRuleOption.link_innerHTML === "string") {
netDiskMatchRuleOption.link_innerHTML = NetDiskRuleUtils.replaceParam(
netDiskMatchRuleOption.link_innerHTML,
NetDiskUserRuleReplaceParam_matchRange_html(ruleKey)
);
}
netDiskMatchRuleHandler.push(netDiskMatchRuleOption);
}
return netDiskMatchRuleHandler;
},
/**
* 解析规则的设置项
*
* 解析出以下内容:
*
* 1. 视图配置
* 2. 获取设置的最新的值并进行覆盖
* @param netDiskRuleConfig 规则配置
*/
parseRuleSetting(netDiskRuleConfig) {
let formConfigList = [];
const settingConfig = netDiskRuleConfig.setting.configurationInterface;
const ruleKey = netDiskRuleConfig.setting.key;
if (settingConfig == null) {
return [];
}
if (settingConfig.function) {
let function_form = [];
if ("enable" in settingConfig.function) {
let default_value = typeof settingConfig.function.enable === "boolean" ? settingConfig.function.enable : false;
function_form.push(
UISwitch(
"启用",
NetDiskRuleDataKEY.function.enable(ruleKey),
default_value,
(event, value) => {
const notUnableAttrName = "data-function-enable";
let $click = event.target;
let $shadowRoot = $click.getRootNode();
let $currentPanelAside = $shadowRoot.querySelector(
`.pops-panel-aside li[data-key="${ruleKey}"]`
);
if (!$currentPanelAside) {
return;
}
$currentPanelAside.setAttribute(
notUnableAttrName,
value.toString()
);
},
"开启可允许匹配该规则"
)
);
settingConfig.function.enable = NetDiskRuleData.function.enable(ruleKey);
}
if ("linkClickMode" in settingConfig.function) {
let data = utils.assign(
NetDiskRuleUtils.getDefaultLinkClickMode(),
settingConfig.function.linkClickMode || {}
);
let default_value = null;
let selectData = Object.keys(data).map((keyName) => {
let itemData = data[keyName];
if (!itemData.enable) {
return;
}
if (itemData.default) {
default_value = keyName;
}
return {
value: keyName,
text: itemData.text
};
}).filter((item) => item != null);
if (default_value == null) {
default_value = selectData[0].value;
}
function_form.push(
UISelect(
"点击动作",
NetDiskRuleDataKEY.function.linkClickMode(ruleKey),
default_value,
selectData,
void 0,
"点击匹配到的链接的执行的动作"
)
);
for (const linkClickModeKey in settingConfig.function.linkClickMode) {
const linkClickModeItem = settingConfig.function.linkClickMode[linkClickModeKey];
if (linkClickModeKey === NetDiskRuleData.function.linkClickMode(ruleKey)) {
linkClickModeItem.default = true;
} else {
linkClickModeItem.default = false;
}
}
}
if ("checkLinkValidity" in settingConfig.function) {
const default_value = typeof settingConfig.function.checkLinkValidity === "boolean" ? settingConfig.function.checkLinkValidity : true;
function_form.push(
UISwitch(
"验证链接有效性",
NetDiskRuleDataKEY.function.checkLinkValidity(ruleKey),
default_value,
void 0,
"自动请求链接,判断该链接是否有效,在大/小窗内显示验证结果图标"
)
);
settingConfig.function.checkLinkValidity = NetDiskRuleData.function.checkLinkValidity(ruleKey);
}
if (function_form.length) {
formConfigList.push({
text: "功能",
type: "forms",
forms: function_form
});
}
}
if (settingConfig.linkClickMode_openBlank) {
let linkClickMode_openBlank_form = [];
if ("openBlankWithCopyAccessCode" in settingConfig.linkClickMode_openBlank) {
const default_value = typeof settingConfig.linkClickMode_openBlank.openBlankWithCopyAccessCode === "boolean" ? settingConfig.linkClickMode_openBlank.openBlankWithCopyAccessCode : false;
linkClickMode_openBlank_form.push(
UISwitch(
"跳转时复制访问码",
NetDiskRuleDataKEY.linkClickMode_openBlank.openBlankWithCopyAccessCode(
ruleKey
),
default_value,
void 0,
"当点击动作是【新标签页打开】时且存在访问码,那就会复制访问码到剪贴板"
)
);
settingConfig.linkClickMode_openBlank.openBlankWithCopyAccessCode = NetDiskRuleData.linkClickMode_openBlank.openBlankWithCopyAccessCode(
ruleKey
);
}
if (linkClickMode_openBlank_form.length) {
formConfigList.push({
text: "点击动作-新标签页打开",
type: "forms",
forms: linkClickMode_openBlank_form
});
}
}
if (settingConfig.schemeUri) {
const schemeUri_form = [];
if ("enable" in settingConfig.schemeUri) {
const default_value = typeof settingConfig.schemeUri.enable === "boolean" ? settingConfig.schemeUri.enable : false;
schemeUri_form.push(
UISwitch(
"启用",
NetDiskRuleDataKEY.schemeUri.enable(ruleKey),
default_value,
void 0,
"开启后可进行scheme uri转发"
)
);
settingConfig.schemeUri.enable = NetDiskRuleData.schemeUri.enable(ruleKey);
}
if ("isForwardBlankLink" in settingConfig.schemeUri) {
const default_value = typeof settingConfig.schemeUri.isForwardBlankLink === "boolean" ? settingConfig.schemeUri.isForwardBlankLink : false;
schemeUri_form.push(
UISwitch(
"转发新标签页链接",
NetDiskRuleDataKEY.schemeUri.isForwardBlankLink(ruleKey),
default_value,
void 0,
"对新标签页打开的链接进行scheme转换"
)
);
settingConfig.schemeUri.isForwardBlankLink = NetDiskRuleData.schemeUri.isForwardBlankLink(ruleKey);
}
if ("isForwardLinearChain" in settingConfig.schemeUri) {
const default_value = typeof settingConfig.schemeUri.isForwardLinearChain === "boolean" ? settingConfig.schemeUri.isForwardLinearChain : false;
schemeUri_form.push(
UISwitch(
"转发直链",
NetDiskRuleDataKEY.schemeUri.isForwardLinearChain(ruleKey),
default_value,
void 0,
"对解析的直链进行scheme转换"
)
);
settingConfig.schemeUri.isForwardLinearChain = NetDiskRuleData.schemeUri.isForwardLinearChain(ruleKey);
}
if ("uri" in settingConfig.schemeUri) {
const default_value = typeof settingConfig.schemeUri.uri === "string" ? settingConfig.schemeUri.uri : "";
schemeUri_form.push(
UIInput(
"Uri链接",
NetDiskRuleDataKEY.schemeUri.uri(ruleKey),
default_value,
"自定义的Scheme的Uri链接",
void 0,
"jumpwsv://go?package=xx&activity=xx&intentAction=xx&intentData=xx&intentExtra=xx"
)
);
settingConfig.schemeUri.uri = NetDiskRuleData.schemeUri.uri(ruleKey);
}
if (schemeUri_form.length) {
formConfigList.push({
text: "Scheme Uri转发",
type: "forms",
isFold: true,
forms: schemeUri_form
});
}
}
if (settingConfig.matchRange_text) {
let matchRange_text_form = [];
if ("before" in settingConfig.matchRange_text) {
const default_value = typeof settingConfig.matchRange_text.before === "number" ? settingConfig.matchRange_text.before : 0;
matchRange_text_form.push(
UISlider(
"间隔前",
NetDiskRuleDataKEY.matchRange_text.before(ruleKey),
default_value,
0,
100,
void 0,
void 0,
"提取码间隔前的字符长度"
)
);
settingConfig.matchRange_text.before = NetDiskRuleData.matchRange_text.before(ruleKey);
}
if ("after" in settingConfig.matchRange_text) {
const default_value = typeof settingConfig.matchRange_text.after === "number" ? settingConfig.matchRange_text.after : 0;
matchRange_text_form.push(
UISlider(
"间隔后",
NetDiskRuleDataKEY.matchRange_text.after(ruleKey),
default_value,
0,
100,
void 0,
void 0,
"提取码间隔后的字符长度"
)
);
settingConfig.matchRange_text.after = NetDiskRuleData.matchRange_text.after(ruleKey);
}
if (matchRange_text_form.length) {
formConfigList.push({
text: "提取码文本匹配Text",
type: "forms",
forms: matchRange_text_form
});
}
}
if (settingConfig.matchRange_html) {
let matchRange_html_form = [];
if ("before" in settingConfig.matchRange_html) {
const default_value = typeof settingConfig.matchRange_html.before === "number" ? settingConfig.matchRange_html.before : 0;
matchRange_html_form.push(
UISlider(
"间隔前",
NetDiskRuleDataKEY.matchRange_html.before(ruleKey),
default_value,
0,
100,
void 0,
void 0,
"提取码间隔前的字符长度"
)
);
settingConfig.matchRange_html.before = NetDiskRuleData.matchRange_html.before(ruleKey);
}
if ("after" in settingConfig.matchRange_html) {
const default_value = typeof settingConfig.matchRange_html.after === "number" ? settingConfig.matchRange_html.after : 0;
matchRange_html_form.push(
UISlider(
"间隔后",
NetDiskRuleDataKEY.matchRange_html.after(ruleKey),
default_value,
0,
100,
void 0,
void 0,
"提取码间隔后的字符长度"
)
);
settingConfig.matchRange_html.after = NetDiskRuleData.matchRange_html.after(ruleKey);
}
if (matchRange_html_form.length) {
formConfigList.push({
text: "提取码文本匹配HTML",
type: "forms",
forms: matchRange_html_form
});
}
}
if (settingConfig.ownFormList) {
formConfigList.push(...settingConfig.ownFormList);
}
return formConfigList;
},
/**
* 获取规则界面配置的内容
*/
getRulePanelContent() {
return this.$data.ruleContent;
}
};
const NetDiskDebug = {
/**
* 对传入的url进行处理,返回shareCode
* @param {string} matchText 正在进行匹配的文本
* @param {NetDiskMatchRuleOption} regular 当前执行的规则
* @param {(logData: NetDiskDebugLogData)=>void} logCallBack 日志回调
*/
handleShareCode(matchText, regular, logCallBack) {
var _a2;
let shareCodeMatch = (_a2 = matchText.match(regular.shareCode)) == null ? void 0 : _a2.filter((item) => utils.isNotNull(item));
logCallBack({
status: true,
msg: [
`正则: shareCode`,
"作用: 获取shareCode",
"结果: ",
JSON.stringify(shareCodeMatch)
]
});
if (utils.isNull(shareCodeMatch)) {
logCallBack({
status: false,
msg: `匹配shareCode为空`
});
return;
}
let shareCode = shareCodeMatch[0];
logCallBack({
status: true,
msg: [`取第一个值: ` + shareCode]
});
if (regular.shareCodeNeedRemoveStr) {
shareCode = shareCode.replace(regular.shareCodeNeedRemoveStr, "");
logCallBack({
status: true,
msg: [
`正则: shareCodeNeedRemoveStr`,
"作用: 删除ShareCode前面不需要的字符串",
`结果: ${shareCode}`
]
});
}
let shareCodeNotMatch = regular.shareCodeNotMatch;
if (shareCodeNotMatch != void 0 && shareCode.match(shareCodeNotMatch)) {
log.error(`不可能的shareCode => ${shareCode}`);
logCallBack({
status: false,
msg: [
`正则: shareCodeNotMatch`,
"作用: 用于判断提取到的shareCode是否是错误的shareCode",
`结果: true 该shareCode不是正确的`
]
});
return;
}
for (const shareCodeNotMatchRegexp of NetDisk.$extraRule.shareCodeNotMatchRegexpList) {
if (shareCode.match(shareCodeNotMatchRegexp)) {
log.error(`不可能的shareCode => ${shareCode}`);
logCallBack({
status: false,
msg: [
`正则: 内置的shareCodeNotMatchRegexpList`,
"作用: 使用该正则判断提取到的shareCode是否正确",
`结果: true 该shareCode不是正确的`
]
});
return;
}
}
shareCode = decodeURI(shareCode);
logCallBack({
status: true,
msg: ["对shareCode进行解码: " + shareCode]
});
if (NetDiskGlobalData.shareCode.excludeIdenticalSharedCodes.value && utils.isSameChars(
shareCode,
NetDiskGlobalData.shareCode.excludeIdenticalSharedCodesCoefficient.value
)) {
logCallBack({
status: false,
msg: ["已开启【排除分享码】且该分享码命中该规则"]
});
return;
}
if (shareCode.endsWith("http") || shareCode.endsWith("https")) {
logCallBack({
status: false,
msg: ["该分享码以http|https结尾"]
});
return;
}
logCallBack({
status: true,
msg: "处理完毕的shareCode: " + shareCode
});
return shareCode;
},
/**
* 对传入的url进行处理,返回accessCode
* @param {string} matchText 正在进行匹配的文本
* @param {NetDiskMatchRuleOption} regular 当前执行的规则
* @param {(logData: NetDiskDebugLogData)=>void} logCallBack 日志回调
*/
handleAccessCode(matchText, regular, logCallBack) {
var _a2;
let accessCode = "";
if (!regular.checkAccessCode) {
logCallBack({
status: true,
msg: "因未配置规则checkAccessCode,默认accessCode的值为空"
});
return "";
}
let accessCodeMatch = matchText.match(regular.checkAccessCode);
logCallBack({
status: true,
msg: [
`正则: checkAccessCode`,
"作用: 用来判断link_innerText或者link_innerHTML匹配到的字符串中是否存在密码",
`结果: `,
JSON.stringify(accessCodeMatch)
]
});
if (accessCodeMatch) {
let accessCodeMatchValue = accessCodeMatch[accessCodeMatch.length - 1];
logCallBack({
status: true,
msg: "取最后一个值: " + accessCodeMatchValue
});
let accessCodeMatchArray = (_a2 = accessCodeMatchValue.match(regular.accessCode)) == null ? void 0 : _a2.filter((item) => utils.isNotNull(item));
logCallBack({
status: true,
msg: [
`正则: accessCode`,
"作用: 用来提取link_innerText或者link_innerHTML匹配到的字符串中的密码",
`结果: `,
JSON.stringify(accessCodeMatchArray)
]
});
if (utils.isNull(accessCodeMatchArray)) {
logCallBack({
status: true,
msg: "因↑匹配到的结果为空,默认accessCode的值为空"
});
return "";
}
if (accessCodeMatchArray.length) {
accessCode = accessCodeMatchArray[0];
logCallBack({
status: true,
msg: "取第一个值: " + accessCode
});
if (accessCode.startsWith("http")) {
logCallBack({
status: true,
msg: "排除不可能的accessCode,重置accessCode的值为空"
});
accessCode = "";
}
}
}
if (utils.isNotNull(accessCode)) {
for (const accessCodeNotMatchRegexp of NetDisk.$extraRule.accessCodeNotMatchRegexpList) {
if (accessCode.match(accessCodeNotMatchRegexp)) {
accessCode = "";
logCallBack({
status: true,
msg: [
`正则: 内置的accessCodeNotMatchRegexpList`,
"作用: 使用该正则判断提取到的accessCode是否正确",
`结果: true 重置accessCode为空`
]
});
break;
}
}
if (regular.acceesCodeNotMatch && accessCode.match(regular.acceesCodeNotMatch)) {
accessCode = "";
logCallBack({
status: true,
msg: [
`正则: acceesCodeNotMatch`,
"作用: 用于判断提取到的accessCode是否是错误的accessCode",
`结果: true 重置accessCode为空`
]
});
}
}
logCallBack({
status: true,
msg: "处理完毕的accessCode: " + accessCode
});
return accessCode;
},
/**
* 获取在弹窗中显示出的链接
* @param {string} matchText 匹配到的文本
* @param {NetDiskMatchRuleOption} regular 当前执行的规则
* @param {string} shareCode 分享码
* @param {string} accessCode 访问码
* @param {(logData: NetDiskDebugLogData)=>void} logCallBack 日志回调
*/
handleLinkShow(matchText, regular, shareCode, accessCode, logCallBack) {
let uiLink = NetDiskRuleUtils.replaceParam(regular["uiLinkShow"], {
shareCode
});
logCallBack({
status: true,
msg: [
`正则: uiLinkShow`,
"作用: 用于显示在弹窗中的字符串",
"备注: 对shareCode进行参数替换",
`结果: ${uiLink}`
]
});
if (accessCode && accessCode != "") {
uiLink = NetDiskRuleUtils.replaceParam(uiLink, {
accessCode
});
logCallBack({
status: true,
msg: [
`正则: uiLinkShow`,
"作用: 用于显示在弹窗中的字符串",
"备注: 对accessCode进行参数替换",
`结果: ${uiLink}`
]
});
} else {
uiLink = CommonUtils.replaceText(
uiLink,
NetDisk.$extraRule.noAccessCodeRegExp,
""
);
logCallBack({
status: true,
msg: [
`正则: 内置的noAccessCodeRegExp`,
"作用: 因accessCode为空,使用该正则去除不需要的字符串",
`结果: ${uiLink}`
]
});
}
if (regular.paramMatch) {
if (utils.isNotNull(matchText)) {
let paramMatchArray = matchText.match(regular.paramMatch);
let replaceParamData = {};
if (paramMatchArray) {
for (let index = 0; index < paramMatchArray.length; index++) {
replaceParamData[`$${index}`] = paramMatchArray[index];
}
}
uiLink = NetDiskRuleUtils.replaceParam(uiLink, replaceParamData);
logCallBack({
status: true,
msg: [
`正则: paramMatch`,
`作用: 用于对matchText进行提取需要的关键内容,替换关键字:{#$1#}、{#$2#}...`,
`参数: ` + JSON.stringify(replaceParamData, void 0, 4),
`结果: ${uiLink}`
]
});
}
}
logCallBack({
status: true,
msg: "处理完毕的uiLink: " + uiLink
});
return uiLink;
},
/**
* 获取新标签页打开的URL
* @param {string} matchText 匹配到的文本
* @param {NetDiskMatchRuleOption} regular 当前执行的规则
* @param {string} shareCode 分享码
* @param {string} accessCode 访问码
* @param {(logData: NetDiskDebugLogData)=>void} logCallBack 日志回调
*/
handleBlank(matchText, regular, shareCode, accessCode, logCallBack) {
let blankUrl = NetDiskRuleUtils.replaceParam(regular["blank"], {
shareCode
});
logCallBack({
status: true,
msg: [
`正则: blank`,
"作用: 用于点击跳转的链接",
"备注: 对shareCode进行参数替换",
`结果: ${blankUrl}`
]
});
if (accessCode && accessCode != "") {
blankUrl = NetDiskRuleUtils.replaceParam(blankUrl, {
accessCode
});
logCallBack({
status: true,
msg: [
`正则: blank`,
"作用: 用于点击跳转的链接",
"备注: 对accessCode进行参数替换",
`结果: ${blankUrl}`
]
});
} else {
blankUrl = CommonUtils.replaceText(
blankUrl,
NetDisk.$extraRule.noAccessCodeRegExp,
""
);
logCallBack({
status: true,
msg: [
`正则: 内置的noAccessCodeRegExp`,
"作用: 因accessCode为空,使用该正则去除不需要的字符串",
`结果: ${blankUrl}`
]
});
}
if (regular.paramMatch) {
if (utils.isNotNull(matchText)) {
let paramMatchArray = matchText.match(regular.paramMatch);
let replaceParamData = {};
if (paramMatchArray) {
for (let index = 0; index < paramMatchArray.length; index++) {
replaceParamData[`$${index}`] = paramMatchArray[index];
}
}
blankUrl = NetDiskRuleUtils.replaceParam(blankUrl, replaceParamData);
logCallBack({
status: true,
msg: [
`正则: paramMatch`,
`作用: 用于对matchText进行提取需要的关键内容,替换关键字:{#$1#}、{#$2#}...`,
`参数: ` + JSON.stringify(replaceParamData, void 0, 4),
`结果: ${blankUrl}`
]
});
}
}
logCallBack({
status: true,
msg: "处理完毕的blank: " + blankUrl
});
return blankUrl;
},
/**
* 获取复制到剪贴板的字符串
* @param {string} matchText 匹配到的文本
* @param {NetDiskMatchRuleOption} regular 当前执行的规则
* @param {string} shareCode 分享码
* @param {string} accessCode 访问码
* @param {(logData: NetDiskDebugLogData)=>void} logCallBack 日志回调
*/
handleCopyUrl(matchText, regular, shareCode, accessCode, logCallBack) {
let copyUrl = NetDiskRuleUtils.replaceParam(regular["copyUrl"], {
shareCode
});
logCallBack({
status: true,
msg: [
`正则: copyUrl`,
"作用: 用于复制到剪贴板的链接",
"备注: 对shareCode进行参数替换",
`结果: ${copyUrl}`
]
});
if (accessCode && accessCode != "") {
copyUrl = NetDiskRuleUtils.replaceParam(copyUrl, {
accessCode
});
logCallBack({
status: true,
msg: [
`正则: copyUrl`,
"作用: 用于复制到剪贴板的链接",
"备注: 对accessCode进行参数替换",
`结果: ${copyUrl}`
]
});
} else {
copyUrl = CommonUtils.replaceText(
copyUrl,
NetDisk.$extraRule.noAccessCodeRegExp,
""
);
logCallBack({
status: true,
msg: [
`正则: 内置的noAccessCodeRegExp`,
"作用: 因accessCode为空,使用该正则去除不需要的字符串",
`结果: ${copyUrl}`
]
});
}
if (regular.paramMatch) {
if (utils.isNotNull(matchText)) {
let paramMatchArray = matchText.match(regular.paramMatch);
let replaceParamData = {};
if (paramMatchArray) {
for (let index = 0; index < paramMatchArray.length; index++) {
replaceParamData[`$${index}`] = paramMatchArray[index];
}
}
copyUrl = NetDiskRuleUtils.replaceParam(copyUrl, replaceParamData);
logCallBack({
status: true,
msg: [
`正则: paramMatch`,
`作用: 用于对matchText进行提取需要的关键内容,替换关键字:{#$1#}、{#$2#}...`,
`参数: ` + JSON.stringify(replaceParamData, void 0, 4),
`结果: ${copyUrl}`
]
});
}
}
logCallBack({
status: true,
msg: "处理完毕的copyUrl: " + copyUrl
});
return copyUrl;
}
};
const NetDiskWorkerUtils = {
/**
* 检索目标元素内所有可访问的ShadowRoot的所有节点的信息
*/
depthQueryShadowRootAllNode($target) {
let result = [];
function queryShadowRoot($ele) {
let $queryChildNodeList = Array.from($ele.querySelectorAll("*"));
$queryChildNodeList.forEach(($childNode) => {
if ($childNode.classList && $childNode.classList.contains("pops-shadow-container")) {
return;
}
let $childNodeShadowRoot = $childNode.shadowRoot;
if ($childNodeShadowRoot && $childNodeShadowRoot instanceof ShadowRoot) {
result.push({
shadowRoot: $childNodeShadowRoot,
childNode: queryShadowRoot($childNodeShadowRoot)
});
}
});
return $queryChildNodeList;
}
queryShadowRoot($target);
return result;
},
/**
* 删除某些需要忽略的text或html,如:设置、直链弹窗
* @param text 需要进行处理的字符串
* @param isHTML 是否是html属性
*/
ignoreStrRemove(text, isHTML = false) {
let ignoreNodeList = [];
if (ignoreNodeList.length) {
ignoreNodeList.forEach(($ignore) => {
if ($ignore == void 0) {
return;
}
if (isHTML) {
if ($ignore.innerHTML != void 0) {
text = text.replaceAll($ignore.innerHTML, "");
}
} else {
let text2 = $ignore.innerText || $ignore.textContent;
if (text2 != void 0) {
text2 = text2.replaceAll(text2, "");
}
}
});
}
return text;
},
/**
* 获取页面上所有文本
* @param target 目标元素
* @param isCheckShadowRoot 是否检索ShadowRoot
*/
getPageText(target = document.documentElement, isCheckShadowRoot) {
let strList = [];
strList.push((target == null ? void 0 : target.textContent) || (target == null ? void 0 : target.innerText) || "");
if (isCheckShadowRoot) {
let queryShadowRootAllNodeInfo = this.depthQueryShadowRootAllNode(target);
if (queryShadowRootAllNodeInfo.length) {
queryShadowRootAllNodeInfo.forEach((queryShadowRootInfo) => {
let shadowRootText = queryShadowRootInfo.shadowRoot.textContent;
if (shadowRootText) {
strList.push(shadowRootText);
}
});
}
}
strList = strList.filter((item) => item !== "");
return strList;
},
/**
* 获取页面上所有超文本
* @param target 目标元素
* @param isCheckShadowRoot 是否检索ShadowRoot
*/
getPageHTML(target = document.documentElement, isCheckShadowRoot) {
let strList = [];
strList.push(target.innerHTML);
if (isCheckShadowRoot) {
let queryShadowRootAllNodeInfo = this.depthQueryShadowRootAllNode(target);
if (queryShadowRootAllNodeInfo.length) {
queryShadowRootAllNodeInfo.forEach((queryShadowRootInfo) => {
let shadowRootHTML = queryShadowRootInfo.shadowRoot.innerHTML;
if (shadowRootHTML) {
strList.push(shadowRootHTML);
}
});
}
}
strList = strList.filter((item) => item !== "");
return strList;
},
/**
* 获取页面上所有input的值
* @param target 目标元素
* @param isCheckShadowRoot 是否检索ShadowRoot
*/
getInputElementValue(target = document.documentElement, isCheckShadowRoot) {
let result = [];
Array.from(target.querySelectorAll("input")).forEach(($input) => {
result.push($input.value);
});
if (isCheckShadowRoot) {
let queryShadowRootAllNodeInfo = this.depthQueryShadowRootAllNode(target);
if (queryShadowRootAllNodeInfo.length) {
queryShadowRootAllNodeInfo.forEach((queryShadowRootInfo) => {
for (let index = 0; index < queryShadowRootInfo.childNode.length; index++) {
const $childNode = queryShadowRootInfo.childNode[index];
if ($childNode instanceof HTMLInputElement && $childNode.value) {
result.push($childNode.value);
}
}
});
}
}
return result;
},
/**
* 获取页面上所有textarea的值
* @param target 目标元素
* @param isCheckShadowRoot 是否检索ShadowRoot
*/
getTextAreaElementValue(target = document.documentElement, isCheckShadowRoot) {
let result = [];
Array.from(target.querySelectorAll("textarea")).forEach(($textarea) => {
result.push($textarea.value);
});
if (isCheckShadowRoot) {
let queryShadowRootAllNodeInfo = this.depthQueryShadowRootAllNode(target);
if (queryShadowRootAllNodeInfo.length) {
queryShadowRootAllNodeInfo.forEach((queryShadowRootInfo) => {
for (let index = 0; index < queryShadowRootInfo.childNode.length; index++) {
const $childNode = queryShadowRootInfo.childNode[index];
if ($childNode instanceof HTMLTextAreaElement && $childNode.value) {
result.push($childNode.value);
}
}
});
}
}
return result;
}
};
const indexCSS$4 = '.whitesevPopNetDiskHistoryMatch .pops-confirm-content ul {\r\n}\r\n.whitesevPopNetDiskHistoryMatch .pops-confirm-content li {\r\n display: flex;\r\n flex-direction: column;\r\n justify-content: center;\r\n border-radius: 10px;\r\n box-shadow: 0 0.3px 0.6px rgb(0 0 0 / 6%), 0 0.7px 1.3px rgb(0 0 0 / 8%),\r\n 0 1.3px 2.5px rgb(0 0 0 / 10%), 0 2.2px 4.5px rgb(0 0 0 / 12%),\r\n 0 4.2px 8.4px rgb(0 0 0 / 14%), 0 10px 20px rgb(0 0 0 / 20%);\r\n margin: 20px 10px;\r\n padding: 10px;\r\n}\r\n.whitesevPopNetDiskHistoryMatch .pops-confirm-content .netdiskrecord-search {\r\n height: 11%;\r\n}\r\n.whitesevPopNetDiskHistoryMatch .pops-confirm-content .netdiskrecord-table {\r\n height: calc(85% - 40px);\r\n overflow: auto;\r\n}\r\n.whitesevPopNetDiskHistoryMatch .pops-confirm-content .netdiskrecord-page {\r\n display: flex;\r\n justify-content: center;\r\n align-items: center;\r\n margin-top: 10px;\r\n}\r\n.whitesevPopNetDiskHistoryMatch\r\n .pops-confirm-content\r\n .netdiskrecord-search\r\n input {\r\n border: none;\r\n border-bottom: 1px solid #000000;\r\n padding: 0px 5px;\r\n line-height: normal;\r\n width: -moz-available;\r\n width: -webkit-fill-available;\r\n width: fill-available;\r\n margin: 5px 5px 0px 5px;\r\n background: none;\r\n}\r\n.whitesevPopNetDiskHistoryMatch\r\n .pops-confirm-content\r\n .netdiskrecord-search\r\n input:focus-visible {\r\n outline: none;\r\n border-bottom: 1px solid #0009ff;\r\n}\r\n.whitesevPopNetDiskHistoryMatch .pops-confirm-content .netdiskrecord-link {\r\n}\r\n.whitesevPopNetDiskHistoryMatch .pops-confirm-content .netdiskrecord-link a {\r\n color: #ff4848;\r\n font-size: 0.8em;\r\n border: none;\r\n word-break: break-word;\r\n}\r\n.whitesevPopNetDiskHistoryMatch\r\n .pops-confirm-content\r\n .netdiskrecord-link\r\n a[isvisited="true"] {\r\n color: #8b8888;\r\n}\r\n.whitesevPopNetDiskHistoryMatch .pops-confirm-content .netdiskrecord-icon {\r\n}\r\n.whitesevPopNetDiskHistoryMatch\r\n .pops-confirm-content\r\n .netdiskrecord-icon\r\n .netdisk-icon-img {\r\n width: 28px;\r\n height: 28px;\r\n min-width: 28px;\r\n min-height: 28px;\r\n font-size: 0.8em;\r\n border-radius: 10px;\r\n box-shadow: 0 0.3px 0.6px rgb(0 0 0 / 6%), 0 0.7px 1.3px rgb(0 0 0 / 8%),\r\n 0 1.3px 2.5px rgb(0 0 0 / 10%), 0 2.2px 4.5px rgb(0 0 0 / 12%),\r\n 0 4.2px 8.4px rgb(0 0 0 / 14%), 0 10px 20px rgb(0 0 0 / 20%);\r\n}\r\n.whitesevPopNetDiskHistoryMatch .pops-confirm-content .netdiskrecord-url {\r\n color: #000;\r\n}\r\n.whitesevPopNetDiskHistoryMatch .pops-confirm-content .netdiskrecord-top-url {\r\n color: #000;\r\n}\r\n.whitesevPopNetDiskHistoryMatch\r\n .pops-confirm-content\r\n .netdiskrecord-functions\r\n button.btn-delete {\r\n background: #263cf3;\r\n color: #fff;\r\n}\r\n.whitesevPopNetDiskHistoryMatch\r\n .pops-confirm-content\r\n .netdiskrecord-functions\r\n button.btn-delete:active {\r\n background: #6e7be8;\r\n}\r\n.whitesevPopNetDiskHistoryMatch .pops-confirm-content .netdiskrecord-link,\r\n.whitesevPopNetDiskHistoryMatch .pops-confirm-content .netdiskrecord-icon,\r\n.whitesevPopNetDiskHistoryMatch .pops-confirm-content .netdiskrecord-url,\r\n.whitesevPopNetDiskHistoryMatch .pops-confirm-content .netdiskrecord-top-url,\r\n.whitesevPopNetDiskHistoryMatch .pops-confirm-content .netdiskrecord-add-time,\r\n.whitesevPopNetDiskHistoryMatch\r\n .pops-confirm-content\r\n .netdiskrecord-update-time,\r\n.whitesevPopNetDiskHistoryMatch .pops-confirm-content .netdiskrecord-url-title,\r\n.whitesevPopNetDiskHistoryMatch .pops-confirm-content .netdiskrecord-functions {\r\n display: flex;\r\n margin: 5px 0px;\r\n}\r\n.whitesevPopNetDiskHistoryMatch .pops-confirm-content .netdiskrecord-link p,\r\n.whitesevPopNetDiskHistoryMatch .pops-confirm-content .netdiskrecord-icon p,\r\n.whitesevPopNetDiskHistoryMatch .pops-confirm-content .netdiskrecord-url p,\r\n.whitesevPopNetDiskHistoryMatch .pops-confirm-content .netdiskrecord-top-url p,\r\n.whitesevPopNetDiskHistoryMatch .pops-confirm-content .netdiskrecord-add-time p,\r\n.whitesevPopNetDiskHistoryMatch\r\n .pops-confirm-content\r\n .netdiskrecord-update-time\r\n p,\r\n.whitesevPopNetDiskHistoryMatch\r\n .pops-confirm-content\r\n .netdiskrecord-url-title\r\n p,\r\n.whitesevPopNetDiskHistoryMatch\r\n .pops-confirm-content\r\n .netdiskrecord-functions\r\n p {\r\n min-width: 80px;\r\n max-width: 80px;\r\n align-self: center;\r\n}\r\n';
const NetDiskHistoryMatchView = {
/**
* 本地存储的keyName
*/
storageKey: "netDiskHistoryMatch",
/**
* 是否已设置其它DOM事件
*/
isSetOtherEvent: false,
/**
* 分页
*/
dataPaging: void 0,
/**
* 显示弹窗
*/
show() {
let data = this.getStorageData();
let dataHTML = "";
let that = this;
data = this.orderNetDiskHistoryMatchData(data);
for (let index = 0; index < 10; index++) {
if (data[index]) {
dataHTML += that.getTableHTML(data[index]).html;
}
}
dataHTML = /*html*/
`
`;
NetDiskUI.Alias.historyAlias = NetDiskPops.confirm(
{
title: {
text: "历史匹配记录",
position: "center"
},
content: {
text: dataHTML,
html: true
},
btn: {
reverse: true,
position: "space-between",
ok: {
enable: true,
callback(event) {
event.close();
NetDiskUI.Alias.historyAlias = void 0;
}
},
close: {
callback(event) {
event.close();
NetDiskUI.Alias.historyAlias = void 0;
}
},
cancel: {
enable: false
},
other: {
enable: true,
text: `清空所有(${data.length})`,
type: "xiaomi-primary",
callback: (event) => {
NetDiskPops.confirm({
title: {
text: "删除",
position: "center"
},
content: {
text: "确定清空所有的记录?",
html: false
},
btn: {
ok: {
enable: true,
callback(okEvent) {
that.clearStorageData();
domUtils.remove(
NetDiskUI.Alias.historyAlias.$shadowRoot.querySelectorAll(
".whitesevPopNetDiskHistoryMatch .pops-confirm-content ul li"
)
);
okEvent.close();
domUtils.html(
NetDiskUI.Alias.historyAlias.$shadowRoot.querySelector(
".whitesevPopNetDiskHistoryMatch .netdiskrecord-page"
),
""
);
domUtils.text(
NetDiskUI.Alias.historyAlias.$shadowRoot.querySelector(
".whitesevPopNetDiskHistoryMatch .pops-confirm-btn-other"
),
domUtils.text(
NetDiskUI.Alias.historyAlias.$shadowRoot.querySelector(
".whitesevPopNetDiskHistoryMatch .pops-confirm-btn-other"
)
).replace(/[\d]+/gi, "0")
);
}
},
cancel: {
text: "取消",
enable: true
}
}
});
}
}
},
mask: {
clickCallBack(originalRun) {
originalRun();
NetDiskUI.Alias.historyAlias = null;
}
},
class: "whitesevPopNetDiskHistoryMatch",
style: indexCSS$4
},
NetDiskUI.popsStyle.historyMatchView
);
this.setDataPaging(data);
this.setEvent(NetDiskUI.Alias.historyAlias.$shadowRoot);
this.setSearchEvent();
NetDiskUI.setRightClickMenu(
NetDiskUI.Alias.historyAlias.$shadowRoot.querySelector(
".whitesevPopNetDiskHistoryMatch"
),
".netdiskrecord-link a",
true
);
},
/**
* 获取CSS
*/
getCSS() {
},
/**
* 获取显示出的每一项的html
* @param data
*/
getTableHTML(data) {
let netDiskURL = NetDisk.handleLinkShow(
data.netDiskName,
data.netDiskIndex,
data.shareCode,
data.accessCode,
data.matchText
);
let $liItemContainer = domUtils.createElement("li", {
innerHTML: (
/*html*/
`
记录时间
${utils.formatTime(data.addTime)}
更新时间
${utils.formatTime(data.updateTime)}
`
)
});
let $link = $liItemContainer.querySelector(
".netdiskrecord-link"
);
let $linkAnchor = $link.querySelector("a");
let $icon = $liItemContainer.querySelector(
".netdiskrecord-icon"
);
let $iconImg = $liItemContainer.querySelector(".netdisk-icon-img");
let $url = $liItemContainer.querySelector(".netdiskrecord-url");
let $urlTitle = $liItemContainer.querySelector(
".netdiskrecord-url-title"
);
let $addTime = $liItemContainer.querySelector(
".netdiskrecord-add-time"
);
let $updateTime = $liItemContainer.querySelector(
".netdiskrecord-update-time"
);
let $features = $liItemContainer.querySelector(
".netdiskrecord-functions"
);
let $featuresBtnDelete = $features.querySelector(".btn-delete");
NetDiskView.handleElementAttributeRuleInfo(
{
netDisk: data.netDiskName,
netDiskIndex: data.netDiskIndex,
shareCode: data.shareCode,
accessCode: data.accessCode
},
$linkAnchor
);
$iconImg.style.cssText = `background: url(${NetDiskUI.src.icon[data.netDiskName]}) no-repeat;background-size:100%`;
if (data.url !== data.topURL) {
let $topUrl = domUtils.createElement("div", {
className: "netdiskrecord-top-url",
innerHTML: (
/*html*/
`
Top网址
${data.topURL}
`
)
});
domUtils.after($url, $topUrl);
}
$featuresBtnDelete.setAttribute("data-json", JSON.stringify(data));
Reflect.set($featuresBtnDelete, "data-json", data);
return {
$liItemContainer,
$link,
$linkAnchor,
$icon,
$iconImg,
$url,
$urlTitle,
$addTime,
$updateTime,
$features,
$featuresBtnDelete,
html: $liItemContainer.outerHTML
};
},
/**
* 设置只执行一次的事件
* @param target
*/
setEvent(target) {
let that = this;
NetDiskUI.view.setNetDiskUrlClickEvent(
target,
".whitesevPopNetDiskHistoryMatch .pops-confirm-content .netdiskrecord-link a"
);
domUtils.on(
target,
"click",
".whitesevPopNetDiskHistoryMatch .pops-confirm-content .netdiskrecord-functions button.btn-delete",
function(event) {
var _a2;
let deleteLoading = NetDiskPops.loading({
parent: target.querySelector(
".whitesevPopNetDiskHistoryMatch .pops-confirm-content ul"
),
content: {
text: "删除中..."
},
only: true,
addIndexCSS: false
});
let clickNode = event.target;
let dataJSON = clickNode.getAttribute("data-json");
(_a2 = clickNode.closest("li")) == null ? void 0 : _a2.remove();
that.deleteStorageData(dataJSON);
deleteLoading == null ? void 0 : deleteLoading.close();
let totalNumberText = domUtils.text(
target.querySelector(
".whitesevPopNetDiskHistoryMatch .pops-confirm-btn-other"
)
);
let totalNumberMatch = totalNumberText.match(/[\d]+/gi);
let totalNumber = parseInt(
totalNumberMatch[totalNumberMatch.length - 1]
);
totalNumber--;
totalNumberText = totalNumberText.replace(
/[\d]+/gi,
totalNumber.toString()
);
domUtils.text(
target.querySelector(
".whitesevPopNetDiskHistoryMatch .pops-confirm-btn-other"
),
totalNumberText
);
let data = that.getStorageData();
data = that.orderNetDiskHistoryMatchData(data);
that.dataPaging.refresh(data);
that.pageChangeCallBack(data, that.dataPaging.CONFIG.currentPage);
}
);
},
/**
* 页码改变的回调
* @param data
* @param page
*/
pageChangeCallBack(data, page) {
let startIndex = (page - 1) * 10;
let dataHTML = "";
for (let index = 0; index < 10; index++) {
if (data[startIndex]) {
dataHTML += this.getTableHTML(data[startIndex]).html;
} else {
break;
}
startIndex++;
}
NetDiskUI.Alias.historyAlias.$shadowRoot.querySelectorAll(
".whitesevPopNetDiskHistoryMatch .netdiskrecord-table ul li"
).forEach((ele) => ele.remove());
domUtils.append(
NetDiskUI.Alias.historyAlias.$shadowRoot.querySelector(
".whitesevPopNetDiskHistoryMatch .netdiskrecord-table ul"
),
dataHTML
);
},
/**
* 设置分页
* @param data
*/
setDataPaging(data) {
let that = this;
let dataPaging = new __DataPaging({
data,
pageCount: 10,
pageStep: __pops.isPhone() ? 2 : 4,
currentPage: 1,
pageChangeCallBack: function(page) {
that.pageChangeCallBack(data, page);
}
});
this.dataPaging = dataPaging;
dataPaging.addCSS(NetDiskUI.Alias.historyAlias.$shadowRoot);
dataPaging.append(
NetDiskUI.Alias.historyAlias.$shadowRoot.querySelector(
".whitesevPopNetDiskHistoryMatch .netdiskrecord-page"
)
);
},
/**
* 设置搜索框的回车事件
*/
setSearchEvent() {
let isSeaching = false;
let searchLoading = void 0;
let that = this;
function searchEvent() {
if (isSeaching) {
return;
}
isSeaching = true;
searchLoading = NetDiskPops.loading({
parent: NetDiskUI.Alias.historyAlias.$shadowRoot.querySelector(
".whitesevPopNetDiskHistoryMatch .pops-confirm-content ul"
),
content: {
text: "搜索中..."
},
only: true,
addIndexCSS: false
});
let inputText = NetDiskUI.Alias.historyAlias.$shadowRoot.querySelector(
".whitesevPopNetDiskHistoryMatch .netdiskrecord-search input"
).value.trim();
let data = that.getStorageData();
data = that.orderNetDiskHistoryMatchData(data);
if (inputText === "") {
let historyDataHTML = "";
data.forEach((item, index) => {
if (index > 9) {
return;
}
historyDataHTML += that.getTableHTML(item).html;
});
NetDiskUI.Alias.historyAlias.$shadowRoot.querySelectorAll(
".whitesevPopNetDiskHistoryMatch .netdiskrecord-table ul li"
).forEach((ele) => ele.remove());
domUtils.append(
NetDiskUI.Alias.historyAlias.$shadowRoot.querySelector(
".whitesevPopNetDiskHistoryMatch .netdiskrecord-table ul"
),
historyDataHTML
);
searchLoading == null ? void 0 : searchLoading.close();
isSeaching = false;
that.setDataPaging(data);
return;
}
let isFindHTML = "";
data.forEach((item) => {
let netDiskURL = NetDisk.handleLinkShow(
item.netDiskName,
item.netDiskIndex,
item.shareCode,
item.accessCode,
item.matchText
);
if (netDiskURL.match(new RegExp(inputText, "ig")) || item.url.match(new RegExp(inputText, "ig")) || item.topURL.match(new RegExp(inputText, "ig")) || item.title.match(new RegExp(inputText, "ig"))) {
isFindHTML += that.getTableHTML(item).html;
}
});
domUtils.remove(
NetDiskUI.Alias.historyAlias.$shadowRoot.querySelectorAll(
".whitesevPopNetDiskHistoryMatch .netdiskrecord-table ul li"
)
);
domUtils.append(
NetDiskUI.Alias.historyAlias.$shadowRoot.querySelector(
".whitesevPopNetDiskHistoryMatch .netdiskrecord-table ul"
),
isFindHTML
);
domUtils.remove(
NetDiskUI.Alias.historyAlias.$shadowRoot.querySelectorAll(
".whitesevPopNetDiskHistoryMatch .netdiskrecord-page > *"
)
);
searchLoading == null ? void 0 : searchLoading.close();
searchLoading = void 0;
isSeaching = false;
}
domUtils.listenKeyboard(
NetDiskUI.Alias.historyAlias.$shadowRoot.querySelector(
".whitesevPopNetDiskHistoryMatch .netdiskrecord-search input"
),
"keypress",
(keyName) => {
if (keyName === "Enter") {
searchEvent();
}
}
);
},
/**
* 排序数据
* @param data
*/
orderNetDiskHistoryMatchData(data) {
let localOrder = NetDiskGlobalData.historyMatch["netdisk-history-match-ordering-rule"].value;
let isDesc = localOrder.indexOf("降序") !== -1 ? true : false;
let orderField = localOrder.indexOf("记录时间") !== -1 ? "addTime" : "updateTime";
utils.sortListByProperty(
data,
(item) => {
return item[orderField];
},
isDesc
);
return data;
},
/**
* 查询访问码
* @param netDiskName
* @param shareCode
* @param isNotNull 查询的访问码是否不为空
* + true 不能是空的
* + false 允许为空
*/
queryAccessCode(netDiskName, shareCode, isNotNull) {
let storageDataList = this.getStorageData();
for (let index = 0; index < storageDataList.length; index++) {
const localData = storageDataList[index];
if (localData.netDiskName === netDiskName && localData.shareCode === shareCode) {
if (isNotNull && utils.isNotNull(localData.accessCode)) {
return localData.accessCode;
}
return localData.accessCode;
}
}
},
/**
* 同步访问码
* @param netDiskName 网盘名称
* @param netDiskIndex 网盘名称索引下标
* @param shareCode 分享码
* @param accessCode 新的访问码
*/
syncAccessCode(netDiskName, netDiskIndex, shareCode, accessCode) {
if (NetDiskGlobalData.historyMatch.saveMatchNetDisk.value) {
let flag = NetDiskHistoryMatchView.changeMatchedDataAccessCode(
netDiskName,
netDiskIndex,
shareCode,
accessCode
);
if (flag) {
log.success("已成功同步访问码至历史匹配记录");
return true;
} else {
log.error("同步访问码至历史匹配记录失败");
}
}
return false;
},
/**
* 修改存储的数据的访问码
* @param netDiskName 网盘名称
* @param netDiskIndex 网盘名称索引下标
* @param shareCode 分享码
* @param accessCode 新的访问码
*/
changeMatchedDataAccessCode(netDiskName, netDiskIndex, shareCode, accessCode) {
let storageDataList = this.getStorageData();
let flag = false;
for (let index = 0; index < storageDataList.length; index++) {
const localData = storageDataList[index];
if (localData.netDiskName === netDiskName && String(localData.netDiskIndex) === String(netDiskIndex) && localData.shareCode === shareCode) {
flag = true;
storageDataList[index].accessCode = accessCode;
storageDataList[index].updateTime = Date.now();
}
}
if (flag) {
this.saveStorageData(storageDataList);
}
return flag;
},
/**
* 存储匹配到的链接
* @param netDiskName 网盘名称
* @param netDiskIndex 网盘名称索引下标
* @param shareCode 分享码
* @param accessCode 访问码
* @param matchText 匹配到的文本
*/
changeMatchedData(netDiskName, netDiskIndex, shareCode, accessCode, matchText) {
if (!NetDiskGlobalData.historyMatch.saveMatchNetDisk.value) {
return false;
}
let storageDataList = this.getStorageData();
let flag = false;
for (let index = 0; index < storageDataList.length; index++) {
const localData = storageDataList[index];
if (localData.netDiskName === netDiskName && shareCode.startsWith(localData.shareCode) && localData.netDiskIndex === netDiskIndex) {
if (NetDiskGlobalData.historyMatch["netdisk-history-match-merge-same-link"].value || localData.url === window.location.href && localData.topURL === top.window.location.href) {
flag = true;
let editFlag = false;
if (matchText.trim() !== "" && localData.matchText !== matchText) {
editFlag = true;
log.success("匹配历史记录 -> 设置新的matchText", [matchText]);
storageDataList[index].matchText = matchText;
}
if (utils.isNotNull(accessCode) && localData.accessCode !== accessCode) {
editFlag = true;
log.success("匹配历史记录 -> 修改accessCode");
storageDataList[index].accessCode = accessCode;
}
if (editFlag) {
storageDataList[index].updateTime = Date.now();
if (storageDataList[index].title) {
storageDataList[index].title = document.title;
}
if (NetDiskGlobalData.historyMatch["netdisk-history-match-merge-same-link"].value) {
storageDataList[index].url = window.location.href;
storageDataList[index].topURL = top.window.location.href;
}
break;
}
}
}
}
if (!flag) {
flag = true;
log.success("匹配历史记录 -> 增加新的");
let time = Date.now();
storageDataList = [
...storageDataList,
{
url: window.location.href,
topURL: top.window.location.href,
netDiskName,
netDiskIndex,
shareCode,
accessCode,
addTime: time,
updateTime: time,
title: document.title || top.document.title,
matchText
}
];
}
this.saveStorageData(storageDataList);
return true;
},
/**
* 检测并尝试修复本地的数据
*/
checkAndRepairLocalData() {
let repairCount = 0;
let data = _GM_getValue(this.storageKey);
if (Array.isArray(data)) {
for (let index = 0; index < data.length; index++) {
const itemData = data[index];
if (typeof itemData["matchText"] !== "string") {
itemData["matchText"] = "";
repairCount++;
}
}
} else {
data = [];
}
this.saveStorageData(data);
return {
count: data.length,
repairCount
};
},
/**
* 获取历史匹配到的链接
*/
getStorageData() {
let data = _GM_getValue(this.storageKey, []);
if (data == null) {
data = [];
this.saveStorageData(data);
}
return data;
},
/**
* 保存数据到本地存储的链接数据
*/
saveStorageData(data) {
_GM_setValue(this.storageKey, data);
},
/**
* 删除存储的某个项
* @param dataJSONText
*/
deleteStorageData(dataJSONText) {
let isSuccess = false;
let data = this.getStorageData();
for (let index = 0; index < data.length; index++) {
if (JSON.stringify(data[index]) === dataJSONText) {
log.success("删除 ===> ", data[index]);
data.splice(index, 1);
isSuccess = true;
break;
}
}
if (isSuccess) {
this.saveStorageData(data);
}
return isSuccess;
},
/**
* 清空所有配置
*/
clearStorageData() {
this.saveStorageData([]);
}
};
const NetDiskWorker = {
/** 是否正在匹配中 */
isHandleMatch: false,
/** 触发匹配,但是处于匹配中,计数器保存匹配数,等待完成匹配后再执行一次匹配 */
delayNotMatchCount: 0,
/** 主动触发监听DOM变化的事件 */
dispatchMonitorDOMChange: false,
/** worker的Blob链接 */
blobUrl: "",
/** worker对象 */
GM_matchWorker: void 0,
init() {
this.initWorkerBlobLink();
this.initWorker();
this.monitorDOMChange();
},
/** 初始化Worker的Blob链接 */
initWorkerBlobLink() {
const handleMatch = (
/*js*/
`
(() => {
function ${NetDiskWorker.handleRegularMatch.toString()}
function ${NetDiskWorker.uniqueArr}
this.addEventListener(
"message",
function (event) {
const data = event.data;
let matchedList = [];
${NetDiskWorker.handleRegularMatch.name}(data,(matchData)=>{
matchedList.push(matchData);
})
matchedList = ${NetDiskWorker.uniqueArr.name}(matchedList);
this.postMessage({
options: data,
msg: "Match End",
data: matchedList,
startTime: data.startTime,
endTime: Date.now(),
});
},
{
capture: true,
}
);
})();
`
);
let blob = new Blob([handleMatch]);
NetDiskWorker.blobUrl = window.URL.createObjectURL(blob);
log.info(`Worker Blob Link ===> ${NetDiskWorker.blobUrl}`);
},
/**
* 处理规则匹配
*
* 传入的规则肯定是允许执行匹配的规则
* @param workerOptionData 数据
* @param callback 成功匹配到的回调
*/
handleRegularMatch(workerOptionData, callback) {
const NetDiskRegularNameList = Object.keys(workerOptionData.regular);
const matchTextList = workerOptionData.textList.map((matchTextItem) => {
for (let index = 0; index < workerOptionData.characterMapping.length; index++) {
const characterMapping = workerOptionData.characterMapping[index];
try {
if (typeof characterMapping.searchValue === "string") {
matchTextItem = matchTextItem.replaceAll(
characterMapping.searchValue,
characterMapping.replaceValue
);
} else {
matchTextItem = matchTextItem.replace(
characterMapping.searchValue,
characterMapping.replaceValue
);
}
} catch (error) {
}
}
return matchTextItem;
});
for (const netDiskName of NetDiskRegularNameList) {
const netDiskRegular = workerOptionData.regular[netDiskName];
for (let index = 0; index < netDiskRegular.length; index++) {
const netDiskRegularItem = netDiskRegular[index];
let matchRegExpList = [];
if (workerOptionData.matchTextRange.includes("innerText")) {
matchRegExpList.push(
new RegExp(netDiskRegularItem["link_innerText"], "gi")
);
}
if (workerOptionData.matchTextRange.includes("innerHTML")) {
matchRegExpList.push(
new RegExp(netDiskRegularItem["link_innerHTML"], "gi")
);
}
if (!workerOptionData.matchTextRange.length) {
console.error(workerOptionData);
throw new TypeError("未设置匹配范围");
}
if (!matchRegExpList.length) {
throw new TypeError(
"未知的匹配范围: " + workerOptionData.matchTextRange
);
}
for (let matchRegExpIndex = 0; matchRegExpIndex < matchRegExpList.length; matchRegExpIndex++) {
const matchRegExp = matchRegExpList[matchRegExpIndex];
for (let textIndex = 0; textIndex < matchTextList.length; textIndex++) {
let text = matchTextList[textIndex];
let matchArray = text.match(matchRegExp);
if (matchArray && matchArray.length) {
callback({
netDiskName,
netDiskIndex: index,
data: matchArray
});
}
}
}
}
}
},
/**
* 数组去重
* @param arr 待去重的数组
*/
uniqueArr(arr) {
return arr.filter((obj, index, selfArray) => {
return index === selfArray.findIndex((item) => {
return JSON.stringify(item) === JSON.stringify(obj);
});
});
},
/**
* 初始化Worker对象
*/
initWorker() {
try {
NetDiskWorker.GM_matchWorker = new Worker(NetDiskWorker.blobUrl);
NetDiskWorker.GM_matchWorker.onmessage = NetDiskWorker.onMessage;
NetDiskWorker.GM_matchWorker.onerror = NetDiskWorker.onError;
} catch (error) {
log.error(
"初始化Worker失败,可能页面使用了Content-Security-Policy策略,使用代替函数,该函数执行匹配时如果内容过大会导致页面卡死",
error.message
);
NetDiskWorker.GM_matchWorker = {
postMessage(data) {
return new Promise((resolve, reject) => {
let matchedList = [];
try {
NetDiskWorker.handleRegularMatch(data, (matchData) => {
matchedList.push(matchData);
});
} catch (error2) {
NetDiskWorker.onError(error2);
} finally {
matchedList = NetDiskWorker.uniqueArr(matchedList);
NetDiskWorker.onMessage(
new MessageEvent("message", {
data: {
options: data,
msg: "Match End",
data: matchedList,
startTime: data.startTime,
endTime: Date.now()
}
})
);
resolve(null);
}
});
}
};
}
},
/**
* 传递数据给worker内进行处理匹配
* @param message 数据
* @param options 配置
*/
postMessage(message, options) {
NetDiskWorker.GM_matchWorker.postMessage(message, options);
},
/**
* Worker的onmessage
* 这里的this指向会被修改
* @param event
*/
onMessage(event) {
const data = event.data;
if (data.data.length) {
log.success(
`成功匹配${data.data.length}个,用时${Date.now() - data.startTime}ms`
);
}
if (data.options.from === "PasteText") {
NetDiskUI.matchPasteText.workerMatchEndCallBack(data);
}
if (data.options.from.startsWith("FirstLoad")) {
NetDiskWorker.delayNotMatchCount++;
}
NetDiskWorker.successCallBack(data);
},
/**
* Worker的onerror
* @param error
*/
onError(error) {
NetDiskWorker.errorCallBack(error);
},
/**
* worker处理文件匹配后的回调
* @param options
*/
successCallBack(options) {
if (!options.data.length) {
NetDiskWorker.matchingEndCallBack();
return;
}
const handleNetDiskList = [];
for (const matchData of options.data) {
NetDisk.$match.matchedInfoRuleKey.add(matchData.netDiskName);
let matchLinkSet = /* @__PURE__ */ new Set();
matchData.data.forEach((item) => {
matchLinkSet.add(item);
});
matchLinkSet.forEach((item) => {
let handleLink = NetDisk.handleLink(
matchData.netDiskName,
matchData.netDiskIndex,
item
);
if (handleLink) {
handleNetDiskList.push({
shareCode: handleLink.shareCode,
accessCode: handleLink.accessCode,
netDiskName: matchData.netDiskName,
netDiskIndex: matchData.netDiskIndex,
matchText: item
});
}
});
}
let filterHandleNetDiskList = handleNetDiskList.filter(
(value, index, selfArray) => {
let isFind = selfArray.findIndex((obj) => {
return (
//JSON.stringify(obj) === JSON.stringify(value)
obj.accessCode === value.accessCode && obj.netDiskIndex === value.netDiskIndex && obj.netDiskName === value.netDiskName && obj.shareCode === value.shareCode
);
}) === index;
return isFind;
}
);
filterHandleNetDiskList.forEach((item) => {
if (NetDisk.$match.tempMatchedInfo.has(item.netDiskName)) {
let currentTempDict = NetDisk.$match.tempMatchedInfo.get(
item.netDiskName
);
currentTempDict.set(item.shareCode, item);
}
});
filterHandleNetDiskList.forEach((item) => {
let { shareCode, accessCode, netDiskName, netDiskIndex, matchText } = item;
const currentRule = NetDisk.$rule.rule.find(
(item2) => item2.setting.key === netDiskName
);
const currentRegular = currentRule.rule[netDiskIndex];
let isBlackShareCode = false;
NetDisk.$match.blackMatchedInfo.forEach(
(blackMatchInfoItem, blackNetDiskName) => {
if (blackNetDiskName !== item.netDiskName) {
return;
}
let isFindBlackShareCode = blackMatchInfoItem.has(shareCode);
if (isFindBlackShareCode) {
isBlackShareCode = true;
log.warn(
`匹配到黑名单分享码,已过滤:${shareCode}`,
JSON.stringify(item)
);
}
}
);
if (isBlackShareCode) {
return;
}
if (currentRegular.shareCodeExcludeRegular && Array.isArray(currentRegular.shareCodeExcludeRegular)) {
for (const excludeRegularName of currentRegular.shareCodeExcludeRegular) {
let excludeDict = NetDisk.$match.matchedInfo.get(excludeRegularName);
let currentTempDict = NetDisk.$match.tempMatchedInfo.get(excludeRegularName);
if (excludeDict.startsWith(shareCode) || currentTempDict.startsWith(shareCode)) {
log.warn(
`${netDiskName}:该分享码【${shareCode}】与已匹配到该分享码的规则【${excludeRegularName}】冲突`
);
return;
}
}
}
const currentDict = NetDisk.$match.matchedInfo.get(netDiskName);
NetDisk.$data.isMatchedLink = true;
if (currentDict.startsWith(shareCode)) {
let shareCodeDict = currentDict.getStartsWith(shareCode);
if (typeof shareCodeDict.isForceAccessCode === "boolean" && shareCodeDict.isForceAccessCode) {
return;
}
if (utils.isNotNull(shareCodeDict.accessCode)) {
return;
}
if (utils.isNull(accessCode)) {
return;
}
currentDict.set(
shareCode,
NetDisk.getLinkDickObj(accessCode, netDiskIndex, false, matchText)
);
NetDiskUI.view.changeLinkView(
netDiskName,
netDiskIndex,
shareCode,
accessCode,
matchText
);
log.info(
`该匹配项无密码,设置密码 ${netDiskName} ${netDiskIndex}: ${shareCode} ===> ${accessCode}`
);
} else {
if (utils.isNull(accessCode) && NetDiskGlobalData.accessCode.allowQueryHistoryMatchingAccessCode.value) {
let historyMatchAccessCode = NetDiskHistoryMatchView.queryAccessCode(
netDiskName,
shareCode,
true
);
if (historyMatchAccessCode) {
log.info(
"历史匹配记录 ==> 查询到访问码:" + historyMatchAccessCode
);
accessCode = historyMatchAccessCode;
}
}
currentDict.set(
shareCode,
NetDisk.getLinkDickObj(accessCode, netDiskIndex, false, matchText)
);
NetDiskUI.isMatchedNetDiskIconMap.add(netDiskName);
NetDiskUI.view.addLinkView(
netDiskName,
netDiskIndex,
shareCode,
accessCode,
matchText
);
log.success(
`添加链接 ${netDiskName} ${netDiskIndex}: ${shareCode} ===> ${accessCode}`
);
}
});
Object.keys(NetDisk.$match.tempMatchedInfo.getItems()).forEach(
(keyName) => {
NetDisk.$match.tempMatchedInfo.get(keyName).clear();
}
);
if (NetDisk.$data.isMatchedLink) {
switch (NetDiskGlobalData.features["netdisk-behavior-mode"].value) {
case "suspension_smallwindow".toLowerCase():
if (NetDiskSuspensionConfig.mode.current_suspension_smallwindow_mode.value === "suspension") {
NetDiskUI.suspension.show();
} else {
NetDiskUI.view.show();
}
break;
case "suspension_window".toLowerCase():
NetDiskUI.suspension.show();
break;
case "smallwindow".toLowerCase():
NetDiskUI.view.show();
break;
default:
log.error(
"未知的行为模式:" + NetDiskGlobalData.features["netdisk-behavior-mode"].value
);
}
}
NetDiskWorker.matchingEndCallBack();
},
/**
* Worker失败回调
* @param error
*/
errorCallBack(error) {
NetDiskWorker.matchingEndCallBack(true);
log.error("Worker Error", error);
},
/**
* 匹配结束回调
* @param isNow 是否立刻释放锁
*/
matchingEndCallBack(isNow) {
if (isNow) {
NetDiskWorker.isHandleMatch = false;
if (NetDiskWorker.delayNotMatchCount > 0) {
NetDiskWorker.delayNotMatchCount = 0;
NetDiskWorker.dispatchMonitorDOMChange = true;
}
} else {
const delaytime = parseFloat(NetDiskGlobalData.match.delaytime.value.toString()) * 1e3;
setTimeout(() => {
NetDiskWorker.matchingEndCallBack(true);
}, delaytime);
}
},
/**
* 监听页面节点内容或节点文本的变动,从而进行匹配网盘链接
*/
monitorDOMChange() {
const isAddedNodeToMatch = NetDiskGlobalData.match.isAddedNodesToMatch.value;
const readClipboard = NetDiskGlobalData.match.readClipboard.value;
const matchRange = NetDiskGlobalData.match.pageMatchRange.value;
let isFirstLoad = true;
let isFirstLoadPageText = true;
let isFirstLoadPageHTML = true;
let isDepthAcquisitionWithShadowRoot = NetDiskGlobalData.match.depthQueryWithShadowRoot.value;
const matchRegular = {};
const characterMapping = CharacterMapping.getMappingData();
NetDisk.$rule.rule.forEach((item) => {
let netDiskName = item.setting.key;
let netDiskRuleEnable = NetDiskRuleData.function.enable(netDiskName);
if (!netDiskRuleEnable) {
return;
}
if (Reflect.has(matchRegular, netDiskName)) {
matchRegular[netDiskName] = [
...matchRegular[netDiskName],
...item.rule
];
} else {
Reflect.set(matchRegular, netDiskName, item.rule);
}
});
async function observeEvent(mutations) {
if (NetDiskWorker.isHandleMatch) {
NetDiskWorker.delayNotMatchCount++;
return;
}
if (isAddedNodeToMatch && mutations && mutations.length) {
let hasAddedNode = false;
for (let index = 0; index < mutations.length; index++) {
const mutation = mutations[index];
if (mutation.addedNodes && mutation.addedNodes instanceof NodeList) {
if (mutation.addedNodes.length) {
hasAddedNode = true;
break;
}
}
}
if (!hasAddedNode) {
return;
}
}
NetDiskWorker.isHandleMatch = true;
const startTime = Date.now();
if (readClipboard) {
try {
NetDisk.$data.clipboardText = await CommonUtils.getClipboardText();
} catch (error) {
}
}
if (typeof NetDisk.$data.clipboardText !== "string") {
NetDisk.$data.clipboardText = "";
}
const toMatchedTextList = [];
if (utils.isNotNull(NetDisk.$data.clipboardText)) {
let clipboardText = NetDisk.$data.clipboardText;
toMatchedTextList.push(clipboardText);
}
if (NetDiskGlobalData.match.allowMatchLocationHref) {
let decodeComponentUrl = NetDiskRuleUtils.getDecodeComponentUrl();
toMatchedTextList.push(decodeComponentUrl);
}
if (isFirstLoad) {
isFirstLoad = false;
if (toMatchedTextList.length) {
NetDiskWorker.postMessage({
characterMapping,
textList: toMatchedTextList,
matchTextRange: matchRange,
regular: matchRegular,
startTime,
from: "FirstLoad-DOMChange"
});
return;
}
}
if (matchRange.includes("innerText")) {
let pageTextList = NetDiskWorkerUtils.getPageText(
document.documentElement,
isDepthAcquisitionWithShadowRoot
);
toMatchedTextList.push(...pageTextList);
if (isFirstLoadPageText) {
isFirstLoadPageText = false;
NetDiskWorker.postMessage({
characterMapping,
textList: toMatchedTextList,
matchTextRange: matchRange,
regular: matchRegular,
startTime,
from: "FirstLoad-Text-DOMChange"
});
return;
}
}
if (matchRange.includes("innerHTML")) {
let pageHTMLList = NetDiskWorkerUtils.getPageHTML(
document.documentElement,
isDepthAcquisitionWithShadowRoot
);
toMatchedTextList.push(...pageHTMLList);
if (isFirstLoadPageHTML) {
isFirstLoadPageHTML = false;
NetDiskWorker.postMessage({
characterMapping,
textList: toMatchedTextList,
matchTextRange: matchRange,
regular: matchRegular,
startTime,
from: "FirstLoad-HTML-DOMChange"
});
return;
}
}
if (NetDiskGlobalData.match.toBeMatchedWithInputElementValue) {
let inputValueList = NetDiskWorkerUtils.getInputElementValue(
document.documentElement,
isDepthAcquisitionWithShadowRoot
);
toMatchedTextList.push(...inputValueList);
}
if (NetDiskGlobalData.match.toBeMatchedTextAreaElementValue) {
let textAreaValueList = NetDiskWorkerUtils.getTextAreaElementValue(
document.documentElement,
isDepthAcquisitionWithShadowRoot
);
toMatchedTextList.push(...textAreaValueList);
}
NetDiskWorker.postMessage({
characterMapping,
textList: toMatchedTextList,
matchTextRange: matchRange,
regular: matchRegular,
startTime,
from: "DOMChange"
});
}
let dispatchMonitorDOMChange = NetDiskWorker.dispatchMonitorDOMChange;
Object.defineProperty(NetDiskWorker, "dispatchMonitorDOMChange", {
set: function(value) {
dispatchMonitorDOMChange = value;
if (value) {
let addedNodes = document.querySelectorAll(
"html"
);
observeEvent([
{
addedNodes,
attributeName: null,
attributeNamespace: null,
nextSibling: null,
oldValue: null,
previousSibling: null,
removedNodes: addedNodes,
target: addedNodes[0],
type: "attributes"
}
]);
}
},
get: function() {
return dispatchMonitorDOMChange;
}
});
if (NetDiskGlobalData.features["netdisk-match-mode"].value === "MutationObserver") {
utils.mutationObserver(document.documentElement, {
callback: observeEvent,
config: {
/* 子节点的变动(新增、删除或者更改) */
childList: NetDiskGlobalData.match["mutationObserver-childList"].value,
/* 节点内容或节点文本的变动 */
characterData: NetDiskGlobalData.match["mutationObserver-characterData"].value,
/* 是否将观察器应用于该节点的所有后代节点 */
subtree: NetDiskGlobalData.match["mutationObserver-subtree"].value
}
});
this.dispatchMonitorDOMChange = true;
} else if (NetDiskGlobalData.features["netdisk-match-mode"].value === "Menu") {
GM_Menu.add({
key: "performPageTextMatchingManually",
text: "点击执行文本匹配",
autoReload: false,
isStoreValue: false,
showText(text) {
return text;
},
callback: () => {
this.dispatchMonitorDOMChange = true;
}
});
} else {
log.error(
"未知匹配模式:" + NetDiskGlobalData.features["netdisk-match-mode"].value
);
}
}
};
const NetDiskUserRuleDebug = {
$el: {
$select: null,
$log: null,
$matchText: null,
$button: null
},
/**
* 重置环境变量
*/
reset() {
Object.keys(this.$el).forEach((keyName) => {
Reflect.deleteProperty(this.$el, keyName);
});
},
/**
* 设置日志输出
* @param {"info"|"error"|"success"|"warn"} tag 日志等级
* @param {...any[]} args
*/
setLog(tag, ...args) {
let text = "";
args.forEach((item) => {
if (text !== "") {
text += "\n";
}
if (typeof item !== "string") {
text += JSON.stringify(item, void 0, 4);
} else {
text += item;
}
});
let logElement = domUtils.createElement(
"p",
{
innerText: text
},
{
"data-tag": tag
}
);
domUtils.append(this.$el.$log, logElement);
},
/**
* 清空日志
*/
clearLog() {
this.$el.$log.innerHTML = "";
},
/**
* 显示调试规则的界面
* @param ruleJSON
*/
showUI(ruleJSON) {
this.reset();
if (utils.isNull(ruleJSON.regexp)) {
Qmsg.error("请先配置regexp");
return;
}
let that = this;
let customRule = NetDiskUserRule.parseRule([ruleJSON]);
let regexp = customRule[0].rule;
let dialog = NetDiskPops.confirm(
{
title: {
text: `调试规则 ${ruleJSON.key}`,
position: "center"
},
content: {
text: (
/*html*/
`
`
),
html: true
},
btn: {
ok: {
enable: false
}
},
style: (
/*css*/
`
.custom-rule-container{
display: flex;
align-items: center;
}
.custom-rule-select-regexp{
width: 100%;
height: 32px;
line-height: normal;
border: 1px solid rgb(184, 184, 184, var(--pops-bd-opacity));
border-radius: 5px;
text-align: center;
outline: 0;
background: rgb(255, 255, 255, var(--pops-bg-opacity));
box-shadow: none;
}
.custom-rule-input-container{
display: flex;
flex-wrap: wrap;
justify-content: center;
margin: 5px;
width: 30%;
}
.custom-rule-select-regexp-item{
}
button.custom-rule-run-match-button{
margin-top: 5px;
}
textarea.custom-rule-match-text{
width: 100%;
min-height: 70px;
outline: none;
margin: 0px;
background-image: none;
background-color: transparent;
display: inline-block;
resize: vertical;
padding: 5px;
line-height: normal;
box-sizing: border-box;
border: 1px solid rgb(220, 223, 230);
appearance: none;
}
.custom-rule-match-log{
}
.custom-rule-match-log-container{
padding: 5px;
background: rgb(229, 229, 229);
}
.custom-rule-match-log-container p{
margin: 2px 0px;
border-bottom: 1px solid #000000;
}
.custom-rule-match-log-container p:last-child{
border-bottom: 0px;
margin-bottom: 0px;
}
.custom-rule-match-log-container p[data-tag]{
}
.custom-rule-match-log-container p[data-tag="info"]{
}
.custom-rule-match-log-container p[data-tag="success"]{
color: green;
}
.custom-rule-match-log-container p[data-tag="warn"]{
color: yellow;
}
.custom-rule-match-log-container p[data-tag="error"]{
color: red;
}
`
)
},
NetDiskUI.popsStyle.customRuleDebugView
);
this.$el.$select = dialog.$shadowRoot.querySelector(
".custom-rule-select-regexp"
);
this.$el.$matchText = dialog.$shadowRoot.querySelector(
".custom-rule-match-text"
);
this.$el.$log = dialog.$shadowRoot.querySelector(
".custom-rule-match-log-container"
);
this.$el.$button = dialog.$shadowRoot.querySelector(
".custom-rule-run-match-button"
);
regexp.forEach((regExpItem, index) => {
this.$el.$select.appendChild(
domUtils.createElement("option", {
className: "custom-rule-select-regexp-item",
innerText: "regexp下标:" + index,
"data-value": regExpItem
})
);
});
function logCallBack(logData) {
if (Array.isArray(logData.msg)) {
that.setLog(logData.status ? "info" : "error", ...logData.msg);
} else {
that.setLog(logData.status ? "info" : "error", logData.msg);
}
if (!logData.status) {
that.setLog("error", "执行完毕");
}
}
function debugRunClickEvent() {
try {
if (utils.isNull(that.$el.$matchText.value)) {
Qmsg.error("请先输入待匹配的字符串");
return;
}
that.clearLog();
let netDiskName = ruleJSON.key;
let netDiskIndex = that.$el.$select.selectedIndex;
let selectRegularOption = that.$el.$select.selectedOptions[netDiskIndex]["data-value"];
log.info("当前选中的规则: ", selectRegularOption);
let testCustomRule = {};
testCustomRule[ruleJSON.key] = [selectRegularOption];
let matchTextList = [];
NetDiskWorker.handleRegularMatch(
{
characterMapping: CharacterMapping.getMappingData(),
regular: testCustomRule,
textList: [that.$el.$matchText.value],
matchTextRange: ["innerText", "innerHTML"],
startTime: Date.now(),
from: "Debug"
},
(matchData) => {
matchTextList.push(...matchData.data);
}
);
if (!matchTextList.length) {
that.setLog("error", "未成功匹配到数据");
return;
}
matchTextList = NetDiskWorker.uniqueArr(matchTextList);
that.setLog("info", "成功匹配到的数据 ==> ", matchTextList);
matchTextList.forEach((matchText, index) => {
that.setLog("success", "当前处理的字符串: " + matchText);
that.setLog("success", "当前执行: 对shareCode进行处理获取");
let shareCode = NetDiskDebug.handleShareCode(
matchText,
selectRegularOption,
logCallBack
);
if (utils.isNull(shareCode)) {
return;
}
that.setLog("info", " ");
that.setLog("info", `================分割线================`);
that.setLog("info", " ");
that.setLog("success", "当前执行: 对accessCode进行处理获取");
let accessCode = NetDiskDebug.handleAccessCode(
matchText,
selectRegularOption,
logCallBack
);
that.setLog("info", " ");
that.setLog("info", `================分割线================`);
that.setLog("info", " ");
that.setLog("success", "当前执行: 对uiLinkShow进行处理获取");
let uiLinkShow = NetDiskDebug.handleLinkShow(
matchText,
selectRegularOption,
shareCode,
accessCode,
logCallBack
);
that.setLog("info", " ");
that.setLog("info", `================分割线================`);
that.setLog("info", " ");
that.setLog("success", "当前执行: 对blank进行处理获取");
let blankUrl = NetDiskDebug.handleBlank(
matchText,
selectRegularOption,
shareCode,
accessCode,
logCallBack
);
that.setLog("info", " ");
that.setLog("info", `================分割线================`);
that.setLog("info", " ");
that.setLog("success", "当前执行: 对copyUrl进行处理获取");
let copyUrl = NetDiskDebug.handleCopyUrl(
matchText,
selectRegularOption,
shareCode,
accessCode,
logCallBack
);
that.setLog("success", "执行完毕");
});
} catch (error) {
log.error(error);
that.setLog(error.toString());
}
}
domUtils.on(that.$el.$button, "click", void 0, debugRunClickEvent);
}
};
const dialogCSS = '.pops[type-value="confirm"] .pops-confirm-content {\r\n overflow: hidden;\r\n}\r\n/* textarea美化 */\r\n.pops.whitesevPopNetDiskCustomRules[type-value="confirm"]\r\n .pops-confirm-content\r\n textarea {\r\n width: 100%;\r\n height: 100%;\r\n border: none;\r\n outline: none;\r\n padding: 0;\r\n margin: 0;\r\n -webkit-appearance: none;\r\n -moz-appearance: none;\r\n appearance: none;\r\n background-image: none;\r\n background-color: transparent;\r\n\r\n display: inline-block;\r\n resize: vertical;\r\n padding: 5px 15px;\r\n line-height: normal;\r\n box-sizing: border-box;\r\n border: 1px solid #dcdfe6;\r\n transition: border-color 0.2s cubic-bezier(0.645, 0.045, 0.355, 1);\r\n appearance: none;\r\n resize: none;\r\n}\r\n/* 获得焦点 */\r\n.pops.whitesevPopNetDiskCustomRules[type-value="confirm"]\r\n .pops-confirm-content\r\n textarea:focus {\r\n outline: none;\r\n border-color: #3677f0;\r\n}\r\n/* 提示文字 */\r\n.pops.whitesevPopNetDiskCustomRules[type-value="confirm"]\r\n .pops-confirm-content\r\n textarea::placeholder {\r\n color: #c0c4cc;\r\n}\r\n/* 鼠标hover */\r\n.pops.whitesevPopNetDiskCustomRules[type-value="confirm"]\r\n .pops-confirm-content\r\n textarea:hover {\r\n border-color: #c0c4cc;\r\n}\r\n';
const NetDiskUserRuleUI = {
/**
* 添加/编辑规则
* @param isEdit
* @param ruleKey 当isEdit为true时,传入该值
*/
show(isEdit, ruleKey) {
let titleText = "添加";
if (isEdit) {
titleText = "编辑";
}
titleText += "自定义规则";
let $ruleInput = null;
function saveCallBack(event, isDebug2) {
let ruleText = $ruleInput.value.trim();
let parseRuleResult = NetDiskUserRule.parseRuleStrToRule(ruleText);
if (parseRuleResult.success) {
let userRule = parseRuleResult.data;
if (isEdit) {
NetDiskUserRule.setRule(ruleKey, userRule);
} else {
NetDiskUserRule.addRule(userRule);
}
Qmsg.success("保存成功");
} else {
Qmsg.error(parseRuleResult.msg);
}
}
function debugCallBack(event) {
let ruleText = $ruleInput.value.trim();
let parseRuleResult = NetDiskUserRule.parseRuleStrToRule(ruleText);
if (parseRuleResult.success) {
let userRule = parseRuleResult.data;
NetDiskUserRuleDebug.showUI(userRule);
} else {
Qmsg.error(parseRuleResult.msg);
}
}
function formatCallBack(event) {
try {
let ruleJSON = JSON.parse($ruleInput.value);
let ruleJSONString = NetDiskUserRule.getFormatRule(ruleJSON);
$ruleInput.value = ruleJSONString;
Qmsg.success("格式化成功");
} catch (error) {
log.error(error);
Qmsg.error(error.message, {
html: true,
timeout: 3500
});
}
}
let dialog = NetDiskPops.confirm(
{
title: {
text: titleText,
position: "center"
},
content: {
text: (
/*html*/
`
`
),
html: true
},
btn: {
merge: true,
mergeReverse: false,
reverse: false,
position: "space-between",
ok: {
text: "保存",
callback: (eventDetails, event) => {
saveCallBack();
}
},
cancel: {
text: "调试",
callback: (eventDetails, event) => {
debugCallBack();
}
},
other: {
enable: true,
text: "格式化",
type: "xiaomi-primary",
callback: (eventDetails, event) => {
formatCallBack();
}
}
},
class: "whitesevPopNetDiskCustomRules",
style: dialogCSS
},
NetDiskUI.popsStyle.customRulesView
);
$ruleInput = dialog.$shadowRoot.querySelector("textarea");
if (isEdit) {
let rule = NetDiskUserRule.getRule(ruleKey);
$ruleInput.value = NetDiskUserRule.getFormatRule(rule);
} else {
$ruleInput.value = NetDiskUserRule.getTemplateRule();
}
}
};
const indexCSS$3 = 'div[class^="netdisk-custom-rule-"] {\r\n display: flex;\r\n align-items: center;\r\n margin-left: 10px;\r\n cursor: pointer;\r\n}\r\ndiv[class^="netdisk-custom-rule-"] svg,\r\ndiv[class^="netdisk-custom-rule-"] svg {\r\n width: 1.2em;\r\n height: 1.2em;\r\n}\r\n/* 控件被禁用的颜色 */\r\naside.pops-panel-aside li[data-key][data-function-enable="false"] {\r\n color: #a8abb2;\r\n filter: grayscale(100%);\r\n}\r\n';
const NetDiskGlobalSettingView = {
show() {
var _a2;
if (NetDiskUI.Alias.settingAlias) {
log.error("设置界面已存在");
Qmsg.error("设置界面已存在");
return;
}
let content = PopsPanel.getPanelContentConfig();
let ruleContent = NetDiskRule.getRulePanelContent();
content = content.concat(ruleContent);
let $panel = NetDiskPops.panel(
{
title: {
text: `${((_a2 = _GM_info == null ? void 0 : _GM_info.script) == null ? void 0 : _a2.name) || SCRIPT_NAME}-设置`,
position: "center"
},
content,
btn: {
close: {
enable: true,
callback(event) {
event.close();
NetDiskUI.Alias.settingAlias = void 0;
}
}
},
mask: {
clickCallBack(originalRun) {
originalRun();
NetDiskUI.Alias.settingAlias = void 0;
}
},
class: "whitesevPopSetting",
style: indexCSS$3
},
NetDiskUI.popsStyle.settingView
);
NetDiskUI.Alias.settingAlias = $panel;
this.setRuleHeaderControlsClickEvent($panel.$shadowRoot);
},
showPanel(details = {}) {
},
/**
* 设置自定义规则顶部的编辑|删除的点击事件
*/
setRuleHeaderControlsClickEvent($shadowRoot) {
domUtils.on(
$shadowRoot,
"click",
".netdisk-custom-rule-edit",
function(event) {
let $click = event.target;
let ruleKey = $click.getAttribute("data-key");
$click.getAttribute("data-type");
NetDiskUserRuleUI.show(true, ruleKey);
}
);
domUtils.on(
$shadowRoot,
"click",
".netdisk-custom-rule-delete",
function(event) {
let $click = event.target;
let ruleKey = $click.getAttribute("data-key");
let ruleName = $click.getAttribute("data-type");
NetDiskPops.alert({
title: {
text: "提示",
position: "center"
},
content: {
text: `确定删除自定义规则 ${ruleName}(${ruleKey}) 吗?`
},
btn: {
ok: {
callback(okEvent) {
let deleteStatus = NetDiskUserRule.deleteRule(ruleKey);
if (deleteStatus) {
let asideElement = NetDiskUI.Alias.settingAlias.$shadowRoot.querySelector(
`.pops-panel-aside > ul > li[data-key="${ruleKey}"]`
);
let $prev = asideElement.previousElementSibling;
let $next = asideElement.nextElementSibling;
if ($prev) {
$prev.click();
} else if ($next) {
$next.click();
}
asideElement == null ? void 0 : asideElement.remove();
Qmsg.success("删除成功");
okEvent.close();
} else {
Qmsg.error("删除自定义规则失败");
}
}
}
}
});
}
);
}
};
const indexCSS$2 = ".whitesevSuspension {\r\n top: 0;\r\n position: fixed;\r\n right: 10px;\r\n border-radius: 12px;\r\n}\r\n.whitesevSuspension .whitesevSuspensionMain {\r\n background: #fff;\r\n border: 1px solid #f2f2f2;\r\n box-shadow: 0 0 15px #e4e4e4;\r\n box-sizing: border-box;\r\n border-radius: inherit;\r\n height: inherit;\r\n width: inherit;\r\n}\r\n.whitesevSuspension .whitesevSuspensionFloor {\r\n border-bottom: 1px solid #f2f2f2;\r\n position: relative;\r\n box-sizing: border-box;\r\n border-radius: inherit;\r\n height: inherit;\r\n width: inherit;\r\n}\r\n.whitesevSuspension .whitesevSuspensionFloor .netdisk {\r\n background-position: center center;\r\n background-size: 115% 115%;\r\n background-repeat: no-repeat;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n border-radius: inherit;\r\n height: inherit;\r\n width: inherit;\r\n}\r\n.whitesevSuspension .whitesevSuspensionFloor .netdisk:hover {\r\n transition: all 300ms linear;\r\n background-color: #e4e4e4;\r\n transform: scale(1.1);\r\n}\r\n.whitesevPop-content p[pop] {\r\n height: 100%;\r\n}\r\n";
const NetDiskSuspensionConfig = {
position: {
/** 悬浮按钮位置的x坐标 */
suspensionX: GenerateData("suspensionX", DOMUtils.width(window) - 50),
/** 悬浮按钮位置的y坐标 */
suspensionY: GenerateData(
"suspensionY",
(DOMUtils.height(window) - 50) / 2
),
/** 悬浮按钮所在位置的最大x */
suspensionMaxX: GenerateData(
"susponsionMax-x",
DOMUtils.width(window) - 50
),
/** 悬浮按钮所在位置的最小y */
suspensionMaxY: GenerateData(
"suspensionMax-y",
DOMUtils.height(window) - 50
),
/** 悬浮按钮是否在右边 */
isRight: GenerateData("isRight", false)
},
mode: {
current_suspension_smallwindow_mode: GenerateData(
"current_suspension_smallwindow_mode",
"suspension"
)
}
};
const NetDiskSuspension = {
suspensionNode: null,
/** 是否已显示 */
isShow: false,
/** 是否已设置事件 */
isSetEvent: false,
/** 是否正在切换背景 */
isRandBg: false,
/**
* 显示悬浮按钮
*/
show() {
if (!this.isShow) {
this.isShow = true;
this.createUI();
this.setSuspensionPosition();
}
if (!this.isSetEvent) {
this.isSetEvent = true;
this.setSuspensionEvent();
this.setResizeEventListener();
}
this.backgroundSwitch();
this.showSuspension();
},
showSuspension() {
this.suspensionNode.style.display = "";
},
hideSuspension() {
this.suspensionNode.style.display = "none";
},
/**
* 判断当前是否是顶部窗口
* @returns {boolean}
*/
isTopWindow() {
return _unsafeWindow.self.window === _unsafeWindow.top.window;
},
/**
* 创建UI界面
*/
createUI() {
if (NetDiskGlobalData.suspension.size.value < 15) {
NetDiskGlobalData.suspension.size.value = 15;
}
if (NetDiskGlobalData.suspension.size.value > 250) {
NetDiskGlobalData.suspension.size.value = 250;
}
if (NetDiskGlobalData.suspension.opacity.value < 0.1) {
NetDiskGlobalData.suspension.opacity.value = 0.1;
}
if (NetDiskGlobalData.suspension.opacity.value > 1) {
NetDiskGlobalData.suspension.opacity.value = 1;
}
let $shadowContainer = DOMUtils.createElement("div", {
className: "whitesev-suspension-shadow-container"
});
let $shadowRoot = $shadowContainer.attachShadow({ mode: "open" });
this.suspensionNode = DOMUtils.createElement(
"div",
{
id: "whitesevSuspensionId",
className: "whitesevSuspension",
innerHTML: (
/*html*/
`
`
)
},
{
style: `
width: ${NetDiskGlobalData.suspension.size.value}px;
height: ${NetDiskGlobalData.suspension.size.value}px;
opacity: ${NetDiskGlobalData.suspension.opacity.value}
`
}
);
$shadowRoot.appendChild(this.suspensionNode);
document.body.appendChild($shadowContainer);
},
/**
* 设置 悬浮按钮所有事件
*/
setSuspensionEvent() {
let needDragElement = NetDiskUI.suspension.suspensionNode;
let dragNode = new AnyTouch(needDragElement);
let netDiskLinkViewTimer = void 0;
let moveFlag = false;
let isDouble = false;
let clickElementLeftOffset = 0;
let clickElementTopOffset = 0;
dragNode.on("pan", function(event) {
if (!moveFlag) {
moveFlag = true;
let rect = needDragElement.getBoundingClientRect();
clickElementLeftOffset = event.x - rect.left;
clickElementTopOffset = event.y - rect.top;
DOMUtils.css(needDragElement, {
cursor: "move",
transition: "none"
});
}
if (event.phase === "move") {
let maxLeftOffset = DOMUtils.width(window) - NetDiskGlobalData.suspension.size.value;
let maxTopOffset = DOMUtils.height(window) - NetDiskGlobalData.suspension.size.value;
let currentSuspensionLeftOffset = event.x - clickElementLeftOffset;
let currentSuspensionTopOffset = event.y - clickElementTopOffset;
currentSuspensionLeftOffset = currentSuspensionLeftOffset > maxLeftOffset ? maxLeftOffset : currentSuspensionLeftOffset;
currentSuspensionTopOffset = currentSuspensionTopOffset > maxTopOffset ? maxTopOffset : currentSuspensionTopOffset;
currentSuspensionLeftOffset = currentSuspensionLeftOffset < 0 ? 0 : currentSuspensionLeftOffset;
currentSuspensionTopOffset = currentSuspensionTopOffset < 0 ? 0 : currentSuspensionTopOffset;
NetDiskSuspension.saveSuspensionPosition({
x: currentSuspensionLeftOffset,
y: currentSuspensionTopOffset
});
DOMUtils.css(needDragElement, {
left: currentSuspensionLeftOffset + "px",
top: currentSuspensionTopOffset + "px"
});
}
if (event.phase === "end") {
moveFlag = false;
DOMUtils.css(needDragElement, {
cursor: "auto"
});
let currentSuspensionLeftOffset = parseInt(
DOMUtils.css(needDragElement, "left")
);
if (NetDiskGlobalData.suspension["suspended-button-adsorption-edge"].value) {
let setCSSLeft = 0;
if (currentSuspensionLeftOffset >= DOMUtils.width(window) / 2) {
setCSSLeft = DOMUtils.width(window) - NetDiskGlobalData.suspension.size.value;
if (NetDiskUI.suspension.isTopWindow()) {
NetDiskSuspensionConfig.position.isRight.value = true;
}
} else {
if (NetDiskUI.suspension.isTopWindow()) {
NetDiskSuspensionConfig.position.isRight.value = false;
}
}
NetDiskSuspension.saveSuspensionPosition({
x: setCSSLeft
});
DOMUtils.css(needDragElement, {
left: setCSSLeft + "px"
});
}
DOMUtils.css(needDragElement, {
transition: "left 300ms ease 0s"
});
}
});
dragNode.on("tap", function(event) {
clearTimeout(netDiskLinkViewTimer);
netDiskLinkViewTimer = void 0;
if (isDouble) {
isDouble = false;
NetDiskGlobalSettingView.show();
} else {
netDiskLinkViewTimer = setTimeout(() => {
isDouble = false;
if (NetDiskGlobalData.features["netdisk-behavior-mode"].value.includes(
"smallwindow"
)) {
NetDiskSuspensionConfig.mode.current_suspension_smallwindow_mode.value = "smallwindow";
NetDiskUI.suspension.hideSuspension();
}
NetDiskUI.view.show();
}, 200);
isDouble = true;
}
});
NetDiskUI.setGlobalRightClickMenu(needDragElement);
},
/**
* 保存悬浮按钮位置
* @param position
*/
saveSuspensionPosition(position) {
if (!NetDiskUI.suspension.isTopWindow()) {
return;
}
if (position == null) {
return;
}
if (typeof position.x === "number") {
NetDiskSuspensionConfig.position.suspensionX.value = position.x;
}
if (typeof position.y === "number") {
NetDiskSuspensionConfig.position.suspensionY.value = position.y;
}
NetDiskSuspensionConfig.position.suspensionMaxX.value = NetDiskSuspensionConfig.position.suspensionMaxX.default;
NetDiskSuspensionConfig.position.suspensionMaxY.value = NetDiskSuspensionConfig.position.suspensionMaxY.default;
},
/**
* 设置window的resize事件监听,来重新设置悬浮按钮的位置
*/
setResizeEventListener() {
DOMUtils.on(globalThis, "resize", void 0, () => {
let activeElement = document.activeElement;
if (utils.isPhone()) {
if (["input", "textarea"].includes(activeElement.localName)) {
return;
} else if (activeElement.hasAttribute("contenteditable") && activeElement.getAttribute("contenteditable") === "true" || activeElement.closest("[contenteditable='true']")) {
return;
} else if (!document.hasFocus()) {
return;
}
}
this.setSuspensionPosition();
});
},
/**
* 设置悬浮按钮位置
*/
setSuspensionPosition() {
const MAX_X = DOMUtils.width(window) - NetDiskGlobalData.suspension.size.value;
const MAX_Y = DOMUtils.height(window) - NetDiskGlobalData.suspension.size.value;
const LAST_MAX_X = NetDiskSuspensionConfig.position.suspensionMaxX.value;
const LAST_MAX_Y = NetDiskSuspensionConfig.position.suspensionMaxY.value;
NetDiskSuspensionConfig.position.suspensionMaxX.default = MAX_X;
NetDiskSuspensionConfig.position.suspensionMaxY.default = MAX_Y;
let suspension_X = NetDiskSuspensionConfig.position.suspensionX.value;
let suspension_Y = NetDiskSuspensionConfig.position.suspensionY.value;
if (MAX_X !== LAST_MAX_X) {
let percent_X = suspension_X / LAST_MAX_X;
let recalculate_suspension_X = MAX_X * percent_X;
suspension_X = recalculate_suspension_X;
}
if (MAX_Y !== LAST_MAX_Y) {
let percent_Y = suspension_Y / LAST_MAX_Y;
let recalculate_suspension_Y = MAX_Y * percent_Y;
suspension_Y = recalculate_suspension_Y;
}
if (suspension_X > MAX_X) {
suspension_X = MAX_X;
} else if (suspension_X < 0) {
suspension_X = 0;
}
if (suspension_Y > MAX_Y) {
suspension_Y = MAX_Y;
} else if (suspension_Y < 0) {
suspension_Y = 0;
}
if (NetDiskGlobalData.suspension["suspended-button-adsorption-edge"].value) {
if (NetDiskSuspensionConfig.position.isRight.value) {
suspension_X = MAX_X;
} else {
suspension_X = 0;
}
}
NetDiskSuspension.saveSuspensionPosition({
x: suspension_X,
y: suspension_Y
});
DOMUtils.css(NetDiskUI.suspension.suspensionNode, {
left: suspension_X + "px",
top: suspension_Y + "px"
});
},
/**
* 悬浮按钮背景轮播 效果为淡入淡出
*/
backgroundSwitch() {
if (this.isRandBg) {
return;
}
function getRandBgList() {
let resultList = [];
NetDiskUI.isMatchedNetDiskIconMap.forEach((item) => {
resultList = [...resultList, NetDiskUI.src.icon[item]];
});
return resultList;
}
function startSwitch(fadeTime, currentBackgroundSrc) {
currentList = getRandBgList();
DOMUtils.fadeOut(randBgNode, fadeTime, function() {
currentIndex++;
currentIndex = currentIndex < currentList.length ? currentIndex : 0;
currentBackgroundSrc = currentList[currentIndex];
DOMUtils.css(randBgNode, {
"background-image": `url(${currentBackgroundSrc})`
});
DOMUtils.fadeIn(randBgNode, fadeTime, function() {
setTimeout(() => {
startSwitch(
parseInt(
NetDiskGlobalData.suspension["randbg-time"].value.toString()
),
currentBackgroundSrc
);
}, parseInt(NetDiskGlobalData.suspension["randbg-show-time"].value.toString()));
});
});
}
let currentList = [];
let currentIndex = 0;
currentList = getRandBgList();
let randBgSrc = currentList[currentIndex];
let randBgNode = NetDiskUI.suspension.suspensionNode.querySelector(
".whitesevSuspension .netdisk"
);
DOMUtils.css(randBgNode, {
"background-image": `url(${randBgSrc})`
});
if (currentList.length < 2 || NetDiskGlobalData.suspension["randbg-time"].value <= 0) {
return;
}
this.isRandBg = true;
startSwitch(
parseInt(
NetDiskGlobalData.suspension["randbg-time"].value.toString().toString()
),
randBgSrc
);
}
};
const indexCSS$1 = ".pops-folder-list .list-name-text {\r\n max-width: 300px;\r\n}\r\n.netdisk-static-link-onefile .pops-folder-list .list-name-text {\r\n max-width: 220px;\r\n}\r\n.netdisk-static-link-onefile\r\n .pops-mobile-folder-content\r\n .pops-folder-list\r\n .list-name-text {\r\n max-width: unset;\r\n}\r\n";
const NetDiskLinearChainDialogView = {
/**
* 单文件直链弹窗
* @param fileDetails 配置
*/
oneFile(fileDetails) {
log.success("成功获取单文件直链", fileDetails);
NetDiskPops.folder(
{
title: {
text: fileDetails.title
},
folder: [
{
fileName: fileDetails.fileName,
fileSize: fileDetails.fileSize,
fileType: fileDetails.fileType ?? "",
// @ts-ignore
createTime: fileDetails.fileUploadTime || fileDetails.fileLatestTime,
// @ts-ignore
latestTime: fileDetails.fileLatestTime || fileDetails.fileUploadTime,
isFolder: false,
index: 0,
async clickEvent() {
if (typeof fileDetails.clickCallBack === "function") {
fileDetails.clickCallBack(fileDetails);
} else {
return {
autoDownload: true,
mode: "aBlank",
url: fileDetails.downloadUrl
};
}
}
}
],
btn: {
ok: {
text: "下载",
callback() {
if (typeof fileDetails.clickCallBack === "function") {
fileDetails.clickCallBack(fileDetails);
} else {
window.open(fileDetails.downloadUrl, "_blank");
}
}
}
},
class: "netdisk-static-link-onefile",
style: indexCSS$1
},
NetDiskUI.popsStyle.oneFileStaticView
);
},
/**
* 多文件直链弹窗
* @param title 标题
* @param folderInfoList文件夹信息
*/
moreFile(title, folderInfoList = []) {
log.success("文件解析信息", folderInfoList);
NetDiskPops.folder(
{
title: {
text: title
},
folder: folderInfoList,
style: indexCSS$1
},
NetDiskUI.popsStyle.moreFileStaticView
);
}
};
const NetDiskNewAccessCodeView = function(title = "密码错误", netDiskName = "", netDiskIndex, shareCode, accessCode, okCallBack = () => {
}) {
const accessCodeConfirm = NetDiskPops.prompt(
{
title: {
text: title,
position: "center",
html: false
},
btn: {
reverse: true,
position: "end",
cancel: {
text: "取消",
callback(eventDetails, event) {
accessCodeConfirm.close();
}
},
ok: {
callback: (event) => {
var _a2, _b, _c, _d;
let userInputAccessCode = event.text.replace(/[\s]*/gi, "");
let uiLink = NetDisk.handleLinkShow(
netDiskName,
netDiskIndex,
shareCode,
userInputAccessCode,
void 0
);
let currentItemSelector = `.netdisk-url a[data-netdisk='${netDiskName}'][data-sharecode='${shareCode}']`;
let currentHistoryItemSelector = `.netdiskrecord-link a[data-netdisk='${netDiskName}'][data-sharecode='${shareCode}']`;
let currentItemElement = (_b = (_a2 = NetDiskUI.Alias.uiLinkAlias) == null ? void 0 : _a2.$shadowRoot) == null ? void 0 : _b.querySelector(
currentItemSelector
);
let currentHistoryItemElement = (_d = (_c = NetDiskUI.Alias.historyAlias) == null ? void 0 : _c.$shadowRoot) == null ? void 0 : _d.querySelector(
currentHistoryItemSelector
);
if (currentItemElement) {
currentItemElement.setAttribute(
"data-accesscode",
userInputAccessCode
);
domUtils.html(currentItemElement, uiLink);
}
if (currentHistoryItemElement) {
currentHistoryItemElement.setAttribute(
"data-accesscode",
userInputAccessCode
);
domUtils.html(currentHistoryItemElement, uiLink);
}
log.info(`${netDiskName} 重新输入的密码:${userInputAccessCode}`);
let callbackOption = {
/** 该分享码是否在已匹配的字典中 */
isFindInMatchedDict: false,
/** 是否成功同步至已匹配的字典 */
isUpdatedMatchedDict: false,
/** 是否成功同步至历史匹配记录 */
isUpdatedHistoryMatched: false,
/** 新的访问码 */
accessCode: userInputAccessCode
};
let netDiskDict = NetDisk.$match.matchedInfo.get(netDiskName);
if (netDiskDict.has(shareCode)) {
callbackOption.isFindInMatchedDict = true;
callbackOption.isUpdatedMatchedDict = true;
let currentDict = netDiskDict.get(shareCode);
netDiskDict.set(
shareCode,
NetDisk.getLinkDickObj(
userInputAccessCode,
netDiskIndex,
true,
currentDict.matchText
)
);
}
callbackOption.isUpdatedHistoryMatched = NetDiskHistoryMatchView.syncAccessCode(
netDiskName,
netDiskIndex,
shareCode,
userInputAccessCode
);
okCallBack(callbackOption);
event.close();
}
}
},
content: {
placeholder: "请重新输入密码",
focus: true,
select: true,
text: accessCode == null ? "" : typeof accessCode === "string" ? accessCode : ""
},
style: (
/*css*/
`
input{
font-size: larger;
}
`
)
},
NetDiskUI.popsStyle.inputNewAccessCodeView
);
domUtils.listenKeyboard(
accessCodeConfirm.$shadowRoot,
"keypress",
(keyName) => {
if (keyName === "Enter") {
const $ok = accessCodeConfirm.$shadowRoot.querySelector(
".pops-prompt-btn-ok"
);
$ok.click();
}
}
);
};
const indexCSS = '.pops[type-value="confirm"] .pops-confirm-content {\r\n overflow: hidden;\r\n}\r\n.netdisk-match-paste-text {\r\n --textarea-bd-color: #dcdfe6;\r\n display: inline-block;\r\n resize: vertical;\r\n padding: 5px 15px;\r\n line-height: normal;\r\n box-sizing: border-box;\r\n color: #606266;\r\n border: 1px solid var(--textarea-bd-color);\r\n border-radius: 4px;\r\n transition: border-color 0.2s cubic-bezier(0.645, 0.045, 0.355, 1);\r\n outline: none;\r\n margin: 0;\r\n -webkit-appearance: none;\r\n -moz-appearance: none;\r\n appearance: none;\r\n background: none;\r\n width: 100%;\r\n height: 100%;\r\n appearance: none;\r\n resize: none;\r\n}\r\n.netdisk-match-paste-text:hover {\r\n --textarea-bd-color: #c0c4cc;\r\n}\r\n.netdisk-match-paste-text:focus {\r\n --textarea-bd-color: #3677f0;\r\n}\r\n';
const NetDiskMatchPasteText = {
show() {
let popsConfirm = NetDiskPops.confirm(
{
title: {
text: "主动识别文本",
position: "center"
},
content: {
text: (
/*html*/
`
`
),
html: true
},
btn: {
ok: {
text: "识别",
callback() {
var _a2, _b;
let inputText = ((_b = (_a2 = popsConfirm.popsElement) == null ? void 0 : _a2.querySelector(
".netdisk-match-paste-text"
)) == null ? void 0 : _b.value) || "";
if (inputText.trim() !== "") {
inputText = NetDiskRuleUtils.replaceChinese(inputText);
NetDiskWorker.postMessage({
characterMapping: [
// 删除中文
{
searchValue: /[\u4e00-\u9fa5]/g,
replaceValue: ""
}
],
textList: [inputText],
matchTextRange: NetDiskGlobalData.match.pageMatchRange.value,
// 剪贴板匹配的话直接使用全部规则来进行匹配
regular: NetDisk.$rule.matchRule,
startTime: Date.now(),
from: "PasteText"
});
}
}
}
},
class: "whitesevPopNetDiskMatchPasteText",
style: indexCSS
},
NetDiskUI.popsStyle.matchPasteTextView
);
popsConfirm.popsElement.querySelector("textarea").focus();
},
/**
* Worker匹配完毕后执行的回调函数
* @param data
*/
workerMatchEndCallBack(data) {
if (data.data.length) {
Qmsg.success(
`成功匹配${data.data.length}个,用时${Date.now() - data.startTime}ms`
);
} else {
Qmsg.error("未识别到链接");
}
}
};
const NetDiskUI = {
/** 元素对象实例 */
Alias: {
/**
* 链接弹窗的对象
*/
uiLinkAlias: void 0,
/**
* 历史匹配记录弹窗的对象
*/
historyAlias: void 0,
/**
* 设置弹窗的对象
*/
settingAlias: void 0
},
/**
* 已匹配到的网盘图标字典
*/
isMatchedNetDiskIconMap: /* @__PURE__ */ new Set(),
/**
* 是否默认禁用弹窗弹出后背景可以滚动
*/
defaultForbiddenScroll: false,
/**
* 弹窗的配置
* 规定格式
* {
* PC:{
* width: "",
* height: "",
* },
* Mobile: {
* width: "",
* height: "",
* }
* }
*/
popsStyle: NetDiskUISizeConfig,
src: {
/**
* 图标RESOURCE_ICON
* 从图标库中引入并覆盖
*/
icon: {},
/**
* 判断图标字典中是否存在该键
* @param iconKey
*/
hasIcon(iconKey) {
return Reflect.has(this.icon, iconKey);
},
/**
* 添加图标数据
* @param iconKey
* @param iconValue
*/
addIcon(iconKey, iconValue) {
if (this.hasIcon(iconKey)) {
log.warn("图标字典中已存在该icon:" + iconKey);
return false;
} else {
return Reflect.set(this.icon, iconKey, iconValue);
}
}
},
/**
* 悬浮按钮 双击打开主界面,长按打开设置(不能移动,移动就不打开,只是移动按钮
*/
suspension: NetDiskSuspension,
/**
* 主视图
*/
view: NetDiskView,
/**
* 显示直链的弹窗
*/
staticView: NetDiskLinearChainDialogView,
/**
* 需要重新输入新密码的弹窗
*/
newAccessCodeView: NetDiskNewAccessCodeView,
/**
* 网盘历史匹配到的记录弹窗
*/
netDiskHistoryMatch: NetDiskHistoryMatchView,
/**
* 主动识别文本
*/
matchPasteText: NetDiskMatchPasteText,
/**
* 设置标题的右键菜单
* @param element
*/
setGlobalRightClickMenu(element) {
NetDiskUI.view.registerContextMenu(element, void 0, [
{
text: "设置",
callback() {
log.info("打开-设置");
NetDiskGlobalSettingView.show();
}
},
{
text: "历史匹配记录",
callback() {
log.info("打开-历史匹配记录");
NetDiskUI.netDiskHistoryMatch.show();
}
},
{
text: "自定义规则",
callback() {
log.info("打开-自定义规则");
NetDiskUserRuleUI.show(false);
}
},
{
text: "网站规则",
callback() {
log.info("打开-网站规则");
WebsiteRule.show();
}
},
{
text: "字符映射",
callback() {
log.info("打开-字符映射");
CharacterMapping.show();
}
},
{
text: "主动识别文本",
callback() {
log.info("打开-主动识别文本");
NetDiskUI.matchPasteText.show();
}
}
]);
},
/**
* 设置右键菜单
* @param target
* @param selector
* @param isHistoryView 是否是历史界面的
*/
setRightClickMenu(target, selector, isHistoryView) {
let showTextList = [
{
text: "复制链接",
callback: function(event, contextMenuEvent) {
let linkElement = contextMenuEvent.target;
const { netDiskName, netDiskIndex, shareCode, accessCode } = NetDiskView.praseElementAttributeRuleInfo(linkElement);
NetDiskLinkClickMode.copy(
netDiskName,
netDiskIndex,
shareCode,
accessCode
);
}
},
{
text: "访问链接",
callback: function(event, contextMenuEvent) {
let linkElement = contextMenuEvent.target;
const { netDiskName, netDiskIndex, shareCode, accessCode } = NetDiskView.praseElementAttributeRuleInfo(linkElement);
let url = NetDiskLinkClickModeUtils.getBlankUrl(
netDiskName,
netDiskIndex,
shareCode,
accessCode
);
NetDiskLinkClickMode.openBlank(
url,
netDiskName,
netDiskIndex,
shareCode,
accessCode
);
}
},
{
text: "修改访问码",
callback: function(event, contextMenuEvent) {
let $link = contextMenuEvent.target;
const { netDiskName, netDiskIndex, shareCode, accessCode } = NetDiskView.praseElementAttributeRuleInfo($link);
NetDiskUI.newAccessCodeView(
this.text,
netDiskName,
netDiskIndex,
shareCode,
accessCode,
(option) => {
if (isHistoryView) {
if (option.isUpdatedMatchedDict) {
let currentTime = (/* @__PURE__ */ new Date()).getTime();
$link.closest("li").querySelector(
".netdiskrecord-update-time"
).lastChild.textContent = utils.formatTime(currentTime);
$link.setAttribute("data-accesscode", option.accessCode);
Qmsg.success(
/*html*/
`
旧: ${accessCode}
新: ${option.accessCode}
`,
{
html: true
}
);
} else {
Qmsg.error("修改失败");
}
} else {
event.target.setAttribute("data-accesscode", option.accessCode);
if (option.isUpdatedMatchedDict) {
Qmsg.success(
/*html*/
`
旧: ${accessCode}
新: ${option.accessCode}
`,
{
html: true
}
);
} else {
if (option.isFindInMatchedDict) {
Qmsg.error("修改访问码失败");
} else {
Qmsg.error(
"修改访问码失败,因为当前已匹配字典中未找到对应的访问码"
);
}
}
}
}
);
}
}
];
if (!isHistoryView) {
showTextList.push({
text: "删除当前项",
callback: function(event, contextMenuEvent) {
let $linkElement = contextMenuEvent.target;
let $box = $linkElement.closest(".netdisk-url-box");
const { netDiskName, netDiskIndex, shareCode, accessCode } = NetDiskView.praseElementAttributeRuleInfo($linkElement);
let flag = false;
NetDisk.$match.matchedInfo.forEach((netDiskItem, netDiskKeyName) => {
if (netDiskKeyName !== netDiskName) {
return;
}
netDiskItem.forEach((matchedInfo, matchedShareCode) => {
if (matchedShareCode === shareCode) {
flag = true;
netDiskItem.delete(matchedShareCode);
log.info(`删除:`, netDiskKeyName, JSON.stringify(matchedInfo));
}
});
});
NetDisk.$match.matchedInfoRuleKey.clear();
NetDisk.$match.matchedInfo.forEach((netDiskItem, netDiskKeyName) => {
if (netDiskItem.length) {
NetDisk.$match.matchedInfoRuleKey.add(netDiskKeyName);
}
});
if (flag) {
$box.remove();
} else {
Qmsg.error("发生意外情况,未在已匹配到的信息中到对应的网盘信息");
}
}
});
showTextList.push({
text: "删除所有项",
callback: function(event, contextMenuEvent) {
let $linkElement = contextMenuEvent.target;
let $boxAll = $linkElement.closest(
".netdisk-url-box-all"
);
NetDiskView.praseElementAttributeRuleInfo($linkElement);
NetDisk.$match.matchedInfo.forEach((netDiskItem, netDiskKeyName) => {
netDiskItem.clear();
});
NetDisk.$match.matchedInfoRuleKey.clear();
$boxAll.innerHTML = "";
}
});
}
NetDiskUI.view.registerContextMenu(target, selector, showTextList);
}
};
const NetDiskPops = {
/**
* 普通信息框
* @param details 配置
* @param sizeConfig 大小配置
*/
alert(details, sizeConfig) {
details = this.handleDetails(details, sizeConfig);
return __pops.alert(details);
},
/**
* 询问框
* @param details 配置
* @param sizeConfig 大小配置
*/
confirm(details, sizeConfig) {
details = this.handleDetails(details, sizeConfig);
return __pops.confirm(details);
},
/**
* 加载层
* @param details 配置
*/
loading(details) {
if (typeof details["animation"] === "undefined") {
details["animation"] = NetDiskGlobalData.pops.popsAnimation.value;
}
if (typeof details["forbiddenScroll"] === "undefined") {
details["forbiddenScroll"] = NetDiskUI.defaultForbiddenScroll;
}
return __pops.loading(details);
},
/**
* 输入框
* @param details 配置
* @param sizeConfig 大小配置
*/
prompt(details, sizeConfig) {
details = this.handleDetails(details, sizeConfig);
return __pops.prompt(details);
},
/**
* 文件夹
* @param details 配置
*/
folder(details, sizeConfig) {
details = this.handleDetails(details, sizeConfig);
details["sort"] = {
name: NetDiskGlobalData.popsFolder["pops-folder-sort-name"].value,
isDesc: NetDiskGlobalData.popsFolder["pops-folder-sort-is-desc"].value,
// @ts-ignore
callback(target, event, sortName, sortDesc) {
NetDiskGlobalData.popsFolder["pops-folder-sort-name"].value = sortName;
NetDiskGlobalData.popsFolder["pops-folder-sort-is-desc"].value = sortDesc;
}
};
return __pops.folder(details);
},
/**
* 菜单面板
* @param details 配置
*/
panel(details, sizeConfig) {
details = this.handleDetails(details, sizeConfig);
return __pops.panel(details);
},
/**
* 右键菜单
*/
rightClickMenu(details) {
details = this.handleDetails(details);
return __pops.rightClickMenu(details);
},
/**
*
* @param details
* @param sizeConfig 大小配置
*/
handleDetails(details, sizeConfig) {
details = Object.assign(
{
animation: NetDiskGlobalData.pops.popsAnimation.value,
drag: NetDiskGlobalData.pops.pcDrag.value,
dragLimit: NetDiskGlobalData.pops.pcDragLimit.value,
forbiddenScroll: NetDiskUI.defaultForbiddenScroll
},
details
);
if (sizeConfig != null) {
if (__pops.isPhone()) {
let popsWidth = typeof sizeConfig.Mobile.width === "function" ? sizeConfig.Mobile.width() : sizeConfig.Mobile.width;
let popsHeight = typeof sizeConfig.Mobile.height === "function" ? sizeConfig.Mobile.height() : sizeConfig.Mobile.height;
details.width = popsWidth;
details.height = popsHeight;
} else {
let popsWidth = typeof sizeConfig.PC.width === "function" ? sizeConfig.PC.width() : sizeConfig.PC.width;
let popsHeight = typeof sizeConfig.PC.height === "function" ? sizeConfig.PC.height() : sizeConfig.PC.height;
details.width = popsWidth;
details.height = popsHeight;
}
}
if (details.mask == null) {
details.mask = {};
}
if (typeof details.mask.enable !== "boolean") {
details.mask.enable = true;
}
if (details.mask.clickEvent == null) {
details.mask.clickEvent = {};
}
if (typeof details.mask.clickEvent.toClose !== "boolean") {
details.mask.clickEvent.toClose = NetDiskGlobalData.pops.clickMaskToCloseDialog.value;
}
if (NetDiskGlobalData.pops.popsAcrylic.value) {
let acrylicCSS = (
/*css*/
`
.pops {
--acrylic-opacity: 0.7;
--acrylic-color: rgba(232, 232, 232, var(--acrylic-opacity));
--acrylic-blur: 30px;
--acrylic-saturate: 125%;
--pops-bg-opacity: var(--acrylic-opacity);
}
.pops {
backdrop-filter: blur(var(--acrylic-blur)) saturate(var(--acrylic-saturate)) !important;
background-color: var(--acrylic-color) !important;
}
.pops[type-value=panel]{
--aside-bg-color: rgba(221, 221, 221, var(--acrylic-opacity));
--pops-bg-color: #f2f2f2;
--title-bg-color: var(--acrylic-color);
--aside-bg-color: var(--acrylic-color);
--container-item-bg-color: var(--acrylic-color);
}
`
);
if (typeof details.style === "string") {
details.style += acrylicCSS;
} else {
details.style = acrylicCSS;
}
}
details.zIndex = () => {
const deviation = 10;
let maxZIndex = utils.getMaxZIndex(deviation);
let popsMaxZIndex = __pops.config.InstanceUtils.getPopsMaxZIndex(deviation).zIndex;
let zIndex = utils.getMaxValue(99999, maxZIndex, popsMaxZIndex) + deviation;
return zIndex;
};
return details;
}
};
class RuleEditView {
constructor(option) {
__publicField(this, "option");
this.option = option;
}
/**
* 显示视图
*/
showView() {
var _a2;
let $dialog = NetDiskPops.confirm({
title: {
text: this.option.title,
position: "center"
},
content: {
text: (
/*html*/
`
`
),
html: true
},
btn: utils.assign(
{
ok: {
callback() {
submitSaveOption();
}
}
},
this.option.btn || {},
true
),
style: (
/*css*/
`
${__pops.config.cssText.panelCSS}
.rule-form-container {
}
.rule-form-container li{
display: flex;
align-items: center;
justify-content: space-between;
padding: 5px 20px;
gap: 10px;
}
.pops-panel-item-left-main-text{
max-width: 150px;
}
.pops-panel-item-right-text{
padding-left: 30px;
}
.pops-panel-item-right-text,
.pops-panel-item-right-main-text{
text-overflow: ellipsis;
overflow: hidden;
white-space: nowrap;
}
${((_a2 = this.option) == null ? void 0 : _a2.style) ?? ""}
`
),
width: window.innerWidth > 500 ? "500px" : "88vw",
height: window.innerHeight > 500 ? "500px" : "80vh"
});
let $form = $dialog.$shadowRoot.querySelector(
".rule-form-container"
);
$dialog.$shadowRoot.querySelector(
"input[type=submit]"
);
let $ulist = $dialog.$shadowRoot.querySelector(".rule-form-ulist");
let view = this.option.getView(this.option.data());
$ulist.appendChild(view);
const submitSaveOption = () => {
let result = this.option.onsubmit($form, this.option.data());
if (!result.success) {
return;
}
$dialog.close();
this.option.dialogCloseCallBack(true);
};
}
}
class RuleFilterView {
constructor(option) {
__publicField(this, "option");
this.option = option;
}
showView() {
let $alert = NetDiskPops.alert({
title: {
text: this.option.title,
position: "center"
},
content: {
text: (
/*html*/
`
`
)
},
btn: {
ok: {
text: "关闭",
type: "default"
}
},
width: window.innerWidth > 500 ? "350px" : "80vw",
height: window.innerHeight > 500 ? "300px" : "70vh",
style: (
/*css*/
`
.filter-container{
height: 100%;
display: flex;
flex-direction: column;
gap: 20px;
}
.filter-container button{
text-wrap: wrap;
padding: 8px;
height: auto;
text-align: left;
}
`
)
});
let $filterContainer = $alert.$shadowRoot.querySelector(".filter-container");
let $fragment = document.createDocumentFragment();
this.option.filterOption.forEach((filterOption) => {
let $button = document.createElement("button");
$button.innerText = filterOption.name;
let execFilterAndCloseDialog = () => {
this.option.getAllRuleInfo().forEach((ruleInfo) => {
if (filterOption.filterCallBack(ruleInfo.data)) {
domUtils.show(ruleInfo.$el, false);
} else {
domUtils.hide(ruleInfo.$el, false);
}
});
if (typeof this.option.execFilterCallBack === "function") {
this.option.execFilterCallBack();
}
$alert.close();
};
domUtils.on($button, "click", (event) => {
utils.preventEvent(event);
if (typeof filterOption.callback === "function") {
let result = filterOption.callback(event, execFilterAndCloseDialog);
if (!result) {
return;
}
}
execFilterAndCloseDialog();
});
$fragment.appendChild($button);
});
$filterContainer.appendChild($fragment);
}
}
class RuleView {
constructor(option) {
__publicField(this, "option");
this.option = option;
}
/**
* 显示视图
*/
showView() {
var _a2, _b, _c, _d, _e, _f, _g, _h, _i;
let $popsConfirm = NetDiskPops.confirm({
title: {
text: this.option.title,
position: "center"
},
content: {
text: (
/*html*/
`
`
),
html: true
},
btn: {
merge: true,
reverse: false,
position: "space-between",
ok: {
enable: ((_c = (_b = (_a2 = this.option) == null ? void 0 : _a2.bottomControls) == null ? void 0 : _b.add) == null ? void 0 : _c.enable) || true,
type: "primary",
text: "添加",
callback: (event) => {
this.showEditView(
$popsConfirm.$shadowRoot,
false,
this.option.getAddData()
);
}
},
close: {
enable: true,
callback(event) {
$popsConfirm.close();
}
},
cancel: {
enable: ((_f = (_e = (_d = this.option) == null ? void 0 : _d.bottomControls) == null ? void 0 : _e.filter) == null ? void 0 : _f.enable) || false,
type: "default",
text: "过滤",
callback: (details, event) => {
var _a3, _b2, _c2, _d2, _e2, _f2, _g2;
if (typeof ((_c2 = (_b2 = (_a3 = this.option) == null ? void 0 : _a3.bottomControls) == null ? void 0 : _b2.filter) == null ? void 0 : _c2.callback) === "function") {
this.option.bottomControls.filter.callback();
}
let getAllRuleElement = () => {
return Array.from(
$popsConfirm.$shadowRoot.querySelectorAll(
".rule-view-container .rule-item"
)
);
};
let $button = event.target.closest(".pops-confirm-btn").querySelector(".pops-confirm-btn-cancel span");
if (domUtils.text($button).includes("取消")) {
getAllRuleElement().forEach(($el) => {
domUtils.show($el, false);
});
domUtils.text($button, "过滤");
} else {
let ruleFilterView = new RuleFilterView({
title: ((_e2 = (_d2 = this.option.bottomControls) == null ? void 0 : _d2.filter) == null ? void 0 : _e2.title) ?? "过滤规则",
filterOption: ((_g2 = (_f2 = this.option.bottomControls) == null ? void 0 : _f2.filter) == null ? void 0 : _g2.option) || [],
execFilterCallBack() {
domUtils.text($button, "取消过滤");
},
getAllRuleInfo: () => {
return getAllRuleElement().map(($el) => {
return {
data: this.parseRuleItemElement($el).data,
$el
};
});
}
});
ruleFilterView.showView();
}
}
},
other: {
enable: ((_i = (_h = (_g = this.option) == null ? void 0 : _g.bottomControls) == null ? void 0 : _h.clear) == null ? void 0 : _i.enable) || true,
type: "xiaomi-primary",
text: `清空所有(${this.option.data().length})`,
callback: (event) => {
let $askDialog = NetDiskPops.confirm(
{
title: {
text: "提示",
position: "center"
},
content: {
text: "确定清空所有的数据?",
html: false
},
btn: {
ok: {
enable: true,
callback: (popsEvent) => {
var _a3, _b2, _c2;
log.success("清空所有");
if (typeof ((_c2 = (_b2 = (_a3 = this.option) == null ? void 0 : _a3.bottomControls) == null ? void 0 : _b2.clear) == null ? void 0 : _c2.callback) === "function") {
this.option.bottomControls.clear.callback();
}
if (this.option.data().length) {
Qmsg.error("清理失败");
return;
} else {
Qmsg.success("清理成功");
}
this.updateDeleteAllBtnText($popsConfirm.$shadowRoot);
this.clearContent($popsConfirm.$shadowRoot);
$askDialog.close();
}
},
cancel: {
text: "取消",
enable: true
}
}
},
{
Mobile: {
width: "300px",
height: "200px"
},
PC: {
width: "300px",
height: "200px"
}
}
);
}
}
},
width: window.innerWidth > 500 ? "500px" : "88vw",
height: window.innerHeight > 500 ? "500px" : "80vh",
style: (
/*css*/
`
${__pops.config.cssText.panelCSS}
.rule-item{
display: flex;
align-items: center;
line-height: normal;
font-size: 16px;
padding: 4px 4px;
gap: 6px;
}
.rule-name{
flex: 1;
white-space: nowrap;
text-overflow: ellipsis;
overflow: hidden;
}
.rule-controls{
display: flex;
align-items: center;
text-overflow: ellipsis;
overflow: hidden;
white-space: nowrap;
gap: 8px;
padding: 0px 4px;
}
.rule-controls-enable{
}
.rule-controls-edit{
}
.rule-controls-delete{
}
.rule-controls-edit,
.rule-controls-delete{
width: 16px;
height: 16px;
cursor: pointer;
}
`
)
});
let allData = this.option.data();
allData.forEach((data) => {
this.appendRuleItemElement($popsConfirm.$shadowRoot, data);
});
}
/**
* 解析弹窗内的各个元素
*/
parseViewElement($shadowRoot) {
let $container = $shadowRoot.querySelector(
".rule-view-container"
);
let $deleteBtn = $shadowRoot.querySelector(
".pops-confirm-btn button.pops-confirm-btn-other"
);
return {
/** 容器 */
$container,
/** 左下角的清空按钮 */
$deleteBtn
};
}
/**
* 解析每一项的元素
*/
parseRuleItemElement($ruleElement) {
let $enable = $ruleElement.querySelector(
".rule-controls-enable"
);
let $enableSwitch = $enable.querySelector(".pops-panel-switch");
let $enableSwitchInput = $enable.querySelector(
".pops-panel-switch__input"
);
let $enableSwitchCore = $enable.querySelector(
".pops-panel-switch__core"
);
let $edit = $ruleElement.querySelector(".rule-controls-edit");
let $delete = $ruleElement.querySelector(
".rule-controls-delete"
);
return {
/** 启用开关 */
$enable,
/** 启用开关的container */
$enableSwitch,
/** 启用开关的input */
$enableSwitchInput,
/** 启用开关的core */
$enableSwitchCore,
/** 编辑按钮 */
$edit,
/** 删除按钮 */
$delete,
/** 存储在元素上的数据 */
data: Reflect.get($ruleElement, "data-rule")
};
}
/**
* 创建一条规则元素
*/
createRuleItemElement(data, $shadowRoot) {
let name = this.option.getDataItemName(data);
let $ruleItem = domUtils.createElement("div", {
className: "rule-item",
innerHTML: (
/*html*/
`
${name}
${__pops.config.iconSVG.edit}
${__pops.config.iconSVG.delete}
`
)
});
Reflect.set($ruleItem, "data-rule", data);
let switchCheckedClassName = "pops-panel-switch-is-checked";
const {
$enable,
$enableSwitch,
$enableSwitchCore,
$enableSwitchInput,
$delete,
$edit
} = this.parseRuleItemElement($ruleItem);
if (this.option.itemControls.enable.enable) {
domUtils.on($enableSwitchCore, "click", (event) => {
let isChecked = false;
if ($enableSwitch.classList.contains(switchCheckedClassName)) {
$enableSwitch.classList.remove(switchCheckedClassName);
isChecked = false;
} else {
$enableSwitch.classList.add(switchCheckedClassName);
isChecked = true;
}
$enableSwitchInput.checked = isChecked;
this.option.itemControls.enable.callback(data, isChecked);
});
if (this.option.itemControls.enable.getEnable(data)) {
$enableSwitch.classList.add(switchCheckedClassName);
}
} else {
$enable.remove();
}
if (this.option.itemControls.edit.enable) {
domUtils.on($edit, "click", (event) => {
utils.preventEvent(event);
this.showEditView($shadowRoot, true, data, $ruleItem, (newData) => {
data = null;
data = newData;
});
});
} else {
$edit.remove();
}
if (this.option.itemControls.delete.enable) {
domUtils.on($delete, "click", (event) => {
utils.preventEvent(event);
let $askDialog = NetDiskPops.confirm(
{
title: {
text: "提示",
position: "center"
},
content: {
text: "确定删除该条数据?",
html: false
},
btn: {
ok: {
enable: true,
callback: (popsEvent) => {
log.success("删除数据");
let flag = this.option.itemControls.delete.deleteCallBack(data);
if (flag) {
Qmsg.success("成功删除该数据");
$ruleItem.remove();
this.updateDeleteAllBtnText($shadowRoot);
$askDialog.close();
} else {
Qmsg.error("删除该数据失败");
}
}
},
cancel: {
text: "取消",
enable: true
}
}
},
{
Mobile: {
width: "300px",
height: "200px"
},
PC: {
width: "300px",
height: "200px"
}
}
);
});
} else {
$delete.remove();
}
return $ruleItem;
}
/**
* 添加一个规则元素
*/
appendRuleItemElement($shadowRoot, data) {
const { $container } = this.parseViewElement($shadowRoot);
if (Array.isArray(data)) {
for (let index = 0; index < data.length; index++) {
const item = data[index];
$container.appendChild(this.createRuleItemElement(item, $shadowRoot));
}
} else {
$container.appendChild(this.createRuleItemElement(data, $shadowRoot));
}
this.updateDeleteAllBtnText($shadowRoot);
}
/**
* 更新弹窗内容的元素
*/
updateRuleContaienrElement($shadowRoot) {
this.clearContent($shadowRoot);
this.parseViewElement($shadowRoot);
let data = this.option.data();
this.appendRuleItemElement($shadowRoot, data);
this.updateDeleteAllBtnText($shadowRoot);
}
/**
* 更新规则元素
*/
updateRuleItemElement(data, $oldRuleItem, $shadowRoot) {
let $newRuleItem = this.createRuleItemElement(data, $shadowRoot);
$oldRuleItem.after($newRuleItem);
$oldRuleItem.remove();
}
/**
* 清空内容
*/
clearContent($shadowRoot) {
const { $container } = this.parseViewElement($shadowRoot);
domUtils.html($container, "");
}
/**
* 设置删除按钮的文字
*/
setDeleteBtnText($shadowRoot, text, isHTML = false) {
const { $deleteBtn } = this.parseViewElement($shadowRoot);
if (isHTML) {
domUtils.html($deleteBtn, text);
} else {
domUtils.text($deleteBtn, text);
}
}
/**
* 更新【清空所有】的按钮的文字
*/
updateDeleteAllBtnText($shadowRoot) {
let data = this.option.data();
this.setDeleteBtnText($shadowRoot, `清空所有(${data.length})`);
}
/**
* 显示编辑视图
* @param isEdit 是否是编辑状态
*/
showEditView($parentShadowRoot, isEdit, editData, $editRuleItemElement, updateDataCallBack) {
let dialogCloseCallBack = (isSubmit) => {
if (isSubmit) ;
else {
if (!isEdit) {
this.option.deleteData(editData);
}
if (typeof updateDataCallBack === "function") {
let newData = this.option.getData(editData);
updateDataCallBack(newData);
}
}
};
let editView = new RuleEditView({
title: isEdit ? "编辑" : "添加",
data: () => {
return editData;
},
dialogCloseCallBack,
getView: (data) => {
return this.option.itemControls.edit.getView(data, isEdit);
},
btn: {
ok: {
enable: true,
text: isEdit ? "修改" : "添加"
},
cancel: {
callback(details, event) {
details.close();
dialogCloseCallBack(false);
}
},
close: {
callback(details, event) {
details.close();
dialogCloseCallBack(false);
}
}
},
onsubmit: ($form, data) => {
let result = this.option.itemControls.edit.onsubmit(
$form,
isEdit,
data
);
if (result.success) {
if (isEdit) {
Qmsg.success("修改成功");
this.updateRuleItemElement(
result.data,
$editRuleItemElement,
$parentShadowRoot
);
} else {
this.appendRuleItemElement($parentShadowRoot, result.data);
}
} else {
if (isEdit) {
Qmsg.error("修改失败");
}
}
return result;
},
style: this.option.itemControls.edit.style
});
editView.showView();
}
}
const UIButton = function(text, description, buttonText, buttonIcon, buttonIsRightIcon, buttonIconIsLoading, buttonType, clickCallBack, afterAddToUListCallBack) {
let result = {
text,
type: "button",
description,
attributes: {},
props: {},
buttonIcon,
buttonIsRightIcon,
buttonIconIsLoading,
buttonType,
buttonText,
callback(event) {
if (typeof clickCallBack === "function") {
clickCallBack(event);
}
},
afterAddToUListCallBack
};
return result;
};
const panelSettingCSS = "/* 容器 */\r\n.website-rule-container {\r\n}\r\n/* 每一条规则 */\r\n.website-rule-item {\r\n display: flex;\r\n align-items: center;\r\n line-height: normal;\r\n font-size: 16px;\r\n padding: 4px 4px;\r\n gap: 6px;\r\n}\r\n/* 规则名 */\r\n.website-rule-item .website-rule-name {\r\n flex: 1;\r\n white-space: nowrap;\r\n text-overflow: ellipsis;\r\n overflow: hidden;\r\n}\r\n/* 操作按钮 */\r\n.website-rule-item .website-controls {\r\n display: flex;\r\n align-items: center;\r\n text-overflow: ellipsis;\r\n overflow: hidden;\r\n white-space: nowrap;\r\n gap: 8px;\r\n padding: 0px 4px;\r\n}\r\n/* 编辑和删除按钮 */\r\n.website-rule-item .website-rule-edit,\r\n.website-rule-item .website-rule-delete {\r\n width: 16px;\r\n height: 16px;\r\n cursor: pointer;\r\n}\r\n/* 启用按钮 */\r\n.website-rule-item .website-rule-enable {\r\n}\r\n/* 编辑按钮 */\r\n.website-rule-item .website-rule-edit {\r\n}\r\n/* 删除按钮 */\r\n.website-rule-item .website-rule-delete {\r\n}\r\n";
function deepCopy(obj) {
if (obj === null || typeof obj !== "object") {
return obj;
}
let copy = Array.isArray(obj) ? [] : {};
for (let key in obj) {
if (obj.hasOwnProperty(key)) {
copy[key] = deepCopy(obj[key]);
}
}
return copy;
}
const WebsiteRule = {
$data: {
STORAGE_KEY: "rule",
/** 是否正在显示编辑视图 */
isShowEditView: false
},
init() {
},
/**
* 获取默认数据
*/
getTemplateData() {
return {
uuid: utils.generateUUID(),
enable: true,
name: "",
url: "",
data: {}
};
},
/**
* 显示视图
*/
show() {
const that = this;
let popsPanelContentUtils = __pops.config.panelHandleContentUtils();
function generateStorageApi(data) {
return {
get(key, defaultValue) {
return data[key] ?? defaultValue;
},
set(key, value) {
data[key] = value;
}
};
}
function generatePanelStorageApi(uuid) {
return {
get(key, defaultValue) {
let currentRule = WebsiteRule.getRule(uuid);
return Reflect.get(currentRule.data, key) ?? defaultValue;
},
set(key, value) {
let currentRule = WebsiteRule.getRule(uuid);
Reflect.set(currentRule.data, key, value);
WebsiteRule.updateRule(currentRule);
}
};
}
let ruleView = new RuleView({
title: "网站规则",
data: () => {
return this.getAllRule();
},
getAddData: () => {
return this.getTemplateData();
},
getDataItemName: (data) => {
return data["name"] ?? data.url;
},
updateData: (data) => {
return this.updateRule(data);
},
deleteData: (data) => {
that.$data.isShowEditView = false;
return this.deleteRule(data.uuid);
},
getData: (data) => {
let allData = this.getAllRule();
let findValue = allData.find((item) => item.uuid === data.uuid);
return findValue ?? data;
},
itemControls: {
enable: {
enable: true,
getEnable(data) {
return data.enable;
},
callback: (data, enable) => {
data.enable = enable;
this.updateRule(data);
}
},
edit: {
enable: true,
getView: (data, isEdit) => {
that.$data.isShowEditView = true;
let $fragment = document.createDocumentFragment();
if (!isEdit) {
data = this.getTemplateData();
}
let enable_template = UISwitch("启用", "enable", true);
Reflect.set(
enable_template.props,
PROPS_STORAGE_API,
generateStorageApi(data)
);
let $enable = popsPanelContentUtils.createSectionContainerItem_switch(
enable_template
);
let name_template = UIInput(
"规则名称",
"name",
"",
"",
void 0,
"必填"
);
Reflect.set(
name_template.props,
PROPS_STORAGE_API,
generateStorageApi(data)
);
let $name = popsPanelContentUtils.createSectionContainerItem_input(
name_template
);
let url_template = UIInput(
"匹配网址",
"url",
"",
"",
void 0,
"必填,可正则"
);
Reflect.set(
url_template.props,
PROPS_STORAGE_API,
generateStorageApi(data)
);
let $data_url = popsPanelContentUtils.createSectionContainerItem_input(
url_template
);
let coverSetting_template = UIButton(
"覆盖设置",
"",
"自定义",
void 0,
false,
false,
"primary",
() => {
let originPanelContentConfig = PopsPanel.getPanelContentConfig().concat(
NetDiskRule.getRulePanelContent()
);
let newPanelContentConfig = deepCopy(originPanelContentConfig);
function iterativeTraversal(configList) {
configList.forEach((configItem) => {
if (typeof (configItem == null ? void 0 : configItem.props) === "object" && Reflect.has(configItem.props, PROPS_STORAGE_API)) {
let panelStorageApi = generatePanelStorageApi(data.uuid);
Reflect.set(
configItem.props,
PROPS_STORAGE_API,
panelStorageApi
);
}
let childForms = configItem.forms;
if (childForms && Array.isArray(childForms)) {
iterativeTraversal(childForms);
}
});
}
for (let index = 0; index < newPanelContentConfig.length; index++) {
let leftContentConfigItem = newPanelContentConfig[index];
if (!leftContentConfigItem.forms) {
continue;
}
if (typeof leftContentConfigItem.afterRender === "function" && (leftContentConfigItem == null ? void 0 : leftContentConfigItem.id.toString().startsWith("netdisk-panel-config-"))) {
leftContentConfigItem.afterRender = (__data) => {
let ruleKey = __data.asideConfig.attributes["data-key"];
let enableKey = NetDiskRuleDataKEY.function.enable(ruleKey);
__data.$asideLiElement.setAttribute(
"data-function-enable",
WebsiteRule.getRuleDataValue(data.uuid, enableKey, true)
);
};
}
if (typeof leftContentConfigItem.attributes === "object" && leftContentConfigItem.forms != null && ATTRIBUTE_KEY in leftContentConfigItem.attributes) {
let ruleKey = leftContentConfigItem.attributes[ATTRIBUTE_KEY];
let custom_accessCode_enable_template = UISwitch(
"启用",
WebsiteRuleDataKey.features.customAccessCodeEnable(
ruleKey
),
false,
void 0,
"启用后将允许执行下面的功能",
void 0
);
Reflect.set(
custom_accessCode_enable_template.props,
PROPS_STORAGE_API,
generatePanelStorageApi(data.uuid)
);
let custom_accessCode_template = UIInput(
"自定义访问码",
WebsiteRuleDataKey.features.customAccessCode(ruleKey),
"",
"让获取的到的链接的访问码都为自定义的访问码",
void 0,
"请输入自定义访问码",
false,
false
);
Reflect.set(
custom_accessCode_template.props,
PROPS_STORAGE_API,
generatePanelStorageApi(data.uuid)
);
let custom_accessCode_container = {
text: "额外功能",
type: "forms",
forms: [
custom_accessCode_enable_template,
custom_accessCode_template
]
};
if (leftContentConfigItem.forms.length) {
leftContentConfigItem.forms.splice(
1,
0,
custom_accessCode_container
);
} else {
leftContentConfigItem.forms.push(
custom_accessCode_container
);
}
}
let rightContentConfigList = leftContentConfigItem.forms;
if (rightContentConfigList && Array.isArray(rightContentConfigList)) {
iterativeTraversal(rightContentConfigList);
}
}
NetDiskPops.panel(
{
title: {
text: `覆盖设置`,
position: "center"
},
content: newPanelContentConfig,
btn: {
close: {
enable: true,
callback(event) {
event.close();
}
}
},
mask: {
clickCallBack(originalRun) {
originalRun();
}
},
only: false,
class: "whitesevPopSetting",
style: (
/*css*/
`
${panelSettingCSS}
/* 隐藏顶部的图标 */
.netdisk-custom-rule-edit,
.netdisk-custom-rule-delete,
/* 隐藏快捷键设置菜单,因为这个是全局唯一的 */
.netdisk-panel-forms-shortcut-keys-deepMenu{
display: none !important;
}
`
)
},
NetDiskUI.popsStyle.settingView
);
},
void 0
);
let $coverSetting_template = popsPanelContentUtils.createSectionContainerItem_button(
coverSetting_template
);
$fragment.appendChild($enable);
$fragment.appendChild($name);
$fragment.appendChild($data_url);
$fragment.appendChild($coverSetting_template);
return $fragment;
},
onsubmit: ($form, isEdit, editData) => {
let $ulist_li = $form.querySelectorAll(
".rule-form-ulist > li"
);
let data = this.getTemplateData();
if (isEdit) {
data.uuid = editData.uuid;
}
$ulist_li.forEach(($li) => {
let formConfig = Reflect.get($li, "__formConfig__");
let attrs = Reflect.get(formConfig, "attributes");
let storageApi = Reflect.get($li, PROPS_STORAGE_API);
let key = Reflect.get(attrs, ATTRIBUTE_KEY);
if (key == null) {
return;
}
let defaultValue = Reflect.get(attrs, ATTRIBUTE_DEFAULT_VALUE);
let value = storageApi.get(key, defaultValue);
if (Reflect.has(data, key)) {
Reflect.set(data, key, value);
} else if (Reflect.has(data.data, key)) {
Reflect.set(data.data, key, value);
} else {
log.error(`${key}不在数据中`);
}
});
if (data.name == null || data.name.trim() === "") {
Qmsg.error("规则名称不能为空");
return {
success: false,
data
};
}
if (data.url.trim() === "") {
Qmsg.error("匹配网址不能为空");
return {
success: false,
data
};
}
if (isEdit) {
return {
success: this.updateRule(data),
data
};
} else {
return {
success: this.addRule(data),
data
};
}
}
},
delete: {
enable: true,
deleteCallBack: (data) => {
return this.deleteRule(data.uuid);
}
}
},
bottomControls: {
filter: {
enable: true,
title: "过滤规则",
option: [
{
name: "过滤【已启用】的规则",
filterCallBack(data) {
return data.enable;
}
},
{
name: "过滤【未启用】的规则",
filterCallBack(data) {
return !data.enable;
}
},
{
name: "过滤【在当前网址生效】的规则",
filterCallBack(data) {
let matchRegExp = new RegExp(data.url, "ig");
return Boolean(window.location.href.match(matchRegExp));
}
}
]
}
}
});
ruleView.showView();
},
/**
* 添加单个规则
*/
addRule(rule) {
let allRule = this.getAllRule();
allRule.push(rule);
WebsiteRuleStorage.set(this.$data.STORAGE_KEY, allRule);
return true;
},
/**
* 根据uuid获取单个规则的数据
* @param uuid
*/
getRule(uuid) {
return this.getAllRule().find((rule) => rule.uuid === uuid);
},
/**
* 根据uuid获取单个规则的存储数据
* @param uuid
*/
getRuleData(uuid) {
var _a2;
if (typeof uuid === "string") {
return (_a2 = this.getRule(uuid)) == null ? void 0 : _a2.data;
} else {
return uuid.data;
}
},
/**
* 根据uuid获取单个规则的存储数据的值
* @param uuid
* @param key 键
* @param defaultValue 默认值
*/
getRuleDataValue(uuid, key, defaultValue) {
let ruleData = this.getRuleData(uuid);
return Reflect.get(ruleData, key) ?? defaultValue;
},
/**
* 更新单个规则
* @param rule
*/
updateRule(rule) {
let allRule = this.getAllRule();
let flag = false;
for (let index = 0; index < allRule.length; index++) {
const localRule = allRule[index];
if (localRule.uuid === rule.uuid) {
allRule[index] = rule;
flag = true;
break;
}
}
WebsiteRuleStorage.set(this.$data.STORAGE_KEY, allRule);
return flag;
},
/**
* 更新单个规则的值
*/
updateRuleValue(uuid, key, value) {
let allRule = this.getAllRule();
for (let index = 0; index < allRule.length; index++) {
const localRule = allRule[index];
if (localRule.uuid === uuid) {
Reflect.set(localRule, key, value);
break;
}
}
WebsiteRuleStorage.set(this.$data.STORAGE_KEY, allRule);
},
/**
* 删除单个规则
* @param uuid 整个规则或者规则的uuid
*/
deleteRule(uuid) {
let allRule = this.getAllRule();
let flag = false;
let needDeleteRuleUUID = typeof uuid === "string" ? uuid : uuid.uuid;
for (let index = 0; index < allRule.length; index++) {
const localRule = allRule[index];
if (localRule.uuid === needDeleteRuleUUID) {
allRule.splice(index, 1);
flag = true;
break;
}
}
WebsiteRuleStorage.set(this.$data.STORAGE_KEY, allRule);
return flag;
},
/**
* 清空所有规则
*/
deleteAllRule() {
WebsiteRuleStorage.delete(this.$data.STORAGE_KEY);
},
/**
* 获取所有规则
*/
getAllRule() {
let allRule = WebsiteRuleStorage.get(
this.$data.STORAGE_KEY,
[]
);
return allRule;
},
/**
* 根据url获取匹配的网站
* @param url 需要匹配的url
*/
getUrlMatchedRule(url = window.location.href) {
let allRule = this.getAllRule();
return allRule.filter((rule) => {
let matchRegExp = new RegExp(rule.url, "ig");
if (url.match(matchRegExp)) {
return true;
} else {
return false;
}
});
}
};
const WebsiteRuleStorage = new StorageUtils("websiteRule");
const WebsiteProxyGlobalValue = (key, value, defaultValue) => {
if (WebsiteRule.$data.isShowEditView) {
return value;
}
let matchedUrlRuleList = WebsiteRule.getUrlMatchedRule();
let findValue = matchedUrlRuleList.find((item) => {
let data = WebsiteRule.getRuleData(item);
return Reflect.has(data, key);
});
if (findValue) {
return Reflect.get(WebsiteRule.getRuleData(findValue), key);
} else {
return value;
}
};
const GenerateProxyData = function(key, defaultValue, proxyValueCallBack) {
return {
/** 键名 */
KEY: key,
/** 默认值 */
default: defaultValue,
/** 获取值 */
get value() {
let currentValue = _GM_getValue(key, defaultValue);
if (typeof proxyValueCallBack === "function") {
return proxyValueCallBack(key, currentValue, defaultValue);
}
return currentValue;
},
/** 设置值 */
set value(newValue) {
_GM_setValue(key, newValue);
}
};
};
const GeneratePanelData = function(key, defaultValue) {
return GenerateProxyData(key, defaultValue, WebsiteProxyGlobalValue);
};
const NetDiskGlobalData = {
/** Toast */
toast: {
/** 位置 */
position: GeneratePanelData("qmsg-config-position", "top"),
/** 同时最多显示的数量 */
maxnums: GeneratePanelData("qmsg-config-maxnums", 3),
/** 逆序弹出 */
showreverse: GeneratePanelData("qmsg-config-showreverse", true)
},
/** 弹窗 */
pops: {
/** 动画 */
popsAnimation: GeneratePanelData("popsAnimation", "pops-anim-fadein-zoom"),
/** 点击弹窗遮罩层是否可以关闭弹窗 */
clickMaskToCloseDialog: GeneratePanelData("clickMaskToCloseDialog", true),
/** 窗口拖拽 */
pcDrag: GeneratePanelData("pcDrag", true),
/** 限制拖拽距离 */
pcDragLimit: GeneratePanelData("pcDragLimit", true),
/** 亚克力效果 */
popsAcrylic: GeneratePanelData("popsAcrylic", false)
},
/** 文件弹窗 */
popsFolder: {
/** 排序名 */
"pops-folder-sort-name": GeneratePanelData(
"pops-folder-sort-name",
"fileName"
),
/** 排序规则 */
"pops-folder-sort-is-desc": GeneratePanelData(
"pops-folder-sort-is-desc",
false
)
},
/** 小图标导航 */
smallIconNavgiator: {
/** 点击定位分享码 */
"pops-netdisk-icon-click-event-find-sharecode": GeneratePanelData(
"pops-netdisk-icon-click-event-find-sharecode",
true
),
/** 选中分享码 */
"pops-netdisk-icon-click-event-find-sharecode-with-select": GeneratePanelData(
"pops-netdisk-icon-click-event-find-sharecode-with-select",
true
),
/** 循环定位 */
"pops-netdisk-icon-click-event-loop-find-sharecode": GeneratePanelData(
"pops-netdisk-icon-click-event-loop-find-sharecode",
true
)
},
/** 悬浮按钮 */
suspension: {
/** 大小 */
size: GeneratePanelData("size", 50),
/** 透明度 */
opacity: GeneratePanelData("opacity", 1),
/** 背景轮播时间 */
"randbg-time": GeneratePanelData("randbg-time", 1500),
/** 背景显示时间 */
"randbg-show-time": GeneratePanelData("randbg-show-time", 1200),
/** 吸附边缘 */
"suspended-button-adsorption-edge": GeneratePanelData(
"suspended-button-adsorption-edge",
false
)
},
/** 小窗模式 */
smallWindow: {
/** 宽度 */
"netdisk-ui-small-window-width": GeneratePanelData(
"netdisk-ui-small-window-width",
250
),
/** 高度 */
"netdisk-ui-small-window-max-height": GeneratePanelData(
"netdisk-ui-small-window-max-height",
200
)
},
/** 历史匹配记录 */
historyMatch: {
/** 保存匹配记录 */
saveMatchNetDisk: GeneratePanelData("saveMatchNetDisk", false),
/** 排序规则 */
"netdisk-history-match-ordering-rule": GeneratePanelData(
"netdisk-history-match-ordering-rule",
"按 更新时间 - 降序"
),
/** 合并相同链接 */
"netdisk-history-match-merge-same-link": GeneratePanelData(
"netdisk-history-match-merge-same-link",
true
)
},
/** 匹配设置 */
match: {
/** 匹配类型 */
pageMatchRange: GeneratePanelData("pageMatchRange", [
"innerText",
"innerHTML"
]),
/** 深入ShadowRoot获取匹配文本 */
depthQueryWithShadowRoot: GeneratePanelData(
"depthQueryWithShadowRoot",
false
),
/** 匹配剪贴板 */
readClipboard: GeneratePanelData("readClipboard", false),
/** 匹配当前URL */
allowMatchLocationHref: GeneratePanelData("allowMatchLocationHref", true),
/** 匹配input标签的内容 */
toBeMatchedWithInputElementValue: GeneratePanelData(
"to-be-matched-inputElementValue",
false
),
/** 匹配textarea标签的内容 */
toBeMatchedTextAreaElementValue: GeneratePanelData(
"to-be-matched-textAreaElementValue",
false
),
/** 匹配间隔 */
delaytime: GeneratePanelData("delaytime", 0.8),
/** 添加元素时进行匹配 */
isAddedNodesToMatch: GeneratePanelData("isAddedNodesToMatch", false),
/** 观察器:childList */
"mutationObserver-childList": GeneratePanelData(
"mutationObserver-childList",
true
),
/** 观察器:characterData */
"mutationObserver-characterData": GeneratePanelData(
"mutationObserver-characterData",
true
),
/** 观察器:subtree */
"mutationObserver-subtree": GeneratePanelData(
"mutationObserver-subtree",
true
)
},
/** 功能 */
features: {
/** 匹配模式 */
"netdisk-match-mode": GeneratePanelData(
"netdisk-match-mode",
"MutationObserver"
),
/** 行为模式 */
"netdisk-behavior-mode": GeneratePanelData(
"netdisk-behavior-mode",
"suspension_smallwindow"
),
/** 自动输入访问码 */
autoFillAccessCode: GeneratePanelData("autoFillAccessCode", true)
},
/** 分享码相关 */
shareCode: {
/** 相同系数 */
excludeIdenticalSharedCodesCoefficient: GeneratePanelData(
"excludeIdenticalSharedCodesCoefficient",
1
),
/** 排除分享码 */
excludeIdenticalSharedCodes: GeneratePanelData(
"excludeIdenticalSharedCodes",
false
)
},
/** 访问码 */
accessCode: {
/** 允许查询历史匹配记录 */
allowQueryHistoryMatchingAccessCode: GeneratePanelData(
"allowQueryHistoryMatchingAccessCode",
true
)
}
};
const _SCRIPT_NAME_ = "网盘链接识别";
const isDebug = false;
const utils = Utils.noConflict();
const domUtils = DOMUtils.noConflict();
const __pops = pops;
const Cryptojs$1 = CryptoJS ?? window.CryptoJS ?? _unsafeWindow.CryptoJS;
const __DataPaging = (
// @ts-ignore
DataPaging ?? window.DataPaging ?? _unsafeWindow.DataPaging
);
const log = new utils.Log(
_GM_info,
_unsafeWindow.console || _monkeyWindow.console
);
const SCRIPT_NAME = ((_a = _GM_info == null ? void 0 : _GM_info.script) == null ? void 0 : _a.name) || _SCRIPT_NAME_;
const AnyTouch = pops.config.Utils.AnyTouch();
log.config({
debug: isDebug,
logMaxCount: 1e3,
autoClearConsole: true,
tag: true
});
Qmsg.config(
Object.defineProperties(
{
html: true,
autoClose: true,
showClose: false
},
{
position: {
get() {
return NetDiskGlobalData.toast.position.value;
}
},
maxNums: {
get() {
return NetDiskGlobalData.toast.maxnums.value;
}
},
showReverse: {
get() {
return NetDiskGlobalData.toast.showreverse.value;
}
},
zIndex: {
get() {
let maxZIndex = Utils.getMaxZIndex(10);
let popsMaxZIndex = pops.config.InstanceUtils.getPopsMaxZIndex(maxZIndex).zIndex;
return Utils.getMaxValue(maxZIndex, popsMaxZIndex) + 100;
}
}
}
)
);
const GM_Menu = new utils.GM_Menu({
GM_getValue: _GM_getValue,
GM_setValue: _GM_setValue,
GM_registerMenuCommand: _GM_registerMenuCommand,
GM_unregisterMenuCommand: _GM_unregisterMenuCommand
});
const httpx = new utils.Httpx(_GM_xmlhttpRequest);
httpx.interceptors.request.use((data) => {
HttpxCookieManager.handle(data);
return data;
});
httpx.interceptors.response.use(void 0, (data) => {
log.error("拦截器-请求错误", data);
if (data.type === "onabort") {
Qmsg.warning("请求取消");
} else if (data.type === "onerror") {
Qmsg.error("请求异常");
} else if (data.type === "ontimeout") {
Qmsg.error("请求超时");
} else {
Qmsg.error("其它错误");
}
return data;
});
httpx.config({
logDetails: isDebug,
headers: {
"User-Agent": utils.getRandomPCUA()
}
});
({
Object: {
defineProperty: _unsafeWindow.Object.defineProperty
},
Function: {
apply: _unsafeWindow.Function.prototype.apply,
call: _unsafeWindow.Function.prototype.call
},
Element: {
appendChild: _unsafeWindow.Element.prototype.appendChild
},
setTimeout: _unsafeWindow.setTimeout
});
const addStyle = utils.addStyle.bind(utils);
const UIButtonShortCut = function(text, description, key, defaultValue, defaultButtonText, buttonType = "default", shortCut) {
let __defaultButtonText = defaultButtonText;
let getButtonText = () => {
return shortCut.getShowText(key, __defaultButtonText);
};
let result = UIButton(
text,
description,
getButtonText,
"keyboard",
false,
false,
buttonType,
async (event) => {
var _a2;
let $click = event.target;
let $btn = (_a2 = $click.closest(".pops-panel-button")) == null ? void 0 : _a2.querySelector("span");
if (shortCut.isWaitPress) {
Qmsg.warning("请先执行当前的录入操作");
return;
}
if (shortCut.hasOptionValue(key)) {
shortCut.emptyOption(key);
Qmsg.success("清空快捷键");
} else {
let loadingQmsg = Qmsg.loading("请按下快捷键...", {
showClose: true
});
let {
status,
option,
key: isUsedKey
} = await shortCut.enterShortcutKeys(key);
loadingQmsg.close();
if (status) {
log.success("成功录入快捷键", option);
Qmsg.success("成功录入");
} else {
Qmsg.error(
`快捷键 ${shortCut.translateKeyboardValueToButtonText(
option
)} 已被 ${isUsedKey} 占用`
);
}
}
$btn.innerHTML = getButtonText();
}
);
result.attributes = {};
Reflect.set(result.attributes, ATTRIBUTE_INIT, () => {
return false;
});
return result;
};
class ShortCut {
constructor(key) {
/** 存储的键 */
__publicField(this, "key", "short-cut");
/** 是否存在等待按下的按键 */
__publicField(this, "isWaitPress", false);
if (typeof key === "string") {
this.key = key;
}
}
/**
* 初始化配置默认值
*/
initConfig(key, option) {
if (this.hasOption(key)) ;
else {
this.setOption(key, option);
}
}
/** 获取存储的键 */
getStorageKey() {
return this.key;
}
/**
* 获取本地存储的所有值
*/
getLocalAllOptions() {
return _GM_getValue(this.key, []);
}
/**
* 判断是否存在该配置
* @param key 键
*/
hasOption(key) {
let localOptions = this.getLocalAllOptions();
let findOption = localOptions.find((item) => item.key === key);
return !!findOption;
}
/**
* 判断是否存在该配置的value值
* @param key 键
*/
hasOptionValue(key) {
if (this.hasOption(key)) {
let option = this.getOption(key);
return !((option == null ? void 0 : option.value) == null);
} else {
return false;
}
}
/**
* 获取配置
* @param key 键
* @param defaultValue 默认值
*/
getOption(key, defaultValue) {
let localOptions = this.getLocalAllOptions();
let findOption = localOptions.find((item) => item.key === key);
return findOption ?? defaultValue;
}
/**
* 设置配置
* @param key 键
* @param value 配置
*/
setOption(key, value) {
let localOptions = this.getLocalAllOptions();
let findIndex = localOptions.findIndex((item) => item.key === key);
if (findIndex == -1) {
localOptions.push({
key,
value
});
} else {
Reflect.set(localOptions[findIndex], "value", value);
}
_GM_setValue(this.key, localOptions);
}
/**
* 清空当前已有配置录入的值
* @param key
*/
emptyOption(key) {
let result = false;
let localOptions = this.getLocalAllOptions();
let findIndex = localOptions.findIndex((item) => item.key === key);
if (findIndex !== -1) {
localOptions[findIndex].value = null;
result = true;
}
_GM_setValue(this.key, localOptions);
return result;
}
/**
* 删除配置
* @param key 键
*/
deleteOption(key) {
let result = false;
let localValue = this.getLocalAllOptions();
let findValueIndex = localValue.findIndex((item) => item.key === key);
if (findValueIndex !== -1) {
localValue.splice(findValueIndex, 1);
result = true;
}
_GM_setValue(this.key, localValue);
return result;
}
/**
* 把配置的快捷键转成文字
* @param keyboardValue
* @returns
*/
translateKeyboardValueToButtonText(keyboardValue) {
let result = "";
keyboardValue.ohterCodeList.forEach((ohterCodeKey) => {
result += utils.stringTitleToUpperCase(ohterCodeKey, true) + " + ";
});
result += utils.stringTitleToUpperCase(keyboardValue.keyName);
return result;
}
/**
* 获取快捷键显示的文字
* @param key 本地存储的快捷键键名
* @param defaultShowText 默认显示的文字
*/
getShowText(key, defaultShowText) {
if (this.hasOption(key)) {
let localOption = this.getOption(key);
if (localOption.value == null) {
return defaultShowText;
} else {
return this.translateKeyboardValueToButtonText(localOption.value);
}
} else {
return defaultShowText;
}
}
/**
* 录入快捷键
* @param key 本地存储的快捷键键名
*/
async enterShortcutKeys(key) {
return new Promise((resolve) => {
this.isWaitPress = true;
let keyboardListener = domUtils.listenKeyboard(
window,
"keyup",
(keyName, keyValue, ohterCodeList) => {
const currentOption = {
keyName,
keyValue,
ohterCodeList
};
const shortcutJSONString = JSON.stringify(currentOption);
const allOptions = this.getLocalAllOptions();
for (let index = 0; index < allOptions.length; index++) {
let localValue = allOptions[index];
if (localValue.key === key) {
continue;
}
const localShortCutJSONString = JSON.stringify(localValue.value);
let isUsedByOtherOption = false;
if (localValue.value != null && shortcutJSONString === localShortCutJSONString) {
isUsedByOtherOption = true;
}
if (isUsedByOtherOption) {
this.isWaitPress = false;
keyboardListener.removeListen();
resolve({
status: false,
key: localValue.key,
option: currentOption
});
return;
}
}
this.setOption(key, currentOption);
this.isWaitPress = false;
keyboardListener.removeListen();
resolve({
status: true,
key,
option: currentOption
});
}
);
});
}
/**
* 初始化全局键盘监听
* @param shortCutOption 快捷键配置 一般是{ "键名": { callback: ()=>{}}},键名是本地存储的自定义快捷键的键名
*/
initGlobalKeyboardListener(shortCutOption) {
let localOptions = this.getLocalAllOptions();
if (!localOptions.length) {
log.warn("没有设置快捷键");
return;
}
let that = this;
function setListenKeyboard($ele, option) {
domUtils.listenKeyboard(
$ele,
"keydown",
(keyName, keyValue, ohterCodeList) => {
if (that.isWaitPress) {
return;
}
localOptions = that.getLocalAllOptions();
let findShortcutIndex = localOptions.findIndex((item) => {
let option2 = item.value;
let tempOption = {
keyName,
keyValue,
ohterCodeList
};
if (JSON.stringify(option2) === JSON.stringify(tempOption)) {
return item;
}
});
if (findShortcutIndex != -1) {
let findShortcut = localOptions[findShortcutIndex];
log.info("调用快捷键", findShortcut);
if (findShortcut.key in option) {
option[findShortcut.key].callback();
}
}
}
);
}
let WindowShortCutOption = {};
let ElementShortCutOption = {};
Object.keys(shortCutOption).forEach((localKey) => {
let option = shortCutOption[localKey];
if (option.target == null || typeof option.target === "string" && option.target === "") {
option.target = "window";
}
if (option.target === "window") {
Reflect.set(WindowShortCutOption, localKey, option);
} else {
Reflect.set(ElementShortCutOption, localKey, option);
}
});
setListenKeyboard(window, WindowShortCutOption);
domUtils.ready(() => {
Object.keys(ElementShortCutOption).forEach(async (localKey) => {
let option = ElementShortCutOption[localKey];
if (typeof option.target === "string") {
utils.waitNode(option.target, 1e4).then(($ele) => {
if (!$ele) {
return;
}
let __option = {};
Reflect.set(__option, localKey, option);
setListenKeyboard($ele, __option);
});
} else if (typeof option.target === "function") {
let target = await option.target();
if (target == null) {
return;
}
let __option = {};
Reflect.set(__option, localKey, option);
setListenKeyboard(target, __option);
} else {
let __option = {};
Reflect.set(__option, localKey, option);
setListenKeyboard(option.target, __option);
}
});
});
}
}
const NetDiskShortcut = {
shortCut: new ShortCut("GM_shortcut"),
init() {
this.shortCut.initGlobalKeyboardListener(this.getShortCutMap());
},
getShortCutMap() {
return {
"netdisk-keyboard-open-setting": {
target: "window",
callback: () => {
log.info("快捷键 ==> 【打开】⚙ 设置");
NetDiskGlobalSettingView.show();
}
},
"netdisk-keyboard-open-history-matching-records": {
target: "window",
callback: () => {
log.info("快捷键 ==> 【打开】⚙ 历史匹配记录");
NetDiskUI.netDiskHistoryMatch.show();
}
},
"netdisk-keyboard-open-user-rule": {
target: "window",
callback: () => {
log.info("快捷键 ==> 【打开】⚙ 用户自定义规则");
NetDiskUserRuleUI.show(false);
}
},
"netdisk-keyboard-open-proactively-recognize-text": {
target: "window",
callback: () => {
log.info("快捷键 ==> 【打开】⚙ 主动识别文本");
NetDiskUI.matchPasteText.show();
}
},
"netdisk-keyboard-performPageTextMatchingManually": {
target: "window",
callback() {
log.info("快捷键 ==> 执行文本匹配");
NetDiskWorker.dispatchMonitorDOMChange = true;
}
},
"netdisk-keyboard-character-mapping": {
target: "window",
callback() {
log.info("快捷键 ==> 【打开】⚙ 字符映射");
CharacterMapping.show();
}
}
};
}
};
const UISelectMultiple = function(text, key, defaultValue, data, callback, description, placeholder = "请至少选择一个选项", selectConfirmDialogDetails) {
let selectData = [];
if (typeof data === "function") {
selectData = data();
} else {
selectData = data;
}
let result = {
text,
type: "select-multiple",
description,
placeholder,
attributes: {},
props: {},
getValue() {
return this.props[PROPS_STORAGE_API].get(key, defaultValue);
},
selectConfirmDialogDetails,
callback(selectInfo) {
let value = [];
selectInfo.forEach((selectedInfo) => {
value.push(selectedInfo.value);
});
this.props[PROPS_STORAGE_API].set(key, value);
log.info(`多选-选择:`, value);
},
data: selectData
};
Reflect.set(result.attributes, ATTRIBUTE_KEY, key);
Reflect.set(result.attributes, ATTRIBUTE_DEFAULT_VALUE, defaultValue);
Reflect.set(result.props, PROPS_STORAGE_API, {
get(key2, defaultValue2) {
return _GM_getValue(key2, defaultValue2);
},
set(key2, value) {
_GM_setValue(key2, value);
}
});
return result;
};
const PanelUI_allSetting = {
id: "netdisk-panel-config-all-setting",
title: "总设置",
isDefault: true,
forms: [
{
type: "forms",
text: "",
forms: [
{
type: "deepMenu",
text: "Toast",
forms: [
{
type: "forms",
text: "",
className: "netdisk-panel-forms-toast",
forms: [
UISelect(
"位置",
NetDiskGlobalData.toast.position.KEY,
NetDiskGlobalData.toast.position.default,
[
{
value: "topleft",
text: "左上角"
},
{
value: "top",
text: "顶部"
},
{
value: "topright",
text: "右上角"
},
{
value: "left",
text: "左边"
},
{
value: "center",
text: "中间"
},
{
value: "right",
text: "右边"
},
{
value: "bottomleft",
text: "左下角"
},
{
value: "bottom",
text: "底部"
},
{
value: "bottomright",
text: "右下角"
}
],
void 0,
`Toast显示在九宫格的位置,默认: ${NetDiskGlobalData.toast.position.default}`
),
UISelect(
"同时最多显示的数量",
NetDiskGlobalData.toast.maxnums.KEY,
NetDiskGlobalData.toast.maxnums.default,
[
{
value: 1,
text: "1"
},
{
value: 2,
text: "2"
},
{
value: 3,
text: "3"
},
{
value: 4,
text: "4"
},
{
value: 5,
text: "5"
}
],
void 0,
`默认: ${NetDiskGlobalData.toast.maxnums.default}`
),
UISwitch(
"逆序弹出",
NetDiskGlobalData.toast.showreverse.KEY,
NetDiskGlobalData.toast.showreverse.value,
void 0,
"默认是自上往下显示Toast,逆序则是自下往上显示Toast"
)
]
}
]
},
{
type: "deepMenu",
text: "弹窗",
forms: [
{
className: "netdisk-panel-forms-pops",
type: "forms",
text: "",
forms: [
UISelect(
"动画",
NetDiskGlobalData.pops.popsAnimation.KEY,
NetDiskGlobalData.pops.popsAnimation.default,
[
{
value: "",
text: "无"
},
{
value: "pops-anim-spread",
text: "spread"
},
{
value: "pops-anim-shake",
text: "shake"
},
{
value: "pops-anim-rolling-left",
text: "rolling-left"
},
{
value: "pops-anim-rolling-right",
text: "rolling-right"
},
{
value: "pops-anim-slide-top",
text: "slide-top"
},
{
value: "pops-anim-slide-bottom",
text: "slide-bottom"
},
{
value: "pops-anim-slide-left",
text: "slide-left"
},
{
value: "pops-anim-slide-right",
text: "slide-right"
},
{
value: "pops-anim-fadein",
text: "fadein"
},
{
value: "pops-anim-fadein-zoom",
text: "fadein-zoom"
},
{
value: "pops-anim-fadein-alert",
text: "fadein-alert"
},
{
value: "pops-anim-don",
text: "don"
},
{
value: "pops-anim-roll",
text: "roll"
},
{
value: "pops-anim-sandra",
text: "sandra"
},
{
value: "pops-anim-gather",
text: "gather"
}
],
void 0,
`显示/关闭的动画效果,默认: ${NetDiskGlobalData.pops.popsAnimation.default}`
),
UISwitch(
"点击弹窗遮罩层关闭弹窗",
NetDiskGlobalData.pops.clickMaskToCloseDialog.KEY,
NetDiskGlobalData.pops.clickMaskToCloseDialog.default,
void 0,
"点击遮罩层触发关闭弹窗事件"
),
UISwitch(
"窗口拖拽",
NetDiskGlobalData.pops.pcDrag.KEY,
NetDiskGlobalData.pops.pcDrag.default,
void 0,
"长按标题栏可拖拽移动弹窗"
),
UISwitch(
"限制拖拽距离",
NetDiskGlobalData.pops.pcDragLimit.KEY,
NetDiskGlobalData.pops.pcDragLimit.default,
void 0,
"只能在浏览器的可视窗口内拖动"
),
UISwitch(
"亚克力效果",
NetDiskGlobalData.pops.popsAcrylic.KEY,
NetDiskGlobalData.pops.popsAcrylic.default,
void 0,
""
)
]
}
]
},
{
type: "deepMenu",
text: "文件弹窗",
forms: [
{
type: "forms",
text: "",
className: "netdisk-panel-forms-pops-folder",
forms: [
UISelect(
"排序名",
NetDiskGlobalData.popsFolder["pops-folder-sort-name"].KEY,
NetDiskGlobalData.popsFolder["pops-folder-sort-name"].default,
[
{
value: "fileName",
text: "文件名"
},
{
value: "latestTime",
text: "修改时间"
},
{
value: "fileSize",
text: "大小"
}
],
void 0,
"当前的规则"
),
UISelect(
"排序规则",
NetDiskGlobalData.popsFolder["pops-folder-sort-is-desc"].KEY,
NetDiskGlobalData.popsFolder["pops-folder-sort-is-desc"].default,
[
{
value: false,
text: "升序"
},
{
value: true,
text: "降序"
}
],
void 0,
"当前的规则"
)
]
}
]
},
{
type: "deepMenu",
text: "悬浮按钮",
forms: [
{
type: "forms",
text: "",
forms: [
UISlider(
"大小",
NetDiskGlobalData.suspension.size.KEY,
NetDiskGlobalData.suspension.size.default,
15,
250,
(event, value) => {
NetDiskGlobalData.suspension.size.value = parseInt(
value.toString()
);
if (NetDiskUI.suspension.isShow) {
domUtils.css(NetDiskUI.suspension.suspensionNode, {
width: NetDiskGlobalData.suspension.size.value,
height: NetDiskGlobalData.suspension.size.value
});
NetDiskUI.suspension.setSuspensionPosition();
}
},
(value) => {
return `${value}px`;
},
"悬浮按钮的大小,默认: " + NetDiskGlobalData.suspension.size.default
),
UISlider(
"透明度",
NetDiskGlobalData.suspension.opacity.KEY,
NetDiskGlobalData.suspension.opacity.default,
0.1,
1,
(event, value) => {
NetDiskGlobalData.suspension.opacity.value = parseFloat(
value.toString()
);
if (NetDiskUI.suspension.isShow) {
domUtils.css(NetDiskUI.suspension.suspensionNode, {
opacity: NetDiskGlobalData.suspension.opacity.value
});
}
},
void 0,
"值越小越透明,默认: " + NetDiskGlobalData.suspension.opacity.default,
0.1
),
UISlider(
"背景轮播时间",
NetDiskGlobalData.suspension["randbg-time"].KEY,
NetDiskGlobalData.suspension["randbg-time"].default,
0,
1e4,
void 0,
(value) => {
return `${value}ms`;
},
"淡入/淡出的时间,默认: " + NetDiskGlobalData.suspension["randbg-time"].default + "ms",
100
),
UISlider(
"背景显示时间",
NetDiskGlobalData.suspension["randbg-show-time"].KEY,
NetDiskGlobalData.suspension["randbg-show-time"].default,
0,
1e4,
void 0,
(value) => {
return `${value}ms`;
},
"图标显示的持续时间,默认: 1200",
100
),
UISwitch(
"吸附边缘",
NetDiskGlobalData.suspension["suspended-button-adsorption-edge"].KEY,
NetDiskGlobalData.suspension["suspended-button-adsorption-edge"].default,
void 0,
"移动悬浮按钮松开后自动吸附边缘"
)
]
}
]
},
{
type: "deepMenu",
text: "小窗模式",
forms: [
{
type: "forms",
text: "",
className: "netdisk-panel-forms-small-window",
forms: [
UISlider(
"宽度",
NetDiskGlobalData.smallWindow["netdisk-ui-small-window-width"].KEY,
NetDiskGlobalData.smallWindow["netdisk-ui-small-window-width"].default,
50,
domUtils.width(window),
void 0,
(value) => {
return `${value}px`;
},
"设置小窗宽度(px),默认: 250",
1
),
UISlider(
"高度",
NetDiskGlobalData.smallWindow["netdisk-ui-small-window-max-height"].KEY,
NetDiskGlobalData.smallWindow["netdisk-ui-small-window-max-height"].default,
50,
domUtils.height(window),
void 0,
(value) => {
return `${value}px`;
},
"设置小窗最大高度(px),默认: " + NetDiskGlobalData.smallWindow["netdisk-ui-small-window-max-height"].default,
1
)
]
}
]
}
]
},
{
type: "forms",
text: "",
forms: [
{
type: "deepMenu",
text: "功能",
forms: [
{
type: "forms",
text: "",
className: "netdisk-panel-forms-function",
forms: [
UISelect(
"匹配模式",
NetDiskGlobalData.features["netdisk-match-mode"].KEY,
NetDiskGlobalData.features["netdisk-match-mode"].default,
[
{
text: "MutationObserver",
value: "MutationObserver"
},
{
text: "Menu",
value: "Menu"
}
],
void 0,
"MutationObserver是网页加载完毕后自动监听识别链接,Menu是油猴菜单点击进行识别"
),
UISelect(
"行为模式",
NetDiskGlobalData.features["netdisk-behavior-mode"].KEY,
NetDiskGlobalData.features["netdisk-behavior-mode"].default,
[
{
text: "悬浮按钮+小窗",
value: "suspension_smallwindow"
},
{
text: "悬浮按钮+大窗",
value: "suspension_window"
},
{
text: "小窗",
value: "smallwindow"
}
],
void 0,
"匹配到链接时触发的UI执行"
),
UISwitch(
"自动输入访问码",
NetDiskGlobalData.features.autoFillAccessCode.KEY,
NetDiskGlobalData.features.autoFillAccessCode.default,
void 0,
"通过主动点击链接跳转时,会自动输入网盘访问码"
)
]
}
]
},
{
type: "deepMenu",
text: "匹配设置",
forms: [
{
type: "forms",
text: "文本匹配范围",
forms: [
UISelectMultiple(
"匹配规则类型",
NetDiskGlobalData.match.pageMatchRange.KEY,
NetDiskGlobalData.match.pageMatchRange.default,
[
{
value: "innerText",
text: "普通文本"
},
{
value: "innerHTML",
text: "超文本"
}
],
void 0,
"执行的文本匹配规则",
void 0,
{
height: "auto"
}
),
UISwitch(
"深入ShadowRoot获取匹配文本",
NetDiskGlobalData.match.depthQueryWithShadowRoot.KEY,
NetDiskGlobalData.match.depthQueryWithShadowRoot.default,
void 0,
"遍历ShadowRoot,获取匹配的内容"
),
UISwitch(
"匹配剪贴板",
NetDiskGlobalData.match.readClipboard.KEY,
NetDiskGlobalData.match.readClipboard.default,
void 0,
"Api兼容性查看:
读取剪贴板权限申请、
直接读取剪贴板"
),
UISwitch(
"匹配当前URL",
NetDiskGlobalData.match.allowMatchLocationHref.KEY,
NetDiskGlobalData.match.allowMatchLocationHref.default,
void 0,
"提取window.location.href进行匹配"
),
UISwitch(
"匹配input标签的内容",
NetDiskGlobalData.match.toBeMatchedWithInputElementValue.KEY,
NetDiskGlobalData.match.toBeMatchedWithInputElementValue.default,
void 0,
"提取页面中的<input>的内容进行匹配"
),
UISwitch(
"匹配textarea标签的内容",
NetDiskGlobalData.match.toBeMatchedTextAreaElementValue.KEY,
NetDiskGlobalData.match.toBeMatchedTextAreaElementValue.default,
void 0,
"提取页面中的<textarea>的内容进行匹配"
)
]
},
{
type: "forms",
text: "MutationObserver观察器",
forms: [
UISlider(
"匹配间隔",
NetDiskGlobalData.match.delaytime.KEY,
NetDiskGlobalData.match.delaytime.default,
0,
5,
void 0,
(value) => {
return `${value}s`;
},
"匹配文本完毕后的延迟xxx秒允许下一次匹配",
0.1
),
UISwitch(
"添加元素时进行匹配",
NetDiskGlobalData.match.isAddedNodesToMatch.KEY,
NetDiskGlobalData.match.isAddedNodesToMatch.default,
void 0,
"当监听到页面添加元素时才进行匹配文本"
),
UISwitch(
"观察器:childList",
NetDiskGlobalData.match["mutationObserver-childList"].KEY,
NetDiskGlobalData.match["mutationObserver-childList"].default,
void 0,
"子节点的变动(新增、删除或者更改)"
),
UISwitch(
"观察器:characterData",
NetDiskGlobalData.match["mutationObserver-characterData"].KEY,
NetDiskGlobalData.match["mutationObserver-characterData"].default,
void 0,
"节点内容或节点文本的变动"
),
UISwitch(
"观察器:subtree",
NetDiskGlobalData.match["mutationObserver-subtree"].KEY,
NetDiskGlobalData.match["mutationObserver-subtree"].default,
void 0,
"是否将观察器应用于该节点的所有后代节点"
)
]
}
]
},
{
type: "deepMenu",
text: "网盘图标",
forms: [
{
type: "forms",
text: "",
forms: [
UISwitch(
"点击定位分享码",
NetDiskGlobalData.smallIconNavgiator["pops-netdisk-icon-click-event-find-sharecode"].KEY,
NetDiskGlobalData.smallIconNavgiator["pops-netdisk-icon-click-event-find-sharecode"].default,
void 0,
"自动滚动页面至包含分享码的元素"
),
UISwitch(
"选中分享码",
NetDiskGlobalData.smallIconNavgiator["pops-netdisk-icon-click-event-find-sharecode-with-select"].KEY,
NetDiskGlobalData.smallIconNavgiator["pops-netdisk-icon-click-event-find-sharecode-with-select"].default,
void 0,
"使用光标选中分享码/元素"
),
UISwitch(
"循环定位",
NetDiskGlobalData.smallIconNavgiator["pops-netdisk-icon-click-event-loop-find-sharecode"].KEY,
NetDiskGlobalData.smallIconNavgiator["pops-netdisk-icon-click-event-loop-find-sharecode"].default,
void 0,
"关闭则是每一个元素只定位一次"
)
]
}
]
},
{
type: "deepMenu",
text: "历史匹配记录",
forms: [
{
type: "forms",
text: "",
className: "netdisk-panel-history-match",
forms: [
UISwitch(
"保存匹配记录",
NetDiskGlobalData.historyMatch.saveMatchNetDisk.KEY,
NetDiskGlobalData.historyMatch.saveMatchNetDisk.default,
void 0,
"将匹配到的链接信息进行本地存储,可点击【油猴菜单-⚙ 历史匹配记录】进行查看"
),
UISwitch(
"合并相同链接",
NetDiskGlobalData.historyMatch["netdisk-history-match-merge-same-link"].KEY,
NetDiskGlobalData.historyMatch["netdisk-history-match-merge-same-link"].default,
void 0,
"将合并匹配到的相同链接,并更新它最后一次匹配到的更新时间、网址信息"
),
UISelect(
"排序规则",
NetDiskGlobalData.historyMatch["netdisk-history-match-ordering-rule"].KEY,
NetDiskGlobalData.historyMatch["netdisk-history-match-ordering-rule"].default,
[
{
value: "按 记录时间 - 升序",
text: "按 记录时间 - 升序"
},
{
value: "按 记录时间 - 降序",
text: "按 记录时间 - 降序"
},
{
value: "按 更新时间 - 升序",
text: "按 更新时间 - 升序"
},
{
value: "按 更新时间 - 降序",
text: "按 更新时间 - 降序"
}
]
),
UIButton(
"修复存储记录",
"如果【匹配记录】弹窗打不开,可能是存储的数据缺失某些字段,可尝试点击此处进行修复",
"修复",
void 0,
void 0,
false,
"primary",
() => {
try {
const { count, repairCount } = NetDiskUI.netDiskHistoryMatch.checkAndRepairLocalData();
if (repairCount === 0) {
Qmsg.info(`不存在需要修复的数据`);
} else {
Qmsg.success(`共计: ${count} 条,修复${repairCount}条`);
}
} catch (error) {
Qmsg.error("修复异常:" + error.toString());
}
}
)
]
}
]
},
{
type: "deepMenu",
text: "分享码",
forms: [
{
type: "forms",
text: "",
className: "netdisk-panel-forms-share-code",
forms: [
UISwitch(
"排除分享码",
NetDiskGlobalData.shareCode.excludeIdenticalSharedCodes.KEY,
NetDiskGlobalData.shareCode.excludeIdenticalSharedCodes.default,
void 0,
"启用后会根据【相同系数】排除掉匹配到的分享码"
),
UISlider(
"相同系数",
NetDiskGlobalData.shareCode.excludeIdenticalSharedCodesCoefficient.KEY,
NetDiskGlobalData.shareCode.excludeIdenticalSharedCodesCoefficient.default,
0,
1,
void 0,
(value) => {
return value.toString();
},
"例如分享码: aaaaaaaabb,它的相同系数是0.8,设置相同系数≥0.8时会被排除",
0.01
)
]
}
]
},
{
type: "deepMenu",
text: "访问码",
forms: [
{
className: "netdisk-panel-forms-access-code",
text: "",
type: "forms",
forms: [
UISwitch(
"允许查询历史匹配记录",
NetDiskGlobalData.accessCode.allowQueryHistoryMatchingAccessCode.KEY,
NetDiskGlobalData.accessCode.allowQueryHistoryMatchingAccessCode.default,
void 0,
"当访问码为空时,访问码将从历史匹配记录中查询,优先级:页面匹配 < 历史匹配记录 < 网站规则 < 黑名单"
)
]
}
]
},
{
type: "deepMenu",
className: "netdisk-panel-forms-shortcut-keys-deepMenu",
text: "快捷键",
forms: [
{
className: "netdisk-panel-forms-shortcut-keys",
text: "",
type: "forms",
forms: [
UIButtonShortCut(
"【打开】⚙ 设置",
"",
"netdisk-keyboard-open-setting",
void 0,
"暂无快捷键",
"default",
NetDiskShortcut.shortCut
),
UIButtonShortCut(
"【打开】⚙ 历史匹配记录",
"",
"netdisk-keyboard-open-history-matching-records",
void 0,
"暂无快捷键",
"default",
NetDiskShortcut.shortCut
),
UIButtonShortCut(
"【打开】⚙ 访问码规则",
"",
"netdisk-keyboard-open-accesscode-rule",
void 0,
"暂无快捷键",
"default",
NetDiskShortcut.shortCut
),
UIButtonShortCut(
"【打开】⚙ 自定义规则",
"",
"netdisk-keyboard-open-user-rule",
void 0,
"暂无快捷键",
"default",
NetDiskShortcut.shortCut
),
UIButtonShortCut(
"【打开】⚙ 网站规则",
"",
"netdisk-keyboard-website-rule",
void 0,
"暂无快捷键",
"default",
NetDiskShortcut.shortCut
),
UIButtonShortCut(
"【打开】⚙ 字符映射",
"",
"netdisk-keyboard-character-mapping",
void 0,
"暂无快捷键",
"default",
NetDiskShortcut.shortCut
),
UIButtonShortCut(
"【打开】⚙ 识别文本",
"",
"netdisk-keyboard-open-proactively-recognize-text",
void 0,
"暂无快捷键",
"default",
NetDiskShortcut.shortCut
),
UIButtonShortCut(
"执行文本匹配",
"",
"netdisk-keyboard-performPageTextMatchingManually",
void 0,
"暂无快捷键",
"default",
NetDiskShortcut.shortCut
)
]
}
]
}
]
}
]
};
const PopsPanel = {
/** 数据 */
$data: {
__data: null,
__oneSuccessExecMenu: null,
__onceExec: null,
__listenData: null,
/**
* 菜单项的默认值
*/
get data() {
if (PopsPanel.$data.__data == null) {
PopsPanel.$data.__data = new utils.Dictionary();
}
return PopsPanel.$data.__data;
},
/**
* 成功只执行了一次的项
*/
get oneSuccessExecMenu() {
if (PopsPanel.$data.__oneSuccessExecMenu == null) {
PopsPanel.$data.__oneSuccessExecMenu = new utils.Dictionary();
}
return PopsPanel.$data.__oneSuccessExecMenu;
},
/**
* 成功只执行了一次的项
*/
get onceExec() {
if (PopsPanel.$data.__onceExec == null) {
PopsPanel.$data.__onceExec = new utils.Dictionary();
}
return PopsPanel.$data.__onceExec;
},
/** 脚本名,一般用在设置的标题上 */
get scriptName() {
return SCRIPT_NAME;
},
/** 菜单项的总值在本地数据配置的键名 */
key: KEY,
/** 菜单项在attributes上配置的菜单键 */
attributeKeyName: ATTRIBUTE_KEY,
/** 菜单项在attributes上配置的菜单默认值 */
attributeDefaultValueName: ATTRIBUTE_DEFAULT_VALUE
},
/** 监听器 */
$listener: {
/**
* 值改变的监听器
*/
get listenData() {
if (PopsPanel.$data.__listenData == null) {
PopsPanel.$data.__listenData = new utils.Dictionary();
}
return PopsPanel.$data.__listenData;
}
},
init() {
this.initPanelDefaultValue(
this.getPanelContentConfig().concat(NetDiskRule.getRulePanelContent())
);
this.initExtensionsMenu();
},
/** 判断是否是顶层窗口 */
isTopWindow() {
return _unsafeWindow.top === _unsafeWindow.self;
},
/** 初始化进行注册油猴菜单 */
initExtensionsMenu() {
if (!this.isTopWindow()) {
return;
}
GM_Menu.add([
{
key: "show_pops_panel_setting",
text: "⚙ 设置",
autoReload: false,
isStoreValue: false,
showText(text) {
return text;
},
callback: () => {
NetDiskGlobalSettingView.show();
}
},
{
key: "showNetDiskHistoryMatch",
text: "⚙ 历史匹配记录",
autoReload: false,
isStoreValue: false,
showText(text) {
return text;
},
callback() {
NetDiskUI.netDiskHistoryMatch.show();
}
},
{
key: "websiteRule",
text: "⚙ 网站规则",
autoReload: false,
isStoreValue: false,
showText(text) {
return text;
},
callback() {
WebsiteRule.show();
}
},
{
key: "charater-mapping",
text: "⚙ 字符映射",
autoReload: false,
isStoreValue: false,
showText(text) {
return text;
},
callback() {
CharacterMapping.show();
}
},
{
key: "showUserRule",
text: "⚙ 自定义规则",
autoReload: false,
isStoreValue: false,
showText(text) {
return text;
},
callback() {
NetDiskUserRuleUI.show(false);
}
},
{
key: "showMatchPasteText",
text: "⚙ 识别文本",
autoReload: false,
isStoreValue: false,
showText(text) {
return text;
},
callback() {
NetDiskUI.matchPasteText.show();
}
}
]);
},
/** 初始化菜单项的默认值保存到本地数据中 */
initPanelDefaultValue(contentConfigList) {
function initDefaultValue(config) {
if (!config.attributes) {
return;
}
if (config.type === "button") {
return;
}
let needInitConfig = {};
let key = config.attributes[ATTRIBUTE_KEY];
if (key != null) {
needInitConfig[key] = config.attributes[ATTRIBUTE_DEFAULT_VALUE];
}
let __attr_init__ = config.attributes[ATTRIBUTE_INIT];
if (typeof __attr_init__ === "function") {
let __attr_result__ = __attr_init__();
if (typeof __attr_result__ === "boolean" && !__attr_result__) {
return;
}
}
let initMoreValue = config.attributes[ATTRIBUTE_INIT_MORE_VALUE];
if (initMoreValue && typeof initMoreValue === "object") {
Object.assign(needInitConfig, initMoreValue);
}
let needInitConfigList = Object.keys(needInitConfig);
if (!needInitConfigList.length) {
log.warn("请先配置键", config);
return;
}
needInitConfigList.forEach((iteratorKey) => {
let iteratorDefaultValue = needInitConfig[iteratorKey];
if (_GM_getValue(iteratorKey) == null) {
_GM_setValue(iteratorKey, iteratorDefaultValue);
}
});
}
function loopInitDefaultValue(configList) {
for (let index = 0; index < configList.length; index++) {
let configItem = configList[index];
initDefaultValue(configItem);
let childForms = configItem.forms;
if (childForms && Array.isArray(childForms)) {
loopInitDefaultValue(childForms);
}
}
}
for (let index = 0; index < contentConfigList.length; index++) {
let leftContentConfigItem = contentConfigList[index];
if (!leftContentConfigItem.forms) {
continue;
}
let rightContentConfigList = leftContentConfigItem.forms;
if (rightContentConfigList && Array.isArray(rightContentConfigList)) {
loopInitDefaultValue(rightContentConfigList);
}
}
},
/**
* 设置值
* @param key 键
* @param value 值
*/
setValue(key, value) {
let locaData = _GM_getValue(KEY, {});
let oldValue = locaData[key];
locaData[key] = value;
_GM_setValue(KEY, locaData);
if (this.$listener.listenData.has(key)) {
this.$listener.listenData.get(key).callback(key, oldValue, value);
}
},
/**
* 获取值
* @param key 键
* @param defaultValue 默认值
*/
getValue(key, defaultValue) {
let locaData = _GM_getValue(KEY, {});
let localValue = locaData[key];
if (localValue == null) {
if (this.$data.data.has(key)) {
return this.$data.data.get(key);
}
return defaultValue;
}
return localValue;
},
/**
* 删除值
* @param key 键
*/
deleteValue(key) {
let locaData = _GM_getValue(KEY, {});
let oldValue = locaData[key];
Reflect.deleteProperty(locaData, key);
_GM_setValue(KEY, locaData);
if (this.$listener.listenData.has(key)) {
this.$listener.listenData.get(key).callback(key, oldValue, void 0);
}
},
/**
* 监听调用setValue、deleteValue
* @param key 需要监听的键
* @param callback
*/
addValueChangeListener(key, callback, option) {
let listenerId = Math.random();
this.$listener.listenData.set(key, {
id: listenerId,
key,
callback
});
if (option) {
if (option.immediate) {
callback(key, this.getValue(key), this.getValue(key));
}
}
return listenerId;
},
/**
* 移除监听
* @param listenerId 监听的id
*/
removeValueChangeListener(listenerId) {
let deleteKey = null;
for (const [key, value] of this.$listener.listenData.entries()) {
if (value.id === listenerId) {
deleteKey = key;
break;
}
}
if (typeof deleteKey === "string") {
this.$listener.listenData.delete(deleteKey);
} else {
console.warn("没有找到对应的监听器");
}
},
/**
* 主动触发菜单值改变的回调
* @param key 菜单键
* @param newValue 想要触发的新值,默认使用当前值
* @param oldValue 想要触发的旧值,默认使用当前值
*/
triggerMenuValueChange(key, newValue, oldValue) {
if (this.$listener.listenData.has(key)) {
let listenData = this.$listener.listenData.get(key);
if (typeof listenData.callback === "function") {
let value = this.getValue(key);
let __newValue = value;
let __oldValue = value;
if (typeof newValue !== "undefined" && arguments.length > 1) {
__newValue = newValue;
}
if (typeof oldValue !== "undefined" && arguments.length > 2) {
__oldValue = oldValue;
}
listenData.callback(key, __oldValue, __newValue);
}
}
},
/**
* 判断该键是否存在
* @param key 键
*/
hasKey(key) {
let locaData = _GM_getValue(KEY, {});
return key in locaData;
},
/**
* 自动判断菜单是否启用,然后执行回调
* @param key
* @param callback 回调
* @param [isReverse=false] 逆反判断菜单启用
*/
execMenu(key, callback, isReverse = false) {
if (!(typeof key === "string" || typeof key === "object" && Array.isArray(key))) {
throw new TypeError("key 必须是字符串或者字符串数组");
}
let runKeyList = [];
if (typeof key === "object" && Array.isArray(key)) {
runKeyList = [...key];
} else {
runKeyList.push(key);
}
let value = void 0;
for (let index = 0; index < runKeyList.length; index++) {
const runKey = runKeyList[index];
if (!this.$data.data.has(runKey)) {
log.warn(`${key} 键不存在`);
return;
}
let runValue = PopsPanel.getValue(runKey);
if (isReverse) {
runValue = !runValue;
}
if (!runValue) {
break;
}
value = runValue;
}
if (value) {
callback(value);
}
},
/**
* 自动判断菜单是否启用,然后执行回调,只会执行一次
* @param key
* @param callback 回调
* @param getValueFn 自定义处理获取当前值,值true是启用并执行回调,值false是不执行回调
* @param handleValueChangeFn 自定义处理值改变时的回调,值true是启用并执行回调,值false是不执行回调
*/
execMenuOnce(key, callback, getValueFn, handleValueChangeFn) {
if (typeof key !== "string") {
throw new TypeError("key 必须是字符串");
}
if (!this.$data.data.has(key)) {
log.warn(`${key} 键不存在`);
return;
}
if (this.$data.oneSuccessExecMenu.has(key)) {
return;
}
this.$data.oneSuccessExecMenu.set(key, 1);
let __getValue = () => {
let localValue = PopsPanel.getValue(key);
return typeof getValueFn === "function" ? getValueFn(key, localValue) : localValue;
};
let resultStyleList = [];
let dynamicPushStyleNode = ($style) => {
let __value = __getValue();
let dynamicResultList = [];
if ($style instanceof HTMLStyleElement) {
dynamicResultList = [$style];
} else if (Array.isArray($style)) {
dynamicResultList = [
...$style.filter(
(item) => item != null && item instanceof HTMLStyleElement
)
];
}
if (__value) {
resultStyleList = resultStyleList.concat(dynamicResultList);
} else {
for (let index = 0; index < dynamicResultList.length; index++) {
let $css = dynamicResultList[index];
$css.remove();
dynamicResultList.splice(index, 1);
index--;
}
}
};
let changeCallBack = (currentValue) => {
let resultList = [];
if (currentValue) {
let result = callback(currentValue, dynamicPushStyleNode);
if (result instanceof HTMLStyleElement) {
resultList = [result];
} else if (Array.isArray(result)) {
resultList = [
...result.filter(
(item) => item != null && item instanceof HTMLStyleElement
)
];
}
}
for (let index = 0; index < resultStyleList.length; index++) {
let $css = resultStyleList[index];
$css.remove();
resultStyleList.splice(index, 1);
index--;
}
resultStyleList = [...resultList];
};
this.addValueChangeListener(
key,
(__key, oldValue, newValue) => {
let __newValue = newValue;
if (typeof handleValueChangeFn === "function") {
__newValue = handleValueChangeFn(__key, newValue, oldValue);
}
changeCallBack(__newValue);
}
);
let value = __getValue();
if (value) {
changeCallBack(value);
}
},
/**
* 父子菜单联动,自动判断菜单是否启用,然后执行回调,只会执行一次
* @param key 菜单键
* @param childKey 子菜单键
* @param callback 回调
* @param replaceValueFn 用于修改mainValue,返回undefined则不做处理
*/
execInheritMenuOnce(key, childKey, callback, replaceValueFn) {
let that = this;
const handleInheritValue = (key2, childKey2) => {
let mainValue = that.getValue(key2);
let childValue = that.getValue(childKey2);
if (typeof replaceValueFn === "function") {
let changedMainValue = replaceValueFn(mainValue, childValue);
if (changedMainValue !== void 0) {
return changedMainValue;
}
}
return mainValue;
};
this.execMenuOnce(
key,
callback,
() => {
return handleInheritValue(key, childKey);
},
() => {
return handleInheritValue(key, childKey);
}
);
this.execMenuOnce(
childKey,
() => {
},
() => false,
() => {
this.triggerMenuValueChange(key);
return false;
}
);
},
/**
* 根据自定义key只执行一次
* @param key 自定义key
*/
onceExec(key, callback) {
if (typeof key !== "string") {
throw new TypeError("key 必须是字符串");
}
if (this.$data.onceExec.has(key)) {
return;
}
callback();
this.$data.onceExec.set(key, 1);
},
/**
* 获取配置内容
*/
getPanelContentConfig() {
let configList = [PanelUI_allSetting];
return configList;
}
};
Object.assign(
NetDiskUI.src.icon,
// @ts-ignore
typeof RESOURCE_ICON === "undefined" ? {} : RESOURCE_ICON
);
WebsiteRule.init();
NetDiskUserRule.init();
NetDiskRule.init();
PopsPanel.init();
NetDisk.init();
NetDiskShortcut.init();
domUtils.ready(() => {
NetDiskAutoFillAccessCode.init();
NetDiskAuthorization.init();
NetDiskWorker.init();
});
})(Qmsg, DOMUtils, Utils, pops);