Skip to content

Commit

Permalink
implement gtrans#translate()/#echo()/#buffer()
Browse files Browse the repository at this point in the history
  • Loading branch information
haya14busa committed Nov 12, 2016
0 parents commit 81fa58a
Show file tree
Hide file tree
Showing 13 changed files with 2,648 additions and 0 deletions.
108 changes: 108 additions & 0 deletions autoload/gtrans.vim
@@ -0,0 +1,108 @@
"=============================================================================
" FILE: autoload/gtrans.vim
" AUTHOR: haya14busa
" License: MIT license
"=============================================================================
scriptencoding utf-8
let s:save_cpo = &cpo
set cpo&vim

let s:Process = vital#gtrans#import('System.Process')
let s:String = vital#gtrans#import('Data.String')

let g:gtrans#buffer_height = get(g:, 'gtrans#buffer_height', &previewheight)

function! gtrans#cmd(target_lang) abort
let cmd = ['gtrans']
if a:target_lang !=# ''
let cmd += ['-to', a:target_lang]
endif
return cmd
endfunction

" gtrans#translate() translates text to target lang and returns translated
" text. It's synchronous API.
" target_lang can be empty string and if it's empty, gtrans automatically
" detects it.
function! gtrans#translate(text, target_lang) abort
if s:check()
return
endif
let result = s:Process.execute(gtrans#cmd(a:target_lang), {'input': a:text})
return s:String.chomp(result.output)
endfunction

function! gtrans#echo(text, target_lang, echocmd) abort
if s:check()
return
endif
let echocmd = a:echocmd ==# '' ? 'echo' : a:echocmd
let job = job_start(gtrans#cmd(a:target_lang), {
\ 'callback': s:genechocb(echocmd),
\ })
call ch_sendraw(job, a:text)
call ch_close_in(job)
endfunction

function! gtrans#buffer(text, target_lang, id) abort
if s:check()
return
endif
let id = a:id ==# '' ? '0' : a:id
let bufname = printf('gtrans://result/%s/', id)

if bufexists(bufname)
let currentbuf = bufnr('%')
execute printf(':%d bufdo 1,$delete', bufnr(bufname))
execute printf(':%d buffer', currentbuf)
endif

let job = job_start(gtrans#cmd(a:target_lang), {
\ 'out_io': 'buffer',
\ 'out_name': bufname,
\ 'out_msg': 0,
\ })

let bufnr = ch_getbufnr(job, 'out')

if bufnr !=# -1
let buftext = join([
\ a:text,
\ '---',
\ ], "\n")
let currentbuf = bufnr('%')
execute printf(':%d bufdo put! =buftext | $delete', bufnr(bufname))
execute printf(':%d buffer', currentbuf)
endif

call ch_sendraw(job, a:text)
call ch_close_in(job)

if bufwinnr(bufnr) ==# -1
execute printf(':%dsplit %s', g:gtrans#buffer_height, bufname)
wincmd p
endif
endfunction


function! s:genechocb(cmd) abort
let f = {}
function! f.cb(ch, msg) abort closure
execute a:cmd string(a:msg)
endfunction
return f.cb
endfunction

" check() returns 0 if gtrans found, otherwise returns 1.
function! s:check() abort
if executable('gtrans') !=# 1
echom 'gtrans not found in PATH'
return 1
endif
return 0
endfunction

let &cpo = s:save_cpo
unlet s:save_cpo
" __END__
" vim: expandtab softtabstop=2 shiftwidth=2 foldmethod=marker
12 changes: 12 additions & 0 deletions autoload/vital.vim
@@ -0,0 +1,12 @@
function! vital#of(name) abort
let files = globpath(&runtimepath, 'autoload/vital/' . a:name . '.vital', 1)
let file = split(files, "\n")
if empty(file)
throw 'vital: version file not found: ' . a:name
endif
let ver = readfile(file[0], 'b')
if empty(ver)
throw 'vital: invalid version file: ' . a:name
endif
return vital#_{substitute(ver[0], '\W', '', 'g')}#new()
endfunction
5 changes: 5 additions & 0 deletions autoload/vital/_gtrans.vim
@@ -0,0 +1,5 @@
let s:_plugin_name = expand('<sfile>:t:r')

function! vital#{s:_plugin_name}#new() abort
return vital#{s:_plugin_name[1:]}#new()
endfunction
116 changes: 116 additions & 0 deletions autoload/vital/_gtrans/Data/Dict.vim
@@ -0,0 +1,116 @@
" ___vital___
" NOTE: lines between '" ___vital___' is generated by :Vitalize.
" Do not mofidify the code nor insert new lines before '" ___vital___'
if v:version > 703 || v:version == 703 && has('patch1170')
function! vital#_gtrans#Data#Dict#import() abort
return map({'pick': '', 'clear': '', 'max_by': '', 'foldl': '', 'swap': '', 'omit': '', 'min_by': '', 'foldr': '', 'make_index': '', 'make': ''}, 'function("s:" . v:key)')
endfunction
else
function! s:_SID() abort
return matchstr(expand('<sfile>'), '<SNR>\zs\d\+\ze__SID$')
endfunction
execute join(['function! vital#_gtrans#Data#Dict#import() abort', printf("return map({'pick': '', 'clear': '', 'max_by': '', 'foldl': '', 'swap': '', 'omit': '', 'min_by': '', 'foldr': '', 'make_index': '', 'make': ''}, \"function('<SNR>%s_' . v:key)\")", s:_SID()), 'endfunction'], "\n")
delfunction s:_SID
endif
" ___vital___
" Utilities for dictionary.

let s:save_cpo = &cpo
set cpo&vim

" Makes a dict from keys and values
function! s:make(keys, values, ...) abort
let dict = {}
let fill = a:0 ? a:1 : 0
for i in range(len(a:keys))
let key = type(a:keys[i]) == type('') ? a:keys[i] : string(a:keys[i])
if key ==# ''
throw "vital: Data.Dict: Can't use an empty string for key."
endif
let dict[key] = get(a:values, i, fill)
endfor
return dict
endfunction

" Swaps keys and values
function! s:swap(dict) abort
return s:make(values(a:dict), keys(a:dict))
endfunction

" Makes a index dict from a list
function! s:make_index(list, ...) abort
let value = a:0 ? a:1 : 1
return s:make(a:list, [], value)
endfunction

function! s:pick(dict, keys) abort
let new_dict = {}
for key in a:keys
if has_key(a:dict, key)
let new_dict[key] = a:dict[key]
endif
endfor
return new_dict
endfunction

function! s:omit(dict, keys) abort
let new_dict = copy(a:dict)
for key in a:keys
if has_key(a:dict, key)
call remove(new_dict, key)
endif
endfor
return new_dict
endfunction

function! s:clear(dict) abort
for key in keys(a:dict)
call remove(a:dict, key)
endfor
return a:dict
endfunction

function! s:_max_by(dict, expr) abort
let dict = s:swap(map(copy(a:dict), a:expr))
let key = dict[max(keys(dict))]
return [key, a:dict[key]]
endfunction

function! s:max_by(dict, expr) abort
if empty(a:dict)
throw 'vital: Data.Dict: Empty dictionary'
endif
return s:_max_by(a:dict, a:expr)
endfunction

function! s:min_by(dict, expr) abort
if empty(a:dict)
throw 'vital: Data.Dict: Empty dictionary'
endif
return s:_max_by(a:dict, '-(' . a:expr . ')')
endfunction

function! s:_foldl(f, init, xs) abort
let memo = a:init
for [k, v] in a:xs
let expr = substitute(a:f, 'v:key', string(k), 'g')
let expr = substitute(expr, 'v:val', string(v), 'g')
let expr = substitute(expr, 'v:memo', string(memo), 'g')
unlet memo
let memo = eval(expr)
endfor
return memo
endfunction

function! s:foldl(f, init, dict) abort
return s:_foldl(a:f, a:init, items(a:dict))
endfunction

function! s:foldr(f, init, dict) abort
return s:_foldl(a:f, a:init, reverse(items(a:dict)))
endfunction

let &cpo = s:save_cpo
unlet s:save_cpo

" vim:set et ts=2 sts=2 sw=2 tw=0:

0 comments on commit 81fa58a

Please sign in to comment.