Help talk:解析器函数
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}}:309
- {{fYearFromSerial|{{fOrdinalDate}}|2006}}:2006
- {{fMonthFromSerial|{{fOrdinalDate}}|2006}}:11
- {{fDayFromSerial|{{fOrdinalDate}}|2006}}:5
- {{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)
- 本討論已經關閉,請勿修改。如有任何意見,請至合適的討論頁進行,並不要再次編輯本討論。