style(core.*, health.lua): better code style and backend strategy
This commit is contained in:
parent
7fd7d1c309
commit
20fffe0ee5
2
.github/workflows/panvimdoc.yml
vendored
2
.github/workflows/panvimdoc.yml
vendored
@ -14,5 +14,5 @@ jobs:
|
||||
vimdoc: Trans
|
||||
- uses: stefanzweifel/git-auto-commit-action@v4
|
||||
with:
|
||||
commit_message: "Auto generate docs"
|
||||
commit_message: "chore(doc): Auto generate docs"
|
||||
branch: dev
|
||||
|
@ -7,7 +7,8 @@ local app_passwd = baidu.app_passwd
|
||||
local salt = tostring(math.random(bit.lshift(1, 15)))
|
||||
local uri = 'https://fanyi-api.baidu.com/api/trans/vip/translate'
|
||||
|
||||
M.get_content = function(data)
|
||||
|
||||
function M.get_content(data)
|
||||
local tmp = app_id .. data.str .. salt .. app_passwd
|
||||
local sign = require('Trans.util.md5').sumhexa(tmp)
|
||||
return {
|
||||
@ -28,7 +29,7 @@ end
|
||||
-- }
|
||||
|
||||
|
||||
M.query = function(data)
|
||||
function M.query(data)
|
||||
data.engine = 'baidu'
|
||||
|
||||
local handle = function(res)
|
||||
|
@ -1,13 +1,8 @@
|
||||
local M = {}
|
||||
|
||||
M.__index = function(t, k)
|
||||
local res, engine = pcall(require, [[Trans.backend.]] .. k)
|
||||
assert(res, [[No such Backend: ]] .. k)
|
||||
t[k] = engine
|
||||
return engine
|
||||
end
|
||||
|
||||
|
||||
|
||||
|
||||
return setmetatable(M, M)
|
||||
return setmetatable({}, {
|
||||
__index = function(t, k)
|
||||
local res, engine = pcall(require, [[Trans.backend.]] .. k)
|
||||
assert(res, [[No such Backend: ]] .. k)
|
||||
t[k] = engine
|
||||
return engine
|
||||
end
|
||||
})
|
||||
|
@ -10,7 +10,7 @@ vim.api.nvim_create_autocmd('VimLeavePre', {
|
||||
end
|
||||
})
|
||||
|
||||
M.query = function(data)
|
||||
function M.query(data)
|
||||
if data.is_word == false or data.from == 'zh' then return end
|
||||
|
||||
|
||||
@ -48,22 +48,23 @@ M.query_field = {
|
||||
'exchange',
|
||||
}
|
||||
|
||||
local exist = function(str)
|
||||
local function exist(str)
|
||||
return str and str ~= ''
|
||||
end
|
||||
|
||||
local formatter = {
|
||||
title = function(res)
|
||||
local title = {
|
||||
word = res.word,
|
||||
oxford = res.oxford,
|
||||
collins = res.collins,
|
||||
word = res.word,
|
||||
oxford = res.oxford,
|
||||
collins = res.collins,
|
||||
phonetic = res.phonetic,
|
||||
}
|
||||
|
||||
res.word = nil
|
||||
res.oxford = nil
|
||||
res.collins = nil
|
||||
|
||||
res.word = nil
|
||||
res.oxford = nil
|
||||
res.collins = nil
|
||||
res.phonetic = nil
|
||||
return title
|
||||
end,
|
||||
@ -73,11 +74,11 @@ local formatter = {
|
||||
zk = '中考',
|
||||
gk = '高考',
|
||||
ky = '考研',
|
||||
gre = 'gre ',
|
||||
cet4 = '四级',
|
||||
cet6 = '六级',
|
||||
ielts = '雅思',
|
||||
toefl = '托福',
|
||||
gre = 'gre ',
|
||||
}
|
||||
|
||||
local tag = {}
|
||||
@ -90,14 +91,14 @@ local formatter = {
|
||||
exchange = function(res)
|
||||
if not exist(res.exchange) then return end
|
||||
local exchange_map = {
|
||||
['0'] = '原型 ',
|
||||
['1'] = '类别 ',
|
||||
['p'] = '过去式 ',
|
||||
['d'] = '过去分词 ',
|
||||
['i'] = '现在分词 ',
|
||||
['r'] = '比较级 ',
|
||||
['t'] = '最高级 ',
|
||||
['s'] = '复数 ',
|
||||
['0'] = '原型 ',
|
||||
['1'] = '类别 ',
|
||||
['d'] = '过去分词 ',
|
||||
['i'] = '现在分词 ',
|
||||
['3'] = '第三人称单数',
|
||||
['f'] = '第三人称单数',
|
||||
}
|
||||
@ -112,19 +113,19 @@ local formatter = {
|
||||
pos = function(res)
|
||||
if not exist(res.pos) then return end
|
||||
local pos_map = {
|
||||
a = '代词pron ',
|
||||
c = '连接词conj ',
|
||||
i = '介词prep ',
|
||||
j = '形容词adj ',
|
||||
m = '数词num ',
|
||||
n = '名词n ',
|
||||
p = '代词pron ',
|
||||
r = '副词adv ',
|
||||
u = '感叹词int ',
|
||||
v = '动词v ',
|
||||
x = '否定标记not ',
|
||||
t = '不定式标记infm ',
|
||||
d = '限定词determiner ',
|
||||
v = '动词 v',
|
||||
n = '名词 n',
|
||||
r = '副词 adv',
|
||||
m = '数词 num',
|
||||
p = '代词 pron',
|
||||
a = '代词 pron',
|
||||
i = '介词 prep',
|
||||
u = '感叹词 int',
|
||||
j = '形容词 adj',
|
||||
c = '连接词 conj',
|
||||
x = '否定标记 not',
|
||||
t = '不定式标记 infm',
|
||||
d = '限定词 determiner',
|
||||
}
|
||||
|
||||
local pos = {}
|
||||
@ -155,8 +156,7 @@ local formatter = {
|
||||
end,
|
||||
}
|
||||
|
||||
|
||||
M.formatter = function(res)
|
||||
function M.formatter(res)
|
||||
for field, func in pairs(formatter) do
|
||||
res[field] = func(res)
|
||||
end
|
||||
|
@ -1,97 +1,88 @@
|
||||
local title
|
||||
if vim.fn.has('nvim-0.9') == 1 then
|
||||
title = {
|
||||
{ '', 'TransTitleRound' },
|
||||
{ ' Trans', 'TransTitle' },
|
||||
{ '', 'TransTitleRound' },
|
||||
}
|
||||
end
|
||||
|
||||
return {
|
||||
view = {
|
||||
i = 'float',
|
||||
n = 'hover',
|
||||
v = 'hover',
|
||||
},
|
||||
hover = {
|
||||
width = 37,
|
||||
height = 27,
|
||||
border = 'rounded',
|
||||
title = vim.fn.has('nvim-0.9') == 1 and {
|
||||
{ '', 'TransTitleRound' },
|
||||
{ ' Trans', 'TransTitle' },
|
||||
{ '', 'TransTitleRound' },
|
||||
} or nil,
|
||||
keymap = {
|
||||
pageup = '[[',
|
||||
pagedown = ']]',
|
||||
pin = '<leader>[',
|
||||
close = '<leader>]',
|
||||
toggle_entry = '<leader>;',
|
||||
play = '_',
|
||||
},
|
||||
animation = {
|
||||
-- open = 'fold',
|
||||
-- close = 'fold',
|
||||
open = 'slid',
|
||||
close = 'slid',
|
||||
interval = 12,
|
||||
},
|
||||
auto_close_events = {
|
||||
'InsertEnter',
|
||||
'CursorMoved',
|
||||
'BufLeave',
|
||||
},
|
||||
auto_play = true,
|
||||
timeout = 2000,
|
||||
spinner = 'dots', -- 查看所有样式: /lua/Trans/util/spinner
|
||||
-- spinner = 'moon'
|
||||
},
|
||||
order = { -- only work on hover mode
|
||||
'title',
|
||||
'tag',
|
||||
'pos',
|
||||
'exchange',
|
||||
'translation',
|
||||
'definition',
|
||||
},
|
||||
icon = {
|
||||
star = '',
|
||||
notfound = ' ',
|
||||
yes = '✔',
|
||||
no = '',
|
||||
-- --- char: ■ | □ | ▇ | ▏ ▎ ▍ ▌ ▋ ▊ ▉ █
|
||||
-- --- ◖■■■■■■■◗▫◻ ▆ ▆ ▇⃞ ▉⃞
|
||||
cell = '■',
|
||||
-- star = '⭐',
|
||||
-- notfound = '❔',
|
||||
-- yes = '✔️',
|
||||
-- no = '❌'
|
||||
},
|
||||
theme = 'default',
|
||||
theme = 'default', -- see lua/Trans/style/theme.lua
|
||||
auto_play = true,
|
||||
dir = vim.fn.expand('$HOME/.vim/dict'),
|
||||
-- float = {
|
||||
-- width = 0.8,
|
||||
-- height = 0.8,
|
||||
-- border = 'rounded',
|
||||
-- keymap = {
|
||||
-- quit = 'q',
|
||||
-- },
|
||||
-- animation = {
|
||||
-- open = 'fold',
|
||||
-- close = 'fold',
|
||||
-- interval = 10,
|
||||
-- },
|
||||
-- tag = {
|
||||
-- wait = '#519aba',
|
||||
-- fail = '#e46876',
|
||||
-- success = '#10b981',
|
||||
-- },
|
||||
-- },
|
||||
strategy = {
|
||||
frontend = 'hover',
|
||||
backend = '*',
|
||||
},
|
||||
backend = {
|
||||
timeout = 2000,
|
||||
},
|
||||
frontend = {
|
||||
hover = {
|
||||
title = title, -- need nvim-0.9
|
||||
width = 37,
|
||||
height = 27,
|
||||
border = 'rounded',
|
||||
keymap = {
|
||||
pageup = '[[',
|
||||
pagedown = ']]',
|
||||
pin = '<leader>[',
|
||||
close = '<leader>]',
|
||||
toggle_entry = '<leader>;',
|
||||
play = '_',
|
||||
},
|
||||
animation = {
|
||||
open = 'slid', -- 'fold', 'slid'
|
||||
close = 'slid',
|
||||
interval = 12,
|
||||
},
|
||||
auto_close_events = {
|
||||
'InsertEnter',
|
||||
'CursorMoved',
|
||||
'BufLeave',
|
||||
},
|
||||
order = {
|
||||
'title',
|
||||
'tag',
|
||||
'pos',
|
||||
'exchange',
|
||||
'translation',
|
||||
'definition',
|
||||
},
|
||||
spinner = 'dots', -- see: /lua/Trans/style/spinner
|
||||
},
|
||||
},
|
||||
-- or use emoji
|
||||
icon = {
|
||||
star = '', -- ⭐
|
||||
notfound = ' ', -- ❔
|
||||
yes = '✔', -- ✔️
|
||||
no = '', -- ❌
|
||||
cell = '■', -- ■ | □ | ▇ | ▏ ▎ ▍ ▌ ▋ ▊ ▉ █
|
||||
},
|
||||
}
|
||||
|
||||
|
||||
-- ---Pasue Handler for {ms} milliseconds
|
||||
-- ---@param ms number @milliseconds
|
||||
-- M.pause = function(ms)
|
||||
-- local co = coroutine.running()
|
||||
-- vim.defer_fn(function()
|
||||
-- coroutine.resume(co)
|
||||
-- end, ms)
|
||||
-- coroutine.yield()
|
||||
-- end
|
||||
|
||||
-- TODO :
|
||||
-- float = {
|
||||
-- width = 0.8,
|
||||
-- height = 0.8,
|
||||
-- border = 'rounded',
|
||||
-- keymap = {
|
||||
-- quit = 'q',
|
||||
-- },
|
||||
-- animation = {
|
||||
-- open = 'fold',
|
||||
-- close = 'fold',
|
||||
-- interval = 10,
|
||||
-- },
|
||||
-- tag = {
|
||||
-- wait = '#519aba',
|
||||
-- fail = '#e46876',
|
||||
-- success = '#10b981',
|
||||
-- },
|
||||
-- },
|
||||
|
||||
-- local title = {
|
||||
-- "████████╗██████╗ █████╗ ███╗ ██╗███████╗",
|
||||
@ -101,5 +92,3 @@ return {
|
||||
-- " ██║ ██║ ██║██║ ██║██║ ╚████║███████║",
|
||||
-- " ╚═╝ ╚═╝ ╚═╝╚═╝ ╚═╝╚═╝ ╚═══╝╚══════╝",
|
||||
--}
|
||||
|
||||
-- string.width = api.nvim_strwidth
|
||||
|
@ -1,20 +1,34 @@
|
||||
local M = require('Trans')
|
||||
local util = M.util
|
||||
local Trans = require('Trans')
|
||||
local util = Trans.util
|
||||
|
||||
local backends = {
|
||||
'offline',
|
||||
'baidu',
|
||||
}
|
||||
|
||||
local process
|
||||
process = function(opts)
|
||||
local function new_data(opts)
|
||||
opts = opts or {}
|
||||
local mode = opts.mode or vim.api.nvim_get_mode().mode
|
||||
local str = util.get_str(mode)
|
||||
local method = opts.method or ({
|
||||
n = 'normal',
|
||||
v = 'visual',
|
||||
})(vim.api.nvim_get_mode().mode)
|
||||
|
||||
local str = util.get_str(method)
|
||||
if str == '' then return end
|
||||
|
||||
local strategy = Trans.conf.strategy[method] or Trans.conf.strategy
|
||||
local data = {
|
||||
str = str,
|
||||
view = opts.view or M.conf.view[mode],
|
||||
mode = mode,
|
||||
method = method,
|
||||
frontend = strategy.frontend,
|
||||
}
|
||||
|
||||
local backend = strategy.backend
|
||||
if type(backend) == 'string' then
|
||||
backend = backend == '*' and backends or { backend }
|
||||
end
|
||||
data.backend = backend
|
||||
|
||||
if util.is_English(str) then
|
||||
data.from = 'en'
|
||||
data.to = 'zh'
|
||||
@ -22,8 +36,10 @@ process = function(opts)
|
||||
data.from = 'zh'
|
||||
data.to = 'en'
|
||||
end
|
||||
return data
|
||||
end
|
||||
|
||||
|
||||
local function set_result(data)
|
||||
require('Trans.backend').baidu.query(data)
|
||||
local thread = coroutine.running()
|
||||
local resume = function()
|
||||
@ -38,8 +54,22 @@ process = function(opts)
|
||||
coroutine.yield()
|
||||
end
|
||||
vim.pretty_print(data)
|
||||
end
|
||||
|
||||
M.translate = coroutine.wrap(process)
|
||||
local function render_window()
|
||||
|
||||
end
|
||||
|
||||
local function process(opts)
|
||||
Trans.translate = coroutine.wrap(process)
|
||||
|
||||
local data = new_data(opts)
|
||||
if not data then return end
|
||||
|
||||
set_result(data)
|
||||
if data.result == false then return end
|
||||
|
||||
render_window()
|
||||
end
|
||||
|
||||
return coroutine.wrap(process)
|
||||
|
@ -1,8 +1,7 @@
|
||||
local M = {}
|
||||
|
||||
local fn, api = vim.fn, vim.api
|
||||
|
||||
M.get_select = function()
|
||||
function M.get_select()
|
||||
local _start = fn.getpos("v")
|
||||
local _end = fn.getpos('.')
|
||||
|
||||
@ -33,24 +32,24 @@ M.get_select = function()
|
||||
end
|
||||
|
||||
---Get Text which need to be translated
|
||||
---@param mode string 'n' | 'v' | 'i'
|
||||
---@param method string 'n' | 'v' | 'i'
|
||||
---@return string
|
||||
M.get_str = function(mode)
|
||||
if mode == 'n' then
|
||||
return fn.expand('<cword>')
|
||||
elseif mode == 'v' then
|
||||
api.nvim_input('<ESC>')
|
||||
return M.get_select()
|
||||
elseif mode == 'i' then
|
||||
-- TODO Use Telescope with fuzzy finder
|
||||
---@diagnostic disable-next-line: param-type-mismatch
|
||||
return fn.input('请输入需要查询的单词:')
|
||||
else
|
||||
error('invalid mode: ' .. mode)
|
||||
end
|
||||
function M.get_str(method)
|
||||
return ({
|
||||
normal = function()
|
||||
return fn.expand('<cword>')
|
||||
end,
|
||||
visual = function()
|
||||
api.nvim_input('<ESC>')
|
||||
return M.get_select()
|
||||
end,
|
||||
input = function()
|
||||
return fn.input('请输入需要查询的单词:')
|
||||
end,
|
||||
})(method)()
|
||||
end
|
||||
|
||||
M.is_English = function(str)
|
||||
function M.is_English(str)
|
||||
local char = { str:byte(1, -1) }
|
||||
for i = 1, #str do
|
||||
if char[i] > 128 then
|
||||
|
@ -1,397 +1,405 @@
|
||||
local M = {}
|
||||
|
||||
local api = vim.api
|
||||
local conf = require('Trans').conf
|
||||
local hover = conf.hover
|
||||
local error_msg = conf.icon.notfound .. ' 没有找到相关的翻译'
|
||||
|
||||
local buffer = require('Trans.buffer')()
|
||||
|
||||
local node = require('Trans.node')
|
||||
local it, t, f = node.item, node.text, node.format
|
||||
|
||||
local function handle_result(result)
|
||||
local icon = conf.icon
|
||||
local notfound = icon.notfound
|
||||
local indent = ' '
|
||||
|
||||
local word = result.title.word
|
||||
if hover.auto_play then
|
||||
string.play(word:isEn() and word or result.definition)
|
||||
end
|
||||
|
||||
local addtitle = function(title)
|
||||
buffer:addline {
|
||||
it('', 'TransTitleRound'),
|
||||
it(title, 'TransTitle'),
|
||||
it('', 'TransTitleRound'),
|
||||
}
|
||||
end
|
||||
|
||||
local process = {
|
||||
title = function(title)
|
||||
local oxford = title.oxford
|
||||
local collins = title.collins
|
||||
local phonetic = title.phonetic
|
||||
|
||||
if not phonetic and not collins and not oxford then
|
||||
buffer:addline(it(word, 'TransWord'))
|
||||
|
||||
else
|
||||
buffer:addline(f {
|
||||
width = hover.width,
|
||||
text = t {
|
||||
it(word, 'TransWord'),
|
||||
t {
|
||||
it('['),
|
||||
it((phonetic and phonetic ~= '') and phonetic or notfound, 'TransPhonetic'),
|
||||
it(']')
|
||||
},
|
||||
it(collins and icon.star:rep(collins) or notfound, 'TransCollins'),
|
||||
it(oxford == 1 and icon.yes or icon.no)
|
||||
},
|
||||
})
|
||||
end
|
||||
end,
|
||||
|
||||
tag = function(tag)
|
||||
addtitle('标签')
|
||||
local tag_map = {
|
||||
zk = '中考',
|
||||
gk = '高考',
|
||||
ky = '考研',
|
||||
cet4 = '四级',
|
||||
cet6 = '六级',
|
||||
ielts = '雅思',
|
||||
toefl = '托福',
|
||||
gre = 'gre ',
|
||||
}
|
||||
|
||||
local tags = {}
|
||||
local size = 0
|
||||
local interval = ' '
|
||||
for _tag in vim.gsplit(tag, ' ', true) do
|
||||
size = size + 1
|
||||
tags[size] = tag_map[_tag]
|
||||
end
|
||||
|
||||
|
||||
for i = 1, size, 3 do
|
||||
buffer:addline(
|
||||
it(
|
||||
indent .. tags[i] ..
|
||||
(tags[i + 1] and interval .. tags[i + 1] ..
|
||||
(tags[i + 2] and interval .. tags[i + 2] or '') or ''),
|
||||
'TransTag'
|
||||
)
|
||||
)
|
||||
end
|
||||
return M
|
||||
|
||||
buffer:addline('')
|
||||
end,
|
||||
|
||||
pos = function(pos)
|
||||
addtitle('词性')
|
||||
local pos_map = {
|
||||
a = '代词pron ',
|
||||
c = '连接词conj ',
|
||||
i = '介词prep ',
|
||||
j = '形容词adj ',
|
||||
m = '数词num ',
|
||||
n = '名词n ',
|
||||
p = '代词pron ',
|
||||
r = '副词adv ',
|
||||
u = '感叹词int ',
|
||||
v = '动词v ',
|
||||
x = '否定标记not ',
|
||||
t = '不定式标记infm ',
|
||||
d = '限定词determiner ',
|
||||
}
|
||||
-- local api = vim.api
|
||||
-- local conf = require('Trans').conf
|
||||
-- local hover = conf.hover
|
||||
-- local error_msg = conf.icon.notfound .. ' 没有找到相关的翻译'
|
||||
|
||||
local s = '%s %2s%%'
|
||||
for _pos in vim.gsplit(pos, '/', true) do
|
||||
buffer:addline(
|
||||
it(indent .. s:format(pos_map[_pos:sub(1, 1)], _pos:sub(3)), 'TransPos')
|
||||
)
|
||||
end
|
||||
-- local buffer = require('Trans.buffer')()
|
||||
|
||||
buffer:addline('')
|
||||
end,
|
||||
-- local node = require('Trans.node')
|
||||
-- local it, t, f = node.item, node.text, node.format
|
||||
|
||||
exchange = function(exchange)
|
||||
addtitle('词形变化')
|
||||
local exchange_map = {
|
||||
['p'] = '过去式 ',
|
||||
['d'] = '过去分词 ',
|
||||
['i'] = '现在分词 ',
|
||||
['r'] = '比较级 ',
|
||||
['t'] = '最高级 ',
|
||||
['s'] = '复数 ',
|
||||
['0'] = '原型 ',
|
||||
['1'] = '类别 ',
|
||||
['3'] = '第三人称单数',
|
||||
['f'] = '第三人称单数',
|
||||
}
|
||||
local interval = ' '
|
||||
for exc in vim.gsplit(exchange, '/', true) do
|
||||
buffer:addline(
|
||||
it(indent .. exchange_map[exc:sub(1, 1)] .. interval .. exc:sub(3), 'TransExchange')
|
||||
)
|
||||
end
|
||||
-- local function handle_result(result)
|
||||
-- local icon = conf.icon
|
||||
-- local notfound = icon.notfound
|
||||
-- local indent = ' '
|
||||
|
||||
buffer:addline('')
|
||||
end,
|
||||
-- local word = result.title.word
|
||||
-- if hover.auto_play then
|
||||
-- string.play(word:isEn() and word or result.definition)
|
||||
-- end
|
||||
|
||||
translation = function(translation)
|
||||
addtitle('中文翻译')
|
||||
-- local addtitle = function(title)
|
||||
-- buffer:addline {
|
||||
-- it('', 'TransTitleRound'),
|
||||
-- it(title, 'TransTitle'),
|
||||
-- it('', 'TransTitleRound'),
|
||||
-- }
|
||||
-- end
|
||||
|
||||
for trs in vim.gsplit(translation, '\n', true) do
|
||||
buffer:addline(
|
||||
it(indent .. trs, 'TransTranslation')
|
||||
)
|
||||
end
|
||||
-- local process = {
|
||||
-- title = function(title)
|
||||
-- local oxford = title.oxford
|
||||
-- local collins = title.collins
|
||||
-- local phonetic = title.phonetic
|
||||
|
||||
buffer:addline('')
|
||||
end,
|
||||
-- if not phonetic and not collins and not oxford then
|
||||
-- buffer:addline(it(word, 'TransWord'))
|
||||
|
||||
definition = function(definition)
|
||||
addtitle('英文注释')
|
||||
-- else
|
||||
-- buffer:addline(f {
|
||||
-- width = hover.width,
|
||||
-- text = t {
|
||||
-- it(word, 'TransWord'),
|
||||
-- t {
|
||||
-- it('['),
|
||||
-- it((phonetic and phonetic ~= '') and phonetic or notfound, 'TransPhonetic'),
|
||||
-- it(']')
|
||||
-- },
|
||||
-- it(collins and icon.star:rep(collins) or notfound, 'TransCollins'),
|
||||
-- it(oxford == 1 and icon.yes or icon.no)
|
||||
-- },
|
||||
-- })
|
||||
-- end
|
||||
-- end,
|
||||
|
||||
for def in vim.gsplit(definition, '\n', true) do
|
||||
def = def:gsub('^%s+', '', 1) -- TODO :判断是否需要分割空格
|
||||
buffer:addline(
|
||||
it(indent .. def, 'TransDefinition')
|
||||
)
|
||||
end
|
||||
-- tag = function(tag)
|
||||
-- addtitle('标签')
|
||||
-- local tag_map = {
|
||||
-- zk = '中考',
|
||||
-- gk = '高考',
|
||||
-- ky = '考研',
|
||||
-- cet4 = '四级',
|
||||
-- cet6 = '六级',
|
||||
-- ielts = '雅思',
|
||||
-- toefl = '托福',
|
||||
-- gre = 'gre ',
|
||||
-- }
|
||||
|
||||
buffer:addline('')
|
||||
end,
|
||||
}
|
||||
-- local tags = {}
|
||||
-- local size = 0
|
||||
-- local interval = ' '
|
||||
-- for _tag in vim.gsplit(tag, ' ', true) do
|
||||
-- size = size + 1
|
||||
-- tags[size] = tag_map[_tag]
|
||||
-- end
|
||||
|
||||
buffer:set('modifiable', true)
|
||||
for _, field in ipairs(conf.order) do
|
||||
local value = result[field]
|
||||
if value and value ~= '' then
|
||||
process[field](value)
|
||||
end
|
||||
end
|
||||
buffer:set('modifiable', false)
|
||||
end
|
||||
|
||||
local function open_window(opts)
|
||||
opts = opts or {}
|
||||
-- for i = 1, size, 3 do
|
||||
-- buffer:addline(
|
||||
-- it(
|
||||
-- indent .. tags[i] ..
|
||||
-- (tags[i + 1] and interval .. tags[i + 1] ..
|
||||
-- (tags[i + 2] and interval .. tags[i + 2] or '') or ''),
|
||||
-- 'TransTag'
|
||||
-- )
|
||||
-- )
|
||||
-- end
|
||||
|
||||
local col = opts.col or 1
|
||||
local row = opts.row or 1
|
||||
local width = opts.width or hover.width
|
||||
local height = opts.height or hover.height
|
||||
local relative = opts.relative or 'cursor'
|
||||
-- buffer:addline('')
|
||||
-- end,
|
||||
|
||||
return require('Trans.window') {
|
||||
col = col,
|
||||
row = row,
|
||||
buf = buffer,
|
||||
relative = relative,
|
||||
width = width,
|
||||
height = height,
|
||||
title = hover.title,
|
||||
border = hover.border,
|
||||
animation = hover.animation,
|
||||
ns = require('Trans').ns,
|
||||
}
|
||||
end
|
||||
-- pos = function(pos)
|
||||
-- addtitle('词性')
|
||||
-- local pos_map = {
|
||||
-- a = '代词pron ',
|
||||
-- c = '连接词conj ',
|
||||
-- i = '介词prep ',
|
||||
-- j = '形容词adj ',
|
||||
-- m = '数词num ',
|
||||
-- n = '名词n ',
|
||||
-- p = '代词pron ',
|
||||
-- r = '副词adv ',
|
||||
-- u = '感叹词int ',
|
||||
-- v = '动词v ',
|
||||
-- x = '否定标记not ',
|
||||
-- t = '不定式标记infm ',
|
||||
-- d = '限定词determiner ',
|
||||
-- }
|
||||
|
||||
local function handle_keymap(win, word)
|
||||
local keymap = hover.keymap
|
||||
local cur_buf = api.nvim_get_current_buf()
|
||||
local del = vim.keymap.del
|
||||
local function try_del_keymap()
|
||||
for _, key in pairs(keymap) do
|
||||
pcall(del, 'n', key)
|
||||
end
|
||||
end
|
||||
-- local s = '%s %2s%%'
|
||||
-- for _pos in vim.gsplit(pos, '/', true) do
|
||||
-- buffer:addline(
|
||||
-- it(indent .. s:format(pos_map[_pos:sub(1, 1)], _pos:sub(3)), 'TransPos')
|
||||
-- )
|
||||
-- end
|
||||
|
||||
local lock = false
|
||||
local cmd_id
|
||||
local next
|
||||
local action = {
|
||||
pageup = function()
|
||||
buffer:normal('gg')
|
||||
end,
|
||||
-- buffer:addline('')
|
||||
-- end,
|
||||
|
||||
pagedown = function()
|
||||
buffer:normal('G')
|
||||
end,
|
||||
-- exchange = function(exchange)
|
||||
-- addtitle('词形变化')
|
||||
-- local exchange_map = {
|
||||
-- ['p'] = '过去式 ',
|
||||
-- ['d'] = '过去分词 ',
|
||||
-- ['i'] = '现在分词 ',
|
||||
-- ['r'] = '比较级 ',
|
||||
-- ['t'] = '最高级 ',
|
||||
-- ['s'] = '复数 ',
|
||||
-- ['0'] = '原型 ',
|
||||
-- ['1'] = '类别 ',
|
||||
-- ['3'] = '第三人称单数',
|
||||
-- ['f'] = '第三人称单数',
|
||||
-- }
|
||||
-- local interval = ' '
|
||||
-- for exc in vim.gsplit(exchange, '/', true) do
|
||||
-- buffer:addline(
|
||||
-- it(indent .. exchange_map[exc:sub(1, 1)] .. interval .. exc:sub(3), 'TransExchange')
|
||||
-- )
|
||||
-- end
|
||||
|
||||
pin = function()
|
||||
if lock then
|
||||
error('请先关闭窗口')
|
||||
else
|
||||
lock = true
|
||||
end
|
||||
pcall(api.nvim_del_autocmd, cmd_id)
|
||||
local width, height = win.width, win.height
|
||||
local col = vim.o.columns - width - 3
|
||||
local buf = buffer.bufnr
|
||||
local run = win:try_close()
|
||||
run(function()
|
||||
local w, r = open_window {
|
||||
width = width,
|
||||
height = height,
|
||||
relative = 'editor',
|
||||
col = col,
|
||||
}
|
||||
-- buffer:addline('')
|
||||
-- end,
|
||||
|
||||
next = w.winid
|
||||
win = w
|
||||
r(function()
|
||||
w:set('wrap', true)
|
||||
end)
|
||||
-- translation = function(translation)
|
||||
-- addtitle('中文翻译')
|
||||
|
||||
del('n', keymap.pin)
|
||||
api.nvim_create_autocmd('BufWipeOut', {
|
||||
callback = function(opt)
|
||||
if opt.buf == buf or opt.buf == cur_buf then
|
||||
lock = false
|
||||
api.nvim_del_autocmd(opt.id)
|
||||
end
|
||||
end
|
||||
})
|
||||
end)
|
||||
end,
|
||||
-- for trs in vim.gsplit(translation, '\n', true) do
|
||||
-- buffer:addline(
|
||||
-- it(indent .. trs, 'TransTranslation')
|
||||
-- )
|
||||
-- end
|
||||
|
||||
close = function()
|
||||
pcall(api.nvim_del_autocmd, cmd_id)
|
||||
local run = win:try_close()
|
||||
run(function()
|
||||
buffer:delete()
|
||||
end)
|
||||
try_del_keymap()
|
||||
end,
|
||||
-- buffer:addline('')
|
||||
-- end,
|
||||
|
||||
toggle_entry = function()
|
||||
if lock and win:is_valid() then
|
||||
local prev = api.nvim_get_current_win()
|
||||
api.nvim_set_current_win(next)
|
||||
next = prev
|
||||
else
|
||||
del('n', keymap.toggle_entry)
|
||||
end
|
||||
end,
|
||||
-- definition = function(definition)
|
||||
-- addtitle('英文注释')
|
||||
|
||||
play = function()
|
||||
if word then
|
||||
word:play()
|
||||
end
|
||||
end,
|
||||
}
|
||||
local set = vim.keymap.set
|
||||
for act, key in pairs(hover.keymap) do
|
||||
set('n', key, action[act])
|
||||
end
|
||||
-- for def in vim.gsplit(definition, '\n', true) do
|
||||
-- def = def:gsub('^%s+', '', 1) -- TODO :判断是否需要分割空格
|
||||
-- buffer:addline(
|
||||
-- it(indent .. def, 'TransDefinition')
|
||||
-- )
|
||||
-- end
|
||||
|
||||
if hover.auto_close_events then
|
||||
cmd_id = api.nvim_create_autocmd(
|
||||
hover.auto_close_events, {
|
||||
buffer = 0,
|
||||
callback = action.close,
|
||||
})
|
||||
end
|
||||
end
|
||||
-- buffer:addline('')
|
||||
-- end,
|
||||
-- }
|
||||
|
||||
local function online_query(win, word)
|
||||
local lists = {
|
||||
remove = table.remove
|
||||
}
|
||||
local engines = conf.engines
|
||||
local size = #engines
|
||||
local icon = conf.icon
|
||||
local error_line = it(error_msg, 'TransFailed')
|
||||
if size == 0 then
|
||||
buffer:addline(error_line)
|
||||
return
|
||||
end
|
||||
-- buffer:set('modifiable', true)
|
||||
-- for _, field in ipairs(conf.order) do
|
||||
-- local value = result[field]
|
||||
-- if value and value ~= '' then
|
||||
-- process[field](value)
|
||||
-- end
|
||||
-- end
|
||||
-- buffer:set('modifiable', false)
|
||||
-- end
|
||||
|
||||
for i = 1, size do
|
||||
lists[i] = require('Trans.query.' .. engines[i])(word)
|
||||
end
|
||||
local cell = icon.cell
|
||||
local timeout = hover.timeout
|
||||
local spinner = require('Trans.style.spinner')[hover.spinner]
|
||||
local range = #spinner
|
||||
local interval = math.floor(timeout / (win.width - spinner[1]:width()))
|
||||
local win_width = win.width
|
||||
-- local function open_window(opts)
|
||||
-- opts = opts or {}
|
||||
|
||||
local s = '%s %s'
|
||||
local width, height = hover.width, hover.height
|
||||
local function waitting_result(this, times)
|
||||
for i = size, 1, -1 do
|
||||
local res = lists[i][1]
|
||||
if res then
|
||||
buffer:wipe()
|
||||
win:set_width(width)
|
||||
handle_result(res)
|
||||
height = math.min(height, buffer:height(width))
|
||||
-- local col = opts.col or 1
|
||||
-- local row = opts.row or 1
|
||||
-- local width = opts.width or hover.width
|
||||
-- local height = opts.height or hover.height
|
||||
-- local relative = opts.relative or 'cursor'
|
||||
|
||||
win:expand {
|
||||
field = 'height',
|
||||
target = height,
|
||||
}
|
||||
this.run = false
|
||||
return
|
||||
elseif res == false then
|
||||
lists:remove(i)
|
||||
size = size - 1
|
||||
end
|
||||
end
|
||||
-- return require('Trans.window') {
|
||||
-- col = col,
|
||||
-- row = row,
|
||||
-- buf = buffer,
|
||||
-- relative = relative,
|
||||
-- width = width,
|
||||
-- height = height,
|
||||
-- title = hover.title,
|
||||
-- border = hover.border,
|
||||
-- animation = hover.animation,
|
||||
-- ns = require('Trans').ns,
|
||||
-- }
|
||||
-- end
|
||||
|
||||
if size == 0 or times == win_width then
|
||||
buffer:addline(error_line, 1)
|
||||
this.run = false
|
||||
else
|
||||
buffer:addline(it(s:format(spinner[times % range + 1], cell:rep(times)), 'MoreMsg'), 1)
|
||||
end
|
||||
end
|
||||
-- local function handle_keymap(win, word)
|
||||
-- local keymap = hover.keymap
|
||||
-- local cur_buf = api.nvim_get_current_buf()
|
||||
-- local del = vim.keymap.del
|
||||
-- local function try_del_keymap()
|
||||
-- for _, key in pairs(keymap) do
|
||||
-- pcall(del, 'n', key)
|
||||
-- end
|
||||
-- end
|
||||
|
||||
buffer:set('modifiable', true)
|
||||
local run = require('Trans.util.display') {
|
||||
times = win_width,
|
||||
interval = interval,
|
||||
frame = waitting_result,
|
||||
}
|
||||
-- local lock = false
|
||||
-- local cmd_id
|
||||
-- local next
|
||||
-- local action = {
|
||||
-- pageup = function()
|
||||
-- buffer:normal('gg')
|
||||
-- end,
|
||||
|
||||
run(function()
|
||||
buffer:set('modifiable', false)
|
||||
end)
|
||||
end
|
||||
-- pagedown = function()
|
||||
-- buffer:normal('G')
|
||||
-- end,
|
||||
|
||||
---处理不同hover模式的窗口
|
||||
---@param word string 待查询的单词
|
||||
return function(word)
|
||||
buffer:init()
|
||||
local result = require('Trans.query.offline')(word)
|
||||
-- pin = function()
|
||||
-- if lock then
|
||||
-- error('请先关闭窗口')
|
||||
-- else
|
||||
-- lock = true
|
||||
-- end
|
||||
-- pcall(api.nvim_del_autocmd, cmd_id)
|
||||
-- local width, height = win.width, win.height
|
||||
-- local col = vim.o.columns - width - 3
|
||||
-- local buf = buffer.bufnr
|
||||
-- local run = win:try_close()
|
||||
-- run(function()
|
||||
-- local w, r = open_window {
|
||||
-- width = width,
|
||||
-- height = height,
|
||||
-- relative = 'editor',
|
||||
-- col = col,
|
||||
-- }
|
||||
|
||||
if result then
|
||||
handle_result(result)
|
||||
local width = hover.width
|
||||
local win, run = open_window {
|
||||
width = width,
|
||||
height = math.min(buffer:height(width), hover.height)
|
||||
}
|
||||
-- next = w.winid
|
||||
-- win = w
|
||||
-- r(function()
|
||||
-- w:set('wrap', true)
|
||||
-- end)
|
||||
|
||||
run(function()
|
||||
win:set('wrap', true)
|
||||
handle_keymap(win, word)
|
||||
end)
|
||||
-- del('n', keymap.pin)
|
||||
-- api.nvim_create_autocmd('BufWipeOut', {
|
||||
-- callback = function(opt)
|
||||
-- if opt.buf == buf or opt.buf == cur_buf then
|
||||
-- lock = false
|
||||
-- api.nvim_del_autocmd(opt.id)
|
||||
-- end
|
||||
-- end
|
||||
-- })
|
||||
-- end)
|
||||
-- end,
|
||||
|
||||
else
|
||||
local win, run = open_window {
|
||||
width = error_msg:width(),
|
||||
height = 1,
|
||||
}
|
||||
-- close = function()
|
||||
-- pcall(api.nvim_del_autocmd, cmd_id)
|
||||
-- local run = win:try_close()
|
||||
-- run(function()
|
||||
-- buffer:delete()
|
||||
-- end)
|
||||
-- try_del_keymap()
|
||||
-- end,
|
||||
|
||||
run(function()
|
||||
win:set('wrap', true)
|
||||
handle_keymap(win, word)
|
||||
online_query(win, word)
|
||||
end)
|
||||
end
|
||||
end
|
||||
-- toggle_entry = function()
|
||||
-- if lock and win:is_valid() then
|
||||
-- local prev = api.nvim_get_current_win()
|
||||
-- api.nvim_set_current_win(next)
|
||||
-- next = prev
|
||||
-- else
|
||||
-- del('n', keymap.toggle_entry)
|
||||
-- end
|
||||
-- end,
|
||||
|
||||
-- play = function()
|
||||
-- if word then
|
||||
-- word:play()
|
||||
-- end
|
||||
-- end,
|
||||
-- }
|
||||
-- local set = vim.keymap.set
|
||||
-- for act, key in pairs(hover.keymap) do
|
||||
-- set('n', key, action[act])
|
||||
-- end
|
||||
|
||||
-- if hover.auto_close_events then
|
||||
-- cmd_id = api.nvim_create_autocmd(
|
||||
-- hover.auto_close_events, {
|
||||
-- buffer = 0,
|
||||
-- callback = action.close,
|
||||
-- })
|
||||
-- end
|
||||
-- end
|
||||
|
||||
-- local function online_query(win, word)
|
||||
-- local lists = {
|
||||
-- remove = table.remove
|
||||
-- }
|
||||
-- local engines = conf.engines
|
||||
-- local size = #engines
|
||||
-- local icon = conf.icon
|
||||
-- local error_line = it(error_msg, 'TransFailed')
|
||||
-- if size == 0 then
|
||||
-- buffer:addline(error_line)
|
||||
-- return
|
||||
-- end
|
||||
|
||||
-- for i = 1, size do
|
||||
-- lists[i] = require('Trans.query.' .. engines[i])(word)
|
||||
-- end
|
||||
-- local cell = icon.cell
|
||||
-- local timeout = hover.timeout
|
||||
-- local spinner = require('Trans.style.spinner')[hover.spinner]
|
||||
-- local range = #spinner
|
||||
-- local interval = math.floor(timeout / (win.width - spinner[1]:width()))
|
||||
-- local win_width = win.width
|
||||
|
||||
-- local s = '%s %s'
|
||||
-- local width, height = hover.width, hover.height
|
||||
-- local function waitting_result(this, times)
|
||||
-- for i = size, 1, -1 do
|
||||
-- local res = lists[i][1]
|
||||
-- if res then
|
||||
-- buffer:wipe()
|
||||
-- win:set_width(width)
|
||||
-- handle_result(res)
|
||||
-- height = math.min(height, buffer:height(width))
|
||||
|
||||
-- win:expand {
|
||||
-- field = 'height',
|
||||
-- target = height,
|
||||
-- }
|
||||
-- this.run = false
|
||||
-- return
|
||||
-- elseif res == false then
|
||||
-- lists:remove(i)
|
||||
-- size = size - 1
|
||||
-- end
|
||||
-- end
|
||||
|
||||
-- if size == 0 or times == win_width then
|
||||
-- buffer:addline(error_line, 1)
|
||||
-- this.run = false
|
||||
-- else
|
||||
-- buffer:addline(it(s:format(spinner[times % range + 1], cell:rep(times)), 'MoreMsg'), 1)
|
||||
-- end
|
||||
-- end
|
||||
|
||||
-- buffer:set('modifiable', true)
|
||||
-- local run = require('Trans.util.display') {
|
||||
-- times = win_width,
|
||||
-- interval = interval,
|
||||
-- frame = waitting_result,
|
||||
-- }
|
||||
|
||||
-- run(function()
|
||||
-- buffer:set('modifiable', false)
|
||||
-- end)
|
||||
-- end
|
||||
|
||||
-- ---处理不同hover模式的窗口
|
||||
-- ---@param word string 待查询的单词
|
||||
-- return function(word)
|
||||
-- buffer:init()
|
||||
-- local result = require('Trans.query.offline')(word)
|
||||
|
||||
-- if result then
|
||||
-- handle_result(result)
|
||||
-- local width = hover.width
|
||||
-- local win, run = open_window {
|
||||
-- width = width,
|
||||
-- height = math.min(buffer:height(width), hover.height)
|
||||
-- }
|
||||
|
||||
-- run(function()
|
||||
-- win:set('wrap', true)
|
||||
-- handle_keymap(win, word)
|
||||
-- end)
|
||||
|
||||
-- else
|
||||
-- local win, run = open_window {
|
||||
-- width = error_msg:width(),
|
||||
-- height = 1,
|
||||
-- }
|
||||
|
||||
-- run(function()
|
||||
-- win:set('wrap', true)
|
||||
-- handle_keymap(win, word)
|
||||
-- online_query(win, word)
|
||||
-- end)
|
||||
-- end
|
||||
-- end
|
||||
|
@ -1,13 +1,12 @@
|
||||
local check = function()
|
||||
local health = vim.health
|
||||
local ok = health.report_ok
|
||||
local warn = health.report_warn
|
||||
local error = health.report_error
|
||||
local health = vim.health
|
||||
local ok = health.report_ok
|
||||
local warn = health.report_warn
|
||||
local error = health.report_error
|
||||
local has = vim.fn.has
|
||||
local executable = vim.fn.executable
|
||||
|
||||
local has = vim.fn.has
|
||||
local executable = vim.fn.executable
|
||||
|
||||
-- INFO :Check neovim version
|
||||
local function check_neovim_version()
|
||||
if has('nvim-0.9') == 1 then
|
||||
ok [[You have [neovim-nightly] ]]
|
||||
else
|
||||
@ -15,8 +14,9 @@ local check = function()
|
||||
See neovim-nightly: [https://github.com/neovim/neovim/releases/tag/nightly]
|
||||
]]
|
||||
end
|
||||
end
|
||||
|
||||
-- INFO :Check plugin dependencies
|
||||
local function check_plugin_dependencies()
|
||||
local plugin_dependencies = {
|
||||
-- 'plenary',
|
||||
'sqlite',
|
||||
@ -29,8 +29,10 @@ local check = function()
|
||||
error(string.format('Dependency [%s] is not installed', dep))
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
-- INFO :Check binary dependencies
|
||||
|
||||
local function check_binary_dependencies()
|
||||
local binary_dependencies = {
|
||||
'curl',
|
||||
'sqlite3',
|
||||
@ -51,9 +53,9 @@ local check = function()
|
||||
error(string.format('Binary dependency [%s] is not installed', dep))
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
-- INFO :Check ultimate.db
|
||||
local function check_database()
|
||||
local db_path = require('Trans').conf.dir .. '/ultimate.db'
|
||||
if vim.fn.filereadable(db_path) == 1 then
|
||||
ok [[ultimate database found ]]
|
||||
@ -63,12 +65,14 @@ local check = function()
|
||||
[Automatically]: Try to run `:lua require "Trans".install()`
|
||||
]]
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
-- INFO :Check Engine configuration file
|
||||
local function check_configure_file()
|
||||
local path = vim.fn.expand(require('Trans').conf.dir .. '/Trans.json')
|
||||
local file = io.open(path, "r")
|
||||
local valid = file and pcall(vim.json.decode, file:read("*a"))
|
||||
|
||||
|
||||
if valid then
|
||||
ok(string.format([[Engine configuration file[%s] found and valid ]], path))
|
||||
else
|
||||
@ -78,4 +82,12 @@ local check = function()
|
||||
end
|
||||
end
|
||||
|
||||
return { check = check }
|
||||
local function check()
|
||||
check_neovim_version()
|
||||
check_plugin_dependencies()
|
||||
check_binary_dependencies()
|
||||
check_database()
|
||||
check_configure_file()
|
||||
end
|
||||
|
||||
return { check = check, }
|
||||
|
@ -8,4 +8,6 @@ local M = setmetatable({}, {
|
||||
end
|
||||
})
|
||||
|
||||
M.cache = {}
|
||||
|
||||
return M
|
||||
|
16
lua/Trans/util/init.lua
Normal file
16
lua/Trans/util/init.lua
Normal file
@ -0,0 +1,16 @@
|
||||
local M = {}
|
||||
M.test_api_latency = function(urls)
|
||||
urls = type(urls) == 'string' and { urls } or urls
|
||||
|
||||
local f = [[curl -s -o /dev/null -w '[%s]延迟: %%{time_total}s %s']]
|
||||
local result = {}
|
||||
for _, url in ipairs(urls) do
|
||||
local cmd = string.format(f, url, url)
|
||||
local res = vim.fn.system(cmd)
|
||||
result[#result + 1] = res
|
||||
end
|
||||
|
||||
vim.pretty_print(result)
|
||||
end
|
||||
|
||||
return M
|
@ -56,6 +56,7 @@ curl.get = function(uri, opts)
|
||||
end
|
||||
end
|
||||
|
||||
-- vim.pretty_print(table.concat(cmd, ' '))
|
||||
vim.fn.jobstart(table.concat(cmd, ' '), {
|
||||
stdin = 'null',
|
||||
on_stdout = on_stdout,
|
||||
|
Loading…
x
Reference in New Issue
Block a user