#!/bin/bash # Copyright (C) 2022 Ortega Froysa, Nicolás # Author: Ortega Froysa, Nicolás # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero 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 Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . ISIDORE_VERSION="0.1.0" ISIDORE_CONFIG_DIR="" ISIDORE_CONFIG_DIR_OPTIONS=( "$XDG_CONFIG_HOME/isidore" "$HOME/.isidore") ISIDORE_AUTHOR_NAME="" PROG_NAME=$0 PROJECT_NAME="Isidore" SOURCE_DIR="site/" OUTPUT_DIR="output/" TEMPLATE_DIR="templates/" PROJECT_CONFIG_FILE="config.php" ## # Create the configuration file. This function is called if it does not already # exist. ## function create_config_file() { echo "Creating $ISIDORE_CONFIG_DIR/config file..." echo "Please enter the following..." echo -n "Author name: " read ISIDORE_AUTHOR_NAME echo "ISIDORE_AUTHOR_NAME=\"$ISIDORE_AUTHOR_NAME\"" > $ISIDORE_CONFIG_DIR/config } ## # Read the configuration file and set the basic config variables. ## function set_config_vars() { for i in "${ISIDORE_CONFIG_DIR_OPTIONS[@]}" do if [ -d $i ] then ISIDORE_CONFIG_DIR=$i break fi done if [ -z "$ISIDORE_CONFIG_DIR" ] then if ! [ -z "$XDG_CONFIG_HOME" ] then ISIDORE_CONFIG_DIR="$XDG_CONFIG_HOME/isidore" else ISIDORE_CONFIG_DIR="$HOME/.isidore" fi echo "Creating new Jerome configuration directory in $ISIDORE_CONFIG_DIR" mkdir -p $ISIDORE_CONFIG_DIR create_config_file fi if ! [ -f "$ISIDORE_CONFIG_DIR/config" ] then create_config_file fi source $ISIDORE_CONFIG_DIR/config } ## # Print the usage of the Isidore command. ## function print_usage() { echo "USAGE: $PROG_NAME [options]" } function print_help() { print_usage echo -e "\nCOMMANDS: new [-i] Create a new Isidore project build [-v] [-j] Build the project rooted in the current directory serve | server [-p ] Serve a local HTTP server of the output directory clean Clean the built files version Print the current version help Show this help information" } ## # Check to see if at the root of an Isidore project. ## function check_in_project() { if ! [ -f "$PROJECT_CONFIG_FILE" ] || ! [ -f "./.isidore-version" ] then echo "ERROR: You are not currently in the root of an Isidore project." exit 1 fi } ## # Create a new project. # # Params: # $1 - The project directory # $2 - Interactive mode (1 = true; 0 = false) ## function new_project() { echo "$PROJECT_NAME v$ISIDORE_VERSION" local NEW_PROJECT_DIR=$1 local NEW_PROJECT_NAME="New Project" local NEW_PROJECT_URL="http://example.com/" if [ $2 == 1 ] then echo -n "Project name: " read NEW_PROJECT_NAME echo -n "URL: " read NEW_PROJECT_URL fi mkdir $NEW_PROJECT_DIR mkdir -p $NEW_PROJECT_DIR/$SOURCE_DIR mkdir -p $NEW_PROJECT_DIR/$TEMPLATE_DIR echo \ "" >> $NEW_PROJECT_DIR/$PROJECT_CONFIG_FILE echo "$ISIDORE_VERSION" > $NEW_PROJECT_DIR/.isidore-version echo "New project created." [ $2 == 0 ] && echo "Consider taking a look at the $NEW_PROJECT_DIR/$PROJECT_CONFIG_FILE file." } ## # Clean a project's build. ## function clean_project() { check_in_project if [ -d "$OUTPUT_DIR" ] then rm -r $OUTPUT_DIR fi echo "Project cleaned." } ## # Build the project. # # Params: # $1 - Verbose flag # $2 - Maximum number of jobs to run ## function build_project() { check_in_project mkdir -p $OUTPUT_DIR for i in $(find $SOURCE_DIR -type d) do mkdir -p $OUTPUT_DIR/${i:${#SOURCE_DIR}} done # number of current jobs local NUM_JOBS="\j" for i in $(find site -type f -regextype posix-extended -not -regex '.*\.(cfg|CFG)\.(php|PHP)') do while (( $2 != 0 )) && (( ${NUM_JOBS@P} >= $2 )) do wait -n done # parallel block ( if [[ $i =~ .*\.(php|PHP) ]] then : ${i:${#SOURCE_DIR}} local OUT_FILE="$OUTPUT_DIR/${_: :-4}" if [ $1 == 1 ] then echo "Building $OUT_FILE ..." fi cat $PROJECT_CONFIG_FILE $i | php > $OUT_FILE else local OUT_FILE="$OUTPUT_DIR/${i:${#SOURCE_DIR}}" if [ $1 == 1 ] then echo "Copying $OUT_FILE ..." fi cp $i $OUT_FILE fi ) & done # wait for jobs to finish wait -n } set_config_vars if [ $# -lt 1 ] then echo "No subcommand was specified. Use the 'help' subcommand." print_usage exit 1 fi case $1 in new) if [ $# -lt 2 ] then echo "Insufficient number of arguments." print_usage exit 1 fi INTERACTIVE=0 NEW_DIR="" for i in ${@:2} do case $i in -i) INTERACTIVE=1;; *) if [ -z "$NEW_DIR" ] then NEW_DIR="$i" else echo "Unknown argument for new '$i'. Use the 'help' subcommand." print_usage exit 1 fi;; esac done new_project $NEW_DIR $INTERACTIVE;; build) VERBOSE=0 JOBS=1 for i in ${@:2} do case $i in -v) VERBOSE=1;; -j*) if ! [[ "$i" =~ ^-j[0-9]+$ ]] then echo "Argument '$i' badly formatted. Should be '-j' where is a number." print_usage exit 1 fi JOBS=${i:2};; *) echo "Unknown argument for build '$i'. Use the 'help' subcommand." print_usage exit 1;; esac done build_project $VERBOSE $JOBS;; serve|server) PORT=8080 shift while getopts "p:" opt do case $opt in p) if ! [[ "$OPTARG" =~ ^[0-9]+$ ]] then echo "Invalid port $OPTARG. Please enter a number." exit 1 fi PORT=$OPTARG;; ?) echo "Invalid argument $OPTARG. Use the 'help' subcommand." print_usage exit 1;; :) echo "Option -$OPTARG requires an argument." exit 1;; esac done php -S localhost:$PORT -t $OUTPUT_DIR/;; clean) clean_project;; help) print_help;; version) echo "$PROJECT_NAME v$ISIDORE_VERSION";; *) echo "Unknown command $1. Use the 'help' subcommand." print_usage exit 1;; esac