Module:作者
外观
此模块已於10,000+個頁面中應用,對其進行的修改會影響到這些頁面。請先在本模块的沙盒或测试样例子頁面或您的用戶子頁面中測試所要進行的修改,並請考慮在應用修改前,於討論頁上進行討論。 |
使用Lua語言編寫: |
本模塊使用维基数据資源:
|
本模板用于作者页面。
用法
[编辑]一般用法:
{{作者 |name = <!-- 姓名 --> |firstletter = <!-- 拼音首字母 --> |birthyear = <!-- 出生年份 --> |deathyear = <!-- 去世年份 --> |notes = <!-- 描述 --> }}
其他可选参数:
|times=
朝代(生卒年未知时填写,“X朝”即可)|image=
图像|image_caption=
图像说明|country=
国籍(非中国时填写)|portal=
相关导览|related_author=
相关作者
name
未填写时将显示为页面名称。firstletter
、birthyear
、deathyear
、image
以及各姊妹项目链接可自动从维基数据获取。
该模板曾经使用wikitext创建,后来因代码过于复杂,于2018年12月21日改为Lua语言模块,原来的模板存档,见Template:作者/存档。
模板数据
[编辑]本模板用于[[Help:作者页面|作者页面]]。
参数 | 描述 | 类型 | 状态 | |
---|---|---|---|---|
姓名 | name Name | 若未添加,会将页面名作为作者姓名。 | 字符串 | 推荐 |
拼音首字母 | firstletter FirstLetterLastName | 若未添加,从维基数据的姓氏英文标签的首字母获取此项。 | 字符串 | 可选 |
出生年份 | birthyear | 若未添加,从维基数据获取此项。 | 数字 | 可选 |
去世年份 | deathyear | 若未添加,从维基数据获取此项。模块会假设最近100年内出生的人物仍然在世,也可以用deathyear=-明确声明在世人物。 | 数字 | 可选 |
朝代 | times | 无描述 | 字符串 | 可选 |
简要说明 | notes MiscBio | 无描述 | 未知 | 推荐 |
图像 | image | 作者的照片或画像。若未填写此项,默认从维基数据获得图像。 | 未知 | 可选 |
图像说明 | image_caption | 无描述 | 字符串 | 可选 |
国籍 | country | 无描述 | 未知 | 可选 |
性别 | sex | 无描述 | 未知 | 可选 |
相关导览 | portal | 无描述 | 未知 | 可选 |
相关作者 | related_author | 无描述 | 未知 | 可选 |
维基百科页面名 | wikipedia | 若未添加,从维基数据获取此项。 | 字符串 | 可选 |
维基大典页面名 | zh-classical-wikipedia | 若未添加,从维基数据获取此项。 | 字符串 | 弃用 |
维基语录页面名 | wikiquote | 若未添加,从维基数据获取此项。 | 字符串 | 弃用 |
维基共享资源分类名 | commons commonscat | 若未添加,从维基数据获取此项。 | 字符串 | 弃用 |
wikinews | wikinews | 无描述 | 未知 | 可选 |
wiktionary | wiktionary | 无描述 | 未知 | 可选 |
wikibooks | wikibooks | 无描述 | 未知 | 可选 |
wikiversity | wikiversity | 无描述 | 未知 | 可选 |
wikispecies | wikispecies | 无描述 | 未知 | 可选 |
wikivoyage | wikivoyage | 无描述 | 未知 | 可选 |
wikilivres | wikilivres | 无描述 | 未知 | 可选 |
meta | meta | 无描述 | 未知 | 可选 |
上述文档嵌入自Module:作者/doc。 (编辑 | 历史) 编者可以在本模块的沙盒 (创建 | 镜像)和测试样例 (创建)页面进行实验。 本模块的子页面。 |
local p = {};
local timesTable = {
['夏'] = '夏朝',
['夏代'] = '夏朝',
['商'] = '商朝',
['商代'] = '商朝',
['周'] = '周朝',
['周代'] = '周朝',
['秦'] = '秦朝',
['秦代'] = '秦朝',
['漢'] = '漢朝',
['汉'] = '漢朝',
['漢代'] = '漢朝',
['汉代'] = '漢朝',
['晉'] = '晉朝',
['晋'] = '晉朝',
['晉代'] = '晉朝',
['晋代'] = '晉朝',
['南朝宋'] = '劉宋',
['隋'] = '隋朝',
['隋代'] = '隋朝',
['唐'] = '唐朝',
['唐代'] = '唐朝',
['宋'] = '宋朝',
['宋代'] = '宋朝',
['遼'] = '遼朝',
['遼代'] = '遼朝',
['金'] = '金朝',
['金代'] = '金朝',
['元'] = '元朝',
['元代'] = '元朝',
['明'] = '明朝',
['明代'] = '明朝',
['清'] = '清朝',
['淸'] = '清朝',
['清代'] = '清朝',
['民國'] = '中華民國',
['民国'] = '中華民國',
['阮'] = '阮朝',
['阮代'] = '阮朝'
}
local ChinaCountry = {['cn']=1,['china']=1,['China']=1,['中国']=1,['中國']=1}
local function addCategoryIf(text, condition, category)
local text2 = text
if condition and category ~= '' then
text2 = text2 .. '[[Category:' .. category .. ']]'
end
return text2
end
local function getStatementYear(entityid, propertyid)
local statement = mw.wikibase.getBestStatements(entityid, propertyid)
if statement[1] ~= nil then
if statement[1]['mainsnak']['snaktype'] == 'value' then
if statement[1]['mainsnak']['datavalue']['value']['precision']>=9 then
return tonumber(mw.ustring.match(statement[1]['mainsnak']['datavalue']['value']['time'], "^[+-]?%d+"))
else
return nil
end
else
return nil
end
else
return nil
end
end
local function getStatementString(entityid, propertyid)
local statement = mw.wikibase.getBestStatements(entityid, propertyid)
if statement[1] ~= nil then
if statement[1]['mainsnak']['snaktype'] == 'value' then
return mw.wikibase.getLabel(statement[1]['mainsnak']['datavalue']['value']["id"])
else
return nil
end
else
return nil
end
end
local function getFirstLetter(entityid, propertyid)
local statement = mw.wikibase.getBestStatements(entityid, propertyid)
if statement[1] == nil then
return nil
end
if statement[1]['mainsnak']['snaktype'] ~= 'value' then
return nil
end
entityid = statement[1]['mainsnak']['datavalue']['value']["id"]
-- 汉语拼音 (P1721)
local statementP1721 = mw.wikibase.getBestStatements(entityid, 'P1721')
for k,v in pairs(statementP1721) do
if v ~= nil and v['mainsnak']['snaktype'] == 'value' then
return string.sub(v['mainsnak']['datavalue']['value'],0,1)
end
end
-- 转写 (P2440)
local statementP2440 = mw.wikibase.getBestStatements(entityid, 'P2440')
for k,v in pairs(statementP2440) do
if v ~= nil and v['mainsnak']['snaktype'] == 'value' then
if v['qualifiers'] ~= nil and v['qualifiers']['P459'] ~= nil then
-- 汉语拼音 (Q42222)
if v['qualifiers']['P459'][1]['snaktype']=='value' and v['qualifiers']['P459'][1]['datavalue']['value']["id"] == 'Q42222' then
return string.sub(v['mainsnak']['datavalue']['value'],0,1)
end
end
end
end
local label = mw.wikibase.getLabelByLang(statement[1]['mainsnak']['datavalue']['value']["id"], 'en')
if label ~= nil then
return string.sub(label,0,1)
end
label = mw.wikibase.getLabelByLang(statement[1]['mainsnak']['datavalue']['value']["id"], 'mul')
if label ~= nil then
return string.sub(label,0,1)
end
return nil
end
local function yearToString(year)
if year == nil then
return '?'
elseif year > 0 then
return tostring(year) .. '年'
elseif year < 0 then
return '前' .. tostring(-year) .. '年'
else
return '?'
end
end
function p.main(frame)
local text = ''
local entityid = nil
if mw.wikibase ~= nil then
entityid = mw.wikibase.getEntityIdForCurrentPage()
end
local name = frame.args['name']
if name==nil or name=='' then
name=frame.args['Name']
end
if name==nil or name=='' then
name = mw.title.getCurrentTitle().text
end
local firstletter = frame.args['firstletter']
if firstletter==nil or firstletter=='' then
firstletter=frame.args['FirstLetterLastName']
end
local surname = frame.args['surname']
if entityid ~= nil then
surname = getStatementString(entityid, 'P734')
if firstletter == nil or firstletter=='' then
firstletter = getFirstLetter(entityid, 'P734')
end
end
-- if firstletter==nil or firstletter=='' then
-- text = text .. frame:expandTemplate{title='Template error', args={'未指定作者名称拼音首字母'}}
-- end
local times = frame.args['times']
local birthyear = frame.args['birthyear']
if (birthyear == nil or birthyear == '') and entityid ~= nil then
birthyear = getStatementYear(entityid, 'P569')
end
local deathyear = frame.args['deathyear']
if (deathyear == nil or deathyear == '') and entityid ~= nil then
deathyear = getStatementYear(entityid, 'P570')
end
local dates = frame.args['Dates']
local country = frame.args['country']
if country==nil or country=='' then
country = 'China'
end
local sex = frame.args['sex']
local notes = frame.args['notes']
if notes==nil or notes=='' then
notes = frame.args['MiscBio']
if notes==nil or notes=='' then
note, lang = mw.wikibase.getDescriptionWithLang(entityid)
if mw.ustring.sub(lang or '',1,2)=='zh' then
notes = note .. "{{Plain sister}}"
else
notes = "{{Plain sister}}"
end
end
end
local image = frame.args['image']
if (image == nil or image == '') then
image = frame.args['Image']
end
if (image == nil or image == '') and (entityid ~= nil) then
local imageStatement = mw.wikibase.getBestStatements(entityid, 'P18')
if imageStatement[1] ~= nil then
image = imageStatement[1]['mainsnak']['datavalue']['value']
end
end
local image_caption = frame.args['image_caption']
if image_caption == nil or image_caption == '' then
image_caption = name
end
if firstletter ~= nil then
text = text .. '<div align="right" style="font-size:12px">[[Portal:作者/' .. firstletter .. '|作者-' .. firstletter .. ']]</div>'
end
text = text .. '<div style="width:100%; margin-bottom:1px; border:1px solid #D6C5C5; background:#FAF8F8;text-align:center" >';
text = text .. '<div style="font-weight:bold">' .. frame:preprocess(name) .. '</div>'
if (birthyear ~= nil and birthyear ~= '') or (deathyear ~= nil and deathyear ~= '') then
if birthyear ~= nil then
birthyear = tonumber(birthyear)
end
if deathyear ~= nil and deathyear ~= '-' then
deathyear = tonumber(deathyear)
end
text = text .. yearToString(birthyear)
text = text .. '—'
if deathyear ~= '-' and (deathyear ~= nil or birthyear == nil or birthyear<os.date("*t").year-100) then
text = text .. yearToString(deathyear)
end
elseif dates ~= nil and dates ~= '' then
text = text .. frame:preprocess(dates)
end
if times ~= nil and times ~= '' then
text = text .. ' ' .. frame:preprocess(times)
end
text = text .. '</div>'
text = text .. '<div style="width:100%; margin-bottom:1px; font-size:small; border-bottom:1px solid #D6C5C5; background:#FEFFF0;" >'
if notes ~= nil then
text = text .. frame:preprocess(notes)
end
text = text .. frame:expandTemplate{title='works about author',args={}}
text = text .. '</div>'
if image ~= nil and image ~= '' then
text = text .. '[[File:' .. frame:preprocess(image) .. '|thumb|200px'
if image_caption ~= nil then
text = text .. '|' .. frame:expandTemplate{title='center',args={frame:preprocess(image_caption)}}
end
text = text .. ']]'
end
if name ~= nil and firstletter ~= nil then
text = addCategoryIf(text, name ~= nil and firstletter ~= nil, frame:preprocess(name) .. '|*')
end
if country ~= nil and country ~= '' then
text = addCategoryIf(text, ChinaCountry[country] == nil, frame:preprocess(country) .. '作者')
end
if firstletter ~= nil and firstletter ~= '' then
text = addCategoryIf(text, firstletter ~= nil and name ~= nil, '作者-' .. firstletter .. '|' .. frame:preprocess(name))
end
if sex ~= nil and sex ~= '' then
text = addCategoryIf(text, true, frame:preprocess(sex) .. '作者')
end
if birthyear ~= nil and birthyear ~='' then
text = addCategoryIf(text, birthyear >= 0, tostring(birthyear) .. '年出生')
text = addCategoryIf(text, birthyear < 0, '前' .. tostring(-birthyear) .. '年出生')
end
if deathyear ~= nil and deathyear ~='' and deathyear ~='-' then
text = addCategoryIf(text, deathyear >= 0, tostring(deathyear) .. '年逝世')
text = addCategoryIf(text, deathyear < 0, '前' .. tostring(-deathyear) .. '年逝世')
end
if times ~= nil and times ~= '' then
times = frame:preprocess(times)
if timesTable[times] ~= nil then
text = addCategoryIf(text, true, timesTable[times] .. '作者')
else
text = addCategoryIf(text, true, frame:preprocess(times) .. '作者')
end
end
if surname ~= nil and surname ~= '' then
text = addCategoryIf(text, true, surname .. '姓作者')
end
return text
end
return p;