added webmanifest support

This commit is contained in:
2024-07-09 08:38:38 +02:00
committed by Flo Greistorfer
parent 6ef4c6ddf3
commit 14b8cc5fe6
12 changed files with 357 additions and 311 deletions

2
.gitignore vendored
View File

@@ -164,3 +164,5 @@ cython_debug/
test/.static test/.static
test/.thumbnails test/.thumbnails
test/**/index.html test/**/index.html
test/**/.sizelist.json
test/manifest.json

View File

@@ -16,6 +16,7 @@
- **Selective File Extensions:** Ability to specify which file extensions to include in the gallery. - **Selective File Extensions:** Ability to specify which file extensions to include in the gallery.
- **Ignore Other Files:** Option to ignore files other than those specified by the included extensions. - **Ignore Other Files:** Option to ignore files other than those specified by the included extensions.
- **Info Tooltips:** Display additional information as tooltips for images if an `info` file is present in the directory. - **Info Tooltips:** Display additional information as tooltips for images if an `info` file is present in the directory.
- **Generate Web Manifest:** Ability to generate a web manifest file for PWA (Progressive Web App) support.
## Requirements ## Requirements
@@ -25,13 +26,14 @@
- `Jinja2` library - `Jinja2` library
- `Pillow` library - `Pillow` library
- `rich_argparse` library - `rich_argparse` library
- `cairosvg` library (for SVG to PNG icon conversion)
## Installation ## Installation
Install the required libraries using pip: Install the required libraries using pip:
```sh ```sh
pip install numpy tqdm Jinja2 Pillow rich-argparse pip install numpy tqdm Jinja2 Pillow rich-argparse cairosvg
``` ```
## Usage ## Usage
@@ -56,6 +58,7 @@ The script supports several command-line options to customize its behavior. Belo
- `--ignore-other-files`: Ignore files that do not match the specified extensions. - `--ignore-other-files`: Ignore files that do not match the specified extensions.
- `--exclude-folder FOLDER`: Specify folders to exclude from processing. This option can be specified multiple times. - `--exclude-folder FOLDER`: Specify folders to exclude from processing. This option can be specified multiple times.
- `--version`: Show the version number of the script and exit. - `--version`: Show the version number of the script and exit.
- `-m, --web-manifest`: Generate a web manifest file.
### Examples ### Examples
@@ -89,6 +92,12 @@ To exclude specific folders and specify file extensions:
./builder.py -p /data/pictures -w https://pictures.example.com -t "My Photo Gallery" --exclude-folder Archives --exclude-folder Temp -e .jpg -e .jpeg -e .png ./builder.py -p /data/pictures -w https://pictures.example.com -t "My Photo Gallery" --exclude-folder Archives --exclude-folder Temp -e .jpg -e .jpeg -e .png
``` ```
To generate a web manifest file:
```sh
./builder.py -p /data/pictures -w https://pictures.example.com -t "My Photo Gallery" -m
```
## Notes ## Notes
- The root and web root paths must point to the same folder, one on the filesystem and one on the web server. Use absolute paths. - The root and web root paths must point to the same folder, one on the filesystem and one on the web server. Use absolute paths.

View File

@@ -29,6 +29,30 @@
"gitblame.inlineMessageEnabled": true, "gitblame.inlineMessageEnabled": true,
"gitblame.inlineMessageFormat": "${author.name}, ${time.ago} • ${commit.summary}", "gitblame.inlineMessageFormat": "${author.name}, ${time.ago} • ${commit.summary}",
"gitblame.statusBarMessageFormat": "${author.name} (${time.ago})", "gitblame.statusBarMessageFormat": "${author.name} (${time.ago})",
"html.format.templating": true,
"html.format.wrapAttributes": "preserve",
"html.format.wrapLineLength": 200,
"html.format.indentHandlebars": true,
"html.suggest.html5": true,
"html.hover.documentation": true,
"html.validate.scripts": true,
"html.validate.styles": true,
"prettier.htmlWhitespaceSensitivity": "css",
"json.schemaDownload.enable": true,
"json.schemas": [
{
"fileMatch": [
"manifest.json.j2"
],
"url": "https://json.schemastore.org/web-manifest-combined.json"
}
],
"emmet.includeLanguages": {
"jinja-html": "html",
"jinja-css": "css",
"jinja-js": "javascript",
"jinja-json": "json"
},
"[python]": { "[python]": {
"editor.defaultFormatter": "ms-python.black-formatter" "editor.defaultFormatter": "ms-python.black-formatter"
}, },
@@ -41,10 +65,9 @@
"[jinja-css]": { "[jinja-css]": {
"editor.defaultFormatter": "vscode.css-language-features" "editor.defaultFormatter": "vscode.css-language-features"
}, },
"html.format.templating": true, "[jinja-js]": {
"html.format.wrapAttributes": "preserve", "editor.defaultFormatter": "esbenp.prettier-vscode"
"html.format.wrapLineLength": 200, },
"html.format.indentHandlebars": true
}, },
"extensions": { "extensions": {
"recommendations": [ "recommendations": [
@@ -76,8 +99,9 @@
"-t", "-t",
"Pictures", "Pictures",
"--theme", "--theme",
"themes/kjoe.css", "themes/default.css",
"--use-fancy-folders", "--use-fancy-folders",
"--web-manifest",
"-n" "-n"
], ],
"postDebugTask": "Delete Lockfile" "postDebugTask": "Delete Lockfile"
@@ -98,6 +122,7 @@
"--theme", "--theme",
"themes/kjoe.css", "themes/kjoe.css",
"--use-fancy-folders", "--use-fancy-folders",
"--web-manifest",
"-n" "-n"
], ],
"postDebugTask": "Delete Lockfile 2" "postDebugTask": "Delete Lockfile 2"

View File

@@ -14,6 +14,14 @@ from tqdm.auto import tqdm
from PIL import Image from PIL import Image
from rich_argparse import RichHelpFormatter, HelpPreviewAction from rich_argparse import RichHelpFormatter, HelpPreviewAction
try:
import cairosvg
from io import BytesIO
svgsupport = True
except:
svgsupport = False
import cclicense import cclicense
# fmt: off # fmt: off
@@ -23,11 +31,12 @@ FAVICON_PATH = ".static/favicon.ico"
GLOBAL_CSS_PATH = ".static/global.css" GLOBAL_CSS_PATH = ".static/global.css"
DEFAULT_THEME_PATH = os.path.join(os.path.abspath(os.path.dirname(__file__)), "themes", "default.css") DEFAULT_THEME_PATH = os.path.join(os.path.abspath(os.path.dirname(__file__)), "themes", "default.css")
DEFAULT_AUTHOR = "Author" DEFAULT_AUTHOR = "Author"
VERSION = "1.8.1" VERSION = "1.9.0"
RAW_EXTENSIONS = [".3fr", ".ari", ".arw", ".bay", ".braw", ".crw", ".cr2", ".cr3", ".cap", ".data", ".dcs", ".dcr", ".dng", ".drf", ".eip", ".erf", ".fff", ".gpr", ".iiq", ".k25", ".kdc", ".mdc", ".mef", ".mos", ".mrw", ".nef", ".nrw", ".obm", ".orf", ".pef", ".ptx", ".pxn", ".r3d", ".raf", ".raw", ".rwl", ".rw2", ".rwz", ".sr2", ".srf", ".srw", ".tif", ".tiff", ".x3f"] RAW_EXTENSIONS = [".3fr", ".ari", ".arw", ".bay", ".braw", ".crw", ".cr2", ".cr3", ".cap", ".data", ".dcs", ".dcr", ".dng", ".drf", ".eip", ".erf", ".fff", ".gpr", ".iiq", ".k25", ".kdc", ".mdc", ".mef", ".mos", ".mrw", ".nef", ".nrw", ".obm", ".orf", ".pef", ".ptx", ".pxn", ".r3d", ".raf", ".raw", ".rwl", ".rw2", ".rwz", ".sr2", ".srf", ".srw", ".tif", ".tiff", ".x3f"]
IMG_EXTENSIONS = [".jpg", ".jpeg"] IMG_EXTENSIONS = [".jpg", ".jpeg"]
EXCLUDES = [".lock", "index.html", ".sizelist.json", ".thumbnails", ".static"] EXCLUDES = [".lock", "index.html", "manifest.json", ".sizelist.json", ".thumbnails", ".static"]
NOT_LIST = ["*/Galleries/*", "Archives"] NOT_LIST = ["*/Galleries/*", "Archives"]
ICON_SIZES = ["36x36", "48x48", "72x72", "96x96", "144x144", "192x192", "512x512"]
# fmt: on # fmt: on
# Initialize Jinja2 environment # Initialize Jinja2 environment
@@ -36,19 +45,26 @@ thumbnails: List[Tuple[str, str]] = []
info: Dict[str, str] = {} info: Dict[str, str] = {}
class Icon:
src: str
type: str
sizes: str
class Args: class Args:
root_directory: str
web_root_url: str
site_title: str
regenerate_thumbnails: bool
non_interactive_mode: bool
use_fancy_folders: bool
license_type: Optional[str]
author_name: str author_name: str
file_extensions: List[str]
theme_path: str
ignore_other_files: bool
exclude_folders: List[str] exclude_folders: List[str]
file_extensions: List[str]
generate_webmanifest: bool
ignore_other_files: bool
license_type: Optional[str]
non_interactive_mode: bool
regenerate_thumbnails: bool
root_directory: str
site_title: str
theme_path: str
use_fancy_folders: bool
web_root_url: str
# fmt: off # fmt: off
@@ -62,6 +78,7 @@ def parse_arguments() -> Args:
parser.add_argument("-l", "--license-type", help="Specify the license type for the images.", choices=["cc-zero", "cc-by", "cc-by-sa", "cc-by-nd", "cc-by-nc", "cc-by-nc-sa", "cc-by-nc-nd"], default=None, dest="license_type", metavar="LICENSE") parser.add_argument("-l", "--license-type", help="Specify the license type for the images.", choices=["cc-zero", "cc-by", "cc-by-sa", "cc-by-nd", "cc-by-nc", "cc-by-nc-sa", "cc-by-nc-nd"], default=None, dest="license_type", metavar="LICENSE")
parser.add_argument("-a", "--author-name", help="Name of the author of the images.", default=DEFAULT_AUTHOR, type=str, dest="author_name", metavar="AUTHOR") parser.add_argument("-a", "--author-name", help="Name of the author of the images.", default=DEFAULT_AUTHOR, type=str, dest="author_name", metavar="AUTHOR")
parser.add_argument("-e", "--file-extensions", help="File extensions to include (can be specified multiple times).", action="append", dest="file_extensions", metavar="EXTENSION") parser.add_argument("-e", "--file-extensions", help="File extensions to include (can be specified multiple times).", action="append", dest="file_extensions", metavar="EXTENSION")
parser.add_argument("-m", "--web-manifest", help="Generate a web manifest file.", action="store_true", default=False, dest="generate_webmanifest")
parser.add_argument("--theme-path", help="Path to the CSS theme file.", default=DEFAULT_THEME_PATH, type=str, dest="theme_path", metavar="PATH") parser.add_argument("--theme-path", help="Path to the CSS theme file.", default=DEFAULT_THEME_PATH, type=str, dest="theme_path", metavar="PATH")
parser.add_argument("--use-fancy-folders", help="Enable fancy folder view instead of the default Apache directory listing.", action="store_true", default=False, dest="use_fancy_folders") parser.add_argument("--use-fancy-folders", help="Enable fancy folder view instead of the default Apache directory listing.", action="store_true", default=False, dest="use_fancy_folders")
parser.add_argument("--ignore-other-files", help="Ignore files that do not match the specified extensions.", action="store_true", default=False, dest="ignore_other_files") parser.add_argument("--ignore-other-files", help="Ignore files that do not match the specified extensions.", action="store_true", default=False, dest="ignore_other_files")
@@ -70,18 +87,19 @@ def parse_arguments() -> Args:
parser.add_argument("--generate-help-preview", action=HelpPreviewAction, path="help.svg") parser.add_argument("--generate-help-preview", action=HelpPreviewAction, path="help.svg")
parsed_args = parser.parse_args() parsed_args = parser.parse_args()
_args = Args() _args = Args()
_args.root_directory = parsed_args.root_directory
_args.web_root_url = parsed_args.web_root_url
_args.site_title = parsed_args.site_title
_args.regenerate_thumbnails = parsed_args.regenerate_thumbnails
_args.non_interactive_mode = parsed_args.non_interactive_mode
_args.use_fancy_folders = parsed_args.use_fancy_folders
_args.license_type = parsed_args.license_type
_args.author_name = parsed_args.author_name _args.author_name = parsed_args.author_name
_args.file_extensions = parsed_args.file_extensions
_args.theme_path = parsed_args.theme_path
_args.ignore_other_files = parsed_args.ignore_other_files
_args.exclude_folders = parsed_args.exclude_folders _args.exclude_folders = parsed_args.exclude_folders
_args.file_extensions = parsed_args.file_extensions
_args.generate_webmanifest = parsed_args.generate_webmanifest
_args.ignore_other_files = parsed_args.ignore_other_files
_args.license_type = parsed_args.license_type
_args.non_interactive_mode = parsed_args.non_interactive_mode
_args.regenerate_thumbnails = parsed_args.regenerate_thumbnails
_args.root_directory = parsed_args.root_directory
_args.site_title = parsed_args.site_title
_args.theme_path = parsed_args.theme_path
_args.use_fancy_folders = parsed_args.use_fancy_folders
_args.web_root_url = parsed_args.web_root_url
return _args return _args
# fmt: on # fmt: on
@@ -105,6 +123,58 @@ def copy_static_files(_args: Args) -> None:
shutil.copyfile(_args.theme_path, os.path.join(_args.root_directory, ".static", "theme.css")) shutil.copyfile(_args.theme_path, os.path.join(_args.root_directory, ".static", "theme.css"))
def webmanifest(_args: Args) -> None:
icons: List[Icon] = []
files = os.listdir(os.path.join(STATIC_FILES_DIR, "icons"))
if svgsupport and any(file.endswith(".svg") for file in files):
svg = [file for file in files if file.endswith(".svg")][0]
icons.append({"src": f"/icons/svg", "type": "image/svg+xml", "sizes": "any"})
for size in ICON_SIZES:
tmpimg = BytesIO()
sizes = size.split("x")
iconpath = os.path.join(_args.root_directory, ".static", "icons", os.path.splitext(svg)[0] + "-" + size + ".png")
cairosvg.svg2png(
url=os.path.join(STATIC_FILES_DIR, "icons", svg),
write_to=tmpimg,
output_width=int(sizes[0]),
output_height=int(sizes[1]),
scale=1,
)
with Image.open(tmpimg) as iconfile:
iconfile.save(iconpath, format="PNG")
icons.append({"src": iconpath, "sizes": size, "type": "image/png"})
else:
for icon in os.listdir(os.path.join(STATIC_FILES_DIR, "icons")):
if not icon.endswith(".png"):
continue
with Image.open(os.path.join(STATIC_FILES_DIR, "icons", icon)) as iconfile:
iconsize = f"{iconfile.size[0]}x{iconfile.size[1]}"
icons.append({"src": f".static/pwa/icons/{icon}", "sizes": iconsize, "type": "image/png"})
if len(icons) == 0:
print("No icons found in the static/icons folder!")
return
site_id = urllib.parse.quote(_args.web_root_url.replace("https://", "").replace("http://", "").replace("/", ""))
with open(os.path.join(_args.root_directory, ".static", "theme.css")) as f:
content = f.read()
background_color = (
content.replace("body{", "body {").split("body {")[1].split("}")[0].split("background-color:")[1].split(";")[0].strip()
)
theme_color = (
content.replace(".navbar{", "navbar {").split(".navbar {")[1].split("}")[0].split("background-color:")[1].split(";")[0].strip()
)
with open(os.path.join(_args.root_directory, "manifest.json"), "w", encoding="utf-8") as f:
manifest = env.get_template("manifest.json.j2")
content = manifest.render(
name=_args.site_title,
icons=icons,
id=site_id,
background_color=background_color,
theme_color=theme_color,
)
f.write(content)
def generate_thumbnail(arguments: Tuple[str, str]) -> None: def generate_thumbnail(arguments: Tuple[str, str]) -> None:
folder, item = arguments folder, item = arguments
path = os.path.join(args.root_directory, ".thumbnails", folder.removeprefix(args.root_directory), os.path.splitext(item)[0]) + ".jpg" path = os.path.join(args.root_directory, ".thumbnails", folder.removeprefix(args.root_directory), os.path.splitext(item)[0]) + ".jpg"
@@ -250,6 +320,7 @@ def list_folder(folder: str, title: str) -> None:
images=image_chunks, images=image_chunks,
info=_info, info=_info,
allimages=images, allimages=images,
webmanifest=args.generate_webmanifest,
) )
f.write(content) f.write(content)
else: else:
@@ -277,6 +348,10 @@ def main() -> None:
print("Copying static files...") print("Copying static files...")
copy_static_files(args) copy_static_files(args)
if args.generate_webmanifest:
print("Generating webmanifest...")
webmanifest(args)
if args.non_interactive_mode: if args.non_interactive_mode:
print("Generating HTML files...") print("Generating HTML files...")
list_folder(args.root_directory, args.site_title) list_folder(args.root_directory, args.site_title)

27
files/icons/icon.svg Normal file
View File

@@ -0,0 +1,27 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Uploaded to: SVG Repo, www.svgrepo.com, Generator: SVG Repo Mixer Tools -->
<svg
fill="#000000"
height="800px"
width="800px"
version="1.1"
id="Capa_1"
viewBox="0 0 307.308 307.308"
xml:space="preserve"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<defs
id="defs1" />
<g
id="_x31_1-DSLR_Camera">
<path
d="M284.909,66.146h-81.345l-16.426-27.595c-1.607-2.698-4.514-4.351-7.654-4.351h-51.662c-3.14,0-6.048,1.653-7.654,4.351 l-16.426,27.595H77.049v-6.082c0-4.919-3.988-8.907-8.907-8.907H35.185c-4.92,0-8.907,3.988-8.907,8.907v6.082h-3.88 C10.027,66.146,0,76.174,0,88.543v162.166c0,12.37,10.027,22.398,22.397,22.398h262.512c12.37,0,22.398-10.028,22.398-22.398 V88.543C307.308,76.174,297.279,66.146,284.909,66.146z M153.653,233.379c-35.21,0-63.753-28.543-63.753-63.754 c0-35.209,28.543-63.753,63.753-63.753c35.21,0,63.753,28.544,63.753,63.753C217.406,204.836,188.863,233.379,153.653,233.379z M270.935,112.322h-27.91c-4.919,0-8.907-3.988-8.907-8.908c0-4.92,3.988-8.908,8.907-8.908h27.91c4.921,0,8.908,3.988,8.908,8.908 C279.843,108.334,275.855,112.322,270.935,112.322z"
id="path1" />
<circle
cx="153.653"
cy="169.625"
r="44.538"
id="circle1" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.3 KiB

327
help.svg
View File

@@ -1,6 +1,7 @@
<svg class="rich-terminal" viewBox="0 0 1482 757.5999999999999" xmlns="http://www.w3.org/2000/svg"> <svg class="rich-terminal" viewBox="0 0 1482 806.4" xmlns="http://www.w3.org/2000/svg">
<!-- Generated with Rich https://www.textualize.io --> <!-- Generated with Rich https://www.textualize.io -->
<style> <style>
@font-face { @font-face {
font-family: "Fira Code"; font-family: "Fira Code";
src: local("FiraCode-Regular"), src: local("FiraCode-Regular"),
@@ -9,7 +10,6 @@
font-style: normal; font-style: normal;
font-weight: 400; font-weight: 400;
} }
@font-face { @font-face {
font-family: "Fira Code"; font-family: "Fira Code";
src: local("FiraCode-Bold"), src: local("FiraCode-Bold"),
@@ -19,269 +19,164 @@
font-weight: 700; font-weight: 700;
} }
.terminal-3216112738-matrix { .terminal-3756623299-matrix {
font-family: Fira Code, monospace; font-family: Fira Code, monospace;
font-size: 20px; font-size: 20px;
line-height: 24.4px; line-height: 24.4px;
font-variant-east-asian: full-width; font-variant-east-asian: full-width;
} }
.terminal-3216112738-title { .terminal-3756623299-title {
font-size: 18px; font-size: 18px;
font-weight: bold; font-weight: bold;
font-family: arial; font-family: arial;
} }
.terminal-3216112738-r1 { .terminal-3756623299-r1 { fill: #ff8700 }
fill: #ff8700 .terminal-3756623299-r2 { fill: #c5c8c6 }
} .terminal-3756623299-r3 { fill: #808080 }
.terminal-3756623299-r4 { fill: #68a0b3 }
.terminal-3216112738-r2 { .terminal-3756623299-r5 { fill: #00af87 }
fill: #c5c8c6
}
.terminal-3216112738-r3 {
fill: #808080
}
.terminal-3216112738-r4 {
fill: #68a0b3
}
.terminal-3216112738-r5 {
fill: #00af87
}
</style> </style>
<defs> <defs>
<clipPath id="terminal-3216112738-clip-terminal"> <clipPath id="terminal-3756623299-clip-terminal">
<rect x="0" y="0" width="1463.0" height="706.5999999999999" /> <rect x="0" y="0" width="1463.0" height="755.4" />
</clipPath> </clipPath>
<clipPath id="terminal-3216112738-line-0"> <clipPath id="terminal-3756623299-line-0">
<rect x="0" y="1.5" width="1464" height="24.65" /> <rect x="0" y="1.5" width="1464" height="24.65"/>
</clipPath> </clipPath>
<clipPath id="terminal-3216112738-line-1"> <clipPath id="terminal-3756623299-line-1">
<rect x="0" y="25.9" width="1464" height="24.65" /> <rect x="0" y="25.9" width="1464" height="24.65"/>
</clipPath> </clipPath>
<clipPath id="terminal-3216112738-line-2"> <clipPath id="terminal-3756623299-line-2">
<rect x="0" y="50.3" width="1464" height="24.65" /> <rect x="0" y="50.3" width="1464" height="24.65"/>
</clipPath> </clipPath>
<clipPath id="terminal-3216112738-line-3"> <clipPath id="terminal-3756623299-line-3">
<rect x="0" y="74.7" width="1464" height="24.65" /> <rect x="0" y="74.7" width="1464" height="24.65"/>
</clipPath> </clipPath>
<clipPath id="terminal-3216112738-line-4"> <clipPath id="terminal-3756623299-line-4">
<rect x="0" y="99.1" width="1464" height="24.65" /> <rect x="0" y="99.1" width="1464" height="24.65"/>
</clipPath> </clipPath>
<clipPath id="terminal-3216112738-line-5"> <clipPath id="terminal-3756623299-line-5">
<rect x="0" y="123.5" width="1464" height="24.65" /> <rect x="0" y="123.5" width="1464" height="24.65"/>
</clipPath> </clipPath>
<clipPath id="terminal-3216112738-line-6"> <clipPath id="terminal-3756623299-line-6">
<rect x="0" y="147.9" width="1464" height="24.65" /> <rect x="0" y="147.9" width="1464" height="24.65"/>
</clipPath> </clipPath>
<clipPath id="terminal-3216112738-line-7"> <clipPath id="terminal-3756623299-line-7">
<rect x="0" y="172.3" width="1464" height="24.65" /> <rect x="0" y="172.3" width="1464" height="24.65"/>
</clipPath> </clipPath>
<clipPath id="terminal-3216112738-line-8"> <clipPath id="terminal-3756623299-line-8">
<rect x="0" y="196.7" width="1464" height="24.65" /> <rect x="0" y="196.7" width="1464" height="24.65"/>
</clipPath> </clipPath>
<clipPath id="terminal-3216112738-line-9"> <clipPath id="terminal-3756623299-line-9">
<rect x="0" y="221.1" width="1464" height="24.65" /> <rect x="0" y="221.1" width="1464" height="24.65"/>
</clipPath> </clipPath>
<clipPath id="terminal-3216112738-line-10"> <clipPath id="terminal-3756623299-line-10">
<rect x="0" y="245.5" width="1464" height="24.65" /> <rect x="0" y="245.5" width="1464" height="24.65"/>
</clipPath> </clipPath>
<clipPath id="terminal-3216112738-line-11"> <clipPath id="terminal-3756623299-line-11">
<rect x="0" y="269.9" width="1464" height="24.65" /> <rect x="0" y="269.9" width="1464" height="24.65"/>
</clipPath> </clipPath>
<clipPath id="terminal-3216112738-line-12"> <clipPath id="terminal-3756623299-line-12">
<rect x="0" y="294.3" width="1464" height="24.65" /> <rect x="0" y="294.3" width="1464" height="24.65"/>
</clipPath> </clipPath>
<clipPath id="terminal-3216112738-line-13"> <clipPath id="terminal-3756623299-line-13">
<rect x="0" y="318.7" width="1464" height="24.65" /> <rect x="0" y="318.7" width="1464" height="24.65"/>
</clipPath> </clipPath>
<clipPath id="terminal-3216112738-line-14"> <clipPath id="terminal-3756623299-line-14">
<rect x="0" y="343.1" width="1464" height="24.65" /> <rect x="0" y="343.1" width="1464" height="24.65"/>
</clipPath> </clipPath>
<clipPath id="terminal-3216112738-line-15"> <clipPath id="terminal-3756623299-line-15">
<rect x="0" y="367.5" width="1464" height="24.65" /> <rect x="0" y="367.5" width="1464" height="24.65"/>
</clipPath> </clipPath>
<clipPath id="terminal-3216112738-line-16"> <clipPath id="terminal-3756623299-line-16">
<rect x="0" y="391.9" width="1464" height="24.65" /> <rect x="0" y="391.9" width="1464" height="24.65"/>
</clipPath> </clipPath>
<clipPath id="terminal-3216112738-line-17"> <clipPath id="terminal-3756623299-line-17">
<rect x="0" y="416.3" width="1464" height="24.65" /> <rect x="0" y="416.3" width="1464" height="24.65"/>
</clipPath> </clipPath>
<clipPath id="terminal-3216112738-line-18"> <clipPath id="terminal-3756623299-line-18">
<rect x="0" y="440.7" width="1464" height="24.65" /> <rect x="0" y="440.7" width="1464" height="24.65"/>
</clipPath> </clipPath>
<clipPath id="terminal-3216112738-line-19"> <clipPath id="terminal-3756623299-line-19">
<rect x="0" y="465.1" width="1464" height="24.65" /> <rect x="0" y="465.1" width="1464" height="24.65"/>
</clipPath> </clipPath>
<clipPath id="terminal-3216112738-line-20"> <clipPath id="terminal-3756623299-line-20">
<rect x="0" y="489.5" width="1464" height="24.65" /> <rect x="0" y="489.5" width="1464" height="24.65"/>
</clipPath> </clipPath>
<clipPath id="terminal-3216112738-line-21"> <clipPath id="terminal-3756623299-line-21">
<rect x="0" y="513.9" width="1464" height="24.65" /> <rect x="0" y="513.9" width="1464" height="24.65"/>
</clipPath> </clipPath>
<clipPath id="terminal-3216112738-line-22"> <clipPath id="terminal-3756623299-line-22">
<rect x="0" y="538.3" width="1464" height="24.65" /> <rect x="0" y="538.3" width="1464" height="24.65"/>
</clipPath> </clipPath>
<clipPath id="terminal-3216112738-line-23"> <clipPath id="terminal-3756623299-line-23">
<rect x="0" y="562.7" width="1464" height="24.65" /> <rect x="0" y="562.7" width="1464" height="24.65"/>
</clipPath> </clipPath>
<clipPath id="terminal-3216112738-line-24"> <clipPath id="terminal-3756623299-line-24">
<rect x="0" y="587.1" width="1464" height="24.65" /> <rect x="0" y="587.1" width="1464" height="24.65"/>
</clipPath> </clipPath>
<clipPath id="terminal-3216112738-line-25"> <clipPath id="terminal-3756623299-line-25">
<rect x="0" y="611.5" width="1464" height="24.65" /> <rect x="0" y="611.5" width="1464" height="24.65"/>
</clipPath> </clipPath>
<clipPath id="terminal-3216112738-line-26"> <clipPath id="terminal-3756623299-line-26">
<rect x="0" y="635.9" width="1464" height="24.65" /> <rect x="0" y="635.9" width="1464" height="24.65"/>
</clipPath> </clipPath>
<clipPath id="terminal-3216112738-line-27"> <clipPath id="terminal-3756623299-line-27">
<rect x="0" y="660.3" width="1464" height="24.65" /> <rect x="0" y="660.3" width="1464" height="24.65"/>
</clipPath>
<clipPath id="terminal-3756623299-line-28">
<rect x="0" y="684.7" width="1464" height="24.65"/>
</clipPath>
<clipPath id="terminal-3756623299-line-29">
<rect x="0" y="709.1" width="1464" height="24.65"/>
</clipPath> </clipPath>
</defs> </defs>
<rect fill="#292929" stroke="rgba(255,255,255,0.35)" stroke-width="1" x="1" y="1" width="1480" height="755.6" rx="8" /> <rect fill="#292929" stroke="rgba(255,255,255,0.35)" stroke-width="1" x="1" y="1" width="1480" height="804.4" rx="8"/>
<g transform="translate(26,22)"> <g transform="translate(26,22)">
<circle cx="0" cy="0" r="7" fill="#ff5f57" /> <circle cx="0" cy="0" r="7" fill="#ff5f57"/>
<circle cx="22" cy="0" r="7" fill="#febc2e" /> <circle cx="22" cy="0" r="7" fill="#febc2e"/>
<circle cx="44" cy="0" r="7" fill="#28c840" /> <circle cx="44" cy="0" r="7" fill="#28c840"/>
</g> </g>
<g transform="translate(9, 41)" clip-path="url(#terminal-3216112738-clip-terminal)"> <g transform="translate(9, 41)" clip-path="url(#terminal-3756623299-clip-terminal)">
<g class="terminal-3216112738-matrix"> <g class="terminal-3756623299-matrix">
<text class="terminal-3216112738-r1" x="0" y="20" textLength="73.2" clip-path="url(#terminal-3216112738-line-0)">Usage:</text><text class="terminal-3216112738-r3" x="85.4" y="20" <text class="terminal-3756623299-r1" x="0" y="20" textLength="73.2" clip-path="url(#terminal-3756623299-line-0)">Usage:</text><text class="terminal-3756623299-r3" x="85.4" y="20" textLength="122" clip-path="url(#terminal-3756623299-line-0)">builder.py</text><text class="terminal-3756623299-r2" x="207.4" y="20" textLength="24.4" clip-path="url(#terminal-3756623299-line-0)">&#160;[</text><text class="terminal-3756623299-r4" x="231.8" y="20" textLength="24.4" clip-path="url(#terminal-3756623299-line-0)">-h</text><text class="terminal-3756623299-r2" x="256.2" y="20" textLength="24.4" clip-path="url(#terminal-3756623299-line-0)">]&#160;</text><text class="terminal-3756623299-r4" x="280.6" y="20" textLength="24.4" clip-path="url(#terminal-3756623299-line-0)">-p</text><text class="terminal-3756623299-r5" x="317.2" y="20" textLength="48.8" clip-path="url(#terminal-3756623299-line-0)">ROOT</text><text class="terminal-3756623299-r4" x="378.2" y="20" textLength="24.4" clip-path="url(#terminal-3756623299-line-0)">-w</text><text class="terminal-3756623299-r5" x="414.8" y="20" textLength="36.6" clip-path="url(#terminal-3756623299-line-0)">URL</text><text class="terminal-3756623299-r4" x="463.6" y="20" textLength="24.4" clip-path="url(#terminal-3756623299-line-0)">-t</text><text class="terminal-3756623299-r5" x="500.2" y="20" textLength="61" clip-path="url(#terminal-3756623299-line-0)">TITLE</text><text class="terminal-3756623299-r2" x="561.2" y="20" textLength="24.4" clip-path="url(#terminal-3756623299-line-0)">&#160;[</text><text class="terminal-3756623299-r4" x="585.6" y="20" textLength="24.4" clip-path="url(#terminal-3756623299-line-0)">-r</text><text class="terminal-3756623299-r2" x="610" y="20" textLength="36.6" clip-path="url(#terminal-3756623299-line-0)">]&#160;[</text><text class="terminal-3756623299-r4" x="646.6" y="20" textLength="24.4" clip-path="url(#terminal-3756623299-line-0)">-n</text><text class="terminal-3756623299-r2" x="671" y="20" textLength="36.6" clip-path="url(#terminal-3756623299-line-0)">]&#160;[</text><text class="terminal-3756623299-r4" x="707.6" y="20" textLength="24.4" clip-path="url(#terminal-3756623299-line-0)">-l</text><text class="terminal-3756623299-r5" x="744.2" y="20" textLength="85.4" clip-path="url(#terminal-3756623299-line-0)">LICENSE</text><text class="terminal-3756623299-r2" x="829.6" y="20" textLength="36.6" clip-path="url(#terminal-3756623299-line-0)">]&#160;[</text><text class="terminal-3756623299-r4" x="866.2" y="20" textLength="24.4" clip-path="url(#terminal-3756623299-line-0)">-a</text><text class="terminal-3756623299-r5" x="902.8" y="20" textLength="73.2" clip-path="url(#terminal-3756623299-line-0)">AUTHOR</text><text class="terminal-3756623299-r2" x="976" y="20" textLength="36.6" clip-path="url(#terminal-3756623299-line-0)">]&#160;[</text><text class="terminal-3756623299-r4" x="1012.6" y="20" textLength="24.4" clip-path="url(#terminal-3756623299-line-0)">-e</text><text class="terminal-3756623299-r5" x="1049.2" y="20" textLength="109.8" clip-path="url(#terminal-3756623299-line-0)">EXTENSION</text><text class="terminal-3756623299-r2" x="1159" y="20" textLength="36.6" clip-path="url(#terminal-3756623299-line-0)">]&#160;[</text><text class="terminal-3756623299-r4" x="1195.6" y="20" textLength="24.4" clip-path="url(#terminal-3756623299-line-0)">-m</text><text class="terminal-3756623299-r2" x="1220" y="20" textLength="12.2" clip-path="url(#terminal-3756623299-line-0)">]</text><text class="terminal-3756623299-r2" x="1464" y="20" textLength="12.2" clip-path="url(#terminal-3756623299-line-0)">
textLength="122" clip-path="url(#terminal-3216112738-line-0)">builder.py</text><text class="terminal-3216112738-r2" x="207.4" y="20" textLength="24.4" </text><text class="terminal-3756623299-r2" x="0" y="44.4" textLength="231.8" clip-path="url(#terminal-3756623299-line-1)">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;[</text><text class="terminal-3756623299-r4" x="231.8" y="44.4" textLength="146.4" clip-path="url(#terminal-3756623299-line-1)">--theme-path</text><text class="terminal-3756623299-r5" x="390.4" y="44.4" textLength="48.8" clip-path="url(#terminal-3756623299-line-1)">PATH</text><text class="terminal-3756623299-r2" x="439.2" y="44.4" textLength="36.6" clip-path="url(#terminal-3756623299-line-1)">]&#160;[</text><text class="terminal-3756623299-r4" x="475.8" y="44.4" textLength="231.8" clip-path="url(#terminal-3756623299-line-1)">--use-fancy-folders</text><text class="terminal-3756623299-r2" x="707.6" y="44.4" textLength="36.6" clip-path="url(#terminal-3756623299-line-1)">]&#160;[</text><text class="terminal-3756623299-r4" x="744.2" y="44.4" textLength="244" clip-path="url(#terminal-3756623299-line-1)">--ignore-other-files</text><text class="terminal-3756623299-r2" x="988.2" y="44.4" textLength="36.6" clip-path="url(#terminal-3756623299-line-1)">]&#160;[</text><text class="terminal-3756623299-r4" x="1024.8" y="44.4" textLength="195.2" clip-path="url(#terminal-3756623299-line-1)">--exclude-folder</text><text class="terminal-3756623299-r5" x="1232.2" y="44.4" textLength="73.2" clip-path="url(#terminal-3756623299-line-1)">FOLDER</text><text class="terminal-3756623299-r2" x="1305.4" y="44.4" textLength="12.2" clip-path="url(#terminal-3756623299-line-1)">]</text><text class="terminal-3756623299-r2" x="1464" y="44.4" textLength="12.2" clip-path="url(#terminal-3756623299-line-1)">
clip-path="url(#terminal-3216112738-line-0)">&#160;[</text><text class="terminal-3216112738-r4" x="231.8" y="20" textLength="24.4" </text><text class="terminal-3756623299-r2" x="0" y="68.8" textLength="231.8" clip-path="url(#terminal-3756623299-line-2)">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;[</text><text class="terminal-3756623299-r4" x="231.8" y="68.8" textLength="109.8" clip-path="url(#terminal-3756623299-line-2)">--version</text><text class="terminal-3756623299-r2" x="341.6" y="68.8" textLength="12.2" clip-path="url(#terminal-3756623299-line-2)">]</text><text class="terminal-3756623299-r2" x="1464" y="68.8" textLength="12.2" clip-path="url(#terminal-3756623299-line-2)">
clip-path="url(#terminal-3216112738-line-0)">-h</text><text class="terminal-3216112738-r2" x="256.2" y="20" textLength="24.4" </text><text class="terminal-3756623299-r2" x="1464" y="93.2" textLength="12.2" clip-path="url(#terminal-3756623299-line-3)">
clip-path="url(#terminal-3216112738-line-0)">]&#160;</text><text class="terminal-3216112738-r4" x="280.6" y="20" textLength="24.4" </text><text class="terminal-3756623299-r2" x="0" y="117.6" textLength="671" clip-path="url(#terminal-3756623299-line-4)">Generate&#160;HTML&#160;files&#160;for&#160;a&#160;static&#160;image&#160;hosting&#160;website.</text><text class="terminal-3756623299-r2" x="1464" y="117.6" textLength="12.2" clip-path="url(#terminal-3756623299-line-4)">
clip-path="url(#terminal-3216112738-line-0)">-p</text><text class="terminal-3216112738-r5" x="317.2" y="20" textLength="48.8" </text><text class="terminal-3756623299-r2" x="1464" y="142" textLength="12.2" clip-path="url(#terminal-3756623299-line-5)">
clip-path="url(#terminal-3216112738-line-0)">ROOT</text><text class="terminal-3216112738-r4" x="378.2" y="20" textLength="24.4" </text><text class="terminal-3756623299-r1" x="0" y="166.4" textLength="97.6" clip-path="url(#terminal-3756623299-line-6)">Options:</text><text class="terminal-3756623299-r2" x="1464" y="166.4" textLength="12.2" clip-path="url(#terminal-3756623299-line-6)">
clip-path="url(#terminal-3216112738-line-0)">-w</text><text class="terminal-3216112738-r5" x="414.8" y="20" textLength="36.6" </text><text class="terminal-3756623299-r4" x="24.4" y="190.8" textLength="24.4" clip-path="url(#terminal-3756623299-line-7)">-h</text><text class="terminal-3756623299-r2" x="48.8" y="190.8" textLength="24.4" clip-path="url(#terminal-3756623299-line-7)">,&#160;</text><text class="terminal-3756623299-r4" x="73.2" y="190.8" textLength="73.2" clip-path="url(#terminal-3756623299-line-7)">--help</text><text class="terminal-3756623299-r2" x="292.8" y="190.8" textLength="378.2" clip-path="url(#terminal-3756623299-line-7)">show&#160;this&#160;help&#160;message&#160;and&#160;exit</text><text class="terminal-3756623299-r2" x="1464" y="190.8" textLength="12.2" clip-path="url(#terminal-3756623299-line-7)">
clip-path="url(#terminal-3216112738-line-0)">URL</text><text class="terminal-3216112738-r4" x="463.6" y="20" textLength="24.4" </text><text class="terminal-3756623299-r4" x="24.4" y="215.2" textLength="24.4" clip-path="url(#terminal-3756623299-line-8)">-p</text><text class="terminal-3756623299-r2" x="48.8" y="215.2" textLength="24.4" clip-path="url(#terminal-3756623299-line-8)">,&#160;</text><text class="terminal-3756623299-r4" x="73.2" y="215.2" textLength="195.2" clip-path="url(#terminal-3756623299-line-8)">--root-directory</text><text class="terminal-3756623299-r5" x="280.6" y="215.2" textLength="48.8" clip-path="url(#terminal-3756623299-line-8)">ROOT</text><text class="terminal-3756623299-r2" x="1464" y="215.2" textLength="12.2" clip-path="url(#terminal-3756623299-line-8)">
clip-path="url(#terminal-3216112738-line-0)">-t</text><text class="terminal-3216112738-r5" x="500.2" y="20" textLength="61" </text><text class="terminal-3756623299-r2" x="292.8" y="239.6" textLength="451.4" clip-path="url(#terminal-3756623299-line-9)">Root&#160;directory&#160;containing&#160;the&#160;images.</text><text class="terminal-3756623299-r2" x="1464" y="239.6" textLength="12.2" clip-path="url(#terminal-3756623299-line-9)">
clip-path="url(#terminal-3216112738-line-0)">TITLE</text><text class="terminal-3216112738-r2" x="561.2" y="20" textLength="24.4" </text><text class="terminal-3756623299-r4" x="24.4" y="264" textLength="24.4" clip-path="url(#terminal-3756623299-line-10)">-w</text><text class="terminal-3756623299-r2" x="48.8" y="264" textLength="24.4" clip-path="url(#terminal-3756623299-line-10)">,&#160;</text><text class="terminal-3756623299-r4" x="73.2" y="264" textLength="170.8" clip-path="url(#terminal-3756623299-line-10)">--web-root-url</text><text class="terminal-3756623299-r5" x="256.2" y="264" textLength="36.6" clip-path="url(#terminal-3756623299-line-10)">URL</text><text class="terminal-3756623299-r2" x="1464" y="264" textLength="12.2" clip-path="url(#terminal-3756623299-line-10)">
clip-path="url(#terminal-3216112738-line-0)">&#160;[</text><text class="terminal-3216112738-r4" x="585.6" y="20" textLength="24.4" </text><text class="terminal-3756623299-r2" x="292.8" y="288.4" textLength="634.4" clip-path="url(#terminal-3756623299-line-11)">Base&#160;URL&#160;of&#160;the&#160;web&#160;root&#160;for&#160;the&#160;image&#160;hosting&#160;site.</text><text class="terminal-3756623299-r2" x="1464" y="288.4" textLength="12.2" clip-path="url(#terminal-3756623299-line-11)">
clip-path="url(#terminal-3216112738-line-0)">-r</text><text class="terminal-3216112738-r2" x="610" y="20" textLength="36.6" </text><text class="terminal-3756623299-r4" x="24.4" y="312.8" textLength="24.4" clip-path="url(#terminal-3756623299-line-12)">-t</text><text class="terminal-3756623299-r2" x="48.8" y="312.8" textLength="24.4" clip-path="url(#terminal-3756623299-line-12)">,&#160;</text><text class="terminal-3756623299-r4" x="73.2" y="312.8" textLength="146.4" clip-path="url(#terminal-3756623299-line-12)">--site-title</text><text class="terminal-3756623299-r5" x="231.8" y="312.8" textLength="61" clip-path="url(#terminal-3756623299-line-12)">TITLE</text><text class="terminal-3756623299-r2" x="1464" y="312.8" textLength="12.2" clip-path="url(#terminal-3756623299-line-12)">
clip-path="url(#terminal-3216112738-line-0)">]&#160;[</text><text class="terminal-3216112738-r4" x="646.6" y="20" textLength="24.4" </text><text class="terminal-3756623299-r2" x="292.8" y="337.2" textLength="390.4" clip-path="url(#terminal-3756623299-line-13)">Title&#160;of&#160;the&#160;image&#160;hosting&#160;site.</text><text class="terminal-3756623299-r2" x="1464" y="337.2" textLength="12.2" clip-path="url(#terminal-3756623299-line-13)">
clip-path="url(#terminal-3216112738-line-0)">-n</text><text class="terminal-3216112738-r2" x="671" y="20" textLength="36.6" </text><text class="terminal-3756623299-r4" x="24.4" y="361.6" textLength="24.4" clip-path="url(#terminal-3756623299-line-14)">-r</text><text class="terminal-3756623299-r2" x="48.8" y="361.6" textLength="24.4" clip-path="url(#terminal-3756623299-line-14)">,&#160;</text><text class="terminal-3756623299-r4" x="73.2" y="361.6" textLength="280.6" clip-path="url(#terminal-3756623299-line-14)">--regenerate-thumbnails</text><text class="terminal-3756623299-r2" x="1464" y="361.6" textLength="12.2" clip-path="url(#terminal-3756623299-line-14)">
clip-path="url(#terminal-3216112738-line-0)">]&#160;[</text><text class="terminal-3216112738-r4" x="707.6" y="20" textLength="24.4" </text><text class="terminal-3756623299-r2" x="292.8" y="386" textLength="597.8" clip-path="url(#terminal-3756623299-line-15)">Regenerate&#160;thumbnails&#160;even&#160;if&#160;they&#160;already&#160;exist.</text><text class="terminal-3756623299-r2" x="1464" y="386" textLength="12.2" clip-path="url(#terminal-3756623299-line-15)">
clip-path="url(#terminal-3216112738-line-0)">-l</text><text class="terminal-3216112738-r5" x="744.2" y="20" textLength="85.4" </text><text class="terminal-3756623299-r4" x="24.4" y="410.4" textLength="24.4" clip-path="url(#terminal-3756623299-line-16)">-n</text><text class="terminal-3756623299-r2" x="48.8" y="410.4" textLength="24.4" clip-path="url(#terminal-3756623299-line-16)">,&#160;</text><text class="terminal-3756623299-r4" x="73.2" y="410.4" textLength="268.4" clip-path="url(#terminal-3756623299-line-16)">--non-interactive-mode</text><text class="terminal-3756623299-r2" x="1464" y="410.4" textLength="12.2" clip-path="url(#terminal-3756623299-line-16)">
clip-path="url(#terminal-3216112738-line-0)">LICENSE</text><text class="terminal-3216112738-r2" x="829.6" y="20" textLength="36.6" </text><text class="terminal-3756623299-r2" x="292.8" y="434.8" textLength="646.6" clip-path="url(#terminal-3756623299-line-17)">Run&#160;in&#160;non-interactive&#160;mode,&#160;disabling&#160;progress&#160;bars.</text><text class="terminal-3756623299-r2" x="1464" y="434.8" textLength="12.2" clip-path="url(#terminal-3756623299-line-17)">
clip-path="url(#terminal-3216112738-line-0)">]&#160;[</text><text class="terminal-3216112738-r4" x="866.2" y="20" textLength="24.4" </text><text class="terminal-3756623299-r4" x="24.4" y="459.2" textLength="24.4" clip-path="url(#terminal-3756623299-line-18)">-l</text><text class="terminal-3756623299-r2" x="48.8" y="459.2" textLength="24.4" clip-path="url(#terminal-3756623299-line-18)">,&#160;</text><text class="terminal-3756623299-r4" x="73.2" y="459.2" textLength="170.8" clip-path="url(#terminal-3756623299-line-18)">--license-type</text><text class="terminal-3756623299-r5" x="256.2" y="459.2" textLength="85.4" clip-path="url(#terminal-3756623299-line-18)">LICENSE</text><text class="terminal-3756623299-r2" x="1464" y="459.2" textLength="12.2" clip-path="url(#terminal-3756623299-line-18)">
clip-path="url(#terminal-3216112738-line-0)">-a</text><text class="terminal-3216112738-r5" x="902.8" y="20" textLength="73.2" </text><text class="terminal-3756623299-r2" x="292.8" y="483.6" textLength="488" clip-path="url(#terminal-3756623299-line-19)">Specify&#160;the&#160;license&#160;type&#160;for&#160;the&#160;images.</text><text class="terminal-3756623299-r2" x="1464" y="483.6" textLength="12.2" clip-path="url(#terminal-3756623299-line-19)">
clip-path="url(#terminal-3216112738-line-0)">AUTHOR</text><text class="terminal-3216112738-r2" x="976" y="20" textLength="36.6" </text><text class="terminal-3756623299-r4" x="24.4" y="508" textLength="24.4" clip-path="url(#terminal-3756623299-line-20)">-a</text><text class="terminal-3756623299-r2" x="48.8" y="508" textLength="24.4" clip-path="url(#terminal-3756623299-line-20)">,&#160;</text><text class="terminal-3756623299-r4" x="73.2" y="508" textLength="158.6" clip-path="url(#terminal-3756623299-line-20)">--author-name</text><text class="terminal-3756623299-r5" x="244" y="508" textLength="73.2" clip-path="url(#terminal-3756623299-line-20)">AUTHOR</text><text class="terminal-3756623299-r2" x="1464" y="508" textLength="12.2" clip-path="url(#terminal-3756623299-line-20)">
clip-path="url(#terminal-3216112738-line-0)">]&#160;[</text><text class="terminal-3216112738-r4" x="1012.6" y="20" textLength="24.4" </text><text class="terminal-3756623299-r2" x="292.8" y="532.4" textLength="402.6" clip-path="url(#terminal-3756623299-line-21)">Name&#160;of&#160;the&#160;author&#160;of&#160;the&#160;images.</text><text class="terminal-3756623299-r2" x="1464" y="532.4" textLength="12.2" clip-path="url(#terminal-3756623299-line-21)">
clip-path="url(#terminal-3216112738-line-0)">-e</text><text class="terminal-3216112738-r5" x="1049.2" y="20" textLength="109.8" </text><text class="terminal-3756623299-r4" x="24.4" y="556.8" textLength="24.4" clip-path="url(#terminal-3756623299-line-22)">-e</text><text class="terminal-3756623299-r2" x="48.8" y="556.8" textLength="24.4" clip-path="url(#terminal-3756623299-line-22)">,&#160;</text><text class="terminal-3756623299-r4" x="73.2" y="556.8" textLength="207.4" clip-path="url(#terminal-3756623299-line-22)">--file-extensions</text><text class="terminal-3756623299-r5" x="292.8" y="556.8" textLength="109.8" clip-path="url(#terminal-3756623299-line-22)">EXTENSION</text><text class="terminal-3756623299-r2" x="1464" y="556.8" textLength="12.2" clip-path="url(#terminal-3756623299-line-22)">
clip-path="url(#terminal-3216112738-line-0)">EXTENSION</text><text class="terminal-3216112738-r2" x="1159" y="20" textLength="36.6" </text><text class="terminal-3756623299-r2" x="292.8" y="581.2" textLength="744.2" clip-path="url(#terminal-3756623299-line-23)">File&#160;extensions&#160;to&#160;include&#160;(can&#160;be&#160;specified&#160;multiple&#160;times).</text><text class="terminal-3756623299-r2" x="1464" y="581.2" textLength="12.2" clip-path="url(#terminal-3756623299-line-23)">
clip-path="url(#terminal-3216112738-line-0)">]&#160;[</text><text class="terminal-3216112738-r4" x="1195.6" y="20" textLength="146.4" </text><text class="terminal-3756623299-r4" x="24.4" y="605.6" textLength="24.4" clip-path="url(#terminal-3756623299-line-24)">-m</text><text class="terminal-3756623299-r2" x="48.8" y="605.6" textLength="24.4" clip-path="url(#terminal-3756623299-line-24)">,&#160;</text><text class="terminal-3756623299-r4" x="73.2" y="605.6" textLength="170.8" clip-path="url(#terminal-3756623299-line-24)">--web-manifest</text><text class="terminal-3756623299-r2" x="292.8" y="605.6" textLength="353.8" clip-path="url(#terminal-3756623299-line-24)">Generate&#160;a&#160;web&#160;manifest&#160;file.</text><text class="terminal-3756623299-r2" x="1464" y="605.6" textLength="12.2" clip-path="url(#terminal-3756623299-line-24)">
clip-path="url(#terminal-3216112738-line-0)">--theme-path</text><text class="terminal-3216112738-r5" x="1354.2" y="20" textLength="48.8" </text><text class="terminal-3756623299-r4" x="24.4" y="630" textLength="146.4" clip-path="url(#terminal-3756623299-line-25)">--theme-path</text><text class="terminal-3756623299-r5" x="183" y="630" textLength="48.8" clip-path="url(#terminal-3756623299-line-25)">PATH</text><text class="terminal-3756623299-r2" x="292.8" y="630" textLength="329.4" clip-path="url(#terminal-3756623299-line-25)">Path&#160;to&#160;the&#160;CSS&#160;theme&#160;file.</text><text class="terminal-3756623299-r2" x="1464" y="630" textLength="12.2" clip-path="url(#terminal-3756623299-line-25)">
clip-path="url(#terminal-3216112738-line-0)">PATH</text><text class="terminal-3216112738-r2" x="1403" y="20" textLength="12.2" </text><text class="terminal-3756623299-r4" x="24.4" y="654.4" textLength="231.8" clip-path="url(#terminal-3756623299-line-26)">--use-fancy-folders</text><text class="terminal-3756623299-r2" x="292.8" y="654.4" textLength="890.6" clip-path="url(#terminal-3756623299-line-26)">Enable&#160;fancy&#160;folder&#160;view&#160;instead&#160;of&#160;the&#160;default&#160;Apache&#160;directory&#160;listing.</text><text class="terminal-3756623299-r2" x="1464" y="654.4" textLength="12.2" clip-path="url(#terminal-3756623299-line-26)">
clip-path="url(#terminal-3216112738-line-0)">]</text><text class="terminal-3216112738-r2" x="1464" y="20" textLength="12.2" clip-path="url(#terminal-3216112738-line-0)"> </text><text class="terminal-3756623299-r4" x="24.4" y="678.8" textLength="244" clip-path="url(#terminal-3756623299-line-27)">--ignore-other-files</text><text class="terminal-3756623299-r2" x="292.8" y="678.8" textLength="683.2" clip-path="url(#terminal-3756623299-line-27)">Ignore&#160;files&#160;that&#160;do&#160;not&#160;match&#160;the&#160;specified&#160;extensions.</text><text class="terminal-3756623299-r2" x="1464" y="678.8" textLength="12.2" clip-path="url(#terminal-3756623299-line-27)">
</text><text class="terminal-3216112738-r2" x="0" y="44.4" textLength="231.8" </text><text class="terminal-3756623299-r4" x="24.4" y="703.2" textLength="195.2" clip-path="url(#terminal-3756623299-line-28)">--exclude-folder</text><text class="terminal-3756623299-r5" x="231.8" y="703.2" textLength="73.2" clip-path="url(#terminal-3756623299-line-28)">FOLDER</text><text class="terminal-3756623299-r2" x="1464" y="703.2" textLength="12.2" clip-path="url(#terminal-3756623299-line-28)">
clip-path="url(#terminal-3216112738-line-1)">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;[</text><text </text><text class="terminal-3756623299-r2" x="292.8" y="727.6" textLength="1049.2" clip-path="url(#terminal-3756623299-line-29)">Folders&#160;to&#160;exclude&#160;from&#160;processing,&#160;globs&#160;supported&#160;(can&#160;be&#160;specified&#160;multiple&#160;times).</text><text class="terminal-3756623299-r2" x="1464" y="727.6" textLength="12.2" clip-path="url(#terminal-3756623299-line-29)">
class="terminal-3216112738-r4" x="231.8" y="44.4" textLength="231.8" clip-path="url(#terminal-3216112738-line-1)">--use-fancy-folders</text><text class="terminal-3216112738-r2" </text><text class="terminal-3756623299-r4" x="24.4" y="752" textLength="109.8" clip-path="url(#terminal-3756623299-line-30)">--version</text><text class="terminal-3756623299-r2" x="292.8" y="752" textLength="463.6" clip-path="url(#terminal-3756623299-line-30)">show&#160;program&#x27;s&#160;version&#160;number&#160;and&#160;exit</text><text class="terminal-3756623299-r2" x="1464" y="752" textLength="12.2" clip-path="url(#terminal-3756623299-line-30)">
x="463.6" y="44.4" textLength="36.6" clip-path="url(#terminal-3216112738-line-1)">]&#160;[</text><text class="terminal-3216112738-r4" x="500.2" y="44.4" textLength="244" </text>
clip-path="url(#terminal-3216112738-line-1)">--ignore-other-files</text><text class="terminal-3216112738-r2" x="744.2" y="44.4" textLength="36.6"
clip-path="url(#terminal-3216112738-line-1)">]&#160;[</text><text class="terminal-3216112738-r4" x="780.8" y="44.4" textLength="195.2"
clip-path="url(#terminal-3216112738-line-1)">--exclude-folder</text><text class="terminal-3216112738-r5" x="988.2" y="44.4" textLength="73.2"
clip-path="url(#terminal-3216112738-line-1)">FOLDER</text><text class="terminal-3216112738-r2" x="1061.4" y="44.4" textLength="36.6"
clip-path="url(#terminal-3216112738-line-1)">]&#160;[</text><text class="terminal-3216112738-r4" x="1098" y="44.4" textLength="109.8"
clip-path="url(#terminal-3216112738-line-1)">--version</text><text class="terminal-3216112738-r2" x="1207.8" y="44.4" textLength="12.2"
clip-path="url(#terminal-3216112738-line-1)">]</text><text class="terminal-3216112738-r2" x="1464" y="44.4" textLength="12.2" clip-path="url(#terminal-3216112738-line-1)">
</text><text class="terminal-3216112738-r2" x="1464" y="68.8" textLength="12.2" clip-path="url(#terminal-3216112738-line-2)">
</text><text class="terminal-3216112738-r2" x="0" y="93.2" textLength="671"
clip-path="url(#terminal-3216112738-line-3)">Generate&#160;HTML&#160;files&#160;for&#160;a&#160;static&#160;image&#160;hosting&#160;website.</text><text class="terminal-3216112738-r2"
x="1464" y="93.2" textLength="12.2" clip-path="url(#terminal-3216112738-line-3)">
</text><text class="terminal-3216112738-r2" x="1464" y="117.6" textLength="12.2" clip-path="url(#terminal-3216112738-line-4)">
</text><text class="terminal-3216112738-r1" x="0" y="142" textLength="97.6" clip-path="url(#terminal-3216112738-line-5)">Options:</text><text class="terminal-3216112738-r2" x="1464"
y="142" textLength="12.2" clip-path="url(#terminal-3216112738-line-5)">
</text><text class="terminal-3216112738-r4" x="24.4" y="166.4" textLength="24.4" clip-path="url(#terminal-3216112738-line-6)">-h</text><text class="terminal-3216112738-r2" x="48.8"
y="166.4" textLength="24.4" clip-path="url(#terminal-3216112738-line-6)">,&#160;</text><text class="terminal-3216112738-r4" x="73.2" y="166.4" textLength="73.2"
clip-path="url(#terminal-3216112738-line-6)">--help</text><text class="terminal-3216112738-r2" x="292.8" y="166.4" textLength="378.2"
clip-path="url(#terminal-3216112738-line-6)">show&#160;this&#160;help&#160;message&#160;and&#160;exit</text><text class="terminal-3216112738-r2" x="1464" y="166.4" textLength="12.2"
clip-path="url(#terminal-3216112738-line-6)">
</text><text class="terminal-3216112738-r4" x="24.4" y="190.8" textLength="24.4" clip-path="url(#terminal-3216112738-line-7)">-p</text><text class="terminal-3216112738-r2" x="48.8"
y="190.8" textLength="24.4" clip-path="url(#terminal-3216112738-line-7)">,&#160;</text><text class="terminal-3216112738-r4" x="73.2" y="190.8" textLength="195.2"
clip-path="url(#terminal-3216112738-line-7)">--root-directory</text><text class="terminal-3216112738-r5" x="280.6" y="190.8" textLength="48.8"
clip-path="url(#terminal-3216112738-line-7)">ROOT</text><text class="terminal-3216112738-r2" x="1464" y="190.8" textLength="12.2" clip-path="url(#terminal-3216112738-line-7)">
</text><text class="terminal-3216112738-r2" x="292.8" y="215.2" textLength="451.4"
clip-path="url(#terminal-3216112738-line-8)">Root&#160;directory&#160;containing&#160;the&#160;images.</text><text class="terminal-3216112738-r2" x="1464" y="215.2" textLength="12.2"
clip-path="url(#terminal-3216112738-line-8)">
</text><text class="terminal-3216112738-r4" x="24.4" y="239.6" textLength="24.4" clip-path="url(#terminal-3216112738-line-9)">-w</text><text class="terminal-3216112738-r2" x="48.8"
y="239.6" textLength="24.4" clip-path="url(#terminal-3216112738-line-9)">,&#160;</text><text class="terminal-3216112738-r4" x="73.2" y="239.6" textLength="170.8"
clip-path="url(#terminal-3216112738-line-9)">--web-root-url</text><text class="terminal-3216112738-r5" x="256.2" y="239.6" textLength="36.6"
clip-path="url(#terminal-3216112738-line-9)">URL</text><text class="terminal-3216112738-r2" x="1464" y="239.6" textLength="12.2" clip-path="url(#terminal-3216112738-line-9)">
</text><text class="terminal-3216112738-r2" x="292.8" y="264" textLength="634.4"
clip-path="url(#terminal-3216112738-line-10)">Base&#160;URL&#160;of&#160;the&#160;web&#160;root&#160;for&#160;the&#160;image&#160;hosting&#160;site.</text><text
class="terminal-3216112738-r2" x="1464" y="264" textLength="12.2" clip-path="url(#terminal-3216112738-line-10)">
</text><text class="terminal-3216112738-r4" x="24.4" y="288.4" textLength="24.4" clip-path="url(#terminal-3216112738-line-11)">-t</text><text class="terminal-3216112738-r2" x="48.8"
y="288.4" textLength="24.4" clip-path="url(#terminal-3216112738-line-11)">,&#160;</text><text class="terminal-3216112738-r4" x="73.2" y="288.4" textLength="146.4"
clip-path="url(#terminal-3216112738-line-11)">--site-title</text><text class="terminal-3216112738-r5" x="231.8" y="288.4" textLength="61"
clip-path="url(#terminal-3216112738-line-11)">TITLE</text><text class="terminal-3216112738-r2" x="1464" y="288.4" textLength="12.2" clip-path="url(#terminal-3216112738-line-11)">
</text><text class="terminal-3216112738-r2" x="292.8" y="312.8" textLength="390.4"
clip-path="url(#terminal-3216112738-line-12)">Title&#160;of&#160;the&#160;image&#160;hosting&#160;site.</text><text class="terminal-3216112738-r2" x="1464" y="312.8" textLength="12.2"
clip-path="url(#terminal-3216112738-line-12)">
</text><text class="terminal-3216112738-r4" x="24.4" y="337.2" textLength="24.4" clip-path="url(#terminal-3216112738-line-13)">-r</text><text class="terminal-3216112738-r2" x="48.8"
y="337.2" textLength="24.4" clip-path="url(#terminal-3216112738-line-13)">,&#160;</text><text class="terminal-3216112738-r4" x="73.2" y="337.2" textLength="280.6"
clip-path="url(#terminal-3216112738-line-13)">--regenerate-thumbnails</text><text class="terminal-3216112738-r2" x="1464" y="337.2" textLength="12.2"
clip-path="url(#terminal-3216112738-line-13)">
</text><text class="terminal-3216112738-r2" x="292.8" y="361.6" textLength="597.8"
clip-path="url(#terminal-3216112738-line-14)">Regenerate&#160;thumbnails&#160;even&#160;if&#160;they&#160;already&#160;exist.</text><text class="terminal-3216112738-r2" x="1464"
y="361.6" textLength="12.2" clip-path="url(#terminal-3216112738-line-14)">
</text><text class="terminal-3216112738-r4" x="24.4" y="386" textLength="24.4" clip-path="url(#terminal-3216112738-line-15)">-n</text><text class="terminal-3216112738-r2" x="48.8" y="386"
textLength="24.4" clip-path="url(#terminal-3216112738-line-15)">,&#160;</text><text class="terminal-3216112738-r4" x="73.2" y="386" textLength="268.4"
clip-path="url(#terminal-3216112738-line-15)">--non-interactive-mode</text><text class="terminal-3216112738-r2" x="1464" y="386" textLength="12.2"
clip-path="url(#terminal-3216112738-line-15)">
</text><text class="terminal-3216112738-r2" x="292.8" y="410.4" textLength="646.6"
clip-path="url(#terminal-3216112738-line-16)">Run&#160;in&#160;non-interactive&#160;mode,&#160;disabling&#160;progress&#160;bars.</text><text class="terminal-3216112738-r2" x="1464"
y="410.4" textLength="12.2" clip-path="url(#terminal-3216112738-line-16)">
</text><text class="terminal-3216112738-r4" x="24.4" y="434.8" textLength="24.4" clip-path="url(#terminal-3216112738-line-17)">-l</text><text class="terminal-3216112738-r2" x="48.8"
y="434.8" textLength="24.4" clip-path="url(#terminal-3216112738-line-17)">,&#160;</text><text class="terminal-3216112738-r4" x="73.2" y="434.8" textLength="170.8"
clip-path="url(#terminal-3216112738-line-17)">--license-type</text><text class="terminal-3216112738-r5" x="256.2" y="434.8" textLength="85.4"
clip-path="url(#terminal-3216112738-line-17)">LICENSE</text><text class="terminal-3216112738-r2" x="1464" y="434.8" textLength="12.2" clip-path="url(#terminal-3216112738-line-17)">
</text><text class="terminal-3216112738-r2" x="292.8" y="459.2" textLength="488"
clip-path="url(#terminal-3216112738-line-18)">Specify&#160;the&#160;license&#160;type&#160;for&#160;the&#160;images.</text><text class="terminal-3216112738-r2" x="1464" y="459.2"
textLength="12.2" clip-path="url(#terminal-3216112738-line-18)">
</text><text class="terminal-3216112738-r4" x="24.4" y="483.6" textLength="24.4" clip-path="url(#terminal-3216112738-line-19)">-a</text><text class="terminal-3216112738-r2" x="48.8"
y="483.6" textLength="24.4" clip-path="url(#terminal-3216112738-line-19)">,&#160;</text><text class="terminal-3216112738-r4" x="73.2" y="483.6" textLength="158.6"
clip-path="url(#terminal-3216112738-line-19)">--author-name</text><text class="terminal-3216112738-r5" x="244" y="483.6" textLength="73.2"
clip-path="url(#terminal-3216112738-line-19)">AUTHOR</text><text class="terminal-3216112738-r2" x="1464" y="483.6" textLength="12.2" clip-path="url(#terminal-3216112738-line-19)">
</text><text class="terminal-3216112738-r2" x="292.8" y="508" textLength="402.6"
clip-path="url(#terminal-3216112738-line-20)">Name&#160;of&#160;the&#160;author&#160;of&#160;the&#160;images.</text><text class="terminal-3216112738-r2" x="1464" y="508"
textLength="12.2" clip-path="url(#terminal-3216112738-line-20)">
</text><text class="terminal-3216112738-r4" x="24.4" y="532.4" textLength="24.4" clip-path="url(#terminal-3216112738-line-21)">-e</text><text class="terminal-3216112738-r2" x="48.8"
y="532.4" textLength="24.4" clip-path="url(#terminal-3216112738-line-21)">,&#160;</text><text class="terminal-3216112738-r4" x="73.2" y="532.4" textLength="207.4"
clip-path="url(#terminal-3216112738-line-21)">--file-extensions</text><text class="terminal-3216112738-r5" x="292.8" y="532.4" textLength="109.8"
clip-path="url(#terminal-3216112738-line-21)">EXTENSION</text><text class="terminal-3216112738-r2" x="1464" y="532.4" textLength="12.2" clip-path="url(#terminal-3216112738-line-21)">
</text><text class="terminal-3216112738-r2" x="292.8" y="556.8" textLength="744.2"
clip-path="url(#terminal-3216112738-line-22)">File&#160;extensions&#160;to&#160;include&#160;(can&#160;be&#160;specified&#160;multiple&#160;times).</text><text
class="terminal-3216112738-r2" x="1464" y="556.8" textLength="12.2" clip-path="url(#terminal-3216112738-line-22)">
</text><text class="terminal-3216112738-r4" x="24.4" y="581.2" textLength="146.4" clip-path="url(#terminal-3216112738-line-23)">--theme-path</text><text class="terminal-3216112738-r5"
x="183" y="581.2" textLength="48.8" clip-path="url(#terminal-3216112738-line-23)">PATH</text><text class="terminal-3216112738-r2" x="292.8" y="581.2" textLength="329.4"
clip-path="url(#terminal-3216112738-line-23)">Path&#160;to&#160;the&#160;CSS&#160;theme&#160;file.</text><text class="terminal-3216112738-r2" x="1464" y="581.2" textLength="12.2"
clip-path="url(#terminal-3216112738-line-23)">
</text><text class="terminal-3216112738-r4" x="24.4" y="605.6" textLength="231.8" clip-path="url(#terminal-3216112738-line-24)">--use-fancy-folders</text><text
class="terminal-3216112738-r2" x="292.8" y="605.6" textLength="890.6"
clip-path="url(#terminal-3216112738-line-24)">Enable&#160;fancy&#160;folder&#160;view&#160;instead&#160;of&#160;the&#160;default&#160;Apache&#160;directory&#160;listing.</text><text
class="terminal-3216112738-r2" x="1464" y="605.6" textLength="12.2" clip-path="url(#terminal-3216112738-line-24)">
</text><text class="terminal-3216112738-r4" x="24.4" y="630" textLength="244" clip-path="url(#terminal-3216112738-line-25)">--ignore-other-files</text><text class="terminal-3216112738-r2"
x="292.8" y="630" textLength="683.2"
clip-path="url(#terminal-3216112738-line-25)">Ignore&#160;files&#160;that&#160;do&#160;not&#160;match&#160;the&#160;specified&#160;extensions.</text><text
class="terminal-3216112738-r2" x="1464" y="630" textLength="12.2" clip-path="url(#terminal-3216112738-line-25)">
</text><text class="terminal-3216112738-r4" x="24.4" y="654.4" textLength="195.2" clip-path="url(#terminal-3216112738-line-26)">--exclude-folder</text><text class="terminal-3216112738-r5"
x="231.8" y="654.4" textLength="73.2" clip-path="url(#terminal-3216112738-line-26)">FOLDER</text><text class="terminal-3216112738-r2" x="1464" y="654.4" textLength="12.2"
clip-path="url(#terminal-3216112738-line-26)">
</text><text class="terminal-3216112738-r2" x="292.8" y="678.8" textLength="1049.2"
clip-path="url(#terminal-3216112738-line-27)">Folders&#160;to&#160;exclude&#160;from&#160;processing,&#160;globs&#160;supported&#160;(can&#160;be&#160;specified&#160;multiple&#160;times).</text><text
class="terminal-3216112738-r2" x="1464" y="678.8" textLength="12.2" clip-path="url(#terminal-3216112738-line-27)">
</text><text class="terminal-3216112738-r4" x="24.4" y="703.2" textLength="109.8" clip-path="url(#terminal-3216112738-line-28)">--version</text><text class="terminal-3216112738-r2"
x="292.8" y="703.2" textLength="463.6" clip-path="url(#terminal-3216112738-line-28)">show&#160;program&#x27;s&#160;version&#160;number&#160;and&#160;exit</text><text
class="terminal-3216112738-r2" x="1464" y="703.2" textLength="12.2" clip-path="url(#terminal-3216112738-line-28)">
</text>
</g> </g>
</g> </g>
</svg> </svg>

Before

Width:  |  Height:  |  Size: 25 KiB

After

Width:  |  Height:  |  Size: 24 KiB

View File

@@ -1,3 +1,4 @@
CairoSVG==2.7.1
Jinja2==3.1.4 Jinja2==3.1.4
numpy==2.0.0 numpy==2.0.0
pillow==10.4.0 pillow==10.4.0

View File

@@ -5,6 +5,9 @@
<meta charset="UTF-8"> <meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>{{ title }}</title> <title>{{ title }}</title>
{%- if webmanifest %}
<link rel="manifest" href="/manifest.json">
{%- endif %}
<link rel="icon" type="image/x-icon" href="{{ favicon }}"> <link rel="icon" type="image/x-icon" href="{{ favicon }}">
<link rel="stylesheet" href="{{ stylesheet }}"> <link rel="stylesheet" href="{{ stylesheet }}">
{%- if theme %} {%- if theme %}

View File

@@ -0,0 +1,19 @@
{
"name": "{{ name }}",
"icons": [
{% for icon in icons -%}
{
"src": "{{ icon.src }}",
"sizes": "{{ icon.sizes }}",
"type": "{{ icon.type }}",
"purpose": "maskable"
}{% if not loop.last %},{% endif %}
{%- endfor %}
],
"id": "{{ id }}",
"start_url": "/",
"background_color": "{{ background_color }}",
"display": "standalone",
"scope": "/",
"theme_color": "{{ theme_color }}"
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.8 MiB

View File

@@ -1,10 +0,0 @@
{
"example copy.jpg": {
"width": 7030,
"height": 4688
},
"example.jpg": {
"width": 7030,
"height": 4688
}
}

View File