Listpages 魔法与你
2019年3月10日
修订 16
评分
57
↑ 55
↓ 0
支持率
100%
总票数 55
Wilson 95% 下界
93.5%
在相同票数下更稳健的支持率估计
争议指数
0.000
评分趋势
按周聚合 加载图表中...
最近修订
1 / 6
最近投票
1 / 6
2025-07-30
2025-06-24
2024-07-19
2024-06-22
2024-05-25
2024-02-01
2023-07-28
2023-07-16
2023-05-25
2023-03-30
相关页面
暂无推荐
页面源码
[[include :scp-wiki-cn:credit:start-standalone]]
**ListPages 魔法与你**
**作者:**[[*user Croquembouche]],[[*user Rounderhouse]]
**译者:**[[*user Sekai_s]]
一篇如何使用 ListPages 的指导 —— 那个在夜晚我们都畏惧的野兽。
如果你已经读过这个但仍然需要帮助,//请务必请务必请务必//留下评论或者直接联系我们任何一个人,这说明这份指导并不完善、需要修订!
[[[cone|Croquembouche 的更多作品]]]
[[[rounderhouse-s-author-page|The Rounderpage]]]
[[include :scp-wiki-cn:credit:end-standalone]]
[[module CSS]]
:root {
--title-colour: #333;
}
h1 {
color: var(--title-colour);
font-family: Arial,sans-serif;
font-size: 250%;
margin: 0;
text-align: center;
font-weight: bold;
}
#page-content > h2 {
color: var(--title-colour);
font-family: Arial,sans-serif;
font-size: 150%;
margin: 0;
text-align: center;
font-weight: bold;
}
#page-content > hr {
margin: 0;
}
.warning {
background-color: #fee;
margin: 1em 40px;
padding: 0 1em;
color: rgba(0,0,0,0.8);
border: 1px dashed #f66;
}
.yellow {
background-color: #f2f2c2;
margin: 1em 40px;
padding: 0 1em;
color: rgba(0,0,0,0.8);
border: 1px dashed #c8b258;
}
.list-pages-box {
margin: 1em 40px;
padding: 0 1em;
background: #f4f4f4;
}
#page-content ul {
list-style: none;
padding: 0 40px;
}
#page-content .list-pages-box ul {
list-style: square;
}
#page-content .image {
margin-bottom: 1em;
}
tt {
opacity: 0.9;
}
.codeblock {
border: 1px dashed #ddd;
background-color: #F7F7F7;
font-family: 'Andale Mono', 'Courier New', Courier, monospace;
padding: 0 1em;
margin: 0.4em 0;
overflow: auto;
white-space: pre-wrap;
}
.codeblock br {
display: none;
}
.contents OL { counter-reset: item }
.contents LI { display: block }
.contents LI:before { content: counters(item, ".") " "; counter-increment: item }
[[/module]]
“ListPages”这个词被到处乱扔。
有的时候,有人看见了一个 SCP 运用了 ListPages,想要模仿一样的效果,于是在[http://scp-wiki-cn.wikidot.com/forum/c-6377139/ 提问区]里面求助。有的时候,有人想要知道如何去做一些特别的事情,而回答便是 ListPages。而有的时候,有人在你的页面下面留言,说你应该用一个 ListPages。
我已经在雨林之中冥想了“ListPages”这个词好几个月,我的心灵已经抵达了最深的梦乡之外。你或许知道它是什么,你甚至知道它意味着什么…但//我//已经感觉到 ListPages 的真正本质在我的身体中流淌。//我//能感觉到它虚无缥缈的形体正随着我的意志而改变。
我已经征服了第五元素 —— ListPages,而在这篇指导中(这应该是对 [[*user DrMagnus]] 所写的[[[advanced-formatting-and-you|]]]的一个补充),我会把这些知识传授给你。
[[>]]
—— [[*user Croquembouche]]
[[/>]]
-----
[[div class="contents"]]
**目录:**
# [#toc1 什么是 ListPages?]
# [#toc3 列出页面(Listing Pages)]
# [#toc4 筛选页面]
# [#toc5 进一步修改列表]
# [#toc6 显示列表]
# [#toc8 制作 Listpages 迭代]
# [#toc9 什么是迭代?]
# [#toc11 迭代的原理]
# [#toc12 偏移值(Offset)参数]
# [#toc13 创建子页面]
# [#toc14 创建父页面]
# [#toc16 总结]
# [#toc17 快速参考]
# [#toc18 创建段落(Fragment)]
# [#toc19 父页面]
# [#toc20 父与子]
# [#toc21 链接]
# [#toc22 大功告成]
[[/div]]
-----
请注意,在本指南中,我为每个示例的 ListPages 模块添加了灰色背景,以便与其他内容区分开来。你的 ListPages 模块将会是透明背景的。
[[div class="yellow"]]
+++ 请停一下,Croquembouche!
“我不需要知道如何从零开始制作一个 ListPages 模块!”你对我说,“我只想知道如何用 ListPages 做到像 [[[SCP-2998]]]、[[[SCP-2111]]]、还有 [[[SCP-3002]]] 那样的效果。”
对此我的回答是:你错了,学习基础也是非常重要的。复制粘贴代码固然很好,但若是一旦出现问题,而你并不理解为什么会出错,你又怎么去修复呢?
如果你确实已经学会了基础知识(或者假装你已经学会了),好吧,向下滚动至 ROUNDERHOUSE 的//章节 5:快速参考//。但勿谓言之不预也。
[[/div]]
@@ @@
-----
+ 1:什么是 ListPages?
-----
@@ @@
ListPages 是一种 Wikidot 模块。它的完整说明文件可以在[http://www.wikidot.com/doc-modules:listpages-module 这里]找到。
引用自说明文件:
> ListPages 模块是一种多功能、应用广泛的工具,可以筛选并显示同一个网站中的页面。
那就是它所做的 —— 字面意义上的列出页面(List Pages)。
在 SCP wiki 上,ListPages 通常有两种用处:
# 在 wiki 上筛选特定组别的页面,然后列出它们;
# 允许一个 SCP(或者任何页面)显示多个页面,你可以逐个浏览它们,但是它们都共用一个评分模块。
第一种用途“单调但实用”。我们就叫它列出页面(Listing Pages),因为那就是它所做的。[[[top-rated-pages-this-month|这是一个示例,包含 4 个 ListPages 模块用于列出页面]]]。
第二种用处,是//魔法//,是所有人都觊觎的神秘力量。称之为 ListPages 迭代,简称迭代。[[[scp-2998|这是一个运用了迭代的例子]]]。
而第一种,列出页面,是解释起来更容易的//方法//。在第二种用途(ListPages 迭代)中你所需要了解的很多问题,我会借助第一种来说明。
[[div class="warning"]]
+++ 警告
尽量让每个页面里的 ListPages 模块限制在一个。
ListPages 模块会//相当严重//地减慢页面加载的速度。[[[cone|我的作者页]]]曾一度有大约三十个模块,我敢肯定它当时需要花上整整一分钟来加载。那样糟透了,别那么做。
[[/div]]
@@ @@
-----
+ 2:列出页面(LISTING PAGES)
-----
@@ @@
闲话少说,让我们来看 ListPages 的第一种功能:单纯的页面列表。
这是我在 wiki 上评分最低的 5 个页面:[[footnote]]**译注:**原文这里的模块设置为原作者 Croquembouche 所创建的页面,此处做出了调整。下同。[[/footnote]]
[[module ListPages created_by="Sekai_s" order="rating" limit="5" separate="no"]]
* %%title_linked%% (+%%rating%%)
[[/module]]
如果你认为我仅仅只是手动输入了每个页面的链接放在了上面,再想一想。你正在见证 ListPages 魔法。你可以试试点进其中一个链接,Upvote(//求你了 :'(// ),然后刷新这一页。你会看到上面显示的评分会随之而变化。
如果你查看页面源代码,会看见如下的代码:
[[div_ class="codeblock"]]
@@[[@@module ListPages created_by="Sekai_s" order="rating" limit="5" separate="no"@@]]@@
@@*@@ %%title_linked%% (+%%rating%%)
@@[[/module]]@@
[[/div]]
不知道这些都意味着什么?别担心,这篇指导就是为此而准备的。
[[collapsible show="+ 基础语法说明"]]
-----
如果你曾经用过某些 Wikidot 语法,比如说 @@[[code]]@@ 还有用在评分模块上的“右侧对齐”语法(@@ [[>]] @@),亦或者说你用过 BBCode 或 HTML,Wikidot 模块语法与之非常类似。
首先单独一行输入@@“[[module]]”@@,这是起始标签,这就向 Wikidot 声明“嗨,我的文章现在有了一个 ListPages 模块”。
[[code]]
[[module]]
[[/code]]
接着,换行两次(在中间留一个空隙),输入终止标签。和起始标签几乎一样,只是在开头添加了一道斜线。这会告诉 Wikidot 你的模块到此为止。
[[code]]
[[module]]
[[/module]]
[[/code]]
在起始标签上,输入“ListPages”,来声明这是一个 //ListPages// 模块,不是你从大街上随随便便捡来的模块。
[[code]]
[[module ListPages]]
[[/module]]
[[/code]]
接着,紧跟在“ListPages”后面,输入一系列参数来筛选你想要显示的页面。这个我们过一会儿再详细说明。
在两个“module”标记之间,输入一系列内容标记,来表示你想要显示所选页面的哪些部分。这个也过一会儿再谈。
-----
[[/collapsible]]
只要你想,我就能展示我最高分的 5 个页面,或者不止 5 个,或者只显示在某个日期之后创建的页面。
有一大堆的参数可供输入 ListPages 模块,以便做任何你想做的事情。
我会分三个步骤,教你如何掌握 ListPages 的基础应用:
# 筛选你所想要的页面;
# 对列表作进一步的修改;
# 实际显示列表。
@@ @@
-----
++ 2.1:筛选页面
-----
@@ @@
如果你并没有设定任何参数,ListPages 会尝试列出 wiki 上的每一个页面。这不是你想要的,对不对?这时候就需要我们设置**选择器**。这会告诉 ListPages 该选择、以及不该选择哪些页面。
让我们来一起研究一下这些选择器,看看它们都有什么用处。
ListPages 有一大堆的选择器可供选择,下面是其中最实用的那部分:
* **created_by** -- 以作者的用户名来筛选。如果你将它设置为“Croquembouche”,ListPages 会仅显示由我创建的页面并忽略其他页面。请注意,这只会选择实际在 wiki 上发布了页面的那个用户!ListPages 无法识别合著和合作作者。
* **rating** -- 以评分来筛选。如果你将它设置为“>20”,你只能看到评分大于 20 的页面。设置为“=0”则仅显示得分为 0 的页面。
* **tags** -- 以标签来筛选。如果你在标签前面加上“+”,ListPages 会仅显示拥有此标签的页面。如果在前面加上“-”,ListPages 会仅显示不含此标签的页面。举个例子,“+scp -keter”会列出所有拥有“scp”但不含“keter”标签的页面。
* **created_at** -- 以页面创建日期来筛选。此选择器能接受一个合理的范围值。“2009”会选择 2009 年创建的所有页面,而“2009.02”会选择 2009 年 2 月创建的页面。“>2009.02”会选择在 2009 年 2 月//之后//创建的页面。“last 3 month”会选择过去 3 个月创建的所有页面。
* **name** -- 以页面名称来筛选,更确切地说,是页面的 URL 地址。“SCP-3000”匹配 SCP-3000 页面。使用百分符号来表示“以某字符开头的页面” —— 举个例子,“SCP-%”表示所有以“SCP-”开头的页面。
* **category** -- 以页面类别来筛选。默认情况下,ListPages 只会寻找那些与当前页面相同类别的页面。这一页的类别是“_default”,而 [[[system:page-tags]]]、类别是“system”,[[[component:earthworm]]]、类别就是“component”。查看 URL 地址 —— 冒号前面的内容就是类别,如果没有冒号,就是“_default”。类别选择器允许你指定一个特定的类别,或者设置为“*”表示所有类别。
总的来说,**每一个选择器都会匹配相应的页面而忽略其他的**。任何最终显示在列表中的页面,必须符合你全部的选择器。
[http://www.wikidot.com/doc-modules:listpages-module#toc2 这份文件]更详细地阐述了每个选择器 —— 还有少许其他的选择器! —— 就在“Selecting Pages”标题下方。
@@ @@
-----
++ 2.2:进一步修改列表
-----
@@ @@
仅仅筛选出特定页面并不是全部工作 —— 我们还需要设置这些页面如何去显示。
你还需要了解一些额外的参数。它们并不是选择器,因此并没有放在上一节里。但它们的使用方式完全相同。
* **limit** -- 设置页面列表的最大限制。如果设置为“5”,那么最多只会显示 5 个页面。
* **perPage** -- 列表的每一页该显示多少页面?(它并没有像听起来那么复杂!)默认情况下,这个值被设定为 20,如果列表中有超过 20 个页面,额外的页面会被放在一个新的页码里。你可以在[[[top-rated-pages-this-month|]]]中看到这个效果 —— 在 SCP 列表的底端(假设这个月已经过去超过一周了)。最大值为 250。
* **separate** -- 列表中的每个条目是单独处于它自己的小列表中,还是全部显示于同一个列表中。有效值为“yes”或者“no” —— 如果你说“yes”,那么列表中的每一项之间都会有很大的空隙,基本上不会是你所想要的效果。
* **order** -- 列表如何排序。
“order”参数允许许多不同类型的选项,你可以在[http://www.wikidot.com/doc-modules:listpages-module#toc3 这份文件]“Ordering Pages”标题下面找到。我在这里列出了一些最实用的:
* **order="rating"** -- 以评分顺序。
* **order="name"** -- 以页面名称字母顺序(URL 地址)。
* **order="title"** -- 以页面标题字母顺序(页面的实际标题)。[[footnote]]**译注:**仅能够识别字母和数字,无法根据汉字排序。[[/footnote]]
* **order="created_at"** -- 以页面创建的日期顺序。
* **order="comments"** -- 以评论数顺序。
* **order="random"** -- 随机排序!每过一分钟刷新一次。
默认情况下,所有选项均是升序排列的(所以最先显示较小的数字)。想要以倒序显示,在结尾加上‘desc’ —— 例如 order="rating desc"。
注意,并没有明确指定升序的方式。正确的做法是加上“desc desc”。这样有意义吗?没有。我们能指望 Wikidot 提供比这更好的东西吗?不能。
@@ @@
-----
++ 2.3:显示列表
-----
@@ @@
好了,现在我们已经知道了如何去筛选我们想要的页面,还知道了如何修改列表的参数。我们已经得到了一张页面的列表。
在“显示列表”这件事上,你的选择就非常自由了。在模块的主体 —— 就是位于 @@[[module]]@@ 和 @@[[/module]]@@ 之间的部分 —— 有许多可选择的内容标记。
每一个内容标记就像是一枚戳记。举例说明,**%%title%%** 代表着页面标题。想象一下:ListPages 模块有着一张标题的列表,它把第一个标题印在页面上,然后向下移动,拿出下一个标题印上。如此反复,直到印完整张列表。你最终就能得到一张页面标题的列表。
这里是一些最实用的内容标记。照例,完整的列表在[http://www.wikidot.com/doc-modules:listpages-module#toc6 这里],“Sections head/body/foot”标题下面。确实有//很多//,一定要去看一看。
* **%%title%%** -- 代表页面的标题。
* **%%title_linked%%** -- 代表页面的标题,显示为一个可供点击的链接。
* **%%created_by%%** -- 代表页面的作者。
* **%%created_at%%** -- 代表页面创建的日期。
* **%%rating%%** -- 代表页面的评分。
* **%%index%%** -- 代表页面在列表中的序号。
* **%%content%%** -- 代表页面完整的正文内容。我们以后会回过头来再聊这个。
说实在的,我在这里列举出了 7 个,而全部一共有 56 个 —— 有些则相当莫名其妙,你或许永远都用不上。
[[div class="yellow"]]
+++ 请注意
ListPages //无法//显示你的 SCP 实际的标题。比如说你想列出 SCP-173,ListPages 无法显示“雕像”。
这是因为 SCP 标题仅保存在 SCP 系列中心页上,而不是 SCP 自身。因此 ListPages 无法获取这种信息。它只能显示所选页面的基础信息,而不会在其他页面上查找额外的相关信息。
[[/div]]
-----
现在我们已经了解了很多参数了,让我们来做一个演示。
我要列出…
* 过去三个月创建的所有页面…
* **##red|{{created_at="last 3 month"}}##**
* …标题以字母“S”开头…
* **##green|{{name="S%"}}##**
* …评分小于 100…
* **##blue|{{rating="<100"}}##**
* …同时没有“scp”标签。
* **##a717de|{{tags="-scp"}}##**
* 我想显示不超过 40 个结果…
* **##red|{{limit="40"}}##**
* …每一页显示 10 个结果…
* **##green|{{perPage="10"}}##**
* …所有结果显示在一张列表中,而不是各自单独的列表…
* **##blue|{{separate="no"}}##**
* …最后以评分顺序排列,倒序。
* **##a717de|{{order="rating desc"}}##**
* 我想把这些页面放在一个有序列表当中…
* **[[[wiki-syntax#toc13|#]]]**
* …后面加上页面创建的日期…
* **##red|{{%%created_at%%}}##**
* …加上带链接的页面标题…
* **##green|{{%%title_linked%%}}##**
* …加上作者的名字…
* **##blue|{{by %%created_by%%}}##**
* …加上页面评分,放在括号里。
* **##a717de|{{(%%rating%%)}}##**
这样,我就写出了如下的 ListPages 模块:
[[div_ class="codeblock"]]
@@[[@@module ListPages ##red|created_at="last 3 month"## ##green|name="S%"## ##blue|rating="<100"## ##a717de|tags="-scp"##
@@ @@##red|limit="40"## ##green|perPage="10"## ##blue|separate="no"## ##a717de|order="rating desc"##@@]]@@
@@#@@ ##red|%%created_at%%## ##green|%%title_linked%%## by ##blue|%%created_by%%## (##a717de|%%rating%%##)
@@[[/module]]@@
[[/div]]
…得到了如下的列表:
[[module ListPages created_at="last 3 month" name="S%" rating="<100" tags="-scp" limit="40" perPage="10" separate="no" order="rating desc"]]
# %%created_at%% %%title_linked%% by %%created_by%% (%%rating%%)
[[/module]]
这是一个非常有用的列表吗?不是。但这是一个很好的例子。
酷。如果你在沙盒里跟着做了,恭喜你,你已经自己制作出了一个 ListPages 模块。如果你没有,也要恭喜你,只是少些。
**注意:**如果你打算在沙盒里制作 ListPages 模块,注意你只能看见沙盒里的页面,而不是 wiki 正式网站上的!这让我每一次都猝不及防。
趁热打铁:赶快去[[[most-recently-created|]]],点击底端的“选项”然后点击“页面源代码”,看看你能不能找到 ListPages 模块,再看看你能不能理解每一个字节的作用是什么。如果你发现了我没讲到的东西,不妨去看看那份完整的说明文件。
-----
也请注意,你的 ListPages 模块的内容部分不必限制为一行。只要你需要,它可以是任意多行。
如果你确实有超过一行内容,我建议你设置 **separate="yes"**,不然看起来可能会有点凌乱。
-----
我已经介绍完了 ListPages 的基础,是时候该聊聊它最广为人知的应用了。
@@ @@
-----
+ 3:制作 LISTPAGES 迭代
-----
@@ @@
这正是事情开始变得棘手之处。
[[[SCP-2998]]],之后是 [[[SCP-1893]]] 与 [[[SCP-1173]]],是 ListPages 迭代最为大名鼎鼎的作品,毫无疑问也要为这种流行负责。这三篇均由 [[*user Eskobar]] 所著,而他又是 [[*user Aelanna]] 教的,你得感谢他们。
自那以后,许许多多页面都开始用起了 ListPages 迭代。[[[SCP-2111]]]、[[[SCP-3002]]]、[[[SCP-3939]]]、[[[SCP-3449]]]、[[[cone|我的作者页]]]、[[[SCP-3020]]]、[[[jim-north-s-proposal|]]],以及更多。
//如果你的页面也用了 ListPages 迭代,留下一条评论好让每个人都知道!//
我觉得 3939 做的最好,或许我只是有些片面。
从现在开始我会把 ListPages 迭代简称为**迭代**。
-----
**请谨慎!**使用迭代带来了一个严重的副作用:你的读者会期待你运用这种方法的真正意义。迭代应该用于那些内容充实的作品,真正需要这种方式来表达自己的概念和/或不同寻常的格式。迭代不适合于 SCP-中规中矩普普通通。
@@ @@
-----
++ 3.1:什么是迭代?
-----
@@ @@
迭代是指一篇 SCP(或者任何页面)似乎拥有多个页面,同时保留着相同的评分模块从头到尾不变。当你点击了页面上的一个链接之后,你可以通过查看 URL 地址来辨别迭代 —— 如果地址以“offset/X”结尾(其中 X 代表一个数字),那就是迭代。大多数情况下(但并非全部!)迭代的应用可以通过这种方式来识别。
更广泛的说,是指 wiki 上的页面、通过刷新或者点击链接的方式来改变页面内容。
这条规则有一些例外 —— [[[SCP-2786]]] 和 [[[SCP-3211]]] 并非迭代,它们使用的是 @@[[html]]@@ 而不是 @@[[module ListPages]]@@。@@[[html]]@@ 的特征是、页面上的一部分内容会比其他内容多花上几秒钟加载,页面内容的改变会立即呈现出来。
迭代,与 @@[[html]]@@ 不同,只在页面刷新或者访问 /offset/ URL 地址时才能改变内容。
[[[SCP-3340]]] 又是另一种例外,它使用的是 @@[[html]]@@(并非 Listpages),同时它又通过刷新来表现动态变化。
**总而言之:**
迭代和 @@[[html]]@@ 都是让页面内容呈现出动态变化效果的技术。
迭代基于 ListPages。@@[[html]]@@ 基于 HTML、CSS、通常还有 JavaScript。
基于 @@[[html]]@@ 的动态变化可以即时呈现,而且几乎可以实现任何特效,但仅限于 @@[[html]]@@ 模块中已有的内容。
基于迭代的动态效果可以覆盖整个页面,但仅能通过用户访问 offset 页面或者刷新的方式实现。
迭代[[[listpages-magic-and-you|并不难学]]],@@[[html]]@@ 则[https://www.codecademy.com/learn/learn-html 非常复杂]。
[[div class="warning"]]
+++ 警告
根据 Wikidot 的说明文件,ListPages 模块和 @@[[html]]@@ 并不兼容!你在迭代的所有子页面中均无法使用 @@[[html]]@@ —— 就是没法用。都是 Wikidot 的错。
你可以选择其中任意一个,但是不能两个都要(一篇文章可以既包含迭代又包含 @@[[html]]@@,但要把它们分开放置)。选择最适合你的作品的那一个,或者最适合你的技能加点的。
[[collapsible show="+ 一些悄悄话"]]
最近一段时间,@@[[html]]@@ 和 ListPages 似乎可以放在一起正常运转了。这与说明文件上的不符,可能这个问题被修复了,也可能这就是一个 bug。
永远、永远先在沙盒里测试一下,永远假定文件是正确的。如果不确定,就不要用 @@[[html]]@@。
[[/collapsible]]
[[/div]]
@@ @@
-----
++ 3.2:迭代的原理
-----
@@ @@
迭代只不过是一种对标准的“列出页面”技术非常特殊的运用。
下面有一个并不特别的 ListPages 模块,请注意我们在这里所使用的参数。
[[div_ class="codeblock"]]
@@[[@@module ListPages category="fragment" parent="." order="created_at" limit="1" offset="@URL|0"@@]]@@
%%content%%
@@[[/module]]@@
[[/div]]
这里有几个新的术语,现在我来一一讲解。
* **category="fragment"** -- 筛选“fragment”类别的页面。“fragment”类别的页面并不会显示在“本月最高评分的页面”或者是“最近新增的页面”。这方便了我们去创建子页面,我们稍后再详细讲。不过,它们也并非真的无法被察觉。
* **parent="."** -- 父页面(parent)选择器匹配那些设置了特定父页面的对象。**parent="."** 则表示匹配那些父页面是当前页面的对象。设置父页面的步骤为:点击底端的“选项”,然后点击“父页面”,然后输入父页面的名称。
* **order="created_at"** -- 你应该知道这是干什么用的 —— 它会以创建的日期来排列页面。而像 SCP-1893 则以随机顺序排列。
* **limit="1"** -- 这限制了 ListPages 所选择的页面数量最多为 1,只有一个页面。
* **%%content%%** -- 这个占位符意味着,ListPages 会将所选页面的全部正文内容转存到当前页面中,包括 CSS 模块,而不仅仅只是页面标题或者是评分这样的一小段信息。
* **offset="@URL|0"** -- 这个有点难解释,所以我准备了一些示意图。
@@ @@
-----
++ 3.3:偏移值(OFFSET)参数
-----
@@ @@
所以说我们刚刚写了一篇 SCP,下面的绿色方框代表这个全新的 SCP 页面。
[[image https://scp-wiki.wikidot.com/local--files/listpages-magic-and-you/lp1.png]]
现在在上面放上一个 ListPages 模块,以一个大缺口表示(稍后会用 %%content%% 来填满)。
[[image https://scp-wiki.wikidot.com/local--files/listpages-magic-and-you/lp2.png]]
现在创建两个**子页面**。这些子页面将会填入**父页面**的缺口中。
我会详细说明子页面到底是什么、又如何去制作,但是现在,我用这些难看的三文鱼刺身来代表它们:
[[image https://scp-wiki.wikidot.com/local--files/listpages-magic-and-you/lp3.png]]
这两个子页面(三文鱼)的父页面就是我们的新 SCP(绿色)。
在父页面上,我们添加 ListPages 模块来选中并显示两个子页面的正文内容:
[[div_ class="codeblock"]]
@@[[@@module ListPages parent="."@@]]@@
%%content%%
@@[[/module]]@@
[[/div]]
结果便是:
[[image https://scp-wiki.wikidot.com/local--files/listpages-magic-and-you/lp5.png]]
现在有一个问题:父页面显示了//所有//子页面的内容。这是因为默认情况下,ListPages 会尽可能多地列出符合条件的页面。
因此,我们设置 **limit** 为 1,让 ListPages 仅显示一个页面:
[[div_ class="codeblock"]]
@@[[@@module ListPages parent="." limit="1"@@]]@@
%%content%%
@@[[/module]]@@
[[/div]]
结果是:
[[image https://scp-wiki.wikidot.com/local--files/listpages-magic-and-you/lp4.png]]
好了!现在我们有了一个仅显示一个子页面内容的 ListPages 模块,在读者阅读完毕后,另一个子页面已经就绪等待着显示//它自己的//内容。
那么我们又怎么显示第二个子页面呢?
我们已经知道,让父页面“更宽” —— 即让它显示全部两个页面 —— 没有用,读者仍然能够看到第一个子页面。
我们只需要将父页面向右移动。
[[image https://scp-wiki.wikidot.com/local--files/listpages-magic-and-you/lp6.png]]
[[div_ class="codeblock"]]
@@[[@@module ListPages parent="." limit="1" offset="1"@@]]@@
%%content%%
@@[[/module]]@@
[[/div]]
这时就轮到 **offset** 参数派上用场了。你可以把 **offset** 想象成从页面开始、到想要显示的子页面之间的距离。
[[image https://scp-wiki.wikidot.com/local--files/listpages-magic-and-you/lp7.png]]
[[image https://scp-wiki.wikidot.com/local--files/listpages-magic-and-you/lp8.png]]
[[image https://scp-wiki.wikidot.com/local--files/listpages-magic-and-you/lp9.png]]
[[image https://scp-wiki.wikidot.com/local--files/listpages-magic-and-you/lp10.png]]
**offset** 的默认值为“0”,意味着显示列表中的第一个子页面。你可以手动调整这个值,但为什么你要这样做呢?
**offset="@URL"** 表示 offset 并非是一个预设的值,而是根据 URL 地址而改变。如果你在页面地址结尾加上“/offset/X”,结果就是将 URL 上的值赋予 ListPages 模块中的 offset 参数。举例来说,http://scp-wiki-cn.wikidot.com/scp-2998/offset/1
这就允许读者访问下一页的 URL 地址来改变 offset 值。[[[SCP-2998]]] 在每一个子页面的底端添加了一个链接,而 [[[SCP-3939]]] 则添加了复数个链接。
**offset="@URL|0"** 表示允许根据 URL 地址改变 offset 值,但若 URL 地址未指定 —— 比如读者第一次点击这个页面的时候 —— 那么默认值便是 0。你可以任意修改 —— “@URL|21”也是一个有效的值 —— 但 0 通常更容易处理。这取决于你的子页面是如何排序的,而你又想第一个显示哪个页面。
[[[SCP-1893]]] 并没有给读者提供任何链接。取而代之的是通过设置 **order="random"** 来随机排序。offset 值仍然保持默认 —— 0 —— 这样每当顺序随机改变的时候,就会显示列表上的第一个页面(即一个随机的页面)。
* **关于 order="random" 的提示:**当使用 order="random" 时,页面的顺序**每过一分钟刷新一次**。好消息是,它会自己重新随机,不需要你做任何事情;而坏消息是,它不会每时每刻都在重新随机。不停地刷新页面对你没有任何帮助 —— 你仍然必须再等一分钟。
@@ @@
-----
++ 3.4:创建子页面[[footnote]]**译注:**在中文 wiki 站上,你需要为所有子页面加上“段落”标签[[/footnote]]
-----
@@ @@
如上所述,迭代需要一个父页面和数个子页面。
我的建议是最后再创建父页面,因为你得花上一段时间来创建所有的子页面,因此我先介绍如何创建子页面。理想情况下,你应该先在沙盒里创建并测试每个页面。这应该不那么重要,但稳妥总比出岔子好。
子页面是你保存迭代内容的地方。
我以 [[[SCP-3939]]] 作为范例。
ListPages 模块已经设置了 offset="@URL|0",因此主页应该是 [http://scp-wiki-cn.wikidot.com/scp-3939/offset/0 SCP-3939/offset/0]。
它所指向的子页面是 [[[fragment:scp-3939-0|fragment:SCP-3939-0]]]。查看子页面和父页面的源代码,找找它们之间的不同。
你应该注意到这三件事:
# 子页面包含了所有正文内容,而父页面没有;
# 子页面包含了供读者点击的不同的 offset 链接;
# 父页面包含了评分模块和所有 CSS 格式 —— 即所有页面共用的部分。
关于第 3 点,你当然可以把相同部分内容在每个子页面都放一遍,但如果放在父页面上,会给你省去不少麻烦。如果你需要修改,你只需要修改父页面上的内容,而不需要将每个子页面都修改一遍。
注意在 SCP-3939 中,插图是放在子页面而不是父页面上的,这是因为有一页是不需要插图的。如果插图被放在了父页面上,那么//所有//页面都会强制显示。
//如果你需要插图,只需要在某一页上传一次就行了!//
通常我们会把所有正文内容放在子页面里,但那并不是必须的!举个例子,[[[SCP-3306]]] 在页面末尾添加了一个 ListPages 模块,而那只改变了文章的结局。
-----
子页面的地址都是“fragment:某某某”。
**URL 以“fragment:”开头非常重要**
Fragment 页面并不会显示在“本月最高评分的页面”、“最近新增的页面”或者是“最近修改的页面”里(它们会显示在“最近的更新”里)。此外 jarvis 和 scpper 均不会将 fragment 页面评分计入你的总评分/平均评分里,它们不会造成任何影响。
“某某某”可以随便你填,不过我个人建议以你的 SCP 来命名,加上 offset 的数字。比如 SCP-XXXX,就应该是 fragment:SCP-XXXX-0、fragment:SCP-XXXX-1、fragment:SCP-XXXX-2、如此下去。
对每个子页面重复此操作。
**确保你的子页面按照正确的顺序依次创建!**在这篇指导里,我推荐依照页面创建的时间来排序,即 **order="created_at"**。你可以采用其他的排序方式,但如果你用的是日期/时间顺序,确保你依照正确的顺序创建子页面。
在你的子页面上添加 offset 链接,方便你的读者访问下一个 offset。
-----
下一步是设置子页面的父页面。点击每个子页面底端的“选项”,然后点击“父页面”,输入父页面的名称(是 URL 地址 —— 不是页面的标题!)。在你输入几个字母之后,你的父页面应该会自动出现。
如果你还未创建父页面,它不会显示在列表里。别担心 —— 先创建好父页面再来做这一步。
@@ @@
-----
++ 3.5:创建父页面
-----
@@ @@
我们已经有了子页面,现在需要父页面。父页面是一个绿色的透镜,通过它读者可以依次浏览三文鱼色的子页面。
你所要做的就是创建一个新的页面 —— 这次是一个普通的页面,不需要“fragment”分类 —— 然后啪的一声放上一个 ListPages 模块。
我推荐如下的 ListPages 模块:
[[div_ class="codeblock"]]
@@[[@@module ListPages category="fragment" parent="." order="created_at" limit="1" offset="@URL|0"@@]]@@
%%content%%
@@[[/module]]@@
[[/div]]
在章节 3.2:“迭代的原理”中有个相同的模块,对每一个术语都有解释。
唯一一个你可能想要修改的值是 **order**。我总是推荐你们依照你想要展示的顺序创建子页面,然后设置 order 为“created_at”。如果你根据我的建议命名页面,你当然也可以根据“name”或者“title”来排序。只要你愿意,你甚至可以跟随 [[[SCP-1893]]] 的脚步随机排序。
在沙盒里,父页面必须是“collab:”分类的,确保 URL 以“collab:”开头。
默认情况下,ListPages 会筛选那些与父页面分类一样的页面,如果你在沙盒里省略了“category”选择器,所有子页面也必须是“collab:”分类的。
-----
创建完之后,别忘记将子页面的父页面设为此页。
**在沙盒里**,你无法设置父页面,除非父页面的 URL 以“collab:”开头。如果你忘记了这一步,别担心 —— 点击页面底端的“选项”,然后点击“重新命名”,在页面名称的前面添加“collab:”。在 wiki 正式网站上则不需要这一步。
[[div class="yellow"]]
+++ 请停一下,Croquembouche!
“为什么你要用这些选择器呢?”你问我,“{{parent="."}} 和 {{order="created_at"}} 固然很棒,但为什么我不能用其他选择器呢?”
我的回答是:当然可以。你可以使用任何你想要的选择器来筛选你的子页面。
但事情是这样的:假设你创建了一大堆页面,从 {{fragment:SCP-XXXX-0}} 到 {{fragment:SCP-XXXX-10}}。你用 {{order="name"}} 来排序,然后使用 {{category="fragment"}} 和 {{name="SCP-XXXX-%"}} 选择器。这样行得通,很完美!
但如果有人想要在里面插入一些页面怎么办,如果有人在你不知情的情况下创建了一个 {{fragment:SCP-XXXX-0a}},它就会出现在列表的 0 和 1 之间,你的整个 offset 链都会被打断。
怀有恶意的人无法在 {{order="created_at"}} 的情况下插入页面,除非他们能够时空旅行。如果你加上 {{created_by="你的用户名"}} 会更加保险,除非你正在写一些合作的东西。
{{parent="."}} 也很好,因为它能自动在你的子页面上留下指向父页面的链接。这对于那些迷路的人来说会很有帮助。
[[/div]]
另外,如果你想做的更好,你可以在某处留下所有子页面的列表,对于未来的翻译者来说会非常方便,也方便那些好管闲事的人(比如我)来看看你的作品有没有问题。
当然了,发布你的迭代 SCP 之后,在这篇指导的下面留下一条评论!
@@ @@
-----
+ 4:总结
-----
@@ @@
好了,你已经出师了。你已经了解了关于“列出页面”和“制作 ListPages 迭代”的全部基础内容。
尽管如此,请谨慎行事:你现在掌握着强大而可怕的力量:ListPages 的力量。明智地使用它,负责任地使用它,最重要的是:谨慎地使用它。ListPages 格式如果做得很好,能让人惊叹不已;若是做得不好,ListPages 里的每一个页面都会白白牺牲。
在论坛上先征求意见和批评,但更重要的是,在你开始写作之前//打磨你的点子//。最糟糕的事情莫过于把这么多精力投入到一个并不值得的点子里。
-----
当然了,ListPages 并不只这里提及的 2 个或者 3 个非常具体的用途。
使用一系列随机排序的 ListPages 来制作一个模块化的页面,每一次阅读时都完全不同。配合使用 ListPages 和 @@[[tabview]]@@ 来为每一个 tab 分别添加脚注。
去做以前从来没有人做过的事情,这才是这股力量的最终奥义。
-----
如果你还遗留有任何问题,请务必在讨论区留言,我一定会来回答。
感谢您的收听。
Croquembouche,退场。
@@ @@
@@ @@
@@ @@
@@ @@
@@ @@
@@ @@
@@ @@
@@ @@
@@ @@
@@ @@
@@ @@
-----
+ 5:快速参考
-----
@@ @@
既然 Croque 已经解释了必要的技术,我,{{ROUNDERHOUSE}},以我的方式来帮助你们,亲爱的读者。像我这样的人,要么没耐心读完上面所有的内容,要么能够通过例子更好地学习。这里是一篇关于如何使用迭代的快速参考。**但是,如果你碰上了任何问题,你//就得//借助 Croque 在上面讲解的技巧来解决。我强烈建议你在参考这部分章节之前,至少先试着把上面的内容读一遍。**我会以 SCP-9000 作为示例,你需要把“SCP-9000”换成自己的编号。
@@ @@
-----
++ 5.1:创建段落(FRAGMENT)[[footnote]]**译注:**在中文 wiki 站上,你需要为所有子页面加上“段落”标签[[/footnote]]
-----
@@ @@
首先,确定你的迭代作品需要多少个页面。假设你想要三个,利用通用页面创建器创建三个新页面,全部都是 fragment 分类。**重要:以你想要显示的顺序依次创建你的页面。**这样一来,你的三个页面就是“fragment:scp-9000-1”、“fragment:scp-9000-2”和“fragment:scp-9000-3”。第一页填上第一迭代的内容,第二页填上第二迭代,如此下去。很显然,你并不是一定要像这样命名页面,但这样更简单而且很直观。**提醒:不要在这些页面上添加评分模块,**这是迭代的基本特征。
@@ @@
-----
++ 5.2:父页面
-----
@@ @@
下一步,创建父页面。既然我们写的是 SCP-9000,我们点击系列中心页上的空位,然后创建页面,填上:
[[code]]
[[>]]
[[module Rate]]
[[/>]]
[[module ListPages category="fragment" parent="." limit="1" order="created_at" offset="@URL|0"]]
%%content%%
[[/module]]
[!-- http://scp-wiki-cn.wikidot.com/fragment:scp-9000-1 --]
[!-- http://scp-wiki-cn.wikidot.com/fragment:scp-9000-2 --]
[!-- http://scp-wiki-cn.wikidot.com/fragment:scp-9000-3 --]
[[/code]]
位于@@[!-- --]@@之间的内容是注释,注释不会显示在页面上,也不会作为语法代码被解析。它们最主要的用途就是方便编辑、以及翻译者。
@@ @@
-----
++ 5.3:父与子
-----
@@ @@
现在,返回段落页,将它们的父页面设置为你的主页面。一张图片胜过千言万语。
[[=image parenting.png]]
----
[[=image parenting2.png]]
为每个段落页都重复一遍,从下面自动填充的菜单中选择“scp-9000”。
//来自 Croque 的提示:在沙盒里,父页面必须是 {{collab}} 分类的,否则你会在尝试设置父页面时出现错误。你可以通过如下方式更改分类:滚动至页面底端,点击“+ 选项”然后点击“重新命名”,接着在名称前面粘贴“collab:”。//
@@ @@
-----
++ 5.4:链接
-----
@@ @@
显然,你需要在页面上添加前往其他页面的按钮。你不能使用通常的超链接。既然文章最初显示的是“fragment:scp-9000-1”的内容,则需要前往“fragment:scp-9000-2”的链接。为此,我会在“fragment:scp-9000-1”的最下面添加类似这样的东西:
[[code]]
[[>]]
[http://scp-wiki-cn.wikidot.com/scp-9000/offset/1 下一迭代]
[[/>]]
[[/code]]
“offset/1”会指向一个显示“fragment:scp-9000-2”内容的页面。接着在“fragment:scp-9000-2”页面上添加类似的链接,额外加上一个后退的链接。
[[code]]
[[<]]
[http://scp-wiki-cn.wikidot.com/scp-9000 上一迭代]
[[/<]]
[[>]]
[http://scp-wiki-cn.wikidot.com/scp-9000/offset/2 下一迭代]
[[/>]]
[[/code]]
“fragment:scp-9000-3”也是如此
@@ @@
-----
++ 5.5:大功告成
-----
@@ @@
如果你正确地跟随说明去做了,应该就能成功。打开 scp-9000 页面,应该会显示 fragment:scp-9000-1 的内容,同时有一个指向 offset/2 的链接,这个链接能够显示 fragment:scp-9000-2 的内容,如此下去。它们应该共用相同的评分模块,那就是整个迭代的得分。如果你还有任何的问题或者疑惑,请随时私信我。
你的,[[*user Rounderhouse]]。👋