2023年政策修订增补工作正在进行中,欢迎参与!
  • Moegirl.ICU:萌娘百科流亡社群 581077156(QQ),欢迎对萌娘百科运营感到失望的编辑者加入
  • Moegirl.ICU:账号认领正在试运行,有意者请参照账号认领流程

Template talk:嵌入片段

萌娘百科,万物皆可萌的百科全书!转载请标注来源页面的网页链接,并声明引自萌娘百科。内容不可商用。
跳转到导航 跳转到搜索

能否让这个模板更加数据库化一点?

例如页面A有以下的wiki代码:

<!-- embed:Outer -->
第一行
<!-- embed:Inner1 -->
*<!-- embed -->1<!-- embed-end -->
*<!-- embed -->4<!-- embed-end -->
*<!-- embed -->3<!-- embed-end -->
<!-- embed-end:Inner -->
中间的某一行

<!-- embed:Inner2 -->
*<!-- embed -->6<!-- embed-end -->
*<!-- embed -->3<!-- embed-end -->
*<!-- embed -->8<!-- embed-end -->
<!-- embed-end:Inner -->
最后一行
<!-- embed-end:Outer -->

只需要调用

{{嵌入片段|page=A|Outer|Inner1|[2]}}

就能得到结果:4

甚至还可以用来做算术

{{#ifeq:{{#expr:{{#expr:{{嵌入片段|page=A|Outer|Inner1|[3]}} - {{嵌入片段|page=A|Outer|Inner1|[1]}}}} * {{嵌入片段|page=A|Outer|Inner1|[2]}}}}|{{嵌入片段|page=A|Outer|Inner2|[3]}}|正确|错误}}
<!-- {{#ifeq:{{#expr:{{#expr:3 - 1}} * 4}}|8|正确|错误}}

得到结果:正确

虽然这个算法是可以实现的。

但我不清楚这样做会不会有什么严重的后果。--サンムル讨论) 2018年12月4日 (二) 21:13 (CST)

快住手,这已经不是嵌入片段了 还是不要这么改了吧,这和嵌入片段没什么关系,想实现类似效果直接在lua里写数据不是更好,或者拿{{array}}和{{split}}也可以。这个模板主要的应用场景是几个页面有一个或多个重复的部分,利用这个模板达到简化代码,方便修改的目的,也就是类似大家族模板的作用。--東東君讨论) 2018年12月4日 (二) 21:45 (CST)
那么我所设想的使用情况就有所不同,我这边维护的大家族有挺多重复的参数细节,比如说角色的日文名、拼写、角色色卡等等等等。这些基本上都不是简单的文本,而是可能包含wiki代码的块(比如说日文名会加上{{lj}}、{{ruby}}模板)。
如果说{{嵌入片段}}这个模板定位在便于重用大段的代码,那我所设想的模板则定位在便于书写上述零碎难以记忆但可以通过特定逻辑来检索的小参数而且,我设想的模板在使用时是强烈建议或者说必须添加上subst:展开模板的。因为这些小参数不需要随时变动,是可以写成硬代码的。
Lua模块确实是一个可选的载体,但事实上,为了后期维护的方便,我更倾向于使用大部分编辑者也能轻松驾驭的wiki页面来当作“数据库”的载体。
例如大家族少女歌剧,则创建子页面少女歌剧/datas,然后在这个子页面书写上面提到的格式的代码。(由于此子页面被视为特殊的页面,因此出现这样的“奇怪”的HTML注释代码就不会让新手编辑不知所措,或者误删误改。)--サンムル讨论) 2018年12月4日 (二) 22:46 (CST)
上面描述的子页面现在在萌百也存在,且数量不少,如果没记错的话偶像大师的角色色卡也是单独放置在一个子页面里的,不过目前的应用似乎只是作为一个“说明书”,而非“数据库”使用,我想就这点来简化编辑。--サンムル讨论) 2018年12月4日 (二) 22:48 (CST)--サンムル讨论) 2018年12月4日 (二) 22:48 (CST)
@サンムル快住手,这已经不是嵌入片段了 看你的例子,如果只是为了获取大量零碎的数据的话,感觉和重新发明XML/json没什么区别,而且还比XML/json丑,更别提现在XML/json已经有了完善的工具(虽然维基里不一定能用)。而如果用{{嵌入片段}},一旦embed和embed-end不匹配,天知道会发生什么,而且还没有工具可以检查,这个工作应该交给其他模块做。
其实Lua是可以解析维基文本的,见mw.html:wikitext和/或frame:callParserFunction、frame:expandTemplate等。
@东东君其实最好可以支持embed的嵌套,比如某页面因为某些原因介绍了两张专辑某些原因是啥?这么做好像是不合编辑规范的吧?,分有简介和模板{{Album Infobox}}:
<!-- embed:专辑1 -->
<!-- embed:简介 -->
这是专辑1的简介
<!-- embed-end:简介 -->
<!-- embed:Album_Infobox -->
{{Album Infobox|...}}
<!-- embed-end:Album_Infobox -->
<!-- embed-end:专辑1 -->

<!-- embed:专辑2 -->
<!-- embed:简介 -->
这是专辑2的简介
<!-- embed-end:简介 -->
<!-- embed:Album_Infobox -->
{{Album Infobox|...}}
<!-- embed-end:Album_Infobox -->
<!-- embed-end:专辑2 -->
现在我想调用专辑2的简介,{{嵌入片段|page=页面名称|id=简介}}只能得到专辑1的简介,希望修改成可以使用{{嵌入片段|page=页面名称|专辑2|简介}}调用专辑2的简介。
所以我为什么不重命名为“embed:简介2”或者拆成两个页面啊。--Nzh21讨论) 2018年12月4日 (二) 23:56 (CST)
@Nzh21目前这个模板是没有问题的,你应该分别命名为“专辑1简介”和“专辑2简介”--サンムル讨论) 2018年12月5日 (三) 00:00 (CST)
这个办法上面的黑幕里提过了,星际玩家(笑)。其实这么做还是有一些编程的思维定势吧,专辑1专辑2专辑类的两个实例,他们有两个属性简介Album_Infobox再次黑幕:所以为什么要这么写呢?考虑到这个实用性可能不太高,也没什么人会这么写,只是个建议而已,不实现也无所谓的。--Nzh21讨论) 2018年12月5日 (三) 00:09 (CST)
答サンムル:

有几点疑问和理由:

  • 主要问题是需要使用参数吗?参数可以在包裹的内容里写,之后直接在调用模板时传入参数
  • 再稍微复杂一点的模板就应该单独创建了,subst更应该创建一个模板,以管理其内部哪部分需要展开
  • 这个模板就是为了省去再创建一个页面作为模板而使用的,要是为了使用这个模板创建一个新的页面岂不是南辕北辙了
  • 拿wiki语法做结构化数据实在是个比较糟糕的主意,它需要额外的字符串处理,以及更多的语法代码
答Nzh21:

这种情况完全可以写到一起,加个参数还得多写一个管道符。

最后,你们都没发现这个模板是能向嵌入代码传参的吗...占用匿名参数的位置会导致参数错乱的--東東君讨论) 2018年12月5日 (三) 00:17 (CST)

的确是我没想到这一点,被一开始那个写成数组一样的例子带来了一些奇怪的想法,虽然一开始就觉得这是个没什么用的功能,但没想到的确会影响参数。--Nzh21讨论) 2018年12月5日 (三) 00:24 (CST)
@東東君我明白你的观点了。我会另写一个模块尝试实现,关于embed和embed-end不匹配的问题,或许今后此格式广泛使用后可以添加过滤器,或者用javascript开发小工具来编辑时检查,但目前为止它是一个不容忽视的问题。我的新模块和新模板将会保留在我的用户页下,仅自己使用,不会转正。--サンムル讨论) 2018年12月5日 (三) 00:33 (CST)

关于embed和embed-end不成对的一个解决方法

首先需要建立一个前提,一个共识——“若embed和embed-end不成对将可能会造成无法预料且难以排查的错误。每一位编辑者在使用embed和embed-end对页面内容进行分割时,有义务确保其成对。”

建议把上面这句话写入文档中。

接下来提出解决方法:

我的思路是借鉴#invokeLua模块。
  • 若Lua模块正常运行,则输出内容。
  • 若Lua模块产生错误,则在页面上显示一行红色粗体文本,内容为产生的错误的信息,点击链接能得到调用堆栈等更详尽的错误信息。
借鉴后把模板的行为修改为:
  • 若embed和embed-end成对,则输出内容。
  • 若embed和embed-end不成对,则显示【警告】这个片段嵌入自{{{page|}}}(id={{{id|}}}),但由于某些原因丢失。有可能是页面[[{{{page|}}}]]已被删除或移动,或者是embed和embed-end不成对。,
【可选】若不想显示这个警告信息,可以给模块添加参数ignoreWarning

那么,当若embed和embed-end不成对,将会什么内容也不输出。

我昨天在讨论:提问求助区试用的时候就因为embed和embed-end没有成对而险些把我自己的整个用户页给嵌入上去了。因此,在这种情况下,拒绝输出任何内容要比目前的“从embed开始,找不到embed-end就一直输出到页面结尾”要好,这样可以排除不可预料的后果。--サンムル讨论) 2018年12月5日 (三) 10:41 (CST)


由此进阶,借鉴分类Category:有脚本错误的页面创建分类Category:含有错误嵌入片段的页面。若embed和embed-end不成对,在显示警告信息的同时,将页面归到这个分类下。以后定期巡查,方便维护。@東東君--サンムル讨论) 2018年12月5日 (三) 12:30 (CST)

一部分采纳:

  • 那句话感觉有点太小题大做了,这就是一个代码语法,和模板花括号一样,错了就会出问题,“有义务...”什么的,感觉好奇怪啊
  • 完善了错误信息
  • 发生标记匹配错误阻止输出内容
  • 没有添加屏蔽错误信息的参数,因为即使是用来做if判断也没什么意义,这可能导致更难发现错误
  • 添加了分类(个人观点:虽然添加能更便于找出发生问题的页面,但就为了一个模板还是不至于)

--東東君讨论) 2018年12月5日 (三) 13:31 (CST)

若使用Lua的error来输出错误信息,则前面的Lua错误 模块:SectionEmbed的第xx行:这种无关文本是否会分散使用者的注意力?给人一种“这是模块代码出了问题,而不是我自己写错链接”的错觉。--サンムル讨论) 2018年12月5日 (三) 15:06 (CST)

完成 已经去掉前缀--東東君讨论) 2018年12月5日 (三) 15:34 (CST)

被嵌入片段中含有章节的“编辑”链接指向错误

如果被嵌入片段中含有章节,那么这个章节的“编辑”链接指向的是模块:SectionEmbed的同名章节。

如:Help:沙盒?id=2235154

如:

现场演示

正常的章节:

被嵌入的章节

章节内容


非正常的章节:

被嵌入的章节

章节内容


--サンムル讨论) 2018年12月8日 (六) 15:06 (CST)

完成 已修复。--東東君讨论) 2018年12月8日 (六) 21:32 (CST)

多次使用嵌入片段产生的错误

我在《BanG_Dream!少女乐团派对!》页面的「翻唱曲一节中加入了6组embed标记,然后试图在BanG_Dream!/BanG_Dream!翻唱曲列表中使用时,遇到了问题。如果我只使用4次「嵌入片段」,则一切正常。如果使用超过四次,则会出现警告:包含模板大小过大。 一些模板将不会包含。第五次嵌入片段的地方变成了未解析的「Template:嵌入片段」,第六次的地方变成了「嵌入失败,请确认在页面【BanG_Dream!少女乐团派对!】是否存在id为“GBP-Cover-Others”的embed嵌入标记,并检查书写是否正确!」,而该页面之后所有的Template也都失效了。

以上情况在预览和沙盒正式保存中都会出现。是否是因为《BanG_Dream!少女乐团派对!》这个页面的内容较大,而「嵌入片段」的原理是引用整个页面再截取部分,每引用一次就要占用整个页面的大小导致的?(我瞎推测的,我并没有研究过「嵌入片段」的实现原理)--Krowbullet讨论) 2019年2月5日 (二) 00:14 (CST)

之前的做法的确是引入整个页面再截取,这会导致整个页面被载入。后来改成了在Lua里先取源码再截取后解析输出,这样虽然解决了前面的问题,但只要是模板生成的内容,就会被算进“模板展开后大小”里,暂时还没找到什么好办法能解决这个问题。--東東君讨论) 2019年2月5日 (二) 01:06 (CST)
完成 貌似修好了--Nzh21讨论) 2019年2月5日 (二) 14:13 (CST)

新章节

修改后不能省略id,也不能传参了。建议换回原来的载入方式。--迟昫123讨论) 2019年2月11日 (一) 22:14 (CST)

已修复,打错字母的下场--Nzh21讨论) 2019年2月11日 (一) 22:15 (CST)