diff --git a/lua/pending/diff.lua b/lua/pending/diff.lua index 1107b31..85f083c 100644 --- a/lua/pending/diff.lua +++ b/lua/pending/diff.lua @@ -7,6 +7,7 @@ local store = require('pending.store') ---@field id? integer ---@field description? string ---@field priority? integer +---@field status? string ---@field category? string ---@field due? string ---@field lnum integer @@ -26,20 +27,17 @@ function M.parse_buffer(lines) local current_category = nil for i, line in ipairs(lines) do - local id, body = line:match('^/(%d+)/( .+)$') + local id, body = line:match('^/(%d+)/(- %[.%] .*)$') if not id then - body = line:match('^( .+)$') + body = line:match('^(- %[.%] .*)$') end if line == '' then table.insert(result, { type = 'blank', lnum = i }) elseif id or body then - local stripped = body:match('^ (.+)$') or body - local prio_str = stripped:match('^%[(%d+)%] ') - local priority = 0 - if prio_str then - priority = tonumber(prio_str) - stripped = stripped:sub(#prio_str + 4) - end + local stripped = body:match('^- %[.%] (.*)$') or body + local state_char = body:match('^- %[(.-)%]') or ' ' + local priority = state_char == '!' and 1 or 0 + local status = state_char == 'x' and 'done' or 'pending' local description, metadata = parse.body(stripped) if description and description ~= '' then table.insert(result, { @@ -47,14 +45,15 @@ function M.parse_buffer(lines) id = id and tonumber(id) or nil, description = description, priority = priority, + status = status, category = metadata.cat or current_category or config.get().default_category, due = metadata.due, lnum = i, }) end - elseif line:match('^%S') then - current_category = line - table.insert(result, { type = 'header', category = line, lnum = i }) + elseif line:match('^## (.+)$') then + current_category = line:match('^## (.+)$') + table.insert(result, { type = 'header', category = current_category, lnum = i }) end end @@ -113,6 +112,15 @@ function M.apply(lines) task.due = entry.due changed = true end + if entry.status and task.status ~= entry.status then + task.status = entry.status + if entry.status == 'done' then + task['end'] = now + else + task['end'] = nil + end + changed = true + end if task.order ~= order_counter then task.order = order_counter changed = true diff --git a/spec/diff_spec.lua b/spec/diff_spec.lua index b8fcfd9..7e7a9cb 100644 --- a/spec/diff_spec.lua +++ b/spec/diff_spec.lua @@ -25,12 +25,12 @@ describe('diff', function() describe('parse_buffer', function() it('parses headers and tasks', function() local lines = { - 'School', - '/1/ Do homework', - '/2/ ! Read chapter 5', + '## School', + '/1/- [ ] Do homework', + '/2/- [!] Read chapter 5', '', - 'Errands', - '/3/ Buy groceries', + '## Errands', + '/3/- [ ] Buy groceries', } local result = diff.parse_buffer(lines) assert.are.equal(6, #result) @@ -48,8 +48,8 @@ describe('diff', function() it('handles new tasks without ids', function() local lines = { - 'Inbox', - ' New task here', + '## Inbox', + '- [ ] New task here', } local result = diff.parse_buffer(lines) assert.are.equal(2, #result) @@ -62,9 +62,9 @@ describe('diff', function() describe('apply', function() it('creates new tasks from buffer lines', function() local lines = { - 'Inbox', - ' First task', - ' Second task', + '## Inbox', + '- [ ] First task', + '- [ ] Second task', } diff.apply(lines) store.unload() @@ -80,8 +80,8 @@ describe('diff', function() store.add({ description = 'Delete me' }) store.save() local lines = { - 'Inbox', - '/1/ Keep me', + '## Inbox', + '/1/- [ ] Keep me', } diff.apply(lines) store.unload() @@ -97,8 +97,8 @@ describe('diff', function() store.add({ description = 'Original' }) store.save() local lines = { - 'Inbox', - '/1/ Renamed', + '## Inbox', + '/1/- [ ] Renamed', } diff.apply(lines) store.unload() @@ -111,9 +111,9 @@ describe('diff', function() store.add({ description = 'Original' }) store.save() local lines = { - 'Inbox', - '/1/ Original', - '/1/ Copy of original', + '## Inbox', + '/1/- [ ] Original', + '/1/- [ ] Copy of original', } diff.apply(lines) store.unload() @@ -126,8 +126,8 @@ describe('diff', function() store.add({ description = 'Moving task', category = 'Inbox' }) store.save() local lines = { - 'Work', - '/1/ Moving task', + '## Work', + '/1/- [ ] Moving task', } diff.apply(lines) store.unload() @@ -140,8 +140,8 @@ describe('diff', function() store.add({ description = 'Stable task', category = 'Inbox' }) store.save() local lines = { - 'Inbox', - '/1/ Stable task', + '## Inbox', + '/1/- [ ] Stable task', } diff.apply(lines) store.unload() @@ -158,8 +158,8 @@ describe('diff', function() store.add({ description = 'Pay bill', due = '2026-03-15' }) store.save() local lines = { - 'Inbox', - '/1/ Pay bill', + '## Inbox', + '/1/- [ ] Pay bill', } diff.apply(lines) store.unload() @@ -172,8 +172,8 @@ describe('diff', function() store.add({ description = 'Task name', priority = 1 }) store.save() local lines = { - 'Inbox', - '/1/ Task name', + '## Inbox', + '/1/- [ ] Task name', } diff.apply(lines) store.unload()