* feat(compiler): add compile start/complete notifications Problem: No user-facing feedback when compilation starts or finishes. Long-running compilers like pandoc with `--embed-resources` leave the user staring at nothing for 15+ seconds. Solution: Notify "compiling..." at compile start and "compilation complete" on success. The initial `toggle` call uses a combined "compiling with <name>..." message to avoid stacking two notifications. * refactor(presets): use `--katex` instead of `--embed-resources --mathml` Problem: `--embed-resources` with `--mathml` caused pandoc to inline all assets at compile time, adding ~15s per save for KaTeX-heavy documents. Solution: Default to `--katex`, which inserts a CDN `<script>` tag and defers rendering to the browser. Users can opt into `--embed-resources` or `--mathml` via `extra_args`. * docs(presets): rewrite math rendering section for `--katex` default * refactor(compiler): simplify notification flow, add failure notify Problem: `compile()` used an `opts.silent` escape hatch so `toggle()` could suppress duplicate notifications. Compilation failures had no user-facing notification. Solution: Remove `opts.silent` — `compile()` unconditionally notifies on start, success, and failure. `toggle()` no longer emits its own message. * feat(compiler): add per-recompile notifications for long-running providers Problem: long-running providers like `typst watch` had no per-recompile feedback — the process stays alive and individual success/failure was never reported. Solution: add a persistent `output_watcher` fs_event that fires "compilation complete" on every output mtime bump, and track `has_errors` on `BufState` so stderr diagnostics trigger a one-shot "compilation failed" notification. `diagnostic.set()` now returns the diagnostic count to support this flow. * ci: format * chore: remove testing files
42 lines
1.1 KiB
Lua
42 lines
1.1 KiB
Lua
local M = {}
|
|
|
|
local log = require('preview.log')
|
|
|
|
local ns = vim.api.nvim_create_namespace('preview')
|
|
|
|
---@param bufnr integer
|
|
function M.clear(bufnr)
|
|
vim.diagnostic.set(ns, bufnr, {})
|
|
log.dbg('cleared diagnostics for buffer %d', bufnr)
|
|
end
|
|
|
|
---@param bufnr integer
|
|
---@param name string
|
|
---@param error_parser fun(output: string, ctx: preview.Context): preview.Diagnostic[]
|
|
---@param output string
|
|
---@param ctx preview.Context
|
|
---@return integer
|
|
function M.set(bufnr, name, error_parser, output, ctx)
|
|
local ok, diagnostics = pcall(error_parser, output, ctx)
|
|
if not ok then
|
|
log.dbg('error_parser for "%s" failed: %s', name, diagnostics)
|
|
return 0
|
|
end
|
|
if not diagnostics or #diagnostics == 0 then
|
|
log.dbg('error_parser for "%s" returned no diagnostics', name)
|
|
return 0
|
|
end
|
|
for _, d in ipairs(diagnostics) do
|
|
d.source = d.source or name
|
|
end
|
|
vim.diagnostic.set(ns, bufnr, diagnostics)
|
|
log.dbg('set %d diagnostics for buffer %d from provider "%s"', #diagnostics, bufnr, name)
|
|
return #diagnostics
|
|
end
|
|
|
|
---@return integer
|
|
function M.get_namespace()
|
|
return ns
|
|
end
|
|
|
|
return M
|