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

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

[elpa] externals/greader 3af7992 49/76: Merge branch 'devel'


From: Stefan Monnier
Subject: [elpa] externals/greader 3af7992 49/76: Merge branch 'devel'
Date: Fri, 8 Feb 2019 15:26:54 -0500 (EST)

branch: externals/greader
commit 3af7992e72e2283bc8aa3b2dfb20f9bd66659294
Merge: 0db37f6 43d18b9
Author: Michelangelo Rodriguez <address@hidden>
Commit: Michelangelo Rodriguez <address@hidden>

    Merge branch 'devel'
    
    merge with devel
---
 .gitignore         |   5 +-
 greader-espeak.el  | 105 ++++++++++++++++++++++++++++++++++++++
 greader-speechd.el | 123 +++++++++++++++++++++++++++++++++++++++++++++
 greader.el         | 144 ++++++++++++++++++++++++++++++++---------------------
 greader.elc        | Bin 22659 -> 22675 bytes
 5 files changed, 320 insertions(+), 57 deletions(-)

diff --git a/.gitignore b/.gitignore
index d7ebb35..794f1af 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,2 +1,5 @@
 
-greader-espeak.el~
\ No newline at end of file
+greader-espeak.el~
+greader-speechd.elc
+greader-speechd.el~
+#greader-espeak.el#
\ No newline at end of file
diff --git a/greader-espeak.el b/greader-espeak.el
new file mode 100644
index 0000000..2c8234b
--- /dev/null
+++ b/greader-espeak.el
@@ -0,0 +1,105 @@
+;;; greader-espeak --- espeak back-end for greader -*- lexical-binding: t; -*-
+
+
+
+
+;Copyright (C) 2019 by Michelangelo Rodriguez
+
+
+(defgroup greader-espeak
+nil
+  "back-end of espeak for greader."
+  :group 'greader
+  )
+;;; customization
+(defcustom
+  greader-espeak-language
+  "en"
+  "specifies the language of this back-end. For a comprehensive list of 
languages and voices available in espeak type in a terminal:
+espeak --list-languages
+"
+  :tag "greader espeak language"
+  :type 'string)
+(defcustom
+  greader-espeak-rate
+  200
+  "Specifies the rate os speech in words per minute."
+  :tag "greader espeak rate"
+  :type 'integer)
+(defcustom
+  greader-espeak-executable-name
+  (locate-file "espeak" exec-path)
+  "Path of espeak executable.
+this variable determines authomatically if espeak is present in your PATH 
environment, then if this variable is nil, it means that you must first install 
espeak."
+  :tag "espeak executable"
+  :type 'string)
+(defcustom
+  greader-espeak-punctuation
+  nil
+  "espeak punctuation switch."
+  :tag "espeak punctuation"
+  :type 'boolean)
+  
+;;; code
+(defun greader-espeak-set-rate
+    (&optional rate)
+  "returns a string suitable for setting espeak rate."
+  (if (not rate)
+      (concat "-s" (number-to-string greader-espeak-rate))
+    (concat "-s" (number-to-string rate))))
+(defun greader-espeak-set-language
+    (&optional lang)
+  "returns the appropriate string to pass to espeak in order to set the 
language appropriately"
+  (if (not lang)
+      (concat "-v" greader-espeak-language)
+    (progn
+      (setq-local greader-espeak-language lang)
+      (concat "-v " lang))))
+(defun greader-espeak--find-executable
+    ()
+  "tries to find espeak executable in PATH.
+If it's present, returns absolute path of espeak, else returns nil."
+  (locate-file "espeak" exec-path))
+
+(defun greader-espeak-set-punctuation
+    (&optional switch)
+  "sets espeak punctuation on or off.
+this function accepts only nil or t."
+  (if switch
+      (setq-local greader-espeak-punctuation switch)
+    greader-espeak-punctuation))    
+(defun greader-espeak (command &optional arg &rest args)
+  "back-end main function of greader-espeak."
+  (pcase command
+    ('executable
+     (if greader-espeak-executable-name
+        greader-espeak-executable-name
+       nil))
+    ('lang
+     (if (not arg)
+        (greader-espeak-set-language)
+       (greader-espeak-set-language arg)))
+    ('rate
+     (if (not arg)
+        (greader-espeak-set-rate)
+       (greader-espeak-set-rate arg)))
+    ('punctuation
+     (cond
+
+      (
+       (or (equal arg 'yes) arg)
+       (setq-local greader-espeak-punctuation t)
+       "--punct")
+      (
+       (equal arg 'no)
+       (setq-local greader-espeak-punctuation nil)
+       nil)
+      ((not arg)
+       (if greader-espeak-punctuation
+          "--punct"
+        greader-espeak-punctuation))))
+     
+    (command-not-implemented
+     'not-implemented)))
+(put 'greader-espeak 'greader-backend-name "greader-espeak")
+(provide 'greader-espeak)
diff --git a/greader-speechd.el b/greader-speechd.el
new file mode 100644
index 0000000..575e6fe
--- /dev/null
+++ b/greader-speechd.el
@@ -0,0 +1,123 @@
+;;; greader-speechd.el --- speech-dispatcher back-end for greader  -*- 
lexical-binding: t; -*-
+                                       ;Copyright (C) 2019 by Michelangelo 
Rodriguez
+
+
+;;; customization variables
+(defgroup greader-speechd
+  nil
+  "speech-dispatcher back-end for greader"
+  :group 'greader)
+
+(defcustom
+  greader-speechd-executable
+  "spd-say"
+  "executable file name."
+  :tag "speech-dispatcher client executable file name"
+  :type 'string)
+(defcustom
+  greader-speechd-executable-path
+(locate-file greader-speechd-executable exec-path)
+  "Path of speech-dispatcher client executable."
+  :tag "speechd client executable path"
+  :type 'string)
+(defcustom
+  greader-speechd-language
+  "en"
+  "specifies language of speech-dispatcher client to speak in."
+  :tag "speech-dispatcher language"
+  :type 'string)
+(defcustom
+  greader-speechd-rate
+  10
+  "specifies rate of speech.
+(From -100 to 100.)"
+  :tag "speech-dispatcher rate"
+  :type 'integer)
+(defcustom
+  greader-speechd-punctuation
+  "none"
+"punctuation level of speech-dispatcher client to speak.
+It must be one of the following:
+none, some, or all."
+  :tag "speech-dispatcher punctuation level"
+  :type 'string)
+;;; code
+(defun greader-speechd--find-executable ()
+  "tries to find speech-dispatcher client using greader-speechd-executable as 
basename."
+(locate-file greader-speechd-executable exec-path))
+
+(defun greader-speechd-set-language
+    (&optional lang)
+  "sets language 'lang' for speech-dispatcher client.
+if lang is omitted, it looks in variable greader-speechd-language and 
retrieves the appropriate string used by spd-say or another client compatible."
+  (if (not lang)
+    (concat "-l" greader-speechd-language)
+    (progn
+      (setq-local greader-speechd-language lang)
+    (concat "-l" lang))))
+
+(defun greader-speechd-set-rate
+    (&optional rate)
+  "returns parameter suitable for spd-say to set speech rate.
+for further documentation, see the documentation for greader-speechd-rate 
variable."
+  (if (not rate)
+      (concat "-r " (number-to-string greader-speechd-rate))
+    (concat "-r " (number-to-string rate))))
+(defun greader-speechd-set-punctuation (&optional punct)
+  "returns a suitable parameter to pass to spd-say for setting punctuation 
leve.
+punct must be a numeric value, 0 for no punctuation, 1 for some and 2 or >2 
for all punctuation."
+(catch 'return
+  (cond
+   ((booleanp punct)
+    (if punct
+       (progn
+         (setq-local greader-speechd-punctuation "all")
+         (throw 'return (concat "-mall")))
+      (progn
+       (setq-local greader-speechd-punctuation "none")
+       (throw 'return (concat "-mnone")))))
+   ((numberp punct)
+     (if (= punct 0)
+        (progn
+          (setq-local greader-speechd-punctuation "none")
+          (throw 'return (concat "-mnone"))))
+     (if (= punct 1)
+        (progn
+          (setq-local greader-speechd-punctuation "some")
+          (throw 'return (concat "-msome"))))
+     (if (>= punct 2)
+        (progn
+          (setq-local greader-speechd-punctuation "all")
+          (throw 'return (concat "-mall"))))))))
+(defun greader-speechd-stop ()
+  "stops speech-dispatcher client."
+  (start-process "speechd-client" nil greader-speechd-executable-path "-S"))
+(defun greader-speechd (command &optional arg &rest ignore)
+  "greader speech-dispatcher back-end."
+  (pcase command
+    ('executable
+     greader-speechd-executable-path)
+    ('lang
+     (if (not arg)
+        (greader-speechd-set-language)
+       (greader-speechd-set-language arg)))
+    ('rate
+     (if (not arg)
+        (greader-speechd-set-rate)
+       (greader-speechd-set-rate arg)))
+    ('punctuation
+     (cond
+      ((equal arg 'no)
+       (greader-speechd-set-punctuation 0))
+      ((equal arg 'yes)
+       (greader-speechd-set-punctuation 2))
+      ((not arg)
+       (greader-speechd-set-punctuation))))
+    ('stop
+     (greader-speechd-stop))
+    ('extra
+     "-w")
+    (not-implemented
+     'not-implemented)))
+(put 'greader-speechd 'greader-backend-name "greader-speechd")
+(provide 'greader-speechd)
diff --git a/greader.el b/greader.el
index e412ffc..d8425ad 100644
--- a/greader.el
+++ b/greader.el
@@ -1,5 +1,5 @@
 ;;; greader.el --- gnamù reader, a reader with espeak tts  -*- 
lexical-binding: t; -*-
-
+                                       ;Copyright (C) 2019 by Michelangelo 
Rodriguez
 ;; Copyright (C) 2017  Michelangelo Rodriguez
 ;; package-requires: ((emacs "25"))
 ;; Author: Michelangelo Rodriguez <address@hidden>
@@ -53,18 +53,66 @@
 (defvar greader-backend-action 'greader-default-action)
 (defvar greader-status 'paused)
 (defvar greader-synth-process nil)
+(defun greader-load-backends ()
+  "loads backends taken from greader-backends."
+  (mapcar 'require greader-backends))
+(require 'seq)
+(defun greader-change-backend (&optional backend)
+  "changes back-end. if backend is specified, it changes to backend, else it 
cycles throwgh available back-ends."
+  (interactive
+   (list
+    (if current-prefix-arg
+       (setq backend (read-from-minibuffer "backend: ")))))
+  (if (functionp backend)
+      (if (memq backend greader-backends)
+         (setq greader-actual-backend backend)
+       (error "%s" "The function you have specified is not a greader's 
back-end.")))
+  (if (stringp backend)
+      (progn
+       (let ((result nil))
+         (dolist (elem greader-backends result)
+           (if
+               (equal
+                (get elem 'greader-backend-name) backend)
+               (setq result elem)))
+         (if result
+             (setq greader-actual-backend result)
+           (error "%s" "the function name you have specified is not a 
greader's back-end.")))))
+  (if (not backend)
+      (let
+         ((index (seq-position greader-backends greader-actual-backend))
+          (len (length greader-backends)))
+       (if
+           (= (+ index 1) len)
+           (setq-local greader-actual-backend (elt greader-backends 0))
+         (setq-local greader-actual-backend (elt greader-backends (+ index 
1))))))
+  (message "Actual back-end is %s." (get greader-actual-backend 
'greader-backend-name)))
+(defun greader-call-backend (command &optional arg &rest ignore)
+  (if arg
+      (funcall greader-actual-backend command arg)
+    (funcall greader-actual-backend command)))
 
 (defgroup
-  Greader
+  greader
   nil
   "greader customization")
 (defcustom
   greader-backends
-  ()
+  '(greader-espeak greader-speechd)
   "A list of functions that are back-ends for greader."
   :tag "greader back-ends"
-  :type '(repeat list))
-
+  :type '(repeat function))
+(defcustom
+  greader-actual-backend
+  'greader-espeak
+  "greader back-end to use"
+  :tag "greader actual back-end"
+  :type
+  `(radio
+    ,@(mapcar
+       (lambda (backend)
+        `(function-item ,backend))
+       greader-backends)))
 (defcustom
   greader-auto-tired-mode-time
   "22"
@@ -135,37 +183,9 @@ the variable `greader-move-to-next-chung' must be set to a 
function that moves t
 For example, if you specify a function that gets a sentence, you should 
specify a function that moves to the next one."
   :type 'function
   :tag "greader get chung of text function")
-(defcustom
+(defvar
   greader-backend-filename
-  "/usr/bin/espeak"
-  "file name of the command for speech-dispatcher client.
-The program you specify must accept same arguments of spd-say program."
-  :tag "speech-dispatcher client file name"
-  :type 'file)
-
-(defcustom
-  greader-rate
-  200
-  "sets rate of synthesizer, values are from -100 to 100, -100 lowest and 100 
highest."
-  :tag "speech rate"
-  :type 'integer)
-
-(defcustom
-  greader-language
-  nil
-  "Sets language of synthesizer in ISO code, (E.G `en' for english, `fr' for 
french ecc...)
-  if nil, it means that it will be used the standard configuration for the 
back-end."
-  :tag "speech language"
-  :type '(choice
-         (const nil)
-         string))
-
-(defcustom
-  greader-punctuation
-  nil
-  "sets punctuation for tts to pronounce, either true or false."
-  :tag "speech punctuation"
-  :type 'boolean)
+  (greader-call-backend 'executable))
 
 (defvar greader-backend `(,greader-backend-filename))
 (defvar greader-prefix-map (make-sparse-keymap))
@@ -184,6 +204,7 @@ The program you specify must accept same arguments of 
spd-say program."
 (define-key greader-reading-map (kbd "+") 'greader-inc-rate)
 (define-key greader-reading-map (kbd "-") 'greader-dec-rate)
 (define-key greader-map (kbd "C-r f") 'greader-get-attributes)
+(define-key greader-map (kbd "C-r b") 'greader-change-backend)
 (define-minor-mode greader
   nil
   nil
@@ -196,8 +217,8 @@ The program you specify must accept same arguments of 
spd-say program."
     (if greader-auto-tired-timer
        (progn
          (cancel-timer greader-auto-tired-timer)
-         (greader-toggle-timer)))))
-
+         (greader-toggle-timer))))
+  (greader-load-backends))
 (defun greader-read-synchronous (txt)
   "sends string to the tts."
 
@@ -220,7 +241,7 @@ The program you specify must accept same arguments of 
spd-say program."
     (setq txt text)
     (setq backend (append greader-backend `(,txt) backend))
     (and (stringp txt) (setq-local greader-synth-process (make-process
-                                                         :name "spd-say"
+                                                         :name 
"greader-backend"
                                                          :sentinel 
'greader-action
                                                          :filter 
'greader-process-filter
                                                          :command backend)))
@@ -249,6 +270,11 @@ The program you specify must accept same arguments of 
spd-say program."
 
 (defun greader-tts-stop ()
   (set-process-sentinel greader-synth-process 'greader-default-action)
+  (if
+      (not
+       (eq
+       (greader-call-backend 'stop) 'not-implemented))
+      (greader-call-backend 'stop))
   (delete-process greader-synth-process)
   (setq-local greader-backend-action 'greader-default-action))
 
@@ -267,20 +293,28 @@ The program you specify must accept same arguments of 
spd-say program."
   (greader-reset)
   (let (args arg)
     (setq arg
-         (concat "-s" (number-to-string greader-rate)))
+         (greader-call-backend 'rate))
     (setq args (append `(,arg) args))
-
-    (cond (greader-language
+    (cond ((greader-call-backend 'lang)
           (setq arg
-                (concat "-v" greader-language))
+                (greader-call-backend 'lang))
           (setq args (append `(,arg) args))))
-    (cond (greader-punctuation
-          (setq arg "--punct")
+    (cond ((greader-call-backend 'punctuation)
+          (setq arg (greader-call-backend 'punctuation))
           (setq args (append `(,arg) args))))
-    (setq greader-backend (append greader-backend args))))
+    (setq greader-backend (greader-call-backend 'executable))
+    (cond
+     (
+      (not
+       (eq
+       (greader-call-backend 'extra)
+       'not-implemented))
+      (setq arg (greader-call-backend 'extra))
+      (setq args (append `(,arg) args))))
+    (setq greader-backend (append `(,greader-backend) args))))
 
 (defun greader-reset ()
-  (setq greader-backend `(,greader-backend-filename)))
+  (setq greader-backend `(,(greader-call-backend 'executable))))
 (defun greader-next-action (process event)
   (if greader-debug
       (greader-debug (format "greader-next-action: %s" event)))
@@ -422,23 +456,23 @@ The program you specify must accept same arguments of 
spd-say program."
 The language must be in ISO code, for example 'en' for english or 'fr' for 
french.
 This function sets the language of tts local for current buffer, so if you 
want to set it globally, please use 'm-x customize-option <RET> 
greader-language <RET>'."
   (interactive "sset language to:")
-  (setq-local greader-language lang))
+  (greader-call-backend 'lang lang))
 (defun greader-set-punctuation (flag)
-  (setq-local greader-punctuation flag)
+  (greader-call-backend 'punctuation flag)
   greader-punctuation)
 (defun greader-toggle-punctuation ()
   "Toggles punctuation locally for current buffer."
   (interactive)
-  (if greader-punctuation
+  (if (equal (greader-call-backend 'punctuation) "")
       (progn
        (greader-stop)
-       (greader-set-punctuation nil)
-       (message "punctuation disabled in current buffer")
+       (greader-set-punctuation t)
+       (message "punctuation enabled in current buffer")
        (greader-read))
     (progn
       (greader-stop)
-      (greader-set-punctuation t)
-      (message "punctuation enabled in current buffer")
+      (greader-set-punctuation nil)
+      (message "punctuation disabled in current buffer")
       (greader-read))))
 
 (defun greader-toggle-timer-flag ()
@@ -662,8 +696,8 @@ The default is 22:00 for entering and 08:00 for exiting."
 (defun greader-set-rate (n)
   "sets rate in current buffer to tthe specified value in n. rate is expressed 
in words per minute.
 For maximum value, see 'man espeak'."
+  (greader-call-backend 'rate n))
 
-  (setq-local greader-rate n))
 
 (defun greader-inc-rate (&optional n)
   "increments rate of speech by 10 units.
@@ -727,7 +761,5 @@ new lines can be either in unix stile, or ms, or macosX."
   "prints text properties associated with current char."
   (interactive)
   (print (text-properties-at (point))))
-  
-
 (provide 'greader)
 ;;; greader.el ends here
diff --git a/greader.elc b/greader.elc
index b4ef323..a2c65cc 100644
Binary files a/greader.elc and b/greader.elc differ



reply via email to

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