Modul:Citation/COinS: Unterschied zwischen den Versionen
(moduleInterface) |
K (43 Versionen von wikivoyage:Modul:Citation/COinS importiert) |
||
| (23 dazwischenliegende Versionen von einem anderen Benutzer werden nicht angezeigt) | |||
| Zeile 3: | Zeile 3: | ||
suite = 'Citation', | suite = 'Citation', | ||
sub = 'COinS', | sub = 'COinS', | ||
serial = ' | serial = '2022-10-21' | ||
} | } | ||
| Zeile 12: | Zeile 12: | ||
-- module import | -- module import | ||
require( ' | -- require( 'strict' ) | ||
local ci = require( 'Module:Citation/i18n' ) | local ci = require( 'Module:Citation/i18n' ) | ||
local cu = require( 'Module:Citation/utilities' ) | local cu = require( 'Module:Citation/utilities' ) | ||
| Zeile 22: | Zeile 22: | ||
end | end | ||
s = s:match( '%d+%s*%-%s*%d+' ) or s:match( '%d+' ) or | s = s:match( '%a*%d+%s*%-%s*%a*%d+' ) or s:match( '%a*%d+' ) or | ||
-- Roman numerals | -- Roman numerals | ||
s:match( '[Cc]*[LlXxVvIi]+%s*%-%s*[Cc]*[LlXxVvIi]+' ) or | s:match( '[Cc]*[LlXxVvIi]+%s*%-%s*[Cc]*[LlXxVvIi]+' ) or | ||
| Zeile 55: | Zeile 55: | ||
args.pages = args.columns | args.pages = args.columns | ||
end | end | ||
args.extent = args.extent:match( '%d+' ) | |||
-- only first author | -- only first author | ||
args.author = cu.getFirst( args.author or '', ';' ) | args.author = cu.getFirst( args.author or '', ';' ) | ||
local count | local s, count | ||
s, count = args.author:gsub( ',', ',' ) | |||
if count > 1 then | if count > 1 then | ||
args.author = cu.getFirst( args.author, ',' ) | args.author = cu.getFirst( args.author, ',' ) | ||
| Zeile 86: | Zeile 87: | ||
-- handle titles | -- handle titles | ||
-- maps handled like books | -- maps handled like books | ||
if args.type == 'book' or args.type == 'map' or args.type == ' | if args.type == 'book' or args.type == 'map' or args.type == 'bookitem' then | ||
table.insert( rft, 'rft_val_fmt=' | table.insert( rft, 'rft_val_fmt=' | ||
.. mw.uri.encode( 'info:ofi/fmt:kev:mtx:book', 'PATH' ) ) | .. mw.uri.encode( 'info:ofi/fmt:kev:mtx:book', 'PATH' ) ) | ||
if args.type == 'bookitem' then | |||
if args.type == ' | |||
table.insert( rft, 'rft.genre=bookitem' ) | table.insert( rft, 'rft.genre=bookitem' ) | ||
insertCOinS( 'rft.atitle', args.title ) | insertCOinS( 'rft.atitle', args.title ) | ||
| Zeile 103: | Zeile 103: | ||
table.insert( rft, 'rft_val_fmt=' | table.insert( rft, 'rft_val_fmt=' | ||
.. mw.uri.encode( 'info:ofi/fmt:kev:mtx:journal', 'PATH' ) ) | .. mw.uri.encode( 'info:ofi/fmt:kev:mtx:journal', 'PATH' ) ) | ||
table.insert( rft, 'rft.genre= | table.insert( rft, 'rft.genre=article' ) | ||
insertCOinS( 'rft.atitle', args.title ) | insertCOinS( 'rft.atitle', args.title ) | ||
insertCOinS( 'rft.jtitle', args.type == 'journal' and args.journal or args.newspaper ) | |||
-- handle web | -- handle web | ||
| Zeile 127: | Zeile 114: | ||
.. mw.uri.encode( 'info:ofi/fmt:kev:mtx:dc', 'PATH' ) ) | .. mw.uri.encode( 'info:ofi/fmt:kev:mtx:dc', 'PATH' ) ) | ||
insertCOinS( 'rft.type', 'webpage' ) | insertCOinS( 'rft.type', 'webpage' ) | ||
insertCOinS( 'rft.title', args.title ) | insertCOinS( 'rft.title', args.title ) | ||
insertCOinS( 'rft.source', args.website ) | insertCOinS( 'rft.source', args.website ) | ||
| Zeile 136: | Zeile 122: | ||
if #rft > 2 then | if #rft > 2 then | ||
local prefix | |||
local rftUrl = ( cu.isSet( args.url ) and not args.url:find( 'doi.org/', 1, true ) ) | |||
and args.url or '' | |||
for key, value in pairs( ci.params ) do | for key, value in pairs( ci.params ) do | ||
if cu.isSet( args[ key ] ) then | if cu.isSet( args[ key ] ) and value.COinS then | ||
if value.COinS | if key == 'date' and args.dateFormat == 'R' then | ||
insertCOinS( value.COinS, args[ key ] ) | insertCOinS( value.COinS, string.sub( args[ key ], 1, 4 ) ) | ||
elseif value.COinS ~= 'rft.jtitle' and value.COinS ~= 'rft.title' then | |||
prefix = value.COinS:sub( 1, 3 ) | |||
if prefix == 'rft' then | |||
insertCOinS( value.COinS, args[ key ] ) | |||
elseif prefix == 'inf' then | |||
table.insert( rft, 'rft_id=' .. | |||
mw.uri.encode( value.COinS .. '/' .. args[ key ], 'PATH' ) ) | |||
elseif prefix == 'url' and rftUrl == '' then | |||
rftUrl = value.url:format( args[ key ] ) | |||
elseif prefix == 'jst' then | |||
if not cu.isSet( args.doi ) then | |||
table.insert( rft, 'rft_id=' .. | |||
mw.uri.encode( 'info:doi/' .. value.doi:format( args[ key ] ), 'PATH' ) ) | |||
end | |||
if rftUrl == '' then | |||
rftUrl = value.url:format( args[ key ] ) | |||
end | |||
end | |||
end | end | ||
end | end | ||
end | |||
if rftUrl ~= '' then | |||
if rftUrl:match( '^//' ) then | |||
rftUrl = 'https:' .. rftUrl | |||
end | |||
table.insert( rft, 'rft_id=' .. mw.uri.encode( rftUrl, 'PATH' ) ) | |||
end | end | ||
| Zeile 153: | Zeile 163: | ||
:addClass( 'Z3988' ) | :addClass( 'Z3988' ) | ||
:attr( 'title', table.concat( rft, '&' ) ) | :attr( 'title', table.concat( rft, '&' ) ) | ||
) | ) | ||
end | end | ||
Aktuelle Version vom 11. Februar 2023, 20:58 Uhr
Die Dokumentation für dieses Modul kann unter Modul:Citation/COinS/doc erstellt werden
-- documentation
local citationCOinS = {
suite = 'Citation',
sub = 'COinS',
serial = '2022-10-21'
}
-- module variable and administration
local cc = {
moduleInterface = citationCOinS
}
-- module import
-- require( 'strict' )
local ci = require( 'Module:Citation/i18n' )
local cu = require( 'Module:Citation/utilities' )
function cc.prepareForCOinS( args )
local function pagesMatch( s )
if not cu.isSet( s ) then
return ''
end
s = s:match( '%a*%d+%s*%-%s*%a*%d+' ) or s:match( '%a*%d+' ) or
-- Roman numerals
s:match( '[Cc]*[LlXxVvIi]+%s*%-%s*[Cc]*[LlXxVvIi]+' ) or
s:match( '[Cc]*[LlXxVvIi]+' ) or ''
s = s:gsub( ' ', '' )
if s ~= '' and not s:match( '%d+' ) then -- Roman numerals
local tab = mw.text.split( s, '-', true )
for key, value in ipairs( tab ) do
if value == '' or
not value:match( '^[Cc]*[Xx]?[Ll]?[Xx]*[Ii]?[Vv]?[Ii]*$' ) then
s = ''
break
end
end
end
if s == '' then
cu.addErrorMsg( ci.texts.wrongPages )
end
return s
end
for key, value in pairs( args ) do
if ci.params[ key ] then
args[ key ] = cu.coinsCleanup( args[ key ] )
end
end
args.pages = pagesMatch( args.pages )
args.columns = pagesMatch( args.columns )
if cu.isSet( args.columns ) and not cu.isSet( args.pages ) then
args.pages = args.columns
end
args.extent = args.extent:match( '%d+' )
-- only first author
args.author = cu.getFirst( args.author or '', ';' )
local s, count
s, count = args.author:gsub( ',', ',' )
if count > 1 then
args.author = cu.getFirst( args.author, ',' )
end
for key, value in ipairs( { 'author', 'editor' } ) do
args[ value ] = mw.ustring.gsub( args[ value ], '[%[%]!#$%%%*%+%?]', '' )
end
args.isbn = cu.getFirst( args.isbn or '', ',' )
args.isbn = args.isbn:match( '[%d%-Xx]+' )
end
function cc.makeCOinS( args )
local rft = {}
local function insertCOinS( key, value )
if cu.isSet( value ) then
table.insert( rft, key .. '=' .. mw.uri.encode( '' .. value, 'PATH' ) )
end
end
-- make COinS (ContextObjects in Spans, OpenURL) format
-- https://groups.niso.org/apps/group_public/download.php/14833/z39_88_2004_r2010.pdf
-- https://www.oclc.org/developer/develop/web-services/worldcat-knowledge-base-api/openurl-resource.en.html
-- handle titles
-- maps handled like books
if args.type == 'book' or args.type == 'map' or args.type == 'bookitem' then
table.insert( rft, 'rft_val_fmt='
.. mw.uri.encode( 'info:ofi/fmt:kev:mtx:book', 'PATH' ) )
if args.type == 'bookitem' then
table.insert( rft, 'rft.genre=bookitem' )
insertCOinS( 'rft.atitle', args.title )
insertCOinS( 'rft.btitle', args.collection )
else
table.insert( rft, 'rft.genre=book' )
insertCOinS( 'rft.btitle', args.title )
end
-- newspaper is now handled like a journal to improve data import
elseif args.type == 'journal' or args.type == 'newspaper' then
table.insert( rft, 'rft_val_fmt='
.. mw.uri.encode( 'info:ofi/fmt:kev:mtx:journal', 'PATH' ) )
table.insert( rft, 'rft.genre=article' )
insertCOinS( 'rft.atitle', args.title )
insertCOinS( 'rft.jtitle', args.type == 'journal' and args.journal or args.newspaper )
-- handle web
-- DCMI: Dublin Core™ Metadata
-- https://www.dublincore.org/specifications/dublin-core/dces/
else
table.insert( rft, 'rft_val_fmt='
.. mw.uri.encode( 'info:ofi/fmt:kev:mtx:dc', 'PATH' ) )
insertCOinS( 'rft.type', 'webpage' )
insertCOinS( 'rft.title', args.title )
insertCOinS( 'rft.source', args.website )
insertCOinS( 'rft.identifier', args.url )
insertCOinS( 'rft.description', args.comment )
insertCOinS( 'rft.format', args.format )
end
if #rft > 2 then
local prefix
local rftUrl = ( cu.isSet( args.url ) and not args.url:find( 'doi.org/', 1, true ) )
and args.url or ''
for key, value in pairs( ci.params ) do
if cu.isSet( args[ key ] ) and value.COinS then
if key == 'date' and args.dateFormat == 'R' then
insertCOinS( value.COinS, string.sub( args[ key ], 1, 4 ) )
elseif value.COinS ~= 'rft.jtitle' and value.COinS ~= 'rft.title' then
prefix = value.COinS:sub( 1, 3 )
if prefix == 'rft' then
insertCOinS( value.COinS, args[ key ] )
elseif prefix == 'inf' then
table.insert( rft, 'rft_id=' ..
mw.uri.encode( value.COinS .. '/' .. args[ key ], 'PATH' ) )
elseif prefix == 'url' and rftUrl == '' then
rftUrl = value.url:format( args[ key ] )
elseif prefix == 'jst' then
if not cu.isSet( args.doi ) then
table.insert( rft, 'rft_id=' ..
mw.uri.encode( 'info:doi/' .. value.doi:format( args[ key ] ), 'PATH' ) )
end
if rftUrl == '' then
rftUrl = value.url:format( args[ key ] )
end
end
end
end
end
if rftUrl ~= '' then
if rftUrl:match( '^//' ) then
rftUrl = 'https:' .. rftUrl
end
table.insert( rft, 'rft_id=' .. mw.uri.encode( rftUrl, 'PATH' ) )
end
table.insert( rft, 1, 'rfr_id='
.. mw.uri.encode( 'info/sid:/' .. ci.project.name, 'PATH' ) )
table.insert( rft, 1, 'ctx_ver=Z39.88-2004' )
return tostring( mw.html.create( 'span' )
:addClass( 'Z3988' )
:attr( 'title', table.concat( rft, '&' ) )
)
end
return ''
end
return cc