Jump to content

Module:WP

Permanently protected module
From Wikipedia, the free encyclopedia
This is an old revision of this page, as edited by Guywan (talk | contribs) at 21:00, 5 April 2020. The present address (URL) is a permanent link to this revision, which may differ significantly from the current revision.

local p = {}

local mRedirect = require('Module:Redirect')

-- Return blank text, or an error message if requested
local function err(text)
	if errors then error(text, 2) end
	return ""
end

-- Get a redirect target (or nil if not a redirect) without using the expensive title object property .isRedirect
local function getRedirectTarget(titleObject)
	local content = titleObject:getContent()
	if not content then return nil end
	return mRedirect.getTargetFromText(content)
end

-- Get a page's content, following redirects, and processing file description pages for files.
-- Also returns the page name, or the target page name if a redirect was followed, or false if no page found
local function getContent(page, frame)
	local title = mw.title.new(page) -- Read description page (for :File:Foo rather than File:Foo)
	if not title then return false, false end

	local redir = getRedirectTarget(title)
	if redir then title = mw.title.new(redir) end

	return title:getContent(), redir or title.prefixedText
end

local function wikilink_strip(text)
	for wikilink in text:gmatch('%[%b[]%]') do				-- get a wikilink
		text = text:gsub('%[%b[]%]', '__57r1P__', 1);		-- install a marker
		if wikilink:match('%[%[.-|(.-)%]%]') then
			wikilink = wikilink:match('%[%[.-|(.-)%]%]');	-- extract label from complex [[link|label]] wikilink
		else
			wikilink = wikilink:match('%[%[(.-)%]%]');		-- extract link from simple [[link]] wikilinks
		end
		--wikilink = escape_lua_magic_chars(wikilink);		-- in case there are lua magic characters in wikilink
		text = text:gsub('__57r1P__', wikilink, 1);			-- replace the marker with the appropriate text
	end

	return text;
end

-- Main function returns a string value: nutshell text from the {{nutshell}} template on the given page.
local function _main(pagename)
	
	if not pagename then return err("No page name given") end
    
	local text
    text, normalisedPagename = getContent(pagename)
    
    if not normalisedPagename then
        return err("No title for page name " .. pagename)
    end
    
    if text then
        local isStub = mw.ustring.find(text, "%s*{{[^{|}]*%-[Ss]tub%s*}}")
        if isStub then text = nil end
    end
    
	if not text then return err("Cannot read a valid page: page name is " .. pagename) end
	
	local templatePatterns = {
		"{{ -[Nn]utshell -| -(.-) -}}",
		"{{ -[Pp]olicy in a nutshell -| -(.-) -}}",
		"{{ -[Ii]n a nutshell -| -(.-) -}}",
		"{{ -[Ii]nanutshell -| -(.-) -}}",
		"{{ -[Gg]uideline in a nutshell -| -(.-) -}}",
		"{{ -[Gg]uideline one liner -| -(.-) -}}",
		"{{ -[Nn]aming convention in a nutshell -| -(.-) -}}",
		"{{ -[Nn]utshell2 -| -(.-) -}}",
		"{{ -[Pp]roposal in a nutshell -| -(.-) -}}"
	}
	
	local nutshell
	for i = 1, #templatePatterns do
		nutshell = string.match(text, templatePatterns[i])
		
		if nutshell then break end
	end
	
	if not nutshell then return err("Page has no nutshell text: " .. pagename) end
	
	-- Remove wikilinks.
	nutshell = wikilink_strip(nutshell)
	
	-- Replace `|` with `. `, for templates like {{nutshell|point one|point two|point three}}.
	nutshell, _ = string.gsub(nutshell, "|", ". ")
	
	-- Change double quotes to single quotes, so that tooltips work properly.
	nutshell, _ = string.gsub(nutshell, "\"", "'")
	
	return nutshell
end

function p.main(pagename) return _main(pagename) end
function p.invoke(frame) return _main(frame.args[1]) end

return p