Module:Lockbox/sandbox: Difference between revisions
Appearance
Content deleted Content added
add a comment about what is going on |
improve comment, and don't transclude the parent title |
||
Line 17: | Line 17: | ||
local output = {} |
local output = {} |
||
-- |
-- Check if the transcluding page is cascade-protected. |
||
-- |
|||
-- XXX: unfortunately there is no other way; title.protectionLevels does not report cascading protection status |
|||
⚫ | |||
⚫ | |||
⚫ | |||
-- transclusion from the lockbox to itself, so that it will have an entry |
|||
-- for itself in CASCADINGSOURCES. |
|||
-- |
|||
-- We cannot generate this transclusion using the title object for the |
|||
-- parent title (the lockbox), as if the lockbox is transcluded on another |
|||
-- page, we will generate a transclusion *from* the lockbox *to* that page |
|||
-- as well, and the page will be cascade-protected. Instead we generate it |
|||
-- with the title object for the current title. |
|||
-- |
|||
⚫ | |||
-- lockbox page), this creates the required entry in the link table in the |
|||
-- database. When the current title is the grandparent title or up (i.e. we |
|||
-- are rendering a page transcluding the lockbox), transclusions are only |
|||
-- created from the page itself, not from the lockbox, and it is not |
|||
-- cascade-protected. |
|||
-- |
|||
-- This creates an extaneous self-transclusion for all pages using the |
|||
-- module, but we treat that as a necessary evil. |
|||
-- |
|||
-- XXX: there seems to be no way to check for cascading protection using a |
|||
-- Scribunto API, so we have to use frame:preprocess with the |
|||
-- CASCADINGSOURCES parser function. |
|||
do |
do |
||
local parent_title = frame:getParent():getTitle() |
|||
⚫ | |||
⚫ | |||
⚫ | |||
-- current page transclude itself. If the current title is the parent |
|||
-- title, this will add an entry for it to CASCADINGSOURCES. If the |
|||
⚫ | |||
-- cascade-protected itself as the page will not be parsed. (And that's |
|||
-- a good job, as parsing it would cause a template loop.) |
|||
mw.title.getCurrentTitle():getContent() -- Generate self-transclusion |
mw.title.getCurrentTitle():getContent() -- Generate self-transclusion |
||
local parent_title = frame:getParent():getTitle() |
|||
if frame:preprocess("{{CASCADINGSOURCES:" .. parent_title .. "}}") == "" then |
if frame:preprocess("{{CASCADINGSOURCES:" .. parent_title .. "}}") == "" then |
||
output[#output + 1] = '<strong class="warning">Warning: the page "' .. parent_title .. '" is not cascade-protected.</strong>\n' |
output[#output + 1] = '<strong class="warning">Warning: the page "' .. parent_title .. '" is not cascade-protected.</strong>\n' |
Revision as of 02:33, 17 March 2017
![]() | This is the module sandbox page for Module:Lockbox (diff). |
local export = {}
-- XXX: OUTRAGEOUS ABUSE OF SCRIBUNTO API
-- generates a transclusion without incrementing the "expensive function" count
local generate_transclusion
do
local mock_title = mw.title.new(mw.title.getCurrentTitle().id)
local getContent = mock_title.getContent
function generate_transclusion(title)
rawset(mock_title, 'fullText', title)
getContent(mock_title)
end
-- I can do the same thing without rawset.
end
function export.lock(frame)
local output = {}
-- Check if the transcluding page is cascade-protected.
--
-- Only pages transcluded from a cascade-protected page appear in
-- CASCADINGSOURCES, so normally we would not be able to tell if the lockbox
-- itself is cascade-protected. To work around this, we generate a
-- transclusion from the lockbox to itself, so that it will have an entry
-- for itself in CASCADINGSOURCES.
--
-- We cannot generate this transclusion using the title object for the
-- parent title (the lockbox), as if the lockbox is transcluded on another
-- page, we will generate a transclusion *from* the lockbox *to* that page
-- as well, and the page will be cascade-protected. Instead we generate it
-- with the title object for the current title.
--
-- When the current title is the parent title (i.e. we are rendering the
-- lockbox page), this creates the required entry in the link table in the
-- database. When the current title is the grandparent title or up (i.e. we
-- are rendering a page transcluding the lockbox), transclusions are only
-- created from the page itself, not from the lockbox, and it is not
-- cascade-protected.
--
-- This creates an extaneous self-transclusion for all pages using the
-- module, but we treat that as a necessary evil.
--
-- XXX: there seems to be no way to check for cascading protection using a
-- Scribunto API, so we have to use frame:preprocess with the
-- CASCADINGSOURCES parser function.
do
mw.title.getCurrentTitle():getContent() -- Generate self-transclusion
local parent_title = frame:getParent():getTitle()
if frame:preprocess("{{CASCADINGSOURCES:" .. parent_title .. "}}") == "" then
output[#output + 1] = '<strong class="warning">Warning: the page "' .. parent_title .. '" is not cascade-protected.</strong>\n'
end
end
local match = string.match
for _, item in ipairs(frame.args) do
item = mw.text.trim(item)
local ns, rest = match(item, "^(.-):(.*)")
if not ns or not mw.site.namespaces[ns] then
generate_transclusion('Template:' .. item)
output[#output + 1] = '* [[Template:' .. item .. ']]'
elseif (ns == "File") or (ns == "Image") then
generate_transclusion(item)
output[#output + 1] = '* [[:' .. item .. ']]'
elseif ns == "Category" then
generate_transclusion(item)
output[#output + 1] = '* [[:' .. item .. ']]'
elseif rest ~= '' then
generate_transclusion(item)
output[#output + 1] = '* [[' .. item .. ']]'
end
end
if frame.args.silent then
return ""
else
return table.concat(output, '\n')
end
end
return export