說明討論:解析器函數
Parser Functions已經啟用
編輯**移动自Wikipedia:互助客栈/技术
根據郵件列表的消息,Parser Functions已經啟用了。我剛做過測試,試驗成功了。Parser Functions的功能主要是給模板增加數學運算和布爾值判斷的能力,具體可以參考meta:ParserFunctions。有了上述能力,我們可以簡化許多日常工作,比如刪除投票就應該可以自動生成出來。大家如果誰有時間,可以來重寫en:Category:Date_math並設法應用這些模板。--Mountain 09:49 2006年4月12日 (UTC)
- 要好好研究一下。其中一個我認為比較重要的應用會是當發生編輯戰時對頁面加以保護後,能否自動在幾個衝突的版本間切換。這樣可以避免偏袒的指責。不過不知道是否能實現,先研究一下--地球發動機(〠✆ - ✉✍) 11:10 2006年4月12日 (UTC)
總算有布爾值判斷啦,可以解決很大程度的模板難題呢……--翔風Sasuke☆有事找我*^-^* 13:14 2006年4月12日 (UTC)
- 這是一個令人高興的消息。以前的許多模板都應整理並且清除一些過於雜技化的模板,有大量的工作得做了。我希望下一步能實現簡單的正則表達式用於字符串處理。維基的模板不需要發展成為一個類似腳本語言的東東,但數學運算、邏輯判斷、字符處理是顯然非常需要的。
- 另外,發動機兄的衝突版本,我認為不太可能實現,除非條目的歷史版本可以做為模板應用。— fdcn talk 2006年04月12日14:20 (UTC+8 22:20)
刪除投票能不能通過這個功能實現自動生成當天葉面?--百無一用是書生 (☎) 02:47 2006年4月13日 (UTC)
若k年中的第n天是m月l日,求函數f:(m,l)|->n和g:n|->(m,l)。解出來這兩個函數就可以實現刪除投票自動更新了。應該不難,大家幫着解一下。--Mountain 08:47 2006年4月13日 (UTC)
我已經建立了如下一系列模板:
- Template:fIsLeapYear:判斷給定年份是否是閏年;
- Template:fDaysBeforeMonth:給定月份之前的該年內的天數(需要兩個參數月份和年);
- Template:fOrdinalDate:給出現在是本年度的第幾天;
- Template:fYearFromSerial:從某一年的第幾天求年數(需要兩個參數第幾天和年,主要考慮天數為負數的情況);
- Template:fMonthFromSerial:從某一年的第幾天求月份(需要兩個參數第幾天和年);
- Template:fDayFromSerial:從某一年的第幾天求日期(需要兩個參數第幾天和年);
測試效果如下:
- {{fIsLeapYear|2006}}:0
- {{fDaysBeforeMonth|4|2006}}:90
- {{fOrdinalDate}}:239
- {{fYearFromSerial|{{fOrdinalDate}}|2006}}:2006
- {{fMonthFromSerial|{{fOrdinalDate}}|2006}}:8
- {{fDayFromSerial|{{fOrdinalDate}}|2006}}:27
- {{fMonthFromSerial|103|2006}}:4
- {{fDaysBeforeMonth|{{fMonthFromSerial|103|2006}}|2006}} :90
從測試結果看,上面的模板還有錯誤,可能既有我的錯誤,也有Mediawiki軟件的錯誤。還請大家幫助修改。只要模板Template:fMonthFromSerial和Template:fDayFromSerial正常工作,我們的目標就達到了。我要回家睡覺去了。謝謝。--Mountain 19:26 2006年4月13日 (UTC)
- 改正筆誤後,已經正常工作。--Mountain 04:43 2006年4月14日 (UTC)
請參見Template:XDaysBeforeCurrentDate和Template:AutoVfD。還有一個4月0日的bug,大家幫着改一下吧。--Mountain 05:17 2006年4月14日 (UTC)
- 管理員得謝你啊。另外這個模板是方便管理員的,一周前的天數以連結給出,沒有終結的投票大家不易看到,不知管理員們願不願手動做那一部分。— fdcn talk 2006年04月14日05:43 (UTC+8 13:43)
**移动结束
**以下移动自Category talk:維基百科模板
可這個究竟對模板或者模板分類有什麼幫助呢?-無名無形 11:52:43 2006年4月8日 (UTC)
- 對模板的內容輸出幫助大着呢,比如現在的Template:UTC系列模板(可以看看Template:UTC+0800源碼),如果有上面的功能,就不必有如此冗腫的代碼和對伺服器如此大的負載了。再如現在的年代世紀類模板,許多處理可以由模板來進行,而不必讓編寫者和調用者付出這麼大精力了。— fdcn talk 2006年04月8日12:46 (UTC+8 20:46)
基於ParserFunctions的一個注意事項
編輯由於有了ParserFunctions,很多功能能夠被實現。但是很容易出現重複實現的情況。比如說,若干個不同名稱的判斷閏年的模板。所以,應該統一模板的「接口」,就像程序語言中的.h和.dll。實現起來就是,預先統一特定功能模板的名稱,再去編寫模板,編寫好以後,就從指引的層面禁止再出現相似模板。Upssdr - t 05:30 2006年4月15日 (UTC)
- 建立了一個分類Category:函數模板做入口,所有計算與邏輯類的可以歸於此。— fdcn talk 2006年04月18日13:39 (UTC+8 21:39)
以下是一個應該實現的模板的列表(歡迎添加):
- 日期和時間模板
- 時區變換;
- 明天;
- 昨天;
- n天之後/前的那一天;
- 判斷閏年;
以上在Category:日期計算模板里已全部實現,還缺少中文重定向頁。
- 單位轉換
- 溫度轉換;
- 重量轉換;
- 長度轉換;
- 面積轉換;
- 體積轉換;
- 常數
- π
- e
- γ(歐拉常數)
- g
- (+)支持:可以將製作好的模板進行分類,避免重複勞動。--Isnow 10:11 2006年4月15日 (UTC)
我建議對於有計算功能模板的命名採用en:Hungarian notation,也就是:
- 採用有意義的前綴(比如函數用f打頭,轉換用t打頭,常數用c打頭);
- 採用駝峰字。
--Mountain 13:09 2006年4月17日 (UTC)
::轉換不是函數嗎?t跟f有混淆。Upssdr - t 08:08 2006年4月19日 (UTC)
- 注意:各位在製作模板後一定要寫說明(比如用{{doctu}}),與養成寫註釋的好習慣一樣,養成寫說明書的好習慣!
- Upssdr - t 08:12 2006年4月19日 (UTC)
- 寫註釋是好習慣。--Mountain 09:11 2006年4月19日 (UTC)
- 我同意寫註釋是好習慣,關於文檔,我的意見是這裏是wiki模板,並非一個工程或庫,在模板中寫明功能和用法已足夠,不必非得{{doctu}}中那般詳細,當然詳盡寫出更好了。
- 關於時區一系列函數,由於目前還未定型,所以文檔遲些寫。目前的實現與開始的結構完全不同,至少在昨天,系統還無法進入Wikipedia:用戶框/時間(裏面30多個UTC調用時間超過180s),ParserFunctions的效率比想像中的要差,必須優化算法。
- 現在ParserFunctions本身還在變化中,還有一些問題,比如#ifeq:+1|+01是按數字比較返回真、round運算符對負數的捨入在左側等,我們還不知道以後會不會有什麼變化。我的意思是,先不要着急大面積應用,也不一定非等風格方式都確定再應用,現在可以先寫着,畢竟這是wiki,任何時候都可以修改的。— fdcn talk 2006年04月20日03:12 (UTC+8 11:12)
日期時間類標準
編輯參數
編輯- 使用數字參數,還是命名參數?
{{fXXX|1|2|3}}?{{fXXX|d=|m=|y=}}?
- 若使用數字參數,yyyy;dd;mm順序如何?
打頭
編輯- t,f,x都是什麼含義?
- t是transform,f是function,c是constant。我沒有把x當前綴用,我創建Template:XDaysBeforeCurrentDate的當時覺得這個模板不像函數,所以沒有直接以f打頭。實際上Template:XDaysBeforeCurrentDate也可以看成廣義的函數。--Mountain 02:24 2006年4月20日 (UTC)
- 我也認為不應將Template:XDaysBeforeCurrentDate這樣的模板看成函數,我以為可以以這樣的原則來判斷:是否面向模板調用的普通編輯者,還是面向模板編輯者。— fdcn talk 2006年04月20日02:54 (UTC+8 10:54)
- t是transform,f是function,c是constant。我沒有把x當前綴用,我創建Template:XDaysBeforeCurrentDate的當時覺得這個模板不像函數,所以沒有直接以f打頭。實際上Template:XDaysBeforeCurrentDate也可以看成廣義的函數。--Mountain 02:24 2006年4月20日 (UTC)
大家可以一起討論出一個都能接受的前綴方案,下面列出幾種可能的選擇方案(歡迎大家提出更好的方案):
- 不需要前綴。
- 依照模板的用途來加前綴,如:date_IsLeapYear、time_GetHour、unit_PoundToKG、const_Pi等。
- 依照模板的數據類型來加前綴,如:bool_IsLeapYear、time_GetHour、float_PoundToKG、float_Pi等。
看了一下幾個math的模板,感覺加下劃線「_」非常不好看,希望能去掉下劃線「_」。--Mountain 07:19 2006年4月21日 (UTC)
時間輸出格式
編輯- 是否在模板間調用時使用時間戳?
- UNIX時間戳?
- ISO 8601?
- RFC822?
- 我認為應當考慮這樣一個問題:這些模板(包括函數模板)是面向普通維基人還是面向程序維基人?大多數維基人並不明了這些格式。這個問題考慮好了,也就有答案了。— fdcn talk 2006年04月20日03:38 (UTC+8 11:38)
模板代碼風格
編輯- 什麼時候打空格?
- 大量使用括號還是儘量不使用括號?
- 縮進?
- 不必強制,由編輯者自行決定,以便於閱讀為准。好的風格便於不出錯及閱讀,應當提倡,但模板涉及頁面輸出,所以也要保證空格與回車不得輸出錯誤的排版,而這可能會影響好的風格。至於括號,我認為對一時不能反應判斷優先級的應儘量使用。— fdcn talk 2006年04月20日02:43 (UTC+8 10:43)
**以上移动结束
使用報告
編輯- round運算符
- ifeq
- {{subst:#ifeq:A|B|estr|nestr}}如果A與B構成單個數字的表達式,就不是比較字符串了,而是比較數。{{subst:#ifeq:+03|3|相等}}輸出相等,我個人認為這是bug,已有ifexpr了,不需要判斷這種相等。— fdcn talk 2006年04月20日06:27 (UTC+8 14:27)
- 我已在m:Talk:ParserFunctions提出。Upssdr - t 09:46 2006年4月20日 (UTC)
- {{subst:#ifeq:A|B|estr|nestr}}如果A與B構成單個數字的表達式,就不是比較字符串了,而是比較數。{{subst:#ifeq:+03|3|相等}}輸出相等,我個人認為這是bug,已有ifexpr了,不需要判斷這種相等。— fdcn talk 2006年04月20日06:27 (UTC+8 14:27)
討論
編輯- 可以給出一些常用函數的模板代碼:(我在這裏儘量減少{{}}嵌套)
- math_Floor(x):
{{#expr:(x-0.5 round 0)+(x round 0 = x)*(x<=0) }}
{{math.floor}} - math_Ceil(x):
{{#expr:(x+0.5 round 0)-(x round 0 = x)*(x>=0)}}
{{math.ceil}} - math_Int(x):
{{#expr:(x-0.5round0) + (x<=0)}}
{{math.int}} - math_Frac(x):
{{#expr:x-(x-0.5round0)-(x<=0)}}
{{math.frac}} - math_Abs(x):((x>0)-(x<0))*x {{math.abs}}
- math_Sgn(x):(x>0)-(x<0) {{math.sgn}}
- math_Odd(x):( x round 0 = x ) and ( x mod 2 = 1 ) {{math.odd}}
- Max: {{math.max2}}取二個數字的最大值
- maxvalue : {{math.max}}取一組數的最大值
- Min: {{math.min2}}取二個數字的最小值
- minvalue: {{math.min}}取一組數的最小值
- chr
- val
- InRange
- IsInfinite
- IsNotNumber
- IsZero
- bool SameValue(A;B;Epsilon)
- const_MaxFloat
- const_MinFloat
- en:Category:Templates_using_ParserFunctions--Mountain 11:07 2006年4月20日 (UTC)
- 辛苦了,請製成模板放在Category:數學模板下吧。— fdcn talk 2006年04月21日08:32 (UTC+8 16:32)
- 還沒完呢。Upssdr - t 08:05 2006年4月22日 (UTC)
所謂浮點誤差,不僅醜陋,而且帶來錯誤: 紅色的是重大錯誤。還有一些「-0」,「-1.11022302463E-15」(誤差太大),「-1E-04」(無法再計算)的錯誤。 User talk:Upssdr/math Call/c
Expression error: unexpected preg_match failure
編輯誰能給出一個出現這個錯誤的表達式?Expr.php看似有點問題:
...... } elseif ( ctype_alpha( $char ) ) { // Word // Find the rest of it $remaining = substr( $expr, $p ); if ( !preg_match( '/^[A-Za-z]*/', $remaining, $matches ) ) { // This should be unreachable $this->error( 'preg_match_failure' ); return false; }
我覺得$this->error( 'preg_match_failure' )不會出現,但Tim Starling卻說:「Finding a method for reaching that branch is left as an exercise for the reader. Or you could find something more useful to do, like I don't know, writing some code of your own.」(m:talk:ParserFunctions#what's the use of preg_match_failure ?)。真是糊塗了。Upssdr - t 04:21 2006年4月21日 (UTC)
新的模板擴展可用
編輯from Wikipedia:互助客棧/消息
{{#ifexist:}}和{{#language:}}可用,詳細用法見Help:模板擴展語法。— fdcn talk 2006年05月31日23:58 (UTC+8 07:58)
- 似乎頗實用啊--✉Hello World! 09:04 2006年6月1日 (UTC)
- #ifexist 就是查看是否存在那個條目名字。--✉Hello World! 09:16 2006年6月1日 (UTC)
- 不知有沒有功能用來查重定向頁呢 --✉Hello World! 13:22 2006年6月1日 (UTC)
- 要逐個找,很麻煩啊--✉Hello World! 14:09 2006年6月1日 (UTC)
一個應用{{#ifexist:}}的例子:{{portal}}— fdcn talk 2006年06月4日16:08 (UTC+8 00:08)
請問,關於換行的問題
編輯我編寫模版時有時會出錯,後來發現換行會有影響
{{User:Chou0416/s-type
|{{{upsta|{{{1}}}}}}
|{{{upnote|{{{2}}}}}}
|{{{uptype|{{{3}}}}}}
|{{{uprows|{{{4}}}}}}
}}
如此寫法時若是子模版中是''({{{sta|{{{1}}}}}})''
的話,)會被換行,但是
{{User:Chou0416/s-type|{{{upsta|{{{1}}}}}}|{{{upnote|{{{2}}}}}}|{{{uptype|{{{3}}}}}}|{{{uprows|{{{4}}}}}}}}
這種寫法的話就不會...
有關模版的 if 語句
編輯請問怎樣寫 else 呢?本人正在編寫Template:巴士編號,想 {{{5}}} 是 "過海" 的話把背景轉做綠色—Bananasims (留言) 2007年4月20日 (五) 19:05 (UTC)
- 請見Help:模板擴展語法#if。--RalfX(議) 2007年4月20日 (五) 19:19 (UTC)
- 就是看完不懂。我是想 #if{{{5|}}} == '過海'|green|black 這樣,但是程式好像不能分辨 if{{{5|}}} == '過海',一個等號也不能—Bananasims (留言) 2007年4月20日 (五) 19:21 (UTC)
- {{ #if: {{{5|}}} |green|black}},if條件式應該只能這樣用的,如果你是要切換顏色的話。--RalfX(議) 2007年4月20日 (五) 19:32 (UTC)
- 假如我想 {{{5|}}}是"過海"的話就轉色就沒有方法?那麼除 if 外有否其他替代方法?—Bananasims (留言) 2007年4月20日 (五) 19:34 (UTC)
- 用{{subst:#ifeq: {{{5|}}} | 過海 | <相等时返回的字符串> | <不相等时返回的字符串> }}。—Isnow 2007年4月20日 (五) 19:38 (UTC)
- 做好了,感謝—Bananasims (留言) 2007年4月20日 (五) 20:00 (UTC)
- 用{{subst:#ifeq: {{{5|}}} | 過海 | <相等时返回的字符串> | <不相等时返回的字符串> }}。—Isnow 2007年4月20日 (五) 19:38 (UTC)
- 假如我想 {{{5|}}}是"過海"的話就轉色就沒有方法?那麼除 if 外有否其他替代方法?—Bananasims (留言) 2007年4月20日 (五) 19:34 (UTC)
- {{ #if: {{{5|}}} |green|black}},if條件式應該只能這樣用的,如果你是要切換顏色的話。--RalfX(議) 2007年4月20日 (五) 19:32 (UTC)
- 就是看完不懂。我是想 #if{{{5|}}} == '過海'|green|black 這樣,但是程式好像不能分辨 if{{{5|}}} == '過海',一個等號也不能—Bananasims (留言) 2007年4月20日 (五) 19:21 (UTC)
ifexist 不分繁簡了
編輯ifexist函數許久以前是把繁簡視為不同的,但近來發現它已把繁簡視為相同。隨便舉幾個繁簡混用的標題做測試:
連結(原文) | 連結(繁簡混用) | ifexist判斷語法(繁簡混用) = 運行結果 |
---|---|---|
九莲宝灯 | 九蓮宝燈 | {{#ifexist:九蓮宝燈|存在|不存在}} = 存在
|
精确三角函数常数 | 精確三角函数常數 | {{#ifexist:精確三角函数常數|存在|不存在}} = 不存在
|
澳門電視台 (消歧義) | 澳門電视台 (消歧义) | {{#ifexist:澳門電视台 (消歧义)|存在|不存在}} = 存在
|
Template:丰都县行政区划 | Template:豐都县行政区劃 | {{#ifexist:Template:豐都县行政区劃|存在|不存在}} = 存在
|
Wikipedia:詢問處 | Wikipedia:詢问处 | {{#ifexist:Wikipedia:詢问处|存在|不存在}} = 存在
|
Help:监视列表 | Help:监視列表 | {{#ifexist:Help:监視列表|存在|不存在}} = 存在
|
從上面可以看到這些繁簡混用的連結都是紅字;但是用ifexist判斷這些繁簡混用的標題時,其結果卻全部都是「存在」;可見ifexist在運算時會把繁簡視為相同。這是何時變動的?這導致了一些需要判斷繁簡標題的模板(諸如Template:Otheruses)出現問題了。如果在判斷指定條目的存在性時要分清繁簡,應該怎麼辦?—街燈電箱150號 開箱維修 抄錶 檢驗證明 2010年1月10日 (日) 14:04 (UTC)
- 區分繁簡原本是ifexist的一大缺陷:因為內部連結能自動識別繁簡,模板能自動識別繁簡,分類雖然問題多多(主要是受不能重定向限制)但總體上來說還是能自動識別繁簡,就ParserFunctions的ifexist不行。因此,我特地打了個補丁修了這個缺陷(rev:49853)。不過沒想到消歧義模板竟然用ifexist的這個缺陷來判斷繁簡……這個問題,恐怕需要專門弄一個字詞轉換解析器函數才能實現(目前的字詞轉換都是在解析完成後才開始工作的,要讓if、switch這些解析器函數能識別字詞轉換後的結果,就必須靠同等級的字詞轉換解析器函數)。--菲菇@維基食用菌協會 2010年1月12日 (二) 21:16 (UTC)
- 其實ifexist還有個bug,你隨便在上方去掉一條ifexist語句然後預覽看,之前紅字的條目立馬就變藍字了。--菲菇@維基食用菌協會 2010年1月12日 (二) 21:20 (UTC)
Y=2(X^3)+5X,X=3,Y=?
編輯Y=2(X^3)+5X,X=3,Y=?
解析器函數在條目里沒有使用價值(考慮到WP:V),用了反而讓代碼變得難懂。使用解析器函數以維持實時更新也沒有必要。如有異議可以提出。--達師 - 218 - 372 2012年9月21日 (五) 16:53 (UTC)
- (!)意見:存在{{if}}、{{exists}}等模板。另外解析器函數和魔術字,以及其他常見語法的界線不明。Liangent(留言) 2012年9月21日 (五) 16:59 (UTC)
- 解析器函數定義為以{{#開頭。對於寫條目的人這些語法哪個都不常見。 --達師 - 218 - 372 2012年9月22日 (六) 09:58 (UTC)
- 此規定可以通過用模板包一層輕易繞開,特別是Lua來了之後。[[File: |thumb]]這個常見吧,那個」thumb「在mw內部走了魔術字的。Liangent(留言) 2012年9月22日 (六) 10:42 (UTC)
- 就是強制要求用模板包。不久之後還有一個限制在正文中用模板的提案。 --達師 - 218 - 372 2012年9月22日 (六) 10:53 (UTC)
- lua之後順便就禁止在條目里直接invoke了。--達師 - 218 - 372 2012年9月22日 (六) 10:54 (UTC)
- 那我弄個模板裏面寫:{{ {{{1}}} | {{{2|}}} | {{{3|}}} | ... }}行不?我說有用Lua方便就是不用逐個列舉參數。Liangent(留言) 2012年9月22日 (六) 11:56 (UTC)
- 演示:2012-10-16T14:42:16+00:00寫在條目里。Liangent(留言) 2012年9月22日 (六) 11:59 (UTC)
- --MakecatTalkDC10 2012年9月25日 (二) 06:11 (UTC)
- Wikipedia:不要為了闡釋觀點而擾亂維基百科 --達師 - 218 - 372 2012年9月25日 (二) 10:06 (UTC)
- 怎麼擾亂了……Liangent(留言) 2012年9月25日 (二) 10:10 (UTC)
- 提議的初衷就是兩條,一,一般用不到,二,沒有必要用。你這樣不是和用了沒區別麼。--達師 - 218 - 372 2012年9月25日 (二) 13:49 (UTC)
- 前面不是早說了「可以通過用模板包一層輕易繞開」嘛。Liangent(留言) 2012年9月25日 (二) 14:05 (UTC)
- 你這樣實質上沒有封裝。只有為實現特定功能而放入模板才叫用模板包。 --達師 - 218 - 372 2012年9月29日 (六) 04:55 (UTC)
- 還有,你這個就是擾亂。方針需理解其精神,而非簡單按照字面操作。 --達師 - 218 - 372 2012年9月29日 (六) 04:55 (UTC)
- 不需要吵起來。想一想實作和維護上有沒有什麼困難之處。--章安德魯(留言) 2012年9月29日 (六) 08:40 (UTC)
- 前面不是早說了「可以通過用模板包一層輕易繞開」嘛。Liangent(留言) 2012年9月25日 (二) 14:05 (UTC)
- 提議的初衷就是兩條,一,一般用不到,二,沒有必要用。你這樣不是和用了沒區別麼。--達師 - 218 - 372 2012年9月25日 (二) 13:49 (UTC)
- 怎麼擾亂了……Liangent(留言) 2012年9月25日 (二) 10:10 (UTC)
- Wikipedia:不要為了闡釋觀點而擾亂維基百科 --達師 - 218 - 372 2012年9月25日 (二) 10:06 (UTC)
- --MakecatTalkDC10 2012年9月25日 (二) 06:11 (UTC)
- 此規定可以通過用模板包一層輕易繞開,特別是Lua來了之後。[[File: |thumb]]這個常見吧,那個」thumb「在mw內部走了魔術字的。Liangent(留言) 2012年9月22日 (六) 10:42 (UTC)
- 解析器函數定義為以{{#開頭。對於寫條目的人這些語法哪個都不常見。 --達師 - 218 - 372 2012年9月22日 (六) 09:58 (UTC)
- 一旦不需要了不會有人通知「該拆掉這個解析器了」。而且對新手極其不友好。 --達師 - 218 - 372 2012年10月6日 (六) 05:16 (UTC)
關於{{#time:N月}}模板
編輯- 下列討論已經關閉,請勿修改。如有任何意見,請至合適的討論頁進行,並不要再次編輯本討論。
現在是2022年3月31日 (四) 05:33 (UTC),但是用了{{#time:月}}
模板,卻是4月。--羅潔塔,FP FL 454208 2022年3月31日 (四) 05:33 (UTC)
- N是指星期幾,今天是星期四,所以顯示為4並沒有錯誤--百無一用是書生 (☎) 2022年3月31日 (四) 05:50 (UTC)
- 本討論已經關閉,請勿修改。如有任何意見,請至合適的討論頁進行,並不要再次編輯本討論。