branch: externals/greader commit 92b8b1e20487b9b99f211a2c048d0966a4106caf Merge: bc45d253f9 002a247162 Author: Michelangelo Rodriguez <michelangelo.rodrig...@gmail.com> Commit: Michelangelo Rodriguez <michelangelo.rodrig...@gmail.com>
Merge branch 'experimental' --- greader-mac.el | 98 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ greader.el | 10 ++++-- 2 files changed, 106 insertions(+), 2 deletions(-) diff --git a/greader-mac.el b/greader-mac.el new file mode 100644 index 0000000000..9275d9fedc --- /dev/null +++ b/greader-mac.el @@ -0,0 +1,98 @@ +(defgroup greader-mac + nil + "Back-end of mac for greader." + :group 'greader + ) + +(defcustom greader-mac-voice nil + "Set the desired voice for the tts `say’. +nil means to use the system voice." + :tag "mac tts voice" + :type '(choice (const :tag "system voice" nil) + (string :tag "Specify"))) + +(defcustom greader-mac-rate 200 + "Rate of tts expressed in words per minute." + :tag "Mac tts speech rate" + :type 'integer) + +(defcustom greader-mac-executable-name "say" + "Name of the program that actually produces the voice." + :tag "mac tts command" + :type 'string) + +(defun greader-mac-set-rate (&optional rate) + "Return a string suitable for setting mac RATE." + (if (not rate) + (concat "-r" (number-to-string greader-mac-rate)) + (progn + (setq-local greader-mac-rate rate) + (concat "-r" (number-to-string rate))))) + +(defun greader-mac-set-voice (voice) + "Set specified VOICE for `say'. +When called interactively, this function reads a string from the minibuffer providing completion." + (interactive + (list (read-string "voice: " nil nil (greader--mac-get-voices)))) + (let (result) + (if (called-interactively-p 'any) + (progn + (if (string-equal "system" voice) + (setq-local greader-mac-voice nil) + (setq-local greader-mac-voice voice))) + (when voice + (if (string-equal voice "system") + (progn + (setq result nil) + (setq-local greader-mac-voice nil)) + (setq result (concat "-v" voice)) + (setq-local greader-mac-voice voice))) + (unless voice + (if greader-mac-voice + (setq result (concat "-v" greader-mac-voice)) + (setq result nil))) + result))) + +;;;###autoload +(defun greader-mac (command &optional arg &rest _) + "Back-end main function of greader-mac. +COMMAND must be a string suitable for `make-process'." + (pcase command + ('executable + greader-mac-executable-name) + ('lang + (greader-mac-set-voice arg)) + ('set-voice + (call-interactively 'greader-mac-set-voice)) + ('rate + (cond + ((equal arg 'value) + greader-mac-rate) + (t + (greader-mac-set-rate arg)))) + ('punctuation + nil) + (_ + 'not-implemented))) +(put 'greader-mac 'greader-backend-name "greader-mac") + +(defun greader--mac-get-voices () + "Return a list which contains all voices suitable for this backend." + (with-temp-buffer + (call-process "say" nil t nil "-v" "?") + (beginning-of-buffer) + (let ((lines (list "system"))) + (while (not (eobp)) + (let ((mymarker (make-marker))) + (search-forward "_") + (backward-word) + (re-search-backward "[^ ]") + (forward-char) + (set-marker mymarker (point)) + (end-of-line) + (delete-region mymarker (point))) + (push (string-chop-newline (thing-at-point 'line)) lines) + (forward-line)) + (reverse lines)))) + +(provide 'greader-mac) diff --git a/greader.el b/greader.el index 49843cc8c2..f48c309438 100644 --- a/greader.el +++ b/greader.el @@ -503,7 +503,7 @@ if `GOTO-MARKER' is t and if you pass a prefix to this (when (not (eobp)) (forward-sentence)) (if (> (point) sentence-start) - (buffer-substring-no-properties sentence-start (point)) + (string-trim (buffer-substring-no-properties sentence-start (point)) "[ \t\n\r]+") nil)))) (defun greader-sentence-at-point () @@ -523,7 +523,13 @@ LANG must be in ISO code, for example 'en' for english or 'fr' for french. This function set 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:") + (interactive + (list + (let (result) + (setq result (greader-call-backend 'set-voice nil)) + (when (equal result 'not-implemented) + (setq result (read-string "Set language to: "))) + result))) (greader-call-backend 'lang lang)) (defun greader-set-punctuation (flag) "Set punctuation to FLAG."