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)
- 这是一个令人高兴的消息。以前的许多模板都应整理并且清除一些过于杂技化的模板,有大量的工作得做了。我希望下一步能实现简单的正则表达式用于字符串处理。维基的模板不需要发展成为一个类似脚本语言的东东,但数学运算、逻辑判断、字符处理是显然非常需要的。
- 另外,发动机兄的冲突版本,我认为不太可能实现,除非条目的历史版本可以做为模板应用。—自由主義者 ☎ 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}}:108
- {{fYearFromSerial|{{fOrdinalDate}}|2006}}:2006
- {{fMonthFromSerial|{{fOrdinalDate}}|2006}}:4
- {{fDayFromSerial|{{fOrdinalDate}}|2006}}:18
- {{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)
- 管理员得谢你啊。另外这个模板是方便管理员的,一周前的天数以链接给出,没有终结的投票大家不易看到,不知管理员们愿不愿手动做那一部分。—自由主義者 ☎ 2006年04月14日05:43 (UTC+8 13:43)
**移动结束
**以下移动自Category talk:維基百科模板
可这个究竟对模板或者模板分类有什么帮助呢?-无名无形 11:52:43 2006年4月8日 (UTC)
- 对模板的内容输出帮助大着呢,比如现在的Template:UTC系列模板(可以看看Template:UTC+0800源码),如果有上面的功能,就不必有如此冗肿的代码和对服务器如此大的负载了。再如现在的年代世纪类模板,许多处理可以由模板来进行,而不必让编写者和调用者付出这么大精力了。—自由主義者 ☎ 2006年04月8日12:46 (UTC+8 20:46)
[编辑] 基于ParserFunctions的一个注意事项
由于有了ParserFunctions,很多功能能够被实现。但是很容易出现重复实现的情况。比如说,若干个不同名称的判断闰年的模板。所以,应该统一模板的“接口”,就像程序语言中的.h和.dll。实现起来就是,预先统一特定功能模板的名称,再去编写模板,编写好以后,就从指引的层面禁止再出现相似模板。Upssdr - t 05:30 2006年4月15日 (UTC)
- 建立了一个分类Category:函数模板做入口,所有计算与逻辑类的可以归于此。—自由主義者 ☎ 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,任何时候都可以修改的。—自由主義者 ☎ 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這樣的模板看成函數,我以為可以以這樣的原則來判斷:是否面向模板調用的普通編輯者,還是面向模板編輯者。—自由主義者 ☎ 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?
- 我认为应当考虑这样一个问题:这些模板(包括函数模板)是面向普通维基人还是面向程序维基人?大多数维基人并不明了这些格式。这个问题考虑好了,也就有答案了。—自由主義者 ☎ 2006年04月20日03:38 (UTC+8 11:38)
[编辑] 模板代码风格
- 什么时候打空格?
- 大量使用括号还是尽量不使用括号?
- 缩进?
- 不必強制,由編輯者自行決定,以便於閱讀為准。好的风格便于不出错及阅读,应当提倡,但模板涉及页面输出,所以也要保证空格与回车不得输出错误的排版,而这可能会影响好的风格。至于括号,我认为对一时不能反应判断优先级的应尽量使用。—自由主義者 ☎ 2006年04月20日02:43 (UTC+8 10:43)
**以上移动结束
[编辑] 使用报告
- round运算符
- ifeq
- {{#ifeq:A|B|estr|nestr}}如果A与B构成单个数字的表达式,就不是比较字符串了,而是比较数。{{#ifeq:+03|3|相等}}输出相等,我个人认为这是bug,已有ifexpr了,不需要判断这种相等。—自由主義者 ☎ 2006年04月20日06:27 (UTC+8 14:27)
- 我已在m:Talk:ParserFunctions提出。Upssdr - t 09:46 2006年4月20日 (UTC)
- {{#ifeq:A|B|estr|nestr}}如果A与B构成单个数字的表达式,就不是比较字符串了,而是比较数。{{#ifeq:+03|3|相等}}输出相等,我个人认为这是bug,已有ifexpr了,不需要判断这种相等。—自由主義者 ☎ 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}}- 以上四个的测试见User talk:Upssdr/math Call。
- 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:数学模板下吧。—自由主義者 ☎ 2006年04月21日08:32 (UTC+8 16:32)
- 还没完呢。Upssdr - t 08:05 2006年4月22日 (UTC)
所谓浮点误差,不仅丑陋,而且带来错误: 红色的是重大错误。还有一些“-0”,“-1.11022302463E-15”(误差太大),“-1E-04”(无法再计算)的错误。
num | floor | ceil | int | frac |
---|---|---|---|---|
-1.1 | -2 | -1 | -1 | -0.1 |
-1.01 | -2 | -1 | -1 | -0.01 |
-1.001 | -2 | -1 | -1 | -0.00099999999999989 |
-1.0001 | -2 | -1 | -1 | -9.9999999999989E-05 |
-1.00001 | -2 | -1 | -1 | -1.0000000000066E-05 |
-1.000001 | -2 | -1 | -1 | -9.9999999991773E-07 |
-1.0000001 | -2 | -1 | -1 | -1.0000000005839E-07 |
-1.0000000000001 | -2 | -1 | -1 | -9.9920072216264E-14 |
-1.00000000000001 | -2 | -1 | -1 | -9.9920072216264E-15 |
-1.000000000000001 | -2 | -1 | -1 | -1.1102230246252E-15 |
-1.0000000000000001 | -1 | -1 | -1 | 0 |
-1.00000000000000001 | -1 | -1 | -1 | 0 |
-1.0 | -1 | -1 | -1 | 0 |
-0.999999999999999999 | -1 | -1 | -1 | 0 |
-0.99999999999999999 | -1 | -1 | -1 | 0 |
-0.9999999999999999 | -2 | -0 | -1 | 0 |
-0.999999999999999 | -1 | -0 | 0 | -1 |
-0.99999999999999 | -1 | -0 | 0 | -0.99999999999999 |
-0.9999999999999 | -1 | -0 | 0 | -0.9999999999999 |
-0.999 | -1 | -0 | 0 | -0.999 |
-0.99 | -1 | -0 | 0 | -0.99 |
-0.9 | -1 | -0 | 0 | -0.9 |
-0.8 | -1 | -0 | 0 | -0.8 |
-0.1 | -1 | 0 | 0 | -0.1 |
-0.01 | -1 | 0 | 0 | -0.01 |
-0.001 | -1 | 0 | 0 | -0.001 |
-0.0001 | -1 | 0 | 0 | -9.9999999999989E-05 |
-0.00001 | -1 | 0 | 0 | -9.9999999999545E-06 |
-0.000001 | -1 | 0 | 0 | -1.0000000000288E-06 |
-0.000000000000001 | -1 | 0 | 0 | -9.9920072216264E-16 |
-0.0000000000000001 | -1 | 0 | 0 | -1.1102230246252E-16 |
-0.00000000000000001 | -1 | 1 | 0 | 0 |
-0.000000000000000001 | -1 | 1 | 0 | 0 |
-0.0000000000000000001 | -1 | 1 | 0 | 0 |
-0.0 | 0 | 0 | 0 | 0 |
0.0000000000000000001 | -1 | 1 | -1 | 1 |
0.000000000000000001 | -1 | 1 | -1 | 1 |
0.00000000000000001 | -1 | 1 | -1 | 1 |
0.0000000000000001 | 0 | 1 | 0 | 1E-16 |
0.000000000000001 | 0 | 1 | 0 | 1E-15 |
0.00000000000001 | 0 | 1 | 0 | 1E-14 |
0.000001 | 0 | 1 | 0 | 1E-06 |
0.00001 | 0 | 1 | 0 | 1E-05 |
0.0001 | 0 | 1 | 0 | 0.0001 |
0.001 | 0 | 1 | 0 | 0.001 |
0.01 | 0 | 1 | 0 | 0.01 |
0.1 | 0 | 1 | 0 | 0.1 |
[编辑] 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:模板扩展语法。—自由主義者 ☎ 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}}—自由主義者 ☎ 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}}}}}}}}
這種寫法的話就不會...