Listpages 魔法与你

源页面
2019年3月10日
修订 16
评分
57
↑ 55
↓ 0
支持率
100%
总票数 55
Wilson 95% 下界
93.5%
在相同票数下更稳健的支持率估计
争议指数
0.000

评分趋势

按周聚合
加载图表中...

最近修订

1 / 6
SOURCE_CHANGED
3 个月前
图片炸了,所以只能链接一下原文的了
修改标签
5 年前
已新增标签:合著。
SOURCE_CHANGED
5 年前

最近投票

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]]。👋