diff --git a/build.sh b/build.sh index 6c492ec..c5f17e8 100755 --- a/build.sh +++ b/build.sh @@ -15,6 +15,15 @@ # two directories: 'source' (which holds your Markdown files) and 'output' (which holds the # converted CSS. # +# -------------------------------------------------------------------------- +# IMPORTANT - Each Markdown file MUST be in it's own directory! +# -------------------------------------------------------------------------- +# This is because of the way I handle conversion. The conversion occurs +# concurrently, and each file is copied into the same temporary location. +# Each file is placed into a directory with the same name as the parent +# directory. +# -------------------------------------------------------------------------- +# # In addition to these directories, three files are needed in 'website': # 1. 'header.html' - A header, which is prepended to every source file. Unfortunately, this must # be written in regular HTML. @@ -98,39 +107,41 @@ add_date_to_array() { } add_header_and_footer() { -# Copy header to temporary location - cp "$BASE_PATH/header.html" "$BASE_PATH/temp/temp_header.html" +# Copy header to temporary location - 'parent_dir' is used to ensure that +# each temporary header is in its own directory + cp "$BASE_PATH/header.html" "$BASE_PATH/temp/$parent_dir/temp_header.html" # Check for relevant metadata, and perform corresponding action if [[ ! -v "meta_array["date"]" ]]; then # If there is no date - sed -i '$ d' "$BASE_PATH/temp/temp_header.html" # remove the 'date published' section of the header + sed -i '$ d' "$BASE_PATH/temp/$parent_dir/temp_header.html" # remove the 'date published' section of the header fi if [[ "${meta_array[noappend]-}" == "true" ]]; then - sed -i 's/ - Two More Cents//g' "$BASE_PATH/temp/temp_header.html" # 'noappend' removes the suffix from the title + sed -i 's/ - Two More Cents//g' "$BASE_PATH/temp/$parent_dir/temp_header.html" # 'noappend' removes the suffix from the title fi # Add header - cat "$BASE_PATH/temp/temp_header.html" | cat - "$1" > "$BASE_PATH/temp/temp.html" + cat "$BASE_PATH/temp/$parent_dir/temp_header.html" | cat - "$1" > "$BASE_PATH/temp/$parent_dir/temp.html" # Add footer - echo >> "$BASE_PATH/temp/temp.html" # Add newline - cat "$BASE_PATH/footer.html" >> "$BASE_PATH/temp/temp.html" + echo >> "$BASE_PATH/temp/$parent_dir/temp.html" # Add newline + cat "$BASE_PATH/footer.html" >> "$BASE_PATH/temp/$parent_dir/temp.html" # Move temp file to original location - mv "$BASE_PATH/temp/temp.html" "$1" + mv "$BASE_PATH/temp/$parent_dir/temp.html" "$1" } add_header_and_footer_to_index() { + mkdir "$BASE_PATH/temp/index_page" # Add header - cat "$BASE_PATH/header.html" | head -n -1 | cat - "$1" > "$BASE_PATH/temp/temp.html" # For the index page, remove the last line of the header (date published) + cat "$BASE_PATH/header.html" | head -n -1 | cat - "$1" > "$BASE_PATH/temp/index_page/temp.html" # For the index page, remove the last line of the header (date published) # Add footer - echo >> "$BASE_PATH/temp/temp.html" # Add newline - cat "$BASE_PATH/footer.html" >> "$BASE_PATH/temp/temp.html" + echo >> "$BASE_PATH/temp/index_page/temp.html" # Add newline + cat "$BASE_PATH/footer.html" >> "$BASE_PATH/temp/index_page/temp.html" # Move temp file to original location - mv "$BASE_PATH/temp/temp.html" "$1" + mv "$BASE_PATH/temp/index_page/temp.html" "$1" } replace_vars() { @@ -142,62 +153,60 @@ replace_vars() { } -md_to_html() { -# Convert .md files from 'source' and place them into the correct locations into 'output' -# Since the conversion is the slowest part of the script, I run each conversion process -# in a separate thread (first loop). Then I wait for all of them to finish, and add the -# header and footers and replace the variables in each converted document (second loop). - local files=$(find "$BASE_PATH/source" -name "*.md") - - for file in $files; do +convert_file() { +# Helper function for md_to_html(). It takes in the file to convert as an argument, +# and converts that file. + file_to_conv="$1" + echo "Converting $file_to_conv" - echo "Converting $file" + read_metadata "$file_to_conv" # Sets the 'metadata' variable - read_metadata "$file" # Sets the 'metadata' variable +# Generate a random 8-character alphabetic string, until we find +# one that doesn't exist in the 'temp' directory. This string +# will serve as the parent directory of our file. + parent_dir="$(tr -dc A-Za-z "${path_for_output}") & +# Convert the file (using the given filters), and place the output in the correct location. + pandoc --lua-filter "$BASE_PATH"/pandoc_filters/* -f markdown --wrap=preserve "$BASE_PATH/temp/$parent_dir/$(basename "$file_to_conv")" > "${path_for_output}" - unset metadata - done + convert_to_array "$metadata" #Sets the 'meta_array' array -# Wait for all documents to finish converting, then remove all temporary files. - wait - rm "$BASE_PATH"/temp/* - - for file in $files; do -# This function was already called above in the previous loop. -# However, I need to call it again, since I need the metadata -# again for each file to create the 'meta_array' variable. - read_metadata "$file" # Sets the 'metadata' variable + add_date_to_array "$file_to_conv" #Uses 'meta_array' array + add_header_and_footer "$path_for_output" # Uses 'meta_array' array and 'parent_dir' variable + replace_vars "$path_for_output" #Uses 'meta_array' array - convert_to_array "$metadata" #Sets the 'meta_array' array - add_date_to_array "$file" #Uses 'meta_array' array + unset metadata meta_key meta_value meta_array path_for_output -# Construct path for output file. This is the same path that the converted -# document is written to, in the loop above. - local path_for_output=$(realpath --relative-to="${BASE_PATH}/source" "$file") - path_for_output="${BASE_PATH}/output/${path_for_output}" - path_for_output="$(dirname $path_for_output)/$(basename $path_for_output .md).html" +} - add_header_and_footer "$path_for_output" # Uses 'meta_array' array - replace_vars "$path_for_output" #Uses 'meta_array' array +md_to_html() { +# Convert .md files from 'source' and place them into the correct locations into 'output' + local files=$(find "$BASE_PATH/source" -name "*.md") - unset metadata meta_key meta_value meta_array +# Concurrently convert each document + for file in $files; do + (convert_file "$file") & + unset metadata path_for_output done -} +# Wait for all documents to finish converting, then remove all temporary files. + wait + rm -rf "$BASE_PATH"/temp/* +} gen_sorted_file_list() { # Generate a list of the HTMl files, sorted by when they were last modified (read from the contents of the HTML file) local files=$(find "$BASE_PATH/output" -name "*.html")