3,469
个编辑
MCBBS Wiki欢迎您共同参与编辑!在参与编辑之前请先阅读Wiki方针。
如果在编辑的过程中遇到了什么问题,可以去讨论板提问。
为了您能够无阻碍地参与编辑 未验证/绑定过邮箱的用户,请尽快绑定/验证。
MCBBS Wiki GitHub群组已上线!
您可以在回声洞中发表吐槽!
服务器状态监控。点击进入
本站由MCBBS用户自行搭建,与MCBBS及东银河系漫游指南(北京)科技有限公司没有从属关系。点此了解 MCBBS Wiki 不是什么>>
小 (Litwak913移动页面MediaWiki:Vector-ThemeLoader.js至MediaWiki:Gadget-VectorThemeLoader.js) |
(// Edit via Wikiplus) |
||
| 第1行: | 第1行: | ||
"use strict"; | "use strict"; | ||
(() = | |||
var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }(); | |||
(function () { | |||
// src/utils/resource.ts | // src/utils/resource.ts | ||
function addStyleUrl(url, key) { | function addStyleUrl(url, key) { | ||
var style = void 0; | |||
if (key && document.getElementById(key) instanceof HTMLLinkElement) { | if (key && document.getElementById(key) instanceof HTMLLinkElement) { | ||
style = document.getElementById(key); | style = document.getElementById(key); | ||
| 第10行: | 第13行: | ||
style.rel = "stylesheet"; | style.rel = "stylesheet"; | ||
style.type = "text/css"; | style.type = "text/css"; | ||
if (key) | if (key) style.id = key; | ||
} | } | ||
if (style.href === url) | if (style.href === url) return; | ||
style.href = url; | style.href = url; | ||
document.head.appendChild(style); | document.head.appendChild(style); | ||
} | } | ||
function addStyle(css) { | function addStyle(css) { | ||
var style = document.createElement("style"); | |||
style.textContent = css; | style.textContent = css; | ||
document.head.appendChild(style); | document.head.appendChild(style); | ||
} | } | ||
function loadWikiStyle(page, key) { | function loadWikiStyle(page, key) { | ||
addStyleUrl( | addStyleUrl("https://mcbbs.wiki/index.php?title=" + page + "&action=raw&ctype=text/css", key); | ||
} | } | ||
| 第32行: | 第33行: | ||
try { | try { | ||
return JSON.parse(str); | return JSON.parse(str); | ||
} catch (e) { | } catch (e) {} | ||
} | } | ||
return null; | return null; | ||
| 第41行: | 第41行: | ||
} | } | ||
function unsafeRead(key) { | function unsafeRead(key) { | ||
var storage = localStorage.getItem(key); | |||
return parse(storage); | return parse(storage); | ||
} | } | ||
function listen(listener | function listen(listener) { | ||
var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : { passive: true }; | |||
window.addEventListener("storage", listener, options); | window.addEventListener("storage", listener, options); | ||
return () | return function () { | ||
return window.removeEventListener("storage", listener, options); | |||
}; | |||
} | } | ||
function readAndListen(props) { | function readAndListen(props) { | ||
var key = props.key, | |||
defaultValue = props.defaultValue, | |||
listener = props.listener, | |||
_props$callOnChange = props.callOnChange, | |||
callOnChange = _props$callOnChange === undefined ? true : _props$callOnChange, | |||
_props$options = props.options, | |||
options = _props$options === undefined ? { passive: true } : _props$options; | |||
var v = unsafeRead(key); | |||
if (defaultValue !== void 0 && v === null) { | if (defaultValue !== void 0 && v === null) { | ||
write(key, defaultValue); | write(key, defaultValue); | ||
v = defaultValue; | v = defaultValue; | ||
} | } | ||
var fn = function fn(ev) { | |||
if (ev.key !== key || ev.storageArea !== localStorage) | if (ev.key !== key || ev.storageArea !== localStorage) return; | ||
var newValue = parse(ev.newValue); | |||
var oldValue = parse(ev.oldValue); | |||
if (callOnChange && newValue === oldValue) return; | |||
if (callOnChange && newValue === oldValue) | var encapsulatedEvent = { | ||
key: key, | |||
newValue: newValue, | |||
key, | oldValue: oldValue, | ||
newValue, | |||
oldValue, | |||
storageArea: ev.storageArea, | storageArea: ev.storageArea, | ||
url: ev.url | url: ev.url | ||
| 第77行: | 第80行: | ||
listener(encapsulatedEvent); | listener(encapsulatedEvent); | ||
}; | }; | ||
var off = listen(fn, options); | |||
return [v, off]; | return [v, off]; | ||
} | } | ||
| 第83行: | 第86行: | ||
// src/utils/utils.ts | // src/utils/utils.ts | ||
function clickOutside(el, callback) { | function clickOutside(el, callback) { | ||
var cb = function cb(ev) { | |||
var target = ev.target; | |||
if (!(target instanceof Element)) | |||
if (!(target instanceof Element)) return; | |||
if (target === el) | if (target === el) return; | ||
var obj = target.parentElement; | |||
while (obj && obj !== el && obj.parentElement) { | while (obj && obj !== el && obj.parentElement) { | ||
obj = obj.parentElement; | obj = obj.parentElement; | ||
} | } | ||
if (obj !== el) | if (obj !== el) callback(); | ||
}; | }; | ||
window.addEventListener("click", cb, true); | window.addEventListener("click", cb, true); | ||
return () | return function () { | ||
return window.removeEventListener("click", cb); | |||
}; | |||
} | } | ||
// widget/VectorThemeLoader/SwitchPanel.ts | // widget/VectorThemeLoader/SwitchPanel.ts | ||
function createPanel(props | function createPanel(props) { | ||
var className = props.className, | |||
_props$position = props.position, | |||
x = _props$position.x, | |||
y = _props$position.y; | |||
panel.className = | var panel = document.createElement("div"); | ||
panel.className = "salt-panel " + (className || ""); | |||
panel.style.position = "absolute"; | panel.style.position = "absolute"; | ||
for ( | |||
panel.appendChild(el); | for (var _len = arguments.length, innerElements = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { | ||
innerElements[_key - 1] = arguments[_key]; | |||
} | |||
var _iteratorNormalCompletion = true; | |||
var _didIteratorError = false; | |||
var _iteratorError = undefined; | |||
try { | |||
for (var _iterator = innerElements[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { | |||
var el = _step.value; | |||
panel.appendChild(el); | |||
} | |||
} catch (err) { | |||
_didIteratorError = true; | |||
_iteratorError = err; | |||
} finally { | |||
try { | |||
if (!_iteratorNormalCompletion && _iterator.return) { | |||
_iterator.return(); | |||
} | |||
} finally { | |||
if (_didIteratorError) { | |||
throw _iteratorError; | |||
} | |||
} | |||
} | |||
document.body.appendChild(panel); | document.body.appendChild(panel); | ||
var offsetWidth = panel.offsetWidth, | |||
panel.style.left = | offsetHeight = panel.offsetHeight; | ||
panel.style.top = | |||
panel.style.left = Math.max(x - offsetWidth / 2, 0) + "px"; | |||
panel.style.top = y + 2 + "px"; | |||
var cancel = clickOutside(panel, function () { | |||
console.log("awa"); | console.log("awa"); | ||
panel.remove(); | panel.remove(); | ||
| 第124行: | 第158行: | ||
// widget/VectorThemeLoader/widget.t.scss | // widget/VectorThemeLoader/widget.t.scss | ||
var widget_t_default = | var widget_t_default = "\n.salt-panel.style-list {\n padding: 8px 12px;\n border-radius: 4px;\n background-color: var(--lightcolor, #f9f9f9);\n box-shadow: 1px 2px 5px 0 rgba(153, 153, 153, 0.4);\n font-size: 1rem;\n z-index: 9999;\n}\n.salt-panel.style-list, .salt-panel.style-list * {\n box-sizing: border-box;\n}\n.salt-panel.style-list .style-list-item {\n display: block;\n min-width: 196px;\n margin: 4px 0;\n list-style: none;\n overflow: hidden;\n}\n.salt-panel.style-list .style-list-item .theme-list {\n padding: 2px 4px;\n margin: 0;\n overflow: hidden;\n}\n.salt-panel.style-list .style-list-item .theme-list .theme-list-item {\n padding: 4px 8px;\n list-style: none;\n overflow: hidden;\n user-select: none;\n cursor: pointer;\n}\n.salt-panel.style-list .style-list-item .theme-list .theme-list-item:hover {\n background-color: rgba(153, 153, 153, 0.0666666667);\n}\n.salt-panel.style-list .style-list-item .theme-list .theme-list-item:active {\n background-color: rgba(153, 153, 153, 0.2);\n}\n.salt-panel.style-list .style-list-item .theme-list .theme-list-item .theme-list-item-img {\n display: inline-block;\n width: 1rem;\n height: 1rem;\n vertical-align: middle;\n margin-right: 4px;\n}\n.salt-panel.style-list .style-list-item .theme-list .theme-list-item .theme-list-item-name {\n display: inline;\n}"; | ||
.salt-panel.style-list { | |||
} | |||
.salt-panel.style-list, .salt-panel.style-list * { | |||
} | |||
.salt-panel.style-list .style-list-item { | |||
} | |||
.salt-panel.style-list .style-list-item .theme-list { | |||
} | |||
.salt-panel.style-list .style-list-item .theme-list .theme-list-item { | |||
} | |||
.salt-panel.style-list .style-list-item .theme-list .theme-list-item:hover { | |||
} | |||
.salt-panel.style-list .style-list-item .theme-list .theme-list-item:active { | |||
} | |||
.salt-panel.style-list .style-list-item .theme-list .theme-list-item .theme-list-item-img { | |||
} | |||
.salt-panel.style-list .style-list-item .theme-list .theme-list-item .theme-list-item-name { | |||
} | |||
// widget/VectorThemeLoader/widget.ts | // widget/VectorThemeLoader/widget.ts | ||
| 第199行: | 第187行: | ||
var styleKey = isLegacy ? "mcbbs-wiki-skin-vector-legacy-style" : "mcbbs-wiki-skin-vector-style"; | var styleKey = isLegacy ? "mcbbs-wiki-skin-vector-legacy-style" : "mcbbs-wiki-skin-vector-style"; | ||
var themeKey = isLegacy ? "mcbbs-wiki-skin-vector-legacy-theme" : "mcbbs-wiki-skin-vector-theme"; | var themeKey = isLegacy ? "mcbbs-wiki-skin-vector-legacy-theme" : "mcbbs-wiki-skin-vector-theme"; | ||
var loadThemeStyle = (style, theme) | var loadThemeStyle = function loadThemeStyle(style, theme) { | ||
var styleMap = themeMap[style] || themeMap[defaultStyle]; | |||
var currentCommonStyle = styleMap.common; | |||
if (currentCommonStyle) | if (currentCommonStyle) loadWikiStyle(currentCommonStyle, "salt-wiki-style-common"); | ||
var currentTheme = theme === "default" || !styleMap.other[theme] ? styleMap.default : styleMap.other[theme]; | |||
loadWikiStyle(currentTheme.css, "salt-wiki-style-theme"); | loadWikiStyle(currentTheme.css, "salt-wiki-style-theme"); | ||
}; | }; | ||
var initTheme = () | var initTheme = function initTheme() { | ||
var current = { style: defaultStyle, theme: "default" }; | |||
var _readAndListen = readAndListen({ | |||
key: styleKey, | key: styleKey, | ||
defaultValue: defaultStyle, | defaultValue: defaultStyle, | ||
listener: (ev) | listener: function listener(ev) { | ||
if (ev.newValue) { | if (ev.newValue) { | ||
current.style = ev.newValue; | current.style = ev.newValue; | ||
| 第218行: | 第206行: | ||
} | } | ||
} | } | ||
}); | }), | ||
_readAndListen2 = _slicedToArray(_readAndListen, 1), | |||
style = _readAndListen2[0]; | |||
var _readAndListen3 = readAndListen({ | |||
key: themeKey, | key: themeKey, | ||
defaultValue: "default", | defaultValue: "default", | ||
listener: (ev) | listener: function listener(ev) { | ||
if (ev.newValue) { | if (ev.newValue) { | ||
current.theme = ev.newValue; | current.theme = ev.newValue; | ||
| 第228行: | 第219行: | ||
} | } | ||
} | } | ||
}); | }), | ||
_readAndListen4 = _slicedToArray(_readAndListen3, 1), | |||
theme = _readAndListen4[0]; | |||
current.style = style; | current.style = style; | ||
current.theme = theme; | current.theme = theme; | ||
var loadCurrentTheme = function loadCurrentTheme() { | |||
var style2 = current.style, | |||
theme2 = current.theme; | |||
loadThemeStyle(style2, theme2); | loadThemeStyle(style2, theme2); | ||
}; | }; | ||
| 第238行: | 第234行: | ||
}; | }; | ||
initTheme(); | initTheme(); | ||
var handleSwitchBtn = (ev) | var handleSwitchBtn = function handleSwitchBtn(ev) { | ||
var _$$offset = $(btn).offset(), | |||
top = _$$offset.top, | |||
left = _$$offset.left; | |||
console.log(ev); | console.log(ev); | ||
var innerElements = []; | |||
var createThemeSwitch = function createThemeSwitch(style, themeCode, theme) { | |||
var name = theme.name, | |||
imgSrc = theme.img; | |||
var handleClick = function handleClick() { | |||
write(styleKey, style); | write(styleKey, style); | ||
write(themeKey, themeCode); | write(themeKey, themeCode); | ||
loadThemeStyle(style, themeCode); | loadThemeStyle(style, themeCode); | ||
}; | }; | ||
var li2 = document.createElement("li"); | |||
li2.className = "theme-list-item"; | li2.className = "theme-list-item"; | ||
li2.addEventListener("click", handleClick); | li2.addEventListener("click", handleClick); | ||
if (imgSrc) { | if (imgSrc) { | ||
var img = document.createElement("img"); | |||
img.src = imgSrc; | img.src = imgSrc; | ||
img.className = "theme-list-item-img"; | img.className = "theme-list-item-img"; | ||
li2.appendChild(img); | li2.appendChild(img); | ||
} | } | ||
var div = document.createElement("div"); | |||
div.textContent = name; | div.textContent = name; | ||
div.className = "theme-list-item-name"; | div.className = "theme-list-item-name"; | ||
| 第264行: | 第265行: | ||
return li2; | return li2; | ||
}; | }; | ||
for ( | for (var style in themeMap) { | ||
var li2 = document.createElement("li"); | |||
li2.className = "style-list-item"; | li2.className = "style-list-item"; | ||
var title = document.createElement("div"); | |||
title.className = "style-list-item-title"; | title.className = "style-list-item-title"; | ||
title.textContent = themeMap[style].name; | title.textContent = themeMap[style].name; | ||
var ul = document.createElement("ul"); | |||
ul.className = "theme-list"; | ul.className = "theme-list"; | ||
var themeList = []; | |||
var defaultTheme = themeMap[style].default; | |||
themeList.push(createThemeSwitch(style, "default", defaultTheme)); | themeList.push(createThemeSwitch(style, "default", defaultTheme)); | ||
for ( | for (var themeCode in themeMap[style].other) { | ||
themeList.push(createThemeSwitch(style, themeCode, themeMap[style].other[themeCode])); | themeList.push(createThemeSwitch(style, themeCode, themeMap[style].other[themeCode])); | ||
} | } | ||
for ( | var _iteratorNormalCompletion2 = true; | ||
var _didIteratorError2 = false; | |||
var _iteratorError2 = undefined; | |||
try { | |||
for (var _iterator2 = themeList[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) { | |||
var el = _step2.value; | |||
ul.appendChild(el); | |||
} | |||
} catch (err) { | |||
_didIteratorError2 = true; | |||
_iteratorError2 = err; | |||
} finally { | |||
try { | |||
if (!_iteratorNormalCompletion2 && _iterator2.return) { | |||
_iterator2.return(); | |||
} | |||
} finally { | |||
if (_didIteratorError2) { | |||
throw _iteratorError2; | |||
} | |||
} | |||
} | |||
li2.appendChild(title); | li2.appendChild(title); | ||
li2.appendChild(ul); | li2.appendChild(ul); | ||
innerElements.push(li2); | innerElements.push(li2); | ||
} | } | ||
createPanel({ | createPanel.apply(undefined, [{ | ||
className: "style-list", | className: "style-list", | ||
position: { x: left, y: top + btn.offsetHeight } | position: { x: left, y: top + btn.offsetHeight } | ||
} | }].concat(innerElements)); | ||
}; | }; | ||
var headLogoutBtn = document.getElementById("pt-logout"); | var headLogoutBtn = document.getElementById("pt-logout"); | ||
var btn = document.createElement("a"); | var btn = document.createElement("a"); | ||
btn.textContent = " | btn.textContent = "主题"; | ||
btn.title = " | btn.title = "主题"; | ||
btn.onclick = handleSwitchBtn; | btn.onclick = handleSwitchBtn; | ||
var li = document.createElement("li"); | var li = document.createElement("li"); | ||