From dcd4a235befc5cd6d63b2d599db4f44da463b698 Mon Sep 17 00:00:00 2001 From: noir4y <210010039+noir4y@users.noreply.github.com> Date: Sun, 8 Feb 2026 14:59:56 +0900 Subject: [PATCH 1/2] chore: add stylua format checks in CI and apply Lua formatting --- .github/workflows/ci.yml | 14 ++++++++++ .stylua.toml | 6 +++++ Makefile | 10 ++++++- README.md | 16 ++++++++++++ lua/comment-translate/commands.lua | 2 +- lua/comment-translate/config.lua | 10 +++++-- lua/comment-translate/init.lua | 5 +++- lua/comment-translate/parser/init.lua | 2 +- lua/comment-translate/parser/regex.lua | 28 ++++++++++---------- lua/comment-translate/parser/treesitter.lua | 29 ++++++++++++--------- lua/comment-translate/translate/google.lua | 24 ++++++++++------- 11 files changed, 103 insertions(+), 43 deletions(-) create mode 100644 .stylua.toml diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 051c019..4963fca 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -7,6 +7,20 @@ on: branches: [main, master] jobs: + format: + name: Format Check + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - name: Setup StyLua + uses: JohnnyMorganz/stylua-action@v4 + with: + version: latest + + - name: Check formatting + run: make fmt-check + test: name: Test runs-on: ubuntu-latest diff --git a/.stylua.toml b/.stylua.toml new file mode 100644 index 0000000..a2b3447 --- /dev/null +++ b/.stylua.toml @@ -0,0 +1,6 @@ +column_width = 100 +line_endings = "Unix" +indent_type = "Spaces" +indent_width = 2 +quote_style = "AutoPreferSingle" +call_parentheses = "Always" diff --git a/Makefile b/Makefile index 2c26df8..3f2226a 100644 --- a/Makefile +++ b/Makefile @@ -1,4 +1,4 @@ -.PHONY: test test-file clean +.PHONY: test test-file clean fmt fmt-check # Test runner PLENARY_DIR ?= /tmp/plenary.nvim @@ -31,3 +31,11 @@ docs: # Health check health: nvim --headless -c "checkhealth comment-translate" -c "qa" + +# Format Lua files +fmt: + stylua lua plugin tests + +# Check Lua formatting +fmt-check: + stylua --check lua plugin tests diff --git a/README.md b/README.md index c2e8748..68f69cf 100644 --- a/README.md +++ b/README.md @@ -161,6 +161,22 @@ hover = { auto = false } ⚠️ Any text you translate (hover, replace, or immersive translation) is sent to the configured external translation service. +## Development + +Use [StyLua](https://github.com/JohnnyMorganz/StyLua) for Lua formatting. + +* Format all Lua files: + +```sh +make fmt +``` + +* Check formatting (used in CI): + +```sh +make fmt-check +``` + ## License MIT diff --git a/lua/comment-translate/commands.lua b/lua/comment-translate/commands.lua index ae450a5..4e51aee 100644 --- a/lua/comment-translate/commands.lua +++ b/lua/comment-translate/commands.lua @@ -77,7 +77,7 @@ function M.hover_translate() vim.notify('No comment or string found', vim.log.levels.INFO) return end - + translate.translate(text, nil, nil, function(result) if result then ui.hover.show(result) diff --git a/lua/comment-translate/config.lua b/lua/comment-translate/config.lua index ef61e4b..0ec9a2c 100644 --- a/lua/comment-translate/config.lua +++ b/lua/comment-translate/config.lua @@ -81,7 +81,10 @@ M.config = vim.deepcopy(default_config) local function warn_unknown(prefix, tbl, allowed) for key, _ in pairs(tbl) do if not allowed[key] then - vim.notify(string.format('comment-translate: unknown config key %s.%s', prefix, key), vim.log.levels.WARN) + vim.notify( + string.format('comment-translate: unknown config key %s.%s', prefix, key), + vim.log.levels.WARN + ) end end end @@ -126,7 +129,10 @@ local function validate(user_config) }) -- Ensure max_entries is at least 1 to prevent infinite loops if user_config.cache.max_entries and user_config.cache.max_entries < 1 then - vim.notify('comment-translate: cache.max_entries must be >= 1, defaulting to 1', vim.log.levels.WARN) + vim.notify( + 'comment-translate: cache.max_entries must be >= 1, defaulting to 1', + vim.log.levels.WARN + ) user_config.cache.max_entries = 1 end end diff --git a/lua/comment-translate/init.lua b/lua/comment-translate/init.lua index ce66c76..42ab5e7 100644 --- a/lua/comment-translate/init.lua +++ b/lua/comment-translate/init.lua @@ -22,7 +22,10 @@ local function load_modules() end) if not ok then - vim.notify('comment-translate: Failed to load modules - ' .. tostring(err), vim.log.levels.ERROR) + vim.notify( + 'comment-translate: Failed to load modules - ' .. tostring(err), + vim.log.levels.ERROR + ) return false end diff --git a/lua/comment-translate/parser/init.lua b/lua/comment-translate/parser/init.lua index d958309..9e1c495 100644 --- a/lua/comment-translate/parser/init.lua +++ b/lua/comment-translate/parser/init.lua @@ -71,7 +71,7 @@ function M.get_text_at_cursor(bufnr) bufnr = bufnr or vim.api.nvim_get_current_buf() local row, col = unpack(vim.api.nvim_win_get_cursor(0)) row = row - 1 - + local text, node_type = treesitter.get_text_at_position(bufnr, row, col) if text then local cleaned = normalize_text(text, node_type) diff --git a/lua/comment-translate/parser/regex.lua b/lua/comment-translate/parser/regex.lua index 2e4f211..79ac755 100644 --- a/lua/comment-translate/parser/regex.lua +++ b/lua/comment-translate/parser/regex.lua @@ -26,9 +26,9 @@ local string_patterns = { -- Block comment delimiters: { start_pattern, end_pattern, start_literal, end_literal } local block_comment_delimiters = { - { '/%*', '%*/', '/*', '*/' }, -- C/C++/Java/JS/etc. - { '%-%-+%[%[', '%]%]', '--[[', ']]' }, -- Lua (]]-- or ]] both work) - { '', '' }, -- HTML/XML + { '/%*', '%*/', '/*', '*/' }, -- C/C++/Java/JS/etc. + { '%-%-+%[%[', '%]%]', '--[[', ']]' }, -- Lua (]]-- or ]] both work) + { '', '' }, -- HTML/XML } ---@param line_text string @@ -45,7 +45,7 @@ local function check_block_start(line_text) for i, delim in ipairs(block_comment_delimiters) do local start_pattern = delim[1] local end_pattern = delim[2] - + local start_pos = line_text:find(start_pattern) if start_pos then local end_pos = line_text:find(end_pattern, start_pos + 1) @@ -67,7 +67,7 @@ local function check_block_end(line_text, delimiter_index) if not delim then return false, nil end - + local end_pattern = delim[2] local end_pos = line_text:find(end_pattern) if end_pos then @@ -88,18 +88,18 @@ function M.get_all_comments(bufnr) local comments = {} local line_count = vim.api.nvim_buf_line_count(bufnr) local lines = vim.api.nvim_buf_get_lines(bufnr, 0, line_count, false) - + local in_block = false local block_delimiter_index = nil local block_start_line = nil local block_content_lines = {} - + for line_idx = 0, line_count - 1 do local line_text = lines[line_idx + 1] if not line_text then goto continue end - + if in_block then local is_end, content_before_end = check_block_end(line_text, block_delimiter_index) if is_end then @@ -139,7 +139,7 @@ function M.get_all_comments(bufnr) break end end - + if not comment then for _, pattern in ipairs(inline_comment_patterns) do comment = line_text:match(pattern) @@ -148,16 +148,16 @@ function M.get_all_comments(bufnr) end end end - + if comment then comments[line_idx] = comment end end end - + ::continue:: end - + return comments end @@ -199,7 +199,7 @@ function M.get_string_at_position(bufnr, line, col) if not config.config.targets.string then return nil end - + local line_text = vim.api.nvim_buf_get_lines(bufnr, line, line + 1, false)[1] if not line_text then return nil @@ -222,7 +222,7 @@ function M.get_string_at_position(bufnr, line, col) search_start = e + 1 end end - + return nil end diff --git a/lua/comment-translate/parser/treesitter.lua b/lua/comment-translate/parser/treesitter.lua index f0d03de..5c06079 100644 --- a/lua/comment-translate/parser/treesitter.lua +++ b/lua/comment-translate/parser/treesitter.lua @@ -22,7 +22,6 @@ local string_node_types = { ---@param col number ---@return string?, string? function M.get_text_at_position(bufnr, row, col) - local ok, parser = pcall(vim.treesitter.get_parser, bufnr) if not ok or not parser then return nil, nil @@ -72,8 +71,10 @@ function M.get_text_at_position(bufnr, row, col) break end end - if is_comment then break end - + if is_comment then + break + end + for _, type_name in ipairs(string_node_types) do if parent_type == type_name then is_string = true @@ -81,7 +82,9 @@ function M.get_text_at_position(bufnr, row, col) break end end - if is_string then break end + if is_string then + break + end parent = parent:parent() end @@ -110,24 +113,24 @@ function M.get_all_comments(bufnr) if not config.config.targets.comment then return {} end - + local comments = {} - + local ok, parser = pcall(vim.treesitter.get_parser, bufnr) if not ok or not parser then return {} end - + local tree = parser:parse()[1] if not tree then return {} end - + local root = tree:root() - + local function traverse(node) local node_type = node:type() - + for _, type_name in ipairs(comment_node_types) do if node_type == type_name then local text = vim.treesitter.get_node_text(node, bufnr) @@ -138,14 +141,14 @@ function M.get_all_comments(bufnr) return end end - + for child in node:iter_children() do traverse(child) end end - + traverse(root) - + return comments end diff --git a/lua/comment-translate/translate/google.lua b/lua/comment-translate/translate/google.lua index 4a2b35c..595e89a 100644 --- a/lua/comment-translate/translate/google.lua +++ b/lua/comment-translate/translate/google.lua @@ -64,16 +64,19 @@ function M.translate(text, target_lang, source_lang, callback) local ok, Job = get_plenary_job() if not ok then vim.schedule(function() - vim.notify('comment-translate: plenary.nvim is required for translation', vim.log.levels.ERROR) + vim.notify( + 'comment-translate: plenary.nvim is required for translation', + vim.log.levels.ERROR + ) callback(nil) end) return end - + source_lang = source_lang or 'auto' target_lang = utils.normalize_lang_code(target_lang) source_lang = utils.normalize_lang_code(source_lang) - + local encoded_text = utils.url_encode(text) local url = string.format( 'https://translate.googleapis.com/translate_a/single?client=gtx&sl=%s&tl=%s&dt=t&q=%s', @@ -81,7 +84,7 @@ function M.translate(text, target_lang, source_lang, callback) target_lang, encoded_text ) - + local stderr_output = {} Job:new({ @@ -90,7 +93,8 @@ function M.translate(text, target_lang, source_lang, callback) '--silent', '--show-error', '--fail', - '--max-time', '10', + '--max-time', + '10', url, }, on_stderr = function(_, data) @@ -109,20 +113,20 @@ function M.translate(text, target_lang, source_lang, callback) callback(nil) return end - + local result = table.concat(j:result(), '') if not result or result == '' then callback(nil) return end - + local parse_ok, json = pcall(vim.fn.json_decode, result) if not parse_ok or not json then vim.notify('comment-translate: Failed to parse translation response', vim.log.levels.WARN) callback(nil) return end - + local translated_text = '' if json[1] and type(json[1]) == 'table' then for _, item in ipairs(json[1]) do @@ -131,12 +135,12 @@ function M.translate(text, target_lang, source_lang, callback) end end end - + if translated_text == '' then callback(nil) return end - + cache.set(text, translated_text, target_lang, source_lang) callback(translated_text) end) From b98f5d3494c697c963bb49adc777f9e890e6743c Mon Sep 17 00:00:00 2001 From: noir4y <210010039+noir4y@users.noreply.github.com> Date: Sun, 8 Feb 2026 15:05:33 +0900 Subject: [PATCH 2/2] fix: pass github token to stylua-action to avoid auth error --- .github/workflows/ci.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 4963fca..0204588 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -17,6 +17,8 @@ jobs: uses: JohnnyMorganz/stylua-action@v4 with: version: latest + token: ${{ github.token }} + args: false - name: Check formatting run: make fmt-check