Trans.nvim/lua/Trans/display.lua
2022-12-20 13:23:13 +08:00

164 lines
4.4 KiB
Lua

local M = {}
local display = require("Trans").conf.display
local icon = require("Trans").conf.icon
local order = require("Trans").conf.order
local buf = vim.api.nvim_create_buf(false, true)
local win = 0
vim.api.nvim_buf_set_option(buf, 'filetype', 'Trans')
local function show_win(width, height)
win = vim.api.nvim_open_win(buf, false, {
relative = 'cursor',
title = 'Trans',
title_pos = 'center',
style = display.style,
col = display.offset_x,
row = display.offset_y,
width = width > display.max_width and display.max_width or width,
height = height > display.max_height and display.max_height or height,
border = display.border_style,
focusable = true,
})
vim.api.nvim_win_set_option(win, 'wrap', display.wrap)
end
-- NOTE: title
local function get_title(text, query_res)
local title = string.format('%s [%s] ', query_res.word, query_res.phonetic) ..
(display.oxford and (query_res.oxford == 1 and icon.isOxford .. ' ' or icon.notOxford .. ' ') or '') ..
((display.collins_star and query_res.collins) and string.rep(icon.star, query_res.collins) or '')
table.insert(text, title)
end
-- NOTE: tag
local function get_tag(text, query_res)
if #query_res.tag > 0 then
local tag = query_res.tag:gsub('zk', '中考'):gsub('gk', '高考'):gsub('ky', '考研'):gsub('cet4', '四级'):
gsub('cet6', '六级'):
gsub('ielts', '雅思'):gsub('toefl', '托福'):gsub('gre', 'GRE')
table.insert(text, '标签:')
table.insert(text, ' ' .. tag)
end
end
-- NOTE: pos 词性
local function get_pos(text, query_res)
if #query_res.pos > 0 then
table.insert(text, '词性:')
for v in vim.gsplit(query_res.pos, [[/]]) do
table.insert(text, string.format(' %s', v .. '%'))
end
table.insert(text, '')
end
end
-- NOTE: exchange
local function get_exchange(text, query_res)
if #query_res.exchange > 0 then
table.insert(text, '词形变化:')
local exchange_map = {
p = '过去式',
d = '过去分词',
i = '现在分词',
r = '形容词比较级',
t = '形容词最高级',
s = '名词复数形式',
O = '词干',
['3'] = '第三人称单数',
}
for v in vim.gsplit(query_res.exchange, [[/]]) do
table.insert(text, string.format(' %s: %s', exchange_map[v:sub(1, 1)], v:sub(3)))
-- FIXME: 中文字符与字母位宽不一致, 暂时无法对齐
end
table.insert(text, '')
end
end
-- NOTE: 中文翻译
local function get_zh(text, query_res)
if #query_res.translation > 0 then
table.insert(text, '中文翻译:')
for v in vim.gsplit(query_res.translation, '\n') do
table.insert(text, ' ' .. v)
end
table.insert(text, '')
end
end
-- NOTE: 英文翻译
local function get_en(text, query_res)
if display.Trans_en and query_res.definition:len() > 0 then
table.insert(text, '英文翻译:')
for v in vim.gsplit(query_res.definition, '\n') do
table.insert(text, ' ' .. v)
end
table.insert(text, '')
end
end
local handler = {
title = get_title,
tag = get_tag,
pos = get_pos,
exchange = get_exchange,
zh = get_zh,
en = get_en,
}
-- @return string array
local function get_text(query_res)
local text = {}
for _, v in pairs(order) do
handler[v](text, query_res)
end
return text
end
local function set_text(query_res)
local text = query_res and get_text(query_res) or { '没有找到相关定义' }
vim.api.nvim_buf_set_lines(buf, 0, -1, false, text)
local width = 0
for _, v in ipairs(text) do
if v:len() > width then
width = v:len()
end
end
return width, #text
end
function M.query_cursor()
vim.api.nvim_buf_set_option(buf, 'modifiable', true)
local word = vim.fn.expand('<cword>')
local res = require("Trans.database").query(word)
local width, height = set_text(res)
show_win(width, height)
vim.api.nvim_buf_set_option(buf, 'modifiable', false)
end
function M.query()
-- TODO:
end
function M.toggle()
-- TODO: wrap some function
end
function M.close_win()
if win > 0 then
vim.api.nvim_win_close(win, true)
win = 0
end
end
return M