跳转到内容

Module:图书排版:修订间差异

勤求古训,博采众方
删除的内容 添加的内容
以 heti 官方规则为底补齐版式类,并把版式改为模板参数开关({{图书排版|行间注}} 等)
 
以 heti 官方规则为底补齐版式类,并把版式改为模板参数开关({{图书排版|行间注}} 等)
第21行: 第21行:
['古籍'] = 'heti--ancient', ['ancient'] = 'heti--ancient',
['古籍'] = 'heti--ancient', ['ancient'] = 'heti--ancient',
['诗词'] = 'heti--poetry', ['poetry'] = 'heti--poetry',
['诗词'] = 'heti--poetry', ['poetry'] = 'heti--poetry',
['经文'] = 'heti--classic', ['classic'] = 'heti--classic',
['楷体'] = 'heti--kai', ['kai'] = 'heti--kai',
['楷体'] = 'heti--kai', ['kai'] = 'heti--kai',
['黑体'] = 'heti--sans', ['sans'] = 'heti--sans',
['黑体'] = 'heti--sans', ['sans'] = 'heti--sans',

2026年9月19日 (六) 13:36的版本

--[[
Module:图书排版 —— 解析 {{图书排版}} 的位置参数,拼出版式容器。

设计见 content/tushu/DESIGN.md。要点:

  1) 取代原先的 {{#switch:{{{1|}}}}} 单参数结构,改为**收集全部位置参数**,
     因此支持叠加:{{图书排版|古籍|限宽}} → <div class="heti--ancient heti--line-length">。
     用 Lua 而非纯 wikitext,是因为 wikitext 没有循环——要支持叠加就得把下面那张
     映射表重复写 N 遍,模板体积会翻几倍,还凭空多了参数个数上限。
  2) 容器类一律沿用 heti 官方类名(.heti--*),不另造前缀。
  3) **不传参数(或全为空串)时返回空串**,保证现有无参页面输出与改造前逐字节一致。
  4) 竖排除了 .heti--vertical 还要输出锚点与横/直排切换条(借 Wikisource SKQS 的
     :target 纯 CSS 技巧,零 JS),且必须排在正文容器之前。
]]

local p = {}

-- 参数 → 容器类(中文为主,英文为别名)
local CLASS = {
	['行间注'] = 'heti--annotation', ['annotation'] = 'heti--annotation',
	['古籍'] = 'heti--ancient', ['ancient'] = 'heti--ancient',
	['诗词'] = 'heti--poetry', ['poetry'] = 'heti--poetry',
	['楷体'] = 'heti--kai', ['kai'] = 'heti--kai',
	['黑体'] = 'heti--sans', ['sans'] = 'heti--sans',
	['限宽'] = 'heti--line-length', ['line-length'] = 'heti--line-length',
	['双栏'] = '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)
	local args = frame:getParent().args
	local classes, vertical = {}, false

	for _, v in ipairs(args) do
		local key = mw.text.trim(v)
		if key ~= '' then
			if VERTICAL[key] then
				vertical = true
				classes[#classes + 1] = 'heti--vertical'
			elseif CLASS[key] then
				classes[#classes + 1] = CLASS[key]
			end
		end
	end

	-- 没有可识别的版式参数:不输出任何容器(与改造前的无参行为一致)
	if #classes == 0 then
		return ''
	end

	local div = string.format('<div class="%s">', table.concat(classes, ' '))
	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
	end
	return div
end

return p