all messages for Emacs-related lists mirrored at yhetil.org
 help / color / mirror / code / Atom feed
* hyperbole: programmatic button creation
@ 2003-11-20 14:49 Jim Ottaway
  2003-11-22  2:15 ` Brad Collins
       [not found] ` <mailman.427.1069471636.399.help-gnu-emacs@gnu.org>
  0 siblings, 2 replies; 3+ messages in thread
From: Jim Ottaway @ 2003-11-20 14:49 UTC (permalink / raw)



I am trying to create a new hyperbole explicit button with a link to a
bibtex entry in a bibtex file. The idea is to use the reftex search
mechanism to ``cite'' a reference as a hyperbole button.

So far I have:

(defact link-to-bibtex-entry (entry)
  "Find bibtex entry. ENTRY is a list: \(key file-name title\)"
  (interactive (list (rft-hyp-get-citation)))
  (funcall 
   (actype:action 'link-to-regexp-match)
   ;; regexp cribbed from reftex-cite.el
   (concat "@[a-zA-Z]+[ \t\n\r]*[{(][ \t\n\r]*" 
	   (regexp-quote (first entry)))
   1 (second entry) nil))

The function `rft-hyp-get-citation' supplies a list: (key file-name
title). It uses a slightly modified form of
`reftex-extract-bib-entries' that adds an element with the file name of
the match (see code below).

This works well, as it stands, but it is not quite what I want. What I
would really like is to programmatically create the explicit button
using the list returned from `rft-hyp-get-citation', avoiding all the 
prompts for button type and label in `hui:ebut-create'.

I have looked at the manual and the documentation for `ebut:create',
but I can not work out how to do this from the information supplied.

Does anyone have any experience of creating explicit buttons
programmatically? 

Regards,

Jim Ottaway

Here is the code for `rft-hyp-get-citation':

(require 'cl)
(require 'reftex-cite) 

(defun rft-hyp-get-citation ()
  (let ((entry '()))
    (flet ((reftex-extract-bib-entries 
	    (buffers)
	    (rft-hyp-reftex-extract-bib-entries buffers)))
      ;; todo: only deals with single choices at the moment
      (setq entry (car (reftex-offer-bib-menu)))
      (list
       (rft-hyp-strip-properties
	(reftex-get-bib-field "&key" entry))
       (reftex-get-bib-field "&file" entry)
       (rft-hyp-strip-properties
	(reftex-get-bib-field "title" entry))))))

(defun rft-hyp-reftex-extract-bib-entries (buffers)
  ;; Extract bib entries which match regexps from BUFFERS.
  ;; BUFFERS is a list of buffers or file names.
  ;; Return list with entries."
  (let* (re-list first-re rest-re
                 (buffer-list (if (listp buffers) buffers (list buffers)))
                 found-list entry buffer1 buffer alist
                 key-point start-point end-point)

    ;; Read a regexp, completing on known citation keys.
    (setq re-list 
	  (split-string 
	   (completing-read 
	    "RegExp [ && RegExp...]: "
	    (if reftex-mode
		(if (fboundp 'LaTeX-bibitem-list)
		    (LaTeX-bibitem-list)
		  (cdr (assoc 'bibview-cache 
			      (symbol-value reftex-docstruct-symbol))))
	      nil)
	    nil nil nil 'reftex-cite-regexp-hist)
	   "[ \t]*&&[ \t]*"))

    (setq first-re (car re-list)    ; We'll use the first re to find things,
          rest-re  (cdr re-list))   ; the others to narrow down.
    (if (string-match "\\`[ \t]*\\'" (or first-re ""))
        (error "Empty regular expression"))

    (save-excursion
      (save-window-excursion

        ;; Walk through all bibtex files
        (while buffer-list
          (setq buffer (car buffer-list)
                buffer-list (cdr buffer-list))
          (if (and (bufferp buffer)
                   (buffer-live-p buffer))
              (setq buffer1 buffer)
            (setq buffer1 (reftex-get-file-buffer-force
                           buffer (not reftex-keep-temporary-buffers))))
          (if (not buffer1)
              (message "No such BibTeX file %s (ignored)" buffer)
            (message "Scanning bibliography database %s" buffer1))

          (set-buffer buffer1)
          (save-excursion
            (goto-char (point-min))
            (while (re-search-forward first-re nil t)
              (catch 'search-again
                (setq key-point (point))
                (unless (re-search-backward
                         "\\(\\`\\|[\n\r]\\)[ \t]*@\\([a-zA-Z]+\\)[ \t\n\r]*[{(]" nil t)
                  (throw 'search-again nil))
                (setq start-point (point))
                (goto-char (match-end 0))
                (condition-case nil
                    (up-list 1)
                  (error (goto-char key-point)
                          (throw 'search-again nil)))
                (setq end-point (point))

                ;; Ignore @string, @comment and @c entries or things
                ;; outside entries
                (when (or (string= (downcase (match-string 2)) "string")
                          (string= (downcase (match-string 2)) "comment")
                          (string= (downcase (match-string 2)) "c")
                          (< (point) key-point)) ; this means match not in {}
                  (goto-char key-point)
                  (throw 'search-again nil))

                ;; Well, we have got a match
                (setq entry (concat
                             (buffer-substring start-point (point)) "\n"))

                ;; Check if other regexp match as well
                (setq re-list rest-re)
                (while re-list
                  (unless (string-match (car re-list) entry)
                    ;; nope - move on
                    (throw 'search-again nil))
                  (pop re-list))

                (setq alist (reftex-parse-bibtex-entry
                             nil start-point end-point))
                (push (cons "&entry" entry) alist)

                ;; ADDED 
		(push (cons "&file" (buffer-file-name)) alist)

                ;; check for crossref entries
                (if (assoc "crossref" alist)
                    (setq alist
                          (append
                           alist (reftex-get-crossref-alist alist))))

                ;; format the entry
                (push (cons "&formatted" (reftex-format-bib-entry alist))
                      alist)

		;; make key the first element
		(push (reftex-get-bib-field "&key" alist) alist)

                ;; add it to the list
                (push alist found-list))))
          (reftex-kill-temporary-buffers))))
    (setq found-list (nreverse found-list))

    ;; Sorting
    (cond
     ((eq 'author reftex-sort-bibtex-matches)
      (sort found-list 'reftex-bib-sort-author))
     ((eq 'year   reftex-sort-bibtex-matches)
      (sort found-list 'reftex-bib-sort-year))
     ((eq 'reverse-year reftex-sort-bibtex-matches)
      (sort found-list 'reftex-bib-sort-year-reverse))
     (t found-list))))

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: hyperbole: programmatic button creation
  2003-11-20 14:49 hyperbole: programmatic button creation Jim Ottaway
@ 2003-11-22  2:15 ` Brad Collins
       [not found] ` <mailman.427.1069471636.399.help-gnu-emacs@gnu.org>
  1 sibling, 0 replies; 3+ messages in thread
From: Brad Collins @ 2003-11-22  2:15 UTC (permalink / raw)




Cool idea, I'd be interested in seeing the finished app....

I'd also love to create a function in boxquote so that I could
automatically pull out a bibtex entry, format it and dump it in a
boxquote in a simular way that boxquote-define-function works so you'd
get something like this:

,----[ Morris:1871:LHR ]
|   form  	 :Book (Print, Microform, Electronic, etc.)
|   personalName :Morris, Richard, 1833-1894.
|   uniformTitle :Legends of the holy rood
|   mainTitle  	 :Legends of the holy rood : Symbols of the passion
|                   and cross-poems. In Old English of the eleventh,
|                   fourteenth, and fifteenth centuries. Ed. from
|                   mss. in the British Museum and Bodleian Libraries;
|                   with introduction, translations, and glossarial
|                   index / by Richard Morris.
|   published  	 :London : Pub. for the Early English Text Society, by
|                   N. Trübner & Co., 1871.
|   year  	 1871,
|   series  	 :Early English Text Society O.S. ;no. 46
|   description  :xxxi, 240 p. : ill. ; 22 cm.
|   language  	 :English: Middle English
|   edition  	 :first
|   LOCClass  	 :PR1119 .A2 no. 46
|   LOCsubject   :Cross and crosses -- Legends.
|   LOCsubject 	 :Historia sanctæ crucis. English.
|   reprint  	 :Reprint: New York: Greenwood Press, 1969
`----

Obviously, this was taken from a very localized Bibtex entry :)

It's on my list of things to do in the next week or so.... if anyone
is interested I'll pass it on when I get it working.

b/

-------------------------
Brad Collins
Chenla Labs
Bangkok, Thailand

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: hyperbole: programmatic button creation
       [not found] ` <mailman.427.1069471636.399.help-gnu-emacs@gnu.org>
@ 2003-11-23 16:12   ` Jim Ottaway
  0 siblings, 0 replies; 3+ messages in thread
From: Jim Ottaway @ 2003-11-23 16:12 UTC (permalink / raw)


>>>>> Brad Collins <brad@studiojungle.net> writes:

> Cool idea, I'd be interested in seeing the finished app....

Well I have now managed to unravel enough of the hyperbole code to
come up with something that works.  I have posted it on
gnu.emacs.sources. 

> I'd also love to create a function in boxquote so that I could
> automatically pull out a bibtex entry, format it and dump it in a
> boxquote in a simular way that boxquote-define-function works 

[snip]

> It's on my list of things to do in the next week or so.... if anyone
> is interested I'll pass it on when I get it working.

That sounds useful too.  I look forward to seeing what you come up
with.

Regards,

Jim Ottaway

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2003-11-23 16:12 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2003-11-20 14:49 hyperbole: programmatic button creation Jim Ottaway
2003-11-22  2:15 ` Brad Collins
     [not found] ` <mailman.427.1069471636.399.help-gnu-emacs@gnu.org>
2003-11-23 16:12   ` Jim Ottaway

Code repositories for project(s) associated with this external index

	https://git.savannah.gnu.org/cgit/emacs.git
	https://git.savannah.gnu.org/cgit/emacs/org-mode.git

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.