]> Sergey Matveev's repositories - torn.git/blobdiff - torn.zsh
Typo
[torn.git] / torn.zsh
index 511d544960a1159cb94c5f51c46976f1c481aee9..69ec947335c4021212372ebbd7e43cc796333b7a 100755 (executable)
--- a/torn.zsh
+++ b/torn.zsh
@@ -1,15 +1,16 @@
 # torn - Musical files renaming with russian language transliteration
-# Copyright (C) 2007-2021 Sergey Matveev (stargrave@stargrave.org)
+# Copyright (C) 2021-2024 Sergey Matveev (stargrave@stargrave.org)
 #
 # 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, version 3 of the License.
 
-# Initially this script was written on Perl, but now it is zsh function,
-# that is intended to be used with zmv command. It is much more flexible
-# to be used with zsh'es glob expansion.
+# Initially this script was written on Perl, but now it is Z shell
+# function, that is intended to be used with zmv command. It is much
+# more flexible to be used with zsh'es glob expansion.
 #
 # * transliterates everything
+# * replaces non FAT-compatible characters with underscores
 # * replaces spaces with underscores
 # * lowercases file's extension
 # * replaces "_-_" with single dash
 # You can run like that:
 #   $ fpath=(... $fpath)
 #   $ autoload torn
-#   $ zmv "*" '`torn $f`"
+#   $ zmv "*" '`torn $f`'
 #
 # Transliteration function is separate tornt(), so you can use only
 # its abilities:
 #   $ torn # assume that it is not autoloaded
 #   $ zmv "*" '`tornt $f`'
 #
+# torna() replaces non FAT-compatible characters with underscores.
+#
 # Recursively dive into subdirectories:
 #   $ zmv -Q "(**/)*(.)" '`torn $f`'
 
@@ -42,13 +45,15 @@ tornt() {
     local rusL=( ж  ч  ш   щ  я  ю  Ж  Ч  Ш   Щ  Я  Ю)
     local engL=(zh ch sh sch ja ju Zh Ch Sh Sch Ja Ju)
     for i ({1..${#rusL}}) eval n=\${n:gs/${rusL[$i]}/${engL[$i]}}
-    print $n
+    print -- $n
 }
 
 tornm() {
     local n=$1
     n=${n:gs/ /_}
     n=${n//_[–-]_/-}
+    n=${n//_[–-]/-}
+    n=${n//[–-]_/-}
     n=${n:gs/,_/,}
     n=${n//[\[\]]/}
     n=${n:gs/_(/(}
@@ -59,10 +64,23 @@ tornm() {
     n=${n:gs/&/and}
     [[ $n =~ "\." ]] && n=${n:r}.${(L)n:e}
     [[ $n =~ "^([[:digit:]]+)[-.]_*(.+)$" ]] && n="$match[1].$match[2]"
-    print $n
+    print -- $n
+}
+
+torna() {
+    local n=$1
+    setopt REMATCH_PCRE
+    for i ({1..${#n}}) {
+        [[ ${n[$i]} =~ "[[:ascii:]]" ]] || n[$i]=_
+        [[ ${n[$i]} =~ "[[:print:]]" ]] || n[$i]=_
+        [[ ${n[$i]} =~ "[^,+/:;<=>?[]|]" ]] || n[$i]=_
+    }
+    print -- $n
 }
 
+[[ -n $1 ]] || return
 local n=${1:t}
 n=`tornm $n`
 n=`tornt $n`
-print ${1:h}/$n
+n=`torna $n`
+print -- ${1:h}/$n