;;; rt-liberation-org.el --- Org integration for rt-liberation -*- lexical-binding: t; -*- ;; Copyright (C) 2008-2021 Free Software Foundation, Inc. ;; Author: Yuchen Pei ;; Maintainer: Yoni Rabkin ;; This file is a part of rt-liberation. ;; This program is free software; you can redistribute it and/or ;; modify it under the terms of the GNU General Public License as ;; published by the Free Software Foundation; either version 3 of the ;; License, or (at your option) any later version. ;; ;; This program is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;; GNU General Public License for more details. ;; ;; You should have received a copy of the GNU General Public ;; License along with this program; if not, write to the Free ;; Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, ;; MA 02111-1307, USA. ;;; Installation and Use: ;; ;; Detailed instructions for installation and use can be found in the ;; rt-liberation manual, in the doc/ directory of the distribution. ;;; History: ;; ;; Started near the end of 2008. (require 'org) (defun rt-org-open (link) "Opens the rt LINK. Open the rt ticket (for links starting with 'id:') or run the query (for links starting with 'query:')." (require 'rt-liberation) (cond ((string-match "^id:\\([^/]+\\)\\(/\\(.+\\)\\)?" link) (let ( (id (match-string 1 link)) (history-id (match-string 3 link)) ) (rt-liber-browse-query (format "id = \"%s\"" id)) (rt-liber-browser-move-point-to-ticket id) (rt-liber-ticket-at-point) (if history-id (let ( (current-history-id (alist-get 'id (rt-liber-viewer2-get-section-data))) (previous-history-id nil) ) (while (not (or (string-equal history-id current-history-id) (eq current-history-id previous-history-id))) (setq previous-history-id current-history-id) (rt-liber-viewer2-next-section-in) (setq current-history-id (alist-get 'id (rt-liber-viewer2-get-section-data))) ) )))) ((string-match "^query:\\(.+\\)" link) (rt-liber-browse-query (match-string 1 link))) (t (error "Unrecognized link type '%s'" link)) )) (defun rt-org-store-link () "Stores an rt link in ticket-browser or ticker-viewer mode." (require 'rt-liberation) (let ((ticket (or (get-text-property (point) 'rt-ticket) rt-liber-ticket-local))) (when ticket (let* ( (ticket-id-link (concat "rt:id:" (rt-liber-ticket-id-only ticket))) (subject (cdr (assoc "Subject" ticket))) (history-id (alist-get 'id (rt-liber-viewer2-get-section-data))) (link (concat ticket-id-link (if history-id (concat "/" history-id) ""))) ) (org-link-add-props :link link :description subject ) link)))) ;; org-add-link-type is obsolete as of org-mode 9. Instead we will use the ;; org-link-set-parameters method (if (fboundp 'org-link-set-parameters) (org-link-set-parameters "rt" :follow #'rt-org-open :store #'rt-org-store-link ) (org-add-link-type "rt" rt-org-open) (add-hook 'org-store-link-functions 'rt-org-store-link) ) ;;; _ (provide 'rt-liberation-org) ;;; rt-liberation-org.el ends here