विकिपीडिया
bhwiki
https://bh.wikipedia.org/wiki/%E0%A4%AE%E0%A5%81%E0%A4%96%E0%A5%8D%E0%A4%AF_%E0%A4%AA%E0%A4%A8%E0%A5%8D%E0%A4%A8%E0%A4%BE
MediaWiki 1.47.0-wmf.12
first-letter
मीडिया
विशेष
वार्तालाप
प्रयोगकर्ता
प्रयोगकर्ता वार्ता
विकिपीडिया
विकिपीडिया वार्ता
चित्र
चित्र वार्ता
मीडियाविकि
मीडियाविकि वार्ता
टेम्पलेट
टेम्पलेट वार्ता
मदद
मदद वार्ता
श्रेणी
श्रेणी वार्ता
TimedText
TimedText talk
Module
Module talk
Event
Event talk
Module:Message box
828
9894
802673
778180
2025-10-02T20:17:19Z
en>Izno
0
div structure behind flag
802673
Scribunto
text/plain
require('strict')
local getArgs
local yesno = require('Module:Yesno')
local lang = mw.language.getContentLanguage()
local CONFIG_MODULE = 'Module:Message box/configuration'
local DEMOSPACES = {talk = 'tmbox', image = 'imbox', file = 'imbox', category = 'cmbox', article = 'ambox', main = 'ambox'}
--------------------------------------------------------------------------------
-- Helper functions
--------------------------------------------------------------------------------
local function getTitleObject(...)
-- Get the title object, passing the function through pcall
-- in case we are over the expensive function count limit.
local success, title = pcall(mw.title.new, ...)
if success then
return title
end
end
local function union(t1, t2)
-- Returns the union of two arrays.
local vals = {}
for i, v in ipairs(t1) do
vals[v] = true
end
for i, v in ipairs(t2) do
vals[v] = true
end
local ret = {}
for k in pairs(vals) do
table.insert(ret, k)
end
table.sort(ret)
return ret
end
local function getArgNums(args, prefix)
local nums = {}
for k, v in pairs(args) do
local num = mw.ustring.match(tostring(k), '^' .. prefix .. '([1-9]%d*)$')
if num then
table.insert(nums, tonumber(num))
end
end
table.sort(nums)
return nums
end
--------------------------------------------------------------------------------
-- Box class definition
--------------------------------------------------------------------------------
local MessageBox = {}
MessageBox.__index = MessageBox
function MessageBox.new(boxType, args, cfg)
args = args or {}
local obj = {}
-- Set the title object and the namespace.
obj.title = getTitleObject(args.page) or mw.title.getCurrentTitle()
-- Set the config for our box type.
obj.cfg = cfg[boxType]
if not obj.cfg then
local ns = obj.title.namespace
-- boxType is "mbox" or invalid input
if args.demospace and args.demospace ~= '' then
-- implement demospace parameter of mbox
local demospace = string.lower(args.demospace)
if DEMOSPACES[demospace] then
-- use template from DEMOSPACES
obj.cfg = cfg[DEMOSPACES[demospace]]
elseif string.find( demospace, 'talk' ) then
-- demo as a talk page
obj.cfg = cfg.tmbox
else
-- default to ombox
obj.cfg = cfg.ombox
end
elseif ns == 0 then
obj.cfg = cfg.ambox -- main namespace
elseif ns == 6 then
obj.cfg = cfg.imbox -- file namespace
elseif ns == 14 then
obj.cfg = cfg.cmbox -- category namespace
else
local nsTable = mw.site.namespaces[ns]
if nsTable and nsTable.isTalk then
obj.cfg = cfg.tmbox -- any talk namespace
else
obj.cfg = cfg.ombox -- other namespaces or invalid input
end
end
end
-- Set the arguments, and remove all blank arguments except for the ones
-- listed in cfg.allowBlankParams.
do
local newArgs = {}
for k, v in pairs(args) do
if v ~= '' then
newArgs[k] = v
end
end
for i, param in ipairs(obj.cfg.allowBlankParams or {}) do
newArgs[param] = args[param]
end
obj.args = newArgs
end
-- Define internal data structure.
obj.categories = {}
obj.classes = {}
-- For lazy loading of [[Module:Category handler]].
obj.hasCategories = false
return setmetatable(obj, MessageBox)
end
function MessageBox:addCat(ns, cat, sort)
if not cat then
return nil
end
if sort then
cat = string.format('[[Category:%s|%s]]', cat, sort)
else
cat = string.format('[[Category:%s]]', cat)
end
self.hasCategories = true
self.categories[ns] = self.categories[ns] or {}
table.insert(self.categories[ns], cat)
end
function MessageBox:addClass(class)
if not class then
return nil
end
table.insert(self.classes, class)
end
function MessageBox:setParameters()
local args = self.args
local cfg = self.cfg
-- Get type data.
self.type = args.type
local typeData = cfg.types[self.type]
self.invalidTypeError = cfg.showInvalidTypeError
and self.type
and not typeData
typeData = typeData or cfg.types[cfg.default]
self.typeClass = typeData.class
self.typeImage = typeData.image
self.typeImageNeedsLink = typeData.imageNeedsLink
-- Find if the box has been wrongly substituted.
self.isSubstituted = cfg.substCheck and args.subst == 'SUBST'
-- Find whether we are using a small message box.
self.isSmall = cfg.allowSmall and (
cfg.smallParam and args.small == cfg.smallParam
or not cfg.smallParam and yesno(args.small)
)
-- Add attributes, classes and styles.
self.id = args.id
self.name = args.name
if self.name then
self:addClass('box-' .. string.gsub(self.name,' ','_'))
end
if yesno(args.plainlinks) ~= false then
self:addClass('plainlinks')
end
for _, class in ipairs(cfg.classes or {}) do
self:addClass(class)
end
if self.isSmall then
self:addClass(cfg.smallClass or 'mbox-small')
end
self:addClass(self.typeClass)
self:addClass(args.class)
self.style = args.style
self.attrs = args.attrs
-- Set text style.
self.textstyle = args.textstyle
-- Set image classes.
self.imageRightClass = args.imagerightclass or args.imageclass
self.imageLeftClass = args.imageleftclass or args.imageclass
-- Find if we are on the template page or not. This functionality is only
-- used if useCollapsibleTextFields is set, or if both cfg.templateCategory
-- and cfg.templateCategoryRequireName are set.
self.useCollapsibleTextFields = cfg.useCollapsibleTextFields
if self.useCollapsibleTextFields
or cfg.templateCategory
and cfg.templateCategoryRequireName
then
if self.name then
local templateName = mw.ustring.match(
self.name,
'^[tT][eE][mM][pP][lL][aA][tT][eE][%s_]*:[%s_]*(.*)$'
) or self.name
templateName = 'Template:' .. templateName
self.templateTitle = getTitleObject(templateName)
end
self.isTemplatePage = self.templateTitle
and mw.title.equals(self.title, self.templateTitle)
end
-- Process data for collapsible text fields. At the moment these are only
-- used in {{ambox}}.
if self.useCollapsibleTextFields then
-- Get the self.issue value.
if self.isSmall and args.smalltext then
self.issue = args.smalltext
else
local sect
if args.sect == '' then
sect = 'This ' .. (cfg.sectionDefault or 'page')
elseif type(args.sect) == 'string' then
sect = 'This ' .. args.sect
end
local issue = args.issue
issue = type(issue) == 'string' and issue ~= '' and issue or nil
local text = args.text
text = type(text) == 'string' and text or nil
local issues = {}
table.insert(issues, sect)
table.insert(issues, issue)
table.insert(issues, text)
self.issue = table.concat(issues, ' ')
end
-- Get the self.talk value.
local talk = args.talk
-- Show talk links on the template page or template subpages if the talk
-- parameter is blank.
if talk == ''
and self.templateTitle
and (
mw.title.equals(self.templateTitle, self.title)
or self.title:isSubpageOf(self.templateTitle)
)
then
talk = '#'
elseif talk == '' then
talk = nil
end
if talk then
-- If the talk value is a talk page, make a link to that page. Else
-- assume that it's a section heading, and make a link to the talk
-- page of the current page with that section heading.
local talkTitle = getTitleObject(talk)
local talkArgIsTalkPage = true
if not talkTitle or not talkTitle.isTalkPage then
talkArgIsTalkPage = false
talkTitle = getTitleObject(
self.title.text,
mw.site.namespaces[self.title.namespace].talk.id
)
end
if talkTitle and talkTitle.exists then
local talkText
if self.isSmall then
local talkLink = talkArgIsTalkPage and talk or (talkTitle.prefixedText .. (talk == '#' and '' or '#') .. talk)
talkText = string.format('([[%s|talk]])', talkLink)
else
talkText = 'Relevant discussion may be found on'
if talkArgIsTalkPage then
talkText = string.format(
'%s [[%s|%s]].',
talkText,
talk,
talkTitle.prefixedText
)
else
talkText = string.format(
'%s the [[%s' .. (talk == '#' and '' or '#') .. '%s|talk page]].',
talkText,
talkTitle.prefixedText,
talk
)
end
end
self.talk = talkText
end
end
-- Get other values.
self.fix = args.fix ~= '' and args.fix or nil
local date
if args.date and args.date ~= '' then
date = args.date
elseif args.date == '' and self.isTemplatePage then
date = lang:formatDate('F Y')
end
if date then
self.date = string.format(" <span class='date-container'><i>(<span class='date'>%s</span>)</i></span>", date)
end
self.info = args.info
if yesno(args.removalnotice) then
self.removalNotice = cfg.removalNotice
end
end
-- Set the non-collapsible text field. At the moment this is used by all box
-- types other than ambox, and also by ambox when small=yes.
if self.isSmall then
self.text = args.smalltext or args.text
else
self.text = args.text
end
-- Set the below row.
self.below = cfg.below and args.below
-- General image settings.
self.imageCellDiv = not self.isSmall and cfg.imageCellDiv
self.imageEmptyCell = cfg.imageEmptyCell
-- Left image settings.
local imageLeft = self.isSmall and args.smallimage or args.image
if cfg.imageCheckBlank and imageLeft ~= 'blank' and imageLeft ~= 'none'
or not cfg.imageCheckBlank and imageLeft ~= 'none'
then
self.imageLeft = imageLeft
if not imageLeft then
local imageSize = self.isSmall
and (cfg.imageSmallSize or '30x30px')
or '40x40px'
self.imageLeft = string.format('[[File:%s|%s%s|alt=]]', self.typeImage
or 'Information icon4.svg', imageSize, self.typeImageNeedsLink and "" or "|link=" )
end
end
-- Right image settings.
local imageRight = self.isSmall and args.smallimageright or args.imageright
if not (cfg.imageRightNone and imageRight == 'none') then
self.imageRight = imageRight
end
-- set templatestyles
self.base_templatestyles = cfg.templatestyles
self.templatestyles = args.templatestyles
end
function MessageBox:setMainspaceCategories()
local args = self.args
local cfg = self.cfg
if not cfg.allowMainspaceCategories then
return nil
end
local nums = {}
for _, prefix in ipairs{'cat', 'category', 'all'} do
args[prefix .. '1'] = args[prefix]
nums = union(nums, getArgNums(args, prefix))
end
-- The following is roughly equivalent to the old {{Ambox/category}}.
local date = args.date
date = type(date) == 'string' and date
local preposition = 'from'
for _, num in ipairs(nums) do
local mainCat = args['cat' .. tostring(num)]
or args['category' .. tostring(num)]
local allCat = args['all' .. tostring(num)]
mainCat = type(mainCat) == 'string' and mainCat
allCat = type(allCat) == 'string' and allCat
if mainCat and date and date ~= '' then
local catTitle = string.format('%s %s %s', mainCat, preposition, date)
self:addCat(0, catTitle)
catTitle = getTitleObject('Category:' .. catTitle)
if not catTitle or not catTitle.exists then
self:addCat(0, 'Articles with invalid date parameter in template')
end
elseif mainCat and (not date or date == '') then
self:addCat(0, mainCat)
end
if allCat then
self:addCat(0, allCat)
end
end
end
function MessageBox:setTemplateCategories()
local args = self.args
local cfg = self.cfg
-- Add template categories.
if cfg.templateCategory then
if cfg.templateCategoryRequireName then
if self.isTemplatePage then
self:addCat(10, cfg.templateCategory)
end
elseif not self.title.isSubpage then
self:addCat(10, cfg.templateCategory)
end
end
-- Add template error categories.
if cfg.templateErrorCategory then
local templateErrorCategory = cfg.templateErrorCategory
local templateCat, templateSort
if not self.name and not self.title.isSubpage then
templateCat = templateErrorCategory
elseif self.isTemplatePage then
local paramsToCheck = cfg.templateErrorParamsToCheck or {}
local count = 0
for i, param in ipairs(paramsToCheck) do
if not args[param] then
count = count + 1
end
end
if count > 0 then
templateCat = templateErrorCategory
templateSort = tostring(count)
end
if self.categoryNums and #self.categoryNums > 0 then
templateCat = templateErrorCategory
templateSort = 'C'
end
end
self:addCat(10, templateCat, templateSort)
end
end
function MessageBox:setAllNamespaceCategories()
-- Set categories for all namespaces.
if self.invalidTypeError then
local allSort = (self.title.namespace == 0 and 'Main:' or '') .. self.title.prefixedText
self:addCat('all', 'Wikipedia message box parameter needs fixing', allSort)
end
if self.isSubstituted then
self:addCat('all', 'Pages with incorrectly substituted templates')
end
end
function MessageBox:setCategories()
if self.title.namespace == 0 then
self:setMainspaceCategories()
elseif self.title.namespace == 10 then
self:setTemplateCategories()
end
self:setAllNamespaceCategories()
end
function MessageBox:renderCategories()
if not self.hasCategories then
-- No categories added, no need to pass them to Category handler so,
-- if it was invoked, it would return the empty string.
-- So we shortcut and return the empty string.
return ""
end
-- Convert category tables to strings and pass them through
-- [[Module:Category handler]].
return require('Module:Category handler')._main{
main = table.concat(self.categories[0] or {}),
template = table.concat(self.categories[10] or {}),
all = table.concat(self.categories.all or {}),
nocat = self.args.nocat,
page = self.args.page
}
end
function MessageBox:exportDiv()
local root = mw.html.create()
-- Add the subst check error.
if self.isSubstituted and self.name then
root:tag('b')
:addClass('error')
:wikitext(string.format(
'Template <code>%s[[Template:%s|%s]]%s</code> has been incorrectly substituted.',
mw.text.nowiki('{{'), self.name, self.name, mw.text.nowiki('}}')
))
end
local frame = mw.getCurrentFrame()
root:wikitext(frame:extensionTag{
name = 'templatestyles',
args = { src = self.base_templatestyles },
})
-- Add support for a single custom templatestyles sheet. Undocumented as
-- need should be limited and many templates using mbox are substed; we
-- don't want to spread templatestyles sheets around to arbitrary places
if self.templatestyles then
root:wikitext(frame:extensionTag{
name = 'templatestyles',
args = { src = self.templatestyles },
})
end
-- Create the box.
local mbox = root:tag('div')
mbox:attr('id', self.id or nil)
for i, class in ipairs(self.classes or {}) do
mbox:addClass(class or nil)
end
mbox
:cssText(self.style or nil)
if self.attrs then
mbox:attr(self.attrs)
end
-- Add the left-hand image.
if self.imageLeft then
local imageLeftCell = mbox:tag('div'):addClass('mbox-image')
imageLeftCell
:addClass(self.imageLeftClass)
:wikitext(self.imageLeft or nil)
end
-- Add the text.
local textCell = mbox:tag('div'):addClass('mbox-text')
if self.useCollapsibleTextFields then
-- The message box uses advanced text parameters that allow things to be
-- collapsible. At the moment, only ambox uses this.
textCell:cssText(self.textstyle or nil)
local textCellDiv = textCell:tag('div')
textCellDiv
:addClass('mbox-text-span')
:wikitext(self.issue or nil)
if (self.talk or self.fix) then
textCellDiv:tag('span')
:addClass('hide-when-compact')
:wikitext(self.talk and (' ' .. self.talk) or nil)
:wikitext(self.fix and (' ' .. self.fix) or nil)
end
textCellDiv:wikitext(self.date and (' ' .. self.date) or nil)
if self.info and not self.isSmall then
textCellDiv
:tag('span')
:addClass('hide-when-compact')
:wikitext(self.info and (' ' .. self.info) or nil)
end
if self.removalNotice then
textCellDiv:tag('span')
:addClass('hide-when-compact')
:tag('i')
:wikitext(string.format(" (%s)", self.removalNotice))
end
else
-- Default text formatting - anything goes.
textCell
:cssText(self.textstyle or nil)
:wikitext(self.text or nil)
end
-- Add the right-hand image.
if self.imageRight then
local imageRightCell = mbox:tag('div'):addClass('mbox-imageright')
imageRightCell
:addClass(self.imageRightClass)
:wikitext(self.imageRight or nil)
end
-- Add the below row.
if self.below then
mbox:tag('div')
:addClass('mbox-text')
:cssText(self.textstyle or nil)
:wikitext(self.below or nil)
end
-- Add error message for invalid type parameters.
if self.invalidTypeError then
root:tag('div')
:addClass('mbox-invalid-type')
:wikitext(string.format(
'This message box is using an invalid "type=%s" parameter and needs fixing.',
self.type or ''
))
end
-- Add categories.
root:wikitext(self:renderCategories() or nil)
return tostring(root)
end
function MessageBox:export()
local root = mw.html.create()
-- Add the subst check error.
if self.isSubstituted and self.name then
root:tag('b')
:addClass('error')
:wikitext(string.format(
'Template <code>%s[[Template:%s|%s]]%s</code> has been incorrectly substituted.',
mw.text.nowiki('{{'), self.name, self.name, mw.text.nowiki('}}')
))
end
local frame = mw.getCurrentFrame()
root:wikitext(frame:extensionTag{
name = 'templatestyles',
args = { src = self.base_templatestyles },
})
-- Add support for a single custom templatestyles sheet. Undocumented as
-- need should be limited and many templates using mbox are substed; we
-- don't want to spread templatestyles sheets around to arbitrary places
if self.templatestyles then
root:wikitext(frame:extensionTag{
name = 'templatestyles',
args = { src = self.templatestyles },
})
end
-- Create the box table.
local boxTable = root:tag('table')
boxTable:attr('id', self.id or nil)
for i, class in ipairs(self.classes or {}) do
boxTable:addClass(class or nil)
end
boxTable
:cssText(self.style or nil)
:attr('role', 'presentation')
if self.attrs then
boxTable:attr(self.attrs)
end
-- Add the left-hand image.
local row = boxTable:tag('tr')
if self.imageLeft then
local imageLeftCell = row:tag('td'):addClass('mbox-image')
if self.imageCellDiv then
-- If we are using a div, redefine imageLeftCell so that the image
-- is inside it. Divs use style="width: 52px;", which limits the
-- image width to 52px. If any images in a div are wider than that,
-- they may overlap with the text or cause other display problems.
imageLeftCell = imageLeftCell:tag('div'):addClass('mbox-image-div')
end
imageLeftCell
:addClass(self.imageLeftClass)
:wikitext(self.imageLeft or nil)
elseif self.imageEmptyCell then
-- Some message boxes define an empty cell if no image is specified, and
-- some don't. The old template code in templates where empty cells are
-- specified gives the following hint: "No image. Cell with some width
-- or padding necessary for text cell to have 100% width."
row:tag('td')
:addClass('mbox-empty-cell')
end
-- Add the text.
local textCell = row:tag('td'):addClass('mbox-text')
if self.useCollapsibleTextFields then
-- The message box uses advanced text parameters that allow things to be
-- collapsible. At the moment, only ambox uses this.
textCell:cssText(self.textstyle or nil)
local textCellDiv = textCell:tag('div')
textCellDiv
:addClass('mbox-text-span')
:wikitext(self.issue or nil)
if (self.talk or self.fix) then
textCellDiv:tag('span')
:addClass('hide-when-compact')
:wikitext(self.talk and (' ' .. self.talk) or nil)
:wikitext(self.fix and (' ' .. self.fix) or nil)
end
textCellDiv:wikitext(self.date and (' ' .. self.date) or nil)
if self.info and not self.isSmall then
textCellDiv
:tag('span')
:addClass('hide-when-compact')
:wikitext(self.info and (' ' .. self.info) or nil)
end
if self.removalNotice then
textCellDiv:tag('span')
:addClass('hide-when-compact')
:tag('i')
:wikitext(string.format(" (%s)", self.removalNotice))
end
else
-- Default text formatting - anything goes.
textCell
:cssText(self.textstyle or nil)
:wikitext(self.text or nil)
end
-- Add the right-hand image.
if self.imageRight then
local imageRightCell = row:tag('td'):addClass('mbox-imageright')
if self.imageCellDiv then
-- If we are using a div, redefine imageRightCell so that the image
-- is inside it.
imageRightCell = imageRightCell:tag('div'):addClass('mbox-image-div')
end
imageRightCell
:addClass(self.imageRightClass)
:wikitext(self.imageRight or nil)
end
-- Add the below row.
if self.below then
boxTable:tag('tr')
:tag('td')
:attr('colspan', self.imageRight and '3' or '2')
:addClass('mbox-text')
:cssText(self.textstyle or nil)
:wikitext(self.below or nil)
end
-- Add error message for invalid type parameters.
if self.invalidTypeError then
root:tag('div')
:addClass('mbox-invalid-type')
:wikitext(string.format(
'This message box is using an invalid "type=%s" parameter and needs fixing.',
self.type or ''
))
end
-- Add categories.
root:wikitext(self:renderCategories() or nil)
return tostring(root)
end
--------------------------------------------------------------------------------
-- Exports
--------------------------------------------------------------------------------
local p, mt = {}, {}
function p._exportClasses()
-- For testing.
return {
MessageBox = MessageBox
}
end
function p.main(boxType, args, cfgTables)
local box = MessageBox.new(boxType, args, cfgTables or mw.loadData(CONFIG_MODULE))
box:setParameters()
box:setCategories()
-- DIV MIGRATION CONDITIONAL
if box.cfg.div_structure then
return box:exportDiv()
end
-- END DIV MIGRATION CONDITIONAL
return box:export()
end
function mt.__index(t, k)
return function (frame)
if not getArgs then
getArgs = require('Module:Arguments').getArgs
end
return t.main(k, getArgs(frame, {trim = false, removeBlanks = false}))
end
end
return setmetatable(p, mt)
3kxp9enwpsr8fe8mbg0t0ip5p0yl8m3
802674
802673
2025-10-19T18:19:52Z
en>Izno
0
below in div mbox
802674
Scribunto
text/plain
require('strict')
local getArgs
local yesno = require('Module:Yesno')
local lang = mw.language.getContentLanguage()
local CONFIG_MODULE = 'Module:Message box/configuration'
local DEMOSPACES = {talk = 'tmbox', image = 'imbox', file = 'imbox', category = 'cmbox', article = 'ambox', main = 'ambox'}
--------------------------------------------------------------------------------
-- Helper functions
--------------------------------------------------------------------------------
local function getTitleObject(...)
-- Get the title object, passing the function through pcall
-- in case we are over the expensive function count limit.
local success, title = pcall(mw.title.new, ...)
if success then
return title
end
end
local function union(t1, t2)
-- Returns the union of two arrays.
local vals = {}
for i, v in ipairs(t1) do
vals[v] = true
end
for i, v in ipairs(t2) do
vals[v] = true
end
local ret = {}
for k in pairs(vals) do
table.insert(ret, k)
end
table.sort(ret)
return ret
end
local function getArgNums(args, prefix)
local nums = {}
for k, v in pairs(args) do
local num = mw.ustring.match(tostring(k), '^' .. prefix .. '([1-9]%d*)$')
if num then
table.insert(nums, tonumber(num))
end
end
table.sort(nums)
return nums
end
--------------------------------------------------------------------------------
-- Box class definition
--------------------------------------------------------------------------------
local MessageBox = {}
MessageBox.__index = MessageBox
function MessageBox.new(boxType, args, cfg)
args = args or {}
local obj = {}
-- Set the title object and the namespace.
obj.title = getTitleObject(args.page) or mw.title.getCurrentTitle()
-- Set the config for our box type.
obj.cfg = cfg[boxType]
if not obj.cfg then
local ns = obj.title.namespace
-- boxType is "mbox" or invalid input
if args.demospace and args.demospace ~= '' then
-- implement demospace parameter of mbox
local demospace = string.lower(args.demospace)
if DEMOSPACES[demospace] then
-- use template from DEMOSPACES
obj.cfg = cfg[DEMOSPACES[demospace]]
elseif string.find( demospace, 'talk' ) then
-- demo as a talk page
obj.cfg = cfg.tmbox
else
-- default to ombox
obj.cfg = cfg.ombox
end
elseif ns == 0 then
obj.cfg = cfg.ambox -- main namespace
elseif ns == 6 then
obj.cfg = cfg.imbox -- file namespace
elseif ns == 14 then
obj.cfg = cfg.cmbox -- category namespace
else
local nsTable = mw.site.namespaces[ns]
if nsTable and nsTable.isTalk then
obj.cfg = cfg.tmbox -- any talk namespace
else
obj.cfg = cfg.ombox -- other namespaces or invalid input
end
end
end
-- Set the arguments, and remove all blank arguments except for the ones
-- listed in cfg.allowBlankParams.
do
local newArgs = {}
for k, v in pairs(args) do
if v ~= '' then
newArgs[k] = v
end
end
for i, param in ipairs(obj.cfg.allowBlankParams or {}) do
newArgs[param] = args[param]
end
obj.args = newArgs
end
-- Define internal data structure.
obj.categories = {}
obj.classes = {}
-- For lazy loading of [[Module:Category handler]].
obj.hasCategories = false
return setmetatable(obj, MessageBox)
end
function MessageBox:addCat(ns, cat, sort)
if not cat then
return nil
end
if sort then
cat = string.format('[[Category:%s|%s]]', cat, sort)
else
cat = string.format('[[Category:%s]]', cat)
end
self.hasCategories = true
self.categories[ns] = self.categories[ns] or {}
table.insert(self.categories[ns], cat)
end
function MessageBox:addClass(class)
if not class then
return nil
end
table.insert(self.classes, class)
end
function MessageBox:setParameters()
local args = self.args
local cfg = self.cfg
-- Get type data.
self.type = args.type
local typeData = cfg.types[self.type]
self.invalidTypeError = cfg.showInvalidTypeError
and self.type
and not typeData
typeData = typeData or cfg.types[cfg.default]
self.typeClass = typeData.class
self.typeImage = typeData.image
self.typeImageNeedsLink = typeData.imageNeedsLink
-- Find if the box has been wrongly substituted.
self.isSubstituted = cfg.substCheck and args.subst == 'SUBST'
-- Find whether we are using a small message box.
self.isSmall = cfg.allowSmall and (
cfg.smallParam and args.small == cfg.smallParam
or not cfg.smallParam and yesno(args.small)
)
-- Set the below row.
self.below = cfg.below and args.below
-- Add attributes, classes and styles.
self.id = args.id
self.name = args.name
if self.name then
self:addClass('box-' .. string.gsub(self.name,' ','_'))
end
if yesno(args.plainlinks) ~= false then
self:addClass('plainlinks')
end
if self.below then
self:addClass('mbox-with-below')
end
for _, class in ipairs(cfg.classes or {}) do
self:addClass(class)
end
if self.isSmall then
self:addClass(cfg.smallClass or 'mbox-small')
end
self:addClass(self.typeClass)
self:addClass(args.class)
self.style = args.style
self.attrs = args.attrs
-- Set text style.
self.textstyle = args.textstyle
-- Set image classes.
self.imageRightClass = args.imagerightclass or args.imageclass
self.imageLeftClass = args.imageleftclass or args.imageclass
-- Find if we are on the template page or not. This functionality is only
-- used if useCollapsibleTextFields is set, or if both cfg.templateCategory
-- and cfg.templateCategoryRequireName are set.
self.useCollapsibleTextFields = cfg.useCollapsibleTextFields
if self.useCollapsibleTextFields
or cfg.templateCategory
and cfg.templateCategoryRequireName
then
if self.name then
local templateName = mw.ustring.match(
self.name,
'^[tT][eE][mM][pP][lL][aA][tT][eE][%s_]*:[%s_]*(.*)$'
) or self.name
templateName = 'Template:' .. templateName
self.templateTitle = getTitleObject(templateName)
end
self.isTemplatePage = self.templateTitle
and mw.title.equals(self.title, self.templateTitle)
end
-- Process data for collapsible text fields. At the moment these are only
-- used in {{ambox}}.
if self.useCollapsibleTextFields then
-- Get the self.issue value.
if self.isSmall and args.smalltext then
self.issue = args.smalltext
else
local sect
if args.sect == '' then
sect = 'This ' .. (cfg.sectionDefault or 'page')
elseif type(args.sect) == 'string' then
sect = 'This ' .. args.sect
end
local issue = args.issue
issue = type(issue) == 'string' and issue ~= '' and issue or nil
local text = args.text
text = type(text) == 'string' and text or nil
local issues = {}
table.insert(issues, sect)
table.insert(issues, issue)
table.insert(issues, text)
self.issue = table.concat(issues, ' ')
end
-- Get the self.talk value.
local talk = args.talk
-- Show talk links on the template page or template subpages if the talk
-- parameter is blank.
if talk == ''
and self.templateTitle
and (
mw.title.equals(self.templateTitle, self.title)
or self.title:isSubpageOf(self.templateTitle)
)
then
talk = '#'
elseif talk == '' then
talk = nil
end
if talk then
-- If the talk value is a talk page, make a link to that page. Else
-- assume that it's a section heading, and make a link to the talk
-- page of the current page with that section heading.
local talkTitle = getTitleObject(talk)
local talkArgIsTalkPage = true
if not talkTitle or not talkTitle.isTalkPage then
talkArgIsTalkPage = false
talkTitle = getTitleObject(
self.title.text,
mw.site.namespaces[self.title.namespace].talk.id
)
end
if talkTitle and talkTitle.exists then
local talkText
if self.isSmall then
local talkLink = talkArgIsTalkPage and talk or (talkTitle.prefixedText .. (talk == '#' and '' or '#') .. talk)
talkText = string.format('([[%s|talk]])', talkLink)
else
talkText = 'Relevant discussion may be found on'
if talkArgIsTalkPage then
talkText = string.format(
'%s [[%s|%s]].',
talkText,
talk,
talkTitle.prefixedText
)
else
talkText = string.format(
'%s the [[%s' .. (talk == '#' and '' or '#') .. '%s|talk page]].',
talkText,
talkTitle.prefixedText,
talk
)
end
end
self.talk = talkText
end
end
-- Get other values.
self.fix = args.fix ~= '' and args.fix or nil
local date
if args.date and args.date ~= '' then
date = args.date
elseif args.date == '' and self.isTemplatePage then
date = lang:formatDate('F Y')
end
if date then
self.date = string.format(" <span class='date-container'><i>(<span class='date'>%s</span>)</i></span>", date)
end
self.info = args.info
if yesno(args.removalnotice) then
self.removalNotice = cfg.removalNotice
end
end
-- Set the non-collapsible text field. At the moment this is used by all box
-- types other than ambox, and also by ambox when small=yes.
if self.isSmall then
self.text = args.smalltext or args.text
else
self.text = args.text
end
-- General image settings.
self.imageCellDiv = not self.isSmall and cfg.imageCellDiv
self.imageEmptyCell = cfg.imageEmptyCell
-- Left image settings.
local imageLeft = self.isSmall and args.smallimage or args.image
if cfg.imageCheckBlank and imageLeft ~= 'blank' and imageLeft ~= 'none'
or not cfg.imageCheckBlank and imageLeft ~= 'none'
then
self.imageLeft = imageLeft
if not imageLeft then
local imageSize = self.isSmall
and (cfg.imageSmallSize or '30x30px')
or '40x40px'
self.imageLeft = string.format('[[File:%s|%s%s|alt=]]', self.typeImage
or 'Information icon4.svg', imageSize, self.typeImageNeedsLink and "" or "|link=" )
end
end
-- Right image settings.
local imageRight = self.isSmall and args.smallimageright or args.imageright
if not (cfg.imageRightNone and imageRight == 'none') then
self.imageRight = imageRight
end
-- set templatestyles
self.base_templatestyles = cfg.templatestyles
self.templatestyles = args.templatestyles
end
function MessageBox:setMainspaceCategories()
local args = self.args
local cfg = self.cfg
if not cfg.allowMainspaceCategories then
return nil
end
local nums = {}
for _, prefix in ipairs{'cat', 'category', 'all'} do
args[prefix .. '1'] = args[prefix]
nums = union(nums, getArgNums(args, prefix))
end
-- The following is roughly equivalent to the old {{Ambox/category}}.
local date = args.date
date = type(date) == 'string' and date
local preposition = 'from'
for _, num in ipairs(nums) do
local mainCat = args['cat' .. tostring(num)]
or args['category' .. tostring(num)]
local allCat = args['all' .. tostring(num)]
mainCat = type(mainCat) == 'string' and mainCat
allCat = type(allCat) == 'string' and allCat
if mainCat and date and date ~= '' then
local catTitle = string.format('%s %s %s', mainCat, preposition, date)
self:addCat(0, catTitle)
catTitle = getTitleObject('Category:' .. catTitle)
if not catTitle or not catTitle.exists then
self:addCat(0, 'Articles with invalid date parameter in template')
end
elseif mainCat and (not date or date == '') then
self:addCat(0, mainCat)
end
if allCat then
self:addCat(0, allCat)
end
end
end
function MessageBox:setTemplateCategories()
local args = self.args
local cfg = self.cfg
-- Add template categories.
if cfg.templateCategory then
if cfg.templateCategoryRequireName then
if self.isTemplatePage then
self:addCat(10, cfg.templateCategory)
end
elseif not self.title.isSubpage then
self:addCat(10, cfg.templateCategory)
end
end
-- Add template error categories.
if cfg.templateErrorCategory then
local templateErrorCategory = cfg.templateErrorCategory
local templateCat, templateSort
if not self.name and not self.title.isSubpage then
templateCat = templateErrorCategory
elseif self.isTemplatePage then
local paramsToCheck = cfg.templateErrorParamsToCheck or {}
local count = 0
for i, param in ipairs(paramsToCheck) do
if not args[param] then
count = count + 1
end
end
if count > 0 then
templateCat = templateErrorCategory
templateSort = tostring(count)
end
if self.categoryNums and #self.categoryNums > 0 then
templateCat = templateErrorCategory
templateSort = 'C'
end
end
self:addCat(10, templateCat, templateSort)
end
end
function MessageBox:setAllNamespaceCategories()
-- Set categories for all namespaces.
if self.invalidTypeError then
local allSort = (self.title.namespace == 0 and 'Main:' or '') .. self.title.prefixedText
self:addCat('all', 'Wikipedia message box parameter needs fixing', allSort)
end
if self.isSubstituted then
self:addCat('all', 'Pages with incorrectly substituted templates')
end
end
function MessageBox:setCategories()
if self.title.namespace == 0 then
self:setMainspaceCategories()
elseif self.title.namespace == 10 then
self:setTemplateCategories()
end
self:setAllNamespaceCategories()
end
function MessageBox:renderCategories()
if not self.hasCategories then
-- No categories added, no need to pass them to Category handler so,
-- if it was invoked, it would return the empty string.
-- So we shortcut and return the empty string.
return ""
end
-- Convert category tables to strings and pass them through
-- [[Module:Category handler]].
return require('Module:Category handler')._main{
main = table.concat(self.categories[0] or {}),
template = table.concat(self.categories[10] or {}),
all = table.concat(self.categories.all or {}),
nocat = self.args.nocat,
page = self.args.page
}
end
function MessageBox:exportDiv()
local root = mw.html.create()
-- Add the subst check error.
if self.isSubstituted and self.name then
root:tag('b')
:addClass('error')
:wikitext(string.format(
'Template <code>%s[[Template:%s|%s]]%s</code> has been incorrectly substituted.',
mw.text.nowiki('{{'), self.name, self.name, mw.text.nowiki('}}')
))
end
local frame = mw.getCurrentFrame()
root:wikitext(frame:extensionTag{
name = 'templatestyles',
args = { src = self.base_templatestyles },
})
-- Add support for a single custom templatestyles sheet. Undocumented as
-- need should be limited and many templates using mbox are substed; we
-- don't want to spread templatestyles sheets around to arbitrary places
if self.templatestyles then
root:wikitext(frame:extensionTag{
name = 'templatestyles',
args = { src = self.templatestyles },
})
end
-- Create the box.
local mbox = root:tag('div')
mbox:attr('id', self.id or nil)
for i, class in ipairs(self.classes or {}) do
mbox:addClass(class or nil)
end
mbox
:cssText(self.style or nil)
if self.attrs then
mbox:attr(self.attrs)
end
local flex_container
if self.below then
-- we need to wrap the flex components (`image(right)` and `text`) in their
-- own container div to support the `below` parameter
flex_container = mw.html.create('div')
flex_container:addClass('mbox-flex')
else
-- the mbox itself is the parent, so we need no HTML flex_container
flex_container = mw.html.create()
end
-- Add the left-hand image.
if self.imageLeft then
local imageLeftCell = flex_container:tag('div'):addClass('mbox-image')
imageLeftCell
:addClass(self.imageLeftClass)
:wikitext(self.imageLeft or nil)
end
-- Add the text.
local textCell = flex_container:tag('div'):addClass('mbox-text')
if self.useCollapsibleTextFields then
-- The message box uses advanced text parameters that allow things to be
-- collapsible. At the moment, only ambox uses this.
textCell:cssText(self.textstyle or nil)
local textCellDiv = textCell:tag('div')
textCellDiv
:addClass('mbox-text-span')
:wikitext(self.issue or nil)
if (self.talk or self.fix) then
textCellDiv:tag('span')
:addClass('hide-when-compact')
:wikitext(self.talk and (' ' .. self.talk) or nil)
:wikitext(self.fix and (' ' .. self.fix) or nil)
end
textCellDiv:wikitext(self.date and (' ' .. self.date) or nil)
if self.info and not self.isSmall then
textCellDiv
:tag('span')
:addClass('hide-when-compact')
:wikitext(self.info and (' ' .. self.info) or nil)
end
if self.removalNotice then
textCellDiv:tag('span')
:addClass('hide-when-compact')
:tag('i')
:wikitext(string.format(" (%s)", self.removalNotice))
end
else
-- Default text formatting - anything goes.
textCell
:cssText(self.textstyle or nil)
:wikitext(self.text or nil)
end
-- Add the right-hand image.
if self.imageRight then
local imageRightCell = flex_container:tag('div'):addClass('mbox-imageright')
imageRightCell
:addClass(self.imageRightClass)
:wikitext(self.imageRight or nil)
end
mbox:node(flex_container)
-- Add the below row.
if self.below then
mbox:tag('div')
:addClass('mbox-text mbox-below')
:cssText(self.textstyle or nil)
:wikitext(self.below or nil)
end
-- Add error message for invalid type parameters.
if self.invalidTypeError then
root:tag('div')
:addClass('mbox-invalid-type')
:wikitext(string.format(
'This message box is using an invalid "type=%s" parameter and needs fixing.',
self.type or ''
))
end
-- Add categories.
root:wikitext(self:renderCategories() or nil)
return tostring(root)
end
function MessageBox:export()
local root = mw.html.create()
-- Add the subst check error.
if self.isSubstituted and self.name then
root:tag('b')
:addClass('error')
:wikitext(string.format(
'Template <code>%s[[Template:%s|%s]]%s</code> has been incorrectly substituted.',
mw.text.nowiki('{{'), self.name, self.name, mw.text.nowiki('}}')
))
end
local frame = mw.getCurrentFrame()
root:wikitext(frame:extensionTag{
name = 'templatestyles',
args = { src = self.base_templatestyles },
})
-- Add support for a single custom templatestyles sheet. Undocumented as
-- need should be limited and many templates using mbox are substed; we
-- don't want to spread templatestyles sheets around to arbitrary places
if self.templatestyles then
root:wikitext(frame:extensionTag{
name = 'templatestyles',
args = { src = self.templatestyles },
})
end
-- Create the box table.
local boxTable = root:tag('table')
boxTable:attr('id', self.id or nil)
for i, class in ipairs(self.classes or {}) do
boxTable:addClass(class or nil)
end
boxTable
:cssText(self.style or nil)
:attr('role', 'presentation')
if self.attrs then
boxTable:attr(self.attrs)
end
-- Add the left-hand image.
local row = boxTable:tag('tr')
if self.imageLeft then
local imageLeftCell = row:tag('td'):addClass('mbox-image')
if self.imageCellDiv then
-- If we are using a div, redefine imageLeftCell so that the image
-- is inside it. Divs use style="width: 52px;", which limits the
-- image width to 52px. If any images in a div are wider than that,
-- they may overlap with the text or cause other display problems.
imageLeftCell = imageLeftCell:tag('div'):addClass('mbox-image-div')
end
imageLeftCell
:addClass(self.imageLeftClass)
:wikitext(self.imageLeft or nil)
elseif self.imageEmptyCell then
-- Some message boxes define an empty cell if no image is specified, and
-- some don't. The old template code in templates where empty cells are
-- specified gives the following hint: "No image. Cell with some width
-- or padding necessary for text cell to have 100% width."
row:tag('td')
:addClass('mbox-empty-cell')
end
-- Add the text.
local textCell = row:tag('td'):addClass('mbox-text')
if self.useCollapsibleTextFields then
-- The message box uses advanced text parameters that allow things to be
-- collapsible. At the moment, only ambox uses this.
textCell:cssText(self.textstyle or nil)
local textCellDiv = textCell:tag('div')
textCellDiv
:addClass('mbox-text-span')
:wikitext(self.issue or nil)
if (self.talk or self.fix) then
textCellDiv:tag('span')
:addClass('hide-when-compact')
:wikitext(self.talk and (' ' .. self.talk) or nil)
:wikitext(self.fix and (' ' .. self.fix) or nil)
end
textCellDiv:wikitext(self.date and (' ' .. self.date) or nil)
if self.info and not self.isSmall then
textCellDiv
:tag('span')
:addClass('hide-when-compact')
:wikitext(self.info and (' ' .. self.info) or nil)
end
if self.removalNotice then
textCellDiv:tag('span')
:addClass('hide-when-compact')
:tag('i')
:wikitext(string.format(" (%s)", self.removalNotice))
end
else
-- Default text formatting - anything goes.
textCell
:cssText(self.textstyle or nil)
:wikitext(self.text or nil)
end
-- Add the right-hand image.
if self.imageRight then
local imageRightCell = row:tag('td'):addClass('mbox-imageright')
if self.imageCellDiv then
-- If we are using a div, redefine imageRightCell so that the image
-- is inside it.
imageRightCell = imageRightCell:tag('div'):addClass('mbox-image-div')
end
imageRightCell
:addClass(self.imageRightClass)
:wikitext(self.imageRight or nil)
end
-- Add the below row.
if self.below then
boxTable:tag('tr')
:tag('td')
:attr('colspan', self.imageRight and '3' or '2')
:addClass('mbox-text')
:cssText(self.textstyle or nil)
:wikitext(self.below or nil)
end
-- Add error message for invalid type parameters.
if self.invalidTypeError then
root:tag('div')
:addClass('mbox-invalid-type')
:wikitext(string.format(
'This message box is using an invalid "type=%s" parameter and needs fixing.',
self.type or ''
))
end
-- Add categories.
root:wikitext(self:renderCategories() or nil)
return tostring(root)
end
--------------------------------------------------------------------------------
-- Exports
--------------------------------------------------------------------------------
local p, mt = {}, {}
function p._exportClasses()
-- For testing.
return {
MessageBox = MessageBox
}
end
function p.main(boxType, args, cfgTables)
local box = MessageBox.new(boxType, args, cfgTables or mw.loadData(CONFIG_MODULE))
box:setParameters()
box:setCategories()
-- DIV MIGRATION CONDITIONAL
if box.cfg.div_structure then
return box:exportDiv()
end
-- END DIV MIGRATION CONDITIONAL
return box:export()
end
function mt.__index(t, k)
return function (frame)
if not getArgs then
getArgs = require('Module:Arguments').getArgs
end
return t.main(k, getArgs(frame, {trim = false, removeBlanks = false}))
end
end
return setmetatable(p, mt)
ocboyo877qnpqum2b9fyiquh72vukqa
802675
802674
2026-07-26T19:41:55Z
SM7
3953
2 revisions imported from [[:en:Module:Message_box]]
802674
Scribunto
text/plain
require('strict')
local getArgs
local yesno = require('Module:Yesno')
local lang = mw.language.getContentLanguage()
local CONFIG_MODULE = 'Module:Message box/configuration'
local DEMOSPACES = {talk = 'tmbox', image = 'imbox', file = 'imbox', category = 'cmbox', article = 'ambox', main = 'ambox'}
--------------------------------------------------------------------------------
-- Helper functions
--------------------------------------------------------------------------------
local function getTitleObject(...)
-- Get the title object, passing the function through pcall
-- in case we are over the expensive function count limit.
local success, title = pcall(mw.title.new, ...)
if success then
return title
end
end
local function union(t1, t2)
-- Returns the union of two arrays.
local vals = {}
for i, v in ipairs(t1) do
vals[v] = true
end
for i, v in ipairs(t2) do
vals[v] = true
end
local ret = {}
for k in pairs(vals) do
table.insert(ret, k)
end
table.sort(ret)
return ret
end
local function getArgNums(args, prefix)
local nums = {}
for k, v in pairs(args) do
local num = mw.ustring.match(tostring(k), '^' .. prefix .. '([1-9]%d*)$')
if num then
table.insert(nums, tonumber(num))
end
end
table.sort(nums)
return nums
end
--------------------------------------------------------------------------------
-- Box class definition
--------------------------------------------------------------------------------
local MessageBox = {}
MessageBox.__index = MessageBox
function MessageBox.new(boxType, args, cfg)
args = args or {}
local obj = {}
-- Set the title object and the namespace.
obj.title = getTitleObject(args.page) or mw.title.getCurrentTitle()
-- Set the config for our box type.
obj.cfg = cfg[boxType]
if not obj.cfg then
local ns = obj.title.namespace
-- boxType is "mbox" or invalid input
if args.demospace and args.demospace ~= '' then
-- implement demospace parameter of mbox
local demospace = string.lower(args.demospace)
if DEMOSPACES[demospace] then
-- use template from DEMOSPACES
obj.cfg = cfg[DEMOSPACES[demospace]]
elseif string.find( demospace, 'talk' ) then
-- demo as a talk page
obj.cfg = cfg.tmbox
else
-- default to ombox
obj.cfg = cfg.ombox
end
elseif ns == 0 then
obj.cfg = cfg.ambox -- main namespace
elseif ns == 6 then
obj.cfg = cfg.imbox -- file namespace
elseif ns == 14 then
obj.cfg = cfg.cmbox -- category namespace
else
local nsTable = mw.site.namespaces[ns]
if nsTable and nsTable.isTalk then
obj.cfg = cfg.tmbox -- any talk namespace
else
obj.cfg = cfg.ombox -- other namespaces or invalid input
end
end
end
-- Set the arguments, and remove all blank arguments except for the ones
-- listed in cfg.allowBlankParams.
do
local newArgs = {}
for k, v in pairs(args) do
if v ~= '' then
newArgs[k] = v
end
end
for i, param in ipairs(obj.cfg.allowBlankParams or {}) do
newArgs[param] = args[param]
end
obj.args = newArgs
end
-- Define internal data structure.
obj.categories = {}
obj.classes = {}
-- For lazy loading of [[Module:Category handler]].
obj.hasCategories = false
return setmetatable(obj, MessageBox)
end
function MessageBox:addCat(ns, cat, sort)
if not cat then
return nil
end
if sort then
cat = string.format('[[Category:%s|%s]]', cat, sort)
else
cat = string.format('[[Category:%s]]', cat)
end
self.hasCategories = true
self.categories[ns] = self.categories[ns] or {}
table.insert(self.categories[ns], cat)
end
function MessageBox:addClass(class)
if not class then
return nil
end
table.insert(self.classes, class)
end
function MessageBox:setParameters()
local args = self.args
local cfg = self.cfg
-- Get type data.
self.type = args.type
local typeData = cfg.types[self.type]
self.invalidTypeError = cfg.showInvalidTypeError
and self.type
and not typeData
typeData = typeData or cfg.types[cfg.default]
self.typeClass = typeData.class
self.typeImage = typeData.image
self.typeImageNeedsLink = typeData.imageNeedsLink
-- Find if the box has been wrongly substituted.
self.isSubstituted = cfg.substCheck and args.subst == 'SUBST'
-- Find whether we are using a small message box.
self.isSmall = cfg.allowSmall and (
cfg.smallParam and args.small == cfg.smallParam
or not cfg.smallParam and yesno(args.small)
)
-- Set the below row.
self.below = cfg.below and args.below
-- Add attributes, classes and styles.
self.id = args.id
self.name = args.name
if self.name then
self:addClass('box-' .. string.gsub(self.name,' ','_'))
end
if yesno(args.plainlinks) ~= false then
self:addClass('plainlinks')
end
if self.below then
self:addClass('mbox-with-below')
end
for _, class in ipairs(cfg.classes or {}) do
self:addClass(class)
end
if self.isSmall then
self:addClass(cfg.smallClass or 'mbox-small')
end
self:addClass(self.typeClass)
self:addClass(args.class)
self.style = args.style
self.attrs = args.attrs
-- Set text style.
self.textstyle = args.textstyle
-- Set image classes.
self.imageRightClass = args.imagerightclass or args.imageclass
self.imageLeftClass = args.imageleftclass or args.imageclass
-- Find if we are on the template page or not. This functionality is only
-- used if useCollapsibleTextFields is set, or if both cfg.templateCategory
-- and cfg.templateCategoryRequireName are set.
self.useCollapsibleTextFields = cfg.useCollapsibleTextFields
if self.useCollapsibleTextFields
or cfg.templateCategory
and cfg.templateCategoryRequireName
then
if self.name then
local templateName = mw.ustring.match(
self.name,
'^[tT][eE][mM][pP][lL][aA][tT][eE][%s_]*:[%s_]*(.*)$'
) or self.name
templateName = 'Template:' .. templateName
self.templateTitle = getTitleObject(templateName)
end
self.isTemplatePage = self.templateTitle
and mw.title.equals(self.title, self.templateTitle)
end
-- Process data for collapsible text fields. At the moment these are only
-- used in {{ambox}}.
if self.useCollapsibleTextFields then
-- Get the self.issue value.
if self.isSmall and args.smalltext then
self.issue = args.smalltext
else
local sect
if args.sect == '' then
sect = 'This ' .. (cfg.sectionDefault or 'page')
elseif type(args.sect) == 'string' then
sect = 'This ' .. args.sect
end
local issue = args.issue
issue = type(issue) == 'string' and issue ~= '' and issue or nil
local text = args.text
text = type(text) == 'string' and text or nil
local issues = {}
table.insert(issues, sect)
table.insert(issues, issue)
table.insert(issues, text)
self.issue = table.concat(issues, ' ')
end
-- Get the self.talk value.
local talk = args.talk
-- Show talk links on the template page or template subpages if the talk
-- parameter is blank.
if talk == ''
and self.templateTitle
and (
mw.title.equals(self.templateTitle, self.title)
or self.title:isSubpageOf(self.templateTitle)
)
then
talk = '#'
elseif talk == '' then
talk = nil
end
if talk then
-- If the talk value is a talk page, make a link to that page. Else
-- assume that it's a section heading, and make a link to the talk
-- page of the current page with that section heading.
local talkTitle = getTitleObject(talk)
local talkArgIsTalkPage = true
if not talkTitle or not talkTitle.isTalkPage then
talkArgIsTalkPage = false
talkTitle = getTitleObject(
self.title.text,
mw.site.namespaces[self.title.namespace].talk.id
)
end
if talkTitle and talkTitle.exists then
local talkText
if self.isSmall then
local talkLink = talkArgIsTalkPage and talk or (talkTitle.prefixedText .. (talk == '#' and '' or '#') .. talk)
talkText = string.format('([[%s|talk]])', talkLink)
else
talkText = 'Relevant discussion may be found on'
if talkArgIsTalkPage then
talkText = string.format(
'%s [[%s|%s]].',
talkText,
talk,
talkTitle.prefixedText
)
else
talkText = string.format(
'%s the [[%s' .. (talk == '#' and '' or '#') .. '%s|talk page]].',
talkText,
talkTitle.prefixedText,
talk
)
end
end
self.talk = talkText
end
end
-- Get other values.
self.fix = args.fix ~= '' and args.fix or nil
local date
if args.date and args.date ~= '' then
date = args.date
elseif args.date == '' and self.isTemplatePage then
date = lang:formatDate('F Y')
end
if date then
self.date = string.format(" <span class='date-container'><i>(<span class='date'>%s</span>)</i></span>", date)
end
self.info = args.info
if yesno(args.removalnotice) then
self.removalNotice = cfg.removalNotice
end
end
-- Set the non-collapsible text field. At the moment this is used by all box
-- types other than ambox, and also by ambox when small=yes.
if self.isSmall then
self.text = args.smalltext or args.text
else
self.text = args.text
end
-- General image settings.
self.imageCellDiv = not self.isSmall and cfg.imageCellDiv
self.imageEmptyCell = cfg.imageEmptyCell
-- Left image settings.
local imageLeft = self.isSmall and args.smallimage or args.image
if cfg.imageCheckBlank and imageLeft ~= 'blank' and imageLeft ~= 'none'
or not cfg.imageCheckBlank and imageLeft ~= 'none'
then
self.imageLeft = imageLeft
if not imageLeft then
local imageSize = self.isSmall
and (cfg.imageSmallSize or '30x30px')
or '40x40px'
self.imageLeft = string.format('[[File:%s|%s%s|alt=]]', self.typeImage
or 'Information icon4.svg', imageSize, self.typeImageNeedsLink and "" or "|link=" )
end
end
-- Right image settings.
local imageRight = self.isSmall and args.smallimageright or args.imageright
if not (cfg.imageRightNone and imageRight == 'none') then
self.imageRight = imageRight
end
-- set templatestyles
self.base_templatestyles = cfg.templatestyles
self.templatestyles = args.templatestyles
end
function MessageBox:setMainspaceCategories()
local args = self.args
local cfg = self.cfg
if not cfg.allowMainspaceCategories then
return nil
end
local nums = {}
for _, prefix in ipairs{'cat', 'category', 'all'} do
args[prefix .. '1'] = args[prefix]
nums = union(nums, getArgNums(args, prefix))
end
-- The following is roughly equivalent to the old {{Ambox/category}}.
local date = args.date
date = type(date) == 'string' and date
local preposition = 'from'
for _, num in ipairs(nums) do
local mainCat = args['cat' .. tostring(num)]
or args['category' .. tostring(num)]
local allCat = args['all' .. tostring(num)]
mainCat = type(mainCat) == 'string' and mainCat
allCat = type(allCat) == 'string' and allCat
if mainCat and date and date ~= '' then
local catTitle = string.format('%s %s %s', mainCat, preposition, date)
self:addCat(0, catTitle)
catTitle = getTitleObject('Category:' .. catTitle)
if not catTitle or not catTitle.exists then
self:addCat(0, 'Articles with invalid date parameter in template')
end
elseif mainCat and (not date or date == '') then
self:addCat(0, mainCat)
end
if allCat then
self:addCat(0, allCat)
end
end
end
function MessageBox:setTemplateCategories()
local args = self.args
local cfg = self.cfg
-- Add template categories.
if cfg.templateCategory then
if cfg.templateCategoryRequireName then
if self.isTemplatePage then
self:addCat(10, cfg.templateCategory)
end
elseif not self.title.isSubpage then
self:addCat(10, cfg.templateCategory)
end
end
-- Add template error categories.
if cfg.templateErrorCategory then
local templateErrorCategory = cfg.templateErrorCategory
local templateCat, templateSort
if not self.name and not self.title.isSubpage then
templateCat = templateErrorCategory
elseif self.isTemplatePage then
local paramsToCheck = cfg.templateErrorParamsToCheck or {}
local count = 0
for i, param in ipairs(paramsToCheck) do
if not args[param] then
count = count + 1
end
end
if count > 0 then
templateCat = templateErrorCategory
templateSort = tostring(count)
end
if self.categoryNums and #self.categoryNums > 0 then
templateCat = templateErrorCategory
templateSort = 'C'
end
end
self:addCat(10, templateCat, templateSort)
end
end
function MessageBox:setAllNamespaceCategories()
-- Set categories for all namespaces.
if self.invalidTypeError then
local allSort = (self.title.namespace == 0 and 'Main:' or '') .. self.title.prefixedText
self:addCat('all', 'Wikipedia message box parameter needs fixing', allSort)
end
if self.isSubstituted then
self:addCat('all', 'Pages with incorrectly substituted templates')
end
end
function MessageBox:setCategories()
if self.title.namespace == 0 then
self:setMainspaceCategories()
elseif self.title.namespace == 10 then
self:setTemplateCategories()
end
self:setAllNamespaceCategories()
end
function MessageBox:renderCategories()
if not self.hasCategories then
-- No categories added, no need to pass them to Category handler so,
-- if it was invoked, it would return the empty string.
-- So we shortcut and return the empty string.
return ""
end
-- Convert category tables to strings and pass them through
-- [[Module:Category handler]].
return require('Module:Category handler')._main{
main = table.concat(self.categories[0] or {}),
template = table.concat(self.categories[10] or {}),
all = table.concat(self.categories.all or {}),
nocat = self.args.nocat,
page = self.args.page
}
end
function MessageBox:exportDiv()
local root = mw.html.create()
-- Add the subst check error.
if self.isSubstituted and self.name then
root:tag('b')
:addClass('error')
:wikitext(string.format(
'Template <code>%s[[Template:%s|%s]]%s</code> has been incorrectly substituted.',
mw.text.nowiki('{{'), self.name, self.name, mw.text.nowiki('}}')
))
end
local frame = mw.getCurrentFrame()
root:wikitext(frame:extensionTag{
name = 'templatestyles',
args = { src = self.base_templatestyles },
})
-- Add support for a single custom templatestyles sheet. Undocumented as
-- need should be limited and many templates using mbox are substed; we
-- don't want to spread templatestyles sheets around to arbitrary places
if self.templatestyles then
root:wikitext(frame:extensionTag{
name = 'templatestyles',
args = { src = self.templatestyles },
})
end
-- Create the box.
local mbox = root:tag('div')
mbox:attr('id', self.id or nil)
for i, class in ipairs(self.classes or {}) do
mbox:addClass(class or nil)
end
mbox
:cssText(self.style or nil)
if self.attrs then
mbox:attr(self.attrs)
end
local flex_container
if self.below then
-- we need to wrap the flex components (`image(right)` and `text`) in their
-- own container div to support the `below` parameter
flex_container = mw.html.create('div')
flex_container:addClass('mbox-flex')
else
-- the mbox itself is the parent, so we need no HTML flex_container
flex_container = mw.html.create()
end
-- Add the left-hand image.
if self.imageLeft then
local imageLeftCell = flex_container:tag('div'):addClass('mbox-image')
imageLeftCell
:addClass(self.imageLeftClass)
:wikitext(self.imageLeft or nil)
end
-- Add the text.
local textCell = flex_container:tag('div'):addClass('mbox-text')
if self.useCollapsibleTextFields then
-- The message box uses advanced text parameters that allow things to be
-- collapsible. At the moment, only ambox uses this.
textCell:cssText(self.textstyle or nil)
local textCellDiv = textCell:tag('div')
textCellDiv
:addClass('mbox-text-span')
:wikitext(self.issue or nil)
if (self.talk or self.fix) then
textCellDiv:tag('span')
:addClass('hide-when-compact')
:wikitext(self.talk and (' ' .. self.talk) or nil)
:wikitext(self.fix and (' ' .. self.fix) or nil)
end
textCellDiv:wikitext(self.date and (' ' .. self.date) or nil)
if self.info and not self.isSmall then
textCellDiv
:tag('span')
:addClass('hide-when-compact')
:wikitext(self.info and (' ' .. self.info) or nil)
end
if self.removalNotice then
textCellDiv:tag('span')
:addClass('hide-when-compact')
:tag('i')
:wikitext(string.format(" (%s)", self.removalNotice))
end
else
-- Default text formatting - anything goes.
textCell
:cssText(self.textstyle or nil)
:wikitext(self.text or nil)
end
-- Add the right-hand image.
if self.imageRight then
local imageRightCell = flex_container:tag('div'):addClass('mbox-imageright')
imageRightCell
:addClass(self.imageRightClass)
:wikitext(self.imageRight or nil)
end
mbox:node(flex_container)
-- Add the below row.
if self.below then
mbox:tag('div')
:addClass('mbox-text mbox-below')
:cssText(self.textstyle or nil)
:wikitext(self.below or nil)
end
-- Add error message for invalid type parameters.
if self.invalidTypeError then
root:tag('div')
:addClass('mbox-invalid-type')
:wikitext(string.format(
'This message box is using an invalid "type=%s" parameter and needs fixing.',
self.type or ''
))
end
-- Add categories.
root:wikitext(self:renderCategories() or nil)
return tostring(root)
end
function MessageBox:export()
local root = mw.html.create()
-- Add the subst check error.
if self.isSubstituted and self.name then
root:tag('b')
:addClass('error')
:wikitext(string.format(
'Template <code>%s[[Template:%s|%s]]%s</code> has been incorrectly substituted.',
mw.text.nowiki('{{'), self.name, self.name, mw.text.nowiki('}}')
))
end
local frame = mw.getCurrentFrame()
root:wikitext(frame:extensionTag{
name = 'templatestyles',
args = { src = self.base_templatestyles },
})
-- Add support for a single custom templatestyles sheet. Undocumented as
-- need should be limited and many templates using mbox are substed; we
-- don't want to spread templatestyles sheets around to arbitrary places
if self.templatestyles then
root:wikitext(frame:extensionTag{
name = 'templatestyles',
args = { src = self.templatestyles },
})
end
-- Create the box table.
local boxTable = root:tag('table')
boxTable:attr('id', self.id or nil)
for i, class in ipairs(self.classes or {}) do
boxTable:addClass(class or nil)
end
boxTable
:cssText(self.style or nil)
:attr('role', 'presentation')
if self.attrs then
boxTable:attr(self.attrs)
end
-- Add the left-hand image.
local row = boxTable:tag('tr')
if self.imageLeft then
local imageLeftCell = row:tag('td'):addClass('mbox-image')
if self.imageCellDiv then
-- If we are using a div, redefine imageLeftCell so that the image
-- is inside it. Divs use style="width: 52px;", which limits the
-- image width to 52px. If any images in a div are wider than that,
-- they may overlap with the text or cause other display problems.
imageLeftCell = imageLeftCell:tag('div'):addClass('mbox-image-div')
end
imageLeftCell
:addClass(self.imageLeftClass)
:wikitext(self.imageLeft or nil)
elseif self.imageEmptyCell then
-- Some message boxes define an empty cell if no image is specified, and
-- some don't. The old template code in templates where empty cells are
-- specified gives the following hint: "No image. Cell with some width
-- or padding necessary for text cell to have 100% width."
row:tag('td')
:addClass('mbox-empty-cell')
end
-- Add the text.
local textCell = row:tag('td'):addClass('mbox-text')
if self.useCollapsibleTextFields then
-- The message box uses advanced text parameters that allow things to be
-- collapsible. At the moment, only ambox uses this.
textCell:cssText(self.textstyle or nil)
local textCellDiv = textCell:tag('div')
textCellDiv
:addClass('mbox-text-span')
:wikitext(self.issue or nil)
if (self.talk or self.fix) then
textCellDiv:tag('span')
:addClass('hide-when-compact')
:wikitext(self.talk and (' ' .. self.talk) or nil)
:wikitext(self.fix and (' ' .. self.fix) or nil)
end
textCellDiv:wikitext(self.date and (' ' .. self.date) or nil)
if self.info and not self.isSmall then
textCellDiv
:tag('span')
:addClass('hide-when-compact')
:wikitext(self.info and (' ' .. self.info) or nil)
end
if self.removalNotice then
textCellDiv:tag('span')
:addClass('hide-when-compact')
:tag('i')
:wikitext(string.format(" (%s)", self.removalNotice))
end
else
-- Default text formatting - anything goes.
textCell
:cssText(self.textstyle or nil)
:wikitext(self.text or nil)
end
-- Add the right-hand image.
if self.imageRight then
local imageRightCell = row:tag('td'):addClass('mbox-imageright')
if self.imageCellDiv then
-- If we are using a div, redefine imageRightCell so that the image
-- is inside it.
imageRightCell = imageRightCell:tag('div'):addClass('mbox-image-div')
end
imageRightCell
:addClass(self.imageRightClass)
:wikitext(self.imageRight or nil)
end
-- Add the below row.
if self.below then
boxTable:tag('tr')
:tag('td')
:attr('colspan', self.imageRight and '3' or '2')
:addClass('mbox-text')
:cssText(self.textstyle or nil)
:wikitext(self.below or nil)
end
-- Add error message for invalid type parameters.
if self.invalidTypeError then
root:tag('div')
:addClass('mbox-invalid-type')
:wikitext(string.format(
'This message box is using an invalid "type=%s" parameter and needs fixing.',
self.type or ''
))
end
-- Add categories.
root:wikitext(self:renderCategories() or nil)
return tostring(root)
end
--------------------------------------------------------------------------------
-- Exports
--------------------------------------------------------------------------------
local p, mt = {}, {}
function p._exportClasses()
-- For testing.
return {
MessageBox = MessageBox
}
end
function p.main(boxType, args, cfgTables)
local box = MessageBox.new(boxType, args, cfgTables or mw.loadData(CONFIG_MODULE))
box:setParameters()
box:setCategories()
-- DIV MIGRATION CONDITIONAL
if box.cfg.div_structure then
return box:exportDiv()
end
-- END DIV MIGRATION CONDITIONAL
return box:export()
end
function mt.__index(t, k)
return function (frame)
if not getArgs then
getArgs = require('Module:Arguments').getArgs
end
return t.main(k, getArgs(frame, {trim = false, removeBlanks = false}))
end
end
return setmetatable(p, mt)
ocboyo877qnpqum2b9fyiquh72vukqa
Module:Effective protection level
828
15973
802670
778598
2025-09-25T02:35:06Z
en>Pppery
0
Handle gadget page
802670
Scribunto
text/plain
local p = {}
-- Returns the permission required to perform a given action on a given title.
-- If no title is specified, the title of the page being displayed is used.
function p._main(action, pagename)
local title
if type(pagename) == 'table' and pagename.prefixedText then
title = pagename
elseif pagename then
title = mw.title.new(pagename)
else
title = mw.title.getCurrentTitle()
end
pagename = title.prefixedText
if action == 'autoreview' then
local level = mw.ext.FlaggedRevs.getStabilitySettings(title)
level = level and level.autoreview
if level == 'review' then
return 'reviewer'
elseif level ~= '' then
return level
else
return nil -- not '*'. a page not being PC-protected is distinct from it being PC-protected with anyone able to review. also not '', as that would mean PC-protected but nobody can review
end
elseif action ~= 'edit' and action ~= 'move' and action ~= 'create' and action ~= 'upload' and action ~= 'undelete' then
error( 'First parameter must be one of edit, move, create, upload, undelete, autoreview', 2 )
end
if title.namespace == 8 then -- MediaWiki namespace
if title.text:sub(-3) == '.js' or title.text:sub(-4) == '.css' or title.contentModel == 'javascript' or title.contentModel == 'css' then -- site JS or CSS page
return 'interfaceadmin'
elseif title.baseText == "Gadgets-definition" then
return 'interfaceadmin'
else -- any non-JS/CSS MediaWiki page
return 'sysop'
end
elseif title.namespace == 2 and title.isSubpage then
if title.contentModel == 'javascript' or title.contentModel == 'css' then -- user JS or CSS page
return 'interfaceadmin'
elseif title.contentModel == 'json' then -- user JSON page
return 'sysop'
end
end
if action == 'undelete' then
return 'sysop'
end
local level = title.protectionLevels[action] and title.protectionLevels[action][1]
if level == 'sysop' or level == 'editprotected' then
return 'sysop'
elseif title.cascadingProtection.restrictions[action] and title.cascadingProtection.restrictions[action][1] then -- used by a cascading-protected page
return 'sysop'
elseif level == 'templateeditor' then
return 'templateeditor'
elseif action == 'move' then
local blacklistentry = mw.ext.TitleBlacklist.test('edit', pagename) -- Testing action edit is correct, since this is for the source page. The target page name gets tested with action move.
if blacklistentry and not blacklistentry.params.autoconfirmed then
return 'templateeditor'
elseif title.namespace == 6 then
return 'filemover'
elseif level == 'extendedconfirmed' then
return 'extendedconfirmed'
else
return 'autoconfirmed'
end
end
local blacklistentry = mw.ext.TitleBlacklist.test(action, pagename)
if blacklistentry then
if not blacklistentry.params.autoconfirmed then
return 'templateeditor'
elseif level == 'extendedconfirmed' then
return 'extendedconfirmed'
else
return 'autoconfirmed'
end
elseif level == 'editsemiprotected' then -- create-semiprotected pages return this for some reason
return 'autoconfirmed'
elseif level then
return level
elseif action == 'upload' then
return 'autoconfirmed'
elseif action == 'create' and title.namespace % 2 == 0 and title.namespace ~= 118 then -- You need to be registered, but not autoconfirmed, to create non-talk pages other than drafts
if title.namespace == 0 then
return 'autoconfirmed' -- Per [[WP:ACPERM]], you need to be autoconfirmed to create pages in mainspace
end
return 'user'
else
return '*'
end
end
setmetatable(p, { __index = function(t, k)
return function(frame)
return t._main(k, frame.args[1])
end
end })
return p
nacj9lsnya0896kpkyuy2onbc6mm6xw
802671
802670
2026-07-26T19:35:24Z
SM7
3953
1 revision imported from [[:en:Module:Effective_protection_level]]
802670
Scribunto
text/plain
local p = {}
-- Returns the permission required to perform a given action on a given title.
-- If no title is specified, the title of the page being displayed is used.
function p._main(action, pagename)
local title
if type(pagename) == 'table' and pagename.prefixedText then
title = pagename
elseif pagename then
title = mw.title.new(pagename)
else
title = mw.title.getCurrentTitle()
end
pagename = title.prefixedText
if action == 'autoreview' then
local level = mw.ext.FlaggedRevs.getStabilitySettings(title)
level = level and level.autoreview
if level == 'review' then
return 'reviewer'
elseif level ~= '' then
return level
else
return nil -- not '*'. a page not being PC-protected is distinct from it being PC-protected with anyone able to review. also not '', as that would mean PC-protected but nobody can review
end
elseif action ~= 'edit' and action ~= 'move' and action ~= 'create' and action ~= 'upload' and action ~= 'undelete' then
error( 'First parameter must be one of edit, move, create, upload, undelete, autoreview', 2 )
end
if title.namespace == 8 then -- MediaWiki namespace
if title.text:sub(-3) == '.js' or title.text:sub(-4) == '.css' or title.contentModel == 'javascript' or title.contentModel == 'css' then -- site JS or CSS page
return 'interfaceadmin'
elseif title.baseText == "Gadgets-definition" then
return 'interfaceadmin'
else -- any non-JS/CSS MediaWiki page
return 'sysop'
end
elseif title.namespace == 2 and title.isSubpage then
if title.contentModel == 'javascript' or title.contentModel == 'css' then -- user JS or CSS page
return 'interfaceadmin'
elseif title.contentModel == 'json' then -- user JSON page
return 'sysop'
end
end
if action == 'undelete' then
return 'sysop'
end
local level = title.protectionLevels[action] and title.protectionLevels[action][1]
if level == 'sysop' or level == 'editprotected' then
return 'sysop'
elseif title.cascadingProtection.restrictions[action] and title.cascadingProtection.restrictions[action][1] then -- used by a cascading-protected page
return 'sysop'
elseif level == 'templateeditor' then
return 'templateeditor'
elseif action == 'move' then
local blacklistentry = mw.ext.TitleBlacklist.test('edit', pagename) -- Testing action edit is correct, since this is for the source page. The target page name gets tested with action move.
if blacklistentry and not blacklistentry.params.autoconfirmed then
return 'templateeditor'
elseif title.namespace == 6 then
return 'filemover'
elseif level == 'extendedconfirmed' then
return 'extendedconfirmed'
else
return 'autoconfirmed'
end
end
local blacklistentry = mw.ext.TitleBlacklist.test(action, pagename)
if blacklistentry then
if not blacklistentry.params.autoconfirmed then
return 'templateeditor'
elseif level == 'extendedconfirmed' then
return 'extendedconfirmed'
else
return 'autoconfirmed'
end
elseif level == 'editsemiprotected' then -- create-semiprotected pages return this for some reason
return 'autoconfirmed'
elseif level then
return level
elseif action == 'upload' then
return 'autoconfirmed'
elseif action == 'create' and title.namespace % 2 == 0 and title.namespace ~= 118 then -- You need to be registered, but not autoconfirmed, to create non-talk pages other than drafts
if title.namespace == 0 then
return 'autoconfirmed' -- Per [[WP:ACPERM]], you need to be autoconfirmed to create pages in mainspace
end
return 'user'
else
return '*'
end
end
setmetatable(p, { __index = function(t, k)
return function(frame)
return t._main(k, frame.args[1])
end
end })
return p
nacj9lsnya0896kpkyuy2onbc6mm6xw
Module:File link
828
15974
802669
778602
2026-07-26T19:32:32Z
SM7
3953
Template → टेम्पलेट
802669
Scribunto
text/plain
-- This module provides a library for formatting file wikilinks.
local yesno = require('Module:Yesno')
local checkType = require('libraryUtil').checkType
local p = {}
function p._main(args)
checkType('_main', 1, args, 'table')
-- This is basically libraryUtil.checkTypeForNamedArg, but we are rolling our
-- own function to get the right error level.
local function checkArg(key, val, level)
if type(val) ~= 'string' then
error(string.format(
"type error in '%s' parameter of '_main' (expected string, got %s)",
key, type(val)
), level)
end
end
local ret = {}
-- Adds a positional parameter to the buffer.
local function addPositional(key)
local val = args[key]
if not val then
return nil
end
checkArg(key, val, 4)
ret[#ret + 1] = val
end
-- Adds a named parameter to the buffer. We assume that the parameter name
-- is the same as the argument key.
local function addNamed(key)
local val = args[key]
if not val then
return nil
end
checkArg(key, val, 4)
ret[#ret + 1] = key .. '=' .. val
end
-- Filename
checkArg('file', args.file, 3)
ret[#ret + 1] = 'File:' .. args.file
-- Format
if args.format then
checkArg('format', args.format)
if args.formatfile then
checkArg('formatfile', args.formatfile)
ret[#ret + 1] = args.format .. '=' .. args.formatfile
else
ret[#ret + 1] = args.format
end
end
-- Border
if yesno(args.border) then
ret[#ret + 1] = 'border'
end
addPositional('location')
addPositional('alignment')
addPositional('size')
addNamed('upright')
addNamed('link')
addNamed('alt')
addNamed('page')
addNamed('class')
addNamed('lang')
addNamed('start')
addNamed('end')
addNamed('thumbtime')
addPositional('caption')
return string.format('[[%s]]', table.concat(ret, '|'))
end
function p.main(frame)
local origArgs = require('Module:Arguments').getArgs(frame, {
wrappers = 'टेम्पलेट:File link'
})
if not origArgs.file then
error("'file' parameter missing from [[टेम्पलेट:File link]]", 0)
end
-- Copy the arguments that were passed to a new table to avoid looking up
-- every possible parameter in the frame object.
local args = {}
for k, v in pairs(origArgs) do
-- Make _BLANK a special argument to add a blank parameter. For use in
-- conditional templates etc. it is useful for blank arguments to be
-- ignored, but we still need a way to specify them so that we can do
-- things like [[File:Example.png|link=]].
if v == '_BLANK' then
v = ''
end
args[k] = v
end
return p._main(args)
end
return p
p8jkxhr11d5p97nww0qdub38wdgna7m
Module:Message box/configuration
828
15975
802676
782028
2025-10-02T20:19:37Z
en>Izno
0
div cmbox
802676
Scribunto
text/plain
--------------------------------------------------------------------------------
-- Message box configuration --
-- --
-- This module contains configuration data for [[Module:Message box]]. --
--------------------------------------------------------------------------------
return {
ambox = {
types = {
speedy = {
class = 'ambox-speedy',
image = 'Ambox warning pn.svg'
},
delete = {
class = 'ambox-delete',
image = 'Ambox warning pn.svg'
},
content = {
class = 'ambox-content',
image = 'Ambox important.svg'
},
style = {
class = 'ambox-style',
image = 'Edit-clear.svg'
},
move = {
class = 'ambox-move',
image = 'Merge-split-transwiki default.svg'
},
protection = {
class = 'ambox-protection',
image = 'Semi-protection-shackle-keyhole.svg'
},
notice = {
class = 'ambox-notice',
image = 'Information icon4.svg'
}
},
default = 'notice',
allowBlankParams = {'talk', 'sect', 'date', 'issue', 'fix', 'subst', 'hidden'},
allowSmall = true,
smallParam = 'left',
smallClass = 'mbox-small-left',
substCheck = true,
classes = {'metadata', 'ambox'},
imageEmptyCell = true,
imageCheckBlank = true,
imageSmallSize = '20x20px',
imageCellDiv = true,
useCollapsibleTextFields = true,
imageRightNone = true,
sectionDefault = 'article',
allowMainspaceCategories = true,
templateCategory = 'Article message templates',
templateCategoryRequireName = true,
templateErrorCategory = 'Article message templates with missing parameters',
templateErrorParamsToCheck = {'issue', 'fix', 'subst'},
removalNotice = '<small>[[Help:Maintenance template removal|Learn how and when to remove this message]]</small>',
templatestyles = 'Module:Message box/ambox.css'
},
cmbox = {
types = {
speedy = {
class = 'cmbox-speedy',
image = 'Ambox warning pn.svg'
},
delete = {
class = 'cmbox-delete',
image = 'Ambox warning pn.svg'
},
content = {
class = 'cmbox-content',
image = 'Ambox important.svg'
},
style = {
class = 'cmbox-style',
image = 'Edit-clear.svg'
},
move = {
class = 'cmbox-move',
image = 'Merge-split-transwiki default.svg'
},
protection = {
class = 'cmbox-protection',
image = 'Semi-protection-shackle-keyhole.svg'
},
notice = {
class = 'cmbox-notice',
image = 'Information icon4.svg'
}
},
default = 'notice',
showInvalidTypeError = true,
classes = {'cmbox'},
imageEmptyCell = true,
templatestyles = 'Module:Message box/cmbox.css',
div_structure = true,
},
fmbox = {
types = {
warning = {
class = 'fmbox-warning',
image = 'Ambox warning pn.svg'
},
editnotice = {
class = 'fmbox-editnotice',
image = 'Information icon4.svg'
},
system = {
class = 'fmbox-system',
image = 'Information icon4.svg'
}
},
default = 'system',
showInvalidTypeError = true,
classes = {'fmbox'},
imageEmptyCell = false,
imageRightNone = false,
templatestyles = 'Module:Message box/fmbox.css'
},
imbox = {
types = {
speedy = {
class = 'imbox-speedy',
image = 'Ambox warning pn.svg'
},
delete = {
class = 'imbox-delete',
image = 'Ambox warning pn.svg'
},
content = {
class = 'imbox-content',
image = 'Ambox important.svg'
},
style = {
class = 'imbox-style',
image = 'Edit-clear.svg'
},
move = {
class = 'imbox-move',
image = 'Merge-split-transwiki default.svg'
},
protection = {
class = 'imbox-protection',
image = 'Semi-protection-shackle-keyhole.svg'
},
license = {
class = 'imbox-license licensetpl',
image = 'Imbox-license.svg'
},
["license-related"] = {
class = 'imbox-license',
image = 'Imbox-license.svg'
},
featured = {
class = 'imbox-featured',
image = 'Cscr-featured.svg',
imageNeedsLink = true
},
notice = {
class = 'imbox-notice',
image = 'Information icon4.svg'
}
},
default = 'notice',
showInvalidTypeError = true,
classes = {'imbox'},
imageEmptyCell = true,
below = true,
templateCategory = 'File message boxes',
templatestyles = 'Module:Message box/imbox.css'
},
ombox = {
types = {
speedy = {
class = 'ombox-speedy',
image = 'Ambox warning pn.svg'
},
delete = {
class = 'ombox-delete',
image = 'Ambox warning pn.svg'
},
content = {
class = 'ombox-content',
image = 'Ambox important.svg'
},
style = {
class = 'ombox-style',
image = 'Edit-clear.svg'
},
move = {
class = 'ombox-move',
image = 'Merge-split-transwiki default.svg'
},
protection = {
class = 'ombox-protection',
image = 'Semi-protection-shackle-keyhole.svg'
},
notice = {
class = 'ombox-notice',
image = 'Information icon4.svg'
}
},
default = 'notice',
showInvalidTypeError = true,
classes = {'ombox'},
allowSmall = true,
imageEmptyCell = true,
imageRightNone = true,
templatestyles = 'Module:Message box/ombox.css'
},
tmbox = {
types = {
speedy = {
class = 'tmbox-speedy',
image = 'Ambox warning pn.svg'
},
delete = {
class = 'tmbox-delete',
image = 'Ambox warning pn.svg'
},
content = {
class = 'tmbox-content',
image = 'Ambox important.svg'
},
style = {
class = 'tmbox-style',
image = 'Edit-clear.svg'
},
move = {
class = 'tmbox-move',
image = 'Merge-split-transwiki default.svg'
},
protection = {
class = 'tmbox-protection',
image = 'Semi-protection-shackle-keyhole.svg'
},
notice = {
class = 'tmbox-notice',
image = 'Information icon4.svg'
}
},
default = 'notice',
showInvalidTypeError = true,
classes = {'tmbox'},
allowSmall = true,
imageRightNone = true,
imageEmptyCell = true,
templateCategory = 'Talk message boxes',
templatestyles = 'Module:Message box/tmbox.css'
}
}
9vdmk20zxcrbcck23bjaahgcjswtm04
802677
802676
2025-10-15T21:05:12Z
en>Izno
0
div fmbox
802677
Scribunto
text/plain
--------------------------------------------------------------------------------
-- Message box configuration --
-- --
-- This module contains configuration data for [[Module:Message box]]. --
--------------------------------------------------------------------------------
return {
ambox = {
types = {
speedy = {
class = 'ambox-speedy',
image = 'Ambox warning pn.svg'
},
delete = {
class = 'ambox-delete',
image = 'Ambox warning pn.svg'
},
content = {
class = 'ambox-content',
image = 'Ambox important.svg'
},
style = {
class = 'ambox-style',
image = 'Edit-clear.svg'
},
move = {
class = 'ambox-move',
image = 'Merge-split-transwiki default.svg'
},
protection = {
class = 'ambox-protection',
image = 'Semi-protection-shackle-keyhole.svg'
},
notice = {
class = 'ambox-notice',
image = 'Information icon4.svg'
}
},
default = 'notice',
allowBlankParams = {'talk', 'sect', 'date', 'issue', 'fix', 'subst', 'hidden'},
allowSmall = true,
smallParam = 'left',
smallClass = 'mbox-small-left',
substCheck = true,
classes = {'metadata', 'ambox'},
imageEmptyCell = true,
imageCheckBlank = true,
imageSmallSize = '20x20px',
imageCellDiv = true,
useCollapsibleTextFields = true,
imageRightNone = true,
sectionDefault = 'article',
allowMainspaceCategories = true,
templateCategory = 'Article message templates',
templateCategoryRequireName = true,
templateErrorCategory = 'Article message templates with missing parameters',
templateErrorParamsToCheck = {'issue', 'fix', 'subst'},
removalNotice = '<small>[[Help:Maintenance template removal|Learn how and when to remove this message]]</small>',
templatestyles = 'Module:Message box/ambox.css'
},
cmbox = {
types = {
speedy = {
class = 'cmbox-speedy',
image = 'Ambox warning pn.svg'
},
delete = {
class = 'cmbox-delete',
image = 'Ambox warning pn.svg'
},
content = {
class = 'cmbox-content',
image = 'Ambox important.svg'
},
style = {
class = 'cmbox-style',
image = 'Edit-clear.svg'
},
move = {
class = 'cmbox-move',
image = 'Merge-split-transwiki default.svg'
},
protection = {
class = 'cmbox-protection',
image = 'Semi-protection-shackle-keyhole.svg'
},
notice = {
class = 'cmbox-notice',
image = 'Information icon4.svg'
}
},
default = 'notice',
showInvalidTypeError = true,
classes = {'cmbox'},
imageEmptyCell = true,
templatestyles = 'Module:Message box/cmbox.css',
div_structure = true,
},
fmbox = {
types = {
warning = {
class = 'fmbox-warning',
image = 'Ambox warning pn.svg'
},
editnotice = {
class = 'fmbox-editnotice',
image = 'Information icon4.svg'
},
system = {
class = 'fmbox-system',
image = 'Information icon4.svg'
}
},
default = 'system',
showInvalidTypeError = true,
classes = {'fmbox'},
imageEmptyCell = false,
imageRightNone = false,
templatestyles = 'Module:Message box/fmbox.css',
div_structure = true,
},
imbox = {
types = {
speedy = {
class = 'imbox-speedy',
image = 'Ambox warning pn.svg'
},
delete = {
class = 'imbox-delete',
image = 'Ambox warning pn.svg'
},
content = {
class = 'imbox-content',
image = 'Ambox important.svg'
},
style = {
class = 'imbox-style',
image = 'Edit-clear.svg'
},
move = {
class = 'imbox-move',
image = 'Merge-split-transwiki default.svg'
},
protection = {
class = 'imbox-protection',
image = 'Semi-protection-shackle-keyhole.svg'
},
license = {
class = 'imbox-license licensetpl',
image = 'Imbox-license.svg'
},
["license-related"] = {
class = 'imbox-license',
image = 'Imbox-license.svg'
},
featured = {
class = 'imbox-featured',
image = 'Cscr-featured.svg',
imageNeedsLink = true
},
notice = {
class = 'imbox-notice',
image = 'Information icon4.svg'
}
},
default = 'notice',
showInvalidTypeError = true,
classes = {'imbox'},
imageEmptyCell = true,
below = true,
templateCategory = 'File message boxes',
templatestyles = 'Module:Message box/imbox.css'
},
ombox = {
types = {
speedy = {
class = 'ombox-speedy',
image = 'Ambox warning pn.svg'
},
delete = {
class = 'ombox-delete',
image = 'Ambox warning pn.svg'
},
content = {
class = 'ombox-content',
image = 'Ambox important.svg'
},
style = {
class = 'ombox-style',
image = 'Edit-clear.svg'
},
move = {
class = 'ombox-move',
image = 'Merge-split-transwiki default.svg'
},
protection = {
class = 'ombox-protection',
image = 'Semi-protection-shackle-keyhole.svg'
},
notice = {
class = 'ombox-notice',
image = 'Information icon4.svg'
}
},
default = 'notice',
showInvalidTypeError = true,
classes = {'ombox'},
allowSmall = true,
imageEmptyCell = true,
imageRightNone = true,
templatestyles = 'Module:Message box/ombox.css'
},
tmbox = {
types = {
speedy = {
class = 'tmbox-speedy',
image = 'Ambox warning pn.svg'
},
delete = {
class = 'tmbox-delete',
image = 'Ambox warning pn.svg'
},
content = {
class = 'tmbox-content',
image = 'Ambox important.svg'
},
style = {
class = 'tmbox-style',
image = 'Edit-clear.svg'
},
move = {
class = 'tmbox-move',
image = 'Merge-split-transwiki default.svg'
},
protection = {
class = 'tmbox-protection',
image = 'Semi-protection-shackle-keyhole.svg'
},
notice = {
class = 'tmbox-notice',
image = 'Information icon4.svg'
}
},
default = 'notice',
showInvalidTypeError = true,
classes = {'tmbox'},
allowSmall = true,
imageRightNone = true,
imageEmptyCell = true,
templateCategory = 'Talk message boxes',
templatestyles = 'Module:Message box/tmbox.css'
}
}
1819ocybt47r5ouisggy9rlxr2wbzgy
802678
802677
2025-10-19T18:19:49Z
en>Izno
0
div imbox
802678
Scribunto
text/plain
--------------------------------------------------------------------------------
-- Message box configuration --
-- --
-- This module contains configuration data for [[Module:Message box]]. --
--------------------------------------------------------------------------------
return {
ambox = {
types = {
speedy = {
class = 'ambox-speedy',
image = 'Ambox warning pn.svg'
},
delete = {
class = 'ambox-delete',
image = 'Ambox warning pn.svg'
},
content = {
class = 'ambox-content',
image = 'Ambox important.svg'
},
style = {
class = 'ambox-style',
image = 'Edit-clear.svg'
},
move = {
class = 'ambox-move',
image = 'Merge-split-transwiki default.svg'
},
protection = {
class = 'ambox-protection',
image = 'Semi-protection-shackle-keyhole.svg'
},
notice = {
class = 'ambox-notice',
image = 'Information icon4.svg'
}
},
default = 'notice',
allowBlankParams = {'talk', 'sect', 'date', 'issue', 'fix', 'subst', 'hidden'},
allowSmall = true,
smallParam = 'left',
smallClass = 'mbox-small-left',
substCheck = true,
classes = {'metadata', 'ambox'},
imageEmptyCell = true,
imageCheckBlank = true,
imageSmallSize = '20x20px',
imageCellDiv = true,
useCollapsibleTextFields = true,
imageRightNone = true,
sectionDefault = 'article',
allowMainspaceCategories = true,
templateCategory = 'Article message templates',
templateCategoryRequireName = true,
templateErrorCategory = 'Article message templates with missing parameters',
templateErrorParamsToCheck = {'issue', 'fix', 'subst'},
removalNotice = '<small>[[Help:Maintenance template removal|Learn how and when to remove this message]]</small>',
templatestyles = 'Module:Message box/ambox.css'
},
cmbox = {
types = {
speedy = {
class = 'cmbox-speedy',
image = 'Ambox warning pn.svg'
},
delete = {
class = 'cmbox-delete',
image = 'Ambox warning pn.svg'
},
content = {
class = 'cmbox-content',
image = 'Ambox important.svg'
},
style = {
class = 'cmbox-style',
image = 'Edit-clear.svg'
},
move = {
class = 'cmbox-move',
image = 'Merge-split-transwiki default.svg'
},
protection = {
class = 'cmbox-protection',
image = 'Semi-protection-shackle-keyhole.svg'
},
notice = {
class = 'cmbox-notice',
image = 'Information icon4.svg'
}
},
default = 'notice',
showInvalidTypeError = true,
classes = {'cmbox'},
imageEmptyCell = true,
templatestyles = 'Module:Message box/cmbox.css',
div_structure = true,
},
fmbox = {
types = {
warning = {
class = 'fmbox-warning',
image = 'Ambox warning pn.svg'
},
editnotice = {
class = 'fmbox-editnotice',
image = 'Information icon4.svg'
},
system = {
class = 'fmbox-system',
image = 'Information icon4.svg'
}
},
default = 'system',
showInvalidTypeError = true,
classes = {'fmbox'},
imageEmptyCell = false,
imageRightNone = false,
templatestyles = 'Module:Message box/fmbox.css',
div_structure = true,
},
imbox = {
types = {
speedy = {
class = 'imbox-speedy',
image = 'Ambox warning pn.svg'
},
delete = {
class = 'imbox-delete',
image = 'Ambox warning pn.svg'
},
content = {
class = 'imbox-content',
image = 'Ambox important.svg'
},
style = {
class = 'imbox-style',
image = 'Edit-clear.svg'
},
move = {
class = 'imbox-move',
image = 'Merge-split-transwiki default.svg'
},
protection = {
class = 'imbox-protection',
image = 'Semi-protection-shackle-keyhole.svg'
},
license = {
class = 'imbox-license licensetpl',
image = 'Imbox-license.svg'
},
["license-related"] = {
class = 'imbox-license',
image = 'Imbox-license.svg'
},
featured = {
class = 'imbox-featured',
image = 'Cscr-featured.svg',
imageNeedsLink = true
},
notice = {
class = 'imbox-notice',
image = 'Information icon4.svg'
}
},
default = 'notice',
showInvalidTypeError = true,
classes = {'imbox'},
imageEmptyCell = true,
below = true,
templateCategory = 'File message boxes',
templatestyles = 'Module:Message box/imbox.css',
div_structure = true,
},
ombox = {
types = {
speedy = {
class = 'ombox-speedy',
image = 'Ambox warning pn.svg'
},
delete = {
class = 'ombox-delete',
image = 'Ambox warning pn.svg'
},
content = {
class = 'ombox-content',
image = 'Ambox important.svg'
},
style = {
class = 'ombox-style',
image = 'Edit-clear.svg'
},
move = {
class = 'ombox-move',
image = 'Merge-split-transwiki default.svg'
},
protection = {
class = 'ombox-protection',
image = 'Semi-protection-shackle-keyhole.svg'
},
notice = {
class = 'ombox-notice',
image = 'Information icon4.svg'
}
},
default = 'notice',
showInvalidTypeError = true,
classes = {'ombox'},
allowSmall = true,
imageEmptyCell = true,
imageRightNone = true,
templatestyles = 'Module:Message box/ombox.css'
},
tmbox = {
types = {
speedy = {
class = 'tmbox-speedy',
image = 'Ambox warning pn.svg'
},
delete = {
class = 'tmbox-delete',
image = 'Ambox warning pn.svg'
},
content = {
class = 'tmbox-content',
image = 'Ambox important.svg'
},
style = {
class = 'tmbox-style',
image = 'Edit-clear.svg'
},
move = {
class = 'tmbox-move',
image = 'Merge-split-transwiki default.svg'
},
protection = {
class = 'tmbox-protection',
image = 'Semi-protection-shackle-keyhole.svg'
},
notice = {
class = 'tmbox-notice',
image = 'Information icon4.svg'
}
},
default = 'notice',
showInvalidTypeError = true,
classes = {'tmbox'},
allowSmall = true,
imageRightNone = true,
imageEmptyCell = true,
templateCategory = 'Talk message boxes',
templatestyles = 'Module:Message box/tmbox.css'
}
}
p36hrbxjy99m7clj64lhlint2en3bo0
802679
802678
2026-07-26T19:42:07Z
SM7
3953
3 revisions imported from [[:en:Module:Message_box/configuration]]
802678
Scribunto
text/plain
--------------------------------------------------------------------------------
-- Message box configuration --
-- --
-- This module contains configuration data for [[Module:Message box]]. --
--------------------------------------------------------------------------------
return {
ambox = {
types = {
speedy = {
class = 'ambox-speedy',
image = 'Ambox warning pn.svg'
},
delete = {
class = 'ambox-delete',
image = 'Ambox warning pn.svg'
},
content = {
class = 'ambox-content',
image = 'Ambox important.svg'
},
style = {
class = 'ambox-style',
image = 'Edit-clear.svg'
},
move = {
class = 'ambox-move',
image = 'Merge-split-transwiki default.svg'
},
protection = {
class = 'ambox-protection',
image = 'Semi-protection-shackle-keyhole.svg'
},
notice = {
class = 'ambox-notice',
image = 'Information icon4.svg'
}
},
default = 'notice',
allowBlankParams = {'talk', 'sect', 'date', 'issue', 'fix', 'subst', 'hidden'},
allowSmall = true,
smallParam = 'left',
smallClass = 'mbox-small-left',
substCheck = true,
classes = {'metadata', 'ambox'},
imageEmptyCell = true,
imageCheckBlank = true,
imageSmallSize = '20x20px',
imageCellDiv = true,
useCollapsibleTextFields = true,
imageRightNone = true,
sectionDefault = 'article',
allowMainspaceCategories = true,
templateCategory = 'Article message templates',
templateCategoryRequireName = true,
templateErrorCategory = 'Article message templates with missing parameters',
templateErrorParamsToCheck = {'issue', 'fix', 'subst'},
removalNotice = '<small>[[Help:Maintenance template removal|Learn how and when to remove this message]]</small>',
templatestyles = 'Module:Message box/ambox.css'
},
cmbox = {
types = {
speedy = {
class = 'cmbox-speedy',
image = 'Ambox warning pn.svg'
},
delete = {
class = 'cmbox-delete',
image = 'Ambox warning pn.svg'
},
content = {
class = 'cmbox-content',
image = 'Ambox important.svg'
},
style = {
class = 'cmbox-style',
image = 'Edit-clear.svg'
},
move = {
class = 'cmbox-move',
image = 'Merge-split-transwiki default.svg'
},
protection = {
class = 'cmbox-protection',
image = 'Semi-protection-shackle-keyhole.svg'
},
notice = {
class = 'cmbox-notice',
image = 'Information icon4.svg'
}
},
default = 'notice',
showInvalidTypeError = true,
classes = {'cmbox'},
imageEmptyCell = true,
templatestyles = 'Module:Message box/cmbox.css',
div_structure = true,
},
fmbox = {
types = {
warning = {
class = 'fmbox-warning',
image = 'Ambox warning pn.svg'
},
editnotice = {
class = 'fmbox-editnotice',
image = 'Information icon4.svg'
},
system = {
class = 'fmbox-system',
image = 'Information icon4.svg'
}
},
default = 'system',
showInvalidTypeError = true,
classes = {'fmbox'},
imageEmptyCell = false,
imageRightNone = false,
templatestyles = 'Module:Message box/fmbox.css',
div_structure = true,
},
imbox = {
types = {
speedy = {
class = 'imbox-speedy',
image = 'Ambox warning pn.svg'
},
delete = {
class = 'imbox-delete',
image = 'Ambox warning pn.svg'
},
content = {
class = 'imbox-content',
image = 'Ambox important.svg'
},
style = {
class = 'imbox-style',
image = 'Edit-clear.svg'
},
move = {
class = 'imbox-move',
image = 'Merge-split-transwiki default.svg'
},
protection = {
class = 'imbox-protection',
image = 'Semi-protection-shackle-keyhole.svg'
},
license = {
class = 'imbox-license licensetpl',
image = 'Imbox-license.svg'
},
["license-related"] = {
class = 'imbox-license',
image = 'Imbox-license.svg'
},
featured = {
class = 'imbox-featured',
image = 'Cscr-featured.svg',
imageNeedsLink = true
},
notice = {
class = 'imbox-notice',
image = 'Information icon4.svg'
}
},
default = 'notice',
showInvalidTypeError = true,
classes = {'imbox'},
imageEmptyCell = true,
below = true,
templateCategory = 'File message boxes',
templatestyles = 'Module:Message box/imbox.css',
div_structure = true,
},
ombox = {
types = {
speedy = {
class = 'ombox-speedy',
image = 'Ambox warning pn.svg'
},
delete = {
class = 'ombox-delete',
image = 'Ambox warning pn.svg'
},
content = {
class = 'ombox-content',
image = 'Ambox important.svg'
},
style = {
class = 'ombox-style',
image = 'Edit-clear.svg'
},
move = {
class = 'ombox-move',
image = 'Merge-split-transwiki default.svg'
},
protection = {
class = 'ombox-protection',
image = 'Semi-protection-shackle-keyhole.svg'
},
notice = {
class = 'ombox-notice',
image = 'Information icon4.svg'
}
},
default = 'notice',
showInvalidTypeError = true,
classes = {'ombox'},
allowSmall = true,
imageEmptyCell = true,
imageRightNone = true,
templatestyles = 'Module:Message box/ombox.css'
},
tmbox = {
types = {
speedy = {
class = 'tmbox-speedy',
image = 'Ambox warning pn.svg'
},
delete = {
class = 'tmbox-delete',
image = 'Ambox warning pn.svg'
},
content = {
class = 'tmbox-content',
image = 'Ambox important.svg'
},
style = {
class = 'tmbox-style',
image = 'Edit-clear.svg'
},
move = {
class = 'tmbox-move',
image = 'Merge-split-transwiki default.svg'
},
protection = {
class = 'tmbox-protection',
image = 'Semi-protection-shackle-keyhole.svg'
},
notice = {
class = 'tmbox-notice',
image = 'Information icon4.svg'
}
},
default = 'notice',
showInvalidTypeError = true,
classes = {'tmbox'},
allowSmall = true,
imageRightNone = true,
imageEmptyCell = true,
templateCategory = 'Talk message boxes',
templatestyles = 'Module:Message box/tmbox.css'
}
}
p36hrbxjy99m7clj64lhlint2en3bo0
Module:Protection banner
828
15976
802663
778610
2025-03-19T17:58:54Z
en>SilverLocust
0
fix for mobile and search issue, see talk page
802663
Scribunto
text/plain
-- This module implements {{pp-meta}} and its daughter templates such as
-- {{pp-dispute}}, {{pp-vandalism}} and {{pp-sock}}.
-- Initialise necessary modules.
require('strict')
local makeFileLink = require('Module:File link')._main
local effectiveProtectionLevel = require('Module:Effective protection level')._main
local effectiveProtectionExpiry = require('Module:Effective protection expiry')._main
local yesno = require('Module:Yesno')
-- Lazily initialise modules and objects we don't always need.
local getArgs, makeMessageBox, lang
-- Set constants.
local CONFIG_MODULE = 'Module:Protection banner/config'
--------------------------------------------------------------------------------
-- Helper functions
--------------------------------------------------------------------------------
local function makeCategoryLink(cat, sort)
if cat then
return string.format(
'[[%s:%s|%s]]',
mw.site.namespaces[14].name,
cat,
sort
)
end
end
-- Validation function for the expiry and the protection date
local function validateDate(dateString, dateType)
if not lang then
lang = mw.language.getContentLanguage()
end
local success, result = pcall(lang.formatDate, lang, 'U', dateString)
if success then
result = tonumber(result)
if result then
return result
end
end
error(string.format(
'invalid %s: %s',
dateType,
tostring(dateString)
), 4)
end
local function makeFullUrl(page, query, display)
return string.format(
'[%s %s]',
tostring(mw.uri.fullUrl(page, query)),
display
)
end
-- Given a directed graph formatted as node -> table of direct successors,
-- get a table of all nodes reachable from a given node (though always
-- including the given node).
local function getReachableNodes(graph, start)
local toWalk, retval = {[start] = true}, {}
while true do
-- Can't use pairs() since we're adding and removing things as we're iterating
local k = next(toWalk) -- This always gets the "first" key
if k == nil then
return retval
end
toWalk[k] = nil
retval[k] = true
for _,v in ipairs(graph[k]) do
if not retval[v] then
toWalk[v] = true
end
end
end
end
--------------------------------------------------------------------------------
-- Protection class
--------------------------------------------------------------------------------
local Protection = {}
Protection.__index = Protection
Protection.supportedActions = {
edit = true,
move = true,
autoreview = true,
upload = true
}
Protection.bannerConfigFields = {
'text',
'explanation',
'tooltip',
'alt',
'link',
'image'
}
function Protection.new(args, cfg, title)
local obj = {}
obj._cfg = cfg
obj.title = title or mw.title.getCurrentTitle()
-- Set action
if not args.action then
obj.action = 'edit'
elseif Protection.supportedActions[args.action] then
obj.action = args.action
else
error(string.format(
'invalid action: %s',
tostring(args.action)
), 3)
end
-- Set level
obj.level = args.demolevel or effectiveProtectionLevel(obj.action, obj.title)
if not obj.level or (obj.action == 'move' and obj.level == 'autoconfirmed') then
-- Users need to be autoconfirmed to move pages anyway, so treat
-- semi-move-protected pages as unprotected.
obj.level = '*'
end
-- Set expiry
local effectiveExpiry = effectiveProtectionExpiry(obj.action, obj.title)
if effectiveExpiry == 'infinity' then
obj.expiry = 'indef'
elseif effectiveExpiry ~= 'unknown' then
obj.expiry = validateDate(effectiveExpiry, 'expiry date')
end
-- Set reason
if args[1] then
obj.reason = mw.ustring.lower(args[1])
if obj.reason:find('|') then
error('reasons cannot contain the pipe character ("|")', 3)
end
end
-- Set protection date
if args.date then
obj.protectionDate = validateDate(args.date, 'protection date')
end
-- Set banner config
do
obj.bannerConfig = {}
local configTables = {}
if cfg.banners[obj.action] then
configTables[#configTables + 1] = cfg.banners[obj.action][obj.reason]
end
if cfg.defaultBanners[obj.action] then
configTables[#configTables + 1] = cfg.defaultBanners[obj.action][obj.level]
configTables[#configTables + 1] = cfg.defaultBanners[obj.action].default
end
configTables[#configTables + 1] = cfg.masterBanner
for i, field in ipairs(Protection.bannerConfigFields) do
for j, t in ipairs(configTables) do
if t[field] then
obj.bannerConfig[field] = t[field]
break
end
end
end
end
return setmetatable(obj, Protection)
end
function Protection:isUserScript()
-- Whether the page is a user JavaScript or CSS page.
local title = self.title
return title.namespace == 2 and (
title.contentModel == 'javascript' or title.contentModel == 'css'
)
end
function Protection:isProtected()
return self.level ~= '*'
end
function Protection:shouldShowLock()
-- Whether we should output a banner/padlock
return self:isProtected() and not self:isUserScript()
end
-- Whether this page needs a protection category.
Protection.shouldHaveProtectionCategory = Protection.shouldShowLock
function Protection:isTemporary()
return type(self.expiry) == 'number'
end
function Protection:makeProtectionCategory()
if not self:shouldHaveProtectionCategory() then
return ''
end
local cfg = self._cfg
local title = self.title
-- Get the expiry key fragment.
local expiryFragment
if self.expiry == 'indef' then
expiryFragment = self.expiry
elseif type(self.expiry) == 'number' then
expiryFragment = 'temp'
end
-- Get the namespace key fragment.
local namespaceFragment = cfg.categoryNamespaceKeys[title.namespace]
if not namespaceFragment and title.namespace % 2 == 1 then
namespaceFragment = 'talk'
end
-- Define the order that key fragments are tested in. This is done with an
-- array of tables containing the value to be tested, along with its
-- position in the cfg.protectionCategories table.
local order = {
{val = expiryFragment, keypos = 1},
{val = namespaceFragment, keypos = 2},
{val = self.reason, keypos = 3},
{val = self.level, keypos = 4},
{val = self.action, keypos = 5}
}
--[[
-- The old protection templates used an ad-hoc protection category system,
-- with some templates prioritising namespaces in their categories, and
-- others prioritising the protection reason. To emulate this in this module
-- we use the config table cfg.reasonsWithNamespacePriority to set the
-- reasons for which namespaces have priority over protection reason.
-- If we are dealing with one of those reasons, move the namespace table to
-- the end of the order table, i.e. give it highest priority. If not, the
-- reason should have highest priority, so move that to the end of the table
-- instead.
--]]
table.insert(order, table.remove(order, self.reason and cfg.reasonsWithNamespacePriority[self.reason] and 2 or 3))
--[[
-- Define the attempt order. Inactive subtables (subtables with nil "value"
-- fields) are moved to the end, where they will later be given the key
-- "all". This is to cut down on the number of table lookups in
-- cfg.protectionCategories, which grows exponentially with the number of
-- non-nil keys. We keep track of the number of active subtables with the
-- noActive parameter.
--]]
local noActive, attemptOrder
do
local active, inactive = {}, {}
for i, t in ipairs(order) do
if t.val then
active[#active + 1] = t
else
inactive[#inactive + 1] = t
end
end
noActive = #active
attemptOrder = active
for i, t in ipairs(inactive) do
attemptOrder[#attemptOrder + 1] = t
end
end
--[[
-- Check increasingly generic key combinations until we find a match. If a
-- specific category exists for the combination of key fragments we are
-- given, that match will be found first. If not, we keep trying different
-- key fragment combinations until we match using the key
-- "all-all-all-all-all".
--
-- To generate the keys, we index the key subtables using a binary matrix
-- with indexes i and j. j is only calculated up to the number of active
-- subtables. For example, if there were three active subtables, the matrix
-- would look like this, with 0 corresponding to the key fragment "all", and
-- 1 corresponding to other key fragments.
--
-- j 1 2 3
-- i
-- 1 1 1 1
-- 2 0 1 1
-- 3 1 0 1
-- 4 0 0 1
-- 5 1 1 0
-- 6 0 1 0
-- 7 1 0 0
-- 8 0 0 0
--
-- Values of j higher than the number of active subtables are set
-- to the string "all".
--
-- A key for cfg.protectionCategories is constructed for each value of i.
-- The position of the value in the key is determined by the keypos field in
-- each subtable.
--]]
local cats = cfg.protectionCategories
for i = 1, 2^noActive do
local key = {}
for j, t in ipairs(attemptOrder) do
if j > noActive then
key[t.keypos] = 'all'
else
local quotient = i / 2 ^ (j - 1)
quotient = math.ceil(quotient)
if quotient % 2 == 1 then
key[t.keypos] = t.val
else
key[t.keypos] = 'all'
end
end
end
key = table.concat(key, '|')
local attempt = cats[key]
if attempt then
return makeCategoryLink(attempt, title.text)
end
end
return ''
end
function Protection:isIncorrect()
local expiry = self.expiry
return not self:shouldHaveProtectionCategory()
or type(expiry) == 'number' and expiry < os.time()
end
function Protection:isTemplateProtectedNonTemplate()
local action, namespace = self.action, self.title.namespace
return self.level == 'templateeditor'
and (
(action ~= 'edit' and action ~= 'move')
or (namespace ~= 10 and namespace ~= 828)
)
end
function Protection:makeCategoryLinks()
local msg = self._cfg.msg
local ret = {self:makeProtectionCategory()}
if self:isIncorrect() then
ret[#ret + 1] = makeCategoryLink(
msg['tracking-category-incorrect'],
self.title.text
)
end
if self:isTemplateProtectedNonTemplate() then
ret[#ret + 1] = makeCategoryLink(
msg['tracking-category-template'],
self.title.text
)
end
return table.concat(ret)
end
--------------------------------------------------------------------------------
-- Blurb class
--------------------------------------------------------------------------------
local Blurb = {}
Blurb.__index = Blurb
Blurb.bannerTextFields = {
text = true,
explanation = true,
tooltip = true,
alt = true,
link = true
}
function Blurb.new(protectionObj, args, cfg)
return setmetatable({
_cfg = cfg,
_protectionObj = protectionObj,
_args = args
}, Blurb)
end
-- Private methods --
function Blurb:_formatDate(num)
-- Formats a Unix timestamp into dd Month, YYYY format.
lang = lang or mw.language.getContentLanguage()
local success, date = pcall(
lang.formatDate,
lang,
self._cfg.msg['expiry-date-format'] or 'j F Y',
'@' .. tostring(num)
)
if success then
return date
end
end
function Blurb:_getExpandedMessage(msgKey)
return self:_substituteParameters(self._cfg.msg[msgKey])
end
function Blurb:_substituteParameters(msg)
if not self._params then
local parameterFuncs = {}
parameterFuncs.CURRENTVERSION = self._makeCurrentVersionParameter
parameterFuncs.EDITREQUEST = self._makeEditRequestParameter
parameterFuncs.EXPIRY = self._makeExpiryParameter
parameterFuncs.EXPLANATIONBLURB = self._makeExplanationBlurbParameter
parameterFuncs.IMAGELINK = self._makeImageLinkParameter
parameterFuncs.INTROBLURB = self._makeIntroBlurbParameter
parameterFuncs.INTROFRAGMENT = self._makeIntroFragmentParameter
parameterFuncs.PAGETYPE = self._makePagetypeParameter
parameterFuncs.PROTECTIONBLURB = self._makeProtectionBlurbParameter
parameterFuncs.PROTECTIONDATE = self._makeProtectionDateParameter
parameterFuncs.PROTECTIONLEVEL = self._makeProtectionLevelParameter
parameterFuncs.PROTECTIONLOG = self._makeProtectionLogParameter
parameterFuncs.TALKPAGE = self._makeTalkPageParameter
parameterFuncs.TOOLTIPBLURB = self._makeTooltipBlurbParameter
parameterFuncs.TOOLTIPFRAGMENT = self._makeTooltipFragmentParameter
parameterFuncs.VANDAL = self._makeVandalTemplateParameter
self._params = setmetatable({}, {
__index = function (t, k)
local param
if parameterFuncs[k] then
param = parameterFuncs[k](self)
end
param = param or ''
t[k] = param
return param
end
})
end
msg = msg:gsub('${(%u+)}', self._params)
return msg
end
function Blurb:_makeCurrentVersionParameter()
-- A link to the page history or the move log, depending on the kind of
-- protection.
local pagename = self._protectionObj.title.prefixedText
if self._protectionObj.action == 'move' then
-- We need the move log link.
return makeFullUrl(
'Special:Log',
{type = 'move', page = pagename},
self:_getExpandedMessage('current-version-move-display')
)
else
-- We need the history link.
return makeFullUrl(
pagename,
{action = 'history'},
self:_getExpandedMessage('current-version-edit-display')
)
end
end
function Blurb:_makeEditRequestParameter()
local mEditRequest = require('Module:Submit an edit request')
local action = self._protectionObj.action
local level = self._protectionObj.level
-- Get the edit request type.
local requestType
if action == 'edit' then
if level == 'autoconfirmed' then
requestType = 'semi'
elseif level == 'extendedconfirmed' then
requestType = 'extended'
elseif level == 'templateeditor' then
requestType = 'template'
end
end
requestType = requestType or 'full'
-- Get the display value.
local display = self:_getExpandedMessage('edit-request-display')
return mEditRequest._link{type = requestType, display = display}
end
function Blurb:_makeExpiryParameter()
local expiry = self._protectionObj.expiry
if type(expiry) == 'number' then
return self:_formatDate(expiry)
else
return expiry
end
end
function Blurb:_makeExplanationBlurbParameter()
-- Cover special cases first.
if self._protectionObj.title.namespace == 8 then
-- MediaWiki namespace
return self:_getExpandedMessage('explanation-blurb-nounprotect')
end
-- Get explanation blurb table keys
local action = self._protectionObj.action
local level = self._protectionObj.level
local talkKey = self._protectionObj.title.isTalkPage and 'talk' or 'subject'
-- Find the message in the explanation blurb table and substitute any
-- parameters.
local explanations = self._cfg.explanationBlurbs
local msg
if explanations[action][level] and explanations[action][level][talkKey] then
msg = explanations[action][level][talkKey]
elseif explanations[action][level] and explanations[action][level].default then
msg = explanations[action][level].default
elseif explanations[action].default and explanations[action].default[talkKey] then
msg = explanations[action].default[talkKey]
elseif explanations[action].default and explanations[action].default.default then
msg = explanations[action].default.default
else
error(string.format(
'could not find explanation blurb for action "%s", level "%s" and talk key "%s"',
action,
level,
talkKey
), 8)
end
return self:_substituteParameters(msg)
end
function Blurb:_makeImageLinkParameter()
local imageLinks = self._cfg.imageLinks
local action = self._protectionObj.action
local level = self._protectionObj.level
local msg
if imageLinks[action][level] then
msg = imageLinks[action][level]
elseif imageLinks[action].default then
msg = imageLinks[action].default
else
msg = imageLinks.edit.default
end
return self:_substituteParameters(msg)
end
function Blurb:_makeIntroBlurbParameter()
if self._protectionObj:isTemporary() then
return self:_getExpandedMessage('intro-blurb-expiry')
else
return self:_getExpandedMessage('intro-blurb-noexpiry')
end
end
function Blurb:_makeIntroFragmentParameter()
if self._protectionObj:isTemporary() then
return self:_getExpandedMessage('intro-fragment-expiry')
else
return self:_getExpandedMessage('intro-fragment-noexpiry')
end
end
function Blurb:_makePagetypeParameter()
local pagetypes = self._cfg.pagetypes
return pagetypes[self._protectionObj.title.namespace]
or pagetypes.default
or error('no default pagetype defined', 8)
end
function Blurb:_makeProtectionBlurbParameter()
local protectionBlurbs = self._cfg.protectionBlurbs
local action = self._protectionObj.action
local level = self._protectionObj.level
local msg
if protectionBlurbs[action][level] then
msg = protectionBlurbs[action][level]
elseif protectionBlurbs[action].default then
msg = protectionBlurbs[action].default
elseif protectionBlurbs.edit.default then
msg = protectionBlurbs.edit.default
else
error('no protection blurb defined for protectionBlurbs.edit.default', 8)
end
return self:_substituteParameters(msg)
end
function Blurb:_makeProtectionDateParameter()
local protectionDate = self._protectionObj.protectionDate
if type(protectionDate) == 'number' then
return self:_formatDate(protectionDate)
else
return protectionDate
end
end
function Blurb:_makeProtectionLevelParameter()
local protectionLevels = self._cfg.protectionLevels
local action = self._protectionObj.action
local level = self._protectionObj.level
local msg
if protectionLevels[action][level] then
msg = protectionLevels[action][level]
elseif protectionLevels[action].default then
msg = protectionLevels[action].default
elseif protectionLevels.edit.default then
msg = protectionLevels.edit.default
else
error('no protection level defined for protectionLevels.edit.default', 8)
end
return self:_substituteParameters(msg)
end
function Blurb:_makeProtectionLogParameter()
local pagename = self._protectionObj.title.prefixedText
if self._protectionObj.action == 'autoreview' then
-- We need the pending changes log.
return makeFullUrl(
'Special:Log',
{type = 'stable', page = pagename},
self:_getExpandedMessage('pc-log-display')
)
else
-- We need the protection log.
return makeFullUrl(
'Special:Log',
{type = 'protect', page = pagename},
self:_getExpandedMessage('protection-log-display')
)
end
end
function Blurb:_makeTalkPageParameter()
return string.format(
'[[%s:%s#%s|%s]]',
mw.site.namespaces[self._protectionObj.title.namespace].talk.name,
self._protectionObj.title.text,
self._args.section or 'top',
self:_getExpandedMessage('talk-page-link-display')
)
end
function Blurb:_makeTooltipBlurbParameter()
if self._protectionObj:isTemporary() then
return self:_getExpandedMessage('tooltip-blurb-expiry')
else
return self:_getExpandedMessage('tooltip-blurb-noexpiry')
end
end
function Blurb:_makeTooltipFragmentParameter()
if self._protectionObj:isTemporary() then
return self:_getExpandedMessage('tooltip-fragment-expiry')
else
return self:_getExpandedMessage('tooltip-fragment-noexpiry')
end
end
function Blurb:_makeVandalTemplateParameter()
return mw.getCurrentFrame():expandTemplate{
title="vandal-m",
args={self._args.user or self._protectionObj.title.baseText}
}
end
-- Public methods --
function Blurb:makeBannerText(key)
-- Validate input.
if not key or not Blurb.bannerTextFields[key] then
error(string.format(
'"%s" is not a valid banner config field',
tostring(key)
), 2)
end
-- Generate the text.
local msg = self._protectionObj.bannerConfig[key]
if type(msg) == 'string' then
return self:_substituteParameters(msg)
elseif type(msg) == 'function' then
msg = msg(self._protectionObj, self._args)
if type(msg) ~= 'string' then
error(string.format(
'bad output from banner config function with key "%s"'
.. ' (expected string, got %s)',
tostring(key),
type(msg)
), 4)
end
return self:_substituteParameters(msg)
end
end
--------------------------------------------------------------------------------
-- BannerTemplate class
--------------------------------------------------------------------------------
local BannerTemplate = {}
BannerTemplate.__index = BannerTemplate
function BannerTemplate.new(protectionObj, cfg)
local obj = {}
obj._cfg = cfg
-- Set the image filename.
local imageFilename = protectionObj.bannerConfig.image
if imageFilename then
obj._imageFilename = imageFilename
else
-- If an image filename isn't specified explicitly in the banner config,
-- generate it from the protection status and the namespace.
local action = protectionObj.action
local level = protectionObj.level
local namespace = protectionObj.title.namespace
local reason = protectionObj.reason
-- Deal with special cases first.
if (
namespace == 10
or namespace == 828
or reason and obj._cfg.indefImageReasons[reason]
)
and action == 'edit'
and level == 'sysop'
and not protectionObj:isTemporary()
then
-- Fully protected modules and templates get the special red "indef"
-- padlock.
obj._imageFilename = obj._cfg.msg['image-filename-indef']
else
-- Deal with regular protection types.
local images = obj._cfg.images
if images[action] then
if images[action][level] then
obj._imageFilename = images[action][level]
elseif images[action].default then
obj._imageFilename = images[action].default
end
end
end
end
return setmetatable(obj, BannerTemplate)
end
function BannerTemplate:renderImage()
local filename = self._imageFilename
or self._cfg.msg['image-filename-default']
or 'Transparent.gif'
return makeFileLink{
file = filename,
size = (self.imageWidth or 20) .. 'px',
alt = self._imageAlt,
link = self._imageLink,
caption = self.imageCaption
}
end
--------------------------------------------------------------------------------
-- Banner class
--------------------------------------------------------------------------------
local Banner = setmetatable({}, BannerTemplate)
Banner.__index = Banner
function Banner.new(protectionObj, blurbObj, cfg)
local obj = BannerTemplate.new(protectionObj, cfg) -- This doesn't need the blurb.
obj.imageWidth = 40
obj.imageCaption = blurbObj:makeBannerText('alt') -- Large banners use the alt text for the tooltip.
obj._reasonText = blurbObj:makeBannerText('text')
obj._explanationText = blurbObj:makeBannerText('explanation')
obj._page = protectionObj.title.prefixedText -- Only makes a difference in testing.
return setmetatable(obj, Banner)
end
function Banner:__tostring()
-- Renders the banner.
makeMessageBox = makeMessageBox or require('Module:Message box').main
local reasonText = self._reasonText or error('no reason text set', 2)
local explanationText = self._explanationText
local mbargs = {
page = self._page,
type = 'protection',
image = self:renderImage(),
text = string.format(
"'''%s'''%s",
reasonText,
explanationText and '<br />' .. explanationText or ''
)
}
return makeMessageBox('mbox', mbargs)
end
--------------------------------------------------------------------------------
-- Padlock class
--------------------------------------------------------------------------------
local Padlock = setmetatable({}, BannerTemplate)
Padlock.__index = Padlock
function Padlock.new(protectionObj, blurbObj, cfg)
local obj = BannerTemplate.new(protectionObj, cfg) -- This doesn't need the blurb.
obj.imageWidth = 20
obj.imageCaption = blurbObj:makeBannerText('tooltip')
obj._imageAlt = blurbObj:makeBannerText('alt')
obj._imageLink = blurbObj:makeBannerText('link')
obj._indicatorName = cfg.padlockIndicatorNames[protectionObj.action]
or cfg.padlockIndicatorNames.default
or 'pp-default'
return setmetatable(obj, Padlock)
end
function Padlock:__tostring()
local frame = mw.getCurrentFrame()
-- The nowiki tag helps prevent whitespace at the top of articles.
return frame:extensionTag{name = 'nowiki'} .. frame:extensionTag{
name = 'indicator',
args = {name = self._indicatorName},
content = self:renderImage()
}
end
--------------------------------------------------------------------------------
-- Exports
--------------------------------------------------------------------------------
local p = {}
function p._exportClasses()
-- This is used for testing purposes.
return {
Protection = Protection,
Blurb = Blurb,
BannerTemplate = BannerTemplate,
Banner = Banner,
Padlock = Padlock,
}
end
function p._main(args, cfg, title)
args = args or {}
cfg = cfg or require(CONFIG_MODULE)
local protectionObj = Protection.new(args, cfg, title)
local ret = {}
-- If a page's edit protection is equally or more restrictive than its
-- protection from some other action, then don't bother displaying anything
-- for the other action (except categories).
if not yesno(args.catonly) and (protectionObj.action == 'edit' or
args.demolevel or
not getReachableNodes(
cfg.hierarchy,
protectionObj.level
)[effectiveProtectionLevel('edit', protectionObj.title)])
then
-- Initialise the blurb object
local blurbObj = Blurb.new(protectionObj, args, cfg)
-- Render the banner
if protectionObj:shouldShowLock() then
ret[#ret + 1] = tostring(
(yesno(args.small) and Padlock or Banner)
.new(protectionObj, blurbObj, cfg)
)
end
end
-- Render the categories
if yesno(args.category) ~= false then
ret[#ret + 1] = protectionObj:makeCategoryLinks()
end
-- For arbitration enforcement, flagging [[WP:PIA]] pages to enable [[Special:AbuseFilter/1339]] to flag edits to them
if protectionObj.level == "extendedconfirmed" then
if require("Module:TableTools").inArray(protectionObj.title.talkPageTitle.categories, "Wikipedia pages subject to the extended confirmed restriction related to the Arab-Israeli conflict") then
ret[#ret + 1] = "<p class='PIA-flag' style='display:none; visibility:hidden;' title='This page is subject to the extended confirmed restriction related to the Arab-Israeli conflict.'></p>"
end
end
return table.concat(ret)
end
function p.main(frame, cfg)
cfg = cfg or require(CONFIG_MODULE)
-- Find default args, if any.
local parent = frame.getParent and frame:getParent()
local defaultArgs = parent and cfg.wrappers[parent:getTitle():gsub('/sandbox$', '')]
-- Find user args, and use the parent frame if we are being called from a
-- wrapper template.
getArgs = getArgs or require('Module:Arguments').getArgs
local userArgs = getArgs(frame, {
parentOnly = defaultArgs,
frameOnly = not defaultArgs
})
-- Build the args table. User-specified args overwrite default args.
local args = {}
for k, v in pairs(defaultArgs or {}) do
args[k] = v
end
for k, v in pairs(userArgs) do
args[k] = v
end
return p._main(args, cfg)
end
return p
2lyr6ebd580cvha7qta16zrremxkzxz
802664
802663
2026-02-18T08:45:26Z
en>Krinkle
0
Fix cache bug causing articles like [[Ælfwynn, wife of Æthelstan Half-King]] to have 30min cache instead of between 24h and 30 days, ref [[phab:T416616]]
802664
Scribunto
text/plain
-- This module implements {{pp-meta}} and its daughter templates such as
-- {{pp-dispute}}, {{pp-vandalism}} and {{pp-sock}}.
-- Initialise necessary modules.
require('strict')
local makeFileLink = require('Module:File link')._main
local effectiveProtectionLevel = require('Module:Effective protection level')._main
local effectiveProtectionExpiry = require('Module:Effective protection expiry')._main
local yesno = require('Module:Yesno')
-- Lazily initialise modules and objects we don't always need.
local getArgs, makeMessageBox, lang
-- Set constants.
local CONFIG_MODULE = 'Module:Protection banner/config'
--------------------------------------------------------------------------------
-- Helper functions
--------------------------------------------------------------------------------
local function makeCategoryLink(cat, sort)
if cat then
return string.format(
'[[%s:%s|%s]]',
mw.site.namespaces[14].name,
cat,
sort
)
end
end
-- Validation function for the expiry and the protection date
local function validateDate(dateString, dateType)
if not lang then
lang = mw.language.getContentLanguage()
end
local success, result = pcall(lang.formatDate, lang, 'U', dateString)
if success then
result = tonumber(result)
if result then
return result
end
end
error(string.format(
'invalid %s: %s',
dateType,
tostring(dateString)
), 4)
end
local function makeFullUrl(page, query, display)
return string.format(
'[%s %s]',
tostring(mw.uri.fullUrl(page, query)),
display
)
end
-- Given a directed graph formatted as node -> table of direct successors,
-- get a table of all nodes reachable from a given node (though always
-- including the given node).
local function getReachableNodes(graph, start)
local toWalk, retval = {[start] = true}, {}
while true do
-- Can't use pairs() since we're adding and removing things as we're iterating
local k = next(toWalk) -- This always gets the "first" key
if k == nil then
return retval
end
toWalk[k] = nil
retval[k] = true
for _,v in ipairs(graph[k]) do
if not retval[v] then
toWalk[v] = true
end
end
end
end
--------------------------------------------------------------------------------
-- Protection class
--------------------------------------------------------------------------------
local Protection = {}
Protection.__index = Protection
Protection.supportedActions = {
edit = true,
move = true,
autoreview = true,
upload = true
}
Protection.bannerConfigFields = {
'text',
'explanation',
'tooltip',
'alt',
'link',
'image'
}
function Protection.new(args, cfg, title)
local obj = {}
obj._cfg = cfg
obj.title = title or mw.title.getCurrentTitle()
-- Set action
if not args.action then
obj.action = 'edit'
elseif Protection.supportedActions[args.action] then
obj.action = args.action
else
error(string.format(
'invalid action: %s',
tostring(args.action)
), 3)
end
-- Set level
obj.level = args.demolevel or effectiveProtectionLevel(obj.action, obj.title)
if not obj.level or (obj.action == 'move' and obj.level == 'autoconfirmed') then
-- Users need to be autoconfirmed to move pages anyway, so treat
-- semi-move-protected pages as unprotected.
obj.level = '*'
end
-- Set expiry
local effectiveExpiry = effectiveProtectionExpiry(obj.action, obj.title)
if effectiveExpiry == 'infinity' then
obj.expiry = 'indef'
elseif effectiveExpiry ~= 'unknown' then
obj.expiry = validateDate(effectiveExpiry, 'expiry date')
end
-- Set reason
if args[1] then
obj.reason = mw.ustring.lower(args[1])
if obj.reason:find('|') then
error('reasons cannot contain the pipe character ("|")', 3)
end
end
-- Set protection date
if args.date then
obj.protectionDate = validateDate(args.date, 'protection date')
end
-- Set banner config
do
obj.bannerConfig = {}
local configTables = {}
if cfg.banners[obj.action] then
configTables[#configTables + 1] = cfg.banners[obj.action][obj.reason]
end
if cfg.defaultBanners[obj.action] then
configTables[#configTables + 1] = cfg.defaultBanners[obj.action][obj.level]
configTables[#configTables + 1] = cfg.defaultBanners[obj.action].default
end
configTables[#configTables + 1] = cfg.masterBanner
for i, field in ipairs(Protection.bannerConfigFields) do
for j, t in ipairs(configTables) do
if t[field] then
obj.bannerConfig[field] = t[field]
break
end
end
end
end
return setmetatable(obj, Protection)
end
function Protection:isUserScript()
-- Whether the page is a user JavaScript or CSS page.
local title = self.title
return title.namespace == 2 and (
title.contentModel == 'javascript' or title.contentModel == 'css'
)
end
function Protection:isProtected()
return self.level ~= '*'
end
function Protection:shouldShowLock()
-- Whether we should output a banner/padlock
return self:isProtected() and not self:isUserScript()
end
-- Whether this page needs a protection category.
Protection.shouldHaveProtectionCategory = Protection.shouldShowLock
function Protection:isTemporary()
return type(self.expiry) == 'number'
end
function Protection:makeProtectionCategory()
if not self:shouldHaveProtectionCategory() then
return ''
end
local cfg = self._cfg
local title = self.title
-- Get the expiry key fragment.
local expiryFragment
if self.expiry == 'indef' then
expiryFragment = self.expiry
elseif type(self.expiry) == 'number' then
expiryFragment = 'temp'
end
-- Get the namespace key fragment.
local namespaceFragment = cfg.categoryNamespaceKeys[title.namespace]
if not namespaceFragment and title.namespace % 2 == 1 then
namespaceFragment = 'talk'
end
-- Define the order that key fragments are tested in. This is done with an
-- array of tables containing the value to be tested, along with its
-- position in the cfg.protectionCategories table.
local order = {
{val = expiryFragment, keypos = 1},
{val = namespaceFragment, keypos = 2},
{val = self.reason, keypos = 3},
{val = self.level, keypos = 4},
{val = self.action, keypos = 5}
}
--[[
-- The old protection templates used an ad-hoc protection category system,
-- with some templates prioritising namespaces in their categories, and
-- others prioritising the protection reason. To emulate this in this module
-- we use the config table cfg.reasonsWithNamespacePriority to set the
-- reasons for which namespaces have priority over protection reason.
-- If we are dealing with one of those reasons, move the namespace table to
-- the end of the order table, i.e. give it highest priority. If not, the
-- reason should have highest priority, so move that to the end of the table
-- instead.
--]]
table.insert(order, table.remove(order, self.reason and cfg.reasonsWithNamespacePriority[self.reason] and 2 or 3))
--[[
-- Define the attempt order. Inactive subtables (subtables with nil "value"
-- fields) are moved to the end, where they will later be given the key
-- "all". This is to cut down on the number of table lookups in
-- cfg.protectionCategories, which grows exponentially with the number of
-- non-nil keys. We keep track of the number of active subtables with the
-- noActive parameter.
--]]
local noActive, attemptOrder
do
local active, inactive = {}, {}
for i, t in ipairs(order) do
if t.val then
active[#active + 1] = t
else
inactive[#inactive + 1] = t
end
end
noActive = #active
attemptOrder = active
for i, t in ipairs(inactive) do
attemptOrder[#attemptOrder + 1] = t
end
end
--[[
-- Check increasingly generic key combinations until we find a match. If a
-- specific category exists for the combination of key fragments we are
-- given, that match will be found first. If not, we keep trying different
-- key fragment combinations until we match using the key
-- "all-all-all-all-all".
--
-- To generate the keys, we index the key subtables using a binary matrix
-- with indexes i and j. j is only calculated up to the number of active
-- subtables. For example, if there were three active subtables, the matrix
-- would look like this, with 0 corresponding to the key fragment "all", and
-- 1 corresponding to other key fragments.
--
-- j 1 2 3
-- i
-- 1 1 1 1
-- 2 0 1 1
-- 3 1 0 1
-- 4 0 0 1
-- 5 1 1 0
-- 6 0 1 0
-- 7 1 0 0
-- 8 0 0 0
--
-- Values of j higher than the number of active subtables are set
-- to the string "all".
--
-- A key for cfg.protectionCategories is constructed for each value of i.
-- The position of the value in the key is determined by the keypos field in
-- each subtable.
--]]
local cats = cfg.protectionCategories
for i = 1, 2^noActive do
local key = {}
for j, t in ipairs(attemptOrder) do
if j > noActive then
key[t.keypos] = 'all'
else
local quotient = i / 2 ^ (j - 1)
quotient = math.ceil(quotient)
if quotient % 2 == 1 then
key[t.keypos] = t.val
else
key[t.keypos] = 'all'
end
end
end
key = table.concat(key, '|')
local attempt = cats[key]
if attempt then
return makeCategoryLink(attempt, title.text)
end
end
return ''
end
function Protection:isIncorrect()
if not self:shouldHaveProtectionCategory() then
return true
end
if type(self.expiry) ~= 'number' then
return false
end
local expiry = os.date('*t', self.expiry)
-- Avoid checking today.day or os.time(), unless close. https://phabricator.wikimedia.org/T416616
local today = os.date('*t')
return (expiry.year < today.year)
or (expiry.year == today.year and expiry.month < today.month)
or (expiry.year == today.year and m == today.month and expiry.day < today.day)
or (expiry.year == today.year and m == today.month and expiry.day == today.day and self.expiry < os.time())
end
function Protection:isTemplateProtectedNonTemplate()
local action, namespace = self.action, self.title.namespace
return self.level == 'templateeditor'
and (
(action ~= 'edit' and action ~= 'move')
or (namespace ~= 10 and namespace ~= 828)
)
end
function Protection:makeCategoryLinks()
local msg = self._cfg.msg
local ret = {self:makeProtectionCategory()}
if self:isIncorrect() then
ret[#ret + 1] = makeCategoryLink(
msg['tracking-category-incorrect'],
self.title.text
)
end
if self:isTemplateProtectedNonTemplate() then
ret[#ret + 1] = makeCategoryLink(
msg['tracking-category-template'],
self.title.text
)
end
return table.concat(ret)
end
--------------------------------------------------------------------------------
-- Blurb class
--------------------------------------------------------------------------------
local Blurb = {}
Blurb.__index = Blurb
Blurb.bannerTextFields = {
text = true,
explanation = true,
tooltip = true,
alt = true,
link = true
}
function Blurb.new(protectionObj, args, cfg)
return setmetatable({
_cfg = cfg,
_protectionObj = protectionObj,
_args = args
}, Blurb)
end
-- Private methods --
function Blurb:_formatDate(num)
-- Formats a Unix timestamp into dd Month, YYYY format.
lang = lang or mw.language.getContentLanguage()
local success, date = pcall(
lang.formatDate,
lang,
self._cfg.msg['expiry-date-format'] or 'j F Y',
'@' .. tostring(num)
)
if success then
return date
end
end
function Blurb:_getExpandedMessage(msgKey)
return self:_substituteParameters(self._cfg.msg[msgKey])
end
function Blurb:_substituteParameters(msg)
if not self._params then
local parameterFuncs = {}
parameterFuncs.CURRENTVERSION = self._makeCurrentVersionParameter
parameterFuncs.EDITREQUEST = self._makeEditRequestParameter
parameterFuncs.EXPIRY = self._makeExpiryParameter
parameterFuncs.EXPLANATIONBLURB = self._makeExplanationBlurbParameter
parameterFuncs.IMAGELINK = self._makeImageLinkParameter
parameterFuncs.INTROBLURB = self._makeIntroBlurbParameter
parameterFuncs.INTROFRAGMENT = self._makeIntroFragmentParameter
parameterFuncs.PAGETYPE = self._makePagetypeParameter
parameterFuncs.PROTECTIONBLURB = self._makeProtectionBlurbParameter
parameterFuncs.PROTECTIONDATE = self._makeProtectionDateParameter
parameterFuncs.PROTECTIONLEVEL = self._makeProtectionLevelParameter
parameterFuncs.PROTECTIONLOG = self._makeProtectionLogParameter
parameterFuncs.TALKPAGE = self._makeTalkPageParameter
parameterFuncs.TOOLTIPBLURB = self._makeTooltipBlurbParameter
parameterFuncs.TOOLTIPFRAGMENT = self._makeTooltipFragmentParameter
parameterFuncs.VANDAL = self._makeVandalTemplateParameter
self._params = setmetatable({}, {
__index = function (t, k)
local param
if parameterFuncs[k] then
param = parameterFuncs[k](self)
end
param = param or ''
t[k] = param
return param
end
})
end
msg = msg:gsub('${(%u+)}', self._params)
return msg
end
function Blurb:_makeCurrentVersionParameter()
-- A link to the page history or the move log, depending on the kind of
-- protection.
local pagename = self._protectionObj.title.prefixedText
if self._protectionObj.action == 'move' then
-- We need the move log link.
return makeFullUrl(
'Special:Log',
{type = 'move', page = pagename},
self:_getExpandedMessage('current-version-move-display')
)
else
-- We need the history link.
return makeFullUrl(
pagename,
{action = 'history'},
self:_getExpandedMessage('current-version-edit-display')
)
end
end
function Blurb:_makeEditRequestParameter()
local mEditRequest = require('Module:Submit an edit request')
local action = self._protectionObj.action
local level = self._protectionObj.level
-- Get the edit request type.
local requestType
if action == 'edit' then
if level == 'autoconfirmed' then
requestType = 'semi'
elseif level == 'extendedconfirmed' then
requestType = 'extended'
elseif level == 'templateeditor' then
requestType = 'template'
end
end
requestType = requestType or 'full'
-- Get the display value.
local display = self:_getExpandedMessage('edit-request-display')
return mEditRequest._link{type = requestType, display = display}
end
function Blurb:_makeExpiryParameter()
local expiry = self._protectionObj.expiry
if type(expiry) == 'number' then
return self:_formatDate(expiry)
else
return expiry
end
end
function Blurb:_makeExplanationBlurbParameter()
-- Cover special cases first.
if self._protectionObj.title.namespace == 8 then
-- MediaWiki namespace
return self:_getExpandedMessage('explanation-blurb-nounprotect')
end
-- Get explanation blurb table keys
local action = self._protectionObj.action
local level = self._protectionObj.level
local talkKey = self._protectionObj.title.isTalkPage and 'talk' or 'subject'
-- Find the message in the explanation blurb table and substitute any
-- parameters.
local explanations = self._cfg.explanationBlurbs
local msg
if explanations[action][level] and explanations[action][level][talkKey] then
msg = explanations[action][level][talkKey]
elseif explanations[action][level] and explanations[action][level].default then
msg = explanations[action][level].default
elseif explanations[action].default and explanations[action].default[talkKey] then
msg = explanations[action].default[talkKey]
elseif explanations[action].default and explanations[action].default.default then
msg = explanations[action].default.default
else
error(string.format(
'could not find explanation blurb for action "%s", level "%s" and talk key "%s"',
action,
level,
talkKey
), 8)
end
return self:_substituteParameters(msg)
end
function Blurb:_makeImageLinkParameter()
local imageLinks = self._cfg.imageLinks
local action = self._protectionObj.action
local level = self._protectionObj.level
local msg
if imageLinks[action][level] then
msg = imageLinks[action][level]
elseif imageLinks[action].default then
msg = imageLinks[action].default
else
msg = imageLinks.edit.default
end
return self:_substituteParameters(msg)
end
function Blurb:_makeIntroBlurbParameter()
if self._protectionObj:isTemporary() then
return self:_getExpandedMessage('intro-blurb-expiry')
else
return self:_getExpandedMessage('intro-blurb-noexpiry')
end
end
function Blurb:_makeIntroFragmentParameter()
if self._protectionObj:isTemporary() then
return self:_getExpandedMessage('intro-fragment-expiry')
else
return self:_getExpandedMessage('intro-fragment-noexpiry')
end
end
function Blurb:_makePagetypeParameter()
local pagetypes = self._cfg.pagetypes
return pagetypes[self._protectionObj.title.namespace]
or pagetypes.default
or error('no default pagetype defined', 8)
end
function Blurb:_makeProtectionBlurbParameter()
local protectionBlurbs = self._cfg.protectionBlurbs
local action = self._protectionObj.action
local level = self._protectionObj.level
local msg
if protectionBlurbs[action][level] then
msg = protectionBlurbs[action][level]
elseif protectionBlurbs[action].default then
msg = protectionBlurbs[action].default
elseif protectionBlurbs.edit.default then
msg = protectionBlurbs.edit.default
else
error('no protection blurb defined for protectionBlurbs.edit.default', 8)
end
return self:_substituteParameters(msg)
end
function Blurb:_makeProtectionDateParameter()
local protectionDate = self._protectionObj.protectionDate
if type(protectionDate) == 'number' then
return self:_formatDate(protectionDate)
else
return protectionDate
end
end
function Blurb:_makeProtectionLevelParameter()
local protectionLevels = self._cfg.protectionLevels
local action = self._protectionObj.action
local level = self._protectionObj.level
local msg
if protectionLevels[action][level] then
msg = protectionLevels[action][level]
elseif protectionLevels[action].default then
msg = protectionLevels[action].default
elseif protectionLevels.edit.default then
msg = protectionLevels.edit.default
else
error('no protection level defined for protectionLevels.edit.default', 8)
end
return self:_substituteParameters(msg)
end
function Blurb:_makeProtectionLogParameter()
local pagename = self._protectionObj.title.prefixedText
if self._protectionObj.action == 'autoreview' then
-- We need the pending changes log.
return makeFullUrl(
'Special:Log',
{type = 'stable', page = pagename},
self:_getExpandedMessage('pc-log-display')
)
else
-- We need the protection log.
return makeFullUrl(
'Special:Log',
{type = 'protect', page = pagename},
self:_getExpandedMessage('protection-log-display')
)
end
end
function Blurb:_makeTalkPageParameter()
return string.format(
'[[%s:%s#%s|%s]]',
mw.site.namespaces[self._protectionObj.title.namespace].talk.name,
self._protectionObj.title.text,
self._args.section or 'top',
self:_getExpandedMessage('talk-page-link-display')
)
end
function Blurb:_makeTooltipBlurbParameter()
if self._protectionObj:isTemporary() then
return self:_getExpandedMessage('tooltip-blurb-expiry')
else
return self:_getExpandedMessage('tooltip-blurb-noexpiry')
end
end
function Blurb:_makeTooltipFragmentParameter()
if self._protectionObj:isTemporary() then
return self:_getExpandedMessage('tooltip-fragment-expiry')
else
return self:_getExpandedMessage('tooltip-fragment-noexpiry')
end
end
function Blurb:_makeVandalTemplateParameter()
return mw.getCurrentFrame():expandTemplate{
title="vandal-m",
args={self._args.user or self._protectionObj.title.baseText}
}
end
-- Public methods --
function Blurb:makeBannerText(key)
-- Validate input.
if not key or not Blurb.bannerTextFields[key] then
error(string.format(
'"%s" is not a valid banner config field',
tostring(key)
), 2)
end
-- Generate the text.
local msg = self._protectionObj.bannerConfig[key]
if type(msg) == 'string' then
return self:_substituteParameters(msg)
elseif type(msg) == 'function' then
msg = msg(self._protectionObj, self._args)
if type(msg) ~= 'string' then
error(string.format(
'bad output from banner config function with key "%s"'
.. ' (expected string, got %s)',
tostring(key),
type(msg)
), 4)
end
return self:_substituteParameters(msg)
end
end
--------------------------------------------------------------------------------
-- BannerTemplate class
--------------------------------------------------------------------------------
local BannerTemplate = {}
BannerTemplate.__index = BannerTemplate
function BannerTemplate.new(protectionObj, cfg)
local obj = {}
obj._cfg = cfg
-- Set the image filename.
local imageFilename = protectionObj.bannerConfig.image
if imageFilename then
obj._imageFilename = imageFilename
else
-- If an image filename isn't specified explicitly in the banner config,
-- generate it from the protection status and the namespace.
local action = protectionObj.action
local level = protectionObj.level
local namespace = protectionObj.title.namespace
local reason = protectionObj.reason
-- Deal with special cases first.
if (
namespace == 10
or namespace == 828
or reason and obj._cfg.indefImageReasons[reason]
)
and action == 'edit'
and level == 'sysop'
and not protectionObj:isTemporary()
then
-- Fully protected modules and templates get the special red "indef"
-- padlock.
obj._imageFilename = obj._cfg.msg['image-filename-indef']
else
-- Deal with regular protection types.
local images = obj._cfg.images
if images[action] then
if images[action][level] then
obj._imageFilename = images[action][level]
elseif images[action].default then
obj._imageFilename = images[action].default
end
end
end
end
return setmetatable(obj, BannerTemplate)
end
function BannerTemplate:renderImage()
local filename = self._imageFilename
or self._cfg.msg['image-filename-default']
or 'Transparent.gif'
return makeFileLink{
file = filename,
size = (self.imageWidth or 20) .. 'px',
alt = self._imageAlt,
link = self._imageLink,
caption = self.imageCaption
}
end
--------------------------------------------------------------------------------
-- Banner class
--------------------------------------------------------------------------------
local Banner = setmetatable({}, BannerTemplate)
Banner.__index = Banner
function Banner.new(protectionObj, blurbObj, cfg)
local obj = BannerTemplate.new(protectionObj, cfg) -- This doesn't need the blurb.
obj.imageWidth = 40
obj.imageCaption = blurbObj:makeBannerText('alt') -- Large banners use the alt text for the tooltip.
obj._reasonText = blurbObj:makeBannerText('text')
obj._explanationText = blurbObj:makeBannerText('explanation')
obj._page = protectionObj.title.prefixedText -- Only makes a difference in testing.
return setmetatable(obj, Banner)
end
function Banner:__tostring()
-- Renders the banner.
makeMessageBox = makeMessageBox or require('Module:Message box').main
local reasonText = self._reasonText or error('no reason text set', 2)
local explanationText = self._explanationText
local mbargs = {
page = self._page,
type = 'protection',
image = self:renderImage(),
text = string.format(
"'''%s'''%s",
reasonText,
explanationText and '<br />' .. explanationText or ''
)
}
return makeMessageBox('mbox', mbargs)
end
--------------------------------------------------------------------------------
-- Padlock class
--------------------------------------------------------------------------------
local Padlock = setmetatable({}, BannerTemplate)
Padlock.__index = Padlock
function Padlock.new(protectionObj, blurbObj, cfg)
local obj = BannerTemplate.new(protectionObj, cfg) -- This doesn't need the blurb.
obj.imageWidth = 20
obj.imageCaption = blurbObj:makeBannerText('tooltip')
obj._imageAlt = blurbObj:makeBannerText('alt')
obj._imageLink = blurbObj:makeBannerText('link')
obj._indicatorName = cfg.padlockIndicatorNames[protectionObj.action]
or cfg.padlockIndicatorNames.default
or 'pp-default'
return setmetatable(obj, Padlock)
end
function Padlock:__tostring()
local frame = mw.getCurrentFrame()
-- The nowiki tag helps prevent whitespace at the top of articles.
return frame:extensionTag{name = 'nowiki'} .. frame:extensionTag{
name = 'indicator',
args = {name = self._indicatorName},
content = self:renderImage()
}
end
--------------------------------------------------------------------------------
-- Exports
--------------------------------------------------------------------------------
local p = {}
function p._exportClasses()
-- This is used for testing purposes.
return {
Protection = Protection,
Blurb = Blurb,
BannerTemplate = BannerTemplate,
Banner = Banner,
Padlock = Padlock,
}
end
function p._main(args, cfg, title)
args = args or {}
cfg = cfg or require(CONFIG_MODULE)
local protectionObj = Protection.new(args, cfg, title)
local ret = {}
-- If a page's edit protection is equally or more restrictive than its
-- protection from some other action, then don't bother displaying anything
-- for the other action (except categories).
if not yesno(args.catonly) and (protectionObj.action == 'edit' or
args.demolevel or
not getReachableNodes(
cfg.hierarchy,
protectionObj.level
)[effectiveProtectionLevel('edit', protectionObj.title)])
then
-- Initialise the blurb object
local blurbObj = Blurb.new(protectionObj, args, cfg)
-- Render the banner
if protectionObj:shouldShowLock() then
ret[#ret + 1] = tostring(
(yesno(args.small) and Padlock or Banner)
.new(protectionObj, blurbObj, cfg)
)
end
end
-- Render the categories
if yesno(args.category) ~= false then
ret[#ret + 1] = protectionObj:makeCategoryLinks()
end
-- For arbitration enforcement, flagging [[WP:PIA]] pages to enable [[Special:AbuseFilter/1339]] to flag edits to them
if protectionObj.level == "extendedconfirmed" then
if require("Module:TableTools").inArray(protectionObj.title.talkPageTitle.categories, "Wikipedia pages subject to the extended confirmed restriction related to the Arab-Israeli conflict") then
ret[#ret + 1] = "<p class='PIA-flag' style='display:none; visibility:hidden;' title='This page is subject to the extended confirmed restriction related to the Arab-Israeli conflict.'></p>"
end
end
return table.concat(ret)
end
function p.main(frame, cfg)
cfg = cfg or require(CONFIG_MODULE)
-- Find default args, if any.
local parent = frame.getParent and frame:getParent()
local defaultArgs = parent and cfg.wrappers[parent:getTitle():gsub('/sandbox$', '')]
-- Find user args, and use the parent frame if we are being called from a
-- wrapper template.
getArgs = getArgs or require('Module:Arguments').getArgs
local userArgs = getArgs(frame, {
parentOnly = defaultArgs,
frameOnly = not defaultArgs
})
-- Build the args table. User-specified args overwrite default args.
local args = {}
for k, v in pairs(defaultArgs or {}) do
args[k] = v
end
for k, v in pairs(userArgs) do
args[k] = v
end
return p._main(args, cfg)
end
return p
ca78071iwrxsb38bewt6h1qqbix3y8o
802665
802664
2026-02-18T08:46:08Z
en>Krinkle
0
802665
Scribunto
text/plain
-- This module implements {{pp-meta}} and its daughter templates such as
-- {{pp-dispute}}, {{pp-vandalism}} and {{pp-sock}}.
-- Initialise necessary modules.
require('strict')
local makeFileLink = require('Module:File link')._main
local effectiveProtectionLevel = require('Module:Effective protection level')._main
local effectiveProtectionExpiry = require('Module:Effective protection expiry')._main
local yesno = require('Module:Yesno')
-- Lazily initialise modules and objects we don't always need.
local getArgs, makeMessageBox, lang
-- Set constants.
local CONFIG_MODULE = 'Module:Protection banner/config'
--------------------------------------------------------------------------------
-- Helper functions
--------------------------------------------------------------------------------
local function makeCategoryLink(cat, sort)
if cat then
return string.format(
'[[%s:%s|%s]]',
mw.site.namespaces[14].name,
cat,
sort
)
end
end
-- Validation function for the expiry and the protection date
local function validateDate(dateString, dateType)
if not lang then
lang = mw.language.getContentLanguage()
end
local success, result = pcall(lang.formatDate, lang, 'U', dateString)
if success then
result = tonumber(result)
if result then
return result
end
end
error(string.format(
'invalid %s: %s',
dateType,
tostring(dateString)
), 4)
end
local function makeFullUrl(page, query, display)
return string.format(
'[%s %s]',
tostring(mw.uri.fullUrl(page, query)),
display
)
end
-- Given a directed graph formatted as node -> table of direct successors,
-- get a table of all nodes reachable from a given node (though always
-- including the given node).
local function getReachableNodes(graph, start)
local toWalk, retval = {[start] = true}, {}
while true do
-- Can't use pairs() since we're adding and removing things as we're iterating
local k = next(toWalk) -- This always gets the "first" key
if k == nil then
return retval
end
toWalk[k] = nil
retval[k] = true
for _,v in ipairs(graph[k]) do
if not retval[v] then
toWalk[v] = true
end
end
end
end
--------------------------------------------------------------------------------
-- Protection class
--------------------------------------------------------------------------------
local Protection = {}
Protection.__index = Protection
Protection.supportedActions = {
edit = true,
move = true,
autoreview = true,
upload = true
}
Protection.bannerConfigFields = {
'text',
'explanation',
'tooltip',
'alt',
'link',
'image'
}
function Protection.new(args, cfg, title)
local obj = {}
obj._cfg = cfg
obj.title = title or mw.title.getCurrentTitle()
-- Set action
if not args.action then
obj.action = 'edit'
elseif Protection.supportedActions[args.action] then
obj.action = args.action
else
error(string.format(
'invalid action: %s',
tostring(args.action)
), 3)
end
-- Set level
obj.level = args.demolevel or effectiveProtectionLevel(obj.action, obj.title)
if not obj.level or (obj.action == 'move' and obj.level == 'autoconfirmed') then
-- Users need to be autoconfirmed to move pages anyway, so treat
-- semi-move-protected pages as unprotected.
obj.level = '*'
end
-- Set expiry
local effectiveExpiry = effectiveProtectionExpiry(obj.action, obj.title)
if effectiveExpiry == 'infinity' then
obj.expiry = 'indef'
elseif effectiveExpiry ~= 'unknown' then
obj.expiry = validateDate(effectiveExpiry, 'expiry date')
end
-- Set reason
if args[1] then
obj.reason = mw.ustring.lower(args[1])
if obj.reason:find('|') then
error('reasons cannot contain the pipe character ("|")', 3)
end
end
-- Set protection date
if args.date then
obj.protectionDate = validateDate(args.date, 'protection date')
end
-- Set banner config
do
obj.bannerConfig = {}
local configTables = {}
if cfg.banners[obj.action] then
configTables[#configTables + 1] = cfg.banners[obj.action][obj.reason]
end
if cfg.defaultBanners[obj.action] then
configTables[#configTables + 1] = cfg.defaultBanners[obj.action][obj.level]
configTables[#configTables + 1] = cfg.defaultBanners[obj.action].default
end
configTables[#configTables + 1] = cfg.masterBanner
for i, field in ipairs(Protection.bannerConfigFields) do
for j, t in ipairs(configTables) do
if t[field] then
obj.bannerConfig[field] = t[field]
break
end
end
end
end
return setmetatable(obj, Protection)
end
function Protection:isUserScript()
-- Whether the page is a user JavaScript or CSS page.
local title = self.title
return title.namespace == 2 and (
title.contentModel == 'javascript' or title.contentModel == 'css'
)
end
function Protection:isProtected()
return self.level ~= '*'
end
function Protection:shouldShowLock()
-- Whether we should output a banner/padlock
return self:isProtected() and not self:isUserScript()
end
-- Whether this page needs a protection category.
Protection.shouldHaveProtectionCategory = Protection.shouldShowLock
function Protection:isTemporary()
return type(self.expiry) == 'number'
end
function Protection:makeProtectionCategory()
if not self:shouldHaveProtectionCategory() then
return ''
end
local cfg = self._cfg
local title = self.title
-- Get the expiry key fragment.
local expiryFragment
if self.expiry == 'indef' then
expiryFragment = self.expiry
elseif type(self.expiry) == 'number' then
expiryFragment = 'temp'
end
-- Get the namespace key fragment.
local namespaceFragment = cfg.categoryNamespaceKeys[title.namespace]
if not namespaceFragment and title.namespace % 2 == 1 then
namespaceFragment = 'talk'
end
-- Define the order that key fragments are tested in. This is done with an
-- array of tables containing the value to be tested, along with its
-- position in the cfg.protectionCategories table.
local order = {
{val = expiryFragment, keypos = 1},
{val = namespaceFragment, keypos = 2},
{val = self.reason, keypos = 3},
{val = self.level, keypos = 4},
{val = self.action, keypos = 5}
}
--[[
-- The old protection templates used an ad-hoc protection category system,
-- with some templates prioritising namespaces in their categories, and
-- others prioritising the protection reason. To emulate this in this module
-- we use the config table cfg.reasonsWithNamespacePriority to set the
-- reasons for which namespaces have priority over protection reason.
-- If we are dealing with one of those reasons, move the namespace table to
-- the end of the order table, i.e. give it highest priority. If not, the
-- reason should have highest priority, so move that to the end of the table
-- instead.
--]]
table.insert(order, table.remove(order, self.reason and cfg.reasonsWithNamespacePriority[self.reason] and 2 or 3))
--[[
-- Define the attempt order. Inactive subtables (subtables with nil "value"
-- fields) are moved to the end, where they will later be given the key
-- "all". This is to cut down on the number of table lookups in
-- cfg.protectionCategories, which grows exponentially with the number of
-- non-nil keys. We keep track of the number of active subtables with the
-- noActive parameter.
--]]
local noActive, attemptOrder
do
local active, inactive = {}, {}
for i, t in ipairs(order) do
if t.val then
active[#active + 1] = t
else
inactive[#inactive + 1] = t
end
end
noActive = #active
attemptOrder = active
for i, t in ipairs(inactive) do
attemptOrder[#attemptOrder + 1] = t
end
end
--[[
-- Check increasingly generic key combinations until we find a match. If a
-- specific category exists for the combination of key fragments we are
-- given, that match will be found first. If not, we keep trying different
-- key fragment combinations until we match using the key
-- "all-all-all-all-all".
--
-- To generate the keys, we index the key subtables using a binary matrix
-- with indexes i and j. j is only calculated up to the number of active
-- subtables. For example, if there were three active subtables, the matrix
-- would look like this, with 0 corresponding to the key fragment "all", and
-- 1 corresponding to other key fragments.
--
-- j 1 2 3
-- i
-- 1 1 1 1
-- 2 0 1 1
-- 3 1 0 1
-- 4 0 0 1
-- 5 1 1 0
-- 6 0 1 0
-- 7 1 0 0
-- 8 0 0 0
--
-- Values of j higher than the number of active subtables are set
-- to the string "all".
--
-- A key for cfg.protectionCategories is constructed for each value of i.
-- The position of the value in the key is determined by the keypos field in
-- each subtable.
--]]
local cats = cfg.protectionCategories
for i = 1, 2^noActive do
local key = {}
for j, t in ipairs(attemptOrder) do
if j > noActive then
key[t.keypos] = 'all'
else
local quotient = i / 2 ^ (j - 1)
quotient = math.ceil(quotient)
if quotient % 2 == 1 then
key[t.keypos] = t.val
else
key[t.keypos] = 'all'
end
end
end
key = table.concat(key, '|')
local attempt = cats[key]
if attempt then
return makeCategoryLink(attempt, title.text)
end
end
return ''
end
function Protection:isIncorrect()
if not self:shouldHaveProtectionCategory() then
return true
end
if type(self.expiry) ~= 'number' then
return false
end
local expiry = os.date('*t', self.expiry)
-- Avoid checking today.day or os.time(), unless close. https://phabricator.wikimedia.org/T416616
local today = os.date('*t')
return (expiry.year < today.year)
or (expiry.year == today.year and expiry.month < today.month)
or (expiry.year == today.year and expiry.month == today.month and expiry.day < today.day)
or (expiry.year == today.year and expiry.month == today.month and expiry.day == today.day and self.expiry < os.time())
end
function Protection:isTemplateProtectedNonTemplate()
local action, namespace = self.action, self.title.namespace
return self.level == 'templateeditor'
and (
(action ~= 'edit' and action ~= 'move')
or (namespace ~= 10 and namespace ~= 828)
)
end
function Protection:makeCategoryLinks()
local msg = self._cfg.msg
local ret = {self:makeProtectionCategory()}
if self:isIncorrect() then
ret[#ret + 1] = makeCategoryLink(
msg['tracking-category-incorrect'],
self.title.text
)
end
if self:isTemplateProtectedNonTemplate() then
ret[#ret + 1] = makeCategoryLink(
msg['tracking-category-template'],
self.title.text
)
end
return table.concat(ret)
end
--------------------------------------------------------------------------------
-- Blurb class
--------------------------------------------------------------------------------
local Blurb = {}
Blurb.__index = Blurb
Blurb.bannerTextFields = {
text = true,
explanation = true,
tooltip = true,
alt = true,
link = true
}
function Blurb.new(protectionObj, args, cfg)
return setmetatable({
_cfg = cfg,
_protectionObj = protectionObj,
_args = args
}, Blurb)
end
-- Private methods --
function Blurb:_formatDate(num)
-- Formats a Unix timestamp into dd Month, YYYY format.
lang = lang or mw.language.getContentLanguage()
local success, date = pcall(
lang.formatDate,
lang,
self._cfg.msg['expiry-date-format'] or 'j F Y',
'@' .. tostring(num)
)
if success then
return date
end
end
function Blurb:_getExpandedMessage(msgKey)
return self:_substituteParameters(self._cfg.msg[msgKey])
end
function Blurb:_substituteParameters(msg)
if not self._params then
local parameterFuncs = {}
parameterFuncs.CURRENTVERSION = self._makeCurrentVersionParameter
parameterFuncs.EDITREQUEST = self._makeEditRequestParameter
parameterFuncs.EXPIRY = self._makeExpiryParameter
parameterFuncs.EXPLANATIONBLURB = self._makeExplanationBlurbParameter
parameterFuncs.IMAGELINK = self._makeImageLinkParameter
parameterFuncs.INTROBLURB = self._makeIntroBlurbParameter
parameterFuncs.INTROFRAGMENT = self._makeIntroFragmentParameter
parameterFuncs.PAGETYPE = self._makePagetypeParameter
parameterFuncs.PROTECTIONBLURB = self._makeProtectionBlurbParameter
parameterFuncs.PROTECTIONDATE = self._makeProtectionDateParameter
parameterFuncs.PROTECTIONLEVEL = self._makeProtectionLevelParameter
parameterFuncs.PROTECTIONLOG = self._makeProtectionLogParameter
parameterFuncs.TALKPAGE = self._makeTalkPageParameter
parameterFuncs.TOOLTIPBLURB = self._makeTooltipBlurbParameter
parameterFuncs.TOOLTIPFRAGMENT = self._makeTooltipFragmentParameter
parameterFuncs.VANDAL = self._makeVandalTemplateParameter
self._params = setmetatable({}, {
__index = function (t, k)
local param
if parameterFuncs[k] then
param = parameterFuncs[k](self)
end
param = param or ''
t[k] = param
return param
end
})
end
msg = msg:gsub('${(%u+)}', self._params)
return msg
end
function Blurb:_makeCurrentVersionParameter()
-- A link to the page history or the move log, depending on the kind of
-- protection.
local pagename = self._protectionObj.title.prefixedText
if self._protectionObj.action == 'move' then
-- We need the move log link.
return makeFullUrl(
'Special:Log',
{type = 'move', page = pagename},
self:_getExpandedMessage('current-version-move-display')
)
else
-- We need the history link.
return makeFullUrl(
pagename,
{action = 'history'},
self:_getExpandedMessage('current-version-edit-display')
)
end
end
function Blurb:_makeEditRequestParameter()
local mEditRequest = require('Module:Submit an edit request')
local action = self._protectionObj.action
local level = self._protectionObj.level
-- Get the edit request type.
local requestType
if action == 'edit' then
if level == 'autoconfirmed' then
requestType = 'semi'
elseif level == 'extendedconfirmed' then
requestType = 'extended'
elseif level == 'templateeditor' then
requestType = 'template'
end
end
requestType = requestType or 'full'
-- Get the display value.
local display = self:_getExpandedMessage('edit-request-display')
return mEditRequest._link{type = requestType, display = display}
end
function Blurb:_makeExpiryParameter()
local expiry = self._protectionObj.expiry
if type(expiry) == 'number' then
return self:_formatDate(expiry)
else
return expiry
end
end
function Blurb:_makeExplanationBlurbParameter()
-- Cover special cases first.
if self._protectionObj.title.namespace == 8 then
-- MediaWiki namespace
return self:_getExpandedMessage('explanation-blurb-nounprotect')
end
-- Get explanation blurb table keys
local action = self._protectionObj.action
local level = self._protectionObj.level
local talkKey = self._protectionObj.title.isTalkPage and 'talk' or 'subject'
-- Find the message in the explanation blurb table and substitute any
-- parameters.
local explanations = self._cfg.explanationBlurbs
local msg
if explanations[action][level] and explanations[action][level][talkKey] then
msg = explanations[action][level][talkKey]
elseif explanations[action][level] and explanations[action][level].default then
msg = explanations[action][level].default
elseif explanations[action].default and explanations[action].default[talkKey] then
msg = explanations[action].default[talkKey]
elseif explanations[action].default and explanations[action].default.default then
msg = explanations[action].default.default
else
error(string.format(
'could not find explanation blurb for action "%s", level "%s" and talk key "%s"',
action,
level,
talkKey
), 8)
end
return self:_substituteParameters(msg)
end
function Blurb:_makeImageLinkParameter()
local imageLinks = self._cfg.imageLinks
local action = self._protectionObj.action
local level = self._protectionObj.level
local msg
if imageLinks[action][level] then
msg = imageLinks[action][level]
elseif imageLinks[action].default then
msg = imageLinks[action].default
else
msg = imageLinks.edit.default
end
return self:_substituteParameters(msg)
end
function Blurb:_makeIntroBlurbParameter()
if self._protectionObj:isTemporary() then
return self:_getExpandedMessage('intro-blurb-expiry')
else
return self:_getExpandedMessage('intro-blurb-noexpiry')
end
end
function Blurb:_makeIntroFragmentParameter()
if self._protectionObj:isTemporary() then
return self:_getExpandedMessage('intro-fragment-expiry')
else
return self:_getExpandedMessage('intro-fragment-noexpiry')
end
end
function Blurb:_makePagetypeParameter()
local pagetypes = self._cfg.pagetypes
return pagetypes[self._protectionObj.title.namespace]
or pagetypes.default
or error('no default pagetype defined', 8)
end
function Blurb:_makeProtectionBlurbParameter()
local protectionBlurbs = self._cfg.protectionBlurbs
local action = self._protectionObj.action
local level = self._protectionObj.level
local msg
if protectionBlurbs[action][level] then
msg = protectionBlurbs[action][level]
elseif protectionBlurbs[action].default then
msg = protectionBlurbs[action].default
elseif protectionBlurbs.edit.default then
msg = protectionBlurbs.edit.default
else
error('no protection blurb defined for protectionBlurbs.edit.default', 8)
end
return self:_substituteParameters(msg)
end
function Blurb:_makeProtectionDateParameter()
local protectionDate = self._protectionObj.protectionDate
if type(protectionDate) == 'number' then
return self:_formatDate(protectionDate)
else
return protectionDate
end
end
function Blurb:_makeProtectionLevelParameter()
local protectionLevels = self._cfg.protectionLevels
local action = self._protectionObj.action
local level = self._protectionObj.level
local msg
if protectionLevels[action][level] then
msg = protectionLevels[action][level]
elseif protectionLevels[action].default then
msg = protectionLevels[action].default
elseif protectionLevels.edit.default then
msg = protectionLevels.edit.default
else
error('no protection level defined for protectionLevels.edit.default', 8)
end
return self:_substituteParameters(msg)
end
function Blurb:_makeProtectionLogParameter()
local pagename = self._protectionObj.title.prefixedText
if self._protectionObj.action == 'autoreview' then
-- We need the pending changes log.
return makeFullUrl(
'Special:Log',
{type = 'stable', page = pagename},
self:_getExpandedMessage('pc-log-display')
)
else
-- We need the protection log.
return makeFullUrl(
'Special:Log',
{type = 'protect', page = pagename},
self:_getExpandedMessage('protection-log-display')
)
end
end
function Blurb:_makeTalkPageParameter()
return string.format(
'[[%s:%s#%s|%s]]',
mw.site.namespaces[self._protectionObj.title.namespace].talk.name,
self._protectionObj.title.text,
self._args.section or 'top',
self:_getExpandedMessage('talk-page-link-display')
)
end
function Blurb:_makeTooltipBlurbParameter()
if self._protectionObj:isTemporary() then
return self:_getExpandedMessage('tooltip-blurb-expiry')
else
return self:_getExpandedMessage('tooltip-blurb-noexpiry')
end
end
function Blurb:_makeTooltipFragmentParameter()
if self._protectionObj:isTemporary() then
return self:_getExpandedMessage('tooltip-fragment-expiry')
else
return self:_getExpandedMessage('tooltip-fragment-noexpiry')
end
end
function Blurb:_makeVandalTemplateParameter()
return mw.getCurrentFrame():expandTemplate{
title="vandal-m",
args={self._args.user or self._protectionObj.title.baseText}
}
end
-- Public methods --
function Blurb:makeBannerText(key)
-- Validate input.
if not key or not Blurb.bannerTextFields[key] then
error(string.format(
'"%s" is not a valid banner config field',
tostring(key)
), 2)
end
-- Generate the text.
local msg = self._protectionObj.bannerConfig[key]
if type(msg) == 'string' then
return self:_substituteParameters(msg)
elseif type(msg) == 'function' then
msg = msg(self._protectionObj, self._args)
if type(msg) ~= 'string' then
error(string.format(
'bad output from banner config function with key "%s"'
.. ' (expected string, got %s)',
tostring(key),
type(msg)
), 4)
end
return self:_substituteParameters(msg)
end
end
--------------------------------------------------------------------------------
-- BannerTemplate class
--------------------------------------------------------------------------------
local BannerTemplate = {}
BannerTemplate.__index = BannerTemplate
function BannerTemplate.new(protectionObj, cfg)
local obj = {}
obj._cfg = cfg
-- Set the image filename.
local imageFilename = protectionObj.bannerConfig.image
if imageFilename then
obj._imageFilename = imageFilename
else
-- If an image filename isn't specified explicitly in the banner config,
-- generate it from the protection status and the namespace.
local action = protectionObj.action
local level = protectionObj.level
local namespace = protectionObj.title.namespace
local reason = protectionObj.reason
-- Deal with special cases first.
if (
namespace == 10
or namespace == 828
or reason and obj._cfg.indefImageReasons[reason]
)
and action == 'edit'
and level == 'sysop'
and not protectionObj:isTemporary()
then
-- Fully protected modules and templates get the special red "indef"
-- padlock.
obj._imageFilename = obj._cfg.msg['image-filename-indef']
else
-- Deal with regular protection types.
local images = obj._cfg.images
if images[action] then
if images[action][level] then
obj._imageFilename = images[action][level]
elseif images[action].default then
obj._imageFilename = images[action].default
end
end
end
end
return setmetatable(obj, BannerTemplate)
end
function BannerTemplate:renderImage()
local filename = self._imageFilename
or self._cfg.msg['image-filename-default']
or 'Transparent.gif'
return makeFileLink{
file = filename,
size = (self.imageWidth or 20) .. 'px',
alt = self._imageAlt,
link = self._imageLink,
caption = self.imageCaption
}
end
--------------------------------------------------------------------------------
-- Banner class
--------------------------------------------------------------------------------
local Banner = setmetatable({}, BannerTemplate)
Banner.__index = Banner
function Banner.new(protectionObj, blurbObj, cfg)
local obj = BannerTemplate.new(protectionObj, cfg) -- This doesn't need the blurb.
obj.imageWidth = 40
obj.imageCaption = blurbObj:makeBannerText('alt') -- Large banners use the alt text for the tooltip.
obj._reasonText = blurbObj:makeBannerText('text')
obj._explanationText = blurbObj:makeBannerText('explanation')
obj._page = protectionObj.title.prefixedText -- Only makes a difference in testing.
return setmetatable(obj, Banner)
end
function Banner:__tostring()
-- Renders the banner.
makeMessageBox = makeMessageBox or require('Module:Message box').main
local reasonText = self._reasonText or error('no reason text set', 2)
local explanationText = self._explanationText
local mbargs = {
page = self._page,
type = 'protection',
image = self:renderImage(),
text = string.format(
"'''%s'''%s",
reasonText,
explanationText and '<br />' .. explanationText or ''
)
}
return makeMessageBox('mbox', mbargs)
end
--------------------------------------------------------------------------------
-- Padlock class
--------------------------------------------------------------------------------
local Padlock = setmetatable({}, BannerTemplate)
Padlock.__index = Padlock
function Padlock.new(protectionObj, blurbObj, cfg)
local obj = BannerTemplate.new(protectionObj, cfg) -- This doesn't need the blurb.
obj.imageWidth = 20
obj.imageCaption = blurbObj:makeBannerText('tooltip')
obj._imageAlt = blurbObj:makeBannerText('alt')
obj._imageLink = blurbObj:makeBannerText('link')
obj._indicatorName = cfg.padlockIndicatorNames[protectionObj.action]
or cfg.padlockIndicatorNames.default
or 'pp-default'
return setmetatable(obj, Padlock)
end
function Padlock:__tostring()
local frame = mw.getCurrentFrame()
-- The nowiki tag helps prevent whitespace at the top of articles.
return frame:extensionTag{name = 'nowiki'} .. frame:extensionTag{
name = 'indicator',
args = {name = self._indicatorName},
content = self:renderImage()
}
end
--------------------------------------------------------------------------------
-- Exports
--------------------------------------------------------------------------------
local p = {}
function p._exportClasses()
-- This is used for testing purposes.
return {
Protection = Protection,
Blurb = Blurb,
BannerTemplate = BannerTemplate,
Banner = Banner,
Padlock = Padlock,
}
end
function p._main(args, cfg, title)
args = args or {}
cfg = cfg or require(CONFIG_MODULE)
local protectionObj = Protection.new(args, cfg, title)
local ret = {}
-- If a page's edit protection is equally or more restrictive than its
-- protection from some other action, then don't bother displaying anything
-- for the other action (except categories).
if not yesno(args.catonly) and (protectionObj.action == 'edit' or
args.demolevel or
not getReachableNodes(
cfg.hierarchy,
protectionObj.level
)[effectiveProtectionLevel('edit', protectionObj.title)])
then
-- Initialise the blurb object
local blurbObj = Blurb.new(protectionObj, args, cfg)
-- Render the banner
if protectionObj:shouldShowLock() then
ret[#ret + 1] = tostring(
(yesno(args.small) and Padlock or Banner)
.new(protectionObj, blurbObj, cfg)
)
end
end
-- Render the categories
if yesno(args.category) ~= false then
ret[#ret + 1] = protectionObj:makeCategoryLinks()
end
-- For arbitration enforcement, flagging [[WP:PIA]] pages to enable [[Special:AbuseFilter/1339]] to flag edits to them
if protectionObj.level == "extendedconfirmed" then
if require("Module:TableTools").inArray(protectionObj.title.talkPageTitle.categories, "Wikipedia pages subject to the extended confirmed restriction related to the Arab-Israeli conflict") then
ret[#ret + 1] = "<p class='PIA-flag' style='display:none; visibility:hidden;' title='This page is subject to the extended confirmed restriction related to the Arab-Israeli conflict.'></p>"
end
end
return table.concat(ret)
end
function p.main(frame, cfg)
cfg = cfg or require(CONFIG_MODULE)
-- Find default args, if any.
local parent = frame.getParent and frame:getParent()
local defaultArgs = parent and cfg.wrappers[parent:getTitle():gsub('/sandbox$', '')]
-- Find user args, and use the parent frame if we are being called from a
-- wrapper template.
getArgs = getArgs or require('Module:Arguments').getArgs
local userArgs = getArgs(frame, {
parentOnly = defaultArgs,
frameOnly = not defaultArgs
})
-- Build the args table. User-specified args overwrite default args.
local args = {}
for k, v in pairs(defaultArgs or {}) do
args[k] = v
end
for k, v in pairs(userArgs) do
args[k] = v
end
return p._main(args, cfg)
end
return p
o3ocs8c50hagthmsuho5s6y44o0rimz
802666
788014
2026-07-26T19:30:12Z
SM7
3953
3 revisions imported from [[:en:Module:Protection_banner]]
788014
Scribunto
text/plain
-- This module implements {{pp-meta}} and its daughter templates such as
-- {{pp-dispute}}, {{pp-vandalism}} and {{pp-sock}}.
-- Initialise necessary modules.
require('strict')
local makeFileLink = require('Module:File link')._main
local effectiveProtectionLevel = require('Module:Effective protection level')._main
local effectiveProtectionExpiry = require('Module:Effective protection expiry')._main
local yesno = require('Module:Yesno')
-- Lazily initialise modules and objects we don't always need.
local getArgs, makeMessageBox, lang
-- Set constants.
local CONFIG_MODULE = 'Module:Protection banner/config'
--------------------------------------------------------------------------------
-- Helper functions
--------------------------------------------------------------------------------
local function makeCategoryLink(cat, sort)
if cat then
return string.format(
'[[%s:%s|%s]]',
mw.site.namespaces[14].name,
cat,
sort
)
end
end
-- Validation function for the expiry and the protection date
local function validateDate(dateString, dateType)
if not lang then
lang = mw.language.getContentLanguage()
end
local success, result = pcall(lang.formatDate, lang, 'U', dateString)
if success then
result = tonumber(result)
if result then
return result
end
end
error(string.format(
'invalid %s: %s',
dateType,
tostring(dateString)
), 4)
end
local function makeFullUrl(page, query, display)
return string.format(
'[%s %s]',
tostring(mw.uri.fullUrl(page, query)),
display
)
end
-- Given a directed graph formatted as node -> table of direct successors,
-- get a table of all nodes reachable from a given node (though always
-- including the given node).
local function getReachableNodes(graph, start)
local toWalk, retval = {[start] = true}, {}
while true do
-- Can't use pairs() since we're adding and removing things as we're iterating
local k = next(toWalk) -- This always gets the "first" key
if k == nil then
return retval
end
toWalk[k] = nil
retval[k] = true
for _,v in ipairs(graph[k]) do
if not retval[v] then
toWalk[v] = true
end
end
end
end
--------------------------------------------------------------------------------
-- Protection class
--------------------------------------------------------------------------------
local Protection = {}
Protection.__index = Protection
Protection.supportedActions = {
edit = true,
move = true,
autoreview = true,
upload = true
}
Protection.bannerConfigFields = {
'text',
'explanation',
'tooltip',
'alt',
'link',
'image'
}
function Protection.new(args, cfg, title)
local obj = {}
obj._cfg = cfg
obj.title = title or mw.title.getCurrentTitle()
-- Set action
if not args.action then
obj.action = 'edit'
elseif Protection.supportedActions[args.action] then
obj.action = args.action
else
error(string.format(
'invalid action: %s',
tostring(args.action)
), 3)
end
-- Set level
obj.level = args.demolevel or effectiveProtectionLevel(obj.action, obj.title)
if not obj.level or (obj.action == 'move' and obj.level == 'autoconfirmed') then
-- Users need to be autoconfirmed to move pages anyway, so treat
-- semi-move-protected pages as unprotected.
obj.level = '*'
end
-- Set expiry
local effectiveExpiry = effectiveProtectionExpiry(obj.action, obj.title)
if effectiveExpiry == 'infinity' then
obj.expiry = 'indef'
elseif effectiveExpiry ~= 'unknown' then
obj.expiry = validateDate(effectiveExpiry, 'expiry date')
end
-- Set reason
if args[1] then
obj.reason = mw.ustring.lower(args[1])
if obj.reason:find('|') then
error('reasons cannot contain the pipe character ("|")', 3)
end
end
-- Set protection date
if args.date then
obj.protectionDate = validateDate(args.date, 'protection date')
end
-- Set banner config
do
obj.bannerConfig = {}
local configTables = {}
if cfg.banners[obj.action] then
configTables[#configTables + 1] = cfg.banners[obj.action][obj.reason]
end
if cfg.defaultBanners[obj.action] then
configTables[#configTables + 1] = cfg.defaultBanners[obj.action][obj.level]
configTables[#configTables + 1] = cfg.defaultBanners[obj.action].default
end
configTables[#configTables + 1] = cfg.masterBanner
for i, field in ipairs(Protection.bannerConfigFields) do
for j, t in ipairs(configTables) do
if t[field] then
obj.bannerConfig[field] = t[field]
break
end
end
end
end
return setmetatable(obj, Protection)
end
function Protection:isUserScript()
-- Whether the page is a user JavaScript or CSS page.
local title = self.title
return title.namespace == 2 and (
title.contentModel == 'javascript' or title.contentModel == 'css'
)
end
function Protection:isProtected()
return self.level ~= '*'
end
function Protection:shouldShowLock()
-- Whether we should output a banner/padlock
return self:isProtected() and not self:isUserScript()
end
-- Whether this page needs a protection category.
Protection.shouldHaveProtectionCategory = Protection.shouldShowLock
function Protection:isTemporary()
return type(self.expiry) == 'number'
end
function Protection:makeProtectionCategory()
if not self:shouldHaveProtectionCategory() then
return ''
end
local cfg = self._cfg
local title = self.title
-- Get the expiry key fragment.
local expiryFragment
if self.expiry == 'indef' then
expiryFragment = self.expiry
elseif type(self.expiry) == 'number' then
expiryFragment = 'temp'
end
-- Get the namespace key fragment.
local namespaceFragment = cfg.categoryNamespaceKeys[title.namespace]
if not namespaceFragment and title.namespace % 2 == 1 then
namespaceFragment = 'talk'
end
-- Define the order that key fragments are tested in. This is done with an
-- array of tables containing the value to be tested, along with its
-- position in the cfg.protectionCategories table.
local order = {
{val = expiryFragment, keypos = 1},
{val = namespaceFragment, keypos = 2},
{val = self.reason, keypos = 3},
{val = self.level, keypos = 4},
{val = self.action, keypos = 5}
}
--[[
-- The old protection templates used an ad-hoc protection category system,
-- with some templates prioritising namespaces in their categories, and
-- others prioritising the protection reason. To emulate this in this module
-- we use the config table cfg.reasonsWithNamespacePriority to set the
-- reasons for which namespaces have priority over protection reason.
-- If we are dealing with one of those reasons, move the namespace table to
-- the end of the order table, i.e. give it highest priority. If not, the
-- reason should have highest priority, so move that to the end of the table
-- instead.
--]]
table.insert(order, table.remove(order, self.reason and cfg.reasonsWithNamespacePriority[self.reason] and 2 or 3))
--[[
-- Define the attempt order. Inactive subtables (subtables with nil "value"
-- fields) are moved to the end, where they will later be given the key
-- "all". This is to cut down on the number of table lookups in
-- cfg.protectionCategories, which grows exponentially with the number of
-- non-nil keys. We keep track of the number of active subtables with the
-- noActive parameter.
--]]
local noActive, attemptOrder
do
local active, inactive = {}, {}
for i, t in ipairs(order) do
if t.val then
active[#active + 1] = t
else
inactive[#inactive + 1] = t
end
end
noActive = #active
attemptOrder = active
for i, t in ipairs(inactive) do
attemptOrder[#attemptOrder + 1] = t
end
end
--[[
-- Check increasingly generic key combinations until we find a match. If a
-- specific category exists for the combination of key fragments we are
-- given, that match will be found first. If not, we keep trying different
-- key fragment combinations until we match using the key
-- "all-all-all-all-all".
--
-- To generate the keys, we index the key subtables using a binary matrix
-- with indexes i and j. j is only calculated up to the number of active
-- subtables. For example, if there were three active subtables, the matrix
-- would look like this, with 0 corresponding to the key fragment "all", and
-- 1 corresponding to other key fragments.
--
-- j 1 2 3
-- i
-- 1 1 1 1
-- 2 0 1 1
-- 3 1 0 1
-- 4 0 0 1
-- 5 1 1 0
-- 6 0 1 0
-- 7 1 0 0
-- 8 0 0 0
--
-- Values of j higher than the number of active subtables are set
-- to the string "all".
--
-- A key for cfg.protectionCategories is constructed for each value of i.
-- The position of the value in the key is determined by the keypos field in
-- each subtable.
--]]
local cats = cfg.protectionCategories
for i = 1, 2^noActive do
local key = {}
for j, t in ipairs(attemptOrder) do
if j > noActive then
key[t.keypos] = 'all'
else
local quotient = i / 2 ^ (j - 1)
quotient = math.ceil(quotient)
if quotient % 2 == 1 then
key[t.keypos] = t.val
else
key[t.keypos] = 'all'
end
end
end
key = table.concat(key, '|')
local attempt = cats[key]
if attempt then
return makeCategoryLink(attempt, title.text)
end
end
return ''
end
function Protection:isIncorrect()
if not self:shouldHaveProtectionCategory() then
return true
end
if type(self.expiry) ~= 'number' then
return false
end
local expiry = os.date('*t', self.expiry)
-- Avoid checking today.day or os.time(), unless close. https://phabricator.wikimedia.org/T416616
local today = os.date('*t')
return (expiry.year < today.year)
or (expiry.year == today.year and expiry.month < today.month)
or (expiry.year == today.year and expiry.month == today.month and expiry.day < today.day)
or (expiry.year == today.year and expiry.month == today.month and expiry.day == today.day and self.expiry < os.time())
end
function Protection:isTemplateProtectedNonTemplate()
local action, namespace = self.action, self.title.namespace
return self.level == 'templateeditor'
and (
(action ~= 'edit' and action ~= 'move')
or (namespace ~= 10 and namespace ~= 828)
)
end
function Protection:makeCategoryLinks()
local msg = self._cfg.msg
local ret = {self:makeProtectionCategory()}
if self:isIncorrect() then
ret[#ret + 1] = makeCategoryLink(
msg['tracking-category-incorrect'],
self.title.text
)
end
if self:isTemplateProtectedNonTemplate() then
ret[#ret + 1] = makeCategoryLink(
msg['tracking-category-template'],
self.title.text
)
end
return table.concat(ret)
end
--------------------------------------------------------------------------------
-- Blurb class
--------------------------------------------------------------------------------
local Blurb = {}
Blurb.__index = Blurb
Blurb.bannerTextFields = {
text = true,
explanation = true,
tooltip = true,
alt = true,
link = true
}
function Blurb.new(protectionObj, args, cfg)
return setmetatable({
_cfg = cfg,
_protectionObj = protectionObj,
_args = args
}, Blurb)
end
-- Private methods --
function Blurb:_formatDate(num)
-- Formats a Unix timestamp into dd Month, YYYY format.
lang = lang or mw.language.getContentLanguage()
local success, date = pcall(
lang.formatDate,
lang,
self._cfg.msg['expiry-date-format'] or 'j F Y',
'@' .. tostring(num)
)
if success then
return date
end
end
function Blurb:_getExpandedMessage(msgKey)
return self:_substituteParameters(self._cfg.msg[msgKey])
end
function Blurb:_substituteParameters(msg)
if not self._params then
local parameterFuncs = {}
parameterFuncs.CURRENTVERSION = self._makeCurrentVersionParameter
parameterFuncs.EDITREQUEST = self._makeEditRequestParameter
parameterFuncs.EXPIRY = self._makeExpiryParameter
parameterFuncs.EXPLANATIONBLURB = self._makeExplanationBlurbParameter
parameterFuncs.IMAGELINK = self._makeImageLinkParameter
parameterFuncs.INTROBLURB = self._makeIntroBlurbParameter
parameterFuncs.INTROFRAGMENT = self._makeIntroFragmentParameter
parameterFuncs.PAGETYPE = self._makePagetypeParameter
parameterFuncs.PROTECTIONBLURB = self._makeProtectionBlurbParameter
parameterFuncs.PROTECTIONDATE = self._makeProtectionDateParameter
parameterFuncs.PROTECTIONLEVEL = self._makeProtectionLevelParameter
parameterFuncs.PROTECTIONLOG = self._makeProtectionLogParameter
parameterFuncs.TALKPAGE = self._makeTalkPageParameter
parameterFuncs.TOOLTIPBLURB = self._makeTooltipBlurbParameter
parameterFuncs.TOOLTIPFRAGMENT = self._makeTooltipFragmentParameter
parameterFuncs.VANDAL = self._makeVandalTemplateParameter
self._params = setmetatable({}, {
__index = function (t, k)
local param
if parameterFuncs[k] then
param = parameterFuncs[k](self)
end
param = param or ''
t[k] = param
return param
end
})
end
msg = msg:gsub('${(%u+)}', self._params)
return msg
end
function Blurb:_makeCurrentVersionParameter()
-- A link to the page history or the move log, depending on the kind of
-- protection.
local pagename = self._protectionObj.title.prefixedText
if self._protectionObj.action == 'move' then
-- We need the move log link.
return makeFullUrl(
'Special:Log',
{type = 'move', page = pagename},
self:_getExpandedMessage('current-version-move-display')
)
else
-- We need the history link.
return makeFullUrl(
pagename,
{action = 'history'},
self:_getExpandedMessage('current-version-edit-display')
)
end
end
function Blurb:_makeEditRequestParameter()
local mEditRequest = require('Module:Submit an edit request')
local action = self._protectionObj.action
local level = self._protectionObj.level
-- Get the edit request type.
local requestType
if action == 'edit' then
if level == 'autoconfirmed' then
requestType = 'semi'
elseif level == 'extendedconfirmed' then
requestType = 'extended'
elseif level == 'templateeditor' then
requestType = 'template'
end
end
requestType = requestType or 'full'
-- Get the display value.
local display = self:_getExpandedMessage('edit-request-display')
return mEditRequest._link{type = requestType, display = display}
end
function Blurb:_makeExpiryParameter()
local expiry = self._protectionObj.expiry
if type(expiry) == 'number' then
return self:_formatDate(expiry)
else
return expiry
end
end
function Blurb:_makeExplanationBlurbParameter()
-- Cover special cases first.
if self._protectionObj.title.namespace == 8 then
-- MediaWiki namespace
return self:_getExpandedMessage('explanation-blurb-nounprotect')
end
-- Get explanation blurb table keys
local action = self._protectionObj.action
local level = self._protectionObj.level
local talkKey = self._protectionObj.title.isTalkPage and 'talk' or 'subject'
-- Find the message in the explanation blurb table and substitute any
-- parameters.
local explanations = self._cfg.explanationBlurbs
local msg
if explanations[action][level] and explanations[action][level][talkKey] then
msg = explanations[action][level][talkKey]
elseif explanations[action][level] and explanations[action][level].default then
msg = explanations[action][level].default
elseif explanations[action].default and explanations[action].default[talkKey] then
msg = explanations[action].default[talkKey]
elseif explanations[action].default and explanations[action].default.default then
msg = explanations[action].default.default
else
error(string.format(
'could not find explanation blurb for action "%s", level "%s" and talk key "%s"',
action,
level,
talkKey
), 8)
end
return self:_substituteParameters(msg)
end
function Blurb:_makeImageLinkParameter()
local imageLinks = self._cfg.imageLinks
local action = self._protectionObj.action
local level = self._protectionObj.level
local msg
if imageLinks[action][level] then
msg = imageLinks[action][level]
elseif imageLinks[action].default then
msg = imageLinks[action].default
else
msg = imageLinks.edit.default
end
return self:_substituteParameters(msg)
end
function Blurb:_makeIntroBlurbParameter()
if self._protectionObj:isTemporary() then
return self:_getExpandedMessage('intro-blurb-expiry')
else
return self:_getExpandedMessage('intro-blurb-noexpiry')
end
end
function Blurb:_makeIntroFragmentParameter()
if self._protectionObj:isTemporary() then
return self:_getExpandedMessage('intro-fragment-expiry')
else
return self:_getExpandedMessage('intro-fragment-noexpiry')
end
end
function Blurb:_makePagetypeParameter()
local pagetypes = self._cfg.pagetypes
return pagetypes[self._protectionObj.title.namespace]
or pagetypes.default
or error('no default pagetype defined', 8)
end
function Blurb:_makeProtectionBlurbParameter()
local protectionBlurbs = self._cfg.protectionBlurbs
local action = self._protectionObj.action
local level = self._protectionObj.level
local msg
if protectionBlurbs[action][level] then
msg = protectionBlurbs[action][level]
elseif protectionBlurbs[action].default then
msg = protectionBlurbs[action].default
elseif protectionBlurbs.edit.default then
msg = protectionBlurbs.edit.default
else
error('no protection blurb defined for protectionBlurbs.edit.default', 8)
end
return self:_substituteParameters(msg)
end
function Blurb:_makeProtectionDateParameter()
local protectionDate = self._protectionObj.protectionDate
if type(protectionDate) == 'number' then
return self:_formatDate(protectionDate)
else
return protectionDate
end
end
function Blurb:_makeProtectionLevelParameter()
local protectionLevels = self._cfg.protectionLevels
local action = self._protectionObj.action
local level = self._protectionObj.level
local msg
if protectionLevels[action][level] then
msg = protectionLevels[action][level]
elseif protectionLevels[action].default then
msg = protectionLevels[action].default
elseif protectionLevels.edit.default then
msg = protectionLevels.edit.default
else
error('no protection level defined for protectionLevels.edit.default', 8)
end
return self:_substituteParameters(msg)
end
function Blurb:_makeProtectionLogParameter()
local pagename = self._protectionObj.title.prefixedText
if self._protectionObj.action == 'autoreview' then
-- We need the pending changes log.
return makeFullUrl(
'Special:Log',
{type = 'stable', page = pagename},
self:_getExpandedMessage('pc-log-display')
)
else
-- We need the protection log.
return makeFullUrl(
'Special:Log',
{type = 'protect', page = pagename},
self:_getExpandedMessage('protection-log-display')
)
end
end
function Blurb:_makeTalkPageParameter()
return string.format(
'[[%s:%s#%s|%s]]',
mw.site.namespaces[self._protectionObj.title.namespace].talk.name,
self._protectionObj.title.text,
self._args.section or 'top',
self:_getExpandedMessage('talk-page-link-display')
)
end
function Blurb:_makeTooltipBlurbParameter()
if self._protectionObj:isTemporary() then
return self:_getExpandedMessage('tooltip-blurb-expiry')
else
return self:_getExpandedMessage('tooltip-blurb-noexpiry')
end
end
function Blurb:_makeTooltipFragmentParameter()
if self._protectionObj:isTemporary() then
return self:_getExpandedMessage('tooltip-fragment-expiry')
else
return self:_getExpandedMessage('tooltip-fragment-noexpiry')
end
end
function Blurb:_makeVandalTemplateParameter()
return mw.getCurrentFrame():expandTemplate{
title="vandal-m",
args={self._args.user or self._protectionObj.title.baseText}
}
end
-- Public methods --
function Blurb:makeBannerText(key)
-- Validate input.
if not key or not Blurb.bannerTextFields[key] then
error(string.format(
'"%s" is not a valid banner config field',
tostring(key)
), 2)
end
-- Generate the text.
local msg = self._protectionObj.bannerConfig[key]
if type(msg) == 'string' then
return self:_substituteParameters(msg)
elseif type(msg) == 'function' then
msg = msg(self._protectionObj, self._args)
if type(msg) ~= 'string' then
error(string.format(
'bad output from banner config function with key "%s"'
.. ' (expected string, got %s)',
tostring(key),
type(msg)
), 4)
end
return self:_substituteParameters(msg)
end
end
--------------------------------------------------------------------------------
-- BannerTemplate class
--------------------------------------------------------------------------------
local BannerTemplate = {}
BannerTemplate.__index = BannerTemplate
function BannerTemplate.new(protectionObj, cfg)
local obj = {}
obj._cfg = cfg
-- Set the image filename.
local imageFilename = protectionObj.bannerConfig.image
if imageFilename then
obj._imageFilename = imageFilename
else
-- If an image filename isn't specified explicitly in the banner config,
-- generate it from the protection status and the namespace.
local action = protectionObj.action
local level = protectionObj.level
local namespace = protectionObj.title.namespace
local reason = protectionObj.reason
-- Deal with special cases first.
if (
namespace == 10
or namespace == 828
or reason and obj._cfg.indefImageReasons[reason]
)
and action == 'edit'
and level == 'sysop'
and not protectionObj:isTemporary()
then
-- Fully protected modules and templates get the special red "indef"
-- padlock.
obj._imageFilename = obj._cfg.msg['image-filename-indef']
else
-- Deal with regular protection types.
local images = obj._cfg.images
if images[action] then
if images[action][level] then
obj._imageFilename = images[action][level]
elseif images[action].default then
obj._imageFilename = images[action].default
end
end
end
end
return setmetatable(obj, BannerTemplate)
end
function BannerTemplate:renderImage()
local filename = self._imageFilename
or self._cfg.msg['image-filename-default']
or 'Transparent.gif'
return makeFileLink{
file = filename,
size = (self.imageWidth or 20) .. 'px',
alt = self._imageAlt,
link = self._imageLink,
caption = self.imageCaption
}
end
--------------------------------------------------------------------------------
-- Banner class
--------------------------------------------------------------------------------
local Banner = setmetatable({}, BannerTemplate)
Banner.__index = Banner
function Banner.new(protectionObj, blurbObj, cfg)
local obj = BannerTemplate.new(protectionObj, cfg) -- This doesn't need the blurb.
obj.imageWidth = 40
obj.imageCaption = blurbObj:makeBannerText('alt') -- Large banners use the alt text for the tooltip.
obj._reasonText = blurbObj:makeBannerText('text')
obj._explanationText = blurbObj:makeBannerText('explanation')
obj._page = protectionObj.title.prefixedText -- Only makes a difference in testing.
return setmetatable(obj, Banner)
end
function Banner:__tostring()
-- Renders the banner.
makeMessageBox = makeMessageBox or require('Module:Message box').main
local reasonText = self._reasonText or error('no reason text set', 2)
local explanationText = self._explanationText
local mbargs = {
page = self._page,
type = 'protection',
image = self:renderImage(),
text = string.format(
"'''%s'''%s",
reasonText,
explanationText and '<br />' .. explanationText or ''
)
}
return makeMessageBox('mbox', mbargs)
end
--------------------------------------------------------------------------------
-- Padlock class
--------------------------------------------------------------------------------
local Padlock = setmetatable({}, BannerTemplate)
Padlock.__index = Padlock
function Padlock.new(protectionObj, blurbObj, cfg)
local obj = BannerTemplate.new(protectionObj, cfg) -- This doesn't need the blurb.
obj.imageWidth = 20
obj.imageCaption = blurbObj:makeBannerText('tooltip')
obj._imageAlt = blurbObj:makeBannerText('alt')
obj._imageLink = blurbObj:makeBannerText('link')
obj._indicatorName = cfg.padlockIndicatorNames[protectionObj.action]
or cfg.padlockIndicatorNames.default
or 'pp-default'
return setmetatable(obj, Padlock)
end
function Padlock:__tostring()
local frame = mw.getCurrentFrame()
-- The nowiki tag helps prevent whitespace at the top of articles.
return frame:extensionTag{name = 'nowiki'} .. frame:extensionTag{
name = 'indicator',
args = {name = self._indicatorName},
content = self:renderImage()
}
end
--------------------------------------------------------------------------------
-- Exports
--------------------------------------------------------------------------------
local p = {}
function p._exportClasses()
-- This is used for testing purposes.
return {
Protection = Protection,
Blurb = Blurb,
BannerTemplate = BannerTemplate,
Banner = Banner,
Padlock = Padlock,
}
end
function p._main(args, cfg, title)
args = args or {}
cfg = cfg or require(CONFIG_MODULE)
local protectionObj = Protection.new(args, cfg, title)
local ret = {}
-- If a page's edit protection is equally or more restrictive than its
-- protection from some other action, then don't bother displaying anything
-- for the other action (except categories).
if not yesno(args.catonly) and (protectionObj.action == 'edit' or
args.demolevel or
not getReachableNodes(
cfg.hierarchy,
protectionObj.level
)[effectiveProtectionLevel('edit', protectionObj.title)])
then
-- Initialise the blurb object
local blurbObj = Blurb.new(protectionObj, args, cfg)
-- Render the banner
if protectionObj:shouldShowLock() then
ret[#ret + 1] = tostring(
(yesno(args.small) and Padlock or Banner)
.new(protectionObj, blurbObj, cfg)
)
end
end
-- Render the categories
if yesno(args.category) ~= false then
ret[#ret + 1] = protectionObj:makeCategoryLinks()
end
-- For arbitration enforcement, flagging [[WP:PIA]] pages to enable [[Special:AbuseFilter/1339]] to flag edits to them
if protectionObj.level == "extendedconfirmed" then
if require("Module:TableTools").inArray(protectionObj.title.talkPageTitle.categories, "Wikipedia pages subject to the extended confirmed restriction related to the Arab-Israeli conflict") then
ret[#ret + 1] = "<p class='PIA-flag' style='display:none; visibility:hidden;' title='This page is subject to the extended confirmed restriction related to the Arab-Israeli conflict.'></p>"
end
end
return table.concat(ret)
end
function p.main(frame, cfg)
cfg = cfg or require(CONFIG_MODULE)
-- Find default args, if any.
local parent = frame.getParent and frame:getParent()
local defaultArgs = parent and cfg.wrappers[parent:getTitle():gsub('/sandbox$', '')]
-- Find user args, and use the parent frame if we are being called from a
-- wrapper template.
getArgs = getArgs or require('Module:Arguments').getArgs
local userArgs = getArgs(frame, {
parentOnly = defaultArgs,
frameOnly = not defaultArgs
})
-- Build the args table. User-specified args overwrite default args.
local args = {}
for k, v in pairs(defaultArgs or {}) do
args[k] = v
end
for k, v in pairs(userArgs) do
args[k] = v
end
return p._main(args, cfg)
end
return p
o3ocs8c50hagthmsuho5s6y44o0rimz
Module:Protection banner/config
828
15977
802667
778642
2026-04-18T02:24:50Z
en>Santiago Claudio
0
Sync with sandbox per edit request
802667
Scribunto
text/plain
-- This module provides configuration data for [[Module:Protection banner]].
return {
--------------------------------------------------------------------------------
--
-- BANNER DATA
--
--------------------------------------------------------------------------------
--[[
-- Banner data consists of six fields:
-- * text - the main protection text that appears at the top of protection
-- banners.
-- * explanation - the text that appears below the main protection text, used
-- to explain the details of the protection.
-- * tooltip - the tooltip text you see when you move the mouse over a small
-- padlock icon.
-- * link - the page that the small padlock icon links to.
-- * alt - the alt text for the small padlock icon. This is also used as tooltip
-- text for the large protection banners.
-- * image - the padlock image used in both protection banners and small padlock
-- icons.
--
-- The module checks in three separate tables to find a value for each field.
-- First it checks the banners table, which has values specific to the reason
-- for the page being protected. Then the module checks the defaultBanners
-- table, which has values specific to each protection level. Finally, the
-- module checks the masterBanner table, which holds data for protection
-- templates to use if no data has been found in the previous two tables.
--
-- The values in the banner data can take parameters. These are specified
-- using ${TEXTLIKETHIS} (a dollar sign preceding a parameter name
-- enclosed in curly braces).
--
-- Available parameters:
--
-- ${CURRENTVERSION} - a link to the page history or the move log, with the
-- display message "current-version-edit-display" or
-- "current-version-move-display".
--
-- ${EDITREQUEST} - a link to create an edit request for the current page.
--
-- ${EXPLANATIONBLURB} - an explanation blurb, e.g. "Please discuss any changes
-- on the talk page; you may submit a request to ask an administrator to make
-- an edit if it is minor or supported by consensus."
--
-- ${IMAGELINK} - a link to set the image to, depending on the protection
-- action and protection level.
--
-- ${INTROBLURB} - the PROTECTIONBLURB parameter, plus the expiry if an expiry
-- is set. E.g. "Editing of this page by new or unregistered users is currently
-- disabled until dd Month YYYY."
--
-- ${INTROFRAGMENT} - the same as ${INTROBLURB}, but without final punctuation
-- so that it can be used in run-on sentences.
--
-- ${PAGETYPE} - the type of the page, e.g. "article" or "template".
-- Defined in the cfg.pagetypes table.
--
-- ${PROTECTIONBLURB} - a blurb explaining the protection level of the page, e.g.
-- "Editing of this page by new or unregistered users is currently disabled"
--
-- ${PROTECTIONDATE} - the protection date, if it has been supplied to the
-- template.
--
-- ${PROTECTIONLEVEL} - the protection level, e.g. "fully protected" or
-- "semi-protected".
--
-- ${PROTECTIONLOG} - a link to the protection log or the pending changes log,
-- depending on the protection action.
--
-- ${TALKPAGE} - a link to the talk page. If a section is specified, links
-- straight to that talk page section.
--
-- ${TOOLTIPBLURB} - uses the PAGETYPE, PROTECTIONTYPE and EXPIRY parameters to
-- create a blurb like "This template is semi-protected", or "This article is
-- move-protected until DD Month YYYY".
--
-- ${VANDAL} - links for the specified username (or the root page name)
-- using Module:Vandal-m.
--
-- Functions
--
-- For advanced users, it is possible to use Lua functions instead of strings
-- in the banner config tables. Using functions gives flexibility that is not
-- possible just by using parameters. Functions take two arguments, the
-- protection object and the template arguments, and they must output a string.
--
-- For example:
--
-- text = function (protectionObj, args)
-- if protectionObj.level == 'autoconfirmed' then
-- return 'foo'
-- else
-- return 'bar'
-- end
-- end
--
-- Some protection object properties and methods that may be useful:
-- protectionObj.action - the protection action
-- protectionObj.level - the protection level
-- protectionObj.reason - the protection reason
-- protectionObj.expiry - the expiry. Nil if unset, the string "indef" if set
-- to indefinite, and the protection time in unix time if temporary.
-- protectionObj.protectionDate - the protection date in unix time, or nil if
-- unspecified.
-- protectionObj.bannerConfig - the banner config found by the module. Beware
-- of editing the config field used by the function, as it could create an
-- infinite loop.
-- protectionObj:isProtected - returns a boolean showing whether the page is
-- protected.
-- protectionObj:isTemporary - returns a boolean showing whether the expiry is
-- temporary.
-- protectionObj:isIncorrect - returns a boolean showing whether the protection
-- template is incorrect.
--]]
-- The master banner data, used if no values have been found in banners or
-- defaultBanners.
masterBanner = {
text = '${INTROBLURB}',
explanation = '${EXPLANATIONBLURB}',
tooltip = '${TOOLTIPBLURB}',
link = '${IMAGELINK}',
alt = 'Page ${PROTECTIONLEVEL}'
},
-- The default banner data. This holds banner data for different protection
-- levels.
-- *required* - this table needs edit, move, autoreview and upload subtables.
defaultBanners = {
edit = {},
move = {},
autoreview = {
default = {
alt = 'Page protected with pending changes',
tooltip = 'All edits by unregistered and new users are subject to review prior to becoming visible to unregistered users',
image = 'Pending-protection-shackle.svg'
}
},
upload = {}
},
-- The banner data. This holds banner data for different protection reasons.
-- In fact, the reasons specified in this table control which reasons are
-- valid inputs to the first positional parameter.
--
-- There is also a non-standard "description" field that can be used for items
-- in this table. This is a description of the protection reason for use in the
-- module documentation.
--
-- *required* - this table needs edit, move, autoreview and upload subtables.
banners = {
edit = {
blp = {
description = 'For pages protected to promote compliance with the'
.. ' [[Wikipedia:Biographies of living persons'
.. '|biographies of living persons]] policy',
text = '${INTROFRAGMENT} to promote compliance with'
.. ' [[Wikipedia:Biographies of living persons'
.. "|Wikipedia's policy on the biographies"
.. ' of living people]].',
tooltip = '${TOOLTIPFRAGMENT} to promote compliance with the policy on'
.. ' biographies of living persons',
},
deceased = {
description = 'For user pages of Wikipedia users who are deceased',
text = '${INTROFRAGMENT} to prevent vandalism of a deceased'
.. ' Wikipedian\'s user page.'
.. ' A family member who wishes to edit this user page can use this'
.. ' user\'s ${TALKPAGE} or submit a request to [[Wikipedia:VRT|the'
.. ' Volunteer Response Team]].',
tooltip = '${TOOLTIPFRAGMENT} because this Wikipedian is deceased'
},
dmca = {
description = 'For pages protected by the Wikimedia Foundation'
.. ' due to [[Digital Millennium Copyright Act]] takedown requests',
explanation = function (protectionObj, args)
local ret = 'Pursuant to a rights owner notice under the Digital'
.. ' Millennium Copyright Act (DMCA) regarding some content'
.. ' in this article, the Wikimedia Foundation acted under'
.. ' applicable law and took down and restricted the content'
.. ' in question.'
if args.notice then
ret = ret .. ' A copy of the received notice can be found here: '
.. args.notice .. '.'
end
ret = ret .. ' For more information, including websites discussing'
.. ' how to file a counter-notice, please see'
.. " [[Wikipedia:Office actions]] and the article's ${TALKPAGE}."
.. "'''Do not remove this template from the article until the"
.. " restrictions are withdrawn'''."
return ret
end,
image = 'Office-protection-shackle.svg',
link = 'Wikipedia:Protection policy#office',
},
dispute = {
description = 'For pages protected due to editing disputes',
text = function (protectionObj, args)
-- Find the value of "disputes".
local display = 'disputes'
local disputes
if args.section then
disputes = string.format(
'[[%s:%s#%s|%s]]',
mw.site.namespaces[protectionObj.title.namespace].talk.name,
protectionObj.title.text,
args.section,
display
)
else
disputes = display
end
-- Make the blurb, depending on the expiry.
local msg
if type(protectionObj.expiry) == 'number' then
msg = '${INTROFRAGMENT} or until editing %s have been resolved.'
else
msg = '${INTROFRAGMENT} until editing %s have been resolved.'
end
return string.format(msg, disputes)
end,
explanation = "This protection is '''not''' an endorsement of the"
.. ' ${CURRENTVERSION}. ${EXPLANATIONBLURB}',
tooltip = '${TOOLTIPFRAGMENT} due to editing disputes',
},
ecp = {
description = 'For articles in topic areas authorized by'
.. ' [[Wikipedia:Arbitration Committee|ArbCom]] or'
.. ' meets the criteria for community use',
alt = 'Extended-protected ${PAGETYPE}',
},
mainpage = {
description = 'For pages protected for being displayed on the [[Main Page]]',
text = 'This file is currently'
.. ' [[Wikipedia:This page is protected|protected]] from'
.. ' editing because it is currently or will soon be displayed'
.. ' on the [[Main Page]].',
explanation = 'Images on the Main Page are protected due to their high'
.. ' visibility. Please discuss any necessary changes on the ${TALKPAGE}.'
.. '<br /><span style="font-size:90%;">'
.. "'''Administrators:''' Once this image is definitely off the Main Page,"
.. ' please unprotect this file, or reduce to semi-protection,'
.. ' as appropriate.</span>',
},
office = {
description = 'For pages protected by the Wikimedia Foundation',
text = function (protectionObj, args)
local ret = 'This ${PAGETYPE} is currently under the'
.. ' scrutiny of the'
.. ' [[Wikipedia:Office actions|Wikimedia Foundation Office]]'
.. ' and is protected.'
if protectionObj.protectionDate then
ret = ret .. ' It has been protected since ${PROTECTIONDATE}.'
end
return ret
end,
explanation = "If you can edit this page, please discuss all changes and"
.. " additions on the ${TALKPAGE} first. '''Do not remove protection from this"
.. " page unless you are authorized by the Wikimedia Foundation to do"
.. " so.'''",
image = 'Office-protection-shackle.svg',
link = 'Wikipedia:Protection policy#office',
},
reset = {
description = 'For pages protected by the Wikimedia Foundation and'
.. ' "reset" to a bare-bones version',
text = 'This ${PAGETYPE} is currently under the'
.. ' scrutiny of the'
.. ' [[Wikipedia:Office actions|Wikimedia Foundation Office]]'
.. ' and is protected.',
explanation = function (protectionObj, args)
local ret = ''
if protectionObj.protectionDate then
ret = ret .. 'On ${PROTECTIONDATE} this ${PAGETYPE} was'
else
ret = ret .. 'This ${PAGETYPE} has been'
end
ret = ret .. ' reduced to a'
.. ' simplified, "bare bones" version so that it may be completely'
.. ' rewritten to ensure it meets the policies of'
.. ' [[WP:NPOV|Neutral Point of View]] and [[WP:V|Verifiability]].'
.. ' Standard Wikipedia policies will apply to its rewriting—which'
.. ' will eventually be open to all editors—and will be strictly'
.. ' enforced. The ${PAGETYPE} has been ${PROTECTIONLEVEL} while'
.. ' it is being rebuilt.\n\n'
.. 'Any insertion of material directly from'
.. ' pre-protection revisions of the ${PAGETYPE} will be removed, as'
.. ' will any material added to the ${PAGETYPE} that is not properly'
.. ' sourced. The associated talk page(s) were also cleared on the'
.. " same date.\n\n"
.. "If you can edit this page, please discuss all changes and"
.. " additions on the ${TALKPAGE} first. '''Do not override"
.. " this action, and do not remove protection from this page,"
.. " unless you are authorized by the Wikimedia Foundation"
.. " to do so. No editor may remove this notice.'''"
return ret
end,
image = 'Office-protection-shackle.svg',
link = 'Wikipedia:Protection policy#office',
},
sock = {
description = 'For pages protected due to'
.. ' [[Wikipedia:Sock puppetry|sock puppetry]]',
text = '${INTROFRAGMENT} to prevent [[Wikipedia:Sock puppetry|sock puppets]] of'
.. ' [[Wikipedia:Blocking policy|blocked]] or'
.. ' [[Wikipedia:Banning policy|banned users]]'
.. ' from editing it.',
tooltip = '${TOOLTIPFRAGMENT} to prevent sock puppets of blocked or banned users from'
.. ' editing it',
},
template = {
description = 'For [[Wikipedia:High-risk templates|high-risk]]'
.. ' templates and Lua modules',
text = 'This is a permanently [[Wikipedia:Protection policy|protected]] ${PAGETYPE},'
.. ' as it is [[Wikipedia:High-risk templates|high-risk]].',
explanation = 'Please discuss any changes on the ${TALKPAGE}; you may'
.. ' ${EDITREQUEST} to ask an'
.. ' [[Wikipedia:Administrators|administrator]] or'
.. ' [[Wikipedia:Template editor|template editor]] to make an edit if'
.. ' it is [[Help:Minor edit#When to mark an edit as a minor edit'
.. '|uncontroversial]] or supported by'
.. ' [[Wikipedia:Consensus|consensus]]. You can also'
.. ' [[Wikipedia:Requests for page protection|request]] that the page be'
.. ' unprotected.',
tooltip = 'This high-risk ${PAGETYPE} is permanently ${PROTECTIONLEVEL}'
.. ' to prevent vandalism',
alt = 'Permanently protected ${PAGETYPE}',
},
usertalk = {
description = 'For pages protected against disruptive edits by a'
.. ' particular user',
text = '${INTROFRAGMENT} to prevent ${VANDAL} from using it to make disruptive edits,'
.. ' such as abusing the'
.. ' {{[[Template:unblock|unblock]]}} template.',
explanation = 'If you cannot edit this user talk page and you need to'
.. ' make a change or leave a message, you can'
.. ' [[Wikipedia:Requests for page protection'
.. '#Current requests for edits to a protected page'
.. '|request an edit]],'
.. ' [[Wikipedia:Requests for page protection'
.. '#Current requests for reduction in protection level'
.. '|request unprotection]],'
.. ' [[Special:Userlogin|log in]],'
.. ' or [[Special:UserLogin/signup|create an account]].',
},
vandalism = {
description = 'For pages protected against'
.. ' [[Wikipedia:Vandalism|vandalism]]',
text = '${INTROFRAGMENT} due to [[Wikipedia:Vandalism|vandalism]].',
explanation = function (protectionObj, args)
local ret = ''
if protectionObj.level == 'sysop' then
ret = ret .. "This protection is '''not''' an endorsement of the"
.. ' ${CURRENTVERSION}. '
end
return ret .. '${EXPLANATIONBLURB}'
end,
tooltip = '${TOOLTIPFRAGMENT} due to vandalism',
}
},
move = {
dispute = {
description = 'For pages protected against page moves due to'
.. ' disputes over the page title',
explanation = "This protection is '''not''' an endorsement of the"
.. ' ${CURRENTVERSION}. ${EXPLANATIONBLURB}',
image = 'Move-protection-shackle.svg'
},
vandalism = {
description = 'For pages protected against'
.. ' [[Wikipedia:Vandalism#Page-move vandalism'
.. ' |page-move vandalism]]'
}
},
autoreview = {},
upload = {}
},
--------------------------------------------------------------------------------
--
-- GENERAL DATA TABLES
--
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
-- Protection blurbs
--------------------------------------------------------------------------------
-- This table produces the protection blurbs available with the
-- ${PROTECTIONBLURB} parameter. It is sorted by protection action and
-- protection level, and is checked by the module in the following order:
-- 1. page's protection action, page's protection level
-- 2. page's protection action, default protection level
-- 3. "edit" protection action, default protection level
--
-- It is possible to use banner parameters inside this table.
-- *required* - this table needs edit, move, autoreview and upload subtables.
protectionBlurbs = {
edit = {
default = 'This ${PAGETYPE} is currently [[Wikipedia:Protection policy#full|'
.. 'protected]] from editing',
templateeditor = 'This ${PAGETYPE} is currently [[Wikipedia:Protection policy#template'
.. '|protected]] from editing',
autoconfirmed = 'Editing of this ${PAGETYPE} by [[Wikipedia:User access'
.. ' levels#New users|new]] or [[Wikipedia:User access levels#Unregistered'
.. ' users|unregistered]] users is currently [[Wikipedia:Protection'
.. ' policy#semi|disabled]]',
extendedconfirmed = 'This ${PAGETYPE} is currently under [[Wikipedia:Protection'
.. ' policy#extended|extended confirmed protection]]',
},
move = {
default = 'This ${PAGETYPE} is currently [[Wikipedia:Protection policy#Move'
.. ' protection|protected]] from [[Help:Moving a page|page moves]]'
},
autoreview = {
default = 'All edits made to this ${PAGETYPE} by'
.. ' [[Wikipedia:User access levels#New users|new]] or'
.. ' [[Wikipedia:User access levels#Unregistered users|unregistered]]'
.. ' users are currently'
.. ' [[Wikipedia:Pending changes|subject to review]]'
},
upload = {
default = 'Uploading new versions of this ${PAGETYPE} is currently disabled'
}
},
--------------------------------------------------------------------------------
-- Explanation blurbs
--------------------------------------------------------------------------------
-- This table produces the explanation blurbs available with the
-- ${EXPLANATIONBLURB} parameter. It is sorted by protection action,
-- protection level, and whether the page is a talk page or not. If the page is
-- a talk page it will have a talk key of "talk"; otherwise it will have a talk
-- key of "subject". The table is checked in the following order:
-- 1. page's protection action, page's protection level, page's talk key
-- 2. page's protection action, page's protection level, default talk key
-- 3. page's protection action, default protection level, page's talk key
-- 4. page's protection action, default protection level, default talk key
--
-- It is possible to use banner parameters inside this table.
-- *required* - this table needs edit, move, autoreview and upload subtables.
explanationBlurbs = {
edit = {
autoconfirmed = {
subject = 'See the [[Wikipedia:Protection policy|'
.. 'protection policy]] and ${PROTECTIONLOG} for more details. If you'
.. ' cannot edit this ${PAGETYPE} and you wish to make a change, you can'
.. ' ${EDITREQUEST}, discuss changes on the ${TALKPAGE},'
.. ' [[Wikipedia:Requests for page protection'
.. '#Current requests for reduction in protection level'
.. '|request unprotection]], [[Special:Userlogin|log in]], or'
.. ' [[Special:UserLogin/signup|create an account]].',
default = 'See the [[Wikipedia:Protection policy|'
.. 'protection policy]] and ${PROTECTIONLOG} for more details. If you'
.. ' cannot edit this ${PAGETYPE} and you wish to make a change, you can'
.. ' [[Wikipedia:Requests for page protection'
.. '#Current requests for reduction in protection level'
.. '|request unprotection]], [[Special:Userlogin|log in]], or'
.. ' [[Special:UserLogin/signup|create an account]].',
},
extendedconfirmed = {
default = 'Extended confirmed protection prevents edits from all unregistered editors'
.. ' and registered users with fewer than 30 days tenure and 500 edits.'
.. ' The [[Wikipedia:Protection policy#extended|policy on community use]]'
.. ' specifies that extended confirmed protection can be applied to combat'
.. ' disruption, if semi-protection has proven to be ineffective.'
.. ' Extended confirmed protection may also be applied to enforce'
.. ' [[Wikipedia:Arbitration Committee|arbitration sanctions]].'
.. ' Please discuss any changes on the ${TALKPAGE}; you may'
.. ' ${EDITREQUEST} to ask for uncontroversial changes supported by'
.. ' [[Wikipedia:Consensus|consensus]].'
},
default = {
subject = 'See the [[Wikipedia:Protection policy|'
.. 'protection policy]] and ${PROTECTIONLOG} for more details.'
.. ' Please discuss any changes on the ${TALKPAGE}; you'
.. ' may ${EDITREQUEST} to ask an'
.. ' [[Wikipedia:Administrators|administrator]] to make an edit if it'
.. ' is [[Help:Minor edit#When to mark an edit as a minor edit'
.. '|uncontroversial]] or supported by [[Wikipedia:Consensus'
.. '|consensus]]. You may also [[Wikipedia:Requests for'
.. ' page protection#Current requests for reduction in protection level'
.. '|request]] that this page be unprotected.',
default = 'See the [[Wikipedia:Protection policy|'
.. 'protection policy]] and ${PROTECTIONLOG} for more details.'
.. ' You may [[Wikipedia:Requests for page'
.. ' protection#Current requests for edits to a protected page|request an'
.. ' edit]] to this page, or [[Wikipedia:Requests for'
.. ' page protection#Current requests for reduction in protection level'
.. '|ask]] for it to be unprotected.'
}
},
move = {
default = {
subject = 'See the [[Wikipedia:Protection policy|'
.. 'protection policy]] and ${PROTECTIONLOG} for more details.'
.. ' The page may still be edited but cannot be moved'
.. ' until unprotected. Please discuss any suggested moves on the'
.. ' ${TALKPAGE} or at [[Wikipedia:Requested moves]]. You can also'
.. ' [[Wikipedia:Requests for page protection|request]] that the page be'
.. ' unprotected.',
default = 'See the [[Wikipedia:Protection policy|'
.. 'protection policy]] and ${PROTECTIONLOG} for more details.'
.. ' The page may still be edited but cannot be moved'
.. ' until unprotected. Please discuss any suggested moves at'
.. ' [[Wikipedia:Requested moves]]. You can also'
.. ' [[Wikipedia:Requests for page protection|request]] that the page be'
.. ' unprotected.'
}
},
autoreview = {
default = {
default = 'See the [[Wikipedia:Protection policy|'
.. 'protection policy]] and ${PROTECTIONLOG} for more details.'
.. ' Edits to this ${PAGETYPE} by new and unregistered users'
.. ' will not be visible to readers until they are accepted by'
.. ' a reviewer. To avoid the need for your edits to be'
.. ' reviewed, you may'
.. ' [[Wikipedia:Requests for page protection'
.. '#Current requests for reduction in protection level'
.. '|request unprotection]], [[Special:Userlogin|log in]], or'
.. ' [[Special:UserLogin/signup|create an account]].'
},
},
upload = {
default = {
default = 'See the [[Wikipedia:Protection policy|'
.. 'protection policy]] and ${PROTECTIONLOG} for more details.'
.. ' The page may still be edited but new versions of the file'
.. ' cannot be uploaded until it is unprotected. You can'
.. ' request that a new version be uploaded by using a'
.. ' [[Wikipedia:Edit requests|protected edit request]], or you'
.. ' can [[Wikipedia:Requests for page protection|request]]'
.. ' that the file be unprotected.'
}
}
},
--------------------------------------------------------------------------------
-- Protection levels
--------------------------------------------------------------------------------
-- This table provides the data for the ${PROTECTIONLEVEL} parameter, which
-- produces a short label for different protection levels. It is sorted by
-- protection action and protection level, and is checked in the following
-- order:
-- 1. page's protection action, page's protection level
-- 2. page's protection action, default protection level
-- 3. "edit" protection action, default protection level
--
-- It is possible to use banner parameters inside this table.
-- *required* - this table needs edit, move, autoreview and upload subtables.
protectionLevels = {
edit = {
default = 'protected',
templateeditor = 'template-protected',
extendedconfirmed = 'extended-confirmed-protected',
autoconfirmed = 'semi-protected',
},
move = {
default = 'move-protected'
},
autoreview = {
},
upload = {
default = 'upload-protected'
}
},
--------------------------------------------------------------------------------
-- Images
--------------------------------------------------------------------------------
-- This table lists different padlock images for each protection action and
-- protection level. It is used if an image is not specified in any of the
-- banner data tables, and if the page does not satisfy the conditions for using
-- the ['image-filename-indef'] image. It is checked in the following order:
-- 1. page's protection action, page's protection level
-- 2. page's protection action, default protection level
images = {
edit = {
default = 'Full-protection-shackle.svg',
templateeditor = 'Template-protection-shackle.svg',
extendedconfirmed = 'Extended-protection-shackle.svg',
autoconfirmed = 'Semi-protection-shackle.svg'
},
move = {
default = 'Move-protection-shackle.svg',
},
autoreview = {
default = 'Pending-protection-shackle.svg'
},
upload = {
default = 'Upload-protection-shackle.svg'
}
},
-- Pages with a reason specified in this table will show the special "indef"
-- padlock, defined in the 'image-filename-indef' message, if no expiry is set.
indefImageReasons = {
template = true
},
--------------------------------------------------------------------------------
-- Image links
--------------------------------------------------------------------------------
-- This table provides the data for the ${IMAGELINK} parameter, which gets
-- the image link for small padlock icons based on the page's protection action
-- and protection level. It is checked in the following order:
-- 1. page's protection action, page's protection level
-- 2. page's protection action, default protection level
-- 3. "edit" protection action, default protection level
--
-- It is possible to use banner parameters inside this table.
-- *required* - this table needs edit, move, autoreview and upload subtables.
imageLinks = {
edit = {
default = 'Wikipedia:Protection policy#full',
templateeditor = 'Wikipedia:Protection policy#template',
extendedconfirmed = 'Wikipedia:Protection policy#extended',
autoconfirmed = 'Wikipedia:Protection policy#semi'
},
move = {
default = 'Wikipedia:Protection policy#move'
},
autoreview = {
default = 'Wikipedia:Protection policy#pending'
},
upload = {
default = 'Wikipedia:Protection policy#upload'
}
},
--------------------------------------------------------------------------------
-- Padlock indicator names
--------------------------------------------------------------------------------
-- This table provides the "name" attribute for the <indicator> extension tag
-- with which small padlock icons are generated. All indicator tags on a page
-- are displayed in alphabetical order based on this attribute, and with
-- indicator tags with duplicate names, the last tag on the page wins.
-- The attribute is chosen based on the protection action; table keys must be a
-- protection action name or the string "default".
padlockIndicatorNames = {
autoreview = 'pp-autoreview',
default = 'pp-default'
},
--------------------------------------------------------------------------------
-- Protection categories
--------------------------------------------------------------------------------
--[[
-- The protection categories are stored in the protectionCategories table.
-- Keys to this table are made up of the following strings:
--
-- 1. the expiry date
-- 2. the namespace
-- 3. the protection reason (e.g. "dispute" or "vandalism")
-- 4. the protection level (e.g. "sysop" or "autoconfirmed")
-- 5. the action (e.g. "edit" or "move")
--
-- When the module looks up a category in the table, first it will will check to
-- see a key exists that corresponds to all five parameters. For example, a
-- user page semi-protected from vandalism for two weeks would have the key
-- "temp-user-vandalism-autoconfirmed-edit". If no match is found, the module
-- changes the first part of the key to "all" and checks the table again. It
-- keeps checking increasingly generic key combinations until it finds the
-- field, or until it reaches the key "all-all-all-all-all".
--
-- The module uses a binary matrix to determine the order in which to search.
-- This is best demonstrated by a table. In this table, the "0" values
-- represent "all", and the "1" values represent the original data (e.g.
-- "indef" or "file" or "vandalism").
--
-- expiry namespace reason level action
-- order
-- 1 1 1 1 1 1
-- 2 0 1 1 1 1
-- 3 1 0 1 1 1
-- 4 0 0 1 1 1
-- 5 1 1 0 1 1
-- 6 0 1 0 1 1
-- 7 1 0 0 1 1
-- 8 0 0 0 1 1
-- 9 1 1 1 0 1
-- 10 0 1 1 0 1
-- 11 1 0 1 0 1
-- 12 0 0 1 0 1
-- 13 1 1 0 0 1
-- 14 0 1 0 0 1
-- 15 1 0 0 0 1
-- 16 0 0 0 0 1
-- 17 1 1 1 1 0
-- 18 0 1 1 1 0
-- 19 1 0 1 1 0
-- 20 0 0 1 1 0
-- 21 1 1 0 1 0
-- 22 0 1 0 1 0
-- 23 1 0 0 1 0
-- 24 0 0 0 1 0
-- 25 1 1 1 0 0
-- 26 0 1 1 0 0
-- 27 1 0 1 0 0
-- 28 0 0 1 0 0
-- 29 1 1 0 0 0
-- 30 0 1 0 0 0
-- 31 1 0 0 0 0
-- 32 0 0 0 0 0
--
-- In this scheme the action has the highest priority, as it is the last
-- to change, and the expiry has the least priority, as it changes the most.
-- The priorities of the expiry, the protection level and the action are
-- fixed, but the priorities of the reason and the namespace can be swapped
-- through the use of the cfg.bannerDataNamespaceHasPriority table.
--]]
-- If the reason specified to the template is listed in this table,
-- namespace data will take priority over reason data in the protectionCategories
-- table.
reasonsWithNamespacePriority = {
vandalism = true,
},
-- The string to use as a namespace key for the protectionCategories table for each
-- namespace number.
categoryNamespaceKeys = {
[ 2] = 'user',
[ 3] = 'user',
[ 4] = 'project',
[ 6] = 'file',
[ 8] = 'mediawiki',
[ 10] = 'template',
[ 12] = 'project',
[ 14] = 'category',
[100] = 'portal',
[828] = 'module',
},
protectionCategories = {
['all|all|all|all|all'] = 'Wikipedia fully protected pages',
['all|all|office|all|all'] = 'Wikipedia Office-protected pages',
['all|all|reset|all|all'] = 'Wikipedia Office-protected pages',
['all|all|dmca|all|all'] = 'Wikipedia Office-protected pages',
['all|all|mainpage|all|all'] = 'Wikipedia fully protected main page files',
['all|all|all|extendedconfirmed|all'] = 'Wikipedia extended-confirmed-protected pages',
['all|all|ecp|extendedconfirmed|all'] = 'Wikipedia extended-confirmed-protected pages',
['all|template|all|all|edit'] = 'Wikipedia fully protected templates',
['all|all|all|autoconfirmed|edit'] = 'Wikipedia semi-protected pages',
['indef|all|all|autoconfirmed|edit'] = 'Wikipedia indefinitely semi-protected pages',
['all|all|blp|autoconfirmed|edit'] = 'Wikipedia indefinitely semi-protected biographies of living people',
['temp|all|blp|autoconfirmed|edit'] = 'Wikipedia temporarily semi-protected biographies of living people',
['all|all|dispute|autoconfirmed|edit'] = 'Wikipedia pages semi-protected due to dispute',
['all|all|sock|autoconfirmed|edit'] = 'Wikipedia pages semi-protected from banned users',
['all|all|vandalism|autoconfirmed|edit'] = 'Wikipedia pages semi-protected against vandalism',
['all|category|all|autoconfirmed|edit'] = 'Wikipedia semi-protected categories',
['all|file|all|autoconfirmed|edit'] = 'Wikipedia semi-protected files',
['all|portal|all|autoconfirmed|edit'] = 'Wikipedia semi-protected portals',
['all|project|all|autoconfirmed|edit'] = 'Wikipedia semi-protected project pages',
['all|talk|all|autoconfirmed|edit'] = 'Wikipedia semi-protected talk pages',
['all|template|all|autoconfirmed|edit'] = 'Wikipedia semi-protected templates',
['all|user|all|autoconfirmed|edit'] = 'Wikipedia semi-protected user and user talk pages',
['all|all|all|templateeditor|move'] = 'Wikipedia template-protected pages other than templates and modules',
['all|all|all|templateeditor|edit'] = 'Wikipedia template-protected pages other than templates and modules',
['all|template|all|templateeditor|edit'] = 'Wikipedia template-protected templates',
['all|template|all|templateeditor|move'] = 'Wikipedia template-protected templates', -- move-protected templates
['all|all|blp|sysop|edit'] = 'Wikipedia indefinitely protected biographies of living people',
['temp|all|blp|sysop|edit'] = 'Wikipedia temporarily protected biographies of living people',
['all|all|dispute|sysop|edit'] = 'Wikipedia pages protected due to dispute',
['all|all|sock|sysop|edit'] = 'Wikipedia pages protected from banned users',
['all|all|vandalism|sysop|edit'] = 'Wikipedia pages protected against vandalism',
['all|category|all|sysop|edit'] = 'Wikipedia fully protected categories',
['all|file|all|sysop|edit'] = 'Wikipedia fully protected files',
['all|project|all|sysop|edit'] = 'Wikipedia fully protected project pages',
['all|talk|all|sysop|edit'] = 'Wikipedia fully protected talk pages',
['all|template|all|extendedconfirmed|edit'] = 'Wikipedia extended-confirmed-protected templates',
['all|template|all|extendedconfirmed|move'] = 'Wikipedia extended-confirmed-protected templates',
['all|template|all|sysop|edit'] = 'Wikipedia fully protected templates',
['all|user|all|sysop|edit'] = 'Wikipedia fully protected user and user talk pages',
['all|module|all|all|edit'] = 'Wikipedia fully protected modules',
['all|module|all|templateeditor|edit'] = 'Wikipedia template-protected modules',
['all|module|all|extendedconfirmed|edit'] = 'Wikipedia extended-confirmed-protected modules',
['all|module|all|autoconfirmed|edit'] = 'Wikipedia semi-protected modules',
['all|all|all|sysop|move'] = 'Wikipedia move-protected pages',
['indef|all|all|sysop|move'] = 'Wikipedia indefinitely move-protected pages',
['all|all|dispute|sysop|move'] = 'Wikipedia pages move-protected due to dispute',
['all|all|vandalism|sysop|move'] = 'Wikipedia pages move-protected due to vandalism',
['all|portal|all|sysop|move'] = 'Wikipedia move-protected portals',
['all|project|all|sysop|move'] = 'Wikipedia move-protected project pages',
['all|talk|all|sysop|move'] = 'Wikipedia move-protected talk pages',
['all|template|all|sysop|move'] = 'Wikipedia move-protected templates',
['all|user|all|sysop|move'] = 'Wikipedia move-protected user and user talk pages',
['all|all|all|autoconfirmed|autoreview'] = 'Wikipedia pending changes protected pages',
['all|file|all|all|upload'] = 'Wikipedia upload-protected files',
},
--------------------------------------------------------------------------------
-- Expiry category config
--------------------------------------------------------------------------------
-- This table configures the expiry category behaviour for each protection
-- action.
-- * If set to true, setting that action will always categorise the page if
-- an expiry parameter is not set.
-- * If set to false, setting that action will never categorise the page.
-- * If set to nil, the module will categorise the page if:
-- 1) an expiry parameter is not set, and
-- 2) a reason is provided, and
-- 3) the specified reason is not blacklisted in the reasonsWithoutExpiryCheck
-- table.
expiryCheckActions = {
edit = nil,
move = false,
autoreview = true,
upload = false
},
reasonsWithoutExpiryCheck = {
blp = true,
template = true,
},
--------------------------------------------------------------------------------
-- Pagetypes
--------------------------------------------------------------------------------
-- This table produces the page types available with the ${PAGETYPE} parameter.
-- Keys are namespace numbers, or the string "default" for the default value.
pagetypes = {
[0] = 'article',
[6] = 'file',
[10] = 'template',
[14] = 'category',
[828] = 'module',
default = 'page'
},
--------------------------------------------------------------------------------
-- Strings marking indefinite protection
--------------------------------------------------------------------------------
-- This table contains values passed to the expiry parameter that mean the page
-- is protected indefinitely.
indefStrings = {
['indef'] = true,
['indefinite'] = true,
['indefinitely'] = true,
['infinite'] = true,
},
--------------------------------------------------------------------------------
-- Group hierarchy
--------------------------------------------------------------------------------
-- This table maps each group to all groups that have a superset of the original
-- group's page editing permissions.
hierarchy = {
sysop = {},
reviewer = {'sysop'},
filemover = {'sysop'},
templateeditor = {'sysop'},
extendedconfirmed = {'sysop'},
autoconfirmed = {'reviewer', 'filemover', 'templateeditor', 'extendedconfirmed'},
user = {'autoconfirmed'},
['*'] = {'user'}
},
--------------------------------------------------------------------------------
-- Wrapper templates and their default arguments
--------------------------------------------------------------------------------
-- This table contains wrapper templates used with the module, and their
-- default arguments. Templates specified in this table should contain the
-- following invocation, and no other template content:
--
-- {{#invoke:Protection banner|main}}
--
-- If other content is desired, it can be added between
-- <noinclude>...</noinclude> tags.
--
-- When a user calls one of these wrapper templates, they will use the
-- default arguments automatically. However, users can override any of the
-- arguments.
wrappers = {
['Template:Pp'] = {},
['Template:Protection padlock'] = {},
['Template:Pp-extended'] = {'ecp'},
['Template:Pp-blp'] = {'blp'},
-- we don't need Template:Pp-create
['Template:Pp-dispute'] = {'dispute'},
['Template:Pp-main-page'] = {'mainpage'},
['Template:Pp-move'] = {action = 'move', catonly = 'yes'},
['Template:Pp-move-dispute'] = {'dispute', action = 'move', catonly = 'yes'},
-- we don't need Template:Pp-move-indef
['Template:Pp-move-vandalism'] = {'vandalism', action = 'move', catonly = 'yes'},
['Template:Pp-office'] = {'office'},
['Template:Pp-office-dmca'] = {'dmca'},
['Template:Pp-pc'] = {action = 'autoreview', small = true},
['Template:Pp-pc1'] = {action = 'autoreview', small = true},
['Template:Pp-reset'] = {'reset'},
['Template:Pp-semi-indef'] = {small = true},
['Template:Pp-sock'] = {'sock'},
['Template:Pp-template'] = {'template', small = true},
['Template:Pp-upload'] = {action = 'upload'},
['Template:Pp-usertalk'] = {'usertalk'},
['Template:Pp-vandalism'] = {'vandalism'},
},
--------------------------------------------------------------------------------
--
-- MESSAGES
--
--------------------------------------------------------------------------------
msg = {
--------------------------------------------------------------------------------
-- Intro blurb and intro fragment
--------------------------------------------------------------------------------
-- These messages specify what is produced by the ${INTROBLURB} and
-- ${INTROFRAGMENT} parameters. If the protection is temporary they use the
-- intro-blurb-expiry or intro-fragment-expiry, and if not they use
-- intro-blurb-noexpiry or intro-fragment-noexpiry.
-- It is possible to use banner parameters in these messages.
['intro-blurb-expiry'] = '${PROTECTIONBLURB} until ${EXPIRY}.',
['intro-blurb-noexpiry'] = '${PROTECTIONBLURB}.',
['intro-fragment-expiry'] = '${PROTECTIONBLURB} until ${EXPIRY},',
['intro-fragment-noexpiry'] = '${PROTECTIONBLURB}',
--------------------------------------------------------------------------------
-- Tooltip blurb
--------------------------------------------------------------------------------
-- These messages specify what is produced by the ${TOOLTIPBLURB} parameter.
-- If the protection is temporary the tooltip-blurb-expiry message is used, and
-- if not the tooltip-blurb-noexpiry message is used.
-- It is possible to use banner parameters in these messages.
['tooltip-blurb-expiry'] = 'This ${PAGETYPE} is ${PROTECTIONLEVEL} until ${EXPIRY}.',
['tooltip-blurb-noexpiry'] = 'This ${PAGETYPE} is ${PROTECTIONLEVEL}.',
['tooltip-fragment-expiry'] = 'This ${PAGETYPE} is ${PROTECTIONLEVEL} until ${EXPIRY},',
['tooltip-fragment-noexpiry'] = 'This ${PAGETYPE} is ${PROTECTIONLEVEL}',
--------------------------------------------------------------------------------
-- Special explanation blurb
--------------------------------------------------------------------------------
-- An explanation blurb for pages that cannot be unprotected, e.g. for pages
-- in the MediaWiki namespace.
-- It is possible to use banner parameters in this message.
['explanation-blurb-nounprotect'] = 'See the [[Wikipedia:Protection policy|'
.. 'protection policy]] and ${PROTECTIONLOG} for more details.'
.. ' Please discuss any changes on the ${TALKPAGE}; you'
.. ' may ${EDITREQUEST} to ask an'
.. ' [[Wikipedia:Administrators|administrator]] to make an edit if it'
.. ' is [[Help:Minor edit#When to mark an edit as a minor edit'
.. '|uncontroversial]] or supported by [[Wikipedia:Consensus'
.. '|consensus]].',
--------------------------------------------------------------------------------
-- Protection log display values
--------------------------------------------------------------------------------
-- These messages determine the display values for the protection log link
-- or the pending changes log link produced by the ${PROTECTIONLOG} parameter.
-- It is possible to use banner parameters in these messages.
['protection-log-display'] = 'protection log',
['pc-log-display'] = 'pending changes log',
--------------------------------------------------------------------------------
-- Current version display values
--------------------------------------------------------------------------------
-- These messages determine the display values for the page history link
-- or the move log link produced by the ${CURRENTVERSION} parameter.
-- It is possible to use banner parameters in these messages.
['current-version-move-display'] = 'current title',
['current-version-edit-display'] = 'current version',
--------------------------------------------------------------------------------
-- Talk page
--------------------------------------------------------------------------------
-- This message determines the display value of the talk page link produced
-- with the ${TALKPAGE} parameter.
-- It is possible to use banner parameters in this message.
['talk-page-link-display'] = 'talk page',
--------------------------------------------------------------------------------
-- Edit requests
--------------------------------------------------------------------------------
-- This message determines the display value of the edit request link produced
-- with the ${EDITREQUEST} parameter.
-- It is possible to use banner parameters in this message.
['edit-request-display'] = 'submit an edit request',
--------------------------------------------------------------------------------
-- Expiry date format
--------------------------------------------------------------------------------
-- This is the format for the blurb expiry date. It should be valid input for
-- the first parameter of the #time parser function.
['expiry-date-format'] = 'F j, Y "at" H:i e',
--------------------------------------------------------------------------------
-- Tracking categories
--------------------------------------------------------------------------------
-- These messages determine which tracking categories the module outputs.
['tracking-category-incorrect'] = 'Wikipedia pages with incorrect protection templates',
['tracking-category-template'] = 'Wikipedia template-protected pages other than templates and modules',
--------------------------------------------------------------------------------
-- Images
--------------------------------------------------------------------------------
-- These are images that are not defined by their protection action and protection level.
['image-filename-indef'] = 'Full-protection-shackle.svg',
['image-filename-default'] = 'Transparent.gif',
--------------------------------------------------------------------------------
-- End messages
--------------------------------------------------------------------------------
}
--------------------------------------------------------------------------------
-- End configuration
--------------------------------------------------------------------------------
}
g4f6dkimoikv05ulbf832zu7omkf2fc
802668
802667
2026-07-26T19:30:30Z
SM7
3953
1 revision imported from [[:en:Module:Protection_banner/config]]
802667
Scribunto
text/plain
-- This module provides configuration data for [[Module:Protection banner]].
return {
--------------------------------------------------------------------------------
--
-- BANNER DATA
--
--------------------------------------------------------------------------------
--[[
-- Banner data consists of six fields:
-- * text - the main protection text that appears at the top of protection
-- banners.
-- * explanation - the text that appears below the main protection text, used
-- to explain the details of the protection.
-- * tooltip - the tooltip text you see when you move the mouse over a small
-- padlock icon.
-- * link - the page that the small padlock icon links to.
-- * alt - the alt text for the small padlock icon. This is also used as tooltip
-- text for the large protection banners.
-- * image - the padlock image used in both protection banners and small padlock
-- icons.
--
-- The module checks in three separate tables to find a value for each field.
-- First it checks the banners table, which has values specific to the reason
-- for the page being protected. Then the module checks the defaultBanners
-- table, which has values specific to each protection level. Finally, the
-- module checks the masterBanner table, which holds data for protection
-- templates to use if no data has been found in the previous two tables.
--
-- The values in the banner data can take parameters. These are specified
-- using ${TEXTLIKETHIS} (a dollar sign preceding a parameter name
-- enclosed in curly braces).
--
-- Available parameters:
--
-- ${CURRENTVERSION} - a link to the page history or the move log, with the
-- display message "current-version-edit-display" or
-- "current-version-move-display".
--
-- ${EDITREQUEST} - a link to create an edit request for the current page.
--
-- ${EXPLANATIONBLURB} - an explanation blurb, e.g. "Please discuss any changes
-- on the talk page; you may submit a request to ask an administrator to make
-- an edit if it is minor or supported by consensus."
--
-- ${IMAGELINK} - a link to set the image to, depending on the protection
-- action and protection level.
--
-- ${INTROBLURB} - the PROTECTIONBLURB parameter, plus the expiry if an expiry
-- is set. E.g. "Editing of this page by new or unregistered users is currently
-- disabled until dd Month YYYY."
--
-- ${INTROFRAGMENT} - the same as ${INTROBLURB}, but without final punctuation
-- so that it can be used in run-on sentences.
--
-- ${PAGETYPE} - the type of the page, e.g. "article" or "template".
-- Defined in the cfg.pagetypes table.
--
-- ${PROTECTIONBLURB} - a blurb explaining the protection level of the page, e.g.
-- "Editing of this page by new or unregistered users is currently disabled"
--
-- ${PROTECTIONDATE} - the protection date, if it has been supplied to the
-- template.
--
-- ${PROTECTIONLEVEL} - the protection level, e.g. "fully protected" or
-- "semi-protected".
--
-- ${PROTECTIONLOG} - a link to the protection log or the pending changes log,
-- depending on the protection action.
--
-- ${TALKPAGE} - a link to the talk page. If a section is specified, links
-- straight to that talk page section.
--
-- ${TOOLTIPBLURB} - uses the PAGETYPE, PROTECTIONTYPE and EXPIRY parameters to
-- create a blurb like "This template is semi-protected", or "This article is
-- move-protected until DD Month YYYY".
--
-- ${VANDAL} - links for the specified username (or the root page name)
-- using Module:Vandal-m.
--
-- Functions
--
-- For advanced users, it is possible to use Lua functions instead of strings
-- in the banner config tables. Using functions gives flexibility that is not
-- possible just by using parameters. Functions take two arguments, the
-- protection object and the template arguments, and they must output a string.
--
-- For example:
--
-- text = function (protectionObj, args)
-- if protectionObj.level == 'autoconfirmed' then
-- return 'foo'
-- else
-- return 'bar'
-- end
-- end
--
-- Some protection object properties and methods that may be useful:
-- protectionObj.action - the protection action
-- protectionObj.level - the protection level
-- protectionObj.reason - the protection reason
-- protectionObj.expiry - the expiry. Nil if unset, the string "indef" if set
-- to indefinite, and the protection time in unix time if temporary.
-- protectionObj.protectionDate - the protection date in unix time, or nil if
-- unspecified.
-- protectionObj.bannerConfig - the banner config found by the module. Beware
-- of editing the config field used by the function, as it could create an
-- infinite loop.
-- protectionObj:isProtected - returns a boolean showing whether the page is
-- protected.
-- protectionObj:isTemporary - returns a boolean showing whether the expiry is
-- temporary.
-- protectionObj:isIncorrect - returns a boolean showing whether the protection
-- template is incorrect.
--]]
-- The master banner data, used if no values have been found in banners or
-- defaultBanners.
masterBanner = {
text = '${INTROBLURB}',
explanation = '${EXPLANATIONBLURB}',
tooltip = '${TOOLTIPBLURB}',
link = '${IMAGELINK}',
alt = 'Page ${PROTECTIONLEVEL}'
},
-- The default banner data. This holds banner data for different protection
-- levels.
-- *required* - this table needs edit, move, autoreview and upload subtables.
defaultBanners = {
edit = {},
move = {},
autoreview = {
default = {
alt = 'Page protected with pending changes',
tooltip = 'All edits by unregistered and new users are subject to review prior to becoming visible to unregistered users',
image = 'Pending-protection-shackle.svg'
}
},
upload = {}
},
-- The banner data. This holds banner data for different protection reasons.
-- In fact, the reasons specified in this table control which reasons are
-- valid inputs to the first positional parameter.
--
-- There is also a non-standard "description" field that can be used for items
-- in this table. This is a description of the protection reason for use in the
-- module documentation.
--
-- *required* - this table needs edit, move, autoreview and upload subtables.
banners = {
edit = {
blp = {
description = 'For pages protected to promote compliance with the'
.. ' [[Wikipedia:Biographies of living persons'
.. '|biographies of living persons]] policy',
text = '${INTROFRAGMENT} to promote compliance with'
.. ' [[Wikipedia:Biographies of living persons'
.. "|Wikipedia's policy on the biographies"
.. ' of living people]].',
tooltip = '${TOOLTIPFRAGMENT} to promote compliance with the policy on'
.. ' biographies of living persons',
},
deceased = {
description = 'For user pages of Wikipedia users who are deceased',
text = '${INTROFRAGMENT} to prevent vandalism of a deceased'
.. ' Wikipedian\'s user page.'
.. ' A family member who wishes to edit this user page can use this'
.. ' user\'s ${TALKPAGE} or submit a request to [[Wikipedia:VRT|the'
.. ' Volunteer Response Team]].',
tooltip = '${TOOLTIPFRAGMENT} because this Wikipedian is deceased'
},
dmca = {
description = 'For pages protected by the Wikimedia Foundation'
.. ' due to [[Digital Millennium Copyright Act]] takedown requests',
explanation = function (protectionObj, args)
local ret = 'Pursuant to a rights owner notice under the Digital'
.. ' Millennium Copyright Act (DMCA) regarding some content'
.. ' in this article, the Wikimedia Foundation acted under'
.. ' applicable law and took down and restricted the content'
.. ' in question.'
if args.notice then
ret = ret .. ' A copy of the received notice can be found here: '
.. args.notice .. '.'
end
ret = ret .. ' For more information, including websites discussing'
.. ' how to file a counter-notice, please see'
.. " [[Wikipedia:Office actions]] and the article's ${TALKPAGE}."
.. "'''Do not remove this template from the article until the"
.. " restrictions are withdrawn'''."
return ret
end,
image = 'Office-protection-shackle.svg',
link = 'Wikipedia:Protection policy#office',
},
dispute = {
description = 'For pages protected due to editing disputes',
text = function (protectionObj, args)
-- Find the value of "disputes".
local display = 'disputes'
local disputes
if args.section then
disputes = string.format(
'[[%s:%s#%s|%s]]',
mw.site.namespaces[protectionObj.title.namespace].talk.name,
protectionObj.title.text,
args.section,
display
)
else
disputes = display
end
-- Make the blurb, depending on the expiry.
local msg
if type(protectionObj.expiry) == 'number' then
msg = '${INTROFRAGMENT} or until editing %s have been resolved.'
else
msg = '${INTROFRAGMENT} until editing %s have been resolved.'
end
return string.format(msg, disputes)
end,
explanation = "This protection is '''not''' an endorsement of the"
.. ' ${CURRENTVERSION}. ${EXPLANATIONBLURB}',
tooltip = '${TOOLTIPFRAGMENT} due to editing disputes',
},
ecp = {
description = 'For articles in topic areas authorized by'
.. ' [[Wikipedia:Arbitration Committee|ArbCom]] or'
.. ' meets the criteria for community use',
alt = 'Extended-protected ${PAGETYPE}',
},
mainpage = {
description = 'For pages protected for being displayed on the [[Main Page]]',
text = 'This file is currently'
.. ' [[Wikipedia:This page is protected|protected]] from'
.. ' editing because it is currently or will soon be displayed'
.. ' on the [[Main Page]].',
explanation = 'Images on the Main Page are protected due to their high'
.. ' visibility. Please discuss any necessary changes on the ${TALKPAGE}.'
.. '<br /><span style="font-size:90%;">'
.. "'''Administrators:''' Once this image is definitely off the Main Page,"
.. ' please unprotect this file, or reduce to semi-protection,'
.. ' as appropriate.</span>',
},
office = {
description = 'For pages protected by the Wikimedia Foundation',
text = function (protectionObj, args)
local ret = 'This ${PAGETYPE} is currently under the'
.. ' scrutiny of the'
.. ' [[Wikipedia:Office actions|Wikimedia Foundation Office]]'
.. ' and is protected.'
if protectionObj.protectionDate then
ret = ret .. ' It has been protected since ${PROTECTIONDATE}.'
end
return ret
end,
explanation = "If you can edit this page, please discuss all changes and"
.. " additions on the ${TALKPAGE} first. '''Do not remove protection from this"
.. " page unless you are authorized by the Wikimedia Foundation to do"
.. " so.'''",
image = 'Office-protection-shackle.svg',
link = 'Wikipedia:Protection policy#office',
},
reset = {
description = 'For pages protected by the Wikimedia Foundation and'
.. ' "reset" to a bare-bones version',
text = 'This ${PAGETYPE} is currently under the'
.. ' scrutiny of the'
.. ' [[Wikipedia:Office actions|Wikimedia Foundation Office]]'
.. ' and is protected.',
explanation = function (protectionObj, args)
local ret = ''
if protectionObj.protectionDate then
ret = ret .. 'On ${PROTECTIONDATE} this ${PAGETYPE} was'
else
ret = ret .. 'This ${PAGETYPE} has been'
end
ret = ret .. ' reduced to a'
.. ' simplified, "bare bones" version so that it may be completely'
.. ' rewritten to ensure it meets the policies of'
.. ' [[WP:NPOV|Neutral Point of View]] and [[WP:V|Verifiability]].'
.. ' Standard Wikipedia policies will apply to its rewriting—which'
.. ' will eventually be open to all editors—and will be strictly'
.. ' enforced. The ${PAGETYPE} has been ${PROTECTIONLEVEL} while'
.. ' it is being rebuilt.\n\n'
.. 'Any insertion of material directly from'
.. ' pre-protection revisions of the ${PAGETYPE} will be removed, as'
.. ' will any material added to the ${PAGETYPE} that is not properly'
.. ' sourced. The associated talk page(s) were also cleared on the'
.. " same date.\n\n"
.. "If you can edit this page, please discuss all changes and"
.. " additions on the ${TALKPAGE} first. '''Do not override"
.. " this action, and do not remove protection from this page,"
.. " unless you are authorized by the Wikimedia Foundation"
.. " to do so. No editor may remove this notice.'''"
return ret
end,
image = 'Office-protection-shackle.svg',
link = 'Wikipedia:Protection policy#office',
},
sock = {
description = 'For pages protected due to'
.. ' [[Wikipedia:Sock puppetry|sock puppetry]]',
text = '${INTROFRAGMENT} to prevent [[Wikipedia:Sock puppetry|sock puppets]] of'
.. ' [[Wikipedia:Blocking policy|blocked]] or'
.. ' [[Wikipedia:Banning policy|banned users]]'
.. ' from editing it.',
tooltip = '${TOOLTIPFRAGMENT} to prevent sock puppets of blocked or banned users from'
.. ' editing it',
},
template = {
description = 'For [[Wikipedia:High-risk templates|high-risk]]'
.. ' templates and Lua modules',
text = 'This is a permanently [[Wikipedia:Protection policy|protected]] ${PAGETYPE},'
.. ' as it is [[Wikipedia:High-risk templates|high-risk]].',
explanation = 'Please discuss any changes on the ${TALKPAGE}; you may'
.. ' ${EDITREQUEST} to ask an'
.. ' [[Wikipedia:Administrators|administrator]] or'
.. ' [[Wikipedia:Template editor|template editor]] to make an edit if'
.. ' it is [[Help:Minor edit#When to mark an edit as a minor edit'
.. '|uncontroversial]] or supported by'
.. ' [[Wikipedia:Consensus|consensus]]. You can also'
.. ' [[Wikipedia:Requests for page protection|request]] that the page be'
.. ' unprotected.',
tooltip = 'This high-risk ${PAGETYPE} is permanently ${PROTECTIONLEVEL}'
.. ' to prevent vandalism',
alt = 'Permanently protected ${PAGETYPE}',
},
usertalk = {
description = 'For pages protected against disruptive edits by a'
.. ' particular user',
text = '${INTROFRAGMENT} to prevent ${VANDAL} from using it to make disruptive edits,'
.. ' such as abusing the'
.. ' {{[[Template:unblock|unblock]]}} template.',
explanation = 'If you cannot edit this user talk page and you need to'
.. ' make a change or leave a message, you can'
.. ' [[Wikipedia:Requests for page protection'
.. '#Current requests for edits to a protected page'
.. '|request an edit]],'
.. ' [[Wikipedia:Requests for page protection'
.. '#Current requests for reduction in protection level'
.. '|request unprotection]],'
.. ' [[Special:Userlogin|log in]],'
.. ' or [[Special:UserLogin/signup|create an account]].',
},
vandalism = {
description = 'For pages protected against'
.. ' [[Wikipedia:Vandalism|vandalism]]',
text = '${INTROFRAGMENT} due to [[Wikipedia:Vandalism|vandalism]].',
explanation = function (protectionObj, args)
local ret = ''
if protectionObj.level == 'sysop' then
ret = ret .. "This protection is '''not''' an endorsement of the"
.. ' ${CURRENTVERSION}. '
end
return ret .. '${EXPLANATIONBLURB}'
end,
tooltip = '${TOOLTIPFRAGMENT} due to vandalism',
}
},
move = {
dispute = {
description = 'For pages protected against page moves due to'
.. ' disputes over the page title',
explanation = "This protection is '''not''' an endorsement of the"
.. ' ${CURRENTVERSION}. ${EXPLANATIONBLURB}',
image = 'Move-protection-shackle.svg'
},
vandalism = {
description = 'For pages protected against'
.. ' [[Wikipedia:Vandalism#Page-move vandalism'
.. ' |page-move vandalism]]'
}
},
autoreview = {},
upload = {}
},
--------------------------------------------------------------------------------
--
-- GENERAL DATA TABLES
--
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
-- Protection blurbs
--------------------------------------------------------------------------------
-- This table produces the protection blurbs available with the
-- ${PROTECTIONBLURB} parameter. It is sorted by protection action and
-- protection level, and is checked by the module in the following order:
-- 1. page's protection action, page's protection level
-- 2. page's protection action, default protection level
-- 3. "edit" protection action, default protection level
--
-- It is possible to use banner parameters inside this table.
-- *required* - this table needs edit, move, autoreview and upload subtables.
protectionBlurbs = {
edit = {
default = 'This ${PAGETYPE} is currently [[Wikipedia:Protection policy#full|'
.. 'protected]] from editing',
templateeditor = 'This ${PAGETYPE} is currently [[Wikipedia:Protection policy#template'
.. '|protected]] from editing',
autoconfirmed = 'Editing of this ${PAGETYPE} by [[Wikipedia:User access'
.. ' levels#New users|new]] or [[Wikipedia:User access levels#Unregistered'
.. ' users|unregistered]] users is currently [[Wikipedia:Protection'
.. ' policy#semi|disabled]]',
extendedconfirmed = 'This ${PAGETYPE} is currently under [[Wikipedia:Protection'
.. ' policy#extended|extended confirmed protection]]',
},
move = {
default = 'This ${PAGETYPE} is currently [[Wikipedia:Protection policy#Move'
.. ' protection|protected]] from [[Help:Moving a page|page moves]]'
},
autoreview = {
default = 'All edits made to this ${PAGETYPE} by'
.. ' [[Wikipedia:User access levels#New users|new]] or'
.. ' [[Wikipedia:User access levels#Unregistered users|unregistered]]'
.. ' users are currently'
.. ' [[Wikipedia:Pending changes|subject to review]]'
},
upload = {
default = 'Uploading new versions of this ${PAGETYPE} is currently disabled'
}
},
--------------------------------------------------------------------------------
-- Explanation blurbs
--------------------------------------------------------------------------------
-- This table produces the explanation blurbs available with the
-- ${EXPLANATIONBLURB} parameter. It is sorted by protection action,
-- protection level, and whether the page is a talk page or not. If the page is
-- a talk page it will have a talk key of "talk"; otherwise it will have a talk
-- key of "subject". The table is checked in the following order:
-- 1. page's protection action, page's protection level, page's talk key
-- 2. page's protection action, page's protection level, default talk key
-- 3. page's protection action, default protection level, page's talk key
-- 4. page's protection action, default protection level, default talk key
--
-- It is possible to use banner parameters inside this table.
-- *required* - this table needs edit, move, autoreview and upload subtables.
explanationBlurbs = {
edit = {
autoconfirmed = {
subject = 'See the [[Wikipedia:Protection policy|'
.. 'protection policy]] and ${PROTECTIONLOG} for more details. If you'
.. ' cannot edit this ${PAGETYPE} and you wish to make a change, you can'
.. ' ${EDITREQUEST}, discuss changes on the ${TALKPAGE},'
.. ' [[Wikipedia:Requests for page protection'
.. '#Current requests for reduction in protection level'
.. '|request unprotection]], [[Special:Userlogin|log in]], or'
.. ' [[Special:UserLogin/signup|create an account]].',
default = 'See the [[Wikipedia:Protection policy|'
.. 'protection policy]] and ${PROTECTIONLOG} for more details. If you'
.. ' cannot edit this ${PAGETYPE} and you wish to make a change, you can'
.. ' [[Wikipedia:Requests for page protection'
.. '#Current requests for reduction in protection level'
.. '|request unprotection]], [[Special:Userlogin|log in]], or'
.. ' [[Special:UserLogin/signup|create an account]].',
},
extendedconfirmed = {
default = 'Extended confirmed protection prevents edits from all unregistered editors'
.. ' and registered users with fewer than 30 days tenure and 500 edits.'
.. ' The [[Wikipedia:Protection policy#extended|policy on community use]]'
.. ' specifies that extended confirmed protection can be applied to combat'
.. ' disruption, if semi-protection has proven to be ineffective.'
.. ' Extended confirmed protection may also be applied to enforce'
.. ' [[Wikipedia:Arbitration Committee|arbitration sanctions]].'
.. ' Please discuss any changes on the ${TALKPAGE}; you may'
.. ' ${EDITREQUEST} to ask for uncontroversial changes supported by'
.. ' [[Wikipedia:Consensus|consensus]].'
},
default = {
subject = 'See the [[Wikipedia:Protection policy|'
.. 'protection policy]] and ${PROTECTIONLOG} for more details.'
.. ' Please discuss any changes on the ${TALKPAGE}; you'
.. ' may ${EDITREQUEST} to ask an'
.. ' [[Wikipedia:Administrators|administrator]] to make an edit if it'
.. ' is [[Help:Minor edit#When to mark an edit as a minor edit'
.. '|uncontroversial]] or supported by [[Wikipedia:Consensus'
.. '|consensus]]. You may also [[Wikipedia:Requests for'
.. ' page protection#Current requests for reduction in protection level'
.. '|request]] that this page be unprotected.',
default = 'See the [[Wikipedia:Protection policy|'
.. 'protection policy]] and ${PROTECTIONLOG} for more details.'
.. ' You may [[Wikipedia:Requests for page'
.. ' protection#Current requests for edits to a protected page|request an'
.. ' edit]] to this page, or [[Wikipedia:Requests for'
.. ' page protection#Current requests for reduction in protection level'
.. '|ask]] for it to be unprotected.'
}
},
move = {
default = {
subject = 'See the [[Wikipedia:Protection policy|'
.. 'protection policy]] and ${PROTECTIONLOG} for more details.'
.. ' The page may still be edited but cannot be moved'
.. ' until unprotected. Please discuss any suggested moves on the'
.. ' ${TALKPAGE} or at [[Wikipedia:Requested moves]]. You can also'
.. ' [[Wikipedia:Requests for page protection|request]] that the page be'
.. ' unprotected.',
default = 'See the [[Wikipedia:Protection policy|'
.. 'protection policy]] and ${PROTECTIONLOG} for more details.'
.. ' The page may still be edited but cannot be moved'
.. ' until unprotected. Please discuss any suggested moves at'
.. ' [[Wikipedia:Requested moves]]. You can also'
.. ' [[Wikipedia:Requests for page protection|request]] that the page be'
.. ' unprotected.'
}
},
autoreview = {
default = {
default = 'See the [[Wikipedia:Protection policy|'
.. 'protection policy]] and ${PROTECTIONLOG} for more details.'
.. ' Edits to this ${PAGETYPE} by new and unregistered users'
.. ' will not be visible to readers until they are accepted by'
.. ' a reviewer. To avoid the need for your edits to be'
.. ' reviewed, you may'
.. ' [[Wikipedia:Requests for page protection'
.. '#Current requests for reduction in protection level'
.. '|request unprotection]], [[Special:Userlogin|log in]], or'
.. ' [[Special:UserLogin/signup|create an account]].'
},
},
upload = {
default = {
default = 'See the [[Wikipedia:Protection policy|'
.. 'protection policy]] and ${PROTECTIONLOG} for more details.'
.. ' The page may still be edited but new versions of the file'
.. ' cannot be uploaded until it is unprotected. You can'
.. ' request that a new version be uploaded by using a'
.. ' [[Wikipedia:Edit requests|protected edit request]], or you'
.. ' can [[Wikipedia:Requests for page protection|request]]'
.. ' that the file be unprotected.'
}
}
},
--------------------------------------------------------------------------------
-- Protection levels
--------------------------------------------------------------------------------
-- This table provides the data for the ${PROTECTIONLEVEL} parameter, which
-- produces a short label for different protection levels. It is sorted by
-- protection action and protection level, and is checked in the following
-- order:
-- 1. page's protection action, page's protection level
-- 2. page's protection action, default protection level
-- 3. "edit" protection action, default protection level
--
-- It is possible to use banner parameters inside this table.
-- *required* - this table needs edit, move, autoreview and upload subtables.
protectionLevels = {
edit = {
default = 'protected',
templateeditor = 'template-protected',
extendedconfirmed = 'extended-confirmed-protected',
autoconfirmed = 'semi-protected',
},
move = {
default = 'move-protected'
},
autoreview = {
},
upload = {
default = 'upload-protected'
}
},
--------------------------------------------------------------------------------
-- Images
--------------------------------------------------------------------------------
-- This table lists different padlock images for each protection action and
-- protection level. It is used if an image is not specified in any of the
-- banner data tables, and if the page does not satisfy the conditions for using
-- the ['image-filename-indef'] image. It is checked in the following order:
-- 1. page's protection action, page's protection level
-- 2. page's protection action, default protection level
images = {
edit = {
default = 'Full-protection-shackle.svg',
templateeditor = 'Template-protection-shackle.svg',
extendedconfirmed = 'Extended-protection-shackle.svg',
autoconfirmed = 'Semi-protection-shackle.svg'
},
move = {
default = 'Move-protection-shackle.svg',
},
autoreview = {
default = 'Pending-protection-shackle.svg'
},
upload = {
default = 'Upload-protection-shackle.svg'
}
},
-- Pages with a reason specified in this table will show the special "indef"
-- padlock, defined in the 'image-filename-indef' message, if no expiry is set.
indefImageReasons = {
template = true
},
--------------------------------------------------------------------------------
-- Image links
--------------------------------------------------------------------------------
-- This table provides the data for the ${IMAGELINK} parameter, which gets
-- the image link for small padlock icons based on the page's protection action
-- and protection level. It is checked in the following order:
-- 1. page's protection action, page's protection level
-- 2. page's protection action, default protection level
-- 3. "edit" protection action, default protection level
--
-- It is possible to use banner parameters inside this table.
-- *required* - this table needs edit, move, autoreview and upload subtables.
imageLinks = {
edit = {
default = 'Wikipedia:Protection policy#full',
templateeditor = 'Wikipedia:Protection policy#template',
extendedconfirmed = 'Wikipedia:Protection policy#extended',
autoconfirmed = 'Wikipedia:Protection policy#semi'
},
move = {
default = 'Wikipedia:Protection policy#move'
},
autoreview = {
default = 'Wikipedia:Protection policy#pending'
},
upload = {
default = 'Wikipedia:Protection policy#upload'
}
},
--------------------------------------------------------------------------------
-- Padlock indicator names
--------------------------------------------------------------------------------
-- This table provides the "name" attribute for the <indicator> extension tag
-- with which small padlock icons are generated. All indicator tags on a page
-- are displayed in alphabetical order based on this attribute, and with
-- indicator tags with duplicate names, the last tag on the page wins.
-- The attribute is chosen based on the protection action; table keys must be a
-- protection action name or the string "default".
padlockIndicatorNames = {
autoreview = 'pp-autoreview',
default = 'pp-default'
},
--------------------------------------------------------------------------------
-- Protection categories
--------------------------------------------------------------------------------
--[[
-- The protection categories are stored in the protectionCategories table.
-- Keys to this table are made up of the following strings:
--
-- 1. the expiry date
-- 2. the namespace
-- 3. the protection reason (e.g. "dispute" or "vandalism")
-- 4. the protection level (e.g. "sysop" or "autoconfirmed")
-- 5. the action (e.g. "edit" or "move")
--
-- When the module looks up a category in the table, first it will will check to
-- see a key exists that corresponds to all five parameters. For example, a
-- user page semi-protected from vandalism for two weeks would have the key
-- "temp-user-vandalism-autoconfirmed-edit". If no match is found, the module
-- changes the first part of the key to "all" and checks the table again. It
-- keeps checking increasingly generic key combinations until it finds the
-- field, or until it reaches the key "all-all-all-all-all".
--
-- The module uses a binary matrix to determine the order in which to search.
-- This is best demonstrated by a table. In this table, the "0" values
-- represent "all", and the "1" values represent the original data (e.g.
-- "indef" or "file" or "vandalism").
--
-- expiry namespace reason level action
-- order
-- 1 1 1 1 1 1
-- 2 0 1 1 1 1
-- 3 1 0 1 1 1
-- 4 0 0 1 1 1
-- 5 1 1 0 1 1
-- 6 0 1 0 1 1
-- 7 1 0 0 1 1
-- 8 0 0 0 1 1
-- 9 1 1 1 0 1
-- 10 0 1 1 0 1
-- 11 1 0 1 0 1
-- 12 0 0 1 0 1
-- 13 1 1 0 0 1
-- 14 0 1 0 0 1
-- 15 1 0 0 0 1
-- 16 0 0 0 0 1
-- 17 1 1 1 1 0
-- 18 0 1 1 1 0
-- 19 1 0 1 1 0
-- 20 0 0 1 1 0
-- 21 1 1 0 1 0
-- 22 0 1 0 1 0
-- 23 1 0 0 1 0
-- 24 0 0 0 1 0
-- 25 1 1 1 0 0
-- 26 0 1 1 0 0
-- 27 1 0 1 0 0
-- 28 0 0 1 0 0
-- 29 1 1 0 0 0
-- 30 0 1 0 0 0
-- 31 1 0 0 0 0
-- 32 0 0 0 0 0
--
-- In this scheme the action has the highest priority, as it is the last
-- to change, and the expiry has the least priority, as it changes the most.
-- The priorities of the expiry, the protection level and the action are
-- fixed, but the priorities of the reason and the namespace can be swapped
-- through the use of the cfg.bannerDataNamespaceHasPriority table.
--]]
-- If the reason specified to the template is listed in this table,
-- namespace data will take priority over reason data in the protectionCategories
-- table.
reasonsWithNamespacePriority = {
vandalism = true,
},
-- The string to use as a namespace key for the protectionCategories table for each
-- namespace number.
categoryNamespaceKeys = {
[ 2] = 'user',
[ 3] = 'user',
[ 4] = 'project',
[ 6] = 'file',
[ 8] = 'mediawiki',
[ 10] = 'template',
[ 12] = 'project',
[ 14] = 'category',
[100] = 'portal',
[828] = 'module',
},
protectionCategories = {
['all|all|all|all|all'] = 'Wikipedia fully protected pages',
['all|all|office|all|all'] = 'Wikipedia Office-protected pages',
['all|all|reset|all|all'] = 'Wikipedia Office-protected pages',
['all|all|dmca|all|all'] = 'Wikipedia Office-protected pages',
['all|all|mainpage|all|all'] = 'Wikipedia fully protected main page files',
['all|all|all|extendedconfirmed|all'] = 'Wikipedia extended-confirmed-protected pages',
['all|all|ecp|extendedconfirmed|all'] = 'Wikipedia extended-confirmed-protected pages',
['all|template|all|all|edit'] = 'Wikipedia fully protected templates',
['all|all|all|autoconfirmed|edit'] = 'Wikipedia semi-protected pages',
['indef|all|all|autoconfirmed|edit'] = 'Wikipedia indefinitely semi-protected pages',
['all|all|blp|autoconfirmed|edit'] = 'Wikipedia indefinitely semi-protected biographies of living people',
['temp|all|blp|autoconfirmed|edit'] = 'Wikipedia temporarily semi-protected biographies of living people',
['all|all|dispute|autoconfirmed|edit'] = 'Wikipedia pages semi-protected due to dispute',
['all|all|sock|autoconfirmed|edit'] = 'Wikipedia pages semi-protected from banned users',
['all|all|vandalism|autoconfirmed|edit'] = 'Wikipedia pages semi-protected against vandalism',
['all|category|all|autoconfirmed|edit'] = 'Wikipedia semi-protected categories',
['all|file|all|autoconfirmed|edit'] = 'Wikipedia semi-protected files',
['all|portal|all|autoconfirmed|edit'] = 'Wikipedia semi-protected portals',
['all|project|all|autoconfirmed|edit'] = 'Wikipedia semi-protected project pages',
['all|talk|all|autoconfirmed|edit'] = 'Wikipedia semi-protected talk pages',
['all|template|all|autoconfirmed|edit'] = 'Wikipedia semi-protected templates',
['all|user|all|autoconfirmed|edit'] = 'Wikipedia semi-protected user and user talk pages',
['all|all|all|templateeditor|move'] = 'Wikipedia template-protected pages other than templates and modules',
['all|all|all|templateeditor|edit'] = 'Wikipedia template-protected pages other than templates and modules',
['all|template|all|templateeditor|edit'] = 'Wikipedia template-protected templates',
['all|template|all|templateeditor|move'] = 'Wikipedia template-protected templates', -- move-protected templates
['all|all|blp|sysop|edit'] = 'Wikipedia indefinitely protected biographies of living people',
['temp|all|blp|sysop|edit'] = 'Wikipedia temporarily protected biographies of living people',
['all|all|dispute|sysop|edit'] = 'Wikipedia pages protected due to dispute',
['all|all|sock|sysop|edit'] = 'Wikipedia pages protected from banned users',
['all|all|vandalism|sysop|edit'] = 'Wikipedia pages protected against vandalism',
['all|category|all|sysop|edit'] = 'Wikipedia fully protected categories',
['all|file|all|sysop|edit'] = 'Wikipedia fully protected files',
['all|project|all|sysop|edit'] = 'Wikipedia fully protected project pages',
['all|talk|all|sysop|edit'] = 'Wikipedia fully protected talk pages',
['all|template|all|extendedconfirmed|edit'] = 'Wikipedia extended-confirmed-protected templates',
['all|template|all|extendedconfirmed|move'] = 'Wikipedia extended-confirmed-protected templates',
['all|template|all|sysop|edit'] = 'Wikipedia fully protected templates',
['all|user|all|sysop|edit'] = 'Wikipedia fully protected user and user talk pages',
['all|module|all|all|edit'] = 'Wikipedia fully protected modules',
['all|module|all|templateeditor|edit'] = 'Wikipedia template-protected modules',
['all|module|all|extendedconfirmed|edit'] = 'Wikipedia extended-confirmed-protected modules',
['all|module|all|autoconfirmed|edit'] = 'Wikipedia semi-protected modules',
['all|all|all|sysop|move'] = 'Wikipedia move-protected pages',
['indef|all|all|sysop|move'] = 'Wikipedia indefinitely move-protected pages',
['all|all|dispute|sysop|move'] = 'Wikipedia pages move-protected due to dispute',
['all|all|vandalism|sysop|move'] = 'Wikipedia pages move-protected due to vandalism',
['all|portal|all|sysop|move'] = 'Wikipedia move-protected portals',
['all|project|all|sysop|move'] = 'Wikipedia move-protected project pages',
['all|talk|all|sysop|move'] = 'Wikipedia move-protected talk pages',
['all|template|all|sysop|move'] = 'Wikipedia move-protected templates',
['all|user|all|sysop|move'] = 'Wikipedia move-protected user and user talk pages',
['all|all|all|autoconfirmed|autoreview'] = 'Wikipedia pending changes protected pages',
['all|file|all|all|upload'] = 'Wikipedia upload-protected files',
},
--------------------------------------------------------------------------------
-- Expiry category config
--------------------------------------------------------------------------------
-- This table configures the expiry category behaviour for each protection
-- action.
-- * If set to true, setting that action will always categorise the page if
-- an expiry parameter is not set.
-- * If set to false, setting that action will never categorise the page.
-- * If set to nil, the module will categorise the page if:
-- 1) an expiry parameter is not set, and
-- 2) a reason is provided, and
-- 3) the specified reason is not blacklisted in the reasonsWithoutExpiryCheck
-- table.
expiryCheckActions = {
edit = nil,
move = false,
autoreview = true,
upload = false
},
reasonsWithoutExpiryCheck = {
blp = true,
template = true,
},
--------------------------------------------------------------------------------
-- Pagetypes
--------------------------------------------------------------------------------
-- This table produces the page types available with the ${PAGETYPE} parameter.
-- Keys are namespace numbers, or the string "default" for the default value.
pagetypes = {
[0] = 'article',
[6] = 'file',
[10] = 'template',
[14] = 'category',
[828] = 'module',
default = 'page'
},
--------------------------------------------------------------------------------
-- Strings marking indefinite protection
--------------------------------------------------------------------------------
-- This table contains values passed to the expiry parameter that mean the page
-- is protected indefinitely.
indefStrings = {
['indef'] = true,
['indefinite'] = true,
['indefinitely'] = true,
['infinite'] = true,
},
--------------------------------------------------------------------------------
-- Group hierarchy
--------------------------------------------------------------------------------
-- This table maps each group to all groups that have a superset of the original
-- group's page editing permissions.
hierarchy = {
sysop = {},
reviewer = {'sysop'},
filemover = {'sysop'},
templateeditor = {'sysop'},
extendedconfirmed = {'sysop'},
autoconfirmed = {'reviewer', 'filemover', 'templateeditor', 'extendedconfirmed'},
user = {'autoconfirmed'},
['*'] = {'user'}
},
--------------------------------------------------------------------------------
-- Wrapper templates and their default arguments
--------------------------------------------------------------------------------
-- This table contains wrapper templates used with the module, and their
-- default arguments. Templates specified in this table should contain the
-- following invocation, and no other template content:
--
-- {{#invoke:Protection banner|main}}
--
-- If other content is desired, it can be added between
-- <noinclude>...</noinclude> tags.
--
-- When a user calls one of these wrapper templates, they will use the
-- default arguments automatically. However, users can override any of the
-- arguments.
wrappers = {
['Template:Pp'] = {},
['Template:Protection padlock'] = {},
['Template:Pp-extended'] = {'ecp'},
['Template:Pp-blp'] = {'blp'},
-- we don't need Template:Pp-create
['Template:Pp-dispute'] = {'dispute'},
['Template:Pp-main-page'] = {'mainpage'},
['Template:Pp-move'] = {action = 'move', catonly = 'yes'},
['Template:Pp-move-dispute'] = {'dispute', action = 'move', catonly = 'yes'},
-- we don't need Template:Pp-move-indef
['Template:Pp-move-vandalism'] = {'vandalism', action = 'move', catonly = 'yes'},
['Template:Pp-office'] = {'office'},
['Template:Pp-office-dmca'] = {'dmca'},
['Template:Pp-pc'] = {action = 'autoreview', small = true},
['Template:Pp-pc1'] = {action = 'autoreview', small = true},
['Template:Pp-reset'] = {'reset'},
['Template:Pp-semi-indef'] = {small = true},
['Template:Pp-sock'] = {'sock'},
['Template:Pp-template'] = {'template', small = true},
['Template:Pp-upload'] = {action = 'upload'},
['Template:Pp-usertalk'] = {'usertalk'},
['Template:Pp-vandalism'] = {'vandalism'},
},
--------------------------------------------------------------------------------
--
-- MESSAGES
--
--------------------------------------------------------------------------------
msg = {
--------------------------------------------------------------------------------
-- Intro blurb and intro fragment
--------------------------------------------------------------------------------
-- These messages specify what is produced by the ${INTROBLURB} and
-- ${INTROFRAGMENT} parameters. If the protection is temporary they use the
-- intro-blurb-expiry or intro-fragment-expiry, and if not they use
-- intro-blurb-noexpiry or intro-fragment-noexpiry.
-- It is possible to use banner parameters in these messages.
['intro-blurb-expiry'] = '${PROTECTIONBLURB} until ${EXPIRY}.',
['intro-blurb-noexpiry'] = '${PROTECTIONBLURB}.',
['intro-fragment-expiry'] = '${PROTECTIONBLURB} until ${EXPIRY},',
['intro-fragment-noexpiry'] = '${PROTECTIONBLURB}',
--------------------------------------------------------------------------------
-- Tooltip blurb
--------------------------------------------------------------------------------
-- These messages specify what is produced by the ${TOOLTIPBLURB} parameter.
-- If the protection is temporary the tooltip-blurb-expiry message is used, and
-- if not the tooltip-blurb-noexpiry message is used.
-- It is possible to use banner parameters in these messages.
['tooltip-blurb-expiry'] = 'This ${PAGETYPE} is ${PROTECTIONLEVEL} until ${EXPIRY}.',
['tooltip-blurb-noexpiry'] = 'This ${PAGETYPE} is ${PROTECTIONLEVEL}.',
['tooltip-fragment-expiry'] = 'This ${PAGETYPE} is ${PROTECTIONLEVEL} until ${EXPIRY},',
['tooltip-fragment-noexpiry'] = 'This ${PAGETYPE} is ${PROTECTIONLEVEL}',
--------------------------------------------------------------------------------
-- Special explanation blurb
--------------------------------------------------------------------------------
-- An explanation blurb for pages that cannot be unprotected, e.g. for pages
-- in the MediaWiki namespace.
-- It is possible to use banner parameters in this message.
['explanation-blurb-nounprotect'] = 'See the [[Wikipedia:Protection policy|'
.. 'protection policy]] and ${PROTECTIONLOG} for more details.'
.. ' Please discuss any changes on the ${TALKPAGE}; you'
.. ' may ${EDITREQUEST} to ask an'
.. ' [[Wikipedia:Administrators|administrator]] to make an edit if it'
.. ' is [[Help:Minor edit#When to mark an edit as a minor edit'
.. '|uncontroversial]] or supported by [[Wikipedia:Consensus'
.. '|consensus]].',
--------------------------------------------------------------------------------
-- Protection log display values
--------------------------------------------------------------------------------
-- These messages determine the display values for the protection log link
-- or the pending changes log link produced by the ${PROTECTIONLOG} parameter.
-- It is possible to use banner parameters in these messages.
['protection-log-display'] = 'protection log',
['pc-log-display'] = 'pending changes log',
--------------------------------------------------------------------------------
-- Current version display values
--------------------------------------------------------------------------------
-- These messages determine the display values for the page history link
-- or the move log link produced by the ${CURRENTVERSION} parameter.
-- It is possible to use banner parameters in these messages.
['current-version-move-display'] = 'current title',
['current-version-edit-display'] = 'current version',
--------------------------------------------------------------------------------
-- Talk page
--------------------------------------------------------------------------------
-- This message determines the display value of the talk page link produced
-- with the ${TALKPAGE} parameter.
-- It is possible to use banner parameters in this message.
['talk-page-link-display'] = 'talk page',
--------------------------------------------------------------------------------
-- Edit requests
--------------------------------------------------------------------------------
-- This message determines the display value of the edit request link produced
-- with the ${EDITREQUEST} parameter.
-- It is possible to use banner parameters in this message.
['edit-request-display'] = 'submit an edit request',
--------------------------------------------------------------------------------
-- Expiry date format
--------------------------------------------------------------------------------
-- This is the format for the blurb expiry date. It should be valid input for
-- the first parameter of the #time parser function.
['expiry-date-format'] = 'F j, Y "at" H:i e',
--------------------------------------------------------------------------------
-- Tracking categories
--------------------------------------------------------------------------------
-- These messages determine which tracking categories the module outputs.
['tracking-category-incorrect'] = 'Wikipedia pages with incorrect protection templates',
['tracking-category-template'] = 'Wikipedia template-protected pages other than templates and modules',
--------------------------------------------------------------------------------
-- Images
--------------------------------------------------------------------------------
-- These are images that are not defined by their protection action and protection level.
['image-filename-indef'] = 'Full-protection-shackle.svg',
['image-filename-default'] = 'Transparent.gif',
--------------------------------------------------------------------------------
-- End messages
--------------------------------------------------------------------------------
}
--------------------------------------------------------------------------------
-- End configuration
--------------------------------------------------------------------------------
}
g4f6dkimoikv05ulbf832zu7omkf2fc
802672
802668
2026-07-26T19:40:12Z
SM7
3953
Template → टेम्पलेट
802672
Scribunto
text/plain
-- This module provides configuration data for [[Module:Protection banner]].
return {
--------------------------------------------------------------------------------
--
-- BANNER DATA
--
--------------------------------------------------------------------------------
--[[
-- Banner data consists of six fields:
-- * text - the main protection text that appears at the top of protection
-- banners.
-- * explanation - the text that appears below the main protection text, used
-- to explain the details of the protection.
-- * tooltip - the tooltip text you see when you move the mouse over a small
-- padlock icon.
-- * link - the page that the small padlock icon links to.
-- * alt - the alt text for the small padlock icon. This is also used as tooltip
-- text for the large protection banners.
-- * image - the padlock image used in both protection banners and small padlock
-- icons.
--
-- The module checks in three separate tables to find a value for each field.
-- First it checks the banners table, which has values specific to the reason
-- for the page being protected. Then the module checks the defaultBanners
-- table, which has values specific to each protection level. Finally, the
-- module checks the masterBanner table, which holds data for protection
-- templates to use if no data has been found in the previous two tables.
--
-- The values in the banner data can take parameters. These are specified
-- using ${TEXTLIKETHIS} (a dollar sign preceding a parameter name
-- enclosed in curly braces).
--
-- Available parameters:
--
-- ${CURRENTVERSION} - a link to the page history or the move log, with the
-- display message "current-version-edit-display" or
-- "current-version-move-display".
--
-- ${EDITREQUEST} - a link to create an edit request for the current page.
--
-- ${EXPLANATIONBLURB} - an explanation blurb, e.g. "Please discuss any changes
-- on the talk page; you may submit a request to ask an administrator to make
-- an edit if it is minor or supported by consensus."
--
-- ${IMAGELINK} - a link to set the image to, depending on the protection
-- action and protection level.
--
-- ${INTROBLURB} - the PROTECTIONBLURB parameter, plus the expiry if an expiry
-- is set. E.g. "Editing of this page by new or unregistered users is currently
-- disabled until dd Month YYYY."
--
-- ${INTROFRAGMENT} - the same as ${INTROBLURB}, but without final punctuation
-- so that it can be used in run-on sentences.
--
-- ${PAGETYPE} - the type of the page, e.g. "article" or "template".
-- Defined in the cfg.pagetypes table.
--
-- ${PROTECTIONBLURB} - a blurb explaining the protection level of the page, e.g.
-- "Editing of this page by new or unregistered users is currently disabled"
--
-- ${PROTECTIONDATE} - the protection date, if it has been supplied to the
-- template.
--
-- ${PROTECTIONLEVEL} - the protection level, e.g. "fully protected" or
-- "semi-protected".
--
-- ${PROTECTIONLOG} - a link to the protection log or the pending changes log,
-- depending on the protection action.
--
-- ${TALKPAGE} - a link to the talk page. If a section is specified, links
-- straight to that talk page section.
--
-- ${TOOLTIPBLURB} - uses the PAGETYPE, PROTECTIONTYPE and EXPIRY parameters to
-- create a blurb like "This template is semi-protected", or "This article is
-- move-protected until DD Month YYYY".
--
-- ${VANDAL} - links for the specified username (or the root page name)
-- using Module:Vandal-m.
--
-- Functions
--
-- For advanced users, it is possible to use Lua functions instead of strings
-- in the banner config tables. Using functions gives flexibility that is not
-- possible just by using parameters. Functions take two arguments, the
-- protection object and the template arguments, and they must output a string.
--
-- For example:
--
-- text = function (protectionObj, args)
-- if protectionObj.level == 'autoconfirmed' then
-- return 'foo'
-- else
-- return 'bar'
-- end
-- end
--
-- Some protection object properties and methods that may be useful:
-- protectionObj.action - the protection action
-- protectionObj.level - the protection level
-- protectionObj.reason - the protection reason
-- protectionObj.expiry - the expiry. Nil if unset, the string "indef" if set
-- to indefinite, and the protection time in unix time if temporary.
-- protectionObj.protectionDate - the protection date in unix time, or nil if
-- unspecified.
-- protectionObj.bannerConfig - the banner config found by the module. Beware
-- of editing the config field used by the function, as it could create an
-- infinite loop.
-- protectionObj:isProtected - returns a boolean showing whether the page is
-- protected.
-- protectionObj:isTemporary - returns a boolean showing whether the expiry is
-- temporary.
-- protectionObj:isIncorrect - returns a boolean showing whether the protection
-- template is incorrect.
--]]
-- The master banner data, used if no values have been found in banners or
-- defaultBanners.
masterBanner = {
text = '${INTROBLURB}',
explanation = '${EXPLANATIONBLURB}',
tooltip = '${TOOLTIPBLURB}',
link = '${IMAGELINK}',
alt = 'Page ${PROTECTIONLEVEL}'
},
-- The default banner data. This holds banner data for different protection
-- levels.
-- *required* - this table needs edit, move, autoreview and upload subtables.
defaultBanners = {
edit = {},
move = {},
autoreview = {
default = {
alt = 'Page protected with pending changes',
tooltip = 'All edits by unregistered and new users are subject to review prior to becoming visible to unregistered users',
image = 'Pending-protection-shackle.svg'
}
},
upload = {}
},
-- The banner data. This holds banner data for different protection reasons.
-- In fact, the reasons specified in this table control which reasons are
-- valid inputs to the first positional parameter.
--
-- There is also a non-standard "description" field that can be used for items
-- in this table. This is a description of the protection reason for use in the
-- module documentation.
--
-- *required* - this table needs edit, move, autoreview and upload subtables.
banners = {
edit = {
blp = {
description = 'For pages protected to promote compliance with the'
.. ' [[Wikipedia:Biographies of living persons'
.. '|biographies of living persons]] policy',
text = '${INTROFRAGMENT} to promote compliance with'
.. ' [[Wikipedia:Biographies of living persons'
.. "|Wikipedia's policy on the biographies"
.. ' of living people]].',
tooltip = '${TOOLTIPFRAGMENT} to promote compliance with the policy on'
.. ' biographies of living persons',
},
deceased = {
description = 'For user pages of Wikipedia users who are deceased',
text = '${INTROFRAGMENT} to prevent vandalism of a deceased'
.. ' Wikipedian\'s user page.'
.. ' A family member who wishes to edit this user page can use this'
.. ' user\'s ${TALKPAGE} or submit a request to [[Wikipedia:VRT|the'
.. ' Volunteer Response Team]].',
tooltip = '${TOOLTIPFRAGMENT} because this Wikipedian is deceased'
},
dmca = {
description = 'For pages protected by the Wikimedia Foundation'
.. ' due to [[Digital Millennium Copyright Act]] takedown requests',
explanation = function (protectionObj, args)
local ret = 'Pursuant to a rights owner notice under the Digital'
.. ' Millennium Copyright Act (DMCA) regarding some content'
.. ' in this article, the Wikimedia Foundation acted under'
.. ' applicable law and took down and restricted the content'
.. ' in question.'
if args.notice then
ret = ret .. ' A copy of the received notice can be found here: '
.. args.notice .. '.'
end
ret = ret .. ' For more information, including websites discussing'
.. ' how to file a counter-notice, please see'
.. " [[Wikipedia:Office actions]] and the article's ${TALKPAGE}."
.. "'''Do not remove this template from the article until the"
.. " restrictions are withdrawn'''."
return ret
end,
image = 'Office-protection-shackle.svg',
link = 'Wikipedia:Protection policy#office',
},
dispute = {
description = 'For pages protected due to editing disputes',
text = function (protectionObj, args)
-- Find the value of "disputes".
local display = 'disputes'
local disputes
if args.section then
disputes = string.format(
'[[%s:%s#%s|%s]]',
mw.site.namespaces[protectionObj.title.namespace].talk.name,
protectionObj.title.text,
args.section,
display
)
else
disputes = display
end
-- Make the blurb, depending on the expiry.
local msg
if type(protectionObj.expiry) == 'number' then
msg = '${INTROFRAGMENT} or until editing %s have been resolved.'
else
msg = '${INTROFRAGMENT} until editing %s have been resolved.'
end
return string.format(msg, disputes)
end,
explanation = "This protection is '''not''' an endorsement of the"
.. ' ${CURRENTVERSION}. ${EXPLANATIONBLURB}',
tooltip = '${TOOLTIPFRAGMENT} due to editing disputes',
},
ecp = {
description = 'For articles in topic areas authorized by'
.. ' [[Wikipedia:Arbitration Committee|ArbCom]] or'
.. ' meets the criteria for community use',
alt = 'Extended-protected ${PAGETYPE}',
},
mainpage = {
description = 'For pages protected for being displayed on the [[Main Page]]',
text = 'This file is currently'
.. ' [[Wikipedia:This page is protected|protected]] from'
.. ' editing because it is currently or will soon be displayed'
.. ' on the [[Main Page]].',
explanation = 'Images on the Main Page are protected due to their high'
.. ' visibility. Please discuss any necessary changes on the ${TALKPAGE}.'
.. '<br /><span style="font-size:90%;">'
.. "'''Administrators:''' Once this image is definitely off the Main Page,"
.. ' please unprotect this file, or reduce to semi-protection,'
.. ' as appropriate.</span>',
},
office = {
description = 'For pages protected by the Wikimedia Foundation',
text = function (protectionObj, args)
local ret = 'This ${PAGETYPE} is currently under the'
.. ' scrutiny of the'
.. ' [[Wikipedia:Office actions|Wikimedia Foundation Office]]'
.. ' and is protected.'
if protectionObj.protectionDate then
ret = ret .. ' It has been protected since ${PROTECTIONDATE}.'
end
return ret
end,
explanation = "If you can edit this page, please discuss all changes and"
.. " additions on the ${TALKPAGE} first. '''Do not remove protection from this"
.. " page unless you are authorized by the Wikimedia Foundation to do"
.. " so.'''",
image = 'Office-protection-shackle.svg',
link = 'Wikipedia:Protection policy#office',
},
reset = {
description = 'For pages protected by the Wikimedia Foundation and'
.. ' "reset" to a bare-bones version',
text = 'This ${PAGETYPE} is currently under the'
.. ' scrutiny of the'
.. ' [[Wikipedia:Office actions|Wikimedia Foundation Office]]'
.. ' and is protected.',
explanation = function (protectionObj, args)
local ret = ''
if protectionObj.protectionDate then
ret = ret .. 'On ${PROTECTIONDATE} this ${PAGETYPE} was'
else
ret = ret .. 'This ${PAGETYPE} has been'
end
ret = ret .. ' reduced to a'
.. ' simplified, "bare bones" version so that it may be completely'
.. ' rewritten to ensure it meets the policies of'
.. ' [[WP:NPOV|Neutral Point of View]] and [[WP:V|Verifiability]].'
.. ' Standard Wikipedia policies will apply to its rewriting—which'
.. ' will eventually be open to all editors—and will be strictly'
.. ' enforced. The ${PAGETYPE} has been ${PROTECTIONLEVEL} while'
.. ' it is being rebuilt.\n\n'
.. 'Any insertion of material directly from'
.. ' pre-protection revisions of the ${PAGETYPE} will be removed, as'
.. ' will any material added to the ${PAGETYPE} that is not properly'
.. ' sourced. The associated talk page(s) were also cleared on the'
.. " same date.\n\n"
.. "If you can edit this page, please discuss all changes and"
.. " additions on the ${TALKPAGE} first. '''Do not override"
.. " this action, and do not remove protection from this page,"
.. " unless you are authorized by the Wikimedia Foundation"
.. " to do so. No editor may remove this notice.'''"
return ret
end,
image = 'Office-protection-shackle.svg',
link = 'Wikipedia:Protection policy#office',
},
sock = {
description = 'For pages protected due to'
.. ' [[Wikipedia:Sock puppetry|sock puppetry]]',
text = '${INTROFRAGMENT} to prevent [[Wikipedia:Sock puppetry|sock puppets]] of'
.. ' [[Wikipedia:Blocking policy|blocked]] or'
.. ' [[Wikipedia:Banning policy|banned users]]'
.. ' from editing it.',
tooltip = '${TOOLTIPFRAGMENT} to prevent sock puppets of blocked or banned users from'
.. ' editing it',
},
template = {
description = 'For [[Wikipedia:High-risk templates|high-risk]]'
.. ' templates and Lua modules',
text = 'This is a permanently [[Wikipedia:Protection policy|protected]] ${PAGETYPE},'
.. ' as it is [[Wikipedia:High-risk templates|high-risk]].',
explanation = 'Please discuss any changes on the ${TALKPAGE}; you may'
.. ' ${EDITREQUEST} to ask an'
.. ' [[Wikipedia:Administrators|administrator]] or'
.. ' [[Wikipedia:Template editor|template editor]] to make an edit if'
.. ' it is [[Help:Minor edit#When to mark an edit as a minor edit'
.. '|uncontroversial]] or supported by'
.. ' [[Wikipedia:Consensus|consensus]]. You can also'
.. ' [[Wikipedia:Requests for page protection|request]] that the page be'
.. ' unprotected.',
tooltip = 'This high-risk ${PAGETYPE} is permanently ${PROTECTIONLEVEL}'
.. ' to prevent vandalism',
alt = 'Permanently protected ${PAGETYPE}',
},
usertalk = {
description = 'For pages protected against disruptive edits by a'
.. ' particular user',
text = '${INTROFRAGMENT} to prevent ${VANDAL} from using it to make disruptive edits,'
.. ' such as abusing the'
.. ' {{[[Template:unblock|unblock]]}} template.',
explanation = 'If you cannot edit this user talk page and you need to'
.. ' make a change or leave a message, you can'
.. ' [[Wikipedia:Requests for page protection'
.. '#Current requests for edits to a protected page'
.. '|request an edit]],'
.. ' [[Wikipedia:Requests for page protection'
.. '#Current requests for reduction in protection level'
.. '|request unprotection]],'
.. ' [[Special:Userlogin|log in]],'
.. ' or [[Special:UserLogin/signup|create an account]].',
},
vandalism = {
description = 'For pages protected against'
.. ' [[Wikipedia:Vandalism|vandalism]]',
text = '${INTROFRAGMENT} due to [[Wikipedia:Vandalism|vandalism]].',
explanation = function (protectionObj, args)
local ret = ''
if protectionObj.level == 'sysop' then
ret = ret .. "This protection is '''not''' an endorsement of the"
.. ' ${CURRENTVERSION}. '
end
return ret .. '${EXPLANATIONBLURB}'
end,
tooltip = '${TOOLTIPFRAGMENT} due to vandalism',
}
},
move = {
dispute = {
description = 'For pages protected against page moves due to'
.. ' disputes over the page title',
explanation = "This protection is '''not''' an endorsement of the"
.. ' ${CURRENTVERSION}. ${EXPLANATIONBLURB}',
image = 'Move-protection-shackle.svg'
},
vandalism = {
description = 'For pages protected against'
.. ' [[Wikipedia:Vandalism#Page-move vandalism'
.. ' |page-move vandalism]]'
}
},
autoreview = {},
upload = {}
},
--------------------------------------------------------------------------------
--
-- GENERAL DATA TABLES
--
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
-- Protection blurbs
--------------------------------------------------------------------------------
-- This table produces the protection blurbs available with the
-- ${PROTECTIONBLURB} parameter. It is sorted by protection action and
-- protection level, and is checked by the module in the following order:
-- 1. page's protection action, page's protection level
-- 2. page's protection action, default protection level
-- 3. "edit" protection action, default protection level
--
-- It is possible to use banner parameters inside this table.
-- *required* - this table needs edit, move, autoreview and upload subtables.
protectionBlurbs = {
edit = {
default = 'This ${PAGETYPE} is currently [[Wikipedia:Protection policy#full|'
.. 'protected]] from editing',
templateeditor = 'This ${PAGETYPE} is currently [[Wikipedia:Protection policy#template'
.. '|protected]] from editing',
autoconfirmed = 'Editing of this ${PAGETYPE} by [[Wikipedia:User access'
.. ' levels#New users|new]] or [[Wikipedia:User access levels#Unregistered'
.. ' users|unregistered]] users is currently [[Wikipedia:Protection'
.. ' policy#semi|disabled]]',
extendedconfirmed = 'This ${PAGETYPE} is currently under [[Wikipedia:Protection'
.. ' policy#extended|extended confirmed protection]]',
},
move = {
default = 'This ${PAGETYPE} is currently [[Wikipedia:Protection policy#Move'
.. ' protection|protected]] from [[Help:Moving a page|page moves]]'
},
autoreview = {
default = 'All edits made to this ${PAGETYPE} by'
.. ' [[Wikipedia:User access levels#New users|new]] or'
.. ' [[Wikipedia:User access levels#Unregistered users|unregistered]]'
.. ' users are currently'
.. ' [[Wikipedia:Pending changes|subject to review]]'
},
upload = {
default = 'Uploading new versions of this ${PAGETYPE} is currently disabled'
}
},
--------------------------------------------------------------------------------
-- Explanation blurbs
--------------------------------------------------------------------------------
-- This table produces the explanation blurbs available with the
-- ${EXPLANATIONBLURB} parameter. It is sorted by protection action,
-- protection level, and whether the page is a talk page or not. If the page is
-- a talk page it will have a talk key of "talk"; otherwise it will have a talk
-- key of "subject". The table is checked in the following order:
-- 1. page's protection action, page's protection level, page's talk key
-- 2. page's protection action, page's protection level, default talk key
-- 3. page's protection action, default protection level, page's talk key
-- 4. page's protection action, default protection level, default talk key
--
-- It is possible to use banner parameters inside this table.
-- *required* - this table needs edit, move, autoreview and upload subtables.
explanationBlurbs = {
edit = {
autoconfirmed = {
subject = 'See the [[Wikipedia:Protection policy|'
.. 'protection policy]] and ${PROTECTIONLOG} for more details. If you'
.. ' cannot edit this ${PAGETYPE} and you wish to make a change, you can'
.. ' ${EDITREQUEST}, discuss changes on the ${TALKPAGE},'
.. ' [[Wikipedia:Requests for page protection'
.. '#Current requests for reduction in protection level'
.. '|request unprotection]], [[Special:Userlogin|log in]], or'
.. ' [[Special:UserLogin/signup|create an account]].',
default = 'See the [[Wikipedia:Protection policy|'
.. 'protection policy]] and ${PROTECTIONLOG} for more details. If you'
.. ' cannot edit this ${PAGETYPE} and you wish to make a change, you can'
.. ' [[Wikipedia:Requests for page protection'
.. '#Current requests for reduction in protection level'
.. '|request unprotection]], [[Special:Userlogin|log in]], or'
.. ' [[Special:UserLogin/signup|create an account]].',
},
extendedconfirmed = {
default = 'Extended confirmed protection prevents edits from all unregistered editors'
.. ' and registered users with fewer than 30 days tenure and 500 edits.'
.. ' The [[Wikipedia:Protection policy#extended|policy on community use]]'
.. ' specifies that extended confirmed protection can be applied to combat'
.. ' disruption, if semi-protection has proven to be ineffective.'
.. ' Extended confirmed protection may also be applied to enforce'
.. ' [[Wikipedia:Arbitration Committee|arbitration sanctions]].'
.. ' Please discuss any changes on the ${TALKPAGE}; you may'
.. ' ${EDITREQUEST} to ask for uncontroversial changes supported by'
.. ' [[Wikipedia:Consensus|consensus]].'
},
default = {
subject = 'See the [[Wikipedia:Protection policy|'
.. 'protection policy]] and ${PROTECTIONLOG} for more details.'
.. ' Please discuss any changes on the ${TALKPAGE}; you'
.. ' may ${EDITREQUEST} to ask an'
.. ' [[Wikipedia:Administrators|administrator]] to make an edit if it'
.. ' is [[Help:Minor edit#When to mark an edit as a minor edit'
.. '|uncontroversial]] or supported by [[Wikipedia:Consensus'
.. '|consensus]]. You may also [[Wikipedia:Requests for'
.. ' page protection#Current requests for reduction in protection level'
.. '|request]] that this page be unprotected.',
default = 'See the [[Wikipedia:Protection policy|'
.. 'protection policy]] and ${PROTECTIONLOG} for more details.'
.. ' You may [[Wikipedia:Requests for page'
.. ' protection#Current requests for edits to a protected page|request an'
.. ' edit]] to this page, or [[Wikipedia:Requests for'
.. ' page protection#Current requests for reduction in protection level'
.. '|ask]] for it to be unprotected.'
}
},
move = {
default = {
subject = 'See the [[Wikipedia:Protection policy|'
.. 'protection policy]] and ${PROTECTIONLOG} for more details.'
.. ' The page may still be edited but cannot be moved'
.. ' until unprotected. Please discuss any suggested moves on the'
.. ' ${TALKPAGE} or at [[Wikipedia:Requested moves]]. You can also'
.. ' [[Wikipedia:Requests for page protection|request]] that the page be'
.. ' unprotected.',
default = 'See the [[Wikipedia:Protection policy|'
.. 'protection policy]] and ${PROTECTIONLOG} for more details.'
.. ' The page may still be edited but cannot be moved'
.. ' until unprotected. Please discuss any suggested moves at'
.. ' [[Wikipedia:Requested moves]]. You can also'
.. ' [[Wikipedia:Requests for page protection|request]] that the page be'
.. ' unprotected.'
}
},
autoreview = {
default = {
default = 'See the [[Wikipedia:Protection policy|'
.. 'protection policy]] and ${PROTECTIONLOG} for more details.'
.. ' Edits to this ${PAGETYPE} by new and unregistered users'
.. ' will not be visible to readers until they are accepted by'
.. ' a reviewer. To avoid the need for your edits to be'
.. ' reviewed, you may'
.. ' [[Wikipedia:Requests for page protection'
.. '#Current requests for reduction in protection level'
.. '|request unprotection]], [[Special:Userlogin|log in]], or'
.. ' [[Special:UserLogin/signup|create an account]].'
},
},
upload = {
default = {
default = 'See the [[Wikipedia:Protection policy|'
.. 'protection policy]] and ${PROTECTIONLOG} for more details.'
.. ' The page may still be edited but new versions of the file'
.. ' cannot be uploaded until it is unprotected. You can'
.. ' request that a new version be uploaded by using a'
.. ' [[Wikipedia:Edit requests|protected edit request]], or you'
.. ' can [[Wikipedia:Requests for page protection|request]]'
.. ' that the file be unprotected.'
}
}
},
--------------------------------------------------------------------------------
-- Protection levels
--------------------------------------------------------------------------------
-- This table provides the data for the ${PROTECTIONLEVEL} parameter, which
-- produces a short label for different protection levels. It is sorted by
-- protection action and protection level, and is checked in the following
-- order:
-- 1. page's protection action, page's protection level
-- 2. page's protection action, default protection level
-- 3. "edit" protection action, default protection level
--
-- It is possible to use banner parameters inside this table.
-- *required* - this table needs edit, move, autoreview and upload subtables.
protectionLevels = {
edit = {
default = 'protected',
templateeditor = 'template-protected',
extendedconfirmed = 'extended-confirmed-protected',
autoconfirmed = 'semi-protected',
},
move = {
default = 'move-protected'
},
autoreview = {
},
upload = {
default = 'upload-protected'
}
},
--------------------------------------------------------------------------------
-- Images
--------------------------------------------------------------------------------
-- This table lists different padlock images for each protection action and
-- protection level. It is used if an image is not specified in any of the
-- banner data tables, and if the page does not satisfy the conditions for using
-- the ['image-filename-indef'] image. It is checked in the following order:
-- 1. page's protection action, page's protection level
-- 2. page's protection action, default protection level
images = {
edit = {
default = 'Full-protection-shackle.svg',
templateeditor = 'Template-protection-shackle.svg',
extendedconfirmed = 'Extended-protection-shackle.svg',
autoconfirmed = 'Semi-protection-shackle.svg'
},
move = {
default = 'Move-protection-shackle.svg',
},
autoreview = {
default = 'Pending-protection-shackle.svg'
},
upload = {
default = 'Upload-protection-shackle.svg'
}
},
-- Pages with a reason specified in this table will show the special "indef"
-- padlock, defined in the 'image-filename-indef' message, if no expiry is set.
indefImageReasons = {
template = true
},
--------------------------------------------------------------------------------
-- Image links
--------------------------------------------------------------------------------
-- This table provides the data for the ${IMAGELINK} parameter, which gets
-- the image link for small padlock icons based on the page's protection action
-- and protection level. It is checked in the following order:
-- 1. page's protection action, page's protection level
-- 2. page's protection action, default protection level
-- 3. "edit" protection action, default protection level
--
-- It is possible to use banner parameters inside this table.
-- *required* - this table needs edit, move, autoreview and upload subtables.
imageLinks = {
edit = {
default = 'Wikipedia:Protection policy#full',
templateeditor = 'Wikipedia:Protection policy#template',
extendedconfirmed = 'Wikipedia:Protection policy#extended',
autoconfirmed = 'Wikipedia:Protection policy#semi'
},
move = {
default = 'Wikipedia:Protection policy#move'
},
autoreview = {
default = 'Wikipedia:Protection policy#pending'
},
upload = {
default = 'Wikipedia:Protection policy#upload'
}
},
--------------------------------------------------------------------------------
-- Padlock indicator names
--------------------------------------------------------------------------------
-- This table provides the "name" attribute for the <indicator> extension tag
-- with which small padlock icons are generated. All indicator tags on a page
-- are displayed in alphabetical order based on this attribute, and with
-- indicator tags with duplicate names, the last tag on the page wins.
-- The attribute is chosen based on the protection action; table keys must be a
-- protection action name or the string "default".
padlockIndicatorNames = {
autoreview = 'pp-autoreview',
default = 'pp-default'
},
--------------------------------------------------------------------------------
-- Protection categories
--------------------------------------------------------------------------------
--[[
-- The protection categories are stored in the protectionCategories table.
-- Keys to this table are made up of the following strings:
--
-- 1. the expiry date
-- 2. the namespace
-- 3. the protection reason (e.g. "dispute" or "vandalism")
-- 4. the protection level (e.g. "sysop" or "autoconfirmed")
-- 5. the action (e.g. "edit" or "move")
--
-- When the module looks up a category in the table, first it will will check to
-- see a key exists that corresponds to all five parameters. For example, a
-- user page semi-protected from vandalism for two weeks would have the key
-- "temp-user-vandalism-autoconfirmed-edit". If no match is found, the module
-- changes the first part of the key to "all" and checks the table again. It
-- keeps checking increasingly generic key combinations until it finds the
-- field, or until it reaches the key "all-all-all-all-all".
--
-- The module uses a binary matrix to determine the order in which to search.
-- This is best demonstrated by a table. In this table, the "0" values
-- represent "all", and the "1" values represent the original data (e.g.
-- "indef" or "file" or "vandalism").
--
-- expiry namespace reason level action
-- order
-- 1 1 1 1 1 1
-- 2 0 1 1 1 1
-- 3 1 0 1 1 1
-- 4 0 0 1 1 1
-- 5 1 1 0 1 1
-- 6 0 1 0 1 1
-- 7 1 0 0 1 1
-- 8 0 0 0 1 1
-- 9 1 1 1 0 1
-- 10 0 1 1 0 1
-- 11 1 0 1 0 1
-- 12 0 0 1 0 1
-- 13 1 1 0 0 1
-- 14 0 1 0 0 1
-- 15 1 0 0 0 1
-- 16 0 0 0 0 1
-- 17 1 1 1 1 0
-- 18 0 1 1 1 0
-- 19 1 0 1 1 0
-- 20 0 0 1 1 0
-- 21 1 1 0 1 0
-- 22 0 1 0 1 0
-- 23 1 0 0 1 0
-- 24 0 0 0 1 0
-- 25 1 1 1 0 0
-- 26 0 1 1 0 0
-- 27 1 0 1 0 0
-- 28 0 0 1 0 0
-- 29 1 1 0 0 0
-- 30 0 1 0 0 0
-- 31 1 0 0 0 0
-- 32 0 0 0 0 0
--
-- In this scheme the action has the highest priority, as it is the last
-- to change, and the expiry has the least priority, as it changes the most.
-- The priorities of the expiry, the protection level and the action are
-- fixed, but the priorities of the reason and the namespace can be swapped
-- through the use of the cfg.bannerDataNamespaceHasPriority table.
--]]
-- If the reason specified to the template is listed in this table,
-- namespace data will take priority over reason data in the protectionCategories
-- table.
reasonsWithNamespacePriority = {
vandalism = true,
},
-- The string to use as a namespace key for the protectionCategories table for each
-- namespace number.
categoryNamespaceKeys = {
[ 2] = 'user',
[ 3] = 'user',
[ 4] = 'project',
[ 6] = 'file',
[ 8] = 'mediawiki',
[ 10] = 'template',
[ 12] = 'project',
[ 14] = 'category',
[100] = 'portal',
[828] = 'module',
},
protectionCategories = {
['all|all|all|all|all'] = 'Wikipedia fully protected pages',
['all|all|office|all|all'] = 'Wikipedia Office-protected pages',
['all|all|reset|all|all'] = 'Wikipedia Office-protected pages',
['all|all|dmca|all|all'] = 'Wikipedia Office-protected pages',
['all|all|mainpage|all|all'] = 'Wikipedia fully protected main page files',
['all|all|all|extendedconfirmed|all'] = 'Wikipedia extended-confirmed-protected pages',
['all|all|ecp|extendedconfirmed|all'] = 'Wikipedia extended-confirmed-protected pages',
['all|template|all|all|edit'] = 'Wikipedia fully protected templates',
['all|all|all|autoconfirmed|edit'] = 'Wikipedia semi-protected pages',
['indef|all|all|autoconfirmed|edit'] = 'Wikipedia indefinitely semi-protected pages',
['all|all|blp|autoconfirmed|edit'] = 'Wikipedia indefinitely semi-protected biographies of living people',
['temp|all|blp|autoconfirmed|edit'] = 'Wikipedia temporarily semi-protected biographies of living people',
['all|all|dispute|autoconfirmed|edit'] = 'Wikipedia pages semi-protected due to dispute',
['all|all|sock|autoconfirmed|edit'] = 'Wikipedia pages semi-protected from banned users',
['all|all|vandalism|autoconfirmed|edit'] = 'Wikipedia pages semi-protected against vandalism',
['all|category|all|autoconfirmed|edit'] = 'Wikipedia semi-protected categories',
['all|file|all|autoconfirmed|edit'] = 'Wikipedia semi-protected files',
['all|portal|all|autoconfirmed|edit'] = 'Wikipedia semi-protected portals',
['all|project|all|autoconfirmed|edit'] = 'Wikipedia semi-protected project pages',
['all|talk|all|autoconfirmed|edit'] = 'Wikipedia semi-protected talk pages',
['all|template|all|autoconfirmed|edit'] = 'Wikipedia semi-protected templates',
['all|user|all|autoconfirmed|edit'] = 'Wikipedia semi-protected user and user talk pages',
['all|all|all|templateeditor|move'] = 'Wikipedia template-protected pages other than templates and modules',
['all|all|all|templateeditor|edit'] = 'Wikipedia template-protected pages other than templates and modules',
['all|template|all|templateeditor|edit'] = 'Wikipedia template-protected templates',
['all|template|all|templateeditor|move'] = 'Wikipedia template-protected templates', -- move-protected templates
['all|all|blp|sysop|edit'] = 'Wikipedia indefinitely protected biographies of living people',
['temp|all|blp|sysop|edit'] = 'Wikipedia temporarily protected biographies of living people',
['all|all|dispute|sysop|edit'] = 'Wikipedia pages protected due to dispute',
['all|all|sock|sysop|edit'] = 'Wikipedia pages protected from banned users',
['all|all|vandalism|sysop|edit'] = 'Wikipedia pages protected against vandalism',
['all|category|all|sysop|edit'] = 'Wikipedia fully protected categories',
['all|file|all|sysop|edit'] = 'Wikipedia fully protected files',
['all|project|all|sysop|edit'] = 'Wikipedia fully protected project pages',
['all|talk|all|sysop|edit'] = 'Wikipedia fully protected talk pages',
['all|template|all|extendedconfirmed|edit'] = 'Wikipedia extended-confirmed-protected templates',
['all|template|all|extendedconfirmed|move'] = 'Wikipedia extended-confirmed-protected templates',
['all|template|all|sysop|edit'] = 'Wikipedia fully protected templates',
['all|user|all|sysop|edit'] = 'Wikipedia fully protected user and user talk pages',
['all|module|all|all|edit'] = 'Wikipedia fully protected modules',
['all|module|all|templateeditor|edit'] = 'Wikipedia template-protected modules',
['all|module|all|extendedconfirmed|edit'] = 'Wikipedia extended-confirmed-protected modules',
['all|module|all|autoconfirmed|edit'] = 'Wikipedia semi-protected modules',
['all|all|all|sysop|move'] = 'Wikipedia move-protected pages',
['indef|all|all|sysop|move'] = 'Wikipedia indefinitely move-protected pages',
['all|all|dispute|sysop|move'] = 'Wikipedia pages move-protected due to dispute',
['all|all|vandalism|sysop|move'] = 'Wikipedia pages move-protected due to vandalism',
['all|portal|all|sysop|move'] = 'Wikipedia move-protected portals',
['all|project|all|sysop|move'] = 'Wikipedia move-protected project pages',
['all|talk|all|sysop|move'] = 'Wikipedia move-protected talk pages',
['all|template|all|sysop|move'] = 'Wikipedia move-protected templates',
['all|user|all|sysop|move'] = 'Wikipedia move-protected user and user talk pages',
['all|all|all|autoconfirmed|autoreview'] = 'Wikipedia pending changes protected pages',
['all|file|all|all|upload'] = 'Wikipedia upload-protected files',
},
--------------------------------------------------------------------------------
-- Expiry category config
--------------------------------------------------------------------------------
-- This table configures the expiry category behaviour for each protection
-- action.
-- * If set to true, setting that action will always categorise the page if
-- an expiry parameter is not set.
-- * If set to false, setting that action will never categorise the page.
-- * If set to nil, the module will categorise the page if:
-- 1) an expiry parameter is not set, and
-- 2) a reason is provided, and
-- 3) the specified reason is not blacklisted in the reasonsWithoutExpiryCheck
-- table.
expiryCheckActions = {
edit = nil,
move = false,
autoreview = true,
upload = false
},
reasonsWithoutExpiryCheck = {
blp = true,
template = true,
},
--------------------------------------------------------------------------------
-- Pagetypes
--------------------------------------------------------------------------------
-- This table produces the page types available with the ${PAGETYPE} parameter.
-- Keys are namespace numbers, or the string "default" for the default value.
pagetypes = {
[0] = 'article',
[6] = 'file',
[10] = 'template',
[14] = 'category',
[828] = 'module',
default = 'page'
},
--------------------------------------------------------------------------------
-- Strings marking indefinite protection
--------------------------------------------------------------------------------
-- This table contains values passed to the expiry parameter that mean the page
-- is protected indefinitely.
indefStrings = {
['indef'] = true,
['indefinite'] = true,
['indefinitely'] = true,
['infinite'] = true,
},
--------------------------------------------------------------------------------
-- Group hierarchy
--------------------------------------------------------------------------------
-- This table maps each group to all groups that have a superset of the original
-- group's page editing permissions.
hierarchy = {
sysop = {},
reviewer = {'sysop'},
filemover = {'sysop'},
templateeditor = {'sysop'},
extendedconfirmed = {'sysop'},
autoconfirmed = {'reviewer', 'filemover', 'templateeditor', 'extendedconfirmed'},
user = {'autoconfirmed'},
['*'] = {'user'}
},
--------------------------------------------------------------------------------
-- Wrapper templates and their default arguments
--------------------------------------------------------------------------------
-- This table contains wrapper templates used with the module, and their
-- default arguments. Templates specified in this table should contain the
-- following invocation, and no other template content:
--
-- {{#invoke:Protection banner|main}}
--
-- If other content is desired, it can be added between
-- <noinclude>...</noinclude> tags.
--
-- When a user calls one of these wrapper templates, they will use the
-- default arguments automatically. However, users can override any of the
-- arguments.
wrappers = {
['टेम्पलेट:Pp'] = {},
['टेम्पलेट:Protection padlock'] = {},
['टेम्पलेट:Pp-extended'] = {'ecp'},
['टेम्पलेट:Pp-blp'] = {'blp'},
-- we don't need Template:Pp-create
['टेम्पलेट:Pp-dispute'] = {'dispute'},
['टेम्पलेट:Pp-main-page'] = {'mainpage'},
['टेम्पलेट:Pp-move'] = {action = 'move', catonly = 'yes'},
['टेम्पलेट:Pp-move-dispute'] = {'dispute', action = 'move', catonly = 'yes'},
-- we don't need Template:Pp-move-indef
['टेम्पलेट:Pp-move-vandalism'] = {'vandalism', action = 'move', catonly = 'yes'},
['टेम्पलेट:Pp-office'] = {'office'},
['टेम्पलेट:Pp-office-dmca'] = {'dmca'},
['टेम्पलेट:Pp-pc'] = {action = 'autoreview', small = true},
['टेम्पलेट:Pp-pc1'] = {action = 'autoreview', small = true},
['टेम्पलेट:Pp-reset'] = {'reset'},
['टेम्पलेट:Pp-semi-indef'] = {small = true},
['टेम्पलेट:Pp-sock'] = {'sock'},
['टेम्पलेट:Pp-template'] = {'template', small = true},
['टेम्पलेट:Pp-upload'] = {action = 'upload'},
['टेम्पलेट:Pp-usertalk'] = {'usertalk'},
['टेम्पलेट:Pp-vandalism'] = {'vandalism'},
},
--------------------------------------------------------------------------------
--
-- MESSAGES
--
--------------------------------------------------------------------------------
msg = {
--------------------------------------------------------------------------------
-- Intro blurb and intro fragment
--------------------------------------------------------------------------------
-- These messages specify what is produced by the ${INTROBLURB} and
-- ${INTROFRAGMENT} parameters. If the protection is temporary they use the
-- intro-blurb-expiry or intro-fragment-expiry, and if not they use
-- intro-blurb-noexpiry or intro-fragment-noexpiry.
-- It is possible to use banner parameters in these messages.
['intro-blurb-expiry'] = '${PROTECTIONBLURB} until ${EXPIRY}.',
['intro-blurb-noexpiry'] = '${PROTECTIONBLURB}.',
['intro-fragment-expiry'] = '${PROTECTIONBLURB} until ${EXPIRY},',
['intro-fragment-noexpiry'] = '${PROTECTIONBLURB}',
--------------------------------------------------------------------------------
-- Tooltip blurb
--------------------------------------------------------------------------------
-- These messages specify what is produced by the ${TOOLTIPBLURB} parameter.
-- If the protection is temporary the tooltip-blurb-expiry message is used, and
-- if not the tooltip-blurb-noexpiry message is used.
-- It is possible to use banner parameters in these messages.
['tooltip-blurb-expiry'] = 'This ${PAGETYPE} is ${PROTECTIONLEVEL} until ${EXPIRY}.',
['tooltip-blurb-noexpiry'] = 'This ${PAGETYPE} is ${PROTECTIONLEVEL}.',
['tooltip-fragment-expiry'] = 'This ${PAGETYPE} is ${PROTECTIONLEVEL} until ${EXPIRY},',
['tooltip-fragment-noexpiry'] = 'This ${PAGETYPE} is ${PROTECTIONLEVEL}',
--------------------------------------------------------------------------------
-- Special explanation blurb
--------------------------------------------------------------------------------
-- An explanation blurb for pages that cannot be unprotected, e.g. for pages
-- in the MediaWiki namespace.
-- It is possible to use banner parameters in this message.
['explanation-blurb-nounprotect'] = 'See the [[Wikipedia:Protection policy|'
.. 'protection policy]] and ${PROTECTIONLOG} for more details.'
.. ' Please discuss any changes on the ${TALKPAGE}; you'
.. ' may ${EDITREQUEST} to ask an'
.. ' [[Wikipedia:Administrators|administrator]] to make an edit if it'
.. ' is [[Help:Minor edit#When to mark an edit as a minor edit'
.. '|uncontroversial]] or supported by [[Wikipedia:Consensus'
.. '|consensus]].',
--------------------------------------------------------------------------------
-- Protection log display values
--------------------------------------------------------------------------------
-- These messages determine the display values for the protection log link
-- or the pending changes log link produced by the ${PROTECTIONLOG} parameter.
-- It is possible to use banner parameters in these messages.
['protection-log-display'] = 'protection log',
['pc-log-display'] = 'pending changes log',
--------------------------------------------------------------------------------
-- Current version display values
--------------------------------------------------------------------------------
-- These messages determine the display values for the page history link
-- or the move log link produced by the ${CURRENTVERSION} parameter.
-- It is possible to use banner parameters in these messages.
['current-version-move-display'] = 'current title',
['current-version-edit-display'] = 'current version',
--------------------------------------------------------------------------------
-- Talk page
--------------------------------------------------------------------------------
-- This message determines the display value of the talk page link produced
-- with the ${TALKPAGE} parameter.
-- It is possible to use banner parameters in this message.
['talk-page-link-display'] = 'talk page',
--------------------------------------------------------------------------------
-- Edit requests
--------------------------------------------------------------------------------
-- This message determines the display value of the edit request link produced
-- with the ${EDITREQUEST} parameter.
-- It is possible to use banner parameters in this message.
['edit-request-display'] = 'submit an edit request',
--------------------------------------------------------------------------------
-- Expiry date format
--------------------------------------------------------------------------------
-- This is the format for the blurb expiry date. It should be valid input for
-- the first parameter of the #time parser function.
['expiry-date-format'] = 'F j, Y "at" H:i e',
--------------------------------------------------------------------------------
-- Tracking categories
--------------------------------------------------------------------------------
-- These messages determine which tracking categories the module outputs.
['tracking-category-incorrect'] = 'Wikipedia pages with incorrect protection templates',
['tracking-category-template'] = 'Wikipedia template-protected pages other than templates and modules',
--------------------------------------------------------------------------------
-- Images
--------------------------------------------------------------------------------
-- These are images that are not defined by their protection action and protection level.
['image-filename-indef'] = 'Full-protection-shackle.svg',
['image-filename-default'] = 'Transparent.gif',
--------------------------------------------------------------------------------
-- End messages
--------------------------------------------------------------------------------
}
--------------------------------------------------------------------------------
-- End configuration
--------------------------------------------------------------------------------
}
90yuy17belboq2i1ezs1ny7pyoji4wn
हुंडरू झरना
0
62010
802640
763263
2026-07-26T12:13:15Z
InternetArchiveBot
25596
Rescuing 1 sources and tagging 0 as dead.) #IABot (v2.0.9.5
802640
wikitext
text/x-wiki
{{Infobox waterfall
| name = हुंडरू झरना
| photo = Hundru.jpg
| photo_caption =
| location = [[राँची जिला]], [[झारखंड]], [[भारत]]
| coords = {{coord|23.4500|N|85.6500|E|format=dms}}<ref>{{cite web
|url = http://www.fallingrain.com/world/IN/38/Hundru.html
|title = Hundru, India Page
|publisher = Falling Rain Genomics
|accessdate = 2010-04-20
|archive-date = 2015-11-24
|archive-url = https://web.archive.org/web/20151124013307/http://www.fallingrain.com/world/IN/38/Hundru.html
|url-status = dead
}}</ref>
| elevation = {{convert|456|m}}<ref>{{cite web |url = http://www.travelsradiate.com/asia/republic-of-india/state-of-jharkhand/1269877-hundru.html |title = Hundru, State Of Jharkhand, India |publisher = travelsradiate.com |accessdate = 2012-02-12 |archive-date = 2013-01-05 |archive-url = https://archive.is/20130105000418/http://www.travelsradiate.com/asia/republic-of-india/state-of-jharkhand/1269877-hundru.html |url-status = dead }}</ref>
| type = Segmented
| height = {{convert|98|m}}
| height_longest =
| average_width =
| number_drops =
| average_flow =
| watercourse = [[सुबर्णरेखा नदी]]
}}
'''हुंडरू''' भारतीय राज्य झारखंड में एगो परसिद्ध [[झरना]] बाटे। ई झरना झारखंड के राजधानी [[राँची]] शहर से कुछे दूर पर होखे आ आसानी से चहुँपे लायक होखे के कारण पर्यटक लोग में पापुलर बा। आमतौर पर इहाँ जाड़ा के सीजन में बहुत सारा पर्यटक लोग छुट्टी मनावे आ प्रकृति के एह सुघर सीन के आनंद लेवे आवे ला।
{{Clear}}
==संदर्भ==
{{Reflist}}
{{Hydrography of Jharkhand}}
[[श्रेणी:झारखंड के भूगोल]]
[[श्रेणी:भारत के झरना]]
{{भू-आधार}}
5p00pspg6frpfrpe17u4q9rsrpf4wb7
भारतीय राज्यन के वर्तमान मुख्यमंत्री लोगन के लिस्ट
0
63498
802658
783968
2026-07-26T19:22:36Z
SM7
3953
Added {{[[Template:Update|Update]]}} tag
802658
wikitext
text/x-wiki
{{Update|date=जुलाई 2026}}
[[File:State- and union territory-level parties.svg|alt=|thumb|350x350px|भारत में वर्तमान रूलिंग पार्टी सभ
{{legend|#ff9933|[[भारतीय जनता पार्टी|भाजपा]] (12)}}
{{legend|#ffc969|[[नेशनल डेमोक्रेटिक एलायंस|भाजपा के साथे सझिया]] (6)}}
{{legend|#00bfff|[[भारतीय राष्ट्रीय कांग्रेस|कांग्रेस]] (3)}}{{Legend|#00ebff|[[यूनाइटेड प्रोग्रेसिव एलायंस|कांग्रेस के साथे सझिया]] (3)}}
{{legend|#ff0001|अन्य दूसर दल ([[आम आदमी पार्टी|आआप]], [[आल इंडिया तृणमूल कांग्रेस|तृणमूल कांग्रेस]], [[बीजु जनता दल|बीजेडी]], [[सीपीआई (एम)]], [[तेलंगाना राष्ट्र समीति|टीआरएस]], [[वाईएसआर कांग्रेस पार्टी]])}}
{{legend|#000000|[[राष्ट्रपति शासन]] (1)}}
{{legend|#808080|[[संघ राज्यक्षेत्र|बिधानमंडल नइखे]] (5)}}]]
[[भारत|भारत गणराज्य]] में '''मुख्यमंत्री''' सगरी '''[[भारत के राज्य अउरी संघ राज्यक्षेत्र|28 राज्यन]]''' आ '''[[दिल्ली]]''' आ '''[[पांडिचेरी]]''' संघ शासित क्षेत्र में सरकार के बेहवारिक मुखिया (डि फैक्टो) होलें आ राज्य के बिधानसभा के सोझा जबाबदेह होलें, जबकि नाँव के रूप (''डी ज्यूर'') में इनहन के मुखिया [[वर्तमान भारतीय गवर्नर लोग के लिस्ट|राज्यपाल भा उपराज्यपाल]] लोग होला।
नीचे वर्तमान समय में सगरी राज्य सभ के मुख्यमंत्री लोगन के लिस्ट दिहल गइल बा:
{{clear}}
== वर्तमान मुख्यमंत्री लोग ==
{| class="toccolours" style="width:75em"
! राजनीतिक पार्टी खातिर कलर कुंजी
|-
| {{colbegin|colwidth=23em}}
{{legend|{{party color|Aam Aadmi Party}}|[[आम आदमी पार्टी]]|outline=#000000}}
{{legend|{{party color|All India N.R. Congress}}|[[आल इंडिया एन.आर. कांग्रेस]]|outline=#000000}}
{{legend|{{party color|All India Trinamool Congress}}|[[आल इंडिया तृणमूल कांग्रेस]]|outline=#000000}}
{{legend|{{party color|Bharatiya Janata Party}}|[[भारतीय जनता पार्टी]]|outline=#000000}}
{{legend|{{party color|Biju Janata Dal}}|[[बीजु जनता दल]]|outline=#000000}}
{{legend|{{party color|Communist Party of India (Marxist)}}|[[भारतीय कम्युनिस्ट पार्टी (मार्क्सवादी)]]|outline=#000000}}
{{legend|{{party color|Bharatiya Janata Party}}|[[द्रविड़ मुनेत्र कज़गम]]|outline=#000000}}
{{legend|{{party color|Indian National Congress}}|[[भारतीय राष्ट्रीय कांग्रेस]]|outline=#000000}}
{{legend|{{party color|Janata Dal (United)}}|[[जनता दल (यूनाइटेड)]]|outline=#000000}}
{{legend|{{party color|Jharkhand Mukti Morcha}}|[[झारखंड मुक्ति मोर्चा]]|outline=#000000}}
{{legend|{{party color|Mizo National Front}}|[[मिजो नेशनल फ्रंट]]|outline=#000000}}
{{legend|{{party color|National Democratic Progressive Party}}|[[नेशनलिस्ट डेमोक्रेटिक प्रोग्रेसिव पार्टी]]|outline=#000000}}
{{legend|{{party color|National People's Party (India)}}|[[नेशनल पीपल्स पार्टी (भारत)|नेशनल पीपल्स पार्टी]]|outline=#000000}}
{{legend|{{party color|Shiv Sena}}|[[शिव सेना]]|outline=#000000}}
{{legend|{{party color|Sikkim Krantikari Morcha}}|[[सिक्किम क्रांतिकारी मोर्चा]]|outline=#000000}}
{{legend|{{party color|Telangana Rashtra Samithi}}|[[तेलंगाना राष्ट्र समीति]]|outline=#000000}}
{{legend|{{party color|YSR Congress Party}}|[[वाईएसआर कांग्रेस पार्टी]]|outline=#000000}}
{{legend|White|N/A ([[राष्ट्रपति शासन]])|outline=#000000}}
{{colend}}
|}
{| class="wikitable sortable" style="text-align:center; width:100%"
|-
!scope=col| राज्य<br />{{small|(पहिले के मुख्यमंत्री)}}
!scope=col| नाँव<ref>[https://www.india.gov.in/my-government/whos-who/chief-ministers Chief Ministers] {{Webarchive|url=https://web.archive.org/web/20190809151722/https://www.india.gov.in/my-government/whos-who/chief-ministers |date=9 August 2019 }}. [[India.gov.in]]. Retrieved on 9 July 2019.</ref>
!scope=col class=unsortable| फोटो
!scope=col| पदभार लिहल<br />{{small|(कार्यकाल समय)}}
!scope=col colspan=2| पार्टी{{efn|This column names only the chief minister's party. The ministry (s)he heads may be a complex coalition of several parties and independents; those are not listed here.}}
! colspan="2" |एलायंस
!scope=col| मंत्रालय
!scope=col class=unsortable| संदर्भ
|-
| [[आंध्र प्रदेश]]
! [[वाई. एस. जगन मोहन रेड्डी]]
| [[File:The Chief Minister of Andhra Pradesh, Shri Y.S. Jagan Mohan Reddy.jpg|100px]]
| {{dts|format=dmy|2019|5|30}}<br /><small>({{ayd|2019|5|30}})</small>
| [[वाईएसआर कांग्रेस पार्टी]]
| width="4px" bgcolor="{{party color|YSR Congress Party}}" |
| colspan="2" | ''None''
|
|<ref>"[https://economictimes.indiatimes.com/news/politics-and-nation/jagan-mohan-reddy-takes-oath-as-andhra-pradesh-cm/articleshow/69576201.cms Jagan Mohan Reddy takes oath as Andhra Pradesh CM] {{Webarchive|url=https://web.archive.org/web/20190604104738/https://economictimes.indiatimes.com/news/politics-and-nation/jagan-mohan-reddy-takes-oath-as-andhra-pradesh-cm/articleshow/69576201.cms |date=4 June 2019 }}". ''The Economic Times''. Press Trust of India. 30 May 2019.</ref>
|-
| [[अरुणाचल प्रदेश]]
! [[पेमा खांडू]]
| [[File:Pema Khandu in July 2016.jpg|100px]]
| {{dts|format=dmy|2016|7|17}}<br /><small>({{ayd|2016|7|17}})</small>
| rowspan="2" | [[भारतीय जनता पार्टी]]
| rowspan="2" width="4px" bgcolor="{{party color|Bharatiya Janata Party}}" |
| rowspan="2 " | [[National Democratic Alliance|एनडीए]]
| rowspan="2 " bgcolor="{{party color|Bharatiya Janata Party}}" |
|
|<ref>"[http://www.thehindu.com/news/national/Pema-Khandu-sworn-in-as-Chief-Minister-of-Arunachal-Pradesh/article14494230.ece Pema Khandu sworn in as Chief Minister of Arunachal Pradesh] {{Webarchive|url=https://web.archive.org/web/20190713182538/https://www.thehindu.com/news/national/Pema-Khandu-sworn-in-as-Chief-Minister-of-Arunachal-Pradesh/article14494230.ece |date=13 July 2019 }}". ''The Hindu''. 17 July 2016.</ref><ref>"[http://www.thehindu.com/news/national/other-states/BJP-forms-govt-in-Arunachal-Pradesh/article16969345.ece BJP forms govt in Arunachal Pradesh] {{Webarchive|url=https://web.archive.org/web/20180303125941/http://www.thehindu.com/news/national/other-states/BJP-forms-govt-in-Arunachal-Pradesh/article16969345.ece |date=3 March 2018 }}". ''The Hindu''. 31 December 2016.</ref>
|-
|[[आसाम]]
! [[हिमंता बिस्व सर्मा]]
| [[File:Himanta Biswa Sarma with PM Narendra Modi Cropped.jpg|border|center|166x166px]]
| {{dts|format=dmy|2021|5|10}}<br /><small>({{ayd|2021|5|10}})</small>
|
|<ref>{{Cite web|date=9 May 2021|title=Himanta Biswa Sarma to be new Assam CM; credited as man behind BJP's surge in North East-Politics News , Firstpost|url=https://www.firstpost.com/politics/himanta-biswa-sarma-to-be-new-assam-cm-credited-as-man-behind-bjps-surge-in-north-east-9358121.html|access-date=10 May 2021|website=Firstpost}}</ref><ref>{{Cite web|date=10 May 2021|title=Himanta Biswa Sarma Swearing-in LIVE Updates: JP Nadda to Attend Oath-Taking Ceremony|url=https://www.news18.com/news/politics/himanta-biswa-sarma-swearing-in-live-updates-sarbananda-sonowal-bjp-assam-pm-narendra-modi-jp-nadda-3722531.html|access-date=10 May 2021|website=www.news18.com|language=en}}</ref>
|-
| [[बिहार]]<br />{{small|([[बिहार के मुख्यमंत्री लोगन के लिस्ट|लिस्ट]])}}
! [[नीतीश कुमार]]
| [[File:The Chief Minister of Bihar, Shri Nitish Kumar meeting with the Deputy Chairman, Planning Commission, Shri Montek Singh Ahluwalia to finalize Annual Plan 2007-08 of the State, in New Delhi on February 14, 2007 (Nitish Kumar) (cropped).jpg|100px]]
| {{dts|format=dmy|2015|2|22}}<br /><small>({{ayd|2015|2|22}})</small>
| [[जनता दल (यूनाइटेड)]]
| width="4px" bgcolor="{{party color|Janata Dal (United)}}" |
| rowspan="2" | [[यूनाइटेड प्रोग्रेसिव एलायंस|यूपीए]]
| rowspan="2 " bgcolor="{{party color|Indian National Congress}}" |
|
|<ref>{{cite news |title=Why Nitish Kumar forged alliance with Tejashwi Yadav: Prashant Kishor reveals |url=https://www.livemint.com/news/india/why-nitish-kumar-forged-alliance-with-tejashwi-yadav-prashant-kishor-reveals-11674824958580.html |work=mint |date=27 जनवरी 2023 |language=en}}</ref>
|-
| [[छत्तीसगढ़]]
! [[भूपेश बघेल]]
| [[File:Bhupesh Baghel.jpg|100px]]
| {{dts|format=dmy|2018|12|17}}<br /><small>({{ayd|2018|12|17}})</small>
| [[भारतीय राष्ट्रीय कांग्रेस]]
| width="4px" bgcolor="{{party color|Indian National Congress}}" |
|
|<ref>"[https://www.thehindu.com/elections/chhattisgarh-assembly-elections-2018/bhupesh-baghel-sworn-in-as-chief-minister-of-chhattisgarh/article25764821.ece Bhupesh Baghel sworn in as Chief Minister of Chhattisgarh] {{Webarchive|url=https://web.archive.org/web/20181218061436/https://www.thehindu.com/elections/chhattisgarh-assembly-elections-2018/bhupesh-baghel-sworn-in-as-chief-minister-of-chhattisgarh/article25764821.ece |date=18 December 2018 }}". ''The Hindu''. 17 December 2018.</ref>
|-
| [[दिल्ली]]{{efn|name=UT|Although Delhi, Jammu and Kashmir and Puducherry each have an elected legislature and a council of ministers (headed by the chief minister), they are officially [[संघ राज्यक्षेत्र|union territories]].}}<br />{{small|([[दिल्ली के मुख्यमंत्री लोगन के लिस्ट|लिस्ट]])}}
! [[अरविंद केजरीवाल]]
| [[File:Arvind Kejriwal September 02, 2017 crop.jpg|100px]]
| {{dts|format=dmy|2015|2|14}}<br /><small>({{ayd|2015|2|14}})</small>
| [[आम आदमी पार्टी]]
| width="4px" bgcolor="{{party color|Aam Aadmi Party}}" |
| None
| |
|
|<ref>Smriti Kak Ramachandran, Shubhomoy Sikdar. "[http://www.thehindu.com/news/cities/Delhi/kejriwal-takes-oath-as-delhi-cm-promises-to-act-against-graft/article6895671.ece Kejriwal promises to make Delhi graft-free in 5 years] {{Webarchive|url=https://web.archive.org/web/20180303125941/http://www.thehindu.com/news/cities/Delhi/kejriwal-takes-oath-as-delhi-cm-promises-to-act-against-graft/article6895671.ece |date=3 March 2018 }}". ''The Hindu''. 14 February 2015.</ref>
|-
| [[गोवा]]
! [[प्रमोद सावंत]]
| [[File:The Chief Minister of Goa, Shri Pramod Sawant.jpg|100px]]
| {{dts|format=dmy|2019|3|19}}<br /><small>({{ayd|2019|3|19}})</small>
| rowspan="3 " | [[भारतीय जनता पार्टी]]
| rowspan="3 " width="4px" bgcolor="{{party color|Bharatiya Janata Party}}" |
| rowspan="3 " | [[नेशनल डेमोक्रेटिक एलायंस|एनडीए]]
| rowspan="3 " bgcolor="{{party color|Bharatiya Janata Party}}" |
|
| <ref>Murari Shetye. "[https://timesofindia.indiatimes.com/india/goa-speaker-pramod-sawant-succeeds-parrikar-as-cm/articleshow/68473049.cms Goa speaker Pramod Sawant succeeds Parrikar as CM] {{Webarchive|url=https://web.archive.org/web/20190319124214/https://timesofindia.indiatimes.com/india/goa-speaker-pramod-sawant-succeeds-parrikar-as-cm/articleshow/68473049.cms |date=19 March 2019 }}" ''The Times of India''. 19 March 2019.</ref>
|-
| [[गुजरात]]
! [[भूपेंद्रभाई पटेल]]
| [[File:Bhupendra PAtel Sanskrit.jpg|100px]]
| {{dts|format=dmy|2021|09|13}}<br /><small>({{ayd|2021|09|13}})</small>
|
|
|-
| [[हरियाणा]]
! [[मनोहार लाल खट्टर]]
| [[File:Manohar Lal Khattar 2015.jpg|100px]]
| {{dts|format=dmy|2014|10|26}}<br /><small>({{ayd|2014|10|26}})</small>
|
|<ref>Sarabjit Pandher. "[http://www.thehindu.com/news/national/khattar-swornin-as-haryana-chief-minister/article6535007.ece Khattar sworn in] {{Webarchive|url=https://web.archive.org/web/20180303125941/http://www.thehindu.com/news/national/khattar-swornin-as-haryana-chief-minister/article6535007.ece |date=3 March 2018 }}". ''The Hindu''. 26 October 2014.</ref>
|-
| [[हिमाचल प्रदेश]]
! [[सुखविंदर सिंह सुक्खू]]
| [[File:Sukhvinder Singh Sukhu.jpg|100px]]
| {{dts|format=dmy|2017|12|27}}<br /><small>({{ayd|2022|12|11 }})</small>
| [[भारतीय राष्ट्रीय कांग्रेस]]
| width="4px" bgcolor="{{party color|Indian National Congress}}" |
| rowspan="2" | [[यूनाइटेड प्रोग्रेसिव एलायंस|यूपीए]]
| rowspan="2 " bgcolor="{{party color|Indian National Congress}}" |
|
|<ref>{{cite news |last1=पत्रकार ) |first1=प्रत्युष मिश्रा (वरिष्ठ |title=सुक्खू की सरकार ने हिमाचल की जनता को दिया बड़ा झटका, 22 पैसे प्रति यूनिट बढ़े दाम, अप्रैल में आयेगा आपका इतना बिल » Pangi Ghati Dainik Patrika |url=https://pangighatidanikapatrika.in/himachal-pradesh/himachal-cm-sukhvinder-sukhu-government-planning-to-increase-electricity-rate/ |work=Pangi Ghati Dainik Patrika |date=31 मार्च 2023 |access-date=2023-04-02 |archive-date=2023-04-02 |archive-url=https://web.archive.org/web/20230402055520/https://pangighatidanikapatrika.in/himachal-pradesh/himachal-cm-sukhvinder-sukhu-government-planning-to-increase-electricity-rate/ |url-status=dead }}</ref>
|-
| [[झारखंड]]
! [[हेमंत सोरेन]]
| [[File:Chief Minister of Jharkhand Shri Hemant Soren.jpg|100px]]
| {{dts|format=dmy|2019|12|29}}<br /><small>({{ayd|2019|12|29}})</small>
| [[झारखंड मुक्ति मोर्चा]]
| width="4px" bgcolor="{{party color|Jharkhand Mukti Morcha}}" |
|
| <ref>{{cite news|title=Hemant Soren takes oath as 11th Chief Minister of Jharkhand|url=https://www.thehindu.com/news/national/other-states/hemant-soren-takes-oath-as-11th-chief-minister-of-jharkhand/article30424879.ece|newspaper=The Hindu|access-date=29 December 2019|date=29 December 2019|last1=Barik|first1=Satyasundar}}</ref>
|-
| [[कर्नाटक]]
! [[बासवराज बोम्मई]]
| [[File:Bommai, in New Delhi on August 17, 2012 (cropped) (cropped).jpg|100px]]
| {{dts|format=dmy|2021|7|28}}<br /><small>({{ayd|2021|7|28}})</small>
| [[भारतीय जनता पार्टी]]
| width="4px" bgcolor="{{party color|Bharatiya Janata Party}}" |
| [[नेशनल डेमोक्रेटिक एलायंस|एनडीए]]
| bgcolor="{{party color|Bharatiya Janata Party}}" |
|
| <ref>{{Cite news|date=28 July 2021|title=Basavaraj Bommai sworn in as Chief Minister of Karnataka|language=en-IN|work=The Hindu|url=https://www.thehindu.com/news/national/karnataka/basavaraj-bommai-sworn-in-as-new-chief-minister-of-karnataka/article35576498.ece|access-date=30 August 2021|issn=0971-751X}}</ref>
|-
| [[केरल]]
! [[पिनरई विजयन]]
| [[File:Pinarayi Vijayan 1.jpg|100px]]
| {{dts|format=dmy|2016|5|25}}<br /><small>({{ayd|2016|5|25}})</small>
| [[भारतीय कम्युनिस्ट पार्टी (मार्क्सवादी)]]
| width="4px" bgcolor="{{party color|Communist Party of India (Marxist)}}" |
| None
| |
|
| <ref>C. Gouridasan Nair. "[http://www.thehindu.com/news/national/kerala/ldf-cabinet-sworn-in-pinarayi-vijayan-takes-over-as-cm/article8645724.ece Pinarayi takes charge as Kerala Chief Minister] {{Webarchive|url=https://web.archive.org/web/20160525115437/http://www.thehindu.com/news/national/kerala/ldf-cabinet-sworn-in-pinarayi-vijayan-takes-over-as-cm/article8645724.ece |date=25 May 2016 }}". ''The Hindu''. 25 May 2016.</ref>
|-
| [[मध्य प्रदेश]]
! [[शिवराज सिंह चौहान]]
|[[File:Shivraj Singh Chouhan (Cropped 3).jpg|alt=|123x123px]]
| {{dts|format=dmy|2020|03|23}}<br /><small>({{ayd|2020|3|23}})</small>
|[[भारतीय जनता पार्टी]]
| width="4px" bgcolor="{{party color|Bharatiya Janata Party}}" |
|[[नेशनल डेमोक्रेटिक एलायंस|एनडीए]]
|bgcolor="{{party color|Bharatiya Janata Party}}" |
|
|<ref>{{cite news |last1=Noronha |first1=Rahul |title=BJP's Shivraj Singh Chouhan sworn in as Madhya Pradesh CM for fourth time |url=https://www.indiatoday.in/india/story/bjp-s-shivraj-singh-chouhan-sworn-in-as-madhya-pradesh-cm-for-fourth-time-1658867-2020-03-23 |access-date=23 March 2020 |work=India Today |date=23 March 2020 |language=en}}</ref>
|-
| [[महाराष्ट्र]]
! [[एकनाथ शिंदे]]
| [[File:Eknath Shinde with PM Narendra Modi Cropped.jpg|100px]]
| {{dts|format=dmy|2019|11|28}}<br /><small>({{ayd|2022|06|30}})</small>
| [[शिव सेना]]
| width="4px" bgcolor="{{party color|Shiv Sena}}" |
|[[नेशनल डेमोक्रेटिक एलायंस|एनडीए]]
|bgcolor="{{party color|Bharatiya Janata Party}}" |
|
| <ref>{{cite news |title=Maharashtra Governor Ramesh Bais asks CM Eknath Shinde to take strict action on communal flare-ups |url=https://www.deccanherald.com/national/west/maharashtra-governor-ramesh-bais-asks-cm-eknath-shinde-to-take-strict-action-on-communal-flare-ups-1205629.html |work=Deccan Herald |date=1 अप्रैल 2023 |language=en}}</ref>
|-
| [[मणिपुर]]
! [[एन. बीरेन सिंह]]
| [[File:The Chief Minister of Manipur, Shri Biren Singh calling on the Vice President, Shri M. Venkaiah Naidu, in New Delhi on September 06, 2017 (cropped).jpg|100px]]
| {{dts|format=dmy|2017|3|15}}<br /><small>({{ayd|2017|3|15}})</small>
| [[भारतीय जनता पार्टी]]
| width="4px" bgcolor="{{party color|Bharatiya Janata Party}}" |
| rowspan="4" |[[नेशनल डेमोक्रेटिक एलायंस|एनडीए]]
| rowspan="4" bgcolor="{{party color|Bharatiya Janata Party}}" |
|
|<ref>Isha Gupta. "[http://indiatoday.intoday.in/story/biren-singh-manipur-chief-minister/1/904413.html BJP leader Biren Singh sworn in as Manipur Chief Minister] {{Webarchive|url=https://web.archive.org/web/20170315121302/http://indiatoday.intoday.in/story/biren-singh-manipur-chief-minister/1/904413.html |date=15 March 2017 }}". ''[[India Today]]''. 15 March 2017.</ref>
|-
| [[मेघालय]]
! [[कोनराड संगमा]]
| [[File:The Chief Minister of Meghalaya, Shri Conrad Sangma.JPG|100px]]
| {{dts|format=dmy|2018|3|6}}<br /><small>({{ayd|2018|3|6}})</small>
| [[National People's Party (India)|National People's Party]]
| width="4px" style="background-color: {{party color|National People's Party (India)}}" |
|
|<ref>Shiv Sahay Singh. "[http://www.thehindu.com/elections/meghalaya-2018/conrad-sangma-sworn-in-as-meghalaya-cm/article22940327.ece Conrad Sangma sworn-in as Meghalaya CM] {{Webarchive|url=https://web.archive.org/web/20180306062000/http://www.thehindu.com/elections/meghalaya-2018/conrad-sangma-sworn-in-as-meghalaya-cm/article22940327.ece |date=6 March 2018 }}". ''The Hindu''. 6 March 2018.</ref>
|-
| [[मिजोरम]]
! [[ज़ोरामथंगा]]
| [[File:Zoramthanga in 2008.jpg|100px]]
| {{dts|format=dmy|2018|12|15}}<br /><small>({{ayd|2018|12|15}})</small>
| [[मिजो नेशनल फ्रंट]]
| width="4px" bgcolor="{{party color|Mizo National Front}}" |
|
|<ref>Rahul Karmakar. "[https://www.thehindu.com/news/national/other-states/mizoram-assembly-elections-2018-mnf-leader-zoramthanga-sworn-in-as-mizorams-new-chief-minister/article25750995.ece Zoramthanga sworn in Mizoram Chief Minister] {{Webarchive|url=https://web.archive.org/web/20181218061436/https://www.thehindu.com/news/national/other-states/mizoram-assembly-elections-2018-mnf-leader-zoramthanga-sworn-in-as-mizorams-new-chief-minister/article25750995.ece |date=18 December 2018 }}". ''The Hindu''. 15 December 2018.</ref>
|-
| [[नागालैंड]]
! [[नेइफियू रिओ]]
| [[File:NeiphiuRio.jpg|100px]]
| {{dts|format=dmy|2018|3|8}}<br /><small>({{ayd|2018|3|8}})</small>
| [[नेशनलिस्ट डेमोक्रेटिक प्रोग्रेसिव पार्टी]]
| width="4px" bgcolor="{{party color|Nationalist Democratic Progressive Party}}" |
|
|<ref>Rahul Karmakar. "[http://www.thehindu.com/news/national/other-states/neiphiu-rio-sworn-in-as-nagaland-chief-minister/article22976837.ece Neiphiu Rio takes charge as Nagaland Chief Minister again] {{Webarchive|url=https://web.archive.org/web/20181218061436/https://www.thehindu.com/news/national/other-states/neiphiu-rio-sworn-in-as-nagaland-chief-minister/article22976837.ece |date=18 December 2018 }}". ''The Hindu''. 8 March 2018.</ref>
|-
| [[ओडिशा]]
! [[नवीन पटनायक]]
| [[File:NaveenPatnaik.jpg|100px]]
| {{dts|format=dmy|2000|3|5}}<br /><small>({{ayd|2000|3|5}})</small>
| [[बीजु जनता दल]]
| width="4px" bgcolor="{{party color|Biju Janata Dal}}" |
| None
| |
|<ref>N. Ramdas. "[http://hindu.com/thehindu/2000/03/06/stories/01060008.htm Naveen Govt. installed] {{Webarchive|url=https://web.archive.org/web/20140311125537/http://hindu.com/thehindu/2000/03/06/stories/01060008.htm |date=11 March 2014 }}". ''The Hindu''. 6 March 2000.</ref>
|-
| [[पुदुच्चेरी]]{{efn|name=UT}}
! [[एन. रंगास्वामी]]
| [[File:N Rangaswamy.jpg|100px]]
| {{dts|format=dmy|2021|05|07}}<br /><small>({{ayd|2021|05|07}})</small>
| [[आल इंडिया एन.आर. कांग्रेस]]
| width="4px" bgcolor="{{party color|All India N.R. Congress}}" |
|[[नेशनल डेमोक्रेटिक एलायंस|एनडीए]]
|bgcolor="{{party color|Bharatiya Janata Party}}" |
|
|<ref>{{cite news |last1=Stalin |first1=J Sam Daniel |last2=Ghosh |first2=Deepshikha |title=Congress Loses Power In Puducherry, V Narayanasamy Resigns, Blames BJP |url=https://www.ndtv.com/india-news/puducherry-floor-test-puducherry-floor-test-today-congress-government-shaky-with-more-exits-2375732 |access-date=22 February 2021 |work=NDTV |date=22 February 2021}}</ref>
|-
| [[पंजाब]]
! [[भगवंत मान]]
| [[File:A delegation of Aam Aadmi Party leaders, - MP (Lok Sabha), Shri Bhagwant Mann, Shri Sanjay Singh and Shri Ashutosh, calling on the Union Home Minister, Shri Rajnath Singh, in New Delhi on October 22, 2015 (cropped).jpg|100px]]
|{{dts|format=dmy|2022|03|16}}<br /><small>({{ayd|2022|03|16}})</small>
|[[आम आदमी पार्टी]]
| width="4px" bgcolor="{{party color|Aam Aadmi Party}}" |
| None
| |
|
|
|-
| [[राजस्थान]]
! [[अशोक गहलोत]]
| [[File:Ashok Gehlot 2012.jpg|100px]]
| {{dts|format=dmy|2018|12|17}}<br /><small>({{ayd|2018|12|17}})</small>
| [[भारतीय राष्ट्रिय कांग्रेंस]]
| width="4px" bgcolor="{{party color|Indian National Congress}}" |
| यूपीए
| width="4px" bgcolor="{{party color|Indian National Congress}}" |
|
| <ref>"[https://www.thehindu.com/elections/rajasthan-assembly-elections-2018/ashok-gehlot-sachin-pilot-sworn-in-as-cm-deputy-cm/article25762173.ece Rajasthan: Gehlot, Pilot sworn in as CM, Deputy CM] {{Webarchive|url=https://web.archive.org/web/20181218061436/https://www.thehindu.com/elections/rajasthan-assembly-elections-2018/ashok-gehlot-sachin-pilot-sworn-in-as-cm-deputy-cm/article25762173.ece |date=18 December 2018 }}". ''The Hindu''. 17 December 2018.</ref>
|-
| [[सिक्किम]]
! [[प्रेम सिंह तमांग]]
| [[File:Prem Singh Tamang.jpg|100px]]
| {{dts|format=dmy|2019|05|27}}<br /><small>({{ayd|2019|05|27}})</small>
| [[सिक्किम क्रांतिकारी मोर्चा]]
| width="4px" bgcolor="{{party color|Sikkim Krantikari Morcha}}" |
| [[नेशनल डेमोक्रेटिक एलायंस|एनडीए]]
|bgcolor="{{party color|Bharatiya Janata Party}}" |
|
|<ref>Shiv Sahay Singh. "[https://www.thehindu.com/elections/sikkim-assembly/ps-golay-sworn-in-as-sikkim-chief-minister/article27259921.ece P.S. Golay sworn in as Sikkim Chief Minister]". ''The Hindu''. 27 May 2019.</ref>
|-
| [[तमिल नाडु]]
! [[एम. के. स्टालिन]]
|
| {{dts|format=dmy|2021|5|7}}<br /><small>({{ayd|2021|5|7}})</small>
| [[द्रविड़ मुनेत्र कज़गम]]
| width="4px" bgcolor="{{party color|Dravida Munnetra Kazhagam}}" |
| [[यूनाइटेड प्रोग्रेसिव एलायंस|यूपीए]]
|width="4px" bgcolor="{{party color|Indian National Congress}}" |
|
|<ref>"[https://www.thehindubusinessline.com/news/national/mk-stalin-sworn-in-as-chief-minister-of-tamil-nadu/article34504106.ece MK Stalin sworn in as Chief Minister of Tamil Nadu]". ''The Hindu Business Line''. 7 May 2021.</ref>
|-
| [[तेलंगाना]]<br />{{small|([[तेलंगाना के मुख्यमंत्री लोगन के लिस्ट|लिस्ट]])}}
! [[के. चंद्रशेखर राव]]
| [[File:KCR.png|100px]]
| {{dts|format=dmy|2014|6|2}}<br /><small>({{ayd|2014|6|2}})</small>
| [[तेलंगाना राष्ट्रीय समीति]]
| width="4px" bgcolor="{{party color|Telangana Rashtra Samithi}}" |
| None
| |
|
|<ref>K. Srinivas Reddy. "[http://www.thehindu.com/news/national/telangana/kcr-sworn-in-heads-cabinet-of-11-ministers/article6073983.ece KCR sworn in; heads cabinet of 11 ministers] {{Webarchive|url=https://web.archive.org/web/20140606150704/http://www.thehindu.com/news/national/telangana/kcr-sworn-in-heads-cabinet-of-11-ministers/article6073983.ece |date=6 June 2014 }}". ''The Hindu''. 2 June 2014.</ref>
|-
| [[त्रिपुरा]]
! [[माणिक साहा]]
|
| {{dts|format=dmy|2018|3|9}}<br /><small>({{ayd|2022|5|15}})</small>
| rowspan="3" | [[भारतीय जनता पार्टी]]
| rowspan="3" width="4px" bgcolor="{{party color|Bharatiya Janata Party}}" |
| rowspan="3" |[[नेशनल डेमोक्रेटिक एलायंस|एनडीए]]
| rowspan="3" bgcolor="{{party color|Bharatiya Janata Party}}" |
|
|<ref>{{cite news |title=Tripura: CM Manik Saha unveils statue of Maharaja Bir Bikram in Agartala |url=https://theprint.in/india/tripura-cm-manik-saha-unveils-statue-of-maharaja-bir-bikram-in-agartala/1488749/ |work=ThePrint |date=1 अप्रैल 2023}}</ref>
|-
| [[उत्तर प्रदेश]]<br />{{small|([[उत्तर प्रदेश के मुख्यमंत्री लोगन के लिस्ट|लिस्ट]])}}
! [[आदित्यनाथ|योगी आदित्यनाथ]]
| [[File:The Uttar Pradesh Chief Minister, Shri Yogi Adityanath meeting the President, Shri Ram Nath Kovind, at Rashtrapati Bhavan, in New Delhi on February 10, 2018 (cropped).jpg|100px]]
| {{dts|format=dmy|2017|3|19}}<br /><small>({{ayd|2017|3|19}})</small>
|
|<ref>"[http://www.thehindu.com/elections/uttar-pradesh-2017/live-yogi-adityanath-swearing-in-in-uttar-pradesh/article17531393.ece Yogi Adityanath takes oath as Uttar Pradesh Chief Minister] {{Webarchive|url=https://web.archive.org/web/20170319163232/http://www.thehindu.com/elections/uttar-pradesh-2017/live-yogi-adityanath-swearing-in-in-uttar-pradesh/article17531393.ece |date=19 March 2017 }}". ''The Hindu''. 19 March 2017.</ref>
|-
| [[उत्तराखंड]]
! [[पुष्कर सिंह धामी]]
| [[File:Pushkar Dhami.jpg|100px]]
| {{dts|format=dmy|2021|07|04}}<br /><small>({{ayd|2021|07|04}})</small>
|
|<ref>{{Cite web|date=4 July 2021|title=Pushkar Singh Dhami takes oath as eleventh chief minister of Uttarakhand|url=https://www.hindustantimes.com/cities/dehradun-news/pushkar-singh-dhami-takes-oath-as-eleventh-chief-minister-of-uttarakhand-101625397374954.html|access-date=4 July 2021|website=Hindustan Times|language=en}}</ref>
|-
| [[पच्छिम बंगाल]]
! [[ममता बनर्जी]]
| [[File:Mamata Banerjee.jpg|100px]]
| {{dts|format=dmy|2011|5|20}}<br /><small>({{ayd|2011|5|20}})</small>
| [[आल इंडिया तृणमूल कांग्रेस]]
| width="4px" bgcolor="{{party color|All India Trinamool Congress}}" |
| None
| |
|
|<ref>"[http://www.thehindu.com/todays-paper/mamata-37-ministers-sworn-in/article2036575.ece Mamata, 37 Ministers sworn in] {{Webarchive|url=https://web.archive.org/web/20140204015955/http://www.thehindu.com/todays-paper/mamata-37-ministers-sworn-in/article2036575.ece |date=4 February 2014 }}". ''The Hindu''. 21 May 2011.</ref>
|}
==इहो देखल जाय==
* [[भारतीय राज्यन के वर्तमान गवर्नर लोगन के लिस्ट]]
== नोट ==
<references group="नोट"/>
==संदर्भ==
{{Reflist|32em}}
[[श्रेणी:भारत संबंधी लिस्ट|मुख्यमंत्री]]
[[श्रेणी:भारतीय राजनीति|मुख्यमंत्री]]
[[श्रेणी:मुख्यमंत्री|*]]
sm1jndktx18t6v6wwhpzcn261z7twtn
802661
802658
2026-07-26T19:27:50Z
SM7
3953
Protected "[[भारतीय राज्यन के वर्तमान मुख्यमंत्री लोगन के लिस्ट]]": [[:en:WP:MOVP|Page-move vandalism]] ([स्थानांतरण=Allow only administrators] (indefinite))
802658
wikitext
text/x-wiki
{{Update|date=जुलाई 2026}}
[[File:State- and union territory-level parties.svg|alt=|thumb|350x350px|भारत में वर्तमान रूलिंग पार्टी सभ
{{legend|#ff9933|[[भारतीय जनता पार्टी|भाजपा]] (12)}}
{{legend|#ffc969|[[नेशनल डेमोक्रेटिक एलायंस|भाजपा के साथे सझिया]] (6)}}
{{legend|#00bfff|[[भारतीय राष्ट्रीय कांग्रेस|कांग्रेस]] (3)}}{{Legend|#00ebff|[[यूनाइटेड प्रोग्रेसिव एलायंस|कांग्रेस के साथे सझिया]] (3)}}
{{legend|#ff0001|अन्य दूसर दल ([[आम आदमी पार्टी|आआप]], [[आल इंडिया तृणमूल कांग्रेस|तृणमूल कांग्रेस]], [[बीजु जनता दल|बीजेडी]], [[सीपीआई (एम)]], [[तेलंगाना राष्ट्र समीति|टीआरएस]], [[वाईएसआर कांग्रेस पार्टी]])}}
{{legend|#000000|[[राष्ट्रपति शासन]] (1)}}
{{legend|#808080|[[संघ राज्यक्षेत्र|बिधानमंडल नइखे]] (5)}}]]
[[भारत|भारत गणराज्य]] में '''मुख्यमंत्री''' सगरी '''[[भारत के राज्य अउरी संघ राज्यक्षेत्र|28 राज्यन]]''' आ '''[[दिल्ली]]''' आ '''[[पांडिचेरी]]''' संघ शासित क्षेत्र में सरकार के बेहवारिक मुखिया (डि फैक्टो) होलें आ राज्य के बिधानसभा के सोझा जबाबदेह होलें, जबकि नाँव के रूप (''डी ज्यूर'') में इनहन के मुखिया [[वर्तमान भारतीय गवर्नर लोग के लिस्ट|राज्यपाल भा उपराज्यपाल]] लोग होला।
नीचे वर्तमान समय में सगरी राज्य सभ के मुख्यमंत्री लोगन के लिस्ट दिहल गइल बा:
{{clear}}
== वर्तमान मुख्यमंत्री लोग ==
{| class="toccolours" style="width:75em"
! राजनीतिक पार्टी खातिर कलर कुंजी
|-
| {{colbegin|colwidth=23em}}
{{legend|{{party color|Aam Aadmi Party}}|[[आम आदमी पार्टी]]|outline=#000000}}
{{legend|{{party color|All India N.R. Congress}}|[[आल इंडिया एन.आर. कांग्रेस]]|outline=#000000}}
{{legend|{{party color|All India Trinamool Congress}}|[[आल इंडिया तृणमूल कांग्रेस]]|outline=#000000}}
{{legend|{{party color|Bharatiya Janata Party}}|[[भारतीय जनता पार्टी]]|outline=#000000}}
{{legend|{{party color|Biju Janata Dal}}|[[बीजु जनता दल]]|outline=#000000}}
{{legend|{{party color|Communist Party of India (Marxist)}}|[[भारतीय कम्युनिस्ट पार्टी (मार्क्सवादी)]]|outline=#000000}}
{{legend|{{party color|Bharatiya Janata Party}}|[[द्रविड़ मुनेत्र कज़गम]]|outline=#000000}}
{{legend|{{party color|Indian National Congress}}|[[भारतीय राष्ट्रीय कांग्रेस]]|outline=#000000}}
{{legend|{{party color|Janata Dal (United)}}|[[जनता दल (यूनाइटेड)]]|outline=#000000}}
{{legend|{{party color|Jharkhand Mukti Morcha}}|[[झारखंड मुक्ति मोर्चा]]|outline=#000000}}
{{legend|{{party color|Mizo National Front}}|[[मिजो नेशनल फ्रंट]]|outline=#000000}}
{{legend|{{party color|National Democratic Progressive Party}}|[[नेशनलिस्ट डेमोक्रेटिक प्रोग्रेसिव पार्टी]]|outline=#000000}}
{{legend|{{party color|National People's Party (India)}}|[[नेशनल पीपल्स पार्टी (भारत)|नेशनल पीपल्स पार्टी]]|outline=#000000}}
{{legend|{{party color|Shiv Sena}}|[[शिव सेना]]|outline=#000000}}
{{legend|{{party color|Sikkim Krantikari Morcha}}|[[सिक्किम क्रांतिकारी मोर्चा]]|outline=#000000}}
{{legend|{{party color|Telangana Rashtra Samithi}}|[[तेलंगाना राष्ट्र समीति]]|outline=#000000}}
{{legend|{{party color|YSR Congress Party}}|[[वाईएसआर कांग्रेस पार्टी]]|outline=#000000}}
{{legend|White|N/A ([[राष्ट्रपति शासन]])|outline=#000000}}
{{colend}}
|}
{| class="wikitable sortable" style="text-align:center; width:100%"
|-
!scope=col| राज्य<br />{{small|(पहिले के मुख्यमंत्री)}}
!scope=col| नाँव<ref>[https://www.india.gov.in/my-government/whos-who/chief-ministers Chief Ministers] {{Webarchive|url=https://web.archive.org/web/20190809151722/https://www.india.gov.in/my-government/whos-who/chief-ministers |date=9 August 2019 }}. [[India.gov.in]]. Retrieved on 9 July 2019.</ref>
!scope=col class=unsortable| फोटो
!scope=col| पदभार लिहल<br />{{small|(कार्यकाल समय)}}
!scope=col colspan=2| पार्टी{{efn|This column names only the chief minister's party. The ministry (s)he heads may be a complex coalition of several parties and independents; those are not listed here.}}
! colspan="2" |एलायंस
!scope=col| मंत्रालय
!scope=col class=unsortable| संदर्भ
|-
| [[आंध्र प्रदेश]]
! [[वाई. एस. जगन मोहन रेड्डी]]
| [[File:The Chief Minister of Andhra Pradesh, Shri Y.S. Jagan Mohan Reddy.jpg|100px]]
| {{dts|format=dmy|2019|5|30}}<br /><small>({{ayd|2019|5|30}})</small>
| [[वाईएसआर कांग्रेस पार्टी]]
| width="4px" bgcolor="{{party color|YSR Congress Party}}" |
| colspan="2" | ''None''
|
|<ref>"[https://economictimes.indiatimes.com/news/politics-and-nation/jagan-mohan-reddy-takes-oath-as-andhra-pradesh-cm/articleshow/69576201.cms Jagan Mohan Reddy takes oath as Andhra Pradesh CM] {{Webarchive|url=https://web.archive.org/web/20190604104738/https://economictimes.indiatimes.com/news/politics-and-nation/jagan-mohan-reddy-takes-oath-as-andhra-pradesh-cm/articleshow/69576201.cms |date=4 June 2019 }}". ''The Economic Times''. Press Trust of India. 30 May 2019.</ref>
|-
| [[अरुणाचल प्रदेश]]
! [[पेमा खांडू]]
| [[File:Pema Khandu in July 2016.jpg|100px]]
| {{dts|format=dmy|2016|7|17}}<br /><small>({{ayd|2016|7|17}})</small>
| rowspan="2" | [[भारतीय जनता पार्टी]]
| rowspan="2" width="4px" bgcolor="{{party color|Bharatiya Janata Party}}" |
| rowspan="2 " | [[National Democratic Alliance|एनडीए]]
| rowspan="2 " bgcolor="{{party color|Bharatiya Janata Party}}" |
|
|<ref>"[http://www.thehindu.com/news/national/Pema-Khandu-sworn-in-as-Chief-Minister-of-Arunachal-Pradesh/article14494230.ece Pema Khandu sworn in as Chief Minister of Arunachal Pradesh] {{Webarchive|url=https://web.archive.org/web/20190713182538/https://www.thehindu.com/news/national/Pema-Khandu-sworn-in-as-Chief-Minister-of-Arunachal-Pradesh/article14494230.ece |date=13 July 2019 }}". ''The Hindu''. 17 July 2016.</ref><ref>"[http://www.thehindu.com/news/national/other-states/BJP-forms-govt-in-Arunachal-Pradesh/article16969345.ece BJP forms govt in Arunachal Pradesh] {{Webarchive|url=https://web.archive.org/web/20180303125941/http://www.thehindu.com/news/national/other-states/BJP-forms-govt-in-Arunachal-Pradesh/article16969345.ece |date=3 March 2018 }}". ''The Hindu''. 31 December 2016.</ref>
|-
|[[आसाम]]
! [[हिमंता बिस्व सर्मा]]
| [[File:Himanta Biswa Sarma with PM Narendra Modi Cropped.jpg|border|center|166x166px]]
| {{dts|format=dmy|2021|5|10}}<br /><small>({{ayd|2021|5|10}})</small>
|
|<ref>{{Cite web|date=9 May 2021|title=Himanta Biswa Sarma to be new Assam CM; credited as man behind BJP's surge in North East-Politics News , Firstpost|url=https://www.firstpost.com/politics/himanta-biswa-sarma-to-be-new-assam-cm-credited-as-man-behind-bjps-surge-in-north-east-9358121.html|access-date=10 May 2021|website=Firstpost}}</ref><ref>{{Cite web|date=10 May 2021|title=Himanta Biswa Sarma Swearing-in LIVE Updates: JP Nadda to Attend Oath-Taking Ceremony|url=https://www.news18.com/news/politics/himanta-biswa-sarma-swearing-in-live-updates-sarbananda-sonowal-bjp-assam-pm-narendra-modi-jp-nadda-3722531.html|access-date=10 May 2021|website=www.news18.com|language=en}}</ref>
|-
| [[बिहार]]<br />{{small|([[बिहार के मुख्यमंत्री लोगन के लिस्ट|लिस्ट]])}}
! [[नीतीश कुमार]]
| [[File:The Chief Minister of Bihar, Shri Nitish Kumar meeting with the Deputy Chairman, Planning Commission, Shri Montek Singh Ahluwalia to finalize Annual Plan 2007-08 of the State, in New Delhi on February 14, 2007 (Nitish Kumar) (cropped).jpg|100px]]
| {{dts|format=dmy|2015|2|22}}<br /><small>({{ayd|2015|2|22}})</small>
| [[जनता दल (यूनाइटेड)]]
| width="4px" bgcolor="{{party color|Janata Dal (United)}}" |
| rowspan="2" | [[यूनाइटेड प्रोग्रेसिव एलायंस|यूपीए]]
| rowspan="2 " bgcolor="{{party color|Indian National Congress}}" |
|
|<ref>{{cite news |title=Why Nitish Kumar forged alliance with Tejashwi Yadav: Prashant Kishor reveals |url=https://www.livemint.com/news/india/why-nitish-kumar-forged-alliance-with-tejashwi-yadav-prashant-kishor-reveals-11674824958580.html |work=mint |date=27 जनवरी 2023 |language=en}}</ref>
|-
| [[छत्तीसगढ़]]
! [[भूपेश बघेल]]
| [[File:Bhupesh Baghel.jpg|100px]]
| {{dts|format=dmy|2018|12|17}}<br /><small>({{ayd|2018|12|17}})</small>
| [[भारतीय राष्ट्रीय कांग्रेस]]
| width="4px" bgcolor="{{party color|Indian National Congress}}" |
|
|<ref>"[https://www.thehindu.com/elections/chhattisgarh-assembly-elections-2018/bhupesh-baghel-sworn-in-as-chief-minister-of-chhattisgarh/article25764821.ece Bhupesh Baghel sworn in as Chief Minister of Chhattisgarh] {{Webarchive|url=https://web.archive.org/web/20181218061436/https://www.thehindu.com/elections/chhattisgarh-assembly-elections-2018/bhupesh-baghel-sworn-in-as-chief-minister-of-chhattisgarh/article25764821.ece |date=18 December 2018 }}". ''The Hindu''. 17 December 2018.</ref>
|-
| [[दिल्ली]]{{efn|name=UT|Although Delhi, Jammu and Kashmir and Puducherry each have an elected legislature and a council of ministers (headed by the chief minister), they are officially [[संघ राज्यक्षेत्र|union territories]].}}<br />{{small|([[दिल्ली के मुख्यमंत्री लोगन के लिस्ट|लिस्ट]])}}
! [[अरविंद केजरीवाल]]
| [[File:Arvind Kejriwal September 02, 2017 crop.jpg|100px]]
| {{dts|format=dmy|2015|2|14}}<br /><small>({{ayd|2015|2|14}})</small>
| [[आम आदमी पार्टी]]
| width="4px" bgcolor="{{party color|Aam Aadmi Party}}" |
| None
| |
|
|<ref>Smriti Kak Ramachandran, Shubhomoy Sikdar. "[http://www.thehindu.com/news/cities/Delhi/kejriwal-takes-oath-as-delhi-cm-promises-to-act-against-graft/article6895671.ece Kejriwal promises to make Delhi graft-free in 5 years] {{Webarchive|url=https://web.archive.org/web/20180303125941/http://www.thehindu.com/news/cities/Delhi/kejriwal-takes-oath-as-delhi-cm-promises-to-act-against-graft/article6895671.ece |date=3 March 2018 }}". ''The Hindu''. 14 February 2015.</ref>
|-
| [[गोवा]]
! [[प्रमोद सावंत]]
| [[File:The Chief Minister of Goa, Shri Pramod Sawant.jpg|100px]]
| {{dts|format=dmy|2019|3|19}}<br /><small>({{ayd|2019|3|19}})</small>
| rowspan="3 " | [[भारतीय जनता पार्टी]]
| rowspan="3 " width="4px" bgcolor="{{party color|Bharatiya Janata Party}}" |
| rowspan="3 " | [[नेशनल डेमोक्रेटिक एलायंस|एनडीए]]
| rowspan="3 " bgcolor="{{party color|Bharatiya Janata Party}}" |
|
| <ref>Murari Shetye. "[https://timesofindia.indiatimes.com/india/goa-speaker-pramod-sawant-succeeds-parrikar-as-cm/articleshow/68473049.cms Goa speaker Pramod Sawant succeeds Parrikar as CM] {{Webarchive|url=https://web.archive.org/web/20190319124214/https://timesofindia.indiatimes.com/india/goa-speaker-pramod-sawant-succeeds-parrikar-as-cm/articleshow/68473049.cms |date=19 March 2019 }}" ''The Times of India''. 19 March 2019.</ref>
|-
| [[गुजरात]]
! [[भूपेंद्रभाई पटेल]]
| [[File:Bhupendra PAtel Sanskrit.jpg|100px]]
| {{dts|format=dmy|2021|09|13}}<br /><small>({{ayd|2021|09|13}})</small>
|
|
|-
| [[हरियाणा]]
! [[मनोहार लाल खट्टर]]
| [[File:Manohar Lal Khattar 2015.jpg|100px]]
| {{dts|format=dmy|2014|10|26}}<br /><small>({{ayd|2014|10|26}})</small>
|
|<ref>Sarabjit Pandher. "[http://www.thehindu.com/news/national/khattar-swornin-as-haryana-chief-minister/article6535007.ece Khattar sworn in] {{Webarchive|url=https://web.archive.org/web/20180303125941/http://www.thehindu.com/news/national/khattar-swornin-as-haryana-chief-minister/article6535007.ece |date=3 March 2018 }}". ''The Hindu''. 26 October 2014.</ref>
|-
| [[हिमाचल प्रदेश]]
! [[सुखविंदर सिंह सुक्खू]]
| [[File:Sukhvinder Singh Sukhu.jpg|100px]]
| {{dts|format=dmy|2017|12|27}}<br /><small>({{ayd|2022|12|11 }})</small>
| [[भारतीय राष्ट्रीय कांग्रेस]]
| width="4px" bgcolor="{{party color|Indian National Congress}}" |
| rowspan="2" | [[यूनाइटेड प्रोग्रेसिव एलायंस|यूपीए]]
| rowspan="2 " bgcolor="{{party color|Indian National Congress}}" |
|
|<ref>{{cite news |last1=पत्रकार ) |first1=प्रत्युष मिश्रा (वरिष्ठ |title=सुक्खू की सरकार ने हिमाचल की जनता को दिया बड़ा झटका, 22 पैसे प्रति यूनिट बढ़े दाम, अप्रैल में आयेगा आपका इतना बिल » Pangi Ghati Dainik Patrika |url=https://pangighatidanikapatrika.in/himachal-pradesh/himachal-cm-sukhvinder-sukhu-government-planning-to-increase-electricity-rate/ |work=Pangi Ghati Dainik Patrika |date=31 मार्च 2023 |access-date=2023-04-02 |archive-date=2023-04-02 |archive-url=https://web.archive.org/web/20230402055520/https://pangighatidanikapatrika.in/himachal-pradesh/himachal-cm-sukhvinder-sukhu-government-planning-to-increase-electricity-rate/ |url-status=dead }}</ref>
|-
| [[झारखंड]]
! [[हेमंत सोरेन]]
| [[File:Chief Minister of Jharkhand Shri Hemant Soren.jpg|100px]]
| {{dts|format=dmy|2019|12|29}}<br /><small>({{ayd|2019|12|29}})</small>
| [[झारखंड मुक्ति मोर्चा]]
| width="4px" bgcolor="{{party color|Jharkhand Mukti Morcha}}" |
|
| <ref>{{cite news|title=Hemant Soren takes oath as 11th Chief Minister of Jharkhand|url=https://www.thehindu.com/news/national/other-states/hemant-soren-takes-oath-as-11th-chief-minister-of-jharkhand/article30424879.ece|newspaper=The Hindu|access-date=29 December 2019|date=29 December 2019|last1=Barik|first1=Satyasundar}}</ref>
|-
| [[कर्नाटक]]
! [[बासवराज बोम्मई]]
| [[File:Bommai, in New Delhi on August 17, 2012 (cropped) (cropped).jpg|100px]]
| {{dts|format=dmy|2021|7|28}}<br /><small>({{ayd|2021|7|28}})</small>
| [[भारतीय जनता पार्टी]]
| width="4px" bgcolor="{{party color|Bharatiya Janata Party}}" |
| [[नेशनल डेमोक्रेटिक एलायंस|एनडीए]]
| bgcolor="{{party color|Bharatiya Janata Party}}" |
|
| <ref>{{Cite news|date=28 July 2021|title=Basavaraj Bommai sworn in as Chief Minister of Karnataka|language=en-IN|work=The Hindu|url=https://www.thehindu.com/news/national/karnataka/basavaraj-bommai-sworn-in-as-new-chief-minister-of-karnataka/article35576498.ece|access-date=30 August 2021|issn=0971-751X}}</ref>
|-
| [[केरल]]
! [[पिनरई विजयन]]
| [[File:Pinarayi Vijayan 1.jpg|100px]]
| {{dts|format=dmy|2016|5|25}}<br /><small>({{ayd|2016|5|25}})</small>
| [[भारतीय कम्युनिस्ट पार्टी (मार्क्सवादी)]]
| width="4px" bgcolor="{{party color|Communist Party of India (Marxist)}}" |
| None
| |
|
| <ref>C. Gouridasan Nair. "[http://www.thehindu.com/news/national/kerala/ldf-cabinet-sworn-in-pinarayi-vijayan-takes-over-as-cm/article8645724.ece Pinarayi takes charge as Kerala Chief Minister] {{Webarchive|url=https://web.archive.org/web/20160525115437/http://www.thehindu.com/news/national/kerala/ldf-cabinet-sworn-in-pinarayi-vijayan-takes-over-as-cm/article8645724.ece |date=25 May 2016 }}". ''The Hindu''. 25 May 2016.</ref>
|-
| [[मध्य प्रदेश]]
! [[शिवराज सिंह चौहान]]
|[[File:Shivraj Singh Chouhan (Cropped 3).jpg|alt=|123x123px]]
| {{dts|format=dmy|2020|03|23}}<br /><small>({{ayd|2020|3|23}})</small>
|[[भारतीय जनता पार्टी]]
| width="4px" bgcolor="{{party color|Bharatiya Janata Party}}" |
|[[नेशनल डेमोक्रेटिक एलायंस|एनडीए]]
|bgcolor="{{party color|Bharatiya Janata Party}}" |
|
|<ref>{{cite news |last1=Noronha |first1=Rahul |title=BJP's Shivraj Singh Chouhan sworn in as Madhya Pradesh CM for fourth time |url=https://www.indiatoday.in/india/story/bjp-s-shivraj-singh-chouhan-sworn-in-as-madhya-pradesh-cm-for-fourth-time-1658867-2020-03-23 |access-date=23 March 2020 |work=India Today |date=23 March 2020 |language=en}}</ref>
|-
| [[महाराष्ट्र]]
! [[एकनाथ शिंदे]]
| [[File:Eknath Shinde with PM Narendra Modi Cropped.jpg|100px]]
| {{dts|format=dmy|2019|11|28}}<br /><small>({{ayd|2022|06|30}})</small>
| [[शिव सेना]]
| width="4px" bgcolor="{{party color|Shiv Sena}}" |
|[[नेशनल डेमोक्रेटिक एलायंस|एनडीए]]
|bgcolor="{{party color|Bharatiya Janata Party}}" |
|
| <ref>{{cite news |title=Maharashtra Governor Ramesh Bais asks CM Eknath Shinde to take strict action on communal flare-ups |url=https://www.deccanherald.com/national/west/maharashtra-governor-ramesh-bais-asks-cm-eknath-shinde-to-take-strict-action-on-communal-flare-ups-1205629.html |work=Deccan Herald |date=1 अप्रैल 2023 |language=en}}</ref>
|-
| [[मणिपुर]]
! [[एन. बीरेन सिंह]]
| [[File:The Chief Minister of Manipur, Shri Biren Singh calling on the Vice President, Shri M. Venkaiah Naidu, in New Delhi on September 06, 2017 (cropped).jpg|100px]]
| {{dts|format=dmy|2017|3|15}}<br /><small>({{ayd|2017|3|15}})</small>
| [[भारतीय जनता पार्टी]]
| width="4px" bgcolor="{{party color|Bharatiya Janata Party}}" |
| rowspan="4" |[[नेशनल डेमोक्रेटिक एलायंस|एनडीए]]
| rowspan="4" bgcolor="{{party color|Bharatiya Janata Party}}" |
|
|<ref>Isha Gupta. "[http://indiatoday.intoday.in/story/biren-singh-manipur-chief-minister/1/904413.html BJP leader Biren Singh sworn in as Manipur Chief Minister] {{Webarchive|url=https://web.archive.org/web/20170315121302/http://indiatoday.intoday.in/story/biren-singh-manipur-chief-minister/1/904413.html |date=15 March 2017 }}". ''[[India Today]]''. 15 March 2017.</ref>
|-
| [[मेघालय]]
! [[कोनराड संगमा]]
| [[File:The Chief Minister of Meghalaya, Shri Conrad Sangma.JPG|100px]]
| {{dts|format=dmy|2018|3|6}}<br /><small>({{ayd|2018|3|6}})</small>
| [[National People's Party (India)|National People's Party]]
| width="4px" style="background-color: {{party color|National People's Party (India)}}" |
|
|<ref>Shiv Sahay Singh. "[http://www.thehindu.com/elections/meghalaya-2018/conrad-sangma-sworn-in-as-meghalaya-cm/article22940327.ece Conrad Sangma sworn-in as Meghalaya CM] {{Webarchive|url=https://web.archive.org/web/20180306062000/http://www.thehindu.com/elections/meghalaya-2018/conrad-sangma-sworn-in-as-meghalaya-cm/article22940327.ece |date=6 March 2018 }}". ''The Hindu''. 6 March 2018.</ref>
|-
| [[मिजोरम]]
! [[ज़ोरामथंगा]]
| [[File:Zoramthanga in 2008.jpg|100px]]
| {{dts|format=dmy|2018|12|15}}<br /><small>({{ayd|2018|12|15}})</small>
| [[मिजो नेशनल फ्रंट]]
| width="4px" bgcolor="{{party color|Mizo National Front}}" |
|
|<ref>Rahul Karmakar. "[https://www.thehindu.com/news/national/other-states/mizoram-assembly-elections-2018-mnf-leader-zoramthanga-sworn-in-as-mizorams-new-chief-minister/article25750995.ece Zoramthanga sworn in Mizoram Chief Minister] {{Webarchive|url=https://web.archive.org/web/20181218061436/https://www.thehindu.com/news/national/other-states/mizoram-assembly-elections-2018-mnf-leader-zoramthanga-sworn-in-as-mizorams-new-chief-minister/article25750995.ece |date=18 December 2018 }}". ''The Hindu''. 15 December 2018.</ref>
|-
| [[नागालैंड]]
! [[नेइफियू रिओ]]
| [[File:NeiphiuRio.jpg|100px]]
| {{dts|format=dmy|2018|3|8}}<br /><small>({{ayd|2018|3|8}})</small>
| [[नेशनलिस्ट डेमोक्रेटिक प्रोग्रेसिव पार्टी]]
| width="4px" bgcolor="{{party color|Nationalist Democratic Progressive Party}}" |
|
|<ref>Rahul Karmakar. "[http://www.thehindu.com/news/national/other-states/neiphiu-rio-sworn-in-as-nagaland-chief-minister/article22976837.ece Neiphiu Rio takes charge as Nagaland Chief Minister again] {{Webarchive|url=https://web.archive.org/web/20181218061436/https://www.thehindu.com/news/national/other-states/neiphiu-rio-sworn-in-as-nagaland-chief-minister/article22976837.ece |date=18 December 2018 }}". ''The Hindu''. 8 March 2018.</ref>
|-
| [[ओडिशा]]
! [[नवीन पटनायक]]
| [[File:NaveenPatnaik.jpg|100px]]
| {{dts|format=dmy|2000|3|5}}<br /><small>({{ayd|2000|3|5}})</small>
| [[बीजु जनता दल]]
| width="4px" bgcolor="{{party color|Biju Janata Dal}}" |
| None
| |
|<ref>N. Ramdas. "[http://hindu.com/thehindu/2000/03/06/stories/01060008.htm Naveen Govt. installed] {{Webarchive|url=https://web.archive.org/web/20140311125537/http://hindu.com/thehindu/2000/03/06/stories/01060008.htm |date=11 March 2014 }}". ''The Hindu''. 6 March 2000.</ref>
|-
| [[पुदुच्चेरी]]{{efn|name=UT}}
! [[एन. रंगास्वामी]]
| [[File:N Rangaswamy.jpg|100px]]
| {{dts|format=dmy|2021|05|07}}<br /><small>({{ayd|2021|05|07}})</small>
| [[आल इंडिया एन.आर. कांग्रेस]]
| width="4px" bgcolor="{{party color|All India N.R. Congress}}" |
|[[नेशनल डेमोक्रेटिक एलायंस|एनडीए]]
|bgcolor="{{party color|Bharatiya Janata Party}}" |
|
|<ref>{{cite news |last1=Stalin |first1=J Sam Daniel |last2=Ghosh |first2=Deepshikha |title=Congress Loses Power In Puducherry, V Narayanasamy Resigns, Blames BJP |url=https://www.ndtv.com/india-news/puducherry-floor-test-puducherry-floor-test-today-congress-government-shaky-with-more-exits-2375732 |access-date=22 February 2021 |work=NDTV |date=22 February 2021}}</ref>
|-
| [[पंजाब]]
! [[भगवंत मान]]
| [[File:A delegation of Aam Aadmi Party leaders, - MP (Lok Sabha), Shri Bhagwant Mann, Shri Sanjay Singh and Shri Ashutosh, calling on the Union Home Minister, Shri Rajnath Singh, in New Delhi on October 22, 2015 (cropped).jpg|100px]]
|{{dts|format=dmy|2022|03|16}}<br /><small>({{ayd|2022|03|16}})</small>
|[[आम आदमी पार्टी]]
| width="4px" bgcolor="{{party color|Aam Aadmi Party}}" |
| None
| |
|
|
|-
| [[राजस्थान]]
! [[अशोक गहलोत]]
| [[File:Ashok Gehlot 2012.jpg|100px]]
| {{dts|format=dmy|2018|12|17}}<br /><small>({{ayd|2018|12|17}})</small>
| [[भारतीय राष्ट्रिय कांग्रेंस]]
| width="4px" bgcolor="{{party color|Indian National Congress}}" |
| यूपीए
| width="4px" bgcolor="{{party color|Indian National Congress}}" |
|
| <ref>"[https://www.thehindu.com/elections/rajasthan-assembly-elections-2018/ashok-gehlot-sachin-pilot-sworn-in-as-cm-deputy-cm/article25762173.ece Rajasthan: Gehlot, Pilot sworn in as CM, Deputy CM] {{Webarchive|url=https://web.archive.org/web/20181218061436/https://www.thehindu.com/elections/rajasthan-assembly-elections-2018/ashok-gehlot-sachin-pilot-sworn-in-as-cm-deputy-cm/article25762173.ece |date=18 December 2018 }}". ''The Hindu''. 17 December 2018.</ref>
|-
| [[सिक्किम]]
! [[प्रेम सिंह तमांग]]
| [[File:Prem Singh Tamang.jpg|100px]]
| {{dts|format=dmy|2019|05|27}}<br /><small>({{ayd|2019|05|27}})</small>
| [[सिक्किम क्रांतिकारी मोर्चा]]
| width="4px" bgcolor="{{party color|Sikkim Krantikari Morcha}}" |
| [[नेशनल डेमोक्रेटिक एलायंस|एनडीए]]
|bgcolor="{{party color|Bharatiya Janata Party}}" |
|
|<ref>Shiv Sahay Singh. "[https://www.thehindu.com/elections/sikkim-assembly/ps-golay-sworn-in-as-sikkim-chief-minister/article27259921.ece P.S. Golay sworn in as Sikkim Chief Minister]". ''The Hindu''. 27 May 2019.</ref>
|-
| [[तमिल नाडु]]
! [[एम. के. स्टालिन]]
|
| {{dts|format=dmy|2021|5|7}}<br /><small>({{ayd|2021|5|7}})</small>
| [[द्रविड़ मुनेत्र कज़गम]]
| width="4px" bgcolor="{{party color|Dravida Munnetra Kazhagam}}" |
| [[यूनाइटेड प्रोग्रेसिव एलायंस|यूपीए]]
|width="4px" bgcolor="{{party color|Indian National Congress}}" |
|
|<ref>"[https://www.thehindubusinessline.com/news/national/mk-stalin-sworn-in-as-chief-minister-of-tamil-nadu/article34504106.ece MK Stalin sworn in as Chief Minister of Tamil Nadu]". ''The Hindu Business Line''. 7 May 2021.</ref>
|-
| [[तेलंगाना]]<br />{{small|([[तेलंगाना के मुख्यमंत्री लोगन के लिस्ट|लिस्ट]])}}
! [[के. चंद्रशेखर राव]]
| [[File:KCR.png|100px]]
| {{dts|format=dmy|2014|6|2}}<br /><small>({{ayd|2014|6|2}})</small>
| [[तेलंगाना राष्ट्रीय समीति]]
| width="4px" bgcolor="{{party color|Telangana Rashtra Samithi}}" |
| None
| |
|
|<ref>K. Srinivas Reddy. "[http://www.thehindu.com/news/national/telangana/kcr-sworn-in-heads-cabinet-of-11-ministers/article6073983.ece KCR sworn in; heads cabinet of 11 ministers] {{Webarchive|url=https://web.archive.org/web/20140606150704/http://www.thehindu.com/news/national/telangana/kcr-sworn-in-heads-cabinet-of-11-ministers/article6073983.ece |date=6 June 2014 }}". ''The Hindu''. 2 June 2014.</ref>
|-
| [[त्रिपुरा]]
! [[माणिक साहा]]
|
| {{dts|format=dmy|2018|3|9}}<br /><small>({{ayd|2022|5|15}})</small>
| rowspan="3" | [[भारतीय जनता पार्टी]]
| rowspan="3" width="4px" bgcolor="{{party color|Bharatiya Janata Party}}" |
| rowspan="3" |[[नेशनल डेमोक्रेटिक एलायंस|एनडीए]]
| rowspan="3" bgcolor="{{party color|Bharatiya Janata Party}}" |
|
|<ref>{{cite news |title=Tripura: CM Manik Saha unveils statue of Maharaja Bir Bikram in Agartala |url=https://theprint.in/india/tripura-cm-manik-saha-unveils-statue-of-maharaja-bir-bikram-in-agartala/1488749/ |work=ThePrint |date=1 अप्रैल 2023}}</ref>
|-
| [[उत्तर प्रदेश]]<br />{{small|([[उत्तर प्रदेश के मुख्यमंत्री लोगन के लिस्ट|लिस्ट]])}}
! [[आदित्यनाथ|योगी आदित्यनाथ]]
| [[File:The Uttar Pradesh Chief Minister, Shri Yogi Adityanath meeting the President, Shri Ram Nath Kovind, at Rashtrapati Bhavan, in New Delhi on February 10, 2018 (cropped).jpg|100px]]
| {{dts|format=dmy|2017|3|19}}<br /><small>({{ayd|2017|3|19}})</small>
|
|<ref>"[http://www.thehindu.com/elections/uttar-pradesh-2017/live-yogi-adityanath-swearing-in-in-uttar-pradesh/article17531393.ece Yogi Adityanath takes oath as Uttar Pradesh Chief Minister] {{Webarchive|url=https://web.archive.org/web/20170319163232/http://www.thehindu.com/elections/uttar-pradesh-2017/live-yogi-adityanath-swearing-in-in-uttar-pradesh/article17531393.ece |date=19 March 2017 }}". ''The Hindu''. 19 March 2017.</ref>
|-
| [[उत्तराखंड]]
! [[पुष्कर सिंह धामी]]
| [[File:Pushkar Dhami.jpg|100px]]
| {{dts|format=dmy|2021|07|04}}<br /><small>({{ayd|2021|07|04}})</small>
|
|<ref>{{Cite web|date=4 July 2021|title=Pushkar Singh Dhami takes oath as eleventh chief minister of Uttarakhand|url=https://www.hindustantimes.com/cities/dehradun-news/pushkar-singh-dhami-takes-oath-as-eleventh-chief-minister-of-uttarakhand-101625397374954.html|access-date=4 July 2021|website=Hindustan Times|language=en}}</ref>
|-
| [[पच्छिम बंगाल]]
! [[ममता बनर्जी]]
| [[File:Mamata Banerjee.jpg|100px]]
| {{dts|format=dmy|2011|5|20}}<br /><small>({{ayd|2011|5|20}})</small>
| [[आल इंडिया तृणमूल कांग्रेस]]
| width="4px" bgcolor="{{party color|All India Trinamool Congress}}" |
| None
| |
|
|<ref>"[http://www.thehindu.com/todays-paper/mamata-37-ministers-sworn-in/article2036575.ece Mamata, 37 Ministers sworn in] {{Webarchive|url=https://web.archive.org/web/20140204015955/http://www.thehindu.com/todays-paper/mamata-37-ministers-sworn-in/article2036575.ece |date=4 February 2014 }}". ''The Hindu''. 21 May 2011.</ref>
|}
==इहो देखल जाय==
* [[भारतीय राज्यन के वर्तमान गवर्नर लोगन के लिस्ट]]
== नोट ==
<references group="नोट"/>
==संदर्भ==
{{Reflist|32em}}
[[श्रेणी:भारत संबंधी लिस्ट|मुख्यमंत्री]]
[[श्रेणी:भारतीय राजनीति|मुख्यमंत्री]]
[[श्रेणी:मुख्यमंत्री|*]]
sm1jndktx18t6v6wwhpzcn261z7twtn
802662
802661
2026-07-26T19:27:53Z
SM7
3953
Adding {{pp-move-vandalism}}
802662
wikitext
text/x-wiki
{{pp-move-vandalism|small=yes}}
{{Update|date=जुलाई 2026}}
[[File:State- and union territory-level parties.svg|alt=|thumb|350x350px|भारत में वर्तमान रूलिंग पार्टी सभ
{{legend|#ff9933|[[भारतीय जनता पार्टी|भाजपा]] (12)}}
{{legend|#ffc969|[[नेशनल डेमोक्रेटिक एलायंस|भाजपा के साथे सझिया]] (6)}}
{{legend|#00bfff|[[भारतीय राष्ट्रीय कांग्रेस|कांग्रेस]] (3)}}{{Legend|#00ebff|[[यूनाइटेड प्रोग्रेसिव एलायंस|कांग्रेस के साथे सझिया]] (3)}}
{{legend|#ff0001|अन्य दूसर दल ([[आम आदमी पार्टी|आआप]], [[आल इंडिया तृणमूल कांग्रेस|तृणमूल कांग्रेस]], [[बीजु जनता दल|बीजेडी]], [[सीपीआई (एम)]], [[तेलंगाना राष्ट्र समीति|टीआरएस]], [[वाईएसआर कांग्रेस पार्टी]])}}
{{legend|#000000|[[राष्ट्रपति शासन]] (1)}}
{{legend|#808080|[[संघ राज्यक्षेत्र|बिधानमंडल नइखे]] (5)}}]]
[[भारत|भारत गणराज्य]] में '''मुख्यमंत्री''' सगरी '''[[भारत के राज्य अउरी संघ राज्यक्षेत्र|28 राज्यन]]''' आ '''[[दिल्ली]]''' आ '''[[पांडिचेरी]]''' संघ शासित क्षेत्र में सरकार के बेहवारिक मुखिया (डि फैक्टो) होलें आ राज्य के बिधानसभा के सोझा जबाबदेह होलें, जबकि नाँव के रूप (''डी ज्यूर'') में इनहन के मुखिया [[वर्तमान भारतीय गवर्नर लोग के लिस्ट|राज्यपाल भा उपराज्यपाल]] लोग होला।
नीचे वर्तमान समय में सगरी राज्य सभ के मुख्यमंत्री लोगन के लिस्ट दिहल गइल बा:
{{clear}}
== वर्तमान मुख्यमंत्री लोग ==
{| class="toccolours" style="width:75em"
! राजनीतिक पार्टी खातिर कलर कुंजी
|-
| {{colbegin|colwidth=23em}}
{{legend|{{party color|Aam Aadmi Party}}|[[आम आदमी पार्टी]]|outline=#000000}}
{{legend|{{party color|All India N.R. Congress}}|[[आल इंडिया एन.आर. कांग्रेस]]|outline=#000000}}
{{legend|{{party color|All India Trinamool Congress}}|[[आल इंडिया तृणमूल कांग्रेस]]|outline=#000000}}
{{legend|{{party color|Bharatiya Janata Party}}|[[भारतीय जनता पार्टी]]|outline=#000000}}
{{legend|{{party color|Biju Janata Dal}}|[[बीजु जनता दल]]|outline=#000000}}
{{legend|{{party color|Communist Party of India (Marxist)}}|[[भारतीय कम्युनिस्ट पार्टी (मार्क्सवादी)]]|outline=#000000}}
{{legend|{{party color|Bharatiya Janata Party}}|[[द्रविड़ मुनेत्र कज़गम]]|outline=#000000}}
{{legend|{{party color|Indian National Congress}}|[[भारतीय राष्ट्रीय कांग्रेस]]|outline=#000000}}
{{legend|{{party color|Janata Dal (United)}}|[[जनता दल (यूनाइटेड)]]|outline=#000000}}
{{legend|{{party color|Jharkhand Mukti Morcha}}|[[झारखंड मुक्ति मोर्चा]]|outline=#000000}}
{{legend|{{party color|Mizo National Front}}|[[मिजो नेशनल फ्रंट]]|outline=#000000}}
{{legend|{{party color|National Democratic Progressive Party}}|[[नेशनलिस्ट डेमोक्रेटिक प्रोग्रेसिव पार्टी]]|outline=#000000}}
{{legend|{{party color|National People's Party (India)}}|[[नेशनल पीपल्स पार्टी (भारत)|नेशनल पीपल्स पार्टी]]|outline=#000000}}
{{legend|{{party color|Shiv Sena}}|[[शिव सेना]]|outline=#000000}}
{{legend|{{party color|Sikkim Krantikari Morcha}}|[[सिक्किम क्रांतिकारी मोर्चा]]|outline=#000000}}
{{legend|{{party color|Telangana Rashtra Samithi}}|[[तेलंगाना राष्ट्र समीति]]|outline=#000000}}
{{legend|{{party color|YSR Congress Party}}|[[वाईएसआर कांग्रेस पार्टी]]|outline=#000000}}
{{legend|White|N/A ([[राष्ट्रपति शासन]])|outline=#000000}}
{{colend}}
|}
{| class="wikitable sortable" style="text-align:center; width:100%"
|-
!scope=col| राज्य<br />{{small|(पहिले के मुख्यमंत्री)}}
!scope=col| नाँव<ref>[https://www.india.gov.in/my-government/whos-who/chief-ministers Chief Ministers] {{Webarchive|url=https://web.archive.org/web/20190809151722/https://www.india.gov.in/my-government/whos-who/chief-ministers |date=9 August 2019 }}. [[India.gov.in]]. Retrieved on 9 July 2019.</ref>
!scope=col class=unsortable| फोटो
!scope=col| पदभार लिहल<br />{{small|(कार्यकाल समय)}}
!scope=col colspan=2| पार्टी{{efn|This column names only the chief minister's party. The ministry (s)he heads may be a complex coalition of several parties and independents; those are not listed here.}}
! colspan="2" |एलायंस
!scope=col| मंत्रालय
!scope=col class=unsortable| संदर्भ
|-
| [[आंध्र प्रदेश]]
! [[वाई. एस. जगन मोहन रेड्डी]]
| [[File:The Chief Minister of Andhra Pradesh, Shri Y.S. Jagan Mohan Reddy.jpg|100px]]
| {{dts|format=dmy|2019|5|30}}<br /><small>({{ayd|2019|5|30}})</small>
| [[वाईएसआर कांग्रेस पार्टी]]
| width="4px" bgcolor="{{party color|YSR Congress Party}}" |
| colspan="2" | ''None''
|
|<ref>"[https://economictimes.indiatimes.com/news/politics-and-nation/jagan-mohan-reddy-takes-oath-as-andhra-pradesh-cm/articleshow/69576201.cms Jagan Mohan Reddy takes oath as Andhra Pradesh CM] {{Webarchive|url=https://web.archive.org/web/20190604104738/https://economictimes.indiatimes.com/news/politics-and-nation/jagan-mohan-reddy-takes-oath-as-andhra-pradesh-cm/articleshow/69576201.cms |date=4 June 2019 }}". ''The Economic Times''. Press Trust of India. 30 May 2019.</ref>
|-
| [[अरुणाचल प्रदेश]]
! [[पेमा खांडू]]
| [[File:Pema Khandu in July 2016.jpg|100px]]
| {{dts|format=dmy|2016|7|17}}<br /><small>({{ayd|2016|7|17}})</small>
| rowspan="2" | [[भारतीय जनता पार्टी]]
| rowspan="2" width="4px" bgcolor="{{party color|Bharatiya Janata Party}}" |
| rowspan="2 " | [[National Democratic Alliance|एनडीए]]
| rowspan="2 " bgcolor="{{party color|Bharatiya Janata Party}}" |
|
|<ref>"[http://www.thehindu.com/news/national/Pema-Khandu-sworn-in-as-Chief-Minister-of-Arunachal-Pradesh/article14494230.ece Pema Khandu sworn in as Chief Minister of Arunachal Pradesh] {{Webarchive|url=https://web.archive.org/web/20190713182538/https://www.thehindu.com/news/national/Pema-Khandu-sworn-in-as-Chief-Minister-of-Arunachal-Pradesh/article14494230.ece |date=13 July 2019 }}". ''The Hindu''. 17 July 2016.</ref><ref>"[http://www.thehindu.com/news/national/other-states/BJP-forms-govt-in-Arunachal-Pradesh/article16969345.ece BJP forms govt in Arunachal Pradesh] {{Webarchive|url=https://web.archive.org/web/20180303125941/http://www.thehindu.com/news/national/other-states/BJP-forms-govt-in-Arunachal-Pradesh/article16969345.ece |date=3 March 2018 }}". ''The Hindu''. 31 December 2016.</ref>
|-
|[[आसाम]]
! [[हिमंता बिस्व सर्मा]]
| [[File:Himanta Biswa Sarma with PM Narendra Modi Cropped.jpg|border|center|166x166px]]
| {{dts|format=dmy|2021|5|10}}<br /><small>({{ayd|2021|5|10}})</small>
|
|<ref>{{Cite web|date=9 May 2021|title=Himanta Biswa Sarma to be new Assam CM; credited as man behind BJP's surge in North East-Politics News , Firstpost|url=https://www.firstpost.com/politics/himanta-biswa-sarma-to-be-new-assam-cm-credited-as-man-behind-bjps-surge-in-north-east-9358121.html|access-date=10 May 2021|website=Firstpost}}</ref><ref>{{Cite web|date=10 May 2021|title=Himanta Biswa Sarma Swearing-in LIVE Updates: JP Nadda to Attend Oath-Taking Ceremony|url=https://www.news18.com/news/politics/himanta-biswa-sarma-swearing-in-live-updates-sarbananda-sonowal-bjp-assam-pm-narendra-modi-jp-nadda-3722531.html|access-date=10 May 2021|website=www.news18.com|language=en}}</ref>
|-
| [[बिहार]]<br />{{small|([[बिहार के मुख्यमंत्री लोगन के लिस्ट|लिस्ट]])}}
! [[नीतीश कुमार]]
| [[File:The Chief Minister of Bihar, Shri Nitish Kumar meeting with the Deputy Chairman, Planning Commission, Shri Montek Singh Ahluwalia to finalize Annual Plan 2007-08 of the State, in New Delhi on February 14, 2007 (Nitish Kumar) (cropped).jpg|100px]]
| {{dts|format=dmy|2015|2|22}}<br /><small>({{ayd|2015|2|22}})</small>
| [[जनता दल (यूनाइटेड)]]
| width="4px" bgcolor="{{party color|Janata Dal (United)}}" |
| rowspan="2" | [[यूनाइटेड प्रोग्रेसिव एलायंस|यूपीए]]
| rowspan="2 " bgcolor="{{party color|Indian National Congress}}" |
|
|<ref>{{cite news |title=Why Nitish Kumar forged alliance with Tejashwi Yadav: Prashant Kishor reveals |url=https://www.livemint.com/news/india/why-nitish-kumar-forged-alliance-with-tejashwi-yadav-prashant-kishor-reveals-11674824958580.html |work=mint |date=27 जनवरी 2023 |language=en}}</ref>
|-
| [[छत्तीसगढ़]]
! [[भूपेश बघेल]]
| [[File:Bhupesh Baghel.jpg|100px]]
| {{dts|format=dmy|2018|12|17}}<br /><small>({{ayd|2018|12|17}})</small>
| [[भारतीय राष्ट्रीय कांग्रेस]]
| width="4px" bgcolor="{{party color|Indian National Congress}}" |
|
|<ref>"[https://www.thehindu.com/elections/chhattisgarh-assembly-elections-2018/bhupesh-baghel-sworn-in-as-chief-minister-of-chhattisgarh/article25764821.ece Bhupesh Baghel sworn in as Chief Minister of Chhattisgarh] {{Webarchive|url=https://web.archive.org/web/20181218061436/https://www.thehindu.com/elections/chhattisgarh-assembly-elections-2018/bhupesh-baghel-sworn-in-as-chief-minister-of-chhattisgarh/article25764821.ece |date=18 December 2018 }}". ''The Hindu''. 17 December 2018.</ref>
|-
| [[दिल्ली]]{{efn|name=UT|Although Delhi, Jammu and Kashmir and Puducherry each have an elected legislature and a council of ministers (headed by the chief minister), they are officially [[संघ राज्यक्षेत्र|union territories]].}}<br />{{small|([[दिल्ली के मुख्यमंत्री लोगन के लिस्ट|लिस्ट]])}}
! [[अरविंद केजरीवाल]]
| [[File:Arvind Kejriwal September 02, 2017 crop.jpg|100px]]
| {{dts|format=dmy|2015|2|14}}<br /><small>({{ayd|2015|2|14}})</small>
| [[आम आदमी पार्टी]]
| width="4px" bgcolor="{{party color|Aam Aadmi Party}}" |
| None
| |
|
|<ref>Smriti Kak Ramachandran, Shubhomoy Sikdar. "[http://www.thehindu.com/news/cities/Delhi/kejriwal-takes-oath-as-delhi-cm-promises-to-act-against-graft/article6895671.ece Kejriwal promises to make Delhi graft-free in 5 years] {{Webarchive|url=https://web.archive.org/web/20180303125941/http://www.thehindu.com/news/cities/Delhi/kejriwal-takes-oath-as-delhi-cm-promises-to-act-against-graft/article6895671.ece |date=3 March 2018 }}". ''The Hindu''. 14 February 2015.</ref>
|-
| [[गोवा]]
! [[प्रमोद सावंत]]
| [[File:The Chief Minister of Goa, Shri Pramod Sawant.jpg|100px]]
| {{dts|format=dmy|2019|3|19}}<br /><small>({{ayd|2019|3|19}})</small>
| rowspan="3 " | [[भारतीय जनता पार्टी]]
| rowspan="3 " width="4px" bgcolor="{{party color|Bharatiya Janata Party}}" |
| rowspan="3 " | [[नेशनल डेमोक्रेटिक एलायंस|एनडीए]]
| rowspan="3 " bgcolor="{{party color|Bharatiya Janata Party}}" |
|
| <ref>Murari Shetye. "[https://timesofindia.indiatimes.com/india/goa-speaker-pramod-sawant-succeeds-parrikar-as-cm/articleshow/68473049.cms Goa speaker Pramod Sawant succeeds Parrikar as CM] {{Webarchive|url=https://web.archive.org/web/20190319124214/https://timesofindia.indiatimes.com/india/goa-speaker-pramod-sawant-succeeds-parrikar-as-cm/articleshow/68473049.cms |date=19 March 2019 }}" ''The Times of India''. 19 March 2019.</ref>
|-
| [[गुजरात]]
! [[भूपेंद्रभाई पटेल]]
| [[File:Bhupendra PAtel Sanskrit.jpg|100px]]
| {{dts|format=dmy|2021|09|13}}<br /><small>({{ayd|2021|09|13}})</small>
|
|
|-
| [[हरियाणा]]
! [[मनोहार लाल खट्टर]]
| [[File:Manohar Lal Khattar 2015.jpg|100px]]
| {{dts|format=dmy|2014|10|26}}<br /><small>({{ayd|2014|10|26}})</small>
|
|<ref>Sarabjit Pandher. "[http://www.thehindu.com/news/national/khattar-swornin-as-haryana-chief-minister/article6535007.ece Khattar sworn in] {{Webarchive|url=https://web.archive.org/web/20180303125941/http://www.thehindu.com/news/national/khattar-swornin-as-haryana-chief-minister/article6535007.ece |date=3 March 2018 }}". ''The Hindu''. 26 October 2014.</ref>
|-
| [[हिमाचल प्रदेश]]
! [[सुखविंदर सिंह सुक्खू]]
| [[File:Sukhvinder Singh Sukhu.jpg|100px]]
| {{dts|format=dmy|2017|12|27}}<br /><small>({{ayd|2022|12|11 }})</small>
| [[भारतीय राष्ट्रीय कांग्रेस]]
| width="4px" bgcolor="{{party color|Indian National Congress}}" |
| rowspan="2" | [[यूनाइटेड प्रोग्रेसिव एलायंस|यूपीए]]
| rowspan="2 " bgcolor="{{party color|Indian National Congress}}" |
|
|<ref>{{cite news |last1=पत्रकार ) |first1=प्रत्युष मिश्रा (वरिष्ठ |title=सुक्खू की सरकार ने हिमाचल की जनता को दिया बड़ा झटका, 22 पैसे प्रति यूनिट बढ़े दाम, अप्रैल में आयेगा आपका इतना बिल » Pangi Ghati Dainik Patrika |url=https://pangighatidanikapatrika.in/himachal-pradesh/himachal-cm-sukhvinder-sukhu-government-planning-to-increase-electricity-rate/ |work=Pangi Ghati Dainik Patrika |date=31 मार्च 2023 |access-date=2023-04-02 |archive-date=2023-04-02 |archive-url=https://web.archive.org/web/20230402055520/https://pangighatidanikapatrika.in/himachal-pradesh/himachal-cm-sukhvinder-sukhu-government-planning-to-increase-electricity-rate/ |url-status=dead }}</ref>
|-
| [[झारखंड]]
! [[हेमंत सोरेन]]
| [[File:Chief Minister of Jharkhand Shri Hemant Soren.jpg|100px]]
| {{dts|format=dmy|2019|12|29}}<br /><small>({{ayd|2019|12|29}})</small>
| [[झारखंड मुक्ति मोर्चा]]
| width="4px" bgcolor="{{party color|Jharkhand Mukti Morcha}}" |
|
| <ref>{{cite news|title=Hemant Soren takes oath as 11th Chief Minister of Jharkhand|url=https://www.thehindu.com/news/national/other-states/hemant-soren-takes-oath-as-11th-chief-minister-of-jharkhand/article30424879.ece|newspaper=The Hindu|access-date=29 December 2019|date=29 December 2019|last1=Barik|first1=Satyasundar}}</ref>
|-
| [[कर्नाटक]]
! [[बासवराज बोम्मई]]
| [[File:Bommai, in New Delhi on August 17, 2012 (cropped) (cropped).jpg|100px]]
| {{dts|format=dmy|2021|7|28}}<br /><small>({{ayd|2021|7|28}})</small>
| [[भारतीय जनता पार्टी]]
| width="4px" bgcolor="{{party color|Bharatiya Janata Party}}" |
| [[नेशनल डेमोक्रेटिक एलायंस|एनडीए]]
| bgcolor="{{party color|Bharatiya Janata Party}}" |
|
| <ref>{{Cite news|date=28 July 2021|title=Basavaraj Bommai sworn in as Chief Minister of Karnataka|language=en-IN|work=The Hindu|url=https://www.thehindu.com/news/national/karnataka/basavaraj-bommai-sworn-in-as-new-chief-minister-of-karnataka/article35576498.ece|access-date=30 August 2021|issn=0971-751X}}</ref>
|-
| [[केरल]]
! [[पिनरई विजयन]]
| [[File:Pinarayi Vijayan 1.jpg|100px]]
| {{dts|format=dmy|2016|5|25}}<br /><small>({{ayd|2016|5|25}})</small>
| [[भारतीय कम्युनिस्ट पार्टी (मार्क्सवादी)]]
| width="4px" bgcolor="{{party color|Communist Party of India (Marxist)}}" |
| None
| |
|
| <ref>C. Gouridasan Nair. "[http://www.thehindu.com/news/national/kerala/ldf-cabinet-sworn-in-pinarayi-vijayan-takes-over-as-cm/article8645724.ece Pinarayi takes charge as Kerala Chief Minister] {{Webarchive|url=https://web.archive.org/web/20160525115437/http://www.thehindu.com/news/national/kerala/ldf-cabinet-sworn-in-pinarayi-vijayan-takes-over-as-cm/article8645724.ece |date=25 May 2016 }}". ''The Hindu''. 25 May 2016.</ref>
|-
| [[मध्य प्रदेश]]
! [[शिवराज सिंह चौहान]]
|[[File:Shivraj Singh Chouhan (Cropped 3).jpg|alt=|123x123px]]
| {{dts|format=dmy|2020|03|23}}<br /><small>({{ayd|2020|3|23}})</small>
|[[भारतीय जनता पार्टी]]
| width="4px" bgcolor="{{party color|Bharatiya Janata Party}}" |
|[[नेशनल डेमोक्रेटिक एलायंस|एनडीए]]
|bgcolor="{{party color|Bharatiya Janata Party}}" |
|
|<ref>{{cite news |last1=Noronha |first1=Rahul |title=BJP's Shivraj Singh Chouhan sworn in as Madhya Pradesh CM for fourth time |url=https://www.indiatoday.in/india/story/bjp-s-shivraj-singh-chouhan-sworn-in-as-madhya-pradesh-cm-for-fourth-time-1658867-2020-03-23 |access-date=23 March 2020 |work=India Today |date=23 March 2020 |language=en}}</ref>
|-
| [[महाराष्ट्र]]
! [[एकनाथ शिंदे]]
| [[File:Eknath Shinde with PM Narendra Modi Cropped.jpg|100px]]
| {{dts|format=dmy|2019|11|28}}<br /><small>({{ayd|2022|06|30}})</small>
| [[शिव सेना]]
| width="4px" bgcolor="{{party color|Shiv Sena}}" |
|[[नेशनल डेमोक्रेटिक एलायंस|एनडीए]]
|bgcolor="{{party color|Bharatiya Janata Party}}" |
|
| <ref>{{cite news |title=Maharashtra Governor Ramesh Bais asks CM Eknath Shinde to take strict action on communal flare-ups |url=https://www.deccanherald.com/national/west/maharashtra-governor-ramesh-bais-asks-cm-eknath-shinde-to-take-strict-action-on-communal-flare-ups-1205629.html |work=Deccan Herald |date=1 अप्रैल 2023 |language=en}}</ref>
|-
| [[मणिपुर]]
! [[एन. बीरेन सिंह]]
| [[File:The Chief Minister of Manipur, Shri Biren Singh calling on the Vice President, Shri M. Venkaiah Naidu, in New Delhi on September 06, 2017 (cropped).jpg|100px]]
| {{dts|format=dmy|2017|3|15}}<br /><small>({{ayd|2017|3|15}})</small>
| [[भारतीय जनता पार्टी]]
| width="4px" bgcolor="{{party color|Bharatiya Janata Party}}" |
| rowspan="4" |[[नेशनल डेमोक्रेटिक एलायंस|एनडीए]]
| rowspan="4" bgcolor="{{party color|Bharatiya Janata Party}}" |
|
|<ref>Isha Gupta. "[http://indiatoday.intoday.in/story/biren-singh-manipur-chief-minister/1/904413.html BJP leader Biren Singh sworn in as Manipur Chief Minister] {{Webarchive|url=https://web.archive.org/web/20170315121302/http://indiatoday.intoday.in/story/biren-singh-manipur-chief-minister/1/904413.html |date=15 March 2017 }}". ''[[India Today]]''. 15 March 2017.</ref>
|-
| [[मेघालय]]
! [[कोनराड संगमा]]
| [[File:The Chief Minister of Meghalaya, Shri Conrad Sangma.JPG|100px]]
| {{dts|format=dmy|2018|3|6}}<br /><small>({{ayd|2018|3|6}})</small>
| [[National People's Party (India)|National People's Party]]
| width="4px" style="background-color: {{party color|National People's Party (India)}}" |
|
|<ref>Shiv Sahay Singh. "[http://www.thehindu.com/elections/meghalaya-2018/conrad-sangma-sworn-in-as-meghalaya-cm/article22940327.ece Conrad Sangma sworn-in as Meghalaya CM] {{Webarchive|url=https://web.archive.org/web/20180306062000/http://www.thehindu.com/elections/meghalaya-2018/conrad-sangma-sworn-in-as-meghalaya-cm/article22940327.ece |date=6 March 2018 }}". ''The Hindu''. 6 March 2018.</ref>
|-
| [[मिजोरम]]
! [[ज़ोरामथंगा]]
| [[File:Zoramthanga in 2008.jpg|100px]]
| {{dts|format=dmy|2018|12|15}}<br /><small>({{ayd|2018|12|15}})</small>
| [[मिजो नेशनल फ्रंट]]
| width="4px" bgcolor="{{party color|Mizo National Front}}" |
|
|<ref>Rahul Karmakar. "[https://www.thehindu.com/news/national/other-states/mizoram-assembly-elections-2018-mnf-leader-zoramthanga-sworn-in-as-mizorams-new-chief-minister/article25750995.ece Zoramthanga sworn in Mizoram Chief Minister] {{Webarchive|url=https://web.archive.org/web/20181218061436/https://www.thehindu.com/news/national/other-states/mizoram-assembly-elections-2018-mnf-leader-zoramthanga-sworn-in-as-mizorams-new-chief-minister/article25750995.ece |date=18 December 2018 }}". ''The Hindu''. 15 December 2018.</ref>
|-
| [[नागालैंड]]
! [[नेइफियू रिओ]]
| [[File:NeiphiuRio.jpg|100px]]
| {{dts|format=dmy|2018|3|8}}<br /><small>({{ayd|2018|3|8}})</small>
| [[नेशनलिस्ट डेमोक्रेटिक प्रोग्रेसिव पार्टी]]
| width="4px" bgcolor="{{party color|Nationalist Democratic Progressive Party}}" |
|
|<ref>Rahul Karmakar. "[http://www.thehindu.com/news/national/other-states/neiphiu-rio-sworn-in-as-nagaland-chief-minister/article22976837.ece Neiphiu Rio takes charge as Nagaland Chief Minister again] {{Webarchive|url=https://web.archive.org/web/20181218061436/https://www.thehindu.com/news/national/other-states/neiphiu-rio-sworn-in-as-nagaland-chief-minister/article22976837.ece |date=18 December 2018 }}". ''The Hindu''. 8 March 2018.</ref>
|-
| [[ओडिशा]]
! [[नवीन पटनायक]]
| [[File:NaveenPatnaik.jpg|100px]]
| {{dts|format=dmy|2000|3|5}}<br /><small>({{ayd|2000|3|5}})</small>
| [[बीजु जनता दल]]
| width="4px" bgcolor="{{party color|Biju Janata Dal}}" |
| None
| |
|<ref>N. Ramdas. "[http://hindu.com/thehindu/2000/03/06/stories/01060008.htm Naveen Govt. installed] {{Webarchive|url=https://web.archive.org/web/20140311125537/http://hindu.com/thehindu/2000/03/06/stories/01060008.htm |date=11 March 2014 }}". ''The Hindu''. 6 March 2000.</ref>
|-
| [[पुदुच्चेरी]]{{efn|name=UT}}
! [[एन. रंगास्वामी]]
| [[File:N Rangaswamy.jpg|100px]]
| {{dts|format=dmy|2021|05|07}}<br /><small>({{ayd|2021|05|07}})</small>
| [[आल इंडिया एन.आर. कांग्रेस]]
| width="4px" bgcolor="{{party color|All India N.R. Congress}}" |
|[[नेशनल डेमोक्रेटिक एलायंस|एनडीए]]
|bgcolor="{{party color|Bharatiya Janata Party}}" |
|
|<ref>{{cite news |last1=Stalin |first1=J Sam Daniel |last2=Ghosh |first2=Deepshikha |title=Congress Loses Power In Puducherry, V Narayanasamy Resigns, Blames BJP |url=https://www.ndtv.com/india-news/puducherry-floor-test-puducherry-floor-test-today-congress-government-shaky-with-more-exits-2375732 |access-date=22 February 2021 |work=NDTV |date=22 February 2021}}</ref>
|-
| [[पंजाब]]
! [[भगवंत मान]]
| [[File:A delegation of Aam Aadmi Party leaders, - MP (Lok Sabha), Shri Bhagwant Mann, Shri Sanjay Singh and Shri Ashutosh, calling on the Union Home Minister, Shri Rajnath Singh, in New Delhi on October 22, 2015 (cropped).jpg|100px]]
|{{dts|format=dmy|2022|03|16}}<br /><small>({{ayd|2022|03|16}})</small>
|[[आम आदमी पार्टी]]
| width="4px" bgcolor="{{party color|Aam Aadmi Party}}" |
| None
| |
|
|
|-
| [[राजस्थान]]
! [[अशोक गहलोत]]
| [[File:Ashok Gehlot 2012.jpg|100px]]
| {{dts|format=dmy|2018|12|17}}<br /><small>({{ayd|2018|12|17}})</small>
| [[भारतीय राष्ट्रिय कांग्रेंस]]
| width="4px" bgcolor="{{party color|Indian National Congress}}" |
| यूपीए
| width="4px" bgcolor="{{party color|Indian National Congress}}" |
|
| <ref>"[https://www.thehindu.com/elections/rajasthan-assembly-elections-2018/ashok-gehlot-sachin-pilot-sworn-in-as-cm-deputy-cm/article25762173.ece Rajasthan: Gehlot, Pilot sworn in as CM, Deputy CM] {{Webarchive|url=https://web.archive.org/web/20181218061436/https://www.thehindu.com/elections/rajasthan-assembly-elections-2018/ashok-gehlot-sachin-pilot-sworn-in-as-cm-deputy-cm/article25762173.ece |date=18 December 2018 }}". ''The Hindu''. 17 December 2018.</ref>
|-
| [[सिक्किम]]
! [[प्रेम सिंह तमांग]]
| [[File:Prem Singh Tamang.jpg|100px]]
| {{dts|format=dmy|2019|05|27}}<br /><small>({{ayd|2019|05|27}})</small>
| [[सिक्किम क्रांतिकारी मोर्चा]]
| width="4px" bgcolor="{{party color|Sikkim Krantikari Morcha}}" |
| [[नेशनल डेमोक्रेटिक एलायंस|एनडीए]]
|bgcolor="{{party color|Bharatiya Janata Party}}" |
|
|<ref>Shiv Sahay Singh. "[https://www.thehindu.com/elections/sikkim-assembly/ps-golay-sworn-in-as-sikkim-chief-minister/article27259921.ece P.S. Golay sworn in as Sikkim Chief Minister]". ''The Hindu''. 27 May 2019.</ref>
|-
| [[तमिल नाडु]]
! [[एम. के. स्टालिन]]
|
| {{dts|format=dmy|2021|5|7}}<br /><small>({{ayd|2021|5|7}})</small>
| [[द्रविड़ मुनेत्र कज़गम]]
| width="4px" bgcolor="{{party color|Dravida Munnetra Kazhagam}}" |
| [[यूनाइटेड प्रोग्रेसिव एलायंस|यूपीए]]
|width="4px" bgcolor="{{party color|Indian National Congress}}" |
|
|<ref>"[https://www.thehindubusinessline.com/news/national/mk-stalin-sworn-in-as-chief-minister-of-tamil-nadu/article34504106.ece MK Stalin sworn in as Chief Minister of Tamil Nadu]". ''The Hindu Business Line''. 7 May 2021.</ref>
|-
| [[तेलंगाना]]<br />{{small|([[तेलंगाना के मुख्यमंत्री लोगन के लिस्ट|लिस्ट]])}}
! [[के. चंद्रशेखर राव]]
| [[File:KCR.png|100px]]
| {{dts|format=dmy|2014|6|2}}<br /><small>({{ayd|2014|6|2}})</small>
| [[तेलंगाना राष्ट्रीय समीति]]
| width="4px" bgcolor="{{party color|Telangana Rashtra Samithi}}" |
| None
| |
|
|<ref>K. Srinivas Reddy. "[http://www.thehindu.com/news/national/telangana/kcr-sworn-in-heads-cabinet-of-11-ministers/article6073983.ece KCR sworn in; heads cabinet of 11 ministers] {{Webarchive|url=https://web.archive.org/web/20140606150704/http://www.thehindu.com/news/national/telangana/kcr-sworn-in-heads-cabinet-of-11-ministers/article6073983.ece |date=6 June 2014 }}". ''The Hindu''. 2 June 2014.</ref>
|-
| [[त्रिपुरा]]
! [[माणिक साहा]]
|
| {{dts|format=dmy|2018|3|9}}<br /><small>({{ayd|2022|5|15}})</small>
| rowspan="3" | [[भारतीय जनता पार्टी]]
| rowspan="3" width="4px" bgcolor="{{party color|Bharatiya Janata Party}}" |
| rowspan="3" |[[नेशनल डेमोक्रेटिक एलायंस|एनडीए]]
| rowspan="3" bgcolor="{{party color|Bharatiya Janata Party}}" |
|
|<ref>{{cite news |title=Tripura: CM Manik Saha unveils statue of Maharaja Bir Bikram in Agartala |url=https://theprint.in/india/tripura-cm-manik-saha-unveils-statue-of-maharaja-bir-bikram-in-agartala/1488749/ |work=ThePrint |date=1 अप्रैल 2023}}</ref>
|-
| [[उत्तर प्रदेश]]<br />{{small|([[उत्तर प्रदेश के मुख्यमंत्री लोगन के लिस्ट|लिस्ट]])}}
! [[आदित्यनाथ|योगी आदित्यनाथ]]
| [[File:The Uttar Pradesh Chief Minister, Shri Yogi Adityanath meeting the President, Shri Ram Nath Kovind, at Rashtrapati Bhavan, in New Delhi on February 10, 2018 (cropped).jpg|100px]]
| {{dts|format=dmy|2017|3|19}}<br /><small>({{ayd|2017|3|19}})</small>
|
|<ref>"[http://www.thehindu.com/elections/uttar-pradesh-2017/live-yogi-adityanath-swearing-in-in-uttar-pradesh/article17531393.ece Yogi Adityanath takes oath as Uttar Pradesh Chief Minister] {{Webarchive|url=https://web.archive.org/web/20170319163232/http://www.thehindu.com/elections/uttar-pradesh-2017/live-yogi-adityanath-swearing-in-in-uttar-pradesh/article17531393.ece |date=19 March 2017 }}". ''The Hindu''. 19 March 2017.</ref>
|-
| [[उत्तराखंड]]
! [[पुष्कर सिंह धामी]]
| [[File:Pushkar Dhami.jpg|100px]]
| {{dts|format=dmy|2021|07|04}}<br /><small>({{ayd|2021|07|04}})</small>
|
|<ref>{{Cite web|date=4 July 2021|title=Pushkar Singh Dhami takes oath as eleventh chief minister of Uttarakhand|url=https://www.hindustantimes.com/cities/dehradun-news/pushkar-singh-dhami-takes-oath-as-eleventh-chief-minister-of-uttarakhand-101625397374954.html|access-date=4 July 2021|website=Hindustan Times|language=en}}</ref>
|-
| [[पच्छिम बंगाल]]
! [[ममता बनर्जी]]
| [[File:Mamata Banerjee.jpg|100px]]
| {{dts|format=dmy|2011|5|20}}<br /><small>({{ayd|2011|5|20}})</small>
| [[आल इंडिया तृणमूल कांग्रेस]]
| width="4px" bgcolor="{{party color|All India Trinamool Congress}}" |
| None
| |
|
|<ref>"[http://www.thehindu.com/todays-paper/mamata-37-ministers-sworn-in/article2036575.ece Mamata, 37 Ministers sworn in] {{Webarchive|url=https://web.archive.org/web/20140204015955/http://www.thehindu.com/todays-paper/mamata-37-ministers-sworn-in/article2036575.ece |date=4 February 2014 }}". ''The Hindu''. 21 May 2011.</ref>
|}
==इहो देखल जाय==
* [[भारतीय राज्यन के वर्तमान गवर्नर लोगन के लिस्ट]]
== नोट ==
<references group="नोट"/>
==संदर्भ==
{{Reflist|32em}}
[[श्रेणी:भारत संबंधी लिस्ट|मुख्यमंत्री]]
[[श्रेणी:भारतीय राजनीति|मुख्यमंत्री]]
[[श्रेणी:मुख्यमंत्री|*]]
qxjdmd4vt21yzmr6ovlvsibhrgbujig
राम मंदिर, अयोध्या
0
90783
802680
786629
2026-07-26T19:48:17Z
SM7
3953
- protection banner
802680
wikitext
text/x-wiki
{{Infobox Hindu temple
|name = श्री राम जन्मभूमि मंदिर
|image = Shri Ram Janambhoomi Mandir, Ayodhya Dham.jpg
|image_size =
|alt =
|caption = श्री राम जन्मभूमि मंदिर
|map_type = India Uttar Pradesh#India
|coordinates = {{coord|26.7956|82.1943|type:landmark_region:LK|display=inline,title}}
|coordinates_footnotes =
|map_caption =
|map_size =
|other_names = राम मंदिर
|script_name =
|script =
|country = [[भारत]]
|state/province = [[उत्तर प्रदेश]]
|district = [[अयोध्या]]
|locale =
|primary_deity = राम लला (श्री राम का शिशु रूप)
|important_festivals =
|architecture =
|number_of_temples =
|history =
|website = [https://srjbtkshetra.org/ श्री राम जन्मभूमि तीर्थ क्षेत्र]
}}
'''राम मंदिर''' एगो [[हिंदू मंदिर|हिन्दू मंदिर]] ह जवन भारत के [[उत्तर प्रदेश]] के [[अयोध्या]] में राम जन्मभूमि के जगह पर बन रहल बा। पवित्र हिंदू ग्रंथ ''[[रामायण]]'' के अनुसार [[हिंदू धर्म]] के एगो प्रमुख देवता [[राम]] के जन्मस्थान ह।<ref>{{Cite web|last=Bajpai|first=Namita |date=7 May 2020|title=Land levelling for Ayodhya Ram temple soon, says mandir trust after video conference |url=https://www.newindianexpress.com/nation/2020/may/07/land-levelling-for-ayodhya-ram-temple-soon-says-mandir-trust-after-video-conference-2140354.html|access-date=8 May 2020 |website=The New Indian Express}}</ref> मंदिर निर्माण के देखरेख श्री राम जन्मभूमि तीर्थ क्षेत्र कर रहल बा। ''भूमि पूजन'' संस्कार 5 अगस्त 2020 के भारत के प्रधानमंत्री [[नरेंद्र मोदी]] द्वारा कइल गइल आ मंदिर के निर्माण शुरू हो गइल। मंदिर के परिसर में [[सूर्य देव|सूर्य]], [[गणेश]], [[शिव]], [[दुर्गा]], [[विष्णु]] आ [[ब्रह्मा|ब्रह्म]] देवता लोग के समर्पित मंदिर शामिल होई।<ref>{{Cite news|others=PTI |date=2021-09-13|title=Six temples of different deities in Ayodhya Ram temple's final blueprint |language=en-IN|work=The Hindu |url=https://www.thehindu.com/news/national/six-temples-of-different-deities-in-ayodhya-ram-temples-final-blueprint/article36425034.ece |access-date=2021-11-22|issn=0971-751X}}</ref>
== इतिहास ==
=== पृष्ठभूमि ===
[[विष्णु]] देवता के अवतार [[राम]] एगो व्यापक रूप से पूजल जाए वाला [[हिंदू देवी-देवता|हिन्दू देवता]] हवें। प्राचीन भारतीय महाकाव्य [[रामायण]] के अनुसार राम के जनम भारत के अयोध्या में भइल रहे। 16वीं सदी में [[मुगल राज|मुगल लोग]] एगो मस्जिद बनवलस, बाबरी मस्जिद जवना के राम जन्मभूमि के स्थल मानल जाला, जवना के राम के जन्मस्थान कहल जाला। 1850 के दशक में एगो हिंसक विवाद पैदा भइल।
1980 के दशक में [[हिंदुत्व|हिंदू राष्ट्रवादी]] संघ परिवार से संबंध रखे वाला विश्व हिंदू परिषद (VHP) हिन्दू लोग खातिर एह जगह के वापस लेवे खातिर आ एह जगह पर रामलाला के समर्पित मंदिर बनावे खातिर एगो नया आंदोलन शुरू कइलस। नवंबर 1989 में विश्व हिंदू परिषद विवादित मस्जिद से सटल जमीन प मंदिर के नींव रखलस। 6 दिसंबर 1992 के विहिप आ [[भारतीय जनता पार्टी]] एह जगह पर एगो रैली के आयोजन कइलस जवना में 1,50,000 स्वयंसेवक शामिल भइले, जवना के कारसेवक के नाम से जानल जाला। रैली हिंसक हो गईल, अउरी भीड़ सुरक्षा बल पर भारी पड़ गईल अउरी मस्जिद के गिरा दिहलस<ref name=":0">{{Cite news |last=Anderson |first=John Ward |last2=Moore |first2=Molly |date=8 December 1992 |title=200 Indians killed in riots following mosque destruction |work=Washington Post |url=https://www.washingtonpost.com/archive/politics/1992/12/08/200-indians-killed-in-riots-following-mosque-destruction/7ce3e7cf-354d-439c-8c69-b7db290dea3c/ |access-date=29 August 2020}}</ref><ref>{{Citation|last=Fuller|first=Christopher John|title=The Camphor Flame: Popular Hinduism and Society in India|url=https://books.google.com/books?id=To6XSeBUW3oC&pg=PA262|year=2004|publisher=Princeton University Press|isbn=0-691-12048-X|page=262}}</ref>
एह तोड़फोड़ के परिणामस्वरूप भारत के हिन्दू अउरी मुस्लिम समुदाय के बीच कई महीना तक अंतरसाम्प्रदायिक दंगा भईल जवना में कम से कम 2000 लोग के मौत भईल, अउरी पूरा [[भारतीय उपमहादीप|भारतीय उपमहाद्वीप]] में दंगा शुरू हो गईल।<ref name=":1">{{Cite magazine |last=Kidangoor |first=Abhishyant |date=August 4, 2020 |title=India's Narendra Modi Broke Ground on a Controversial Temple of Ram. Here's Why It Matters |url=https://time.com/5875380/modi-ram-temple-ayodhya-groundbreaking/?amp=true |magazine=TIME |access-date=17 November 2020 |quote=For Muslims in India, it is the site of a 16th century mosque that was demolished by a mob in 1992, sparking sectarian riots that led to some 2,000 deaths. |archive-date=12 November 2020 |archive-url=https://web.archive.org/web/20201112152359/https://time.com/5875380/modi-ram-temple-ayodhya-groundbreaking/?amp=true |url-status=dead }}</ref> मस्जिद गिरावे के एक दिन बाद 7 दिसंबर 1992 के [[दि न्यू यॉर्क टाइम्स|द न्यूयॉर्क टाइम्स में]] खबर आइल कि पूरा पाकिस्तान में 30 से अधिक हिंदू मंदिरन पर हमला भइल, कुछ में आग लगा दिहल गइल आ एगो के गिरा दिहल गइल। बाबरी मस्जिद के जवाबी कार्रवाई के दौरान आंशिक रूप से तबाह भईल ए हिन्दू मंदिर में से कुछ मंदिर तब से ओसही रहे।<ref>{{Cite web |last=Khalid|first=Haroon|date=14 November 2019|title=How the Babri Masjid Demolition Upended Tenuous Inter-Religious Ties in Pakistan |url=https://thewire.in/south-asia/pakistan-babri-majid-ayodhya-hindus|access-date=30 May 2020 |publisher=The Wire}}</ref>
5 जुलाई 2005 के [[भारत]] के [[अयोध्या]] में नष्ट बाबरी मस्जिद के जगह प पांच आतंकवादी अस्थायी राम मंदिर प हमला कईले। केंद्रीय रिजर्व पुलिस बल (सीआरपीएफ) के संगे भईल गोलीबारी में पांचों के गोली मार के हत्या क दिहल गईल, जबकि हमलावर घेराबंदी वाला दीवार के तोड़े के चक्कर में भईल ग्रेनेड हमला में एक नागरिक के मौत हो गईल। सीआरपीएफ के तीन लोग के जानमाल के नुकसान भईल, जवना में से दु जने गंभीर रूप से घाही हो गईले, जवना में कई गो गोली लागल बा।<ref name="article3">{{Cite web|authors=PTI, UNI|date=6 July 2005|title=Front Page: Armed storm Ayodhya complex |url=http://www.hindu.com/2005/07/06/stories/2005070612430100.htm |url-status=dead|archive-url=https://web.archive.org/web/20050708012430/http://www.hindu.com/2005/07/06/stories/2005070612430100.htm |archive-date=2005-07-08|website=The Hindu}}</ref><ref name="article4">{{Cite web|title=Indian PM condemns the attack in Ayodhya|url=https://english.people.com.cn/200507/06/eng20050706_194315.html|url-status=dead|website=people.com.cn|publisher=People's Daily Online|access-date=2023-07-04|archive-date=2012-10-11|archive-url=https://web.archive.org/web/20121011151654/http://english.people.com.cn/200507/06/eng20050706_194315.html}}</ref>
भारतीय पुरातत्व सर्वेक्षण (ASI) द्वारा 1978 आ 2003 में भइल पुरातात्विक खुदाई में अइसन सबूत मिलल जे एह बात के बतावे लें कि एह जगह पर हिंदू मंदिर के अवशेष मौजूद रहलें।<ref>{{Cite web |last=Bhattacharya|first=Santwana |date=6 March 2003|title=I found pillar bases back in mid-seventies: Prof Lal |url=http://archive.indianexpress.com/oldStory/19644/|access-date=2020-10-07|website=The Indian Express Archive}}</ref><ref>{{Cite web |date=25 August 2020 |others=PTI |title=Proof of temple found at Ayodhya: ASI report |url=https://www.rediff.com/news/2003/aug/25ayo1.htm|access-date=2020-10-07|website=Rediff|language=en}}</ref> सालन से कई तरह के टाइटिल आ कानूनी विवाद भी भइल, जइसे कि अयोध्या अध्यादेश, 1993 में कुछ क्षेत्र के अधिग्रहण के पारित होखल। अयोध्या विवाद प 2019 में सुप्रीम कोर्ट के फैसला के बाद ही फैसला भईल कि विवादित जमीन के भारत सरकार के ओर से राम मंदिर बनावे खाती बनावल ट्रस्ट के सौंप दिहल जाए। अंततः श्री राम जन्मभूमि तीर्थ क्षेत्र के नाम से ट्रस्ट के गठन भईल। 5 फरवरी 2020 के [[भारत के संसद|संसद]] में घोषणा भइल कि [[नरेंद्र मोदी मंत्रिमंडल|नरेंद्र मोदी सरकार]] मंदिर बनावे के योजना के स्वीकार कर लिहले बिया।
=== पहिले से निर्माण के प्रयास भइल ===
1980 के दशक में विहिप धन आ ईंट बटोरत रहे जवना पर "जय श्री राम" लिखल रहे। बाद में राजीव गांधी सरकार विहिप के शिलान्यास खातिर अनुमति दे दिहलस जवना में तत्कालीन गृहमंत्री बुता सिंह औपचारिक रूप से अनुमति विहिप नेता अशोक सिंघल के पहुंचवले। शुरू में केंद्र अउरी राज्य सरकार विवादित स्थल के बहरी संचालन प सहमति बनवले रहे। हालांकि 9 नवंबर 1989 के विहिप के नेता अउरी साधू के एगो समूह विवादित जमीन से सटल {{Convert|7|cuft|L|order=flip|abbr=off|adj=on}} गड्ढा खोद के एकर शिलान्यास कईलस। सिंहद्वार के इहाँ बिछावल गइल रहे।<ref name="NIEBefore2022">{{Cite web |date=11 November 2019 |others=IANS |title=Grand Ram temple in Ayodhya before 2022 |url=https://www.newindianexpress.com/nation/2019/nov/11/grand-ram-temple-in-ayodhya-before-2022-2060227.html |access-date=26 May 2020 |website=The New Indian Express}}</ref> कामेश्वर चौपाल (बिहार के दलित नेता) सबसे पहिले पत्थर बिछावे वाला लोग में से एक बन गईले।<ref name="NIE3rdLargest20">{{Cite web|last=Bajpai|first=Namita|date=21 July 2020|title=280-feet wide, 300-feet long and 161-feet tall: Ayodhya Ram temple complex to be world's third-largest Hindu shrine|url=https://www.newindianexpress.com/nation/2020/jul/21/280-feet-wide-300-feet-long-and-161-feet-tall-ayodhya-ram-temple-complex-to-be-worlds-third-largest-hindu-shrine-2172847.html|access-date=23 July 2020|website=The New Indian Express|archive-date=22 July 2020|archive-url=https://web.archive.org/web/20200722221129/https://www.newindianexpress.com/nation/2020/jul/21/280-feet-wide-300-feet-long-and-161-feet-tall-ayodhya-ram-temple-complex-to-be-worlds-third-largest-hindu-shrine-2172847.html|url-status=dead}}</ref>
=== मंदिर के देवता ===
''रामलला विराजमान'', भगवान [[विष्णु]] के अवतार [[राम]] के शिशु रूप, मंदिर के मुख्य देवता हवें।<ref name="News18RamLalla19">{{Cite web |date=9 November 2019 |title=Ayodhya Case Verdict: Who is Ram Lalla Virajman, the 'Divine Infant' Given the Possession of Disputed Ayodhya Land |url=https://www.news18.com/news/india/ayodhya-case-verdict-who-is-ram-lalla-virajman-the-divine-infant-given-the-possession-of-disputed-ayodhya-land-2379679.html |access-date=4 August 2020 |website=News18}}</ref>
राम लल्ला 1989 से विवादित जगह प कोर्ट केस में मुकदमाबाज रहले, कानून के मुताबिक उनुका के न्यायिक व्यक्ति मानल जाता।<ref name="NDTVIncr20ft20">{{Cite web |last=Pandey |first=Alok |date=23 July 2020 |title=Ayodhya's Ram Temple Will Be 161-Foot Tall, An Increase Of 20 Feet |url=https://www.ndtv.com/india-news/ayodhya-ram-temple-will-be-161-feet-tall-an-increase-by-20-feet-2267315 |access-date=23 July 2020 |website=NDTV}}</ref> उनुकर प्रतिनिधित्व विहिप के एगो वरिष्ठ नेता त्रिलोकी नाथ पांडेय कईले, जेकरा के राम लल्ला के अगिला ‘मानव’ दोस्त मानल जात रहे।<ref name="News18RamLalla19"/>
मंदिर ट्रस्ट के मुताबिक अंतिम खाका में मंदिर परिसर में सूर्य, गणेश, शिव, दुर्गा, विष्णु अउरी ब्रह्मा के समर्पित मंदिर शामिल बा। <ref name=":5">{{Cite web |authors=Press Trust of India |date=13 September 2021 |title=6 temples of different deities to be constructed in Ram Janmabhoomi premises |url=https://www.indiatoday.in/india/story/6-temples-different-deities-constructed-ram-janmabhoomi-premises-1852092-2021-09-13 |url-status=live |access-date=2021-11-22 |website=India Today |language=en}}<cite class="citation web cs1" data-ve-ignore="true">Press Trust of India (13 September 2021). [https://www.indiatoday.in/india/story/6-temples-different-deities-constructed-ram-janmabhoomi-premises-1852092-2021-09-13 "6 temples of different deities to be constructed in Ram Janmabhoomi premises"]. </cite></ref>
== लोकप्रिय संस्कृति ==
[[File:Uttar_Pradesh_tableau_on_Rajpath_at_the_72nd_Republic_Day.jpg|thumb|250x250px|2021 में राजपथ पर उत्तर प्रदेश के टेबल्यू।]]
[[File:Ram_Temple_miniature_not_to_scale_replica_Diwali_New_Delhi_3.jpg|thumb|नई दिल्ली के मॉल में दीपावली 2020 के दौरान प्रस्तावित राम मंदिर मॉडल।]]
राजपथ पर २०२१ के दिल्ली के गणतंत्र दिवस परेड के दौरान उत्तर प्रदेश के टेबल्यू में राम मंदिर के प्रतिकृति देखावल गईल।<ref>{{Cite news|title=Ayodhya on Rajpath: UP's Republic Day tableau showcases replica of Ram temple|work=Zee News |url=https://zeenews.india.com/india/ayodhya-on-rajpath-ups-republic-day-tableau-showcases-replica-of-ram-temple-2337866.html|url-status=live|access-date=2 February 2021}}</ref> 2021 में [[दिपावली]] में मंदिर के छोट आकार के प्रतिकृति बनावल गईल।<ref>{{Cite web|last=Harigovind |first=Abhinaya|date=2021-11-03 |title=For Delhi govt's Diwali event, makeshift Ram Mandir made of thermocol, plywood; sound and lights show |url=https://indianexpress.com/article/cities/delhi/for-delhi-govts-diwali-event-makeshift-ram-mandir-made-of-thermocol-plywood-sound-and-lights-show-7605005/|url-status=live |access-date=2021-11-21|website=The Indian Express|language=en}}</ref>
=== नारा ===
एह नारा के भिन्नता बा जइसे कि लाल कृष्ण आडवाणी द्वारा इस्तेमाल कइल गइल नारा: "सौगंध राम की खाते हैं, हम मंदिर वहीं बनाएंगे", "रामलल्ला हम आएंगे, मंदिर वहीं बनाएंगे"।<ref name=":02">{{Cite web |last=Verma |first=Nalin |date=4 August 2020 |title='Mandir Wahin Banayenge' Said L.K. Advani 30 Years Ago, But Will Stay Home on August 5 |url=https://thewire.in/politics/lk-advani-ayodhya-bhoomi-pujan-ram-mandir-temple-rath-yatra |url-status=live |archive-url= |archive-date= |access-date=2021-02-02 |website=The Wire}}</ref> अन्य भिन्नता आ रूपांतरण सभ में "मंदिर वहीं बनेगा"।<ref name=":3">{{Cite web|date=10 November 2019|title='Sri Ram': A look at how some Hindi and English newspapers covered the #AyodhyaVerdict |url=https://www.newslaundry.com/2019/11/10/sir-ram-a-look-at-how-some-hindi-and-english-newspapers-covered-the-ayodhyaverdict|url-status=live|archive-url=|archive-date=|access-date=2021-02-02 |website=Newslaundry}}</ref> "जहां राम का जन्म हुआ था, हम मंदिर वहीं बनाएंगे"। "पहले मंदिर, फिर सरकार"।
==संदर्भ==
{{Reflist}}
[[श्रेणी:मंदिर]]
39ljeip69fss60cllsmvy80gjehm6w3
प्रयोगकर्ता वार्ता:Matthewmurdock
3
99575
802681
786433
2026-07-27T09:33:03Z
Deepfriedokra
24587
Deepfriedokra पन्ना [[प्रयोगकर्ता वार्ता:Shubhsamant09]] के [[प्रयोगकर्ता वार्ता:Matthewmurdock]] पर स्थानांतरण कइलें: प्रयोगकर्ता के नाँव बदलाव के दौरान पन्ना "[[Special:CentralAuth/Shubhsamant09|Shubhsamant09]]" से "[[Special:CentralAuth/Matthewmurdock|Matthewmurdock]]" पर ऑटोमेटिक रूप से स्थानांतरित भइल।
786433
wikitext
text/x-wiki
{| id="GeoPort-upper" width="100%" cellpadding="5" cellspacing="6" style="background:#FFFAFF; text-align: justify; border-style:ridge; border-width:1px; border-color:#A9A9A9;"
|-
|<div style="display:inline-block;margin-top:.1em; text-align:right; margin-bottom:.2em; border-bottom:0; font-weight:bold;"><big>Welcome! स्वागतम्!</big> [[File:Crystal Clear app ksmiletris.png|25px]] </div>
राउर बहुत-बहुत स्वागत बा '''{{BASEPAGENAME}}''' जी ! {{#if: | {{{1}}} | }}<br/>
<div style="float:right; <!--background:#F5F5DC;--> width:30%">
<!-- दाहिना साइडबार -->
{| border="5" cellspacing="10" cellpadding="5" height="50" align=center border=0 style="background: transparent"
|-
| <big>'''ई जरूर पढ़ल जाय:'''</big>
|-
| style="background-color:#FFFFFF; border: solid 2px #FFFFFF; padding:10px 20px;" | [[विकिपीडिया:विकिपीडिया का ना हवे|विकिपीडिया का ना हवे?]]
|-
| style="background-color:#FFFFFF; border: solid 2px #FFFFFF; padding:10px 20px;" | [[विकिपीडिया:भोजपुरी में कइसे टाइप करब?|भोजपुरी में टाइपिंग]]
|-
| style="background-color:#FFFFFF; border: solid 1px #FFFFFF; padding:10px 20px;" | [[विकिपीडिया:सत्यापन जोग|प्रमाणित बात लिखीं]]
|-
| style="background-color:#FFFFFF; border: solid 1px #FFFFFF; padding:10px 20px;" | [[मदद:फुटनोट|संदर्भ कइसे जोड़ीं?]]
|-
| style="background-color:#FFFFFF; border: solid 1px #FFFFFF; padding:10px 20px;" | [[विकिपीडिया:नीति अउरी दिसानिर्देस|विकिनीति आ निर्देश]]
|}</div>
<!-- मुख्य पाठ -->
'''{{#if: | {{{1}}} | {{BASEPAGENAME}} }} जी''',
एह समय रउँआ [[विकिमीडिया फाउन्डेशन]] के परियोजना [[भोजपुरी]] [[विकिपीडिया]] पर बाड़ीं। भोजपुरी विकिपीडिया एगो मुक्त डिजिटल [[ज्ञानकोश]] हवे, जेवन अइसन भइया-बहिनी लोग मिल के लिखले बा जे ज्ञान बाँटे में बिस्वास करत बाटे। एह समय ए परियोजना में [[विशेष:ActiveUsers|{{NUMBEROFUSERS}} सदस्य]] लोग शामिल बाटे। ई बहुते खुशी क बाति बा कि रउँओं ए में शामिल हो गइल बाड़ीं।
* पहिले से बनल [[विकिपीडिया:लेख|लेखवन]] में कौनो संपादन खाली टेस्ट करे खातिर मत करीं। कौनों तरह के परीक्षण <small>(प्रयोग या टेस्टिंग)</small> [[विकिपीडिया:अभ्यास पन्ना|अभ्यास पन्ना]] या [[Special:MyPage/sandbox|अपना अभ्यास पन्ना]] पर करीं।
* [[विकिपीडिया:आपन परिचय कइसे देईं?|आपन परिचय]] आप संछेप में [[प्रयोगकर्ता:{{BASEPAGENAME}}|अपना सदस्य पन्ना]] पर दे सकत बानी। बहुत पर्सनल बात इहाँ मत लिखीं, न कौनों परचार वाली बात लिखीं। अपने खुद के बारे में लेख मत बनाईं।
* दुसरा [[विकिपीडिया:चौपाल |सदस्य लोगन से बात]] करत समय, [[मदद:वार्ता पन्ना|बातचीत पन्ना]] पर सनेसा लिखले की बाद आपन [[विकिपीडिया:दसखत|दसखत]] <small>(हस्ताक्षर)</small> जरूर करीं। एकरा खातिर अंत में चार गो टेढ़का डैश (<nowiki>~~~~</nowiki>) लिख देंईं या टूलबार में [[File:Insert-signature2.svg|link=|alt=]] पर क्लिक करीं।
* मदद चाहत होखीं त विकिपीडिया के [[विकिपीडिया:मदद|मदद पन्ना]] पर जाईं।
<!-- फुटर के कड़ी सभ -->
सीखे-समझे खातिर कुछ अउरी कड़ी नीचे दिहल जात बाटे:
{| border="5" cellspacing="1" cellpadding="0" height="50" align=center border=0 style="background: transparent"
| style="background-color:#FFFFFF; border: solid 2px #F2BDCD; padding:1px 10px;" | [[विकिपीडिया:स्वशिक्षा|शुरू से सीखीं]]
|
| style="background-color:#FFFFFF; border: solid 2px #F2BDCD; padding:1px 20px;" | [[मदद:संपादन|संपादन सीखीं]]
|
| style="background-color:#FFFFFF; border: solid 2px #F2BDCD; padding:1px 20px;" | [[विकिपीडिया:नया लेख कइसे सुरू करीं?|नया लेख]]
| style="background-color:#FFFFFF; border: solid 2px #F2BDCD; padding:1px 20px;" | [[विकिपीडिया:अइसन लेख मना बाटे|लेख मनाहीं]]
|
| style="background-color:#FFFFFF; border: solid 2px #F2BDCD; padding:1px 20px;" | [[विकिपीडिया:पंचशील|पंचशील]]
| style="background-color:#FFFFFF; border: solid 2px #F2BDCD; padding:1px 20px;" | [[विकिपीडिया:समुदाय पोर्टल|सदस्य समाज पन्ना]]
|}
|}
-- [[प्रयोगकर्ता:नया सदस्य स्वागतकर्ता|नया सदस्य स्वागतकर्ता]] ([[प्रयोगकर्ता वार्ता:नया सदस्य स्वागतकर्ता|बात करीं]]) 21:52, 16 नवंबर 2025 (UTC)
e1ywixbmpqg8exl1unhmyvyful081bm
विकिपीडिया:आँकड़ा सभ/२०२६/जुलाई
4
101100
802657
802590
2026-07-26T19:21:31Z
NeechalBOT
7874
statistics
802657
wikitext
text/x-wiki
<!--- stats starts--->{{प्रयोगकर्ता:Neechalkaran/statnotice}}{| class="wikitable sortable" style="width:90%"
|-
! Date(Time)
! Pages
! Articles
! Edits
! Users
! Files
! Activeusers
{{User:Neechalkaran/template/daily
|Date =१-७-२०२६
|Pages = 81892
|dPages = 4
|Articles = 9097
|dArticles = 0
|Edits = 795873
|dEdits = 9
|Files = 54
|dFiles = 0
|Users = 40208
|dUsers = 5
|Ausers = 57
|dAusers = -4
}}
{{User:Neechalkaran/template/daily
|Date =२-७-२०२६
|Pages = 81895
|dPages = 3
|Articles = 9097
|dArticles = 0
|Edits = 795882
|dEdits = 9
|Files = 54
|dFiles = 0
|Users = 40218
|dUsers = 10
|Ausers = 57
|dAusers = 0
}}
{{User:Neechalkaran/template/daily
|Date =३-७-२०२६
|Pages = 81895
|dPages = 0
|Articles = 9097
|dArticles = 0
|Edits = 795890
|dEdits = 8
|Files = 54
|dFiles = 0
|Users = 40227
|dUsers = 9
|Ausers = 57
|dAusers = 0
}}
{{User:Neechalkaran/template/daily
|Date =४-७-२०२६
|Pages = 81895
|dPages = 0
|Articles = 9096
|dArticles = -1
|Edits = 795904
|dEdits = 14
|Files = 54
|dFiles = 0
|Users = 40231
|dUsers = 4
|Ausers = 59
|dAusers = 2
}}
{{User:Neechalkaran/template/daily
|Date =५-७-२०२६
|Pages = 81902
|dPages = 7
|Articles = 9098
|dArticles = 2
|Edits = 795944
|dEdits = 40
|Files = 54
|dFiles = 0
|Users = 40236
|dUsers = 5
|Ausers = 59
|dAusers = 0
}}
{{User:Neechalkaran/template/daily
|Date =६-७-२०२६
|Pages = 81907
|dPages = 5
|Articles = 9101
|dArticles = 3
|Edits = 796019
|dEdits = 75
|Files = 54
|dFiles = 0
|Users = 40240
|dUsers = 4
|Ausers = 59
|dAusers = 0
}}
{{User:Neechalkaran/template/daily
|Date =७-७-२०२६
|Pages = 81916
|dPages = 9
|Articles = 9103
|dArticles = 2
|Edits = 796069
|dEdits = 50
|Files = 54
|dFiles = 0
|Users = 40248
|dUsers = 8
|Ausers = 63
|dAusers = 4
}}
{{User:Neechalkaran/template/daily
|Date =८-७-२०२६
|Pages = 81920
|dPages = 4
|Articles = 9104
|dArticles = 1
|Edits = 796087
|dEdits = 18
|Files = 54
|dFiles = 0
|Users = 40255
|dUsers = 7
|Ausers = 63
|dAusers = 0
}}
{{User:Neechalkaran/template/daily
|Date =९-७-२०२६
|Pages = 81925
|dPages = 5
|Articles = 9106
|dArticles = 2
|Edits = 796126
|dEdits = 39
|Files = 54
|dFiles = 0
|Users = 40261
|dUsers = 6
|Ausers = 63
|dAusers = 0
}}
{{User:Neechalkaran/template/daily
|Date =१०-७-२०२६
|Pages = 81928
|dPages = 3
|Articles = 9109
|dArticles = 3
|Edits = 796172
|dEdits = 46
|Files = 54
|dFiles = 0
|Users = 40265
|dUsers = 4
|Ausers = 64
|dAusers = 1
}}
{{User:Neechalkaran/template/daily
|Date =११-७-२०२६
|Pages = 81931
|dPages = 3
|Articles = 9109
|dArticles = 0
|Edits = 796343
|dEdits = 171
|Files = 54
|dFiles = 0
|Users = 40270
|dUsers = 5
|Ausers = 64
|dAusers = 0
}}
{{User:Neechalkaran/template/daily
|Date =१२-७-२०२६
|Pages = 81937
|dPages = 6
|Articles = 9112
|dArticles = 3
|Edits = 796450
|dEdits = 107
|Files = 54
|dFiles = 0
|Users = 40277
|dUsers = 7
|Ausers = 64
|dAusers = 0
}}
{{User:Neechalkaran/template/daily
|Date =१३-७-२०२६
|Pages = 81962
|dPages = 25
|Articles = 9118
|dArticles = 6
|Edits = 796848
|dEdits = 398
|Files = 54
|dFiles = 0
|Users = 40283
|dUsers = 6
|Ausers = 66
|dAusers = 2
}}
{{User:Neechalkaran/template/daily
|Date =१४-७-२०२६
|Pages = 81963
|dPages = 1
|Articles = 9118
|dArticles = 0
|Edits = 796951
|dEdits = 103
|Files = 54
|dFiles = 0
|Users = 40292
|dUsers = 9
|Ausers = 66
|dAusers = 0
}}
{{User:Neechalkaran/template/daily
|Date =१५-७-२०२६
|Pages = 81966
|dPages = 3
|Articles = 9119
|dArticles = 1
|Edits = 796982
|dEdits = 31
|Files = 54
|dFiles = 0
|Users = 40295
|dUsers = 3
|Ausers = 66
|dAusers = 0
}}
{{User:Neechalkaran/template/daily
|Date =१६-७-२०२६
|Pages = 81976
|dPages = 10
|Articles = 9121
|dArticles = 2
|Edits = 797197
|dEdits = 215
|Files = 54
|dFiles = 0
|Users = 40297
|dUsers = 2
|Ausers = 66
|dAusers = 0
}}
{{User:Neechalkaran/template/daily
|Date =१७-७-२०२६
|Pages = 81994
|dPages = 18
|Articles = 9126
|dArticles = 5
|Edits = 797326
|dEdits = 129
|Files = 54
|dFiles = 0
|Users = 40301
|dUsers = 4
|Ausers = 66
|dAusers = 0
}}
{{User:Neechalkaran/template/daily
|Date =१८-७-२०२६
|Pages = 82002
|dPages = 8
|Articles = 9128
|dArticles = 2
|Edits = 797384
|dEdits = 58
|Files = 54
|dFiles = 0
|Users = 40305
|dUsers = 4
|Ausers = 66
|dAusers = 0
}}
{{User:Neechalkaran/template/daily
|Date =१९-७-२०२६
|Pages = 82011
|dPages = 9
|Articles = 9129
|dArticles = 1
|Edits = 797820
|dEdits = 436
|Files = 54
|dFiles = 0
|Users = 40309
|dUsers = 4
|Ausers = 45
|dAusers = -21
}}
{{User:Neechalkaran/template/daily
|Date =२०-७-२०२६
|Pages = 82025
|dPages = 14
|Articles = 9132
|dArticles = 3
|Edits = 798488
|dEdits = 668
|Files = 54
|dFiles = 0
|Users = 40310
|dUsers = 1
|Ausers = 45
|dAusers = 0
}}
{{User:Neechalkaran/template/daily
|Date =२१-७-२०२६
|Pages = 82026
|dPages = 1
|Articles = 9133
|dArticles = 1
|Edits = 798514
|dEdits = 26
|Files = 54
|dFiles = 0
|Users = 40315
|dUsers = 5
|Ausers = 45
|dAusers = 0
}}
{{User:Neechalkaran/template/daily
|Date =२२-७-२०२६
|Pages = 82037
|dPages = 11
|Articles = 9138
|dArticles = 5
|Edits = 798566
|dEdits = 52
|Files = 54
|dFiles = 0
|Users = 40323
|dUsers = 8
|Ausers = 44
|dAusers = -1
}}
{{User:Neechalkaran/template/daily
|Date =२३-७-२०२६
|Pages = 82053
|dPages = 16
|Articles = 9143
|dArticles = 5
|Edits = 798618
|dEdits = 52
|Files = 54
|dFiles = 0
|Users = 40326
|dUsers = 3
|Ausers = 44
|dAusers = 0
}}
{{User:Neechalkaran/template/daily
|Date =२४-७-२०२६
|Pages = 82054
|dPages = 1
|Articles = 9143
|dArticles = 0
|Edits = 798630
|dEdits = 12
|Files = 54
|dFiles = 0
|Users = 40330
|dUsers = 4
|Ausers = 44
|dAusers = 0
}}
{{User:Neechalkaran/template/daily
|Date =२५-७-२०२६
|Pages = 82084
|dPages = 30
|Articles = 9146
|dArticles = 3
|Edits = 799457
|dEdits = 827
|Files = 54
|dFiles = 0
|Users = 40336
|dUsers = 6
|Ausers = 45
|dAusers = 1
}}
{{User:Neechalkaran/template/daily
|Date =२६-७-२०२६
|Pages = 82099
|dPages = 15
|Articles = 9152
|dArticles = 6
|Edits = 799564
|dEdits = 107
|Files = 54
|dFiles = 0
|Users = 40346
|dUsers = 10
|Ausers = 45
|dAusers = 0
}}
<!---Place new stats here--->
|}
<!--- stats ends--->
9tkw4n0et8w4jrhycsfev4tgkb44k4c
प्रह्लाद जोशी
0
101317
802641
2026-07-26T12:25:47Z
SM7
3953
नया आधार लेख / अंग्रेजी विकिपीडिया से अनुबाद कइ के
802641
wikitext
text/x-wiki
प्रह्लाद वेंकटेश जोशी (जनम: 27 नवंबर 1962) एगो भारतीय राजनेता बाड़ें। ऊ 2024 से उपभोक्ता मामिला, खाद्य आ सार्वजनिक वितरण मंत्री आ नवीन आ नवीकरणीय ऊर्जा मंत्री के रूप में सेवा देत बाड़ें। जुलाई 2026 में नीट 2026 प्रश्नपत्र लीक विवाद आ राष्ट्रीय परीक्षा एजेंसी (एनटीए) के कामकाज पर उठल आलोचना के बाद धर्मेंद्र प्रधान के इस्तीफा देवे पर, जोशी शिक्षा मंत्री के पद भी सँभारलें। एह दौरान ऊ केंद्रीय मंत्रिमंडल में अपना पहिले से मौजूद मंत्रालयन के जिम्मेदारी भी निभावत रहलें।
एह से पहिले जोशी संसदीय कार्य मंत्री भी रहलें। एह पद पर रहत ऊ अनुच्छेद 370 हटावे, नागरिकता संशोधन विधेयक आ कई गो महत्वपूर्ण विधेयक के संसद के दुनो सदन से सुचारु रूप से पारित करावे में प्रमुख भूमिका निभवलें। ऊ 2019 से 2024 तक कोयला मंत्री आ खान मंत्री भी रहलें। जोशी 2004 से लगातार धारवाड़ लोकसभा निर्वाचन क्षेत्र से सांसद बाड़ें। ऊ 2014 से 2016 तक भारतीय जनता पार्टी (भाजपा), कर्नाटक के प्रदेश अध्यक्ष भी रहलें। 2014 से 2018 तक ऊ लोकसभा के सभापति पैनल के सदस्य रहलें।
जोशी सबसे पहिले 1992 से 1994 के बीच चर्चा में अइलें, जब राष्ट्रीय स्वयंसेवक संघ (आरएसएस) के साथे मिलके ऊ कर्नाटक के हुबली स्थित ईदगाह मैदान पर भारत के राष्ट्रीय ध्वज फहरावे के आंदोलन में शामिल भइलें। बाद में भारत के सर्वोच्च न्यायालय कर्नाटक हाई कोर्ट के ओह फैसला के बरकरार रखलस, जवना में ईदगाह मैदान के मालिकाना हक फेर से हुबली-धारवाड़ नगर निगम के दे दिहल गइल रहे। जोशी 2004, 2009, 2014, 2019 आ 2024 के आम चुनाव में लोकसभा खातिर चुनल जा चुकल बाड़ें।
tl5ezl9hab86uc0m7vx9wlqvy12l8ks
802642
802641
2026-07-26T12:31:39Z
SM7
3953
सुधार कइल गइल
802642
wikitext
text/x-wiki
'''प्रह्लाद वेंकटेश जोशी''' (Pralhad Venkatesh Joshi;<ref>{{Cite web |url=https://www.india.gov.in/my-government/indian-parliament/pralhad-venkatesh-joshi |title=Pralhad Venkatesh Joshi | National Portal of India |website=www.india.gov.in |access-date=24 March 2021 |archive-date=23 April 2021 |archive-url=https://web.archive.org/web/20210423074102/https://www.india.gov.in/my-government/indian-parliament/pralhad-venkatesh-joshi |url-status=live}}</ref> जनम: 27 नवंबर 1962) एगो भारतीय राजनेता बाड़ें। ऊ 2024 से उपभोक्ता मामिला, खाद्य आ सार्वजनिक वितरण मंत्री आ नवीन आ नवीकरणीय ऊर्जा मंत्री के रूप में सेवा देत बाड़ें। जुलाई 2026 में [[नीट 2026 पेपर लीक विवाद]] आ [[राष्ट्रीय परीक्षा एजेंसी (एनटीए)]] के कामकाज पर उठल आलोचना आ आंदोलन के बाद धर्मेंद्र प्रधान के इस्तीफा देवे पर, जोशी [[शिक्षा मंत्री (भारत)|शिक्षा मंत्री]] के पद सम्हरलें। एह दौरान ऊ केंद्रीय मंत्रिमंडल में अपना पहिले से मौजूद मंत्रालयन के जिम्मेदारी भी निभावते रहलन।
एह से पहिले जोशी संसदीय कार्य मंत्री भी रहलें। एह पद पर रहत ऊ अनुच्छेद 370 हटावे, नागरिकता संशोधन विधेयक आ कई गो महत्वपूर्ण विधेयक के संसद के दुनो सदन से सुचारु रूप से पारित करावे में प्रमुख भूमिका निभवलें। ऊ 2019 से 2024 तक कोयला मंत्री आ खान मंत्री भी रहलें। जोशी 2004 से लगातार धारवाड़ लोकसभा निर्वाचन क्षेत्र से सांसद बाड़ें। ऊ 2014 से 2016 तक भारतीय जनता पार्टी (भाजपा), कर्नाटक के प्रदेश अध्यक्ष भी रहलें। 2014 से 2018 तक ऊ लोकसभा के सभापति पैनल के सदस्य रहलें।
जोशी सबसे पहिले 1992 से 1994 के बीच चर्चा में अइलें, जब [[आरएसएस|राष्ट्रीय स्वयंसेवक संघ (आरएसएस)]] के साथे मिलके ऊ कर्नाटक के हुबली स्थित ईदगाह मैदान पर भारत के राष्ट्रीय झंडा फहरावे के आंदोलन में शामिल भइलें। बाद में भारत के सुप्रीम कोर्ट कर्नाटक हाई कोर्ट के ओह फैसला के बरकरार रखलस, जवना में ईदगाह मैदान के मालिकाना हक फेर से हुबली-धारवाड़ नगर निगम के दे दिहल गइल रहे। जोशी 2004, 2009, 2014, 2019 आ 2024 के आम चुनाव में [[लोकसभा]] खातिर चुनल जा चुकल बाड़ें।
{{clear}}
== संदर्भ ==
{{Reflist|29em}}
4ynwn8br3of7cvm7mmykbkkj0dey7gx
802643
802642
2026-07-26T12:33:45Z
SM7
3953
सुधार कइल गइल
802643
wikitext
text/x-wiki
'''प्रह्लाद वेंकटेश जोशी''' (Pralhad Venkatesh Joshi;<ref>{{Cite web |url=https://www.india.gov.in/my-government/indian-parliament/pralhad-venkatesh-joshi |title=Pralhad Venkatesh Joshi | National Portal of India |website=www.india.gov.in |access-date=24 March 2021 |archive-date=23 April 2021 |archive-url=https://web.archive.org/web/20210423074102/https://www.india.gov.in/my-government/indian-parliament/pralhad-venkatesh-joshi |url-status=live}}</ref> जनम: 27 नवंबर 1962), जिनकर नाँव अक्सरहा '''प्रल्हाद जोशी''' लिखल जाला<ref>{{cite web |title=आरएसएस से जुड़े प्रल्हाद जोशी कौन हैं जिन्हें मिली है शिक्षा मंत्रालय की ज़िम्मेदारी |url=https://www.bbc.com/hindi/articles/cwyqnp8wj7zo |website=BBC News हिंदी |access-date=26 जुलाई 2026 |language=hi |date=26 जुलाई 2026}}</ref> एगो भारतीय राजनेता बाड़ें। ऊ 2024 से उपभोक्ता मामिला, खाद्य आ सार्वजनिक वितरण मंत्री आ नवीन आ नवीकरणीय ऊर्जा मंत्री के रूप में सेवा देत बाड़ें। जुलाई 2026 में [[नीट 2026 पेपर लीक विवाद]] आ [[राष्ट्रीय परीक्षा एजेंसी (एनटीए)]] के कामकाज पर उठल आलोचना आ आंदोलन के बाद धर्मेंद्र प्रधान के इस्तीफा देवे पर, जोशी [[शिक्षा मंत्री (भारत)|शिक्षा मंत्री]] के पद सम्हरलें। एह दौरान ऊ केंद्रीय मंत्रिमंडल में अपना पहिले से मौजूद मंत्रालयन के जिम्मेदारी भी निभावते रहलन।
एह से पहिले जोशी संसदीय कार्य मंत्री भी रहलें। एह पद पर रहत ऊ अनुच्छेद 370 हटावे, नागरिकता संशोधन विधेयक आ कई गो महत्वपूर्ण विधेयक के संसद के दुनो सदन से सुचारु रूप से पारित करावे में प्रमुख भूमिका निभवलें। ऊ 2019 से 2024 तक कोयला मंत्री आ खान मंत्री भी रहलें। जोशी 2004 से लगातार धारवाड़ लोकसभा निर्वाचन क्षेत्र से सांसद बाड़ें। ऊ 2014 से 2016 तक भारतीय जनता पार्टी (भाजपा), कर्नाटक के प्रदेश अध्यक्ष भी रहलें। 2014 से 2018 तक ऊ लोकसभा के सभापति पैनल के सदस्य रहलें।
जोशी सबसे पहिले 1992 से 1994 के बीच चर्चा में अइलें, जब [[आरएसएस|राष्ट्रीय स्वयंसेवक संघ (आरएसएस)]] के साथे मिलके ऊ कर्नाटक के हुबली स्थित ईदगाह मैदान पर भारत के राष्ट्रीय झंडा फहरावे के आंदोलन में शामिल भइलें। बाद में भारत के सुप्रीम कोर्ट कर्नाटक हाई कोर्ट के ओह फैसला के बरकरार रखलस, जवना में ईदगाह मैदान के मालिकाना हक फेर से हुबली-धारवाड़ नगर निगम के दे दिहल गइल रहे। जोशी 2004, 2009, 2014, 2019 आ 2024 के आम चुनाव में [[लोकसभा]] खातिर चुनल जा चुकल बाड़ें।
{{clear}}
== संदर्भ ==
{{Reflist|29em}}
[[श्रेणी:1962 में जनम]]
[[श्रेणी:जियत लोग]]
0rfju66nsyhhqk1m1td4zwjoxeoxcs5
802644
802643
2026-07-26T12:35:31Z
SM7
3953
ज्ञानसंदूक जोड़ल गइल
802644
wikitext
text/x-wiki
{{Infobox officeholder
| embed = yes
| office3 = [[कोयला मंत्रालय|केंद्रीय कोयला मंत्री]]
| prime_minister3 = नरेंद्र मोदी
| term_start3 = {{Start date|2019|05|30|df=yes}}
| term_end3 = {{End date|2024|06|10|df=yes}}
| predecessor3 = पीयूष गोयल
| successor3 = [[जी. किशन रेड्डी]]
| office4 = [[खान मंत्रालय (भारत)|केंद्रीय खान मंत्री]]
| prime_minister4 = नरेंद्र मोदी
| term_start4 = {{Start date|2019|05|30|df=yes}}
| term_end4 = {{End date|2024|06|10|df=yes}}
| predecessor4 = नरेंद्र सिंह तोमर
| successor4 = जी. किशन रेड्डी
| office5 = [[संसदीय कार्य मंत्रालय (भारत)|केंद्रीय संसदीय कार्य मंत्री]]
| prime_minister5 = नरेंद्र मोदी
| term_start5 = {{Start date|2019|05|30|df=yes}}
| term_end5 = {{End date|2024|06|10|df=yes}}
| predecessor5 = [[नरेंद्र सिंह तोमर]]
| successor5 = [[किरेन रिजिजू]]
{{Collapsed infobox section end}}}}
| office6 = [[भारतीय जनता पार्टी के राज्य अध्यक्षन के लिस्ट|अध्यक्ष]], [[भारतीय जनता पार्टी, कर्नाटक]]
| term_start6 = {{Start date|2012|07|12|df=yes}}
| term_end6 = {{End date|2016|01|12|df=yes}}
| predecessor6 = [[के. एस. ईश्वरप्पा]]
| successor6 = [[बी. एस. येदियुरप्पा]]
| office7 = [[लोक सभा के सांसद|सांसद]], [[लोक सभा]]
| constituency7 = [[धारवाड़ (लोक सभा निर्वाचन क्षेत्र)|धारवाड़, कर्नाटक]]
| term_start7 = {{Start date|2004|05|24|df=yes}}
| predecessor7 = [[विजय संकेश्वर]]
| successor7 =
| party = [[भारतीय जनता पार्टी]]
| spouse = {{marriage|ज्योति जोशी|1992}}
| children = 3
| footnotes =
| occupation = {{hlist|[[राजनेता]]|व्यवसायी}}
| education = श्री कदसिद्धेश्वर आर्ट्स कॉलेज आ एच. एस. कोटांब्री साइंस इंस्टीट्यूट
}}
'''प्रह्लाद वेंकटेश जोशी''' (Pralhad Venkatesh Joshi;<ref>{{Cite web |url=https://www.india.gov.in/my-government/indian-parliament/pralhad-venkatesh-joshi |title=Pralhad Venkatesh Joshi | National Portal of India |website=www.india.gov.in |access-date=24 March 2021 |archive-date=23 April 2021 |archive-url=https://web.archive.org/web/20210423074102/https://www.india.gov.in/my-government/indian-parliament/pralhad-venkatesh-joshi |url-status=live}}</ref> जनम: 27 नवंबर 1962), जिनकर नाँव अक्सरहा '''प्रल्हाद जोशी''' लिखल जाला<ref>{{cite web |title=आरएसएस से जुड़े प्रल्हाद जोशी कौन हैं जिन्हें मिली है शिक्षा मंत्रालय की ज़िम्मेदारी |url=https://www.bbc.com/hindi/articles/cwyqnp8wj7zo |website=BBC News हिंदी |access-date=26 जुलाई 2026 |language=hi |date=26 जुलाई 2026}}</ref> एगो भारतीय राजनेता बाड़ें। ऊ 2024 से उपभोक्ता मामिला, खाद्य आ सार्वजनिक वितरण मंत्री आ नवीन आ नवीकरणीय ऊर्जा मंत्री के रूप में सेवा देत बाड़ें। जुलाई 2026 में [[नीट 2026 पेपर लीक विवाद]] आ [[राष्ट्रीय परीक्षा एजेंसी (एनटीए)]] के कामकाज पर उठल आलोचना आ आंदोलन के बाद धर्मेंद्र प्रधान के इस्तीफा देवे पर, जोशी [[शिक्षा मंत्री (भारत)|शिक्षा मंत्री]] के पद सम्हरलें। एह दौरान ऊ केंद्रीय मंत्रिमंडल में अपना पहिले से मौजूद मंत्रालयन के जिम्मेदारी भी निभावते रहलन।
एह से पहिले जोशी संसदीय कार्य मंत्री भी रहलें। एह पद पर रहत ऊ अनुच्छेद 370 हटावे, नागरिकता संशोधन विधेयक आ कई गो महत्वपूर्ण विधेयक के संसद के दुनो सदन से सुचारु रूप से पारित करावे में प्रमुख भूमिका निभवलें। ऊ 2019 से 2024 तक कोयला मंत्री आ खान मंत्री भी रहलें। जोशी 2004 से लगातार धारवाड़ लोकसभा निर्वाचन क्षेत्र से सांसद बाड़ें। ऊ 2014 से 2016 तक भारतीय जनता पार्टी (भाजपा), कर्नाटक के प्रदेश अध्यक्ष भी रहलें। 2014 से 2018 तक ऊ लोकसभा के सभापति पैनल के सदस्य रहलें।
जोशी सबसे पहिले 1992 से 1994 के बीच चर्चा में अइलें, जब [[आरएसएस|राष्ट्रीय स्वयंसेवक संघ (आरएसएस)]] के साथे मिलके ऊ कर्नाटक के हुबली स्थित ईदगाह मैदान पर भारत के राष्ट्रीय झंडा फहरावे के आंदोलन में शामिल भइलें। बाद में भारत के सुप्रीम कोर्ट कर्नाटक हाई कोर्ट के ओह फैसला के बरकरार रखलस, जवना में ईदगाह मैदान के मालिकाना हक फेर से हुबली-धारवाड़ नगर निगम के दे दिहल गइल रहे। जोशी 2004, 2009, 2014, 2019 आ 2024 के आम चुनाव में [[लोकसभा]] खातिर चुनल जा चुकल बाड़ें।
{{clear}}
== संदर्भ ==
{{Reflist|29em}}
[[श्रेणी:1962 में जनम]]
[[श्रेणी:जियत लोग]]
4jiup7qf2z3juciktg3w3ay3afxik2e
802645
802644
2026-07-26T12:37:39Z
SM7
3953
ज्ञानसंदूक जोड़ल गइल
802645
wikitext
text/x-wiki
{{Infobox officeholder
| image = Pralhad Joshi in 2026.jpg
| image_size = 250
| caption = 2026 में जोशी
| birth_date = {{birth date and age|1962|11|27|df=yes}}
| birth_place = [[बीजापुर]], [[मैसूर राज्य]], भारत<br />(अब के [[कर्नाटक]])
| office = [[शिक्षा मंत्री (भारत)|केंद्रीय शिक्षा मंत्री]]
| prime_minister = [[नरेंद्र मोदी]]
| president = [[द्रौपदी मुर्मू]]
| term_start = {{Start date|2026|07|26|df=yes}}
| term_end =
| predecessor = [[धर्मेंद्र प्रधान]]
| successor =
| office1 = [[उपभोक्ता मामिला, खाद्य आ सार्वजनिक वितरण मंत्रालय|उपभोक्ता मामिला, खाद्य आ सार्वजनिक वितरण खातिर केंद्रीय मंत्री]]
| prime_minister1 = [[नरेंद्र मोदी]]
| term_start1 = {{Start date|2024|06|10|df=yes}}
| term_end1 =
| predecessor1 = [[पीयूष गोयल]]
| successor1 =
| office2 = [[नवीन आ नवीकरणीय ऊर्जा मंत्रालय|केंद्रीय नवीन आ नवीकरणीय ऊर्जा मंत्री]]
| prime_minister2 = [[नरेंद्र मोदी]]
| term_start2 = {{Start date|2024|06|10|df=yes}}
| term_end2 =
| predecessor2 = [[राज कुमार सिंह]]{{Collapsed infobox section begin|Other ministerial offices|titlestyle=border: 1px dashed lightgrey;}}{{Infobox officeholder
| embed = yes
| office3 = [[कोयला मंत्रालय|केंद्रीय कोयला मंत्री]]
| prime_minister3 = नरेंद्र मोदी
| term_start3 = {{Start date|2019|05|30|df=yes}}
| term_end3 = {{End date|2024|06|10|df=yes}}
| predecessor3 = पीयूष गोयल
| successor3 = [[जी. किशन रेड्डी]]
| office4 = [[खान मंत्रालय (भारत)|केंद्रीय खान मंत्री]]
| prime_minister4 = नरेंद्र मोदी
| term_start4 = {{Start date|2019|05|30|df=yes}}
| term_end4 = {{End date|2024|06|10|df=yes}}
| predecessor4 = नरेंद्र सिंह तोमर
| successor4 = जी. किशन रेड्डी
| office5 = [[संसदीय कार्य मंत्रालय (भारत)|केंद्रीय संसदीय कार्य मंत्री]]
| prime_minister5 = नरेंद्र मोदी
| term_start5 = {{Start date|2019|05|30|df=yes}}
| term_end5 = {{End date|2024|06|10|df=yes}}
| predecessor5 = [[नरेंद्र सिंह तोमर]]
| successor5 = [[किरेन रिजिजू]]
{{Collapsed infobox section end}}}}
| office6 = [[भारतीय जनता पार्टी के राज्य अध्यक्षन के लिस्ट|अध्यक्ष]], [[भारतीय जनता पार्टी, कर्नाटक]]
| term_start6 = {{Start date|2012|07|12|df=yes}}
| term_end6 = {{End date|2016|01|12|df=yes}}
| predecessor6 = [[के. एस. ईश्वरप्पा]]
| successor6 = [[बी. एस. येदियुरप्पा]]
| office7 = [[लोक सभा के सांसद|सांसद]], [[लोक सभा]]
| constituency7 = [[धारवाड़ (लोक सभा निर्वाचन क्षेत्र)|धारवाड़, कर्नाटक]]
| term_start7 = {{Start date|2004|05|24|df=yes}}
| predecessor7 = [[विजय संकेश्वर]]
| successor7 =
| party = [[भारतीय जनता पार्टी]]
| spouse = {{marriage|ज्योति जोशी|1992}}
| children = 3
| footnotes =
| occupation = {{hlist|[[राजनेता]]|व्यवसायी}}
| education = श्री कदसिद्धेश्वर आर्ट्स कॉलेज आ एच. एस. कोटांब्री साइंस इंस्टीट्यूट
}}
'''प्रह्लाद वेंकटेश जोशी''' (Pralhad Venkatesh Joshi;<ref>{{Cite web |url=https://www.india.gov.in/my-government/indian-parliament/pralhad-venkatesh-joshi |title=Pralhad Venkatesh Joshi | National Portal of India |website=www.india.gov.in |access-date=24 March 2021 |archive-date=23 April 2021 |archive-url=https://web.archive.org/web/20210423074102/https://www.india.gov.in/my-government/indian-parliament/pralhad-venkatesh-joshi |url-status=live}}</ref> जनम: 27 नवंबर 1962), जिनकर नाँव अक्सरहा '''प्रल्हाद जोशी''' लिखल जाला<ref>{{cite web |title=आरएसएस से जुड़े प्रल्हाद जोशी कौन हैं जिन्हें मिली है शिक्षा मंत्रालय की ज़िम्मेदारी |url=https://www.bbc.com/hindi/articles/cwyqnp8wj7zo |website=BBC News हिंदी |access-date=26 जुलाई 2026 |language=hi |date=26 जुलाई 2026}}</ref> एगो भारतीय राजनेता बाड़ें। ऊ 2024 से उपभोक्ता मामिला, खाद्य आ सार्वजनिक वितरण मंत्री आ नवीन आ नवीकरणीय ऊर्जा मंत्री के रूप में सेवा देत बाड़ें। जुलाई 2026 में [[नीट 2026 पेपर लीक विवाद]] आ [[राष्ट्रीय परीक्षा एजेंसी (एनटीए)]] के कामकाज पर उठल आलोचना आ आंदोलन के बाद धर्मेंद्र प्रधान के इस्तीफा देवे पर, जोशी [[शिक्षा मंत्री (भारत)|शिक्षा मंत्री]] के पद सम्हरलें। एह दौरान ऊ केंद्रीय मंत्रिमंडल में अपना पहिले से मौजूद मंत्रालयन के जिम्मेदारी भी निभावते रहलन।
एह से पहिले जोशी संसदीय कार्य मंत्री भी रहलें। एह पद पर रहत ऊ अनुच्छेद 370 हटावे, नागरिकता संशोधन विधेयक आ कई गो महत्वपूर्ण विधेयक के संसद के दुनो सदन से सुचारु रूप से पारित करावे में प्रमुख भूमिका निभवलें। ऊ 2019 से 2024 तक कोयला मंत्री आ खान मंत्री भी रहलें। जोशी 2004 से लगातार धारवाड़ लोकसभा निर्वाचन क्षेत्र से सांसद बाड़ें। ऊ 2014 से 2016 तक भारतीय जनता पार्टी (भाजपा), कर्नाटक के प्रदेश अध्यक्ष भी रहलें। 2014 से 2018 तक ऊ लोकसभा के सभापति पैनल के सदस्य रहलें।
जोशी सबसे पहिले 1992 से 1994 के बीच चर्चा में अइलें, जब [[आरएसएस|राष्ट्रीय स्वयंसेवक संघ (आरएसएस)]] के साथे मिलके ऊ कर्नाटक के हुबली स्थित ईदगाह मैदान पर भारत के राष्ट्रीय झंडा फहरावे के आंदोलन में शामिल भइलें। बाद में भारत के सुप्रीम कोर्ट कर्नाटक हाई कोर्ट के ओह फैसला के बरकरार रखलस, जवना में ईदगाह मैदान के मालिकाना हक फेर से हुबली-धारवाड़ नगर निगम के दे दिहल गइल रहे। जोशी 2004, 2009, 2014, 2019 आ 2024 के आम चुनाव में [[लोकसभा]] खातिर चुनल जा चुकल बाड़ें।
{{clear}}
== संदर्भ ==
{{Reflist|29em}}
[[श्रेणी:1962 में जनम]]
[[श्रेणी:जियत लोग]]
ec0ocmi91ow4n2615sge0ywab0yb9zo
802646
802645
2026-07-26T12:39:57Z
SM7
3953
[[User:SM7/stubsorter|Stubsorter]] के मदद से {{India-politician-stub}} जोड़ल गइल।
802646
wikitext
text/x-wiki
{{Infobox officeholder
| image = Pralhad Joshi in 2026.jpg
| image_size = 250
| caption = 2026 में जोशी
| birth_date = {{birth date and age|1962|11|27|df=yes}}
| birth_place = [[बीजापुर]], [[मैसूर राज्य]], भारत<br />(अब के [[कर्नाटक]])
| office = [[शिक्षा मंत्री (भारत)|केंद्रीय शिक्षा मंत्री]]
| prime_minister = [[नरेंद्र मोदी]]
| president = [[द्रौपदी मुर्मू]]
| term_start = {{Start date|2026|07|26|df=yes}}
| term_end =
| predecessor = [[धर्मेंद्र प्रधान]]
| successor =
| office1 = [[उपभोक्ता मामिला, खाद्य आ सार्वजनिक वितरण मंत्रालय|उपभोक्ता मामिला, खाद्य आ सार्वजनिक वितरण खातिर केंद्रीय मंत्री]]
| prime_minister1 = [[नरेंद्र मोदी]]
| term_start1 = {{Start date|2024|06|10|df=yes}}
| term_end1 =
| predecessor1 = [[पीयूष गोयल]]
| successor1 =
| office2 = [[नवीन आ नवीकरणीय ऊर्जा मंत्रालय|केंद्रीय नवीन आ नवीकरणीय ऊर्जा मंत्री]]
| prime_minister2 = [[नरेंद्र मोदी]]
| term_start2 = {{Start date|2024|06|10|df=yes}}
| term_end2 =
| predecessor2 = [[राज कुमार सिंह]]{{Collapsed infobox section begin|Other ministerial offices|titlestyle=border: 1px dashed lightgrey;}}{{Infobox officeholder
| embed = yes
| office3 = [[कोयला मंत्रालय|केंद्रीय कोयला मंत्री]]
| prime_minister3 = नरेंद्र मोदी
| term_start3 = {{Start date|2019|05|30|df=yes}}
| term_end3 = {{End date|2024|06|10|df=yes}}
| predecessor3 = पीयूष गोयल
| successor3 = [[जी. किशन रेड्डी]]
| office4 = [[खान मंत्रालय (भारत)|केंद्रीय खान मंत्री]]
| prime_minister4 = नरेंद्र मोदी
| term_start4 = {{Start date|2019|05|30|df=yes}}
| term_end4 = {{End date|2024|06|10|df=yes}}
| predecessor4 = नरेंद्र सिंह तोमर
| successor4 = जी. किशन रेड्डी
| office5 = [[संसदीय कार्य मंत्रालय (भारत)|केंद्रीय संसदीय कार्य मंत्री]]
| prime_minister5 = नरेंद्र मोदी
| term_start5 = {{Start date|2019|05|30|df=yes}}
| term_end5 = {{End date|2024|06|10|df=yes}}
| predecessor5 = [[नरेंद्र सिंह तोमर]]
| successor5 = [[किरेन रिजिजू]]
{{Collapsed infobox section end}}}}
| office6 = [[भारतीय जनता पार्टी के राज्य अध्यक्षन के लिस्ट|अध्यक्ष]], [[भारतीय जनता पार्टी, कर्नाटक]]
| term_start6 = {{Start date|2012|07|12|df=yes}}
| term_end6 = {{End date|2016|01|12|df=yes}}
| predecessor6 = [[के. एस. ईश्वरप्पा]]
| successor6 = [[बी. एस. येदियुरप्पा]]
| office7 = [[लोक सभा के सांसद|सांसद]], [[लोक सभा]]
| constituency7 = [[धारवाड़ (लोक सभा निर्वाचन क्षेत्र)|धारवाड़, कर्नाटक]]
| term_start7 = {{Start date|2004|05|24|df=yes}}
| predecessor7 = [[विजय संकेश्वर]]
| successor7 =
| party = [[भारतीय जनता पार्टी]]
| spouse = {{marriage|ज्योति जोशी|1992}}
| children = 3
| footnotes =
| occupation = {{hlist|[[राजनेता]]|व्यवसायी}}
| education = श्री कदसिद्धेश्वर आर्ट्स कॉलेज आ एच. एस. कोटांब्री साइंस इंस्टीट्यूट
}}
'''प्रह्लाद वेंकटेश जोशी''' (Pralhad Venkatesh Joshi;<ref>{{Cite web |url=https://www.india.gov.in/my-government/indian-parliament/pralhad-venkatesh-joshi |title=Pralhad Venkatesh Joshi | National Portal of India |website=www.india.gov.in |access-date=24 March 2021 |archive-date=23 April 2021 |archive-url=https://web.archive.org/web/20210423074102/https://www.india.gov.in/my-government/indian-parliament/pralhad-venkatesh-joshi |url-status=live}}</ref> जनम: 27 नवंबर 1962), जिनकर नाँव अक्सरहा '''प्रल्हाद जोशी''' लिखल जाला<ref>{{cite web |title=आरएसएस से जुड़े प्रल्हाद जोशी कौन हैं जिन्हें मिली है शिक्षा मंत्रालय की ज़िम्मेदारी |url=https://www.bbc.com/hindi/articles/cwyqnp8wj7zo |website=BBC News हिंदी |access-date=26 जुलाई 2026 |language=hi |date=26 जुलाई 2026}}</ref> एगो भारतीय राजनेता बाड़ें। ऊ 2024 से उपभोक्ता मामिला, खाद्य आ सार्वजनिक वितरण मंत्री आ नवीन आ नवीकरणीय ऊर्जा मंत्री के रूप में सेवा देत बाड़ें। जुलाई 2026 में [[नीट 2026 पेपर लीक विवाद]] आ [[राष्ट्रीय परीक्षा एजेंसी (एनटीए)]] के कामकाज पर उठल आलोचना आ आंदोलन के बाद धर्मेंद्र प्रधान के इस्तीफा देवे पर, जोशी [[शिक्षा मंत्री (भारत)|शिक्षा मंत्री]] के पद सम्हरलें। एह दौरान ऊ केंद्रीय मंत्रिमंडल में अपना पहिले से मौजूद मंत्रालयन के जिम्मेदारी भी निभावते रहलन।
एह से पहिले जोशी संसदीय कार्य मंत्री भी रहलें। एह पद पर रहत ऊ अनुच्छेद 370 हटावे, नागरिकता संशोधन विधेयक आ कई गो महत्वपूर्ण विधेयक के संसद के दुनो सदन से सुचारु रूप से पारित करावे में प्रमुख भूमिका निभवलें। ऊ 2019 से 2024 तक कोयला मंत्री आ खान मंत्री भी रहलें। जोशी 2004 से लगातार धारवाड़ लोकसभा निर्वाचन क्षेत्र से सांसद बाड़ें। ऊ 2014 से 2016 तक भारतीय जनता पार्टी (भाजपा), कर्नाटक के प्रदेश अध्यक्ष भी रहलें। 2014 से 2018 तक ऊ लोकसभा के सभापति पैनल के सदस्य रहलें।
जोशी सबसे पहिले 1992 से 1994 के बीच चर्चा में अइलें, जब [[आरएसएस|राष्ट्रीय स्वयंसेवक संघ (आरएसएस)]] के साथे मिलके ऊ कर्नाटक के हुबली स्थित ईदगाह मैदान पर भारत के राष्ट्रीय झंडा फहरावे के आंदोलन में शामिल भइलें। बाद में भारत के सुप्रीम कोर्ट कर्नाटक हाई कोर्ट के ओह फैसला के बरकरार रखलस, जवना में ईदगाह मैदान के मालिकाना हक फेर से हुबली-धारवाड़ नगर निगम के दे दिहल गइल रहे। जोशी 2004, 2009, 2014, 2019 आ 2024 के आम चुनाव में [[लोकसभा]] खातिर चुनल जा चुकल बाड़ें।
{{clear}}
== संदर्भ ==
{{Reflist|29em}}
[[श्रेणी:1962 में जनम]]
[[श्रेणी:जियत लोग]]
{{India-politician-stub}}
15l8lbw9887e5koyrkqm6xsx263kjgt
802647
802646
2026-07-26T12:40:21Z
SM7
3953
Protected "[[प्रह्लाद जोशी]]" ([संपादन करीं=Allow only autoconfirmed users] (expires 12:40, 9 अगस्त 2026 (UTC)) [स्थानांतरण=Allow only autoconfirmed users] (expires 12:40, 9 अगस्त 2026 (UTC)))
802646
wikitext
text/x-wiki
{{Infobox officeholder
| image = Pralhad Joshi in 2026.jpg
| image_size = 250
| caption = 2026 में जोशी
| birth_date = {{birth date and age|1962|11|27|df=yes}}
| birth_place = [[बीजापुर]], [[मैसूर राज्य]], भारत<br />(अब के [[कर्नाटक]])
| office = [[शिक्षा मंत्री (भारत)|केंद्रीय शिक्षा मंत्री]]
| prime_minister = [[नरेंद्र मोदी]]
| president = [[द्रौपदी मुर्मू]]
| term_start = {{Start date|2026|07|26|df=yes}}
| term_end =
| predecessor = [[धर्मेंद्र प्रधान]]
| successor =
| office1 = [[उपभोक्ता मामिला, खाद्य आ सार्वजनिक वितरण मंत्रालय|उपभोक्ता मामिला, खाद्य आ सार्वजनिक वितरण खातिर केंद्रीय मंत्री]]
| prime_minister1 = [[नरेंद्र मोदी]]
| term_start1 = {{Start date|2024|06|10|df=yes}}
| term_end1 =
| predecessor1 = [[पीयूष गोयल]]
| successor1 =
| office2 = [[नवीन आ नवीकरणीय ऊर्जा मंत्रालय|केंद्रीय नवीन आ नवीकरणीय ऊर्जा मंत्री]]
| prime_minister2 = [[नरेंद्र मोदी]]
| term_start2 = {{Start date|2024|06|10|df=yes}}
| term_end2 =
| predecessor2 = [[राज कुमार सिंह]]{{Collapsed infobox section begin|Other ministerial offices|titlestyle=border: 1px dashed lightgrey;}}{{Infobox officeholder
| embed = yes
| office3 = [[कोयला मंत्रालय|केंद्रीय कोयला मंत्री]]
| prime_minister3 = नरेंद्र मोदी
| term_start3 = {{Start date|2019|05|30|df=yes}}
| term_end3 = {{End date|2024|06|10|df=yes}}
| predecessor3 = पीयूष गोयल
| successor3 = [[जी. किशन रेड्डी]]
| office4 = [[खान मंत्रालय (भारत)|केंद्रीय खान मंत्री]]
| prime_minister4 = नरेंद्र मोदी
| term_start4 = {{Start date|2019|05|30|df=yes}}
| term_end4 = {{End date|2024|06|10|df=yes}}
| predecessor4 = नरेंद्र सिंह तोमर
| successor4 = जी. किशन रेड्डी
| office5 = [[संसदीय कार्य मंत्रालय (भारत)|केंद्रीय संसदीय कार्य मंत्री]]
| prime_minister5 = नरेंद्र मोदी
| term_start5 = {{Start date|2019|05|30|df=yes}}
| term_end5 = {{End date|2024|06|10|df=yes}}
| predecessor5 = [[नरेंद्र सिंह तोमर]]
| successor5 = [[किरेन रिजिजू]]
{{Collapsed infobox section end}}}}
| office6 = [[भारतीय जनता पार्टी के राज्य अध्यक्षन के लिस्ट|अध्यक्ष]], [[भारतीय जनता पार्टी, कर्नाटक]]
| term_start6 = {{Start date|2012|07|12|df=yes}}
| term_end6 = {{End date|2016|01|12|df=yes}}
| predecessor6 = [[के. एस. ईश्वरप्पा]]
| successor6 = [[बी. एस. येदियुरप्पा]]
| office7 = [[लोक सभा के सांसद|सांसद]], [[लोक सभा]]
| constituency7 = [[धारवाड़ (लोक सभा निर्वाचन क्षेत्र)|धारवाड़, कर्नाटक]]
| term_start7 = {{Start date|2004|05|24|df=yes}}
| predecessor7 = [[विजय संकेश्वर]]
| successor7 =
| party = [[भारतीय जनता पार्टी]]
| spouse = {{marriage|ज्योति जोशी|1992}}
| children = 3
| footnotes =
| occupation = {{hlist|[[राजनेता]]|व्यवसायी}}
| education = श्री कदसिद्धेश्वर आर्ट्स कॉलेज आ एच. एस. कोटांब्री साइंस इंस्टीट्यूट
}}
'''प्रह्लाद वेंकटेश जोशी''' (Pralhad Venkatesh Joshi;<ref>{{Cite web |url=https://www.india.gov.in/my-government/indian-parliament/pralhad-venkatesh-joshi |title=Pralhad Venkatesh Joshi | National Portal of India |website=www.india.gov.in |access-date=24 March 2021 |archive-date=23 April 2021 |archive-url=https://web.archive.org/web/20210423074102/https://www.india.gov.in/my-government/indian-parliament/pralhad-venkatesh-joshi |url-status=live}}</ref> जनम: 27 नवंबर 1962), जिनकर नाँव अक्सरहा '''प्रल्हाद जोशी''' लिखल जाला<ref>{{cite web |title=आरएसएस से जुड़े प्रल्हाद जोशी कौन हैं जिन्हें मिली है शिक्षा मंत्रालय की ज़िम्मेदारी |url=https://www.bbc.com/hindi/articles/cwyqnp8wj7zo |website=BBC News हिंदी |access-date=26 जुलाई 2026 |language=hi |date=26 जुलाई 2026}}</ref> एगो भारतीय राजनेता बाड़ें। ऊ 2024 से उपभोक्ता मामिला, खाद्य आ सार्वजनिक वितरण मंत्री आ नवीन आ नवीकरणीय ऊर्जा मंत्री के रूप में सेवा देत बाड़ें। जुलाई 2026 में [[नीट 2026 पेपर लीक विवाद]] आ [[राष्ट्रीय परीक्षा एजेंसी (एनटीए)]] के कामकाज पर उठल आलोचना आ आंदोलन के बाद धर्मेंद्र प्रधान के इस्तीफा देवे पर, जोशी [[शिक्षा मंत्री (भारत)|शिक्षा मंत्री]] के पद सम्हरलें। एह दौरान ऊ केंद्रीय मंत्रिमंडल में अपना पहिले से मौजूद मंत्रालयन के जिम्मेदारी भी निभावते रहलन।
एह से पहिले जोशी संसदीय कार्य मंत्री भी रहलें। एह पद पर रहत ऊ अनुच्छेद 370 हटावे, नागरिकता संशोधन विधेयक आ कई गो महत्वपूर्ण विधेयक के संसद के दुनो सदन से सुचारु रूप से पारित करावे में प्रमुख भूमिका निभवलें। ऊ 2019 से 2024 तक कोयला मंत्री आ खान मंत्री भी रहलें। जोशी 2004 से लगातार धारवाड़ लोकसभा निर्वाचन क्षेत्र से सांसद बाड़ें। ऊ 2014 से 2016 तक भारतीय जनता पार्टी (भाजपा), कर्नाटक के प्रदेश अध्यक्ष भी रहलें। 2014 से 2018 तक ऊ लोकसभा के सभापति पैनल के सदस्य रहलें।
जोशी सबसे पहिले 1992 से 1994 के बीच चर्चा में अइलें, जब [[आरएसएस|राष्ट्रीय स्वयंसेवक संघ (आरएसएस)]] के साथे मिलके ऊ कर्नाटक के हुबली स्थित ईदगाह मैदान पर भारत के राष्ट्रीय झंडा फहरावे के आंदोलन में शामिल भइलें। बाद में भारत के सुप्रीम कोर्ट कर्नाटक हाई कोर्ट के ओह फैसला के बरकरार रखलस, जवना में ईदगाह मैदान के मालिकाना हक फेर से हुबली-धारवाड़ नगर निगम के दे दिहल गइल रहे। जोशी 2004, 2009, 2014, 2019 आ 2024 के आम चुनाव में [[लोकसभा]] खातिर चुनल जा चुकल बाड़ें।
{{clear}}
== संदर्भ ==
{{Reflist|29em}}
[[श्रेणी:1962 में जनम]]
[[श्रेणी:जियत लोग]]
{{India-politician-stub}}
15l8lbw9887e5koyrkqm6xsx263kjgt
802648
802647
2026-07-26T12:41:37Z
SM7
3953
बाहरी कड़ी जोड़ल गइल
802648
wikitext
text/x-wiki
{{Infobox officeholder
| image = Pralhad Joshi in 2026.jpg
| image_size = 250
| caption = 2026 में जोशी
| birth_date = {{birth date and age|1962|11|27|df=yes}}
| birth_place = [[बीजापुर]], [[मैसूर राज्य]], भारत<br />(अब के [[कर्नाटक]])
| office = [[शिक्षा मंत्री (भारत)|केंद्रीय शिक्षा मंत्री]]
| prime_minister = [[नरेंद्र मोदी]]
| president = [[द्रौपदी मुर्मू]]
| term_start = {{Start date|2026|07|26|df=yes}}
| term_end =
| predecessor = [[धर्मेंद्र प्रधान]]
| successor =
| office1 = [[उपभोक्ता मामिला, खाद्य आ सार्वजनिक वितरण मंत्रालय|उपभोक्ता मामिला, खाद्य आ सार्वजनिक वितरण खातिर केंद्रीय मंत्री]]
| prime_minister1 = [[नरेंद्र मोदी]]
| term_start1 = {{Start date|2024|06|10|df=yes}}
| term_end1 =
| predecessor1 = [[पीयूष गोयल]]
| successor1 =
| office2 = [[नवीन आ नवीकरणीय ऊर्जा मंत्रालय|केंद्रीय नवीन आ नवीकरणीय ऊर्जा मंत्री]]
| prime_minister2 = [[नरेंद्र मोदी]]
| term_start2 = {{Start date|2024|06|10|df=yes}}
| term_end2 =
| predecessor2 = [[राज कुमार सिंह]]{{Collapsed infobox section begin|Other ministerial offices|titlestyle=border: 1px dashed lightgrey;}}{{Infobox officeholder
| embed = yes
| office3 = [[कोयला मंत्रालय|केंद्रीय कोयला मंत्री]]
| prime_minister3 = नरेंद्र मोदी
| term_start3 = {{Start date|2019|05|30|df=yes}}
| term_end3 = {{End date|2024|06|10|df=yes}}
| predecessor3 = पीयूष गोयल
| successor3 = [[जी. किशन रेड्डी]]
| office4 = [[खान मंत्रालय (भारत)|केंद्रीय खान मंत्री]]
| prime_minister4 = नरेंद्र मोदी
| term_start4 = {{Start date|2019|05|30|df=yes}}
| term_end4 = {{End date|2024|06|10|df=yes}}
| predecessor4 = नरेंद्र सिंह तोमर
| successor4 = जी. किशन रेड्डी
| office5 = [[संसदीय कार्य मंत्रालय (भारत)|केंद्रीय संसदीय कार्य मंत्री]]
| prime_minister5 = नरेंद्र मोदी
| term_start5 = {{Start date|2019|05|30|df=yes}}
| term_end5 = {{End date|2024|06|10|df=yes}}
| predecessor5 = [[नरेंद्र सिंह तोमर]]
| successor5 = [[किरेन रिजिजू]]
{{Collapsed infobox section end}}}}
| office6 = [[भारतीय जनता पार्टी के राज्य अध्यक्षन के लिस्ट|अध्यक्ष]], [[भारतीय जनता पार्टी, कर्नाटक]]
| term_start6 = {{Start date|2012|07|12|df=yes}}
| term_end6 = {{End date|2016|01|12|df=yes}}
| predecessor6 = [[के. एस. ईश्वरप्पा]]
| successor6 = [[बी. एस. येदियुरप्पा]]
| office7 = [[लोक सभा के सांसद|सांसद]], [[लोक सभा]]
| constituency7 = [[धारवाड़ (लोक सभा निर्वाचन क्षेत्र)|धारवाड़, कर्नाटक]]
| term_start7 = {{Start date|2004|05|24|df=yes}}
| predecessor7 = [[विजय संकेश्वर]]
| successor7 =
| party = [[भारतीय जनता पार्टी]]
| spouse = {{marriage|ज्योति जोशी|1992}}
| children = 3
| footnotes =
| occupation = {{hlist|[[राजनेता]]|व्यवसायी}}
| education = श्री कदसिद्धेश्वर आर्ट्स कॉलेज आ एच. एस. कोटांब्री साइंस इंस्टीट्यूट
}}
'''प्रह्लाद वेंकटेश जोशी''' (Pralhad Venkatesh Joshi;<ref>{{Cite web |url=https://www.india.gov.in/my-government/indian-parliament/pralhad-venkatesh-joshi |title=Pralhad Venkatesh Joshi | National Portal of India |website=www.india.gov.in |access-date=24 March 2021 |archive-date=23 April 2021 |archive-url=https://web.archive.org/web/20210423074102/https://www.india.gov.in/my-government/indian-parliament/pralhad-venkatesh-joshi |url-status=live}}</ref> जनम: 27 नवंबर 1962), जिनकर नाँव अक्सरहा '''प्रल्हाद जोशी''' लिखल जाला<ref>{{cite web |title=आरएसएस से जुड़े प्रल्हाद जोशी कौन हैं जिन्हें मिली है शिक्षा मंत्रालय की ज़िम्मेदारी |url=https://www.bbc.com/hindi/articles/cwyqnp8wj7zo |website=BBC News हिंदी |access-date=26 जुलाई 2026 |language=hi |date=26 जुलाई 2026}}</ref> एगो भारतीय राजनेता बाड़ें। ऊ 2024 से उपभोक्ता मामिला, खाद्य आ सार्वजनिक वितरण मंत्री आ नवीन आ नवीकरणीय ऊर्जा मंत्री के रूप में सेवा देत बाड़ें। जुलाई 2026 में [[नीट 2026 पेपर लीक विवाद]] आ [[राष्ट्रीय परीक्षा एजेंसी (एनटीए)]] के कामकाज पर उठल आलोचना आ आंदोलन के बाद धर्मेंद्र प्रधान के इस्तीफा देवे पर, जोशी [[शिक्षा मंत्री (भारत)|शिक्षा मंत्री]] के पद सम्हरलें। एह दौरान ऊ केंद्रीय मंत्रिमंडल में अपना पहिले से मौजूद मंत्रालयन के जिम्मेदारी भी निभावते रहलन।
एह से पहिले जोशी संसदीय कार्य मंत्री भी रहलें। एह पद पर रहत ऊ अनुच्छेद 370 हटावे, नागरिकता संशोधन विधेयक आ कई गो महत्वपूर्ण विधेयक के संसद के दुनो सदन से सुचारु रूप से पारित करावे में प्रमुख भूमिका निभवलें। ऊ 2019 से 2024 तक कोयला मंत्री आ खान मंत्री भी रहलें। जोशी 2004 से लगातार धारवाड़ लोकसभा निर्वाचन क्षेत्र से सांसद बाड़ें। ऊ 2014 से 2016 तक भारतीय जनता पार्टी (भाजपा), कर्नाटक के प्रदेश अध्यक्ष भी रहलें। 2014 से 2018 तक ऊ लोकसभा के सभापति पैनल के सदस्य रहलें।
जोशी सबसे पहिले 1992 से 1994 के बीच चर्चा में अइलें, जब [[आरएसएस|राष्ट्रीय स्वयंसेवक संघ (आरएसएस)]] के साथे मिलके ऊ कर्नाटक के हुबली स्थित ईदगाह मैदान पर भारत के राष्ट्रीय झंडा फहरावे के आंदोलन में शामिल भइलें। बाद में भारत के सुप्रीम कोर्ट कर्नाटक हाई कोर्ट के ओह फैसला के बरकरार रखलस, जवना में ईदगाह मैदान के मालिकाना हक फेर से हुबली-धारवाड़ नगर निगम के दे दिहल गइल रहे। जोशी 2004, 2009, 2014, 2019 आ 2024 के आम चुनाव में [[लोकसभा]] खातिर चुनल जा चुकल बाड़ें।
{{clear}}
== संदर्भ ==
{{Reflist|29em}}
== बाहरी कड़ी ==
* [https://karnataka.bjp.org/sri-prahlad-joshi प्रल्हाद जोशी], कर्नाटक बीजेपी के ऑफिशियल वेबसाइट पर प्रोफाइल.
[[श्रेणी:1962 में जनम]]
[[श्रेणी:जियत लोग]]
{{India-politician-stub}}
5qop8dmzw6ewpwummkt779shob4y3bl
802649
802648
2026-07-26T12:42:42Z
SM7
3953
[[विकिपीडिया:हॉट-कैट|हॉट-कैट]] द्वारा [[श्रेणी:भारत के शिक्षा मंत्री]] जोड़ल गइल
802649
wikitext
text/x-wiki
{{Infobox officeholder
| image = Pralhad Joshi in 2026.jpg
| image_size = 250
| caption = 2026 में जोशी
| birth_date = {{birth date and age|1962|11|27|df=yes}}
| birth_place = [[बीजापुर]], [[मैसूर राज्य]], भारत<br />(अब के [[कर्नाटक]])
| office = [[शिक्षा मंत्री (भारत)|केंद्रीय शिक्षा मंत्री]]
| prime_minister = [[नरेंद्र मोदी]]
| president = [[द्रौपदी मुर्मू]]
| term_start = {{Start date|2026|07|26|df=yes}}
| term_end =
| predecessor = [[धर्मेंद्र प्रधान]]
| successor =
| office1 = [[उपभोक्ता मामिला, खाद्य आ सार्वजनिक वितरण मंत्रालय|उपभोक्ता मामिला, खाद्य आ सार्वजनिक वितरण खातिर केंद्रीय मंत्री]]
| prime_minister1 = [[नरेंद्र मोदी]]
| term_start1 = {{Start date|2024|06|10|df=yes}}
| term_end1 =
| predecessor1 = [[पीयूष गोयल]]
| successor1 =
| office2 = [[नवीन आ नवीकरणीय ऊर्जा मंत्रालय|केंद्रीय नवीन आ नवीकरणीय ऊर्जा मंत्री]]
| prime_minister2 = [[नरेंद्र मोदी]]
| term_start2 = {{Start date|2024|06|10|df=yes}}
| term_end2 =
| predecessor2 = [[राज कुमार सिंह]]{{Collapsed infobox section begin|Other ministerial offices|titlestyle=border: 1px dashed lightgrey;}}{{Infobox officeholder
| embed = yes
| office3 = [[कोयला मंत्रालय|केंद्रीय कोयला मंत्री]]
| prime_minister3 = नरेंद्र मोदी
| term_start3 = {{Start date|2019|05|30|df=yes}}
| term_end3 = {{End date|2024|06|10|df=yes}}
| predecessor3 = पीयूष गोयल
| successor3 = [[जी. किशन रेड्डी]]
| office4 = [[खान मंत्रालय (भारत)|केंद्रीय खान मंत्री]]
| prime_minister4 = नरेंद्र मोदी
| term_start4 = {{Start date|2019|05|30|df=yes}}
| term_end4 = {{End date|2024|06|10|df=yes}}
| predecessor4 = नरेंद्र सिंह तोमर
| successor4 = जी. किशन रेड्डी
| office5 = [[संसदीय कार्य मंत्रालय (भारत)|केंद्रीय संसदीय कार्य मंत्री]]
| prime_minister5 = नरेंद्र मोदी
| term_start5 = {{Start date|2019|05|30|df=yes}}
| term_end5 = {{End date|2024|06|10|df=yes}}
| predecessor5 = [[नरेंद्र सिंह तोमर]]
| successor5 = [[किरेन रिजिजू]]
{{Collapsed infobox section end}}}}
| office6 = [[भारतीय जनता पार्टी के राज्य अध्यक्षन के लिस्ट|अध्यक्ष]], [[भारतीय जनता पार्टी, कर्नाटक]]
| term_start6 = {{Start date|2012|07|12|df=yes}}
| term_end6 = {{End date|2016|01|12|df=yes}}
| predecessor6 = [[के. एस. ईश्वरप्पा]]
| successor6 = [[बी. एस. येदियुरप्पा]]
| office7 = [[लोक सभा के सांसद|सांसद]], [[लोक सभा]]
| constituency7 = [[धारवाड़ (लोक सभा निर्वाचन क्षेत्र)|धारवाड़, कर्नाटक]]
| term_start7 = {{Start date|2004|05|24|df=yes}}
| predecessor7 = [[विजय संकेश्वर]]
| successor7 =
| party = [[भारतीय जनता पार्टी]]
| spouse = {{marriage|ज्योति जोशी|1992}}
| children = 3
| footnotes =
| occupation = {{hlist|[[राजनेता]]|व्यवसायी}}
| education = श्री कदसिद्धेश्वर आर्ट्स कॉलेज आ एच. एस. कोटांब्री साइंस इंस्टीट्यूट
}}
'''प्रह्लाद वेंकटेश जोशी''' (Pralhad Venkatesh Joshi;<ref>{{Cite web |url=https://www.india.gov.in/my-government/indian-parliament/pralhad-venkatesh-joshi |title=Pralhad Venkatesh Joshi | National Portal of India |website=www.india.gov.in |access-date=24 March 2021 |archive-date=23 April 2021 |archive-url=https://web.archive.org/web/20210423074102/https://www.india.gov.in/my-government/indian-parliament/pralhad-venkatesh-joshi |url-status=live}}</ref> जनम: 27 नवंबर 1962), जिनकर नाँव अक्सरहा '''प्रल्हाद जोशी''' लिखल जाला<ref>{{cite web |title=आरएसएस से जुड़े प्रल्हाद जोशी कौन हैं जिन्हें मिली है शिक्षा मंत्रालय की ज़िम्मेदारी |url=https://www.bbc.com/hindi/articles/cwyqnp8wj7zo |website=BBC News हिंदी |access-date=26 जुलाई 2026 |language=hi |date=26 जुलाई 2026}}</ref> एगो भारतीय राजनेता बाड़ें। ऊ 2024 से उपभोक्ता मामिला, खाद्य आ सार्वजनिक वितरण मंत्री आ नवीन आ नवीकरणीय ऊर्जा मंत्री के रूप में सेवा देत बाड़ें। जुलाई 2026 में [[नीट 2026 पेपर लीक विवाद]] आ [[राष्ट्रीय परीक्षा एजेंसी (एनटीए)]] के कामकाज पर उठल आलोचना आ आंदोलन के बाद धर्मेंद्र प्रधान के इस्तीफा देवे पर, जोशी [[शिक्षा मंत्री (भारत)|शिक्षा मंत्री]] के पद सम्हरलें। एह दौरान ऊ केंद्रीय मंत्रिमंडल में अपना पहिले से मौजूद मंत्रालयन के जिम्मेदारी भी निभावते रहलन।
एह से पहिले जोशी संसदीय कार्य मंत्री भी रहलें। एह पद पर रहत ऊ अनुच्छेद 370 हटावे, नागरिकता संशोधन विधेयक आ कई गो महत्वपूर्ण विधेयक के संसद के दुनो सदन से सुचारु रूप से पारित करावे में प्रमुख भूमिका निभवलें। ऊ 2019 से 2024 तक कोयला मंत्री आ खान मंत्री भी रहलें। जोशी 2004 से लगातार धारवाड़ लोकसभा निर्वाचन क्षेत्र से सांसद बाड़ें। ऊ 2014 से 2016 तक भारतीय जनता पार्टी (भाजपा), कर्नाटक के प्रदेश अध्यक्ष भी रहलें। 2014 से 2018 तक ऊ लोकसभा के सभापति पैनल के सदस्य रहलें।
जोशी सबसे पहिले 1992 से 1994 के बीच चर्चा में अइलें, जब [[आरएसएस|राष्ट्रीय स्वयंसेवक संघ (आरएसएस)]] के साथे मिलके ऊ कर्नाटक के हुबली स्थित ईदगाह मैदान पर भारत के राष्ट्रीय झंडा फहरावे के आंदोलन में शामिल भइलें। बाद में भारत के सुप्रीम कोर्ट कर्नाटक हाई कोर्ट के ओह फैसला के बरकरार रखलस, जवना में ईदगाह मैदान के मालिकाना हक फेर से हुबली-धारवाड़ नगर निगम के दे दिहल गइल रहे। जोशी 2004, 2009, 2014, 2019 आ 2024 के आम चुनाव में [[लोकसभा]] खातिर चुनल जा चुकल बाड़ें।
{{clear}}
== संदर्भ ==
{{Reflist|29em}}
== बाहरी कड़ी ==
* [https://karnataka.bjp.org/sri-prahlad-joshi प्रल्हाद जोशी], कर्नाटक बीजेपी के ऑफिशियल वेबसाइट पर प्रोफाइल.
[[श्रेणी:1962 में जनम]]
[[श्रेणी:जियत लोग]]
[[श्रेणी:भारत के शिक्षा मंत्री]]
{{India-politician-stub}}
9alwwbb596mow91sows7981ourg0hd0
802653
802649
2026-07-26T12:54:42Z
SM7
3953
बिस्तार कइल गइल / अंग्रेजी से अनुबाद क के
802653
wikitext
text/x-wiki
{{Infobox officeholder
| image = Pralhad Joshi in 2026.jpg
| image_size = 250
| caption = 2026 में जोशी
| birth_date = {{birth date and age|1962|11|27|df=yes}}
| birth_place = [[बीजापुर]], [[मैसूर राज्य]], भारत<br />(अब के [[कर्नाटक]])
| office = [[शिक्षा मंत्री (भारत)|केंद्रीय शिक्षा मंत्री]]
| prime_minister = [[नरेंद्र मोदी]]
| president = [[द्रौपदी मुर्मू]]
| term_start = {{Start date|2026|07|26|df=yes}}
| term_end =
| predecessor = [[धर्मेंद्र प्रधान]]
| successor =
| office1 = [[उपभोक्ता मामिला, खाद्य आ सार्वजनिक वितरण मंत्रालय|उपभोक्ता मामिला, खाद्य आ सार्वजनिक वितरण खातिर केंद्रीय मंत्री]]
| prime_minister1 = [[नरेंद्र मोदी]]
| term_start1 = {{Start date|2024|06|10|df=yes}}
| term_end1 =
| predecessor1 = [[पीयूष गोयल]]
| successor1 =
| office2 = [[नवीन आ नवीकरणीय ऊर्जा मंत्रालय|केंद्रीय नवीन आ नवीकरणीय ऊर्जा मंत्री]]
| prime_minister2 = [[नरेंद्र मोदी]]
| term_start2 = {{Start date|2024|06|10|df=yes}}
| term_end2 =
| predecessor2 = [[राज कुमार सिंह]]{{Collapsed infobox section begin|Other ministerial offices|titlestyle=border: 1px dashed lightgrey;}}{{Infobox officeholder
| embed = yes
| office3 = [[कोयला मंत्रालय|केंद्रीय कोयला मंत्री]]
| prime_minister3 = नरेंद्र मोदी
| term_start3 = {{Start date|2019|05|30|df=yes}}
| term_end3 = {{End date|2024|06|10|df=yes}}
| predecessor3 = पीयूष गोयल
| successor3 = [[जी. किशन रेड्डी]]
| office4 = [[खान मंत्रालय (भारत)|केंद्रीय खान मंत्री]]
| prime_minister4 = नरेंद्र मोदी
| term_start4 = {{Start date|2019|05|30|df=yes}}
| term_end4 = {{End date|2024|06|10|df=yes}}
| predecessor4 = नरेंद्र सिंह तोमर
| successor4 = जी. किशन रेड्डी
| office5 = [[संसदीय कार्य मंत्रालय (भारत)|केंद्रीय संसदीय कार्य मंत्री]]
| prime_minister5 = नरेंद्र मोदी
| term_start5 = {{Start date|2019|05|30|df=yes}}
| term_end5 = {{End date|2024|06|10|df=yes}}
| predecessor5 = [[नरेंद्र सिंह तोमर]]
| successor5 = [[किरेन रिजिजू]]
{{Collapsed infobox section end}}}}
| office6 = [[भारतीय जनता पार्टी के राज्य अध्यक्षन के लिस्ट|अध्यक्ष]], [[भारतीय जनता पार्टी, कर्नाटक]]
| term_start6 = {{Start date|2012|07|12|df=yes}}
| term_end6 = {{End date|2016|01|12|df=yes}}
| predecessor6 = [[के. एस. ईश्वरप्पा]]
| successor6 = [[बी. एस. येदियुरप्पा]]
| office7 = [[लोक सभा के सांसद|सांसद]], [[लोक सभा]]
| constituency7 = [[धारवाड़ (लोक सभा निर्वाचन क्षेत्र)|धारवाड़, कर्नाटक]]
| term_start7 = {{Start date|2004|05|24|df=yes}}
| predecessor7 = [[विजय संकेश्वर]]
| successor7 =
| party = [[भारतीय जनता पार्टी]]
| spouse = {{marriage|ज्योति जोशी|1992}}
| children = 3
| footnotes =
| occupation = {{hlist|[[राजनेता]]|व्यवसायी}}
| education = श्री कदसिद्धेश्वर आर्ट्स कॉलेज आ एच. एस. कोटांब्री साइंस इंस्टीट्यूट
}}
'''प्रह्लाद वेंकटेश जोशी''' (Pralhad Venkatesh Joshi;<ref>{{Cite web |url=https://www.india.gov.in/my-government/indian-parliament/pralhad-venkatesh-joshi |title=Pralhad Venkatesh Joshi | National Portal of India |website=www.india.gov.in |access-date=24 March 2021 |archive-date=23 April 2021 |archive-url=https://web.archive.org/web/20210423074102/https://www.india.gov.in/my-government/indian-parliament/pralhad-venkatesh-joshi |url-status=live}}</ref> जनम: 27 नवंबर 1962), जिनकर नाँव अक्सरहा '''प्रल्हाद जोशी''' लिखल जाला<ref>{{cite web |title=आरएसएस से जुड़े प्रल्हाद जोशी कौन हैं जिन्हें मिली है शिक्षा मंत्रालय की ज़िम्मेदारी |url=https://www.bbc.com/hindi/articles/cwyqnp8wj7zo |website=BBC News हिंदी |access-date=26 जुलाई 2026 |language=hi |date=26 जुलाई 2026}}</ref> एगो भारतीय राजनेता बाड़ें। ऊ 2024 से उपभोक्ता मामिला, खाद्य आ सार्वजनिक वितरण मंत्री आ नवीन आ नवीकरणीय ऊर्जा मंत्री के रूप में सेवा देत बाड़ें। जुलाई 2026 में [[नीट 2026 पेपर लीक विवाद]] आ [[राष्ट्रीय परीक्षा एजेंसी (एनटीए)]] के कामकाज पर उठल आलोचना आ आंदोलन के बाद धर्मेंद्र प्रधान के इस्तीफा देवे पर, जोशी [[शिक्षा मंत्री (भारत)|शिक्षा मंत्री]] के पद सम्हरलें। एह दौरान ऊ केंद्रीय मंत्रिमंडल में अपना पहिले से मौजूद मंत्रालयन के जिम्मेदारी भी निभावते रहलन।
एह से पहिले जोशी संसदीय कार्य मंत्री भी रहलें। एह पद पर रहत ऊ अनुच्छेद 370 हटावे, नागरिकता संशोधन विधेयक आ कई गो महत्वपूर्ण विधेयक के संसद के दुनो सदन से सुचारु रूप से पारित करावे में प्रमुख भूमिका निभवलें। ऊ 2019 से 2024 तक कोयला मंत्री आ खान मंत्री भी रहलें। जोशी 2004 से लगातार धारवाड़ लोकसभा निर्वाचन क्षेत्र से सांसद बाड़ें। ऊ 2014 से 2016 तक भारतीय जनता पार्टी (भाजपा), कर्नाटक के प्रदेश अध्यक्ष भी रहलें। 2014 से 2018 तक ऊ लोकसभा के सभापति पैनल के सदस्य रहलें।
जोशी सबसे पहिले 1992 से 1994 के बीच चर्चा में अइलें, जब [[आरएसएस|राष्ट्रीय स्वयंसेवक संघ (आरएसएस)]] के साथे मिलके ऊ कर्नाटक के हुबली स्थित ईदगाह मैदान पर भारत के राष्ट्रीय झंडा फहरावे के आंदोलन में शामिल भइलें। बाद में भारत के सुप्रीम कोर्ट कर्नाटक हाई कोर्ट के ओह फैसला के बरकरार रखलस, जवना में ईदगाह मैदान के मालिकाना हक फेर से हुबली-धारवाड़ नगर निगम के दे दिहल गइल रहे। जोशी 2004, 2009, 2014, 2019 आ 2024 के आम चुनाव में [[लोकसभा]] खातिर चुनल जा चुकल बाड़ें।
== यूनियन मिनिस्टर ==
30 मई 2019 के प्रह्लाद जोशी केंद्रीय मंत्रिमंडल के मंत्री के रूप में शपथ लिहलें। एह बाद उनकरा के संसदीय कार्य मंत्री, कोयला मंत्री आ खान मंत्री बनावल गइल। ऊ जून 2024 तक एह मंत्रालयन के जिम्मेदारी निभवलें। 2024 के भारतीय आम चुनाव के बाद, जून 2024 में उनकरा के उपभोक्ता मामिला, खाद्य आ सार्वजनिक वितरण मंत्री आ नवीन आ नवीकरणीय ऊर्जा मंत्री बनावल गइल।
2024 के आम चुनाव में धारवाड़ लोकसभा सीट से लगातार पाँचवीं बेर जीत हासिल करके जोशी एह निर्वाचन क्षेत्र से लगातार सबसे बेसी बेर चुनाव जीते वाला उम्मीदवार बन गइलें। हालाँकि, जोशी खुद कहलें कि कम मतांतर से जीतला के कारण ऊ पूरा तरह संतुष्ट ना रहलें।
2026 में नीट प्रश्नपत्र लीक विवाद के खिलाफ देश भर में विद्यार्थी लोग के विरोध प्रदर्शन आ आंदोलन भइल। एह विवाद आ आंदोलन के बाद 25 जुलाई 2026 के शिक्षा मंत्री धर्मेंद्र प्रधान इस्तीफा दे दिहलें। एह बाद प्रह्लाद जोशी के [[शिक्षा मंत्रालय (भारत)|शिक्षा मंत्रालय]] के अतिरिक्त जिम्मेदारी भी सौंप दिहल गइल।
{{clear}}
== संदर्भ ==
{{Reflist|29em}}
== बाहरी कड़ी ==
* [https://karnataka.bjp.org/sri-prahlad-joshi प्रल्हाद जोशी], कर्नाटक बीजेपी के ऑफिशियल वेबसाइट पर प्रोफाइल.
[[श्रेणी:1962 में जनम]]
[[श्रेणी:जियत लोग]]
[[श्रेणी:भारत के शिक्षा मंत्री]]
{{India-politician-stub}}
mlqt7tqr3o2je7u78g44oa5788vl61s
802654
802653
2026-07-26T12:56:56Z
SM7
3953
बिस्तार कइल गइल / अंग्रेजी से अनुबाद क के
802654
wikitext
text/x-wiki
{{Infobox officeholder
| image = Pralhad Joshi in 2026.jpg
| image_size = 250
| caption = 2026 में जोशी
| birth_date = {{birth date and age|1962|11|27|df=yes}}
| birth_place = [[बीजापुर]], [[मैसूर राज्य]], भारत<br />(अब के [[कर्नाटक]])
| office = [[शिक्षा मंत्री (भारत)|केंद्रीय शिक्षा मंत्री]]
| prime_minister = [[नरेंद्र मोदी]]
| president = [[द्रौपदी मुर्मू]]
| term_start = {{Start date|2026|07|26|df=yes}}
| term_end =
| predecessor = [[धर्मेंद्र प्रधान]]
| successor =
| office1 = [[उपभोक्ता मामिला, खाद्य आ सार्वजनिक वितरण मंत्रालय|उपभोक्ता मामिला, खाद्य आ सार्वजनिक वितरण खातिर केंद्रीय मंत्री]]
| prime_minister1 = [[नरेंद्र मोदी]]
| term_start1 = {{Start date|2024|06|10|df=yes}}
| term_end1 =
| predecessor1 = [[पीयूष गोयल]]
| successor1 =
| office2 = [[नवीन आ नवीकरणीय ऊर्जा मंत्रालय|केंद्रीय नवीन आ नवीकरणीय ऊर्जा मंत्री]]
| prime_minister2 = [[नरेंद्र मोदी]]
| term_start2 = {{Start date|2024|06|10|df=yes}}
| term_end2 =
| predecessor2 = [[राज कुमार सिंह]]{{Collapsed infobox section begin|Other ministerial offices|titlestyle=border: 1px dashed lightgrey;}}{{Infobox officeholder
| embed = yes
| office3 = [[कोयला मंत्रालय|केंद्रीय कोयला मंत्री]]
| prime_minister3 = नरेंद्र मोदी
| term_start3 = {{Start date|2019|05|30|df=yes}}
| term_end3 = {{End date|2024|06|10|df=yes}}
| predecessor3 = पीयूष गोयल
| successor3 = [[जी. किशन रेड्डी]]
| office4 = [[खान मंत्रालय (भारत)|केंद्रीय खान मंत्री]]
| prime_minister4 = नरेंद्र मोदी
| term_start4 = {{Start date|2019|05|30|df=yes}}
| term_end4 = {{End date|2024|06|10|df=yes}}
| predecessor4 = नरेंद्र सिंह तोमर
| successor4 = जी. किशन रेड्डी
| office5 = [[संसदीय कार्य मंत्रालय (भारत)|केंद्रीय संसदीय कार्य मंत्री]]
| prime_minister5 = नरेंद्र मोदी
| term_start5 = {{Start date|2019|05|30|df=yes}}
| term_end5 = {{End date|2024|06|10|df=yes}}
| predecessor5 = [[नरेंद्र सिंह तोमर]]
| successor5 = [[किरेन रिजिजू]]
{{Collapsed infobox section end}}}}
| office6 = [[भारतीय जनता पार्टी के राज्य अध्यक्षन के लिस्ट|अध्यक्ष]], [[भारतीय जनता पार्टी, कर्नाटक]]
| term_start6 = {{Start date|2012|07|12|df=yes}}
| term_end6 = {{End date|2016|01|12|df=yes}}
| predecessor6 = [[के. एस. ईश्वरप्पा]]
| successor6 = [[बी. एस. येदियुरप्पा]]
| office7 = [[लोक सभा के सांसद|सांसद]], [[लोक सभा]]
| constituency7 = [[धारवाड़ (लोक सभा निर्वाचन क्षेत्र)|धारवाड़, कर्नाटक]]
| term_start7 = {{Start date|2004|05|24|df=yes}}
| predecessor7 = [[विजय संकेश्वर]]
| successor7 =
| party = [[भारतीय जनता पार्टी]]
| spouse = {{marriage|ज्योति जोशी|1992}}
| children = 3
| footnotes =
| occupation = {{hlist|[[राजनेता]]|व्यवसायी}}
| education = श्री कदसिद्धेश्वर आर्ट्स कॉलेज आ एच. एस. कोटांब्री साइंस इंस्टीट्यूट
}}
'''प्रह्लाद वेंकटेश जोशी''' (Pralhad Venkatesh Joshi;<ref>{{Cite web |url=https://www.india.gov.in/my-government/indian-parliament/pralhad-venkatesh-joshi |title=Pralhad Venkatesh Joshi | National Portal of India |website=www.india.gov.in |access-date=24 March 2021 |archive-date=23 April 2021 |archive-url=https://web.archive.org/web/20210423074102/https://www.india.gov.in/my-government/indian-parliament/pralhad-venkatesh-joshi |url-status=live}}</ref> जनम: 27 नवंबर 1962), जिनकर नाँव अक्सरहा '''प्रल्हाद जोशी''' लिखल जाला<ref>{{cite web |title=आरएसएस से जुड़े प्रल्हाद जोशी कौन हैं जिन्हें मिली है शिक्षा मंत्रालय की ज़िम्मेदारी |url=https://www.bbc.com/hindi/articles/cwyqnp8wj7zo |website=BBC News हिंदी |access-date=26 जुलाई 2026 |language=hi |date=26 जुलाई 2026}}</ref> एगो भारतीय राजनेता बाड़ें। ऊ 2024 से उपभोक्ता मामिला, खाद्य आ सार्वजनिक वितरण मंत्री आ नवीन आ नवीकरणीय ऊर्जा मंत्री के रूप में सेवा देत बाड़ें। जुलाई 2026 में [[नीट 2026 पेपर लीक विवाद]] आ [[राष्ट्रीय परीक्षा एजेंसी (एनटीए)]] के कामकाज पर उठल आलोचना आ आंदोलन के बाद धर्मेंद्र प्रधान के इस्तीफा देवे पर, जोशी [[शिक्षा मंत्री (भारत)|शिक्षा मंत्री]] के पद सम्हरलें। एह दौरान ऊ केंद्रीय मंत्रिमंडल में अपना पहिले से मौजूद मंत्रालयन के जिम्मेदारी भी निभावते रहलन।
एह से पहिले जोशी संसदीय कार्य मंत्री भी रहलें। एह पद पर रहत ऊ अनुच्छेद 370 हटावे, नागरिकता संशोधन विधेयक आ कई गो महत्वपूर्ण विधेयक के संसद के दुनो सदन से सुचारु रूप से पारित करावे में प्रमुख भूमिका निभवलें। ऊ 2019 से 2024 तक कोयला मंत्री आ खान मंत्री भी रहलें। जोशी 2004 से लगातार धारवाड़ लोकसभा निर्वाचन क्षेत्र से सांसद बाड़ें। ऊ 2014 से 2016 तक भारतीय जनता पार्टी (भाजपा), कर्नाटक के प्रदेश अध्यक्ष भी रहलें। 2014 से 2018 तक ऊ लोकसभा के सभापति पैनल के सदस्य रहलें।
जोशी सबसे पहिले 1992 से 1994 के बीच चर्चा में अइलें, जब [[आरएसएस|राष्ट्रीय स्वयंसेवक संघ (आरएसएस)]] के साथे मिलके ऊ कर्नाटक के हुबली स्थित ईदगाह मैदान पर भारत के राष्ट्रीय झंडा फहरावे के आंदोलन में शामिल भइलें। बाद में भारत के सुप्रीम कोर्ट कर्नाटक हाई कोर्ट के ओह फैसला के बरकरार रखलस, जवना में ईदगाह मैदान के मालिकाना हक फेर से हुबली-धारवाड़ नगर निगम के दे दिहल गइल रहे। जोशी 2004, 2009, 2014, 2019 आ 2024 के आम चुनाव में [[लोकसभा]] खातिर चुनल जा चुकल बाड़ें।
== सुरुआती राजनीतिक कैरियर ==
अपने शुरुआती जीवन में उद्योगपति के रूप में काम करे वाला प्रह्लाद जोशी 1992 से 1994 के बीच कर्नाटक के हुबली स्थित ईदगाह मैदान पर तिरंगा फहरावे के आंदोलन के आयोजन करके सक्रिय राजनीति में पहचान बनवलें। एह दौरान ऊ "कश्मीर बचाव आंदोलन" के अगुवाईयो कइलें, जवना से कर्नाटक के ओह इलाकन में उनकर पहचान मजबूत भइल। बाद में ऊ [[भारतीय जनता पार्टी|भारतीय जनता पार्टी (भाजपा)]] के धारवाड़ जिला अध्यक्ष चुनल गइलें। 2004 में ऊ पहिली बेर 14वीं लोकसभा चुनाव लड़लें आ धारवाड़ लोकसभा सीट से [[भारतीय राष्ट्रीय कांग्रेस]] के उम्मीदवार बी. एस. पाटिल के हराके सांसद बनलें।
ओकरा बाद ऊ लगातार कई बेर एह निर्वाचन क्षेत्र से जीत हासिल कइलें आ धारवाड़ के सांसद रहलें। 2009 के आम चुनाव में कर्नाटक के 28 गो लोकसभा सीटन में उनकर जीत के मतांतर दूसरा सबसे बेसी रहल, जबकि ओही चुनाव में कई गो मंत्री आ सांसद चुनाव हार गइल रहलें। 2019 में ऊ एक लाख से बेसी वोट के मतांतर से धारवाड़ सीट फेर जीतलें।
प्रह्लाद जोशी कम उमिरे से [[आरएसएस|राष्ट्रीय स्वयंसेवक संघ (आरएसएस)]] से जुड़ल रहलें।
== यूनियन मिनिस्टर ==
30 मई 2019 के प्रह्लाद जोशी केंद्रीय मंत्रिमंडल के मंत्री के रूप में शपथ लिहलें। एह बाद उनकरा के संसदीय कार्य मंत्री, कोयला मंत्री आ खान मंत्री बनावल गइल। ऊ जून 2024 तक एह मंत्रालयन के जिम्मेदारी निभवलें। 2024 के भारतीय आम चुनाव के बाद, जून 2024 में उनकरा के उपभोक्ता मामिला, खाद्य आ सार्वजनिक वितरण मंत्री आ नवीन आ नवीकरणीय ऊर्जा मंत्री बनावल गइल।
2024 के आम चुनाव में धारवाड़ लोकसभा सीट से लगातार पाँचवीं बेर जीत हासिल करके जोशी एह निर्वाचन क्षेत्र से लगातार सबसे बेसी बेर चुनाव जीते वाला उम्मीदवार बन गइलें। हालाँकि, जोशी खुद कहलें कि कम मतांतर से जीतला के कारण ऊ पूरा तरह संतुष्ट ना रहलें।
2026 में नीट प्रश्नपत्र लीक विवाद के खिलाफ देश भर में विद्यार्थी लोग के विरोध प्रदर्शन आ आंदोलन भइल। एह विवाद आ आंदोलन के बाद 25 जुलाई 2026 के शिक्षा मंत्री धर्मेंद्र प्रधान इस्तीफा दे दिहलें। एह बाद प्रह्लाद जोशी के [[शिक्षा मंत्रालय (भारत)|शिक्षा मंत्रालय]] के अतिरिक्त जिम्मेदारी भी सौंप दिहल गइल।
{{clear}}
== संदर्भ ==
{{Reflist|29em}}
== बाहरी कड़ी ==
* [https://karnataka.bjp.org/sri-prahlad-joshi प्रल्हाद जोशी], कर्नाटक बीजेपी के ऑफिशियल वेबसाइट पर प्रोफाइल.
[[श्रेणी:1962 में जनम]]
[[श्रेणी:जियत लोग]]
[[श्रेणी:भारत के शिक्षा मंत्री]]
{{India-politician-stub}}
fork3yw6kdkhrx64ajc5qojrd8sfr1j
802655
802654
2026-07-26T12:58:45Z
SM7
3953
बिस्तार कइल गइल / अंग्रेजी से अनुबाद क के
802655
wikitext
text/x-wiki
{{Infobox officeholder
| image = Pralhad Joshi in 2026.jpg
| image_size = 250
| caption = 2026 में जोशी
| birth_date = {{birth date and age|1962|11|27|df=yes}}
| birth_place = [[बीजापुर]], [[मैसूर राज्य]], भारत<br />(अब के [[कर्नाटक]])
| office = [[शिक्षा मंत्री (भारत)|केंद्रीय शिक्षा मंत्री]]
| prime_minister = [[नरेंद्र मोदी]]
| president = [[द्रौपदी मुर्मू]]
| term_start = {{Start date|2026|07|26|df=yes}}
| term_end =
| predecessor = [[धर्मेंद्र प्रधान]]
| successor =
| office1 = [[उपभोक्ता मामिला, खाद्य आ सार्वजनिक वितरण मंत्रालय|उपभोक्ता मामिला, खाद्य आ सार्वजनिक वितरण खातिर केंद्रीय मंत्री]]
| prime_minister1 = [[नरेंद्र मोदी]]
| term_start1 = {{Start date|2024|06|10|df=yes}}
| term_end1 =
| predecessor1 = [[पीयूष गोयल]]
| successor1 =
| office2 = [[नवीन आ नवीकरणीय ऊर्जा मंत्रालय|केंद्रीय नवीन आ नवीकरणीय ऊर्जा मंत्री]]
| prime_minister2 = [[नरेंद्र मोदी]]
| term_start2 = {{Start date|2024|06|10|df=yes}}
| term_end2 =
| predecessor2 = [[राज कुमार सिंह]]{{Collapsed infobox section begin|Other ministerial offices|titlestyle=border: 1px dashed lightgrey;}}{{Infobox officeholder
| embed = yes
| office3 = [[कोयला मंत्रालय|केंद्रीय कोयला मंत्री]]
| prime_minister3 = नरेंद्र मोदी
| term_start3 = {{Start date|2019|05|30|df=yes}}
| term_end3 = {{End date|2024|06|10|df=yes}}
| predecessor3 = पीयूष गोयल
| successor3 = [[जी. किशन रेड्डी]]
| office4 = [[खान मंत्रालय (भारत)|केंद्रीय खान मंत्री]]
| prime_minister4 = नरेंद्र मोदी
| term_start4 = {{Start date|2019|05|30|df=yes}}
| term_end4 = {{End date|2024|06|10|df=yes}}
| predecessor4 = नरेंद्र सिंह तोमर
| successor4 = जी. किशन रेड्डी
| office5 = [[संसदीय कार्य मंत्रालय (भारत)|केंद्रीय संसदीय कार्य मंत्री]]
| prime_minister5 = नरेंद्र मोदी
| term_start5 = {{Start date|2019|05|30|df=yes}}
| term_end5 = {{End date|2024|06|10|df=yes}}
| predecessor5 = [[नरेंद्र सिंह तोमर]]
| successor5 = [[किरेन रिजिजू]]
{{Collapsed infobox section end}}}}
| office6 = [[भारतीय जनता पार्टी के राज्य अध्यक्षन के लिस्ट|अध्यक्ष]], [[भारतीय जनता पार्टी, कर्नाटक]]
| term_start6 = {{Start date|2012|07|12|df=yes}}
| term_end6 = {{End date|2016|01|12|df=yes}}
| predecessor6 = [[के. एस. ईश्वरप्पा]]
| successor6 = [[बी. एस. येदियुरप्पा]]
| office7 = [[लोक सभा के सांसद|सांसद]], [[लोक सभा]]
| constituency7 = [[धारवाड़ (लोक सभा निर्वाचन क्षेत्र)|धारवाड़, कर्नाटक]]
| term_start7 = {{Start date|2004|05|24|df=yes}}
| predecessor7 = [[विजय संकेश्वर]]
| successor7 =
| party = [[भारतीय जनता पार्टी]]
| spouse = {{marriage|ज्योति जोशी|1992}}
| children = 3
| footnotes =
| occupation = {{hlist|[[राजनेता]]|व्यवसायी}}
| education = श्री कदसिद्धेश्वर आर्ट्स कॉलेज आ एच. एस. कोटांब्री साइंस इंस्टीट्यूट
}}
'''प्रह्लाद वेंकटेश जोशी''' (Pralhad Venkatesh Joshi;<ref>{{Cite web |url=https://www.india.gov.in/my-government/indian-parliament/pralhad-venkatesh-joshi |title=Pralhad Venkatesh Joshi | National Portal of India |website=www.india.gov.in |access-date=24 March 2021 |archive-date=23 April 2021 |archive-url=https://web.archive.org/web/20210423074102/https://www.india.gov.in/my-government/indian-parliament/pralhad-venkatesh-joshi |url-status=live}}</ref> जनम: 27 नवंबर 1962), जिनकर नाँव अक्सरहा '''प्रल्हाद जोशी''' लिखल जाला<ref>{{cite web |title=आरएसएस से जुड़े प्रल्हाद जोशी कौन हैं जिन्हें मिली है शिक्षा मंत्रालय की ज़िम्मेदारी |url=https://www.bbc.com/hindi/articles/cwyqnp8wj7zo |website=BBC News हिंदी |access-date=26 जुलाई 2026 |language=hi |date=26 जुलाई 2026}}</ref> एगो भारतीय राजनेता बाड़ें। ऊ 2024 से उपभोक्ता मामिला, खाद्य आ सार्वजनिक वितरण मंत्री आ नवीन आ नवीकरणीय ऊर्जा मंत्री के रूप में सेवा देत बाड़ें। जुलाई 2026 में [[नीट 2026 पेपर लीक विवाद]] आ [[राष्ट्रीय परीक्षा एजेंसी (एनटीए)]] के कामकाज पर उठल आलोचना आ आंदोलन के बाद धर्मेंद्र प्रधान के इस्तीफा देवे पर, जोशी [[शिक्षा मंत्री (भारत)|शिक्षा मंत्री]] के पद सम्हरलें। एह दौरान ऊ केंद्रीय मंत्रिमंडल में अपना पहिले से मौजूद मंत्रालयन के जिम्मेदारी भी निभावते रहलन।
एह से पहिले जोशी संसदीय कार्य मंत्री भी रहलें। एह पद पर रहत ऊ अनुच्छेद 370 हटावे, नागरिकता संशोधन विधेयक आ कई गो महत्वपूर्ण विधेयक के संसद के दुनो सदन से सुचारु रूप से पारित करावे में प्रमुख भूमिका निभवलें। ऊ 2019 से 2024 तक कोयला मंत्री आ खान मंत्री भी रहलें। जोशी 2004 से लगातार धारवाड़ लोकसभा निर्वाचन क्षेत्र से सांसद बाड़ें। ऊ 2014 से 2016 तक भारतीय जनता पार्टी (भाजपा), कर्नाटक के प्रदेश अध्यक्ष भी रहलें। 2014 से 2018 तक ऊ लोकसभा के सभापति पैनल के सदस्य रहलें।
जोशी सबसे पहिले 1992 से 1994 के बीच चर्चा में अइलें, जब [[आरएसएस|राष्ट्रीय स्वयंसेवक संघ (आरएसएस)]] के साथे मिलके ऊ कर्नाटक के हुबली स्थित ईदगाह मैदान पर भारत के राष्ट्रीय झंडा फहरावे के आंदोलन में शामिल भइलें। बाद में भारत के सुप्रीम कोर्ट कर्नाटक हाई कोर्ट के ओह फैसला के बरकरार रखलस, जवना में ईदगाह मैदान के मालिकाना हक फेर से हुबली-धारवाड़ नगर निगम के दे दिहल गइल रहे। जोशी 2004, 2009, 2014, 2019 आ 2024 के आम चुनाव में [[लोकसभा]] खातिर चुनल जा चुकल बाड़ें।
== सुरुआती जिनगी ==
प्रह्लाद जोशी के जनम 27 नवंबर 1962 के भारत के तत्कालीन मैसूर राज (अब कर्नाटक) के बीजापुर में भइल रहे। उनकर बाबूजी के नाम वेंकटेश जोशी आ माई के नाम मालतीबाई जोशी रहे। उनकर बाबूजी [[भारतीय रेल]] में कर्मचारी रहलें, आ प्रह्लाद जोशी अपना माई-बाबूजी के तीसर संतान बाड़ें।
जोशी अपना शुरुआती पढ़ाई रेलवे स्कूल से कइलें। एह बाद ऊ हुब्बली के न्यू इंग्लिश स्कूल से माध्यमिक शिक्षा पूरा कइलें। उच्च शिक्षा खातिर ऊ हुबलिये के श्री कदसिद्धेश्वर आर्ट्स कॉलेज से ग्रेजुएशन के डिग्री हासिल कइलें।
== सुरुआती राजनीतिक कैरियर ==
अपने शुरुआती जीवन में उद्योगपति के रूप में काम करे वाला प्रह्लाद जोशी 1992 से 1994 के बीच कर्नाटक के हुबली स्थित ईदगाह मैदान पर तिरंगा फहरावे के आंदोलन के आयोजन करके सक्रिय राजनीति में पहचान बनवलें। एह दौरान ऊ "कश्मीर बचाव आंदोलन" के अगुवाईयो कइलें, जवना से कर्नाटक के ओह इलाकन में उनकर पहचान मजबूत भइल। बाद में ऊ [[भारतीय जनता पार्टी|भारतीय जनता पार्टी (भाजपा)]] के धारवाड़ जिला अध्यक्ष चुनल गइलें। 2004 में ऊ पहिली बेर 14वीं लोकसभा चुनाव लड़लें आ धारवाड़ लोकसभा सीट से [[भारतीय राष्ट्रीय कांग्रेस]] के उम्मीदवार बी. एस. पाटिल के हराके सांसद बनलें।
ओकरा बाद ऊ लगातार कई बेर एह निर्वाचन क्षेत्र से जीत हासिल कइलें आ धारवाड़ के सांसद रहलें। 2009 के आम चुनाव में कर्नाटक के 28 गो लोकसभा सीटन में उनकर जीत के मतांतर दूसरा सबसे बेसी रहल, जबकि ओही चुनाव में कई गो मंत्री आ सांसद चुनाव हार गइल रहलें। 2019 में ऊ एक लाख से बेसी वोट के मतांतर से धारवाड़ सीट फेर जीतलें।
प्रह्लाद जोशी कम उमिरे से [[आरएसएस|राष्ट्रीय स्वयंसेवक संघ (आरएसएस)]] से जुड़ल रहलें।
== यूनियन मिनिस्टर ==
30 मई 2019 के प्रह्लाद जोशी केंद्रीय मंत्रिमंडल के मंत्री के रूप में शपथ लिहलें। एह बाद उनकरा के संसदीय कार्य मंत्री, कोयला मंत्री आ खान मंत्री बनावल गइल। ऊ जून 2024 तक एह मंत्रालयन के जिम्मेदारी निभवलें। 2024 के भारतीय आम चुनाव के बाद, जून 2024 में उनकरा के उपभोक्ता मामिला, खाद्य आ सार्वजनिक वितरण मंत्री आ नवीन आ नवीकरणीय ऊर्जा मंत्री बनावल गइल।
2024 के आम चुनाव में धारवाड़ लोकसभा सीट से लगातार पाँचवीं बेर जीत हासिल करके जोशी एह निर्वाचन क्षेत्र से लगातार सबसे बेसी बेर चुनाव जीते वाला उम्मीदवार बन गइलें। हालाँकि, जोशी खुद कहलें कि कम मतांतर से जीतला के कारण ऊ पूरा तरह संतुष्ट ना रहलें।
2026 में नीट प्रश्नपत्र लीक विवाद के खिलाफ देश भर में विद्यार्थी लोग के विरोध प्रदर्शन आ आंदोलन भइल। एह विवाद आ आंदोलन के बाद 25 जुलाई 2026 के शिक्षा मंत्री धर्मेंद्र प्रधान इस्तीफा दे दिहलें। एह बाद प्रह्लाद जोशी के [[शिक्षा मंत्रालय (भारत)|शिक्षा मंत्रालय]] के अतिरिक्त जिम्मेदारी भी सौंप दिहल गइल।
{{clear}}
== संदर्भ ==
{{Reflist|29em}}
== बाहरी कड़ी ==
* [https://karnataka.bjp.org/sri-prahlad-joshi प्रल्हाद जोशी], कर्नाटक बीजेपी के ऑफिशियल वेबसाइट पर प्रोफाइल.
[[श्रेणी:1962 में जनम]]
[[श्रेणी:जियत लोग]]
[[श्रेणी:भारत के शिक्षा मंत्री]]
{{India-politician-stub}}
p8xckyjukaqlmgeskyu8ahu8y0a4mv8
802656
802655
2026-07-26T12:59:19Z
SM7
3953
[[विकिपीडिया:हॉट-कैट|हॉट-कैट]] द्वारा [[श्रेणी:कर्नाटक के लोग]] जोड़ल गइल
802656
wikitext
text/x-wiki
{{Infobox officeholder
| image = Pralhad Joshi in 2026.jpg
| image_size = 250
| caption = 2026 में जोशी
| birth_date = {{birth date and age|1962|11|27|df=yes}}
| birth_place = [[बीजापुर]], [[मैसूर राज्य]], भारत<br />(अब के [[कर्नाटक]])
| office = [[शिक्षा मंत्री (भारत)|केंद्रीय शिक्षा मंत्री]]
| prime_minister = [[नरेंद्र मोदी]]
| president = [[द्रौपदी मुर्मू]]
| term_start = {{Start date|2026|07|26|df=yes}}
| term_end =
| predecessor = [[धर्मेंद्र प्रधान]]
| successor =
| office1 = [[उपभोक्ता मामिला, खाद्य आ सार्वजनिक वितरण मंत्रालय|उपभोक्ता मामिला, खाद्य आ सार्वजनिक वितरण खातिर केंद्रीय मंत्री]]
| prime_minister1 = [[नरेंद्र मोदी]]
| term_start1 = {{Start date|2024|06|10|df=yes}}
| term_end1 =
| predecessor1 = [[पीयूष गोयल]]
| successor1 =
| office2 = [[नवीन आ नवीकरणीय ऊर्जा मंत्रालय|केंद्रीय नवीन आ नवीकरणीय ऊर्जा मंत्री]]
| prime_minister2 = [[नरेंद्र मोदी]]
| term_start2 = {{Start date|2024|06|10|df=yes}}
| term_end2 =
| predecessor2 = [[राज कुमार सिंह]]{{Collapsed infobox section begin|Other ministerial offices|titlestyle=border: 1px dashed lightgrey;}}{{Infobox officeholder
| embed = yes
| office3 = [[कोयला मंत्रालय|केंद्रीय कोयला मंत्री]]
| prime_minister3 = नरेंद्र मोदी
| term_start3 = {{Start date|2019|05|30|df=yes}}
| term_end3 = {{End date|2024|06|10|df=yes}}
| predecessor3 = पीयूष गोयल
| successor3 = [[जी. किशन रेड्डी]]
| office4 = [[खान मंत्रालय (भारत)|केंद्रीय खान मंत्री]]
| prime_minister4 = नरेंद्र मोदी
| term_start4 = {{Start date|2019|05|30|df=yes}}
| term_end4 = {{End date|2024|06|10|df=yes}}
| predecessor4 = नरेंद्र सिंह तोमर
| successor4 = जी. किशन रेड्डी
| office5 = [[संसदीय कार्य मंत्रालय (भारत)|केंद्रीय संसदीय कार्य मंत्री]]
| prime_minister5 = नरेंद्र मोदी
| term_start5 = {{Start date|2019|05|30|df=yes}}
| term_end5 = {{End date|2024|06|10|df=yes}}
| predecessor5 = [[नरेंद्र सिंह तोमर]]
| successor5 = [[किरेन रिजिजू]]
{{Collapsed infobox section end}}}}
| office6 = [[भारतीय जनता पार्टी के राज्य अध्यक्षन के लिस्ट|अध्यक्ष]], [[भारतीय जनता पार्टी, कर्नाटक]]
| term_start6 = {{Start date|2012|07|12|df=yes}}
| term_end6 = {{End date|2016|01|12|df=yes}}
| predecessor6 = [[के. एस. ईश्वरप्पा]]
| successor6 = [[बी. एस. येदियुरप्पा]]
| office7 = [[लोक सभा के सांसद|सांसद]], [[लोक सभा]]
| constituency7 = [[धारवाड़ (लोक सभा निर्वाचन क्षेत्र)|धारवाड़, कर्नाटक]]
| term_start7 = {{Start date|2004|05|24|df=yes}}
| predecessor7 = [[विजय संकेश्वर]]
| successor7 =
| party = [[भारतीय जनता पार्टी]]
| spouse = {{marriage|ज्योति जोशी|1992}}
| children = 3
| footnotes =
| occupation = {{hlist|[[राजनेता]]|व्यवसायी}}
| education = श्री कदसिद्धेश्वर आर्ट्स कॉलेज आ एच. एस. कोटांब्री साइंस इंस्टीट्यूट
}}
'''प्रह्लाद वेंकटेश जोशी''' (Pralhad Venkatesh Joshi;<ref>{{Cite web |url=https://www.india.gov.in/my-government/indian-parliament/pralhad-venkatesh-joshi |title=Pralhad Venkatesh Joshi | National Portal of India |website=www.india.gov.in |access-date=24 March 2021 |archive-date=23 April 2021 |archive-url=https://web.archive.org/web/20210423074102/https://www.india.gov.in/my-government/indian-parliament/pralhad-venkatesh-joshi |url-status=live}}</ref> जनम: 27 नवंबर 1962), जिनकर नाँव अक्सरहा '''प्रल्हाद जोशी''' लिखल जाला<ref>{{cite web |title=आरएसएस से जुड़े प्रल्हाद जोशी कौन हैं जिन्हें मिली है शिक्षा मंत्रालय की ज़िम्मेदारी |url=https://www.bbc.com/hindi/articles/cwyqnp8wj7zo |website=BBC News हिंदी |access-date=26 जुलाई 2026 |language=hi |date=26 जुलाई 2026}}</ref> एगो भारतीय राजनेता बाड़ें। ऊ 2024 से उपभोक्ता मामिला, खाद्य आ सार्वजनिक वितरण मंत्री आ नवीन आ नवीकरणीय ऊर्जा मंत्री के रूप में सेवा देत बाड़ें। जुलाई 2026 में [[नीट 2026 पेपर लीक विवाद]] आ [[राष्ट्रीय परीक्षा एजेंसी (एनटीए)]] के कामकाज पर उठल आलोचना आ आंदोलन के बाद धर्मेंद्र प्रधान के इस्तीफा देवे पर, जोशी [[शिक्षा मंत्री (भारत)|शिक्षा मंत्री]] के पद सम्हरलें। एह दौरान ऊ केंद्रीय मंत्रिमंडल में अपना पहिले से मौजूद मंत्रालयन के जिम्मेदारी भी निभावते रहलन।
एह से पहिले जोशी संसदीय कार्य मंत्री भी रहलें। एह पद पर रहत ऊ अनुच्छेद 370 हटावे, नागरिकता संशोधन विधेयक आ कई गो महत्वपूर्ण विधेयक के संसद के दुनो सदन से सुचारु रूप से पारित करावे में प्रमुख भूमिका निभवलें। ऊ 2019 से 2024 तक कोयला मंत्री आ खान मंत्री भी रहलें। जोशी 2004 से लगातार धारवाड़ लोकसभा निर्वाचन क्षेत्र से सांसद बाड़ें। ऊ 2014 से 2016 तक भारतीय जनता पार्टी (भाजपा), कर्नाटक के प्रदेश अध्यक्ष भी रहलें। 2014 से 2018 तक ऊ लोकसभा के सभापति पैनल के सदस्य रहलें।
जोशी सबसे पहिले 1992 से 1994 के बीच चर्चा में अइलें, जब [[आरएसएस|राष्ट्रीय स्वयंसेवक संघ (आरएसएस)]] के साथे मिलके ऊ कर्नाटक के हुबली स्थित ईदगाह मैदान पर भारत के राष्ट्रीय झंडा फहरावे के आंदोलन में शामिल भइलें। बाद में भारत के सुप्रीम कोर्ट कर्नाटक हाई कोर्ट के ओह फैसला के बरकरार रखलस, जवना में ईदगाह मैदान के मालिकाना हक फेर से हुबली-धारवाड़ नगर निगम के दे दिहल गइल रहे। जोशी 2004, 2009, 2014, 2019 आ 2024 के आम चुनाव में [[लोकसभा]] खातिर चुनल जा चुकल बाड़ें।
== सुरुआती जिनगी ==
प्रह्लाद जोशी के जनम 27 नवंबर 1962 के भारत के तत्कालीन मैसूर राज (अब कर्नाटक) के बीजापुर में भइल रहे। उनकर बाबूजी के नाम वेंकटेश जोशी आ माई के नाम मालतीबाई जोशी रहे। उनकर बाबूजी [[भारतीय रेल]] में कर्मचारी रहलें, आ प्रह्लाद जोशी अपना माई-बाबूजी के तीसर संतान बाड़ें।
जोशी अपना शुरुआती पढ़ाई रेलवे स्कूल से कइलें। एह बाद ऊ हुब्बली के न्यू इंग्लिश स्कूल से माध्यमिक शिक्षा पूरा कइलें। उच्च शिक्षा खातिर ऊ हुबलिये के श्री कदसिद्धेश्वर आर्ट्स कॉलेज से ग्रेजुएशन के डिग्री हासिल कइलें।
== सुरुआती राजनीतिक कैरियर ==
अपने शुरुआती जीवन में उद्योगपति के रूप में काम करे वाला प्रह्लाद जोशी 1992 से 1994 के बीच कर्नाटक के हुबली स्थित ईदगाह मैदान पर तिरंगा फहरावे के आंदोलन के आयोजन करके सक्रिय राजनीति में पहचान बनवलें। एह दौरान ऊ "कश्मीर बचाव आंदोलन" के अगुवाईयो कइलें, जवना से कर्नाटक के ओह इलाकन में उनकर पहचान मजबूत भइल। बाद में ऊ [[भारतीय जनता पार्टी|भारतीय जनता पार्टी (भाजपा)]] के धारवाड़ जिला अध्यक्ष चुनल गइलें। 2004 में ऊ पहिली बेर 14वीं लोकसभा चुनाव लड़लें आ धारवाड़ लोकसभा सीट से [[भारतीय राष्ट्रीय कांग्रेस]] के उम्मीदवार बी. एस. पाटिल के हराके सांसद बनलें।
ओकरा बाद ऊ लगातार कई बेर एह निर्वाचन क्षेत्र से जीत हासिल कइलें आ धारवाड़ के सांसद रहलें। 2009 के आम चुनाव में कर्नाटक के 28 गो लोकसभा सीटन में उनकर जीत के मतांतर दूसरा सबसे बेसी रहल, जबकि ओही चुनाव में कई गो मंत्री आ सांसद चुनाव हार गइल रहलें। 2019 में ऊ एक लाख से बेसी वोट के मतांतर से धारवाड़ सीट फेर जीतलें।
प्रह्लाद जोशी कम उमिरे से [[आरएसएस|राष्ट्रीय स्वयंसेवक संघ (आरएसएस)]] से जुड़ल रहलें।
== यूनियन मिनिस्टर ==
30 मई 2019 के प्रह्लाद जोशी केंद्रीय मंत्रिमंडल के मंत्री के रूप में शपथ लिहलें। एह बाद उनकरा के संसदीय कार्य मंत्री, कोयला मंत्री आ खान मंत्री बनावल गइल। ऊ जून 2024 तक एह मंत्रालयन के जिम्मेदारी निभवलें। 2024 के भारतीय आम चुनाव के बाद, जून 2024 में उनकरा के उपभोक्ता मामिला, खाद्य आ सार्वजनिक वितरण मंत्री आ नवीन आ नवीकरणीय ऊर्जा मंत्री बनावल गइल।
2024 के आम चुनाव में धारवाड़ लोकसभा सीट से लगातार पाँचवीं बेर जीत हासिल करके जोशी एह निर्वाचन क्षेत्र से लगातार सबसे बेसी बेर चुनाव जीते वाला उम्मीदवार बन गइलें। हालाँकि, जोशी खुद कहलें कि कम मतांतर से जीतला के कारण ऊ पूरा तरह संतुष्ट ना रहलें।
2026 में नीट प्रश्नपत्र लीक विवाद के खिलाफ देश भर में विद्यार्थी लोग के विरोध प्रदर्शन आ आंदोलन भइल। एह विवाद आ आंदोलन के बाद 25 जुलाई 2026 के शिक्षा मंत्री धर्मेंद्र प्रधान इस्तीफा दे दिहलें। एह बाद प्रह्लाद जोशी के [[शिक्षा मंत्रालय (भारत)|शिक्षा मंत्रालय]] के अतिरिक्त जिम्मेदारी भी सौंप दिहल गइल।
{{clear}}
== संदर्भ ==
{{Reflist|29em}}
== बाहरी कड़ी ==
* [https://karnataka.bjp.org/sri-prahlad-joshi प्रल्हाद जोशी], कर्नाटक बीजेपी के ऑफिशियल वेबसाइट पर प्रोफाइल.
[[श्रेणी:1962 में जनम]]
[[श्रेणी:जियत लोग]]
[[श्रेणी:भारत के शिक्षा मंत्री]]
[[श्रेणी:कर्नाटक के लोग]]
{{India-politician-stub}}
biurtx48x9g2c5wq35198u7c67c4kq2
शिक्षा मंत्री (भारत)
0
101318
802650
2026-07-26T12:43:59Z
SM7
3953
पन्ना बनावल गइल "'''शिक्षा मंत्री''', जेकरा के 1985 से 2020 तक '''मानव संसाधन विकास मंत्री''' कहल जात रहे, [[भारत सरकार]] के शिक्षा मंत्रालय के मुखिया होलें। ऊ केंद्रीय मंत्रिमंडल के सदस्य होलें आ भा..." के साथ
802650
wikitext
text/x-wiki
'''शिक्षा मंत्री''', जेकरा के 1985 से 2020 तक '''मानव संसाधन विकास मंत्री''' कहल जात रहे, [[भारत सरकार]] के शिक्षा मंत्रालय के मुखिया होलें। ऊ केंद्रीय मंत्रिमंडल के सदस्य होलें आ भारत सरकार के केंद्रीय मंत्रिमंडल के महत्वपूर्ण मंत्रालयन में से एगो के जिम्मेदारी सँभारेलें।
[[श्रेणी:भारत सरकार]]
6hf03kq26i9x5a8b3zpezfegk4w8r0i
802651
802650
2026-07-26T12:46:02Z
SM7
3953
[[User:SM7/stubsorter|Stubsorter]] के मदद से {{India-gov-stub}} जोड़ल गइल।
802651
wikitext
text/x-wiki
'''शिक्षा मंत्री''', जेकरा के 1985 से 2020 तक '''मानव संसाधन विकास मंत्री''' कहल जात रहे, [[भारत सरकार]] के शिक्षा मंत्रालय के मुखिया होलें। ऊ केंद्रीय मंत्रिमंडल के सदस्य होलें आ भारत सरकार के केंद्रीय मंत्रिमंडल के महत्वपूर्ण मंत्रालयन में से एगो के जिम्मेदारी सँभारेलें।
[[श्रेणी:भारत सरकार]]
{{India-gov-stub}}
3caeled1185hayo6l1h9duq9cxf6gag
802652
802651
2026-07-26T12:49:38Z
SM7
3953
ज्ञानसंदूक जोड़ल गइल
802652
wikitext
text/x-wiki
{{Infobox official post
| post = शिक्षा मंत्री
| body =
| native_name = {{transliteration|hi|Śikṣā Mantrī}}
| flag = Flag of India.svg
| flagsize = 100px
| flagborder = yes
| flagcaption = [[भारत के झंडा]]
| insignia = Ministry of Education India.svg
| insigniasize = 150px
| insigniacaption = भारत सरकार के शिक्षा मंत्रालय के लोगो
| alt =
| incumbent = [[प्रह्लाद जोशी]]
| incumbentsince = 26 जुलाई 2026
| type = भारत सरकार के कार्यपालिका शाखा के सदस्य
| department = [[शिक्षा मंत्रालय (भारत)|शिक्षा मंत्रालय]]
| style = माननीय
| member_of = [[भारत के केंद्रीय मंत्रिमंडल]]<br>[[भारत के संसद]]
| reports_to = [[भारत के राष्ट्रपति]]<br>[[भारत के प्रधानमंत्री]]<br>[[भारत के संसद]]
| residence =
| seat = कर्तव्य भवन-2, [[नई दिल्ली]]
| nominator = [[भारत के प्रधानमंत्री]]
| appointer = [[भारत के राष्ट्रपति]]
| appointer_qualified = [[भारत के प्रधानमंत्री|प्रधानमंत्री]] के सलाह पर
| termlength = 5 बरिस (फेर से नियुक्ति हो सकेला)
| termlength_qualified =
| constituting_instrument =
| precursor =
| formation = 15 अगस्त 1947
| first = [[मौलाना अबुल कलाम आजाद]]
| last =
| abolished =
| succession =
| abbreviation =
| unofficial_names =
| deputy =
| salary =
| website =
| image = Pralhad Joshi in 2026.jpg
| imagesize = 220px
}}
'''शिक्षा मंत्री''', जेकरा के 1985 से 2020 तक '''मानव संसाधन विकास मंत्री''' कहल जात रहे, [[भारत सरकार]] के शिक्षा मंत्रालय के मुखिया होलें। ऊ केंद्रीय मंत्रिमंडल के सदस्य होलें आ भारत सरकार के केंद्रीय मंत्रिमंडल के महत्वपूर्ण मंत्रालयन में से एगो के जिम्मेदारी सँभारेलें। जुलाई 2026 से एह पद पर [[प्रह्लाद जोशी]] कार्यभार निभावत बाड़ें।
{{clear}}
== संदर्भ ==
{{Reflist|29em}}
[[श्रेणी:भारत सरकार]]
{{India-gov-stub}}
bnycqmgncqfkehho7af66p2hlgtna8z
भारतीय राज्यन के वर्तमान मुख्यमंत्री लोग के लिस्ट
0
101319
802659
2026-07-26T19:24:01Z
SM7
3953
पन्ना [[भारतीय राज्यन के वर्तमान मुख्यमंत्री लोगन के लिस्ट]] पर अनुप्रेषित कइल गइल
802659
wikitext
text/x-wiki
#REDIRECT [[भारतीय राज्यन के वर्तमान मुख्यमंत्री लोगन के लिस्ट]]
8exix7h0p3ngzb0c90ipophsq1bzeau
802660
802659
2026-07-26T19:24:43Z
SM7
3953
Added {{[[:Template:R from alternative spelling|R from alternative spelling]]}} tag to redirect
802660
wikitext
text/x-wiki
#REDIRECT [[भारतीय राज्यन के वर्तमान मुख्यमंत्री लोगन के लिस्ट]]
{{Redirect category shell|
{{R from alternative spelling}}
}}
oquowheaa8dkr6j2i3osuvr66t65khd
प्रयोगकर्ता वार्ता:Shubhsamant09
3
101320
802682
2026-07-27T09:33:03Z
Deepfriedokra
24587
Deepfriedokra पन्ना [[प्रयोगकर्ता वार्ता:Shubhsamant09]] के [[प्रयोगकर्ता वार्ता:Matthewmurdock]] पर स्थानांतरण कइलें: प्रयोगकर्ता के नाँव बदलाव के दौरान पन्ना "[[Special:CentralAuth/Shubhsamant09|Shubhsamant09]]" से "[[Special:CentralAuth/Matthewmurdock|Matthewmurdock]]" पर ऑटोमेटिक रूप से स्थानांतरित भइल।
802682
wikitext
text/x-wiki
#REDIRECT [[प्रयोगकर्ता वार्ता:Matthewmurdock]]
71mh3v6draqhyt1k7xgjscx8ku9aigo