Modul:Citation/COinS

Aus Wikivoyage
Template-info.png Dokumentation für das Modul Citation/COinS[Ansicht] [Bearbeiten] [Versionsgeschichte] [Aktualisieren]

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: 2021-08-16 Ok!

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:

Hinweise
-- documentation
local citationCOinS = {
	suite  = 'Citation',
	sub    = 'COinS', 
	serial = '2021-08-16'
}

-- module variable and administration
local cc = {
	moduleInterface = citationCOinS
}

-- module import
require( 'Module:No globals' )
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( '%d+%s*%-%s*%d+' ) or s:match( '%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

	-- only first author
	args.author = cu.getFirst( args.author or '', ';' )
	local count
	_,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' ) )
		insertCOinS( 'rft.title', args.title )
		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=journal' )
		insertCOinS( 'rft.title', args.title )
		insertCOinS( 'rft.atitle', args.title )
		if args.type == 'journal' then
			insertCOinS( 'rft.jtitle', args.journal )
		else
			insertCOinS( 'rft.jtitle', args.newspaper )
		end

--	else -- 'newspaper'
--		table.insert( rft, 'rft_val_fmt='
--			.. mw.uri.encode( 'info:ofi/fmt:kev:mtx:dc', 'PATH' ) )
--		insertCOinS( 'rft.type', 'newspaperArticle' )
--		insertCOinS( 'rft.title', args.title )
--		insertCOinS( 'rft.atitle', args.title )
--		insertCOinS( 'rft.source', 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.creator', args.author )
		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
		for key, value in pairs( ci.params ) do
			if cu.isSet( args[ key ] ) then
				if value.COinS and key == 'date' and args.dateFormat == 'R' then
					insertCOinS( value.COinS, string.sub( args[ key ], 1, 4 ) )
				elseif value.COinS and value.COinS ~= 'rft.jtitle' and value.COinS ~= 'rft.title' then
					insertCOinS( value.COinS, args[ key ] )
				elseif value.COinS_id then
					table.insert( rft, 'rft_id=' ..
						mw.uri.encode( value.COinS_id .. '/' .. args[ key ], 'PATH' ) )
				end
			end
		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, '&' ) )
			:css( 'display', 'none' )
		)
	end
	return ''
end

return cc