Revision as of 09:46, 2 October 2026 by Meryam Sahin (talk | contribs)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)

Documentation for this module may be created at Module:New pages/doc

-- Modul:NeuesteSeiten
-- Lists the newest (or most recently edited) pages whose name starts with a given prefix,
-- using the NeoWiki graph.
--
-- Usage:
--   {{#invoke:NeuesteSeiten|list|prefix=Testseite}}
--   {{#invoke:NeuesteSeiten|list|prefix=Testseite|limit=3|sort=edited|date=no}}
--
-- Parameters:
--   prefix  Page name prefix (case-sensitive, include namespace prefix if needed). Default: Testseite
--   limit   Number of pages, 1-50. Default: 3
--   sort    "created" (newest pages) or "edited" (most recently changed). Default: created
--   date    "no" hides the date. Default: shown

local p = {}

local SORT_FIELDS = {
	created = 'creationTime',
	edited = 'lastUpdated',
}

local function errorBox( msg )
	return '<span class="error">' .. mw.text.nowiki( msg ) .. '</span>'
end

function p.list( frame )
	local args = frame.args

	local prefix = mw.text.trim( args.prefix or '' )
	if prefix == '' then
		prefix = 'Testpage'
	end

	local limit = tonumber( args.limit ) or 3
	limit = math.max( 1, math.min( 50, math.floor( limit ) ) )

	local sortField = SORT_FIELDS[ mw.text.trim( args.sort or 'created' ) ] or SORT_FIELDS.created
	local showDate = mw.text.trim( args.date or '' ) == 'yes'

	local ok, nw = pcall( require, 'mw.neowiki' )
	if not ok or not nw or not nw.query then
		return errorBox( 'NeoWiki Lua library or graph backend is not available.' )
	end

	-- sortField and limit come from a whitelist / are validated numbers,
	-- so concatenating them is safe. The prefix is passed as a parameter.
	local cypher = 'MATCH (p:Page) WHERE p.name STARTS WITH $prefix '
		.. 'RETURN p.name AS name, p.' .. sortField .. ' AS date '
		.. 'ORDER BY p.' .. sortField .. ' DESC LIMIT ' .. limit

	local success, rows = pcall( nw.query, cypher, { prefix = prefix } )
	if not success then
		return errorBox( 'Query failed: ' .. tostring( rows ) )
	end

	if #rows == 0 then
		return "''No test pages found.''"
	end

	local lang = mw.getContentLanguage()
	local out = {}

	for _, row in ipairs( rows ) do
		local line = '[[' .. row.name .. ']]'
		if showDate and row.date then
			local okDate, formatted = pcall( lang.formatDate, lang, 'd.m.Y, H:i', row.date, true )
			if okDate then
				line = line .. ' (' .. formatted .. ')'
			end
		end
		table.insert( out, line )
	end

	return table.concat( out, ', ' )
end

return p

-- generated with claude.ai