LLWiki正在建设中,欢迎加入我们

“LLWiki:管理员技术手册”的版本间差异

跳转到导航 跳转到搜索
添加4,094字节 、​ 2023年3月17日 (五) 13:29
// 使用Wikiplus小工具快速编辑
(使用页面/文本对比查看器快速编辑)
(// 使用Wikiplus小工具快速编辑)
标签移动版网页编辑 移动版编辑
 
(未显示2个用户的13个中间版本)
| skin || 皮肤 || 桌面版为“vector”,手机版为“minerva”,这也是区分桌面版和手机版的主要依据
|-
| wgFormattedNamespaces || 储存了所有空间本地化译名的数组,不过目前除了“模块”都是英文 || 可用
|-
| wgNamespaceIds || 储存了所有可接受的中英文空间名称对应的编号,注意英文名称中的空格都显示为下划线 || 可用
|-
| wgScript || <code>/mediawiki/index.php</code>,在LLWiki也可简化为<code>/zh</code>,主要用于不同MediaWiki站点间的代码通用,非必需且不推荐使用 || 可用
| wgCanonicalSpecialPageName || 标准化的特殊页面名,也可被wgPageName取代,主要用于不同MediaWiki站点间的代码通用,非必需 || 可用,而且多了“History”和"MobileDiff"等可能的取值<ref>[[mw:Extension:MobileFrontend/zh|移动前端的扩展说明]]</ref>
|-
| wgCategories || 当前阅读的历史版本所属的分类,不含空间,下划线显示为空格,且总是包含隐藏分类。繁简规则一般遵从实际分类页面,但似乎偶有例外 || 除非已执行[[mediawiki:gadget-MobileCategories.js|MobileCategories小工具]],否则不仅LLWiki可用。另外桌面版的空值为<code>[]</code>,手机版的空值为<code lang="js">null</code>,注意可能的bug
|-
| wgCurRevisionId || 页面最新的版本编号,不存在时值为0 || 在[[special:历史|历史]]和[[special:移动版差异|{{int:diff}}]]页面不可用
| wgIsProbablyEditable || 是否可能可以编辑 || 在[[special:历史|历史]]和[[special:移动版差异|{{int:diff}}]]页面不可用
|-
| wgNamespaceNumber || 空间编号 || 在[[special:历史|历史]]和[[special:移动版差异|{{int:diff}}]]页面会显示为-1
|-
| wgPageContentModel || 页面内容模型,特殊页面为“wikitext” || 由于[[special:历史|历史]]和[[special:移动版差异|{{int:diff}}]]是特殊页面,会错误地显示为“wikitext”
| '''wgRelevantPageIsProbablyEditable''' || 关联的页面是否可能可以编辑 || 可以用于[[special:历史|历史]]和[[special:移动版差异|{{int:diff}}]]页面,此时效果与桌面版一致
|-
| wgRestrictionEdit || 编辑保护,不存在的页面(含受保护的标题)或特殊页面为<code lang="js">null</code>,存在的内容页面受全保护时为<code lang="js">["sysop"]</code>,受半保护时为<code lang="js">["autoconfirmed"]</code>,未保护为<code>[]</code>;不包含空间保护和级联保护 || 在[[special:历史|历史]]和[[special:移动版差异|{{int:diff}}]]页面不可用,另外未保护的内容页面为<code lang="js">["*"]</code>
|-
| wgRestrictionMove || 移动保护,不存在的页面或特殊页面为<code lang="js">null</code>,存在的内容页面受全保护时为<code lang="js">["sysop"]</code>,受半保护时为<code lang="js">["autoconfirmed"]</code>,未保护为<code>[]</code>;不包含空间保护和级联保护 || 在[[special:历史|历史]]和[[special:移动版差异|{{int:diff}}]]页面不可用
|-
| wgRevisionId || 当前显示的页面版本的编号,不存在时值为0。注意和index.php的oldid参数可能不同 || 由于[[special:移动版差异|{{int:diff}}]]页面不可同时显示历史页面,此时不可用
|-
| wgTitle || 不含空间的页面名称,下划线显示为空格 || 在[[special:历史|历史]]和[[special:移动版差异|{{int:diff}}]]页面不可用
|-
| wgUserEditCount || 当前用户的编辑次数 || 可用
|-
| local.comments || 签名时间替换为本地时区
|-
| mobile.menu || 手机版的左侧主菜单加载完成
|-
| to.bottom || 添加滚动至底部的按钮
|-
| transclusion.preview || 用于预览入页面的编辑区加载完成
|-
| wikiplus.dialog || 打开Wikiplus小工具的对话框
 
====mediawiki.util====
mediawiki.util提供了很多非常方便的方法,可以用于满足形形色色的需要。这个模块会在加载很多其他模块时加载,如mediawiki.api、mediawiki.Title和mediawiki.Uri等
*mw.util.addCSS(),相比mw.loader.addStyleTag()方法,因为返回值是一个StyleSheet对象而更便于后续动态操作。
*mw.util.addPortletLink(),实际上并不如直接使用jQuery自由度更大,但这个方法可能会出现在一些从其他维基导入的小工具里,不推荐使用。
 
====mediawiki.Title====
彻底解决关于页面名称或文件名称的各种烦恼,包括大小写、空格/下划线、空间别名等等。通常用法为先使用<code lang="js">const title = new mw.Title(str);</code>的语法构建一个mw.Title对象。与mw.util的很多方法以及<code lang="js">new mw.Uri()</code>不同,<code lang="js">new mw.Title(str)</code>不会以当前页面作为默认参数。因为未统一大小写、空格/下划线等,请勿直接访问title.title属性,而是根据需要使用下列方法。
 
*title.getExtension(),获取文件名的扩展名。
*title.getName(),获取文件名,不含扩展名,首字母大写,空格替换为下划线。
*title.getNameText(),获取文件名,不含扩展名,首字母大写,下划线替换为空格。
*title.getNamespaceId(),获取空间,能识别一切别名。也可以直接使用title.namespace属性访问。
*title.getNamespacePrefix(),获取标准空间前缀,含<code>:</code>。
*title.toString(),获取完整页面名称,空间使用标准前缀,不含<code>#</code>,空格替换为下划线。
*title.toText(),相比title.toString()方法,下划线替换为空格。
*<code>title.getRelativeText(nsid)</code>,相比title.toText()方法,会空间编号匹配时移除空间前缀。
*title.getSubjectPage(),生成讨论页对应的主页面的mw.Title对象。
*title.getTalkPage(),生成对应的讨论页的mw.Title对象。
 
此外,mediawiki.Title还有一些静态方法用于生成mw.Title对象。
*<code>mw.Title.makeTitle(nsid, title)</code>,给定空间编号和标题生成对象。不存在的空间会报错。仅当空间为0时,会根据标题生成正确的空间。
*<code>mw.Title.newFromFileName(filename)</code>,给定文件名生成对象。
*<code>mw.Title.newFromImg(node)</code>,给定<code lang="html"><img></code>节点或对应的jQuery对象生成mw.Title对象。
*<code>mw.Title.newFromText(title, nsid)</code>,相比mw.Title.makeTitle()方法,错误的空间编号也不会报错,且当标题含空间前缀时总是覆盖第二个空间参数。
 
====mediawiki.storage====
 
====jquery.client====
用於查詢用戶設備和瀏覽器的相關信息,相比直接使用navigator,這個模塊使用起來更加簡便和友好。这个模块会在加载mediawiki.util时加载
*<code lang="js">const profile = $.client.profile();</code>,以對象的形式輸出設備和瀏覽器信息。
*profile.platform,可識別的設備類型:ipad、iphone:iphone、linux、mac、win。
*profile.name,可識別的瀏覽器類型:android、chrome(包括手機chrome、edge、opera等)、chrios(iOS上的chrome,實際使用safari)iphone、edge(舊版edge)、firefox(包括手機firefox)、fxios(iOS上的firefox,實際使用safari)、opera(舊版opera)、safari(包括手機safari)safari等。
*prefileprofile.layout,可識別的引擎類型:edge、gecko、khtmlkonquerorprestoopera、trident、webkit。
 
====jquery.color====
 
====oojs-ui-core====
MediaWiki对于各种用于用户交互的HTML元素,如&lt;button&gt;、&lt;select&gt;、&lt;input&gt;等,不同浏览器往往会默认添加不同的样式。为了统一这些表单元素的外观,MediaWiki的界面UI基本大多基于OOUI设计,oojs-ui-core则包含了OOUI的最基本元素。这些元素往往借助&lt;div&gt;等基本HTML元素和CSS/JavaScript模拟出表单元素的效果。下表列出oojs-ui-core中供直接使用的对象实例:
 
{| class="wikitable"
| MultilineTextInputWidget || 相当于textarea
|-
| NumberInputWidget || 带增减按钮的输入仅限数字的文本框,由min/max/step/required设置代替validate设置
|-
| PanelLayout || 占据整个父容器的layout
|-
| OO.ui.prompt() || 相当于window.prompt(),但返回的是Promise对象
|}
 
====oojs-ui-widgets====
oojs-ui-widgets在oojs-ui-core的基础上补充了一些更复杂的元素。下表列出了oojs-ui-widgets添加供直接使用的对象实例:
{| class="wikitable"
! 对象实例 !! 说明
|-
| BookletLayout || 左侧分页布局
|-
| ButtonMenuSelectWidget || 点击按钮展开下拉选单
|-
| ButtonSelectWidget || 使用按钮的单选框
|-
| IndexLayout || 分页
|-
| MenuLayout || 同时包含了菜单和内容
|-
| MenuTagMultiselectWidget || 使用菜单进行多选
|-
| PopupTagMultiselectWidget || 使用气泡输入的多选
|-
| SelectFileWidget || 选择文件
|-
| StackLayout || 堆叠布局
|-
| TagMultiselectWidget || 使用文本输入生成标签多选,是MenuTagMultiselectWidget和PopupTagMultiselectWidget的基础类型
|-
| ToggleButtonWidget || 使用按钮开关
|-
| ToggleSwitchWidget || 开关
|}
 
===LLWiki添加的全局變量和方法===
;<code lang="js">window.wgULS(hans, [hant])</code>和<code lang="js">window.wgUCS(hans, [hant])</code><ref name="site-lib">需要加載[[mediawiki:gadget-site-lib.js|site-lib.js]]</ref>
:用于处理繁简文字信息,wgULS()用于界面语言,wgUCS()用于内容语言。为方便维护,在大量使用繁简转换的页面,请将所有繁简文字以mw.messages.set()方法的形式至于代码开头,然后在使用时以mw.msg()方法调用即可。
 
;mw.gadgets
:这个对象储存了小部件的执行情况,防止Ajax预览造成小部件重复执行。
 
;mw.settingsDialog<ref>需要加载[[mediawiki:gadget-SettingsDialog.js|SettingsDialog.js]]</ref>
;mw.windowManager
:这个对象是一个SettingsDialog类,用于小工具设置的图形界面。这个类提供了多种方法,包括:获取小工具名称(getName)、获取小工具对象(getObject)、获取小工具标签页(getPanel)、添加小工具(addTab)、生成设置对象(generateOptions)、将设置保存到localStorage(saveOptions)、还原设置(clearOptions)和导出设置(export)。用法复杂,详见[[mediawiki:gadget-SettingsDialog.js|代码页]]。
:这个对象储存了一个公用的OO.ui.WindowManager对象。
 
;<code>mw.pagenamee([title])</code><ref name="site-lib" />
:这个方法用于获取转义后的当前页面名称,默认参数为当前页面。需要mediawiki.util。
 
;<code>mw.addMobileLinks(link)</code><ref name="site-lib" />
:这个方法生成手机版菜单需要的列表构成的数组,可以随后加入DOM中。link为对象或对象数组,每一项包含链接地址href(可选)、FontAwesome图标icon(默认为[https://fontawesome.com/icons/arrow-circle-right 圆圈包裹的一个向右箭头])、文字信息text(需要手动设置繁简转换,优先级低于msg)或mw.messages的键值msg和<code>&lt;li&gt;</code>元素属性attr(可选)。
 
;<code>mw.isModule(name, [flag])</code><ref name="site-lib" />
:这个方法用于检测一个模块是否正在或已经加载。name为模块名或小工具名;flag为真时自动在小工具名name前添加前缀<code lang="js">'ext.gadget.'</code>。
 
;<code>mw.apiFailure(reason, topic)</code><ref name="site-lib" />
 
;<code>mw.timedQuery(api, params, topic)</code><ref name="site-lib" />
:这个方法用于提交一个可自定义的API请求,并记录用时,失败时应用mw.apiFailure()方法生成气泡通知并抛出错误。api为一个mw.Api对象;params即API参数,默认已填入<code lang="js">{action: 'query', formatversion: 2}</code>,可以覆盖;topic为简短文字描述,需要手动设置繁简转换。需要mediawiki.api。
 
;<code>mw.timedParse(api, params, topic)</code><ref name="site-lib" />
:Ajax使用POST而非GET,因此适合预览大段Wikitext。params的默认设置为<code lang="js">{action: 'parse', prop: 'text', title: mw.config.get( 'wgPageName' ), disablelimitreport: 1, disableeditsection: 1, pst: 1, formatversion: 2}</code>,可以覆盖。需要填入page、pageid或oldid参数时请勿使用此方法,应当选用包含<code lang="js">{action: 'parse'}</code>参数的mw.timedQuery()。topic同样需要手动设置繁简转换。需要mediawiki.api。
 
;<code>mw.standardQuery(api)</code><ref name="site-lib" />
:使用mw.timedQuery()方法提交一个API请求以获取当前版本的全文Wikitext并保存至mw.request。需要mediawiki.api。
 
;<code>mw.sectionQuery(api, section, [force])</code><ref name="site-lib" />
:使用mw.timedQuery()方法提交一个API请求以获取段落Wikitext并保存至mw.sections。section为段落编号,默认为序言;为降低错误编辑历史版本的风险,想要获取历史版本的段落Wikitext时,必须手动添加为真的force参数。需要mediawiki.api。
 
;<code>mw.safeEdit(api, curRevid, params, [flag])</code><ref name="site-lib" />
:检查有无编辑冲突后提交编辑。api为mw.Api对象;curRevid为当前最新版本的编号,默认保险起见未赋初始值,但一般填<code lang="js">mw.config.get( 'wgCurRevisionId' )</code>即可;parmas为API参数,默认为<code lang="js">{action: 'edit'}</code>,可以覆盖,但原则上请勿使用这一方法执行其他操作;flag参数对应是否开启自动备份小工具,这会改变检测到编辑冲突时的应对错误通知。检测到编辑冲突抛出错误<code lang="js">'editConflict'</code>,API请求失败抛出错误<code lang="js">'editFailure'</code>或<code lang="js">'revisionQueryFailure'</code>。需要mediawiki.api。
 
;<code>mw.safeRedirect(api, title, target, [summary])</code><ref name="site-lib" />
:检查繁简转换后的页面是否已经存在后创建新重定向。api为mw.Api对象;title为重定向页标题;target为重定向目标页标题,默认为当前页面;summary为可选摘要。页面已存在时抛出<code lang="js">'pageExists'</code>,API请求失败时抛出<code lang="js">'createFailure'</code>或<code lang="js">'queryFailure'</code>。需要mediawiki.api和mediawiki.util
 
;<code>mw.confirm(text, [flags])</code><ref name="site-lib" />
:借助OO.ui.confirm()方法生成一个确认对话框。text为确认提示;flags,可以是字符串或jQuery;flags为确认键的样式数组,可选元素包括<code lang="js">'primary'</code>、<code lang="js">'progressive'</code>和<code lang="js">'destructive'</code>,其中<code lang="js">'primary'</code>不能单独生效。返回值为一个状态为resolve的Promise对象,值为真表示确认。需要oojs-ui-core和oojs-ui-windows。
 
;<code>mw.prompt(text, [flags], [config])</code><ref name="site-lib" />
:借助OO.ui.prompt()方法生成一个prompt对话框。text为文字提示,可以是字符串或jQuery;flags为确认键的样式数组,可选元素包括<code lang="js">'primary'</code>、<code lang="js">'progressive'</code>和<code lang="js">'destructive'</code>,其中<code lang="js">'primary'</code>不能单独生效;config为可选的文本框设置。返回值为一个状态为resolve的Promise对象,值为<code lang="js">null</code>表示取消。需要oojs-ui-windows。
 
;<code>mw.dialog(dialog, actions, $message, [$title])</code><ref name="site-lib" />
:借助OO.ui.MessageDialog对象生成一个更复杂的对话框。dialog为预先准备的OO.ui.MessageDialog对象;actions为OO.ui.ActionWidget对象构成的数组;message;$message为提示信息,相比mw.confirm()方法的进步之处在于可以填入htmlString;title使用jQuery或htmlString;$title为对话框标题。返回值为点击按钮时的Promise对象。需要oojs-ui-core和oojs-ui-windows。
 
;<code>mw.confirmtipsy(text$container, flags[target], [params], [$content])</code><ref name="site-lib" />
:借助OO.ui.PopupWidget对象生成一个手机版也有效的tooltip。$container为外部容器的jQuery对象,target(不能是body);target为目标元素的选择器,params;params为建立OO.ui.PopupWidget对象时的参数,默认为<code lang="js">{padded: true, width: null, classes: ['mw-tipsy']}</code>,可以覆盖;$content为自定义的tooltip内容,默认为title或data-title属性。需要oojs-ui-core。
:借助OO.ui.confirm()方法生成一个确认对话框。text为确认提示;flags为确认键的样式数组,可选元素包括<code lang="js">'primary'</code>、<code lang="js">'progressive'</code>和<code lang="js">'destructive'</code>,其中<code lang="js">'primary'</code>不能单独生效。返回值为一个状态为resolve的Promise对象,值为真表示确认。需要oojs-ui-core和oojs-ui-windows。
 
;<code>mw.dialogmenu(dialogoptions, actions, message[config], [titleunselectable])</code><ref name="site-lib" />
:借助于OO.ui.MenuSelectWidget生成一个浮动菜单。options为选项数组,每一项包含文本text(需要手动设置繁简转换)、FontAwesome图标icon(可选)、数据data(可选)、链接href(可选)和点击事件click(可选);config为菜单设置,默认为<code lang="js">{classes: ['site-menu'], hideWhenOutOfView: false}</code>,可以覆盖;unselectable为真时,菜单不会保留之前最后一次的选择记录。这个UI方法的用法较为复杂,详见[[mediawiki:gadget-site-lib.js#L311|代码页]]。
:借助OO.ui.MessageDialog对象生成一个更复杂的对话框。dialog为预先准备的OO.ui.MessageDialog对象;actions为OO.ui.ActionWidget对象构成的数组;message为提示信息,相比mw.confirm()方法的进步之处在于可以填入htmlString;title为对话框标题。返回值为点击按钮时的Promise对象。需要oojs-ui-core和oojs-ui-windows。
 
;<code>mw.tipsyconvertTimezone($containerthen, target, [params]timezone)</code><ref name="site-lib" />
:改变moment对象的时区。then为待处理的moment对象,默认为现在;timezone为时区的IANA名称或数值表示的UTC偏移量,需要提前检查合法性,默认为本地时区。注意这个方法的返回值不是一个真实存在的时间点,只能用于输出而不能用于进一步运算。需要moment。
:借助OO.ui.PopupWidget对象生成一个手机版也有效的tooltip。$container为外部容器的jQuery对象,target为目标元素的选择器,params为建立OO.ui.PopupWidget对象时的参数,默认为<code lang="js">{padded: true, width: null}</code>,可以覆盖。需要oojs-ui-core。
 
;mw.resizeLyrics()<ref>需要加載[[user:bhsd/widget/lyrics.js|Widget:Lyrics]]</ref>
===JSHint===
CodeEditor使用JSHint标注可能存在的语法问题。LLWiki會在大部分JS页面添加JSHint设置<code lang="js">/* global mw */</code>和<code lang="js">/* jshint jquery: true, bitwise: true, curly: true, latedef: 'nofunc', nonew: true, singleGroups: true, unused: true */</code><ref>[https://jshint.com/docs/options/ 新版JSHint的设置列表],注意可能存在的版本差异。</ref>。但在小部件页面,为了提示小部件JS加载在模块mediawiki和jquery之前,<code lang="js
>/* global mw */</code>和<code lang="js">/* jshint jquery: true */</code>被替换为<code lang="js">/* jshint varstmt: true */</code>。注意JSHint并不会对大多数JS模块不允许使用的ES6语法作出警告(详见[[#ResourceLoader和JS模块]]),因此请勿过度依赖这一功能来除错。另外CodeEditor安装的JSHint版本较老,无法识别ES7以上的语法,因此在代码中使用ES7语法可能会造成除错时的困难。
 
===注意事项===
}
</pre>
这里重点说明一下第二和第四条规则造成的影响。第二条规则使得表格的外层边框、行边框和单元格边框合并,可能造成一系列关于边框的CSS规则出现不符合预期的表现,尤其是<code>&lt;table&gt;</code>的<code>cellspacing</code>属性会无法生效。因此一般建议避免使用<code>cellspacing</code>这一HTML属性,改为使用CSS中的<code>border-spacing</code>。另外,在需要<code>border-spacing</code>或<code>border-radius</code>等样式时,请同时指定<code langclass="csshljs">border-collapse: separate;</code>以使手机版生效。
 
第四条规则的本意是在窄屏上<code>&lt;table&gt;</code>元素不会将页面撑得过宽,但这同时会造成外层的<code>&lt;table&gt;</code>和内层的<code>&lt;tbody&gt;</code>分离。特别是如果外层<code>&lt;table&gt;</code>规定了边框或背景色时,很容易看出样式的错误。为此一般需要主动指定<code langclass="csshljs">display: table;</code>以修复这一问题,LLWiki有很多预定义的表格CSS类也都添加了这一规则<ref name="site-styles">[[mediawiki:gadget-site-styles.css|全站CSS]]</ref>。但这样修改的话又会重新面临过宽的表格将整个页面撑大的问题。LLWiki现定义了<code>table-wrapper</code>类<ref name="site-styles" />,用于套在宽表格外:<code lang="html"><nowiki><div class="table-wrapper"></nowiki></code>,这个外层容器会在窄屏上通过<code langclass="csshljs">overflow-x: auto;</code>限制里面的表格宽度。
====图片====
====皮肤界面====
16,874

个编辑

导航菜单