[go: up one dir, main page]

Zum Inhalt springen

Modul:Citation/COinS

Aus Wikivoyage
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: 2022-10-21 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:

Literatur

  • ANSI/NISO Z39.88-2004 (R2010) : The OpenURL Framework for Context-Sensitive Services. In: NISO.org, Donnerstag, 13. Mai 2010, PDF.
Hinweise
-- 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