Module:Base64: Difference between revisions

From Celeste Wiki
Jump to navigation Jump to search
Content added Content deleted
No edit summary
No edit summary
 
(7 intermediate revisions by the same user not shown)
Line 16: Line 16:
args = frame
args = frame
end
end
data = args.data
data = frame.args.data
encode = args.encode
encode = frame.args.encode
yesno(encode, false)
yesno(encode, false)


return "Sorry, I gave up that time"
local index_table = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'

function to_binary(integer)
local remaining = tonumber(integer)
local bin_bits = ''

for i = 7, 0, -1 do
local current_power = 2 ^ i

if remaining >= current_power then
bin_bits = bin_bits .. '1'
remaining = remaining - current_power
else
bin_bits = bin_bits .. '0'
end
end

return bin_bits
end

function from_binary(bin_bits)
return tonumber(bin_bits, 2)
end


function to_base64(to_encode)
local bit_pattern = ''
local encoded = ''
local trailing = ''

for i = 1, string.len(to_encode) do
bit_pattern = bit_pattern .. to_binary(string.byte(string.sub(to_encode, i, i)))
end

-- Check the number of bytes. If it's not evenly divisible by three,
-- zero-pad the ending & append on the correct number of ``=``s.
if string.len(bit_pattern) % 3 == 2 then
trailing = '=='
bit_pattern = bit_pattern .. '0000000000000000'
elseif string.len(bit_pattern) % 3 == 1 then
trailing = '='
bit_pattern = bit_pattern .. '00000000'
end

for i = 1, string.len(bit_pattern), 6 do
local byte = string.sub(bit_pattern, i, i+5)
local offset = tonumber(from_binary(byte))
encoded = encoded .. string.sub(index_table, offset+1, offset+1)
end

local result = string.sub(encoded, 1, -1 - string.len(trailing)) .. trailing
return(result)
end


function from_base64(to_decode)
local padded = to_decode:gsub("%s", "")
local unpadded = padded:gsub("=", "")
local bit_pattern = ''
local decoded = ''

for i = 1, string.len(unpadded) do
local char = string.sub(to_decode, i, i)
local offset, _ = string.find(index_table, char)
if offset == nil then
error("Invalid character '" .. char .. "' found.")
end

bit_pattern = bit_pattern .. string.sub(to_binary(offset-1), 3)
end

for i = 1, string.len(bit_pattern), 8 do
local byte = string.sub(bit_pattern, i, i+7)
decoded = decoded .. string.char(from_binary(byte))
end

local padding_length = padded:len()-unpadded:len()

if (padding_length == 1 or padding_length == 2) then
decoded = decoded:sub(1,-2)
end
return decoded
end


if (encode == true) then
to_base64(data)
else
from_base64(data)
local result = data
return(result)
end
end
end



Latest revision as of 15:48, 14 January 2021

Documentation for this module may be created at Module:Base64/doc

-- Made by [[User:Celeste]] - Licensed under GPLv3

local p = {}

local yesno = require('Module:Yesno') -- invoke Yesno

local b='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/' -- You will need this for encoding/decoding

function p.base64(frame)
	local args
	local data
	local encode
	if frame == mw.getCurrentFrame() then
    	args = frame.args
	else
    	args = frame
	end
	data = frame.args.data
	encode = frame.args.encode
	yesno(encode, false)

	return "Sorry, I gave up that time"
end

return p