;; footnote-balloons.el --- Show footnotes in balloon-help frame -*- Emacs-Lisp -*- ;; Copyright (C) 2012 Steve Youngs ;; Author: Steve Youngs ;; Maintainer: Steve Youngs ;; Created: <2012-01-27> ;; Time-stamp: ;; Homepage: http://www.xemacs.org ;; Keywords: mail, news, text, footnote ;; This file is part of XEmacs. ;; Redistribution and use in source and binary forms, with or without ;; modification, are permitted provided that the following conditions ;; are met: ;; ;; 1. Redistributions of source code must retain the above copyright ;; notice, this list of conditions and the following disclaimer. ;; ;; 2. Redistributions in binary form must reproduce the above copyright ;; notice, this list of conditions and the following disclaimer in the ;; documentation and/or other materials provided with the distribution. ;; ;; 3. Neither the name of the author nor the names of any contributors ;; may be used to endorse or promote products derived from this ;; software without specific prior written permission. ;; ;; THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR ;; IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED ;; WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE ;; DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE ;; FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR ;; CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF ;; SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR ;; BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, ;; WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE ;; OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN ;; IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ;;; Commentary: ;; ;; ;;; Todo: ;; ;; ;;; Code: (require 'footnote) (require 'balloon-help) (defvar footnote-balloon-regexp "\\[[^\]\n]+\\]") (defun get-foot-string () (let (b ext) (while (looking-at "[ \t]") (forward-char)) (setq b (point)) ;; Find the end of the footnote. (re-search-forward (concat "\\\n\\\n\\|\\'\\|" footnote-balloon-regexp) nil t) (beginning-of-line) (while (looking-at "^") (backward-char)) (setq ext (make-extent b (point))) (set-extent-property ext 'footnote t) (set-extent-face ext 'green) (extent-string ext))) (defun footnote-balloons () "Turn footnote refs into extents containing the fn string as balloon-help." (interactive) (map-extents #'(lambda (extent ignore) (when (extent-property extent 'footnote) (delete-extent extent)))) (save-excursion (let (ref-beg ref-end ext footnum note) (goto-char (point-min)) ;; Looking for footnote refs in the text. (while (re-search-forward footnote-balloon-regexp nil t) (setq ref-beg (match-beginning 0)) (setq ref-end (match-end 0)) (setq footnum (buffer-substring ref-beg ref-end)) (goto-char (point-max)) ;; Now find the footnote itself. (when (search-backward footnum ref-end t) (search-forward footnum nil t) (setq note (get-foot-string)) (setq ext (make-extent ref-beg ref-end)) (set-extent-face ext 'red) (set-extent-property ext 'footnote t) (set-extent-property ext 'highlight t) (set-extent-property ext 'balloon-help note)) (goto-char ref-end))))) (provide 'footnote-balloons) ;;; footnote-balloons.el ends here