|
|
(10 intermediate revisions by the same user not shown) |
Line 1: |
Line 1: |
| local p = {} | | local cargo = mw.ext.cargo |
| | local util_cargo = require('Module:Cargo Utility') |
| | local infobox = require('Module:Infobox') |
|
| |
|
| local luatable = require'Module:Color'
| |
| local textutil = require'Module:Text Utility'
| |
| local process_args = require'Module:ProcessArgs'
| |
| local shaders = require'Module:ColorParse/Templates'
| |
| local stringbyte, stringchar = string.byte, string.char
| |
| local shader_to_class = {
| |
| ['y'] = 'y-dark',
| |
| ['Y'] = 'y',
| |
| ['b'] = 'b-dark',
| |
| ['B'] = 'b',
| |
| ['c'] = 'c-dark',
| |
| ['C'] = 'c',
| |
| ['r'] = 'r-dark',
| |
| ['R'] = 'r',
| |
| ['o'] = 'o-dark',
| |
| ['O'] = 'o',
| |
| ['w'] = 'w-dark',
| |
| ['W'] = 'w',
| |
| ['g'] = 'g-dark',
| |
| ['G'] = 'g',
| |
| ['m'] = 'm-dark',
| |
| ['M'] = 'M',
| |
| ['k'] = 'k-dark',
| |
| ['K'] = 'k',
| |
| ['Y-y-y-K-K-y-y-Y'] = 'scanning'
| |
| }
| |
|
| |
|
| --[Utility stuff]--
| | local p = {} |
| | local h = {} |
|
| |
|
| function normalize(input, type)
| |
| type = type or 'xml'
| |
| local b = clean(input)
| |
| local a = '&y'
| |
| if type == 'notxml' then
| |
| a = '&y'
| |
| end
| |
| if not b:match('^%&') then
| |
| b = a .. b
| |
| end
| |
| b = b:gsub("(\\n)","\n")
| |
| return b
| |
| end
| |
|
| |
|
| | | function p.Declare(frame) |
| function clean(input) | | -- [ Declare ItemsTable ] |
| local b = input:gsub("(~J211)", "")
| | local tablename = 'ItemsTable' |
| b = b:gsub("([{}])", "")
| | local args = { |
| return b
| | ['BasePV']='Integer', |
| | ['MaxPV']='Integer', |
| | ['Vibro']='Boolean', |
| | ['PoweredPV']='Boolean', |
| | ['Damage']='String', |
| | ['UnpoweredDamage']='String', |
| | ['PrimaryDamageElement']='String', |
| | ['HP']='Integer', |
| | ['AV']='Integer', |
| | ['DV']='Integer', |
| | ['MA']='Integer', |
| | ['ToHit']='Integer', |
| | ['Skill']='String', |
| | ['ObjectID']='String', |
| | ['AgilityBonus']='Integer', |
| | ['StrengthBonus']='Integer', |
| | ['WillpowerBonus']='Integer', |
| | ['ToughnessBonus']='Integer', |
| | ['IntelligenceBonus']='Integer', |
| | ['EgoBonus']='Integer', |
| | ['Description']='Wikitext', |
| | ['WornOn']='String', |
| | ['UsesSlots']='List (,) of String', |
| | ['Healing']='String', |
| | ['HarvestedInto']='String', |
| | ['PreservedInto']='Page', |
| | ['PreservedQuantity']='Integer', |
| | ['ElementalDamage']='String', |
| | ['ElementalType']='String', |
| | ['JoinKey']='String' |
| | } |
| | local results = cargo.declare(table, args) |
| end | | end |
|
| |
|
| |
| function p.determinexml(input)
| |
| return (input:match('&') ~= nil)
| |
| end
| |
|
| |
|
| |
| function strtotbl(str)
| |
| tbl = {stringbyte(str, 1, #str)}
| |
| for i = 1, #tbl do
| |
| tbl[i] = stringchar(tbl[i])
| |
| end
| |
| return tbl
| |
| end
| |
|
| |
|
| |
| function p.linebreaks(frame)
| |
| local b = string.gsub(frame,"(~)","\n")
| |
| return b
| |
| end
| |
|
| |
|
| |
| --[ The main function. Takes the first argument and snips out stuff we don't need
| |
| --[ depending on regextype.
| |
| function p.parse(frame, regextype)
| |
| args = frame.args or {[1] = frame}
| |
| regextype = regextype
| |
| if regextype == nil then
| |
| if p.determinexml(args[1]) then
| |
| regextype = 'xml'
| |
| else
| |
| regextype = 'notxml'
| |
| end
| |
| end
| |
| --[Determine regex type]
| |
| local regex = "&(%w)([^&\n]*)"
| |
| if regextype == 'notxml' then
| |
| regex = "&(%w)([^&\n]*)"
| |
| end
| |
|
| |
| local b = normalize(args[1],regextype)
| |
| local a = string.gsub(b, regex, function(color,text)
| |
| if text ~= nil and text ~= "" then
| |
| local hexcolor = luatable.parse(color)
| |
| if hexcolor == nil then
| |
| error ("There was no specified color for color code: " .. color)
| |
| end
| |
| text = text or ""
| |
| return "<span style=\"color: " .. hexcolor .. ";\">" .. text .. "</span>"
| |
| else
| |
| return ""
| |
| end
| |
| end)
| |
| return a
| |
| end
| |
|
| |
|
| |
|
| function p.main(frame) | | function p.main(frame) |
| | | -- [Process arguments. Header and image work ok, but |
| local parsetype = nil | | -- additional logic is needed to separate the other args into rows] |
| local unbolded = false
| | local args = require( 'Module:ProcessArgs' ).merge( true ) |
| local tildes = false
| | local infoboxargs = { |
| local text = ''
| | ['class'] = 'qud-item-infobox', |
| local args = process_args.merge(true)
| | ['rows'] = args['rows'] |
| for _, arg in ipairs(args) do
| | } |
| if arg == 'notxml' then
| | |
| parsetype = 'notxml'
| | return infobox.infobox(args) |
| elseif arg == 'unbolded' then
| |
| unbolded = true
| |
| elseif arg == 'tildes are new lines' then
| |
| tildes = true
| |
| elseif text == '' then
| |
| text = arg
| |
| end
| |
| end
| |
|
| |
| local returntext = p.parse(text, parsetype)
| |
| if tildes == true then
| |
| returntext = p.linebreaks(returntext)
| |
| end
| |
| if unbolded == true then
| |
| return returntext
| |
| else
| |
| return '<b>' .. (returntext or '') .. '</b>'
| |
| end
| |
| end
| |
| | |
| | |
| -- Shader Parse -- | |
| function p.shader(text, colors, type, rasterize)
| |
| -- split the colors into a list
| |
| local colorlist = textutil.split(colors, '-')
| |
| -- check shader type:
| |
| -- default | if pattern is shorter than text, text will remain uncolored (y)
| |
| -- sequence | pattern will repeat until text is over
| |
| -- alternation | pattern will stretch to fit word length (?)
| |
| local type = type or 'default'
| |
| local brasterize = false
| |
| if rasterize == 'true' then
| |
| brasterize = true
| |
| end
| |
| local strtbl = strtotbl(text)
| |
| local finaltbl = {}
| |
| local interval = 1
| |
| local bordered = false
| |
| local overflowbehavior = function(f) return 'y' end
| |
| if type == 'alternation' then
| |
| interval = math.floor(#strtbl/#colorlist) --sets interval that color code switches.
| |
| if interval <= 0 then interval = 1 end
| |
| overflowbehavior = function(f) return colorlist[#colorlist] end
| |
| elseif type == 'sequence' or type == 'solid' then
| |
| overflowbehavior = function(f)
| |
| local e = f%#colorlist
| |
| if e == 0 then e = #colorlist end
| |
| return colorlist[e]
| |
| end
| |
| elseif type == 'bordered' then
| |
| bordered = true
| |
| overflowbehavior = function(f)
| |
| -- If it's the first or last character, use the second color, otherwise use the first.
| |
| if #strtbl - f <= 0 or f == 1 then return colorlist[2] else return colorlist[1] end
| |
| end
| |
| elseif type == 'chaotic' then
| |
| overflowbehavior = function(f) return 'y' end -- placeholder
| |
| end
| |
| local ci = 1
| |
| for i=1, #strtbl do
| |
| if ci > #colorlist or ci <= 0 or bordered == true then
| |
| hexcolor = overflowbehavior(ci)
| |
| else
| |
| hexcolor = colorlist[ci]
| |
| end
| |
| if brasterize then
| |
| finaltbl[i] = "<span style=\"color: " .. luatable.parse(hexcolor) .. ";\">" .. strtbl[i].. "</span>"
| |
| else
| |
| finaltbl[i] = "&" .. hexcolor .. strtbl[i]
| |
| end
| |
| if i%interval == 0 then
| |
| ci = ci + 1
| |
| end
| |
| end
| |
| return table.concat(finaltbl)
| |
| end
| |
| | |
| function p.shadermain(frame)
| |
| local args = process_args.merge(true)
| |
| if args[1] and args[2] then -- shader template
| |
| output = applytemplate(args[1], clean(args[2]), (args['rasterize'] or 'true'))
| |
| else
| |
| output = p.shader(clean(args['text']), args['colors'], args['type'], (args['rasterize'] or 'true'))
| |
| end
| |
| | |
| if (args['unbolded'] == 'true') then
| |
| return output
| |
| else
| |
| return '<b>' .. (output or '') .. '</b>'
| |
| end
| |
| end
| |
| | |
| | |
| function applytemplate(shader, text, raster)
| |
| class = shader_to_class[shader]
| |
| if class ~= nil then
| |
| shader = class
| |
| end
| |
| return '<span class=\"qud-text ' .. shader .. '\">' .. text .. '</span>'
| |
| end
| |
| | |
| | |
| function p.shaderlist()
| |
| local tblheader = '<tr><th>Shader</th><th>Colors</th><th>Type</th></tr>'
| |
| local tr = {}
| |
| i = 0
| |
| for a, v in pairs(shaders) do
| |
| tr[i] = ' <tr><td><b>' .. applytemplate(a, a, 'true') .. '</b></td><td>' .. v[1] .. '</td><td>' .. v[2] .. '</td></tr>'
| |
| i = i + 1
| |
| end
| |
| return '<table class="wikitable sortable">' .. tblheader .. table.concat(tr) .. '</table>'
| |
| end | | end |
|
| |
|
| | | function h.addrow(row) |
| function p.test()
| | -- [ Add html row with given table. I basically just rewrote |
| return p.shader('Spiked', 'R-Y', 'bordered')
| | -- Template:Infobox row in lua. likely needs to be refactored] |
| --return applytemplate('soul', 'soulcurding')
| | local output = {} |
| | local label = row[1] |
| | local class = row['class'] |
| | local field = row[2] |
| | |
| | if label then |
| | output.append('! <div style="text-align:left" class="Searchaux"> '.. label .. '</div>\n') |
| | end |
| | output.append('|') |
| | if class then |
| | output.append('class="'.. class .. '"') |
| | end |
| | if not label then |
| | output.append('colspan="2"') |
| | end |
| | output.append('\n|' .. field .. '\n|-') |
| | |
| end | | end |
|
| |
| return p | | return p |
local cargo = mw.ext.cargo
local util_cargo = require('Module:Cargo Utility')
local infobox = require('Module:Infobox')
local p = {}
local h = {}
function p.Declare(frame)
-- [ Declare ItemsTable ]
local tablename = 'ItemsTable'
local args = {
['BasePV']='Integer',
['MaxPV']='Integer',
['Vibro']='Boolean',
['PoweredPV']='Boolean',
['Damage']='String',
['UnpoweredDamage']='String',
['PrimaryDamageElement']='String',
['HP']='Integer',
['AV']='Integer',
['DV']='Integer',
['MA']='Integer',
['ToHit']='Integer',
['Skill']='String',
['ObjectID']='String',
['AgilityBonus']='Integer',
['StrengthBonus']='Integer',
['WillpowerBonus']='Integer',
['ToughnessBonus']='Integer',
['IntelligenceBonus']='Integer',
['EgoBonus']='Integer',
['Description']='Wikitext',
['WornOn']='String',
['UsesSlots']='List (,) of String',
['Healing']='String',
['HarvestedInto']='String',
['PreservedInto']='Page',
['PreservedQuantity']='Integer',
['ElementalDamage']='String',
['ElementalType']='String',
['JoinKey']='String'
}
local results = cargo.declare(table, args)
end
function p.main(frame)
-- [Process arguments. Header and image work ok, but
-- additional logic is needed to separate the other args into rows]
local args = require( 'Module:ProcessArgs' ).merge( true )
local infoboxargs = {
['class'] = 'qud-item-infobox',
['rows'] = args['rows']
}
return infobox.infobox(args)
end
function h.addrow(row)
-- [ Add html row with given table. I basically just rewrote
-- Template:Infobox row in lua. likely needs to be refactored]
local output = {}
local label = row[1]
local class = row['class']
local field = row[2]
if label then
output.append('! <div style="text-align:left" class="Searchaux"> '.. label .. '</div>\n')
end
output.append('|')
if class then
output.append('class="'.. class .. '"')
end
if not label then
output.append('colspan="2"')
end
output.append('\n|' .. field .. '\n|-')
end
return p