Moduł:Sandbox/Ksawi999/Koduj

Moduł służy do kodowania i dekodowania tekstu. Posiada on dwie funkcje: code (kodującą) i decode (dekodującą). Szablon implementujący ten moduł posiada również funkcję repair, która pozwala na "naprawienie" kodu przestarzałego lub zakodowanego w inny sposób. Pierwszy parametr (po nazwie funkcji) to tekst, który moduł ma zakodować, drugi parametr to klucz kodowania, a trzeci, opcjonalny parametr dotyczy sposobu kodowania (c, / lub * i ich dowolne kombinacje) i nie będzie uwzględniony przy dekodowaniu (aby rozkodować tekst nie trzeba pamiętać jakim sposobem się go zakodowało). Sposób kodowania "c" optymalizuje tekst do skopiowania i użycia w innym, niezależnym szablonie (zamienia | na | i = na =). Sposób kodowania "/" dodaje do zakodowanego tekstu rozdzielacze (//) w miejscach, w których występujące po sobie znaki tworzą tekst, który może zaburzyć działanie szablonu (podwójne nawiasy klamrowe) lub jest znakiem specjalnym (// lub **). Sposób kodowania "*" pozwala na zakodowanie znaków, których kod ASCII jest większy niż 126, np. polskich znaków. Kolejność znaków odpowiadających sposobie kodowania nie ma znaczenia.

Plusy modułu

  • Szybki, wygodny i prosty w użyciu.
  • Intuicyjny.
  • Posiada zaawansowany system zabezpieczeń (przy użyciu szablonu Użytkownik:Ksawi999/sandbox/Lua/koduj, system ten jest jeszcze lepszy).
  • Szansa na znalezienie klucza wynosi mniej niż 1/200000000 (gdy będą brane pod uwagę wszystkie klucze do długości 1000000 znaków).
  • Możliwości na stworzenienie klucza jest praktycznie nieskończoność.

Plusy użycia szablonu (Użytkownik:Ksawi999/sandbox/Lua/koduj)

  • Posiada bardzo przydatną funkcję - repair, która "naprawia" kod zakodowany innym sposobem (zakodowany tym modułem lub szablonem).
  • Najbardziej zaawansowany system zabezpieczeń w internecie.
    • Nikt oprócz ciebie nie może używać tego szablonu na twojej stronie użytkownika.
    • Szablon generuje klucz automatycznie.

Minusy modułu

  • Niemożliwe jest zakodowanie tekstu sformatowanego znacznikami HTML (ale wszystko inne już tak).
  • Najprawdopodobniej ma jeszcze błędy (jeśli jakiś znalazłeś, proszę, abyś się ze mną skontaktował, np. na mojej dyskusji).
local p = {}
function p.code( data )
	local str = data.args[1]
	if str == nil then
		return "nic"
	end
	
	local key = data.args[2]
	if key == nil then
		key = "!"
	end
	local codeKey = 0
	local i1 = 1
	while i1 <= key:len()
	do
		codeKey = codeKey + string.byte(key,i1)
		i1 = i1 + 1
	end

	local result = ""
	local i = 1
	while i <= str:len()
	do
		local x = string.byte(str,i)
		if x > 126 and string.find(data.args[3], "*") then
			result = result.."**"
			x = x - 95
		end
		if x <= 126 then
			x = x - math.floor(((math.sin(codeKey + i) + 1) / 2) * 94)
			if x < 32 then
				x = x + 95
			end
		end
		if i > 2 and (x == 47 or x == 42) and string.byte(str,i - 1) == x and string.byte(str,i - 2) ~= x then
			result = result.."//"
		end
		if (x == 124 or x == 61) and string.find(data.args[3], "c") then
			if x == 124 then
				x = 33
			end
			if i > 1 and string.byte(result, -1) == 123 and string.find(data.args[3], "/") then
				result = result.."//"
			end
			result = result.."{{"..string.char(x).."}}"
		else result = result..string.char(x)
		end
		i = i + 1
	end
	return result
end

function p.decode( data )
	local str = data.args[1]
	if str == nil then
		return "nic"
	end
	
	local key = data.args[2]
	if key == nil then
		key = "!"
	end
	local codeKey = 0
	local i1 = 1
	while i1 <= key:len()
	do
		codeKey = codeKey + string.byte(key,i1)
		i1 = i1 + 1
	end

	local result = ""
	local i = 1
	local special = 0
	local raise = false
	while i + special <= str:len()
	do
		local x = string.byte(str,i + special)
		if x <= 126 then
			if i > 1 and (string.byte(str,i + special - 1) ~= 47 or x == 42) and i + special ~= str:len() and (x == 47 or x == 42) and (string.byte(str,i + special + 1) == 47 or string.byte(str,i + special + 1) == 42) then
				special = special + 2
				if x == 42 then
					raise = true
				end
				x = string.byte(str,i + special)
			end
			x = x + math.floor(((math.sin(codeKey + i) + 1) / 2) * 94)
			if x > 126 then
				x = x - 95
			end
		end
		if raise then
			x = x + 95
			raise = false
		end
		result = result..string.char(x)
		i = i + 1
	end
	return result
end

return p