File: //usr/lib/cups/filter/textbrftoindexv3
#!/bin/bash
#
# Copyright (c) 2015-2018 Samuel Thibault <samuel.thibault@ens-lyon.org>
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
# in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:
#
#
# The above copyright notice and this permission notice shall be included in
# all copies or substantial portions of the Software.
#
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
# THE SOFTWARE.
#
# Make sure we have enough options
if [ $# != 5 -a $# != 6 ]; then
echo "ERROR: $0 jobid user name nb options [filename]" >&2
exit 1
fi
NB=$4
OPTIONS=$5
FILE=$6
case $0 in
*indexv3*) . /usr/share/cups/braille/indexv3.sh ;;
*indexv4*) . /usr/share/cups/braille/indexv4.sh ;;
*) echo "ERROR: $0 must be called as somethingindexv3 or somethingindexv4" >&2
exit 1
;;
esac
printf "$INIT"
if [ $LIBLOUIS1 != None -o \
$LIBLOUIS2 != None -o \
$LIBLOUIS3 != None -o \
$LIBLOUIS4 != None ]
then
# software-translated, send to printer in transparent mode
echo "INFO: Writing text to Index embosser in transparent mode" >&2
if [ -z "$FILE" ]
then
cat
else
cat "$FILE"
fi | (
IFS=$'\n' read -r LINE
EOF=$?
while [ "$EOF" = 0 -o -n "$LINE" ]
do
# Strip CRs
LINE=${LINE//$'\015'}
# Ignore SUBs
LINE=${LINE//$'\032'}
# Turn non-breakable spaces into spaces
LINE=${LINE//$'\302'$'\240'/ }
LINE=${LINE//$'\240'/ }
# Interpret FFs
while [ -n "$LINE" -a -z "${LINE/#$'\014'*}" ]
do
printf "\\f"
LINE=${LINE#$'\014'}
done
# Make sure there is nothing else we don't process
if [ -n "$LINE" ]
then
if [ -z "${LINE/*[$'\000'-$'\037'$'\177']*}" ]
then
echo "ERROR: unsupported control character in BRF file" >&2
fi
if [ -z "${LINE/*[$'\200'-$'\377']*}" ]
then
echo "ERROR: unsupported non-ASCII character in BRF file" >&2
fi
fi
CHARS=$(printf %s "$LINE" | wc -c)
if [ "$CHARS" -gt 127 ]
then
# Index printers have a bug with numbers between 128 and 255 in
# transparent mode escape sequence. This is normally not a problem since
# 128 chars is more than a line worth of text
echo "ERROR: Line too long ($CHARS)" >&2
exit 1
fi
if [ "$CHARS" -gt 0 ]
then
# Enter transparent mode for $CHARS characters
printf "\\033\\\\\\x$(printf %02x $CHARS)\\x00"
# Echo those $CHARS characters.
# First normalize BRF characters (`a-z{|}~ are non-standard).
# Drop unicode patterns with dots 7 or 8 in case the liblouis table happened to erroneously emit one
# Drop remaining erroneous multibyte characters
# Drop remaining erroneous 1-byte characters
# Then turn it into Index 6dots sequences.
printf %s "$LINE" | \
tr "\`a-z{|}~" "@A-Z\\[\\\\]_" | \
sed -e 's/[⡀⡁⡂⡃⡄⡅⡆⡇⡈⡉⡊⡋⡌⡍⡎⡏⡐⡑⡒⡓⡔⡕⡖⡗⡘⡙⡚⡛⡜⡝⡞⡟⡠⡡⡢⡣⡤⡥⡦⡧⡨⡩⡪⡫⡬⡭⡮⡯⡰⡱⡲⡳⡴⡵⡶⡷⡸⡹⡺⡻⡼⡽⡾⡿⢀⢁⢂⢃⢄⢅⢆⢇⢈⢉⢊⢋⢌⢍⢎⢏⢐⢑⢒⢓⢔⢕⢖⢗⢘⢙⢚⢛⢜⢝⢞⢟⢠⢡⢢⢣⢤⢥⢦⢧⢨⢩⢪⢫⢬⢭⢮⢯⢰⢱⢲⢳⢴⢵⢶⢷⢸⢹⢺⢻⢼⢽⢾⢿⣀⣁⣂⣃⣄⣅⣆⣇⣈⣉⣊⣋⣌⣍⣎⣏⣐⣑⣒⣓⣔⣕⣖⣗⣘⣙⣚⣛⣜⣝⣞⣟⣠⣡⣢⣣⣤⣥⣦⣧⣨⣩⣪⣫⣬⣭⣮⣯⣰⣱⣲⣳⣴⣵⣶⣷⣸⣹⣺⣻⣼⣽⣾⣿]/ /g' | \
sed -e "s/[^] \!\"#$%&'()*+,.\\/0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ\\\\^_[-]/ /g" | \
tr "\000-\037\177\200-\377" " " | \
tr " \!\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ\\[\\\\\\]^_" "\\0V tSQW"$'\004'"gvAT@DP"$'\024'"d"$'\002\006'"\"bB&fF\$a\`Cw4q"$'\020\001\003\021'"1!"$'\023'"3#"$'\022'"2"$'\005\007\025'"5%"$'\027'"7'"$'\026'"6EGrUueRcs0p"
fi
if [ "$EOF" = 0 ]
then
printf "\\r\\n"
fi
IFS=$'\n' read -r LINE
EOF=$?
done
)
if [ $? != 0 ]
then
printf '\032'
exit 1
fi
else
# not software-translated, send to printer as such
echo "INFO: Writing text to Index embosser" >&2
if [ -z "$FILE" ]
then
cat
else
cat "$FILE"
fi
fi
printf '\032'
echo "INFO: Ready" >&2