Work with special characters in replacement strings

This commit is contained in:
Mark Janssen 2025-06-10 21:59:46 +02:00
parent 04e26c8d55
commit d7102a274d
No known key found for this signature in database
GPG key ID: D8674D8FC4F69BD2

View file

@ -1,6 +1,6 @@
#!/bin/bash #!/bin/bash
SOURCEDIR=`pwd` SOURCEDIR=$(pwd)
PROJECT=$1 PROJECT=$1
BASETEMPLATE="nluug-title-template.svg" BASETEMPLATE="nluug-title-template.svg"
SOURCEFILE="event.svg" SOURCEFILE="event.svg"
@ -9,26 +9,26 @@ PROJDIR=/tmp/nluug-intro-${PROJECT}
if [ -z "${PROJECT}" ]; then if [ -z "${PROJECT}" ]; then
echo "Usage: $0 <project>" echo "Usage: $0 <project>"
exit 1; exit 1
fi fi
if [ -z "$EVENTNAME" ]; then if [ -z "$EVENTNAME" ]; then
echo "Specify EVENTNAME env-var" echo "Specify EVENTNAME env-var"
exit 2; exit 2
fi fi
if [ -z "$SPEAKERNAME" ]; then if [ -z "$SPEAKERNAME" ]; then
echo "Specify SPEAKERNAME env-var" echo "Specify SPEAKERNAME env-var"
exit 3; exit 3
fi fi
if [ -z "$TITLE1" -o -z "$TITLE2" -o -z "$TITLE3" ]; then if [ -z "$TITLE1" ] || [ -z "$TITLE2" ] || [ -z "$TITLE3" ]; then
echo "Specify TITLE1/TITLE2/TITLE3 env-vars" echo "Specify TITLE1/TITLE2/TITLE3 env-vars"
exit 4; exit 4
fi fi
# Usage:
# EVENTNAME="NLUUG Najaar 5 November 2024" # EVENTNAME="NLUUG Najaar 5 November 2024"
# MAXLENGTH="SPEAKERSPEAKERSPEAKERSPEAKERSPEAKER" # MAXLENGTH="SPEAKERSPEAKERSPEAKERSPEAKERSPEAKER"
#SPEAKERNAME="Example Speaker Name" #SPEAKERNAME="Example Speaker Name"
# MAX="XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
#TITLE1="Keynote: Some example title" #TITLE1="Keynote: Some example title"
#TITLE2="With 3 lines, or use some whitespace" #TITLE2="With 3 lines, or use some whitespace"
#TITLE3="If less are needed" #TITLE3="If less are needed"
@ -39,15 +39,15 @@ FRAMENUM=0
# Make project directory # Make project directory
mkdir -p ${PROJDIR}; cd ${PROJDIR} mkdir -p ${PROJDIR}; cd ${PROJDIR}
# Customize tempalte to this event from base template # Customize template to this event from base template
cat ${SOURCEDIR}/$BASETEMPLATE | sed -e "s/EVENTNAMEEVENTNAME/$EVENTNAME/" > ${SOURCEFILE} awk -v eventname="$EVENTNAME" '{gsub(/EVENTNAMEEVENTNAME/, eventname); print}' "${SOURCEDIR}/${BASETEMPLATE}" > ${SOURCEFILE}
# Create initial image without title/speaker info # Create initial image without title/speaker info
cat ${SOURCEFILE} | sed -e 's/SPEAKERSPEAKERSPEAKERSPEAKERSPEAKER//' -e 's/TITLE[123]//' > frameclear.svg awk '{gsub(/SPEAKERSPEAKERSPEAKERSPEAKERSPEAKER/, ""); gsub(/TITLE[123]/, ""); print}' ${SOURCEFILE} > frameclear.svg
# Fade this image in from 100% transparant to 'normal' # Fade this image in from 100% transparent to 'normal'
echo "Generate fade-in-from-black sequence" echo "Generate fade-in-from-black sequence"
for i in `seq 100 -3 0` for i in $(seq 100 -3 0)
do do
echo "Generate frame ${FRAMENUM}" echo "Generate frame ${FRAMENUM}"
${CONV} -colorize ${i}% frameclear.svg frame-${FRAMENUM}.webp ${CONV} -colorize ${i}% frameclear.svg frame-${FRAMENUM}.webp
@ -57,37 +57,37 @@ done
echo "Add speakername sequence" echo "Add speakername sequence"
SLEN=${#SPEAKERNAME} # Length of name SLEN=${#SPEAKERNAME} # Length of name
# Copy a new frame, and fill in the speaker name 1 character at a time # Copy a new frame, and fill in the speaker name 1 character at a time
for i in `seq 0 ${SLEN}` for i in $(seq 0 ${SLEN})
do do
echo "Generate frame ${FRAMENUM}" echo "Generate frame ${FRAMENUM}"
SN="${SPEAKERNAME::$i}" SN="${SPEAKERNAME:0:i}"
cat ${SOURCEFILE} | sed -e "s/TITLE[123]//" -e "s/SPEAKERSPEAKERSPEAKERSPEAKERSPEAKER/$SN/" > ${PROJDIR}/frame-${FRAMENUM}.svg awk -v sn="$SN" '{gsub(/TITLE[123]/, ""); gsub(/SPEAKERSPEAKERSPEAKERSPEAKERSPEAKER/, sn); print}' ${SOURCEFILE} > ${PROJDIR}/frame-${FRAMENUM}.svg
${CONV} frame-${FRAMENUM}.svg frame-${FRAMENUM}.webp ${CONV} frame-${FRAMENUM}.svg frame-${FRAMENUM}.webp
((FRAMENUM++)) ((FRAMENUM++))
done done
echo "Add title sequence" echo "Add title sequence"
# With speakername, not add the title, 1 char (per line) at a time # With speakername, now add the title, 1 char (per line) at a time
for i in `seq 0 40` for i in $(seq 0 40)
do do
echo "Generate frame ${FRAMENUM}" echo "Generate frame ${FRAMENUM}"
T1="${TITLE1::$i}" # Substring, first i characters T1="${TITLE1:0:i}" # Substring, first i characters
T2="${TITLE2::$i}" T2="${TITLE2:0:i}"
T3="${TITLE3::$i}" T3="${TITLE3:0:i}"
cat ${SOURCEFILE} | sed -e "s/TITLE1/$T1/" -e "s/TITLE2/$T2/" -e "s/TITLE3/$T3/" -e "s/SPEAKERSPEAKERSPEAKERSPEAKERSPEAKER/$SN/" > ${PROJDIR}/frame-${FRAMENUM}.svg awk -v t1="$T1" -v t2="$T2" -v t3="$T3" -v sn="$SN" '{gsub(/TITLE1/, t1); gsub(/TITLE2/, t2); gsub(/TITLE3/, t3); gsub(/SPEAKERSPEAKERSPEAKERSPEAKERSPEAKER/, sn); print}' ${SOURCEFILE} > ${PROJDIR}/frame-${FRAMENUM}.svg
${CONV} frame-${FRAMENUM}.svg frame-${FRAMENUM}.webp ${CONV} frame-${FRAMENUM}.svg frame-${FRAMENUM}.webp
((FRAMENUM++)) ((FRAMENUM++))
done done
# Generate final frame, with full speakername + title # Generate final frame, with full speakername + title
echo "Generate completed title" echo "Generate completed title"
cat ${SOURCEFILE} | sed -e "s/TITLE1/$TITLE1/" -e "s/TITLE2/$TITLE2/" -e "s/TITLE3/$TITLE3/" -e "s/SPEAKERSPEAKERSPEAKERSPEAKERSPEAKER/$SPEAKERNAME/" > ${PROJDIR}/frame-${FRAMENUM}.svg awk -v t1="$TITLE1" -v t2="$TITLE2" -v t3="$TITLE3" -v sn="$SPEAKERNAME" '{gsub(/TITLE1/, t1); gsub(/TITLE2/, t2); gsub(/TITLE3/, t3); gsub(/SPEAKERSPEAKERSPEAKERSPEAKERSPEAKER/, sn); print}' ${SOURCEFILE} > ${PROJDIR}/frame-${FRAMENUM}.svg
${CONV} frame-${FRAMENUM}.svg frame-${FRAMENUM}.webp ${CONV} frame-${FRAMENUM}.svg frame-${FRAMENUM}.webp
LASTFRAME=$FRAMENUM LASTFRAME=$FRAMENUM
((FRAMENUM++)) ((FRAMENUM++))
# Now copy the rendered output of the last frame a few more times so we can read it before the video ends # Now copy the rendered output of the last frame a few more times so we can read it before the video ends
for i in `seq 0 1 100` for i in $(seq 0 1 100)
do do
echo "Duplicating frame ${FRAMENUM}" echo "Duplicating frame ${FRAMENUM}"
cp frame-${LASTFRAME}.webp frame-${FRAMENUM}.webp cp frame-${LASTFRAME}.webp frame-${FRAMENUM}.webp
@ -96,7 +96,7 @@ done
# Fade this image out over 100 frames back to the normal view # Fade this image out over 100 frames back to the normal view
echo "Generate fade-out-sequence" echo "Generate fade-out-sequence"
for i in `seq 0 3 100` for i in $(seq 0 3 100)
do do
echo "Generate frame ${FRAMENUM}" echo "Generate frame ${FRAMENUM}"
${CONV} -colorize ${i}% frame-${LASTFRAME}.svg frame-${FRAMENUM}.webp ${CONV} -colorize ${i}% frame-${LASTFRAME}.svg frame-${FRAMENUM}.webp
@ -104,8 +104,5 @@ do
done done
echo "Rendering to video" echo "Rendering to video"
#ffmpeg -framerate 30 -i frame-%d.webp -c:v libx264 -r 30 ${VIDEODIR}/${PROJECT}-x264.mkv ffmpeg -f lavfi -i anullsrc=channel_layout=stereo:sample_rate=44100 -framerate 25 -i frame-%d.webp -c:a aac -c:v libx264 -shortest -profile:v baseline -pix_fmt yuv420p -colorspace:v 'bt709' -color_primaries:v 'bt709' -color_trc:v 'bt709' -color_range:v 'tv' -r 30 ${VIDEODIR}/${PROJECT}-x264.mkv
#ffmpeg -framerate 30 -i frame-%d.webp -c:v vp9 -r 30 ${VIDEODIR}/${PROJECT}-vp9.webm
ffmpeg -f lavfi -i anullsrc=channel_layout=stereo:sample_rate=44100 -framerate 30 -i frame-%d.webp -c:a aac -c:v libx264 -shortest -profile:v baseline -pix_fmt yuv420p -colorspace:v 'bt709' -color_primaries:v 'bt709' -color_trc:v 'bt709' -color_range:v 'tv' -r 30 ${VIDEODIR}/${PROJECT}-x264.mkv
#rm *.svg frame-*.webp