static-gallery-generator/2-generate-gallery.py

112 lines
3.9 KiB
Python
Raw Permalink Normal View History

2025-01-09 16:35:41 +00:00
import os, csv, inspect, json, textwrap
from datetime import datetime
from pathlib import Path
from lib import GalleryTable
GALLERY_ID = "gallery" # e.g. <div id="gallery"/> will turn into the gallery.
2025-01-09 16:35:41 +00:00
GALLERY_CONFIG_PATH = Path(__file__, "..", "nanogallery2-config.json").resolve()
JAVASCRIPT_OUTPUT_PATH = Path(__file__, "..", "gallery", "gallery.js").resolve()
HTML_OUTPUT_PATH = Path(__file__, "..", "gallery", "index.html").resolve()
2025-01-09 16:35:41 +00:00
TABLE_PATH = Path(__file__, "..", "gallery-items.csv").resolve()
MEDIA_FOLDER = Path(__file__, "..", "media").resolve()
THUMBNAIL_FOLDER = Path(__file__, "..", "thumbs").resolve()
def format_tags(tag_string):
# Nanogallery2 expects space-separated tags,
# which isn't intuitive in cases where you
# want a tag to contain a space.
#
# So instead, this script (and the table) expects comma-separated tags,
# then trims any whitespace from the start and end,
# replaces all normal spaces with non-breaking spaces ("&nbsp;")
# automatically, and finally puts normal spaces
# inbetween each tag, the way Nanogallery2 expects them.
tags = []
for tag in tag_string.split(","):
tags.append(tag.strip().replace(" ", "&nbsp;"))
return " ".join(tags)
# If you want to use *commas* in a tag, I'm sorry.
# Please let me know. I'll find a solution.
# In the meantime, you can write "&comma;" whereever you need one.
# I just don't want to get stuck overengineering
# this any harder than I already am BEFORE I have
# something finished that most people can put to use.
#
# The setup for all this is already going to be a tall ask.
# Installing Python and FFmpeg isn't something I'd ask of a parent.
# Unless they're on Linux in which case it's like, super trivial to do.
# But that's not most parents. I think? I think.
#
# I mean, the reason this is all in Python to begin with
# is purely so I only have to write it once, and people can
# use it regardless of whether they use Windows, Linux, or Mac,
# but also still readily look inside or tweak stuff easily.
# And FFmpeg is required for the thumbnail generation stuff.
# So there *is* a point to it all, but every extra step of setup
# I ask people to do gets me worried that it'll be The step
# that makes someone give up on the whole thing...
#
# Anyway. That's why I reformat the tags here.
# It's so you can have spaces in them easystyle.
# You're welcome. Sorry again if you needed commas and stuff.
if __name__ == "__main__": # Only do this when the script is run directly
table = GalleryTable.parse_table(TABLE_PATH)
print("Found {} gallery items in {}.".format(len(table), TABLE_PATH))
try:
with open(GALLERY_CONFIG_PATH, "r") as file:
gallery_config = json.load(file)
except Exception as error:
print("Could not find/load {}:".format(GALLERY_CONFIG_PATH))
print(error)
print("Continuing with default gallery configuration.")
gallery_config = {}
gallery_items = []
print("Creating gallery javascript file...")
2025-01-09 16:35:41 +00:00
for name, entry in table.items():
gallery_items.append({
"src": "/media/" + entry["File"],
"srct": "/thumbs/" + entry["Thumbnail"],
"title": entry["Title"],
"description": entry["Description"],
"tags": format_tags(entry["Tags (with commas in-between)"])
})
gallery_config["items"] = gallery_items
output_js = inspect.cleandoc(
"""
jQuery(document).ready(function () {{
jQuery("#{gallery_id}").nanogallery2(
{gallery_config}
)
}})
"""
).format(
gallery_id=GALLERY_ID,
gallery_config=textwrap.indent(
json.dumps(
gallery_config,
indent=2
), " ")
)
try:
with open(JAVASCRIPT_OUTPUT_PATH, "w", encoding="utf-8") as js_output_file:
js_output_file.write(output_js)
print("All done!")
except Exception as error:
print("Could not write the javascript file:")
print(error)
input("Press Enter key to exit...")