Jump to content

Module:Page

Permanently protected module
From Wikipedia, the free encyclopedia
This is an old revision of this page, as edited by Petr Matas (talk | contribs) at 12:56, 17 August 2018 (Get rid of repeated code, use Lua errors without location information for error handling). The present address (URL) is a permanent link to this revision, which may differ significantly from the current revision.

---- This module is meant to allow the goodies listed in
---- http://www.mediawiki.org/wiki/Extension:Scribunto/Lua_reference_manual#Title_objects
---- to be accessed by people who don't want to program a Lua module.
---- Usage is:  {{#invoke:Page|(function)|parameters}}
---- (function) is one of the function names from the table above:
---- id, interwiki, namespace, fragment, nsText, subjectNsText, text, prefixedText, fullText ...

---- parameters are:
---- page = (name of page to load; leave blank to call mw.title.getCurrentTitle()
----    this is "text" passed to mw.title.new or "title" passed to mw.title.makeTitle
---- makeTitle = nonblank to call mw.title.makeTitle otherwise mw.title.new is called
---- namespace = (parameter passed to new/makeTitle)
---- fragment = (parameter passed to makeTitle)
---- interwiki = (parameter passed to makeTitle)
---- p1 = first parameter passed to functions within the title object
---- p2 = second parameter " " " "
---- p3 etc. (for inNamespaces)

local function callAssert(func, funcName, ...)
	local result = { func(...) }
	if not result[1] then
		error(mw.ustring.format('%s(%s) failed', funcName, join(', ', ...)), 0)
	end
	return unpack(result)
end

function main(frame, field)
    local args, pargs = frame.args, ( frame:getParent() or {} ).args or {};
    local makeTitle=args.makeTitle or pargs.makeTitle or "";
    local namespace=args.namespace or pargs.namespace or "";
    local fragment=args.fragment or pargs.fragment or "";
    local interwiki=args.interwiki or pargs.interwiki or "";
    local page=args.page or args[1] or pargs.page or pargs[1] or "";
    local id= tonumber( args.id or pargs.id );
    local pn = {};
    local title -- holds the result of the mw.title.xxx call
    
    for i = 1,9 do pn[i] = args['p'..i] or pargs['p'..i]; end
    if not id and not mw.ustring.match( page, '%S' ) then page = nil; end
    
    if id then
        title = callAssert(mw.title.new, 'mw.title.new', id);
    elseif not page then
        title = callAssert(mw.title.getCurrentTitle, 'getCurrentTitle');
    elseif makeTitle then
        title = callAssert(mw.title.makeTitle, 'makeTitle', namespace, page, fragment, interwiki);
    else
        title = callAssert(mw.title.new, 'mw.title.new', page, namespace);
    end
    
    local result = title[field];
    if type(result) == "function" then
        local success;
        success, result = pcall( result, title, unpack(pn) );
        if not success then
            error(result, 0);
        end
    end
    
    return tostring(result or "");
end

local p = {};

-- main function does all the work
local meta = {};
function meta.__index(table, key)
	return function(frame)
		return main(frame, key)
	end
end
setmetatable(p, meta)

function p.getContent(frame)
	local args, pargs = frame.args, ( frame:getParent() or {} ).args or {};
	local fmt = args.as or pargs.as or false
	local text = main(frame, "getContent")
	
	if not fmt then
		return frame:preprocess( "<pre>" .. text .. "</pre>" )
	end
	
	fmt = mw.text.split( fmt, ", ?" )
	
	for _, how in ipairs( fmt ) do
		if how == "pre" then
			text = table.concat{ "<pre>", text, "</pre>" }
		elseif how == "expand" then
			text = frame:preprocess(text)
		elseif how == "nowiki" then
			text = mw.text.nowiki(text)
		end
	end

	return text
end

return p