[Prev][Next][Index][Thread]

w3-imenu.el



Attached is a small module to help W3 use imenus.

Mileage varies depending on how well structured a WWW page is.

;;;$Id: w3-imenu.el,v 1.5 1997/08/11 17:13:25 raman Exp $
;;;Description: Build up navigation index for W3 documents:
(require 'cl)
;;{{{ Tags to index

(defvar w3-imenu-index-html-elements
  (list 'h1 'h2 'a)
  "*List of HTML tags whose buffer positions in the W3 presentation
should appear in the index")

(make-variable-buffer-local 'w3-imenu-index-html-elements)
;;}}}
;;{{{  Move to an element position

(defun w3-imenu-goto-next-element (element)
  "Move forward in the W3 buffer 
to the next occurrence of element element.
Return nil and leave point at end of buffer  if not found."
  (let ((position nil)
        (found nil)
        (stack (get-text-property (point) 'html-stack)))
    (while  (and (not (eobp))
                 (not found))
      (setq found
            (eq (caar stack) element))
      (setq position  (point))
            (goto-char
             (next-single-property-change  (point)  'html-stack
                                           (current-buffer) (point-max)))
            (setq stack (get-text-property (point) 'html-stack)))
    (if found position nil)))

;;}}}
;;{{{  create an index 

(defun w3-imenu-create-index ()
  "Returns an alist suitable for use by imenu"
  (declare (special w3-imenu-index-html-elements))
  (let ((index nil)
        (position nil)
        (marker nil))
    (save-excursion
      (loop for element in w3-imenu-index-html-elements
            do 
            (goto-char (point-min))
            (while (setq position
                         (w3-imenu-goto-next-element element))
              (setq marker (make-marker))
              (set-marker marker position)
            (push
             (cons
              (buffer-substring-no-properties position (point))
              marker)
             index))))
    index))

;;}}}
;;{{{ Tell W3 to start using it:
(declaim (special imenu-create-index-function))
(add-hook
 'w3-mode-hook
 (function
  (lambda ()
    (setq imenu-create-index-function 'w3-imenu-create-index))))

;;}}}
(provide 'w3-imenu)
;;{{{ end of file 

;;; local variables:
;;; folded-file: t
;;; end: 

;;}}}

-- 
Best Regards,
--raman

      Adobe Systems                 Tel: 1 (408) 536 3945   (W14-129)
      Advanced Technology Group     Fax: 1 (408) 537 4042 
      (W14 129) 345 Park Avenue     Email: raman@adobe.com 
      San Jose , CA 95110 -2704     Email:  raman@cs.cornell.edu
      http://labrador.corp.adobe.com/~raman/raman.html (Adobe  Internal)
      http://www.cs.cornell.edu/Info/People/raman/raman.html  (Cornell)
-----------------------------------------------------------------------
    Disclaimer: The opinions expressed are my own and in no way should be taken
as representative of my employer, Adobe Systems Inc.
____________________________________________________________