#!/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 (use interactive mode with '-i') build Build the project rooted in the current directory serve | server Serve a local HTTP server of the output directory on port 8080 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 ## 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 for i in $(find $SOURCE_DIR -name '*.php' -not -name '*.cfg.php') do : ${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 done for i in $(find $SOURCE_DIR -type f -not -name '*.php') do local OUT_FILE="$OUTPUT_DIR/${i:${#SOURCE_DIR}}" if [ $1 == 1 ] then echo "Copying $OUT_FILE ..." fi cp $i $OUT_FILE done } 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 if [ $# -gt 1 ] then for i in ${@:2} do case $i in -v) VERBOSE=1;; *) echo "Unknown argument for build '$i'. Use the 'help' subcommand." print_usage exit 1;; esac done fi build_project $VERBOSE;; serve|server) php -S localhost:8080 -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