diff --git a/shake b/shake index d309400..f41cc1a 100755 --- a/shake +++ b/shake @@ -1,35 +1,39 @@ #!/bin/bash -# Originally written by anon, modified +# Originally written by Anon, modified by Emil to better match Bake functionality + +# Issues: sloooow, fails to handle multi-line statements BLUE='\033[34m' GREEN='\033[32m' +YELLOW='\033[93m' +DIM='\033[2m' BOLD='\033[1m' NORMAL='\033[0m' MARKNAME="@BAKE" MARK="${MARKNAME} " -MARKSTR="${BLUE}${MARKNAME}${NORMAL}" - +MARKSTR="${GREEN}${MARKNAME}${NORMAL}" + enable -n echo - + usage() { - IFSTR="${GREEN}${NORMAL}" - echo -e "${BOLD}Usage: $0 ${NORMAL}" >&2 - echo -e "\t$0 runs the value of ${MARKSTR}." >&2 - echo -e "\tThe point of this script is ease to compialation of single source file (toy) programs." >&2 - echo -e "\tThe value of ${MARKSTR} is read from ${IFSTR} in is whatever comes after '${MARK}' until the end of the line." >&2 - echo -e "\tInside the value of ${MARKSTR} all mentions of special placeholders are replaced:" >&2 - echo -e "\t\t${BLUE}\$@${NORMAL} - ${IFSTR}" - echo -e "\t\t${BLUE}\$*${NORMAL} - ${IFSTR} with the last extension cut off" - echo -e "\t\t${BLUE}\$+${NORMAL} - All remaining arguments" + echo -e "$0: [option] ${BOLD}target-file${NORMAL} [${GREEN}arguments${NORMAL} ...]\n" + echo -e "Use the format \`${BOLD}@BAKE${NORMAL} cmd ...' within the ${BOLD}target-file${NORMAL}." + echo -e "This will execute until the end of line, or if existing, until the ${BOLD}@STOP${NORMAL} marker.\n" + echo -e "Options [Must be first]" + echo -e "\t${DIM}-h --help${NORMAL}, ${BOLD}-n --dry-run${NORMAL}\n" + echo -e "Expansions\n" + echo -e "\t${YELLOW}@FILENAME${NORMAL} returns target-file (abc.x.txt)" + echo -e "\t${YELLOW}@SHORT${NORMAL} returns target-file without suffix (^-> abc.x)" + echo -e "\t${YELLOW}@ARGS${NORMAL} returns ${GREEN}arguments${NORMAL}" } if [[ $# -lt 1 ]]; then usage exit 1 fi - + if [[ $1 == "-h" ]] || [[ $1 == "--help" ]]; then usage exit 0 @@ -47,23 +51,31 @@ fi input_file=$1 shift 1 - + if [[ ! -f $input_file ]]; then echo -e "Input file '$input_file' does not exist." >&2 exit 1 fi +cd $(dirname "$(readlink -f "$input_file")") +input_file=${input_file##*/} + line=$(grep "$MARK" "$input_file" | head -1) -line=${line//\$@/$input_file} -line=${line//\$\*/${input_file%.*}} -line=${line//\$+/$@} if [[ -n $line ]]; then + + line=${line//\$@/$input_file} + line=${line//\$\*/${input_file%.*}} + line=${line//\$+/$@} + line=${line//@FILENAME/$input_file} + line=${line//@SHORT/${input_file%.*}} + line=${line//@ARGS/$@} + line=$(echo "$line" | sed 's/\W*@STOP.*//') + command="${line#*${MARK}}" - command=$(echo $command | sed 's/[^\\]\?#.*//') - echo "Exec: $command" + echo -e "${BOLD}${GREEN}$0${NORMAL}: $command" if [[ $run -eq 1 ]]; then - echo "Output:" + echo -e "${BOLD}${GREEN}output${NORMAL}:" sh -c "$command" fi else