使用SMW子对象而不必复制内容

时间:2016-04-28 23:46:11

标签: mediawiki semantic-mediawiki

我想要实现的目标

我有许多补丁页面("补丁1.4","补丁1.5"等等)列出了对项目所做的更改,其中受影响/更改的内容链接到相应的页面("确认对话框"," foo"等):

  

补丁1.4

     
      
  • 修正了[[确认对话框]]
  • 中的拼写错误   
  

补丁1.5

     
      
  • 添加了两个选项:[[foo]],[[bar]]
  •   

在有关已更改内容的页面上("确认对话框"," foo",...),我想自动显示所有相应的更改:

  

     
      
  • [[补丁1.5]]:添加了两个选项:[[foo]],[[bar]]
  •   

Semantic MediaWiki的子对象可以做到这一点

#subobject允许我为补丁页面上的每个更改创建一个(匿名)对象:

{{#subobject:|
|Changes=Added two options: [[foo]], [[bar]]
|Affects=Foo|Bar
}}

在每个页面上(" foo"等等)我可以包含一个#ask subobject query来列出所有匹配的子对象:

{{#ask: [[Affects::{{FULLPAGENAME}}]]
 |? Changes
}}

问题:我必须复制更改条目。

在补丁页面上,更改条目如下所示:

* Added two options: [[foo]], [[bar]] {{#subobject:|
|Changes=Added two options: [[foo]], [[bar]]
|Affects=Foo|Bar
}}

所以我必须指定"添加了两个选项:[[foo]],[[bar]]"两次:一次是可见内容,一次是隐形子对象。

(Semantic)MediaWiki有没有办法在不重复内容的情况下执行此操作?

理想的解决方案只需要我附上更改条目并在其旁边指定受影响的页面,例如:

* {{ Added two options: [[foo]], [[bar]] }}((foo|bar))

由于每个补丁页面都可以列出数百个更改,因此我不想为每次更改创建单独的页面。

1 个答案:

答案 0 :(得分:1)

如果我清楚地理解你的问题,你似乎只需要一个简单的查询:

{{#ask: [[-Has subobject::{{FULLPAGENAME}}]] 
| ?Changes
| format = ul
| headers = hide
| mainlabel = -
}}

由于使用SMW标记可能很繁琐且容易出错,因此您也可以使用MediaWiki模板。您可以简化添加修补程序更改:

<强>模板:更改

<includeonly><!--
-->{{#subobject:|
   | Changes = {{{1|}}}
   | Affects = {{{2|}}}|+sep=;
   }}<!--
--></includeonly><nowiki/>

{{{{2}}}}Affects是位置参数,s ;子对象属性使用|分隔符(因为管道<nowiki/>不明确且可能会中断模板,解析器函数等)。 <includeonly><!-- -->{{#ask: [[-Has subobject::{{{1|{{FULLPAGENAME}}}}}]] | ?Changes | format = ul | headers = hide | mainlabel = - }}<!-- --></includeonly><nowiki/> 是一种通过电话网站页面空白膨胀而节省的黑客。

您还可以添加一个特殊模板来封装更改查询:

模板:修补程序更改

{{Patch changes|Patch 1.5}}

默认情况下,模板会询问当前页面的更改列表(如果位置参数#1参数为空),或者您可以稍后在调用站点显式覆盖它(例如,{{Change | Fixed spelling in the [[confirmation dialog]] | Confirmation dialog}} {{Patch changes}}

补丁1.4

{{Change | Added two options: [[foo]], [[bar]] | Foo; Bar}}

{{Patch changes}}

补丁1.5

select 
    answer.id, room.name, room.description, roomimage.image_url 
from 
    answer
inner join 
    room on room.form_id = answer.id
inner join 
    roomimage on roomimage.room_id = room.id
where 
    answer.id = 3

分别

以后这些链接可能会有用: