From e0e8979afd6e97657a7f1f7e6c909e03cbac3e14 Mon Sep 17 00:00:00 2001 From: totem4 Date: Wed, 13 Sep 2023 12:40:55 +0200 Subject: [PATCH] add vim9script --- vim9/autoload/banana.vim | 117 +++++++++++++++++++++++++++++++++++++++ vim9/plugin/banana.vim | 30 ++++++++++ 2 files changed, 147 insertions(+) create mode 100644 vim9/autoload/banana.vim create mode 100644 vim9/plugin/banana.vim diff --git a/vim9/autoload/banana.vim b/vim9/autoload/banana.vim new file mode 100644 index 0000000..6ff926f --- /dev/null +++ b/vim9/autoload/banana.vim @@ -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 diff --git a/vim9/plugin/banana.vim b/vim9/plugin/banana.vim new file mode 100644 index 0000000..71ca4ba --- /dev/null +++ b/vim9/plugin/banana.vim @@ -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('BananaEnc') + map c BananaEnc +endif + +if !hasmapto('BananaDec') + map t BananaDec +endif + +import autoload 'banana.vim' + +noremap