帮助讨论:解析器函数
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}}:234
- {{fYearFromSerial|{{fOrdinalDate}}|2006}}:2006
- {{fMonthFromSerial|{{fOrdinalDate}}|2006}}:8
- {{fDayFromSerial|{{fOrdinalDate}}|2006}}:22
- {{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)
- 本讨论已经关闭,请勿修改。如有任何意见,请至合适的讨论页进行,并不要再次编辑本讨论。