emacs-elpa-diffs
[Top][All Lists]
Advanced

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

[nongnu] elpa/racket-mode 9905d8d0e8: racket-{describe company}: Handle


From: ELPA Syncer
Subject: [nongnu] elpa/racket-mode 9905d8d0e8: racket-{describe company}: Handle non-Scribble docs; fixes #649
Date: Sat, 10 Dec 2022 13:59:33 -0500 (EST)

branch: elpa/racket-mode
commit 9905d8d0e87747749566d98068ce9b2996305fc1
Author: Greg Hendershott <git@greghendershott.com>
Commit: Greg Hendershott <git@greghendershott.com>

    racket-{describe company}: Handle non-Scribble docs; fixes #649
    
    Our effort to extract just the maincolumn/main div elements was
    failing for non-Scribble-generated docs like those for r5rs. Handle
    those for both racket-describe (full doc pages) and
    racket-company (for when the user presses C-h and we supply a
    "peephole" buffer into only the relevant elements).
    
    Also I realized that an HTML `base` element should really only appear
    inside a `head` element. Although it might not matter for the Emacs
    shr renderer, clean this up. Rewrite in terms of a function that
    returns an entire `body` element. Move the `base` addition up higher,
    and put it in the `head` element.
---
 racket-company-doc.el | 54 ++++++++++++++++++++-------------------------------
 racket-scribble.el    | 44 +++++++++++++++++++++++++----------------
 2 files changed, 48 insertions(+), 50 deletions(-)

diff --git a/racket-company-doc.el b/racket-company-doc.el
index 1487211056..9df697deb2 100644
--- a/racket-company-doc.el
+++ b/racket-company-doc.el
@@ -8,9 +8,11 @@
 
 ;; SPDX-License-Identifier: GPL-3.0-or-later
 
+(require 'seq)
 (require 'shr)
-(require 'racket-describe)
 (require 'racket-back-end)
+(require 'racket-describe)
+(require 'racket-scribble)
 
 (defun racket--company-doc-buffer (how str)
   (pcase (racket--cmd/await (racket--repl-session-id)
@@ -33,9 +35,9 @@
                              path anchor)
     (let* ((tramp-verbose 2)            ;avoid excessive messages
            (dom   (racket--html-file->dom path))
-           (mains (racket--scribble-main-elements path dom))
-           (mains (racket--scribble-mains-for-anchor mains anchor))
-           (dom   `(div () ,@mains))
+           (body  (racket--scribble-body dom))
+           (elems (racket--company-elements-for-anchor body anchor))
+           (dom   `(div () ,@elems))
            (dom   (racket--walk-dom dom)))
       (ignore tramp-verbose)
       (save-excursion
@@ -46,18 +48,18 @@
       (while (re-search-forward (string racket--scribble-temp-nbsp) nil t)
         (replace-match " " t t)))))
 
-(defun racket--scribble-mains-for-anchor (mains anchor)
-  "Return the subset of MAINS dom elements pertaining to ANCHOR."
-  (while (and mains (not (racket--anchored-element (car mains) anchor)))
-    (setq mains (cdr mains)))
-  (and mains
+(defun racket--company-elements-for-anchor (xs anchor)
+  "Return the subset of XS dom elements pertaining to ANCHOR."
+  (while (and xs (not (racket--anchored-element (car xs) anchor)))
+    (setq xs (cdr xs)))
+  (and xs
        (let ((result nil))
-         (push (car mains) result)
-         (setq mains (cdr mains))
-         (while (and mains (not (or (racket--heading-element (car mains))
-                                    (racket--anchored-element (car mains)))))
-           (push (car mains) result)
-           (setq mains (cdr mains)))
+         (push (car xs) result)
+         (setq xs (cdr xs))
+         (while (and xs (not (or (racket--heading-element (car xs))
+                                 (racket--anchored-element (car xs)))))
+           (push (car xs) result)
+           (setq xs (cdr xs)))
          (reverse result))))
 
 (defun racket--heading-element (x)
@@ -65,24 +67,10 @@
        (memq (car x) '(h1 h2 h3 h4 h5 h6))))
 
 (defun racket--anchored-element (x &optional name)
-  (cl-labels
-      ((anchor
-        (xs)
-        (cl-some (lambda (x)
-                   (pcase x
-                     (`(a ((name . ,a)) . ,_) (or (not name) (equal name a)))
-                     (`(,_tag ,_as . ,es) (anchor es))))
-                 xs)))
-    (pcase x
-      (`(div ((class . "SIntrapara")) . ,es)
-       (anchor es))
-      ((and `(blockquote ((class . "leftindent"))
-                         (p)
-                         (div ((class . "SIntrapara"))
-                              (blockquote ((class "SVInsetFlow"))
-                                          (table ,as . ,es)))))
-       (when (member '(class . "boxed RBoxed") as)
-         (anchor es))))))
+  (pcase x
+    (`(a ((name . ,a)) . ,_) (or (not name) (equal name a)))
+    (`(,_tag ,_as . ,es) (seq-some (lambda (v) (racket--anchored-element v 
name))
+                                   es))))
 
 (provide 'racket-company-doc)
 
diff --git a/racket-scribble.el b/racket-scribble.el
index ea43c56825..363af6c68e 100644
--- a/racket-scribble.el
+++ b/racket-scribble.el
@@ -8,6 +8,7 @@
 
 ;; SPDX-License-Identifier: GPL-3.0-or-later
 
+(require 'seq)
 (require 'shr)
 (require 'subr-x)
 (require 'url-util)
@@ -35,29 +36,38 @@ the effect of being non-breaking.")
   (with-temp-message (format "Getting and formatting documentation %s..."
                              path)
     (let* ((tramp-verbose 2) ;avoid excessive messages
-           (base  (file-name-directory path))
-           (dom   (racket--html-file->dom path))
-           (mains (racket--scribble-main-elements path dom))
-           (dom   (racket--massage-scribble-dom path base mains)))
-      dom)))
+           (base (file-name-directory path))
+           (dom  (racket--html-file->dom path))
+           (body (racket--scribble-body dom))
+           (body (racket--massage-scribble-dom path base body)))
+      `(html ()
+             (head () (base ((href . ,base))))
+             ,body))))
 
 (defun racket--html-file->dom (path)
   (with-temp-buffer
     (insert-file-contents-literally path)
     (libxml-parse-html-region (point-min) (point-max))))
 
-(defun racket--scribble-main-elements (path dom)
-  (pcase dom
-    (`(html ,_
-            (head . ,_)
-            (body ,_
-                  (div ((class . "tocset")) . ,_)
-                  (div ((class . "maincolumn"))
-                       (div ((class . "main")) . ,xs))
-                  . ,_))
-     `(div ()
-           (base ((href . ,(file-name-directory path))))
-           ,@xs))))
+(defun racket--scribble-body (dom)
+  "Return a body with the interesting elements in DOM.
+
+With a normal Racket documentation page produced by Scribble,
+these are only elements from the maincolumn/main div -- not the
+tocset sibling.
+
+With other doc pages, e.g. from r5rs, these are simply all the
+body elements."
+  (pcase (seq-some (lambda (v)
+                     (pcase v (`(body . ,_) v)))
+                   dom)
+    (`(body ,_
+            (div ((class . "tocset")) . ,_)
+            (div ((class . "maincolumn"))
+                 (div ((class . "main")) . ,xs))
+            . ,_)
+     `(body () ,@xs))
+    (body body)))
 
 ;; Dynamically bound (like Racket parameters).
 (defvar racket--scribble-file nil)



reply via email to

[Prev in Thread] Current Thread [Next in Thread]