Skip to content

Commit

Permalink
chore: add converters.vim to separate functions
Browse files Browse the repository at this point in the history
  • Loading branch information
kawarimidoll committed Nov 26, 2023
1 parent ca4c7b1 commit 4f5294f
Show file tree
Hide file tree
Showing 2 changed files with 35 additions and 33 deletions.
28 changes: 28 additions & 0 deletions converters.vim
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
function! converters#kata_to_hira(str) abort
return a:str->substitute('[ァ-ヶ]', {m->nr2char(char2nr(m[0], v:true) - 96, v:true)}, 'g')
endfunction

function! converters#hira_to_kata(str) abort
return a:str->substitute('[ぁ-ゖ]', {m->nr2char(char2nr(m[0], v:true) + 96, v:true)}, 'g')
endfunction

function! converters#hira_to_dakuten(str) abort
return a:str->substitute('[^[:alnum:][:graph:][:space:]]', {m->m[0] .. ''}, 'g')
endfunction

" たまにsplit文字列の描画がおかしくなるので注意
let s:hankana_list = ('ァアィイゥウェエォオカガキギクグケゲコゴサザシジスズセゼソゾタダチヂッツヅテデトド'
\ .. 'ナニヌネノハバパヒビピフブプヘベペホボポマミムメモャヤュユョヨラリルレロワワイエヲンヴーカケ')
\ ->split('.[゙゚]\?\zs')
let s:zen_kata_origin = char2nr('', v:true)
let s:griph_map = { '': '-', '': '~', '': '', '': '', '': '', '': '', '': '' }

function! converters#zen_kata_to_han_kata(str) abort
return a:str->substitute('.', {m->get(s:griph_map,m[0],m[0])}, 'g')
\ ->substitute('[ァ-ヶ]', {m->get(s:hankana_list, char2nr(m[0], v:true) - s:zen_kata_origin, m[0])}, 'g')
\ ->substitute('[!-~]', {m->nr2char(char2nr(m[0], v:true) - 65248, v:true)}, 'g')
endfunction

function! converters#hira_to_han_kata(str) abort
return converters#zen_kata_to_han_kata(converters#hira_to_kata(a:str))
endfunction
40 changes: 7 additions & 33 deletions k.vim
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
source ./inline_mark.vim
source ./converters.vim

function! s:capital(char) abort
return substitute(a:char, '.', '\U\0', '')
Expand Down Expand Up @@ -186,7 +187,7 @@ function! k#zen_kata(...) abort

let preceding_str = s:get_preceding_str('henkan')
call s:clear_henkan_start_pos()
return repeat("\<bs>", strcharlen(preceding_str)) .. s:hira_to_kata(preceding_str)
return repeat("\<bs>", strcharlen(preceding_str)) .. converters#hira_to_kata(preceding_str)
endfunction

function! k#han_kata(...) abort
Expand All @@ -197,7 +198,7 @@ function! k#han_kata(...) abort

let preceding_str = s:get_preceding_str('henkan')
call s:clear_henkan_start_pos()
return repeat("\<bs>", strcharlen(preceding_str)) .. s:zen_kata_to_han_kata(s:hira_to_kata(preceding_str))
return repeat("\<bs>", strcharlen(preceding_str)) .. converters#hira_to_han_kata(preceding_str)
endfunction

function! k#dakuten(...) abort
Expand All @@ -208,17 +209,17 @@ function! k#dakuten(...) abort

let preceding_str = s:get_preceding_str('henkan')
call s:clear_henkan_start_pos()
return repeat("\<bs>", strcharlen(preceding_str)) .. s:hira_to_dakuten(preceding_str)
return repeat("\<bs>", strcharlen(preceding_str)) .. converters#hira_to_dakuten(preceding_str)
endfunction

function! k#ins(key, henkan = v:false) abort
let key = s:trans_special_key(a:key)
let spec = s:get_insert_spec(key, a:henkan)

let result = type(spec) == v:t_dict ? get(spec, 'prefix', '') .. call($'k#{spec.func}', [key])
\ : s:inner_mode == 'zen_kata' ? s:hira_to_kata(spec)
\ : s:inner_mode == 'han_kata' ? s:zen_kata_to_han_kata(s:hira_to_kata(spec))
\ : s:inner_mode == 'dakuten' ? s:hira_to_dakuten(spec)
\ : s:inner_mode == 'zen_kata' ? converters#hira_to_kata(spec)
\ : s:inner_mode == 'han_kata' ? converters#hira_to_han_kata(spec)
\ : s:inner_mode == 'dakuten' ? converters#hira_to_dakuten(spec)
\ : spec
" implement other modes, maybe

Expand Down Expand Up @@ -399,33 +400,6 @@ function! k#completefunc(suffix_key = '')
return ''
endfunction

function! s:kata_to_hira(str) abort
return a:str->substitute('[ァ-ヶ]', {m->nr2char(char2nr(m[0], v:true) - 96, v:true)}, 'g')
endfunction

function! s:hira_to_kata(str) abort
return a:str->substitute('[ぁ-ゖ]', {m->nr2char(char2nr(m[0], v:true) + 96, v:true)}, 'g')
endfunction

function! s:hira_to_dakuten(str) abort
return a:str->substitute('[^[:alnum:][:graph:][:space:]]', {m->m[0] .. ''}, 'g')
endfunction

" たまにsplit文字列の描画がおかしくなるので注意
let s:hankana_list = ('ァアィイゥウェエォオカガキギクグケゲコゴ'
\ .. 'サザシジスズセゼソゾタダチヂッツヅテデトド'
\ .. 'ナニヌネノハバパヒビピフブプヘベペホボポ'
\ .. 'マミムメモャヤュユョヨラリルレロワワイエヲンヴーカケ')
\ ->split('.[゙゚]\?\zs')
let s:zen_kata_origin = char2nr('', v:true)
let s:griph_map = { '': '-', '': '~', '': '', '': '', '': '', '': '', '': '' }

function! s:zen_kata_to_han_kata(str) abort
return a:str->substitute('.', {m->get(s:griph_map,m[0],m[0])}, 'g')
\ ->substitute('[ァ-ヶ]', {m->get(s:hankana_list, char2nr(m[0], v:true) - s:zen_kata_origin, m[0])}, 'g')
\ ->substitute('[!-~]', {m->nr2char(char2nr(m[0], v:true) - 65248, v:true)}, 'g')
endfunction

function! s:char_col_to_byte_col(lnum, char_col) abort
return getline(a:lnum)->slice(0, a:char_col-1)->strlen()+1
endfunction
Expand Down

0 comments on commit 4f5294f

Please sign in to comment.