123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581 |
- #!/bin/bash
- RC_OK=0
- RC_ERROR=1
- RC_LOCK=2
- RC_CONFIG_MISSED=3
- RC_CONFIG_PARAM=4
- RC_PANDOC_FILES=5
- RC_ARGS=6
- RC_ARGS_DOSSIER=7
- RC_ARGS_PROJET=8
- RC_ARGS_ACTION=9
- end_with_code() {
- local rc=$1
- if test -z "$rc";
- then
- rc=$RC_ERROR
- fi
- if test "$rc" -eq 0;
- then
- cleanup_working_folder
- fi
- verbose "[$FUNCNAME] exiting with RC=[$rc]"
- exit $rc
- }
- die() {
- verbose "[$FUNCNAME] 1:[$1] 2:[$2]"
- local message
- local rc
- if test $# -eq 2;
- then
- message=$1
- rc=$2
- else
- message=$1
- rc=$RC_ERROR
- fi
- echo -e "$$ $message" >&2
- end_with_code $rc
- }
- verbose() {
- if test -n "$VERBOSE";
- then
- if test "$VERBOSE" -ne 0;
- then
- echo "$$ $@"
- fi
- fi
- }
- debug() {
- if test "$DEBUG" -ne 0;
- then
- echo "$@"
- fi
- }
- init_check() {
- if test -e $LOCK_FILE;
- then
- die "[$FUNCNAME] lock=$LOCK_FILE exists. Wait compilation or erase it" $RC_LOCK
- fi
- # PANDOC_FILTER_BASE should exists
- if test ! -d "$PANDOC_FILTER_BASE";
- then
- die "[$FUNCNAME]: PANDOC_FILTER_BASE=$PANDOC_FILTER_BASE unavailable" $RC_PANDOC_FILES
- fi
- # PANDOC_INCLUDE_BASE should exists
- if test ! -d "$PANDOC_INCLUDE_BASE";
- then
- die "[$FUNCNAME]: PANDOC_INCLUDE_BASE=$PANDOC_INCLUDE_BASE unavailable" $RC_PANDOC_FILES
- fi
- # STORE should exists
- if test ! -d "$STORE" -o ! -w "$STORE";
- then
- die "[$FUNCNAME]: STORE=$STORE should be a writable folder"
- fi
- # WORKING_FOLDER should exists
- if test ! -d "$WORKING_FOLDER" -o ! -w "$WORKING_FOLDER";
- then
- die "[$FUNCNAME]: WORKING_FOLDER=$WORKING_FOLDER should be a writable folder"
- fi
- # MIRRORPAD shoud exists and executable
- if test ! -x "$MIRRORPAD";
- then
- die "[$FUNCNAME]: MIRRORPAD=$MIRRORPAD should be an axecutable file"
- fi
- # external tools
- for tool in touch pandoc pdflatex
- do
- local tool_location=$(command -v $tool)
- if test "$tool_location";
- then
- verbose "[$FUNCNAME] $tool=$tool_location"
- else
- die "[$FUNCNAME] $tool unavailable"
- fi
- done
- }
- mirror_pad() {
- debug "[$FUNCNAME] ARGS:$@"
- if test $# -ne 2;
- then
- die 'usage: [$FUNCNAME] url filename'
- fi
- local url=$1
- local filename=$2
- verbose "[$FUNCNAME] url=$url filename=$filename"
- RESPONSE=$($MIRRORPAD $url > "$filename")
- RC=$?
- local errstr="[$FUNCNAME] RC=[$RC] $RESPONSE"
- if test "$RC" -eq 0;
- then
- verbose "$errstr"
- else
- die "$errstr"
- fi
- }
- pad2json() {
- debug "[$FUNCNAME] ARGS:$@"
- if test $# -ne 2;
- then
- die "usage: [$FUNCNAME] input_file output_file"
- fi
- local input=$1
- local output=$2
- verbose "[$FUNCNAME] input=$input output=$output"
- RESPONSE=$(pandoc \
- -f markdown "$input" \
- -o "$output" -t json --self-contained)
- RC=$?
- local errstr="[$FUNCNAME] RC=[$RC] $RESPONSE"
- if test "$RC" -eq 0;
- then
- verbose "$errstr"
- else
- die "$errstr"
- fi
- }
- pad2docx() {
- debug "[$FUNCNAME] PWD:$PWD ARGS:$@"
- if test $# -ne 2;
- then
- die 'usage: [$FUNCNAME] input_file output_file'
- fi
- local input=$1
- local output=$2
- local refdoc="$PANDOC_INCLUDE_BASE/spinosi.docx"
- verbose "[$FUNCNAME] input=$input output=$output"
- if ! test -e "$refdoc";
- then
- die "[$FUNCNAME] refdoc=$refdoc unavailable"
- fi
- RESPONSE=$(pandoc \
- -f markdown "$input" \
- -o "$output" -t docx --self-contained --smart \
- --reference-docx="$refdoc" \
- --filter pandoc-citeproc \
- --filter $PANDOC_FILTER_BASE/docx.zsh \
- --filter $PANDOC_FILTER_BASE/nettoyage.zsh \
- --filter $PANDOC_FILTER_BASE/nettoyage-etendu.zsh)
- RC=$?
- local errstr="[$FUNCNAME] RC=[$RC] $RESPONSE"
- if test "$RC" -eq 0;
- then
- verbose "$errstr"
- else
- die "$errstr"
- fi
- }
- pad2html() {
- debug "[$FUNCNAME] ARGS:$@"
- if test $# -ne 2;
- then
- die 'usage: [$FUNCNAME] input_file output_file'
- fi
- local input=$1
- local output=$2
- verbose "[$FUNCNAME] input=$input output=$output"
- RESPONSE=$(pandoc \
- -f markdown "$input" \
- -o "$output" -t html --self-contained --smart \
- --filter pandoc-citeproc \
- --filter $PANDOC_FILTER_BASE/html.zsh \
- --filter $PANDOC_FILTER_BASE/nettoyage.zsh \
- --filter $PANDOC_FILTER_BASE/nettoyage-etendu.zsh \
- --metadata header-includes="<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">")
- RC=$?
- local errstr="[$FUNCNAME] RC=[$RC] $RESPONSE"
- if test "$RC" -eq 0;
- then
- verbose "$errstr"
- else
- die "$errstr"
- fi
- }
- pad2markdown() {
- debug "[$FUNCNAME] ARGS:$@"
- if test $# -ne 2;
- then
- die 'usage: [$FUNCNAME] input_file output_file'
- fi
- local input=$1
- local output=$2
- verbose "[$FUNCNAME] input=$input output=$output"
- RESPONSE=$(pandoc \
- -f markdown "$input" \
- -o "$output" -t markdown_strict --wrap=none --smart \
- --reference-location=block --reference-links \
- --filter pandoc-citeproc \
- --filter $PANDOC_FILTER_BASE/markdown_strict.zsh \
- --filter $PANDOC_FILTER_BASE/nettoyage.zsh \
- --filter $PANDOC_FILTER_BASE/nettoyage-etendu.zsh)
- RC=$?
- local errstr="[$FUNCNAME] RC=[$RC] $RESPONSE"
- if test "$RC" -eq 0;
- then
- verbose "$errstr"
- else
- die "$errstr"
- fi
- }
- pad2tex() {
- debug "[$FUNCNAME] ARGS:$@"
- if test $# -ne 2;
- then
- die 'usage: [$FUNCNAME] input_file output_file'
- fi
- local input=$1
- local output=$2
- verbose "[$FUNCNAME] input=$input output=$output"
- RESPONSE=$(pandoc \
- -f markdown "$input" \
- -o "$output" -t latex --self-contained \
- --template ../../exegetesDoc/pandocincludes/exegetes.latex \
- --filter pandoc-citeproc \
- --filter $PANDOC_FILTER_BASE/latex.zsh \
- --filter $PANDOC_FILTER_BASE/nettoyage.zsh \
- --filter pandoc-latex-environment \
- --filter $PANDOC_FILTER_BASE/paranumero.bash)
- RC=$?
- local errstr="[$FUNCNAME] RC=[$RC] $RESPONSE"
- if test "$RC" -eq 0;
- then
- verbose "$errstr"
- else
- die "$errstr"
- fi
- }
- pad2texinput() {
- debug "[$FUNCNAME] ARGS:$@"
- if test $# -ne 2;
- then
- die 'usage: [$FUNCNAME] input_file output_file'
- fi
- local input=$1
- local output=$2
- verbose "[$FUNCNAME] input=$input output=$output"
- RESPONSE=$(pandoc \
- -f markdown "$input" \
- -o "$output" -t latex \
- --filter pandoc-citeproc \
- --filter $PANDOC_FILTER_BASE/latex.zsh \
- --filter $PANDOC_FILTER_BASE/nettoyage.zsh \
- --filter pandoc-latex-environment \
- --filter $PANDOC_FILTER_BASE/paranumero.bash)
- RC=$?
- local errstr="[$FUNCNAME] RC=[$RC] $RESPONSE"
- if test "$RC" -eq 0;
- then
- verbose "$errstr"
- else
- die "$errstr"
- fi
- }
- tex2pdf() {
- debug "[$FUNCNAME] ARGS:$@"
- if test $# -ne 2;
- then
- die 'usage: [$FUNCNAME] input_file output_file'
- fi
- local input=$1
- local output=$2
- verbose "[$FUNCNAME] input=$input output=$output"
- # pdflatex sort avec un code 1 mais genere le PDF on peut pas die sur RC>0 ici
- pdflatex -interaction=nonstopmode -output-directory="$WORKING_FOLDER" "$input" > "$WORKING_FOLDER/pdflatex_passe1.log" 2>&1
- verbose "[$FUNCNAME] Passe 1 RC=[$?]"
- pdflatex -interaction=nonstopmode -output-directory="$WORKING_FOLDER" "$input" > "$WORKING_FOLDER/pdflatex_passe2.log" 2>&1
- verbose "[$FUNCNAME] Passe 2 RC=[$?]"
- if test ! -e "$output";
- then
- die "[$FUNCNAME] Génération du PDF '$putput' en erreur"
- fi
- }
- lock_project() {
- verbose "[$FUNCNAME] LOCKFILE=$LOCK_FILE PID=$$ locked"
- if test ! -e "$LOCK_FILE";
- then
- echo "$$" > "$LOCK_FILE"
- else
- die "lockfile $LOCK_FILE already exists" $RC_LOCK
- fi
- }
- unlock_project() {
- if test -e "$LOCK_FILE";
- then
- local locker_pid=$(cat "$LOCK_FILE")
- verbose "[$FUNCNAME] lockfile=$LOCK_FILE lockerpid=$locker_pid pid=$$"
- if test "$locker_pid" -eq "$$";
- then
- rm -f "$LOCK_FILE"
- if test ! -e "$LOCK_FILE";
- then
- verbose "[$FUNCNAME] $PROJET unlocked, $LOCK_FILE removed."
- else
- die"[$FUNCNAME] we can not unlock $PROJET, $LOCK_FILE still on disk." $RC_LOCK
- fi
- else
- die "[$FUNCNAME] we can not delete lockfile owned by another process" $RC_LOCK
- fi
- fi
- }
- cleanup_working_folder() {
- verbose "[$FUNCNAME] WORKING_FOLDER=$WORKING_FOLDER"
- if test -n "$WORKING_FOLDER" -a -d "$WORKING_FOLDER";
- then
- if test "$VERBOSE" -eq 1;
- then
- rm --recursive --verbose "$WORKING_FOLDER"
- else
- rm --recursive "$WORKING_FOLDER"
- fi
- if test ! -d "$WORKING_FOLDER";
- then
- verbose "[$FUNCNAME] $WORKING_FOLDER removed"
- fi
- fi
- }
- usage() {
- echo "
- cocktail -b url_base -d dossier [ -h ] -p projet [ -g url_garde ] [ -v ]
- -b : url du pad principal
- -d : nom du dossier
- -g : url du pad de page de garde (optionnel)
- -h : cette page d'aide
- -p : nom du projet
- -v : force le mode verbeux
- return codes:
- 0 : OK
- 1 : GENERIC ERROR
- 2 : LOCK ERROR
- 3 : CONFIG FILE IS MISSING
- 4 : PANDOC FILTER IS MISSING OR NOT EXECUTABLE
- 5 : ARGUMENTS ERRORS"
- }
- publish() {
- local src_folder="$1"
- local dst_folder="$2"
- verbose "[$FUNCNAME] SOURCE=$src_folder DESTINATION=$dst_folder"
- if test ! -d "$src_folder";
- then
- die "[$FUNCNAME] the folder '$src_folder' does not exists"
- fi
- if test ! -d "$dst_folder";
- then
- die "[$FUNCNAME] the folder '$dst_folder' does not exists"
- fi
- for ext in pdf docx html md texinput tex txt
- do
- local from="$src_folder/$PROJET.$ext"
- local to="$dst_folder/$PROJET.$ext"
- verbose "$from -> $to"
- cp -f "$from" "$to"
- done
- }
- ### MAIN ###
- base=$( cd $( dirname "${BASH_SOURCE[0]}" ) && pwd )
- if test -r "$base/cocktail.conf";
- then
- source "$base/cocktail.conf"
- error_in_config=0
- # Should be in config file
- if test -z "$PANDOC_FILTER_BASE";
- then
- echo "$$ PANDOC_FILTER_BASE not found in config file"
- error_in_config=1
- fi
- if test -z "$PANDOC_INCLUDE_BASE";
- then
- echo "$$ PANDOC_INCLUDE_BASE not found in config file"
- error_in_config=1
- fi
- if test -z "$WORKING_FOLDER";
- then
- echo "$$ WORKING_FOLDER not found in config file"
- fi
- if test -z "$STORE";
- then
- echo "$$ STORE not found in config file"
- fi
- if test -z "$MIRRORPAD";
- then
- echo "$$ MIRRORPAD not found in config file"
- fi
- if test "$error_in_config" -eq 1;
- then
- die "Errors in config file, maybee empty ?" $RC_CONFIG_PARAM
- fi
- else
- die "cocktail.conf is missing, see config.conf.smp for example" $RC_CONFIG_MISSED
- fi
- OPTERR=1
- while getopts "a:b:d:g:p:hv" option;
- do
- case $option in
- a)
- # ATTENTION ^^ = passage en majuscules
- ACTION="${OPTARG^^}"
- verbose "getopts: -$option) ACTION=$ACTION"
- ;;
- b)
- URL_BASE=$OPTARG
- verbose "getopts: -$option) URL_BASE=$URL_BASE"
- ;;
- d)
- DOSSIER=$OPTARG
- verbose "getopts: -$option) DOSSIER=$DOSSIER"
- ;;
- g)
- URL_GARDE=$OPTARG
- verbose "getopts: -$option) URL_GARDE=$URL_GARDE"
- ;;
- h)
- usage
- exit
- ;;
- p)
- PROJET=$OPTARG
- verbose "getopts: -$option) PROJET=$PROJET"
- ;;
- v)
- # Override verbose
- VERBOSE=1
- verbose "getopts: -$option) VERBOSE=$VERBOSE"
- ;;
- esac
- done
- shift $(($OPTIND - 1))
- verbose "ARGS=$@"
- ###############################################################################
- # GESTION DES ARGUMENTS DE LA LIGNE DE COMMANDE
- ###############################################################################
- # ACTION : SHAKE est la valeur par défaut
- if test -z "$ACTION";
- then
- ACTION="SHAKE"
- fi
- # ACTION : uniquement SHAKE ou UNLOCK
- if test "$ACTION" != "SHAKE" -a "$ACTION" != "UNLOCK";
- then
- die "getopts: -a ne peut être que SHAKE ou UNLOCK" $RC_ARGS_ACTION
- fi
- verbose "ACTION=$ACTION"
- if test -z "$DOSSIER";
- then
- die "getopts: -d DOSSIER is mandatory" $RC_ARGS
- fi
- verbose "DOSSIER=$DOSSIER"
- if [[ ! $DOSSIER =~ ^[a-zA-Z0-9_-]+$ ]];
- then
- die "DOSSIER ne peut contenir que des chiffres, des lettres, - ou _" $RC_ARGS_DOSSIER
- fi
- verbose "PROJET:$PROJET"
- if [[ ! $PROJET =~ ^[a-zA-Z0-9_-]+$ ]];
- then
- die "PROJET ne peut contenir que des chiffres, des lettres, - ou _" $RC_ARGS_PROJET
- fi
- WORKING_FOLDER="$WORKING_FOLDER/$PROJET"
- verbose "WORKING_FOLDER=$WORKING_FOLDER"
- mkdir -p "$WORKING_FOLDER"
- cd "$WORKING_FOLDER" || die "we can't change to \"$WORKING_FOLDER\" folder"
- STORE="$STORE/$DOSSIER"
- verbose "STORE=$STORE"
- mkdir -p "$STORE"
- LOCK_FILE="$STORE/$PROJET.lock"
- verbose "LOCK_FILE=$LOCK_FILE"
- if test -z "$URL_BASE";
- then
- die "getopts: -b URL_BASE is mandatory" $RC_ARGS
- fi
- init_check
- lock_project
- mirror_pad "$URL_BASE" "$WORKING_FOLDER/$PROJET.txt"
- if test "$URL_GARDE";
- then
- mirror_pad "$URL_GARDE" "$WORKING_FOLDER/garde.tex"
- fi
- # hack specifique Abro Tele2
- touch "$WORKING_FOLDER/annexe-tableau.tex"
- pad2json "$WORKING_FOLDER/$PROJET.txt" "$WORKING_FOLDER/$PROJET.json"
- pad2docx "$WORKING_FOLDER/$PROJET.txt" "$WORKING_FOLDER/$PROJET.docx"
- pad2html "$WORKING_FOLDER/$PROJET.txt" "$WORKING_FOLDER/$PROJET.html"
- pad2markdown "$WORKING_FOLDER/$PROJET.txt" "$WORKING_FOLDER/$PROJET.md"
- pad2tex "$WORKING_FOLDER/$PROJET.txt" "$WORKING_FOLDER/$PROJET.tex"
- pad2texinput "$WORKING_FOLDER/$PROJET.txt" "$WORKING_FOLDER/$PROJET.texinput"
- tex2pdf "$WORKING_FOLDER/$PROJET.tex" "$WORKING_FOLDER/$PROJET.pdf"
- publish "$WORKING_FOLDER" "$STORE"
- unlock_project
- end_with_code $RC_OK
|