diff --git a/data/media/task-list.lua b/data/media/task-list.lua new file mode 100644 index 0000000..6a1b365 --- /dev/null +++ b/data/media/task-list.lua @@ -0,0 +1,135 @@ +local List = require 'pandoc.List' + +local M = {} + +local function is_html (format) + return format == 'html' or format == 'html4' or format == 'html5' +end + +--- Create a ballot box for the given output format. +function M.ballot_box (format) + if is_html(format) then + return pandoc.RawInline( + 'html', + '' + ) + elseif format == 'gfm' then + -- GFM includes raw HTML + return pandoc.RawInline('html', '[ ]') + elseif format == 'org' then + return pandoc.RawInline('org', '[ ]') + elseif format == 'latex' then + return pandoc.RawInline('tex', '$\\square$') + else + return pandoc.Str '☐' + end +end + +--- Create a checked ballot box for the given output format. +function M.ballot_box_with_check (format) + if is_html(format) then + return pandoc.RawInline( + 'html', + '' + ) + elseif format == 'gfm' then + -- GFM includes raw HTML + return pandoc.RawInline('html', '[x]') + elseif format == 'org' then + return pandoc.RawInline('org', '[X]') + elseif format == 'latex' then + return pandoc.RawInline('tex', '$\\rlap{$\\checkmark$}\\square$') + else + return pandoc.Str '☑' + end +end + +--- Replace a Github-style task indicator with a bullet box representation +--- suitable for the given output format. +function M.todo_marker (inlines, format) + if (inlines[1] and inlines[1].text == '[' and + inlines[2] and inlines[2].t == 'Space' and + inlines[3] and inlines[3].text == ']') then + return M.ballot_box(format), 3 + elseif (inlines[1] and + (inlines[1].text == '[x]' or + inlines[1].text == '[X]')) then + return M.ballot_box_with_check(format), 1 + else + return nil, 0 + end +end + +M.css_styles = [[ + +]] + +--- Add task-list CSS styles to the header. +function M.add_task_list_css(meta) + local header_includes + if meta['header-includes'] and meta['header-includes'].t == 'MetaList' then + header_includes = meta['header-includes'] + else + header_includes = pandoc.MetaList{meta['header-includes']} + end + header_includes[#header_includes + 1] = + pandoc.MetaBlocks{pandoc.RawBlock('html', M.css_styles)} + meta['header-includes'] = header_includes + return meta +end + +--- Replace the todo marker in the given block, if any. +function M.replace_todo_markers (blk, format) + if blk.t ~= 'Para' and blk.t ~= 'Plain' then + return blk + end + local inlines = blk.content + local box, num_inlines = M.todo_marker(inlines, format) + if box == nil then + return blk + end + local new_inlines = List:new{box} + for j = 1, #inlines do + new_inlines[j + 1] = inlines[j + num_inlines] + end + return pandoc[blk.t](new_inlines) -- create Plain or Para +end + +--- Convert Github- and org-mode-style task markers in a BulletList. +function M.modifyBulletList (list) + if not is_html(FORMAT) then + for _, item in ipairs(list.content) do + item[1] = M.replace_todo_markers(item[1], FORMAT) + end + return list + else + local res = List:new{pandoc.RawBlock('html', '') + return res + end +end + +M[1] = { + BulletList = M.modifyBulletList, + Meta = is_html(FORMAT) and M.add_task_list_css or nil +} + +return M diff --git a/uberwriter/UberwriterWindow.py b/uberwriter/UberwriterWindow.py index c98d2ef..9dd38fa 100644 --- a/uberwriter/UberwriterWindow.py +++ b/uberwriter/UberwriterWindow.py @@ -697,7 +697,9 @@ class UberwriterWindow(Window): '-smart', '-thtml', '--mathjax', + '--lua-filter=' + helpers.get_media_path('task-list.lua'), '-c', helpers.get_media_file('uberwriter.css')] + print(args) p = subprocess.Popen(args, stdin=subprocess.PIPE, stdout=subprocess.PIPE)