From 50fc04346fce6db24ad31f6e2bfa07dbc6b33618 Mon Sep 17 00:00:00 2001 From: Andreas Gerler Date: Wed, 21 May 2025 14:42:59 +0200 Subject: [PATCH] update go-translate --- .../go-translate-autoloads.el | 7 +- .../go-translate-pkg.el | 6 +- .../go-translate.el | 10 ++- .../gt-core.el | 43 +++++----- .../gt-engine-bing.el | 0 .../gt-engine-chatgpt.el | 18 ++-- .../gt-engine-deepl.el | 10 +-- .../gt-engine-echo.el | 0 .../gt-engine-google-rpc.el | 2 +- .../gt-engine-google.el | 0 .../gt-engine-libre.el | 0 .../gt-engine-osxdict.el | 86 +++++++++++++++++++ .../gt-engine-stardict.el | 0 .../gt-engine-youdao.el | 4 +- .../gt-extension.el | 38 ++++---- .../gt-faces.el | 0 .../gt-httpx.el | 10 +-- .../gt-text-utility.el | 0 18 files changed, 167 insertions(+), 67 deletions(-) rename elpa/{go-translate-20240802.131 => go-translate-20250318.907}/go-translate-autoloads.el (94%) rename elpa/{go-translate-20240802.131 => go-translate-20250318.907}/go-translate-pkg.el (70%) rename elpa/{go-translate-20240802.131 => go-translate-20250318.907}/go-translate.el (97%) rename elpa/{go-translate-20240802.131 => go-translate-20250318.907}/gt-core.el (98%) rename elpa/{go-translate-20240802.131 => go-translate-20250318.907}/gt-engine-bing.el (100%) rename elpa/{go-translate-20240802.131 => go-translate-20250318.907}/gt-engine-chatgpt.el (93%) rename elpa/{go-translate-20240802.131 => go-translate-20250318.907}/gt-engine-deepl.el (94%) rename elpa/{go-translate-20240802.131 => go-translate-20250318.907}/gt-engine-echo.el (100%) rename elpa/{go-translate-20240802.131 => go-translate-20250318.907}/gt-engine-google-rpc.el (98%) rename elpa/{go-translate-20240802.131 => go-translate-20250318.907}/gt-engine-google.el (100%) rename elpa/{go-translate-20240802.131 => go-translate-20250318.907}/gt-engine-libre.el (100%) create mode 100644 elpa/go-translate-20250318.907/gt-engine-osxdict.el rename elpa/{go-translate-20240802.131 => go-translate-20250318.907}/gt-engine-stardict.el (100%) rename elpa/{go-translate-20240802.131 => go-translate-20250318.907}/gt-engine-youdao.el (97%) rename elpa/{go-translate-20240802.131 => go-translate-20250318.907}/gt-extension.el (97%) rename elpa/{go-translate-20240802.131 => go-translate-20250318.907}/gt-faces.el (100%) rename elpa/{go-translate-20240802.131 => go-translate-20250318.907}/gt-httpx.el (97%) rename elpa/{go-translate-20240802.131 => go-translate-20250318.907}/gt-text-utility.el (100%) diff --git a/elpa/go-translate-20240802.131/go-translate-autoloads.el b/elpa/go-translate-20250318.907/go-translate-autoloads.el similarity index 94% rename from elpa/go-translate-20240802.131/go-translate-autoloads.el rename to elpa/go-translate-20250318.907/go-translate-autoloads.el index 308a5d34..f96edc21 100644 --- a/elpa/go-translate-20240802.131/go-translate-autoloads.el +++ b/elpa/go-translate-20250318.907/go-translate-autoloads.el @@ -20,7 +20,7 @@ Define your default translator like this: (gt-translator :engines (gt-bing-engine))) (setq gt-default-translator - (gt-translator :taker (gt-taker :langs '(en fr) :text 'sentence :prompt t) + (gt-translator :taker (gt-taker :langs ='(en fr) :text ='sentence :prompt t) :engines (list (gt-google-engine) (gt-deepl-engine)) :render (gt-buffer-render))) @@ -84,6 +84,11 @@ When TTS with specific engine, you can specify the language with `lang.' prefix. (register-definition-prefixes "gt-engine-libre" '("gt-libre-")) + +;;; Generated autoloads from gt-engine-osxdict.el + +(register-definition-prefixes "gt-engine-osxdict" '("gt-osxdict-")) + ;;; Generated autoloads from gt-engine-stardict.el diff --git a/elpa/go-translate-20240802.131/go-translate-pkg.el b/elpa/go-translate-20250318.907/go-translate-pkg.el similarity index 70% rename from elpa/go-translate-20240802.131/go-translate-pkg.el rename to elpa/go-translate-20250318.907/go-translate-pkg.el index e22c61b9..18dc69c2 100644 --- a/elpa/go-translate-20240802.131/go-translate-pkg.el +++ b/elpa/go-translate-20250318.907/go-translate-pkg.el @@ -1,10 +1,10 @@ ;; -*- no-byte-compile: t; lexical-binding: nil -*- -(define-package "go-translate" "20240802.131" +(define-package "go-translate" "20250318.907" "Translation framework, configurable and scalable." '((emacs "28.1")) :url "https://github.com/lorniu/go-translate" - :commit "424682b94df9efb3dd59e396677b45e4a67b7723" - :revdesc "424682b94df9" + :commit "a924e0bd6b37d424c222377982e6f71a4ddf4452" + :revdesc "a924e0bd6b37" :keywords '("convenience") :authors '(("lorniu" . "lorniu@gmail.com")) :maintainers '(("lorniu" . "lorniu@gmail.com"))) diff --git a/elpa/go-translate-20240802.131/go-translate.el b/elpa/go-translate-20250318.907/go-translate.el similarity index 97% rename from elpa/go-translate-20240802.131/go-translate.el rename to elpa/go-translate-20250318.907/go-translate.el index 867e38e3..64950412 100644 --- a/elpa/go-translate-20240802.131/go-translate.el +++ b/elpa/go-translate-20250318.907/go-translate.el @@ -6,8 +6,8 @@ ;; URL: https://github.com/lorniu/go-translate ;; Package-Requires: ((emacs "28.1")) ;; Keywords: convenience -;; Package-Version: 20240802.131 -;; Package-Revision: 424682b94df9 +;; Package-Version: 20250318.907 +;; Package-Revision: a924e0bd6b37 ;; SPDX-License-Identifier: GPL-3.0-or-later @@ -68,6 +68,7 @@ (require 'gt-engine-google-rpc) (require 'gt-engine-deepl) (require 'gt-engine-stardict) +(require 'gt-engine-osxdict) (require 'gt-engine-youdao) (require 'gt-engine-chatgpt) (require 'gt-engine-libre) @@ -137,6 +138,7 @@ of `gt-default-translator' at any time in `gt-do-setup'." (LibreTranslate . ,(gt-libre-engine)) (GoogleRPC . ,(gt-google-rpc-engine)) (Google-Summary . ,(gt-google-engine :parse (gt-google-summary-parser))) + (OSX-Dictionary . ,(gt-osxdict-engine)) (Bionic_Reading . ,(gt-echo-engine :do '(clean br) :tag "Bionic Reading")))) "Preset engines. @@ -223,7 +225,7 @@ will be used as the default translator." (with-slots (taker engines render _taker _engines _render) translator (cl-macrolet ((desc1 (name &rest body) `(if (not (slot-boundp translator ',(intern (format "_%s" name)))) "unbound" - (when-let (,name (or ,name ,(intern (format "_%s" name)))) + (when-let* ((,name (or ,name ,(intern (format "_%s" name))))) (if (gt-functionp ,name) (replace-regexp-in-string "[ \n\t]+" " " (format "%s" ,name)) ,@body))))) @@ -327,7 +329,7 @@ Define your default translator like this: (gt-translator :engines (gt-bing-engine))) (setq gt-default-translator - (gt-translator :taker (gt-taker :langs '(en fr) :text 'sentence :prompt t) + (gt-translator :taker (gt-taker :langs \='(en fr) :text \='sentence :prompt t) :engines (list (gt-google-engine) (gt-deepl-engine)) :render (gt-buffer-render))) diff --git a/elpa/go-translate-20240802.131/gt-core.el b/elpa/go-translate-20250318.907/gt-core.el similarity index 98% rename from elpa/go-translate-20240802.131/gt-core.el rename to elpa/go-translate-20250318.907/gt-core.el index 54537a92..7436b0c8 100644 --- a/elpa/go-translate-20240802.131/gt-core.el +++ b/elpa/go-translate-20250318.907/gt-core.el @@ -582,9 +582,9 @@ When `space' in DISPLAY, prepend a space to the STR." if (eq k 'space) append v into spaces else append (list k v) into normals finally (return (cons normals spaces))))) - (when-let (normals (car ds)) + (when-let* ((normals (car ds))) (setq r (propertize r 'display normals))) - (when-let (spaces (cdr ds)) + (when-let* ((spaces (cdr ds))) (setq r (concat (propertize " " 'display (cons 'space spaces)) r))) r))) @@ -617,7 +617,7 @@ When `space' in DISPLAY, prepend a space to the STR." (defun gt-lookup-password (&rest params) "Query password stored in '.authinfo'. PARAMS contains search keys like :user, :host same as `auth-source-search'." - (when-let (secret (plist-get (car (apply 'auth-source-search params)) :secret)) + (when-let* ((secret (plist-get (car (apply 'auth-source-search params)) :secret))) (if (functionp secret) (funcall secret) secret))) @@ -920,7 +920,7 @@ If ONLY-EXPIRED not nil, purge caches expired only.") (cl-defmethod gt-cache-get ((cacher gt-memory-cacher) key) (with-slots (storage expired) cacher - (when-let (cache (ignore-errors (gethash key storage))) + (when-let* ((cache (ignore-errors (gethash key storage)))) (if (> (time-to-seconds) (cdr cache)) (remhash key storage) (gt-log 'memory-cacher (format "get [%s] from caches (%s)" key (hash-table-count storage))) @@ -1017,7 +1017,7 @@ If ONLY-EXPIRED not nil, purge caches expired only.") (gt-cache-set gt-default-cacher ckey raw))) (funcall done raw))))) ;; try to get from cache first - (if-let (r (and cache (gt-cache-get gt-default-cacher ckey))) + (if-let* ((r (and cache (gt-cache-get gt-default-cacher ckey)))) (progn (gt-log 'cacher (format "Find %s in cache..." ckey)) (if donefn (funcall donefn r) r)) (cl-remf args :cache) @@ -1206,7 +1206,7 @@ specific MODE." (point)))) (when (> end beg) (list (cons beg end)))) - (when-let (rt (bounds-of-thing-at-point thing)) + (when-let* ((rt (bounds-of-thing-at-point thing))) (list rt)))) (cl-defgeneric gt-forward-thing (thing _mode) @@ -1275,7 +1275,7 @@ If it is a bound, return a list of sub-bounds." (goto-char (point-min)) (let (bds) (while (not (save-excursion (skip-chars-forward " \r\n\t\f") (eobp))) - (when-let (bd (gt-forward-thing thing mode)) + (when-let* ((bd (gt-forward-thing thing mode))) (cl-destructuring-bind (a . b) bd (when (or (null pred) (funcall pred (buffer-substring a b))) (push (cons a b) bds))))) @@ -1390,7 +1390,7 @@ previous one. This is non-destructive." (defun gt-prompt-prefix (target) (when target (format "[%s%s] " - (if-let (src (car target)) (format "%s > " src) "") + (if-let* ((src (car target))) (format "%s > " src) "") (mapconcat (lambda (s) (format "%s" s)) (ensure-list (cdr target)) ", ")))) (defun gt-prompt-next-target (&optional backwardp) @@ -1470,7 +1470,7 @@ If BACKWARDP is not nil then switch to previous one." (let (cacher condition) (when gt-cache-p (let ((cc (gt-ensure-plain - (if (slot-boundp engine 'cache) (if-let (c (gt-ensure-plain (oref engine cache) task)) c) t) + (if (slot-boundp engine 'cache) (if-let* ((c (gt-ensure-plain (oref engine cache) task))) c) t) task))) (cond ((null cc)) ((eq cc t) (setq cacher gt-default-cacher condition nil)) @@ -1489,14 +1489,14 @@ If BACKWARDP is not nil then switch to previous one." ;; if stream, not cache (if (gt-stream-p engine) (oset engine cache nil)) ;; query cache first - (when-let (cacher (car-safe (gt-current-cacher engine task))) + (when-let* ((cacher (car-safe (gt-current-cacher engine task)))) (setf cache (gt-cache-get cacher task))) ;; only translate the parts not in cache (if (and cache (cl-every #'identity cache)) (gt-next engine task) (let ((text-left (if cache (cl-loop for c in text for r in cache unless r collect c) text))) ;; join with delimiter if possible - (if-let (delimiter (if (slot-boundp engine 'delimiter) (oref engine delimiter) gt-text-delimiter)) + (if-let* ((delimiter (if (slot-boundp engine 'delimiter) (oref engine delimiter) gt-text-delimiter))) (setf text (string-join text-left (concat "\n\n" delimiter "\n\n"))) (setf text text-left)))))) @@ -1546,16 +1546,16 @@ will do the parse and render job. See type `gt-engine' for more description." (with-slots (parse delimiter then) engine ;; parse (when res - (when-let (parser (and (slot-boundp engine 'parse) parse)) + (when-let* ((parser (and (slot-boundp engine 'parse) parse))) (if (gt-functionp parser) (funcall parser task) (gt-parse parser task))) ;; split with delimiter if possible - (when-let (delimiter (and (stringp res) (if (slot-boundp engine 'delimiter) delimiter gt-text-delimiter))) + (when-let* ((delimiter (and (stringp res) (if (slot-boundp engine 'delimiter) delimiter gt-text-delimiter)))) (setf res (mapcar (lambda (item) (string-trim item "\n+")) (split-string res delimiter)))) (setf res (ensure-list res)) ;; run res-hook if possible - (when-let (hook (plist-get meta :res-hook)) + (when-let* ((hook (plist-get meta :res-hook))) (setf res (funcall hook res)))) ;; resume text and merge cache to res (setf text (oref translator text)) @@ -1722,11 +1722,11 @@ Otherwise try to TTS with local program or using selected engine. When TTS with specific engine, you can specify the language with `lang.' prefix." (interactive) - (if-let (url (get-char-property (point) 'gt-tts-url)) + (if-let* ((url (get-char-property (point) 'gt-tts-url))) ;; 1. play the url (gt-play-audio url) (let (items engine) - (if-let (task (get-char-property (point) 'gt-task)) + (if-let* ((task (get-char-property (point) 'gt-task))) (with-slots (src tgt res err translator) task (with-slots (text target) translator ;; 2. play current task @@ -1738,14 +1738,15 @@ When TTS with specific engine, you can specify the language with `lang.' prefix. (if (use-region-p) (cl-loop with text = (buffer-substring (region-beginning) (region-end)) for l in (gt-langs-maybe text (list src tgt)) do (funcall col l text)) - (when-let (r (nth part text)) + (when-let* ((r (nth part text))) (funcall col (car target) r)) - (when-let (r (and (not err) (or (get-pos-property (point) 'gt-brief) (nth part (ensure-list res))))) + (when-let* ((r (and (not err) (or (get-pos-property (point) 'gt-brief) (nth part (ensure-list res)))))) (funcall col tgt r))) (when items - (let* ((cand (completing-read - (format "Text to Speech (with %s): " (oref engine tag)) - (gt-make-completion-table items))) + (let* ((cand (with-temp-buffer + (completing-read + (format "Text to Speech (with %s): " (oref engine tag)) + (gt-make-completion-table items)))) (lang (if (string-match (format "^ *\\(%s\\)\\." (mapconcat #'symbol-name (mapcar #'car gt-lang-codes) "\\|")) cand) (prog1 (intern-soft (match-string 1 cand)) (setq cand (substring cand (match-end 0)))) diff --git a/elpa/go-translate-20240802.131/gt-engine-bing.el b/elpa/go-translate-20250318.907/gt-engine-bing.el similarity index 100% rename from elpa/go-translate-20240802.131/gt-engine-bing.el rename to elpa/go-translate-20250318.907/gt-engine-bing.el diff --git a/elpa/go-translate-20240802.131/gt-engine-chatgpt.el b/elpa/go-translate-20250318.907/gt-engine-chatgpt.el similarity index 93% rename from elpa/go-translate-20240802.131/gt-engine-chatgpt.el rename to elpa/go-translate-20250318.907/gt-engine-chatgpt.el index 01d0f449..bc2bdf5b 100644 --- a/elpa/go-translate-20240802.131/gt-engine-chatgpt.el +++ b/elpa/go-translate-20250318.907/gt-engine-chatgpt.el @@ -38,6 +38,7 @@ (defclass gt-chatgpt-engine (gt-engine) ((tag :initform 'ChatGPT) (host :initarg :host :initform nil) + (path :initarg :path :initform nil) (model :initarg :model :initform nil) (temperature :initarg :temperature :initform nil) (key :initarg :key :initform 'apikey @@ -53,6 +54,11 @@ Can also put into .authinfo file as: :type 'string :group 'go-translate-chatgpt) +(defcustom gt-chatgpt-path "/v1/chat/completions" + "API endpoint of ChatGPT." + :type 'string + :group 'go-translate-chatgpt) + (defcustom gt-chatgpt-key nil "Auth Key of ChatGPT. Recommend to save in .authinfo file instead." :type 'string @@ -89,20 +95,20 @@ With two arguments BEG and END, which are the marker bounds of the result.") (cl-defmethod gt-ensure-key ((engine gt-chatgpt-engine)) (with-slots (host key) engine (unless (stringp key) - (if-let (apikey (or (gt-lookup-password - :user (if key (format "%s" key) "apikey") - :host (url-host (url-generic-parse-url (or host gt-chatgpt-host)))) - gt-chatgpt-key)) + (if-let* ((apikey (or (gt-lookup-password + :user (if key (format "%s" key) "apikey") + :host (url-host (url-generic-parse-url (or host gt-chatgpt-host)))) + gt-chatgpt-key))) (setf key apikey) (user-error "You should provide a apikey for gt-chatgpt-engine"))))) (cl-defmethod gt-translate ((engine gt-chatgpt-engine) task next) (gt-ensure-key engine) (with-slots (text src tgt res translator markers) task - (with-slots (host key model temperature stream) engine + (with-slots (host path key model temperature stream) engine (when (and stream (cdr (oref translator text))) (user-error "Multiple parts not support streaming")) - (gt-request :url (concat (or host gt-chatgpt-host) "/v1/chat/completions") + (gt-request :url (concat (or host gt-chatgpt-host) (or path gt-chatgpt-path)) :headers `(("Content-Type" . "application/json") ("Authorization" . ,(concat "Bearer " (encode-coding-string key 'utf-8)))) :data (encode-coding-string diff --git a/elpa/go-translate-20240802.131/gt-engine-deepl.el b/elpa/go-translate-20250318.907/gt-engine-deepl.el similarity index 94% rename from elpa/go-translate-20240802.131/gt-engine-deepl.el rename to elpa/go-translate-20250318.907/gt-engine-deepl.el index 4efdecb7..44550c5e 100644 --- a/elpa/go-translate-20240802.131/gt-engine-deepl.el +++ b/elpa/go-translate-20250318.907/gt-engine-deepl.el @@ -112,7 +112,7 @@ Mainly fill the text to suitable length." )) (defun gt-deepl-get-lang (lang) - (if-let (mapping (assoc lang gt-deepl-langs-mapping)) + (if-let* ((mapping (assoc lang gt-deepl-langs-mapping))) (cdr mapping) (user-error "Language %s is not supported by DeepL. Supported list: %s" lang (mapconcat #'car gt-deepl-langs-mapping ", ")))) @@ -120,9 +120,9 @@ Supported list: %s" lang (mapconcat #'car gt-deepl-langs-mapping ", ")))) (cl-defmethod gt-ensure-key ((engine gt-deepl-engine)) (with-slots (key) engine (unless (stringp key) - (if-let (auth-key (gt-lookup-password - :user (if key (format "%s" key) "auth-key") - :host "api.deepl.com")) + (if-let* ((auth-key (gt-lookup-password + :user (if key (format "%s" key) "auth-key") + :host "api.deepl.com"))) (setf key auth-key) (user-error "You should provide a auth-key for gt-deepl-engine"))))) @@ -135,7 +135,7 @@ Supported list: %s" lang (mapconcat #'car gt-deepl-langs-mapping ", ")))) ("Authorization" . ,(concat "DeepL-Auth-Key " key))) :data `(("text" . ,(gt-deepl-fill-input text)) ("target_lang" . ,(gt-deepl-get-lang tgt)) - ,(if-let (src (gt-deepl-get-lang src)) `("source_lang" . ,src)) + ,(if-let* ((src (gt-deepl-get-lang src))) `("source_lang" . ,src)) ,@gt-deepl-extra-params) :done (lambda (raw) (setf res raw) diff --git a/elpa/go-translate-20240802.131/gt-engine-echo.el b/elpa/go-translate-20250318.907/gt-engine-echo.el similarity index 100% rename from elpa/go-translate-20240802.131/gt-engine-echo.el rename to elpa/go-translate-20250318.907/gt-engine-echo.el diff --git a/elpa/go-translate-20240802.131/gt-engine-google-rpc.el b/elpa/go-translate-20250318.907/gt-engine-google-rpc.el similarity index 98% rename from elpa/go-translate-20240802.131/gt-engine-google-rpc.el rename to elpa/go-translate-20250318.907/gt-engine-google-rpc.el index c150b3a7..e2067e0f 100644 --- a/elpa/go-translate-20240802.131/gt-engine-google-rpc.el +++ b/elpa/go-translate-20250318.907/gt-engine-google-rpc.el @@ -133,7 +133,7 @@ you can customize it according to your country region." (re-search-forward "^\\([0-9]+\\)$") (setq end (- (point) (length (match-string 1)))) (setq json (json-read-from-string (string-trim (buffer-substring-no-properties beg end)))) - (if-let (data (and (string= (gt-aref json 0 0) "wrb.fr") (gt-aref json 0 2))) + (if-let* ((data (and (string= (gt-aref json 0 0) "wrb.fr") (gt-aref json 0 2)))) (progn (setq code (aref (json-read-from-string data) 0)) (erase-buffer) (insert code) diff --git a/elpa/go-translate-20240802.131/gt-engine-google.el b/elpa/go-translate-20250318.907/gt-engine-google.el similarity index 100% rename from elpa/go-translate-20240802.131/gt-engine-google.el rename to elpa/go-translate-20250318.907/gt-engine-google.el diff --git a/elpa/go-translate-20240802.131/gt-engine-libre.el b/elpa/go-translate-20250318.907/gt-engine-libre.el similarity index 100% rename from elpa/go-translate-20240802.131/gt-engine-libre.el rename to elpa/go-translate-20250318.907/gt-engine-libre.el diff --git a/elpa/go-translate-20250318.907/gt-engine-osxdict.el b/elpa/go-translate-20250318.907/gt-engine-osxdict.el new file mode 100644 index 00000000..a01821bc --- /dev/null +++ b/elpa/go-translate-20250318.907/gt-engine-osxdict.el @@ -0,0 +1,86 @@ +;;; gt-engine-osxdict.el --- OSX-Dictionary -*- lexical-binding: t -*- + +;; Copyright (C) 2024 lorniu +;; Author: lorniu + +;; SPDX-License-Identifier: GPL-3.0-or-later + +;; This program is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. + +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with this program. If not, see . + +;; This file is NOT part of GNU Emacs. + +;;; Commentary: + +;; Engine for osx-dictionary (macOS only). +;; +;; osx-dictionary, a program written by itchyny, is Dictionary.app interface for macOS. +;; I know it from https://github.com/xuchunyang/osx-dictionary.el. This engine is working +;; with it, and can be used offline for macOS user. +;; +;; Make sure program `osx-dictionary' is on your PATH, or config it with `gt-osxdict-program'. +;; +;; Source: https://github.com/itchyny/dictionary.vim/tree/master/autoload/dictionary.m +;; Build: clang -framework CoreServices -framework Foundation dictionary.m -o osx-dictionary +;; +;;; Code: + +(require 'gt-extension) + +(defclass gt-osxdict-parser (gt-parser) ()) + +(defclass gt-osxdict-engine (gt-engine) + ((tag :initform 'osx-dictionary) + (program :initarg :program :initform nil :documentation "Path of osx-dictionary") + (delimiter :initform nil) + (cache :initform nil) + (parse :initform (gt-osxdict-parser)))) + +(defvar gt-osxdict-program "osx-dictionary" + "Executable command or full path of osx-dictionary.") + +(cl-defmethod gt-translate ((engine gt-osxdict-engine) task next) + (let ((program (or (oref engine program) gt-osxdict-program))) + (unless (executable-find program) + (user-error (format "[gt-osxdict-engine] Make sure executable `%s' is available'.\n + Source: https://github.com/itchyny/dictionary.vim/tree/master/autoload/dictionary.m + Build: clang -framework CoreServices -framework Foundation dictionary.m -o %s +" program program))) + (with-slots (text res) task + (when (cdr text) + (user-error "[gt-osxdict-engine] Multiple parts translation is not supported")) + (with-temp-buffer + (ignore-errors + (apply #'call-process program nil t nil text) + (setf res (buffer-string)))) + (if (string-empty-p res) (setf res nil)) + (funcall next task)))) + +(cl-defmethod gt-parse ((_ gt-osxdict-parser) task) + (with-slots (res) task + (with-temp-buffer + (insert res) + ;; This is written casually, should be improved. + ;; https://github.com/itchyny/dictionary.vim/blob/master/syntax/dictionary.vim + (cl-loop for (regexp . face) in + '(("|.+|" . font-lock-comment-face) + ("^ *▸.*" . font-lock-string-face) + ("^ *[A-Z]\\..*" . bold-italic)) + do (goto-char (point-min)) + do (while (re-search-forward regexp nil t) + (put-text-property (match-beginning 0) (match-end 0) 'face face))) + (setf res (buffer-string))))) + +(provide 'gt-engine-osxdict) + +;;; gt-engine-osxdict.el ends here diff --git a/elpa/go-translate-20240802.131/gt-engine-stardict.el b/elpa/go-translate-20250318.907/gt-engine-stardict.el similarity index 100% rename from elpa/go-translate-20240802.131/gt-engine-stardict.el rename to elpa/go-translate-20250318.907/gt-engine-stardict.el diff --git a/elpa/go-translate-20240802.131/gt-engine-youdao.el b/elpa/go-translate-20250318.907/gt-engine-youdao.el similarity index 97% rename from elpa/go-translate-20240802.131/gt-engine-youdao.el rename to elpa/go-translate-20250318.907/gt-engine-youdao.el index 28f22d1a..cde71de2 100644 --- a/elpa/go-translate-20240802.131/gt-engine-youdao.el +++ b/elpa/go-translate-20250318.907/gt-engine-youdao.el @@ -134,7 +134,7 @@ do (insert (propertize (car wf) 'face 'gt-youdao-dict-label-face) " " (cdr wf)) do (insert (if (= (length .word-wfs) i) "\n\n" (if (> (current-column) fill-column) "\n" "\t")))) ;; 考试 - (when-let (et (and .exam-type (mapconcat #'identity .exam-type " / "))) + (when-let* ((et (and .exam-type (mapconcat #'identity .exam-type " / ")))) (insert (propertize et 'face 'gt-youdao-dict-phonetic-face 'display '(height 0.7)))) ;; 返回 (setf res (if (or .exp-ce .exp-ec) @@ -171,7 +171,7 @@ for item across (alist-get 'entries (alist-get 'data json)) for i from 1 for ent = (propertize (alist-get 'entry item) 'face 'gt-youdao-suggest-entry-face) - for exp = (if-let (ex (alist-get 'explain item)) (propertize (concat " " ex) 'wrap-prefix " ")) + for exp = (if-let* ((ex (alist-get 'explain item))) (propertize (concat " " ex) 'wrap-prefix " ")) collect (concat (if (> i 1) (gt-line-height-separator 18)) ent (if exp (concat "\n" (gt-line-height-separator 8) exp)))))) (with-temp-buffer diff --git a/elpa/go-translate-20240802.131/gt-extension.el b/elpa/go-translate-20250318.907/gt-extension.el similarity index 97% rename from elpa/go-translate-20240802.131/gt-extension.el rename to elpa/go-translate-20250318.907/gt-extension.el index 6941181c..b4bc1266 100644 --- a/elpa/go-translate-20240802.131/gt-extension.el +++ b/elpa/go-translate-20250318.907/gt-extension.el @@ -126,15 +126,15 @@ Notice, this can be overrided by `window-config' slot of render instance." (defun gt-buffer-render--browser () (interactive) - (if-let (url (get-char-property (point) 'gt-url)) + (if-let* ((url (get-char-property (point) 'gt-url))) (progn (browse-url url) (message "Opening %s... Done!" url)) (message "No url found on current result."))) (defun gt-buffer-render--delete-cache () (interactive) - (when-let ((task (get-pos-property (point) 'gt-task)) - (key (gt-cache-key task (or (get-pos-property (point) 'gt-part) 0)))) + (when-let* ((task (get-pos-property (point) 'gt-task)) + (key (gt-cache-key task (or (get-pos-property (point) 'gt-part) 0)))) (gt-cache-set gt-default-cacher key nil) (message "Delete %s from cacher" key))) @@ -184,7 +184,7 @@ as argument that return a length.") (goto-char (min (point-max) (+ (point-min) gt-buffer-render-source-text-limit))) (move-to-column fill-column) (skip-chars-backward " \t\n") - (when-let (bd (bounds-of-thing-at-point 'word)) + (when-let* ((bd (bounds-of-thing-at-point 'word))) (goto-char (cdr bd))) (when (> (- (point-max) 20) (point)) (cons (point) (point-max))))) @@ -262,7 +262,7 @@ If FOLD non nil, only make part of the text visible." (gt-keybinds render translator) ;; state (read-only-mode 1) - (if-let (w (get-buffer-window nil t)) (set-window-point w (point))) + (if-let* ((w (get-buffer-window nil t))) (set-window-point w (point))) ;; execute the hook if exists (run-hooks 'gt-buffer-render-init-hook)))) @@ -276,7 +276,7 @@ If FOLD non nil, only make part of the text visible." ;; refresh source text (goto-char (point-min)) (unless (cdr text) - (when-let (prop (text-property-search-forward 'gt-source-text)) + (when-let* ((prop (text-property-search-forward 'gt-source-text))) (delete-region (prop-match-beginning prop) (prop-match-end prop)) (when (or (cdr ret) (not (get-pos-property 1 'gt-mark (car (ensure-list (plist-get (car ret) :result)))))) (let ((bd (gt-buffer-insert-source-text (car text) t))) @@ -312,7 +312,7 @@ TAG is extra message show in the middle if not nil." (with-slots (target) translator (let ((line (append '(" ") - (when-let (src (car target)) + (when-let* ((src (car target))) (list "[" (propertize (format "%s" src) 'face 'gt-buffer-render-header-lang-face) "]" (if tag (concat " ― " (propertize (format "%s" tag) 'face 'gt-buffer-render-header-desc-face)) "") @@ -367,7 +367,7 @@ TAG is extra message show in the middle if not nil." (display-buffer buf (or window-config gt-buffer-render-window-config))))) (cl-defmethod gt-output ((render gt-buffer-render) translator) - (when-let (buf (get-buffer (or (oref render buffer-name) gt-buffer-render-buffer-name))) + (when-let* ((buf (get-buffer (or (oref render buffer-name) gt-buffer-render-buffer-name)))) (gt-buffer-render-output buf render translator) (when (= (oref translator state) 3) (if gt-buffer-render-follow-p @@ -467,7 +467,7 @@ Manually close the frame with `q'.") (add-hook 'post-command-hook #'gt-posframe-render-auto-close-handler)))) (cl-defmethod gt-output ((render gt-posframe-pop-render) translator) - (when-let (buf (get-buffer gt-posframe-pop-render-buffer)) + (when-let* ((buf (get-buffer gt-posframe-pop-render-buffer))) (let ((gt-buffer-render-output-hook gt-posframe-pop-render-output-hook)) (gt-buffer-render-output buf render translator) (posframe-refresh buf)))) @@ -523,7 +523,7 @@ Other operations in the childframe buffer, just like in 'gt-buffer-render'.") :poshandler (unless position gt-posframe-pin-render-poshandler))))))) (set-frame-parameter gt-posframe-pin-render-frame 'drag-internal-border t) (set-frame-parameter gt-posframe-pin-render-frame 'drag-with-header-line t) - (when-let (color (or (oref render fri-color) gt-pin-posframe-fringe-color)) + (when-let* ((color (or (oref render fri-color) gt-pin-posframe-fringe-color))) (set-face-background 'fringe color gt-posframe-pin-render-frame))) ;; render (let ((gt-buffer-render-init-hook gt-posframe-pin-render-init-hook)) @@ -546,7 +546,7 @@ Other operations in the childframe buffer, just like in 'gt-buffer-render'.") (deactivate-mark) (when (= (oref translator state) 3) (let ((ret (gt-extract render translator))) - (when-let (err (cl-find-if (lambda (r) (<= (plist-get r :state) 1)) ret)) + (when-let* ((err (cl-find-if (lambda (r) (<= (plist-get r :state) 1)) ret))) (kill-new "") (error "%s" (plist-get err :result))) (kill-new (mapconcat (lambda (r) (string-join (plist-get r :result) "\n")) ret "\n\n")) @@ -656,13 +656,13 @@ Otherwise, join the results use the default logic." (gt-stream-p (oref (car tasks) engine))) (with-slots (markers engine) (car tasks) (let ((type (oref render type)) - (beg (if-let (p (caadr bounds)) + (beg (if-let* ((p (caadr bounds))) (save-excursion (goto-char p) (skip-chars-forward "\n" (cdadr bounds)) (point)) (point))) - (end (if-let (p (cdadr bounds)) + (end (if-let* ((p (cdadr bounds))) (save-excursion (goto-char p) (skip-chars-backward " \t\n" (caadr bounds)) @@ -675,7 +675,7 @@ Otherwise, join the results use the default logic." (with-slots (bounds state) translator (when (= 3 state) (let ((ret (gt-extract render translator))) - (when-let (err (cl-find-if (lambda (tr) (<= (plist-get tr :state) 1)) ret)) + (when-let* ((err (cl-find-if (lambda (tr) (<= (plist-get tr :state) 1)) ret))) (user-error "Error in translation, %s" (plist-get err :result))) (with-current-buffer (car bounds) (with-slots (rfmt sface) render @@ -709,7 +709,7 @@ Otherwise, join the results use the default logic." do (let (p) (if (eq type 'replace) (delete-region beg end) - (when-let (face (and (eq type 'after) (gt-ensure-plain sface src))) + (when-let* ((face (and (eq type 'after) (gt-ensure-plain sface src)))) (delete-region beg end) (insert (propertize src 'face face)))) (setq p (point)) @@ -899,7 +899,7 @@ Otherwise, join the results use the default logic." (with-slots (bounds state) translator (when (= 3 state) (let ((ret (gt-extract render translator))) - (when-let (err (cl-find-if (lambda (tr) (<= (plist-get tr :state) 1)) ret)) + (when-let* ((err (cl-find-if (lambda (tr) (<= (plist-get tr :state) 1)) ret))) (user-error "Error in translation, %s" (plist-get err :result))) (with-current-buffer (car bounds) (cl-loop with start = (point-marker) @@ -1029,7 +1029,7 @@ target, engines and render in the buffer for the following translation." (cl-destructuring-bind (_ eg rd) (ignore-errors (gt-translator-info translator)) (list (prop (concat - (if-let (src (car target)) (concat "[" (prop src) "] → ")) + (if-let* ((src (car target))) (concat "[" (prop src) "] → ")) "[" (mapconcat (lambda (s) (prop s)) (cdr target) ", ") "]") #'cycle-next-target t) (if eg (concat " Engines: " (prop eg #'set-engines))) @@ -1152,7 +1152,7 @@ target, engines and render in the buffer for the following translation." (setq gt-fresh-words-last nil) (let* ((car (if (cdr bounds) (cl-subseq bounds 0 2) (car text))) (pred (lambda (word) - (and (if-let (p (oref taker pick-pred)) (funcall p word) t) + (and (if-let* ((p (oref taker pick-pred))) (funcall p word) t) (> (string-bytes word) 2) (not (string-match-p "^[0-9]+$" word)) (gt-word-fresh-p word) @@ -1165,7 +1165,7 @@ target, engines and render in the buffer for the following translation." (declare-function pdf-view-active-region-p "ext:pdf-view.el" t t) (declare-function pdf-view-active-region-text "ext:pdf-view.el" t t) -(cl-defmethod gt-text-at-point (_thing (_ (eql 'pdf-view-mode))) +(cl-defmethod gt-thing-at-point (_thing (_ (eql 'pdf-view-mode))) (if (pdf-view-active-region-p) (pdf-view-active-region-text) (user-error "You should make a selection before translate"))) diff --git a/elpa/go-translate-20240802.131/gt-faces.el b/elpa/go-translate-20250318.907/gt-faces.el similarity index 100% rename from elpa/go-translate-20240802.131/gt-faces.el rename to elpa/go-translate-20250318.907/gt-faces.el diff --git a/elpa/go-translate-20240802.131/gt-httpx.el b/elpa/go-translate-20250318.907/gt-httpx.el similarity index 97% rename from elpa/go-translate-20240802.131/gt-httpx.el rename to elpa/go-translate-20250318.907/gt-httpx.el index def4a9b2..647d8c79 100644 --- a/elpa/go-translate-20240802.131/gt-httpx.el +++ b/elpa/go-translate-20250318.907/gt-httpx.el @@ -226,9 +226,9 @@ If request async, return the process behind the request." (let ((cb (current-buffer))) (remove-hook 'after-change-functions #'gt-url-http-extra-filter t) (unwind-protect - (if-let (err (or (cdr-safe (plist-get status :error)) - (when (or (null url-http-end-of-headers) (= 1 (point-max))) - (list 'empty-response "Nothing responsed from server")))) + (if-let* ((err (or (cdr-safe (plist-get status :error)) + (when (or (null url-http-end-of-headers) (= 1 (point-max))) + (list 'empty-response "Nothing responsed from server"))))) (if fail (funcall fail err) (signal 'user-error err)) (if done (funcall done (funcall get-resp-content)))) (kill-buffer cb)))) @@ -342,13 +342,13 @@ Or switch http client to `gt-url-http-client' instead:\n :else (lambda (err) (let ((ret ;; try to compat with error object of url.el, see `url-retrieve' for details (or (plz-error-message err) - (when-let (r (plz-error-curl-error err)) + (when-let* ((r (plz-error-curl-error err))) (list 'curl-error (concat (format "%s" (or (cdr r) (car r))) (pcase (car r) (2 (when (memq system-type '(cygwin windows-nt ms-dos)) gt-plz-initialize-error-message)))))) - (when-let (r (plz-error-response err)) + (when-let* ((r (plz-error-response err))) (list 'http (plz-response-status r) (plz-response-body r)))))) (if fail (funcall fail ret) (signal 'user-error ret)))))))) diff --git a/elpa/go-translate-20240802.131/gt-text-utility.el b/elpa/go-translate-20250318.907/gt-text-utility.el similarity index 100% rename from elpa/go-translate-20240802.131/gt-text-utility.el rename to elpa/go-translate-20250318.907/gt-text-utility.el -- 2.47.3