Module:Advancement: Difference between revisions
Jump to navigation
Jump to search
Created page with "local advancement_page = 'Advancement' local p = {} local namespace = mw.title.getCurrentTitle().nsText local page_title = mw.title.getCurrentTitle().text local full_title = mw.title.getCurrentTitle().fullText local html local frame local function sanitize(str) -- remove anything between < and > (simple way to remove span tag) -- return lower case alpha numeric characters and spaces return mw.text.trim(str:gsub('<.->',''):gsub('[^%w%s]*', ''):lower()) end -- Adds o..." |
No edit summary |
||
| (2 intermediate revisions by the same user not shown) | |||
| Line 27: | Line 27: | ||
local title_extra = '' | local title_extra = '' | ||
if line.upcoming_ver then | -- if line.upcoming_ver then | ||
-- title_extra = title_extra .. frame:expandTemplate{title = 'Upcoming', args = {ver = line.upcoming_ver}} | |||
end | -- end | ||
if line.until_ver then | -- if line.until_ver then | ||
-- title_extra = title_extra .. frame:expandTemplate{title = 'Until', args = {ver = line.until_ver}} | |||
end | -- end | ||
tr:tag('td'):wikitext('[['..(link or full_title)..'|'..line.title..']]', title_extra) | tr:tag('td'):wikitext('[['..(link or full_title)..'|'..line.title..']]', title_extra) | ||
| Line 62: | Line 62: | ||
line.game_description = mw.text.unstrip(line.game_description) | line.game_description = mw.text.unstrip(line.game_description) | ||
bucket('advancement').put({ | -- bucket('advancement').put({ | ||
-- title = sanitized_title, | |||
-- json = mw.text.jsonEncode(line) -- serializes all data into a json blob | |||
}) | -- }) | ||
end | end | ||
Latest revision as of 20:53, 29 January 2026
Documentation for this module may be created at Module:Advancement/doc
local advancement_page = 'Advancement'
local p = {}
local namespace = mw.title.getCurrentTitle().nsText
local page_title = mw.title.getCurrentTitle().text
local full_title = mw.title.getCurrentTitle().fullText
local html
local frame
local function sanitize(str)
-- remove anything between < and > (simple way to remove span tag)
-- return lower case alpha numeric characters and spaces
return mw.text.trim(str:gsub('<.->',''):gsub('[^%w%s]*', ''):lower())
end
-- Adds one row of advancement data to html object
local function printLine(line, is_input)
local tr = html:tag('tr'):attr('id', line.title):cssText('text-align:left')
local link = nil
if not is_input then
link = advancement_page..'#'..line.title
end
local image = require('Module:Aicon').aIcon( line.image, line.background, 'raw', (link or '') )
tr:tag('td'):wikitext(image)
local title_extra = ''
-- if line.upcoming_ver then
-- title_extra = title_extra .. frame:expandTemplate{title = 'Upcoming', args = {ver = line.upcoming_ver}}
-- end
-- if line.until_ver then
-- title_extra = title_extra .. frame:expandTemplate{title = 'Until', args = {ver = line.until_ver}}
-- end
tr:tag('td'):wikitext('[['..(link or full_title)..'|'..line.title..']]', title_extra)
tr:tag('td'):wikitext(line.game_description)
if is_input then -- These are only displayed on the input page, not on individual content pages
tr:tag('td'):wikitext(line.parent)
end
tr:tag('td'):wikitext(line.wiki_description)
if is_input then -- These are only displayed on the input page, not on individual content pages
tr:tag('td'):attr('id', line.internal_id):wikitext('<code>', line.internal_id, '</code>')
tr:tag('td'):wikitext(line.reward)
end
end
-- Puts one line of data into Bucket for later querying
local function storeLine(line)
-- Put data into Bucket
-- The only top level params that are needed is stuff that would be used as selectors
-- everything else is put into a json blob for flexibility
if not (namespace == '' or namespace == 'Minecraft_Wiki') then
return -- only store data if we are in main or Minecraft_Wiki namespaces
end
local sanitized_title = sanitize(line.title)
-- mw.text.unstrip gets rid of parser artifacts that are put there when a <ref> tag is used.
line.wiki_description = mw.text.unstrip(line.wiki_description)
line.game_description = mw.text.unstrip(line.game_description)
-- bucket('advancement').put({
-- title = sanitized_title,
-- json = mw.text.jsonEncode(line) -- serializes all data into a json blob
-- })
end
-- Public function - Called by {{AdvancementRow}}
function p.inputLine(_frame)
frame = _frame -- store frame for later use by expandTemplate
local args = frame:getParent().args
-- Normalize inputs and set defaults
local line = {
title = args['title'], -- name
background = args['bg'] or 'plain', -- background for icon
upcoming_ver = args['upcoming'], -- version where advancement will be introduced
until_ver = args['until'], -- version where advancement will be removed
image = mw.text.trim(args[1]),
game_description = mw.text.trim(args[2]),
parent = mw.text.trim(args[3]),
wiki_description = mw.text.trim(args[4]),
internal_id = mw.text.trim(args[5] or '—'),
reward = mw.text.trim(args[6] or '—')
}
html = mw.html.create()
printLine(line, true)
storeLine(line)
return html
end
local function printHeader(header_text, short_header, collapsed)
if collapsed then
collapsed = ' collapsed'
else
collapsed = ''
end
-- Can't use table tag because it will close itself, but we need to close it with footer
html = mw.html.create():wikitext('<div style="overflow: auto;"><table class="wikitable collapsible', collapsed, '" style="text-align:center">')
if header_text and header_text ~= '' then
html:tag('th')
:attr('colspan', 7)
:attr('data-description', header_text)
:wikitext(header_text)
end
local tr = html:tag('tr')
tr:tag('th'):wikitext('Icon')
tr:tag('th'):wikitext('Advancement')
tr:tag('th'):wikitext('In-game description')
if not short_header then
tr:tag('th'):wikitext('Parent')
end
tr:tag('th'):wikitext('Actual requirements (if different)')
if not short_header then
tr:tag('th'):wikitext('[[Resource location]]')
tr:tag('th'):wikitext('Rewards')
end
return html
end
local function printFooter()
return '</table></div>'
end
-- Public function - called by {{AdvancementTable}}
function p.table(frame)
local args = frame:getParent().args
if args[1] == 'foot' then
return printFooter()
else
return printHeader(args[1], false, args['collapsed'])
end
end
-- Public function - called by {{Load advancements}}
function p.load(frame_)
frame = frame_ -- store frame for later use by expandTemplate
local args = frame:getParent().args
advancement_page = args.page or advancement_page
printHeader('', true, false)
local conditions = {}
for name in string.gmatch(args[1], "[^;]+") do
conditions[#conditions + 1] = {'title', sanitize(name)}
end
local query = bucket('advancement')
.select('title', 'json')
.where('page_name', advancement_page)
.where(bucket.Or(unpack(conditions)))
.run()
if query then
for i, v in ipairs(query) do
local line = mw.text.jsonDecode(v['json'] or '{}')
printLine(line, false)
end
end
if #conditions ~= #query then
html:wikitext('[[Category:Missing advancement]]')
end
html:wikitext(printFooter())
return html
end
return p