a new version of libxml-doc.el. This new version works with both libxml1
* doc/libxml-doc.el: a new version of libxml-doc.el. This new
version works with both libxml1 and libxml2 (it autodetects
the prefix of the html-files) from Felix Natter.
* doc/xml.html: updated doc accordingly
Daniel
diff --git a/doc/libxml-doc.el b/doc/libxml-doc.el
index 0ffec25..634d008 100644
--- a/doc/libxml-doc.el
+++ b/doc/libxml-doc.el
@@ -1,11 +1,9 @@
- ;;; libxml-doc.el - look up libxml-symbols and start browser on documentation
+;;; libxml-doc.el - look up libxml-symbols and start browser on documentation
-;; Author: Felix Natter <fnatter@gmx.net>
+;; Author: Felix Natter <fnatter@gmx.net>, Geert Kloosterman <geertk@ai.rug.nl>
;; Created: Jun 21 2000
;; Keywords: libxml documentation
-;; 2001-05-31: Adapted by Geert Kloosterman <geertk@ai.rug.nl>
-
;; 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 2
@@ -26,19 +24,11 @@
;; (using lynx within emacs by default;
;; ----- Installing
;; 1. add the following to ~/.emacs (adapt path and remove comments !)
-;; (load ~/elisp/libxml-doc.el)
-;; you can also load this conditionally in a c-mode-hook (preferred)
-;;
-;;(add-hook 'c-mode-hook (lambda()
-;; (load-file "~/elisp/libxml-doc.el")))
-;;
-;; or you can use this if you are using libxml2
-;;(add-hook 'c-mode-hook (lambda()
-;; (save-excursion
-;; (if (search-forward "#include <libxml/" nil t nil)
-;; (load-file "~/elisp/libxml-doc.el"))
-;; )))
-;;
+;; (autoload 'libxmldoc-lookup-symbol "~/elisp/libxml-doc"
+;; "Look up libxml-symbols and start browser on documentation." t)
+;; or put this file in load-path and use this:
+;; (autoload 'libxmldoc-lookup-symbol "libxml-doc"
+;; "Look up libxml-symbols and start browser on documentation." t)
;; 2. adapt libxmldoc-root:
;; i.e. (setq libxmldoc-root "~/libxml2-2.0.0/doc/html/")
;; 3. change the filter-regex: by default, cpp-defines, callbacks and
@@ -46,9 +36,20 @@
;; 4. consider customizing libxmldoc-browse-url (lynx by default);
;; cannot use Emacs/W3 4.0pre46 because it has problems with the html
;; ----- Using
-;; call M-x libxmldoc-lookup-symbol: this will prompt with completion
-;; and then open the browser showing the documentation. If the word
-;; around the point matches a symbol, that is used instead (no completion).
+;; call M-x libxmldoc-lookup-symbol: this will prompt with completion and
+;; then open the browser showing the documentation. If the word around the
+;; point matches a symbol, that is used instead. You can also call
+;; libxmldoc-lookup-symbol noninteractively and pass the symbol.
+
+;; Note:
+;; an alternative to libxml-doc is emacs tags:
+;; $ cd libxml2-2.3.8
+;; $ etags *.c *.h
+;; $ emacs
+;; M-. (M-x find-tag) ... or
+;; M-x tags-search ... RET M-, M-, ...
+;; (for more information: info emacs RET m Tags RET)
+
;;; ChangeLog:
;; Wed Jun 21 01:07:12 2000: initial release
@@ -64,117 +65,131 @@
;; With 'word, identifiers with an underscore (e.g. BAD_CAST)
;; don't get matched.
-;; Sat Jun 02 2001 (Geert):
-;; - Cleaned up URI construction: no extraneous '/' in the URI when
-;; `libxmldoc-root' ends with a '/'.
+;; Fri Jun 8 16:29:18 2001, Sat Jun 23 16:19:47 2001:
+;; complete rewrite of libxmldoc-lookup-symbol
+;; by Felix Natter <fnatter@gmx.net>, Geert Kloosterman <geertk@ai.rug.nl>:
;; - Now keeps the list of symbols between calls to speed things up.
-;; Every filter gets it's own list of symbols. This way it's
-;; possible to use different values of `libxmldoc-filter-regexp' in
-;; different buffers.
-;; - Fixed symbols for function pointers: now skips '*' when
-;; fetching identifiers from the html files.
+;; - filtering is only used when no symbol is passed and
+;; thing-at-point does not match a symbol and "*" + thing-at-point
+;; does not match a symbol (this is used to catch callbacks) and
+;; libxmldoc-filter-regexp is non-nil.
+;; Sat Jun 23 16:20:34 2001: update the docstrings
+;; Sat Jun 23 16:22:54 2001 (Geert Kloosterman <geertk@ai.rug.nl>):
+;; update README: use autoload instead of load+c-mode-hook
;;; TODO:
-;; use command-execute for libxml-browse-url
+;; - use command-execute for libxmldoc-browse-url
+;; - keep (match-string 1) in a variable (libxmldoc-get-list-of-symbols)
+;; - check the (require ..)-statements
;;; Code:
-(defvar libxmldoc-root "~/libxml/www.xmlsoft.org"
+(provide 'libxmldoc)
+
+(require 'browse-url)
+(require 'term)
+
+(defvar libxmldoc-root "~/src/libxml2-2.3.8/doc/html"
"The root-directory of the libxml2-documentation (~ will be expanded).")
-(defvar libxmldoc-filter-regexp "^html\\|^\\*\\|^[A-Z_]+\\|^$"
+(defvar libxmldoc-filter-regexp "^html\\|^\\*\\|^[A-Z_]+"
"Symbols that match this regular expression will be excluded when doing
-completion.
+completion and no symbol is specified.
For example:
callbacks: \"^\\\\*\"
cpp-defines: \"[A-Z_]+\"
xml-functions \"^xml\"
html-functions \"^html\"
sax-functions \".*SAX\"
- By default, callbacks, cpp-defines and html* are excluded. If you redefine
- this, you should include \"^$\" as alternative, which removes empty
- tokens. i.e. removing \"^html\\\\|\" from the above regexp causes html* to
- be shown.")
+By default, callbacks, cpp-defines and html* are excluded.
+Set this to nil if you don't want filtering.")
(defvar libxmldoc-browse-url 'browse-url-lynx-emacs
"Browser used for browsing documentation. Emacs/W3 4.0pre46 cannot handle
-the html, so lynx-emacs is used by default.")
+the html (and would be too slow), so lynx-emacs is used by default.")
(defvar libxmldoc-symbol-history nil
"History for looking up libxml-symbols.")
-
-;; GJK: Keep the results from libxmldoc-get-list-of-symbols between
-;; calls to speed things up.
-(defvar libxmldoc-symbols-alist nil
- "Alist which stores a symbol list for each `libxmldoc-filter-regexp'. The
-never matching regex \"$^\" is used as key when no filtering is needed.")
+(defvar libxmldoc-symbols nil
+ "The list of libxml-symbols.")
;;;; public functions
(defun libxmldoc-lookup-symbol(&optional symbol)
"Look up xml-symbol." (interactive)
- (let ((symbols)
- (real-symbol symbol)
- (url)
- ;; We don't want filtering when there's a symbol specified.
- ;; Use the never matching regex "$^" as a key when using no filter.
- (filter (if symbol "$^" libxmldoc-filter-regexp))
- (no-filter (if symbol t nil)))
-
- ;; Build up a symbol list if neccesary.
- (if (not (assoc filter libxmldoc-symbols-alist))
- (add-to-list 'libxmldoc-symbols-alist
- (cons filter
- (libxmldoc-get-list-of-symbols no-filter))))
+ (let
+ ;; this is necessary so that filtering is done case-sensitively
+ ((case-fold-search nil))
- ;; Use the appropriate symbol list.
- (setq symbols (cdr (assoc filter libxmldoc-symbols-alist)))
+ ;; Build up a symbol list if neccesary
+ (if (null libxmldoc-symbols)
+ (setq libxmldoc-symbols (libxmldoc-get-list-of-symbols)))
+
+ (cond
+ ((not (null symbol)) ;; symbol is specified as argument
+ (if (not (assoc symbol libxmldoc-symbols))
+ (setq symbol nil)))
+ ((assoc (thing-at-point 'symbol) libxmldoc-symbols)
+ (setq symbol (thing-at-point 'symbol)))
+ ;; this is needed to catch callbacks
+ ;; note: this could be rewritten to use (thing-at-point 'word)
+ ((assoc (concat "*" (thing-at-point 'symbol)) libxmldoc-symbols)
+ (setq symbol (concat "*" (thing-at-point 'symbol))))
+ )
- (if (null real-symbol)
- (if (assoc (thing-at-point 'symbol) symbols)
- (setq real-symbol (thing-at-point 'symbol))
- (setq real-symbol (completing-read "Libxml: " symbols nil t ""
- 'libxmldoc-symbol-history "" t))))
- (if (null (assoc real-symbol symbols))
- (error (concat "libxmldoc: '" real-symbol "' not found !")))
- (setq url (cdr (assoc real-symbol symbols)))
-;; (minibuffer-message uri)
- (apply libxmldoc-browse-url (list url))))
-
-;;(defun libxmldoc-lookup-symbol-at-point()
-;; "Look up libxml-symbol at point." (interactive)
-;; (libxmldoc-lookup-symbol (thing-at-point 'word)))
+ ;; omit "" t) from call to completing-read for the sake of xemacs
+ (setq symbol
+ (completing-read "Libxml: " (if (or symbol
+ (null libxmldoc-filter-regexp))
+ libxmldoc-symbols
+ (mapcar
+ '(lambda(key,value)
+ (if (null (string-match
+ libxmldoc-filter-regexp
+ (car key,value)))
+ key,value))
+ libxmldoc-symbols))
+ nil t symbol
+ 'libxmldoc-symbol-history))
+
+
+ ;; start browser
+ (apply libxmldoc-browse-url
+ (list (cdr (assoc symbol libxmldoc-symbols))))))
;;;; internal
-(defun libxmldoc-get-list-of-symbols(&optional nofilter)
+(defun libxmldoc-get-list-of-symbols()
"Get the list of html-links in the libxml-documentation."
- (let ((files (directory-files libxmldoc-root t
- "^libxml-.*\\.html$" t))
+ (let ((files
+ (directory-files
+ libxmldoc-root t
+ (concat "^" (if (file-exists-p (concat libxmldoc-root
+ "/libxml-parser.html"))
+ "libxml-"
+ "gnome-xml-")
+ ".*\\.html$") t))
(symbols ())
(case-fold-search t)
- (symbol)
(uri))
-;; (minibuffer-message "collecting libxml-symbols...")
+ (message "collecting libxml-symbols...")
(while (car files)
- (find-file (car files))
- (while (re-search-forward
- "<a[^>]*href[ \t\n]*=[ \t\n]*\"\\([^=>]*\\)\"[^>]*>" nil t nil)
- (setq uri (concat "file://"
- (expand-file-name (match-string 1)
- libxmldoc-root)))
- (if (not (re-search-forward "\\([^<]*\\)<" nil t nil)) ; GJK: no '*'
- (error "regexp error while finding libxml-symbols.."))
- (setq symbol (match-string 1))
- (setq case-fold-search nil)
- (if (or nofilter
- (null (string-match libxmldoc-filter-regexp symbol)))
- (add-to-list 'symbols (cons symbol uri)))
- (setq case-fold-search t)
- )
- (kill-buffer (current-buffer))
- (setq files (cdr files)))
- symbols))
+ (with-temp-buffer
+ (insert-file-contents (car files))
+ (goto-char (point-min))
+ (while (re-search-forward
+ "<a[^>]*href[ \t\n]*=[ \t\n]*\"\\([^=>]*\\)\"[^>]*>" nil t nil)
+ (setq uri (concat "file://" (expand-file-name libxmldoc-root) "/"
+ (match-string 1)))
+ (if (not (re-search-forward "\\([^<]*\\)<" nil t nil))
+ (error "regexp error while getting libxml-symbols.."))
+ ;; this needs add-to-list because i.e. xmlChar appears often
+ (if (not (string-equal "" (match-string 1)))
+ (add-to-list 'symbols (cons (match-string 1) uri))))
+ ;; (setq symbols (cons (cons (match-string 1) uri) symbols)))
+ )
+ (setq files (cdr files)))
+ symbols))
;;; libxml-doc.el ends here
-
+
;;; Local Variables:
;;; indent-tabs-mode: nil
;;; End: