ᥝᥤᥱ ᥑᥤᥱ ᥚᥤᥱ ᥖᥤᥱ ᥕᥣᥱ 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 .. ' &ndash; ' .. 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 .. '&params=' --[[ 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">&#xfeff; / &#xfeff;</span>' .. '<span class="' .. displayDefault(coordinateSpec["default"], "dec" ) .. '">'; if not args["name"] then inner = inner .. geodechtml .. '<span style="display:none">&#xfeff; / ' .. geonumhtml .. '</span></span>' else inner = inner .. '<span class="vcard">' .. geodechtml .. '<span style="display:none">&#xfeff; / ' .. geonumhtml .. '</span>' .. '<span style="display:none">&#xfeff; (<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">&#xfeff; (<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], '(&params=[^&"<>%[%] ]*) ', '%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 &nbsp; local space = trimToNil(args.nbsp) and "&nbsp;" 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.&nbsp;", pages_sep = ", pp.&nbsp;", 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, ' &amp; ', 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, ' &amp; ', 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, ' ', ' &amp; ', 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, ' &amp; ', 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;', {['&ndash;'] = '–', ['&mdash;'] = '—'}); -- replace &mdash; and &ndash; entities with their characters; semicolon mucks up the text.split str = str:gsub ('&#45;', '-'); -- replace HTML numeric entity with hyphen character str = str:gsub ('&nbsp;', ' '); -- replace &nbsp; 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 == "&#123;&#123;&#123;coordinates&#125;&#125;&#125;" 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&ndash;1874) ᥖᥤ[[ᥘᥣᥱ ᥓᥣᥱ ᥝᥣᥒᥰ ᥔᥤᥒ]] (1644&ndash;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&ndash;1874) ᥖᥤ[[ᥘᥣᥱ ᥓᥣᥱ ᥝᥣᥒᥰ ᥔᥤᥒ]] (1644&ndash;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|}}}|&#x23;{{#language:{{{lang}}}|en}}}}|{{{1}}}]]{{{n1|}}}{{#if: {{{2|}}}|{{{lim|}}}[[{{{pref|wikt}}}:{{{2}}}{{#if:{{{lang|}}}|&#x23;{{#language:{{{lang}}}|en}}}}|{{{2}}}]]}}{{{n2|}}}{{#if: {{{3|}}}|{{{lim|}}}[[{{{pref|wikt}}}:{{{3}}}{{#if:{{{lang|}}}|&#x23;{{#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|}}}|&#x23;{{#language:{{{lang}}}|en}}}}|{{{1}}}]]{{{n1|}}}{{#if: {{{2|}}}|{{{lim|}}}[[{{{pref|wikt}}}:{{{2}}}{{#if:{{{lang|}}}|&#x23;{{#language:{{{lang}}}|en}}}}|{{{2}}}]]}}{{{n2|}}}{{#if: {{{3|}}}|{{{lim|}}}[[{{{pref|wikt}}}:{{{3}}}{{#if:{{{lang|}}}|&#x23;{{#language:{{{lang}}}|en}}}}|{{{3}}}]]}}{{{n3|}}}{{#if: {{{4|}}}|{{{lim|}}}[[{{{pref|wikt}}}:{{{4}}}{{#if:{{{lang|}}}|&#x23;{{#language:{{{lang}}}|en}}}}|{{{4}}}]]}}{{{n4|}}}{{#if: {{{5|}}}|{{{lim|}}}[[{{{pref|wikt}}}:{{{5}}}{{#if:{{{lang|}}}|&#x23;{{#language:{{{lang}}}|en}}}}|{{{5}}}]]}}{{{n5|}}}{{#if: {{{6|}}}|{{{lim|}}}[[{{{pref|wikt}}}:{{{6}}}{{#if:{{{lang|}}}|&#x23;{{#language:{{{lang}}}|en}}}}|{{{6}}}]]}}{{{n6|}}}{{#if: {{{7|}}}|{{{lim|}}}[[{{{pref|wikt}}}:{{{7}}}{{#if:{{{lang|}}}|&#x23;{{#language:{{{lang}}}|en}}}}|{{{7}}}]]}}{{{n7|}}}{{#if: {{{8|}}}|{{{lim|}}}[[{{{pref|wikt}}}:{{{8}}}{{#if:{{{lang|}}}|&#x23;{{#language:{{{lang}}}|en}}}}|{{{8}}}]]}}{{{n8|}}}{{#if: {{{9|}}}|{{{lim|}}}[[{{{pref|wikt}}}:{{{9}}}{{#if:{{{lang|}}}|&#x23;{{#language:{{{lang}}}|en}}}}|{{{9}}}]]}}{{{n9|}}}{{#if: {{{10|}}}|{{{lim|}}}[[{{{pref|wikt}}}:{{{10}}}{{#if:{{{lang|}}}|&#x23;{{#language:{{{lang}}}|en}}}}|{{{10}}}]]}}{{{n10|}}}{{#if: {{{11|}}}|{{{lim|}}}[[{{{pref|wikt}}}:{{{11}}}{{#if:{{{lang|}}}|&#x23;{{#language:{{{lang}}}|en}}}}|{{{11}}}]]}}{{{n11|}}}{{#if: {{{12|}}}|{{{lim|}}}[[{{{pref|wikt}}}:{{{12}}}{{#if:{{{lang|}}}|&#x23;{{#language:{{{lang}}}|en}}}}|{{{12}}}]]}}{{{n12|}}}{{#if: {{{13|}}}|{{{lim|}}}[[{{{pref|wikt}}}:{{{13}}}{{#if:{{{lang|}}}|&#x23;{{#language:{{{lang}}}|en}}}}|{{{13}}}]]}}{{{n13|}}}{{#if: {{{14|}}}|{{{lim|}}}[[{{{pref|wikt}}}:{{{14}}}{{#if:{{{lang|}}}|&#x23;{{#language:{{{lang}}}|en}}}}|{{{14}}}]]}}{{{n14|}}}{{#if: {{{15|}}}|{{{lim|}}}[[{{{pref|wikt}}}:{{{15}}}{{#if:{{{lang|}}}|&#x23;{{#language:{{{lang}}}|en}}}}|{{{15}}}]]}}{{{n15|}}}{{#if: {{{16|}}}|{{{lim|}}}[[{{{pref|wikt}}}:{{{16}}}{{#if:{{{lang|}}}|&#x23;{{#language:{{{lang}}}|en}}}}|{{{16}}}]]}}{{{n16|}}}{{#if: {{{17|}}}|{{{lim|}}}[[{{{pref|wikt}}}:{{{17}}}{{#if:{{{lang|}}}|&#x23;{{#language:{{{lang}}}|en}}}}|{{{17}}}]]}}{{{n17|}}}{{#if: {{{18|}}}|{{{lim|}}}[[{{{pref|wikt}}}:{{{18}}}{{#if:{{{lang|}}}|&#x23;{{#language:{{{lang}}}|en}}}}|{{{18}}}]]}}{{{n18|}}}{{#if: {{{19|}}}|{{{lim|}}}[[{{{pref|wikt}}}:{{{19}}}{{#if:{{{lang|}}}|&#x23;{{#language:{{{lang}}}|en}}}}|{{{19}}}]]}}{{{n19|}}}{{#if: {{{20|}}}|{{{lim|}}}[[{{{pref|wikt}}}:{{{20}}}{{#if:{{{lang|}}}|&#x23;{{#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;', {['&ndash;'] = '–', ['&mdash;'] = '—'}); -- replace &mdash; and &ndash; entities with their characters; semicolon mucks up the text.split str = str:gsub ('&#45;', '-'); -- replace HTML numeric entity with hyphen character str = str:gsub ('&nbsp;', ' '); -- replace &nbsp; 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