MediaWiki:Gadget-PrintOptions.js
注意:在发布之后,您可能需要清除浏览器缓存才能看到所作出的变更的影响。
- Firefox或Safari:按住Shift的同时单击刷新,或按Ctrl-F5或Ctrl-R(Mac为⌘-R)
- Google Chrome:按Ctrl-Shift-R(Mac为⌘-Shift-R)
- Internet Explorer或Edge:按住Ctrl的同时单击刷新,或按Ctrl-F5
- Opera:按 Ctrl-F5。
/**
* SPDX-License-Identifier: CC-BY-SA-4.0
* _addText: '{{Gadget Header|license=CC-BY-SA-4.0}}'
*
* @base {@link https://en.wikipedia.org/wiki/MediaWiki:Gadget-PrintOptions.js}
* @source {@link https://git.qiuwen.net.cn/InterfaceAdmin/QiuwenGadgets/src/branch/master/src/PrintOptions}
* @author Derk-Jan Hartman, English Wikipedia Contributors and Qiuwen Baike Contributors.
*/
/**
* Print options is a Gadget writen by Derk-Jan Hartman
*
* Licensed MIT and/or CC-BY-SA-4.0
*
* Copyright (c) 2010-2017 Derk-Jan Hartman
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
* @license CC-BY-SA-4.0 {@link https://www.qiuwenbaike.cn/wiki/H:CC-BY-SA-4.0}
*/
/**
* +------------------------------------------------------------+
* | === WARNING: GLOBAL GADGET FILE === |
* +------------------------------------------------------------+
* | All changes should be made in the repository, |
* | otherwise they will be lost. |
* +------------------------------------------------------------+
* | Changes to this page may affect many users. |
* | Please discuss changes by opening an issue before editing. |
* +------------------------------------------------------------+
*/
/* <nowiki> */
(() => {
"use strict";
// dist/PrintOptions/PrintOptions.js
function _createForOfIteratorHelper(r, e) {
var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"];
if (!t) {
if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && "number" == typeof r.length) {
t && (r = t);
var n = 0, F = function() {
};
return { s: F, n: function() {
return n >= r.length ? { done: true } : { done: false, value: r[n++] };
}, e: function(r2) {
throw r2;
}, f: F };
}
throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
}
var o, a = true, u = false;
return { s: function() {
t = t.call(r);
}, n: function() {
var r2 = t.next();
return a = r2.done, r2;
}, e: function(r2) {
u = true, o = r2;
}, f: function() {
try {
a || null == t.return || t.return();
} finally {
if (u) throw o;
}
} };
}
function _unsupportedIterableToArray(r, a) {
if (r) {
if ("string" == typeof r) return _arrayLikeToArray(r, a);
var t = {}.toString.call(r).slice(8, -1);
return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0;
}
}
function _arrayLikeToArray(r, a) {
(null == a || a > r.length) && (a = r.length);
for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e];
return n;
}
//! src/PrintOptions/PrintOptions.ts
var import_ext_gadget2 = require("ext.gadget.Util");
//! src/PrintOptions/modules/i18n.ts
var import_ext_gadget = require("ext.gadget.i18n");
var getI18nMessages = () => {
return {
Print: (0, import_ext_gadget.localize)({
en: "Print",
ja: "印刷",
"zh-hans": "打印",
"zh-hant": "列印"
}),
"Print this page": (0, import_ext_gadget.localize)({
en: "Print this page",
ja: "このページを印刷に",
"zh-hans": "打印此页面",
"zh-hant": "列印此頁面"
}),
Cancel: (0, import_ext_gadget.localize)({
en: "Cancel",
ja: "キャンセル",
zh: "取消"
})
};
};
var i18nMessages = getI18nMessages();
var getMessage = (key) => {
return i18nMessages[key] || key;
};
//! src/PrintOptions/PrintOptions.ts
var getPrintOptions = ($body) => {
let windowManager;
let printDialog;
const printOptions = {
enhanced: true,
noimages: false,
norefs: false,
notoc: false,
nobackground: false,
blacktext: true,
install: () => {
var _$printLink$off$get;
const $printLink = $body.find("#t-print a");
if (!$printLink.length) {
return;
}
(_$printLink$off$get = $printLink.off("click").get(0)) === null || _$printLink$off$get === void 0 || _$printLink$off$get.addEventListener(
"click",
(event) => {
event.stopPropagation();
event.preventDefault();
printOptions.createWindow();
},
// Use capturing phase, to beat the other click listener
true
);
},
createWindow: () => {
class PrintDialog extends OO.ui.ProcessDialog {
panel;
content;
$body;
questions = [{
label: "隐藏界面元素",
type: "checkbox",
checked: true,
returnvalue: "enhanced"
}, {
label: "隐藏图片",
type: "checkbox",
checked: false,
returnvalue: "noimages"
}, {
label: "隐藏参考文献",
type: "checkbox",
checked: false,
returnvalue: "norefs"
}, {
label: "隐藏目录",
type: "checkbox",
checked: false,
returnvalue: "notoc"
}, {
label: "移除背景(您的浏览器或可以覆盖本设置)",
type: "checkbox",
checked: false,
returnvalue: "nobackground"
}, {
label: "强制将所有文字设置为黑色",
type: "checkbox",
checked: true,
returnvalue: "blacktext"
}];
initialize() {
let checkboxInputWidget;
const fieldLayouts = [];
super.initialize();
this.panel = new OO.ui.PanelLayout({
expanded: false,
padded: true
});
this.content = new OO.ui.FieldsetLayout();
var _iterator = _createForOfIteratorHelper(this.questions), _step;
try {
for (_iterator.s(); !(_step = _iterator.n()).done; ) {
const question = _step.value;
const {
checked,
label,
type
} = question;
if (type !== "checkbox") {
continue;
}
checkboxInputWidget = new OO.ui.CheckboxInputWidget({
selected: checked
});
question.widget = checkboxInputWidget;
fieldLayouts[fieldLayouts.length] = new OO.ui.FieldLayout(checkboxInputWidget, {
label,
align: "inline"
});
}
} catch (err) {
_iterator.e(err);
} finally {
_iterator.f();
}
this.content.addItems(fieldLayouts);
this.panel.$element.append(this.content.$element);
this.panel.$element.appendTo(this.$body);
return this;
}
getActionProcess(action) {
const self = this;
if (action === "print") {
return new OO.ui.Process(() => {
var _iterator2 = _createForOfIteratorHelper(this.questions), _step2;
try {
for (_iterator2.s(); !(_step2 = _iterator2.n()).done; ) {
const question = _step2.value;
if (question.type === "checkbox" && question.widget) {
Object.defineProperty(printOptions, question.returnvalue, {
value: question.widget.isSelected(),
writable: true
});
}
}
} catch (err) {
_iterator2.e(err);
} finally {
_iterator2.f();
}
void self.close({
action
}).closed.then(() => {
printOptions.changePrintCSS();
printOptions.otherEnhancements();
window.print();
});
});
}
return super.getActionProcess(action);
}
}
PrintDialog.static = {
...OO.ui.ProcessDialog.static
};
PrintDialog.static.name = "PrintDialog";
PrintDialog.static.title = getMessage("Print this page");
PrintDialog.static.actions = [{
action: "print",
label: getMessage("Print"),
flags: ["primary", "progressive"]
}, {
label: getMessage("Cancel"),
flags: ["safe", "close"]
}];
if (!windowManager) {
windowManager = new OO.ui.WindowManager();
$body.append(windowManager.$element);
}
if (!printDialog) {
printDialog = new PrintDialog({
size: "medium"
});
windowManager.addWindows([printDialog]);
}
void windowManager.openWindow(printDialog);
},
changePrintCSS() {
if (this.enhanced === false) {
var _iterator3 = _createForOfIteratorHelper(document.styleSheets), _step3;
try {
for (_iterator3.s(); !(_step3 = _iterator3.n()).done; ) {
const stylesheet = _step3.value;
const {
media
} = stylesheet;
if (!media) {
continue;
}
if (media.mediaText && media.mediaText.includes("print")) {
if (!media.mediaText.includes("screen")) {
stylesheet.disabled = true;
}
} else if (media.mediaText && media.mediaText.includes("screen") && !media.mediaText.includes("print")) {
try {
media.appendMedium("print");
} catch {
media.mediaText += ",print";
}
}
let rules;
try {
rules = stylesheet.cssRules || stylesheet.rules;
} catch {
mw.log.warn("Not possible to correct stylesheet due to cross origin restrictions.");
continue;
}
if (!rules) {
continue;
}
for (let j = 0; j < rules.length; j++) {
const rule = rules[j];
let hasPrint = false;
let hasScreen = false;
if (!rule) {
continue;
}
if (rule.type === CSSRule.MEDIA_RULE && rule.media) {
var _iterator4 = _createForOfIteratorHelper(rule.media), _step4;
try {
for (_iterator4.s(); !(_step4 = _iterator4.n()).done; ) {
const ruleMedia = _step4.value;
if (ruleMedia === "print") {
hasPrint = true;
} else if (ruleMedia === "screen") {
hasScreen = true;
}
}
} catch (err) {
_iterator4.e(err);
} finally {
_iterator4.f();
}
} else {
continue;
}
if (hasPrint && !hasScreen) {
stylesheet.deleteRule(j);
j--;
} else if (rule && hasScreen && !hasPrint) {
try {
rule.media.appendMedium("print");
} catch {
rule.media.mediaText += ",print";
}
}
}
}
} catch (err) {
_iterator3.e(err);
} finally {
_iterator3.f();
}
}
let printStyle = "";
if (this.noimages) {
printStyle += "img,.thumb{display:none}";
}
if (this.norefs) {
printStyle += '.mw-headline[id="References"],ol.references,.reference{display:none}';
}
if (this.notoc) {
printStyle += "#toc,.toc{display:none}";
}
if (this.nobackground) {
printStyle += "*{background:none !important}";
}
if (this.blacktext) {
printStyle += "*{color:#000 !important}";
}
if (printStyle) {
var _document$querySelect;
(_document$querySelect = document.querySelector("#printStyle")) === null || _document$querySelect === void 0 || _document$querySelect.remove();
const styleTag = document.createElement("style");
styleTag.id = "printStyle";
styleTag.media = "print";
styleTag.append(document.createTextNode(printStyle));
document.head.append(styleTag);
}
},
/* Rewrite the "retrieved from" url to be readable */
otherEnhancements: () => {
const link = $body.find("div.printfooter a");
link.text(decodeURI(link.text()));
}
};
return printOptions;
};
void (0, import_ext_gadget2.getBody)().then(function printOptionsLoad($body) {
if (mw.config.get("wgNamespaceNumber") < 0) {
return;
}
const printOptions = getPrintOptions($body);
setTimeout(printOptions.install, 0);
});
})();