summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xbin/shuriken70
-rw-r--r--share/templates/default/previewpage.tmpl14
-rw-r--r--src/lib/album-render.source.sh68
-rw-r--r--src/lib/config.validate.source.sh1
-rw-r--r--src/lib/template.source.sh1
-rwxr-xr-xtests/cli.sh12
6 files changed, 133 insertions, 33 deletions
diff --git a/bin/shuriken b/bin/shuriken
index e7109db..1b4fcf7 100755
--- a/bin/shuriken
+++ b/bin/shuriken
@@ -660,6 +660,7 @@ declare -ra TEMPLATE_RENDER_FIELD_SPECS=(
'render_photos_dir_html|context_html|photos_dir|photos_dir|splash details view'
'render_prev_html|context_html|prev|prev|prev'
'render_preview_num_html|context_html|preview_num|preview_num|preview details view'
+ 'render_preview_thumbs_html|context_raw|preview_thumbs|preview_thumbs|previewpage'
'render_redirect_page_html|context_html|redirect_page|redirect_page|redirect'
'render_show_header_bar|context_raw|show_header_bar|show_header_bar|header'
'render_stats_body_html|context_raw|stats_body|stats_body|stats'
@@ -2335,12 +2336,19 @@ render_full_preview_page() {
render_previous_page_link "$page_name" "$html_dir" "$prev_page"
fi
+ # Batch all of this page's thumbnails into ONE template call. Building the
+ # markup in bash and emitting it via the raw "preview_thumbs" field collapses
+ # what used to be N "template preview" renders (one env -i bash per
+ # thumbnail) into a single previewpage render per page.
+ local preview_thumbs=''
for photo in "$@"; do
(( ++preview_num ))
- render_preview_thumbnail \
- "$page_name" "$html_dir" "$thumbs_dir" "$backhref" \
- "$page_num" "$preview_num" "$photo"
+ append_preview_thumbnail preview_thumbs \
+ "$thumbs_dir" "$backhref" "$page_num" "$preview_num" "$photo"
done
+ template previewpage "$page_name.html" \
+ html_dir "$html_dir" \
+ preview_thumbs "$preview_thumbs"
if [ -n "$next_page" ]; then
finish_preview_page_with_next \
@@ -2404,25 +2412,58 @@ queue_preview_page_render_job() {
render_job_labels_ref["$!"]="template render job for preview $page_name"
}
-render_preview_thumbnail() {
- local -r page_name="$1"; shift
- local -r html_dir="$1"; shift
+# Append one thumbnail's markup to a page's accumulating thumbnail-grid buffer.
+# Produces exactly the bytes the old per-thumbnail preview.tmpl emitted (the
+# <a name=... href=...><img class='thumb <anim>' .../></a> block), so batching
+# all thumbnails into one previewpage render stays byte-identical. Every
+# interpolated value is HTML-escaped like the template's context_html fields; the
+# seeded "slow" animation class is preserved exactly. Blocks are separated by a
+# newline; the previewpage template adds the single trailing newline, matching
+# the old N sequential renders.
+append_preview_thumbnail() {
+ local -n buffer_ref="$1"; shift
local -r thumbs_dir="$1"; shift
local -r backhref="$1"; shift
local -r page_num="$1"; shift
local -r preview_num="$1"; shift
local -r photo_file="$1"; shift
local animation_class
+ local block
animation_class=$(random_animation_css_class slow "$photo_file")
- template preview "$page_name.html" \
- html_dir "$html_dir" \
- backhref "$backhref" \
- thumbs_dir "$thumbs_dir" \
- page_num "$page_num" \
- preview_num "$preview_num" \
- photo "$photo_file" \
- animation_class "$animation_class"
+ block=$(build_preview_thumbnail \
+ "$thumbs_dir" "$backhref" "$page_num" "$preview_num" "$photo_file" \
+ "$animation_class")
+ if [ -z "$buffer_ref" ]; then
+ buffer_ref="$block"
+ else
+ buffer_ref+=$'\n'"$block"
+ fi
+}
+
+# Render the HTML for a single preview thumbnail (HTML-escaping every value the
+# way preview.tmpl's context_html fields did). Returned without a trailing
+# newline so callers control separators.
+build_preview_thumbnail() {
+ local -r thumbs_dir="$1"; shift
+ local -r backhref="$1"; shift
+ local -r page_num="$1"; shift
+ local -r preview_num="$1"; shift
+ local -r photo_file="$1"; shift
+ local -r animation_class="$1"; shift
+ local photo_html
+ local anim_html
+ local backhref_html
+ local thumbs_dir_html
+
+ photo_html=$(_html_escape "$photo_file")
+ anim_html=$(_html_escape "$animation_class")
+ backhref_html=$(_html_escape "$backhref")
+ thumbs_dir_html=$(_html_escape "$thumbs_dir")
+ printf '<a name=%s href=%s>\n' \
+ "'$photo_html'" "'$page_num-$preview_num.html'"
+ printf " <img class='thumb %s' src='%s/%s/%s' />\n</a>" \
+ "$anim_html" "$backhref_html" "$thumbs_dir_html" "$photo_html"
}
render_view_page() {
@@ -4848,6 +4889,7 @@ validate_template_dir() {
next
prev
preview
+ previewpage
redirect
view
)
diff --git a/share/templates/default/previewpage.tmpl b/share/templates/default/previewpage.tmpl
new file mode 100644
index 0000000..9f42f84
--- /dev/null
+++ b/share/templates/default/previewpage.tmpl
@@ -0,0 +1,14 @@
+# Preview-page thumbnail grid (task wn0). The album preview page (page-N.html)
+# used to render EACH thumbnail with its own "template preview" call, paying the
+# full source_template_file cost (an "env -i bash" invocation) per thumbnail.
+# render_full_preview_page now pre-builds the markup for ALL of a page's
+# thumbnails in bash (render_preview_thumbnail / build into one string) and hands
+# the whole grid in through the raw context field render_preview_thumbs_html, so
+# this template emits every thumbnail for the page in ONE render call instead of
+# N. The per-thumbnail markup is byte-identical to the old preview.tmpl output
+# (same <a name=... href=...><img class='thumb <anim>' .../></a> structure, order
+# and seeded animation classes). The surrounding header/footer still come from
+# their own templates, which render_full_preview_page emits around this one.
+cat <<END
+${render_preview_thumbs_html}
+END
diff --git a/src/lib/album-render.source.sh b/src/lib/album-render.source.sh
index ff86727..9bae930 100644
--- a/src/lib/album-render.source.sh
+++ b/src/lib/album-render.source.sh
@@ -96,12 +96,19 @@ render_full_preview_page() {
render_previous_page_link "$page_name" "$html_dir" "$prev_page"
fi
+ # Batch all of this page's thumbnails into ONE template call. Building the
+ # markup in bash and emitting it via the raw "preview_thumbs" field collapses
+ # what used to be N "template preview" renders (one env -i bash per
+ # thumbnail) into a single previewpage render per page.
+ local preview_thumbs=''
for photo in "$@"; do
(( ++preview_num ))
- render_preview_thumbnail \
- "$page_name" "$html_dir" "$thumbs_dir" "$backhref" \
- "$page_num" "$preview_num" "$photo"
+ append_preview_thumbnail preview_thumbs \
+ "$thumbs_dir" "$backhref" "$page_num" "$preview_num" "$photo"
done
+ template previewpage "$page_name.html" \
+ html_dir "$html_dir" \
+ preview_thumbs "$preview_thumbs"
if [ -n "$next_page" ]; then
finish_preview_page_with_next \
@@ -165,25 +172,58 @@ queue_preview_page_render_job() {
render_job_labels_ref["$!"]="template render job for preview $page_name"
}
-render_preview_thumbnail() {
- local -r page_name="$1"; shift
- local -r html_dir="$1"; shift
+# Append one thumbnail's markup to a page's accumulating thumbnail-grid buffer.
+# Produces exactly the bytes the old per-thumbnail preview.tmpl emitted (the
+# <a name=... href=...><img class='thumb <anim>' .../></a> block), so batching
+# all thumbnails into one previewpage render stays byte-identical. Every
+# interpolated value is HTML-escaped like the template's context_html fields; the
+# seeded "slow" animation class is preserved exactly. Blocks are separated by a
+# newline; the previewpage template adds the single trailing newline, matching
+# the old N sequential renders.
+append_preview_thumbnail() {
+ local -n buffer_ref="$1"; shift
local -r thumbs_dir="$1"; shift
local -r backhref="$1"; shift
local -r page_num="$1"; shift
local -r preview_num="$1"; shift
local -r photo_file="$1"; shift
local animation_class
+ local block
animation_class=$(random_animation_css_class slow "$photo_file")
- template preview "$page_name.html" \
- html_dir "$html_dir" \
- backhref "$backhref" \
- thumbs_dir "$thumbs_dir" \
- page_num "$page_num" \
- preview_num "$preview_num" \
- photo "$photo_file" \
- animation_class "$animation_class"
+ block=$(build_preview_thumbnail \
+ "$thumbs_dir" "$backhref" "$page_num" "$preview_num" "$photo_file" \
+ "$animation_class")
+ if [ -z "$buffer_ref" ]; then
+ buffer_ref="$block"
+ else
+ buffer_ref+=$'\n'"$block"
+ fi
+}
+
+# Render the HTML for a single preview thumbnail (HTML-escaping every value the
+# way preview.tmpl's context_html fields did). Returned without a trailing
+# newline so callers control separators.
+build_preview_thumbnail() {
+ local -r thumbs_dir="$1"; shift
+ local -r backhref="$1"; shift
+ local -r page_num="$1"; shift
+ local -r preview_num="$1"; shift
+ local -r photo_file="$1"; shift
+ local -r animation_class="$1"; shift
+ local photo_html
+ local anim_html
+ local backhref_html
+ local thumbs_dir_html
+
+ photo_html=$(_html_escape "$photo_file")
+ anim_html=$(_html_escape "$animation_class")
+ backhref_html=$(_html_escape "$backhref")
+ thumbs_dir_html=$(_html_escape "$thumbs_dir")
+ printf '<a name=%s href=%s>\n' \
+ "'$photo_html'" "'$page_num-$preview_num.html'"
+ printf " <img class='thumb %s' src='%s/%s/%s' />\n</a>" \
+ "$anim_html" "$backhref_html" "$thumbs_dir_html" "$photo_html"
}
render_view_page() {
diff --git a/src/lib/config.validate.source.sh b/src/lib/config.validate.source.sh
index fda20f0..7519094 100644
--- a/src/lib/config.validate.source.sh
+++ b/src/lib/config.validate.source.sh
@@ -101,6 +101,7 @@ validate_template_dir() {
next
prev
preview
+ previewpage
redirect
view
)
diff --git a/src/lib/template.source.sh b/src/lib/template.source.sh
index 13a2988..cd44a45 100644
--- a/src/lib/template.source.sh
+++ b/src/lib/template.source.sh
@@ -165,6 +165,7 @@ declare -ra TEMPLATE_RENDER_FIELD_SPECS=(
'render_photos_dir_html|context_html|photos_dir|photos_dir|splash details view'
'render_prev_html|context_html|prev|prev|prev'
'render_preview_num_html|context_html|preview_num|preview_num|preview details view'
+ 'render_preview_thumbs_html|context_raw|preview_thumbs|preview_thumbs|previewpage'
'render_redirect_page_html|context_html|redirect_page|redirect_page|redirect'
'render_show_header_bar|context_raw|show_header_bar|show_header_bar|header'
'render_stats_body_html|context_raw|stats_body|stats_body|stats'
diff --git a/tests/cli.sh b/tests/cli.sh
index fdd2cec..f7ad977 100755
--- a/tests/cli.sh
+++ b/tests/cli.sh
@@ -3780,7 +3780,7 @@ test_generate_template_failure_preserves_dist() {
PATH="$fake_bin:$PATH" \
test::generate_fixture_images "$TEST_TMPDIR/incoming"
cp -R "$TEST_REPO_ROOT/share/templates/default" "$template_dir"
- printf 'return 42\n' > "$template_dir/preview.tmpl"
+ printf 'return 42\n' > "$template_dir/previewpage.tmpl"
mkdir -p "$TEST_TMPDIR/dist"
printf 'old index\n' > "$TEST_TMPDIR/dist/index.html"
test::write_album_config \
@@ -3794,7 +3794,7 @@ test_generate_template_failure_preserves_dist() {
test::capture_failure_output "$TEST_SHURIKEN" --generate
)
- test::assert_contains 'Rendering preview template into ' "$output"
+ test::assert_contains 'Rendering previewpage template into ' "$output"
test "$(<"$TEST_TMPDIR/dist/index.html")" = 'old index'
test::assert_path_absent "$TEST_TMPDIR/dist/photos/01-landscape.jpg"
test::assert_path_absent "$TEST_TMPDIR/dist/shuriken.json"
@@ -3819,7 +3819,7 @@ test_generate_templates_cannot_read_generation_locals() {
cp -R "$TEST_REPO_ROOT/share/templates/default" "$template_dir"
# shellcheck disable=SC2016
printf 'printf "legacy num: %%s\\n" "${num}"\n' \
- > "$template_dir/preview.tmpl"
+ > "$template_dir/previewpage.tmpl"
mkdir -p "$TEST_TMPDIR/dist"
printf 'old index\n' > "$TEST_TMPDIR/dist/index.html"
test::write_album_config \
@@ -3858,7 +3858,7 @@ test_generate_templates_cannot_read_renderer_internals() {
cp -R "$TEST_REPO_ROOT/share/templates/default" "$template_dir"
# shellcheck disable=SC2016
printf 'printf "context key: %%s\\n" "${context_key}"\n' \
- > "$template_dir/preview.tmpl"
+ > "$template_dir/previewpage.tmpl"
mkdir -p "$TEST_TMPDIR/dist"
printf 'old index\n' > "$TEST_TMPDIR/dist/index.html"
test::write_album_config \
@@ -3897,7 +3897,7 @@ test_generate_templates_cannot_read_serialized_context_hook() {
cp -R "$TEST_REPO_ROOT/share/templates/default" "$template_dir"
# shellcheck disable=SC2016
printf 'printf "bash env: %%s\\n" "${BASH_ENV}"\n' \
- > "$template_dir/preview.tmpl"
+ > "$template_dir/previewpage.tmpl"
mkdir -p "$TEST_TMPDIR/dist"
printf 'old index\n' > "$TEST_TMPDIR/dist/index.html"
test::write_album_config \
@@ -3932,6 +3932,7 @@ header:backhref background_image blurs_dir html_dir show_header_bar
next:html_dir next
prev:html_dir prev
preview:animation_class backhref html_dir page_num photo preview_num thumbs_dir
+previewpage:html_dir preview_thumbs
redirect:html_dir redirect_page
splash:backhref background_image blurs_dir enter_page html_dir photo photos_dir
stats:backhref html_dir stats_body
@@ -3951,6 +3952,7 @@ declare -a template_names=(
next
prev
preview
+ previewpage
redirect
splash
stats