<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh-Hans">
	<id>https://wiki-upgrade.tianjimc.com/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Maintenance+script</id>
	<title>天際公益服百科测试 - 用户贡献 [zh-hans]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki-upgrade.tianjimc.com/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Maintenance+script"/>
	<link rel="alternate" type="text/html" href="https://wiki-upgrade.tianjimc.com/%E7%89%B9%E6%AE%8A:%E7%94%A8%E6%88%B7%E8%B4%A1%E7%8C%AE/Maintenance_script"/>
	<updated>2026-10-06T07:31:16Z</updated>
	<subtitle>用户贡献</subtitle>
	<generator>MediaWiki 1.43.11</generator>
	<entry>
		<id>https://wiki-upgrade.tianjimc.com/index.php?title=%E5%88%86%E7%B1%BB:%E5%B0%8F%E9%95%87&amp;diff=895</id>
		<title>分类:小镇</title>
		<link rel="alternate" type="text/html" href="https://wiki-upgrade.tianjimc.com/index.php?title=%E5%88%86%E7%B1%BB:%E5%B0%8F%E9%95%87&amp;diff=895"/>
		<updated>2026-10-05T09:06:16Z</updated>

		<summary type="html">&lt;p&gt;Maintenance script：​Revert blanking of pages by 99988775 (vandalism)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;小镇体系的说明请点击这里:[[小镇体系]]&lt;br /&gt;
&lt;br /&gt;
== [[Youer]] ==&lt;br /&gt;
&lt;br /&gt;
== 沧绫湾 ==&lt;br /&gt;
[[沧绫湾(7周目)]]&lt;br /&gt;
[[沧绫湾诺普联合镇]]&lt;br /&gt;
&lt;br /&gt;
== [[夏州镇]] ==&lt;br /&gt;
&lt;br /&gt;
== [[溪木镇]] ==&lt;br /&gt;
&lt;br /&gt;
== [[源点镇]] ==&lt;br /&gt;
&lt;br /&gt;
== [[Cobweb]] ==&lt;br /&gt;
&lt;br /&gt;
== [[Devil]] ==&lt;br /&gt;
&lt;br /&gt;
== [[AMU联合镇]] ==&lt;br /&gt;
&lt;br /&gt;
== [[银河湾]] ==&lt;br /&gt;
&lt;br /&gt;
== [[未来城]] ==&lt;br /&gt;
&lt;br /&gt;
== [[诺德琳]] ==&lt;br /&gt;
&lt;br /&gt;
== [[MHCS]] ==&lt;br /&gt;
&lt;br /&gt;
== [[WL]] ==&lt;br /&gt;
&lt;br /&gt;
== [[怡红院]] ==&lt;br /&gt;
&lt;br /&gt;
== [[布吉岛]] ==&lt;br /&gt;
&lt;br /&gt;
== [[沧凌湾联合镇]] ==&lt;br /&gt;
&lt;br /&gt;
== [[漪之镇]] ==&lt;br /&gt;
&lt;br /&gt;
== [[秋月神社]] ==&lt;br /&gt;
&lt;br /&gt;
== [[玛瑞诺普]] ==&lt;br /&gt;
&lt;br /&gt;
== [[核弹社]] ==&lt;br /&gt;
点击[[核弹社]]以了解[[核弹社]]&lt;br /&gt;
{{核弹社}}&lt;br /&gt;
&lt;br /&gt;
== [[CCC]] ==&lt;br /&gt;
&lt;br /&gt;
== [[御曦陵]] ==&lt;br /&gt;
&lt;br /&gt;
== [[峽穀鎮(台灣)]] ==&lt;br /&gt;
&lt;br /&gt;
== [[御坂镇]] ==&lt;br /&gt;
&lt;br /&gt;
== [[奥尔希尼亚]] ==&lt;/div&gt;</summary>
		<author><name>Maintenance script</name></author>
	</entry>
	<entry>
		<id>https://wiki-upgrade.tianjimc.com/index.php?title=Mainpage&amp;diff=894</id>
		<title>Mainpage</title>
		<link rel="alternate" type="text/html" href="https://wiki-upgrade.tianjimc.com/index.php?title=Mainpage&amp;diff=894"/>
		<updated>2026-10-05T09:06:16Z</updated>

		<summary type="html">&lt;p&gt;Maintenance script：​Revert blanking of pages by 99988775 (vandalism)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== 基本信息: == &lt;br /&gt;
 【1.16.1】Horizon天際公益伺服器- 生存 | 建築&lt;br /&gt;
&lt;br /&gt;
 連線位址：play.tianji.me（香港） / poi.ci（中國大陸） / sg.tianji.me（新加坡）&lt;br /&gt;
&lt;br /&gt;
 無需審核，正版自由加入（正版伺服器）&lt;br /&gt;
&lt;br /&gt;
 最大在線人數：50&lt;br /&gt;
&lt;br /&gt;
 開服時間：全天（24/7/365）&lt;br /&gt;
&lt;br /&gt;
 支持語言：正體中文、簡體中文、英文&lt;br /&gt;
&lt;br /&gt;
== 伺服器介紹 ==&lt;br /&gt;
Horizon公益伺服器創建於1.6.4版本世代的2013年，現今的第十週目開始於2020年7月18日。&lt;br /&gt;
&lt;br /&gt;
这是一個休閒生存建築的長玩伺服器，在多年的運營過程中積累了很多經驗，擁有穩定的玩家群體和良好的聲譽。&lt;br /&gt;
&lt;br /&gt;
伺服器的願景是打造一個氛圍良好的適合長期遊玩的伺服器，讓來自香港澳門台灣及內地的華人玩家能夠一同遊玩享樂，&lt;br /&gt;
&lt;br /&gt;
由於伺服器玩家來自五湖四海，因此本伺服器嚴禁任何歧視和霸凌行為，歡迎監督與檢舉。&lt;br /&gt;
&lt;br /&gt;
本伺服器為公益伺服器，不存在商業收費項目，所有遊戲內容均為免費提供，請放心遊玩。&lt;br /&gt;
&lt;br /&gt;
== 主要特色介紹 ==&lt;br /&gt;
&lt;br /&gt;
超大視距：view-distance=7, 景色更美視野更完整, 打造你的小鎮建築群吧&lt;br /&gt;
&lt;br /&gt;
COI/領地：提供CoreProtect溯源保護和Residence領地保護，違規作弊零容忍，杜絕惡意破壞，確保私有財產安全；&lt;br /&gt;
&lt;br /&gt;
寵物系統：捕捉喜歡的生物作為寵物，寵物還可以為妳提供諸多協助；&lt;br /&gt;
&lt;br /&gt;
稱號系統：各色稱號滿足妳的收集愛好；&lt;br /&gt;
&lt;br /&gt;
釣魚活動：隨機釣魚活動掉落高價值獎勵，更有稀有艦娘晶核可以收藏；&lt;br /&gt;
&lt;br /&gt;
防噴保護：可以完成特定任務來獲取死亡防噴保護，不再擔心物品掉落；&lt;br /&gt;
&lt;br /&gt;
小鎮制度：為不同的玩家群體找尋夥伴提供可能，玩家可以自行申請設立小鎮，和自己的夥伴一起構築自己的小圈子，還可以申領特別福利！&lt;br /&gt;
&lt;br /&gt;
進階建築：提供不同的建築師等級供建築玩家申請，可以獲得建築材料、飛行權利和WorldEdit權利！&lt;br /&gt;
&lt;br /&gt;
== 子世界介紹 ==&lt;br /&gt;
&lt;br /&gt;
主世界/建築世界 ： 採用EpicWorldGenerator，豐富的地形資源，更接近真實世界的地形，方便精心製作建築作品，資料永久保留，不會更新。&lt;br /&gt;
&lt;br /&gt;
生存世界/原生世界 ： 原生Minecraft世界，提供原生的體驗，資料週目內永久保留不會更新。&lt;br /&gt;
&lt;br /&gt;
下界、終界 ： 原生Minecraft世界，提供原生下界、終界，資料長期保留。&lt;br /&gt;
&lt;br /&gt;
資源世界/礦物採掘區 ： 每週重新生成，提供豐富的礦物和其他資源。&lt;br /&gt;
&lt;br /&gt;
聯絡我們：如果有疑問和查詢可電郵至 tianji1993@gmail.com有任何問題或檢舉投訴請至 https://tianji.link/t/arguments&lt;br /&gt;
&lt;br /&gt;
=== 小镇体系 ===&lt;br /&gt;
丰富的小镇体系为不同类型的玩家形成自己独特的玩家群体.&lt;br /&gt;
#重定向 [[小镇]]&lt;br /&gt;
=== 基本設定 ===&lt;br /&gt;
[[基本設定|伺服器基本設定]]&lt;br /&gt;
&lt;br /&gt;
== 經濟設定 ==&lt;br /&gt;
&lt;br /&gt;
伺服器主要流通貨幣為金幣,不設置收購商店,獲取方式大致如下: &lt;br /&gt;
&lt;br /&gt;
 1. 每日簽到(特定時間段內開放);&lt;br /&gt;
 2. 職業獎勵(每日上限1000金幣);&lt;br /&gt;
 3. 線上時間(通過ATM進行兌換,1分鐘=1金幣);&lt;br /&gt;
 4. 釣魚活動;&lt;br /&gt;
 5. 抽獎;&lt;br /&gt;
 6. 全球市場出售物品;&lt;br /&gt;
 7. 箱子商店出售物品;&lt;br /&gt;
 8. 玩家間交易;&lt;br /&gt;
 9. 玩家間贈與;&lt;br /&gt;
&lt;br /&gt;
== 基本規則 ==&lt;br /&gt;
&lt;br /&gt;
珍惜你的正版帳號,請務必嚴格遵守,嚴重違規玩家會被永久封禁且其所有物品會獎勵給舉報玩家. &lt;br /&gt;
&lt;br /&gt;
禁止妨礙他人遊戲體驗,尊重他人 &lt;br /&gt;
&lt;br /&gt;
以下規則均建立在這一基礎之上.&lt;br /&gt;
&lt;br /&gt;
請勿在MCQQ群等不合適的場合宣傳本伺服器.&lt;br /&gt;
&lt;br /&gt;
自覺建立領地,&amp;quot;主城&amp;quot;,小鎮及玩家領地外的方塊均屬於野外區域方塊,伺服器對野外區域方塊的破壞和由此造成的財產損失不負任何責任.&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;允許建立刷怪塔,但請及時清理怪物以防怪物大量堆疊&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== 禁止以下行為 ==&lt;br /&gt;
&lt;br /&gt;
 1. 高空流水/岩漿(超過10層) &lt;br /&gt;
&lt;br /&gt;
 2. 高頻紅石&lt;br /&gt;
&lt;br /&gt;
 3. 密集型養殖&lt;br /&gt;
&lt;br /&gt;
 4. 小範圍建造大量地獄門&lt;br /&gt;
&lt;br /&gt;
 5. 建造各種無意義的高空浮空建築&lt;br /&gt;
&lt;br /&gt;
 6. 玩家使用透視材質、腳本各類作弊MOD進行遊戲&lt;br /&gt;
&lt;br /&gt;
== 嚴禁以下行為 ==&lt;br /&gt;
&lt;br /&gt;
 1. 各種刷屏&lt;br /&gt;
&lt;br /&gt;
 2. 惡意利用遊戲BUG獲取利益或妨礙他人&lt;br /&gt;
&lt;br /&gt;
 3. 各種理由破壞他人財產,如果確有需要借用請留下牌子說明&lt;br /&gt;
&lt;br /&gt;
== 最後聲明 ==&lt;br /&gt;
&lt;br /&gt;
 本服為公益伺服器,伺服器運行會長期持續下去,我們擁有穩定的收入來源和捐款,因此禁止對新人開氪金/收費之類的玩笑.&lt;br /&gt;
 請自覺注意言行舉止,違者管理員將有權力介入處理.原則上不鼓勵12歲以下的未成年人加入.&lt;br /&gt;
 請自覺鎖箱子以避免不必要的麻煩;&lt;br /&gt;
&lt;br /&gt;
== 快捷链接: == &lt;br /&gt;
&lt;br /&gt;
[https://forum.gamer.com.tw/C.php?bsn=18673&amp;amp;snA=172674&amp;amp;tnum=3&amp;amp;subbsn=18 伺服器在巴哈姆特的宣傳貼]&lt;br /&gt;
&lt;br /&gt;
[https://www.minecraft-hk.com/threads/1-13-2-horizon.390 伺服器在MCHK的宣傳貼]&lt;br /&gt;
&lt;br /&gt;
[http://www.mcbbs.net/forum.php?mod=viewthread&amp;amp;tid=580010 伺服器在MCBBS的宣傳貼] &lt;br /&gt;
&lt;br /&gt;
[https://tianji.link/t/abuse_report 工单提交入口]&lt;br /&gt;
&lt;br /&gt;
== 溝通平台 ==&lt;br /&gt;
[https://t.me/joinchat/FPQtiwy5htGgvwJi1HYcHQ Telegram]，[https://discord.gg/gqk7ZC7 Discord]，[https://twitter.com/horizon2014 Twitter]，[https://www.facebook.com/horizoncraft2013/ Facebook]&lt;br /&gt;
&lt;br /&gt;
== 相關鏈接 ==&lt;br /&gt;
[https://tianji.link 伺服器主頁] - [https://tianji.link/d/1-minecraft 伺服器規則] - [https://tianji.link/ 伺服器社群] - [http://wiki.tianji.link/Mainpage Wiki]&lt;br /&gt;
&lt;br /&gt;
== 審核管道 ==&lt;/div&gt;</summary>
		<author><name>Maintenance script</name></author>
	</entry>
	<entry>
		<id>https://wiki-upgrade.tianjimc.com/index.php?title=%E6%A8%A1%E5%9D%97:String&amp;diff=893</id>
		<title>模块:String</title>
		<link rel="alternate" type="text/html" href="https://wiki-upgrade.tianjimc.com/index.php?title=%E6%A8%A1%E5%9D%97:String&amp;diff=893"/>
		<updated>2026-10-05T08:58:56Z</updated>

		<summary type="html">&lt;p&gt;Maintenance script：​Import Module:String from mediawiki.org (needed by Str_len / str_find)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;--[[&lt;br /&gt;
&lt;br /&gt;
This module is intended to provide access to basic string functions.&lt;br /&gt;
&lt;br /&gt;
Most of the functions provided here can be invoked with named parameters,&lt;br /&gt;
unnamed parameters, or a mixture.  If named parameters are used, Mediawiki will&lt;br /&gt;
automatically remove any leading or trailing whitespace from the parameter.&lt;br /&gt;
Depending on the intended use, it may be advantageous to either preserve or&lt;br /&gt;
remove such whitespace.&lt;br /&gt;
&lt;br /&gt;
Global options&lt;br /&gt;
    ignore_errors: If set to &#039;true&#039; or 1, any error condition will result in&lt;br /&gt;
        an empty string being returned rather than an error message.&lt;br /&gt;
&lt;br /&gt;
    error_category: If an error occurs, specifies the name of a category to&lt;br /&gt;
        include with the error message.  The default category is&lt;br /&gt;
        [Category:Errors reported by Module String].&lt;br /&gt;
&lt;br /&gt;
    no_category: If set to &#039;true&#039; or 1, no category will be added if an error&lt;br /&gt;
        is generated.&lt;br /&gt;
&lt;br /&gt;
Unit tests for this module are available at Module:String/tests.&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local str = {}&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
len&lt;br /&gt;
&lt;br /&gt;
This function returns the length of the target string.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
{{#invoke:String|len|target_string|}}&lt;br /&gt;
OR&lt;br /&gt;
{{#invoke:String|len|s=target_string}}&lt;br /&gt;
&lt;br /&gt;
Parameters&lt;br /&gt;
    s: The string whose length to report&lt;br /&gt;
&lt;br /&gt;
If invoked using named parameters, Mediawiki will automatically remove any leading or&lt;br /&gt;
trailing whitespace from the target string.&lt;br /&gt;
]]&lt;br /&gt;
function str.len( frame )&lt;br /&gt;
	local new_args = str._getParameters( frame.args, {&#039;s&#039;} );&lt;br /&gt;
	local s = new_args[&#039;s&#039;] or &#039;&#039;;&lt;br /&gt;
	return mw.ustring.len( s )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
sub&lt;br /&gt;
&lt;br /&gt;
This function returns a substring of the target string at specified indices.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
{{#invoke:String|sub|target_string|start_index|end_index}}&lt;br /&gt;
OR&lt;br /&gt;
{{#invoke:String|sub|s=target_string|i=start_index|j=end_index}}&lt;br /&gt;
&lt;br /&gt;
Parameters&lt;br /&gt;
    s: The string to return a subset of&lt;br /&gt;
    i: The fist index of the substring to return, defaults to 1.&lt;br /&gt;
    j: The last index of the string to return, defaults to the last character.&lt;br /&gt;
&lt;br /&gt;
The first character of the string is assigned an index of 1.  If either i or j&lt;br /&gt;
is a negative value, it is interpreted the same as selecting a character by&lt;br /&gt;
counting from the end of the string.  Hence, a value of -1 is the same as&lt;br /&gt;
selecting the last character of the string.&lt;br /&gt;
&lt;br /&gt;
If the requested indices are out of range for the given string, an error is&lt;br /&gt;
reported.&lt;br /&gt;
]]&lt;br /&gt;
function str.sub( frame )&lt;br /&gt;
	local new_args = str._getParameters( frame.args, { &#039;s&#039;, &#039;i&#039;, &#039;j&#039; } );&lt;br /&gt;
	local s = new_args[&#039;s&#039;] or &#039;&#039;;&lt;br /&gt;
	local i = tonumber( new_args[&#039;i&#039;] ) or 1;&lt;br /&gt;
	local j = tonumber( new_args[&#039;j&#039;] ) or -1;&lt;br /&gt;
&lt;br /&gt;
	local len = mw.ustring.len( s );&lt;br /&gt;
&lt;br /&gt;
	-- Convert negatives for range checking&lt;br /&gt;
	if i &amp;lt; 0 then&lt;br /&gt;
		i = len + i + 1;&lt;br /&gt;
	end&lt;br /&gt;
	if j &amp;lt; 0 then&lt;br /&gt;
		j = len + j + 1;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if i &amp;gt; len or j &amp;gt; len or i &amp;lt; 1 or j &amp;lt; 1 then&lt;br /&gt;
		return str._error( &#039;String subset index out of range&#039; );&lt;br /&gt;
	end&lt;br /&gt;
	if j &amp;lt; i then&lt;br /&gt;
		return str._error( &#039;String subset indices out of order&#039; );&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return mw.ustring.sub( s, i, j )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
This function implements that features of {{str sub old}} and is kept in order&lt;br /&gt;
to maintain these older templates.&lt;br /&gt;
]]&lt;br /&gt;
function str.sublength( frame )&lt;br /&gt;
	local i = tonumber( frame.args.i ) or 0&lt;br /&gt;
	local len = tonumber( frame.args.len )&lt;br /&gt;
	return mw.ustring.sub( frame.args.s, i + 1, len and ( i + len ) )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
match&lt;br /&gt;
&lt;br /&gt;
This function returns a substring from the source string that matches a&lt;br /&gt;
specified pattern.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
{{#invoke:String|match|source_string|pattern_string|start_index|match_number|plain_flag|nomatch}}&lt;br /&gt;
OR&lt;br /&gt;
{{#invoke:String|pos|s=source_string|pattern=pattern_string|start=start_index&lt;br /&gt;
    |match=match_number|plain=plain_flag|nomatch=nomatch_output}}&lt;br /&gt;
&lt;br /&gt;
Parameters&lt;br /&gt;
    s: The string to search&lt;br /&gt;
    pattern: The pattern or string to find within the string&lt;br /&gt;
    start: The index within the source string to start the search.  The first&lt;br /&gt;
        character of the string has index 1.  Defaults to 1.&lt;br /&gt;
    match: In some cases it may be possible to make multiple matches on a single&lt;br /&gt;
        string.  This specifies which match to return, where the first match is&lt;br /&gt;
        match= 1.  If a negative number is specified then a match is returned&lt;br /&gt;
        counting from the last match.  Hence match = -1 is the same as requesting&lt;br /&gt;
        the last match.  Defaults to 1.&lt;br /&gt;
    plain: A flag indicating that the pattern should be understood as plain&lt;br /&gt;
        text.  Defaults to false.&lt;br /&gt;
    nomatch: If no match is found, output the &amp;quot;nomatch&amp;quot; value rather than an error.&lt;br /&gt;
&lt;br /&gt;
If invoked using named parameters, Mediawiki will automatically remove any leading or&lt;br /&gt;
trailing whitespace from each string.  In some circumstances this is desirable, in&lt;br /&gt;
other cases one may want to preserve the whitespace.&lt;br /&gt;
&lt;br /&gt;
If the match_number or start_index are out of range for the string being queried, then&lt;br /&gt;
this function generates an error.  An error is also generated if no match is found.&lt;br /&gt;
If one adds the parameter ignore_errors=true, then the error will be suppressed and&lt;br /&gt;
an empty string will be returned on any failure.&lt;br /&gt;
&lt;br /&gt;
For information on constructing Lua patterns, a form of [regular expression], see:&lt;br /&gt;
&lt;br /&gt;
* https://www.lua.org/manual/5.1/manual.html#5.4.1&lt;br /&gt;
* https://www.mediawiki.org/wiki/Extension:Scribunto/Lua_reference_manual#Patterns&lt;br /&gt;
* https://www.mediawiki.org/wiki/Extension:Scribunto/Lua_reference_manual#Ustring_patterns&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
-- This sub-routine is exported for use in other modules&lt;br /&gt;
function str._match( s, pattern, start, match_index, plain, nomatch )&lt;br /&gt;
	if s == &#039;&#039; then&lt;br /&gt;
		return str._error( &#039;Target string is empty&#039; );&lt;br /&gt;
	end&lt;br /&gt;
	if pattern == &#039;&#039; then&lt;br /&gt;
		return str._error( &#039;Pattern string is empty&#039; );&lt;br /&gt;
	end&lt;br /&gt;
	start = tonumber(start) or 1&lt;br /&gt;
	if math.abs(start) &amp;lt; 1 or math.abs(start) &amp;gt; mw.ustring.len( s ) then&lt;br /&gt;
		return str._error( &#039;Requested start is out of range&#039; );&lt;br /&gt;
	end&lt;br /&gt;
	if match_index == 0 then&lt;br /&gt;
		return str._error( &#039;Match index is out of range&#039; );&lt;br /&gt;
	end&lt;br /&gt;
	if plain_flag then&lt;br /&gt;
		pattern = str._escapePattern( pattern );&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local result&lt;br /&gt;
	if match_index == 1 then&lt;br /&gt;
		-- Find first match is simple case&lt;br /&gt;
		result = mw.ustring.match( s, pattern, start )&lt;br /&gt;
	else&lt;br /&gt;
		if start &amp;gt; 1 then&lt;br /&gt;
			s = mw.ustring.sub( s, start );&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		local iterator = mw.ustring.gmatch(s, pattern);&lt;br /&gt;
		if match_index &amp;gt; 0 then&lt;br /&gt;
			-- Forward search&lt;br /&gt;
			for w in iterator do&lt;br /&gt;
				match_index = match_index - 1;&lt;br /&gt;
				if match_index == 0 then&lt;br /&gt;
					result = w;&lt;br /&gt;
					break;&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		else&lt;br /&gt;
			-- Reverse search&lt;br /&gt;
			local result_table = {};&lt;br /&gt;
			local count = 1;&lt;br /&gt;
			for w in iterator do&lt;br /&gt;
				result_table[count] = w;&lt;br /&gt;
				count = count + 1;&lt;br /&gt;
			end&lt;br /&gt;
&lt;br /&gt;
			result = result_table[ count + match_index ];&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if result == nil then&lt;br /&gt;
		if nomatch == nil then&lt;br /&gt;
			return str._error( &#039;Match not found&#039; );&lt;br /&gt;
		else&lt;br /&gt;
			return nomatch;&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		return result;&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
-- This is the entry point for #invoke:String|match&lt;br /&gt;
function str.match( frame )&lt;br /&gt;
	local new_args = str._getParameters( frame.args, {&#039;s&#039;, &#039;pattern&#039;, &#039;start&#039;, &#039;match&#039;, &#039;plain&#039;, &#039;nomatch&#039;} );&lt;br /&gt;
	local s = new_args[&#039;s&#039;] or &#039;&#039;;&lt;br /&gt;
	local start = tonumber( new_args[&#039;start&#039;] ) or 1;&lt;br /&gt;
	local plain_flag = str._getBoolean( new_args[&#039;plain&#039;] or false );&lt;br /&gt;
	local pattern = new_args[&#039;pattern&#039;] or &#039;&#039;;&lt;br /&gt;
	local match_index = math.floor( tonumber(new_args[&#039;match&#039;]) or 1 );&lt;br /&gt;
	local nomatch = new_args[&#039;nomatch&#039;];&lt;br /&gt;
&lt;br /&gt;
	return str._match( s, pattern, start, match_index, plain, nomatch )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
pos&lt;br /&gt;
&lt;br /&gt;
This function returns a single character from the target string at position pos.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
{{#invoke:String|pos|target_string|index_value}}&lt;br /&gt;
OR&lt;br /&gt;
{{#invoke:String|pos|target=target_string|pos=index_value}}&lt;br /&gt;
&lt;br /&gt;
Parameters&lt;br /&gt;
    target: The string to search&lt;br /&gt;
    pos: The index for the character to return&lt;br /&gt;
&lt;br /&gt;
If invoked using named parameters, Mediawiki will automatically remove any leading or&lt;br /&gt;
trailing whitespace from the target string.  In some circumstances this is desirable, in&lt;br /&gt;
other cases one may want to preserve the whitespace.&lt;br /&gt;
&lt;br /&gt;
The first character has an index value of 1.&lt;br /&gt;
&lt;br /&gt;
If one requests a negative value, this function will select a character by counting backwards&lt;br /&gt;
from the end of the string.  In other words pos = -1 is the same as asking for the last character.&lt;br /&gt;
&lt;br /&gt;
A requested value of zero, or a value greater than the length of the string returns an error.&lt;br /&gt;
]]&lt;br /&gt;
function str.pos( frame )&lt;br /&gt;
	local new_args = str._getParameters( frame.args, {&#039;target&#039;, &#039;pos&#039;} );&lt;br /&gt;
	local target_str = new_args[&#039;target&#039;] or &#039;&#039;;&lt;br /&gt;
	local pos = tonumber( new_args[&#039;pos&#039;] ) or 0;&lt;br /&gt;
&lt;br /&gt;
	if pos == 0 or math.abs(pos) &amp;gt; mw.ustring.len( target_str ) then&lt;br /&gt;
		return str._error( &#039;String index out of range&#039; );&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return mw.ustring.sub( target_str, pos, pos );&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
str_find&lt;br /&gt;
&lt;br /&gt;
This function duplicates the behavior of {{str_find}}, including all of its quirks.&lt;br /&gt;
This is provided in order to support existing templates, but is NOT RECOMMENDED for&lt;br /&gt;
new code and templates.  New code is recommended to use the &amp;quot;find&amp;quot; function instead.&lt;br /&gt;
&lt;br /&gt;
Returns the first index in &amp;quot;source&amp;quot; that is a match to &amp;quot;target&amp;quot;.  Indexing is 1-based,&lt;br /&gt;
and the function returns -1 if the &amp;quot;target&amp;quot; string is not present in &amp;quot;source&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Important Note: If the &amp;quot;target&amp;quot; string is empty / missing, this function returns a&lt;br /&gt;
value of &amp;quot;1&amp;quot;, which is generally unexpected behavior, and must be accounted for&lt;br /&gt;
separatetly.&lt;br /&gt;
]]&lt;br /&gt;
function str.str_find( frame )&lt;br /&gt;
	local new_args = str._getParameters( frame.args, {&#039;source&#039;, &#039;target&#039;} );&lt;br /&gt;
	local source_str = new_args[&#039;source&#039;] or &#039;&#039;;&lt;br /&gt;
	local target_str = new_args[&#039;target&#039;] or &#039;&#039;;&lt;br /&gt;
&lt;br /&gt;
	if target_str == &#039;&#039; then&lt;br /&gt;
		return 1;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local start = mw.ustring.find( source_str, target_str, 1, true )&lt;br /&gt;
	if start == nil then&lt;br /&gt;
		start = -1&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return start&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
find&lt;br /&gt;
&lt;br /&gt;
This function allows one to search for a target string or pattern within another&lt;br /&gt;
string.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
{{#invoke:String|find|source_str|target_string|start_index|plain_flag}}&lt;br /&gt;
OR&lt;br /&gt;
{{#invoke:String|find|source=source_str|target=target_str|start=start_index|plain=plain_flag}}&lt;br /&gt;
&lt;br /&gt;
Parameters&lt;br /&gt;
    source: The string to search&lt;br /&gt;
    target: The string or pattern to find within source&lt;br /&gt;
    start: The index within the source string to start the search, defaults to 1&lt;br /&gt;
    plain: Boolean flag indicating that target should be understood as plain&lt;br /&gt;
        text and not as a Lua style regular expression, defaults to true&lt;br /&gt;
&lt;br /&gt;
If invoked using named parameters, Mediawiki will automatically remove any leading or&lt;br /&gt;
trailing whitespace from the parameter.  In some circumstances this is desirable, in&lt;br /&gt;
other cases one may want to preserve the whitespace.&lt;br /&gt;
&lt;br /&gt;
This function returns the first index &amp;gt;= &amp;quot;start&amp;quot; where &amp;quot;target&amp;quot; can be found&lt;br /&gt;
within &amp;quot;source&amp;quot;.  Indices are 1-based.  If &amp;quot;target&amp;quot; is not found, then this&lt;br /&gt;
function returns 0.  If either &amp;quot;source&amp;quot; or &amp;quot;target&amp;quot; are missing / empty, this&lt;br /&gt;
function also returns 0.&lt;br /&gt;
&lt;br /&gt;
This function should be safe for UTF-8 strings.&lt;br /&gt;
]]&lt;br /&gt;
function str.find( frame )&lt;br /&gt;
	local new_args = str._getParameters( frame.args, {&#039;source&#039;, &#039;target&#039;, &#039;start&#039;, &#039;plain&#039; } );&lt;br /&gt;
	local source_str = new_args[&#039;source&#039;] or &#039;&#039;;&lt;br /&gt;
	local pattern = new_args[&#039;target&#039;] or &#039;&#039;;&lt;br /&gt;
	local start_pos = tonumber(new_args[&#039;start&#039;]) or 1;&lt;br /&gt;
	local plain = new_args[&#039;plain&#039;] or true;&lt;br /&gt;
&lt;br /&gt;
	if source_str == &#039;&#039; or pattern == &#039;&#039; then&lt;br /&gt;
		return 0;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	plain = str._getBoolean( plain );&lt;br /&gt;
&lt;br /&gt;
	local start = mw.ustring.find( source_str, pattern, start_pos, plain )&lt;br /&gt;
	if start == nil then&lt;br /&gt;
		start = 0&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return start&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
replace&lt;br /&gt;
&lt;br /&gt;
This function allows one to replace a target string or pattern within another&lt;br /&gt;
string.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
{{#invoke:String|replace|source_str|pattern_string|replace_string|replacement_count|plain_flag}}&lt;br /&gt;
OR&lt;br /&gt;
{{#invoke:String|replace|source=source_string|pattern=pattern_string|replace=replace_string|&lt;br /&gt;
   count=replacement_count|plain=plain_flag}}&lt;br /&gt;
&lt;br /&gt;
Parameters&lt;br /&gt;
    source: The string to search&lt;br /&gt;
    pattern: The string or pattern to find within source&lt;br /&gt;
    replace: The replacement text&lt;br /&gt;
    count: The number of occurences to replace, defaults to all.&lt;br /&gt;
    plain: Boolean flag indicating that pattern should be understood as plain&lt;br /&gt;
        text and not as a Lua style regular expression, defaults to true&lt;br /&gt;
]]&lt;br /&gt;
function str.replace( frame )&lt;br /&gt;
	local new_args = str._getParameters( frame.args, {&#039;source&#039;, &#039;pattern&#039;, &#039;replace&#039;, &#039;count&#039;, &#039;plain&#039; } );&lt;br /&gt;
	local source_str = new_args[&#039;source&#039;] or &#039;&#039;;&lt;br /&gt;
	local pattern = new_args[&#039;pattern&#039;] or &#039;&#039;;&lt;br /&gt;
	local replace = new_args[&#039;replace&#039;] or &#039;&#039;;&lt;br /&gt;
	local count = tonumber( new_args[&#039;count&#039;] );&lt;br /&gt;
	local plain = new_args[&#039;plain&#039;] or true;&lt;br /&gt;
&lt;br /&gt;
	if source_str == &#039;&#039; or pattern == &#039;&#039; then&lt;br /&gt;
		return source_str;&lt;br /&gt;
	end&lt;br /&gt;
	plain = str._getBoolean( plain );&lt;br /&gt;
&lt;br /&gt;
	if plain then&lt;br /&gt;
		pattern = str._escapePattern( pattern );&lt;br /&gt;
		replace = mw.ustring.gsub( replace, &amp;quot;%%&amp;quot;, &amp;quot;%%%%&amp;quot; ); --Only need to escape replacement sequences.&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local result;&lt;br /&gt;
&lt;br /&gt;
	if count ~= nil then&lt;br /&gt;
		result = mw.ustring.gsub( source_str, pattern, replace, count );&lt;br /&gt;
	else&lt;br /&gt;
		result = mw.ustring.gsub( source_str, pattern, replace );&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return result;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
    simple function to pipe string.rep to templates.&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
function str.rep( frame )&lt;br /&gt;
	local repetitions = tonumber( frame.args[2] )&lt;br /&gt;
	if not repetitions then&lt;br /&gt;
		return str._error( &#039;function rep expects a number as second parameter, received &amp;quot;&#039; .. ( frame.args[2] or &#039;&#039; ) .. &#039;&amp;quot;&#039; )&lt;br /&gt;
	end&lt;br /&gt;
	return string.rep( frame.args[1] or &#039;&#039;, repetitions )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
escapePattern&lt;br /&gt;
&lt;br /&gt;
This function escapes special characters from a Lua string pattern. See [1]&lt;br /&gt;
for details on how patterns work.&lt;br /&gt;
&lt;br /&gt;
[1] https://www.mediawiki.org/wiki/Extension:Scribunto/Lua_reference_manual#Patterns&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
{{#invoke:String|escapePattern|pattern_string}}&lt;br /&gt;
&lt;br /&gt;
Parameters&lt;br /&gt;
    pattern_string: The pattern string to escape.&lt;br /&gt;
]]&lt;br /&gt;
function str.escapePattern( frame )&lt;br /&gt;
	local pattern_str = frame.args[1]&lt;br /&gt;
	if not pattern_str then&lt;br /&gt;
		return str._error( &#039;No pattern string specified&#039; );&lt;br /&gt;
	end&lt;br /&gt;
	local result = str._escapePattern( pattern_str )&lt;br /&gt;
	return result&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
Helper function that populates the argument list given that user may need to use a mix of&lt;br /&gt;
named and unnamed parameters.  This is relevant because named parameters are not&lt;br /&gt;
identical to unnamed parameters due to string trimming, and when dealing with strings&lt;br /&gt;
we sometimes want to either preserve or remove that whitespace depending on the application.&lt;br /&gt;
]]&lt;br /&gt;
function str._getParameters( frame_args, arg_list )&lt;br /&gt;
	local new_args = {};&lt;br /&gt;
	local index = 1;&lt;br /&gt;
	local value;&lt;br /&gt;
&lt;br /&gt;
	for i,arg in ipairs( arg_list ) do&lt;br /&gt;
		value = frame_args[arg]&lt;br /&gt;
		if value == nil then&lt;br /&gt;
			value = frame_args[index];&lt;br /&gt;
			index = index + 1;&lt;br /&gt;
		end&lt;br /&gt;
		new_args[arg] = value;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return new_args;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
Helper function to handle error messages.&lt;br /&gt;
]]&lt;br /&gt;
function str._error( error_str )&lt;br /&gt;
	local frame = mw.getCurrentFrame();&lt;br /&gt;
	local error_category = frame.args.error_category or &#039;Errors reported by Module String&#039;;&lt;br /&gt;
	local ignore_errors = frame.args.ignore_errors or false;&lt;br /&gt;
	local no_category = frame.args.no_category or false;&lt;br /&gt;
&lt;br /&gt;
	if str._getBoolean(ignore_errors) then&lt;br /&gt;
		return &#039;&#039;;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local error_str = &#039;&amp;lt;strong class=&amp;quot;error&amp;quot;&amp;gt;String Module Error: &#039; .. error_str .. &#039;&amp;lt;/strong&amp;gt;&#039;;&lt;br /&gt;
	if error_category ~= &#039;&#039; and not str._getBoolean( no_category ) then&lt;br /&gt;
		error_str = &#039;[[Category:&#039; .. error_category .. &#039;]]&#039; .. error_str;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return error_str;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
Helper Function to interpret boolean strings&lt;br /&gt;
]]&lt;br /&gt;
function str._getBoolean( boolean_str )&lt;br /&gt;
	local boolean_value;&lt;br /&gt;
&lt;br /&gt;
	if type( boolean_str ) == &#039;string&#039; then&lt;br /&gt;
		boolean_str = boolean_str:lower();&lt;br /&gt;
		if boolean_str == &#039;false&#039; or boolean_str == &#039;no&#039; or boolean_str == &#039;0&#039;&lt;br /&gt;
				or boolean_str == &#039;&#039; then&lt;br /&gt;
			boolean_value = false;&lt;br /&gt;
		else&lt;br /&gt;
			boolean_value = true;&lt;br /&gt;
		end&lt;br /&gt;
	elseif type( boolean_str ) == &#039;boolean&#039; then&lt;br /&gt;
		boolean_value = boolean_str;&lt;br /&gt;
	else&lt;br /&gt;
		error( &#039;No boolean value found&#039; );&lt;br /&gt;
	end&lt;br /&gt;
	return boolean_value&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
Helper function that escapes all pattern characters so that they will be treated&lt;br /&gt;
as plain text.&lt;br /&gt;
]]&lt;br /&gt;
function str._escapePattern( pattern_str )&lt;br /&gt;
	return mw.ustring.gsub( pattern_str, &amp;quot;([%(%)%.%%%+%-%*%?%[%^%$%]])&amp;quot;, &amp;quot;%%%1&amp;quot; );&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return str&lt;/div&gt;</summary>
		<author><name>Maintenance script</name></author>
	</entry>
	<entry>
		<id>https://wiki-upgrade.tianjimc.com/index.php?title=MediaWiki:Sidebar&amp;diff=890</id>
		<title>MediaWiki:Sidebar</title>
		<link rel="alternate" type="text/html" href="https://wiki-upgrade.tianjimc.com/index.php?title=MediaWiki:Sidebar&amp;diff=890"/>
		<updated>2026-10-05T08:14:36Z</updated>

		<summary type="html">&lt;p&gt;Maintenance script：​Fix sidebar random page link (removed leading slash that produced a protocol-relative href)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;*navigation&lt;br /&gt;
**mainpage|mainpage-description&lt;br /&gt;
**randompage-url|randompage&lt;br /&gt;
**recentchanges-url|recentchanges&lt;br /&gt;
**https://tu.tianji.link/explore/recent|最新图片&lt;br /&gt;
**https://tu.tianji.link/|上传图片&lt;br /&gt;
**Talk:讨论版|讨论版&lt;br /&gt;
**Talk:提问求助区|提问求助区&lt;br /&gt;
*help&lt;br /&gt;
**Category:帮助|help&lt;br /&gt;
**Help:沙盒|沙盒&lt;br /&gt;
**Help:Wiki入门|Wiki入门&lt;br /&gt;
**百科编辑规范|编辑规范&lt;br /&gt;
**Help:创建新条目|创建新条目&lt;br /&gt;
**条目创建请求|请求创建条目&lt;br /&gt;
**FAQ|常见问题集&lt;br /&gt;
*分类索引&lt;br /&gt;
**Category:小镇|小镇&lt;br /&gt;
**Category:人物|人物&lt;br /&gt;
**Category:文化|文化&lt;br /&gt;
**Category:软件|软件&lt;br /&gt;
**Category:活动|活动&lt;br /&gt;
*原创索引&lt;br /&gt;
**Category:设定|设定&lt;br /&gt;
*TOOLBOX&lt;/div&gt;</summary>
		<author><name>Maintenance script</name></author>
	</entry>
</feed>