From ef43dca94fa0f078c186e1edc88f876d95cc5f32 Mon Sep 17 00:00:00 2001 From: Storm Dragon Date: Wed, 14 May 2025 04:36:30 -0400 Subject: [PATCH] Updated the clipboard translater because it could crash on some translations. --- speech/clipboard_translator.sh | 83 +++++++++++++++++++++++----------- 1 file changed, 56 insertions(+), 27 deletions(-) diff --git a/speech/clipboard_translator.sh b/speech/clipboard_translator.sh index 7a267b2..d5ab82d 100755 --- a/speech/clipboard_translator.sh +++ b/speech/clipboard_translator.sh @@ -7,7 +7,6 @@ # set -Eeuo pipefail # https://vaneyckt.io/posts/safer_bash_scripts_with_set_euxo_pipefail/#:~:text=set%20%2Du,is%20often%20highly%20desirable%20behavior. shopt -s expand_aliases - if [[ $# -ne 2 ]]; then echo "Usage: $0 \"application name\" \"file name\"." exit 1 @@ -22,6 +21,40 @@ fileName="${2,,}" fileName="${fileName//[[:space:]]/-}.sqlite" translationFile="${XDG_CACHE_HOME:-$HOME/.cache}/audiogame-manager/${fileName}" +# Make sure the directory exists +mkdir -p "$(dirname "$translationFile")" + +# Initialize database if it doesn't exist +if [[ ! -s "$translationFile" ]]; then + rm -f "$translationFile" + sqlite3 "$translationFile" < /dev/null ; do sleep 0.05 @@ -37,24 +70,6 @@ while pgrep -u "$USER" ^$1 &> /dev/null ; do if [[ -z "$text" ]]; then continue fi - q() { sqlite3 -column -init "" "$translationFile" "$@" 2> /dev/null ; } - - - if [[ ! -s "$translationFile" ]]; then - rm -f "$translationFile" - cat << EOF | sqlite3 -init "" "$translationFile" 2> /dev/null -.bail on - -CREATE TABLE translations( - text TEXT NOT NULL, - translation TEXT NOT NULL, - - PRIMARY KEY (text) -); -CREATE INDEX translations_text_idx ON translations (text); -EOF - fi - # https://en.wikipedia.org/wiki/Unicode_equivalence#Combining_and_precomposed_characters # https://www.effectiveperlprogramming.com/2011/09/normalize-your-perl-source/ @@ -65,18 +80,32 @@ EOF alias normalize_spaces="perl -CSDA -plE 's/[^\\S\\t]/ /g'" alias normalize_unicode="normalize_spaces | nfc" - textEscaped="$(echo "$text" | sed "s/'/''/g" | normalize_unicode)" # escape single quotes for sqlite - translated="$(q "SELECT translation FROM translations WHERE text = '$textEscaped' LIMIT 1" | sed 's/\s*$//')" - + # Normalize text + normalized_text="$(echo "$text" | normalize_unicode)" + + # Create a temporary database for import + sqlite3 "$translationFile" "CREATE TABLE IF NOT EXISTS temp_import(text TEXT, translation TEXT);" + + # Check if we already have a translation + translated=$(sqlite3 "$translationFile" "SELECT translation FROM translations WHERE text = '$normalized_text' LIMIT 1;" 2>/dev/null) + if [[ -z "$translated" ]]; then - translated="$(trans -no-autocorrect -no-warn -brief "$text" | head -1 | sed 's/\s*$//' | normalize_unicode)" + # Get translation from the trans utility + translated="$(trans -no-autocorrect -no-warn -brief "$normalized_text" | head -1 | sed 's/\s*$//' | normalize_unicode)" + if [[ -n "$translated" ]]; then - translatedEscaped="$(echo "$translated" | sed "s/'/''/g")" - q "INSERT OR IGNORE INTO translations (text, translation) VALUES ('$textEscaped', '$translatedEscaped')" + # Insert using echo piping to avoid escaping issues + echo "$normalized_text|$translated" | sqlite3 -separator "|" "$translationFile" ".import /dev/stdin temp_import" + sqlite3 "$translationFile" "INSERT OR IGNORE INTO translations SELECT * FROM temp_import; DELETE FROM temp_import;" fi fi - - spd-say -- "$translated" + + # If we got a translation, speak it + if [[ -n "$translated" ]]; then + spd-say -- "$translated" + fi + + # Clear clipboard echo "" | xclip -d "${DISPLAY:-:0}" -selection clipboard 2> /dev/null done