blob: 0f58a644f5ad873b2681e002f2253e42d127524e (
plain) (
tree)
|
|
;;; rt-liberation-org.el --- Org integration for rt-liberation -*- lexical-binding: t; -*-
;; Copyright (C) 2008-2021 Free Software Foundation, Inc.
;; Author: Yuchen Pei <hi@ypei.me>
;; Maintainer: Yoni Rabkin <yrk@gnu.org>
;; 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.
(require 'org)
(require 'rt-liberation)
(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:')."
(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."
(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
|