From 6a9de26ac3efbdd9931c74db90e2aeac2bc0dca8 Mon Sep 17 00:00:00 2001 From: Visuwesh Date: Sun, 6 Oct 2024 18:02:06 +0530 Subject: [PATCH] Make imenu index generation for PDFs more reliable Do away with parsing the output of "mutool show FILE outline" since the URI reported in its output may not include the page number of the heading, and instead may contained "nameddest" elements which cannot be resolved using "mutool". Instead, use a MuPDF JS script to generate the PDF outline allowing to resolve such URIs. * lisp/doc-view.el (doc-view--outline-rx): Remove as no longer needed. (doc-view--outline): Reflect that outline can be generated for non-PDF files too. (doc-view--mutool-pdf-outline-script): Add new variable to hold the JS script used to generate the outline. (doc-view--pdf-outline): Use the script. (bug#73638) --- lisp/doc-view.el | 48 ++++++++++++++++++++++++++++++++---------------- 1 file changed, 32 insertions(+), 16 deletions(-) diff --git a/lisp/doc-view.el b/lisp/doc-view.el index 446beeafd9f..a5e84f1e2ab 100644 --- a/lisp/doc-view.el +++ b/lisp/doc-view.el @@ -1969,14 +1969,26 @@ doc-view-search-previous-match (doc-view-goto-page (caar (last doc-view--current-search-matches))))))) ;;;; Imenu support -(defconst doc-view--outline-rx - "[^\t]+\\(\t+\\)\"\\(.+\\)\"\t#\\(?:page=\\)?\\([0-9]+\\)") - (defvar-local doc-view--outline nil - "Cached PDF outline, so that it is only computed once per document. + "Cached document outline, so that it is only computed once per document. It can be the symbol `unavailable' to indicate that outline is unavailable for the document.") +(defvar doc-view--mutool-pdf-outline-script + "var document = new Document.openDocument(\"%s\", \"application/pdf\"); +var outline = document.loadOutline(); +if(!outline) quit(); +function pp(outl, level){print(\"((level . \" + level + \")\");\ +print(\"(title . \" + repr(outl.title) + \")\");\ +print(\"(page . \" + document.resolveLink(outl.uri) + \"))\");\ +if(outl.down){for(var i=0; i