ᥝᥤᥱ ᥑᥤᥱ ᥚᥤᥱ ᥖᥤᥱ ᥕᥣᥱ
tddwiki
https://tdd.wikipedia.org/wiki/%E1%A5%9E%E1%A5%A8%E1%A5%9D%E1%A5%B4_%E1%A5%98%E1%A5%A3%E1%A5%B2_%E1%A5%96%E1%A5%A5%E1%A5%B0
MediaWiki 1.47.0-wmf.18
first-letter
ᥛᥤᥱ ᥖᥤᥱ ᥕᥣᥱ
ᥑᥪᥐ ᥖᥩᥢᥰ
ᥟᥧᥙᥱ ᥐᥧᥛ
ᥚᥧᥱ ᥕᥧᥒᥱ ᥖᥪᥰ
ᥟᥧᥙᥱ ᥐᥧᥛ ᥚᥧᥱ ᥕᥧᥒᥱ ᥖᥪᥰ
ᥝᥤᥱ ᥑᥤᥱ ᥚᥤᥱ ᥖᥤᥱ ᥕᥣᥱ
ᥟᥧᥙᥱ ᥐᥧᥛ ᥝᥤᥱ ᥑᥤᥱ ᥚᥤᥱ ᥖᥤᥱ ᥕᥣᥱ
ᥜᥣᥭᥱ
ᥟᥧᥙᥱ ᥐᥧᥛ ᥜᥣᥭᥱ
ᥛᥤᥱ ᥖᥤᥱ ᥕᥣᥱ ᥝᥤᥱ ᥑᥤᥱ
ᥟᥧᥙᥱ ᥐᥧᥛ ᥛᥤᥱ ᥖᥤᥱ ᥕᥣᥱ ᥝᥤᥱ ᥑᥤᥱ
ᥗᥦᥛᥰ ᥙᥣ ᥘᥥᥐᥳ
ᥟᥧᥙᥱ ᥐᥧᥛ ᥗᥦᥛᥰ ᥙᥣ ᥘᥥᥐᥳ
ᥘᥩᥒ ᥓᥩᥭ ᥗᥦᥛ
ᥟᥧᥙᥱ ᥐᥧᥛ ᥘᥩᥒ ᥓᥩᥭ ᥗᥦᥛᥴ
ᥙᥫᥒ ᥗᥣᥢ
ᥟᥧᥙᥱ ᥐᥧᥛ ᥙᥫᥒ ᥗᥣᥢ
TimedText
TimedText talk
ᥛᥨᥝᥱ ᥓᥧᥰ
ᥟᥧᥙᥱ ᥐᥧᥛᥴ ᥛᥩᥱ ᥓᥧᥰ
Event
Event talk
ᥗᥦᥛᥰ ᥙᥣ ᥘᥥᥐᥳ:Authority control
10
25
7798
4816
2026-09-08T13:35:56Z
咽頭べさ
24
7798
wikitext
text/x-wiki
{{#invoke:Authority control|authorityControl}}<noinclude>
{{documentation}}
</noinclude>
r48ujosbuyn94pk0voopv45idwf5fo2
ᥗᥦᥛᥰ ᥙᥣ ᥘᥥᥐᥳ:Zh
10
207
7814
7763
2026-09-08T15:31:39Z
Pannawat Chayasuwankul
1263
/* */
7814
wikitext
text/x-wiki
{{Language with name|zh|ᥑᥣᥛᥰ ᥑᥥᥱ |芒市|links={{{links|yes}}}}}<noinclude>
{{Documentation}}
</noinclude>
c9vmsvq1i7hsvnoxjt224bau5cd54dj
ᥛᥨᥝᥱ ᥓᥧᥰ:Authority control
828
381
7795
1272
2026-09-08T13:29:56Z
咽頭べさ
24
7795
Scribunto
text/plain
require('strict')
local p = {}
local frame = mw.getCurrentFrame()
local config_file = frame.args.config and frame.args.config~='' and ('/' .. frame.args.config) or ''
local config = mw.loadData('Module:Authority control/config' .. config_file)
local title = mw.title.getCurrentTitle()
local namespace = title.namespace
local testcases = title.subpageText == config.i18n.testcases
local getArgs = require('Module:Arguments').getArgs
local wikilink = function(target, label)
return label and '[[' .. target .. '|' .. label .. ']]' or '[[' .. target .. ']]'
end
local needsAttention = function(sortkey)
return wikilink(config.i18n.category .. ':' .. config.i18n.attentioncat, sortkey .. title.text)
end
local addCat = function(cat, sortkey)
if cat and cat~='' and (namespace==0 or namespace==14 or testcases) then
return wikilink(config.i18n.category..':'..cat, sortkey and sortkey..title.text)
else
return ''
end
end
local tooltip = function(text, label)
if label and label~='' then
return frame:expandTemplate{
title = 'Tooltip',
args = {text, label}
}
else
return text
end
end
local _makelink = function(id, val, additional, qid) --validate values and create a link
local link = mw.html.create('span'):addClass('uid')
if not additional and id.prefix then --show prefix on primary value
link:wikitext(id.prefix .. ': ')
end
local valid_value = false
if id.customlink then -- use function to validate and generate link
local newlink = require(config.auxiliary)[id.customlink](val.id, additional)
if newlink then
link:wikitext(newlink)
valid_value = true
end
else
if id.pattern then -- check pattern to determine validity
valid_value = string.match(val.id, '^' .. id.pattern .. '$')
elseif id.patterns then -- check multiple patterns to determine validity
for _, pattern in ipairs(id.patterns) do
valid_value = val.id:match('^' .. pattern .. '$')
if valid_value then break end
end
elseif id.valid then -- use function to determine validity
valid_value = require(config.auxiliary)[id.valid](val.id)
else -- no validation possible
valid_value = val.id
end
if valid_value then
local label = id.label
if not label or additional then
label = tostring(additional)
end
local newlink
if id.link then
valid_value = valid_value:gsub('%%', '%%%%')
local target = mw.ustring.gsub(id.link, '%$1', valid_value):gsub(' ', '%%20')
newlink = '[' .. target .. ' ' .. label .. ']'
else
newlink = valid_value
end
link:wikitext(tooltip(newlink, val.name))
end
end
if valid_value then
local cat = id.category and string.format(config.i18n.cat, id.category)
link:wikitext(addCat(cat))
else
local wdlink = qid and wikilink(':wikidata:' .. qid .. '#P' .. id.property) or ''
local name = mw.wikibase.getLabel('P' .. id.property) or ''
local tooltip = string.format(
config.i18n.idnotvalid,
name,
val.id
)
local cat = id.category and string.format(
config.i18n.cat,
config.i18n.faulty .. ' ' .. id.category
)
link:wikitext(wikilink('File:' .. config.i18n.warningicon .. '|20px|frameless|link=' .. wdlink, tooltip .. '.'))
:wikitext(addCat(cat))
:wikitext(addCat(config.i18n.allfaultycat, name))
end
return link
end
local _makelinks = function(id, qid)
--[[==================================]]
--[[ Make links ]]
--[[==================================]]
local getquals = function(statement, qualid)
if statement.qualifiers and statement.qualifiers['P'..qualid] then
return mw.wikibase.renderSnak(statement.qualifiers['P'..qualid][1])
end
end
local ids = {}
if qid then
for _, statement in ipairs(mw.wikibase.getBestStatements(qid, 'P'..id.property)) do
if statement.mainsnak.datavalue then
local val = statement.mainsnak.datavalue.value
if val then
local namedas = getquals(statement, 1810) or getquals(statement, 742) or ''
table.insert(ids, {id=val, name=namedas})
end end end end
local links
if ids[1] then
links = mw.html.create('li'):node(_makelink(id, ids[1], false, qid))
if ids[2] then
local sublinks = mw.html.create('ul')
for n = 2, #ids do
sublinks:tag('li'):node(_makelink(id, ids[n], n, qid)):done()
end
links:node(sublinks)
end
end
return links
end
p.authorityControl = function(frame)
--[[==================================]]
--[[ Main ]]
--[[==================================]]
local args = getArgs(frame, {parentOnly = true})
local resolveQID = function(qid)
if qid then
qid = 'Q' .. mw.ustring.gsub(qid, '^[Qq]', '')
if mw.wikibase.isValidEntityId(qid) and mw.wikibase.entityExists(qid) then
local sitelink = mw.wikibase.getSitelink(qid)
if sitelink then
return mw.wikibase.getEntityIdForTitle(sitelink) or mw.wikibase.getEntity(qid).id
end
return mw.wikibase.getEntity(qid).id
end end end
local conf = config.config
local auxCats = ''
local rct = false -- boolean to track if there are any links to be returned
local qid, topic
if namespace==0 and mw.wikibase ~= nil then
qid = mw.wikibase.getEntityIdForCurrentPage()
end
if qid then -- article is connected to a Wikidata item
if args.qid and resolveQID(args.qid)~=qid then -- non-matching qid parameter
auxCats = auxCats .. needsAttention('D')
end
else -- page is not connected to any Wikidata item
qid = resolveQID(args.qid) -- check qid parameter if no wikidata item is connected
if qid then -- qid parameter is valid, set topic to display
topic = mw.wikibase.getLabel(qid)
if topic then
if mw.ustring.lower(title.subpageText)==mw.ustring.lower(topic) then -- suppress topic display if subpagename equals topic up to case change
topic = nil
end
if topic and mw.wikibase.getSitelink(qid) then -- make wikilink to article
topic = wikilink(mw.wikibase.getSitelink(qid), topic)
end
else
auxCats = auxCats .. needsAttention('L')
end
elseif args.qid then -- invalid qid has been supplied, add to tracking cat
auxCats = auxCats .. needsAttention('Q')
end
end
local qids = {} -- setup any additional QIDs
if args.additional=='auto' then
if qid then -- check P527 for parts to add additional qids
local checkparts = function(property)
local parts = mw.wikibase.getBestStatements(qid, property)
if parts then
for _, part in ipairs(parts) do
if part.mainsnak.datavalue and part.mainsnak.datavalue.value.id then
local resolvedqid = resolveQID(part.mainsnak.datavalue.value.id)
if resolvedqid then
table.insert(qids,resolvedqid)
end end end end end
for _, part in ipairs(config.auto_additional) do
checkparts('P' .. part)
end
end
elseif args.additional then
for _, v in ipairs(mw.text.split(args.additional, '%s*,%s*')) do
v = resolveQID(v)
if v then
if v==qid then -- duplicate of qid parameter
auxCats = auxCats .. needsAttention('R')
end
table.insert(qids, v)
else -- invalid QID specified
auxCats = auxCats .. needsAttention('A')
end
end
end
local numsections, sections = 0, {}
for _, _ in ipairs(config.sections) do -- count number of regular sections
numsections = numsections + 1
end
for _ = 1, #qids+numsections do
table.insert(sections, {})
end
-- check which identifiers to show/suppress in template
local show, show_all_unsuppressed = {}, true
local stripP = function(pid) --strip P from property number
if pid:match('^[Pp]%d+$') then
pid = mw.ustring.gsub(pid, '[Pp]', '')
end
pid = tonumber(pid)
if pid and mw.wikibase.entityExists('P' .. pid) then
return pid
end
end
local addshowlist = function(list)
if list then
for _, v in ipairs(mw.text.split(string.lower(list), '%s*,%s*')) do
if config.whitelists[v] then -- e.g. show=arts to use whitelist
for _, w in ipairs(config.whitelists[v].properties) do
show[w] = true
end
else
v = stripP(v)
if v then -- e.g. show=P214 to show one particular property
show[v] = true
else -- unrecognised property or whitelist
auxCats = auxCats .. needsAttention('W')
end
end
end
show_all_unsuppressed = false
end
end
addshowlist(frame.args.show) -- check show parameter on wrapper template
addshowlist(args.show) -- check show parameter on article
addshowlist(args.country) -- check country parameter on article
if args.suppress then
local suppresslist = mw.text.split(args.suppress, '%s*,%s*') -- split parameter by comma
for _, v in ipairs(suppresslist) do
v = stripP(v)
if v then
show[v] = false
auxCats = auxCats .. wikilink(config.i18n.category .. ':' .. config.i18n.suppressedcat)
else
auxCats = auxCats .. needsAttention('P')
end
end
end
local makeSections = function(qid, addit)
for _, id in ipairs(conf) do
if id.suppressedbyproperty then
for _, property in ipairs(id.suppressedbyproperty) do
if show[property]=='used' then -- property is in use
show[id.property] = false -- suppressed by another property
end end end
if show[id.property]==nil then
show[id.property] = show_all_unsuppressed
end
if show[id.property] then
local links = _makelinks(id, qid)
if links then
table.insert(
sections[addit or id.section],
links
)
show[id.property] = 'used'
rct = true
end
end
end
end
local pencil = function(qid)
if qid then
return require('Module:EditAtWikidata')._showMessage{
pid = 'identifiers',
qid = qid
}
else
return ''
end
end
makeSections(qid, false)
for c = 1, #qids do
makeSections(qids[c], numsections+c)
end
--configure Navbox
local outString = ''
if rct then -- there is at least one link to display
local Navbox = require('Module:Navbox')
local sect, lastsect = 0, 0
local navboxArgs = {
name = 'Authority control',
navboxclass = 'authority-control',
bodyclass = 'hlist',
state = args.state or config.i18n.autocollapse,
navbar = 'off'
}
for c = 1, numsections+#qids do
if #sections[c]>0 then -- section is non-empty
sect = sect + 1
lastsect = c
local sectname
if c<=numsections then -- regular section
sectname = config.sections[c].name
else -- section from additional qid
local qid = qids[c-numsections]
local label, sitelink = mw.wikibase.getLabel(qid), mw.wikibase.getSitelink(qid)
if label then
if sitelink then
local target = mw.title.new(sitelink)
if target==title or (target.isRedirect and target.redirectTarget==title) then -- do not link
sectname = label
else -- make wikilink to article
sectname = wikilink(sitelink, label)
end
else
sectname = label
end
else
auxCats = auxCats .. needsAttention('L')
sectname = qid
end
sectname = sectname .. pencil(qid)
end
navboxArgs['group' .. c] = sectname
local list = mw.html.create('ul')
for _, link in ipairs(sections[c]) do
list:node(link)
end
navboxArgs['list' .. c] = tostring(list)
end
end
if topic then -- display in expanded form with topic
navboxArgs.title = config.i18n.aclink .. ' – ' .. topic .. pencil(qid)
elseif sect==1 then -- special display when only one section
if lastsect<=numsections then
if config.sections[lastsect].hidelabelwhenalone then -- no special label when only general or other IDs are present
navboxArgs['group' .. lastsect] = config.i18n.aclink .. pencil(qid)
else -- other regular section
navboxArgs['group' .. lastsect] = config.i18n.aclink .. ': ' .. navboxArgs['group' .. lastsect] .. pencil(qid)
end
else -- section from additional qid
navboxArgs['group' .. lastsect] = config.i18n.aclink .. ': ' .. navboxArgs['group' .. lastsect]
end
else -- add title to navbox
navboxArgs.title = config.i18n.aclink .. pencil(qid)
end
outString = Navbox._navbox(navboxArgs)
end
if args.state
and args.state~=config.i18n.collapsed
and args.state~=config.i18n.expanded
and args.state~=config.i18n.autocollapse then --invalid state parameter
auxCats = auxCats .. needsAttention('S')
end
if testcases then
auxCats = mw.ustring.gsub(auxCats, '(%[%[)(' .. config.i18n.category .. ')', '%1:%2') --for easier checking
end
--out
outString = outString .. auxCats
if namespace~=0 then
outString = mw.ustring.gsub(outString, '(%[%[)(' .. config.i18n.category .. ':' .. config.i18n.Articles .. ')([^%|%]]+)%|?[^%|%]]*(%]%])','%1:%2%3%4')
outString = mw.ustring.gsub(outString, '(%[%[)(' .. config.i18n.category .. ':' .. config.i18n.All_articles .. ')([^%|%]]+)%|?[^%|%]]*(%]%])','%1:%2%3%4')
end
local check = require('Module:Check for unknown parameters')._check
local sortkey
outString = outString .. check({
['unknown'] = wikilink(config.i18n.category .. ':' .. config.i18n.attentioncat, 'U'),
['preview'] = config.i18n.previewwarning, 'show', 'country', 'suppress', 'additional', 'qid', 'state'
}, args)
return outString
end
p.makelink = function(id, qid)
return _makelinks(id, qid)
end
return p
491eiemwohl5s3gylyl4528nljf9pu6
ᥛᥨᥝᥱ ᥓᥧᥰ:Coordinates
828
403
7813
6516
2026-09-08T14:09:44Z
咽頭べさ
24
7813
Scribunto
text/plain
--[[
This module is intended to replace the functionality of {{Coord}} and related
templates. It provides several methods, including
{{#invoke:Coordinates | coord }} : General function formatting and displaying
coordinate values.
{{#invoke:Coordinates | dec2dms }} : Simple function for converting decimal
degree values to DMS format.
{{#invoke:Coordinates | dms2dec }} : Simple function for converting DMS format
to decimal degree format.
{{#invoke:Coordinates | link }} : Export the link used to reach the tools
]]
require('strict')
local math_mod = require("Module:Math")
local coordinates = {};
local isSandbox = mw.getCurrentFrame():getTitle():find('sandbox', 1, true);
local current_page = mw.title.getCurrentTitle()
local page_name = mw.uri.encode( current_page.prefixedText, 'WIKI' );
local coord_link = 'https://geohack.toolforge.org/geohack.php?pagename=' .. page_name .. '¶ms='
--[[ Helper function, replacement for {{coord/display/title}} ]]
local function displaytitle(coords)
return mw.getCurrentFrame():extensionTag{
name = 'indicator',
args = { name = 'coordinates' },
content = '<span id="coordinates">[[Geographic coordinate system|Coordinates]]: ' .. coords .. '</span>'
}
end
--[[ Helper function, used in detecting DMS formatting ]]
local function dmsTest(first, second)
if type(first) ~= 'string' or type(second) ~= 'string' then
return nil
end
local s = (first .. second):upper()
return s:find('^[NS][EW]$') or s:find('^[EW][NS]$')
end
--[[ Wrapper function to grab args, see Module:Arguments for this function's documentation. ]]
local function makeInvokeFunc(funcName)
return function (frame)
local args = require('Module:Arguments').getArgs(frame, {
wrappers = 'Template:Coord'
})
return coordinates[funcName](args, frame)
end
end
--[[ Helper function, handle optional args. ]]
local function optionalArg(arg, supplement)
return arg and arg .. supplement or ''
end
--[[
Formats any error messages generated for display
]]
local function errorPrinter(errors)
local result = ""
for i,v in ipairs(errors) do
result = result .. '<strong class="error">Coordinates: ' .. v[2] .. '</strong><br />'
end
return result
end
--[[
Determine the required CSS class to display coordinates
Usually geo-nondefault is hidden by CSS, unless a user has overridden this for himself
default is the mode as specificied by the user when calling the {{coord}} template
mode is the display mode (dec or dms) that we will need to determine the css class for
]]
local function displayDefault(default, mode)
if default == "" then
default = "dec"
end
if default == mode then
return "geo-default"
else
return "geo-nondefault"
end
end
--[[
specPrinter
Output formatter. Takes the structure generated by either parseDec
or parseDMS and formats it for inclusion on Wikipedia.
]]
local function specPrinter(args, coordinateSpec)
local uriComponents = coordinateSpec["param"]
if uriComponents == "" then
-- RETURN error, should never be empty or nil
return "ERROR param was empty"
end
if args["name"] then
uriComponents = uriComponents .. "&title=" .. mw.uri.encode(coordinateSpec["name"])
end
local geodmshtml = '<span class="geo-dms" title="Maps, aerial photos, and other data for this location">'
.. '<span class="latitude">' .. coordinateSpec["dms-lat"] .. '</span> '
.. '<span class="longitude">' ..coordinateSpec["dms-long"] .. '</span>'
.. '</span>'
local lat = tonumber( coordinateSpec["dec-lat"] ) or 0
local geodeclat
if lat < 0 then
-- FIXME this breaks the pre-existing precision
geodeclat = tostring(coordinateSpec["dec-lat"]):sub(2) .. "°S"
else
geodeclat = (coordinateSpec["dec-lat"] or 0) .. "°N"
end
local long = tonumber( coordinateSpec["dec-long"] ) or 0
local geodeclong
if long < 0 then
-- FIXME does not handle unicode minus
geodeclong = tostring(coordinateSpec["dec-long"]):sub(2) .. "°W"
else
geodeclong = (coordinateSpec["dec-long"] or 0) .. "°E"
end
local geodechtml = '<span class="geo-dec" title="Maps, aerial photos, and other data for this location">'
.. geodeclat .. ' '
.. geodeclong
.. '</span>'
local geonumhtml = '<span class="geo">'
.. coordinateSpec["dec-lat"] .. '; '
.. coordinateSpec["dec-long"]
.. '</span>'
local inner = '<span class="' .. displayDefault(coordinateSpec["default"], "dms" ) .. '">' .. geodmshtml .. '</span>'
.. '<span class="geo-multi-punct"> / </span>'
.. '<span class="' .. displayDefault(coordinateSpec["default"], "dec" ) .. '">';
if not args["name"] then
inner = inner .. geodechtml
.. '<span style="display:none"> / ' .. geonumhtml .. '</span></span>'
else
inner = inner .. '<span class="vcard">' .. geodechtml
.. '<span style="display:none"> / ' .. geonumhtml .. '</span>'
.. '<span style="display:none"> (<span class="fn org">'
.. args["name"] .. '</span>)</span></span></span>'
end
local stylesheetLink = 'Module:Coordinates' .. ( isSandbox and '/sandbox' or '' ) .. '/styles.css'
return mw.getCurrentFrame():extensionTag{
name = 'templatestyles', args = { src = stylesheetLink }
} .. '<span class="plainlinks nourlexpansion">[' .. coord_link .. uriComponents ..
' ' .. inner .. ']</span>' .. '[[Category:Pages using gadget WikiMiniAtlas]]'
end
--[[ Helper function, convert decimal to degrees ]]
local function convert_dec2dms_d(coordinate)
local d = math_mod._round( coordinate, 0 ) .. "°"
return d .. ""
end
--[[ Helper function, convert decimal to degrees and minutes ]]
local function convert_dec2dms_dm(coordinate)
coordinate = math_mod._round( coordinate * 60, 0 );
local m = coordinate % 60;
coordinate = math.floor( (coordinate - m) / 60 );
local d = coordinate % 360 .."°"
return d .. string.format( "%02d′", m )
end
--[[ Helper function, convert decimal to degrees, minutes, and seconds ]]
local function convert_dec2dms_dms(coordinate)
coordinate = math_mod._round( coordinate * 60 * 60, 0 );
local s = coordinate % 60
coordinate = math.floor( (coordinate - s) / 60 );
local m = coordinate % 60
coordinate = math.floor( (coordinate - m) / 60 );
local d = coordinate % 360 .."°"
return d .. string.format( "%02d′", m ) .. string.format( "%02d″", s )
end
--[[
Helper function, convert decimal latitude or longitude to
degrees, minutes, and seconds format based on the specified precision.
]]
local function convert_dec2dms(coordinate, firstPostfix, secondPostfix, precision)
local coord = tonumber(coordinate)
local postfix
if coord >= 0 then
postfix = firstPostfix
else
postfix = secondPostfix
end
precision = precision:lower();
if precision == "dms" then
return convert_dec2dms_dms( math.abs( coord ) ) .. postfix;
elseif precision == "dm" then
return convert_dec2dms_dm( math.abs( coord ) ) .. postfix;
elseif precision == "d" then
return convert_dec2dms_d( math.abs( coord ) ) .. postfix;
end
end
--[[
Convert DMS format into a N or E decimal coordinate
]]
local function convert_dms2dec(direction, degrees_str, minutes_str, seconds_str)
local degrees = tonumber(degrees_str)
local minutes = tonumber(minutes_str) or 0
local seconds = tonumber(seconds_str) or 0
local factor = 1
if direction == "S" or direction == "W" then
factor = -1
end
local precision = 0
if seconds_str then
precision = 5 + math.max( math_mod._precision(seconds_str), 0 );
elseif minutes_str and minutes_str ~= '' then
precision = 3 + math.max( math_mod._precision(minutes_str), 0 );
else
precision = math.max( math_mod._precision(degrees_str), 0 );
end
local decimal = factor * (degrees+(minutes+seconds/60)/60)
return string.format( "%." .. precision .. "f", decimal ) -- not tonumber since this whole thing is string based.
end
--[[
Checks input values to for out of range errors.
]]
local function validate( lat_d, lat_m, lat_s, long_d, long_m, long_s, source, strong )
local errors = {};
lat_d = tonumber( lat_d ) or 0;
lat_m = tonumber( lat_m ) or 0;
lat_s = tonumber( lat_s ) or 0;
long_d = tonumber( long_d ) or 0;
long_m = tonumber( long_m ) or 0;
long_s = tonumber( long_s ) or 0;
if strong then
if lat_d < 0 then
table.insert(errors, {source, "latitude degrees < 0 with hemisphere flag"})
end
if long_d < 0 then
table.insert(errors, {source, "longitude degrees < 0 with hemisphere flag"})
end
--[[
#coordinates is inconsistent about whether this is an error. If globe: is
specified, it won't error on this condition, but otherwise it will.
For not simply disable this check.
if long_d > 180 then
table.insert(errors, {source, "longitude degrees > 180 with hemisphere flag"})
end
]]
end
if lat_d > 90 then
table.insert(errors, {source, "latitude degrees > 90"})
end
if lat_d < -90 then
table.insert(errors, {source, "latitude degrees < -90"})
end
if lat_m >= 60 then
table.insert(errors, {source, "latitude minutes >= 60"})
end
if lat_m < 0 then
table.insert(errors, {source, "latitude minutes < 0"})
end
if lat_s >= 60 then
table.insert(errors, {source, "latitude seconds >= 60"})
end
if lat_s < 0 then
table.insert(errors, {source, "latitude seconds < 0"})
end
if long_d >= 360 then
table.insert(errors, {source, "longitude degrees >= 360"})
end
if long_d <= -360 then
table.insert(errors, {source, "longitude degrees <= -360"})
end
if long_m >= 60 then
table.insert(errors, {source, "longitude minutes >= 60"})
end
if long_m < 0 then
table.insert(errors, {source, "longitude minutes < 0"})
end
if long_s >= 60 then
table.insert(errors, {source, "longitude seconds >= 60"})
end
if long_s < 0 then
table.insert(errors, {source, "longitude seconds < 0"})
end
return errors;
end
--[[
parseDec
Transforms decimal format latitude and longitude into the
structure to be used in displaying coordinates
]]
local function parseDec( lat, long, format )
local coordinateSpec = {}
local errors = {}
if not long then
return nil, {{"parseDec", "Missing longitude"}}
elseif not tonumber(long) then
return nil, {{"parseDec", "Longitude could not be parsed as a number: " .. long}}
end
errors = validate( lat, nil, nil, long, nil, nil, 'parseDec', false );
coordinateSpec["dec-lat"] = lat;
coordinateSpec["dec-long"] = long;
local mode = coordinates.determineMode( lat, long );
coordinateSpec["dms-lat"] = convert_dec2dms( lat, "N", "S", mode) -- {{coord/dec2dms|{{{1}}}|N|S|{{coord/prec dec|{{{1}}}|{{{2}}}}}}}
coordinateSpec["dms-long"] = convert_dec2dms( long, "E", "W", mode) -- {{coord/dec2dms|{{{2}}}|E|W|{{coord/prec dec|{{{1}}}|{{{2}}}}}}}
if format then
coordinateSpec.default = format
else
coordinateSpec.default = "dec"
end
return coordinateSpec, errors
end
--[[
parseDMS
Transforms degrees, minutes, seconds format latitude and longitude
into the a structure to be used in displaying coordinates
]]
local function parseDMS( lat_d, lat_m, lat_s, lat_f, long_d, long_m, long_s, long_f, format )
local coordinateSpec, errors, backward = {}, {}
lat_f = lat_f:upper();
long_f = long_f:upper();
-- Check if specified backward
if lat_f == 'E' or lat_f == 'W' then
lat_d, long_d, lat_m, long_m, lat_s, long_s, lat_f, long_f, backward = long_d, lat_d, long_m, lat_m, long_s, lat_s, long_f, lat_f, true;
end
errors = validate( lat_d, lat_m, lat_s, long_d, long_m, long_s, 'parseDMS', true );
if not long_d then
return nil, {{"parseDMS", "Missing longitude" }}
elseif not tonumber(long_d) then
return nil, {{"parseDMS", "Longitude could not be parsed as a number:" .. long_d }}
end
if not lat_m and not lat_s and not long_m and not long_s and #errors == 0 then
if math_mod._precision( lat_d ) > 0 or math_mod._precision( long_d ) > 0 then
if lat_f:upper() == 'S' then
lat_d = '-' .. lat_d;
end
if long_f:upper() == 'W' then
long_d = '-' .. long_d;
end
return parseDec( lat_d, long_d, format );
end
end
coordinateSpec["dms-lat"] = lat_d.."°"..optionalArg(lat_m,"′") .. optionalArg(lat_s,"″") .. lat_f
coordinateSpec["dms-long"] = long_d.."°"..optionalArg(long_m,"′") .. optionalArg(long_s,"″") .. long_f
coordinateSpec["dec-lat"] = convert_dms2dec(lat_f, lat_d, lat_m, lat_s) -- {{coord/dms2dec|{{{4}}}|{{{1}}}|0{{{2}}}|0{{{3}}}}}
coordinateSpec["dec-long"] = convert_dms2dec(long_f, long_d, long_m, long_s) -- {{coord/dms2dec|{{{8}}}|{{{5}}}|0{{{6}}}|0{{{7}}}}}
if format then
coordinateSpec.default = format
else
coordinateSpec.default = "dms"
end
return coordinateSpec, errors, backward
end
--[[
Check the input arguments for coord to determine the kind of data being provided
and then make the necessary processing.
]]
local function formatTest(args)
local result, errors
local backward, primary = false, false
local function getParam(args, lim)
local ret = {}
for i = 1, lim do
ret[i] = args[i] or ''
end
return table.concat(ret, '_')
end
if not args[1] then
-- no lat logic
return errorPrinter( {{"formatTest", "Missing latitude"}} )
elseif not tonumber(args[1]) then
-- bad lat logic
return errorPrinter( {{"formatTest", "Unable to parse latitude as a number:" .. args[1]}} )
elseif not args[4] and not args[5] and not args[6] then
-- dec logic
result, errors = parseDec(args[1], args[2], args.format)
if not result then
return errorPrinter(errors);
end
-- formatting for geohack: geohack expects D_N_D_E notation or D;D notation
-- wikiminiatlas doesn't support D;D notation
-- #coordinates parserfunction doesn't support negative decimals with NSWE
result.param = table.concat({
math.abs(tonumber(args[1])),
((tonumber(args[1]) or 0) < 0) and 'S' or 'N',
math.abs(tonumber(args[2])),
((tonumber(args[2]) or 0) < 0) and 'W' or 'E',
args[3] or ''}, '_')
elseif dmsTest(args[4], args[8]) then
-- dms logic
result, errors, backward = parseDMS(args[1], args[2], args[3], args[4],
args[5], args[6], args[7], args[8], args.format)
if args[10] then
table.insert(errors, {'formatTest', 'Extra unexpected parameters'})
end
if not result then
return errorPrinter(errors)
end
result.param = getParam(args, 9)
elseif dmsTest(args[3], args[6]) then
-- dm logic
result, errors, backward = parseDMS(args[1], args[2], nil, args[3],
args[4], args[5], nil, args[6], args['format'])
if args[8] then
table.insert(errors, {'formatTest', 'Extra unexpected parameters'})
end
if not result then
return errorPrinter(errors)
end
result.param = getParam(args, 7)
elseif dmsTest(args[2], args[4]) then
-- d logic
result, errors, backward = parseDMS(args[1], nil, nil, args[2],
args[3], nil, nil, args[4], args.format)
if args[6] then
table.insert(errors, {'formatTest', 'Extra unexpected parameters'})
end
if not result then
return errorPrinter(errors)
end
result.param = getParam(args, 5)
else
-- Error
return errorPrinter({{"formatTest", "Unknown argument format"}}) .. '[[Category:Pages with malformed coordinate tags]]'
end
result.name = args.name
local extra_param = {'dim', 'globe', 'scale', 'region', 'source', 'type'}
for _, v in ipairs(extra_param) do
if args[v] then
table.insert(errors, {'formatTest', 'Parameter: "' .. v .. '=" should be "' .. v .. ':"' })
end
end
local ret = specPrinter(args, result)
if #errors > 0 then
ret = ret .. ' ' .. errorPrinter(errors) .. '[[Category:Pages with malformed coordinate tags]]'
end
return ret, backward
end
--[[
Generate Wikidata tracking categories.
]]
local function makeWikidataCategories(qid)
local ret
local qid = qid or mw.wikibase.getEntityIdForCurrentPage()
if mw.wikibase and current_page.namespace == 0 then
if qid and mw.wikibase.entityExists(qid) and mw.wikibase.getBestStatements(qid, "P625") and mw.wikibase.getBestStatements(qid, "P625")[1] then
local snaktype = mw.wikibase.getBestStatements(qid, "P625")[1].mainsnak.snaktype
if snaktype == 'value' then
-- coordinates exist both here and on Wikidata, and can be compared.
ret = 'Coordinates on Wikidata'
elseif snaktype == 'somevalue' then
ret = 'Coordinates on Wikidata set to unknown value'
elseif snaktype == 'novalue' then
ret = 'Coordinates on Wikidata set to no value'
end
else
-- We have to either import the coordinates to Wikidata or remove them here.
ret = 'Coordinates not on Wikidata'
end
end
if ret then
return string.format('[[Category:%s]]', ret)
else
return ''
end
end
--[[
Parse coordinates entered as a single string
]]
local function text2coord(text)
if type(text) ~= 'string' then return end
local coords = {}
local numTerms = 0
local parts
local function assign(k, number, start, pos)
if number then
coords[start + pos - 1] = number
if k == 1 then
numTerms = pos
elseif numTerms < pos then -- more terms in long than lat
return false
end
elseif numTerms >= pos then -- more terms in lat than long
return false
end
return true
end
text = mw.ustring.gsub(mw.text.trim(text:uupper()), "[*′″]", {['*'] = '°', ['′'] = "'", ['″'] = '"'})
for _, regex in ipairs({
"^([+%-%d.°'\"NS%s]+),%s*([+%-%d.°'\"EW%s]+)$", --split by commas
"^([+%-%d.°'\"%s]+[NS])%s*([+%-%d.°'\"%s]+[EW])$", --split by N/S
"^([+%-%d.°'%s]+\")%s*([+%-%d.°'%s]+\")$", --split by "
"^([+%-%d.°%s]+')%s*([+%-%d.°%s]+')$", --split by '
"^([+%-%d.%s]+°)%s*([+%-%d.%s]+°)$", --split by °
"^([+%-%d.]+)%s+([+%-%d.]+)$" --split by space
}) do
local lat, long = string.match(text, regex)
if lat and long then
parts = {mw.text.trim(lat), mw.text.trim(long)}
break
end
end
if not parts then return end
local SW = {"S", "W"}
local NE = {"N", "E"}
for k, v in ipairs(parts) do
local number
local start = k + numTerms
-- Find or create N, S, E, and W
local dir = v:match("([NSEW])$")
if dir then
v = v:sub(1,-2)
elseif v:sub(1,1) == '-' then
v = v:sub(2)
dir = SW[k]
else
dir = NE[k]
end
-- attempt to convert text to number
number = tonumber(v)
if number then
-- Single number, assign it to the position "start" in the "coords" array
if not assign(k, number, start, 1) then
return
end
-- attempt to convert dms to decimal
elseif string.match(v, "°") then
for pos, regex in ipairs({
"^%s*([+%-%d.]+)%s*°[^°]*$", --degrees
"^[^°']+°%s*([%d.]+)%s*'[^°']*$", --minutes
"^[^'\"]+'%s*([%d.]+)%s*\"[^'\"]*$" --seconds
}) do
-- Assign component to a position in the "coords" array determined
-- by "start" and "pos", and increment "numTerms" if this is latitude
if not assign(k, tonumber(string.match(v, regex)), start, pos) then
return
end
end
end
if coords[start] == nil then return end
coords[start + numTerms] = dir
end
return coords
end
--[[
link
Simple function to export the coordinates link for other uses.
Usage:
{{#invoke:Coordinates | link }}
]]
function coordinates.link(frame)
return coord_link;
end
--[[
dec2dms
Wrapper to allow templates to call dec2dms directly.
Usage:
{{#invoke:Coordinates | dec2dms | decimal_coordinate | positive_suffix |
negative_suffix | precision }}
decimal_coordinate is converted to DMS format. If positive, the positive_suffix
is appended (typical N or E), if negative, the negative suffix is appended. The
specified precision is one of 'D', 'DM', or 'DMS' to specify the level of detail
to use.
]]
coordinates.dec2dms = makeInvokeFunc('_dec2dms')
function coordinates._dec2dms(args)
local coordinate = args[1]
local firstPostfix = args[2] or ''
local secondPostfix = args[3] or ''
local precision = args[4] or ''
return convert_dec2dms(coordinate, firstPostfix, secondPostfix, precision)
end
--[[
Helper function to determine whether to use D, DM, or DMS
format depending on the precision of the decimal input.
]]
function coordinates.determineMode( value1, value2 )
local precision = math.max( math_mod._precision( value1 ), math_mod._precision( value2 ) );
if precision <= 0 then
return 'd'
elseif precision <= 2 then
return 'dm';
else
return 'dms';
end
end
--[[
dms2dec
Wrapper to allow templates to call dms2dec directly.
Usage:
{{#invoke:Coordinates | dms2dec | direction_flag | degrees |
minutes | seconds }}
Converts DMS values specified as degrees, minutes, seconds too decimal format.
direction_flag is one of N, S, E, W, and determines whether the output is
positive (i.e. N and E) or negative (i.e. S and W).
]]
coordinates.dms2dec = makeInvokeFunc('_dms2dec')
function coordinates._dms2dec(args)
local direction = args[1]
local degrees = args[2]
local minutes = args[3]
local seconds = args[4]
return convert_dms2dec(direction, degrees, minutes, seconds)
end
--[[
coord
Main entry point for Lua function to replace {{coord}}
Usage:
{{#invoke:Coordinates | coord }}
{{#invoke:Coordinates | coord | lat | long }}
{{#invoke:Coordinates | coord | lat | lat_flag | long | long_flag }}
...
Refer to {{coord}} documentation page for many additional parameters and
configuration options.
Note: This function provides the visual display elements of {{coord}}. In
order to load coordinates into the database, the {{#coordinates:}} parser
function must also be called, this is done automatically in the Lua
version of {{coord}}.
]]
coordinates.coord = makeInvokeFunc('_coord')
function coordinates._coord(args)
if not tonumber(args[1]) then
local parsed = text2coord(args[1])
if parsed then -- full lat/long entered as a single string
for i = 2, #args do args[#parsed + i - 1] = args[i] end
for i, v in ipairs(parsed) do args[i] = v end
elseif not args[2] then -- look for coordinates from wikidata
args[3] = args[1]; args[1] = nil
local entity = mw.wikibase.getEntityObject(args.qid)
if entity
and entity.claims
and entity.claims.P625
and entity.claims.P625[1].mainsnak.snaktype == 'value'
then
local precision = entity.claims.P625[1].mainsnak.datavalue.value.precision
args[1] = entity.claims.P625[1].mainsnak.datavalue.value.latitude
args[2] = entity.claims.P625[1].mainsnak.datavalue.value.longitude
if precision then
precision = -math_mod._round(math.log(precision)/math.log(10),0)
args[1] = math_mod._round(args[1],precision)
args[2] = math_mod._round(args[2],precision)
end
end
end
end
local contents, backward = formatTest(args)
local Notes = args.notes or ''
local Display = args.display and args.display:lower() or 'inline'
-- it and ti are short for inline,title and title,inline
local function isInline(s)
-- Finds whether coordinates are displayed inline.
return s:find('inline') ~= nil or s == 'i' or s == 'it' or s == 'ti'
end
local function isInTitle(s)
-- Finds whether coordinates are displayed in the title.
return s:find('title') ~= nil or s == 't' or s == 'it' or s == 'ti'
end
local function coord_wrapper(in_args)
-- Calls the parser function {{#coordinates:}}.
return mw.getCurrentFrame():callParserFunction('#coordinates', in_args) or ''
end
local text = ''
if isInline(Display) then
text = text .. '<span class="geo-inline">' .. contents .. Notes .. '</span>'
end
if isInTitle(Display) then
-- Add to output since indicator content is invisible to Lua later on
if not isInline(Display) then
text = text .. '<span class="geo-inline-hidden noexcerpt">' .. contents .. Notes .. '</span>'
end
text = text .. displaytitle(contents .. Notes) .. makeWikidataCategories(args.qid)
end
if not args.nosave then
local page_title, count = mw.title.getCurrentTitle(), 1
if backward then
local tmp = {}
while not string.find((args[count-1] or ''), '[EW]') do tmp[count] = (args[count] or ''); count = count+1 end
tmp.count = count; count = 2*(count-1)
while count >= tmp.count do table.insert(tmp, 1, (args[count] or '')); count = count-1 end
for i, v in ipairs(tmp) do args[i] = v end
else
while count <= 9 do args[count] = (args[count] or ''); count = count+1 end
end
if isInTitle(Display) and not page_title.isTalkPage and page_title.subpageText ~= 'doc' and page_title.subpageText ~= 'testcases' then args[10] = 'primary' end
args.notes, args.format, args.display = nil
text = text .. coord_wrapper(args)
end
return text
end
--[[
coord2text
Extracts a single value from a transclusion of {{Coord}}.
IF THE GEOHACK LINK SYNTAX CHANGES THIS FUNCTION MUST BE MODIFIED.
Usage:
{{#invoke:Coordinates | coord2text | {{Coord}} | parameter }}
Valid values for the second parameter are: lat (signed integer), long (signed integer), type, scale, dim, region, globe, source
]]
function coordinates._coord2text(coord,type)
if coord == '' or type == '' or not type then return nil end
type = mw.text.trim(type)
if type == 'lat' or type == 'long' then
local coordString = mw.ustring.match(coord,'[%.%d]+°[NS] [%.%d]+°[EW]')
if not coordString then
return nil
end
local result = mw.text.split(coordString, ' ')
local negative
if type == 'lat' then
result, negative = result[1], 'S'
else
result, negative = result[2], 'W'
end
if not result then
return nil
end
result = mw.text.split(result, '°')
if not result[1] then
return nil
end
if result[2] == negative then result[1] = '-'..result[1] end
return result[1]
else
return mw.ustring.match(coord, 'params=.-_' .. type .. ':(.-)[ _]')
end
end
function coordinates.coord2text(frame)
return coordinates._coord2text(frame.args[1],frame.args[2]) or ''
end
--[[
coordinsert
Injects some text into the Geohack link of a transclusion of {{Coord}} (if that text isn't already in the transclusion). Outputs the modified transclusion of {{Coord}}.
IF THE GEOHACK LINK SYNTAX CHANGES THIS FUNCTION MUST BE MODIFIED.
Usage:
{{#invoke:Coordinates | coordinsert | {{Coord}} | parameter:value | parameter:value | … }}
Do not make Geohack unhappy by inserting something which isn't mentioned in the {{Coord}} documentation.
]]
function coordinates.coordinsert(frame)
-- for the 2nd or later integer parameter (the first is the coord template, as above)
for i, v in ipairs(frame.args) do
if i ~= 1 then
-- if we cannot find in the coord_template the i_th coordinsert parameter e.g. region
if not mw.ustring.find(frame.args[1], (mw.ustring.match(frame.args[i], '^(.-:)') or '')) then
-- find from the params= up to the first possibly-present underscore
-- and append the i_th coordinsert parameter and a space
-- IDK why we're adding a space but it does seem somewhat convenient
frame.args[1] = mw.ustring.gsub(frame.args[1], '(params=.-)_? ', '%1_'..frame.args[i]..' ')
end
end
end
if frame.args.name then
-- if we can't find the vcard class
if not mw.ustring.find(frame.args[1], '<span class="vcard">') then
-- take something that looks like a coord template and add the vcard span with class and fn org class
local namestr = frame.args.name
frame.args[1] = mw.ustring.gsub(
frame.args[1],
'(<span class="geo%-default">)(<span[^<>]*>[^<>]*</span><span[^<>]*>[^<>]*<span[^<>]*>[^<>]*</span></span>)(</span>)',
'%1<span class="vcard">%2<span style="display:none"> (<span class="fn org">' .. namestr .. '</span>)</span></span>%3'
)
-- then find anything from coordinates parameters to the 'end' and attach the title parameter
frame.args[1] = mw.ustring.gsub(
frame.args[1],
'(¶ms=[^&"<>%[%] ]*) ',
'%1&title=' .. mw.uri.encode(namestr) .. ' '
)
end
end
-- replace the existing indicator with a new indicator using the modified content
frame.args[1] = mw.ustring.gsub(
frame.args[1],
'(<span class="geo%-inline[^"]*">(.+)</span>)\127[^\127]*UNIQ%-%-indicator%-%x+%-%-?QINU[^\127]*\127',
function (inline, coord) return inline .. displaytitle(coord) end
)
return frame.args[1]
end
return coordinates
mgr040y9bhe26jrkzioi6ulvlqhvehy
ᥛᥨᥝᥱ ᥓᥧᥰ:EditAtWikidata
828
408
7799
1336
2026-09-08T13:38:41Z
咽頭べさ
24
7799
Scribunto
text/plain
-- Module to display an icon with a tooltip such as "Edit this at Wikidata".
-- Icon is linked to the Wikidata entry for the article where this is placed.
-- This message is only displayed if a local_parameter is not supplied
-- i.e. when called from a template, it can be coded not to display the message.
-- The qid of a Wikidata entry can optionally be supplied for testing outside the article.
-- Usage:
-- {{#invoke:EditAtWikidata|showMessage|local_parameter}}
-- {{#invoke:EditAtWikidata|showMessage|qid=<ArticleID>|local_parameter}}
local p = {}
local i18n =
{
["message"] = "Edit this at Wikidata"
}
local function trimToNil(text)
-- Return trimmed non-empty text, or nil.
if type(text) == 'string' then
return text:match('(%S.-)%s*$')
end
end
function p._showMessage(args)
local local_parm = trimToNil(args[1])
if local_parm then return "" end
-- Parameter qid=x specifies the Wikidata ID for the article.
-- This is not normally used except for testing outside the article.
local qid = trimToNil(args.qid) or mw.wikibase.getEntityIdForCurrentPage()
if qid and mw.wikibase.entityExists(qid) then
-- Parameter pid=x uses x as an anchor in the link to the Wikidata entry.
local anchor = trimToNil(args.pid)
-- Parameter nbsp replaces the leading space with
local space = trimToNil(args.nbsp) and " " or " "
return
space ..
"[[File:OOjs UI icon edit-ltr-progressive.svg|frameless|text-top|10px" ..
"|alt=" .. i18n.message ..
"|link=https://www.wikidata.org/wiki/" .. qid ..
(anchor and ("#" .. anchor) or "") ..
"|class=noprint" ..
"|" .. i18n.message ..
"]]"
end
return ""
end
function p.showMessage(frame)
return p._showMessage(frame.args)
end
return p
hod1hfo0n331jsuhscew67pebepcmju
ᥛᥨᥝᥱ ᥓᥧᥰ:Infobox
828
423
7807
6047
2026-09-08T13:56:02Z
咽頭べさ
24
7807
Scribunto
text/plain
local p = {}
local args = {}
local origArgs = {}
local root
local empty_row_categories = {}
local category_in_empty_row_pattern = '%[%[%s*[Cc][Aa][Tt][Ee][Gg][Oo][Rr][Yy]%s*:[^]]*]]'
local has_rows = false
local yesno = require("Module:Yesno")
local lists = {
plainlist_t = {
patterns = {
'^plainlist$',
'%splainlist$',
'^plainlist%s',
'%splainlist%s'
},
found = false,
styles = 'Plainlist/styles.css'
},
hlist_t = {
patterns = {
'^hlist$',
'%shlist$',
'^hlist%s',
'%shlist%s'
},
found = false,
styles = 'Hlist/styles.css'
}
}
local function has_list_class(args_to_check)
for _, list in pairs(lists) do
if not list.found then
for _, arg in pairs(args_to_check) do
for _, pattern in ipairs(list.patterns) do
if mw.ustring.find(arg or '', pattern) then
list.found = true
break
end
end
if list.found then break end
end
end
end
end
local function isUntitledChildBox(sval)
return sval and ( sval:match( '^%s*<%s*[Tt][Rr]' ) or sval:match( '^%s*\127[^\127]*UNIQ%-%-templatestyles%-%x+%-QINU[^\127]*\127%s*<%s*[Tt][Rr]' ) )
end
local function fixChildBoxes(sval, tt)
local function notempty( s ) return s and s:match( '%S' ) end
if notempty(sval) then
local marker = '<span class=special_infobox_marker>'
local s = sval
-- start moving templatestyles and categories inside of table rows
local slast = ''
while slast ~= s do
slast = s
s = mw.ustring.gsub(s, '(</[Tt][Rr]%s*>%s*)(%[%[%s*[Cc][Aa][Tt][Ee][Gg][Oo][Rr][Yy]%s*:[^]]*%]%])', '%2%1')
s = mw.ustring.gsub(s, '(</[Tt][Rr]%s*>%s*)(\127[^\127]*UNIQ%-%-templatestyles%-%x+%-QINU[^\127]*\127)', '%2%1')
end
-- end moving templatestyles and categories inside of table rows
s = mw.ustring.gsub(s, '(<%s*[Tt][Rr])', marker .. '%1')
s = mw.ustring.gsub(s, '(</[Tt][Rr]%s*>)', '%1' .. marker)
if s:match(marker) then
s = mw.ustring.gsub(s, marker .. '%s*' .. marker, '')
s = mw.ustring.gsub(s, '([\r\n]|-[^\r\n]*[\r\n])%s*' .. marker, '%1')
s = mw.ustring.gsub(s, marker .. '%s*([\r\n]|-)', '%1')
s = mw.ustring.gsub(s, '(</[Cc][Aa][Pp][Tt][Ii][Oo][Nn]%s*>%s*)' .. marker, '%1')
s = mw.ustring.gsub(s, '(<%s*[Tt][Aa][Bb][Ll][Ee][^<>]*>%s*)' .. marker, '%1')
s = mw.ustring.gsub(s, '^(%{|[^\r\n]*[\r\n]%s*)' .. marker, '%1')
s = mw.ustring.gsub(s, '([\r\n]%{|[^\r\n]*[\r\n]%s*)' .. marker, '%1')
s = mw.ustring.gsub(s, marker .. '(%s*</[Tt][Aa][Bb][Ll][Ee]%s*>)', '%1')
s = mw.ustring.gsub(s, marker .. '(%s*\n|%})', '%1')
end
if s:match(marker) then
local subcells = mw.text.split(s, marker)
s = ''
for k = 1, #subcells do
if k == 1 then
s = s .. subcells[k] .. '</' .. tt .. '></tr>'
elseif k == #subcells then
local rowstyle = ' style="display:none"'
if notempty(subcells[k]) then rowstyle = '' end
s = s .. '<tr' .. rowstyle ..'><' .. tt .. ' colspan=2>\n' ..
subcells[k]
elseif notempty(subcells[k]) then
if (k % 2) == 0 then
s = s .. subcells[k]
else
s = s .. '<tr><' .. tt .. ' colspan=2>\n' ..
subcells[k] .. '</' .. tt .. '></tr>'
end
end
end
end
-- the next two lines add a newline at the end of lists for the PHP parser
-- [[Special:Diff/849054481]]
-- remove when [[:phab:T191516]] is fixed or OBE
s = mw.ustring.gsub(s, '([\r\n][%*#;:][^\r\n]*)$', '%1\n')
s = mw.ustring.gsub(s, '^([%*#;:][^\r\n]*)$', '%1\n')
s = mw.ustring.gsub(s, '^([%*#;:])', '\n%1')
s = mw.ustring.gsub(s, '^(%{%|)', '\n%1')
return s
else
return sval
end
end
-- Cleans empty tables
local function cleanInfobox()
root = tostring(root)
if has_rows == false then
root = mw.ustring.gsub(root, '<table[^<>]*>%s*</table>', '')
end
end
-- Returns the union of the values of two tables, as a sequence.
local function union(t1, t2)
local vals = {}
for k, v in pairs(t1) do
vals[v] = true
end
for k, v in pairs(t2) do
vals[v] = true
end
local ret = {}
for k, v in pairs(vals) do
table.insert(ret, k)
end
return ret
end
-- Returns a table containing the numbers of the arguments that exist
-- for the specified prefix. For example, if the prefix was 'data', and
-- 'data1', 'data2', and 'data5' exist, it would return {1, 2, 5}.
local function getArgNums(prefix)
local nums = {}
for k, v in pairs(args) do
local num = tostring(k):match('^' .. prefix .. '([1-9]%d*)$')
if num then table.insert(nums, tonumber(num)) end
end
table.sort(nums)
return nums
end
-- Adds a row to the infobox, with either a header cell
-- or a label/data cell combination.
local function addRow(rowArgs)
if rowArgs.header and rowArgs.header ~= '_BLANK_' then
has_rows = true
has_list_class({ rowArgs.rowclass, rowArgs.class, args.headerclass })
root
:tag('tr')
:addClass(rowArgs.rowclass)
:addClass( isUntitledChildBox( rowArgs.header ) and 'infobox-hiddenrow' or nil )
:cssText(rowArgs.rowstyle)
:tag('th')
:attr('colspan', '2')
:addClass('infobox-header')
:addClass(rowArgs.class)
:addClass(args.headerclass)
-- @deprecated next; target .infobox-<name> .infobox-header
:cssText(args.headerstyle)
:cssText(rowArgs.rowcellstyle)
:wikitext(fixChildBoxes(rowArgs.header, 'th'))
if rowArgs.data and not yesno(args.decat) then
root:wikitext(
'[[Category:Pages using infobox templates with ignored data cells]]'
)
end
elseif rowArgs.data and rowArgs.data:gsub(category_in_empty_row_pattern, ''):match('^%S') then
has_rows = true
has_list_class({ rowArgs.rowclass, rowArgs.class })
local row = root:tag('tr')
row:addClass(rowArgs.rowclass)
row:cssText(rowArgs.rowstyle)
if rowArgs.label then
row
:tag('th')
:attr('scope', 'row')
:addClass('infobox-label')
-- @deprecated next; target .infobox-<name> .infobox-label
:cssText(args.labelstyle)
:cssText(rowArgs.rowcellstyle)
:wikitext(rowArgs.label)
:done()
else
row:addClass( isUntitledChildBox( rowArgs.data ) and 'infobox-hiddenrow' or nil )
end
local dataCell = row:tag('td')
dataCell
:attr('colspan', not rowArgs.label and '2' or nil)
:addClass(not rowArgs.label and 'infobox-full-data' or 'infobox-data')
:addClass(rowArgs.class)
-- @deprecated next; target .infobox-<name> .infobox(-full)-data
:cssText(rowArgs.datastyle)
:cssText(rowArgs.rowcellstyle)
:wikitext(fixChildBoxes(rowArgs.data, 'td'))
else
table.insert(empty_row_categories, rowArgs.data or '')
end
end
local function renderTitle()
if not args.title then return end
has_rows = true
has_list_class({args.titleclass})
root
:tag('caption')
:addClass('infobox-title')
:addClass(args.titleclass)
-- @deprecated next; target .infobox-<name> .infobox-title
:cssText(args.titlestyle)
:wikitext(args.title)
end
local function renderAboveRow()
if not args.above then return end
has_rows = true
has_list_class({ args.aboveclass })
root
:tag('tr')
:addClass( isUntitledChildBox( args.above ) and 'infobox-hiddenrow' or nil )
:tag('th')
:attr('colspan', '2')
:addClass('infobox-above')
:addClass(args.aboveclass)
-- @deprecated next; target .infobox-<name> .infobox-above
:cssText(args.abovestyle)
:wikitext(fixChildBoxes(args.above,'th'))
end
local function renderBelowRow()
if not args.below then return end
has_rows = true
has_list_class({ args.belowclass })
root
:tag('tr')
:addClass( isUntitledChildBox( args.below ) and 'infobox-hiddenrow' or nil )
:tag('td')
:attr('colspan', '2')
:addClass('infobox-below')
:addClass(args.belowclass)
-- @deprecated next; target .infobox-<name> .infobox-below
:cssText(args.belowstyle)
:wikitext(fixChildBoxes(args.below,'td'))
end
local function addSubheaderRow(subheaderArgs)
if subheaderArgs.data and
subheaderArgs.data:gsub(category_in_empty_row_pattern, ''):match('^%S') then
has_rows = true
has_list_class({ subheaderArgs.rowclass, subheaderArgs.class })
local row = root:tag('tr')
row:addClass(subheaderArgs.rowclass)
row:addClass( isUntitledChildBox( subheaderArgs.data ) and 'infobox-hiddenrow' or nil )
local dataCell = row:tag('td')
dataCell
:attr('colspan', '2')
:addClass('infobox-subheader')
:addClass(subheaderArgs.class)
:cssText(subheaderArgs.datastyle)
:cssText(subheaderArgs.rowcellstyle)
:wikitext(fixChildBoxes(subheaderArgs.data, 'td'))
else
table.insert(empty_row_categories, subheaderArgs.data or '')
end
end
local function renderSubheaders()
if args.subheader then
args.subheader1 = args.subheader
end
if args.subheaderrowclass then
args.subheaderrowclass1 = args.subheaderrowclass
end
local subheadernums = getArgNums('subheader')
for k, num in ipairs(subheadernums) do
addSubheaderRow({
data = args['subheader' .. tostring(num)],
-- @deprecated next; target .infobox-<name> .infobox-subheader
datastyle = args.subheaderstyle,
rowcellstyle = args['subheaderstyle' .. tostring(num)],
class = args.subheaderclass,
rowclass = args['subheaderrowclass' .. tostring(num)]
})
end
end
local function addImageRow(imageArgs)
if imageArgs.data and
imageArgs.data:gsub(category_in_empty_row_pattern, ''):match('^%S') then
has_rows = true
has_list_class({ imageArgs.rowclass, imageArgs.class })
local row = root:tag('tr')
row:addClass(imageArgs.rowclass)
row:addClass( isUntitledChildBox( imageArgs.data ) and 'infobox-hiddenrow' or nil )
local dataCell = row:tag('td')
dataCell
:attr('colspan', '2')
:addClass('infobox-image')
:addClass(imageArgs.class)
:cssText(imageArgs.datastyle)
:wikitext(fixChildBoxes(imageArgs.data, 'td'))
else
table.insert(empty_row_categories, imageArgs.data or '')
end
end
local function renderImages()
if args.image then
args.image1 = args.image
end
if args.caption then
args.caption1 = args.caption
end
local imagenums = getArgNums('image')
for k, num in ipairs(imagenums) do
local caption = args['caption' .. tostring(num)]
local data = mw.html.create():wikitext(args['image' .. tostring(num)])
if caption then
data
:tag('div')
:addClass('infobox-caption')
-- @deprecated next; target .infobox-<name> .infobox-caption
:cssText(args.captionstyle)
:wikitext(caption)
end
addImageRow({
data = tostring(data),
-- @deprecated next; target .infobox-<name> .infobox-image
datastyle = args.imagestyle,
class = args.imageclass,
rowclass = args['imagerowclass' .. tostring(num)]
})
end
end
-- When autoheaders are turned on, preprocesses the rows
local function preprocessRows()
if not args.autoheaders then return end
local rownums = union(getArgNums('header'), getArgNums('data'))
table.sort(rownums)
local lastheader
for k, num in ipairs(rownums) do
if args['header' .. tostring(num)] then
if lastheader then
args['header' .. tostring(lastheader)] = nil
end
lastheader = num
elseif args['data' .. tostring(num)] and
args['data' .. tostring(num)]:gsub(
category_in_empty_row_pattern, ''
):match('^%S') then
local data = args['data' .. tostring(num)]
if data:gsub(category_in_empty_row_pattern, ''):match('%S') then
lastheader = nil
end
end
end
if lastheader then
args['header' .. tostring(lastheader)] = nil
end
end
-- Gets the union of the header and data argument numbers,
-- and renders them all in order
local function renderRows()
local rownums = union(getArgNums('header'), getArgNums('data'))
table.sort(rownums)
for k, num in ipairs(rownums) do
addRow({
header = args['header' .. tostring(num)],
label = args['label' .. tostring(num)],
data = args['data' .. tostring(num)],
datastyle = args.datastyle,
class = args['class' .. tostring(num)],
rowclass = args['rowclass' .. tostring(num)],
-- @deprecated next; target .infobox-<name> rowclass
rowstyle = args['rowstyle' .. tostring(num)],
rowcellstyle = args['rowcellstyle' .. tostring(num)]
})
end
end
local function renderNavBar()
if not args.name then return end
has_rows = true
root
:tag('tr')
:tag('td')
:attr('colspan', '2')
:addClass('infobox-navbar')
:wikitext(require('Module:Navbar')._navbar{
args.name,
mini = 1,
})
end
local function renderItalicTitle()
local italicTitle = args['italic title'] and mw.ustring.lower(args['italic title'])
if italicTitle == '' or italicTitle == 'force' or italicTitle == 'yes' then
root:wikitext(require('Module:Italic title')._main({}))
end
end
-- Categories in otherwise empty rows are collected in empty_row_categories.
-- This function adds them to the module output. It is not affected by
-- args.decat because this module should not prevent module-external categories
-- from rendering.
local function renderEmptyRowCategories()
for _, s in ipairs(empty_row_categories) do
root:wikitext(s)
end
end
-- Render tracking categories. args.decat == turns off tracking categories.
local function renderTrackingCategories()
if yesno(args.decat) then return end
if args.child == 'yes' then
if args.title then
root:wikitext(
'[[Category:Pages using embedded infobox templates with the title parameter]]'
)
end
elseif #(getArgNums('data')) == 0 and mw.title.getCurrentTitle().namespace == 0 then
root:wikitext('[[Category:Articles using infobox templates with no data rows]]')
end
end
--[=[
Loads the templatestyles for the infobox.
TODO: FINISH loading base templatestyles here rather than in
MediaWiki:Common.css. There are 4-5000 pages with 'raw' infobox tables.
See [[Mediawiki_talk:Common.css/to_do#Infobox]] and/or come help :).
When we do this we should clean up the inline CSS below too.
Will have to do some bizarre conversion category like with sidebar.
]=]
local function loadTemplateStyles()
local frame = mw.getCurrentFrame()
local hlist_templatestyles = ''
if lists.hlist_t.found then
hlist_templatestyles = frame:extensionTag{
name = 'templatestyles', args = { src = lists.hlist_t.styles }
}
end
local plainlist_templatestyles = ''
if lists.plainlist_t.found then
plainlist_templatestyles = frame:extensionTag{
name = 'templatestyles', args = { src = lists.plainlist_t.styles }
}
end
-- See function description
local base_templatestyles = frame:extensionTag{
name = 'templatestyles', args = { src = 'Module:Infobox/styles.css' }
}
local templatestyles = ''
if args['templatestyles'] then
templatestyles = frame:extensionTag{
name = 'templatestyles', args = { src = args['templatestyles'] }
}
end
local child_templatestyles = ''
if args['child templatestyles'] then
child_templatestyles = frame:extensionTag{
name = 'templatestyles', args = { src = args['child templatestyles'] }
}
end
local grandchild_templatestyles = ''
if args['grandchild templatestyles'] then
grandchild_templatestyles = frame:extensionTag{
name = 'templatestyles', args = { src = args['grandchild templatestyles'] }
}
end
return table.concat({
-- hlist -> plainlist -> base is best-effort to preserve old Common.css ordering.
-- this ordering is not a guarantee because the rows of interest invoking
-- each class may not be on a specific page
hlist_templatestyles,
plainlist_templatestyles,
base_templatestyles,
templatestyles,
child_templatestyles,
grandchild_templatestyles
})
end
-- common functions between the child and non child cases
local function structure_infobox_common()
renderSubheaders()
renderImages()
preprocessRows()
renderRows()
renderBelowRow()
renderNavBar()
renderItalicTitle()
renderEmptyRowCategories()
renderTrackingCategories()
cleanInfobox()
end
-- Specify the overall layout of the infobox, with special settings if the
-- infobox is used as a 'child' inside another infobox.
local function _infobox()
if args.child ~= 'yes' then
root = mw.html.create('table')
root
:addClass(args.subbox == 'yes' and 'infobox-subbox' or 'infobox')
:addClass(args.bodyclass)
-- @deprecated next; target .infobox-<name>
:cssText(args.bodystyle)
has_list_class({ args.bodyclass })
renderTitle()
renderAboveRow()
else
root = mw.html.create()
root
:wikitext(args.title)
end
structure_infobox_common()
return loadTemplateStyles() .. root
end
-- If the argument exists and isn't blank, add it to the argument table.
-- Blank arguments are treated as nil to match the behaviour of ParserFunctions.
local function preprocessSingleArg(argName)
if origArgs[argName] and origArgs[argName] ~= '' then
args[argName] = origArgs[argName]
end
end
-- Assign the parameters with the given prefixes to the args table, in order, in
-- batches of the step size specified. This is to prevent references etc. from
-- appearing in the wrong order. The prefixTable should be an array containing
-- tables, each of which has two possible fields, a "prefix" string and a
-- "depend" table. The function always parses parameters containing the "prefix"
-- string, but only parses parameters in the "depend" table if the prefix
-- parameter is present and non-blank.
local function preprocessArgs(prefixTable, step)
if type(prefixTable) ~= 'table' then
error("Non-table value detected for the prefix table", 2)
end
if type(step) ~= 'number' then
error("Invalid step value detected", 2)
end
-- Get arguments without a number suffix, and check for bad input.
for i,v in ipairs(prefixTable) do
if type(v) ~= 'table' or type(v.prefix) ~= "string" or
(v.depend and type(v.depend) ~= 'table') then
error('Invalid input detected to preprocessArgs prefix table', 2)
end
preprocessSingleArg(v.prefix)
-- Only parse the depend parameter if the prefix parameter is present
-- and not blank.
if args[v.prefix] and v.depend then
for j, dependValue in ipairs(v.depend) do
if type(dependValue) ~= 'string' then
error('Invalid "depend" parameter value detected in preprocessArgs')
end
preprocessSingleArg(dependValue)
end
end
end
-- Get arguments with number suffixes.
local a = 1 -- Counter variable.
local moreArgumentsExist = true
while moreArgumentsExist == true do
moreArgumentsExist = false
for i = a, a + step - 1 do
for j,v in ipairs(prefixTable) do
local prefixArgName = v.prefix .. tostring(i)
if origArgs[prefixArgName] then
-- Do another loop if any arguments are found, even blank ones.
moreArgumentsExist = true
preprocessSingleArg(prefixArgName)
end
-- Process the depend table if the prefix argument is present
-- and not blank, or we are processing "prefix1" and "prefix" is
-- present and not blank, and if the depend table is present.
if v.depend and (args[prefixArgName] or (i == 1 and args[v.prefix])) then
for j,dependValue in ipairs(v.depend) do
local dependArgName = dependValue .. tostring(i)
preprocessSingleArg(dependArgName)
end
end
end
end
a = a + step
end
end
-- Parse the data parameters in the same order that the old {{infobox}} did, so
-- that references etc. will display in the expected places. Parameters that
-- depend on another parameter are only processed if that parameter is present,
-- to avoid phantom references appearing in article reference lists.
local function parseDataParameters()
preprocessSingleArg('autoheaders')
preprocessSingleArg('child')
preprocessSingleArg('bodyclass')
preprocessSingleArg('subbox')
preprocessSingleArg('bodystyle')
preprocessSingleArg('title')
preprocessSingleArg('titleclass')
preprocessSingleArg('titlestyle')
preprocessSingleArg('above')
preprocessSingleArg('aboveclass')
preprocessSingleArg('abovestyle')
preprocessArgs({
{prefix = 'subheader', depend = {'subheaderstyle', 'subheaderrowclass'}}
}, 10)
preprocessSingleArg('subheaderstyle')
preprocessSingleArg('subheaderclass')
preprocessArgs({
{prefix = 'image', depend = {'caption', 'imagerowclass'}}
}, 10)
preprocessSingleArg('captionstyle')
preprocessSingleArg('imagestyle')
preprocessSingleArg('imageclass')
preprocessArgs({
{prefix = 'header'},
{prefix = 'data', depend = {'label'}},
{prefix = 'rowclass'},
{prefix = 'rowstyle'},
{prefix = 'rowcellstyle'},
{prefix = 'class'}
}, 50)
preprocessSingleArg('headerclass')
preprocessSingleArg('headerstyle')
preprocessSingleArg('labelstyle')
preprocessSingleArg('datastyle')
preprocessSingleArg('below')
preprocessSingleArg('belowclass')
preprocessSingleArg('belowstyle')
preprocessSingleArg('name')
-- different behaviour for italics if blank or absent
args['italic title'] = origArgs['italic title']
preprocessSingleArg('decat')
preprocessSingleArg('templatestyles')
preprocessSingleArg('child templatestyles')
preprocessSingleArg('grandchild templatestyles')
end
-- If called via #invoke, use the args passed into the invoking template.
-- Otherwise, for testing purposes, assume args are being passed directly in.
function p.infobox(frame)
if frame == mw.getCurrentFrame() then
origArgs = frame:getParent().args
else
origArgs = frame
end
parseDataParameters()
return _infobox()
end
-- For calling via #invoke within a template
function p.infoboxTemplate(frame)
origArgs = {}
for k,v in pairs(frame.args) do origArgs[k] = mw.text.trim(v) end
parseDataParameters()
return _infobox()
end
return p
kueb5p6xeoq6x7bxu2zyyl7pmxgesrs
ᥛᥨᥝᥱ ᥓᥧᥰ:Footnotes
828
1223
7812
5515
2026-09-08T14:07:35Z
咽頭べさ
24
7812
Scribunto
text/plain
require('strict');
local getArgs = require ('Module:Arguments').getArgs;
--[[--------------------------< A R G S _ D E F A U L T >------------------------------------------------------
a table to specify initial values.
]]
local args_default = {
group = '',
bracket_left = '',
bracket_right = '',
bracket_year_left = '',
bracket_year_right = '',
postscript = '',
page = '',
pages = '',
location = '',
page_sep = ", p. ",
pages_sep = ", pp. ",
ref = '',
template = 'harv', -- if template name not provided in {{#invoke:}} use this
};
--[[--------------------------< T A R G E T _ C H E C K >------------------------------------------------------
look for anchor_id (CITEREF name-list and year or text from |ref=) in anchor_id_list
the 'no target' error may be suppressed with |ignore-err=yes when target cannot be found because target is inside
a template that wraps another template; 'multiple targets' error may not be suppressed
]]
local function target_check (anchor_id, args)
local namespace = mw.title.getCurrentTitle().namespace;
local anchor_id_list_module = mw.loadData ('Module:Footnotes/anchor_id_list');
local anchor_id_list = anchor_id_list_module.anchor_id_list;
local article_whitelist = anchor_id_list_module.article_whitelist;
local template_list = anchor_id_list_module.template_list;
local citeref_patterns = anchor_id_list_module.citeref_patterns
local whitelist_module = mw.loadData ('Module:Footnotes/whitelist');
local whitelist = whitelist_module.whitelist;
local tally = anchor_id_list[anchor_id]; -- nil when anchor_id not in list; else a tally
local msg;
local category;
if not tally then
if args.ignore then
return ''; -- if ignore is true then no message, no category
end
if article_whitelist and article_whitelist[anchor_id] then -- if an article-local whitelist and anchor ID is in it
return ''; -- done
end
local wl_anchor_id = anchor_id; -- copy to be modified to index into the whitelist
if args.year then -- for anchor IDs created by this template (not in |ref=) that have a date
if args.year:match ('%d%l$') or -- use the date value to determine if we should remove the disambiguator
args.year:match ('n%.d%.%l$') or
args.year:match ('nd%l$') then
wl_anchor_id = wl_anchor_id:gsub ('%l$', ''); -- remove the disambiguator
end
end
local t_tbl = whitelist[wl_anchor_id]; -- get list of templates associated with this anchor ID
if t_tbl then -- when anchor ID not whitelisted t_tbl is nil
for _, t in ipairs (t_tbl) do -- spin through the list of templates associated with this anchor ID
if template_list[t] then -- if associated template is found in the list of templates in the article
return ''; -- anchor ID is whitlisted and article has matching template so no error
end
end
end
for _, pattern in ipairs(citeref_patterns) do -- load patterns for wrapper templates on this page
if anchor_id:match(pattern) then -- spin through the special patterns and try to match
return ''
end
end
msg = 'no target: ' .. anchor_id; -- anchor_id not found
mw.log(msg)
if namespace == 10 and not args.show then -- do not generate error message in template namespace
return ''
end
category = '[[Category:Harv and Sfn no-target errors]]';
elseif 1 < tally then
msg = 'multiple targets (' .. tally .. '×): ' .. anchor_id; -- more than one anchor_id in this article
mw.log(msg)
if namespace == 10 and not args.show then -- do not generate error message in template namespace
return ''
end
category = 0 == namespace and '[[Category:Harv and Sfn multiple-target errors]]' or ''; -- only categorize in article space
return '<span class="error harv-error" style="display: inline; font-size:100%"> ' .. args.template .. ' error: ' .. msg .. ' ([[:Category:Harv and Sfn template errors|help]])</span>' .. category;
end
-- category = 0 == namespace and '[[Category:Harv and Sfn template errors]]' or ''; -- only categorize in article space
category = 0 == namespace and category or ''; -- only categorize in article space
-- display based on args.show (no display by default)
local display = args.show and 'inline' or 'none'
return msg and '<span class="error harv-error" style="display: '..display..'; font-size:100%"> ' .. args.template .. ' error: ' .. msg .. ' ([[:Category:Harv and Sfn template errors|help]])</span>' .. category or '';
end
--[[--------------------------< I S _ Y E A R >----------------------------------------------------------------
evaluates param to see if it is one of these forms with or without lowercase letter disambiguator:
YYYY
n.d.
nd
c. YYYY
YYYY–YYYY (separator is endash)
YYYY–YY (separator is endash)
return true when param has a recognized form; false else
]]
local patterns_date= {
'^%d%d%d%d?%l?$',
'^n%.d%.%l?$',
'^nd%l?$',
'^c%. %d%d%d%d?%l?$',
'^%d%d%d%d–%d%d%d%d%l?$',
'^%d%d%d%d–%d%d%l?$',
}
local function is_year (param, args)
args.year = ''; -- used for harv error;
for _, pattern in ipairs (patterns_date) do
if mw.ustring.match (param, pattern) then
args.year = param; -- used for harv error;
return true;
end
end
end
--[[--------------------------< C O R E >----------------------------------------------------------------------
returns an anchor link (CITEREF) formed from one to four author names, year, and insource location (|p=, |pp=, loc=)
]]
local function core( args )
local result;
local err_msg = ''
if args.P5 ~= '' then
if is_year (args.P5, args) then
result = table.concat ({args.P1, ' et al. ', args.bracket_year_left, args.P5, args.bracket_year_right});
else
args.P5 = ''; -- when P5 not a year don't include in anchor
result = table.concat ({args.P1, ' et al.'}); -- and don't render it
end
elseif args.P4 ~= '' then
if is_year (args.P4, args) then
result = table.concat ({args.P1, ', ', args.P2, ' & ', args.P3, ' ', args.bracket_year_left, args.P4, args.bracket_year_right}); -- three names and a year
else
result = table.concat ({args.P1, ' et al.'}); -- four names
end
elseif args.P3 ~= '' then
if is_year (args.P3, args) then
result = table.concat ({args.P1, ' & ', args.P2, ' ', args.bracket_year_left, args.P3, args.bracket_year_right}); -- two names and a year
else
result = table.concat ({args.P1, ', ', args.P2, ' ', ' & ', args.P3}); -- three names
end
elseif args.P2 ~= '' then
if is_year (args.P2, args) then
result = table.concat ({args.P1, ' ', args.bracket_year_left, args.P2, args.bracket_year_right}); -- one name and year
else
result = table.concat ({args.P1, ' & ', args.P2}); -- two names
end
else
result = args.P1; -- one name
end
-- when author-date result ends with a dot (typically when the last positional parameter holds 'n.d.')
-- and when no in-source location (no |p=, |pp=, or |loc=)
-- and when the first or only character in args.postscript is a dot
-- remove the author-date result trailing dot
-- the author-date result trailing dot will be replaced later with the content of args.postscript (usually a dot)
if ('.' == result:sub(-1)) and ('.' == args.postscript:sub(1)) and ('' == args.page) and ('' == args.pages) and ('' == args.location) then
result = result:gsub ('%.$', '');
end
if args.ref ~= 'none' then
local anchor_id;
if args.ref ~= '' then
anchor_id = mw.uri.anchorEncode (args.ref);
err_msg = target_check (anchor_id, args);
result = table.concat ({'[[#', anchor_id, '|', result, ']]'});
else
anchor_id = mw.uri.anchorEncode (table.concat ({'CITEREF', args.P1, args.P2, args.P3, args.P4, args.P5}));
err_msg = target_check (anchor_id, args);
result = table.concat ({'[[#', anchor_id, '|', result, ']]'});
end
end
if args.page ~= '' then
result = table.concat ({result, args.page_sep, args.page});
elseif args.pages ~= ''then
result = table.concat ({result, args.pages_sep, args.pages});
end
if args.location ~= '' then
result = table.concat ({result, ', ', args.location});
end
result = table.concat ({args.bracket_left, result, args.bracket_right, args.postscript}):gsub ('%s+', ' '); -- strip redundant spaces
return result .. err_msg;
end
--[[--------------------------< H Y P H E N _ T O _ D A S H >--------------------------------------------------
Converts a hyphen to a dash under certain conditions. The hyphen must separate
like items; unlike items are returned unmodified. These forms are modified:
letter - letter (A - B)
digit - digit (4-5)
digit separator digit - digit separator digit (4.1-4.5 or 4-1-4-5)
letterdigit - letterdigit (A1-A5) (an optional separator between letter and
digit is supported – a.1-a.5 or a-1-a-5)
digitletter - digitletter (5a - 5d) (an optional separator between letter and
digit is supported – 5.a-5.d or 5-a-5-d)
any other forms are returned unmodified.
str may be a comma- or semicolon-separated list
This code copied from Module:Citation/CS1. The only modification is to require Module:Citation/CS1/Utilities
so that it has access to the functions is_set() and has_accept_as_written()
]]
local function hyphen_to_dash( str )
local utilities = require ('Module:Citation/CS1/Utilities'); -- only modification so that this function has access to is_set() and has_accept_as_written()
if not utilities.is_set (str) then
return str;
end
local accept; -- Boolean
str = str:gsub ('&[nm]dash;', {['–'] = '–', ['—'] = '—'}); -- replace — and – entities with their characters; semicolon mucks up the text.split
str = str:gsub ('-', '-'); -- replace HTML numeric entity with hyphen character
str = str:gsub (' ', ' '); -- replace entity with generic keyboard space character
local out = {};
local list = mw.text.split (str, '%s*[,;]%s*'); -- split str at comma or semicolon separators if there are any
for _, item in ipairs (list) do -- for each item in the list
item, accept = utilities.has_accept_as_written (item); -- remove accept-this-as-written markup when it wraps all of item
if not accept and mw.ustring.match (item, '^%w*[%.%-]?%w+%s*[%-–—]%s*%w*[%.%-]?%w+$') then -- if a hyphenated range or has endash or emdash separators
if item:match ('^%a+[%.%-]?%d+%s*%-%s*%a+[%.%-]?%d+$') or -- letterdigit hyphen letterdigit (optional separator between letter and digit)
item:match ('^%d+[%.%-]?%a+%s*%-%s*%d+[%.%-]?%a+$') or -- digitletter hyphen digitletter (optional separator between digit and letter)
item:match ('^%d+[%.%-]%d+%s*%-%s*%d+[%.%-]%d+$') or -- digit separator digit hyphen digit separator digit
item:match ('^%d+%s*%-%s*%d+$') or -- digit hyphen digit
item:match ('^%a+%s*%-%s*%a+$') then -- letter hyphen letter
item = item:gsub ('(%w*[%.%-]?%w+)%s*%-%s*(%w*[%.%-]?%w+)', '%1–%2'); -- replace hyphen, remove extraneous space characters
else
item = mw.ustring.gsub (item, '%s*[–—]%s*', '–'); -- for endash or emdash separated ranges, replace em with en, remove extraneous whitespace
end
end
table.insert (out, item); -- add the (possibly modified) item to the output table
end
local temp_str = ''; -- concatenate the output table into a comma separated string
temp_str, accept = utilities.has_accept_as_written (table.concat (out, ', ')); -- remove accept-this-as-written markup when it wraps all of concatenated out
if accept then
temp_str = utilities.has_accept_as_written (str); -- when global markup removed, return original str; do it this way to suppress boolean second return value
return temp_str;
else
return temp_str; -- else, return assembled temp_str
end
end
--[[--------------------------< A R G S _ F E T C H >---------------------------------------------------------
Because all of the templates share a common set of parameters, a single common function to fetch those parameters
from frame and parent frame.
]]
local function args_fetch (frame, ps)
local args = args_default; -- create a copy of the default table
local pframe = frame:getParent(); -- point to the template's parameter table
for k, v in pairs (frame.args) do -- override defaults with values provided in the #invoke: if any
args[k] = v;
end
args.postscript = pframe.args.postscript or pframe.args.ps or ps;
if 'none' == args.postscript then
args.postscript = '';
end
args.group = pframe.args.group or '';
args.page = pframe.args.p or pframe.args.page or '';
args.pages = pframe.args.pp or pframe.args.pages or '';
args.pages = ('' ~= args.pages) and hyphen_to_dash (args.pages) or '';
args.location = pframe.args.at or pframe.args.loc or '';
args.ref = pframe.args.ref or pframe.args.Ref or '';
args.ignore = ('yes' == pframe.args['ignore-false-positive']) or ('yes' == pframe.args['ignore-err']);
for i, v in ipairs ({'P1', 'P2', 'P3', 'P4', 'P5'}) do -- loop through the five positional parameters and trim if set else empty string
args[v] = (pframe.args[i] and mw.text.trim (pframe.args[i])) or '';
end
if args.P5 and not is_year (args.P5, args) then
local i = 6; -- initialize the indexer to the sixth positional parameter
while pframe.args[i] do -- in case there are too many authors loop through the authors looking for a year
local v = mw.text.trim (pframe.args[i]); -- trim
if is_year (v, args) then -- if a year
args.P5 = v; -- overwrite whatever was in args.P5 with year
break; -- and abandon the search
end
i = i + 1; -- bump the indexer
end
end
return args;
end
--[[--------------------------< H A R V A R D _ C I T A T I O N >----------------------------------------------
common entry point for:
{{harvard citation}} aka {{harv}}
{{Harvard citation no brackets}} aka {{harvnb}}
{{harvcol}}
{{harvcolnb}}
{{harvcoltxt}}
{{Harvard citation text}} aka {{harvtxt}}
{{Harvp}}
Distinguishing features (brackets and page separators) are specified in this module's {{#invoke}} in the respective templates.
]]
local function harvard_citation (frame)
local args = args_fetch (frame, ''); -- get the template and invoke parameters; default postscript is empty string
return core (args);
end
--[[--------------------------< S T R I P _ U R L >------------------------------------------------------------
used by sfn() and sfnm(). This function fixes an issue with reference tooltip gadget where the tooltip is not displayed
when an insource locator (|p=, |pp=, |loc=) has an external wikilink that contains a # character
strip uri-reserved characters from urls in |p=, |pp-, and |loc= parameters The researved characters are:
!#$&'()*+,/:;=?@[]
]]
local function strip_url (pages)
local escaped_uri;
if not pages or ('' == pages) then
return pages;
end
for uri in pages:gmatch ('%[(%a[%w%+%.%-]*://%S+)') do -- for each external link get the uri
escaped_uri = uri:gsub ("([%(%)%.%%%+%-%*%?%[%^%$%]])", "%%%1" ); -- save a copy with lua pattern characters escaped
uri = uri:gsub ("[!#%$&'%(%)%*%+,/:;=%?@%[%]%.%%]", ''); -- remove reserved characters and '%' because '%20' (space character) is a lua 'invalid capture index'
pages = pages:gsub (escaped_uri, uri, 1); -- replace original uri with the stripped version
end
return pages;
end
--[[--------------------------< S F N >------------------------------------------------------------------------
entry point for {{sfn}} and {{sfnp}}
]]
local function sfn (frame)
local args = args_fetch (frame, '.'); -- get the template and invoke parameters; default postscript is a dot
local result = core (args); -- go make a CITEREF anchor
-- put it all together and then strip redundant spaces
local name = table.concat ({'FOOTNOTE', args.P1, args.P2, args.P3, args.P4, args.P5, strip_url (args.page), strip_url (args.pages), strip_url (args.location)}):gsub ('%s+', ' ');
return frame:extensionTag ({name='ref', args={group=args.group, name=name}, content=result});
end
--[[--------------------------< S F N M >----------------------------------------------------------------------
common entry point for {{sfnm}} and {{sfnmp}}
Distinguishing features (brackets) are specified in this module's {{#invoke}} in the respective templates.
]]
local function sfnm (frame)
local args = args_default; -- create a copy of the default table
local pframe = frame:getParent(); -- point to the template's parameter table
local n = 1; -- index of source; this is the 'n' in na1, ny, etc
local first_pnum = 1; -- first of a pair of positional parameters
local second_pnum = 2; -- second of a pair of positional parameters
local last_ps = 0; -- index of the last source with |nps= set
local last_index = 0; -- index of the last source; these used to determine which of |ps= or |nps= will terminate the whole rendering
local out = {}; -- table to hold rendered sources
local footnote = {'FOOTNOTE'}; -- all author, date, insource location stuff becomes part of the reference's footnote id; added as we go
for k, v in pairs (frame.args) do -- override defaults with values provided in the #invoke: if any
args[k] = v;
end
while true do
if not pframe.args[table.concat ({n, 'a1'})] and not pframe.args[first_pnum] then
break; -- no na1 or matching positional parameter so done
end
if pframe.args[table.concat ({n, 'a1'})] then -- does this source use named parameters?
for _, v in ipairs ({'P1', 'P2', 'P3', 'P4', 'P5'}) do -- initialize for this source
args[v] = '';
end
for i, v in ipairs ({'P1', 'P2', 'P3', 'P4', 'P5'}) do -- extract author and year parameters for this source
args[v] = pframe.args[table.concat ({n, 'a', i})] or ''; -- attempt to assign author name
if '' == args[v] then -- when there wasn't an author name
args[v] = pframe.args[table.concat ({n, 'y'})] or ''; -- attempt to assign year
break; -- done with author/date for this source
end
end
else -- this source uses positional parameters
args.P1 = mw.text.trim (pframe.args[first_pnum]); -- yes, only one author supported
args.P2 = (pframe.args[second_pnum] and mw.text.trim (pframe.args[second_pnum])) or ''; -- when positional author, year must also be positional
for _, v in ipairs ({'P3', 'P4', 'P5'}) do -- blank the rest of these for this source
args[v] = '';
end
first_pnum = first_pnum + 2; -- source must use positional author and positional year
second_pnum = first_pnum + 1; -- bump these for possible next positional source
end
args.postscript = pframe.args[table.concat ({n, 'ps'})] or '';
if 'none' == args.postscript then -- this for compatibility with other footnote templates; does nothing
args.postscript = '';
end
args.group = pframe.args.group or ''; -- reference group
args.ref = pframe.args[table.concat ({n, 'ref'})] or ''; -- alternate reference for this source
args.page = pframe.args[table.concat ({n, 'p'})] or ''; -- insource locations for this source
args.pages = pframe.args[table.concat ({n, 'pp'})] or '';
args.pages = ('' ~= args.pages) and hyphen_to_dash (args.pages) or '';
args.location = pframe.args[table.concat ({n, 'loc'})] or pframe.args[table.concat ({n, 'at'})] or '';
args.ignore = ('yes' == pframe.args[table.concat ({n, 'ignore-false-positive'})]) or ('yes' == pframe.args[table.concat ({n, 'ignore-err'})]);
table.insert (out, core (args)); -- save the rendering of this source
for k, v in ipairs ({'P1', 'P2', 'P3', 'P4', 'P5'}) do -- create the FOOTNOTE id
if '' ~= args[v] then
table.insert (footnote, args[v]);
end
end
for k, v in ipairs ({'page', 'pages', 'location'}) do -- these done separately so that we can strip uri-reserved characters from extlinked page numbers
if '' ~= args[v] then
table.insert (footnote, strip_url (args[v]))
end
end
last_index = n; -- flags used to select terminal postscript from nps or from end_ps
if '' ~= args.postscript then
last_ps = n;
end
n = n+1; -- bump for the next one
end
local name = table.concat (footnote):gsub ('%s+', ' '); -- put the footnote together and strip redundant space
args.end_ps = pframe.args.postscript or pframe.args.ps or '.'; -- this is the postscript for the whole not for the individual sources
if 'none' == args.end_ps then -- not an original sfnm parameter value; added for compatibility with other footnote templates
args.end_ps = '';
end
local result = table.concat ({table.concat (out, '; '), (last_index == last_ps) and '' or args.end_ps});
return frame:extensionTag ({name='ref', args={group=args.group, name=name}, content=result});
end
--[[--------------------------< S F N R E F >------------------------------------------------------------------
implements {{sfnref}}
]]
local function sfnref (frame)
local args = getArgs (frame);
local out = {};
for i=1, 5 do -- get the first five args if there are five args
if args[i] then
out[i] = args[i];
else
break; -- less than 5 args break out
end
end
if 5 == #out then -- when we have seen five args there may bemore
local i = 6; -- initialize the indexer to the sixth positional parameter
while args[i] do -- in case there are too many authors loop through the authors looking for a year
if is_year (args[i], args) then -- if a year
out[5] = args[i]; -- overwrite whatever was in args[5] with year
break; -- and abandon the search
end
i = i + 1; -- bump the indexer
end
end
return mw.uri.anchorEncode ('CITEREF' .. table.concat (out));
end
--[[--------------------------< E X P O R T E D F U N C T I O N S >------------------------------------------
]]
return {
harvard_citation = harvard_citation,
sfn = sfn,
sfnm = sfnm,
sfnref = sfnref,
target_check = target_check,
};
3ecgpqdblqy50cj0ke12x56x7g6qre8
ᥗᥦᥛᥰ ᥙᥣ ᥘᥥᥐᥳ:Langx
10
1377
7815
5892
2026-09-08T15:32:43Z
Pannawat Chayasuwankul
1263
/* */
7815
wikitext
text/x-wiki
<includeonly>{{#invoke:lang|ᥖᥭᥰ ᥘᥫᥴ}}</includeonly><noinclude>
{{Documentation}}
</noinclude>
en98urg40s0dn252pmbvp1u4plt98fq
7816
7815
2026-09-08T15:33:44Z
Pannawat Chayasuwankul
1263
/* */
7816
wikitext
text/x-wiki
<includeonly>{{#invoke:ᥖᥭᥰ ᥘᥫᥴ|lang}}</includeonly><noinclude>
{{Documentation}}
</noinclude>
di2n344b4ik2yq4817vg2r3z9m3xofa
7817
7816
2026-09-08T15:34:34Z
Pannawat Chayasuwankul
1263
/* */
7817
wikitext
text/x-wiki
<includeonly>{{#invoke:ᥖᥭᥰ Lang|langx}}</includeonly><noinclude>
{{Documentation}}
</noinclude>
dj7orrnh7406vk77514adpn9nsmaglr
7818
7817
2026-09-08T15:35:47Z
Pannawat Chayasuwankul
1263
/* */
7818
wikitext
text/x-wiki
<includeonly>{{#invoke:Lang|langx}}</includeonly><noinclude>
{{Documentation}}
</noinclude>
281t45xpns7vwxn64x5wb34jyt9gqeq
ᥛᥨᥝᥱ ᥓᥧᥰ:Infobox mapframe
828
1412
7808
6568
2026-09-08T13:57:21Z
咽頭べさ
24
7808
Scribunto
text/plain
local mf = require('Module:Mapframe')
local getArgs = require('Module:Arguments').getArgs
local yesno = require('Module:Yesno')
local infoboxImage = require('Module:InfoboxImage').InfoboxImage
-- Defaults
local DEFAULT_FRAME_WIDTH = "270"
local DEFAULT_FRAME_HEIGHT = "200"
local DEFAULT_ZOOM = 10
local DEFAULT_GEOMASK_STROKE_WIDTH = "1"
local DEFAULT_GEOMASK_STROKE_COLOR = "#777777"
local DEFAULT_GEOMASK_FILL = "#888888"
local DEFAULT_GEOMASK_FILL_OPACITY = "0.25"
local DEFAULT_SHAPE_STROKE_WIDTH = "2"
local DEFAULT_SHAPE_STROKE_COLOR = "#FF0000"
local DEFAULT_SHAPE_FILL = "#606060"
local DEFAULT_SHAPE_FILL_OPACITY = "0.1"
local DEFAULT_LINE_STROKE_WIDTH = "5"
local DEFAULT_LINE_STROKE_COLOR = "#FF0000"
local DEFAULT_MARKER_COLOR = "#5E74F3"
local util = {}
function util.noop(info)
local DEFAULT_NOOP_OUTPUT = ""
-- uncomment this when debugging
-- DEFAULT_NOOP_OUTPUT = "debug: mapframe no-op: " .. info
-- mw.log(DEFAULT_NOOP_OUTPUT)
return DEFAULT_NOOP_OUTPUT
end
-- Trim whitespace from args, and remove empty args
function util.trimArgs(argsTable)
local cleanArgs = {}
for key, val in pairs(argsTable) do
if type(val) == 'string' then
val = val:match('^%s*(.-)%s*$')
if val ~= '' then
cleanArgs[key] = val
end
else
cleanArgs[key] = val
end
end
return cleanArgs
end
function util.getBestStatement(item_id, property_id)
if not(item_id) or not(mw.wikibase.isValidEntityId(item_id)) or not(mw.wikibase.entityExists(item_id)) then
return false
end
local statements = mw.wikibase.getBestStatements(item_id, property_id)
if not statements or #statements == 0 then
return false
end
local hasNoValue = ( statements[1].mainsnak and statements[1].mainsnak.snaktype == 'novalue' )
if hasNoValue then
return false
end
return statements[1]
end
function util.hasWikidataProperty(item_id, property_id)
return util.getBestStatement(item_id, property_id) and true or false
end
function util.getStatementValue(statement)
return statement and statement.mainsnak and statement.mainsnak.datavalue and statement.mainsnak.datavalue.value or nil
end
function util.relatedEntity(item_id, property_id)
local value = util.getStatementValue( util.getBestStatement(item_id, property_id) )
return value and value.id or false
end
function util.idType(id)
if not id then
return nil
elseif mw.ustring.match(id, "[Pp]%d+") then
return "property"
elseif mw.ustring.match(id, "[Qq]%d+") then
return "item"
else
return nil
end
end
function util.shouldAutoRun(frame)
-- Check if should be running
local pargs = frame.getParent(frame).args
local explicitlyOn = yesno(mw.text.trim(pargs.mapframe or "")) -- true of false or nil
if pargs.coordinates == "{{{coordinates}}}" then explicitlyOn = false end
if type(pargs.coordinates) == 'string' and string.match(pargs.coordinates, 'coord.missing') then explicitlyOn = false end
local onByDefault = (explicitlyOn == nil) and yesno(mw.text.trim(frame.args.onByDefault or ""), false) -- true or false
return explicitlyOn or onByDefault
end
function util.argsFromAuto(frame)
-- Get args from the frame (invoke call) and the parent (template call).
-- Frame arguments are default values which are overridden by parent values
-- when both are present
local args = getArgs(frame, {parentFirst = true})
-- Discard args not prefixed with "mapframe-", remove that prefix from those that remain
local fixedArgs = {}
for name, val in pairs(args) do
local fixedName = string.match(name, "^mapframe%-(.+)$" )
if fixedName then
fixedArgs[fixedName] = val
-- allow coord, coordinates, etc to be unprefixed
elseif name == "coordinates" or name == "coord" or name == "coordinate" and not fixedArgs.coord then
fixedArgs.coord = val
-- allow id, qid to be unprefixed, map to id (if not already present)
elseif name == "id" or name == "qid" and not fixedArgs.id then
fixedArgs.id = val
-- allow captionstyle to be unprefixed, for compatibility with [[Module:Infobox]]
elseif name == "captionstyle" and not fixedArgs.captionstyle then
fixedArgs.captionstyle = val
end
end
return fixedArgs
end
function util.parseCustomWikitext(customWikitext)
-- infoboxImage will format an image if given wikitext containing an
-- image, or else pass through the wikitext unmodified
return infoboxImage({
args = {
image = customWikitext
}
})
end
function util.trackAndWarn(trackingCat, warning)
local title = mw.title.getCurrentTitle()
local results = title and title.namespace == 0 and trackingCat and '[[Category:'..trackingCat..']]' or ''
if warning then
local warn = require('Module:If preview')._warning
results = results..warn({warning})
end
return results
end
function util.ternary(flag, other)
other = other or 'other'
flag = flag == 'none' and 'no' or flag
local yesNoOut = yesno(flag,other)
local yes = (yesNoOut == true)
local no = (yesNoOut == false)
return yes, no
end
local p = {}
p._caption = function(args)
if args.caption then
return args.caption
elseif args.switcher then
return util.noop("no caption or switcher")
end
local maskItem
local maskType = util.idType(args.geomask)
if maskType == 'item' then
maskItem = args.geomask
elseif maskType == "property" then
maskItem = util.relatedEntity(args.id or mw.wikibase.getEntityIdForCurrentPage(), args.geomask)
end
local maskItemLabel = maskItem and mw.wikibase.getLabel( maskItem )
return maskItemLabel and "Location in "..maskItemLabel
or util.noop("missing maskItemLabel with type " .. (maskType or "nil") .. " and item " .. (maskItem or "nil"))
end
--A list of types for objects that are too small to allow Kartographer to take over zoom
local tinyType = {
landmark=true,
railwaystation=true,
edu=true,
pass=true,
camera=true
}
p._main = function(_config)
-- accumulate tracking cats
local tracking = ''
-- `config` is the args passed to this module
local config = util.trimArgs(_config)
-- allow alias for config.coord
config.coord = config.coord or config.coordinates
-- Require wikidata item, or specified coords
local wikidataId = config.id or mw.wikibase.getEntityIdForCurrentPage()
if not(wikidataId) and not(config.coord) then
return false, util.trackAndWarn('Pages using infobox mapframe with missing coordinates')
end
-- Require coords (specified or from wikidata), so that map will be centred somewhere
-- (P625 = coordinate location)
local wdCoordinates = util.getStatementValue(util.getBestStatement(wikidataId, 'P625'))
if not (config.coord or wdCoordinates) then
return false, util.trackAndWarn('Pages using infobox mapframe with missing coordinates')
end
-- `args` is the arguments which will be passed to the mapframe module
local args = {}
-- Some defaults/overrides for infobox presentation
args.display = "inline"
args.frame = "yes"
args.plain = "yes"
args["frame-width"] = config["frame-width"] or config.width or DEFAULT_FRAME_WIDTH
args["frame-height"] = config["frame-height"] or config.height or DEFAULT_FRAME_HEIGHT
args["frame-align"] = "center"
args["frame-coord"] = config["frame-coordinates"] or config["frame-coord"]
-- Note: config["coordinates"] or config["coord"] should not be used for the alignment of the frame;
-- see talk page ( https://en.wikipedia.org/wiki/Special:Diff/876492931 )
-- deprecated lat and long parameters
args["frame-lat"] = config["frame-lat"] or config["frame-latitude"]
args["frame-long"] = config["frame-long"] or config["frame-longitude"]
-- if zoom isn't specified from config, first check wikidata
local zoom = config.zoom or util.getStatementValue(util.getBestStatement(wikidataId, 'P6592'))
if not zoom then
-- Calculate zoom from length or area (converted to km or km2)
-- Zoom so that length or area is completely included in mapframe
local getZoom = require('Module:Infobox dim')._zoom
zoom = getZoom({length_km=config.length_km, length_mi=config.length_mi,
width_km=config.width_km, width_mi=config.width_mi,
area_km2=config.area_km2, area_mi2=config.area_mi2,
area_ha=config.area_ha, area_acre=config.area_acre,
type=config.type, population=config.population,
viewport_px=math.min(args["frame-width"],args["frame-height"]),
latitude=wdCoordinates and wdCoordinates.latitude})
end
args.zoom = zoom or DEFAULT_ZOOM
-- Use OSM relation ID if available; otherwise use geoshape if that is available
-- (geoshape is required for defunct entities, which are outside OSM's scope)
local hasOsmRelationId = util.hasWikidataProperty(wikidataId, 'P402') -- P402 is OSM relation ID
local hasGeoshape = util.hasWikidataProperty(wikidataId, 'P3896') -- P3896 is geoshape
local wikidataProvidesGeo = hasOsmRelationId or hasGeoshape
-- determine marker argument value, determine whether to show marker
local forcePoint, suppressPoint = util.ternary(config.point)
local forceMarker, suppressMarker = util.ternary(config.marker,true)
forcePoint = forcePoint or forceMarker
suppressPoint = suppressPoint or suppressMarker
local showMarker = not suppressPoint and (forcePoint or not wikidataProvidesGeo or config.coord)
-- wikidata = "yes" turns on both shape and line
-- wikidata = "no" turns off both shape and line
-- otherwise show both if wikidata provides geo
local forceWikidata, suppressWikidata = util.ternary(config.wikidata)
local showShape = not suppressWikidata and (forceWikidata or wikidataProvidesGeo or not config.coord)
local showLine = showShape
-- determine shape parameter value, determine whether to show or suppress shape
-- also determine whether to invert shape
local forceShape, suppressShape = util.ternary(config.shape)
showShape = wikidataId and not suppressShape and (forceShape or showShape)
local shapeType = config.shape == 'inverse' and 'shape-inverse' or 'shape'
-- determine line parameter value, determine whether to show or suppress line
local forceLine, suppressLine = util.ternary(config.line)
showLine = wikidataId and not suppressLine and (forceLine or showLine)
local maskItem
-- Switcher
if config.switcher == "zooms" then
-- switching between zoom levels
local maxZoom = math.max(tonumber(args.zoom), 3) -- what zoom would have otherwise been (if 3 or more, otherwise 3)
local minZoom = 1 -- completely zoomed out
local midZoom = math.floor((maxZoom + minZoom)/2) -- midway between maxn and min
args.switch = "zoomed in, zoomed midway, zoomed out"
args.zoom = string.format("SWITCH:%d,%d,%d", maxZoom, midZoom, minZoom)
elseif config.switcher == "auto" then
-- switching between P276 and P131 areas with recursive lookup, e.g. item's city,
-- that city's state, and that state's country
args.zoom = nil -- let kartographer determine the zoom
local maskLabels = {}
local maskItems = {}
local maskItemId = util.relatedEntity(wikidataId, "P276") or util.relatedEntity(wikidataId, "P131")
local maskLabel = mw.wikibase.getLabel(maskItemId)
while maskItemId and maskLabel and mw.text.trim(maskLabel) ~= "" do
table.insert(maskLabels, maskLabel)
table.insert(maskItems, maskItemId)
maskItemId = maskItemId and util.relatedEntity(maskItemId, "P131")
maskLabel = maskItemId and mw.wikibase.getLabel(maskItemId)
end
if #maskLabels > 1 then
args.switch = table.concat(maskLabels, "###")
maskItem = "SWITCH:" .. table.concat(maskItems, ",")
elseif #maskLabels == 1 then
maskItem = maskItemId[1]
end
elseif config.switcher == "geomasks" and config.geomask then
-- switching between items in geomask parameter
args.zoom = nil -- let kartographer determine the zoom
local separator = (mw.ustring.find(config.geomask, "###", 0, true ) and "###") or
(mw.ustring.find(config.geomask, ";", 0, true ) and ";") or ","
local pattern = "%s*"..separator.."%s*"
local maskItems = mw.text.split(mw.ustring.gsub(config.geomask, "SWITCH:", ""), pattern)
local maskLabels = {}
if #maskItems > 1 then
for i, item in ipairs(maskItems) do
table.insert(maskLabels, mw.wikibase.getLabel(item))
end
args.switch = table.concat(maskLabels, "###")
maskItem = "SWITCH:" .. table.concat(maskItems, ",")
end
end
-- resolve geomask item id (if not using geomask switcher)
if not maskItem then --
local maskType = util.idType(config.geomask)
if maskType == 'item' then
maskItem = config.geomask
elseif maskType == "property" then
maskItem = util.relatedEntity(wikidataId, config.geomask)
end
end
-- if asking for shape or line from Wikidata
-- and if Wikidata actually has shape/line data (wikidataProvidesGeo=true)
-- and if no geomask
-- and if zoom not explicitly set
-- and if the object size inferred from its type is not too small
-- then let Kartographer "take over" zoom
if (showLine or showShape) and wikidataProvidesGeo and not maskItem
and not config.zoom and not (config.type and tinyType[config.type]) then
args.zoom = nil
end
if not maskItem and not showShape and not showLine and not showMarker then
return false, util.trackAndWarn('Pages using infobox mapframe with no geometry','No geometry specified for mapframe')
end
-- Keep track of arg numbering
local argNumber = ''
local function incrementArgNumber()
if argNumber == '' then
argNumber = 2
else
argNumber = argNumber + 1
end
end
-- Geomask
if maskItem then
args["type"..argNumber] = "shape-inverse"
args["id"..argNumber] = maskItem
args["stroke-width"..argNumber] = config["geomask-stroke-width"] or DEFAULT_GEOMASK_STROKE_WIDTH
args["stroke-color"..argNumber] = config["geomask-stroke-color"] or config["geomask-stroke-colour"] or DEFAULT_GEOMASK_STROKE_COLOR
args["fill"..argNumber] = config["geomask-fill"] or DEFAULT_GEOMASK_FILL
args["fill-opacity"..argNumber] = config["geomask-fill-opacity"] or DEFAULT_SHAPE_FILL_OPACITY
-- Let kartographer determine zoom and position, unless it is explicitly set in config
if not config.zoom and not config.switcher then
args.zoom = nil
args["frame-coord"] = nil
args["frame-lat"] = nil
args["frame-long"] = nil
local maskArea = util.getStatementValue( util.getBestStatement(maskItem, 'P2046') )
end
incrementArgNumber()
-- Hack to fix phab:T255932
if not args.zoom then
args["type"..argNumber] = "line"
args["id"..argNumber] = maskItem
args["stroke-width"..argNumber] = 0
incrementArgNumber()
end
end
-- Shape (or shape-inverse)
if showShape then
args["type"..argNumber] = shapeType
if hasGeoshape and not hasOsmRelationId then
args["from"..argNumber] = string.sub( util.getStatementValue( util.getBestStatement(wikidataId, 'P3896') ), 6)
elseif config.id then
args["id"..argNumber] = config.id
end
args["stroke-width"..argNumber] = config["shape-stroke-width"] or config["stroke-width"] or DEFAULT_SHAPE_STROKE_WIDTH
args["stroke-color"..argNumber] = config["shape-stroke-color"] or config["shape-stroke-colour"] or config["stroke-color"] or config["stroke-colour"] or DEFAULT_SHAPE_STROKE_COLOR
args["fill"..argNumber] = config["shape-fill"] or DEFAULT_SHAPE_FILL
args["fill-opacity"..argNumber] = config["shape-fill-opacity"] or DEFAULT_SHAPE_FILL_OPACITY
incrementArgNumber()
end
-- Line
if showLine then
args["type"..argNumber] = "line"
if hasGeoshape and not hasOsmRelationId then
args["from"..argNumber] = string.sub( util.getStatementValue( util.getBestStatement(wikidataId, 'P3896') ), 6)
elseif config.id then
args["id"..argNumber] = config.id
end
args["stroke-width"..argNumber] = config["line-stroke-width"] or config["stroke-width"] or DEFAULT_LINE_STROKE_WIDTH
args["stroke-color"..argNumber] = config["line-stroke-color"] or config["line-stroke-colour"] or config["stroke-color"] or config["stroke-colour"] or DEFAULT_LINE_STROKE_COLOR
incrementArgNumber()
end
-- Point marker
if showMarker then
args["type"..argNumber] = "point"
if config.id then args["id"..argNumber] = config.id end
if config.coord then args["coord"..argNumber] = config.coord end
if config.marker then args["marker"..argNumber] = config.marker end
args["marker-color"..argNumber] = config["marker-color"] or config["marker-colour"] or DEFAULT_MARKER_COLOR
incrementArgNumber()
end
-- if Wikidata doesn't link to OSM and the map has no mask or point,
-- then center the map on the coordinates either from the infobox or from wikidata
if not maskItem and not showMarker and not wikidataProvidesGeo then
if config.coord then
args["frame-coord"] = args["frame-coord"] or config.coord
else
args["frame-lat"] = args["frame-lat"] or wdCoordinates.latitude
args["frame-long"] = args["frame-long"] or wdCoordinates.longitude
end
tracking = tracking..util.trackAndWarn('Pages using infobox mapframe with forced centering')
end
-- protect against nil frame arguments
args["frame-coord"] = args["frame-coord"] or ""
args["frame-lat"] = args["frame-lat"] or ""
args["frame-long"] = args["frame-long"] or ""
local mapframe = args.switch and mf.multi(args) or mf._main(args)
tracking = tracking..((showLine or showShape) and not wikidataProvidesGeo
and util.trackAndWarn('Pages using infobox mapframe without shape links in Wikidata')
or '')
return true, mapframe.. tracking
end
-- Entry points
p.main = function(frame)
local parent = frame.getParent(frame)
local parentArgs = parent.args
local _, mapframe = p._main(parentArgs)
return frame:preprocess(mapframe)
end
p.auto = function(frame)
if not util.shouldAutoRun(frame) then
return util.noop("auto should not autorun")
end
local args = util.argsFromAuto(frame)
if args.custom then
return frame:preprocess(util.parseCustomWikitext(args.custom))
end
local _, mapframe = p._main(args)
return frame:preprocess(mapframe)
end
p.autocaption = function(frame)
if not util.shouldAutoRun(frame) then
return util.noop("autocaption should not autorun")
end
local args = util.argsFromAuto(frame)
local caption = p._caption(args)
return caption
end
p.autoWithCaption = function(frame)
if not util.shouldAutoRun(frame) then
return util.noop("autoWithCaption should not autorun")
end
local args = util.argsFromAuto(frame)
local wikitext
local caption
local ok
if args.custom then
ok = true
wikitext = util.parseCustomWikitext(args.custom)
else
ok, wikitext = p._main(args)
end
if not ok then return wikitext end
wikitext = frame:preprocess(wikitext)
caption = p._caption(args)
local data = mw.html.create():wikitext(wikitext)
data:tag('div')
:addClass('infobox-caption')
:cssText(args.captionstyle)
:wikitext(caption)
return tostring(data)
end
return p
j3zvodfabfeomv2k16qsy32uujgrrlu
ᥛᥨᥝᥱ ᥓᥧᥰ:Infobox/styles.css
828
1462
7806
6512
2026-09-08T13:54:42Z
咽頭べさ
24
7806
sanitized-css
text/css
/* {{pp|small=y}} */
/*
* This TemplateStyles sheet deliberately does NOT include the full set of
* infobox styles. We are still working to migrate all of the manual
* infoboxes. See [[MediaWiki talk:Common.css/to do#Infobox]]
* DO NOT ADD THEM HERE
*/
/* NOTE: This is maintained both here and in [[MediaWiki:Common.css]] until migration is complete.
* Starting with bare minimum for the benefit of [[mw:Manual:Safemode]]. */
@media (min-width: 640px) {
.infobox {
/* @noflip */
margin-left: 1em;
/* @noflip */
float: right;
/* @noflip */
clear: right;
width: 22em;
}
}
/*
* not strictly certain these styles are necessary since the modules now
* exclusively output infobox-subbox or infobox, not both
* just replicating the module faithfully
*/
.infobox-subbox {
padding: 0;
border: none;
margin: -3px;
width: auto;
min-width: 100%;
font-size: 100%;
clear: none;
float: none;
background-color: transparent;
color:inherit;
}
.infobox-3cols-child {
margin: -3px;
}
.infobox .navbar {
font-size: 100%;
}
/* remove when infobox is not a table anymore */
.infobox-hiddenrow,
/* we mean it, Minerva. but also Vector 2022 in the future at some point */
body.skin--responsive.skin--responsive .infobox .infobox-hiddenrow {
display: none;
}
/* Dark theme: [[William Wragg]], [[Coral Castle]] */
@media screen {
html.skin-theme-clientpref-night .infobox-full-data:not(.notheme) > div:not(.notheme)[style] {
background: #1f1f23 !important;
/* switch with var( --color-base ) when supported. */
color: #f8f9fa;
}
}
@media screen and (prefers-color-scheme: dark) {
html.skin-theme-clientpref-os .infobox-full-data:not(.notheme) > div:not(.notheme)[style] {
background: #1f1f23 !important;
/* switch with var( --color-base ) when supported. */
color: #f8f9fa;
}
}
/* Since infobox is a table, many infobox templates take advantage of this to
* add columns and rows to the infobox itself rather than as part of a new table
* inside them. This class should be discouraged and removed on the long term,
* but allows us to at least identify these tables going forward
* Currently in use on: [[Module:Infobox3cols]]
* Fixes issue described in [[phab:F55300125]] on Vector 2022.
*/
@media (min-width: 640px) {
body.skin--responsive .infobox-table {
display: table !important;
}
body.skin--responsive .infobox-table > caption {
display: table-caption !important;
}
body.skin--responsive .infobox-table > tbody {
display: table-row-group;
}
body.skin--responsive .infobox-table th,
body.skin--responsive .infobox-table td {
padding-left: inherit;
padding-right: inherit;
}
}
bi1nsztkx4350a55cuzjhaotvp5h216
ᥝᥥᥒᥰ ᥛᥫᥒᥰ ᥑᥩᥢᥴ
0
2561
7796
7790
2026-09-08T13:33:04Z
咽頭べさ
24
7796
wikitext
text/x-wiki
{{Infobox settlement
| name = ᥓᥥ ᥝᥥᥒᥰ ᥛᥫᥒᥰ ᥑᥩᥢᥴ
| native_name = 芒市
| native_name_lang = zh
| translit_lang1 = ᥖᥣᥒᥱ ᥕᥣᥒᥱ
| translit_lang1_type2 = [[ᥚᥤᥢ ᥕᥤᥢ]]
| translit_lang1_info2 = {{transl|zh|Mángshì}}
| translit_lang1_type3 = [[ᥑᥣᥛᥰ ᥖᥭᥰ ᥘᥫᥴ|ᥖᥭᥰ ᥘᥫᥴ]]
| translit_lang1_info3 = {{TaiLe|ᥝᥥᥒᥰ ᥛᥫᥒᥰ ᥑᥩᥢᥴ}}
| translit_lang1_type4 = [[ᥑᥣᥛᥰ ᥓᥤᥢᥰ ᥚᥨᥝ|ᥓᥥᥢᥰ ᥚᥨᥝ]]
| translit_lang1_info4 = {{lang|kac|Mangshi Myu}}
| translit_lang1_type5 = [[ᥑᥣᥛᥰ ᥛᥣᥢ|မြန်မာ]]
| translit_lang1_info5 = {{lang|my|မန်စီ}}
| translit_lang1_type6 = [[ᥑᥣᥛᥰ ᥗᥭᥰ|ไทย]]
| translit_lang1_info6 = {{lang|th|เมืองขอน}}
| settlement_type = [[ᥑᥐᥴ ᥓᥢᥳ ᥓᥥ ᥝᥥᥒᥰ]]
| image_skyline = {{multiple image
|border = infobox
|total_width = 280px
|image_style = border:1;
|perrow = 1/2/2
|image1 = 芒市天际线 - 2024-05-27 全景图.jpg
|caption1 = ᥖᥣᥒᥰ ᥞᥢᥴ ᥛᥫᥒᥰ
|image2 = 菩提寺 - 2023-07-30.jpg
|caption2 = [[Puti Temple|ᥝᥖ ᥚᥨᥝᥰ ᥗᥤᥳ]]
|image3 = 勐焕大金塔01.jpg
|caption3 = ᥐᥩᥒᥰ ᥛᥧᥰ ᥛᥫᥒᥰ ᥑᥩᥢᥴ
|image4 = 芒市广场-中缅友谊馆.jpg
|caption4 = ᥝᥣᥒᥰ ᥐᥣᥒ ᥝᥥᥒᥰ
|image5 = 芒市小礼堂 - 正立面 - 2025-05-14 01.jpg
|caption5 = ᥗᥨᥒᥴ ᥘᥩᥭᥳ ᥛᥣᥒᥴ ᥔᥪᥲ
}}
| etymology =
| nickname = ᥛᥣᥒᥲ ᥔᥪᥲ, ᥛᥫᥒᥰ ᥑᥩᥢᥴ
| image_map = 芒市位置图.svg
| map_alt =
| map_caption = ᥟᥩᥒᥲ ᥖᥒᥲ ᥕᥧᥱ ᥘᥭᥲ ᥟᥪᥒᥱ ᥖᥬᥲ ᥑᥨᥒᥰ ᥛᥫᥒᥰ ᥕᥤᥢᥳ ᥢᥣᥢᥳ
| pushpin_map = Yunnan#China
| pushpin_label_position =
| pushpin_map_caption = ᥖᥒᥲ ᥖᥤ ᥕᥧᥱ ᥘᥬᥰ ᥕᥤᥢᥳ ᥢᥣᥢᥳ ᥔᥫᥢᥰ
| pushpin_mapsize = 250
| coordinates = {{coord|24.4337|N|98.5881|E|type:adm3rd_region:CN-53_source:Gaode|format=dms|display=it}}
| subdivision_type = ᥖᥫᥒᥰ ᥐᥣᥰ
| subdivision_name = ᥛᥫᥒᥰ ᥑᥥᥱ
| subdivision_type1 = [[ᥕᥤᥢᥳ ᥢᥣᥢᥳ ᥖᥫᥒᥰ ᥓᥧᥒ ᥐᥨᥝᥲ|ᥕᥤᥢᥳ ᥢᥣᥢᥳ]]
| subdivision_name1 = [[ᥕᥤᥢᥳ ᥢᥣᥢᥳ]]
| subdivision_type2 = [[Autonomous Prefecture|ᥟᥪᥒᥱ ᥙᥪᥴ ᥓᥝᥲ ᥙᥩᥒ]]
| subdivision_name2 = [[ᥟᥪᥒᥱ ᥙᥪᥴ ᥓᥝᥲ ᥙᥩᥒ ᥛᥥᥝᥰ ᥖᥭᥰ ᥓᥤᥢᥰ ᥚᥨᥝ ᥖᥬᥲ ᥑᥨᥒᥰ|ᥖᥬᥲ ᥑᥨᥒᥰ]]
| established_title = ᥕᥧᥱ ᥔᥣᥒᥲ ᥔᥝᥰ
| established_date = 1996
| seat_type =
| leader_party =
| leader_title =
| leader_name =
| leader_title1 =
| leader_name1 =
| unit_pref = Metric
| area_footnotes = <ref name="李赪">{{cite book |author=Li Cheng (李赪) |date=2012 |script-title=zh:《云南统计年鉴2017》 |trans-title=Statistical Yearbook of Yunnan 2017 |language=zh |location=[[Beijing]] |publisher=China Statistics Press |isbn=978-7-5037-8267-1}}</ref>{{rp|536}}
| area_total_km2 = 2,900.91
| area_land_km2 =
| area_water_km2 =
| area_urban_km2 =
| area_rural_km2 =
| area_metro_km2 =
| elevation_m = 933
| population_as_of = ᥞᥨᥝᥴ ᥐᥨᥢᥰ ᥘᥤ 2020
| population_footnotes = <ref>{{cite web |url = https://www.dh.gov.cn/xfj/Web/_F0_0_28D00DG2L64LWETWAFAVT53M5R.htm?eqid=c243d99c00008f5900000006646e8f9a |title = 德宏州第七次全国人口普查主要数据公报 |publisher = Government of Dehong Prefecture |language = zh |date = 2021-06-11 }}{{Dead link|date= ᥘᥫᥢ ᥔᥤᥙᥴ ᥔᥩᥒᥴ 2024 |bot=InternetArchiveBot |fix-attempted=yes }}</ref>
| population_total = 439931
| population_density_km2 = auto
| population_note =
| population_demonym =
| timezone1 = [[ᥘᥐᥴ ᥟᥣ ᥑᥤᥒᥱ ᥖᥫᥒᥰ ᥛᥫᥒᥰ ᥑᥥᥱ]]
| utc_offset1 = +8
| postal_code_type = [[List of postal codes in China| ᥛᥣᥭᥴ ᥑᥨᥖᥳ]]
| postal_code = 678400
| area_code_type = [[Telephone numbers in China|ᥛᥣᥭᥴ ᥜᥨᥒᥰ]]
| area_code = (0)692
| iso_code =
| website = {{URL|www.dhms.gov.cn}}
| footnotes =
}}
'''ᥛᥣᥒᥲ ᥔᥪᥲ''' ({{zh|c=芒市|w=Mangshih}}; {{langx|tdd|ᥝᥥᥒᥰ ᥛᥫᥒᥰ ᥑᥩᥢᥴ}}; [[ᥑᥣᥛᥰ ᥑᥣᥒᥴ|ᥑᥣᥒᥴ]]: {{lang|kac|Mangshi Myu}}), ᥛᥝᥱ ᥘᥢᥳ ᥓᥪ ᥖᥥᥛ ᥘᥧᥲ ᥔᥪ({{zh|labels=no |c=潞西}}; Luxi)<ref name = "Name Change">{{cite web | url = http://www.yn.xinhuanet.com/newscenter/2010-07/23/content_20421088.htm| archive-url = https://web.archive.org/web/20100725204847/http://www.yn.xinhuanet.com/newscenter/2010-07/23/content_20421088.htm| url-status = dead| archive-date = 25 July 2010| script-title=zh:国务院正式批复同意潞西更名为芒市| publisher = Yunnan Xinhua | language = zh| date = 2010-07-23| access-date = 2010-12-04 }}</ref> ᥞᥪᥴ ᥛᥫᥒᥰ ᥑᥩᥢᥴ({{langx|tdd|ᥛᥫᥒᥰ ᥑᥩᥢᥴ}}) ᥙᥥᥢ[[ᥓᥥ ᥝᥥᥒᥰ ᥑᥐ ᥟᥪᥒᥱ]]<nowiki/>ᥖᥒᥰ ᥟᥩᥒᥲ ᥐᥣᥢ ᥔᥨᥢᥴ ᥟᥨᥙ ᥙᥫᥒᥱ ᥘᥬᥰ[[ᥟᥪᥒᥱ ᥙᥪᥴ ᥓᥝᥲ ᥙᥩᥒ ᥛᥥᥝᥰ ᥖᥭᥰ ᥓᥤᥒ ᥚᥨᥝ ᥖᥬᥲ ᥑᥨᥒᥰ]] [[ᥕᥤᥢᥳ ᥢᥣᥢᥳ]] [[ᥛᥫᥒᥰ ᥑᥥᥱ|ᥖᥫᥒᥰ ᥓᥧᥒ ᥐᥨᥝᥲ]] ᥛᥤᥰ ᥘᥣᥭᥴ ᥖᥤ ᥞᥨᥛ ᥛᥤᥰ ᥙᥧᥢᥳ ᥖᥤ ᥟᥩᥒᥲ ᥛᥫᥒᥰ <ref name="芒市市情概况">{{cite web |url=http://www.dhms.gov.cn/Web/_F0_0_28D07CK7UV2M5AHV1CLAQHL4VS.htm |script-title=zh:芒市市情概况 |trans-title=Overview of Mangshi |date=2016-06-29 |website=www.dhms.gov.cn |publisher=Mangshi government |access-date=2018-08-03 |language=zh |archive-date=2020-10-22 |archive-url=https://web.archive.org/web/20201022225408/http://www.dhms.gov.cn/Web/_F0_0_28D07CK7UV2M5AHV1CLAQHL4VS.htm |url-status=dead }}</ref> ᥓᥧᥛᥰ ᥟᥣ ᥛᥥᥝᥰ ᥖᥤ ᥘᥐᥴ ᥘᥬᥰ ᥛᥫᥒᥰ ᥘᥭᥲ ᥙᥥᥢ [[ᥟᥣ ᥛᥥᥝᥰ ᥑᥥᥱ]] [[ᥟᥣ ᥛᥥᥝᥰ ᥖᥭᥰ]] ᥖᥤ ᥘᥐᥴ ᥙᥥᥢ [[ᥖᥭᥰ ᥘᥫᥴ|ᥟᥣ ᥛᥥᥝᥰ ᥖᥭᥰ ᥘᥫᥴ]] ᥖᥒᥰ [[ᥟᥣ ᥛᥥᥝᥰ ᥑᥣᥒᥴ]]
== ᥒᥝᥲ ᥑᥣᥛᥰ ==
ᥓᥪ ᥑᥥᥱ"ᥛᥣᥒᥴ ᥔᥪᥲ" ᥙᥨᥝᥱ ᥑᥪᥢᥲ ᥛᥣᥰ ᥙᥩᥐ ᥞᥨᥝᥴ ᥖᥥᥰ ᥘᥬᥰ ᥙᥤ 1443 ᥛᥫ[[ᥗᥧᥱ ᥔᥪ]][[Mangshi Tusi|ᥖᥤ ᥛᥫᥒᥰ ᥑᥩᥢᥴ]]ᥘᥬᥰ ᥓᥪ ᥖᥭᥰ ᥘᥫᥴ''ᥕᥤᥲ ᥟᥤ ᥓᥣᥒ ᥐᥩᥢᥰ ᥔᥤ'' ({{lang|zh-Hans|芒市御夷长官司}}) ᥘᥭᥲ ᥐᥨᥝᥲ ᥖᥒᥲ ᥛᥣᥰᥘᥬᥰ ᥟᥣ ᥖᥥᥖᥱ ᥛᥫ ᥓᥝᥳ ᥟᥣ ᥛᥥᥝᥰ ᥛᥫᥒᥰ ᥑᥩᥢᥴ ({{linktext|lang=zh|茫|施}}) ᥙᥥᥢ ᥚᥧᥱ ᥕᥧᥱ ᥔᥝᥰ ᥒᥝᥲ ᥒᥣᥱ ᥗᥤᥲ ᥘᥭᥳ ᥖᥒ ᥑᥣᥛᥰ ᥝᥣ "{{linktext|lang=zh|芒|市}}" ᥑᥣᥭᥰ ᥙᥦᥢᥱ ᥛᥣᥰ ᥖᥤ "{{lang|zh|茫施}}" (ᥟᥣᥢᥱ ᥟᥩᥐᥱ ᥔᥥᥒᥴ ᥘᥥᥝ ᥐᥢ) ᥟᥢ '''ᥘᥧᥲ ᥔᥪ''' ({{linktext|lang=zh|潞|西}}) ᥙᥥᥢ ᥓᥪ ᥐᥝᥱ ᥙᥩᥒᥱ ᥝᥣ "ᥝᥢᥰ ᥖᥨᥐᥱ [[ᥑᥥᥰ ᥘᥛᥳ ᥑᥨᥒᥰ ᥘᥧᥲ]] [ᥘᥛᥳ ᥑᥨᥒᥰ]"<ref name="德宏州志">{{cite book |author=德宏傣族景颇族自治州志编纂委员会 |date=1994 |script-title=zh:《德宏州志·综合卷》 |trans-title=Annals of Dehong Prefecture · Integrated Volume |language=zh |location=Mangshi |publisher=Dehong Nationalities Publishing House |isbn=7-8052-5248-3}}</ref>{{rp|460}}
ᥘᥬᥰ[[ᥑᥣᥛᥰ ᥖᥭᥰ ᥘᥫᥴ]]ᥘᥭᥲ ᥓᥪ ᥝᥣ'''[[ᥛᥫᥒᥰ (ᥟᥩᥒᥲ ᥐᥣᥢ ᥟᥧᥙ ᥙᥪᥒᥱ)|ᥛᥫᥒᥰ]]ᥑᥩᥢᥴ'''<ref>{{cite book |author=Yos Santasombat |title=Lak Chang: A reconstruction of Tai identity in Daikong |location=[[Canberra]] |publisher=[[ANU Press]] |date=2008 |isbn=978-1740760812 }}</ref>{{rp|18}} ({{TaiLe|ᥛᥫᥒᥰ ᥑᥩᥢᥴ}}) ᥞᥪᥴ "{{linktext|lang=zh-Hans|勐|焕}}" ᥙᥩᥒᥱ ᥝᥣ"ᥛᥫᥒᥰ ᥞᥨᥒᥳ ᥟᥣ ᥘᥧᥢᥱ"<ref name="德宏州志" />{{rp|460}}
ᥘᥬᥰ ᥙᥤ 2008 ᥛᥤᥰ ᥘᥩᥒ ᥗᥖᥴ ᥓᥦᥖ ᥚᥧᥱ ᥐᥩᥢᥰ ᥖᥒᥰ ᥘᥛᥴ {{formatnum:4751}} ᥐᥩᥲ ᥙᥥᥢ 96.96% ᥕᥨᥐ ᥕᥩᥒᥲ ᥘᥩᥒ ᥐᥣᥭᥰ ᥓᥪ ᥐᥣᥱ ᥖᥪᥰ ᥓᥪ ᥛᥣᥒᥴ ᥔᥪᥲ ᥖᥦᥢᥰ ᥖᥤ ᥓᥪ ᥘᥬᥰ ᥑᥣᥝᥰ ᥘᥢᥳ ᥐᥩᥲ ᥙᥥᥢ ᥘᥧᥲ ᥔᥤ<ref name = "Name Change"/> ᥘᥩᥒ ᥘᥦᥐ ᥘᥣᥭ ᥐᥣᥭᥰ ᥙᥦᥢᥱ ᥖᥤ ᥘᥭᥲ ᥗᥧᥐᥴ ᥟᥩᥒᥱ ᥛᥣᥢᥴ ᥘᥬᥰ ᥙᥤ 2010<ref>{{cite news |author=Wei Yinxia (魏银霞) |date=2010-09-28 |script-title=zh:云南省德宏州州府潞西市正式更名为"芒市" |trans-title=Luxi ,the capital of Dehong Prefecture in Yunnan, official name change to Mangshi |url=http://xw.kunming.cn/a/2010-09/28/content_2297965.htm |language=zh |script-website=zh:孔雀之乡网 |location=Mangshi |access-date=2018-07-24 }}</ref> ᥐᥩᥰ ᥙᥩᥒᥱ ᥝᥣ ᥛᥫᥒᥰ ᥑᥩᥢᥴ<ref name="德宏年鉴2017">{{cite book |author=德宏傣族景颇族自治州志编纂委员会 |date=2017 |script-title=zh:《德宏年鉴2017》 |trans-title=Yearbook of Dehong 2017 |language=zh |page=English Contents page1 |location=Mangshi |publisher=Dehong Nationalities Publishing House |isbn=978-7-5558-0726-1}}</ref>
== ᥘᥣᥲ ᥘᥤᥢ ==
ᥛᥫᥒᥰ ᥑᥩᥢᥴ ᥛᥤᥰ ᥙᥧᥢᥳ ᥖᥤ ᥞᥨᥛ {{convert|2900.91|km2}} ᥖᥒᥰ ᥛᥤᥰ ᥟᥩᥒᥲ ᥖᥤ ᥘᥣᥲ ᥟᥦᥒᥲ 2 ᥟᥩᥒᥲ ᥖᥤ ᥘᥐᥴ ᥘᥬᥰ ᥛᥫᥒᥰ ᥘᥭᥲ ᥙᥥᥢ ᥛᥣᥒᥳ ᥔᥪᥲ ᥙᥣ ᥖᥨᥒ ᥝᥥᥒᥰ ᥛᥫᥒᥰ ᥑᥩᥢᥴ ({{lang|zh|芒市坝}}) ᥖᥒᥰ ᥓᥬ ᥜᥣᥒᥴ ᥙᥣ ᥛᥝᥱ ᥘᥢᥴ ᥖᥨᥒ ᥛᥫᥒᥰ ᥓᥥ ᥜᥣᥒᥴ ({{lang|zh|遮放坝}}) ᥛᥫᥒᥰ ᥑᥩᥢᥴ ᥛᥤᥰ ᥖᥨᥝ ᥘᥣᥳ ᥘᥤᥱ ᥔᥢᥳ ᥘᥢᥴ ᥙᥥᥢ ᥘᥐᥴ[[ᥓᥥᥐᥳ ᥘᥩᥭ]] ᥖᥤᥐ ᥙᥥᥢ ᥘᥛᥴ 84.48% ᥟᥩᥒᥲ ᥘᥦᥰ ᥛᥫᥒᥰ ᥑᥩᥢᥴ ᥟᥩᥒᥲ ᥔᥧᥒᥴ ᥕᥧᥱ ᥖᥤ ᥓᥥᥐᥳ ᥘᥩᥭ ᥡᥤᥒ ᥑᥨᥝᥱ (Mount Qingkou; {{lang|zh|箐口山}}) ᥖᥒᥰ ᥖᥣᥒᥰ ᥔᥧᥒᥴ 2,889.1 ᥛᥥᥖ ᥕᥣᥢᥴ ᥑᥐ ᥘᥛᥳ ᥙᥣᥐᥱ ᥘᥣᥭᥱ<ref name="潞西县志">{{cite book |author=云南省潞西县志编纂委员会 |date=1993 |script-title=zh:《潞西县志》 |trans-title=Annals of Luxi County |language=zh |location=[[Kunming]] |publisher=Yunnan Education Publishing House |isbn=7-5415-0685-0}}</ref>{{rp|52–53}} ᥓᥤᥐᥴ ᥘᥩᥭ ᥘᥭᥳ ᥙᥥᥢ ᥟᥩᥒᥲ ᥚᥥᥴ[[Gaoligong Mountains|ᥘᥩᥭ ᥑᥨᥝᥰ ᥘᥤᥰ ᥕᥣᥱ ᥐᥨᥒᥳ]]<ref name="86版概况">{{cite book |author1=中共云南省委政策研究室 |author2=云南省志编纂委员会办公室 |date=1986 |script-title=zh:《云南地州市县概况 德宏傣族景颇族自治州分册》 |trans-title=Overview of Prefecture, city and county of Yunnan·Dehong Dai and Jingpo Autonomous Prefecture Volume | language = zh-Hans}}</ref>{{rp|40}} ᥑᥥᥰ ᥘᥛᥳ ᥘᥐᥴ ᥛᥫᥒᥰ ᥙᥥᥢ[[Mangshi River|ᥑᥥᥰ ᥘᥛᥳ ᥛᥫᥒᥰ ᥑᥩᥢᥴ]]ᥐᥩᥰ ᥙᥥᥢ ᥘᥒᥱ"ᥑᥥᥰ ᥘᥛᥳ ᥛᥥ ᥛᥣᥢᥱ ᥖᥣᥱ " ᥛᥫᥒᥰ<ref>{{cite web |url=http://en.dehong.gov.cn/Gallery/content-104-145-1.html |title=Mangshi River |date=2013-09-24 |website=en.dehong.gov.cn |publisher=Dehong.Gov |access-date=2018-05-21 |archive-date=2018-05-22 |archive-url=https://web.archive.org/web/20180522041856/http://en.dehong.gov.cn/Gallery/content-104-145-1.html |url-status=dead }}</ref> ᥖᥒᥰ ᥛᥤᥰ ᥟᥩᥒᥲ ᥖᥤ ᥘᥦᥖᥱ ᥘᥛᥳ {{convert|1881|km2}}<ref name="河湖大典">{{cite book |author1=Jing Zhengshu (敬正书) |script-title=zh:《中国河湖大典 西南诸河卷》 |trans-title=China Rivers and Lakes Encyclopedia |location=[[Beijing]] |publisher=China Water&Power Press |date=2010 |isbn=978-7-5170-2699-0}}</ref>{{rp|90–91}} ᥛᥝᥱ ᥘᥢᥴ 61.3% ᥟᥩᥒᥲ ᥖᥤ ᥓᥥ ᥝᥥᥒᥰ ᥛᥫᥒᥰ ᥑᥩᥢᥴ
== ᥟᥣᥒᥲ ᥟᥤᥒ ==
{{ᥘᥣᥭᥰ ᥑᥙ ᥟᥣᥒᥲ ᥟᥤᥒ}}
{{ᥛᥫᥒᥰ ᥕᥤᥢᥳ ᥢᥤᥢᥳ}}
{{Authority control}}
[[ᥛᥧᥖᥱ ᥛᥧᥱ:ᥓᥥ ᥝᥥᥒᥰ ᥘᥬᥰ ᥛᥫᥒᥰ ᥕᥤᥢᥳ ᥢᥤᥢᥳ]]
[[ᥛᥧᥖᥱ ᥛᥧᥱ:ᥓᥥ ᥝᥥᥒᥰ ᥑᥐ ᥟᥪᥒᥱ]]
[[ᥛᥧᥖᥱ ᥛᥧᥱ: ᥛᥫᥒᥰ ᥕᥤᥢᥳ ᥢᥣᥢᥳ]]
{{ᥑᥨᥒᥳ ᥘᥩᥒᥲ ᥘᥣᥲ ᥘᥤᥢ ᥛᥫᥒᥰ ᥑᥥᥱ ᥓᥧᥒ ᥐᥨᥝᥲ}}
7mzmuezjlplymiqs7jal4tk2m78e4lq
ᥗᥦᥛᥰ ᥙᥣ ᥘᥥᥐᥳ:Navbox visibility
10
2566
7793
7767
2026-09-08T13:11:41Z
Pannawat Chayasuwankul
1263
/* */
7793
wikitext
text/x-wiki
ᥓᥬᥳ ᥖᥪᥰ<code>class=navbox</code>{{tl|navbox}}ᥛᥝᥱ ᥘᥢᥴ<code>class=nomobile</code>{{tl|sidebar}}ᥖᥤ ᥘᥬᥰ ᥟᥩᥒᥲ ᥖᥤ ᥘᥤᥐ ᥙᥪᥖᥱ ᥟᥢ ᥛᥤᥰ ᥖᥤ ᥝᥤᥱ ᥑᥤᥱ ᥚᥤᥱ ᥖᥤᥱ ᥕᥣᥱ ᥝᥦᥙᥱ ᥕᥣᥒᥱ ᥛᥪᥰ ᥗᥪᥴ ᥘᥢᥳ ᥟᥛᥱ ᥘᥥᥴ ᥝᥭᥳ ᥙᥫᥒ ᥖᥦᥐ ᥛᥥᥝᥰ ᥗᥣᥢ ᥛᥢᥰ. ᥘᥬᥰ ᥐᥥ ᥙᥤ 2 0 2 0 ᥖᥨᥝᥱ ᥗᥪᥒᥴ 2 0 2 5 ᥘᥢᥳ ᥐᥨᥢᥰ ᥖᥨᥭᥰ ᥘᥣᥲ ᥘᥤᥐ ᥑᥫᥒ ᥜᥨᥢᥰ ᥛᥤᥰ 6 0 % ᥖᥨᥝᥱ 7 0 % ᥑᥩᥒᥴ ᥐᥨᥢᥰ ᥖᥨᥭᥰ ᥘᥣᥲ ᥘᥤᥐ ᥖᥒᥰ ᥛᥨᥖᥴ.
ᥙᥨᥝᥰ ᥘᥣᥖ ᥐᥣᥒ ᥐᥣᥒ ᥑᥣᥒ ᥑᥣᥒ ᥘᥭ ᥚᥦᥢᥱ ᥘᥤᥢ ᥓᥫᥰ ᥘᥭᥳ ᥟᥛᥱ ᥙᥣᥰ ᥘᥬᥰ ᥑᥨᥝᥲ ᥛᥧᥢᥰ ᥕᥩᥢᥳ ᥝᥣ ᥟᥛᥱ ᥘᥭᥲ ᥞᥥᥖᥱ ᥝᥭᥳ ᥖᥣᥱ ᥑᥫᥒ ᥜᥨᥢᥰ ᥞᥬᥲ ᥗᥧᥐᥴ ᥛᥦᥢ ᥘᥦᥰ ᥖᥤᥴ ᥞᥥᥖᥱ ᥞᥬᥲ ᥘᥣᥲ ᥘᥤᥐ ᥖᥫᥰ ᥛᥣᥰ ᥖᥥᥳ ᥖᥥᥳ ᥝᥣ ᥝᥣ ᥖᥤᥴ ᥞᥥᥳ ᥞᥣᥛᥲ ᥘᥩᥒ ᥘᥨᥒᥰ ᥜᥨᥢᥰ ᥘᥦᥰ ᥖᥤᥴ ᥟᥛᥱ ᥙᥢ ᥘᥩᥒ ᥓᥩᥭ ᥗᥦᥛᥴ ᥟᥢ ᥖᥥᥳ ᥖᥥᥳ ᥖᥩᥢᥲ ᥖᥣᥱ ᥘᥩᥒ ᥓᥬᥳ ᥖᥪᥰ ᥚᥨᥒᥰ ᥘᥢᥳ ᥕᥝᥳ.
ᥖᥨᥭᥰ ᥘᥭᥲ ᥟᥛᥱ ᥘᥢᥴ ᥓᥩᥛᥰ ᥘᥭᥲ [[phab:T124168]]ᥞᥬᥲ ᥘᥭᥲ ᥟᥧᥙᥱ ᥟᥨᥝᥰ ᥐᥢ ᥖᥒᥰ ᥘᥛᥴ。
<noinclude>
{{documentation}}
</noinclude>
p9p5c9o7eqbrhlr5y09rzwvxkgq5qh2
ᥗᥦᥛᥰ ᥙᥣ ᥘᥥᥐᥳ:Dai
10
2572
7792
7775
2026-09-08T13:03:36Z
Pannawat Chayasuwankul
1263
/* */
7792
wikitext
text/x-wiki
{{Navbox
|name = ᥟᥣ ᥛᥥᥝᥰ ᥖᥭᥰ
|state = {{{state<includeonly>|collapsed</includeonly>}}}
|title = ᥟᥣ ᥛᥥᥝᥰ ᥖᥫᥒᥰ ᥛᥫᥒᥰ ᥑᥥᥱ [[ᥟᥣ ᥛᥥᥝᥰ ᥖᥭᥰ]]
|bodyclass = hlist
|evenstyle = background:#F4F0EC;
| group1=ᥛᥦᥒᥱ ᥟᥩᥐᥱ
| list1=
*[[ᥖᥬᥲ ᥑᥨᥒᥰ ᥟᥣ ᥛᥥᥝᥰ ᥖᥭᥰ ᥟᥣ ᥛᥥᥝᥰ ᥑᥣᥒᥴ ᥓᥫᥝ ᥙᥪᥴ ᥓᥝᥲ ᥙᥩᥒ]]
*[[ᥔᥤᥙᥴ ᥔᥩᥒᥴ ᥙᥢᥰ ᥘᥣᥰ ᥟᥣ ᥛᥥᥝᥰ ᥖᥭᥰ ᥓᥫᥝ ᥙᥪᥴ ᥓᥝᥲ ᥙᥩᥒ]]
*[[ᥕᥦᥢᥳ ᥓᥦᥒ ᥑᥣ ᥘᥤᥰ ᥕᥤᥲ ᥖᥭᥰ ᥔᥦᥢᥱ ᥙᥪᥴ ᥓᥝᥲ ᥙᥩᥒ]]
*[[ᥕᥤᥢᥰ ᥚᥤᥢᥳ ᥕᥤᥲ ᥖᥭᥰ ᥔᥦᥢᥱ ᥙᥪᥴ ᥓᥝᥲ ᥙᥩᥒ]]
*[[ᥓᥤᥢ ᥐᥧᥰ ᥖᥭᥰ ᥕᥥᥰ ᥔᥦᥢᥱ ᥙᥪᥴ ᥓᥝᥲ ᥙᥩᥒ]]
*[[ᥛᥫᥒᥰ ᥘᥦᥛᥰ ᥖᥭᥰ ᥘᥣ ᥑᥧᥲ ᥝᥣᥳ ᥕᥦᥢᥱ ᥙᥪᥴ ᥓᥝᥲ ᥙᥩᥒ]]
*[[ᥐᥪᥒᥱ ᥛᥣᥳ ᥖᥭᥰ ᥝᥣᥳ ᥔᥦᥢᥱ ᥙᥪᥴ ᥓᥝᥲ ᥙᥩᥒ]]
*[[ᥔᥩᥒᥰ ᥓᥦᥒ ᥘᥣ ᥑᥧᥲ ᥝᥣᥳ ᥙᥧᥱ ᥘᥤᥒᥰ ᥖᥭᥰ ᥔᥦᥢᥱ ᥙᥪᥴ ᥓᥝᥲ ᥙᥩᥒ]]
*[[ᥓᥤᥢ ᥚᥤᥢᥳ ᥛᥦᥝᥴ ᥔᥦᥝᥲ ᥖᥭᥰ ᥔᥦᥢᥱ ᥙᥪᥴ ᥓᥝᥲ ᥙᥩᥒ]]
| group2 = ᥓᥧᥛᥰ ᥚᥥᥴ
| list2 =
*[[ᥖᥭᥰ ᥢᥣᥲ]]
**<small>ᥖᥭᥰ ᥘᥫᥴ</small>
**<small>ᥖᥭᥰ ᥙᥩᥒᥴ、ᥖᥭᥰ ᥖᥬᥲ</small>
*[[ᥖᥭᥰ ᥘᥪᥳ]]
*[[ᥖᥭᥰ ᥕᥣᥴ]]
*[[ᥖᥭᥰ ᥖᥩᥢᥳ]]
*[[ᥖᥭᥰ ᥓᥧᥲ]]
*[[ᥖᥭᥰ ᥘᥦᥒᥰ]]
*[[ᥖᥭᥰ ᥖᥣᥢ]]
*[[ᥖᥭᥰ ᥐᥪᥢᥱ]]
| group3 = ᥑᥣᥛᥰ ᥘᥣᥖ ᥘᥣᥭᥰ ᥖᥦᥛᥲ
| list3 =
*[[ᥑᥣᥛᥰ ᥖᥭᥰ ᥘᥫᥴ]]
**[[ᥘᥣᥭᥰ ᥖᥭᥰ ᥘᥫᥴ]]
*[[ᥑᥣᥛᥰ ᥖᥭᥰ ᥖᥬᥲ]]
**[[ᥘᥣᥭᥰ ᥖᥭᥰ ᥖᥬᥲ]]
*[[ᥑᥣᥛᥰ ᥖᥭᥰ ᥘᥪᥳ]]
**[[ᥘᥣᥭᥰ ᥖᥭᥰ ᥘᥪᥳ ᥛᥬᥱ]]
**[[ᥘᥣᥭᥰ ᥖᥭᥰ ᥘᥪᥳ ᥗᥝᥲ]]
*[[ᥑᥣᥛᥰ ᥖᥭᥰ ᥕᥣᥴ]]
*[[ᥑᥣᥛᥰ ᥖᥭᥰ ᥖᥩᥢᥳ]]
**[[ᥘᥣᥭᥰ ᥖᥭᥰ ᥖᥩᥢᥳ]]
*[[ᥑᥣᥛᥰ ᥖᥭᥰ ᥘᥦᥒᥰ]]
*[[ᥑᥣᥛᥰ ᥖᥭᥰ ᥖᥣᥢ]]
**[[ᥘᥣᥭᥰ ᥖᥭᥰ ᥖᥣᥢ]]
*[[ᥑᥣᥛᥰ ᥖᥭᥰ ᥑᥪᥢᥰ]]
| group4=ᥟᥣ ᥔᥫᥐ
| list4={{Navbox|child
|group1=
|list1=
*[[ᥖᥦᥢᥱ ᥕᥥᥲ]]
*[[ᥛᥫᥒᥰ ᥖᥭᥰ]]
*[[ᥑᥥᥝᥲ ᥑᥛᥰ]]
*[[ᥛᥣᥒᥴ ᥛᥣᥢᥴ]]
*[[ᥙᥣᥭᥱ ᥕᥤᥲ]]
*[[ᥘᥧᥲ ᥡᥩᥢ]](ᥛᥫᥒᥰ ᥛᥣᥝᥰ)
*[[ᥛᥫᥒᥰ ᥞᥨᥝᥴ ᥑᥛᥰ ᥓᥤᥢ ᥘᥨᥒᥴ]](ᥘᥬᥰ ᥐᥣᥰ)
*<s>ᥖᥭᥰ ᥑᥥᥱ ᥖᥒᥰ ᥖᥭᥰ ᥘᥛᥳ</s>
|group2= ᥖᥤ ᥘᥐᥴ ᥗᥧᥱ ᥔᥪ ᥓᥝᥲ ᥜᥣᥳ
|list2= {{Navbox|child
|group1= ᥔᥪᥙ ᥑᥝᥲ ᥗᥪᥒᥴ ᥐᥣᥙ ᥙᥣᥢ ᥛᥬᥰ
|list1=
*[[ᥘᥣᥢᥳ ᥖᥦᥢᥰ ᥗᥧᥱ ᥔᥪ|ᥛᥫᥒᥰ ᥖᥤᥰ]]
*[[ᥐᥣᥢᥰ ᥕᥣᥴ ᥗᥧᥱ ᥔᥪ|ᥛᥫᥒᥰ ᥘᥣᥲ]]
*[[ᥘᥨᥒᥲ ᥡᥩᥢ ᥗᥧᥱ ᥔᥪ|ᥛᥫᥒᥰ ᥝᥢᥰ]]
*[[ᥛᥫᥒᥰ ᥘᥦᥛᥰ ᥗᥧᥱ ᥔᥪ|ᥛᥫᥒᥰ ᥘᥦᥛᥰ]]
*[[ᥓᥣᥢᥰ ᥖᥤ ᥗᥧᥱ ᥔᥪ|ᥓᥣᥢᥰ ᥖᥣ]]
*[[ᥓᥫ ᥜᥣᥒᥴ ᥗᥧᥱ ᥔᥪ|ᥓᥥ ᥜᥣᥒᥴ]]
*[[ᥘᥧᥲ ᥓᥦᥒ ᥗᥧᥱ ᥔᥪ|ᥘᥧᥲ ᥓᥦᥒ]]
*[[ᥛᥣᥒᥲ ᥔᥪᥲ ᥗᥧᥱ ᥔᥪ|ᥛᥫᥒᥰ ᥑᥩᥢᥴ]]
*[[ᥛᥫᥒᥰ ᥛᥣᥝᥰ ᥗᥧᥱ ᥔᥪ|ᥛᥫᥒᥰ ᥛᥣᥝᥰ]]
*[[ᥐᥪᥒᥱ ᥛᥣᥳ ᥗᥧᥱ ᥔᥪ|ᥐᥪᥒᥱ ᥛᥣᥳ]]
*[[ᥛᥫᥒᥰ ᥖᥤᥒᥴ ᥜᥧᥱ|ᥛᥫᥒᥰ ᥖᥤᥒᥴ]]
*[[ᥝᥣᥢᥰ ᥖᥦᥢᥱ ᥓᥫᥝ|ᥝᥣᥢᥰ ᥖᥦᥢᥱ]]
*[[ᥓᥫᥢᥱ ᥑᥣᥒᥴ ᥓᥫᥝ|ᥓᥫᥢᥱ ᥑᥣᥒᥴ]]
*[[ᥐᥧ ᥘᥨᥒᥴ ᥖᥦᥢᥱ ᥓᥣᥒᥱ ᥐᥩᥢ ᥔᥪ|ᥐᥧ ᥕᥨᥒᥰ ᥖᥦᥢᥱ]]
|group2= ᥕᥨᥐ ᥘᥫᥐ ᥘᥬᥰ ᥐᥣᥙ ᥛᥤᥢᥳ ᥔᥤᥢ
|list2=
*[[ᥖᥫᥒᥲ ᥡᥩᥢ ᥓᥫᥝ|ᥖᥫᥒᥲ ᥡᥩᥢᥰ]]
*[[ᥛᥫᥒᥰ ᥛᥦᥢᥰ ᥓᥣᥒᥱ ᥐᥩᥢ ᥔᥪ|ᥛᥫᥒᥰ ᥛᥦᥢᥰ]]
*[[ᥖᥣ ᥑᥫᥝᥱ ᥓᥫᥝ|ᥖᥣ ᥑᥫᥝᥱ]]
*[[ᥓᥤᥒ ᥟᥣᥢ ᥔᥦᥢᥳ ᥝᥫᥭᥳ ᥔᥪ|ᥓᥤᥒ ᥟᥣᥢ]]
*[[ᥝᥫᥭᥰ ᥕᥦᥢᥱ ᥓᥫᥝ|ᥝᥫᥭᥰ ᥕᥦᥢᥱ]]
*[[ᥓᥤᥒ ᥖᥨᥒ ᥜᥧᥱ|ᥓᥤᥒ ᥖᥨᥒ]]
*[[ᥕᥦᥢᥱ ᥛᥨᥝᥱ ᥔᥦᥢᥱ(ᥕᥦᥢᥳ ᥡᥝᥲ)|ᥕᥦᥢᥱ ᥛᥫᥝᥱ]]
*[[ᥕᥦᥢᥲ ᥓᥦᥒ ᥜᥧᥱ|ᥕᥦᥢᥲ ᥓᥦᥒ]]
*[[ᥓᥫᥢᥱ ᥕᥦᥢᥲ ᥜᥧᥱ|ᥓᥫᥢᥱ ᥕᥦᥢᥲ]]
*[[ᥓᥫᥱ ᥘᥫᥲ ᥖᥦᥢᥰ ᥓᥣᥒᥱ ᥐᥩᥢ ᥔᥪ|ᥓᥫᥱ ᥘᥫᥲ ᥖᥦᥢᥰ]]
}} }}
| group5=ᥘᥩᥢᥳ ᥘᥤᥐ
| list5={{Navbox|child
|group1= [[ᥟᥣ ᥛᥥᥝᥰ ᥖᥭᥰ ᥙᥧᥐ ᥗᥣᥳ ᥔᥣᥱ ᥔᥢᥱ ᥘᥣᥱ]]
|list1=
*[[ᥙᥩᥭᥰ ᥓᥩᥒᥰ ᥚᥣᥭᥲ]]
*[[ᥖᥨᥝᥰ ᥘᥥᥲ ᥚᥣᥭᥲ]]
*[[ᥘᥨᥢᥳ ᥚᥣᥭᥲ]]
*[[ᥜᥣᥭᥱ ᥔᥣᥭᥳ ᥚᥣᥭᥲ]]
|group2= ᥟᥣ ᥔᥫᥐ
|list2=
*[[ᥘᥐᥴ ᥘᥤᥲ ᥖᥭᥰ]]
*[[ᥔᥣᥭᥰ ᥓᥦᥱ ᥘᥤᥲ]]
*[[ᥘᥐᥴ ᥘᥤᥲ ᥙᥧᥐ ᥗᥣᥳ]]
*[[ᥓᥧᥱ ᥘᥣᥰ ᥘᥤᥲ]]
|group3= ᥜᥤᥒᥲ ᥗᥧᥒᥰ
|list3=
*[[ᥙᥩᥭᥰ ᥔᥩᥢᥰ ᥘᥛᥳ]]
*[[ᥑᥣᥝᥰ ᥛᥭᥲ|ᥙᥩᥭᥰ ᥟᥩᥐᥱ ᥝᥣᥱ]]
** ᥙᥩᥭᥰ ᥑᥝᥲ ᥝᥣᥱ
*[[ᥙᥩᥭᥰ ᥔᥫᥲ ᥑᥛᥰ]]
*[[ᥖᥣᥢᥰ ᥚᥣᥰ ᥘᥣᥰ]]
*[[ᥑᥝᥲ ᥙᥩᥭᥰ]]
*[[ᥛᥫᥒᥰ ᥔᥫᥢᥱ]]
|group4= ᥘᥤᥐ ᥘᥣᥭᥰ
|list4=
*[[ᥓᥝᥲ ᥔᥧᥱ ᥗᥧᥢᥰ]]
|group5= ᥑᥣᥛᥰ ᥞᥩᥒᥳ
|list5=
*[[ᥙᥤᥱ ᥘᥛᥳ ᥖᥝᥲ]]
*[[ᥐᥩᥒ ᥐᥨᥢᥲ ᥕᥣᥝᥰ]]
|group6= ᥘᥣᥭᥰ ᥐᥣᥲ
|list6=
*[[ᥐᥣᥲ ᥘᥨᥐ ᥕᥧᥒᥰ ᥟᥣ ᥛᥥᥝᥰ ᥖᥭᥰ|ᥐᥣᥲ ᥘᥨᥐ ᥕᥧᥒᥰ]]
*[[ᥐᥣᥲ ᥐᥩᥒ]]
*[[ᥐᥣᥲ ᥓᥣᥒᥳ ᥚᥫᥐᥱ]]
*[[ᥐᥣᥲ ᥛᥣᥳ ᥘᥧᥲ]]
|group7= ᥔᥤᥢᥴ ᥘᥣ ᥙᥣᥳ
|list7=
*[[ᥓᥫᥒᥰ ᥖᥭᥰ]]
*[[ᥓᥣᥒ ᥞᥣ]]
|group8= ᥜᥤᥒᥲ ᥗᥧᥒᥰ ᥘᥛᥳ ᥐᥖ
|list8=
*[[ᥘᥣᥭᥰ ᥛᥬ ᥙᥣᥛ]]
*[[ᥑᥩᥐᥱ ᥛᥩᥐᥱ ᥓᥩᥐᥱ ᥛᥬ ᥟᥣ ᥛᥥᥝᥰ ᥖᥭᥰ]]
*[[ᥞᥥᥖᥱ ᥛᥨᥝᥲ ᥟᥩᥛᥴ ᥚᥝᥴ ᥟᥣ ᥛᥥᥝᥰ ᥖᥭᥰ]]
*[[ᥐᥤᥙᥴ ᥓᥥᥲ ᥟᥣ ᥛᥥᥝᥰ ᥖᥭᥰ]]
*[[ᥖᥨᥝᥰ ᥞᥧᥐᥴ ᥟᥣ ᥛᥥᥝᥰ ᥖᥭᥰ]]
*[[ᥕᥣᥲ ᥕᥣ ᥖᥭᥰ]]<small>([[ᥕᥨᥖᥱ ᥕᥣ ᥘᥩᥢᥰ ᥘᥙᥴ]])</small>
}}
|below =
* {{icon|category}} '''[[:Category:ᥟᥣ ᥛᥥᥝᥰ ᥖᥭᥰ|ᥚᥥᥴ ᥟᥩᥐᥱ]]'''
* {{Icon|Commons}} '''[[commons:Category:Dai people|共享资源]]'''
}}
<noinclude>
[[Category:ᥚᥦᥢᥱ ᥘᥥᥴ ᥖᥣᥒᥰ ᥟᥣ ᥛᥥᥝᥰ ᥖᥫᥒᥰ ᥛᥫᥒᥰ ᥑᥥᥱ]]
[[Category:ᥟᥣ ᥛᥥᥝᥰ ᥖᥭᥰ]]
</noinclude>
ruw0gixvxb04bsaa3lerffmquup894i
ᥓᥩᥒᥰ ᥞᥨᥝᥴ ᥔᥤᥢᥴ
0
2573
7791
2026-09-08T12:00:35Z
Pannawat Chayasuwankul
1263
Created page with "{{Infobox religious building | name = ᥝᥖ ᥜᥨᥝᥴ ᥐᥩᥒ | native_name = 佛光寺 | native_name_lang = zh | image = 佛光寺 - 全景 - 2023-07-30.jpg | caption = | map_type = China Yunnan | map_caption = | coordinates = {{coord|24.44195|N|98.58929|E|type:landmark_region:CN-53|format=dms|display=it}} | coordinates_footnotes = | religious_affiliation = [[เถรวาท]] | deity = | leadership = | festival = <!-- or | fest..."
7791
wikitext
text/x-wiki
{{Infobox religious building
| name = ᥝᥖ ᥜᥨᥝᥴ ᥐᥩᥒ
| native_name = 佛光寺
| native_name_lang = zh
| image = 佛光寺 - 全景 - 2023-07-30.jpg
| caption =
| map_type = China Yunnan
| map_caption =
| coordinates = {{coord|24.44195|N|98.58929|E|type:landmark_region:CN-53|format=dms|display=it}}
| coordinates_footnotes =
| religious_affiliation = [[เถรวาท]]
| deity =
| leadership =
| festival = <!-- or | festivals = -->
| location = [[ᥛᥫᥒᥰ ᥑᥩᥢᥴ]] [[ᥕᥤᥢᥳ ᥢᥣᥢᥳ]]
| country = China
| consecration_year =
| website = <!-- {{URL|}} -->
| architect =
| architecture_type =
| architecture_style = [[Chinese architecture|สถาปัตยกรรมจีน]] - [[Kyaung|จอง]]
| founded_by =
| creator = ᥜᥣᥒ ᥓᥤᥒ ᥘᥧᥲ
| funded_by =
| general_contractor =
| established = 1873
| groundbreaking =
| year_completed = 1983 (ᥔᥣᥒᥲ ᥛᥬᥱ)
| construction_cost =
| date_demolished = <!-- or | date_destroyed = -->
| footnotes =
}}
'''ᥝᥖ ᥜᥨᥝᥴ ᥐᥩᥒ''' ({{zh|c=佛光寺|p=Fóguāng Sì}}) ᥙᥥᥢ[[ᥝᥖ]][[ᥔᥤᥱ ᥔᥢᥱ ᥘᥣᥱ ᥙᥧᥐ ᥗᥣᥳ|ᥙᥧᥐ ᥖᥣᥳ]]ᥐᥫᥒᥰ[[ᥗᥥᥱ ᥘᥣᥳ ᥝᥣᥖ]]ᥘᥬᥰ[[ᥛᥣᥒᥲ ᥔᥪᥲ|ᥛᥫᥒᥰ ᥑᥩᥢᥴ]] [[ᥛᥫᥒᥰ ᥕᥤᥢᥳ ᥢᥣᥢᥳ]] [[ᥖᥫᥒᥰ ᥛᥫᥒᥰ ᥑᥥᥱ]]{{sfnb|Codification Committee|1997|p=501}}
==ᥓᥪ==
ᥓᥪ ᥝᥖ ᥝᥣᥰ ᥐᥣᥢᥱ ᥓᥩᥒᥰ ᥖᥤ ᥛᥣᥰ ᥛᥧᥱ ᥘᥣᥳ ᥑᥣᥛᥰ ᥖᥭᥰ ᥙᥥᥢ"ᥓᥩᥒᥰ ᥞᥨᥝᥴ ᥔᥤᥢᥴ" ({{zh|s=奘贺幸|labels=no}}) ᥙᥩᥒᥱ ᥝᥣ "ᥓᥩᥒᥰ ᥙᥧᥐ ᥗᥣᥳ ᥙᥣ ᥘᥤᥖ ᥔᥣ ᥘᥣᥢᥳ ᥓᥣᥛᥰ ᥙᥧᥐ ᥗᥣᥳ ᥞᥨᥝᥴ ᥖᥥᥰ"{{sfnb|Codification Committee|1997|p=91}}
==ᥟᥣ ᥔᥫᥐ==
ᥝᥖ ᥘᥭᥳ ᥔᥣᥒᥲ ᥑᥪᥢᥲ ᥘᥬᥰ ᥙᥤ ᥞᥨᥝᥴ ᥖᥥᥰ 1873 ᥙᥤ ᥘᥬᥰ ᥐᥣᥙ[[ᥞᥨᥝᥴ ᥑᥛᥰ ᥓᥝᥲ ᥜᥣᥳ|ᥓᥝᥲ ᥜᥣᥳ ᥞᥨᥝᥴ ᥑᥛᥰ]] (1862–1874) ᥖᥤ[[ᥘᥣᥱ ᥓᥣᥱ ᥝᥣᥒᥰ ᥔᥤᥒ]] (1644–1911) ᥙᥥᥢ ᥖᥤ ᥐᥝᥱ ᥝᥣᥒᥰ,ᥜᥣᥒ ᥔᥤᥢ ᥘᥧᥲ ({{zh|s=放庆禄|labels=no}}) [[Tusi|ᥞᥨᥝᥴ ᥓᥝᥲ ᥜᥣᥳ]]ᥖᥤ ᥔᥣᥝᥰ ᥛᥫ ᥑᥪᥢᥲ ᥞᥥᥖᥱ ᥔᥣᥒᥲ ᥕᥝᥳ ᥚᥧᥱ ᥚᥧᥱ ᥛᥩᥐ ᥓᥦᥒ ᥐᥣᥱ ᥖᥤ ᥘᥬᥰ ᥘᥧᥛᥰ ᥘᥣᥱ ᥓᥣᥱ ᥝᥨᥒᥰ ᥝᥣ ᥟᥣ ᥑᥣᥢᥰ ᥑᥖᥱ ᥖᥨᥝᥱ ᥑᥨᥝᥲ ᥑᥣᥛᥰ ᥖᥛᥰ ᥝᥣᥒᥰ ᥖᥒᥰ ᥘᥩᥒ ᥙᥧᥐᥴ ᥔᥣᥒᥲ ᥞᥥᥖᥱ ᥞᥬᥲ ᥗᥧᥐᥴ ᥙᥦᥢᥱ ᥞᥣᥒ ᥙᥥᥢ ᥛᥣᥰ ᥝᥖ ᥝᥣᥰ ᥐᥣᥢᥱ ᥓᥩᥒᥰ ᥙᥧᥐ ᥗᥣᥳ ᥖᥦᥢᥰ{{sfnb|Zhang Jianzhang|Zhou Can|2011|p=55}}
ᥝᥖ ᥝᥣᥰ ᥐᥣᥢᥱ ᥓᥩᥒᥰ ᥘᥧᥳ ᥘᥦᥝᥴ ᥟᥤᥖᥴ ᥟᥩᥖᥴ ᥘᥬᥰ ᥐᥥ ᥙᥣᥒ ᥖᥫᥐᥱ ᥔᥫᥐᥱ ᥓᥣᥱ ᥙᥣᥢᥱ ᥙᥩᥐ ᥐᥛᥰ ᥔᥩᥒᥴ ᥖᥒᥰ ᥘᥬᥰ ᥐᥣᥙ[[ᥘᥩᥒ ᥘᥧᥐ ᥙᥪᥢᥳ ᥖᥣᥒᥰ ᥘᥩᥢᥳ ᥘᥤᥐ ᥝᥖ ᥗᥣᥳ ᥘᥣᥰ ᥗᥛᥰ]] ᥘᥩᥒ ᥖᥤ ᥞᥥᥖᥱ ᥔᥣᥒᥲ ᥐᥛᥰ ᥘᥛᥴ ᥖᥒᥰ ᥕᥬᥱ ᥗᥧᥐᥴ ᥞᥥᥖᥱ ᥞᥣᥭᥳ ᥛᥨᥖᥴ ᥖᥒᥰ[[ᥐᥨᥢᥰ ᥘᥧᥛᥱ ᥘᥦᥒ]] ᥐᥩᥭᥰ ᥘᥫᥴ ᥞᥨᥒᥰ ᥘᥨᥒᥴ ᥖᥒᥰ ᥗᥨᥒᥴ ᥖᥣᥒᥰ ᥖᥬᥲ ᥐᥩᥭᥰ ᥘᥒᥴ[[3rd Plenary Session of the 11th Central Committee of the Chinese Communist Party|ᥙᥣᥒ ᥐᥧᥛ ᥙᥩᥐ ᥐᥛᥰ ᥕᥬᥱ ᥘᥣᥛᥱ 3 ᥙᥣᥖ ᥑᥣᥳ ᥘᥣᥳ ᥐᥛ ᥛᥣᥱ ᥐᥤᥢ ᥚᥐ ᥑᥩᥛᥱ ᥛᥤᥝᥱ ᥢᥤᥖ ᥑᥥᥱ ᥓᥧᥙ ᥖᥤ 11]] ᥛᥤᥰ ᥘᥩᥒ ᥟᥩᥐᥱ ᥑᥨᥝᥲ ᥙᥨᥒ ᥟᥣ ᥘᥧᥳ ᥕᥣᥖ ᥟᥫᥰ ᥑᥣᥒᥰ ᥞᥬᥲ ᥗᥣᥒᥱ ᥞᥣᥒ ᥖᥣᥒᥰ ᥔᥣᥱ ᥔᥢᥱ ᥘᥣᥱ ᥛᥣᥒ ᥟᥩᥒᥲ ᥝᥖ ᥜᥨᥝᥴ ᥐᥩᥒ ᥘᥭᥲ ᥞᥙ ᥖᥛᥰ ᥘᥬᥰ ᥙᥤ 1983<ref>{{cite book|title=History of Dai Culture|author1=Dao Chenghua |author2=Cai Rongnan|publisher=Yunnan Ethnic Publishing House |location=Yunnan |year=2014|isbn=978-7-5367-6052-3|pages=343}}</ref>
==ᥚᥧᥒᥱ ᥞᥣᥒ ᥟᥩᥒᥲ ᥐᥨᥝᥱ ᥐᥣᥭᥱ==
[[ᥓᥩᥒᥰ ᥚᥣᥰ ᥘᥣᥰ(ᥐᥨᥝᥱ ᥐᥣᥭᥱ ᥞᥣᥒ ᥑᥥᥱ)|ᥓᥩᥒᥰ ᥚᥣᥰ ᥘᥣᥰ]]ᥙᥥᥢ ᥖᥝ ᥗᥨᥒᥴ ᥙᥐᥱ ᥛᥤᥰ ᥘᥣᥐ ᥔᥢᥱ ᥘᥣᥳ ᥘᥒᥴ ᥑᥣᥰ ᥑᥨᥒᥲ ᥔᥩᥒᥴ ᥓᥢᥳ ᥓᥬ ᥐᥣᥒ ᥛᥢᥰ ᥛᥤᥰ ᥙᥣ ᥘᥤᥖ ᥔᥣ ᥗᥣᥢᥱ ᥚᥣᥰ ᥘᥣᥰ ᥙᥧᥐ ᥗᥣᥳ ᥓᥝᥲ ᥖᥒᥰ [[ᥛᥣᥰ ᥘᥣᥰ ᥐᥨᥝᥰ ᥖᥛᥱ ᥛᥣᥳ ᥙᥧᥐ ᥗᥣᥳ ᥓᥝᥲ]]{{sfnb|Zhang Jianzhang|Zhou Can|2011|pp=73-75}}
==ᥙᥙ ᥚᥧᥒᥱ ᥞᥣᥒ==
<gallery>
File:佛光寺 - 正门 - 2023-07-30 02.jpg|ᥔᥧᥛᥲ ᥖᥣᥒᥰ ᥑᥝᥲ
File:佛光寺 - 寺塔 - 2023-07-30.jpg|ᥓᥥᥱ ᥖᥤᥱ
</gallery>
==ᥟᥣᥒᥲ ᥟᥤᥒ==
{{Reflist}}
===ᥙᥙ ᥘᥣᥭᥰ===
* {{cite book |language=zh|author=Codification Committee |script-title=zh:德宏州志 |trans-title=Dehong Prefecture Chronicle |year=1997 |publisher=Dehong National Publishing House |location=Yunnan |pages= |isbn=7-80525-398-6 }}
* {{cite book |language=zh|author1=Zhang Jianzhang |author2=Zhou Can |script-title=zh:秘境德宏 |trans-title=Secret Attractions in Dehong Dai and Jingpo Autonomous Prefecture |year=2011 |publisher=China Tourism Publishing House |location=Beijing |pages= |isbn=978-7-5032-4031-7 }}
[[Category:ᥝᥖ ᥘᥬᥰ ᥛᥫᥒᥰ ᥑᥥᥱ]]
[[Category:ᥘᥩᥒ ᥐᥨᥝᥱ ᥔᥣᥒᥲ ᥘᥬᥰ ᥛᥫᥒᥰ ᥕᥤᥢᥳ ᥢᥣᥢᥳ]]
o4ecc1yk7lqy6r39keg34gyczqsvmzz
7819
7791
2026-09-08T15:38:21Z
Pannawat Chayasuwankul
1263
/* */
7819
wikitext
text/x-wiki
{{Infobox religious building
| name = ᥝᥖ ᥜᥨᥝᥴ ᥐᥩᥒ
| native_name = 佛光寺
| native_name_lang = zh
| image = 佛光寺 - 全景 - 2023-07-30.jpg
| caption =
| map_type = China Yunnan
| map_caption =
| coordinates = {{coord|24.44195|N|98.58929|E|type:landmark_region:CN-53|format=dms|display=it}}
| coordinates_footnotes =
| religious_affiliation = [[เถรวาท]]
| deity =
| leadership =
| festival = <!-- or | festivals = -->
| location = [[ᥛᥫᥒᥰ ᥑᥩᥢᥴ]] [[ᥕᥤᥢᥳ ᥢᥣᥢᥳ]]
| country = China
| consecration_year =
| website = <!-- {{URL|}} -->
| architect =
| architecture_type =
| architecture_style = [[Chinese architecture|สถาปัตยกรรมจีน]] - [[Kyaung|จอง]]
| founded_by =
| creator = ᥜᥣᥒ ᥓᥤᥒ ᥘᥧᥲ
| funded_by =
| general_contractor =
| established = 1873
| groundbreaking =
| year_completed = 1983 (ᥔᥣᥒᥲ ᥛᥬᥱ)
| construction_cost =
| date_demolished = <!-- or | date_destroyed = -->
| footnotes =
}}
'''ᥝᥖ ᥜᥨᥝᥴ ᥐᥩᥒ''' ({{zh|c=佛光寺|p=Fóguāng Sì}}) ᥙᥥᥢ [[ᥝᥖ]][[ᥔᥤᥱ ᥔᥢᥱ ᥘᥣᥱ ᥙᥧᥐ ᥗᥣᥳ|ᥙᥧᥐ ᥖᥣᥳ ]]ᥐᥫᥒᥰ[[ᥗᥥᥱ ᥘᥣᥳ ᥝᥣᥖ ]]ᥘᥬᥰ[[ᥛᥣᥒᥲ ᥔᥪᥲ|ᥛᥫᥒᥰ ᥑᥩᥢᥴ]] [[ᥛᥫᥒᥰ ᥕᥤᥢᥳ ᥢᥣᥢᥳ]] [[ᥖᥫᥒᥰ ᥛᥫᥒᥰ ᥑᥥᥱ]]{{sfnb|Codification Committee|1997|p=501}}
==ᥓᥪ==
ᥓᥪ ᥝᥖ ᥝᥣᥰ ᥐᥣᥢᥱ ᥓᥩᥒᥰ ᥖᥤ ᥛᥣᥰ ᥛᥧᥱ ᥘᥣᥳ ᥑᥣᥛᥰ ᥖᥭᥰ ᥙᥥᥢ"ᥓᥩᥒᥰ ᥞᥨᥝᥴ ᥔᥤᥢᥴ" ({{zh|s=奘贺幸|labels=no}}) ᥙᥩᥒᥱ ᥝᥣ "ᥓᥩᥒᥰ ᥙᥧᥐ ᥗᥣᥳ ᥙᥣ ᥘᥤᥖ ᥔᥣ ᥘᥣᥢᥳ ᥓᥣᥛᥰ ᥙᥧᥐ ᥗᥣᥳ ᥞᥨᥝᥴ ᥖᥥᥰ"{{sfnb|Codification Committee|1997|p=91}}
==ᥟᥣ ᥔᥫᥐ==
ᥝᥖ ᥘᥭᥳ ᥔᥣᥒᥲ ᥑᥪᥢᥲ ᥘᥬᥰ ᥙᥤ ᥞᥨᥝᥴ ᥖᥥᥰ 1873 ᥙᥤ ᥘᥬᥰ ᥐᥣᥙ[[ᥞᥨᥝᥴ ᥑᥛᥰ ᥓᥝᥲ ᥜᥣᥳ|ᥓᥝᥲ ᥜᥣᥳ ᥞᥨᥝᥴ ᥑᥛᥰ]] (1862–1874) ᥖᥤ[[ᥘᥣᥱ ᥓᥣᥱ ᥝᥣᥒᥰ ᥔᥤᥒ]] (1644–1911) ᥙᥥᥢ ᥖᥤ ᥐᥝᥱ ᥝᥣᥒᥰ,ᥜᥣᥒ ᥔᥤᥢ ᥘᥧᥲ ({{zh|s=放庆禄|labels=no}}) [[Tusi|ᥞᥨᥝᥴ ᥓᥝᥲ ᥜᥣᥳ]]ᥖᥤ ᥔᥣᥝᥰ ᥛᥫ ᥑᥪᥢᥲ ᥞᥥᥖᥱ ᥔᥣᥒᥲ ᥕᥝᥳ ᥚᥧᥱ ᥚᥧᥱ ᥛᥩᥐ ᥓᥦᥒ ᥐᥣᥱ ᥖᥤ ᥘᥬᥰ ᥘᥧᥛᥰ ᥘᥣᥱ ᥓᥣᥱ ᥝᥨᥒᥰ ᥝᥣ ᥟᥣ ᥑᥣᥢᥰ ᥑᥖᥱ ᥖᥨᥝᥱ ᥑᥨᥝᥲ ᥑᥣᥛᥰ ᥖᥛᥰ ᥝᥣᥒᥰ ᥖᥒᥰ ᥘᥩᥒ ᥙᥧᥐᥴ ᥔᥣᥒᥲ ᥞᥥᥖᥱ ᥞᥬᥲ ᥗᥧᥐᥴ ᥙᥦᥢᥱ ᥞᥣᥒ ᥙᥥᥢ ᥛᥣᥰ ᥝᥖ ᥝᥣᥰ ᥐᥣᥢᥱ ᥓᥩᥒᥰ ᥙᥧᥐ ᥗᥣᥳ ᥖᥦᥢᥰ{{sfnb|Zhang Jianzhang|Zhou Can|2011|p=55}}
ᥝᥖ ᥝᥣᥰ ᥐᥣᥢᥱ ᥓᥩᥒᥰ ᥘᥧᥳ ᥘᥦᥝᥴ ᥟᥤᥖᥴ ᥟᥩᥖᥴ ᥘᥬᥰ ᥐᥥ ᥙᥣᥒ ᥖᥫᥐᥱ ᥔᥫᥐᥱ ᥓᥣᥱ ᥙᥣᥢᥱ ᥙᥩᥐ ᥐᥛᥰ ᥔᥩᥒᥴ ᥖᥒᥰ ᥘᥬᥰ ᥐᥣᥙ[[ᥘᥩᥒ ᥘᥧᥐ ᥙᥪᥢᥳ ᥖᥣᥒᥰ ᥘᥩᥢᥳ ᥘᥤᥐ ᥝᥖ ᥗᥣᥳ ᥘᥣᥰ ᥗᥛᥰ]] ᥘᥩᥒ ᥖᥤ ᥞᥥᥖᥱ ᥔᥣᥒᥲ ᥐᥛᥰ ᥘᥛᥴ ᥖᥒᥰ ᥕᥬᥱ ᥗᥧᥐᥴ ᥞᥥᥖᥱ ᥞᥣᥭᥳ ᥛᥨᥖᥴ ᥖᥒᥰ[[ᥐᥨᥢᥰ ᥘᥧᥛᥱ ᥘᥦᥒ]] ᥐᥩᥭᥰ ᥘᥫᥴ ᥞᥨᥒᥰ ᥘᥨᥒᥴ ᥖᥒᥰ ᥗᥨᥒᥴ ᥖᥣᥒᥰ ᥖᥬᥲ ᥐᥩᥭᥰ ᥘᥒᥴ[[3rd Plenary Session of the 11th Central Committee of the Chinese Communist Party|ᥙᥣᥒ ᥐᥧᥛ ᥙᥩᥐ ᥐᥛᥰ ᥕᥬᥱ ᥘᥣᥛᥱ 3 ᥙᥣᥖ ᥑᥣᥳ ᥘᥣᥳ ᥐᥛ ᥛᥣᥱ ᥐᥤᥢ ᥚᥐ ᥑᥩᥛᥱ ᥛᥤᥝᥱ ᥢᥤᥖ ᥑᥥᥱ ᥓᥧᥙ ᥖᥤ 11]] ᥛᥤᥰ ᥘᥩᥒ ᥟᥩᥐᥱ ᥑᥨᥝᥲ ᥙᥨᥒ ᥟᥣ ᥘᥧᥳ ᥕᥣᥖ ᥟᥫᥰ ᥑᥣᥒᥰ ᥞᥬᥲ ᥗᥣᥒᥱ ᥞᥣᥒ ᥖᥣᥒᥰ ᥔᥣᥱ ᥔᥢᥱ ᥘᥣᥱ ᥛᥣᥒ ᥟᥩᥒᥲ ᥝᥖ ᥜᥨᥝᥴ ᥐᥩᥒ ᥘᥭᥲ ᥞᥙ ᥖᥛᥰ ᥘᥬᥰ ᥙᥤ 1983<ref>{{cite book|title=History of Dai Culture|author1=Dao Chenghua |author2=Cai Rongnan|publisher=Yunnan Ethnic Publishing House |location=Yunnan |year=2014|isbn=978-7-5367-6052-3|pages=343}}</ref>
==ᥚᥧᥒᥱ ᥞᥣᥒ ᥟᥩᥒᥲ ᥐᥨᥝᥱ ᥐᥣᥭᥱ==
[[ᥓᥩᥒᥰ ᥚᥣᥰ ᥘᥣᥰ(ᥐᥨᥝᥱ ᥐᥣᥭᥱ ᥞᥣᥒ ᥑᥥᥱ)|ᥓᥩᥒᥰ ᥚᥣᥰ ᥘᥣᥰ]]ᥙᥥᥢ ᥖᥝ ᥗᥨᥒᥴ ᥙᥐᥱ ᥛᥤᥰ ᥘᥣᥐ ᥔᥢᥱ ᥘᥣᥳ ᥘᥒᥴ ᥑᥣᥰ ᥑᥨᥒᥲ ᥔᥩᥒᥴ ᥓᥢᥳ ᥓᥬ ᥐᥣᥒ ᥛᥢᥰ ᥛᥤᥰ ᥙᥣ ᥘᥤᥖ ᥔᥣ ᥗᥣᥢᥱ ᥚᥣᥰ ᥘᥣᥰ ᥙᥧᥐ ᥗᥣᥳ ᥓᥝᥲ ᥖᥒᥰ [[ᥛᥣᥰ ᥘᥣᥰ ᥐᥨᥝᥰ ᥖᥛᥱ ᥛᥣᥳ ᥙᥧᥐ ᥗᥣᥳ ᥓᥝᥲ]]{{sfnb|Zhang Jianzhang|Zhou Can|2011|pp=73-75}}
==ᥙᥙ ᥚᥧᥒᥱ ᥞᥣᥒ==
<gallery>
File:佛光寺 - 正门 - 2023-07-30 02.jpg|ᥔᥧᥛᥲ ᥖᥣᥒᥰ ᥑᥝᥲ
File:佛光寺 - 寺塔 - 2023-07-30.jpg|ᥓᥥᥱ ᥖᥤᥱ
</gallery>
==ᥟᥣᥒᥲ ᥟᥤᥒ==
{{Reflist}}
===ᥙᥙ ᥘᥣᥭᥰ===
* {{cite book |language=zh|author=Codification Committee |script-title=zh:德宏州志 |trans-title=Dehong Prefecture Chronicle |year=1997 |publisher=Dehong National Publishing House |location=Yunnan |pages= |isbn=7-80525-398-6 }}
* {{cite book |language=zh|author1=Zhang Jianzhang |author2=Zhou Can |script-title=zh:秘境德宏 |trans-title=Secret Attractions in Dehong Dai and Jingpo Autonomous Prefecture |year=2011 |publisher=China Tourism Publishing House |location=Beijing |pages= |isbn=978-7-5032-4031-7 }}
[[Category:ᥝᥖ ᥘᥬᥰ ᥛᥫᥒᥰ ᥑᥥᥱ]]
[[Category:ᥘᥩᥒ ᥐᥨᥝᥱ ᥔᥣᥒᥲ ᥘᥬᥰ ᥛᥫᥒᥰ ᥕᥤᥢᥳ ᥢᥣᥢᥳ]]
6jrg543dlon6vd8mjigzaes5m1iena4
ᥛᥨᥝᥱ ᥓᥧᥰ:Location map/data/China
828
2574
7794
2026-09-08T13:25:55Z
咽頭べさ
24
Created page with "return { name = 'China', y = '50 + 1.256383 * 116.80932603407057 * 0.02641006622571962 - 1.256383 * 116.80932603407057 * (1.3713469994670882 - (1.9996655301850468 -($1 * pi / 180)) * cos(0.5867115434267053 * ($2 - 104) * pi / 180))', x = '50 + 116.80932603407057 * ((1.9996655301850468-($1* pi / 180)) * sin(0.5867115434267053 * ($2 - 104) * pi / 180))', image = 'China edcp location map.svg', image1 = 'China edcp relief location map.jpg' }"
7794
Scribunto
text/plain
return {
name = 'China',
y = '50 + 1.256383 * 116.80932603407057 * 0.02641006622571962 - 1.256383 * 116.80932603407057 * (1.3713469994670882 - (1.9996655301850468 -($1 * pi / 180)) * cos(0.5867115434267053 * ($2 - 104) * pi / 180))',
x = '50 + 116.80932603407057 * ((1.9996655301850468-($1* pi / 180)) * sin(0.5867115434267053 * ($2 - 104) * pi / 180))',
image = 'China edcp location map.svg',
image1 = 'China edcp relief location map.jpg'
}
f50z0i4hrcivfrse5n1751jl6nmcl8s
ᥗᥦᥛᥰ ᥙᥣ ᥘᥥᥐᥳ:Linktext
10
2575
7797
2026-09-08T13:34:04Z
咽頭べさ
24
Created page with "<noinclude>{{documentation}}</noinclude><includeonly>{{#if:{{{lang|}}}|<span lang="{{{lang}}}">}}[[{{{pref|wikt}}}:{{{1}}}{{#if:{{{lang|}}}|#{{#language:{{{lang}}}|en}}}}|{{{1}}}]]{{{n1|}}}{{#if: {{{2|}}}|{{{lim|}}}[[{{{pref|wikt}}}:{{{2}}}{{#if:{{{lang|}}}|#{{#language:{{{lang}}}|en}}}}|{{{2}}}]]}}{{{n2|}}}{{#if: {{{3|}}}|{{{lim|}}}[[{{{pref|wikt}}}:{{{3}}}{{#if:{{{lang|}}}|#{{#language:{{{lang}}}|en}}}}|{{{3}}}]]}}{{{n3|}}}{{#if: {{{4|}}}|{{{lim|}}}{{{..."
7797
wikitext
text/x-wiki
<noinclude>{{documentation}}</noinclude><includeonly>{{#if:{{{lang|}}}|<span lang="{{{lang}}}">}}[[{{{pref|wikt}}}:{{{1}}}{{#if:{{{lang|}}}|#{{#language:{{{lang}}}|en}}}}|{{{1}}}]]{{{n1|}}}{{#if: {{{2|}}}|{{{lim|}}}[[{{{pref|wikt}}}:{{{2}}}{{#if:{{{lang|}}}|#{{#language:{{{lang}}}|en}}}}|{{{2}}}]]}}{{{n2|}}}{{#if: {{{3|}}}|{{{lim|}}}[[{{{pref|wikt}}}:{{{3}}}{{#if:{{{lang|}}}|#{{#language:{{{lang}}}|en}}}}|{{{3}}}]]}}{{{n3|}}}{{#if: {{{4|}}}|{{{lim|}}}[[{{{pref|wikt}}}:{{{4}}}{{#if:{{{lang|}}}|#{{#language:{{{lang}}}|en}}}}|{{{4}}}]]}}{{{n4|}}}{{#if: {{{5|}}}|{{{lim|}}}[[{{{pref|wikt}}}:{{{5}}}{{#if:{{{lang|}}}|#{{#language:{{{lang}}}|en}}}}|{{{5}}}]]}}{{{n5|}}}{{#if: {{{6|}}}|{{{lim|}}}[[{{{pref|wikt}}}:{{{6}}}{{#if:{{{lang|}}}|#{{#language:{{{lang}}}|en}}}}|{{{6}}}]]}}{{{n6|}}}{{#if: {{{7|}}}|{{{lim|}}}[[{{{pref|wikt}}}:{{{7}}}{{#if:{{{lang|}}}|#{{#language:{{{lang}}}|en}}}}|{{{7}}}]]}}{{{n7|}}}{{#if: {{{8|}}}|{{{lim|}}}[[{{{pref|wikt}}}:{{{8}}}{{#if:{{{lang|}}}|#{{#language:{{{lang}}}|en}}}}|{{{8}}}]]}}{{{n8|}}}{{#if: {{{9|}}}|{{{lim|}}}[[{{{pref|wikt}}}:{{{9}}}{{#if:{{{lang|}}}|#{{#language:{{{lang}}}|en}}}}|{{{9}}}]]}}{{{n9|}}}{{#if: {{{10|}}}|{{{lim|}}}[[{{{pref|wikt}}}:{{{10}}}{{#if:{{{lang|}}}|#{{#language:{{{lang}}}|en}}}}|{{{10}}}]]}}{{{n10|}}}{{#if: {{{11|}}}|{{{lim|}}}[[{{{pref|wikt}}}:{{{11}}}{{#if:{{{lang|}}}|#{{#language:{{{lang}}}|en}}}}|{{{11}}}]]}}{{{n11|}}}{{#if: {{{12|}}}|{{{lim|}}}[[{{{pref|wikt}}}:{{{12}}}{{#if:{{{lang|}}}|#{{#language:{{{lang}}}|en}}}}|{{{12}}}]]}}{{{n12|}}}{{#if: {{{13|}}}|{{{lim|}}}[[{{{pref|wikt}}}:{{{13}}}{{#if:{{{lang|}}}|#{{#language:{{{lang}}}|en}}}}|{{{13}}}]]}}{{{n13|}}}{{#if: {{{14|}}}|{{{lim|}}}[[{{{pref|wikt}}}:{{{14}}}{{#if:{{{lang|}}}|#{{#language:{{{lang}}}|en}}}}|{{{14}}}]]}}{{{n14|}}}{{#if: {{{15|}}}|{{{lim|}}}[[{{{pref|wikt}}}:{{{15}}}{{#if:{{{lang|}}}|#{{#language:{{{lang}}}|en}}}}|{{{15}}}]]}}{{{n15|}}}{{#if: {{{16|}}}|{{{lim|}}}[[{{{pref|wikt}}}:{{{16}}}{{#if:{{{lang|}}}|#{{#language:{{{lang}}}|en}}}}|{{{16}}}]]}}{{{n16|}}}{{#if: {{{17|}}}|{{{lim|}}}[[{{{pref|wikt}}}:{{{17}}}{{#if:{{{lang|}}}|#{{#language:{{{lang}}}|en}}}}|{{{17}}}]]}}{{{n17|}}}{{#if: {{{18|}}}|{{{lim|}}}[[{{{pref|wikt}}}:{{{18}}}{{#if:{{{lang|}}}|#{{#language:{{{lang}}}|en}}}}|{{{18}}}]]}}{{{n18|}}}{{#if: {{{19|}}}|{{{lim|}}}[[{{{pref|wikt}}}:{{{19}}}{{#if:{{{lang|}}}|#{{#language:{{{lang}}}|en}}}}|{{{19}}}]]}}{{{n19|}}}{{#if: {{{20|}}}|{{{lim|}}}[[{{{pref|wikt}}}:{{{20}}}{{#if:{{{lang|}}}|#{{#language:{{{lang}}}|en}}}}|{{{20}}}]]}}{{{n20|}}}{{#if:{{{lang|}}}|</span>}}</includeonly>
39wqiradjc001gsem4jbaj6alx83sk0
ᥗᥦᥛᥰ ᥙᥣ ᥘᥥᥐᥳ:Infobox religious building
10
2576
7800
2026-09-08T13:43:17Z
咽頭べさ
24
Created page with "{{Infobox | child = {{{child|}}} | bodyclass = vcard | bodystyle = border-spacing:2px; | abovestyle = color: var(--color-base); background-color: {{Infobox religious building/color|{{{religious_affiliation|{{{宗教|}}}}}}}}; | headerstyle = color: var(--color-base); background-color: {{Infobox religious building/color|{{{religious_affiliation|{{{宗教|}}}}}}}}; | autoheaders = y | labelstyle = white-space: nowrap; | aboveclass = fn org | above = {..."
7800
wikitext
text/x-wiki
{{Infobox
| child = {{{child|}}}
| bodyclass = vcard
| bodystyle = border-spacing:2px;
| abovestyle = color: var(--color-base); background-color: {{Infobox religious building/color|{{{religious_affiliation|{{{宗教|}}}}}}}};
| headerstyle = color: var(--color-base); background-color: {{Infobox religious building/color|{{{religious_affiliation|{{{宗教|}}}}}}}};
| autoheaders = y
| labelstyle = white-space: nowrap;
| aboveclass = fn org
| above = {{if empty|{{{name|}}}|{{{building_name|}}}|{{{名字|}}}|<includeonly>{{PAGENAMEBASE}}</includeonly>}}
| subheader = {{#if:{{{native_name|}}}|{{#if:{{{native_name_lang|}}}|{{Native name|{{{native_name_lang|}}}|{{{native_name|}}}}}|{{{native_name|}}}}}}}
| image = {{#invoke:InfoboxImage |InfoboxImage |image={{if empty|{{{image|}}}|{{{img|}}}|{{{图片|}}}|{{{圖片|}}}|{{#if:{{{child|}}}||{{wikidata|property|raw|image}}}}}} |size={{if empty|{{{image_size|}}}|{{{img_size|}}}}} |sizedefault=frameless |maxsize=320px |upright={{{image_upright|}}} |alt={{{alt|}}} }}
| caption = {{if empty|{{{caption|}}}|{{{圖片說明|}}}|{{{图片说明|}}}|{{{img_capt|}}}}}
| header1 = 基本-{zh-cn:信息; zh-tw:資訊}-
| label2 = 旧称
| data2 = {{if empty|{{{former_names|}}}|{{{former_name|}}}}}
| class2 = nickname
| label3 = 别称
| data3 = {{{other_names|}}}
| class3 = nickname
| label4 = 国家/地区
| data4 = {{if empty|{{{country|}}}|{{{國家|}}}|{{{国家|}}}}}
<!--| label5 = 地区
| data5 = {{#ifeq:{{Infobox religious building/color|{{{religious_affiliation|{{{宗教|}}}}}}}}|#FFCC99||{{{region|{{{地区|{{{地區|}}}}}}}}}}}-->
| label6 = 省
| data6 = {{#ifeq:{{Infobox religious building/color|{{{religious_affiliation|{{{宗教|}}}}}}}}|#FFCC99||{{{province|{{{省|}}}}}}}}
| label7 = 州
| data7 = {{if empty|{{{state|}}}|{{{州|}}}}}
| label8 = 地方行政区
| data8 = {{if empty|{{{prefecture|}}}|{{{地方行政區|}}}|{{{地方行政区|}}}}}
| label9 = 领地
| data9 = {{{territory|}}}
| label10 = 區
| class10 = label
| data10 = {{#ifeq:{{Infobox religious building/color|{{{religious_affiliation|{{{宗教|}}}}}}}}|#FFCC99||{{{district|}}}}}
| label11 = [[市鎮]]
| class11 = label
| data11 = {{if empty|{{{municipality|}}}|{{{基層政權|}}}|{{{基层政权|}}}}}
| label12 = 分区
| class12 = label
| data12 = {{{sector|}}}
| label13 = 小区
| class13 = label
| data13 = {{{cercle|}}}
| label14 = 位置
| data14 = {{if empty|{{{location|}}}|{{{位置|}}}|{{{locale|}}}|{{{address|}}}}}
| label15 = [[地理坐标系|-{zh-hans:坐标;zh-hant:座標}-]]
| data15 = {{#if:{{{coordinates|{{{geo|{{{坐标|{{{坐標|}}}}}}}}}}}}|{{#invoke:Coordinates|coordinsert|{{{coordinates|{{{geo|{{{坐标|{{{坐標|}}}}}}}}}}}}|type:landmark|{{#if:{{{country|{{{国家|{{{國家|}}}}}}}}}|region:{{Country abbreviation|{{除鏈|{{{country|{{{国家|{{{國家|}}}}}}}}}}}}}}}}}{{{coordinates_footnotes|}}}}}
| label16 = {{{grid_name|网格位置}}}
| data16 = {{{grid_position|}}}
| label17 = 海拔
| data17 = {{#if:{{{elevation_m|}}}|{{Convert|{{{elevation_m}}}|m|ft|0|abbr=on}}{{{elevation_footnotes|}}}
|{{#if:{{{elevation_ft|}}}|{{Convert|{{{elevation_ft|}}}|ft|m|0|abbr=on}}{{{elevation_footnotes|}}}
}}}}
| class19 = category
| label19 = 宗教
| data19 = {{{religious_affiliation|{{{宗教|}}}}}}{{{religious_affiliation_note|}}}
| class20 = category
| label20 = {{#switch:{{{religious_affiliation|{{{宗教|}}}}}}
|[[伊斯兰教]]|[[伊斯蘭教]] = [[伊斯兰教派|教派]]
|佛教|[[佛教]]|[[漢傳佛教]]|[[汉传佛教]]|[[大乘佛教]]|[[日本佛教]]|[[上座部佛教]]|[[禪宗]]|[[禅宗]] = [[佛教派别|宗派]]
|#default = 教派
}}
| data20 = {{if empty|{{{sect|}}}|{{{派别|}}}|{{{派別|}}}|{{{denomination|}}}|{{{tradition|}}}<!-- 伊斯兰教 -->}}
| label21 = [[总教区]]
| data21 = {{#if:{{{archdiocese|}}}|{{{archdiocese|}}}|
{{#if:{{{region|{{{地区|{{{地區|}}}}}}}}}|{{#ifeq:{{Infobox religious building/color|{{{religious_affiliation|{{{宗教|}}}}}}}}|#FFCC99|{{{region|{{{地区|{{{地區|}}}}}}}}}[[Category:需要清理的Infobox religious building教区相关参数|region]]}}}}}}
| label22 = [[教区]]
| data22 = {{#if:{{{diocese|}}}|{{{diocese|}}}|
{{#if:{{{district|}}}|{{#ifeq:{{Infobox religious building/color|{{{religious_affiliation|{{{宗教|}}}}}}}}|#FFCC99|{{{district|}}}[[Category:需要清理的Infobox religious building教区相关参数|district]]}}}}}}
| label23 = [[教省]]
| data23 = {{#ifeq:{{Infobox religious building/color|{{{religious_affiliation|{{{宗教|}}}}}}}}|#FFCC99|{{#if:{{{province|{{{省|}}}}}}|{{{province|{{{省|}}}}}}[[Category:需要清理的Infobox religious building教区相关参数|province]]}}}}
| label24 = 母寺
| data24 = {{{mather|}}}
| label25 = 属寺
| data25 = {{{children|}}}
| label26 = {{#switch:{{{religious_affiliation|{{{宗教|}}}}}}
|[[神道]]|[[神道教]] = 主祭神
|佛教|[[佛教]]|[[漢傳佛教]]|[[汉传佛教]]|[[大乘佛教]]|[[日本佛教]]|[[上座部佛教]]|[[禪宗]]|[[禅宗]]|[[藏傳佛教]]|[[藏传佛教]] = 本尊
|#default={{Yesno|{{{temple|}}}|yes=主神|no=供奉}}}}
| data26 = {{if empty|{{{deity|}}}|{{{神|}}}|{{{venerated|}}}}}
| label27 = {{#switch:{{Infobox religious building/color|{{{religious_affiliation|{{{宗教|}}}}}}}}
|#9BB4EB |#87CEFA |#ADD8E6 = [[㐵作|宗教禮儀]]<!-- this kludge is used because the people of Wikipedia do not have {{#pos}} or so! I do not want to list all flavours of Judaism just here -->
|[[仪式|宗教礼仪]]}}
| data27 = {{{rite|}}}
| label28 = {{#switch:{{{religious_affiliation|{{{宗教|}}}}}}|[[神道]]|[[神道教]]=例祭|#default={{Yesno|{{{temple|}}}|yes=例祭|no=节日}}}}
| data28 = {{if empty|{{{festivals|}}}|{{{festival|}}}|{{{节日|}}}|{{{節日|}}}}}
| label29 = {{{title1_label|{{#switch:{{{religious_affiliation|{{{宗教|}}}}}}|
|[[神道]]|[[神道教]] = [[社格]]
|佛教|[[佛教]]|[[漢傳佛教]]|[[汉传佛教]]|[[大乘佛教]]|[[日本佛教]]|[[上座部佛教]]|[[禪宗]]|[[禅宗]] = [[山号]]
|#default = {{Yesno|{{{temple|}}}|yes=廟格|no=[[教政体制|教会地位]]}}
}}}}}
| data29 = {{if empty|<!-- 社格(神道) -->{{{type|}}}|<!-- 山号(佛教) -->{{{mountain|}}}|{{{sangou|}}}|{{{山號|}}}|{{{山号|}}}|{{{organisational_status|}}}}}
| label30 = {{{title2_label|}}}<!-- 主要用于{{日本神社}}的“札所等”参数、{{日本寺院}}的“院号”参数 -->
| data30 = {{#if:{{{title2_label|}}}|{{{title2|}}}}}
| label31 = {{#if:{{{开光年份|{{{開光年份|}}}}}}|[[开光]]|[[祝聖]]}}年份
| data31 = {{if empty|{{{consecration_year|}}}|{{{开光年份|}}}|{{{開光年份|}}}}}
| label32 = 行政
| class32 = label
| data32 = {{{administration|}}}
| label33 = 所有者
| data33 = {{if empty|{{{ownership|}}}|{{{所有者|}}}}}
| label34 = 管理机构
| data34 = {{{governing_body|}}}
| label35 = {{if empty|{{{leader_label|}}}|领导}}
| data35 = {{if empty|{{{leadership|}}}|{{{leader|}}}|{{{领导|}}}|{{{領導|}}}}}
| label36 = [[住持]]
| data36 = {{{abbot|}}}
| label37 = [[伊瑪目]]
| data37 = {{{imam|}}}
| label38 = [[主保圣人]]
| data38 = {{{patron|}}}
| label39 = 功能状态
| data39 = {{if empty|{{{functional_status|}}}|{{{狀態|}}}|{{{状态|}}}|{{{status|}}}}}
| label40 = 遗产指定
| data40 = {{{heritage_designation|}}}
| label41 = 文化遗产<!-- 兼容{{日本寺院}} -->
| data41 = {{{heritage|}}}
| label42 = 官方网站
| data42 = {{{website|}}}
| header43 = {{#ifexpr:{{Infobox religious building/count|{{{architect|}}}{{{建築師|}}}{{{建筑师|}}}|{{{architecture_type|}}}{{{建筑类型|}}}{{{建築類型|}}}|{{{architecture_style|}}}{{{建築風格|}}}{{{建筑风格|}}}|{{{funded_by|}}}{{{资助者|}}}{{{資助者|}}}|{{{general_contractor|}}}|{{{established|}}}{{{建立日期|}}}{{{year|}}}{{{founded|}}}|{{{groundbreaking|}}}{{{奠基|}}}|{{{completed|}}}{{{竣工|}}}|{{{year_completed|}}}|{{{construction_cost|}}}|{{{date_demolished|}}}{{{毁坏|}}}{{{毀壞|}}}|{{{date_destroyed|}}}{{{closed|}}}}} > 1|建筑详情}}
| label44 = 建筑师
| class44 = note
| data44 = {{if empty|{{{architect|}}}|{{{建築師|}}}|{{{建筑师|}}}}}
| label45 = 建筑类型
| data45 = {{if empty|{{{architecture_type|}}}|{{{建筑类型|}}}|{{{建築類型|}}}}}
| label46 = {{#switch:{{{religious_affiliation|{{{宗教|}}}}}}|[[神道]]|[[神道教]]=本殿構造|#default={{Yesno|{{{temple|}}}|yes=本殿構造|no=建筑风格}}}}
| data46 = {{if empty|{{{architecture_style|}}}|{{{建築風格|}}}|{{{建筑风格|}}}}}
| label47 = {{#switch:{{{religious_affiliation|{{{宗教|}}}}}}
|佛教|[[佛教]]|[[漢傳佛教]]|[[汉传佛教]]|[[大乘佛教]]|[[日本佛教]]|[[上座部佛教]]|[[禪宗]]|[[禅宗]] = 開基
| #default = {{Yesno|{{{temple|}}}|yes=開基|no=创建者}}}}
| data47 = {{if empty|{{{founded_by|}}}|{{{建立者|}}}|{{{creator|}}}|{{{founder|}}}}}
| label48 = 资助者
| data48 = {{if empty|{{{funded_by|}}}|{{{资助者|}}}|{{{資助者|}}}}}
| label49 = [[承建商]]
| data49 = {{{general_contractor|}}}
| label50 = {{#switch:{{{religious_affiliation|{{{宗教|}}}}}}
|佛教|[[佛教]]|[[漢傳佛教]]|[[汉传佛教]]|[[大乘佛教]]|[[日本佛教]]|[[上座部佛教]]|[[禪宗]]|[[禅宗]] = 开山时间
| #default = 建立时间}}
| data50 = {{if empty|{{{established|}}}|{{{建立日期|}}}|{{{year|}}}|{{{founded|}}}}}
| label51 = 动工时间
| class51 = note
| data51 = {{if empty|{{{groundbreaking|}}}|{{{奠基|}}}}}
| label52 = 竣工时间
| class52 = note
| data52 = {{if empty|{{{year_completed|}}}|{{{completed|}}}|{{{竣工|}}}}}
| label53 = 建设成本
| data53 = {{{construction_cost|}}}
| label54 = {{#switch:{{{religious_affiliation|{{{宗教|}}}}}}
|佛教|[[佛教]]|[[漢傳佛教]]|[[汉传佛教]]|[[大乘佛教]]|[[日本佛教]]|[[上座部佛教]]|[[禪宗]]|[[禅宗]]|[[藏傳佛教]]|[[藏传佛教]] = 废寺
| #default = 拆除时间}}
| data54 = {{if empty|{{{date_demolished|}}}|{{{date_destroyed|}}}|{{{closed|}}}|{{{毀壞|}}}|{{{毁坏|}}}}}
| header60 = {{#ifexpr:{{Infobox religious building/count|{{{facade_direction|}}}|{{{capacity|}}}{{{容纳人数|}}}{{{容納人數|}}}|{{{length|}}}|{{{width|}}}|{{{width_nave|}}}|{{{site_area|}}}{{{场地面积|}}}{{{場地面積|}}}|{{{floor_area|}}}|{{{interior_area|}}}{{{内部面积|}}}{{{內部面積|}}}|{{{height_max|}}}|{{{dome_quantity|}}}|{{{dome_height_outer|}}}|{{{dome_height_inner|}}}|{{{dome_dia_outer|}}}|{{{dome_dia_inner|}}}|{{{minaret_quantity|}}}|{{{minaret_height|}}}|{{{spire_quantity|}}}{{{尖塔|}}}|{{{spire_height|}}}{{{尖塔高度|}}}|{{{temple_quantity|}}}|{{{monument_quantity|}}}|{{{shrine_quantity|}}}|{{{inscriptions|}}}|{{{materials|}}}{{{建築材料|}}}{{{建筑材料|}}}}} > 1 |詳細規格}}
| label61 = 立面朝向
| data61 = {{{facade_direction|}}}
| label62 = 占地面积
| data62 = {{if empty|{{{site_area|}}}|{{{場地面積|}}}|{{{场地面积|}}}}}
| label63 = 建筑面积
| data63 = {{{floor_area|}}}
| label64 = 室内面积
| data64 = {{if empty|{{{interior_area|}}}|{{{内部面积|}}}|{{{內部面積|}}}}}
| label65 = 容納人數
| data65 = {{if empty|{{{capacity|}}}|{{{容纳人数|}}}|{{{容納人數|}}}}}
| label66 = 長度
| data66 = {{{length|}}}
| label67 = 寬度
| data67 = {{{width|}}}
| label68 = [[身廊]]寬度
| data68 = {{{width_nave|}}}
| label69 = 最高高度
| data69 = {{{height_max|}}}
| label71 = [[圓頂]]数量
| data71 = {{{dome_quantity|}}}
| label72 = 圆顶高度(外)
| data72 = {{{dome_height_outer|}}}
| label73 = 圆顶高度(内)
| data73 = {{{dome_height_inner|}}}
| label74 = 圆顶直径(外)
| data74 = {{{dome_dia_outer|}}}
| label75 = 圆顶直径(内)
| data75 = {{{dome_dia_inner|}}}
| label76 = [[叫拜樓|-{zh-hans:宣礼塔; zh-hant:叫拜樓;}-]]数量
| data76 = {{{minaret_quantity|}}}
| label77 = -{zh-hans:宣礼塔; zh-hant:叫拜樓;}-高度
| data77 = {{{minaret_height|}}}
| label78 = [[尖顶]]数量
| data78 = {{if empty|{{{spire_quantity|}}}|{{{尖塔|}}}}}
| label79 = 尖顶高度
| data79 = {{if empty|{{{spire_height|}}}|{{{尖塔高度|}}}}}
| label81 = 寺庙数量
| data81 = {{{temple_quantity|}}}
| label82 = 纪念碑数量
| data82 = {{{monument_quantity|}}}
| label83 = 神殿数量
| data83 = {{{shrine_quantity|}}}
| label84 = 碑铭
| data84 = {{{inscriptions|}}}
| label85 = 建筑材料
| data85 = {{if empty|{{{materials|}}}|{{{建筑材料|}}}|{{{建築材料|}}}}}
| header90 = {{#ifeq:{{{nrhp|}}}|yes|{{#if:{{{designated|}}}|[[国家历史地标|美国国家历史地标]]|[[國家史蹟名錄|美国国家史迹名录]]}}}}
| label91 = 列入国家史迹名录
| data91 = {{#ifeq:{{{nrhp|}}}|yes|{{{added|}}}}}
| label92 = 国家史迹名录编号
| data92 = {{#ifeq:{{{nrhp|}}}|yes|{{{refnum|}}}}}
| label93 = 列入国家历史地标
| data93 = {{#ifeq:{{{nrhp|}}}|yes|{{{designated|}}}}}
| header94 = _BLANK_
<!--designation section-->
| data95 = {{#if:{{{designation1|}}}{{{designation2|}}}|{{Infobox designation list|embed=yes
| designation1 = {{{designation1|}}}
| designation1_region = {{{designation1_region|}}}
| designation1_offname = {{{designation1_offname|}}}
| designation1_type = {{{designation1_type|}}}
| designation1_criteria = {{{designation1_criteria|}}}
| designation1_date = {{{designation1_date|}}}
| delisted1_date = {{{delisted1_date|}}}
| designation1_partof = {{{designation1_partof|}}}
| designation1_number = {{{designation1_number|}}}
| designation1_free1name = {{{designation1_free1name|}}}
| designation1_free1value = {{{designation1_free1value|}}}
| designation1_free2name = {{{designation1_free2name|}}}
| designation1_free2value = {{{designation1_free2value|}}}
| designation1_free3name = {{{designation1_free3name|}}}
| designation1_free3value = {{{designation1_free3value|}}}
| designation2 = {{{designation2|}}}
| designation2_region = {{{designation2_region|}}}
| designation2_offname = {{{designation2_offname|}}}
| designation2_type = {{{designation2_type|}}}
| designation2_criteria = {{{designation2_criteria|}}}
| designation2_date = {{{designation2_date|}}}
| delisted2_date = {{{delisted2_date|}}}
| designation2_partof = {{{designation2_partof|}}}
| designation2_number = {{{designation2_number|}}}
| designation2_free1name = {{{designation2_free1name|}}}
| designation2_free1value = {{{designation2_free1value|}}}
| designation2_free2name = {{{designation2_free2name|}}}
| designation2_free2value = {{{designation2_free2value|}}}
| designation2_free3name = {{{designation2_free3name|}}}
| designation2_free3value = {{{designation2_free3value|}}}
}}}}
<!--designation section end-->
| data102 = {{{module|{{{embedded|}}}}}}
| data103 = {{{module2|}}}
| header104 = 地图
| data105 = {{If both|{{{location_map|}}}{{{map_type|}}}{{{地圖|}}}{{{地图|}}}|{{{coordinates|}}}{{{geo|}}}{{{坐标|}}}{{{坐標|}}}{{#property:P625}}|{{Location map
|{{if empty|{{{location_map|}}}|{{{map_type|}}}|{{{地圖|}}}|{{{地图|}}}}}
|coordinates = {{{coordinates|{{{geo|{{{坐標|{{{坐标|}}}}}}}}}}}}
|width = {{{map_size|}}}
|float = center
|border = infobox
|alt = {{{map_alt|}}}
|relief = {{if empty|{{{map_relief|}}}|{{{relief|}}}}}
|caption = {{if empty|{{{map_caption|}}}|{{{地图说明|}}}|{{{地圖說明|}}}|{{{pushpin_map_caption|}}}|{{if empty|{{{name|}}}|{{{building_name|}}}|{{{名字|}}}|{{PAGENAMEBASE}}}}在{{#invoke:Location map|data|{{{location_map|{{{map_type|{{{地圖|{{{地图|}}}}}}}}}}}}|name}}的位置}}
|mark = {{#switch:{{{religious_affiliation|{{{宗教|}}}}}}
| [[亚美尼亚使徒教会]] | [[亞美尼亞使徒教會]]
| [[Mekhitarist Order]] = Set01-church1.svg
| [[耆那教]] = In-jain.svg
| [[印度教]] = Om symbol.svg
| [[神道]]|[[神道教]] = Shinto torii icon vermillion.svg
| 佛教|[[佛教]]|[[漢傳佛教]]|[[汉传佛教]]|[[大乘佛教]]|[[日本佛教]]|[[上座部佛教]]|[[禪宗]]|[[禅宗]] = Dharma Wheel (2).svg
| [[藏傳佛教]]|[[藏传佛教]] = Faith Buddhism Vajra.svg
| #default = }}
|marksize = {{#switch:{{{religious_affiliation|{{{宗教|}}}}}}
| [[亚美尼亚使徒教会]] | [[亞美尼亞使徒教會]]
| [[Mekhitarist Order]] = 16
| [[耆那教]] = 12
| [[印度教]] = 8
| [[神道]]|[[神道教]] = 20
| 佛教|[[佛教]]|[[漢傳佛教]]|[[汉传佛教]]|[[大乘佛教]]|[[日本佛教]]|[[上座部佛教]]|[[禪宗]]|[[禅宗]]|[[藏傳佛教]]|[[藏传佛教]] = 20
| #default = }}
}}}}
| data106 = {{#invoke:Infobox mapframe
| autoWithCaption
| onByDefault = yes
| coordinates = {{{coordinates|{{{geo|{{{坐标|{{{坐標|}}}}}}}}}}}}
| mapframe-zoom = 13
| mapframe-marker = {{#switch:{{{religious_affiliation|{{{宗教|}}}}}}
| 佛教|[[佛教]]|[[漢傳佛教]]|[[汉传佛教]]|[[大乘佛教]]|[[日本佛教]]|[[上座部佛教]]|[[禪宗]]|[[禅宗]] = religious-buddhist
| [[罗马天主教会]] | [[羅馬天主教會]] | [[天主教會]] | [[天主教会]] | [[天主教]] = religious-christian
| [[伊斯兰教]] | [[伊斯蘭教]] = religious-muslim
| [[犹太教]] | [[猶太教]] = religious-jewish
| [[神道]] | [[神道教]] = religious-shinto
| #default = }}
| mapframe-type = landmark
| mapframe-wikidata = yes
}}
| below = {{{footnotes|}}}
}}{{#invoke:Check for unknown parameters|check|unknown={{Main other|[[Category:使用未知Infobox_religious_building參數的頁面|_VALUE_{{PAGENAME}}]]}}|preview=页面使用了[[Template:Infobox religious building]]不存在的参数"_VALUE_"|ignoreblank=y|mapframe_args=y|child|religious_affiliation|宗教|name|building_name|名字|native_name|native_name_lang|image|img|图片|圖片|image_size|img_size|image_upright|alt|caption|圖片說明|图片说明|img_capt|former_names|former_name|other_names|country|國家|国家|region|地区|地區|province|省|state|州|prefecture|地方行政區|地方行政区|territory|district|municipality|基層政權|基层政权|sector|cercle|location|位置|locale|address|coordinates|geo|坐标|坐標|coordinates_footnotes|grid_name|grid_position|elevation_m|elevation_footnotes|elevation_ft|religious_affiliation_note|sect|派别|派別|denomination|tradition|archdiocese|diocese|mather|children|temple|deity|神|venerated|rite|festivals|festival|节日|節日|title1_label|type|mountain|sangou|山號|山号|organisational_status|title2_label|title2|开光年份|開光年份|consecration_year|administration|ownership|所有者|governing_body|leadership|领导|領導|imam|abbot|leader_label|leader|patron|functional_status|狀態|状态|status|heritage_designation|nrhp|designated|heritage|website|architect|建築師|建筑师|architecture_type|建筑类型|建築類型|architecture_style|建築風格|建筑风格|funded_by|资助者|資助者|general_contractor|established|建立日期|year|founded|groundbreaking|奠基|completed|竣工|year_completed|construction_cost|date_demolished|毁坏|毀壞|date_destroyed|closed|founded_by|建立者|creator|founder|facade_direction|capacity|容纳人数|容納人數|length|width|width_nave|site_area|场地面积|場地面積|floor_area|interior_area|内部面积|內部面積|height_max|dome_quantity|dome_height_outer|dome_height_inner|dome_dia_outer|dome_dia_inner|minaret_quantity|minaret_height|spire_quantity|尖塔|spire_height|尖塔高度|temple_quantity|monument_quantity|shrine_quantity|inscriptions|materials|建築材料|建筑材料|added|refnum|designation1|designation2|designation1_region|designation1_offname|designation1_type|designation1_criteria|designation1_date|delisted1_date|designation1_partof|designation1_number|designation1_free1name|designation1_free1value|designation1_free2name|designation1_free2value|designation1_free3name|designation1_free3value|designation2_region|designation2_offname|designation2_type|designation2_criteria|designation2_date|delisted2_date|designation2_partof|designation2_number|designation2_free1name|designation2_free1value|designation2_free2name|designation2_free2value|designation2_free3name|designation2_free3value|module|embedded|module2|mapframe|location_map|map_type|地圖|地图|map_size|map_alt|map_relief|relief|map_caption|地图说明|地圖說明|pushpin_map_caption|footnotes}}<!--
-->{{Main other|{{#if:{{{religious_affiliation|{{{宗教|}}}}}}
|{{#ifeq:{{Infobox religious building/color|{{{religious_affiliation|{{{宗教|}}}}}}}}|#D3D3D3|[[Category:Infobox religious building使用未知宗教参数的页面|{{#invoke:String|replace|source={{{religious_affiliation|{{{宗教|}}}}}}|pattern=[%]%[]+|replace=|plain=false}}]]}}
|[[Category:Infobox religious building未填写宗教参数的页面]]}}}}<!--
--><noinclude>
{{Documentation}}
</noinclude>
iu0ys56j9wtwwqcoole9gs2ltkwyxx9
ᥗᥦᥛᥰ ᥙᥣ ᥘᥥᥐᥳ:Infobox religious building/count
10
2577
7801
2026-09-08T13:45:02Z
咽頭べさ
24
Created page with "{{#invoke:ParameterCount|all}}<noinclude>{{documentation|content=模板用于{{tl|infobox religious building}}}}</noinclude>"
7801
wikitext
text/x-wiki
{{#invoke:ParameterCount|all}}<noinclude>{{documentation|content=模板用于{{tl|infobox religious building}}}}</noinclude>
4xj5xiis12onlqb1ycz7h2a07dvao06
7802
7801
2026-09-08T13:45:44Z
咽頭べさ
24
7802
wikitext
text/x-wiki
{{#invoke:ParameterCount|all}}<noinclude>{{documentation|content=Templates are used for{{tl|infobox religious building}}}}</noinclude>
ftlpfcylmco2v0ap36z56igz2rtg5ho
ᥛᥨᥝᥱ ᥓᥧᥰ:ParameterCount
828
2578
7803
2026-09-08T13:47:33Z
咽頭べさ
24
Created page with "-- This module produces a count of all the arguments passed to it. local yesno = require('Module:Yesno') -- Trim a string local function trim(s) return s:match('^%s*(.-)%s*$') end -- Test whether a string is blank local function isBlank(s) return not s:find('%S') end -- Tests whether a string is a valid positional key, and if so, returns it. If -- the key is invalid, this returns nil. local function isPositionalKey(s) s = trim(s) if s:find('^[1-9][0-9]*$') then..."
7803
Scribunto
text/plain
-- This module produces a count of all the arguments passed to it.
local yesno = require('Module:Yesno')
-- Trim a string
local function trim(s)
return s:match('^%s*(.-)%s*$')
end
-- Test whether a string is blank
local function isBlank(s)
return not s:find('%S')
end
-- Tests whether a string is a valid positional key, and if so, returns it. If
-- the key is invalid, this returns nil.
local function isPositionalKey(s)
s = trim(s)
if s:find('^[1-9][0-9]*$') then
return tonumber(s)
end
end
-- Return the count of all arguments for which testFunc returns a truthy value.
local function count(args, testFunc)
local ret = 0
for key, val in pairs(args) do
if testFunc(key, val) then
ret = ret + 1
end
end
return ret
end
-- Check shared arguments and get the parent argument count.
local function main(frame, testFunc)
local blankifiedTestFunc
if yesno(frame.args.checkblanks) ~= false then
-- Extend the test function to check for blanks as well.
blankifiedTestFunc = function (key, val)
if not isBlank(val) then
return testFunc(key, val)
end
end
else
blankifiedTestFunc = testFunc
end
return count(frame:getParent().args, blankifiedTestFunc)
end
return {
-- Called with {{#invoke:ParameterCount|all}}
-- All specified parameters are counted, even those not supported by the
-- template.
all = function (frame)
return main(frame, function () return true end)
end,
-- Called with {{#invoke:ParameterCount|main}}
-- Users can specify a list of parameters to check, and a list of Lua
-- Ustring patterns to check each parameter against.
main = function (frame)
local args = frame.args
local keys, patterns = {}, {}
-- Get key list
for i, key in ipairs(args) do
local positionalKey = isPositionalKey(key)
if positionalKey then
keys[positionalKey] = true
else
keys[trim(key)] = true
end
end
-- Get patterns
do
local function getPattern(i)
local pattern = args['pattern' .. tostring(i)]
if pattern and pattern ~= '' then
return pattern
end
end
local i = 1
local pattern = getPattern(i)
while pattern do
patterns[i] = pattern
i = i + 1
pattern = getPattern(i)
end
end
-- Construct the test function
local testFunc = function (key, val)
if keys[key] then
return true
end
for i, pattern in ipairs(patterns) do
if mw.ustring.find(tostring(key), pattern) then
return true
end
end
return false
end
return main(frame, testFunc)
end
}
bo1vhgb6r7zni8qgcvzfnnphlmq92ml
ᥗᥦᥛᥰ ᥙᥣ ᥘᥥᥐᥳ:Infobox religious building/color
10
2579
7804
2026-09-08T13:49:31Z
咽頭べさ
24
Created page with "{{#switch: {{{1|}}} | = | [[阿布哈兹正教会]] | [[亚美尼亚使徒教会]] | [[亞美尼亞使徒教會]] | [[正教會]] | [[正教会]] | [[东正教会]] | [[東正教會]] | [[东正教]] | [[東正教]] | [[格鲁吉亚正教会]] | [[喬治亞正教會]] | [[希臘正教會]] | [[希腊正教会]] | [[俄罗斯正教会]] | [[俄羅斯正教會]] | [[保加利亞正教會]] | [[保加利亚正教会]] | [[塞爾維亞正教會]] | [[塞尔维亚正教会]]..."
7804
wikitext
text/x-wiki
{{#switch: {{{1|}}}
| =
| [[阿布哈兹正教会]]
| [[亚美尼亚使徒教会]] | [[亞美尼亞使徒教會]]
| [[正教會]] | [[正教会]] | [[东正教会]] | [[東正教會]] | [[东正教]] | [[東正教]]
| [[格鲁吉亚正教会]] | [[喬治亞正教會]]
| [[希臘正教會]] | [[希腊正教会]]
| [[俄罗斯正教会]] | [[俄羅斯正教會]]
| [[保加利亞正教會]] | [[保加利亚正教会]]
| [[塞爾維亞正教會]] | [[塞尔维亚正教会]] = #FFCF00
| [[聖公宗]] | [[圣公宗]] | [[圣公会]] | [[聖公會]]
| [[美国圣公会]] | [[美國聖公會]]
| [[英格蘭教會]] | [[英格兰教会]] = #EBB0DE
| [[亚历山大科普特正教会]] | [[亞歷山大科普特正教會]] | [[科普特正教会]] | [[科普特正教會]] = #56A8FF
|佛教|[[佛教]]|[[漢傳佛教]]|[[汉传佛教]]|[[大乘佛教]]
|[[日本佛教]]|[[上座部佛教]]|[[禪宗]]|[[禅宗]]
|[[大韩佛教曹溪宗]]|[[大韓佛教曹溪宗]]|[[曹洞宗]] = #FFCC33
|[[藏傳佛教]]|[[藏传佛教]] = #800547; color: #FFD068;
| [[印度教]] = #FFC569
| [[伊斯兰教]] | [[伊斯蘭教]] = #9BE89B
| [[耆那教]] = #F5DEB3
| [[哈雷迪猶太教]] | [[哈雷迪犹太教]]
| [[哈西迪猶太教]] | [[哈西迪犹太教]]
| [[猶太教正統派]] | [[犹太教正统派]]
| [[犹太教现代正统派]]
| [[猶太教保守派]] | [[犹太教保守派]]
| [[新犹太主义]] | [[新猶太主義]] = #9BB4EB
| [[猶太教重建派]] | [[犹太教重建派]]
| [[猶太教改革派]] | [[犹太教改革派]] = #87CEFA
| [[犹太教]] | [[猶太教]] = #ADD8E6
| [[罗马天主教会]] | [[羅馬天主教會]] | [[罗马天主教]] | [[羅馬天主教]]
| [[天主教會]] | [[天主教会]] | [[天主教]] = #FFCC99
| [[十二伊玛目派]] | [[十二伊瑪目派]]
| [[什叶派]] | [[什葉派]] = #ABE9CC
| [[阿赫迈底亚]] | [[阿赫邁底亞]]
| [[圣训派]]
| [[Ahle Hadith]]
| [[巴列维派]]
| [[迪奧班迪]]
| [[哈乃斐派]] | [[哈納菲法學派]]
| [[沙斐仪派]] | [[莎菲懿法學派]]
| [[逊尼派]] | [[遜尼派]] = #CCFFCC
| [[敘利亞東方正統教會]] | [[叙利亚东方正统教会]]
| [[敘利亞禮天主教會]] | [[叙利亚礼天主教会]]
| [[马龙尼礼教会]] | [[馬龍尼禮教會]]
| [[加色丁禮天主教會]] | [[加色丁礼天主教会]]
| [[東方亞述教會]] | [[东方亚述教会]] = #CCB2FF
| [[耶穌基督後期聖徒教會]]|[[耶稣基督后期圣徒教会]] = #dcf0ff
| [[巴哈伊教]] | [[巴哈伊信仰]] = #FF8C00
| [[锡克教]] | [[錫克教]] = #FFC600
| [[神道]]|[[神道教]] = #A12F25; color: #fff;
| [[道教]] = #505858; color: #FFF;
| [[苯教]] = #87CEFA
| #default = #D3D3D3
}}<noinclude>{{documentation|content=
这个模板用于决定 {{tl|Infobox religious building}} 各节色彩的配置。
}}</noinclude>
ew36ss05aoqbfjbpu5kfelhaz5bqr7l
ᥗᥦᥛᥰ ᥙᥣ ᥘᥥᥐᥳ:If both
10
2580
7805
2026-09-08T13:52:48Z
咽頭べさ
24
Created page with "{{safesubst:<noinclude/>#if:{{{1|}}}| {{safesubst:<noinclude/>#if:{{{2|}}}|{{{3|}}}|{{{4|}}}}} |{{{4|}}} }}<noinclude> {{Documentation}} <!-- PLEASE ADD CATEGORIES TO THE /doc SUBPAGE, THANKS --> </noinclude>"
7805
wikitext
text/x-wiki
{{safesubst:<noinclude/>#if:{{{1|}}}| {{safesubst:<noinclude/>#if:{{{2|}}}|{{{3|}}}|{{{4|}}}}} |{{{4|}}} }}<noinclude>
{{Documentation}}
<!--
PLEASE ADD CATEGORIES
TO THE /doc SUBPAGE, THANKS
-->
</noinclude>
nuwl84dtikaj4rfmr0nwvxnatlew8ks
ᥗᥦᥛᥰ ᥙᥣ ᥘᥥᥐᥳ:Sfnb
10
2581
7809
2026-09-08T14:02:39Z
咽頭べさ
24
Created page with "<includeonly>{{#invoke:Footnotes|sfn |bracket_year_left = ( |bracket_year_right = ) |template=sfnp }}</includeonly>{{#invoke:Check for unknown parameters|check|unknown={{main other|[[Category:Pages using sfn with unknown parameters|_VALUE_{{PAGENAME}}]]}}|preview=Page using [[Template:Sfnp]] with unknown parameter "_VALUE_"|ignoreblank=y| 1 | 2 | 3 | 4 | 5 | ignore-err | at | loc | p | page | pages | postscript | pp | ps | ref | Ref | group}}<noinclude> {{documentation}}..."
7809
wikitext
text/x-wiki
<includeonly>{{#invoke:Footnotes|sfn
|bracket_year_left = (
|bracket_year_right = )
|template=sfnp
}}</includeonly>{{#invoke:Check for unknown parameters|check|unknown={{main other|[[Category:Pages using sfn with unknown parameters|_VALUE_{{PAGENAME}}]]}}|preview=Page using [[Template:Sfnp]] with unknown parameter "_VALUE_"|ignoreblank=y| 1 | 2 | 3 | 4 | 5 | ignore-err | at | loc | p | page | pages | postscript | pp | ps | ref | Ref | group}}<noinclude>
{{documentation}}
</noinclude>
gk11i81pscd7xwivs6h5yo5jb8y08cl
ᥛᥨᥝᥱ ᥓᥧᥰ:Location map/data/China Yunnan
828
2582
7810
2026-09-08T14:03:57Z
咽頭べさ
24
Created page with "return { name = 'Yunnan', top = 29.5, bottom = 21.0, left = 97.2, right = 106.5, image = 'China Yunnan adm location map.svg', image1 = 'China Yunnan rel location map.svg' }"
7810
Scribunto
text/plain
return {
name = 'Yunnan',
top = 29.5,
bottom = 21.0,
left = 97.2,
right = 106.5,
image = 'China Yunnan adm location map.svg',
image1 = 'China Yunnan rel location map.svg'
}
56del7zurzqpfqsoivcg84frj4k16hw
ᥛᥨᥝᥱ ᥓᥧᥰ:Citation/CS1/Utilities
828
2583
7811
2026-09-08T14:05:19Z
咽頭べさ
24
Created page with "local z = { error_cats_t = {}; -- for categorizing citations that contain errors error_ids_t = {}; -- list of error identifiers; used to prevent duplication of certain errors; local to this module error_msgs_t = {}; -- sequence table of error messages maint_cats_t = {}; -- for categorizing citations that aren't erroneous per se, but could use a little work prop_cats_t = {}; -- for categorizing cit..."
7811
Scribunto
text/plain
local z = {
error_cats_t = {}; -- for categorizing citations that contain errors
error_ids_t = {}; -- list of error identifiers; used to prevent duplication of certain errors; local to this module
error_msgs_t = {}; -- sequence table of error messages
maint_cats_t = {}; -- for categorizing citations that aren't erroneous per se, but could use a little work
prop_cats_t = {}; -- for categorizing citations based on certain properties, language of source for instance
prop_keys_t = {}; -- for adding classes to the citation's <cite> tag
};
--[[--------------------------< F O R W A R D D E C L A R A T I O N S >--------------------------------------
]]
local cfg; -- table of tables imported from selected Module:Citation/CS1/Configuration
--[[--------------------------< I S _ S E T >------------------------------------------------------------------
Returns true if argument is set; false otherwise. Argument is 'set' when it exists (not nil) or when it is not an empty string.
]]
local function is_set (var)
return not (var == nil or var == '');
end
--[[--------------------------< I N _ A R R A Y >--------------------------------------------------------------
Whether needle is in haystack
]]
local function in_array (needle, haystack)
if needle == nil then
return false;
end
for n, v in ipairs (haystack) do
if v == needle then
return n;
end
end
return false;
end
--[[--------------------------< H A S _ A C C E P T _ A S _ W R I T T E N >------------------------------------
When <str> is wholly wrapped in accept-as-written markup, return <str> without markup and true; return <str> and false else
with allow_empty = false, <str> must have at least one character inside the markup
with allow_empty = true, <str> the markup frame can be empty like (()) to distinguish an empty template parameter from the specific condition "has no applicable value" in citation-context.
After further evaluation the two cases might be merged at a later stage, but should be kept separated for now.
]]
local function has_accept_as_written (str, allow_empty)
if not is_set (str) then
return str, false;
end
local count;
if true == allow_empty then
str, count = str:gsub ('^%(%((.*)%)%)$', '%1'); -- allows (()) to be an empty set
else
str, count = str:gsub ('^%(%((.+)%)%)$', '%1');
end
return str, 0 ~= count;
end
--[[--------------------------< S U B S T I T U T E >----------------------------------------------------------
Populates numbered arguments in a message string using an argument table. <args> may be a single string or a
sequence table of multiple strings.
]]
local function substitute (msg, args)
return args and mw.message.newRawMessage (msg, args):plain() or msg;
end
--[[--------------------------< E R R O R _ C O M M E N T >----------------------------------------------------
Wraps error messages with CSS markup according to the state of hidden. <content> may be a single string or a
sequence table of multiple strings.
]]
local function error_comment (content, hidden)
return substitute (hidden and cfg.presentation['hidden-error'] or cfg.presentation['visible-error'], content);
end
--[[--------------------------< H Y P H E N _ T O _ D A S H >--------------------------------------------------
Converts a hyphen, endash, emdash to endash under certain conditions. The hyphen/en/em must separate
like items; unlike items are returned unmodified. These forms are modified:
letter - letter (A-B)
digit - digit (4-5)
digit separator digit - digit separator digit (4.1-4.5 or 4-1-4-5)
letterdigit - letterdigit (A1-A5) (an optional separator between letter and
digit is supported – a.1-a.5 or a-1-a-5)
digitletter - digitletter (5a-5d) (an optional separator between letter and
digit is supported – 5.a-5.d or 5-a-5-d)
any other forms are returned unmodified.
str may be a comma- or semicolon-separated list of page ranges with/without single pages
]]
local function hyphen_to_dash (str)
if not is_set (str) then
return str;
end
str = str:gsub ("(%(%(.-%)%))", function(m) return m:gsub(",", ","):gsub(";", ";") end) -- replace commas and semicolons in accept-as-written markup with similar unicode characters so they'll be ignored during the split
str = str:gsub ('&[nm]dash;', {['–'] = '–', ['—'] = '—'}); -- replace — and – entities with their characters; semicolon mucks up the text.split
str = str:gsub ('-', '-'); -- replace HTML numeric entity with hyphen character
str = str:gsub (' ', ' '); -- replace entity with generic keyboard space character
local out = {};
local list = mw.text.split (str, '%s*[,;]%s*'); -- split str at comma or semicolon separators if there are any
local accept; -- boolean
for _, item in ipairs (list) do -- for each item in the list
item, accept = has_accept_as_written (item); -- remove accept-this-as-written markup when it wraps all of item
if not accept and mw.ustring.match (item, '^%w*[%.%-]?%w+%s*[—–-]%s*%w*[%.%-]?%w+$') then -- if pagination uses <hyphen|dot> separators with hyphen/endash/emdash <range separator>
if mw.ustring.match (item, '^%a+[%.%-]%d+%s*[—–-]%s*%a+[%.%-]%d+$') or -- letter<hyphen|dot>digit <range separator> letter<hyphen|dot>digit (requires <hyphen|dot> separator between letter and digit)
mw.ustring.match (item, '^%d+[%.%-]%a+%s*[—–-]%s*%d+[%.%-]%a+$') or -- digit<hyphen|dot>letter <range separator> digit<hyphen|dot>letter (requires <hyphen|dot> separator between digit and letter)
mw.ustring.match (item, '^%d+[%.%-]%d+%s*[—–-]%s*%d+[%.%-]%d+$') then -- digit<hyphen|dot>digit <range separator> digit<hyphen|dot>digit (requires <hyphen|dot> separator between digit and digit)
item = mw.ustring.gsub (item, '(%w*[%.%-]%w+)%s*[—–-]%s*(%w*[%.%-]%w+)', '<span class="nowrap">%1 –</span> <span class="nowrap">%2</span>'); -- replace <range separator>, with spaced endash
elseif mw.ustring.match (item, '^%d+%a+%s*[—–-]%s*%d+%a+$') or -- digitletter <range separator> digitletter
mw.ustring.match (item, '^%a+%d+%s*[—–-]%s*%a+%d+$') or -- letterdigit <range separator> letterdigit
mw.ustring.match (item, '^%d+%s*[—–-]%s*%d+$') or -- digit <range separator> digit
mw.ustring.match (item, '^%a+%s*[—–-]%s*%a+$') then -- letter<range separator> letter
item = mw.ustring.gsub (item, '(%w+)%s*[—–-]%s*(%w+)', '<span class="nowrap">%1–</span>%2'); -- replace <range separator> with endash, remove extraneous space characters
else
-- item = mw.ustring.gsub (item, '%s*[—–-]%s*', '–'); -- disabled; here when 'unlike' items so return <item> as is
end
end
table.insert (out, item); -- add the (possibly modified) item to the output table
end
local temp_str; -- concatenate the output table into a comma separated string
temp_str, accept = has_accept_as_written (table.concat (out, ', ')); -- remove accept-this-as-written markup when it wraps all of concatenated out
if accept then
temp_str = has_accept_as_written (str); -- when global markup removed, return original str; do it this way to suppress boolean second return value
return temp_str:gsub(",", ","):gsub(";", ";");
else
return temp_str:gsub(",", ","):gsub(";", ";"); -- else, return assembled temp_str
end
end
--[=[-------------------------< M A K E _ W I K I L I N K >----------------------------------------------------
Makes a wikilink; when both link and display text is provided, returns a wikilink in the form [[L|D]]; if only
link is provided (or link and display are the same), returns a wikilink in the form [[L]]; if neither are
provided or link is omitted, returns an empty string.
]=]
local function make_wikilink (link, display)
if not is_set (link) then return '' end
if is_set (display) and link ~= display then
return table.concat ({'[[', link, '|', display, ']]'});
else
return table.concat ({'[[', link, ']]'});
end
end
--[[--------------------------< S E T _ M E S S A G E >----------------------------------------------------------
Sets an error message using the ~/Configuration error_conditions{} table along with arguments supplied in the function
call, inserts the resulting message in z.error_msgs_t{} sequence table, and returns the error message.
<error_id> – key value for appropriate error handler in ~/Configuration error_conditions{} table
<arguments> – may be a single string or a sequence table of multiple strings to be subsititued into error_conditions[error_id].message
<raw> – boolean
true – causes this function to return the error message not wrapped in visible-error, hidden-error span tag;
returns error_conditions[error_id].hidden as a second return value
does not add message to z.error_msgs_t sequence table
false, nil – adds message wrapped in visible-error, hidden-error span tag to z.error_msgs_t
returns the error message wrapped in visible-error, hidden-error span tag; there is no second return value
<prefix> – string to be prepended to <message> -- TODO: remove support for these unused(?) arguments?
<suffix> – string to be appended to <message>
TODO: change z.error_cats_t and z.maint_cats_t to have the form cat_name = true? this to avoid dups without having to have an extra table
]]
local added_maint_cats = {} -- list of maintenance categories that have been added to z.maint_cats_t; TODO: figure out how to delete this table
local function set_message (error_id, arguments, raw, prefix, suffix)
local error_state = cfg.error_conditions[error_id];
prefix = prefix or '';
suffix = suffix or '';
if error_state == nil then
error (cfg.messages['undefined_error'] .. ': ' .. error_id); -- because missing error handler in Module:Citation/CS1/Configuration
elseif is_set (error_state.category) then
if error_state.message then -- when error_state.message defined, this is an error message
table.insert (z.error_cats_t, error_state.category);
else
if not added_maint_cats[error_id] then
added_maint_cats[error_id] = true; -- note that we've added this category
table.insert (z.maint_cats_t, substitute (error_state.category, arguments)); -- make cat name then add to table
end
return; -- because no message, nothing more to do
end
end
local message = substitute (error_state.message, arguments);
message = table.concat (
{
message,
' (',
make_wikilink (
table.concat (
{
cfg.messages['help page link'],
'#',
error_state.anchor
}),
cfg.messages['help page label']),
')'
});
z.error_ids_t[error_id] = true;
if z.error_ids_t['err_citation_missing_title'] and -- if missing-title error already noted
in_array (error_id, {'err_bare_url_missing_title', 'err_trans_missing_title'}) then -- and this error is one of these
return '', false; -- don't bother because one flavor of missing title is sufficient
end
message = table.concat ({prefix, message, suffix});
if true == raw then
return message, error_state.hidden; -- return message not wrapped in visible-error, hidden-error span tag
end
message = error_comment (message, error_state.hidden); -- wrap message in visible-error, hidden-error span tag
table.insert (z.error_msgs_t, message); -- add it to the messages sequence table
return message; -- and done; return value generally not used but is used as a flag in various functions of ~/Identifiers
end
--[[-------------------------< I S _ A L I A S _ U S E D >-----------------------------------------------------
This function is used by select_one() to determine if one of a list of alias parameters is in the argument list
provided by the template.
Input:
args – pointer to the arguments table from calling template
alias – one of the list of possible aliases in the aliases lists from Module:Citation/CS1/Configuration
index – for enumerated parameters, identifies which one
enumerated – true/false flag used to choose how enumerated aliases are examined
value – value associated with an alias that has previously been selected; nil if not yet selected
selected – the alias that has previously been selected; nil if not yet selected
error_list – list of aliases that are duplicates of the alias already selected
Returns:
value – value associated with alias we selected or that was previously selected or nil if an alias not yet selected
selected – the alias we selected or the alias that was previously selected or nil if an alias not yet selected
]]
local function is_alias_used (args, alias, index, enumerated, value, selected, error_list)
if enumerated then -- is this a test for an enumerated parameters?
alias = alias:gsub ('#', index); -- replace '#' with the value in index
else
alias = alias:gsub ('#', ''); -- remove '#' if it exists
end
if is_set (args[alias]) then -- alias is in the template's argument list
if value ~= nil and selected ~= alias then -- if we have already selected one of the aliases
local skip;
for _, v in ipairs (error_list) do -- spin through the error list to see if we've added this alias
if v == alias then
skip = true;
break; -- has been added so stop looking
end
end
if not skip then -- has not been added so
table.insert (error_list, alias); -- add error alias to the error list
end
else
value = args[alias]; -- not yet selected an alias, so select this one
selected = alias;
end
end
return value, selected; -- return newly selected alias, or previously selected alias
end
--[[--------------------------< A D D _ M A I N T _ C A T >------------------------------------------------------
Adds a category to z.maint_cats_t using names from the configuration file with additional text if any.
To prevent duplication, the added_maint_cats table lists the categories by key that have been added to z.maint_cats_t.
]]
local function add_maint_cat (key, arguments)
if not added_maint_cats [key] then
added_maint_cats [key] = true; -- note that we've added this category
table.insert (z.maint_cats_t, substitute (cfg.maint_cats [key], arguments)); -- make name then add to table
end
end
--[[--------------------------< A D D _ P R O P _ C A T >--------------------------------------------------------
Adds a category to z.prop_cats_t using names from the configuration file with additional text if any.
foreign_lang_source and foreign_lang_source_2 keys have a language code appended to them so that multiple languages
may be categorized but multiples of the same language are not categorized.
added_prop_cats is a table declared in page scope variables above
]]
local added_prop_cats = {}; -- list of property categories that have been added to z.prop_cats_t
local function add_prop_cat (key, arguments, key_modifier)
local key_modified = key .. ((key_modifier and key_modifier) or ''); -- modify <key> with <key_modifier> if present and not nil
if not added_prop_cats [key_modified] then
added_prop_cats [key_modified] = true; -- note that we've added this category
table.insert (z.prop_cats_t, substitute (cfg.prop_cats [key], arguments)); -- make name then add to table
table.insert (z.prop_keys_t, 'cs1-prop-' .. key); -- convert key to class for use in the citation's <cite> tag
end
end
--[[--------------------------< S A F E _ F O R _ I T A L I C S >----------------------------------------------
Protects a string that will be wrapped in wiki italic markup '' ... ''
Note: We cannot use <i> for italics, as the expected behavior for italics specified by ''...'' in the title is that
they will be inverted (i.e. unitalicized) in the resulting references. In addition, <i> and '' tend to interact
poorly under Mediawiki's HTML tidy.
]]
local function safe_for_italics (str)
if not is_set (str) then return str end
if str:sub (1, 1) == "'" then str = "<span></span>" .. str; end
if str:sub (-1, -1) == "'" then str = str .. "<span></span>"; end
return str:gsub ('\n', ' '); -- Remove newlines as they break italics.
end
--[[--------------------------< W R A P _ S T Y L E >----------------------------------------------------------
Applies styling to various parameters. Supplied string is wrapped using a message_list configuration taking one
argument; protects italic styled parameters. Additional text taken from citation_config.presentation - the reason
this function is similar to but separate from wrap_msg().
]]
local function wrap_style (key, str)
if not is_set (str) then
return "";
elseif in_array (key, {'italic-title', 'trans-italic-title'}) then
str = safe_for_italics (str);
end
return substitute (cfg.presentation[key], {str});
end
--[[--------------------------< M A K E _ S E P _ L I S T >------------------------------------------------------------
make a separated list of items using provided separators.
<sep_list> - typically '<comma><space>'
<sep_list_pair> - typically '<space>and<space>'
<sep_list_end> - typically '<comma><space>and<space>' or '<comma><space>&<space>'
defaults to cfg.presentation['sep_list'], cfg.presentation['sep_list_pair'], and cfg.presentation['sep_list_end']
if <sep_list_end> is specified, <sep_list> and <sep_list_pair> must also be supplied
]]
local function make_sep_list (count, list_seq, sep_list, sep_list_pair, sep_list_end)
local list = '';
if not sep_list then -- set the defaults
sep_list = cfg.presentation['sep_list'];
sep_list_pair = cfg.presentation['sep_list_pair'];
sep_list_end = cfg.presentation['sep_list_end'];
end
if 2 >= count then
list = table.concat (list_seq, sep_list_pair); -- insert separator between two items; returns list_seq[1] then only one item
elseif 2 < count then
list = table.concat (list_seq, sep_list, 1, count - 1); -- concatenate all but last item with plain list separator
list = table.concat ({list, list_seq[count]}, sep_list_end); -- concatenate last item onto end of <list> with final separator
end
return list;
end
--[[--------------------------< S E L E C T _ O N E >----------------------------------------------------------
Chooses one matching parameter from a list of parameters to consider. The list of parameters to consider is just
names. For parameters that may be enumerated, the position of the numerator in the parameter name is identified
by the '#' so |author-last1= and |author1-last= are represented as 'author-last#' and 'author#-last'.
Because enumerated parameter |<param>1= is an alias of |<param>= we must test for both possibilities.
Generates an error if more than one match is present.
]]
local function select_one (args, aliases_list, error_condition, index)
local value = nil; -- the value assigned to the selected parameter
local selected = ''; -- the name of the parameter we have chosen
local error_list = {};
if index ~= nil then index = tostring(index); end
for _, alias in ipairs (aliases_list) do -- for each alias in the aliases list
if alias:match ('#') then -- if this alias can be enumerated
if '1' == index then -- when index is 1 test for enumerated and non-enumerated aliases
value, selected = is_alias_used (args, alias, index, false, value, selected, error_list); -- first test for non-enumerated alias
end
value, selected = is_alias_used (args, alias, index, true, value, selected, error_list); -- test for enumerated alias
else
value, selected = is_alias_used (args, alias, index, false, value, selected, error_list); -- test for non-enumerated alias
end
end
if #error_list > 0 and 'none' ~= error_condition then -- for cases where this code is used outside of extract_names()
for i, v in ipairs (error_list) do
error_list[i] = wrap_style ('parameter', v);
end
table.insert (error_list, wrap_style ('parameter', selected));
set_message (error_condition, {make_sep_list (#error_list, error_list)});
end
return value, selected;
end
--[=[-------------------------< R E M O V E _ W I K I _ L I N K >----------------------------------------------
Gets the display text from a wikilink like [[A|B]] or [[B]] gives B
The str:gsub() returns either A|B froma [[A|B]] or B from [[B]] or B from B (no wikilink markup).
In l(), l:gsub() removes the link and pipe (if they exist); the second :gsub() trims whitespace from the label
if str was wrapped in wikilink markup. Presumably, this is because without wikimarkup in str, there is no match
in the initial gsub, the replacement function l() doesn't get called.
]=]
local function remove_wiki_link (str)
return (str:gsub ("%[%[([^%[%]]*)%]%]", function(l)
return l:gsub ("^[^|]*|(.*)$", "%1" ):gsub ("^%s*(.-)%s*$", "%1");
end));
end
--[=[-------------------------< I S _ W I K I L I N K >--------------------------------------------------------
Determines if str is a wikilink, extracts, and returns the wikilink type, link text, and display text parts.
If str is a complex wikilink ([[L|D]]):
returns wl_type 2 and D and L from [[L|D]];
if str is a simple wikilink ([[D]])
returns wl_type 1 and D from [[D]] and L as empty string;
if not a wikilink:
returns wl_type 0, str as D, and L as empty string.
trims leading and trailing whitespace and pipes from L and D ([[L|]] and [[|D]] are accepted by MediaWiki and
treated like [[D]]; while [[|D|]] is not accepted by MediaWiki, here, we accept it and return D without the pipes).
]=]
local function is_wikilink (str)
local D, L
local wl_type = 2; -- assume that str is a complex wikilink [[L|D]]
if not str:match ('^%[%[[^%]]+%]%]$') then -- is str some sort of a wikilink (must have some sort of content)
return 0, str, ''; -- not a wikilink; return wl_type as 0, str as D, and empty string as L
end
L, D = str:match ('^%[%[([^|]+)|([^%]]+)%]%]$'); -- get L and D from [[L|D]]
if not is_set (D) then -- if no separate display
D = str:match ('^%[%[([^%]]*)|*%]%]$'); -- get D from [[D]] or [[D|]]
wl_type = 1;
end
D = mw.text.trim (D, '%s|'); -- trim white space and pipe characters
return wl_type, D, L or '';
end
--[[--------------------------< S T R I P _ A P O S T R O P H E _ M A R K U P >--------------------------------
Strip wiki italic and bold markup from argument so that it doesn't contaminate COinS metadata.
This function strips common patterns of apostrophe markup. We presume that editors who have taken the time to
markup a title have, as a result, provided valid markup. When they don't, some single apostrophes are left behind.
Returns the argument without wiki markup and a number; the number is more-or-less meaningless except as a flag
to indicate that markup was replaced; do not rely on it as an indicator of how many of any kind of markup was
removed; returns the argument and nil when no markup removed
]]
local function strip_apostrophe_markup (argument)
if not is_set (argument) then
return argument, nil; -- no argument, nothing to do
end
if nil == argument:find ( "''", 1, true ) then -- Is there at least one double apostrophe? If not, exit.
return argument, nil;
end
local flag;
while true do
if argument:find ("'''''", 1, true) then -- bold italic (5)
argument, flag = argument:gsub ("%'%'%'%'%'", ""); -- remove all instances of it
elseif argument:find ("''''", 1, true) then -- italic start and end without content (4)
argument, flag=argument:gsub ("%'%'%'%'", "");
elseif argument:find ("'''", 1, true) then -- bold (3)
argument, flag=argument:gsub ("%'%'%'", "");
elseif argument:find ("''", 1, true) then -- italic (2)
argument, flag = argument:gsub ("%'%'", "");
else
break;
end
end
return argument, flag; -- done
end
--[[--------------------------< S E T _ S E L E C T E D _ M O D U L E S >--------------------------------------
Sets local cfg table to same (live or sandbox) as that used by the other modules.
]]
local function set_selected_modules (cfg_table_ptr)
cfg = cfg_table_ptr;
end
--[[--------------------------< E X P O R T S >----------------------------------------------------------------
]]
return {
add_maint_cat = add_maint_cat, -- exported functions
add_prop_cat = add_prop_cat,
error_comment = error_comment,
has_accept_as_written = has_accept_as_written,
hyphen_to_dash = hyphen_to_dash,
in_array = in_array,
is_set = is_set,
is_wikilink = is_wikilink,
make_sep_list = make_sep_list,
make_wikilink = make_wikilink,
remove_wiki_link = remove_wiki_link,
safe_for_italics = safe_for_italics,
select_one = select_one,
set_message = set_message,
set_selected_modules = set_selected_modules,
strip_apostrophe_markup = strip_apostrophe_markup,
substitute = substitute,
wrap_style = wrap_style,
z = z, -- exported table
}
bvyfrlfh7kkrrt2v6jk2f3z13girav4