rebuild_tags(): use array for more robust file handling

This commit is contained in:
Martijn Dekker 2016-03-09 05:26:20 +01:00
parent e3cf406bd1
commit a674ec5837
1 changed files with 19 additions and 14 deletions

33
bb.sh
View File

@ -729,8 +729,8 @@ tags_in_post() {
}
# Finds all posts referenced in a number of tags.
# Arguments are tags
# Prints one line with space-separated tags to stdout
# Arguments are tags.
# Prints file names to stdout, one per line.
posts_with_tags() {
(($# < 1)) && return
set -- "${@/#/$prefix_tags}"
@ -748,31 +748,35 @@ posts_with_tags() {
# rebuild_tags "one_post.html another_article.html" "example-tag another-tag"
# mind the quotes!
rebuild_tags() {
if (($# < 2)); then
local IFS=$'\n' # word splitting only on newline; make $* expand with newline as separator
if (($# < 1)); then
# will process all files and tags
files=$(ls -t ./*.html)
files=( $(ls -t ./*.html) )
all_tags=yes
else
# will process only given files and tags
files=$(printf '%s\n' $1 | sort -u)
files=$(ls -t $files)
tags=$2
for ((i=1; i<=$#; i++)); do
[[ ${!i} == --tags ]] && break
done
files=( $(ls -t $(sort -u <<< "${*:1:$((i-1))}")) )
tags=( "${@:$((i+1)):$#}" )
all_tags=''
fi
echo -n "Rebuilding tag pages "
n=0
if [[ -n $all_tags ]]; then
rm ./"$prefix_tags"*.html &> /dev/null
rm -f ./"$prefix_tags"*.html
else
for i in $tags; do
rm "./$prefix_tags$i.html" &> /dev/null
for i in "${tags[@]}"; do
rm -f "./$prefix_tags$i.html"
done
fi
# First we will process all files and create temporal tag files
# with just the content of the posts
tmpfile=tmp.$RANDOM
while [[ -f $tmpfile ]]; do tmpfile=tmp.$RANDOM; done
while IFS='' read -r i; do
is_boilerplate_file "$i" && continue;
for i in "${files[@]}"; do
is_boilerplate_file "$i" && continue
echo -n "."
if [[ -n $cut_do ]]; then
get_html_file_content 'entry' 'entry' 'cut' <"$i" | awk "/$cut_line/ { print \"<p class=\\\"readmore\\\"><a href=\\\"$i\\\">$template_read_more</a></p>\" ; next } 1"
@ -780,11 +784,12 @@ rebuild_tags() {
get_html_file_content 'entry' 'entry' <"$i"
fi >"$tmpfile"
for tag in $(tags_in_post "$i"); do
if [[ -n $all_tags || " $tags " == *" $tag "* ]]; then
# if either all tags or array tags[] contains $tag...
if [[ -n $all_tags || $'\n'"${tags[*]}"$'\n' == *$'\n'"$tag"$'\n'* ]]; then
cat "$tmpfile" >> "$prefix_tags$tag".tmp.html
fi
done
done <<< "$files"
done
rm "$tmpfile"
# Now generate the tag files with headers, footers, etc
while IFS='' read -r i; do