add vim9script
							parent
							
								
									378761c34a
								
							
						
					
					
						commit
						e0e8979afd
					
				@ -0,0 +1,117 @@
 | 
			
		||||
" banana.vim - Convert Base Banana (https://git.lattuga.net/itec/banana) and back
 | 
			
		||||
" T4 - totem4@tropici.net
 | 
			
		||||
" Version: 0.1
 | 
			
		||||
 | 
			
		||||
vim9script
 | 
			
		||||
 | 
			
		||||
if exists("g:autoloaded_Banana") || &cp
 | 
			
		||||
	finish
 | 
			
		||||
endif
 | 
			
		||||
 | 
			
		||||
g:autoloaded_Banana = 1
 | 
			
		||||
 | 
			
		||||
export def Enc()
 | 
			
		||||
	if line("'<") > 0
 | 
			
		||||
		call ReplSel(Dec2Ban(GetSel()))
 | 
			
		||||
	else
 | 
			
		||||
		call EncLine()
 | 
			
		||||
	endif
 | 
			
		||||
enddef
 | 
			
		||||
 | 
			
		||||
def EncLine()
 | 
			
		||||
	call setline('.', substitute(getline('.'), '\d\d*', '\=toupper(Doban(submatch(0)))', 'g'))
 | 
			
		||||
enddef
 | 
			
		||||
 | 
			
		||||
export def Dec()
 | 
			
		||||
	if line("'<") > 0
 | 
			
		||||
		call ReplSel(Ban2Dec(GetSel()))
 | 
			
		||||
	else
 | 
			
		||||
		call DecLine()
 | 
			
		||||
	endif
 | 
			
		||||
enddef
 | 
			
		||||
 | 
			
		||||
def DecLine()
 | 
			
		||||
	call setline('.', substitute(getline('.'), '\C\u\u*', '\=Unban(tolower(submatch(0)))', 'g'))
 | 
			
		||||
enddef
 | 
			
		||||
 | 
			
		||||
var dictionary = [['b', 'c', 'd', 'f', 'g', 'l', 'm', 'n', 'p', 'r', 's', 't', 'v', 'z'], ['a', 'e', 'i', 'o', 'u']]
 | 
			
		||||
var numdict = len(dictionary)
 | 
			
		||||
 | 
			
		||||
def Doban(num: string): string
 | 
			
		||||
	var v = str2nr(num)
 | 
			
		||||
	var st = ''
 | 
			
		||||
	var l = 0
 | 
			
		||||
 | 
			
		||||
	var i = (numdict - 1) % numdict
 | 
			
		||||
 | 
			
		||||
	while ! (v == 0 && i == (numdict - 1) % numdict && l >= 0)
 | 
			
		||||
		var r = v % len(dictionary[i])
 | 
			
		||||
		v = v / len(dictionary[i])
 | 
			
		||||
		st = dictionary[i][r] .. st
 | 
			
		||||
		i = abs((i - 1) % numdict)
 | 
			
		||||
		l = l + 1
 | 
			
		||||
	endwhile
 | 
			
		||||
	return st
 | 
			
		||||
enddef
 | 
			
		||||
 | 
			
		||||
def Unban(ban: string): string
 | 
			
		||||
	if ! IsBanana(ban)
 | 
			
		||||
		return toupper(ban)
 | 
			
		||||
	endif
 | 
			
		||||
 | 
			
		||||
	var v = 0
 | 
			
		||||
	for i in range(len(ban))
 | 
			
		||||
 | 
			
		||||
		var r = (numdict + i) % numdict
 | 
			
		||||
		var p = index(dictionary[r], ban[i])
 | 
			
		||||
 | 
			
		||||
		v = v * len(dictionary[r]) + p
 | 
			
		||||
	endfor
 | 
			
		||||
 | 
			
		||||
	return string(v)
 | 
			
		||||
enddef
 | 
			
		||||
 | 
			
		||||
def IsBanana(ban: string): bool
 | 
			
		||||
	if (len(ban) % numdict) != 0
 | 
			
		||||
		return 0
 | 
			
		||||
	endif
 | 
			
		||||
 | 
			
		||||
	for i in range(len(ban))
 | 
			
		||||
		var r = (numdict + i) % numdict
 | 
			
		||||
		if index(dictionary[r], ban[i]) == -1
 | 
			
		||||
			return 0
 | 
			
		||||
		endif
 | 
			
		||||
	endfor
 | 
			
		||||
 | 
			
		||||
	return 1
 | 
			
		||||
enddef
 | 
			
		||||
 | 
			
		||||
def GetSel(): string
 | 
			
		||||
	var [lstart, cstart] = getcharpos("'<")[1 : 2]
 | 
			
		||||
	var [lend, cend] = getcharpos("'>")[1 : 2]
 | 
			
		||||
	var lines = getline(lstart, lend)
 | 
			
		||||
	if len(lines) == 0
 | 
			
		||||
		return ''
 | 
			
		||||
	endif
 | 
			
		||||
	lines[-1] = lines[-1][: cend - (&selection == 'inclusive' ? 1 : 2)]
 | 
			
		||||
	lines[0] = lines[0][cstart - 1 : ]
 | 
			
		||||
	return join(lines, "\n")
 | 
			
		||||
enddef
 | 
			
		||||
 | 
			
		||||
def ReplSel(str: string)
 | 
			
		||||
	var [lstart, cstart] = getcharpos("'<")[1 : 2]
 | 
			
		||||
	var [lend, cend] = getcharpos("'>")[1 : 2]
 | 
			
		||||
	var lines = getline(lstart, lend)
 | 
			
		||||
	var new_str = slice(lines[0], 0, cstart - 1) .. str .. lines[-1][cend : ]
 | 
			
		||||
	var new_str_lst = split(new_str, '\n')
 | 
			
		||||
	call setline(lstart, new_str_lst)
 | 
			
		||||
	delmarks < >
 | 
			
		||||
enddef
 | 
			
		||||
 | 
			
		||||
def Dec2Ban(text: string): string
 | 
			
		||||
	return substitute(text, '\d\d*', '\=toupper(Doban(submatch(0)))', 'g')
 | 
			
		||||
enddef
 | 
			
		||||
 | 
			
		||||
def Ban2Dec(text: string): string
 | 
			
		||||
	return substitute(text, '\C\u\u*', '\=Unban(tolower(submatch(0)))', 'g')
 | 
			
		||||
enddef
 | 
			
		||||
@ -0,0 +1,30 @@
 | 
			
		||||
" banana.vim - Convert Base Banana (https://git.lattuga.net/itec/banana) and back
 | 
			
		||||
" T4 - totem4@tropici.net
 | 
			
		||||
" Version: 0.1
 | 
			
		||||
 | 
			
		||||
vim9script
 | 
			
		||||
 | 
			
		||||
if exists("g:loaded_Banana") || &cp
 | 
			
		||||
	finish
 | 
			
		||||
endif
 | 
			
		||||
g:loaded_Banana = 1
 | 
			
		||||
var keepcpo = &cpo
 | 
			
		||||
set cpo&vim
 | 
			
		||||
 | 
			
		||||
if !hasmapto('<Plug>BananaEnc')
 | 
			
		||||
	map <unique> <Leader>c <Plug>BananaEnc
 | 
			
		||||
endif
 | 
			
		||||
 | 
			
		||||
if !hasmapto('<Plug>BananaDec')
 | 
			
		||||
	map <unique> <Leader>t <Plug>BananaDec
 | 
			
		||||
endif
 | 
			
		||||
 | 
			
		||||
import autoload 'banana.vim'
 | 
			
		||||
 | 
			
		||||
noremap <silent> <unique> <script> <Plug>BananaEnc
 | 
			
		||||
			\ :call <SID>banana.Enc()<CR>
 | 
			
		||||
noremap <silent> <unique> <script> <Plug>BananaDec
 | 
			
		||||
			\ :call <SID>banana.Dec()<CR>
 | 
			
		||||
 | 
			
		||||
&cpo = keepcpo
 | 
			
		||||
 | 
			
		||||
					Loading…
					
					
				
		Reference in New Issue