LLWiki正在建设中,欢迎加入我们!
MediaWiki:Gadget-site-lib.js
跳转到导航
跳转到搜索
注意:在保存之后,您可能需要清除浏览器缓存才能看到所作出的变更的影响。
- Firefox或Safari:按住Shift的同时单击刷新,或按Ctrl-F5或Ctrl-R(Mac为⌘-R)
- Google Chrome:按Ctrl-Shift-R(Mac为⌘-Shift-R)
- Internet Explorer:按住Ctrl的同时单击刷新,或按Ctrl-F5
- Opera:前往菜单 → 设置(Mac为Opera → Preferences),然后隐私和安全 → 清除浏览数据 → 缓存的图片和文件。
//<nowiki> // 由ResourceLoader直接调用,不可使用ES6语法 /** * @Description: LLWiki定义的常用函数,桌面版、手机版均可用,部分函数可能需要额外的JS库 * @Author: 无特殊说明时均为[[User:Bhsd]] */ "use strict"; /*global OO, wgULS*/ const pagename = mw.config.get( 'wgPageName'), revid = mw.config.get( 'wgRevisionId' ), wgUL = mw.config.get( 'wgUserLanguage' ), // 界面语言 wgUC = mw.config.get( 'wgUserVariant' ); // 内容语言 /** * @Function: 根据界面语言或内容语言手动繁简转换 * @Source: [[moegirl:mediawiki:gadget-site-lib.js]] * @Parameter {string} 简体文字内容hans * @Parameter {string} 繁体文字内容hant(可选) * @Return {string} 转换后的文字 */ function wgUXS(wg, hans, hant) { return ['zh-hant', 'zh-tw', 'zh-hk', 'zh-mo'].includes(wg) ? hant || hans : hans; } window.wgULS = function(hans, hant) { return wgUXS(wgUL, hans, hant); }; window.wgUCS = function(hans, hant) { return wgUXS(wgUC == 'zh' ? wgUL : wgUC, hans, hant); }; mw.messages.set( wgULS({ 'gadget-lib-fail': '无法获得$1!错误信息:$2', 'gadget-lib-force': '获取历史版本的段落Wikitext必需force参数!', 'gadget-lib-wikitext': '页面Wikitext' }, { 'gadget-lib-fail': '無法獲得$1!錯誤信息:$2', 'gadget-lib-force': '獲取歷史版本的段落Wikitext必需force參數!', 'gadget-lib-wikitext': '頁面Wikitext' }) ); /** * @Function: 当前页面标题转义 * @Dependencies: mediawiki.util * @Return {string} 转义后的标题 */ mw.pagenamee = function() { return mw.util.wikiUrlencode( pagename ); }; /** * @Function: 添加手机版菜单项 * @Parameter {array} 形如{icon, text, href}或{icon, msg, href}的对象数组 * @Parameter {string} FontAwesome图标名称icon * @Parameter {string} 文字text(需手动繁简转换) * @Parameter {string} mw.messages的键值msg * @Parameter {string} 目标地址href * @Return {array} 一组<li>元素 */ mw.addMobileLink = function(links) { return links.map(function(ele) { return $('<a>', {href: ele.href, html: [ $('<i>', {class: "fa fa-" + (ele.icon || 'arrow-circle-right')}), $('<span>', {text: ele.text || mw.msg( ele.msg )}) ]}).wrap( '<li>' ).parent(); }); }; /** * @Function: API请求失败时通知错误信息 * @Parameter {string} API返回的错误信息reason * @Parameter {string} API请求的内容topic(需手动繁简转换) */ mw.apiFailure = function(reason, topic) { mw.notify(mw.msg( 'gadget-lib-fail', topic, reason), {type: 'error', autoHideSeconds: 'long', tag: 'apiFailure'} ); // 防止通知刷屏 }; /** * @Function: 提交一个API查询请求并计时,以方便评估表现 * @Dependencies: mediawiki.api * @Parameter {object} mw.Api对象api * @Parameter {object} API参数对象params * @Parameter {string} API请求内容topic(需手动繁简转换) * @Return {object} Promise对象,且在请求成功时记录用时,失败时通知错误信息 */ mw.timedQuery = function(api, params, topic) { console.log('API request: 查询' + topic); const now = mw.now(); return api.get( $.extend({action: 'query', formatversion: 2}, params) ).then(function(data) { console.log('End API request: 已获得' + topic + ',用时 ' + (mw.now() - now) + ' ms'); return data; }, function(reason) { mw.apiFailure(reason, topic); throw reason; }); }; /** * @Function: 類似mw.timedQuery,但改用POST,適合用於預覽 * @Dependencies: mediawiki.api * @Parameter {object} mw.Api对象api * @Parameter {object} API参数对象params * @Parameter {string} API请求内容topic(需手动繁简转换) * @Return {object} Promise对象,且在请求成功时记录用时,失败时通知错误信息 */ mw.timedParse = function(api, params, topic) { console.log('API request: 解析' + topic); const now = mw.now(); return api.post( $.extend({action: 'parse', prop: 'text', disablelimitreport: 1, disableeditsection: 1, title: pagename, pst: 1, formatversion: 2}, params) ).then(function(data) { console.log('End API request: 已获得' + topic + ',用时 ' + (mw.now() - now) + ' ms'); return data; }, function(reason) { mw.apiFailure(reason, topic); throw reason; }); }; /** * @Function: 提交一个标准API请求以获得当前版本的Wikitext,这是在多个小工具中广泛使用的请求 * @Dependencies: mediawiki.api * @Parameter {object} mw.Api对象api * @Return {object} Promise对象,且在请求成功时记录用时,失败时通知错误信息 */ mw.standardQuery = function(api) { mw.request = mw.request || mw.timedQuery(api, {revids: revid, prop: 'revisions', rvprop: 'content'}, mw.msg('gadget-lib-wikitext')); return mw.request; }; /** * @Function: 提交一个标准API请求以获得当前版本的段落Wikitext,一般不可用于历史版本 * @Dependencies: mediawiki.api * @Parameter {object} mw.Api对象api * @Parameter {number} 段落编号section * @Parameter {boolean} 强制历史版本force(可选) * @Return {object} Promise对象,且在请求成功时记录用时,失败时通知错误信息 */ mw.sectionQuery = function(api, section, force) { if (!force && revid < mw.config.get('wgCurRevisionId')) { mw.notify( mw.msg('gadget-lib-force'), {type: 'warn', autoHideSeconds: 'long', tag: 'historySection'}); return Promise.reject( 'historySection' ); } mw.sections = mw.sections || []; mw.sections[section] = mw.sections[section] || mw.timedQuery(api, {action: 'parse', oldid: revid, prop: 'wikitext|sections', section: section}, '段落Wikitext'); return mw.sections[section]; }; /** * @Function: 检查编辑冲突后提交编辑 * @Dependencies: mediawiki.api * @Parameters: mw.Api对象api、最新修订编号curRevid、API参数对象params、是否启用自动备份flag(可选) * @Return: Promise对象,API请求失败时抛出revisionQueryFailure或editFailure,编辑冲突时抛出editConflict */ mw.safeEdit = function(api, curRevid, params, flag) { return mw.timedQuery(api, {prop: 'info', titles: params.title, pageids: params.pageid}, wgULS('最新修订', '最新修訂')).then(function(data) { // 未创建的页面lastrevid返回undefined,因此下式同样为false if (data.query.pages[0].lastrevid > curRevid) { mw.notify( flag ? wgULS('编辑冲突!编辑内容已自动备份,请刷新页面后加载备份并重试。', '編輯衝突!編輯內容已自動備份,請刷新頁面後加載備份並重試。') : wgULS('编辑冲突!请备份您的编辑内容后刷新页面重试。', '編輯衝突!請備份您的編輯內容後刷新頁面重試。'), {type: 'error', autoHideSeconds: 'long', tag: 'editConflict'} ); throw 'editConflict'; } console.log('API request: 开始提交编辑'); const now = mw.now(); return api.postWithEditToken( $.extend({action: 'edit'}, params) ).then(function() { console.log('End API request: 编辑成功!用时 ' + (mw.now() - now) + ' ms'); }, function(reason) { mw.notify( wgULS('编辑失败!错误信息:', '編輯失敗!錯誤信息:') + reason, {type: 'error', autoHideSeconds: 'long', tag: 'apiFailure'} ); throw 'editFailure'; }); }, function() { throw 'revisionQueryFailure'; }); // mw.timedQuery已通知错误信息 }; /** * @Function: 检查页面是否存在后新建重定向 * @Dependencies: mediawiki.api, mediawiki.util * @Parameters: mw.Api对象api、重定向页标题title、重定向目标target、编辑摘要summary(可选) * @Return: Promise对象,API请求失败时抛出queryFailure或createFailure,页面已存在时抛出pageExists */ mw.safeRedirect = function(api, title, target, summary) { return mw.timedQuery(api, {titles: title, converttitles: 1}, wgULS('页面是否存在', '頁面是否存在')).then(function(x) { const converted = x.query.pages[0], ctitle = converted.title; if (!converted.missing) { const pageExists = [ wgULS('页面', '頁面'), // 这个href会出现在地址栏,因此手动填入短地址'/zh'而非使用mw.util.getUrl $('<a>', {text: ctitle, href: '/zh?redirect=no&title=' + mw.pagenamee( ctitle )}), '已存在!' ]; mw.notify(pageExists, {type: 'error', autoHideSeconds: 'long'}); throw 'pageExists'; } console.log('API request: 开始新建重定向'); const now = mw.now(); api.create(title, summary ? {summary: summary} : {}, '#重定向 [[' + target + ']]').then(function() { console.log('End API request: 成功新建重定向,用时 ' + (mw.now() - now) + ' ms'); mw.notify( wgULS('创建成功!', '創建成功!'), {type: 'success'} ); }, function(reason) { mw.notify( wgULS('创建失败!错误原因:', '創建失敗!錯誤原因:') + reason, {type: 'error', autoHideSeconds: 'long', tag: 'apiFailure'} ); throw 'createFailure'; }); }, function() { throw 'queryFailure'; }); // mw.timedQuery已通知错误信息 }; /** * @Function: 生成标准化的确认对话框 * @Dependencies: oojs-ui-core, oojs-ui-windows * @Parameters: 文字提示text、确认按钮样式flags * @Return: Promise对象 */ mw.confirm = function(text, flags) { return OO.ui.confirm(text, {actions: [{label: "否"}, {label: "是", flags: flags, action: 'accept'}]}); }; /** * @Function: 生成标准化的对话框 * @Dependencies: oojs-ui-core, oojs-ui-windows * @Parameters: OO.ui.MessageDialog对象dialog、按钮actions、文字message、标题title(可选) * @Return: Promise对象 */ mw.dialog = function(dialog, actions, message, title) { if (!mw.windowManager) { mw.windowManager = new OO.ui.WindowManager(); mw.windowManager.$element.appendTo( 'body' ); } if (!dialog.getManager()) { mw.windowManager.addWindows( [dialog] ); } dialog.message.$label.html( message ); // undefined不更新message dialog.title.$label.html( title ); // undefined不更新title return dialog.open({actions: actions}).opening.then(function() { // 使href生效 actions.forEach(function(ele) { ele.$button.off( 'click' ).click(function() { dialog.close(); }); }); }); }; /** * @Function: 生成兼容手机版的tooltip * @Dependencies: oojs-ui-core * @Parameters: 容器$container、目标选择器target、参数params(可选) */ mw.tipsy = function($container, target, params) { const $label = $('<span>'), // 这里不用PopupWidget自带的autoClose功能,因为效果很奇怪 popup = new OO.ui.PopupWidget( $.extend({$content: $label, padded: true, width: null}, params) ); popup.$element.appendTo( 'body' ); $container.on('mouseenter focus', target, function() { const $this = $(this); var title = this.title; // 不能寫成$this.data('title', title) if (title) { $this.attr('data-title', title).removeAttr( 'title' ); } else { title = $this.data('title'); } if (!title) { return; } // 不能写成this.tabIndex = -1 if (this.tabIndex === undefined) { $this.attr('tabindex', -1); } $label.text(title); popup.toggle( true ).setFloatableContainer( $this ); }).on('mouseleave blur', target, function() { popup.toggle( false ); }); }; //</nowiki> // [[category:作为模块的小工具]] [[category:系统工具]] [[category:不可关闭的小工具]] [[category:桌面版小工具]] [[category:手机版小工具]] // {{DEFAULTSORT:site-lib.js}}