Jump to content

Module:Lockbox/sandbox

From Wikipedia, the free encyclopedia
This is an old revision of this page, as edited by Mr. Stradivarius (talk | contribs) at 02:33, 17 March 2017 (improve comment, and don't transclude the parent title). The present address (URL) is a permanent link to this revision, which may differ significantly from the current revision.
local export = {}

-- XXX: OUTRAGEOUS ABUSE OF SCRIBUNTO API
-- generates a transclusion without incrementing the "expensive function" count
local generate_transclusion
do 
	local mock_title = mw.title.new(mw.title.getCurrentTitle().id)
	local getContent = mock_title.getContent
	function generate_transclusion(title)
		rawset(mock_title, 'fullText', title)
		getContent(mock_title)
	end
	-- I can do the same thing without rawset.
end

function export.lock(frame)
	local output = {}
	
	-- Check if the transcluding page is cascade-protected.
	--
	-- Only pages transcluded from a cascade-protected page appear in
	-- CASCADINGSOURCES, so normally we would not be able to tell if the lockbox
	-- itself is cascade-protected. To work around this, we generate a
	-- transclusion from the lockbox to itself, so that it will have an entry
	-- for itself in CASCADINGSOURCES.
	--
	-- We cannot generate this transclusion using the title object for the
	-- parent title (the lockbox), as if the lockbox is transcluded on another
	-- page, we will generate a transclusion *from* the lockbox *to* that page
	-- as well, and the page will be cascade-protected. Instead we generate it
	-- with the title object for the current title.
	--
	-- When the current title is the parent title (i.e. we are rendering the
	-- lockbox page), this creates the required entry in the link table in the
	-- database. When the current title is the grandparent title or up (i.e. we
	-- are rendering a page transcluding the lockbox), transclusions are only
	-- created from the page itself, not from the lockbox, and it is not
	-- cascade-protected.
	-- 
	-- This creates an extaneous self-transclusion for all pages using the
	-- module, but we treat that as a necessary evil.
	--
	-- XXX: there seems to be no way to check for cascading protection using a
	-- Scribunto API, so we have to use frame:preprocess with the
	-- CASCADINGSOURCES parser function.
	do
		mw.title.getCurrentTitle():getContent() -- Generate self-transclusion
		local parent_title = frame:getParent():getTitle()
		if frame:preprocess("{{CASCADINGSOURCES:" .. parent_title .. "}}") == "" then
			output[#output + 1] = '<strong class="warning">Warning: the page "' .. parent_title .. '" is not cascade-protected.</strong>\n'
		end
	end
	
	local match = string.match

	for _, item in ipairs(frame.args) do
		item = mw.text.trim(item)
		
		local ns, rest = match(item, "^(.-):(.*)")
		if not ns or not mw.site.namespaces[ns] then
			generate_transclusion('Template:' .. item)
			output[#output + 1] = '* [[Template:' .. item .. ']]'
		elseif (ns == "File") or (ns == "Image") then
			generate_transclusion(item)
			output[#output + 1] = '* [[:' .. item .. ']]'
		elseif ns == "Category" then
			generate_transclusion(item)
			output[#output + 1] = '* [[:' .. item .. ']]'
		elseif rest ~= '' then
			generate_transclusion(item)
			output[#output + 1] = '* [[' .. item .. ']]'
		end
	end

	if frame.args.silent then
		return ""
	else
		return table.concat(output, '\n')
	end
end

return export