use org-element-at-point to determine title and link in kanban--todo-links-function
diff --git a/kanban.el b/kanban.el --- a/kanban.el +++ b/kanban.el @@ -103,31 +103,37 @@ (defun kanban--todo-links-function (srcfile) "Retrieve the current header as org-mode link." - (let ((file (buffer-file-name)) - (line (filter-buffer-substring - (point) (line-end-position))) - (keyword (nth (- row 1) org-todo-keywords-1))) + (let* ((file (buffer-file-name)) + (oe (org-element-at-point)) + (title (org-element-property :title oe)) + (link (org-element-property :CUSTOM_ID oe))) (if (equal file srcfile) (setq file nil)) (if file (setq file (concat file "::"))) - ; 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 - "\\[" "{" (replace-regexp-in-string - "\\]" "}" (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 "]]" )))) + ; find best target + (cond + (link + (setq link (concat "#" link))) + ((string-match org-target-regexp title) + (setq link (match-string 1 title)) + (setq title nil)) + (t + (setq link (concat "*" title)))) + ; clean up the title + (when title + ; first substitute links with their title + (setq title (replace-regexp-in-string "\\[\\(\\[[^]]+\\]\\)?\\[\\([^]]+\\)\\]\\]" "\\2" title)) + ; then kill off special link relevant characters + (setq title (replace-regexp-in-string "\\[" "{" + (replace-regexp-in-string "\\]" "}" title))) + ; finally shorten the string to a maximum length of 30 chars + (setq title (substring title 0 (min 30 (length title))))) + ; clean up the link + (when (string-match "[\][]" link) + (setq link (replace-regexp-in-string "[\][/]" "." link)) + (setq link (concat "/" (substring link 1) "/")) + (if (not file) (setq file "file:::"))) + (concat "[[" file link (if title (concat "][" title)) "]]" ))) ;; Get TODO of current column from field in row 1 (defun kanban--get-todo-of-current-col ()