[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)
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [nongnu] elpa/racket-mode 9905d8d0e8: racket-{describe company}: Handle non-Scribble docs; fixes #649,
ELPA Syncer <=