Modul:Citation/utilities

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

Verwendung

Das Modul stellt gemeinsame Funktionen für das Modul:Citation zur Verfügung.

Versionsbezeichnung auf Wikidata: 2021-09-01 Ok!

Funktionen

function cu.isSet( param )

liefert true, wenn die Zeichenkette param einen nicht-leeren Wert enthält.

function cu.round( num, decimalPlaces )

liefert die auf decimalPlaces Stellen gerundete Zahl num zurück.

function cu.getNumber( s )

konvertiert eine Zeichenkette in eine Zahl unter Berücksichtigung des in Modul:Citation/i18n spezifizierten Dezimalzeichens ci.texts.decimalPoint. Wenn in der Zeichenkette [sic!] enthalten ist, wird 0 zurückgegeben. Damit wird verhindert, dass eine Zahlenangabe als zu groß und fehlerhaft gekennzeichnet wird.

function cu.addErrorMsg( msg )

fügt eine Fehlermeldung in die intern vorgehaltene Fehlertabelle errorMsgs ein.

function cu.getErrorMsgs()

liefert eine Zeichenkette mit allen in der Fehlertabelle errorMsgs enthaltenen Fehlermeldungen – jede aber nur einmal – zurück.

function cu.getFirst( s, delimiter )

liefert das erste Element einer mit dem Trenner delimiter unterteilten Zeichenkette zurück.

function cu.inArray( tab, val )

liefert true zurück, wenn das Element val in der Tabelle tab enthalten ist.

function cu.getKey( t, list )

liefert das key-Element aus der Tabelle list, die Parameternamen in Übersetzung enthält.

function cu.getArgValue( list, param, args )

liefert einen einzelne Wert aus der Parametertabelle args für den Parameter param zurück. Die Tabelle list wir für die Übersetzung der Parameternamen benötigt.

function cu.parameterCleanup( s )

liefert eine bereinigte Zeichenkette zurück, aus der Steuerzeichen, verschiedene Block-Tags (div, p, br) entfernt und XML- bzw. SGML-Zeichenreferenzen ausgetauscht wurden.

function cu.cleanupPageNumbers( pages )

liefert eine Zeichenkette zurück, in der verschiedene Striche durch den Bindestrich ersetzt wurden.

function cu.coinsCleanup( s )

liefert eine Zeichenkette, in der verschiedene Steuerzeichen, span-Tags, Wiki-Syntax (hauptsächlich Links) entfernt wurden.

function cu.finalCleanup( s )

liefert eine Zeichenkette, in der aufeinander folgende Interpunktionszeichen entfernt wurden.

function cu.makeLink( url, text )

liefert einen Link in Wiki-Syntax.

function cu.makeDoiLink( doi )

liefert einen DOI-Link in Wiki-Syntax.

function cu.getDate( aDate, aFormat, errorMsg )

liefert eine formatierte Datumsangabe aus aDate mit dem Format aFormat. Bei fehlerhafter Wandlung wird die Fehlermeldung errorMsg in die interne Fehlertabelle geschrieben.

function cu.hasExtension( url, ext )

liefert tru, wenn die Internetadresse url die Dateierweiterung ext besitzt.

function cu.insertItem( tab, s, formatStr )

fügt die formatierte Zeichenkette s in die Tabelle tab ein, wenn sie nicht leer ist.

function cu.insertItem2( tab, s1, s2, formatStr )

fügt eine formatierte Zeichenkette aus den Teilzeichenketten s1 und s2 in die Tabelle tab ein, wenn sie beide nicht leer sind.

function cu.formatItem( s, formatStr )

liefert die formatierte Zeichenkette s, wenn sie nicht leer ist.

function cu.formatItem2( s1, s2, formatStr )

liefert eine formatierte Zeichenkette aus den Teilzeichenketten s1 und s2, wenn sie beide nicht leer sind.

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 citationUtilities = {
	suite  = 'Citation',
	sub    = 'utilities', 
	serial = '2021-09-01'
}

-- module variable and administration
local cu = {
	moduleInterface = citationUtilities
}

-- module import
require( 'Module:No globals' )
local ci = require( 'Module:Citation/i18n' )

-- global variable
local errorMsgs = {}

-- helper functions
function cu.isSet( param )
	return param and param ~= '';
end

-- math function round
function cu.round( num, decimalPlaces )
  local mult = 10^( decimalPlaces or 0 )
  return math.floor( num * mult + 0.5 ) / mult
end

-- converts string to number
function cu.getNumber( s )
	if not cu.isSet( s ) then
		return 0
	end
	if s:find( '[sic!]', 1, true ) then
		return 0
	end
	local kb = s:gsub( ci.texts.decimalPoint, '%.' )
	return tonumber( kb ) or 0
end

-- adds error message to array
function cu.addErrorMsg( msg )
	table.insert( errorMsgs, msg )
end

-- make complete message from message array
function cu.getErrorMsgs()
	-- remove duplicates
	for i = #errorMsgs, 1, -1 do
		for j = 1, #errorMsgs - 1, 1 do
			if errorMsgs[ i ] == errorMsgs[ j ] then
				table.remove( errorMsgs, i )
				break
			end
		end
	end

	local result = table.concat( errorMsgs, ' ' )
	if result ~= '' then
		result = result .. ' '
	end
	return result
end

-- get first item of a delimiter-separated list
function cu.getFirst( s, delimiter )
	local at = s:find( delimiter )
	if at then
		s = mw.text.trim( s:sub( 1, at - 1 ) )
	end
	return s
end

-- check if table contains the value
function cu.inArray( tab, val )
	if type( tab ) == 'string' then
		return tab == val
	end

	for index, value in ipairs( tab ) do
		if value == val then
			return true
		end
	end

	return false
end

-- convert values t from list if translated
function cu.getKey( t, list )
    local result = ''
    for key, tab in pairs( list ) do
        if cu.inArray( tab, t ) then
            result = key
            break
        end
    end
    return result
end

-- returns a single value from frame argument table
function cu.getArgValue( list, param, args )
	local value = ''
	if list[ param ] then
		for k, v in ipairs( list[ param ] ) do
			if cu.isSet( args[ v ] ) then
				value = args[ v ]
				break
			end
		end
	end
	return value
end

-- string cleanup
function cu.parameterCleanup( s )
	if not cu.isSet( s ) then
		return s -- nil or '' should be kept
	end

	local orig = s
	-- replace control characters
	s = s:gsub( '[\009\010\013]', ' ' ) -- horizontal tab, line feed, carriage return
	s = s:gsub( '[%z%c]', '' ) -- control characters

	-- remove tags
	s = mw.ustring.gsub( s, '</*br[^/>]*/*>', '' ) -- <br> tag
	s = mw.ustring.gsub( s, '</*p[^/>]*/*>', '' ) -- <p> tag
	s = mw.ustring.gsub( s, '</*div[^/>]*/*>', '' ) -- <div> tag

	if orig ~= s then
		cu.addErrorMsg( ci.texts.wrongChars )
	end

	-- replace character references and entities
	s = mw.text.decode( s, true )
	-- replace characters
	s = mw.ustring.gsub( s, '%.%.%.', '…' )
	s = mw.ustring.gsub( s, '%.%.', '‥' )
	return s:gsub( '%s%s+', ' ' ) -- multiple spaces
end

-- remove illegal chars from pages parameters
function cu.cleanupPageNumbers( pages )
	if not cu.isSet( pages ) then
		return ''
	end

	-- replace dashes with hyphens
	return mw.ustring.gsub( '' .. pages, '[–‒—]', '-' );
end

-- string cleanup before COinS creation
function cu.coinsCleanup( s )
	if not cu.isSet( s ) then
		return ''
	end

	-- replace characters
	s = s:gsub( '\226\128\138', ' ' ); -- hair space
	s = mw.ustring.gsub( s, '[\226\128\141\226\128\139\194\173]', '' );
		-- zero-width joiner, zero-width space, soft hyphen

	-- remove characters: soft hyphen, LTR mark, RTL mark
	for i, value in ipairs( { '­', '‎', '‏' } ) do
		s = mw.ustring.gsub( s, value, '' )
	end

	-- replace Wiki syntax
	s = s:gsub( "''+", '' ) -- multiple apostrophes
	s = mw.ustring.gsub( s, '</*span[^/>]*/*>', '' ) -- span tags
	s = mw.ustring.gsub( s, '%[%[[^%[%]]*|([^%[%]]*)%]%]', '%1' ) -- MediaWiki links
	s = mw.ustring.gsub( s, '%[%[([^%[%]]*)%]%]', '%1' )
	s = mw.ustring.gsub( s, '%[%a*:?//[^ ]+%s+([^%]]+)%]', '%1' ) -- web links
	s = mw.ustring.gsub( s, '%[mailto:[^ ]+%s+([^%]]+)%]', '%1' )
	s = mw.ustring.gsub( s, '%[%a*:?//([^%]]+)%]', '%1' )
	s = mw.ustring.gsub( s, '%[mailto:([^%]]+)%]', '%1' )

	return s:gsub( '%s%s+', ' ' ) -- multiple spaces
end

-- remove adjoining punctuation marks etc.
function cu.finalCleanup( s )
	s = s:gsub(	'%.+%.', '.' ):gsub( '%s%s+', ' ' ):gsub( '([,;:])(%s%.+)', '.' )
	for _, replacement in ipairs( ci.replacements ) do
		s = mw.ustring.gsub( s, replacement.s, replacement.r )
	end
	return s
end

function cu.makeLink( url, text )
	return mw.ustring.format( '[%s %s]', url, text )
end

function cu.makeDoiLink( doi )
	doi = mw.ustring.gsub( doi, 'https?://doi.org/', '' )
	doi = doi:gsub( '%[', '%%5B' ):gsub( '%]', '%%5D' )
	return cu.makeLink( 'https://doi.org/' .. mw.uri.encode( doi ), doi )
end

function cu.getDate( aDate, aFormat, errorMsg )
	local function formatDate( aDate, aFormat )
		return mw.getContentLanguage():formatDate( aFormat, aDate, true )
	end

	if aFormat == 'R' then
		return aDate
	end

	if aDate ~='' then
		local success, t = pcall( formatDate, aDate, aFormat )
		if success then
			return t
		else
			cu.addErrorMsg( errorMsg )
			return ''
		end
	else
		return ''
	end
end

-- check if url contains a file extension
function cu.hasExtension( url, ext )
	ext = '%.' .. ext:upper()
	url = url:upper()
	return url:match( ext .. '$' ) or url:match( ext .. '[%?#]' ) or
		url:match( ext .. '&#035' ); -- &#035 is #
end

function cu.insertItem( tab, s, formatStr )
	if cu.isSet( s ) then
		if formatStr then
			table.insert( tab,
				mw.ustring.format( formatStr, s )
			)
		else
			table.insert( tab, s )
		end
	end
end

function cu.insertItem2( tab, s1, s2, formatStr )
	if cu.isSet( s1 ) and cu.isSet( s2 ) then
		if formatStr then
			table.insert( tab,
				mw.ustring.format( formatStr, s1, s2 )
			)
		else
			table.insert( tab, s1 )
			table.insert( tab, s2 )
		end
	end
end

function cu.formatItem( s, formatStr )
	if cu.isSet( s ) then
		if formatStr then
			return mw.ustring.format( formatStr, s )
		else
			return s
		end
	else
		return ''
	end
end

function cu.formatItem2( s1, s2, formatStr )
	if cu.isSet( s1 ) and cu.isSet( s2 ) then
		if formatStr then
			 return mw.ustring.format( formatStr, s1, s2 )
		else
			return s1 .. ' ' .. s2
		end
	else
		return ''
	end
end

return cu