2024-01-28 18:24:38 +01:00
|
|
|
#!/usr/bin/zsh
|
|
|
|
|
|
|
|
# Quick Site Generator 2 is a static website generator inspired by Nikola.
|
|
|
|
# It is written for the Z shell (zsh) because that's what I use and also because I like it better than Bash.
|
|
|
|
#
|
|
|
|
# This script is an almost complete rewrite of my old script because it became overly complicated and
|
|
|
|
# had way too many bugs, even though it worked on simple sites.
|
|
|
|
#
|
|
|
|
# qsgen2 uses different templates and its own formattings tags to generate the static HTML pages.
|
|
|
|
#
|
|
|
|
# The file structure in the project directory should look like this:
|
|
|
|
#
|
|
|
|
# .blog_cache
|
|
|
|
# .pages_cache
|
|
|
|
# config
|
|
|
|
# index.tpl
|
|
|
|
# templates/
|
|
|
|
# templates/<theme>/pages.tpl
|
|
|
|
# templates/<theme>/blogs.tpl
|
|
|
|
# templates/<theme>/blog_index.tpl
|
|
|
|
# blog/
|
|
|
|
# blog/2024-01-26-1.blog
|
|
|
|
#
|
|
|
|
# Explanation of the file structure.
|
|
|
|
# The file 'config' contains the settings for this specific project.
|
|
|
|
# The file 'index.tpl' is what becomes index.html that is served to the public.
|
|
|
|
# The 'templates/' directory contains the templates used to generate the pages and blog posts.
|
|
|
|
# The 'blog/' directory contains the blog posts. The date format of the files are used to create a blog/index.html with the newest post first.
|
|
|
|
#
|
|
|
|
# Contents of the file 'config' --> CHANGE THESE <--
|
|
|
|
# export site_name="The name of the website"
|
|
|
|
# - This is the project directory
|
|
|
|
# export project_dir=${HOME}/www/vikingo
|
|
|
|
# - This is where the generated files will be put
|
|
|
|
# export www_root=${HOME}/www_root/smelror.com
|
|
|
|
# #################################################################################################
|
|
|
|
# I don't think these need to be here as they'll always be in the same place with the same names
|
|
|
|
# export pages=${project_dir}/templates/<theme>/pages.tpl
|
|
|
|
# export blogs=${project_dir}/templates/<theme>/blogs.tpl
|
|
|
|
# export blog_list=${project_dir}/templates/<theme>/blog_list.tpl
|
|
|
|
# export blog_index=${project_dir}/templates/<theme>/blog_index.tpl
|
|
|
|
###################################################################################################
|
|
|
|
# export blog_in_index=false
|
|
|
|
|
2024-01-29 15:41:09 +01:00
|
|
|
VERSION="0.0.1 alpha" # Mon-2024-01-29
|
|
|
|
QSGEN="Quick Site Generator 2"
|
2024-01-28 18:24:38 +01:00
|
|
|
|
|
|
|
# Set to true or false
|
|
|
|
# This will show debug information from almost every function in this script
|
2024-01-29 21:41:48 +01:00
|
|
|
debug=false
|
2024-01-28 18:24:38 +01:00
|
|
|
|
|
|
|
function include () {
|
2024-01-29 15:06:36 +01:00
|
|
|
|
|
|
|
# This function is used to include other functions that will normally be in
|
|
|
|
# ${HOME}/bin/include/
|
2024-01-28 18:24:38 +01:00
|
|
|
|
|
|
|
# Edit this path to reflect your installation
|
2024-01-29 15:06:36 +01:00
|
|
|
local inc_file=${HOME}/bin/include/${1}.inc
|
2024-01-28 18:24:38 +01:00
|
|
|
if [[ ! -f ${inc_file} ]]; then
|
2024-01-29 15:06:36 +01:00
|
|
|
local inc_opt=$( echo ${1} | cut -d\/ -f2 )
|
|
|
|
echo "Supplied option \"${inc_opt}\" is not a valid include."
|
2024-01-28 18:24:38 +01:00
|
|
|
else
|
|
|
|
builtin source ${inc_file} ${2}
|
|
|
|
fi
|
|
|
|
|
|
|
|
}
|
|
|
|
|
2024-01-29 15:06:36 +01:00
|
|
|
# Including some colors to the script
|
2024-01-28 18:24:38 +01:00
|
|
|
include common/colors
|
|
|
|
|
2024-01-28 19:34:30 +01:00
|
|
|
echo "${magenta}${QSGEN} ${VERSION}${end}"
|
|
|
|
|
2024-01-29 15:49:41 +01:00
|
|
|
function _version() {
|
|
|
|
echo "${yellow}- Created by kekePower - 2018-$(date +%Y)${end}"
|
2024-01-28 19:33:09 +01:00
|
|
|
echo "${yellow}- https://github.com/kekePower/qsgen2/${end}"
|
2024-01-29 15:51:30 +01:00
|
|
|
echo "${yellow}- See '${1} help' for more information."
|
2024-01-28 19:33:09 +01:00
|
|
|
exit
|
2024-01-29 15:49:41 +01:00
|
|
|
}
|
2024-01-28 19:33:09 +01:00
|
|
|
|
2024-01-29 15:49:41 +01:00
|
|
|
function _help() {
|
|
|
|
echo "This is where I'll write the Help documentation."
|
2024-01-28 18:24:38 +01:00
|
|
|
exit
|
2024-01-29 15:49:41 +01:00
|
|
|
}
|
|
|
|
|
2024-01-29 21:46:15 +01:00
|
|
|
if [[ "$1" == "version" || "$1" == "-v" || "$1" == "--version" ]]; then
|
|
|
|
_version ${0:t}
|
|
|
|
elif [[ "$1" == "help" || "$1" == "-h" || "$1" == "--help" ]]; then
|
|
|
|
_help ${0:t}
|
|
|
|
fi
|
2024-01-28 18:24:38 +01:00
|
|
|
|
|
|
|
# Loading Zsh modules
|
|
|
|
zmodload zsh/files
|
|
|
|
|
|
|
|
# Check for, an source, the config file for this specific website
|
|
|
|
if [[ -f $(pwd)/config ]]; then
|
|
|
|
if (${debug}) echo "${red}Config file found and sourced${end}\n${yellow} - $(pwd)/config${end}"
|
|
|
|
# CONFIG=$(pwd)/config
|
|
|
|
builtin source $(pwd)/config
|
|
|
|
else
|
|
|
|
echo "${red}Cannot find configuration file.${end}"
|
|
|
|
echo "${yellow} - Please create the file 'config' in your project directory.${end}"
|
|
|
|
exit
|
|
|
|
fi
|
|
|
|
|
|
|
|
if (${debug}); then
|
|
|
|
echo "${red}Contents of Config file:${end}"
|
|
|
|
echo "${yellow} - site_name=${site_name}${end}"
|
2024-01-29 15:33:00 +01:00
|
|
|
echo "${yellow} - site_tagline=${site_tagline}${end}"
|
2024-01-28 18:24:38 +01:00
|
|
|
echo "${yellow} - theme=${theme}${end}"
|
|
|
|
echo "${yellow} - project_dir=${project_dir}${end}"
|
|
|
|
echo "${yellow} - www_root=${www_root}${end}"
|
|
|
|
echo "${yellow} - blog_in_index=${blog_in_index}${end}"
|
|
|
|
echo "${yellow} - generator=${generator}${end}"
|
|
|
|
fi
|
|
|
|
|
2024-01-29 21:40:26 +01:00
|
|
|
# Let's check if qsgen2 can generate this site by checking if 'generator' is available
|
|
|
|
if [[ ! ${generator} ]]; then
|
|
|
|
echo "${0:t} cannot parse this site. Exiting."
|
|
|
|
exit
|
|
|
|
fi
|
|
|
|
|
|
|
|
# We define the variable 'engine' based on what's in the 'config' file.
|
2024-01-28 18:24:38 +01:00
|
|
|
if [[ ${generator} == "native" ]]; then
|
2024-01-29 21:40:26 +01:00
|
|
|
# Usage: ${engine} ${1} - Where 1 is the file you want to convert
|
2024-01-28 18:24:38 +01:00
|
|
|
engine=_html
|
|
|
|
elif [[ ${generator} == "markdown" ]]; then
|
|
|
|
if [[ ! -f /usr/bin/markdown ]]; then
|
|
|
|
echo "Please install the 'discount' package to use Markdown."
|
|
|
|
exit
|
2024-01-29 17:05:55 +01:00
|
|
|
else
|
2024-01-29 21:40:26 +01:00
|
|
|
# Let's make sure that the Markdown executable gets all its variables: 1 and 2
|
|
|
|
if [[ ! ${2} ]] || [[ ${2} == "" ]]; then
|
|
|
|
echo "Engine: To use Markdown, please provide a second variable, the output file."
|
|
|
|
echo "Engine: Example: engine file.tpl www_root/file.html"
|
|
|
|
exit
|
|
|
|
else
|
|
|
|
# Usage: ${engine} ${1} - Where 1 is the file you want parsed
|
|
|
|
engine=$( /usr/bin/markdown ${1} -d )
|
|
|
|
fi
|
2024-01-29 17:05:55 +01:00
|
|
|
fi
|
2024-01-28 18:24:38 +01:00
|
|
|
fi
|
2024-01-29 19:05:36 +01:00
|
|
|
if (${debug}) echo "${red}Using the ${generator} engine${end}"
|
2024-01-28 18:24:38 +01:00
|
|
|
|
2024-01-29 19:05:36 +01:00
|
|
|
# Define cache files for blogs and pages
|
2024-01-28 18:24:38 +01:00
|
|
|
blog_cache_file="${project_dir}/.blog_cache"
|
|
|
|
pages_cache_file="${project_dir}/.pages_cache"
|
|
|
|
|
|
|
|
builtin cd ${project_dir}
|
|
|
|
|
2024-01-28 19:27:30 +01:00
|
|
|
# Let's put these here for now.
|
|
|
|
export today=$( date "+%Y-%m-%d - %T" )
|
|
|
|
export blogdate=$( date +%a-%Y-%b-%d )
|
|
|
|
|
2024-01-28 18:24:38 +01:00
|
|
|
# Let's create arrays of all the files we'll be working on
|
|
|
|
|
|
|
|
function _list_blog_idx() {
|
|
|
|
ls -har blog/*.idx | while read -r file; do
|
|
|
|
blog_idx_array+=($file)
|
|
|
|
done
|
|
|
|
}
|
|
|
|
function _list_blog_tmp_idx() {
|
|
|
|
ls -har blog/*.tmp.html | while read -r file; do
|
|
|
|
blog_tmp_idx_array+=($file)
|
|
|
|
done
|
|
|
|
}
|
|
|
|
function _list_blog() {
|
|
|
|
ls -1btar blog/*.blog | while read -r file; do
|
|
|
|
blog_index_file_array+=($file)
|
|
|
|
done
|
|
|
|
}
|
|
|
|
|
|
|
|
# BLOG CACHE
|
|
|
|
function _blog_cache() {
|
2024-01-29 21:40:26 +01:00
|
|
|
local debug=false
|
|
|
|
# Create an associative array for the blog cache
|
|
|
|
typeset -A blog_cache
|
|
|
|
|
|
|
|
# Load the existing blog cache
|
|
|
|
if [[ -f $blog_cache_file ]]; then
|
|
|
|
while IFS=':' read -r name hash; do
|
|
|
|
blog_cache[$name]=$hash
|
|
|
|
if (${debug}) echo "${red}HASH VALUE: ${blog_cache[${name}]}${end}"
|
|
|
|
done < "$blog_cache_file"
|
|
|
|
fi
|
2024-01-28 18:24:38 +01:00
|
|
|
|
2024-01-29 21:40:26 +01:00
|
|
|
# Initialize the array for storing blog files to process
|
|
|
|
make_blog_array=()
|
2024-01-28 18:24:38 +01:00
|
|
|
|
2024-01-29 21:40:26 +01:00
|
|
|
# Process blog files
|
|
|
|
for blog_file in $(ls -har blog/*.blog); do
|
|
|
|
# Compute the current blog file hash
|
|
|
|
current_hash=$(md5sum "$blog_file" | awk '{print $1}')
|
2024-01-28 18:24:38 +01:00
|
|
|
|
2024-01-29 21:40:26 +01:00
|
|
|
if (${debug}) echo "${red}1. blog_cache: ${blog_file}${end}"
|
|
|
|
if (${debug}) echo "${red}2. current_cache: ${current_hash}${end}"
|
|
|
|
|
|
|
|
# Check if the blog file is new or has changed
|
|
|
|
if [[ ${blog_cache[$blog_file]} != "$current_hash" ]]; then
|
|
|
|
if (${debug}) echo "${red}3. new_cache_file: ${blog_file}${end}"
|
|
|
|
if (${debug}) echo "${red}4. new_current_cache: ${current_hash}${end}"
|
|
|
|
# Blog file is new or has changed; add it to the processing array
|
|
|
|
make_blog_array+=("$blog_file")
|
|
|
|
|
|
|
|
# Update the blog cache with the new hash
|
|
|
|
blog_cache[$blog_file]=$current_hash
|
|
|
|
fi
|
|
|
|
done
|
2024-01-28 18:24:38 +01:00
|
|
|
|
2024-01-29 21:40:26 +01:00
|
|
|
# Rebuild the blog cache file from scratch
|
|
|
|
: >| "$blog_cache_file" # Truncate the file before writing
|
|
|
|
for name in "${(@k)blog_cache}"; do
|
|
|
|
echo "$name:${blog_cache[$name]}" >> "$blog_cache_file"
|
|
|
|
done
|
2024-01-28 18:24:38 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
# PAGES CACHE
|
2024-01-29 21:40:26 +01:00
|
|
|
# Returns the array pages_array()
|
2024-01-28 18:24:38 +01:00
|
|
|
function _pages_cache() {
|
2024-01-29 21:40:26 +01:00
|
|
|
local debug=false
|
|
|
|
# Create an associative array for the pages cache
|
|
|
|
typeset -A pages_cache
|
|
|
|
|
|
|
|
# Load the existing pages cache
|
|
|
|
if [[ -f $pages_cache_file ]]; then
|
|
|
|
while IFS=':' read -r name hash; do
|
|
|
|
pages_cache[$name]=$hash
|
|
|
|
if (${debug}) echo "${red}PAGES HASH VALUE: ${pages_cache[${name}]}${end}"
|
|
|
|
done < "$pages_cache_file"
|
2024-01-28 18:24:38 +01:00
|
|
|
fi
|
|
|
|
|
2024-01-29 21:40:26 +01:00
|
|
|
# Initialize the array for storing pages files to process
|
|
|
|
pages_array=()
|
|
|
|
|
|
|
|
# Process pages files
|
|
|
|
for file in $(ls -1bt *tpl); do
|
|
|
|
# Compute the current blog file hash
|
|
|
|
current_hash=$(md5sum "$file" | awk '{print $1}')
|
|
|
|
|
|
|
|
if (${debug}) echo "${red}1. pages_cache: ${pages_cache[$file]}${end}"
|
|
|
|
if (${debug}) echo "${red}1. current_cache: ${current_hash}${end}"
|
|
|
|
|
|
|
|
# Check if the pages file is new or has changed
|
|
|
|
if [[ ${pages_cache[$file]} != "$current_hash" ]]; then
|
|
|
|
if (${debug}) echo "${red}2. pages_file: ${pages_cache[$file]}${end}"
|
|
|
|
if (${debug}) echo "${red}2. current_cache: ${current_hash}${end}"
|
|
|
|
# Pages file is new or has changed; add it to the processing array
|
|
|
|
pages_array+=("$file")
|
|
|
|
|
|
|
|
# Update the pages cache with the new hash
|
|
|
|
pages_cache[$file]=$current_hash
|
|
|
|
fi
|
|
|
|
done
|
|
|
|
|
|
|
|
# Rebuild the pages cache file from scratch
|
|
|
|
: >| "$pages_cache_file" # Truncate the file before writing
|
|
|
|
for name in "${(@k)pages_cache}"; do
|
|
|
|
echo "$name:${pages_cache[$name]}" >> "$pages_cache_file"
|
|
|
|
done
|
2024-01-28 18:24:38 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
function _last_updated() {
|
2024-01-30 09:26:34 +01:00
|
|
|
# This function updates #updated and #version tags in the provided string
|
|
|
|
|
|
|
|
local content="${1}"
|
|
|
|
local debug=false
|
|
|
|
|
|
|
|
if (${debug}) echo "${red}_last_updated: Setting date and version in footer${end}"
|
|
|
|
|
|
|
|
# Perform the replacements
|
|
|
|
local updated_content=$(echo "${content}" | sed \
|
|
|
|
-e "s|#updated|${TODAY}|" \
|
|
|
|
-e "s|#version|${QSGEN} ${VERSION}|")
|
|
|
|
|
|
|
|
# Return the updated content
|
|
|
|
echo "${updated_content}"
|
2024-01-28 18:24:38 +01:00
|
|
|
}
|
|
|
|
|
2024-01-29 21:40:26 +01:00
|
|
|
function _file_to_lower() {
|
|
|
|
|
|
|
|
local filename=${1}
|
|
|
|
|
|
|
|
# Replace spaces with dashes
|
|
|
|
filename="${filename// /-}"
|
|
|
|
|
|
|
|
# Convert to lowercase and remove invalid characters
|
|
|
|
filename=$(echo "${filename}" | sed -e 's/^[^a-zA-Z0-9_.]+//g' -e 's/[^a-zA-Z0-9_-]+/-/g')
|
|
|
|
|
2024-01-29 23:28:03 +01:00
|
|
|
echo ${filename}
|
2024-01-29 21:40:26 +01:00
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2024-01-28 18:24:38 +01:00
|
|
|
function _pages() {
|
2024-01-29 21:40:26 +01:00
|
|
|
# This function generates all the new and updated Pages
|
2024-01-28 18:24:38 +01:00
|
|
|
|
2024-01-30 09:49:13 +01:00
|
|
|
local debug=false
|
2024-01-28 18:24:38 +01:00
|
|
|
|
2024-01-30 00:39:30 +01:00
|
|
|
# Load the cache for Pages
|
|
|
|
if (${debug}) echo "_pages: Running function _pages_cache"
|
|
|
|
_pages_cache
|
|
|
|
|
|
|
|
if (( ${#pages_array[@]} > 0 )); then
|
|
|
|
|
2024-01-30 00:38:25 +01:00
|
|
|
if (${debug}) echo "_pages: Setting Pages template"
|
2024-01-28 18:24:38 +01:00
|
|
|
local pages=${project_dir}/templates/${theme}/pages.tpl
|
|
|
|
|
2024-01-29 21:40:26 +01:00
|
|
|
# Let's check if we can access the pages.tpl file.
|
|
|
|
# It not, exit script.
|
2024-01-29 15:33:00 +01:00
|
|
|
if [[ ! -f ${pages} ]]; then
|
|
|
|
echo "Unable to find the Pages template: ${pages}"
|
|
|
|
exit
|
2024-01-29 21:40:26 +01:00
|
|
|
else
|
|
|
|
# Read template once
|
2024-01-30 00:38:25 +01:00
|
|
|
if (${debug}) echo "_pages: Reading Pages template into pages_tpl"
|
2024-01-29 21:40:26 +01:00
|
|
|
pages_tpl="$(<${pages})"
|
|
|
|
fi
|
|
|
|
|
|
|
|
# If pages_array is not empty, we do work
|
2024-01-29 22:21:58 +01:00
|
|
|
if (${debug}) echo "_pages: pages_array is not empty"
|
2024-01-29 21:40:26 +01:00
|
|
|
for pages_in_array in ${pages_array[@]}
|
|
|
|
do
|
|
|
|
echo "${green}Generating Page: ${pages_in_array}${end}"
|
|
|
|
# Read the file once
|
2024-01-29 22:35:17 +01:00
|
|
|
if (${debug}) echo "_pages: Loading page_content once"
|
2024-01-29 21:40:26 +01:00
|
|
|
local page_content="$(<${pages_in_array})"
|
2024-01-29 22:39:05 +01:00
|
|
|
|
2024-01-29 21:40:26 +01:00
|
|
|
# Grab the title from the Page
|
2024-01-29 22:21:58 +01:00
|
|
|
if (${debug}) echo "_pages: Grepping for page_title"
|
2024-01-30 01:16:42 +01:00
|
|
|
page_title=$( echo ${page_content} | head -2 | grep \#title | cut -d= -f2 )
|
2024-01-29 21:40:26 +01:00
|
|
|
|
2024-01-30 00:42:34 +01:00
|
|
|
# Remove the #title line from the buffer. No longer needed.
|
|
|
|
if (${debug}) echo "_pages: Removing #title line from page_content"
|
|
|
|
page_content=$( echo ${page_content} | grep -v \#title )
|
|
|
|
|
2024-01-30 09:39:54 +01:00
|
|
|
# HTML'ify the page content
|
|
|
|
if (${debug}) echo "_pages: Running engine on ${pages_in_array}"
|
2024-01-30 09:41:07 +01:00
|
|
|
page_content=$( ${engine} ${page_content} )
|
2024-01-29 21:40:26 +01:00
|
|
|
|
2024-01-30 09:39:54 +01:00
|
|
|
# Look for links, images and videos and convert them if present.
|
|
|
|
if (${debug}) echo "_pages: Checking for #link, #showimg and #ytvideo in page_content"
|
2024-01-30 09:45:18 +01:00
|
|
|
if [[ $( echo ${page_content} | grep \#link ) ]]; then
|
2024-01-30 09:49:13 +01:00
|
|
|
if (${debug}) echo "_pages: If #link is present, run _link: page_content"
|
2024-01-30 09:39:54 +01:00
|
|
|
page_content=$( _link "${page_content}" )
|
|
|
|
fi
|
2024-01-30 09:45:18 +01:00
|
|
|
if [[ $( echo ${page_content} | grep \#showimg ) ]]; then
|
2024-01-30 09:49:13 +01:00
|
|
|
if (${debug}) echo "_pages: If #showimg is present, run _image: page_content"
|
2024-01-30 09:39:54 +01:00
|
|
|
page_content=$( _image "${page_content}" )
|
|
|
|
fi
|
2024-01-30 09:45:18 +01:00
|
|
|
if [[ $( echo ${page_content} | grep \#ytvideo ) ]]; then
|
2024-01-30 09:49:13 +01:00
|
|
|
if (${debug}) echo "_pages: If #ytvideo is present, run _youtube: page_content"
|
2024-01-30 09:39:54 +01:00
|
|
|
page_content=$( _youtube "${page_content}" )
|
|
|
|
fi
|
2024-01-30 00:05:43 +01:00
|
|
|
|
2024-01-29 23:45:53 +01:00
|
|
|
# Insert page_content into pages_tpl by replacing the BODY tag present there
|
2024-01-30 08:52:13 +01:00
|
|
|
if (${debug}) echo "_pages: Replacing BODY with page_content in pages_tpl using Perl"
|
|
|
|
# Use Perl for multi-line and special character handling
|
|
|
|
pages_tpl=$( echo "${pages_tpl}" | perl -pe "s|BODY|${page_content}|gs" )
|
2024-01-30 01:18:48 +01:00
|
|
|
|
2024-01-30 09:39:54 +01:00
|
|
|
# Replace every #pagetitle in pages_tpl
|
|
|
|
if (${debug}) echo "_pages: Replacing #pagetitle in pages_tpl"
|
|
|
|
pages_tpl=$( echo ${pages_tpl} | perl -pe "s|#pagetitle|${page_title}|gs" )
|
|
|
|
|
|
|
|
# Replace every #tagline in pages_tpl
|
|
|
|
if (${debug}) echo "_pages: Replacing tagline"
|
|
|
|
pages_tpl=$( echo ${pages_tpl} | perl -pe "s|#tagline|${site_tagline}|gs" )
|
2024-01-30 00:32:59 +01:00
|
|
|
|
|
|
|
# Replace #updated with today's date and #version with Name and Version to footer
|
|
|
|
if (${debug}) echo "_pages: _last_updated in pages_tpl"
|
2024-01-30 09:26:34 +01:00
|
|
|
pages_tpl=$( _last_updated ${pages_tpl} )
|
2024-01-29 22:57:49 +01:00
|
|
|
|
2024-01-30 09:17:07 +01:00
|
|
|
# Clean up unused tags, if any
|
|
|
|
if (${debug}) echo "_pages: Running _cleanup"
|
2024-01-30 09:39:54 +01:00
|
|
|
pages_tpl=$( _cleanup "${pages_tpl}" )
|
2024-01-30 09:17:07 +01:00
|
|
|
|
|
|
|
# Always use lowercase for file names
|
|
|
|
if (${debug}) echo "_pages: Lowercase filnames, always"
|
|
|
|
pages_title_lower=$( _file_to_lower "${pages_in_array}" )
|
|
|
|
|
|
|
|
# Write pages_tpl to disk
|
|
|
|
echo "${green}Writing ${www_root}/${pages_title_lower%.*}.html to disk.${end}"
|
|
|
|
echo "${pages_tpl}" > ${www_root}/${pages_title_lower%.*}.html
|
|
|
|
|
2024-01-29 21:40:26 +01:00
|
|
|
done
|
2024-01-30 00:38:25 +01:00
|
|
|
|
|
|
|
else
|
|
|
|
|
|
|
|
echo "${yellow}No new or updated Pages${end}"
|
2024-01-29 21:40:26 +01:00
|
|
|
|
2024-01-29 15:33:00 +01:00
|
|
|
fi
|
|
|
|
|
2024-01-28 18:24:38 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
function _blogs() {
|
2024-01-30 10:27:22 +01:00
|
|
|
# Rewritten _blogs function
|
|
|
|
# This function either generates blog files or exports metadata based on the argument
|
|
|
|
|
2024-01-28 18:24:38 +01:00
|
|
|
local debug=true
|
2024-01-30 10:27:22 +01:00
|
|
|
local mode=${1} # If <something>", exports metadata; otherwise, creates blog posts
|
|
|
|
|
2024-01-28 18:24:38 +01:00
|
|
|
# Running function _list_blog
|
2024-01-30 10:27:22 +01:00
|
|
|
if (${debug}) echo "_blogs: Running function _list_blog"
|
2024-01-28 18:24:38 +01:00
|
|
|
_list_blog
|
|
|
|
# Running function _blog_cache
|
2024-01-30 10:27:22 +01:00
|
|
|
if (${debug}) echo "_blogs: Running function _blog_cache"
|
2024-01-28 18:24:38 +01:00
|
|
|
_blog_cache
|
2024-01-30 10:27:22 +01:00
|
|
|
|
2024-01-28 18:24:38 +01:00
|
|
|
if (( ${#make_blog_array[@]} > 0 )); then
|
2024-01-30 10:27:22 +01:00
|
|
|
|
|
|
|
for blog in "${make_blog_array[@]}"; do
|
2024-01-30 11:01:45 +01:00
|
|
|
if (${debug}) echo "_blogs: Processing pre-data for ${blog}"
|
2024-01-30 10:27:22 +01:00
|
|
|
|
|
|
|
local content="$(<"${blog}")"
|
|
|
|
local sdate btitle ingress body blog_index blog_dir blog_url
|
|
|
|
|
|
|
|
# Extract blog information
|
|
|
|
sed -i "s/GETDATE/${BLOGDATE}/" ${blog}
|
|
|
|
# Array sdate = Name day=1, Year=2, Month=3, Number day=4
|
2024-01-28 18:24:38 +01:00
|
|
|
sdate=( $( echo ${content} | grep DATE | sed "s|DATE\ ||" | sed "s|\-|\ |g" ) )
|
|
|
|
btitle=$( echo ${content} | grep BLOG_TITLE | cut -d' ' -f2- )
|
|
|
|
ingress=$( echo ${content} | sed "s/'/\\\'/g" | xargs | grep -Po "#INGRESS_START\K(.*?)#INGRESS_STOP" | sed "s|\ \#INGRESS_STOP||" | sed "s|^\ ||" )
|
|
|
|
body=$( echo ${content} | sed "s/'/\\\'/g" | xargs | grep -Po "#BODY_START\K(.*?)#BODY_STOP" | sed "s|\ \#BODY_STOP||" | sed "s|^\ ||" )
|
2024-01-30 10:27:22 +01:00
|
|
|
|
2024-01-30 10:55:11 +01:00
|
|
|
blog_index="${btitle:l}"
|
2024-01-30 11:01:45 +01:00
|
|
|
blog_index=$(echo "${blog_index}" | sed 's/ /_/g; s/,//g; s/\.//g; s/://g; s/[()]//g')
|
2024-01-30 10:27:22 +01:00
|
|
|
|
2024-01-30 10:48:59 +01:00
|
|
|
blog_dir="/blog/${sdate[2]}/${sdate[3]:l}/${sdate[4]}"
|
2024-01-30 11:01:45 +01:00
|
|
|
blog_url="${blog_dir}/${blog_index}.html"
|
2024-01-28 18:24:38 +01:00
|
|
|
|
2024-01-30 10:27:22 +01:00
|
|
|
# Regular blog creation process
|
2024-01-30 10:31:38 +01:00
|
|
|
if [[ ! ${mode} ]]; then
|
2024-01-30 10:27:22 +01:00
|
|
|
|
2024-01-30 11:09:55 +01:00
|
|
|
if [[ -f ${project_dir}/templates/${theme}/blogs.tpl ]]; then
|
|
|
|
local blog_tpl=$(<"${project_dir}/templates/${theme}/blogs.tpl")
|
|
|
|
else
|
|
|
|
echo "Unable to find theme template for Blogs."
|
|
|
|
exit
|
|
|
|
fi
|
2024-01-30 10:41:17 +01:00
|
|
|
|
2024-01-30 10:27:22 +01:00
|
|
|
for blog in "${make_blog_array[@]}"; do
|
2024-01-30 10:37:36 +01:00
|
|
|
if (${debug}) echo "_blogs: Processing ${blog}"
|
|
|
|
|
|
|
|
# Prepare the blog template
|
2024-01-30 10:51:31 +01:00
|
|
|
local blog_content=$(echo "${blog_tpl}" | perl -pe "s|BLOGTITLE|${btitle}|g")
|
|
|
|
blog_content=$(echo "${blog_content}" | perl -pe "s|CALADAY|${sdate[1]}|g")
|
|
|
|
blog_content=$(echo "${blog_content}" | perl -pe "s|CALNDAY|${sdate[4]}|g")
|
|
|
|
blog_content=$(echo "${blog_content}" | perl -pe "s|CALMONTH|${sdate[3]}|g")
|
|
|
|
blog_content=$(echo "${blog_content}" | perl -pe "s|CALYEAR|${sdate[2]}|g")
|
|
|
|
blog_content=$(echo "${blog_content}" | perl -pe "s|BLOGURL|${blog_url}|g")
|
2024-01-30 10:48:59 +01:00
|
|
|
# Replace INGRESS placeholder with actual content using Perl
|
|
|
|
blog_content=$(echo "${blog_content}" | perl -pe "s|\QINGRESS\E|${ingress}|g")
|
|
|
|
# blog_content="${blog_content//INGRESS/${ingress}}"
|
2024-01-30 10:44:54 +01:00
|
|
|
# Replace BODY placeholder with actual content using Perl
|
|
|
|
blog_content=$(echo "${blog_content}" | perl -pe "s|\QBODY\E|${body}|g")
|
|
|
|
|
2024-01-30 10:37:36 +01:00
|
|
|
|
|
|
|
# Apply transformations
|
|
|
|
blog_content="$(_html "${blog_content}")"
|
2024-01-30 11:09:55 +01:00
|
|
|
# Look for links, images and videos and convert them if present.
|
|
|
|
if (${debug}) echo "_pages: Checking for #link, #showimg and #ytvideo in blog_content"
|
|
|
|
if [[ $( echo ${blog_content} | grep \#link ) ]]; then
|
|
|
|
if (${debug}) echo "_blogs: If #link is present, run _link: blog_content"
|
|
|
|
blog_content="$(_link "${blog_content}")"
|
|
|
|
fi
|
|
|
|
if [[ $( echo ${blog_content} | grep \#showimg ) ]]; then
|
|
|
|
if (${debug}) echo "_blogs: If #showimg is present, run _link: blog_content"
|
|
|
|
blog_content="$(_image "${blog_content}")"
|
|
|
|
fi
|
|
|
|
if [[ $( echo ${blog_content} | grep \#ytvideo ) ]]; then
|
|
|
|
if (${debug}) echo "_blogs: If #ytvideo is present, run _link: blog_content"
|
|
|
|
blog_content="$(_youtube "${blog_content}")"
|
|
|
|
fi
|
2024-01-30 10:37:36 +01:00
|
|
|
blog_content="$(_cleanup "${blog_content}")"
|
|
|
|
blog_content="$(_last_updated "${blog_content}")"
|
2024-01-30 10:27:22 +01:00
|
|
|
|
2024-01-30 10:37:36 +01:00
|
|
|
# Create directory if it doesn't exist
|
2024-01-30 10:41:17 +01:00
|
|
|
if (${debug}) echo "_blogs: Creating ${blog_dir}"
|
2024-01-30 10:37:36 +01:00
|
|
|
[[ ! -d "${www_root}${blog_dir}" ]] && mkdir -p "${www_root}${blog_dir}"
|
2024-01-30 10:27:22 +01:00
|
|
|
|
2024-01-30 10:37:36 +01:00
|
|
|
# Write to file
|
2024-01-30 10:41:17 +01:00
|
|
|
if (${debug}) echo "_blogs: Writing ${blog} to disk: ${www_root}${blog_url}"
|
2024-01-30 10:37:36 +01:00
|
|
|
echo "${blog_content}" > "${www_root}${blog_url}"
|
2024-01-30 10:34:00 +01:00
|
|
|
done
|
2024-01-28 18:24:38 +01:00
|
|
|
|
2024-01-30 10:34:00 +01:00
|
|
|
else
|
2024-01-30 10:31:38 +01:00
|
|
|
|
2024-01-30 10:27:22 +01:00
|
|
|
# Export metadata mode
|
|
|
|
if (${debug}) echo "_blogs: Exporting metadata for ${blog}"
|
|
|
|
export BLOG_SDATE="${sdate[@]}"
|
|
|
|
export BLOG_BTITLE="${btitle}"
|
|
|
|
export BLOG_INGRESS="${ingress}"
|
|
|
|
export BLOG_URL="${www_root}${blog_url}"
|
2024-01-30 10:31:38 +01:00
|
|
|
|
2024-01-30 10:27:22 +01:00
|
|
|
fi
|
2024-01-30 10:38:58 +01:00
|
|
|
done
|
|
|
|
else
|
|
|
|
echo "${yellow}No new or updated Blogs detected.${end}"
|
2024-01-28 18:24:38 +01:00
|
|
|
fi
|
|
|
|
}
|
|
|
|
|
|
|
|
function _blog_idx_for_index() {
|
|
|
|
# This function generates the file blog/index.idx
|
|
|
|
|
|
|
|
local debug=false
|
|
|
|
|
|
|
|
if [[ -f ${project_dir}/blog/index.tmp.html ]]; then
|
|
|
|
echo "Remove temporary file: ${project_dir}/blog/index.tmp.html"
|
|
|
|
rm -f ${project_dir}/blog/index.tmp.html
|
|
|
|
fi
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
function _blog_index() {
|
|
|
|
# This function generates the /blog/index.html file that gets its data from _blog_list_for_index()
|
|
|
|
|
|
|
|
local debug=false
|
|
|
|
local pages=${project_dir}/templates/${theme}/pages.tpl
|
2024-01-29 15:33:00 +01:00
|
|
|
|
|
|
|
if [[ ! -f ${pages} ]]; then
|
|
|
|
echo "Unable to find the Pages template: ${pages}"
|
|
|
|
exit
|
|
|
|
fi
|
|
|
|
|
2024-01-28 18:24:38 +01:00
|
|
|
local blog_index_title="Blog"
|
|
|
|
|
|
|
|
# Running function _list_blog_idx
|
|
|
|
# It returns the array: blog_tmp_idx_array
|
|
|
|
_list_blog_tmp_idx
|
|
|
|
|
|
|
|
if (( ${#blog_tmp_idx_array[@]} > 0 )); then
|
|
|
|
|
2024-01-29 15:33:00 +01:00
|
|
|
local blog_list=${project_dir}/templates/${theme}/blog_list.tpl
|
|
|
|
|
|
|
|
if [[ ! -f ${blog_list} ]]; then
|
|
|
|
echo "Unable to find the Pages template: ${blog_list}"
|
|
|
|
exit
|
|
|
|
fi
|
2024-01-28 18:24:38 +01:00
|
|
|
|
|
|
|
for blog_files in ${blog_tmp_idx_array[@]}
|
|
|
|
do
|
|
|
|
local content="$(<${blog_files})"
|
|
|
|
sed -i "s/GETDATE/${BLOGDATE}/" ${blog_files}
|
|
|
|
# Array sdate = Name day=4, Year=2, Month=3, Number day=1
|
|
|
|
sdate=( $( echo ${content} | grep DATE | sed "s|DATE\ ||" | sed "s|\-|\ |g" ) )
|
|
|
|
ingress=$( echo ${content} | sed "s/'/\\\'/g" | xargs | grep -Po "#INGRESS_START\K(.*?)#INGRESS_STOP" | sed "s|\ \#INGRESS_STOP||" | sed "s|^\ ||" )
|
|
|
|
body=$( echo ${content} | sed "s/'/\\\'/g" | xargs | grep -Po "#BODY_START\K(.*?)#BODY_STOP" | sed "s|\ \#BODY_STOP||" | sed "s|^\ ||" )
|
|
|
|
blog_date="${sdate[1]} ${sdate[4]}-${sdate[3]}-${sdate[2]}"
|
|
|
|
|
|
|
|
sed \
|
|
|
|
-e "s|BLOGDATE|${blog_date}|" \
|
|
|
|
-e "s|BLOGURL|${blog_url}|" \
|
|
|
|
-e "s|INGRESS|${ingress}|"
|
|
|
|
> ${project_dir}/blog/index.tmp.x
|
|
|
|
done
|
|
|
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
tee < ${pages} | sed \
|
|
|
|
-e "s|BODY|$(cat ${project_dir}/blog/index.tmp.x)|" \
|
|
|
|
-s "s|#pagetitle|${blog_index_title}|g" \
|
|
|
|
> ${www_root}/blog/index.html
|
|
|
|
_last_updated ${www_root}/blog/index.html
|
|
|
|
${engine} ${www_root}/blog/index.html
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
function _link() {
|
2024-01-30 09:17:07 +01:00
|
|
|
# This converts #link tags to actual clickable links in a provided string
|
2024-01-28 18:24:38 +01:00
|
|
|
|
2024-01-30 09:17:07 +01:00
|
|
|
local content="${1}"
|
|
|
|
local modified_content=""
|
2024-01-28 18:24:38 +01:00
|
|
|
local debug=false
|
|
|
|
|
2024-01-30 09:17:07 +01:00
|
|
|
# Process the content line by line
|
|
|
|
echo "${content}" | while IFS= read -r line; do
|
2024-01-28 18:24:38 +01:00
|
|
|
if [[ ${line} == *"#link"* ]]; then
|
2024-01-30 09:17:07 +01:00
|
|
|
if (${debug}) echo "${red}URL_MAIN(line): ${line}${end}"
|
2024-01-28 18:24:38 +01:00
|
|
|
|
|
|
|
# Extract the URL and the link text
|
2024-01-30 09:17:07 +01:00
|
|
|
local url_full=$(echo "${line}" | awk -F'#link ' '{print $2}' | awk -F'¤' '{print $1 "¤" $2}')
|
|
|
|
local url_dest=$(echo "${url_full}" | awk -F'¤' '{print $1}')
|
|
|
|
local url_txt=$(echo "${url_full}" | awk -F'¤' '{print $2}')
|
2024-01-28 18:24:38 +01:00
|
|
|
|
|
|
|
if (${debug}) echo "${red}URL: ${url_dest}${end}"
|
|
|
|
if (${debug}) echo "${red}Text: ${url_txt}${end}"
|
|
|
|
|
|
|
|
# Form the replacement HTML link
|
|
|
|
local modified_link="<a href=\"${url_dest}\">${url_txt}"
|
|
|
|
if [[ ${url_dest} =~ ^https?:// ]]; then
|
|
|
|
# Add external link icon for external URLs
|
|
|
|
modified_link+="<img class=\"exticon\" alt=\"External site icon\" src=\"/images/ext-url.png\" width=\"16\" />"
|
|
|
|
fi
|
|
|
|
modified_link+="</a>"
|
2024-01-30 09:17:07 +01:00
|
|
|
line=${line//"#link ${url_full}"/${modified_link}}
|
2024-01-28 18:24:38 +01:00
|
|
|
fi
|
2024-01-30 09:17:07 +01:00
|
|
|
modified_content+="${line}\n"
|
|
|
|
done
|
2024-01-28 18:24:38 +01:00
|
|
|
|
2024-01-30 09:17:07 +01:00
|
|
|
# Return the modified content
|
|
|
|
echo -e "${modified_content}"
|
2024-01-28 18:24:38 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
function _image() {
|
2024-01-30 09:17:07 +01:00
|
|
|
# This replaces #showimg tags with actual HTML img tags in a provided string
|
2024-01-28 18:24:38 +01:00
|
|
|
|
2024-01-30 09:17:07 +01:00
|
|
|
local content="${1}"
|
|
|
|
local modified_content=""
|
|
|
|
local debug=false
|
|
|
|
|
|
|
|
# Process the content line by line
|
|
|
|
echo "${content}" | while IFS= read -r line; do
|
|
|
|
if [[ ${line} == *"#showimg"* ]]; then
|
|
|
|
if (${debug}) echo "${red}_image: Processing line: ${line}${end}"
|
|
|
|
|
|
|
|
# Extract image link and alt text
|
|
|
|
local img_link=$(echo "${line}" | awk -F'#showimg ' '{print $2}')
|
|
|
|
local image=$(echo "${img_link}" | awk -F'¤' '{print $1}')
|
|
|
|
local img_alt=$(echo "${img_link}" | awk -F'¤' '{print $2}')
|
|
|
|
|
|
|
|
# Determine the source of the image
|
|
|
|
local real_image=""
|
|
|
|
if [[ ${image} =~ ^https?:// ]]; then
|
|
|
|
real_image=${image}
|
|
|
|
elif [[ ${image} =~ ^\/ ]]; then
|
|
|
|
real_image=${image}
|
|
|
|
else
|
|
|
|
real_image="/images/${image}"
|
|
|
|
fi
|
|
|
|
|
|
|
|
# Form the replacement HTML image tag
|
|
|
|
local img_tag="<img src=\"${real_image}\" alt=\"${img_alt}\" width=\"500\" />"
|
|
|
|
line=${line//"#showimg ${img_link}"/${img_tag}}
|
|
|
|
fi
|
|
|
|
modified_content+="${line}\n"
|
|
|
|
done
|
|
|
|
|
|
|
|
# Return the modified content
|
|
|
|
echo -e "${modified_content}"
|
2024-01-28 18:24:38 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
function _youtube() {
|
2024-01-30 09:17:07 +01:00
|
|
|
# This embeds a YouTube video in a provided string
|
2024-01-28 18:24:38 +01:00
|
|
|
|
2024-01-30 09:17:07 +01:00
|
|
|
local content="${1}"
|
|
|
|
local modified_content=""
|
|
|
|
local debug=false
|
|
|
|
|
|
|
|
# Process the content line by line
|
|
|
|
echo "${content}" | while IFS= read -r line; do
|
|
|
|
if [[ ${line} == *"#ytvideo"* ]]; then
|
|
|
|
if (${debug}) echo "${red}_youtube: Processing line: ${line}${end}"
|
|
|
|
|
|
|
|
# Extract YouTube video ID
|
|
|
|
local yt_id=$(echo "${line}" | awk -F'#ytvideo ' '{print $2}')
|
|
|
|
|
|
|
|
# Form the replacement YouTube iframe embed
|
|
|
|
local yt_iframe="<iframe width=\"560\" height=\"315\" src=\"https://www.youtube.com/embed/${yt_id}\" title=\"YouTube video player\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" allowfullscreen></iframe>"
|
|
|
|
line=${line//"#ytvideo ${yt_id}"/${yt_iframe}}
|
|
|
|
fi
|
|
|
|
modified_content+="${line}\n"
|
|
|
|
done
|
2024-01-28 18:24:38 +01:00
|
|
|
|
2024-01-30 09:17:07 +01:00
|
|
|
# Return the modified content
|
|
|
|
echo -e "${modified_content}"
|
2024-01-28 18:24:38 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
function _cleanup() {
|
|
|
|
# This removes tags used in the templates that may be left over for some reason
|
|
|
|
|
2024-01-30 09:17:07 +01:00
|
|
|
local content="${1}"
|
|
|
|
local debug=false
|
2024-01-28 18:24:38 +01:00
|
|
|
|
2024-01-30 09:17:07 +01:00
|
|
|
if (${debug}) echo "${red}_cleanup: Cleaning up tags in content${end}"
|
|
|
|
|
|
|
|
# Perform the cleanup
|
|
|
|
local cleaned_content=$(echo "${content}" | sed \
|
|
|
|
-e "s|¤||g" \
|
|
|
|
-e "s|#showimg\ ||g" \
|
|
|
|
-e "s|#ytvideo\ ||g" \
|
|
|
|
-e "s|#link\ ||g")
|
2024-01-28 18:24:38 +01:00
|
|
|
|
2024-01-30 09:17:07 +01:00
|
|
|
# Return the cleaned content
|
|
|
|
echo "${cleaned_content}"
|
2024-01-28 18:24:38 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
function _html() {
|
2024-01-30 09:39:54 +01:00
|
|
|
# This function converts formatting tags into their HTML equivalents in a provided string
|
|
|
|
|
|
|
|
local content="${1}"
|
|
|
|
local debug=false
|
2024-01-28 18:24:38 +01:00
|
|
|
|
2024-01-30 09:39:54 +01:00
|
|
|
if (${debug}) echo "${red}_html: Generating HTML from content${end}"
|
|
|
|
|
|
|
|
# Perform HTML tag substitutions
|
|
|
|
local html_content=$(echo "${content}" | sed \
|
|
|
|
-e "s|#BR|<br/>|g" \
|
|
|
|
-e "s|#BD|<b>|g" \
|
|
|
|
-e "s|#EBD|</b>|g" \
|
|
|
|
-e "s|#UN|<u>|g" \
|
|
|
|
-e "s|#EUN|</u>|g" \
|
|
|
|
-e "s|#P|<p>|g" \
|
|
|
|
-e "s|#EP|</p>|g" \
|
|
|
|
-e "s|#Q|<blockquote>|g" \
|
|
|
|
-e "s|#EQ|</blockquote>|g" \
|
|
|
|
-e "s|#STRONG|<strong>|g" \
|
|
|
|
-e "s|#ESTRONG|</strong>|g" \
|
|
|
|
-e "s|#I|<i>|g" \
|
|
|
|
-e "s|#EI|</i>|g" \
|
|
|
|
-e "s|#C|<code>|g" \
|
|
|
|
-e "s|#EC|</code>|g" \
|
|
|
|
-e "s|#EM|<em>|g" \
|
|
|
|
-e "s|#SEM|</em>|g" \
|
|
|
|
-e "s|#OT|"|g" \
|
|
|
|
-e "s|#UL|<ul>|g" \
|
|
|
|
-e "s|#OL|<ol>|g" \
|
|
|
|
-e "s|#LI|<li class=\"libody\">|g" \
|
|
|
|
-e "s|#ELI|</li>|g" \
|
|
|
|
-e "s|#EUL|</ul>|g" \
|
|
|
|
-e "s|#EOL|</ol>|g" \
|
|
|
|
-e "s|#H1|<h1>|g" \
|
|
|
|
-e "s|#H2|<h2>|g" \
|
|
|
|
-e "s|#H3|<h3>|g" \
|
|
|
|
-e "s|#H4|<h4>|g" \
|
|
|
|
-e "s|#H5|<h5>|g" \
|
|
|
|
-e "s|#H6|<h6>|g" \
|
|
|
|
-e "s|#EH1|</h1>|g" \
|
|
|
|
-e "s|#EH2|</h2>|g" \
|
|
|
|
-e "s|#EH3|</h3>|g" \
|
|
|
|
-e "s|#EH4|</h4>|g" \
|
|
|
|
-e "s|#EH5|</h5>|g" \
|
|
|
|
-e "s|#EH6|</h6>|g" \
|
|
|
|
-e "s|#LT|<|g" \
|
|
|
|
-e "s|#GT|>|g" \
|
|
|
|
-e "s|#NUM|#|g")
|
|
|
|
|
|
|
|
# Return the HTML content
|
|
|
|
echo "${html_content}"
|
2024-01-28 18:24:38 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
# Time to test the first function
|
|
|
|
echo "${green}Running function _blogs${end}"
|
|
|
|
_blogs
|
2024-01-29 21:54:20 +01:00
|
|
|
echo "${green}Running function _pages${end}"
|
|
|
|
_pages
|