diff --git a/plugins/categories-header.js b/plugins/categories-header.js
deleted file mode 100644
index 1cec33db..00000000
--- a/plugins/categories-header.js
+++ /dev/null
@@ -1,495 +0,0 @@
-/**
- * 本地网页插件链接 hiker://files/rules/js/categories-header.js
- * 子页面链接 hiker://page/categories-header
- * 道长仓库链接 http://hiker.nokia.press/hikerule/rulelist.json?id=2705
- * 码云 Gitee 链接 https://gitee.com/reborn0/HikerRules/raw/master/plugins/categories-header.js
- */
-/**
- * Object.assign 用法参考链接
- *
- * 1.https://www.daimajiaoliu.com/daima/47139a9e7100407
- * 2.https://segmentfault.com/a/1190000011778875
- * 3.https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object/assign
- */
-// 利用 Symbol 实现私有变量和私有方法,外界不可访问(参考链接2)
-const symbolMap = {
- // checkParams: Symbol('checkParams'),
- mLayout: Symbol('mLayout'),
- true_url: Symbol('true_url'),
- mPage: Symbol('mPage'),
- src: Symbol('src'),
- ruleObjList: Symbol('ruleObjList'),
- mFold: Symbol('mFold'),
- mFoldInnerEnable: Symbol('mFoldInnerEnable'),
- mFoldIndex: Symbol('mFoldIndex'),
- mFoldLayout: Symbol('mFoldLayout'),
- mColor: Symbol('mColor'),
- mTag: Symbol('mTag'),
-}
-
-function CategoriesHeader(color) {
- // 'use strict';
- // ...
- // this[symbolMap.listRule] = []
- // this[symbolMap.subListRule] = []
- this[symbolMap.mColor] = color || "#FA7298";
- this[symbolMap.ruleObjList] = []
- this.VARMAP = {
- CATEGORY: "header.category",
- URL: "header.url",
- FOLD: "header.fold",
- }
- this[symbolMap.mFoldLayout] = {
- injectIndex: 1
- }
- this[symbolMap.mFoldIndex] = 1
-}
-
-Object.assign(CategoriesHeader.prototype, {
- // Override 构造方法,相当于 function.prototype.constructor = (...) => {...},new function() 的时候会自动执行
- constructor: CategoriesHeader,
- // 定义私有方法
- VERSION: 202112011900,
- checkParams() {
- if (!this[symbolMap.mLayout]) {
- throw new Error("请调用 layout(d) 传入当前界面")
- }
- if (!(this[symbolMap.src] || this[symbolMap.true_url])) {
- throw new Error("请调用 trueUrl(url) 传入当前分类的链接或调用 html(mHtml) 传入当前分类页面的源码")
- }
- if (!this[symbolMap.mPage]) {
- throw new Error("请调用 page(mPage) 传入当前页数")
- }
- if (this[symbolMap.ruleObjList].length < 1) {
- throw new Error("请调用相关方法传入定位规则")
- }
- if (!this[symbolMap.mFold]) {
- this[symbolMap.mFold] = '0'
- }
- },
- layout(mLayout) {
- this[symbolMap.mLayout] = mLayout
- return this
- },
- trueUrl(url) {
- this[symbolMap.true_url] = url
- return this
- },
- page(mPage) {
- if (typeof (mPage) === 'string') {
- mPage = parseInt(mPage)
- }
- this[symbolMap.mPage] = mPage
- return this
- },
- html(mSrc) {
- this[symbolMap.src] = mSrc
- return this
- },
- list(rule) {
- if (this[symbolMap.ruleObjList].length > 0) {
- throw new Error("list(rule) add(ruleObj) 只能二选一!")
- }
- this[symbolMap.ruleObjList] = [{}]
- this[symbolMap.ruleObjList][0].listRule = rule
- this[symbolMap.ruleObjList][0]['一级分类'] = rule
- return this
- },
- subList(rule) {
- if (this[symbolMap.ruleObjList].length > 1) {
- throw new Error("subList(rule) add(ruleObj) 只能二选一!")
- }
- if (!this[symbolMap.ruleObjList][0] || (!this[symbolMap.ruleObjList][0].listRule && !this[symbolMap.ruleObjList][0]['一级分类'])) {
- throw new Error("请先调用 list(rule) 或 一级分类(rule) 定位一级分类")
- }
- this[symbolMap.ruleObjList][0].subListRule = rule
- this[symbolMap.ruleObjList][0]['子分类'] = rule
- return this
- },
- title(rule) {
- if (this[symbolMap.ruleObjList].length > 1) {
- throw new Error("title(rule) add(ruleObj) 只能二选一!")
- }
- if (!this[symbolMap.ruleObjList][0] || (!this[symbolMap.ruleObjList][0].listRule && !this[symbolMap.ruleObjList][0]['一级分类'])) {
- throw new Error("请先调用 list(rule) 或 一级分类(rule) 定位一级分类")
- }
- this[symbolMap.ruleObjList][0].titleRule = rule
- this[symbolMap.ruleObjList][0]['分类标题'] = this[symbolMap.ruleObjList][0].titleRule
- return this
- },
- url(rule) {
- if (this[symbolMap.ruleObjList].length > 1) {
- throw new Error("url(rule) add(ruleObj) 只能二选一!")
- }
- if (!this[symbolMap.ruleObjList][0] || (!this[symbolMap.ruleObjList][0].listRule && !this[symbolMap.ruleObjList][0]['一级分类'])) {
- throw new Error("请先调用 list(rule) 或 一级分类(rule) 定位一级分类")
- }
- this[symbolMap.ruleObjList][0].urlRule = rule
- this[symbolMap.ruleObjList][0]['分类链接'] = this[symbolMap.ruleObjList][0].urlRule
- return this
- },
- /**
- * 是否开启折叠功能
- *
- * @param enabled true 表示开启,false 表示禁用
- * @returns {CategoriesHeader}
- */
- foldInner(enabled) {
- if (!(typeof (enabled) === 'boolean')) {
- throw new Error("请传入 true 或 false 表示开启或关闭折叠功能!")
- }
- this[symbolMap.mFoldInnerEnable] = enabled
- return this
- },
- /**
- * 从第 index 行开始折叠
- *
- * @param index 开始折叠的行数
- * @returns {CategoriesHeader}
- */
- foldIndex(index) {
- if (!(typeof (index) === 'number')) {
- throw new Error("开始折叠行请传入数字!")
- }
- if (index < 1) {
- throw new Error("开始折叠行请传入大于 0 的整数!")
- }
- this[symbolMap.mFoldIndex] = index || 1;
- return this
- },
- /**
- * 折叠按钮的界面
- *
- * @param layout 与 d.push 结构一致,
- * 例:{ title:"标题1", url:"xxx", col_type:"scroll_button" };
- * 参数采用可选覆盖模式,不写的参数则使用默认;
- * 比如传入 { col_type:"text_1" },那最终结果就是 { title:"标题1", url:"xxx", col_type:"text_1" }
- * @returns {CategoriesHeader}
- */
- foldLayout(layout) {
- if (typeof layout === 'object') {
- let keys = Object.keys(layout)
- let injectIndex = layout.injectIndex || layout['折叠按钮插入行']
- if (layout.title || layout.url || layout.col_type || injectIndex) {
- for (let i = 0; i < keys.length; i++) {
- const key = keys[i]
- this[symbolMap.mFoldLayout][key] = layout[key];
- }
- } else {
- throw new Error("请传入正确的折叠界面元素!")
- }
- // injectIndex 折叠按钮插入第 injectIndex 行
- if (injectIndex) {
- if (!(typeof (injectIndex) === 'number')) {
- throw new Error("折叠按钮插入行请传入数字!")
- }
- if (injectIndex < 1) {
- throw new Error("折叠按钮插入行请传入大于 0 的整数!")
- }
- if (injectIndex > this[symbolMap.mFoldIndex]) {
- throw new Error("折叠按钮插入行不得大于显示折叠行数!请调用 .foldIndex(index) 或 .第几行开始折叠(index) 传入正确的显示折叠行数")
- }
- this[symbolMap.mFoldLayout].injectIndex = injectIndex || 1;
- }
- } else {
- throw new Error("请传入正确的折叠界面元素!")
- }
- return this;
- },
- // 当前是否折叠
- fold(isFold) {
- if (typeof (isFold) === 'string') {
- isFold = isFold === '1'
- }
- if (isFold) {
- this[symbolMap.mFold] = '1';
- } else {
- this[symbolMap.mFold] = '0';
- }
- return this
- },
- color(mColor) {
- this[symbolMap.mColor] = mColor
- return this
- },
- tag(mTag) {
- this[symbolMap.mTag] = mTag
- return this
- },
- add(ruleObj) {
- // log($.stringify(ruleObj))
- if (ruleObj.constructor === Array) {
- this[symbolMap.ruleObjList] = this[symbolMap.ruleObjList].concat(ruleObj)
- } else {
- this[symbolMap.ruleObjList].push(ruleObj)
- }
- return this;
- },
- evalJSRule(item, jsRule) {
- let rule = jsRule.replace("@js:", "")
- rule = rule.trim()
- // log($.stringify(rule))
- let input = item
- if (rule.startsWith("(")) {
- eval('result = ' + rule)
- } else {
- /**
- * 还原成 $.toString(...) 的最终结果,达到最终处理方式跟上面的 if 一致的目的
- */
- eval('result = ' + '(() => {' + rule + '})()')
- }
- return (result || '')
- },
- getTitle(src, category) {
- let title = ''
- let titleRule = category.titleRule || 'a&&Text'
- if (titleRule.startsWith("@js:")) {
- title = this.evalJSRule(src, titleRule)
- } else {
- title = parseDomForHtml(src, titleRule)
- }
- return title.trim() || "";
- },
- getUrl(src, category) {
- let url = ''
- let urlRule = category.urlRule || 'a&&href'
- if (typeof urlRule === 'object') {
- let mUrlRule = urlRule.rule || urlRule['解析规则'] || 'a&&href';
- if (mUrlRule.startsWith("@js:")) {
- url = this.evalJSRule(src, mUrlRule);
- } else {
- let parse = parseDom;
- if (urlRule.parseOption) {
- switch (urlRule.parseOption) {
- case "parseDom":
- case "pd":
- parse = parseDom;
- break;
- case "parseDomForHtml":
- case "pdfh":
- parse = parseDomForHtml;
- break;
- default:
- parse = parseDom;
- }
- } else if (urlRule["解析方法"]) {
- switch (urlRule["解析方法"]) {
- case "parseDom":
- case "pd":
- parse = parseDom;
- break;
- case "parseDomForHtml":
- case "pdfh":
- parse = parseDomForHtml;
- break;
- default:
- parse = parseDom;
- }
- }
- url = parse(src, mUrlRule);
- }
- if (urlRule.dealUrl) {
- url = urlRule.dealUrl(url)
- } else if (urlRule['二次处理']) {
- url = urlRule['二次处理'](url)
- }
- } else {
- if (urlRule.startsWith("@js:")) {
- url = this.evalJSRule(src, urlRule);
- } else {
- url = parseDom(src, urlRule);
- }
- }
- return url || "";
- },
- build() {
- // 检测是否传入需要的参数
- this.checkParams()
- // 每一个分类的唯一标识
- let mTag = this[symbolMap.mTag] || ""
- //翻页 需要根据实际替换
- const html = this[symbolMap.src] || request(this[symbolMap.true_url])
- const empty = "hiker://empty"
- //获取列表
- const categories = []
- this[symbolMap.ruleObjList].map(ruleObj => {
- let list = []
- let listRule = ruleObj.listRule || ruleObj["一级分类"]
- if (listRule.startsWith("@js:")) {
- // log($.stringify(listRule))
- list = this.evalJSRule(html, listRule)
- } else {
- list = parseDomForArray(html, listRule)
- }
- // log(list)
- list.map(category => {
- categories.push({
- list: category,
- subListRule: ruleObj.subListRule || ruleObj["子分类"],
- titleRule: ruleObj.titleRule || ruleObj["分类标题"],
- urlRule: ruleObj.urlRule || ruleObj["分类链接"],
- });
- })
- })
-
- // log($.stringify(categories))
-
- let init_cate = []
- for (let i = 0; i < 20; i++) {
- init_cate.push("0")
- }
-
- const cate_temp_json = getMyVar(mTag + this.VARMAP.CATEGORY, JSON.stringify(init_cate))
- const cate_temp = JSON.parse(cate_temp_json)
-
- if (this[symbolMap.mPage] === 1) {
-
- categories.forEach((category, index) => {
-
- // 折叠 UI
- if (this[symbolMap.mFoldInnerEnable] && this[symbolMap.mFoldLayout].injectIndex === (index+1)) {
- let foldLayout = {
- title: this[symbolMap.mFoldLayout].title || (this[symbolMap.mFold] === '1' ? '““””∨' : '““””∧'),
- url: this[symbolMap.mFoldLayout].url || $("hiker://empty#noHistory#").lazyRule((params) => {
- putMyVar(params.mTag + params.VARMAP.FOLD, getMyVar(params.mTag + params.VARMAP.FOLD, params.isFold) === '1' ? '0' : '1')
- refreshPage(false);
- return "hiker://empty"
- }, {
- mTag: mTag,
- isFold: this[symbolMap.mFold],
- VARMAP: this.VARMAP
- }),
- col_type: this[symbolMap.mFoldLayout].col_type || "scroll_button",
- }
- this[symbolMap.mLayout].push(foldLayout)
- }
-
- //具体列表下的分类
- let sub_categories = [];
- if (category.subListRule.startsWith("@js:")) {
- sub_categories = this.evalJSRule(category.list, category.subListRule)
- } else {
- sub_categories = parseDomForArray(category.list, category.subListRule);
- }
- if (index < (this[symbolMap.mFoldIndex] || 1)) {
- sub_categories.forEach((item, key) => {
- let title = this.getTitle(item, category)
- let url = this.getUrl(item, category)
-
- this[symbolMap.mLayout].push({
- title: key.toString() === cate_temp[index] ? '““””' + title + ' ' : title,
- url: $(url).lazyRule((params) => {
- let new_cate = []
- if (params.index === 0) {
- params.cate_temp.forEach((cate, index) => {
- new_cate.push(index === 0 ? params.key.toString() : "0")
- });
- } else {
- params.cate_temp[params.index] = params.key.toString()
- }
- putMyVar(params.tag + params.VARMAP.CATEGORY, JSON.stringify(params.index === 0 ? new_cate : params.cate_temp))
- putMyVar(params.tag + params.VARMAP.URL, input)
- refreshPage(true)
- return "hiker://empty"
- }, {
- cate_temp: cate_temp,
- index: index,
- VARMAP: this.VARMAP,
- tag: mTag,
- key: key,
- page: this[symbolMap.mPage],
- }),
- col_type: 'scroll_button',
- })
- })
- this[symbolMap.mLayout].push({
- col_type: "blank_block"
- });
- } else if (this[symbolMap.mFold] === '0') {
- sub_categories.forEach((item, key) => {
- let title = this.getTitle(item, category)
- let url = this.getUrl(item, category)
-
- this[symbolMap.mLayout].push({
- title: key.toString() === cate_temp[index] ? '““””' + title + ' ' : title,
- url: $(url).lazyRule((params) => {
- params.cate_temp[params.index] = params.key.toString()
-
- putMyVar(params.tag + params.VARMAP.CATEGORY, JSON.stringify(params.cate_temp))
- putMyVar(params.tag + params.VARMAP.URL, input)
- refreshPage(true)
- return "hiker://empty"
- }, {
- cate_temp: cate_temp,
- index: index,
- VARMAP: this.VARMAP,
- tag: mTag,
- key: key,
- page: this[symbolMap.mPage],
- }),
- col_type: 'scroll_button',
- })
- })
- this[symbolMap.mLayout].push({
- col_type: "blank_block"
- });
- }
- });
- }
- },
-
- 界面(layout) {
- return this.layout(layout)
- },
- 分类链接(trueUrl) {
- return this.trueUrl(trueUrl);
- },
- 页码(page) {
- return this.page(page);
- },
- 源码(html) {
- return this.html(html);
- },
- 定位一级分类(list) {
- return this.list(list);
- },
- 定位子分类(subList) {
- return this.subList(subList);
- },
- 定位分类标题(title) {
- return this.title(title);
- },
- 定位分类链接(url) {
- return this.url(url);
- },
- 开启内置折叠功能() {
- return this.foldInner(true);
- },
- 关闭内置折叠功能() {
- return this.foldInner(false);
- },
- 第几行开始折叠(index) {
- return this.foldIndex(index);
- },
- 折叠按钮样式(layout) {
- return this.foldLayout(layout)
- },
- 折叠(fold) {
- return this.fold(fold);
- },
- 选中的分类颜色(color) {
- return this.color(color);
- },
- 唯一标识(mTag) {
- return this.tag(mTag)
- },
- 添加分类定位(ruleObj) {
- return this.add(ruleObj);
- },
- 开始打造分类() {
- return this.build();
- },
-
-})
-$.exports = new CategoriesHeader();
-$.exports
\ No newline at end of file