模組:Namespace pagename/data
| 此模块已被全保護。僅限管理員編輯。 |
本頁是 Module:Namespace pagename 的資料頁,以 mw.loadData 載入,存放頁面類型的名稱、各命名空間的預設字尾,以及各種判定規則。本頁只有資料,判斷邏輯在 Module:Namespace pagename;命名空間本身的名稱在 Module:Namespace/data。
各項設定的使用時機與先後順序見 Module:Namespace pagename#判定順序。
資料結構
NS
命名空間編號常量,供本頁其他設定以名稱而非數字索引使用。主模組也會讀取,但目前只用到 NS.USER 與 NS.MODULE_TALK。
EVENT(1728)與 EVENT_TALK(1729)雖已定義,但 Module:Namespace/data 未收錄其名稱,因此這兩個命名空間的輸出目前是空字串。
ContentModelMap
內容模型到頁面類型的直接映射,命中後不再檢查重新導向、子頁面與頁面內容。
| 內容模型 | 頁面類型 | 輸出(繁體) |
|---|---|---|
css、sanitized-css |
style |
樣式 |
javascript |
script |
工具 |
json |
json |
數據 |
NamespaceSuffixConfig
DefaultSuffixList
每個命名空間在沒有判斷出頁面類型時附加的字尾。鍵是命名空間編號,值為 false 表示不加字尾;未列出的命名空間同樣不加字尾。
字尾本身由本頁開頭的區域變數 suffixTemplates 定義:
| 名稱 | en | zh-hans | zh-hant | 使用者 |
|---|---|---|---|---|
page |
page |
页 | 頁 | 介面、幫助與各討論命名空間 |
pageWithSpace |
page |
页 | 頁 | 目前未被使用 |
pageName |
page |
页面 | 頁面 | 特殊 |
pageNameWithSpace |
page |
页面 | 頁面 | 專案 |
userPage |
page |
页 | 頁面 | 用戶 |
- 「不加字尾」的命名空間:媒體、條目、檔案、模板、分類、主題、維基專題、草稿、MOS、字幕、模組、結構式討論。
- 英文輸出的特殊處理:
page與pageName的英文值沒有前置空白,因此英文會輸出Talkpage、Helppage、MediaWikipage、Specialpage、User talkpage。要修正請改用帶空白的pageWithSpace/pageNameWithSpace。
EnablePageTypeNamespaces
會進一步檢測頁面類型(內容模型、重新導向、子頁面名稱、頁面內容)的命名空間白名單。不在此列的命名空間一律只輸出「命名空間名稱+預設字尾」。
目前為:用戶(2)、專案(4)、檔案(6)、模板(10)、草稿(118)、模組(828)。
此白名單不影響固定沙盒(SandboxPageNames)與編輯提示(NoticeRules),這兩項在白名單檢查之前就已判斷。
AllowTemplateType
允許判定為文件、沙盒、測試樣例的命名空間。目前為:用戶(2)、模板(10)、模組(828)。
AllowTempType
允許判定為臨時頁的命名空間。目前為:用戶(2)、專案(4)、模板(10)、草稿(118)、模組(828)。
Error
錯誤訊息,%s 會替換成使用者的輸入值。
| 鍵 | 用途 |
|---|---|
pg-error |
第二參數無法解析成合法頁面名稱時輸出。 |
ns-error |
目前未被主模組使用。 |
SandboxPageNames
各命名空間的固定沙盒頁名。鍵是命名空間編號,值是「頁面名稱 → true」的表,比對的是 title.text(不含命名空間前綴的完整頁面名)。
| 命名空間 | 頁面名稱 |
|---|---|
| 專案(4) | 沙盒、重定向沙盒 |
| 用戶討論(3) | Sandbox for user warnings~zhwiki |
| 模板(10) | 沙盒、X1、X2、X3 |
| 分類(14) | 沙盒 |
| 草稿(118) | 沙盒 |
| 檔案(6) | 沙盒.png、沙盒.svg |
此外主模組另有一條硬編碼規則:用戶命名空間下符合 ×××/沙盒(僅一層子頁面)的頁面也視為沙盒。更深層的 ×××/×××/沙盒 則由 SubpageRules 的 sandbox 規則命中。
SubpageRules
依子頁面名稱判定頁面類型。鍵是頁面類型(須在 #Type 中有對應項),值可包含:
| 欄位 | 說明 |
|---|---|
names |
子頁面名稱的清單。比對前會把 title.subpageText 的第一個字轉成小寫,因此 /Doc 會命中而 /DOC 不會。
|
matcher.allowNs |
允許的命名空間清單。 |
matcher.subpageOnly |
是否只匹配子頁面。 |
未設 matcher 的規則只在子頁面上生效,且命名空間須在 AllowTemplateType(temp 則是 AllowTempType)之中。
目前規則:
| 類型 | names | matcher |
|---|---|---|
doc |
doc |
- |
sandbox |
sandbox、沙盒 |
- |
testcases |
testcases、测试样例、測試樣例 |
- |
temp |
temp、temporary |
- |
intro |
intro、introduction、说明、說明 |
模板命名空間,且必須是子頁面 |
NoticeRules
編輯提示類頁面的判定規則。matcher 以命名空間編號為鍵,每項可包含:
| 欄位 | 說明 |
|---|---|
rootText |
根頁面名稱須等於此值。 |
subpageText |
最後一層子頁面名稱須等於此值(區分大小寫)。 |
onlyFirstLevel |
只匹配第一層子頁面(title.rootText == title.baseText)。
|
目前規則:
| 類型 | 命中的頁面 |
|---|---|
editnotice |
Template:Editnotices/×××、User:×××/Editnotice、User talk:×××/Editnotice
|
mailnotice |
User:×××/Emailnotice
|
命中後輸出會直接取代整個結果,不附加命名空間名稱;#Type 中的 %u 會換成指向 title.rootText 的用戶連結。
ContentRules
依頁面內容判定類型,是判定順序中的最後一步。鍵是頁面類型,值是陣列,每項可以是 mw.ustring.match 的 Lua 模式,或接受 (nsid, content) 的函數。
sandbox 不受 AllowTemplateType 限制(只要命名空間在 EnablePageTypeNamespaces 之中即會檢測),doc 與 testcases 則另須命名空間在 AllowTemplateType 之中。
| 類型 | 偵測的標記 |
|---|---|
sandbox |
{{Sandbox…}}、{{Template sandbox notice}},以及簡繁兩種「請在這行文字底下進行您的測試……」提示
|
doc |
{{Documentation subpage}}、{{Template doc inline}}、{{Template doc viewed directly}}
|
testcases |
{{Template testcases notice}}、{{Test cases notice}}、{{测试样例}}、{{測試樣例}}
|
讀取頁面內容會用到 title:getContent(),計入解析器的昂貴函數配額,因此主模組提供 skipCheckContent 參數可略過這一步。
Type
頁面類型的顯示名稱,格式與 Module:Namespace/data 的語言表相同,由 Module:Lan2 依使用者語言回退挑選。分兩類:
接在命名空間名稱後面當字尾,英文值開頭的空白請勿刪除:
| 類型 | en | zh-hans | zh-hant |
|---|---|---|---|
style |
styles |
样式 | 樣式 |
script |
scripts |
脚本 | 工具 |
json |
data |
数据 | 數據(zh-tw:資料)
|
redirect |
redirect |
重定向 | 重新導向 |
doc |
documentation |
文档 | 文件 |
sandbox |
sandbox |
沙盒 | 沙盒 |
testcases |
testcases |
测试样例 | 測試樣例 |
temp |
temporary page |
临时页 | 臨時頁 |
intro |
introductory page |
说明页 | 說明頁 |
直接取代整個輸出,英文值不需要前置空白:
| 類型 | en | zh-hans | zh-hant | 備註 |
|---|---|---|---|---|
external |
Interlanguage link |
跨语言链接 | 跨語言連結 | |
editnotice |
editnotice |
编辑提示 | 編輯提示 | |
mailnotice |
%u's mailnotice |
%u的电邮提示 | %u的電郵提示 | %u 會換成用戶連結
|
shortcut |
Shortcut of %s |
%s快捷方式 | %s捷徑 | 目前未被主模組使用 |
shortcut 之所以未被使用,是因為偽命名空間的顯示已交由 Module:Namespace 依 Module:Namespace/data 的 PseudoNamespace.messages 產生。
編輯指引
- 新增頁面類型時,須同時在
Type加入名稱,並在SubpageRules、ContentRules或NoticeRules加入對應的判定規則;字尾型的類型記得在英文值前面留一個空白。 - 讓既有類型適用於更多命名空間時,改
EnablePageTypeNamespaces、AllowTemplateType或AllowTempType,不要在主模組裡加特例。 - 新增命名空間時,除了本頁的
NS與DefaultSuffixList,還要在 Module:Namespace/data 補上名稱,否則輸出會缺少命名空間名稱。 - 改動後請用 Template:Namespace pagename/testcases 驗證,該頁已涵蓋各命名空間與各頁面類型的組合。
參見
- Module:Namespace pagename-使用本頁資料的主模組
- Module:Namespace/data-命名空間名稱的資料
- Module:Lan2-語言回退
- Template:Namespace pagename、Template:Namespace pagename/testcases-包裝模板與測試樣例
require('strict')
-- 命名空间常量
local NS = {
MEDIA = -2,
SPECIAL = -1,
MAIN = 0,
TALK = 1,
USER = 2,
USER_TALK = 3,
PROJECT = 4, -- Wikipedia
PROJECT_TALK = 5, -- Wikipedia talk
FILE = 6,
FILE_TALK = 7,
MEDIAWIKI = 8,
MEDIAWIKI_TALK = 9,
TEMPLATE = 10,
TEMPLATE_TALK = 11,
HELP = 12,
HELP_TALK = 13,
CATEGORY = 14,
CATEGORY_TALK = 15,
PORTAL = 100,
PORTAL_TALK = 101,
WIKIPROJECT = 102,
WIKIPROJECT_TALK = 103,
DRAFT = 118,
DRAFT_TALK = 119,
MOS = 126,
MOS_TALK = 127,
TIMEDTEXT = 710,
TIMEDTEXT_TALK = 711,
MODULE = 828,
MODULE_TALK = 829,
EVENT = 1728,
EVENT_TALK = 1729,
TOPIC = 2600,
}
-- 各种字尾
-- 英文的字尾與命名空間名稱之間要留一個空白,特殊頁面 (-1) 與討論命名空間(nsid % 2 == 1)除外,
-- 因此非討論命名空間請使用 pageWithSpace / pageNameWithSpace。
local suffixTemplates = {
-- 使用「頁」的字尾
page = { ['en'] = 'page', ['zh-hans'] = '页', ['zh-hant'] = '頁' },
pageWithSpace = { ['en'] = ' page', ['zh-hans'] = '页', ['zh-hant'] = '頁' },
-- 使用「頁面」的字尾
pageName = { ['en'] = 'page', ['zh-hans'] = '页面', ['zh-hant'] = '頁面' },
pageNameWithSpace = { ['en'] = ' page', ['zh-hans'] = '页面', ['zh-hant'] = '頁面' },
-- 使用者頁面特殊處理
userPage = { ['en'] = ' page', ['zh-hans'] = '页', ['zh-hant'] = '頁面' },
}
return {
-- 命名空间常量
NS = NS,
-- 内容模型直接映射到页面类型
ContentModelMap = {
['css'] = 'style',
['sanitized-css'] = 'style',
['javascript'] = 'script',
['json'] = 'json',
},
NamespaceSuffixConfig = {
-- 字尾 頁/頁面 的列表
DefaultSuffixList = {
-- 不要加字尾
[NS.MEDIA] = false,
[NS.MAIN] = false,
[NS.FILE] = false,
[NS.TEMPLATE] = false,
[NS.CATEGORY] = false,
[NS.PORTAL] = false,
[NS.WIKIPROJECT] = false,
[NS.DRAFT] = false,
[NS.MOS] = false,
[NS.TIMEDTEXT] = false,
[NS.MODULE] = false,
[NS.TOPIC] = false,
-- 页面 / 頁面
[NS.SPECIAL] = suffixTemplates.pageName, -- 特殊页面
[NS.PROJECT] = suffixTemplates.pageNameWithSpace, -- 维基百科页面
-- 使用者頁面特殊處理:页 / 頁面
[NS.USER] = suffixTemplates.userPage,
-- 页 / 頁
[NS.MEDIAWIKI] = suffixTemplates.pageWithSpace,
[NS.HELP] = suffixTemplates.pageWithSpace,
[NS.TALK] = suffixTemplates.page,
[NS.USER_TALK] = suffixTemplates.page,
[NS.PROJECT_TALK] = suffixTemplates.page,
[NS.FILE_TALK] = suffixTemplates.page,
[NS.MEDIAWIKI_TALK] = suffixTemplates.page,
[NS.TEMPLATE_TALK] = suffixTemplates.page,
[NS.HELP_TALK] = suffixTemplates.page,
[NS.CATEGORY_TALK] = suffixTemplates.page,
[NS.PORTAL_TALK] = suffixTemplates.page,
[NS.WIKIPROJECT_TALK] = suffixTemplates.page,
[NS.DRAFT_TALK] = suffixTemplates.page,
[NS.MOS_TALK] = suffixTemplates.page,
[NS.TIMEDTEXT_TALK] = suffixTemplates.page,
[NS.MODULE_TALK] = suffixTemplates.page,
},
-- 檢測頁面內容模型(JS/CSS/JSON/重定向)的命名空間
EnablePageTypeNamespaces = {
NS.USER,
NS.PROJECT,
NS.FILE,
NS.TEMPLATE,
NS.DRAFT,
NS.MODULE,
},
-- 檢測文檔、沙盒、測試樣例的命名空間
AllowTemplateType = {
NS.USER,
NS.TEMPLATE,
NS.MODULE,
},
-- 檢測臨時頁面的命名空間
AllowTempType = {
NS.USER,
NS.PROJECT,
NS.TEMPLATE,
NS.DRAFT,
NS.MODULE,
}
},
-- 錯誤
Error = {
['pg-error'] = {
['en'] = 'Invalid page name: %s.',
['zh-hans'] = '页面名称“%s”无效。',
['zh-hant'] = '頁面名稱「%s」無效。'
},
['ns-error'] = {
['en'] = 'Invalid namespace: %s.',
['zh-hans'] = '命名空间“%s”无效。',
['zh-hant'] = '名字空間「%s」無效。'
},
},
-- 沙盒頁面名
SandboxPageNames = {
[NS.PROJECT] = { ['沙盒'] = true, ['重定向沙盒'] = true },
[NS.USER_TALK] = { ['Sandbox for user warnings~zhwiki'] = true },
[NS.TEMPLATE] = { ['沙盒'] = true, ['X1'] = true, ['X2'] = true, ['X3'] = true },
[NS.CATEGORY] = { ['沙盒'] = true },
[NS.DRAFT] = { ['沙盒'] = true },
[NS.FILE] = { ['沙盒.png'] = true, ['沙盒.svg'] = true },
},
-- 子頁面名稱判定規則
SubpageRules = {
doc = {
names = { 'doc' },
},
sandbox = {
names = { 'sandbox', '沙盒' },
},
testcases = {
names = { 'testcases', '测试样例', '測試樣例' },
},
temp = {
names = { 'temp', 'temporary' },
},
intro = {
names = { 'intro', 'introduction', '说明', '說明' },
matcher = { allowNs = { NS.TEMPLATE }, subpageOnly = true },
},
},
-- 编辑提示
NoticeRules = {
editnotice = {
matcher = {
-- Template:Editnotices/xxx
[NS.TEMPLATE] = { rootText = 'Editnotices' },
-- User:xxx/Editnotice 与 User talk:xxx/Editnotice
[NS.USER] = { subpageText = 'Editnotice', onlyFirstLevel = true },
[NS.USER_TALK] = { subpageText = 'Editnotice', onlyFirstLevel = true },
},
},
mailnotice = {
-- User:xxx/Emailnotice
matcher = {
[NS.USER] = { subpageText = 'Emailnotice', onlyFirstLevel = true },
},
},
},
-- 頁面內容判定規則
ContentRules = {
sandbox = {
'%{%{[Ss]andbox',
'%{%{[Tt]emplate[_%s]sandbox[_%s]notice',
'%{%{請注意:請在這行文字底下進行您的測試,請不要刪除或變更這行文字以及這行文字以上的部份。',
'%{%{请注意:请在这行文字底下进行您的测试,请不要删除或变更这行文字以及这行文字以上的部分。',
},
doc = {
'%{%{[Dd]ocumentation[_%s]subpage',
'%{%{[Tt]emplate[_%s]doc[_%s]inline',
'%{%{[Tt]emplate[_%s]doc[_%s]viewed[_%s]directly'
},
testcases = {
'%{%{[Tt]emplate[_%s]testcases[_%s]notice',
'%{%{[Tt]est[_%s]cases[_%s]notice',
'%{%{测试样例',
'%{%{測試樣例'
}
},
-- 頁面類型
Type = {
-- 這裡的頁面類型會連接成後綴 因此en的空白勿刪
style = {
['en'] = ' styles',
['zh-hans'] = '样式',
['zh-hant'] = '樣式'
},
script = {
['en'] = ' scripts',
['zh-hans'] = '脚本',
['zh-hant'] = '工具'
},
json = {
['en'] = ' data',
['zh-hans'] = '数据',
['zh-hant'] = '數據',
['zh-tw'] = '資料'
},
redirect = {
['en'] = ' redirect',
['zh-hans'] = '重定向',
['zh-hant'] = '重新導向'
},
doc = {
['en'] = ' documentation',
['zh-hans'] = '文档',
['zh-hant'] = '文件'
},
sandbox = {
['en'] = ' sandbox',
['zh-hans'] = '沙盒',
['zh-hant'] = '沙盒'
},
testcases = {
['en'] = ' testcases',
['zh-hans'] = '测试样例',
['zh-hant'] = '測試樣例'
},
temp = {
['en'] = ' temporary page',
['zh-hans'] = '临时页',
['zh-hant'] = '臨時頁'
},
intro = {
['en'] = ' introductory page',
['zh-hans'] = '说明页',
['zh-hant'] = '說明頁'
},
-- 這裡的頁面類型會直接替換原本的字串 因此en不需要留空白
external = {
['en'] = 'Interlanguage link',
['zh-hans'] = '跨语言链接',
['zh-hant'] = '跨語言連結'
},
editnotice = {
['en'] = 'editnotice',
['zh-hans'] = '编辑提示',
['zh-hant'] = '編輯提示'
},
-- %u表示用户名,在主模块换成用户链接
mailnotice = {
['en'] = '%u\'s mailnotice',
['zh-hans'] = '%u的电邮提示',
['zh-hant'] = '%u的電郵提示'
},
shortcut = {
['en'] = 'Shortcut of %s',
['zh-hans'] = '%s快捷方式',
['zh-hant'] = '%s捷徑'
},
}
}