branch: externals/hyperbole commit 8fa9e4e19880b6270c138c634855edab8779c2f8 Merge: 12c4a31a82 53f757ce03 Author: Robert Weiner <r...@gnu.org> Commit: GitHub <nore...@github.com>
Merge pull request #578 from rswgnu/rsw hibtypes.el - Add new 'hywiki-existing-word' ibtype and other fixes --- ChangeLog | 23 ++++++++++++++ hibtypes.el | 15 +++++++++ hui-menu.el | 14 ++++---- hui-mini.el | 11 ++++--- hui-mouse.el | 3 +- hywiki.el | 102 +++++++++++++++++++++++++++++++++++++++++++---------------- 6 files changed, 127 insertions(+), 41 deletions(-) diff --git a/ChangeLog b/ChangeLog index de7e3b4d12..8c5a236c28 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,26 @@ +2024-08-18 Bob Weiner <r...@gnu.org> + +* hywiki.el (hywiki-maybe-at-wikiword-beginning): Fix to handle word + preceded by a single square bracket. + +* hibtypes.el (hywiki-existing-word): Add this new ibtype to match to + HyWikiWords with an existing page at a higher priority than those + without an existing page, so can be handled separately. Must be + defined in this file to set its priority at a high level. + +* hywiki.el (hywiki-is-wikiword): Rename to 'hywiki-word-is-p'. + (hywiki-word-activate , hywiki-page-strip-section, + hywiki-page-exists-p): Add. + (hywiki-word-consult-grep): Rename from `hywiki-word-search'. + hui-mini.el (hui:menus): Change "Act" item from 'hui:ibut-act' to + new 'hywiki-word-activate'. + +* hui-menu.el (infodock-hyperbole-menu): + hui-mini.el (HyWiki, IButton): Change help function from 'hui:hbut-help' + to 'hkey-help' so handles more contexts without erroring. + +* hui-menu.el (hui-menu-org-meta-return-options): Remove wrong extra parens. + 2024-08-18 Mats Lidell <ma...@gnu.org> * kotl/klink.el (klink:ignore-modes, klink:c-style-modes): diff --git a/hibtypes.el b/hibtypes.el index 11f6338543..faeaac5ea9 100644 --- a/hibtypes.el +++ b/hibtypes.el @@ -1634,6 +1634,21 @@ If a boolean function or variable, display its value." (apply #'actype:eval actype args))) (error "(action:help): No action button labeled: %s" label))))) +;;; ======================================================================== +;;; Activates HyWikiWords with existing HyWiki pages. +;;; Non-existing HyWikiWords are handled by the (load "hywiki") at a low +;;; priority earlier in this file which defines the `hywiki-word' ibtype. +;;; ======================================================================== + +(defib hywiki-existing-word () + "When on a HyWiki word with an existing page, display its page and optional section." + (cl-destructuring-bind (page-name start end) + (hywiki-page-exists-p 'range) + (when page-name + (when (and start end) + (ibut:label-set page-name (match-beginning 0) (match-end 0))) + (hact 'hywiki-find-page page-name)))) + ;;; ======================================================================== ;;; Inserts completion into minibuffer or other window. ;;; ======================================================================== diff --git a/hui-menu.el b/hui-menu.el index cf19c8c443..799ee50486 100644 --- a/hui-menu.el +++ b/hui-menu.el @@ -3,7 +3,7 @@ ;; Author: Bob Weiner ;; ;; Orig-Date: 28-Oct-94 at 10:59:44 -;; Last-Mod: 17-Aug-24 at 17:44:53 by Bob Weiner +;; Last-Mod: 18-Aug-24 at 15:33:29 by Bob Weiner ;; ;; SPDX-License-Identifier: GPL-3.0-or-later ;; @@ -210,7 +210,7 @@ Return t if cutoff, else nil." t)) (defconst hui-menu-org-meta-return-options - '(("Org-M-RETURN" + '("Org-M-RETURN" "----" "----" ["All-Programmed-Contexts" @@ -224,7 +224,7 @@ Return t if cutoff, else nil." ["Ignored-by-Hyperbole" (customize-save-variable 'hsys-org-enable-smart-keys nil) :style radio :selected (when (boundp 'hsys-org-enable-smart-keys) - (eq hsys-org-enable-smart-keys nil))])) + (eq hsys-org-enable-smart-keys nil))]) "Settings for Hyperbole Smart Key overrides to {M-RET} within Org mode.") (defconst hui-menu-options @@ -450,16 +450,16 @@ REBUILD-FLAG is non-nil, in which case the menu is rebuilt." (list "HyWiki" ["Manual" (id-info "(hyperbole)HyWiki") t] "----" - ["Activate" hui:ibut-act t] + ["Activate" hywiki-word-activate t] ["Create" hywiki-add-page-and-display t] ["Edit" hywiki-find-page t] ["Grep-Consult" hywiki-consult-grep t] - ["Help" hui:hbut-help t] + ["Help" hkey-help t] ["Link" hywiki-add-link t] hui-menu-org-meta-return-options ["Publish" hywiki-publish-to-html t] ["Toggle-HyWiki-Mode" hywiki-mode t] - ["WikiWord-Consult" hywiki-word-search t]) + ["WikiWord-Consult" hywiki-word-consult-grep t]) '("Implicit-Button" ["Manual" (id-info "(hyperbole)Implicit Buttons") t] "----" @@ -467,7 +467,7 @@ REBUILD-FLAG is non-nil, in which case the menu is rebuilt." ["Create" hui:ibut-create t] ["Delete-Type" (hui:htype-delete 'ibtypes) t] ["Edit" hui:ibut-edit t] - ["Help" hui:hbut-help t] + ["Help" hkey-help t] ["Link" hui:ibut-link-directly t] ["Name" hui:ibut-label-create t] ["Rename" hui:ibut-rename t] diff --git a/hui-mini.el b/hui-mini.el index 26f1a5a0a4..9b0522626c 100644 --- a/hui-mini.el +++ b/hui-mini.el @@ -3,7 +3,7 @@ ;; Author: Bob Weiner ;; ;; Orig-Date: 15-Oct-91 at 20:13:17 -;; Last-Mod: 17-Aug-24 at 17:45:49 by Bob Weiner +;; Last-Mod: 18-Aug-24 at 15:33:00 by Bob Weiner ;; ;; SPDX-License-Identifier: GPL-3.0-or-later ;; @@ -843,14 +843,15 @@ command instead. Typically prevents clashes over {\\`C-c' /}." ("Rename" hui:gbut-rename "Rename a global button."))) '(hywiki . (("HyWiki>") - ("Act" hui:ibut-act "Activate HyWikiWord link at point.") + ("Act" hywiki-word-activate + "Activate HyWikiWord link at point or emulate a press of a Smart Key.") ("Create" hywiki-add-page-and-display "Create and display a new HyWiki page. Shows existing page names to aid in new naming.") ("Edit" hywiki-find-page "Prompt with completion for and display a HyWiki page ready for editing.") ("GrepConsult" hywiki-consult-grep "Grep over HyWiki pages with interactive consult-grep.") - ("Help" hui:hbut-help + ("Help" hkey-help "Report on a HyWikiWord's attributes.") ("Info" (id-info "(hyperbole)HyWiki") "Display Hyperbole manual section on HyWiki.") @@ -862,7 +863,7 @@ command instead. Typically prevents clashes over {\\`C-c' /}." "Publish modified pages in the HyWiki to HTML; prefix arg to publish all pages.") ("Toggle" hywiki-mode "Toggle whether HyWikiWords are highlighted and active in buffers outside of the HyWiki page directory.") - ("WikiWordConsult" hywiki-word-search + ("WikiWordConsult" hywiki-word-consult-grep "Use `hywiki-consult-grep' to show occurrences of a prompted for HyWikiWord."))) '(ibut . (("IButton>") @@ -873,7 +874,7 @@ command instead. Typically prevents clashes over {\\`C-c' /}." ("DeleteType" (hui:htype-delete 'ibtypes) "Delete specified implicit button type.") ("Edit" hui:ibut-edit "Edit/modify named implicit button attributes.") - ("Help" hui:hbut-help "Report on button's attributes.") + ("Help" hkey-help "Report on button's attributes.") ("Info" (id-info "(hyperbole)Implicit Buttons") "Display manual section on implicit buttons.") ("Link" hui:ibut-link-directly "Insert an ibut link at point to other/another window.") diff --git a/hui-mouse.el b/hui-mouse.el index be78372ec8..b73e9f6f21 100644 --- a/hui-mouse.el +++ b/hui-mouse.el @@ -3,7 +3,7 @@ ;; Author: Bob Weiner ;; ;; Orig-Date: 04-Feb-89 -;; Last-Mod: 18-Aug-24 at 09:35:51 by Mats Lidell +;; Last-Mod: 18-Aug-24 at 22:03:38 by Bob Weiner ;; ;; SPDX-License-Identifier: GPL-3.0-or-later ;; @@ -253,7 +253,6 @@ Its default value is `smart-scroll-down'. To disable it, set it to (setq hkey-value (ert-results-filter-status-p))) . ((smart-ert-results hkey-value) . (smart-ert-results-assist hkey-value))) ;; - ;; ;; Handle Emacs push buttons in buffers ((and (fboundp 'button-at) (button-at (point))) . ((smart-push-button nil (mouse-event-p last-command-event)) diff --git a/hywiki.el b/hywiki.el index 35d757f69c..1d58c2ed91 100644 --- a/hywiki.el +++ b/hywiki.el @@ -3,7 +3,7 @@ ;; Author: Bob Weiner ;; ;; Orig-Date: 21-Apr-24 at 22:41:13 -;; Last-Mod: 13-Aug-24 at 01:44:00 by Bob Weiner +;; Last-Mod: 18-Aug-24 at 18:02:28 by Bob Weiner ;; ;; SPDX-License-Identifier: GPL-3.0-or-later ;; @@ -480,7 +480,8 @@ See the Info documentation at \"(hyperbole)HyWiki\". ;;; ************************************************************************ (defib hywiki-word () - "When on a HyWiki word, display its page and optional section." + "When on a HyWiki word, display its page and optional section. +If the associated HyWiki page does not exist, create it automatically." (let ((page-name (hywiki-word-at))) (when page-name (ibut:label-set page-name (match-beginning 0) (match-end 0)) @@ -530,10 +531,9 @@ successfully finding a page and reading it into a buffer, run (hywiki-maybe-highlight-page-names) (run-hooks 'hywiki-find-page-hook) page-file))) - ;; When called from without a page-name and outside - ;; hywiki-directory, just find as a regular file and use next - ;; line to highlight HyWikiWords only if buffer was not - ;; previously highlighted. + ;; When called without a page-name and outside hywiki-directory, + ;; just find as a regular file and use next line to highlight + ;; HyWikiWords only if buffer was not previously highlighted. (hywiki-maybe-highlight-page-names)))) ;;; ************************************************************************ @@ -563,7 +563,7 @@ not. Use `hywiki-get-page' to determine whether a HyWiki page exists." (interactive (list (hywiki-read-new-page-name "Add HyWiki page: "))) - (if (hywiki-is-wikiword page-name) + (if (hywiki-word-is-p page-name) (progn (when (match-string-no-properties 2 page-name) ;; Remove any #section suffix in PAGE-NAME. @@ -658,17 +658,29 @@ per file to the absolute value of MAX-MATCHES, if given and not 0. If Does not test whether or not a page exists for the HyWiki word. Use `hywiki-get-page' to determine whether a HyWiki page exists." ;; Ignore wikiwords preceded by any non-whitespace character, except - ;; any of these: ({<"'`' - (when (or (bolp) (cl-find (char-before) "\(\{\<\"'`\t\n\r\f ")) + ;; any of these: [({<"'`' + (when (or (bolp) (cl-find (char-before) "\[\(\{\<\"'`\t\n\r\f ")) t)) -(defun hywiki-word-at () +(defun hywiki-word-activate (&optional arg) + "Display HyWiki page for wiki word at point, creating the page if needed. +If found, return the full path of the page. + +If not on a wiki word and optional prefix ARG is null, emulate an +Action Key press; with a prefix ARG, emulate an Assist Key press." + (interactive "P") + (let ((word hywiki-word-at)) + (if word + (hywiki-find-page word) + (hkey-either arg)))) + +(defun hywiki-word-at (&optional) "Return HyWiki word and optional #section at point or nil if not on one. -Does not test whether or not a page exists for the HyWiki word; use -`hywiki-get-page' for that. +Does not test whether or not a page exists for the HyWiki word; call +`hywiki-page-exists-p' without an argument for that. -A call to `hywiki-active-in-current-buffer-p' must return non-nil or -this will return nil." +A call to `hywiki-active-in-current-buffer-p' at point must return non-nil +or this will return nil." (when (hywiki-active-in-current-buffer-p) (if (setq hywiki--range (hproperty:char-property-range (point) 'face hywiki-word-face)) @@ -688,7 +700,7 @@ this will return nil." (format "[ \t\n\r]*\\(%s:\\)?" hywiki-org-link-type))) ;; Ignore prefixed, typed hy:HyWikiWord since Org mode will display those. - (when (hywiki-is-wikiword wikiword) + (when (hywiki-word-is-p wikiword) wikiword)) ;; Handle a HyWiki word with optional #section; if it is an Org ;; link, it may optionally have a hy: link-type prefix. @@ -707,13 +719,23 @@ this will return nil." (buffer-substring-no-properties (match-beginning 0) (match-end 0))))))))))))) -(defun hywiki-word-search (word) +(defun hywiki-word-consult-grep (word) "Use `hywiki-consult-grep' to show occurrences of a prompted for HyWikiWord. Default to any HyWikiWord at point." (interactive (list (hywiki-read-page-name))) (if (and (stringp word) (not (string-empty-p word))) (hywiki-consult-grep (concat "\\b" (regexp-quote word) "\\b")) - (user-error "(hywiki-word-search): Invalid HyWikiWord: '%s'; must be capitalized, all alpha" word))) + (user-error "(hywiki-word-consult-grep): Invalid HyWikiWord: '%s'; must be capitalized, all alpha" word))) + +(defun hywiki-word-is-p (word) + "Return non-nil if WORD is a HyWiki word and optional #section. +The page for the word may not yet exist. Use `hywiki-get-page' +to determine whether a HyWiki word page exists." + (and (stringp word) (not (string-empty-p word)) + (let (case-fold-search) + (or (string-match hywiki-word-with-optional-section-exact-regexp word) + (eq (string-match (concat "\\`" hywiki-word-with-optional-section-regexp "\\'") word) + 0))))) ;;;###autoload (defun hywiki-maybe-dehighlight-page-names (&optional region-start region-end) @@ -1059,16 +1081,6 @@ are typed in the buffer." (or default-directory "")) (setq hywiki-page-flag t)))) -(defun hywiki-is-wikiword (word) - "Return non-nil if WORD is a HyWiki word and optional #section. -The page for the word may not yet exist. Use `hywiki-get-page' -to determine whether a HyWiki word page exists." - (and (stringp word) (not (string-empty-p word)) - (let (case-fold-search) - (or (string-match hywiki-word-with-optional-section-exact-regexp word) - (eq (string-match (concat "\\`" hywiki-word-with-optional-section-regexp "\\'") word) - 0))))) - (defun hywiki-get-buffer-page-name () "Extract the page name from the buffer file name or else buffer name." (file-name-sans-extension (file-name-nondirectory @@ -1280,6 +1292,42 @@ variables." :follow #'hywiki-find-page :store #'hywiki-org-link-store)) +(defun hywiki-page-exists-p (&optional word) + "Return an existing HyWiki page name from optional WORD or word at point. +Word may be of form: HyWikiWord#section with an optional #section. +If no such page exists, return nil. + +If WORD is the symbol, 'range, rather than a string, and there is a +HyWikiWord at point with an existing page, then return the tuple of +values: (word word-start word-end). + +When using the word at point, a call to +`hywiki-active-in-current-buffer-p' at point must return non-nil or +this will return nil." + (setq hywiki--page-name word) + (if (or (stringp word) + (setq word (hywiki-word-at))) + (progn (setq word (hywiki-page-strip-section word)) + (unless (hywiki-get-page word) + (setq word nil))) + (setq word nil)) + (if (eq hywiki--page-name 'range) + (if (setq hywiki--range + (hproperty:char-property-range (point) 'face hywiki-word-face)) + (list word (car hywiki--range) (cdr hywiki--range)) + (list word nil nil)) + word)) + +(defun hywiki-page-strip-section (page-name) + "Return PAGE-NAME with any optional #section stripped off. +If an empty string or not a string, return nil." + (when (and (stringp page-name) (not (string-empty-p page-name))) + (if (and (string-match hywiki-word-with-optional-section-exact-regexp page-name) + (match-string-no-properties 2 page-name)) + ;; Remove any #section suffix in PAGE-NAME. + (match-string-no-properties 1 page-name) + page-name))) + (defun hywiki-publish-to-html (&optional all-pages-flag) "Publish/export updated HyWiki pages to html. With an optional prefix arg, ALL-PAGES-FLAG, regenerate all html