Module:图书排版:修订间差异
外观
删除的内容 添加的内容
以 heti 官方规则为底补齐版式类,并把版式改为模板参数开关({{图书排版|行间注}} 等) |
以 heti 官方规则为底补齐版式类,并把版式改为模板参数开关({{图书排版|行间注}} 等) |
||
| (未显示同一用户的6个中间版本) | |||
| 第4行: | 第4行: | ||
设计见 content/tushu/DESIGN.md。要点: |
设计见 content/tushu/DESIGN.md。要点: |
||
1) |
1) 收集全部位置参数,因此支持叠加:{{图书排版|诗词|双栏}} |
||
→ <div class="tushu-body heti--poetry heti--columns-2">。 |
|||
重复的类名会被去重(如 {{图书排版|诗词|双栏|诗词}} 不会产出重复类)。 |
|||
用 Lua 而非纯 wikitext,是因为 wikitext 没有循环——要支持叠加就得把下面那张 |
|||
映射表重复写 N 遍,模板体积会翻几倍,还凭空多了参数个数上限。 |
|||
2) 容器类一律沿用 heti 官方类名(.heti--*),不另造前缀。 |
2) 容器类一律沿用 heti 官方类名(.heti--*),不另造前缀。 |
||
分栏诗词用 |诗词|双栏 组合即可(其诗句左对齐由样式表按类集合匹配,与参数顺序无关)。 |
|||
3) **不传参数(或全为空串)时返回空串**,保证现有无参页面输出与改造前逐字节一致。 |
|||
3) **总是输出基础容器 tushu-body**(即使一个参数都没传)。两个原因: |
|||
4) 竖排除了 .heti--vertical 还要输出锚点与横/直排切换条(借 Wikisource SKQS 的 |
|||
a. 158 个页面已加上 {{图书排版/尾}},若模板不输出容器,那些 </div> 会变成 |
|||
:target 纯 CSS 技巧,零 JS),且必须排在正文容器之前。 |
|||
孤立的闭合标签而破坏页面结构; |
|||
b. .tushu-body 是样式表里的**作用域锚点**——`.tushu-body .poem p`、 |
|||
`.tushu-body .heti--poetry p` 等规则依赖它,让 <poem> 与 |诗词 的段落 |
|||
自动居中且不缩进。容器自身不设字号/颜色;限宽另由 |限宽 触发 |
|||
(见样式表里的 .heti--line-length)。 |
|||
4) 古籍 / 经文 / 黑体 / 竖排 / 诗栏 / 楷体 六项版式已于 2026-09 彻底移除: |
|||
模板不再有这些参数入口,样式表内的对应类(.heti--ancient / --classic / |
|||
--sans / --hei / --vertical / --kai)与字体栈也一并删除,页面手写这些 |
|||
class 亦不再生效。分栏诗词改用 |诗词|双栏 组合。详见 DESIGN.md §3。 |
|||
]] |
]] |
||
local p = {} |
local p = {} |
||
-- 参数 → 容器类(中文为主,英文为别名) |
-- 参数 → 容器类(中文为主,英文为别名)。值可以含多个类名,用空格分隔。 |
||
local CLASS = { |
local CLASS = { |
||
['行间注'] = 'heti--annotation', ['annotation'] = 'heti--annotation', |
|||
['古籍'] = 'heti--ancient', ['ancient'] = 'heti--ancient', |
|||
['诗词'] = 'heti--poetry', ['poetry'] = 'heti--poetry', |
['诗词'] = 'heti--poetry', ['poetry'] = 'heti--poetry', |
||
[' |
['限宽'] = 'heti--line-length', ['line-length'] = 'heti--line-length', |
||
['双栏'] = 'heti--columns-2', ['columns-2'] = 'heti--columns-2', |
['双栏'] = 'heti--columns-2', ['columns-2'] = 'heti--columns-2', |
||
['三栏'] = 'heti--columns-3', ['columns-3'] = 'heti--columns-3', |
|||
['四栏'] = 'heti--columns-4', ['columns-4'] = 'heti--columns-4', |
|||
} |
} |
||
-- 竖排需额外输出锚点与切换条 |
|||
local VERTICAL = { ['竖排'] = true, ['vertical'] = true } |
|||
function p.main(frame) |
function p.main(frame) |
||
local args = frame:getParent().args |
local args = frame:getParent().args |
||
local |
local seen, ordered = {}, {} |
||
for _, v in ipairs(args) do |
for _, v in ipairs(args) do |
||
local key = mw.text.trim(v) |
local key = mw.text.trim(v) |
||
local val = CLASS[key] |
|||
if val then |
|||
-- 展开为单个类名后按名去重,避免重复写法产出重复类 |
|||
vertical = true |
|||
for cls in val:gmatch('%S+') do |
|||
classes[#classes + 1] = 'heti--vertical' |
|||
if not seen[cls] then |
|||
seen[cls] = true |
|||
ordered[#ordered + 1] = cls |
|||
| ⚫ | |||
end |
end |
||
end |
end |
||
end |
end |
||
-- |
-- 基础容器始终在前 |
||
-- 原因:容器的字号**继承正文**(p 的 17px),所以样式表里 |
|||
-- .tushu-body { max-width: 42em } |
|||
-- 的 em 就是正文字号(714px),容器内的标题与段落因而同宽对齐。 |
|||
-- 反之若在 p / h1–h6 上各自写 max-width,em 会按各元素自身字号计算, |
|||
-- h1(32px) 的 42em 是 1344px,标题反而比正文宽一倍。 |
|||
-- 容器不加闭合标签时会由 HTML5 解析器自动闭合到内容区末尾(因此 153 个 |
|||
-- 既有页面无需补 {{图书排版/尾}});代价是页末的导航等也会一并被限宽。 |
|||
local cls = { 'tushu-body' } |
local cls = { 'tushu-body' } |
||
for _, c in ipairs( |
for _, c in ipairs(ordered) do |
||
cls[#cls + 1] = c |
cls[#cls + 1] = c |
||
end |
end |
||
return string.format('<div class="%s">', table.concat(cls, ' ')) |
|||
if vertical then |
|||
div = '<div id="tushu-shu"></div><div id="tushu-heng"></div>' |
|||
.. '<div class="noprint tushu-toolbar">[[#tushu-shu|直排]] · [[#tushu-heng|横排]]</div>' |
|||
.. div |
|||
| ⚫ | |||
return div |
|||
end |
end |
||
2026年9月21日 (一) 23:37的最新版本
--[[
Module:图书排版 —— 解析 {{图书排版}} 的位置参数,拼出版式容器。
设计见 content/tushu/DESIGN.md。要点:
1) 收集全部位置参数,因此支持叠加:{{图书排版|诗词|双栏}}
→ <div class="tushu-body heti--poetry heti--columns-2">。
重复的类名会被去重(如 {{图书排版|诗词|双栏|诗词}} 不会产出重复类)。
2) 容器类一律沿用 heti 官方类名(.heti--*),不另造前缀。
分栏诗词用 |诗词|双栏 组合即可(其诗句左对齐由样式表按类集合匹配,与参数顺序无关)。
3) **总是输出基础容器 tushu-body**(即使一个参数都没传)。两个原因:
a. 158 个页面已加上 {{图书排版/尾}},若模板不输出容器,那些 </div> 会变成
孤立的闭合标签而破坏页面结构;
b. .tushu-body 是样式表里的**作用域锚点**——`.tushu-body .poem p`、
`.tushu-body .heti--poetry p` 等规则依赖它,让 <poem> 与 |诗词 的段落
自动居中且不缩进。容器自身不设字号/颜色;限宽另由 |限宽 触发
(见样式表里的 .heti--line-length)。
4) 古籍 / 经文 / 黑体 / 竖排 / 诗栏 / 楷体 六项版式已于 2026-09 彻底移除:
模板不再有这些参数入口,样式表内的对应类(.heti--ancient / --classic /
--sans / --hei / --vertical / --kai)与字体栈也一并删除,页面手写这些
class 亦不再生效。分栏诗词改用 |诗词|双栏 组合。详见 DESIGN.md §3。
]]
local p = {}
-- 参数 → 容器类(中文为主,英文为别名)。值可以含多个类名,用空格分隔。
local CLASS = {
['诗词'] = 'heti--poetry', ['poetry'] = 'heti--poetry',
['限宽'] = 'heti--line-length', ['line-length'] = 'heti--line-length',
['双栏'] = 'heti--columns-2', ['columns-2'] = 'heti--columns-2',
}
function p.main(frame)
local args = frame:getParent().args
local seen, ordered = {}, {}
for _, v in ipairs(args) do
local key = mw.text.trim(v)
local val = CLASS[key]
if val then
-- 展开为单个类名后按名去重,避免重复写法产出重复类
for cls in val:gmatch('%S+') do
if not seen[cls] then
seen[cls] = true
ordered[#ordered + 1] = cls
end
end
end
end
-- 基础容器始终在前
local cls = { 'tushu-body' }
for _, c in ipairs(ordered) do
cls[#cls + 1] = c
end
return string.format('<div class="%s">', table.concat(cls, ' '))
end
return p