2019-05-26 11:05:49 +02:00
#!/usr/bin/env bash
2016-11-14 02:09:44 +01:00
########################################################################
# Copyright (C) 2016 Max Mehl <max.mehl@fsfe.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, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
########################################################################
#
# A script to preview XHTML files locally, best to use with FSFE's
# website setup.
#
# Instructions: https://blog.mehl.mx/2016/build-fsfe-websites-locally/
#
#######################################################################
2016-11-14 01:25:13 +01:00
2017-01-19 20:21:31 +01:00
# Coloured and tagged output
function echo_ERR {
echo -e '\033[0;31m' " [ERROR] $1 " '\033[0m'
}
function echo_SUC {
echo -e '\033[0;32m' " [SUCCESS] $1 " '\033[0m'
}
function echo_WARN {
echo -e '\033[0;33m' " [WARNING] $1 " '\033[0m'
}
function echo_INFO {
echo -e '\033[0;37m' " [INFO] $1 " '\033[0m'
}
2017-01-19 19:19:53 +01:00
# Check dependencies (stolen from build_main.sh)
deperrors = ''
for depend in realpath rsync xsltproc xmllint sed find egrep grep wc make tee date iconv; do
if ! which " $depend " >/dev/null 2>& 1; then
deperrors = " $depend $deperrors "
fi
done
if [ -n " $deperrors " ] ; then
printf '\033[1;31m'
cat <<-EOF
The build script depends on some other programs to function .
Not all of those programs could be located on your system.
Please use your package manager to install the following programs:
EOF
printf '\n\033[0;31m%s\n' " $deperrors "
exit 1
fi >>/dev/stderr
2016-11-14 01:25:13 +01:00
ROOT = $( dirname " $( readlink -f " $0 " ) " )
if [ ! -e " $ROOT " /config.cfg ] ; then echo "Missing config.cfg file. Edit and rename config.cfg.sample" ; exit 1; fi
source " $ROOT " /config.cfg
2016-11-29 11:35:06 +01:00
# Help listing
2016-11-14 01:25:13 +01:00
if [ " $1 " = "" ] ; then
self = $( basename $0 )
2017-01-19 20:21:31 +01:00
echo_WARN "No parameters or variables given!"
2016-11-14 01:25:13 +01:00
echo
echo "Usage: "
echo
echo " $self file.en.xhtml "
2017-01-19 19:19:53 +01:00
echo " -- build single XHTML file from your source to the local web "
echo " directory"
echo " The destination will be on the same relative level of the "
echo " selected XHTML file"
2016-11-14 01:25:13 +01:00
echo " If not a XHTML file, it will be copied to the web directory"
echo
echo " $self --copy picture.png look/style.css "
2017-01-19 19:19:53 +01:00
echo " -- Just copies several files to the local web directory without "
echo " even trying to build them"
2016-11-14 01:25:13 +01:00
exit 0
fi
2016-11-29 11:35:06 +01:00
# Remove trailing slashes
LOC_trunk = $( echo $LOC_trunk | sed 's|/$||' )
LOC_out = $( echo $LOC_out | sed 's|/$||' )
LOC_trunk_dev = $( echo $LOC_trunk_dev | sed 's|/$||' )
# Pure copy
2016-11-14 01:25:13 +01:00
if [ " $1 " = "--copy" ] ; then
numargs = $(( $# - 1 ))
2017-01-19 20:21:31 +01:00
echo_INFO " Starting a plain mass copy with $numargs file(s)... "
2016-11-14 01:25:13 +01:00
for ( ( i = 1; i <= $numargs ; i++) ) ; do
SRC_full = $( realpath $2 )
DST_full = $( echo $SRC_full | sed -E " s| $LOC_trunk | $LOC_out | " )
2017-01-19 20:21:31 +01:00
echo_INFO " Copying $SRC_full to $DST_full ... "
2017-01-19 19:41:25 +01:00
if [ -d " $SRC_full " ] && [ -e " $DST_full " ] ; then
rm -rf " $DST_full "
cp -R $SRC_full $DST_full
else
cp -R $SRC_full $DST_full
fi
2016-11-14 01:25:13 +01:00
shift
done
2017-01-19 20:21:31 +01:00
echo_SUC "Copying finished. Files should be visible via the local webserver now."
2016-11-14 01:25:13 +01:00
exit 0
fi
2017-01-19 20:21:31 +01:00
# Run through number of files given as arguments
numargs = $#
echo_INFO " Building $numargs file(s) "
if [ $numargs -gt 1 ] ; then
echo
2016-11-14 01:25:13 +01:00
fi
2017-01-19 20:21:31 +01:00
for ( ( i = 1; i <= $numargs ; i++) ) ; do
SRC_rel = $1 # e.g. index.en.xhtml
SRC_full = $( realpath $SRC_rel ) # Full path to source file
# CHECK whether the source file is located in LOC_trunk
if [ ! $( echo $SRC_full | grep " $LOC_trunk " ) ] ; then
echo_ERR " Given source file is not part of \$LOC_trunk (currently set to \" $LOC_trunk \"). Please only build files which reside in or below this directory. Aborting now. "
exit 1
fi
2016-11-14 01:25:13 +01:00
2017-01-19 20:21:31 +01:00
# CHECK whether the source file is a directory (only --copy allowed)
if [ -d " $SRC_full " ] ; then
echo_ERR " The given file \" $SRC_full \" is a directory. Those can only be copied by using --copy as a parameter. "
echo_ERR "NOTE: Using --copy won't build potential .xhtml files inside a directory. If you have this case, please first copy an empty directory and then build the .xhtml files inside them."
exit 1
fi
2017-01-19 19:41:25 +01:00
2017-01-19 20:21:31 +01:00
# TEST if a DEV SVN directory is used. If yes, copy clean file to this Dir
if [ " $LOC_trunk_dev " != "" ] ; then
SRC_full_dev = $( echo $SRC_full | sed -E " s| $LOC_trunk | $LOC_trunk_dev | " )
echo_INFO " A \"dirty\" Development SVN directory ( $LOC_trunk_dev ) is being used. Copy file from clean SVN directory ( $LOC_trunk ) to Development directory... "
cp $SRC_full $SRC_full_dev # copy file from clean SVN to dev/dirty SVN
SRC_full = $SRC_full_dev
LOC_trunk = $LOC_trunk_dev
fi
2016-11-14 01:25:13 +01:00
2017-01-19 20:21:31 +01:00
echo_INFO " Using file $SRC_full as source... "
2016-11-14 01:25:13 +01:00
2017-01-19 20:21:31 +01:00
### TRANSFORM XHTML file path
DST_full = $( echo $SRC_full | sed -E " s| $LOC_trunk | $LOC_out | " ) # replace SVN directory by build/HTTP destination
2016-11-14 01:25:13 +01:00
2017-01-19 20:21:31 +01:00
### BUILD/COPY FILE depending on file extension
ftype = ${ SRC_full ##*. } # get extension of file
ftype = $( echo " $ftype " | tr '[:upper:]' '[:lower:]' )
ftype_build = "xhtml" # file types which have to be built
2016-11-14 02:09:44 +01:00
2017-01-19 20:21:31 +01:00
if [ [ " $ftype " = = @( $ftype_build ) ] ] ; then # XHTML file
DST_full = $( echo $DST_full | sed -E " s/ $ftype_build /html/ " ) # Replace xhtml by html
echo_INFO " XHTML file detected. Going to build into $DST_full ... "
xmllint --noout " $SRC_full " || ( echo; echo " Syntax error in $SRC_full . Error message above. Please fix! " ; exit 1)
if [ [ " $? " != "0" ] ] ; then exit 1; fi
$LOC_trunk /build/build_main.sh process_file $SRC_full > $DST_full
2016-11-14 02:09:44 +01:00
2017-01-19 20:21:31 +01:00
else # just copy file
2019-06-03 20:19:22 +02:00
echo_INFO " File type ( $ftype ) is detected as not to be built. Just linking it to $DST_full ... "
ln -sf $SRC_full $DST_full
2017-01-19 20:21:31 +01:00
fi
2016-11-14 01:25:13 +01:00
2017-01-19 20:21:31 +01:00
### START WEBSERVER if necessary
if [ " $HTTPD " = = "python" ] ; then # python
if [ ! $( pgrep -f " pywebserver-fsfe.py $LOC_out " ) ] ; then
echo_INFO " Starting $HTTPD webserver "
nohup " $ROOT /pywebserver-fsfe.py " " $LOC_out " " $HTTPD_port " > " $ROOT " /pywebserver-fsfe.log 2>& 1 &
else
echo_INFO " $HTTPD webserver already seems to be running. "
fi
elif [ " $HTTPD " = = "lighttpd" ] ; then
if [ ! $( pgrep lighttpd) ] ; then # lighttpd
echo_INFO " Starting $HTTPD webserver "
/usr/sbin/lighttpd -f " $HTTPD_conf "
else
echo_INFO " $HTTPD webserver already seems to be running. "
fi
elif [ " $HTTPD " = = "" ] ; then # empty variable
echo_ERR "No webserver specified. Please define variable HTTPD in config.cfg. Aborting now."
exit 1
else # something custom
echo_WARN "Unknown webserver defined. Probably you won't be able to see the file in your browser. Building it anyway. Please check variable \"HTTPD\" in config.cfg."
2016-12-15 17:39:39 +01:00
fi
2017-01-19 20:21:31 +01:00
### SHOW RESULTS
DST_rel = $( echo $DST_full | sed " s| $LOC_out || " ) # relative path
2017-06-29 21:18:11 +02:00
echo_SUC " Finished. File can be viewed at http://localhost: $HTTPD_port $DST_rel "
2017-01-19 20:21:31 +01:00
if [ $numargs -gt 1 ] ; then
echo "++++++++++++++++++++++++++++++++++"
2016-12-15 17:39:39 +01:00
fi
2017-01-19 20:21:31 +01:00
shift
done
2016-11-14 01:25:13 +01:00
2017-01-19 20:21:31 +01:00
if [ $numargs -gt 1 ] ; then
echo
echo_SUC " $numargs files have been processed. Preview links to each file can be found individually above. "
fi