Modul:Citation/COinS
Dokumentation für das Modul Citation/COinS[Ansicht] [Bearbeiten] [Versionsgeschichte] [ ]
Dieses Modul wird auf vielen Seiten benutzt, und Änderungen werden projektweit sofort wahrgenommen. Bitte teste Änderungen vorher im /Sandkasten oder in deinem Benutzernamensraum. Die getestete Änderung sollte dann in einem einzigen Edit auf dieser Seite eingefügt werden. Bitte diskutiere Änderungen zuerst auf der Diskussionsseite bevor du sie implementierst. |
Dieses Modul ist getestet und für den projektweiten Gebrauch geeignet. Es kann in Vorlagen benutzt und auf Hilfeseiten erläutert werden. Entwicklungen an dem Modul sollten auf Citation/Test und die Anwendung auf der Spielwiese getestet werden, da wiederholte Trial-and-Error-Edits die Resourcen stark belasten können. |
Verwendung
Das Modul stellt Funktionen für die Bearbeitung von COinS-Daten, einem Literatur-Mikroformat, für das Modul:Citation zur Verfügung.
Versionsbezeichnung auf Wikidata: 2022-10-21
Funktionen
function cc.prepareForCOinS( args )
überprüft Parameter vor der Ausgabe in das COinS-span
-Tag.
- Vorgabe
args
Indizierte Tabelle mit den Literaturdaten.
function cc.makeCOinS( args, params )
liefert das COinS-span
-Tag mit den Literaturinformationen als Zeichenkette.
- Vorgabe
args
Indizierte Tabelle mit den Literaturdaten.params
Indizierte Tabelle mit den Parameterdefinitionen.
Verwendung in anderen Modulen
Dieses Modul ist notwendig für die Ausführung folgender Module. Bei Anpassungen sollte die Funktionstüchtigkeit der folgenden Module geprüft werden. Benutze dazu auch diese Tracking-Kategorie um Fehler zu finden, die sich dann auf Artikel auswirken:
- Citation
- Modul benötigt das Modul Citation/COinS – Wartungskategorie, in der nochmals alle Module gelistet sind, die von diesem Modul abhängig sind.
Literatur
- ANSI/NISO Z39.88-2004 (R2010) : The OpenURL Framework for Context-Sensitive Services. In: NISO.org, Donnerstag, 13. Mai 2010, PDF.
Hinweise
- Die obige Dokumentation wurde aus der Seite Modul:Citation/COinS/Doku eingefügt. (bearbeiten | Versionsgeschichte) Die Kategorien für dieses Modul sollten in der Dokumentation eingetragen werden. Die Interwiki-Links sollten auf Wikidata eingepflegt werden.
- Liste der Unterseiten
-- 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