Added icon and improved template code
This commit is contained in:
		
							parent
							
								
									fd59f9bf19
								
							
						
					
					
						commit
						4de568ae77
					
				
							
								
								
									
										
											BIN
										
									
								
								images/food.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								images/food.png
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| 
		 After Width: | Height: | Size: 12 KiB  | 
							
								
								
									
										2
									
								
								images/food.svg
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										2
									
								
								images/food.svg
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,2 @@
 | 
			
		||||
<?xml version="1.0" encoding="UTF-8"?>
 | 
			
		||||
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 122.88 115.21" style="enable-background:new 0 0 122.88 115.21" xml:space="preserve"><g><path d="M29.03,100.46l20.79-25.21l9.51,12.13L41,110.69C33.98,119.61,20.99,110.21,29.03,100.46L29.03,100.46z M53.31,43.05 c1.98-6.46,1.07-11.98-6.37-20.18L28.76,1c-2.58-3.03-8.66,1.42-6.12,5.09L37.18,24c2.75,3.34-2.36,7.76-5.2,4.32L16.94,9.8 c-2.8-3.21-8.59,1.03-5.66,4.7c4.24,5.1,10.8,13.43,15.04,18.53c2.94,2.99-1.53,7.42-4.43,3.69L6.96,18.32 c-2.19-2.38-5.77-0.9-6.72,1.88c-1.02,2.97,1.49,5.14,3.2,7.34L20.1,49.06c5.17,5.99,10.95,9.54,17.67,7.53 c1.03-0.31,2.29-0.94,3.64-1.77l44.76,57.78c2.41,3.11,7.06,3.44,10.08,0.93l0.69-0.57c3.4-2.83,3.95-8,1.04-11.34L50.58,47.16 C51.96,45.62,52.97,44.16,53.31,43.05L53.31,43.05z M65.98,55.65l7.37-8.94C63.87,23.21,99-8.11,116.03,6.29 C136.72,23.8,105.97,66,84.36,55.57l-8.73,11.09L65.98,55.65L65.98,55.65z"/></g></svg>
 | 
			
		||||
| 
		 After Width: | Height: | Size: 1.0 KiB  | 
							
								
								
									
										234
									
								
								index.n0m
									
									
									
									
									
								
							
							
						
						
									
										234
									
								
								index.n0m
									
									
									
									
									
								
							@ -2,144 +2,156 @@
 | 
			
		||||
$ #!/bin/bash
 | 
			
		||||
Content-Type: text/html
 | 
			
		||||
 | 
			
		||||
<{
 | 
			
		||||
# Constants
 | 
			
		||||
# =========
 | 
			
		||||
$ true=1;
 | 
			
		||||
$ false=0;
 | 
			
		||||
#
 | 
			
		||||
$ restaurant_file="restaurants.txt";
 | 
			
		||||
$ title="FeedMe";
 | 
			
		||||
#
 | 
			
		||||
true=1;
 | 
			
		||||
false=0;
 | 
			
		||||
 | 
			
		||||
restaurant_file="restaurants.txt";
 | 
			
		||||
title="FeedMe";
 | 
			
		||||
 | 
			
		||||
# Components
 | 
			
		||||
# ==========
 | 
			
		||||
#
 | 
			
		||||
 | 
			
		||||
# $1: string: input value
 | 
			
		||||
# $2: number: 0=existing restaurant, 1=new restaurant
 | 
			
		||||
$ restaurant_form () {
 | 
			
		||||
$   enforce_arguments "${FUNCNAME[0]}" "$#" 2;
 | 
			
		||||
$   local icon_class;
 | 
			
		||||
$   if [ "$2" -eq 0 ]; then
 | 
			
		||||
$     icon_class="ri-save-2-fill";
 | 
			
		||||
$   else
 | 
			
		||||
$     icon_class="ri-add-line";
 | 
			
		||||
$   fi
 | 
			
		||||
    <form class="restaurant-form" method="POST" action="">
 | 
			
		||||
      <input type="hidden" name="old" value="<% $1 %>" />
 | 
			
		||||
      <input type="text" placeholder="Restaurant" name="new" value="<% $1 %>" />
 | 
			
		||||
      <label class="button <% $icon_class %>">
 | 
			
		||||
        $ local action;
 | 
			
		||||
        $ if [ "$2" -eq 0 ]; then
 | 
			
		||||
        $   action="save";
 | 
			
		||||
        $ else
 | 
			
		||||
        $   action="add";
 | 
			
		||||
        $ fi;
 | 
			
		||||
        <input type="submit" name="action" value="<% $action %>" />
 | 
			
		||||
      </label>
 | 
			
		||||
restaurant_form () {
 | 
			
		||||
  enforce_arguments "${FUNCNAME[0]}" "$#" 2;
 | 
			
		||||
  local icon_class;
 | 
			
		||||
  if [ "$2" -eq 0 ]; then
 | 
			
		||||
    icon_class="ri-save-2-fill";
 | 
			
		||||
  else
 | 
			
		||||
    icon_class="ri-add-line";
 | 
			
		||||
  fi
 | 
			
		||||
  }>
 | 
			
		||||
  <form class="restaurant-form" method="POST" action="">
 | 
			
		||||
    <input type="hidden" name="old" value="<% $1 %>" />
 | 
			
		||||
    <input
 | 
			
		||||
      type="text"
 | 
			
		||||
      placeholder="Restaurant"
 | 
			
		||||
      name="new"
 | 
			
		||||
      value="<% $1 %>"
 | 
			
		||||
    />
 | 
			
		||||
    <label class="button <% $icon_class %>">
 | 
			
		||||
      $ local action;
 | 
			
		||||
      $ if [ "$2" -eq 0 ]; then
 | 
			
		||||
        <label class="button ri-delete-bin-2-fill">
 | 
			
		||||
          <input type="submit" name="action" value="delete" />
 | 
			
		||||
        </label>
 | 
			
		||||
      $ fi
 | 
			
		||||
    </form>
 | 
			
		||||
$ }
 | 
			
		||||
#
 | 
			
		||||
      $   action="save";
 | 
			
		||||
      $ else
 | 
			
		||||
      $   action="add";
 | 
			
		||||
      $ fi;
 | 
			
		||||
      <input type="submit" name="action" value="<% $action %>" />
 | 
			
		||||
    </label>
 | 
			
		||||
    $ if [ "$2" -eq 0 ]; then
 | 
			
		||||
      <label class="button ri-delete-bin-2-fill">
 | 
			
		||||
        <input type="submit" name="action" value="delete" />
 | 
			
		||||
      </label>
 | 
			
		||||
    $ fi
 | 
			
		||||
  </form>
 | 
			
		||||
  <{
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# Utility Functions
 | 
			
		||||
# =================
 | 
			
		||||
#
 | 
			
		||||
 | 
			
		||||
# $1: string: function name
 | 
			
		||||
# $2: number: $#
 | 
			
		||||
# $3: number: expected number of arguments
 | 
			
		||||
$ enforce_arguments () {
 | 
			
		||||
$   if [ "$2" -lt "$3" ]; then
 | 
			
		||||
$     printf '%s %s %s\n' 'Function:' "$1" 'called with too few arguments';
 | 
			
		||||
$     exit 1;
 | 
			
		||||
$   elif [ "$2" -gt "$3" ]; then
 | 
			
		||||
$     printf '%s %s %s\n' 'Function:' "$1" 'called with too many arguments';
 | 
			
		||||
$     exit 1;
 | 
			
		||||
$   fi;
 | 
			
		||||
$ }
 | 
			
		||||
#
 | 
			
		||||
$ decode_uri () {
 | 
			
		||||
$   local i="${*//+/ }";
 | 
			
		||||
$   echo -e "${i//%/\\x}";
 | 
			
		||||
$ }
 | 
			
		||||
#
 | 
			
		||||
#
 | 
			
		||||
enforce_arguments () {
 | 
			
		||||
  if [ "$2" -lt "$3" ]; then
 | 
			
		||||
    printf '%s %s %s\n' 'Function:' "$1" 'called with too few arguments';
 | 
			
		||||
    exit 1;
 | 
			
		||||
  elif [ "$2" -gt "$3" ]; then
 | 
			
		||||
    printf '%s %s %s\n' 'Function:' "$1" 'called with too many arguments';
 | 
			
		||||
    exit 1;
 | 
			
		||||
  fi;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
decode_uri () {
 | 
			
		||||
  local i="${*//+/ }";
 | 
			
		||||
  echo -e "${i//%/\\x}";
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
# Restaurant List Functions
 | 
			
		||||
# =========================
 | 
			
		||||
#
 | 
			
		||||
 | 
			
		||||
# $1: string: restaurant to remove
 | 
			
		||||
$ remove_restaurant () {
 | 
			
		||||
$   enforce_arguments "${FUNCNAME[0]}" "$#" 1;
 | 
			
		||||
$   local temp_file;
 | 
			
		||||
$   temp_file=$(mktemp);
 | 
			
		||||
$   grep -Fxv "$1" "$restaurant_file" > "$temp_file";
 | 
			
		||||
$   mv "$temp_file" "$restaurant_file";
 | 
			
		||||
$ }
 | 
			
		||||
#
 | 
			
		||||
remove_restaurant () {
 | 
			
		||||
  enforce_arguments "${FUNCNAME[0]}" "$#" 1;
 | 
			
		||||
  local temp_file;
 | 
			
		||||
  temp_file=$(mktemp);
 | 
			
		||||
  grep -Fxv "$1" "$restaurant_file" > "$temp_file";
 | 
			
		||||
  mv "$temp_file" "$restaurant_file";
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# $1: string: restuarant to add
 | 
			
		||||
$ add_restaurant () {
 | 
			
		||||
$   enforce_arguments "${FUNCNAME[0]}" "$#" 1;
 | 
			
		||||
$   local temp_file;
 | 
			
		||||
$   temp_file=$(mktemp);
 | 
			
		||||
$   (grep -Fxv "$1" "$restaurant_file"; printf '%s\n' "$1") > "$temp_file";
 | 
			
		||||
$   mv "$temp_file" "$restaurant_file";
 | 
			
		||||
$ }
 | 
			
		||||
#
 | 
			
		||||
add_restaurant () {
 | 
			
		||||
  enforce_arguments "${FUNCNAME[0]}" "$#" 1;
 | 
			
		||||
  local temp_file;
 | 
			
		||||
  temp_file=$(mktemp);
 | 
			
		||||
  (grep -Fxv "$1" "$restaurant_file"; printf '%s\n' "$1") > "$temp_file";
 | 
			
		||||
  mv "$temp_file" "$restaurant_file";
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# $1 (optional): number: 0=don't overwrite, 1=overwrite
 | 
			
		||||
$ todays_restaurant () {
 | 
			
		||||
$   local today;
 | 
			
		||||
$   today="$(date +'%Y%m%d')";
 | 
			
		||||
$   local filename="$today.pick";
 | 
			
		||||
$   if [ -n "$1" ] && [ "$1" -ne 0 ]; then
 | 
			
		||||
$     rm "$filename";
 | 
			
		||||
$   fi;
 | 
			
		||||
$   if [ ! -f "$filename" ]; then
 | 
			
		||||
$     shuf -n 1 "$restaurant_file" > "$filename";
 | 
			
		||||
$   fi;
 | 
			
		||||
$   cat "$filename";
 | 
			
		||||
$ }
 | 
			
		||||
#
 | 
			
		||||
todays_restaurant () {
 | 
			
		||||
  local today;
 | 
			
		||||
  today="$(date +'%Y%m%d')";
 | 
			
		||||
  local filename="$today.pick";
 | 
			
		||||
  if [ -n "$1" ] && [ "$1" -ne 0 ]; then
 | 
			
		||||
    rm "$filename";
 | 
			
		||||
  fi;
 | 
			
		||||
  if [ ! -f "$filename" ]; then
 | 
			
		||||
    shuf -n 1 "$restaurant_file" > "$filename";
 | 
			
		||||
  fi;
 | 
			
		||||
  cat "$filename";
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# Initialization
 | 
			
		||||
# ==============
 | 
			
		||||
#
 | 
			
		||||
 | 
			
		||||
# Make sure restaurant file eixsts
 | 
			
		||||
$ touch -a "$restaurant_file";
 | 
			
		||||
#
 | 
			
		||||
touch -a "$restaurant_file";
 | 
			
		||||
 | 
			
		||||
# Parse body
 | 
			
		||||
# ----------
 | 
			
		||||
$ declare -A body;
 | 
			
		||||
$ while IFS= read -d '&' -r pair || [ "$pair" ]; do
 | 
			
		||||
$   name=$(decode_uri "${pair%%=*}");
 | 
			
		||||
$   value=$(decode_uri "${pair#*=}");
 | 
			
		||||
$   if [ -n "$name" ]; then
 | 
			
		||||
$     body["$name"]="$value";
 | 
			
		||||
$   fi;
 | 
			
		||||
$ done #>
 | 
			
		||||
#
 | 
			
		||||
declare -A body;
 | 
			
		||||
while IFS= read -d '&' -r pair || [ "$pair" ]; do
 | 
			
		||||
  name=$(decode_uri "${pair%%=*}");
 | 
			
		||||
  value=$(decode_uri "${pair#*=}");
 | 
			
		||||
  if [ -n "$name" ]; then
 | 
			
		||||
    body["$name"]="$value";
 | 
			
		||||
  fi;
 | 
			
		||||
done
 | 
			
		||||
 | 
			
		||||
# Perform requested action
 | 
			
		||||
# ------------------------
 | 
			
		||||
$ case "${body['action']}" in
 | 
			
		||||
$   add)
 | 
			
		||||
$     add_restaurant "${body['new']}";
 | 
			
		||||
$     ;;
 | 
			
		||||
$   delete)
 | 
			
		||||
$     remove_restaurant "${body['old']}";
 | 
			
		||||
$     ;;
 | 
			
		||||
$   save)
 | 
			
		||||
$     remove_restaurant "${body['old']}";
 | 
			
		||||
$     add_restaurant "${body['new']}";
 | 
			
		||||
$     ;;
 | 
			
		||||
$   new_restaurant)
 | 
			
		||||
$     todays_restaurant $true >/dev/null;
 | 
			
		||||
$     ;;
 | 
			
		||||
$ esac
 | 
			
		||||
#
 | 
			
		||||
#
 | 
			
		||||
<!doctype html>
 | 
			
		||||
case "${body['action']}" in
 | 
			
		||||
  add)
 | 
			
		||||
    add_restaurant "${body['new']}";
 | 
			
		||||
    ;;
 | 
			
		||||
  delete)
 | 
			
		||||
    remove_restaurant "${body['old']}";
 | 
			
		||||
    ;;
 | 
			
		||||
  save)
 | 
			
		||||
    remove_restaurant "${body['old']}";
 | 
			
		||||
    add_restaurant "${body['new']}";
 | 
			
		||||
    ;;
 | 
			
		||||
  new_restaurant)
 | 
			
		||||
    todays_restaurant $true >/dev/null;
 | 
			
		||||
    ;;
 | 
			
		||||
esac
 | 
			
		||||
 | 
			
		||||
}><!doctype html>
 | 
			
		||||
<html>
 | 
			
		||||
  <head>
 | 
			
		||||
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
 | 
			
		||||
    <meta property="og:title" content="FeedMe">
 | 
			
		||||
    <meta property="og:type" content="website">
 | 
			
		||||
    <meta property="og:url" content="https://n0m.org/feedme">
 | 
			
		||||
    <meta property="og:image" content="https://n0m.org/feedme/images/food.png">
 | 
			
		||||
    <meta property="og:description" content="Today's Restaurant: <$% todays_restaurant %>">
 | 
			
		||||
    <title><% $title %></title>
 | 
			
		||||
    <style>
 | 
			
		||||
      :root {
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user