From d7102a274dcf433b33834123bd9a9cf57fa0bbe8 Mon Sep 17 00:00:00 2001 From: Mark Janssen Date: Tue, 10 Jun 2025 21:59:46 +0200 Subject: [PATCH] Work with special characters in replacement strings --- generate.sh | 53 +++++++++++++++++++++++++---------------------------- 1 file changed, 25 insertions(+), 28 deletions(-) diff --git a/generate.sh b/generate.sh index c72b53b..d54eb18 100755 --- a/generate.sh +++ b/generate.sh @@ -1,6 +1,6 @@ #!/bin/bash -SOURCEDIR=`pwd` +SOURCEDIR=$(pwd) PROJECT=$1 BASETEMPLATE="nluug-title-template.svg" SOURCEFILE="event.svg" @@ -9,26 +9,26 @@ PROJDIR=/tmp/nluug-intro-${PROJECT} if [ -z "${PROJECT}" ]; then echo "Usage: $0 " - exit 1; + exit 1 fi if [ -z "$EVENTNAME" ]; then echo "Specify EVENTNAME env-var" - exit 2; + exit 2 fi if [ -z "$SPEAKERNAME" ]; then echo "Specify SPEAKERNAME env-var" - exit 3; + exit 3 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" - exit 4; + exit 4 fi +# Usage: # EVENTNAME="NLUUG Najaar 5 November 2024" # MAXLENGTH="SPEAKERSPEAKERSPEAKERSPEAKERSPEAKER" #SPEAKERNAME="Example Speaker Name" -# MAX="XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" #TITLE1="Keynote: Some example title" #TITLE2="With 3 lines, or use some whitespace" #TITLE3="If less are needed" @@ -39,15 +39,15 @@ FRAMENUM=0 # Make project directory mkdir -p ${PROJDIR}; cd ${PROJDIR} -# Customize tempalte to this event from base template -cat ${SOURCEDIR}/$BASETEMPLATE | sed -e "s/EVENTNAMEEVENTNAME/$EVENTNAME/" > ${SOURCEFILE} +# Customize template to this event from base template +awk -v eventname="$EVENTNAME" '{gsub(/EVENTNAMEEVENTNAME/, eventname); print}' "${SOURCEDIR}/${BASETEMPLATE}" > ${SOURCEFILE} # 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" -for i in `seq 100 -3 0` +for i in $(seq 100 -3 0) do echo "Generate frame ${FRAMENUM}" ${CONV} -colorize ${i}% frameclear.svg frame-${FRAMENUM}.webp @@ -57,37 +57,37 @@ done echo "Add speakername sequence" SLEN=${#SPEAKERNAME} # Length of name # 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 echo "Generate frame ${FRAMENUM}" - SN="${SPEAKERNAME::$i}" - cat ${SOURCEFILE} | sed -e "s/TITLE[123]//" -e "s/SPEAKERSPEAKERSPEAKERSPEAKERSPEAKER/$SN/" > ${PROJDIR}/frame-${FRAMENUM}.svg + SN="${SPEAKERNAME:0:i}" + awk -v sn="$SN" '{gsub(/TITLE[123]/, ""); gsub(/SPEAKERSPEAKERSPEAKERSPEAKERSPEAKER/, sn); print}' ${SOURCEFILE} > ${PROJDIR}/frame-${FRAMENUM}.svg ${CONV} frame-${FRAMENUM}.svg frame-${FRAMENUM}.webp ((FRAMENUM++)) done echo "Add title sequence" -# With speakername, not add the title, 1 char (per line) at a time -for i in `seq 0 40` +# With speakername, now add the title, 1 char (per line) at a time +for i in $(seq 0 40) do echo "Generate frame ${FRAMENUM}" - T1="${TITLE1::$i}" # Substring, first i characters - T2="${TITLE2::$i}" - T3="${TITLE3::$i}" - cat ${SOURCEFILE} | sed -e "s/TITLE1/$T1/" -e "s/TITLE2/$T2/" -e "s/TITLE3/$T3/" -e "s/SPEAKERSPEAKERSPEAKERSPEAKERSPEAKER/$SN/" > ${PROJDIR}/frame-${FRAMENUM}.svg + T1="${TITLE1:0:i}" # Substring, first i characters + T2="${TITLE2:0:i}" + T3="${TITLE3:0:i}" + 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 ((FRAMENUM++)) done # Generate final frame, with full speakername + 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 LASTFRAME=$FRAMENUM ((FRAMENUM++)) # 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 echo "Duplicating frame ${FRAMENUM}" cp frame-${LASTFRAME}.webp frame-${FRAMENUM}.webp @@ -96,7 +96,7 @@ done # Fade this image out over 100 frames back to the normal view echo "Generate fade-out-sequence" -for i in `seq 0 3 100` +for i in $(seq 0 3 100) do echo "Generate frame ${FRAMENUM}" ${CONV} -colorize ${i}% frame-${LASTFRAME}.svg frame-${FRAMENUM}.webp @@ -104,8 +104,5 @@ do done echo "Rendering to video" -#ffmpeg -framerate 30 -i frame-%d.webp -c:v libx264 -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 +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 -#rm *.svg frame-*.webp