kanban-zero can now cope with links and tags in headlines.
diff --git a/kanban.el b/kanban.el --- a/kanban.el +++ b/kanban.el @@ -60,7 +60,7 @@ ;; TODO: The links don’t yet work for tagged entries. Fix that. There ;; has to be some org-mode function to retrieve the plain header. ;; -;; TODO: Headings containing links are broken. Badly. +;; TODO: kanban-todo sometimes inserts no tasks at all if there are multiple tasks in non-standard states. ;; ;;; Code: @@ -90,11 +90,21 @@ (keyword (nth (- row 1) org-todo-keywords-1))) (if file (setq file (concat file "::"))) - (let ((cleanline (nth 1 (split-string line "* ")))) - (concat "[[" file cleanline "][" - (substring cleanline - (+ (length keyword) 1) - (min 30 (length cleanline))) "]]" )))) + ; clean up the string + (let* (; first remove the initial headline marker FIXME: currently gets later "* ", too + (cleanline (nth 1 (split-string line "* "))) + ; and kill off links in the link part + (link (replace-regexp-in-string "\\[" "%5B" + (replace-regexp-in-string "\\]" "%5D" cleanline))) + ; then kill off trailing space and tags in the name part + (notrailing (replace-regexp-in-string "\\( +$\\| +:\\w.*: *$\\)" "" cleanline)) + ; and links + (nolinks (replace-regexp-in-string "\\[\\[\\(.*\\)\\]\\[\\(.*\\)\\]\\]" "{\\2}" notrailing)) + ; finally shorten the string to a maximum length of 30 chars + (clean (substring nolinks + (+ (length keyword) 1) + (min 30 (length nolinks))))) + (concat "[[" file link "][" clean "]]" )))) ; select the TODO state via the matcher: just match the TODO. (if match (concat match "+TODO=\"" (nth (- row 1) org-todo-keywords-1) "\"")