檢視 模組:Hatnote list 的原始碼
←
模組:Hatnote list
跳至導覽
跳至搜尋
由於以下原因,您無權編輯此頁面:
您請求的操作只有這個群組的使用者能使用:
使用者
在編輯此頁之前您必須確認您的電子郵件地址。 請透過
偏好設定
設定並驗證您的電子郵件地址。
您可以檢視並複製此頁面的原始碼。
-------------------------------------------------------------------------------- -- Module:Hatnote list -- -- -- -- This module produces and formats lists for use in hatnotes. In particular, -- -- it implements the for-see list, i.e. lists of "For X, see Y" statements, -- -- as used in {{about}}, {{redirect}}, and their variants. Also introduced -- -- are andList & orList helpers for formatting lists with those conjunctions. -- -------------------------------------------------------------------------------- local mArguments --initialize lazily local mHatnote = require('Module:Hatnote') local libraryUtil = require('libraryUtil') local checkType = libraryUtil.checkType local p = {} -------------------------------------------------------------------------------- -- List stringification helper functions -- -- These functions are used for stringifying lists, usually page lists inside -- the "Y" portion of "For X, see Y" for-see items. -------------------------------------------------------------------------------- --default options table used across the list stringification functions -- 本地化注意 local stringifyListDefaultOptions = { conjunction = "和", separator = "、", altSeparator = ";", space = "", formatted = false, boldfaced = false, quotes = false } -- Stringifies a list generically; probably shouldn't be used directly function stringifyList(list, options) -- Type-checks, defaults, and a shortcut checkType("stringifyList", 1, list, "table") if #list == 0 then return nil end checkType("stringifyList", 2, options, "table", true) options = options or {} for k, v in pairs(stringifyListDefaultOptions) do if options[k] == nil then options[k] = v end end local s = options.space -- Format the list if requested if options.formatted then list = mHatnote.formatPages(unpack(list)) end -- Set the separator; if any item contains it, use the alternate separator local separator = options.separator --searches display text only function searchDisp(t, f) return string.find(string.sub(t, (string.find(t, '|') or 0) + 1), f) end for k, v in pairs(list) do -- 本地化注意 if options.boldfaced then list[k] = '\'\'\'' .. list[k] .. '\'\'\'' end if options.quotes then list[k] = '「' .. list[k] .. '」' end if searchDisp(v, separator) then separator = options.altSeparator break end end -- Set the conjunction, apply Oxford comma, and force a comma if #1 has "§" local conjunction = s .. options.conjunction .. s -- 本地化注意 -- separator .. conjunction的結果是“、和” -- if #list == 2 and searchDisp(list[1], "§") or #list > 2 then -- conjunction = separator .. conjunction -- end -- Return the formatted string return mw.text.listToText(list, separator .. s, conjunction) end --DRY function -- 本地化注意 function conjList (conj, list, fmt, bold, quo) return stringifyList(list, {conjunction = conj, formatted = fmt, boldfaced = bold, quotes=quo}) end -- Stringifies lists with "and" or "or" -- 本地化注意 function p.andList (...) return conjList("和", ...) end function p.orList (...) return conjList("或", ...) end -------------------------------------------------------------------------------- -- For see -- -- Makes a "For X, see [[Y]]." list from raw parameters. Intended for the -- {{about}} and {{redirect}} templates and their variants. -------------------------------------------------------------------------------- --default options table used across the forSee family of functions -- 本地化注意 local forSeeDefaultOptions = { andKeyword = '和', title = mw.title.getCurrentTitle().text, otherText = '其他用法', forSeeForm = '關於%s,請見%s。', } --Collapses duplicate punctuation -- 本地化注意 function punctuationCollapse (text) local replacements = { ["%.%.$"] = ".", ["%?%.$"] = "?", ["%!%.$"] = "!", ["%.%]%]%.$"] = ".]]", ["%?%]%]%.$"] = "?]]", ["%!%]%]%.$"] = "!]]", ["%。%。$"] = "。", ["%?%。$"] = "?", ["%!%。$"] = "!", ["%。%]%]%。$"] = "。]]", ["%?%]%]%。$"] = "?]]", ["%!%]%]%。$"] = "!]]" } for k, v in pairs(replacements) do text = string.gsub(text, k, v) end return text end -- Structures arguments into a table for stringification, & options function p.forSeeArgsToTable (args, from, options) -- Type-checks and defaults checkType("forSeeArgsToTable", 1, args, 'table') checkType("forSeeArgsToTable", 2, from, 'number', true) from = from or 1 checkType("forSeeArgsToTable", 3, options, 'table', true) options = options or {} for k, v in pairs(forSeeDefaultOptions) do if options[k] == nil then options[k] = v end end -- maxArg's gotten manually because getArgs() and table.maxn aren't friends local maxArg = 0 for k, v in pairs(args) do if type(k) == 'number' and k > maxArg then maxArg = k end end -- Structure the data out from the parameter list: -- * forTable is the wrapper table, with forRow rows -- * Rows are tables of a "use" string & a "pages" table of pagename strings -- * Blanks are left empty for defaulting elsewhere, but can terminate list local forTable = {} local i = from local terminated = false -- If there is extra text, and no arguments are given, give nil value -- to not produce default of "For other uses, see foo (disambiguation)" if options.extratext and i > maxArg then return nil end -- Loop to generate rows repeat -- New empty row local forRow = {} -- On blank use, assume list's ended & break at end of this loop forRow.use = args[i] if not args[i] then terminated = true end -- New empty list of pages forRow.pages = {} -- Insert first pages item if present table.insert(forRow.pages, args[i + 1]) -- If the param after next is "and", do inner loop to collect params -- until the "and"'s stop. Blanks are ignored: "1|and||and|3" → {1, 3} while args[i + 2] == options.andKeyword do if args[i + 3] then table.insert(forRow.pages, args[i + 3]) end -- Increment to next "and" i = i + 2 end -- Increment to next use i = i + 2 -- Append the row table.insert(forTable, forRow) until terminated or i > maxArg return forTable end -- Stringifies a table as formatted by forSeeArgsToTable function p.forSeeTableToString (forSeeTable, options) -- Type-checks and defaults checkType("forSeeTableToString", 1, forSeeTable, "table", true) checkType("forSeeTableToString", 2, options, "table", true) options = options or {} for k, v in pairs(forSeeDefaultOptions) do if options[k] == nil then options[k] = v end end -- Stringify each for-see item into a list local strList = {} if forSeeTable then for k, v in pairs(forSeeTable) do local useStr = v.use or options.otherText -- 本地化注意 local pagesStr = p.andList(v.pages, true, true, true) or '「\'\'\'' .. mHatnote._formatLink(mHatnote.disambiguate(options.title)) .. '\'\'\'」' local forSeeStr = string.format(options.forSeeForm, useStr, pagesStr) forSeeStr = punctuationCollapse(forSeeStr) table.insert(strList, forSeeStr) end end if options.extratext then table.insert(strList, punctuationCollapse(options.extratext..'。')) end -- Return the concatenated list return table.concat(strList) end -- Produces a "For X, see [[Y]]" string from arguments. Expects index gaps -- but not blank/whitespace values. Ignores named args and args < "from". function p._forSee (args, from, options) local forSeeTable = p.forSeeArgsToTable(args, from, options) return p.forSeeTableToString(forSeeTable, options) end -- As _forSee, but uses the frame. function p.forSee (frame, from, options) mArguments = require('Module:Arguments') return p._forSee(mArguments.getArgs(frame), from, options) end return p
除錯主控台
* 該模組的匯出資訊可透過變數 "p" 來取得,包含尚未儲存的修改。 * 在行的前面加上 "=" 可將該行作為運算式來評估執行,或使用 print()。表格請使用 mw.logObject()。 * 在模組程式碼中使用 mw.log() 與 mw.logObject() 以傳送訊息至主控台。
此頁面使用了以下模板:
模組:Hatnote list/doc
(
檢視原始碼
)
返回到「
模組:Hatnote list
」。
導覽選單
個人工具
建立帳號
登入
命名空間
模組
討論
English
視圖
更多
閱讀
檢視原始碼
檢視歷史
搜尋
導覽
首頁
隨機頁面
MediaWiki說明
可用模板
使用須知
暗色模式
常用分類
成句
動畫
漫畫
遊戲
角色
聲優
TCG
所有頁面
所有頁面
近期變更
所有變更
Sidebar
工具
連結至此的頁面
相關變更
特殊頁面
頁面資訊
外部連結
Facebook專頁
Camiko