diff options
Diffstat (limited to 'nov.el')
| -rw-r--r-- | nov.el | 44 | 
1 files changed, 44 insertions, 0 deletions
| @@ -858,5 +858,49 @@ See also `nov-bookmark-make-record'."   :follow 'nov-org-link-follow   :store 'nov-org-link-store) + +;;; Imenu interop + +(defun nov-imenu-goto-function (_name filename target) +  "Visit imenu item using FILENAME and TARGET." +  (nov-visit-relative-file filename target)) + +(defun nov--imenu-create-epub2-index (toc-path) +  (let ((toc (with-temp-buffer +               (insert-file-contents toc-path) +               (libxml-parse-xml-region (point-min) (point-max))))) +    (mapcar +     (lambda (node) +       (-let* ((label-node (esxml-query "navLabel>text" node)) +               (content-node (esxml-query "content" node)) +               (href (nov-urldecode (esxml-node-attribute 'src content-node))) +               (label (car (esxml-node-children label-node))) +               ((filename target) (nov-url-filename-and-target href))) +         (list label filename 'nov-imenu-goto-function target))) +     (esxml-query-all "navPoint" toc)))) + +(defun nov--imenu-create-epub3-index (toc-path) +  (let ((toc (with-temp-buffer +               (insert-file-contents toc-path) +               (libxml-parse-html-region (point-min) (point-max))))) +    (mapcar +     (lambda (node) +       (-let* ((href (esxml-node-attribute 'href node)) +               (label (car (esxml-node-children node))) +               ((filename target) (nov-url-filename-and-target href))) +         (list label filename 'nov-imenu-goto-function target))) +     (esxml-query-all "a" toc)))) + +(defun nov-imenu-create-index () +  "Generate Imenu index." +  (let ((toc-path (cdr (aref nov-documents 0)))) +    (if (version< nov-epub-version "3.0") +        (nov--imenu-create-epub2-index toc-path) +      (nov--imenu-create-epub3-index toc-path)))) + +(defun nov-imenu-setup () +  (setq imenu-create-index-function 'nov-imenu-create-index)) +(add-hook 'nov-mode-hook 'nov-imenu-setup) +  (provide 'nov)  ;;; nov.el ends here | 
