模块:Lyrics:修订间差异
跳转到导航
跳转到搜索
zhmoe>D41D8CD98F 小 移動端原文譯文各佔一行…… |
小 已保护“模块:Lyrics”([编辑=仅允许管理员](无限期)[移动=仅允许管理员](无限期)) |
||
(未显示13个用户的51个中间版本) | |||
第4行: | 第4行: | ||
local lang = require('Module:Lang') | local lang = require('Module:Lang') | ||
function p._lyrics(args) | function p._lyrics(args, hookTrigger, customArgs) | ||
local orig = mw. | local original = args.original or '' | ||
local tran = mw. | local translated = args.translated or '' | ||
if hookTrigger then | |||
original, translated = hookTrigger('preSplit', original, translated, customArgs) | |||
end | |||
--mw.text.split的效率太低啦,我愿称之为shit | |||
local orig = {} | |||
local iter = mw.ustring.gmatch(original..'\n', '([^\n]*)\n') | |||
for val in iter do | |||
table.insert(orig, val) | |||
end | |||
local tran = {} | |||
local iter = mw.ustring.gmatch(translated..'\n', '([^\n]*)\n') | |||
for val in iter do | |||
table.insert(tran, val) | |||
end | |||
local llang = args.llang or 'ja' | local llang = args.llang or 'ja' | ||
local rlang = args.rlang or 'zh' | local rlang = args.rlang or 'zh' | ||
local lstyle = ' | local lstyle = args.lstyle or '' | ||
local rstyle = args.rstyle or '' | |||
local html = mw.html.create('div') | |||
:addClass('Lyrics') | |||
:css('width', args.width) | |||
:cssText(args.containerstyle or '') | |||
if ((args['hasRuby'] or '') ~= '') or (not args.colorsMode and (args.original or ''):find('<ruby')) then | |||
html:addClass('Lyrics-has-ruby') | |||
else | |||
html:addClass('Lyrics-no-ruby') | |||
end | |||
if | local hastran = true | ||
if #tran == 1 and tran[1] == '' then | |||
hastran = false | |||
else | else | ||
html:addClass('Lyrics-has-translate') | |||
end | |||
if hookTrigger then | |||
hookTrigger('preParse', orig, hastran and tran or false, customArgs) | |||
end | end | ||
local | local lines = {} | ||
local len = math.max(#orig, #tran) | |||
for i=1, len do | |||
local line = mw.html.create('div'):addClass('Lyrics-line') | |||
:tag('div') | |||
:addClass('Lyrics-original') | |||
:cssText(lstyle) | |||
:node(lang.wrap(orig[i] or '', llang)) | |||
:done() | |||
if hastran then | |||
line:tag('div') | |||
:addClass('Lyrics-translated') | |||
:cssText(rstyle) | |||
:node(lang.wrap(tran[i] or '', rlang)) | |||
:done() | |||
end | |||
table.insert(lines, tostring(line)) | |||
end | |||
if hookTrigger then | |||
hookTrigger('postParse', lines, customArgs) | |||
end | end | ||
html:node(table.concat(lines)) | |||
-- Clear the floating | -- Clear the floating | ||
html:tag('div'):cssText('clear:both') | html:tag('div'):cssText('clear:both') | ||
html = tostring(html) | |||
if hookTrigger then | |||
html = hookTrigger('preOutput', html, customArgs) | |||
end | |||
local copyright = '' | |||
local frame = mw.getCurrentFrame() | |||
local LDC = frame:callParserFunction{ name = '#var', args = { 'LDC', '0' } } | |||
if LDC ~= '1' and args.override ~= '1' then | |||
copyright = '<small>本段落中所使用的歌词,其著作权属于' .. (args.author or '原著作权人') .. ',仅以介绍为目的引用。</small>' | |||
elseif LDC == '1' and args.override == '1' then | |||
copyright = frame:expandTemplate{ title = 'ac', args = { '不必要使用override参数的音乐条目' } } | |||
end | |||
local css = frame:extensionTag{ name = 'templatestyles', args = { src = 'Template:LyricsKai/styles.css' } } | |||
return | return copyright .. css .. html | ||
end | end | ||
2024年12月4日 (三) 11:27的最新版本
该模块提供了一种简便的创建大段带翻译歌词的方法。
该模板便会为您按照行一一对应的关系生成原文和译文的对照。在高分辨率情况下,这会是左右对齐的对照。在低分辨率,原文译文会各占一行。该模块对应的模板是{{LyricsKai}}。
若要在歌词中使用多种颜色来分辨不同的演唱者,请参考使用{{LyricsKai/colors}}。注意:不建议在只有单个演唱者的歌曲条目中使用该模板。
若歌词有多个翻译版本歌词,请参考使用{{LyricsKai/multi}}。
若需要全文添加罗马字,请参考使用{{LyricsKai/Roma}}。
若要实现当指针悬停于歌词上时改变歌词背景颜色,请参考使用{{LyricsKai/hover}}。
参数
该模板目前有以下参数
- original: 歌词原文。
- translated: 歌词译文。歌词原文和译文的行数需要匹配。
- llang: 原文语言标签。不指定时默认为日语(ja)。请参考Help:语言标签。
- rlang: 译文语言标签。不指定是默认为中文(zh)。格式同上。
- lstyle: 原文部分的样式。颜色等样式可以在这里指定。
- rstyle: 译文部分的样式。颜色等样式可以在这里指定。
- width:設計模板的寬度,默認為100%
- containerstyle:对整个容器应用的样式。背景颜色等同时作用于原文和译文部分的样式可以在这里指定。
此外,还有与著作权标记相关的两个参数:
- author: 词作者/歌曲版权所有者,如果在站内有条目的可以写成内链的形式。
- override: 当且仅当值为“1”时隐藏著作权标记,请只在该模板被用于非歌词场合或重复标记时使用。
使用方法
{{LyricsKai |lstyle=color:左边字体颜色; |rstyle=color:右边字体颜色; |original= 原文 |translated= 译文 }}
背景颜色示例
上面一个例子示范了更改字体颜色,这个例子用于更改整个歌词部分的背景色。
{{LyricsKai |containerstyle=background:背景颜色; |original= 原文 |translated= 译文 }}
例子
local p = {}
local getArgs = require('Module:Arguments').getArgs
local lang = require('Module:Lang')
function p._lyrics(args, hookTrigger, customArgs)
local original = args.original or ''
local translated = args.translated or ''
if hookTrigger then
original, translated = hookTrigger('preSplit', original, translated, customArgs)
end
--mw.text.split的效率太低啦,我愿称之为shit
local orig = {}
local iter = mw.ustring.gmatch(original..'\n', '([^\n]*)\n')
for val in iter do
table.insert(orig, val)
end
local tran = {}
local iter = mw.ustring.gmatch(translated..'\n', '([^\n]*)\n')
for val in iter do
table.insert(tran, val)
end
local llang = args.llang or 'ja'
local rlang = args.rlang or 'zh'
local lstyle = args.lstyle or ''
local rstyle = args.rstyle or ''
local html = mw.html.create('div')
:addClass('Lyrics')
:css('width', args.width)
:cssText(args.containerstyle or '')
if ((args['hasRuby'] or '') ~= '') or (not args.colorsMode and (args.original or ''):find('<ruby')) then
html:addClass('Lyrics-has-ruby')
else
html:addClass('Lyrics-no-ruby')
end
local hastran = true
if #tran == 1 and tran[1] == '' then
hastran = false
else
html:addClass('Lyrics-has-translate')
end
if hookTrigger then
hookTrigger('preParse', orig, hastran and tran or false, customArgs)
end
local lines = {}
local len = math.max(#orig, #tran)
for i=1, len do
local line = mw.html.create('div'):addClass('Lyrics-line')
:tag('div')
:addClass('Lyrics-original')
:cssText(lstyle)
:node(lang.wrap(orig[i] or '', llang))
:done()
if hastran then
line:tag('div')
:addClass('Lyrics-translated')
:cssText(rstyle)
:node(lang.wrap(tran[i] or '', rlang))
:done()
end
table.insert(lines, tostring(line))
end
if hookTrigger then
hookTrigger('postParse', lines, customArgs)
end
html:node(table.concat(lines))
-- Clear the floating
html:tag('div'):cssText('clear:both')
html = tostring(html)
if hookTrigger then
html = hookTrigger('preOutput', html, customArgs)
end
local copyright = ''
local frame = mw.getCurrentFrame()
local LDC = frame:callParserFunction{ name = '#var', args = { 'LDC', '0' } }
if LDC ~= '1' and args.override ~= '1' then
copyright = '<small>本段落中所使用的歌词,其著作权属于' .. (args.author or '原著作权人') .. ',仅以介绍为目的引用。</small>'
elseif LDC == '1' and args.override == '1' then
copyright = frame:expandTemplate{ title = 'ac', args = { '不必要使用override参数的音乐条目' } }
end
local css = frame:extensionTag{ name = 'templatestyles', args = { src = 'Template:LyricsKai/styles.css' } }
return copyright .. css .. html
end
function p.lyrics(frame)
local args = getArgs(frame, {wrappers='Template:LyricsKai'})
return p._lyrics(args)
end
return p