Permanently protected module
From Wikipedia, the free encyclopedia


-- This module implements {{Submit an edit request}}.



local CONFIG_MODULE = 'Module:Submit an edit request/config'



-- Load necessary modules

local mRedirect = require('Module:Redirect')

local cfg = mw.loadData(CONFIG_MODULE)

local effectiveProtectionLevel = require('Module:Effective protection level')._main

local escape = require("Module:String")._escapePattern

local lang = mw.language.getContentLanguage()



local p = {}



local validLevels = {

	semi = 'semi',

	extended = 'extended',

	template = 'template',

	full = 'full',

	interface = 'interface',

	manual = 'manual'

}



local function message(key, ...)

	local params = {...}

	local msg = cfgkey

	if #params < 1 then

		return msg

	else

		return mw.message.newRawMessage(msg):params(params):plain()

	end

end



local function validateLevel(level)

	return level and validLevelslevel or 'full'

end



local function getLevelInfo(level, field)

	return cfg.protectionLevelslevel][field

end



local function resolveRedirect(page)

	return mRedirect.luaMain(page)

end



local function isProtected(page)

	local action = mw.title.new(page).exists and 'edit' or 'create'

	return effectiveProtectionLevel(action, page) ~= '*'

end



function p.makeRequestUrl(level, titleObj)

	titleObj = titleObj or mw.title.getCurrentTitle()

	local basePage = titleObj.basePageTitle.fullText

	if cfg'main-page-content'][basePage then

		return tostring(mw.uri.fullUrl(message('main-page-request-page')))

	end



	local talkPageName = titleObj.talkPageTitle

	if talkPageName == nil then

		return tostring(mw.uri.fullUrl(message('protected-talk-page-request-page')))

	end

	talkPageName = resolveRedirect(talkPageName.prefixedText)

	if isProtected(talkPageName) then

		return tostring(mw.uri.fullUrl(message('protected-talk-page-request-page')))

	end

	level = validateLevel(level)

	if level == 'manual' then

		return tostring(mw.uri.fullUrl(talkPageName, {

			action = 'edit',

			section = 'new'

		}))

	end

	local sectionname = message(

			'preload-title-text',

			getLevelInfo(level, 'levelText'),

			lang:formatDate(message('preload-title-date-format'))

	)

	local content = mw.title.new(talkPageName):getContent()

	if content and content:find("== *" .. escape(sectionname) .. " *==") then

		local dedup = 2

		while true do

			local newname = message("preload-title-dedup-suffix", sectionname, dedup)

			if not content:find("== *" .. escape(newname) .. " *==") then

				sectionname = newname

				break

			end

			dedup = dedup + 1

		end

	end

	local url = mw.uri.fullUrl(talkPageName, {

		action = 'edit',

		editintro = getLevelInfo(level, 'editintro'),

		preload = message('preload-template'),

		preloadtitle = sectionname,

		section = 'new'

	})

	url = tostring(url)



	-- Add the preload parameters. @TODO: merge this into the mw.uri.fullUrl

	-- query table once [[phab:T93059]] is fixed.

	local function encodeParam(key, val)

		return string.format('&%s=%s', mw.uri.encode(key), mw.uri.encode(val))

	end

	url = url .. encodeParam('preloadparams[]', getLevelInfo(level, 'requestTemplate'))

	url = url .. encodeParam('preloadparams[]', titleObj.prefixedText)



	return url

end



function p._link(args)

	return string.format(

		'<span class="plainlinks">[%s %s]</span>',

		p.makeRequestUrl(args.type),

		args.display or message('default-display-value')

	)

end



function p._button(args)

	return require('Module:Clickable button 2').main{

		1 = args.display or message('default-display-value'),

		url = p.makeRequestUrl(args.type),

		class = 'mw-ui-progressive'

	}

end



local function makeInvokeFunc(func, wrapper)

	return function (frame)

		local args = require('Module:Arguments').getArgs(frame, {

			wrappers = {wrapper}

		})

		return func(args)

	end

end



p.link = makeInvokeFunc(p._link, message('link-wrapper-template'))

p.button = makeInvokeFunc(p._button, message('button-wrapper-template'))



return p