# torn - Musical files renaming with russian language transliteration
-# Copyright (C) 2007-2022 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`'
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/_(/(}
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