Module:ColorParse: Difference between revisions

Jump to navigation Jump to search
3,810 bytes added ,  02:22, 29 December 2020
m
no edit summary
imported>Teamtotobot
((by SublimeText.Mediawiker))
mNo edit summary
(45 intermediate revisions by 2 users not shown)
Line 2: Line 2:


local luatable = require'Module:Color'
local luatable = require'Module:Color'
local textutil = require'Module:Text Utility'
local process_args = require'Module:ProcessArgs'
local process_args = require'Module:ProcessArgs'
local shaders = require'Module:ColorParse/Templates'
local stringbyte, stringchar = string.byte, string.char


--[Utility stuff]--
--[Utility stuff]--


function normalize(string, type)
function normalize(input, type)
   type = type or ''
   type = type or 'xml'
   local b = string.gsub(string,"(~J211)", "")
   local b = clean(input)
   b = b:gsub("(%*)", "*")
   local a = '&y'
   if type == '' then
   if type == 'notxml' then
     b = string.gsub(b,"([{}])", "")
     a = '&y'
  elseif type == 'notxml' then
    b = string.gsub(b,"(\\n)","\n")
   end
   end
  if not b:match('^%&') then
    b = a .. b
  end
  b = b:gsub("(\\n)","\n")
  return b
end
function clean(input)
  local b = input:gsub("(~J211)", "")
  b = b:gsub("([{}])", "")
   return b
   return b
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
end




function p.linebreaks(frame)
function p.linebreaks(frame)
   local b = string.gsub(frame,"(~)","\n\n")
   local b = string.gsub(frame,"(~)","\n")
   return b
   return b
end
end


--[ The main function. Takes the first argument and snips out stuff we don't need
--[ The main function. Takes the first argument and snips out stuff we don't need
--[ depending on regextype.
--[ depending on regextype.
function p.parse(frame, regextype)
function p.parse(frame, regextype)
   args = frame.args or {[1] = frame}
   args = frame.args or {[1] = frame}
   regextype = regextype
   regextype = regextype
   if regextype == nil then
   if regextype == nil then
     if args[1]:match('&') ~= nil then
     if p.determinexml(args[1]) then
      regextype = ''
      regextype = 'xml'
      args[1] = args[1]:gsub('amp;', '')
     else
     else
      regextype = 'notxml'
      regextype = 'notxml'
     end
     end
   end
   end
   --[Determine regex type]
   --[Determine regex type]
   local regex = "&(%w)([^&\n]*)"
   local regex = "&(%w)([^&\n]*)"
  if regextype == 'notxml' then
  regex = "&(%w)([^&\n]*)"
  end


   local b = normalize(args[1],regextype)
   local b = normalize(args[1],regextype)
Line 56: Line 84:
return a
return a
end
end


function p.main(frame)
function p.main(frame)
local notxml = nil
 
local parsetype = nil
   local unbolded = false
   local unbolded = false
   local tildes = false
   local tildes = false
  local text = ''
  local args = process_args.merge(true)
  local args = process_args.merge(true)
  for _, arg in ipairs(args) do
  for _, arg in ipairs(args) do
p.setVar(_, arg)
     if arg == 'notxml' then
     if arg == 'notxml' then
         notxml = 'notxml'
         parsetype = 'notxml'
       elseif arg == 'unbolded' then
       elseif arg == 'unbolded' then
         unbolded = true
         unbolded = true
       elseif arg == 'tildes are new lines' then
       elseif arg == 'tildes are new lines' then
         tildes = true
         tildes = true
        elseif text == '' then
        text = arg
       end
       end
   end
   end
      
      
   local returntext = p.parse(args[1], notxml)
   local returntext = p.parse(text, parsetype)
   if tildes  == true then  
   if tildes  == true then  
     returntext = p.linebreaks(returntext)
     returntext = p.linebreaks(returntext)
Line 80: Line 112:
     return returntext
     return returntext
   else
   else
    return '<b>' .. returntext or '' .. '</b>'
  return '<b>' .. (returntext or '') .. '</b>'
   end
   end
end
end


function p.setVar(var, val)
 
mw.getCurrentFrame():callParserFunction('#vardefine:' .. var, val)
-- Shader Parse --
return val
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 f + #strtbl == 3 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
    if bordered == true then
      ci = #colorlist
    end
    for i=1, #strtbl do
      if ci > #colorlist or ci <= 0 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] = "&amp;" .. hexcolor .. strtbl[i]
          end
      if i%interval == 0 then
          if bordered == true then
              ci = ci - 1
          else
              ci = ci + 1
          end
      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)
  if shaders[shader] == nil then
      error('There was no shader called ' .. (shader or '') .. '!')
  else
      return p.shader(text, shaders[shader][1], shaders[shader][2], raster)
  end
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
 
 
function p.test()
    --return p.shader('Stopsvalinn', 'R-r-K-y-Y', 'sequence')
    return applytemplate('soul', 'soulcurding')
end
end


return p
return p

Navigation menu