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

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

[elpa] externals/greader fc022d3288 3/3: Hooks added to permit more flex


From: ELPA Syncer
Subject: [elpa] externals/greader fc022d3288 3/3: Hooks added to permit more flexibility.
Date: Fri, 17 Mar 2023 02:58:24 -0400 (EDT)

branch: externals/greader
commit fc022d3288966df815daff6b555dad40c3ba82e8
Author: Michelangelo Rodriguez <michelangelo.rodriguez@gmail.com>
Commit: Michelangelo Rodriguez <michelangelo.rodriguez@gmail.com>

    Hooks added to permit more flexibility.
    
    greader-before-get-sentence-functions,
    greader-after-get-sentence-functions,greader-before-read-hook,
    greader-after-read-hook, greader-before-finish-hook.
    Through these hooks we can implement a sort of submodes, adapting
    better greader's behavior in different circumstances.
    For example, in modes like info, we can implement a way to keep
    reading continuously executing a command to pass to the next node to
    read.
---
 greader.el | 59 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-
 1 file changed, 58 insertions(+), 1 deletion(-)

diff --git a/greader.el b/greader.el
index 3e16b4aa67..2b8d0eacf6 100644
--- a/greader.el
+++ b/greader.el
@@ -62,6 +62,58 @@
 (defvar greader-synth-process nil)
 (require 'seq)
 
+(defvar greader-before-get-sentence-functions nil
+  "List of functions to run before getting a sentence.
+Functions in this variable don't receive arguments.")
+
+(defvar greader-after-get-sentence-functions nil
+  "Hook after getting a sentence.
+Functions in this hook take a string as argument, and should modify
+  that string that contains the sentence that will be read.
+the function should return modified sentence, or nil if no operation
+  was needed.")
+
+(defun greader--call-functions-after-get-of-sentence (sentence)
+  "Call functions in `greader-after-get-sentence-functions'.
+Return SENTENCE, eventually modified by the functions."
+  (if greader-after-get-sentence-functions
+      (progn
+       (let ((result sentence))
+         (dolist (func greader-after-get-sentence-functions result)
+           (setq result (funcall func result))
+           (unless result
+             (setq result sentence)))
+         (if (not result)
+             sentence
+           result)))
+    sentence))
+
+(defvar greader-before-read-hook nil
+  "Code to execute just before start of reading.")
+
+(defvar greader-after-read-hook nil
+  "Execute code just after reading a sentence.")
+
+(defvar greader-before-finish-hook nil
+  "Code executed just after finishing reading of buffer.
+Functions in this hook should return non -nil if at least one function
+  returns non-nil, meaning that reading of buffer continues.
+If all the functions called return nil, reading finishes normally.")
+
+(defun greader--call-before-finish-functions ()
+  "Return t if at least one of the function return t.
+If all the functions in the hook return nil, this function return
+  nil."
+  (if greader-before-finish-hook
+      (progn
+       (let ((flag nil) (result nil))
+         (dolist (func greader-before-finish-hook)
+           (setq result (funcall func))
+           (when result
+             (setq flag t)))
+         flag))
+    nil))
+
 (defgroup
   greader
   nil
@@ -306,6 +358,7 @@ backends."
   "Read the text given in TXT."
   (if greader-debug
       (greader-debug "greader-read-asynchronous entered\n"))
+  (run-hooks 'greader-before-read-hook)
   (greader-build-args)
   (if (and txt (greader-sentence-needs-dehyphenation txt))
       (setq txt (greader-dehyphenate txt)))
@@ -405,6 +458,7 @@ Argument PROCESS .
 Argument EVENT ."
   (if greader-debug
       (greader-debug (format "greader-next-action: %s" event)))
+  (run-hooks 'greader-after-read-hook)
   (funcall greader-move-to-next-chunk)
   (greader-read))
 
@@ -461,9 +515,11 @@ if `GOTO-MARKER' is t and if you pass a prefix to this
   (cond
    ((and (greader-timer-flag-p) (not (timerp greader-stop-timer)))
     (greader-setup-timers)))
+  (run-hooks greader-before-get-sentence-functions)
   (let ((chunk (funcall greader-read-chunk-of-text)))
     (if chunk
        (progn
+         (setq chunk (greader--call-functions-after-get-of-sentence chunk))
          ;; This extra verification is necessary because espeak has a bug that,
          ;; when we pass a string containing a vocal plus only 2 .. it reads
          ;; garbage.
@@ -475,7 +531,8 @@ if `GOTO-MARKER' is t and if you pass a prefix to this
       (progn
        (setq-local greader-backend-action 'greader--default-action)
        (greader-set-greader-keymap)
-       (greader-read-asynchronous ". end")))))
+       (unless (greader--call-before-finish-functions)
+         (greader-read-asynchronous ". end"))))))
 
 (defun greader-stop ()
   "Stops reading of document."



reply via email to

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