mirror of
https://github.com/greflm13/StaticGalleryBuilder.git
synced 2026-02-05 11:09:26 +00:00
Compare commits
18 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 08895902ec | |||
| 0107c4d38c | |||
| 6595cd11d6 | |||
| 08b53eb2ac | |||
| d71b6afd7f | |||
| ec32c24af3 | |||
| 122117f125 | |||
| 3b93fb8719 | |||
| b601b67b6e | |||
| 03a9e46baa | |||
|
0a39ecd637
|
|||
|
bc4fefa3f1
|
|||
|
156a886ac1
|
|||
| f6cf89a37f | |||
|
cc783ee30e
|
|||
|
c429cd06c8
|
|||
|
35f2ea7536
|
|||
| 0ec663ae68 |
1
.gitignore
vendored
1
.gitignore
vendored
@@ -168,3 +168,4 @@ test/**/.sizelist.json
|
||||
test/manifest.json
|
||||
themes/previews
|
||||
logs
|
||||
.lock
|
||||
@@ -20,7 +20,6 @@ Python script to generate static HTML files for website galleries.
|
||||
## Requirements
|
||||
|
||||
- Python 3.x
|
||||
- `numpy` library
|
||||
- `tqdm` library
|
||||
- `Jinja2` library
|
||||
- `Pillow` library
|
||||
@@ -33,7 +32,7 @@ Python script to generate static HTML files for website galleries.
|
||||
Install the required libraries using pip:
|
||||
|
||||
```sh
|
||||
pip install numpy tqdm Jinja2 Pillow rich-argparse cairosvg python-json-logger
|
||||
pip install tqdm Jinja2 Pillow rich-argparse cairosvg python-json-logger
|
||||
```
|
||||
|
||||
## Usage
|
||||
@@ -56,6 +55,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.
|
||||
- `--regenerate-thumbnails`: Regenerate thumbnails even if they already exist.
|
||||
- `--reread-metadata`: Reread image metadata if it already exists.
|
||||
- `--reverse-sort`: Sort images by reverse name order.
|
||||
- `--theme-path PATH`: Specify the path to the CSS theme file. Default is the provided default theme.
|
||||
- `--use-fancy-folders`: Enable fancy folder view instead of the default Apache directory listing.
|
||||
|
||||
@@ -96,6 +96,7 @@ To generate a web manifest file:
|
||||
- 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 script generates the preview thumbnails in a `.thumbnails` subdirectory within the root folder.
|
||||
- The `.lock` file prevents multiple instances of the script from running simultaneously. Make sure to remove it if the script terminates unexpectedly.
|
||||
- Add a `info` file into any directory containing pictures and it will be read and displayed as a tooltip on the website.
|
||||
|
||||
## License
|
||||
|
||||
|
||||
@@ -1,17 +1,15 @@
|
||||
{
|
||||
"extensions": {
|
||||
"recommendations": [
|
||||
"charliermarsh.ruff",
|
||||
"esbenp.prettier-vscode",
|
||||
"ms-edgedevtools.vscode-edge-devtools",
|
||||
"ms-python.black-formatter",
|
||||
"ms-python.debugpy",
|
||||
"ms-python.pylint",
|
||||
"ms-python.python",
|
||||
"ms-python.vscode-pylance",
|
||||
"samuelcolvin.jinjahtml",
|
||||
"vscode.css-language-features",
|
||||
"vscode.html-language-features",
|
||||
"waderyan.gitblame",
|
||||
],
|
||||
},
|
||||
"folders": [
|
||||
@@ -39,6 +37,7 @@
|
||||
"cc-by-nc-sa",
|
||||
"-n",
|
||||
"-m",
|
||||
"--reverse-sort",
|
||||
"--regenerate-thumbnails",
|
||||
"--reread-metadata",
|
||||
],
|
||||
|
||||
64
builder.py
64
builder.py
@@ -1,20 +1,18 @@
|
||||
#!/usr/bin/env python3
|
||||
import os
|
||||
import re
|
||||
import sys
|
||||
import shutil
|
||||
import fnmatch
|
||||
import urllib.parse
|
||||
import urllib.request
|
||||
from multiprocessing import Pool, freeze_support
|
||||
from pathlib import Path
|
||||
from typing import Dict, List, Tuple
|
||||
|
||||
from tqdm.auto import tqdm
|
||||
from PIL import Image, ImageOps
|
||||
|
||||
from modules.logger import logger
|
||||
from modules.argumentparser import parse_arguments, Args
|
||||
from modules.svg_handling import icons, webmanifest, extract_colorscheme
|
||||
from modules.generate_html import list_folder, EXCLUDES
|
||||
|
||||
|
||||
# fmt: off
|
||||
@@ -36,10 +34,21 @@ IMG_EXTENSIONS = [".jpg", ".jpeg", ".png"]
|
||||
NOT_LIST = ["*/Galleries/*", "Archives"]
|
||||
# fmt: on
|
||||
|
||||
pbardict: Dict[str, tqdm] = {}
|
||||
pbardict: dict[str, tqdm] = {}
|
||||
|
||||
args = parse_arguments(VERSION)
|
||||
|
||||
lock_file = os.path.join(args.root_directory, ".lock")
|
||||
if os.path.exists(lock_file):
|
||||
print("Another instance of this program is running.")
|
||||
sys.exit()
|
||||
else:
|
||||
from modules.logger import logger
|
||||
from modules.svg_handling import icons, webmanifest, extract_colorscheme
|
||||
from modules.generate_html import list_folder, EXCLUDES
|
||||
|
||||
|
||||
def init_globals(_args: Args, raw: List[str]) -> Tuple[Args, List[str]]:
|
||||
def init_globals(_args: Args, raw: list[str]) -> tuple[Args, list[str]]:
|
||||
"""
|
||||
Initialize global variables and set default values for arguments.
|
||||
|
||||
@@ -47,12 +56,12 @@ def init_globals(_args: Args, raw: List[str]) -> Tuple[Args, List[str]]:
|
||||
-----------
|
||||
_args : Args
|
||||
Parsed command-line arguments.
|
||||
raw : List[str]
|
||||
List of raw file extensions.
|
||||
raw : list[str]
|
||||
list of raw file extensions.
|
||||
|
||||
Returns:
|
||||
--------
|
||||
Tuple[Args, List[str]]
|
||||
tuple[Args, list[str]]
|
||||
Updated arguments and raw file extensions.
|
||||
"""
|
||||
if not _args.file_extensions:
|
||||
@@ -118,13 +127,13 @@ def copy_static_files(_args: Args) -> None:
|
||||
f.write(themehead + '\n.foldericon {\n content: url("data:image/svg+xml,' + svg + '");\n}\n' + themetail)
|
||||
|
||||
|
||||
def generate_thumbnail(arguments: Tuple[str, str, str]) -> None:
|
||||
def generate_thumbnail(arguments: tuple[str, str, str]) -> None:
|
||||
"""
|
||||
Generate a thumbnail for a given image.
|
||||
|
||||
Parameters:
|
||||
-----------
|
||||
arguments : Tuple[str, str, str, bool]
|
||||
arguments : tuple[str, str, str, bool]
|
||||
A tuple containing the folder, item, root directory, and regenerate thumbnails flag.
|
||||
"""
|
||||
folder, item, root_directory = arguments
|
||||
@@ -183,24 +192,30 @@ def get_total_folders(folder: str, _args: Args, _total: int = 0) -> int:
|
||||
return _total
|
||||
|
||||
|
||||
def main() -> None:
|
||||
def main(args) -> None:
|
||||
"""
|
||||
Main function to process images and generate a static image hosting website.
|
||||
"""
|
||||
logger.info("starting builder", extra={"version": VERSION})
|
||||
thumbnails: List[Tuple[str, str, str, bool]] = []
|
||||
thumbnails: list[tuple[str, str, str, bool]] = []
|
||||
|
||||
args = parse_arguments(VERSION)
|
||||
args, raw = init_globals(args, RAW_EXTENSIONS)
|
||||
|
||||
lock_file = os.path.join(args.root_directory, ".lock")
|
||||
if os.path.exists(lock_file):
|
||||
print("Another instance of this program is running.")
|
||||
logger.error("another instance of this program is running")
|
||||
exit()
|
||||
|
||||
try:
|
||||
Path(lock_file).touch()
|
||||
logger.info("starting builder", extra={"version": VERSION})
|
||||
|
||||
logger.info("getting logo from sorogon.eu")
|
||||
req = urllib.request.Request("https://files.sorogon.eu/logo.svg")
|
||||
with urllib.request.urlopen(req) as res:
|
||||
logo = res.read().decode()
|
||||
|
||||
if logo.startswith("<?xml"):
|
||||
logo = re.sub(r"<\?xml.+\?>", "", logo).strip()
|
||||
if logo.startswith("<!--"):
|
||||
logo = re.sub(r"<!--.+-->", "", logo).strip()
|
||||
logo = logo.replace("\n", " ")
|
||||
logo = " ".join(logo.split())
|
||||
|
||||
if args.reread_metadata:
|
||||
logger.warning("reread metadata flag is set to true, all image metadata will be reread")
|
||||
if args.regenerate_thumbnails:
|
||||
@@ -220,7 +235,7 @@ def main() -> None:
|
||||
if args.non_interactive_mode:
|
||||
logger.info("generating HTML files")
|
||||
print("Generating HTML files...")
|
||||
thumbnails = list_folder(0, args.root_directory, args.site_title, args, raw, VERSION)
|
||||
thumbnails = list_folder(0, args.root_directory, args.site_title, args, raw, VERSION, logo)
|
||||
with Pool(os.cpu_count()) as pool:
|
||||
logger.info("generating thumbnails")
|
||||
print("Generating thumbnails...")
|
||||
@@ -233,7 +248,7 @@ def main() -> None:
|
||||
pbardict["traversingbar"].update(0)
|
||||
pbardict["traversingbar"].close()
|
||||
|
||||
thumbnails = list_folder(total, args.root_directory, args.site_title, args, raw, VERSION)
|
||||
thumbnails = list_folder(total, args.root_directory, args.site_title, args, raw, VERSION, logo)
|
||||
|
||||
with Pool(os.cpu_count()) as pool:
|
||||
logger.info("generating thumbnails")
|
||||
@@ -249,9 +264,8 @@ def main() -> None:
|
||||
finally:
|
||||
os.remove(lock_file)
|
||||
logger.info("finished builder", extra={"version": VERSION})
|
||||
return
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
freeze_support()
|
||||
main()
|
||||
main(args)
|
||||
|
||||
@@ -59,6 +59,10 @@ figure {
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
.licensefile {
|
||||
padding: 30px;
|
||||
}
|
||||
|
||||
.caption {
|
||||
padding-top: 4px;
|
||||
text-align: center;
|
||||
@@ -175,6 +179,14 @@ figure {
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.attribution svg {
|
||||
height: calc(6.75pt + 12px);
|
||||
width: fit-content;
|
||||
position: relative;
|
||||
bottom: -8px;
|
||||
right: 0px;
|
||||
}
|
||||
|
||||
#totop {
|
||||
display: none;
|
||||
position: fixed;
|
||||
|
||||
156
help.svg
156
help.svg
@@ -1,4 +1,4 @@
|
||||
<svg class="rich-terminal" viewBox="0 0 1482 806.4" xmlns="http://www.w3.org/2000/svg">
|
||||
<svg class="rich-terminal" viewBox="0 0 1482 855.1999999999999" xmlns="http://www.w3.org/2000/svg">
|
||||
<!-- Generated with Rich https://www.textualize.io -->
|
||||
<style>
|
||||
|
||||
@@ -19,163 +19,171 @@
|
||||
font-weight: 700;
|
||||
}
|
||||
|
||||
.terminal-2271905219-matrix {
|
||||
.terminal-1308707172-matrix {
|
||||
font-family: Fira Code, monospace;
|
||||
font-size: 20px;
|
||||
line-height: 24.4px;
|
||||
font-variant-east-asian: full-width;
|
||||
}
|
||||
|
||||
.terminal-2271905219-title {
|
||||
.terminal-1308707172-title {
|
||||
font-size: 18px;
|
||||
font-weight: bold;
|
||||
font-family: arial;
|
||||
}
|
||||
|
||||
.terminal-2271905219-r1 { fill: #ff8700 }
|
||||
.terminal-2271905219-r2 { fill: #c5c8c6 }
|
||||
.terminal-2271905219-r3 { fill: #808080 }
|
||||
.terminal-2271905219-r4 { fill: #68a0b3 }
|
||||
.terminal-2271905219-r5 { fill: #00af87 }
|
||||
.terminal-1308707172-r1 { fill: #ff8700 }
|
||||
.terminal-1308707172-r2 { fill: #c5c8c6 }
|
||||
.terminal-1308707172-r3 { fill: #808080 }
|
||||
.terminal-1308707172-r4 { fill: #68a0b3 }
|
||||
.terminal-1308707172-r5 { fill: #00af87 }
|
||||
</style>
|
||||
|
||||
<defs>
|
||||
<clipPath id="terminal-2271905219-clip-terminal">
|
||||
<rect x="0" y="0" width="1463.0" height="755.4" />
|
||||
<clipPath id="terminal-1308707172-clip-terminal">
|
||||
<rect x="0" y="0" width="1463.0" height="804.1999999999999" />
|
||||
</clipPath>
|
||||
<clipPath id="terminal-2271905219-line-0">
|
||||
<clipPath id="terminal-1308707172-line-0">
|
||||
<rect x="0" y="1.5" width="1464" height="24.65"/>
|
||||
</clipPath>
|
||||
<clipPath id="terminal-2271905219-line-1">
|
||||
<clipPath id="terminal-1308707172-line-1">
|
||||
<rect x="0" y="25.9" width="1464" height="24.65"/>
|
||||
</clipPath>
|
||||
<clipPath id="terminal-2271905219-line-2">
|
||||
<clipPath id="terminal-1308707172-line-2">
|
||||
<rect x="0" y="50.3" width="1464" height="24.65"/>
|
||||
</clipPath>
|
||||
<clipPath id="terminal-2271905219-line-3">
|
||||
<clipPath id="terminal-1308707172-line-3">
|
||||
<rect x="0" y="74.7" width="1464" height="24.65"/>
|
||||
</clipPath>
|
||||
<clipPath id="terminal-2271905219-line-4">
|
||||
<clipPath id="terminal-1308707172-line-4">
|
||||
<rect x="0" y="99.1" width="1464" height="24.65"/>
|
||||
</clipPath>
|
||||
<clipPath id="terminal-2271905219-line-5">
|
||||
<clipPath id="terminal-1308707172-line-5">
|
||||
<rect x="0" y="123.5" width="1464" height="24.65"/>
|
||||
</clipPath>
|
||||
<clipPath id="terminal-2271905219-line-6">
|
||||
<clipPath id="terminal-1308707172-line-6">
|
||||
<rect x="0" y="147.9" width="1464" height="24.65"/>
|
||||
</clipPath>
|
||||
<clipPath id="terminal-2271905219-line-7">
|
||||
<clipPath id="terminal-1308707172-line-7">
|
||||
<rect x="0" y="172.3" width="1464" height="24.65"/>
|
||||
</clipPath>
|
||||
<clipPath id="terminal-2271905219-line-8">
|
||||
<clipPath id="terminal-1308707172-line-8">
|
||||
<rect x="0" y="196.7" width="1464" height="24.65"/>
|
||||
</clipPath>
|
||||
<clipPath id="terminal-2271905219-line-9">
|
||||
<clipPath id="terminal-1308707172-line-9">
|
||||
<rect x="0" y="221.1" width="1464" height="24.65"/>
|
||||
</clipPath>
|
||||
<clipPath id="terminal-2271905219-line-10">
|
||||
<clipPath id="terminal-1308707172-line-10">
|
||||
<rect x="0" y="245.5" width="1464" height="24.65"/>
|
||||
</clipPath>
|
||||
<clipPath id="terminal-2271905219-line-11">
|
||||
<clipPath id="terminal-1308707172-line-11">
|
||||
<rect x="0" y="269.9" width="1464" height="24.65"/>
|
||||
</clipPath>
|
||||
<clipPath id="terminal-2271905219-line-12">
|
||||
<clipPath id="terminal-1308707172-line-12">
|
||||
<rect x="0" y="294.3" width="1464" height="24.65"/>
|
||||
</clipPath>
|
||||
<clipPath id="terminal-2271905219-line-13">
|
||||
<clipPath id="terminal-1308707172-line-13">
|
||||
<rect x="0" y="318.7" width="1464" height="24.65"/>
|
||||
</clipPath>
|
||||
<clipPath id="terminal-2271905219-line-14">
|
||||
<clipPath id="terminal-1308707172-line-14">
|
||||
<rect x="0" y="343.1" width="1464" height="24.65"/>
|
||||
</clipPath>
|
||||
<clipPath id="terminal-2271905219-line-15">
|
||||
<clipPath id="terminal-1308707172-line-15">
|
||||
<rect x="0" y="367.5" width="1464" height="24.65"/>
|
||||
</clipPath>
|
||||
<clipPath id="terminal-2271905219-line-16">
|
||||
<clipPath id="terminal-1308707172-line-16">
|
||||
<rect x="0" y="391.9" width="1464" height="24.65"/>
|
||||
</clipPath>
|
||||
<clipPath id="terminal-2271905219-line-17">
|
||||
<clipPath id="terminal-1308707172-line-17">
|
||||
<rect x="0" y="416.3" width="1464" height="24.65"/>
|
||||
</clipPath>
|
||||
<clipPath id="terminal-2271905219-line-18">
|
||||
<clipPath id="terminal-1308707172-line-18">
|
||||
<rect x="0" y="440.7" width="1464" height="24.65"/>
|
||||
</clipPath>
|
||||
<clipPath id="terminal-2271905219-line-19">
|
||||
<clipPath id="terminal-1308707172-line-19">
|
||||
<rect x="0" y="465.1" width="1464" height="24.65"/>
|
||||
</clipPath>
|
||||
<clipPath id="terminal-2271905219-line-20">
|
||||
<clipPath id="terminal-1308707172-line-20">
|
||||
<rect x="0" y="489.5" width="1464" height="24.65"/>
|
||||
</clipPath>
|
||||
<clipPath id="terminal-2271905219-line-21">
|
||||
<clipPath id="terminal-1308707172-line-21">
|
||||
<rect x="0" y="513.9" width="1464" height="24.65"/>
|
||||
</clipPath>
|
||||
<clipPath id="terminal-2271905219-line-22">
|
||||
<clipPath id="terminal-1308707172-line-22">
|
||||
<rect x="0" y="538.3" width="1464" height="24.65"/>
|
||||
</clipPath>
|
||||
<clipPath id="terminal-2271905219-line-23">
|
||||
<clipPath id="terminal-1308707172-line-23">
|
||||
<rect x="0" y="562.7" width="1464" height="24.65"/>
|
||||
</clipPath>
|
||||
<clipPath id="terminal-2271905219-line-24">
|
||||
<clipPath id="terminal-1308707172-line-24">
|
||||
<rect x="0" y="587.1" width="1464" height="24.65"/>
|
||||
</clipPath>
|
||||
<clipPath id="terminal-2271905219-line-25">
|
||||
<clipPath id="terminal-1308707172-line-25">
|
||||
<rect x="0" y="611.5" width="1464" height="24.65"/>
|
||||
</clipPath>
|
||||
<clipPath id="terminal-2271905219-line-26">
|
||||
<clipPath id="terminal-1308707172-line-26">
|
||||
<rect x="0" y="635.9" width="1464" height="24.65"/>
|
||||
</clipPath>
|
||||
<clipPath id="terminal-2271905219-line-27">
|
||||
<clipPath id="terminal-1308707172-line-27">
|
||||
<rect x="0" y="660.3" width="1464" height="24.65"/>
|
||||
</clipPath>
|
||||
<clipPath id="terminal-2271905219-line-28">
|
||||
<clipPath id="terminal-1308707172-line-28">
|
||||
<rect x="0" y="684.7" width="1464" height="24.65"/>
|
||||
</clipPath>
|
||||
<clipPath id="terminal-2271905219-line-29">
|
||||
<clipPath id="terminal-1308707172-line-29">
|
||||
<rect x="0" y="709.1" width="1464" height="24.65"/>
|
||||
</clipPath>
|
||||
<clipPath id="terminal-1308707172-line-30">
|
||||
<rect x="0" y="733.5" width="1464" height="24.65"/>
|
||||
</clipPath>
|
||||
<clipPath id="terminal-1308707172-line-31">
|
||||
<rect x="0" y="757.9" width="1464" height="24.65"/>
|
||||
</clipPath>
|
||||
</defs>
|
||||
|
||||
<rect fill="#292929" stroke="rgba(255,255,255,0.35)" stroke-width="1" x="1" y="1" width="1480" height="804.4" rx="8"/>
|
||||
<rect fill="#292929" stroke="rgba(255,255,255,0.35)" stroke-width="1" x="1" y="1" width="1480" height="853.2" rx="8"/>
|
||||
<g transform="translate(26,22)">
|
||||
<circle cx="0" cy="0" r="7" fill="#ff5f57"/>
|
||||
<circle cx="22" cy="0" r="7" fill="#febc2e"/>
|
||||
<circle cx="44" cy="0" r="7" fill="#28c840"/>
|
||||
</g>
|
||||
|
||||
<g transform="translate(9, 41)" clip-path="url(#terminal-2271905219-clip-terminal)">
|
||||
<g transform="translate(9, 41)" clip-path="url(#terminal-1308707172-clip-terminal)">
|
||||
|
||||
<g class="terminal-2271905219-matrix">
|
||||
<text class="terminal-2271905219-r1" x="0" y="20" textLength="73.2" clip-path="url(#terminal-2271905219-line-0)">Usage:</text><text class="terminal-2271905219-r3" x="85.4" y="20" textLength="122" clip-path="url(#terminal-2271905219-line-0)">builder.py</text><text class="terminal-2271905219-r2" x="207.4" y="20" textLength="24.4" clip-path="url(#terminal-2271905219-line-0)"> [</text><text class="terminal-2271905219-r4" x="231.8" y="20" textLength="24.4" clip-path="url(#terminal-2271905219-line-0)">-h</text><text class="terminal-2271905219-r2" x="256.2" y="20" textLength="36.6" clip-path="url(#terminal-2271905219-line-0)">] [</text><text class="terminal-2271905219-r4" x="292.8" y="20" textLength="24.4" clip-path="url(#terminal-2271905219-line-0)">-a</text><text class="terminal-2271905219-r5" x="329.4" y="20" textLength="73.2" clip-path="url(#terminal-2271905219-line-0)">AUTHOR</text><text class="terminal-2271905219-r2" x="402.6" y="20" textLength="36.6" clip-path="url(#terminal-2271905219-line-0)">] [</text><text class="terminal-2271905219-r4" x="439.2" y="20" textLength="24.4" clip-path="url(#terminal-2271905219-line-0)">-e</text><text class="terminal-2271905219-r5" x="475.8" y="20" textLength="109.8" clip-path="url(#terminal-2271905219-line-0)">EXTENSION</text><text class="terminal-2271905219-r2" x="585.6" y="20" textLength="36.6" clip-path="url(#terminal-2271905219-line-0)">] [</text><text class="terminal-2271905219-r4" x="622.2" y="20" textLength="24.4" clip-path="url(#terminal-2271905219-line-0)">-l</text><text class="terminal-2271905219-r5" x="658.8" y="20" textLength="85.4" clip-path="url(#terminal-2271905219-line-0)">LICENSE</text><text class="terminal-2271905219-r2" x="744.2" y="20" textLength="36.6" clip-path="url(#terminal-2271905219-line-0)">] [</text><text class="terminal-2271905219-r4" x="780.8" y="20" textLength="24.4" clip-path="url(#terminal-2271905219-line-0)">-m</text><text class="terminal-2271905219-r2" x="805.2" y="20" textLength="36.6" clip-path="url(#terminal-2271905219-line-0)">] [</text><text class="terminal-2271905219-r4" x="841.8" y="20" textLength="24.4" clip-path="url(#terminal-2271905219-line-0)">-n</text><text class="terminal-2271905219-r2" x="866.2" y="20" textLength="24.4" clip-path="url(#terminal-2271905219-line-0)">] </text><text class="terminal-2271905219-r4" x="890.6" y="20" textLength="24.4" clip-path="url(#terminal-2271905219-line-0)">-p</text><text class="terminal-2271905219-r5" x="927.2" y="20" textLength="48.8" clip-path="url(#terminal-2271905219-line-0)">ROOT</text><text class="terminal-2271905219-r2" x="976" y="20" textLength="24.4" clip-path="url(#terminal-2271905219-line-0)"> [</text><text class="terminal-2271905219-r4" x="1000.4" y="20" textLength="24.4" clip-path="url(#terminal-2271905219-line-0)">-r</text><text class="terminal-2271905219-r2" x="1024.8" y="20" textLength="24.4" clip-path="url(#terminal-2271905219-line-0)">] </text><text class="terminal-2271905219-r4" x="1049.2" y="20" textLength="24.4" clip-path="url(#terminal-2271905219-line-0)">-t</text><text class="terminal-2271905219-r5" x="1085.8" y="20" textLength="61" clip-path="url(#terminal-2271905219-line-0)">TITLE</text><text class="terminal-2271905219-r4" x="1159" y="20" textLength="24.4" clip-path="url(#terminal-2271905219-line-0)">-w</text><text class="terminal-2271905219-r5" x="1195.6" y="20" textLength="36.6" clip-path="url(#terminal-2271905219-line-0)">URL</text><text class="terminal-2271905219-r2" x="1464" y="20" textLength="12.2" clip-path="url(#terminal-2271905219-line-0)">
|
||||
</text><text class="terminal-2271905219-r2" x="0" y="44.4" textLength="231.8" clip-path="url(#terminal-2271905219-line-1)">                  [</text><text class="terminal-2271905219-r4" x="231.8" y="44.4" textLength="195.2" clip-path="url(#terminal-2271905219-line-1)">--exclude-folder</text><text class="terminal-2271905219-r5" x="439.2" y="44.4" textLength="73.2" clip-path="url(#terminal-2271905219-line-1)">FOLDER</text><text class="terminal-2271905219-r2" x="512.4" y="44.4" textLength="36.6" clip-path="url(#terminal-2271905219-line-1)">] [</text><text class="terminal-2271905219-r4" x="549" y="44.4" textLength="244" clip-path="url(#terminal-2271905219-line-1)">--ignore-other-files</text><text class="terminal-2271905219-r2" x="793" y="44.4" textLength="36.6" clip-path="url(#terminal-2271905219-line-1)">] [</text><text class="terminal-2271905219-r4" x="829.6" y="44.4" textLength="146.4" clip-path="url(#terminal-2271905219-line-1)">--theme-path</text><text class="terminal-2271905219-r5" x="988.2" y="44.4" textLength="48.8" clip-path="url(#terminal-2271905219-line-1)">PATH</text><text class="terminal-2271905219-r2" x="1037" y="44.4" textLength="36.6" clip-path="url(#terminal-2271905219-line-1)">] [</text><text class="terminal-2271905219-r4" x="1073.6" y="44.4" textLength="231.8" clip-path="url(#terminal-2271905219-line-1)">--use-fancy-folders</text><text class="terminal-2271905219-r2" x="1305.4" y="44.4" textLength="12.2" clip-path="url(#terminal-2271905219-line-1)">]</text><text class="terminal-2271905219-r2" x="1464" y="44.4" textLength="12.2" clip-path="url(#terminal-2271905219-line-1)">
|
||||
</text><text class="terminal-2271905219-r2" x="0" y="68.8" textLength="231.8" clip-path="url(#terminal-2271905219-line-2)">                  [</text><text class="terminal-2271905219-r4" x="231.8" y="68.8" textLength="109.8" clip-path="url(#terminal-2271905219-line-2)">--version</text><text class="terminal-2271905219-r2" x="341.6" y="68.8" textLength="12.2" clip-path="url(#terminal-2271905219-line-2)">]</text><text class="terminal-2271905219-r2" x="1464" y="68.8" textLength="12.2" clip-path="url(#terminal-2271905219-line-2)">
|
||||
</text><text class="terminal-2271905219-r2" x="1464" y="93.2" textLength="12.2" clip-path="url(#terminal-2271905219-line-3)">
|
||||
</text><text class="terminal-2271905219-r2" x="0" y="117.6" textLength="671" clip-path="url(#terminal-2271905219-line-4)">Generate HTML files for a static image hosting website.</text><text class="terminal-2271905219-r2" x="1464" y="117.6" textLength="12.2" clip-path="url(#terminal-2271905219-line-4)">
|
||||
</text><text class="terminal-2271905219-r2" x="1464" y="142" textLength="12.2" clip-path="url(#terminal-2271905219-line-5)">
|
||||
</text><text class="terminal-2271905219-r1" x="0" y="166.4" textLength="97.6" clip-path="url(#terminal-2271905219-line-6)">Options:</text><text class="terminal-2271905219-r2" x="1464" y="166.4" textLength="12.2" clip-path="url(#terminal-2271905219-line-6)">
|
||||
</text><text class="terminal-2271905219-r4" x="24.4" y="190.8" textLength="24.4" clip-path="url(#terminal-2271905219-line-7)">-h</text><text class="terminal-2271905219-r2" x="48.8" y="190.8" textLength="24.4" clip-path="url(#terminal-2271905219-line-7)">, </text><text class="terminal-2271905219-r4" x="73.2" y="190.8" textLength="73.2" clip-path="url(#terminal-2271905219-line-7)">--help</text><text class="terminal-2271905219-r2" x="292.8" y="190.8" textLength="378.2" clip-path="url(#terminal-2271905219-line-7)">show this help message and exit</text><text class="terminal-2271905219-r2" x="1464" y="190.8" textLength="12.2" clip-path="url(#terminal-2271905219-line-7)">
|
||||
</text><text class="terminal-2271905219-r4" x="24.4" y="215.2" textLength="24.4" clip-path="url(#terminal-2271905219-line-8)">-a</text><text class="terminal-2271905219-r2" x="48.8" y="215.2" textLength="24.4" clip-path="url(#terminal-2271905219-line-8)">, </text><text class="terminal-2271905219-r4" x="73.2" y="215.2" textLength="158.6" clip-path="url(#terminal-2271905219-line-8)">--author-name</text><text class="terminal-2271905219-r5" x="244" y="215.2" textLength="73.2" clip-path="url(#terminal-2271905219-line-8)">AUTHOR</text><text class="terminal-2271905219-r2" x="1464" y="215.2" textLength="12.2" clip-path="url(#terminal-2271905219-line-8)">
|
||||
</text><text class="terminal-2271905219-r2" x="292.8" y="239.6" textLength="402.6" clip-path="url(#terminal-2271905219-line-9)">Name of the author of the images.</text><text class="terminal-2271905219-r2" x="1464" y="239.6" textLength="12.2" clip-path="url(#terminal-2271905219-line-9)">
|
||||
</text><text class="terminal-2271905219-r4" x="24.4" y="264" textLength="24.4" clip-path="url(#terminal-2271905219-line-10)">-e</text><text class="terminal-2271905219-r2" x="48.8" y="264" textLength="24.4" clip-path="url(#terminal-2271905219-line-10)">, </text><text class="terminal-2271905219-r4" x="73.2" y="264" textLength="207.4" clip-path="url(#terminal-2271905219-line-10)">--file-extensions</text><text class="terminal-2271905219-r5" x="292.8" y="264" textLength="109.8" clip-path="url(#terminal-2271905219-line-10)">EXTENSION</text><text class="terminal-2271905219-r2" x="1464" y="264" textLength="12.2" clip-path="url(#terminal-2271905219-line-10)">
|
||||
</text><text class="terminal-2271905219-r2" x="292.8" y="288.4" textLength="744.2" clip-path="url(#terminal-2271905219-line-11)">File extensions to include (can be specified multiple times).</text><text class="terminal-2271905219-r2" x="1464" y="288.4" textLength="12.2" clip-path="url(#terminal-2271905219-line-11)">
|
||||
</text><text class="terminal-2271905219-r4" x="24.4" y="312.8" textLength="24.4" clip-path="url(#terminal-2271905219-line-12)">-l</text><text class="terminal-2271905219-r2" x="48.8" y="312.8" textLength="24.4" clip-path="url(#terminal-2271905219-line-12)">, </text><text class="terminal-2271905219-r4" x="73.2" y="312.8" textLength="170.8" clip-path="url(#terminal-2271905219-line-12)">--license-type</text><text class="terminal-2271905219-r5" x="256.2" y="312.8" textLength="85.4" clip-path="url(#terminal-2271905219-line-12)">LICENSE</text><text class="terminal-2271905219-r2" x="1464" y="312.8" textLength="12.2" clip-path="url(#terminal-2271905219-line-12)">
|
||||
</text><text class="terminal-2271905219-r2" x="292.8" y="337.2" textLength="488" clip-path="url(#terminal-2271905219-line-13)">Specify the license type for the images.</text><text class="terminal-2271905219-r2" x="1464" y="337.2" textLength="12.2" clip-path="url(#terminal-2271905219-line-13)">
|
||||
</text><text class="terminal-2271905219-r4" x="24.4" y="361.6" textLength="24.4" clip-path="url(#terminal-2271905219-line-14)">-m</text><text class="terminal-2271905219-r2" x="48.8" y="361.6" textLength="24.4" clip-path="url(#terminal-2271905219-line-14)">, </text><text class="terminal-2271905219-r4" x="73.2" y="361.6" textLength="170.8" clip-path="url(#terminal-2271905219-line-14)">--web-manifest</text><text class="terminal-2271905219-r2" x="292.8" y="361.6" textLength="353.8" clip-path="url(#terminal-2271905219-line-14)">Generate a web manifest file.</text><text class="terminal-2271905219-r2" x="1464" y="361.6" textLength="12.2" clip-path="url(#terminal-2271905219-line-14)">
|
||||
</text><text class="terminal-2271905219-r4" x="24.4" y="386" textLength="24.4" clip-path="url(#terminal-2271905219-line-15)">-n</text><text class="terminal-2271905219-r2" x="48.8" y="386" textLength="24.4" clip-path="url(#terminal-2271905219-line-15)">, </text><text class="terminal-2271905219-r4" x="73.2" y="386" textLength="268.4" clip-path="url(#terminal-2271905219-line-15)">--non-interactive-mode</text><text class="terminal-2271905219-r2" x="1464" y="386" textLength="12.2" clip-path="url(#terminal-2271905219-line-15)">
|
||||
</text><text class="terminal-2271905219-r2" x="292.8" y="410.4" textLength="646.6" clip-path="url(#terminal-2271905219-line-16)">Run in non-interactive mode, disabling progress bars.</text><text class="terminal-2271905219-r2" x="1464" y="410.4" textLength="12.2" clip-path="url(#terminal-2271905219-line-16)">
|
||||
</text><text class="terminal-2271905219-r4" x="24.4" y="434.8" textLength="24.4" clip-path="url(#terminal-2271905219-line-17)">-p</text><text class="terminal-2271905219-r2" x="48.8" y="434.8" textLength="24.4" clip-path="url(#terminal-2271905219-line-17)">, </text><text class="terminal-2271905219-r4" x="73.2" y="434.8" textLength="195.2" clip-path="url(#terminal-2271905219-line-17)">--root-directory</text><text class="terminal-2271905219-r5" x="280.6" y="434.8" textLength="48.8" clip-path="url(#terminal-2271905219-line-17)">ROOT</text><text class="terminal-2271905219-r2" x="1464" y="434.8" textLength="12.2" clip-path="url(#terminal-2271905219-line-17)">
|
||||
</text><text class="terminal-2271905219-r2" x="292.8" y="459.2" textLength="451.4" clip-path="url(#terminal-2271905219-line-18)">Root directory containing the images.</text><text class="terminal-2271905219-r2" x="1464" y="459.2" textLength="12.2" clip-path="url(#terminal-2271905219-line-18)">
|
||||
</text><text class="terminal-2271905219-r4" x="24.4" y="483.6" textLength="24.4" clip-path="url(#terminal-2271905219-line-19)">-r</text><text class="terminal-2271905219-r2" x="48.8" y="483.6" textLength="24.4" clip-path="url(#terminal-2271905219-line-19)">, </text><text class="terminal-2271905219-r4" x="73.2" y="483.6" textLength="280.6" clip-path="url(#terminal-2271905219-line-19)">--regenerate-thumbnails</text><text class="terminal-2271905219-r2" x="1464" y="483.6" textLength="12.2" clip-path="url(#terminal-2271905219-line-19)">
|
||||
</text><text class="terminal-2271905219-r2" x="292.8" y="508" textLength="597.8" clip-path="url(#terminal-2271905219-line-20)">Regenerate thumbnails even if they already exist.</text><text class="terminal-2271905219-r2" x="1464" y="508" textLength="12.2" clip-path="url(#terminal-2271905219-line-20)">
|
||||
</text><text class="terminal-2271905219-r4" x="24.4" y="532.4" textLength="24.4" clip-path="url(#terminal-2271905219-line-21)">-t</text><text class="terminal-2271905219-r2" x="48.8" y="532.4" textLength="24.4" clip-path="url(#terminal-2271905219-line-21)">, </text><text class="terminal-2271905219-r4" x="73.2" y="532.4" textLength="146.4" clip-path="url(#terminal-2271905219-line-21)">--site-title</text><text class="terminal-2271905219-r5" x="231.8" y="532.4" textLength="61" clip-path="url(#terminal-2271905219-line-21)">TITLE</text><text class="terminal-2271905219-r2" x="1464" y="532.4" textLength="12.2" clip-path="url(#terminal-2271905219-line-21)">
|
||||
</text><text class="terminal-2271905219-r2" x="292.8" y="556.8" textLength="390.4" clip-path="url(#terminal-2271905219-line-22)">Title of the image hosting site.</text><text class="terminal-2271905219-r2" x="1464" y="556.8" textLength="12.2" clip-path="url(#terminal-2271905219-line-22)">
|
||||
</text><text class="terminal-2271905219-r4" x="24.4" y="581.2" textLength="24.4" clip-path="url(#terminal-2271905219-line-23)">-w</text><text class="terminal-2271905219-r2" x="48.8" y="581.2" textLength="24.4" clip-path="url(#terminal-2271905219-line-23)">, </text><text class="terminal-2271905219-r4" x="73.2" y="581.2" textLength="170.8" clip-path="url(#terminal-2271905219-line-23)">--web-root-url</text><text class="terminal-2271905219-r5" x="256.2" y="581.2" textLength="36.6" clip-path="url(#terminal-2271905219-line-23)">URL</text><text class="terminal-2271905219-r2" x="1464" y="581.2" textLength="12.2" clip-path="url(#terminal-2271905219-line-23)">
|
||||
</text><text class="terminal-2271905219-r2" x="292.8" y="605.6" textLength="634.4" clip-path="url(#terminal-2271905219-line-24)">Base URL of the web root for the image hosting site.</text><text class="terminal-2271905219-r2" x="1464" y="605.6" textLength="12.2" clip-path="url(#terminal-2271905219-line-24)">
|
||||
</text><text class="terminal-2271905219-r4" x="24.4" y="630" textLength="195.2" clip-path="url(#terminal-2271905219-line-25)">--exclude-folder</text><text class="terminal-2271905219-r5" x="231.8" y="630" textLength="73.2" clip-path="url(#terminal-2271905219-line-25)">FOLDER</text><text class="terminal-2271905219-r2" x="1464" y="630" textLength="12.2" clip-path="url(#terminal-2271905219-line-25)">
|
||||
</text><text class="terminal-2271905219-r2" x="292.8" y="654.4" textLength="1049.2" clip-path="url(#terminal-2271905219-line-26)">Folders to exclude from processing, globs supported (can be specified multiple times).</text><text class="terminal-2271905219-r2" x="1464" y="654.4" textLength="12.2" clip-path="url(#terminal-2271905219-line-26)">
|
||||
</text><text class="terminal-2271905219-r4" x="24.4" y="678.8" textLength="244" clip-path="url(#terminal-2271905219-line-27)">--ignore-other-files</text><text class="terminal-2271905219-r2" x="292.8" y="678.8" textLength="683.2" clip-path="url(#terminal-2271905219-line-27)">Ignore files that do not match the specified extensions.</text><text class="terminal-2271905219-r2" x="1464" y="678.8" textLength="12.2" clip-path="url(#terminal-2271905219-line-27)">
|
||||
</text><text class="terminal-2271905219-r4" x="24.4" y="703.2" textLength="146.4" clip-path="url(#terminal-2271905219-line-28)">--theme-path</text><text class="terminal-2271905219-r5" x="183" y="703.2" textLength="48.8" clip-path="url(#terminal-2271905219-line-28)">PATH</text><text class="terminal-2271905219-r2" x="292.8" y="703.2" textLength="329.4" clip-path="url(#terminal-2271905219-line-28)">Path to the CSS theme file.</text><text class="terminal-2271905219-r2" x="1464" y="703.2" textLength="12.2" clip-path="url(#terminal-2271905219-line-28)">
|
||||
</text><text class="terminal-2271905219-r4" x="24.4" y="727.6" textLength="231.8" clip-path="url(#terminal-2271905219-line-29)">--use-fancy-folders</text><text class="terminal-2271905219-r2" x="292.8" y="727.6" textLength="890.6" clip-path="url(#terminal-2271905219-line-29)">Enable fancy folder view instead of the default Apache directory listing.</text><text class="terminal-2271905219-r2" x="1464" y="727.6" textLength="12.2" clip-path="url(#terminal-2271905219-line-29)">
|
||||
</text><text class="terminal-2271905219-r4" x="24.4" y="752" textLength="109.8" clip-path="url(#terminal-2271905219-line-30)">--version</text><text class="terminal-2271905219-r2" x="292.8" y="752" textLength="463.6" clip-path="url(#terminal-2271905219-line-30)">show program's version number and exit</text><text class="terminal-2271905219-r2" x="1464" y="752" textLength="12.2" clip-path="url(#terminal-2271905219-line-30)">
|
||||
<g class="terminal-1308707172-matrix">
|
||||
<text class="terminal-1308707172-r1" x="0" y="20" textLength="73.2" clip-path="url(#terminal-1308707172-line-0)">Usage:</text><text class="terminal-1308707172-r3" x="85.4" y="20" textLength="122" clip-path="url(#terminal-1308707172-line-0)">builder.py</text><text class="terminal-1308707172-r2" x="207.4" y="20" textLength="24.4" clip-path="url(#terminal-1308707172-line-0)"> [</text><text class="terminal-1308707172-r4" x="231.8" y="20" textLength="24.4" clip-path="url(#terminal-1308707172-line-0)">-h</text><text class="terminal-1308707172-r2" x="256.2" y="20" textLength="36.6" clip-path="url(#terminal-1308707172-line-0)">] [</text><text class="terminal-1308707172-r4" x="292.8" y="20" textLength="24.4" clip-path="url(#terminal-1308707172-line-0)">-a</text><text class="terminal-1308707172-r5" x="329.4" y="20" textLength="73.2" clip-path="url(#terminal-1308707172-line-0)">AUTHOR</text><text class="terminal-1308707172-r2" x="402.6" y="20" textLength="36.6" clip-path="url(#terminal-1308707172-line-0)">] [</text><text class="terminal-1308707172-r4" x="439.2" y="20" textLength="24.4" clip-path="url(#terminal-1308707172-line-0)">-e</text><text class="terminal-1308707172-r5" x="475.8" y="20" textLength="109.8" clip-path="url(#terminal-1308707172-line-0)">EXTENSION</text><text class="terminal-1308707172-r2" x="585.6" y="20" textLength="36.6" clip-path="url(#terminal-1308707172-line-0)">] [</text><text class="terminal-1308707172-r4" x="622.2" y="20" textLength="24.4" clip-path="url(#terminal-1308707172-line-0)">-l</text><text class="terminal-1308707172-r5" x="658.8" y="20" textLength="85.4" clip-path="url(#terminal-1308707172-line-0)">LICENSE</text><text class="terminal-1308707172-r2" x="744.2" y="20" textLength="36.6" clip-path="url(#terminal-1308707172-line-0)">] [</text><text class="terminal-1308707172-r4" x="780.8" y="20" textLength="24.4" clip-path="url(#terminal-1308707172-line-0)">-m</text><text class="terminal-1308707172-r2" x="805.2" y="20" textLength="36.6" clip-path="url(#terminal-1308707172-line-0)">] [</text><text class="terminal-1308707172-r4" x="841.8" y="20" textLength="24.4" clip-path="url(#terminal-1308707172-line-0)">-n</text><text class="terminal-1308707172-r2" x="866.2" y="20" textLength="24.4" clip-path="url(#terminal-1308707172-line-0)">] </text><text class="terminal-1308707172-r4" x="890.6" y="20" textLength="24.4" clip-path="url(#terminal-1308707172-line-0)">-p</text><text class="terminal-1308707172-r5" x="927.2" y="20" textLength="48.8" clip-path="url(#terminal-1308707172-line-0)">ROOT</text><text class="terminal-1308707172-r4" x="988.2" y="20" textLength="24.4" clip-path="url(#terminal-1308707172-line-0)">-t</text><text class="terminal-1308707172-r5" x="1024.8" y="20" textLength="61" clip-path="url(#terminal-1308707172-line-0)">TITLE</text><text class="terminal-1308707172-r4" x="1098" y="20" textLength="24.4" clip-path="url(#terminal-1308707172-line-0)">-w</text><text class="terminal-1308707172-r5" x="1134.6" y="20" textLength="36.6" clip-path="url(#terminal-1308707172-line-0)">URL</text><text class="terminal-1308707172-r2" x="1464" y="20" textLength="12.2" clip-path="url(#terminal-1308707172-line-0)">
|
||||
</text><text class="terminal-1308707172-r2" x="0" y="44.4" textLength="231.8" clip-path="url(#terminal-1308707172-line-1)">                  [</text><text class="terminal-1308707172-r4" x="231.8" y="44.4" textLength="195.2" clip-path="url(#terminal-1308707172-line-1)">--exclude-folder</text><text class="terminal-1308707172-r5" x="439.2" y="44.4" textLength="73.2" clip-path="url(#terminal-1308707172-line-1)">FOLDER</text><text class="terminal-1308707172-r2" x="512.4" y="44.4" textLength="36.6" clip-path="url(#terminal-1308707172-line-1)">] [</text><text class="terminal-1308707172-r4" x="549" y="44.4" textLength="244" clip-path="url(#terminal-1308707172-line-1)">--ignore-other-files</text><text class="terminal-1308707172-r2" x="793" y="44.4" textLength="36.6" clip-path="url(#terminal-1308707172-line-1)">] [</text><text class="terminal-1308707172-r4" x="829.6" y="44.4" textLength="280.6" clip-path="url(#terminal-1308707172-line-1)">--regenerate-thumbnails</text><text class="terminal-1308707172-r2" x="1110.2" y="44.4" textLength="36.6" clip-path="url(#terminal-1308707172-line-1)">] [</text><text class="terminal-1308707172-r4" x="1146.8" y="44.4" textLength="207.4" clip-path="url(#terminal-1308707172-line-1)">--reread-metadata</text><text class="terminal-1308707172-r2" x="1354.2" y="44.4" textLength="12.2" clip-path="url(#terminal-1308707172-line-1)">]</text><text class="terminal-1308707172-r2" x="1464" y="44.4" textLength="12.2" clip-path="url(#terminal-1308707172-line-1)">
|
||||
</text><text class="terminal-1308707172-r2" x="0" y="68.8" textLength="231.8" clip-path="url(#terminal-1308707172-line-2)">                  [</text><text class="terminal-1308707172-r4" x="231.8" y="68.8" textLength="170.8" clip-path="url(#terminal-1308707172-line-2)">--reverse-sort</text><text class="terminal-1308707172-r2" x="402.6" y="68.8" textLength="36.6" clip-path="url(#terminal-1308707172-line-2)">] [</text><text class="terminal-1308707172-r4" x="439.2" y="68.8" textLength="146.4" clip-path="url(#terminal-1308707172-line-2)">--theme-path</text><text class="terminal-1308707172-r5" x="597.8" y="68.8" textLength="48.8" clip-path="url(#terminal-1308707172-line-2)">PATH</text><text class="terminal-1308707172-r2" x="646.6" y="68.8" textLength="36.6" clip-path="url(#terminal-1308707172-line-2)">] [</text><text class="terminal-1308707172-r4" x="683.2" y="68.8" textLength="231.8" clip-path="url(#terminal-1308707172-line-2)">--use-fancy-folders</text><text class="terminal-1308707172-r2" x="915" y="68.8" textLength="36.6" clip-path="url(#terminal-1308707172-line-2)">] [</text><text class="terminal-1308707172-r4" x="951.6" y="68.8" textLength="109.8" clip-path="url(#terminal-1308707172-line-2)">--version</text><text class="terminal-1308707172-r2" x="1061.4" y="68.8" textLength="12.2" clip-path="url(#terminal-1308707172-line-2)">]</text><text class="terminal-1308707172-r2" x="1464" y="68.8" textLength="12.2" clip-path="url(#terminal-1308707172-line-2)">
|
||||
</text><text class="terminal-1308707172-r2" x="1464" y="93.2" textLength="12.2" clip-path="url(#terminal-1308707172-line-3)">
|
||||
</text><text class="terminal-1308707172-r2" x="0" y="117.6" textLength="671" clip-path="url(#terminal-1308707172-line-4)">Generate HTML files for a static image hosting website.</text><text class="terminal-1308707172-r2" x="1464" y="117.6" textLength="12.2" clip-path="url(#terminal-1308707172-line-4)">
|
||||
</text><text class="terminal-1308707172-r2" x="1464" y="142" textLength="12.2" clip-path="url(#terminal-1308707172-line-5)">
|
||||
</text><text class="terminal-1308707172-r1" x="0" y="166.4" textLength="97.6" clip-path="url(#terminal-1308707172-line-6)">Options:</text><text class="terminal-1308707172-r2" x="1464" y="166.4" textLength="12.2" clip-path="url(#terminal-1308707172-line-6)">
|
||||
</text><text class="terminal-1308707172-r4" x="24.4" y="190.8" textLength="24.4" clip-path="url(#terminal-1308707172-line-7)">-h</text><text class="terminal-1308707172-r2" x="48.8" y="190.8" textLength="24.4" clip-path="url(#terminal-1308707172-line-7)">, </text><text class="terminal-1308707172-r4" x="73.2" y="190.8" textLength="73.2" clip-path="url(#terminal-1308707172-line-7)">--help</text><text class="terminal-1308707172-r2" x="292.8" y="190.8" textLength="378.2" clip-path="url(#terminal-1308707172-line-7)">show this help message and exit</text><text class="terminal-1308707172-r2" x="1464" y="190.8" textLength="12.2" clip-path="url(#terminal-1308707172-line-7)">
|
||||
</text><text class="terminal-1308707172-r4" x="24.4" y="215.2" textLength="24.4" clip-path="url(#terminal-1308707172-line-8)">-a</text><text class="terminal-1308707172-r2" x="48.8" y="215.2" textLength="24.4" clip-path="url(#terminal-1308707172-line-8)">, </text><text class="terminal-1308707172-r4" x="73.2" y="215.2" textLength="158.6" clip-path="url(#terminal-1308707172-line-8)">--author-name</text><text class="terminal-1308707172-r5" x="244" y="215.2" textLength="73.2" clip-path="url(#terminal-1308707172-line-8)">AUTHOR</text><text class="terminal-1308707172-r2" x="1464" y="215.2" textLength="12.2" clip-path="url(#terminal-1308707172-line-8)">
|
||||
</text><text class="terminal-1308707172-r2" x="292.8" y="239.6" textLength="402.6" clip-path="url(#terminal-1308707172-line-9)">Name of the author of the images.</text><text class="terminal-1308707172-r2" x="1464" y="239.6" textLength="12.2" clip-path="url(#terminal-1308707172-line-9)">
|
||||
</text><text class="terminal-1308707172-r4" x="24.4" y="264" textLength="24.4" clip-path="url(#terminal-1308707172-line-10)">-e</text><text class="terminal-1308707172-r2" x="48.8" y="264" textLength="24.4" clip-path="url(#terminal-1308707172-line-10)">, </text><text class="terminal-1308707172-r4" x="73.2" y="264" textLength="207.4" clip-path="url(#terminal-1308707172-line-10)">--file-extensions</text><text class="terminal-1308707172-r5" x="292.8" y="264" textLength="109.8" clip-path="url(#terminal-1308707172-line-10)">EXTENSION</text><text class="terminal-1308707172-r2" x="1464" y="264" textLength="12.2" clip-path="url(#terminal-1308707172-line-10)">
|
||||
</text><text class="terminal-1308707172-r2" x="292.8" y="288.4" textLength="744.2" clip-path="url(#terminal-1308707172-line-11)">File extensions to include (can be specified multiple times).</text><text class="terminal-1308707172-r2" x="1464" y="288.4" textLength="12.2" clip-path="url(#terminal-1308707172-line-11)">
|
||||
</text><text class="terminal-1308707172-r4" x="24.4" y="312.8" textLength="24.4" clip-path="url(#terminal-1308707172-line-12)">-l</text><text class="terminal-1308707172-r2" x="48.8" y="312.8" textLength="24.4" clip-path="url(#terminal-1308707172-line-12)">, </text><text class="terminal-1308707172-r4" x="73.2" y="312.8" textLength="170.8" clip-path="url(#terminal-1308707172-line-12)">--license-type</text><text class="terminal-1308707172-r5" x="256.2" y="312.8" textLength="85.4" clip-path="url(#terminal-1308707172-line-12)">LICENSE</text><text class="terminal-1308707172-r2" x="1464" y="312.8" textLength="12.2" clip-path="url(#terminal-1308707172-line-12)">
|
||||
</text><text class="terminal-1308707172-r2" x="292.8" y="337.2" textLength="488" clip-path="url(#terminal-1308707172-line-13)">Specify the license type for the images.</text><text class="terminal-1308707172-r2" x="1464" y="337.2" textLength="12.2" clip-path="url(#terminal-1308707172-line-13)">
|
||||
</text><text class="terminal-1308707172-r4" x="24.4" y="361.6" textLength="24.4" clip-path="url(#terminal-1308707172-line-14)">-m</text><text class="terminal-1308707172-r2" x="48.8" y="361.6" textLength="24.4" clip-path="url(#terminal-1308707172-line-14)">, </text><text class="terminal-1308707172-r4" x="73.2" y="361.6" textLength="170.8" clip-path="url(#terminal-1308707172-line-14)">--web-manifest</text><text class="terminal-1308707172-r2" x="292.8" y="361.6" textLength="353.8" clip-path="url(#terminal-1308707172-line-14)">Generate a web manifest file.</text><text class="terminal-1308707172-r2" x="1464" y="361.6" textLength="12.2" clip-path="url(#terminal-1308707172-line-14)">
|
||||
</text><text class="terminal-1308707172-r4" x="24.4" y="386" textLength="24.4" clip-path="url(#terminal-1308707172-line-15)">-n</text><text class="terminal-1308707172-r2" x="48.8" y="386" textLength="24.4" clip-path="url(#terminal-1308707172-line-15)">, </text><text class="terminal-1308707172-r4" x="73.2" y="386" textLength="268.4" clip-path="url(#terminal-1308707172-line-15)">--non-interactive-mode</text><text class="terminal-1308707172-r2" x="1464" y="386" textLength="12.2" clip-path="url(#terminal-1308707172-line-15)">
|
||||
</text><text class="terminal-1308707172-r2" x="292.8" y="410.4" textLength="646.6" clip-path="url(#terminal-1308707172-line-16)">Run in non-interactive mode, disabling progress bars.</text><text class="terminal-1308707172-r2" x="1464" y="410.4" textLength="12.2" clip-path="url(#terminal-1308707172-line-16)">
|
||||
</text><text class="terminal-1308707172-r4" x="24.4" y="434.8" textLength="24.4" clip-path="url(#terminal-1308707172-line-17)">-p</text><text class="terminal-1308707172-r2" x="48.8" y="434.8" textLength="24.4" clip-path="url(#terminal-1308707172-line-17)">, </text><text class="terminal-1308707172-r4" x="73.2" y="434.8" textLength="195.2" clip-path="url(#terminal-1308707172-line-17)">--root-directory</text><text class="terminal-1308707172-r5" x="280.6" y="434.8" textLength="48.8" clip-path="url(#terminal-1308707172-line-17)">ROOT</text><text class="terminal-1308707172-r2" x="1464" y="434.8" textLength="12.2" clip-path="url(#terminal-1308707172-line-17)">
|
||||
</text><text class="terminal-1308707172-r2" x="292.8" y="459.2" textLength="451.4" clip-path="url(#terminal-1308707172-line-18)">Root directory containing the images.</text><text class="terminal-1308707172-r2" x="1464" y="459.2" textLength="12.2" clip-path="url(#terminal-1308707172-line-18)">
|
||||
</text><text class="terminal-1308707172-r4" x="24.4" y="483.6" textLength="24.4" clip-path="url(#terminal-1308707172-line-19)">-t</text><text class="terminal-1308707172-r2" x="48.8" y="483.6" textLength="24.4" clip-path="url(#terminal-1308707172-line-19)">, </text><text class="terminal-1308707172-r4" x="73.2" y="483.6" textLength="146.4" clip-path="url(#terminal-1308707172-line-19)">--site-title</text><text class="terminal-1308707172-r5" x="231.8" y="483.6" textLength="61" clip-path="url(#terminal-1308707172-line-19)">TITLE</text><text class="terminal-1308707172-r2" x="1464" y="483.6" textLength="12.2" clip-path="url(#terminal-1308707172-line-19)">
|
||||
</text><text class="terminal-1308707172-r2" x="292.8" y="508" textLength="390.4" clip-path="url(#terminal-1308707172-line-20)">Title of the image hosting site.</text><text class="terminal-1308707172-r2" x="1464" y="508" textLength="12.2" clip-path="url(#terminal-1308707172-line-20)">
|
||||
</text><text class="terminal-1308707172-r4" x="24.4" y="532.4" textLength="24.4" clip-path="url(#terminal-1308707172-line-21)">-w</text><text class="terminal-1308707172-r2" x="48.8" y="532.4" textLength="24.4" clip-path="url(#terminal-1308707172-line-21)">, </text><text class="terminal-1308707172-r4" x="73.2" y="532.4" textLength="170.8" clip-path="url(#terminal-1308707172-line-21)">--web-root-url</text><text class="terminal-1308707172-r5" x="256.2" y="532.4" textLength="36.6" clip-path="url(#terminal-1308707172-line-21)">URL</text><text class="terminal-1308707172-r2" x="1464" y="532.4" textLength="12.2" clip-path="url(#terminal-1308707172-line-21)">
|
||||
</text><text class="terminal-1308707172-r2" x="292.8" y="556.8" textLength="634.4" clip-path="url(#terminal-1308707172-line-22)">Base URL of the web root for the image hosting site.</text><text class="terminal-1308707172-r2" x="1464" y="556.8" textLength="12.2" clip-path="url(#terminal-1308707172-line-22)">
|
||||
</text><text class="terminal-1308707172-r4" x="24.4" y="581.2" textLength="195.2" clip-path="url(#terminal-1308707172-line-23)">--exclude-folder</text><text class="terminal-1308707172-r5" x="231.8" y="581.2" textLength="73.2" clip-path="url(#terminal-1308707172-line-23)">FOLDER</text><text class="terminal-1308707172-r2" x="1464" y="581.2" textLength="12.2" clip-path="url(#terminal-1308707172-line-23)">
|
||||
</text><text class="terminal-1308707172-r2" x="292.8" y="605.6" textLength="1049.2" clip-path="url(#terminal-1308707172-line-24)">Folders to exclude from processing, globs supported (can be specified multiple times).</text><text class="terminal-1308707172-r2" x="1464" y="605.6" textLength="12.2" clip-path="url(#terminal-1308707172-line-24)">
|
||||
</text><text class="terminal-1308707172-r4" x="24.4" y="630" textLength="244" clip-path="url(#terminal-1308707172-line-25)">--ignore-other-files</text><text class="terminal-1308707172-r2" x="292.8" y="630" textLength="683.2" clip-path="url(#terminal-1308707172-line-25)">Ignore files that do not match the specified extensions.</text><text class="terminal-1308707172-r2" x="1464" y="630" textLength="12.2" clip-path="url(#terminal-1308707172-line-25)">
|
||||
</text><text class="terminal-1308707172-r4" x="24.4" y="654.4" textLength="280.6" clip-path="url(#terminal-1308707172-line-26)">--regenerate-thumbnails</text><text class="terminal-1308707172-r2" x="1464" y="654.4" textLength="12.2" clip-path="url(#terminal-1308707172-line-26)">
|
||||
</text><text class="terminal-1308707172-r2" x="292.8" y="678.8" textLength="597.8" clip-path="url(#terminal-1308707172-line-27)">Regenerate thumbnails even if they already exist.</text><text class="terminal-1308707172-r2" x="1464" y="678.8" textLength="12.2" clip-path="url(#terminal-1308707172-line-27)">
|
||||
</text><text class="terminal-1308707172-r4" x="24.4" y="703.2" textLength="207.4" clip-path="url(#terminal-1308707172-line-28)">--reread-metadata</text><text class="terminal-1308707172-r2" x="292.8" y="703.2" textLength="256.2" clip-path="url(#terminal-1308707172-line-28)">Reread image metadata</text><text class="terminal-1308707172-r2" x="1464" y="703.2" textLength="12.2" clip-path="url(#terminal-1308707172-line-28)">
|
||||
</text><text class="terminal-1308707172-r4" x="24.4" y="727.6" textLength="170.8" clip-path="url(#terminal-1308707172-line-29)">--reverse-sort</text><text class="terminal-1308707172-r2" x="292.8" y="727.6" textLength="353.8" clip-path="url(#terminal-1308707172-line-29)">Sort images in reverse order.</text><text class="terminal-1308707172-r2" x="1464" y="727.6" textLength="12.2" clip-path="url(#terminal-1308707172-line-29)">
|
||||
</text><text class="terminal-1308707172-r4" x="24.4" y="752" textLength="146.4" clip-path="url(#terminal-1308707172-line-30)">--theme-path</text><text class="terminal-1308707172-r5" x="183" y="752" textLength="48.8" clip-path="url(#terminal-1308707172-line-30)">PATH</text><text class="terminal-1308707172-r2" x="292.8" y="752" textLength="329.4" clip-path="url(#terminal-1308707172-line-30)">Path to the CSS theme file.</text><text class="terminal-1308707172-r2" x="1464" y="752" textLength="12.2" clip-path="url(#terminal-1308707172-line-30)">
|
||||
</text><text class="terminal-1308707172-r4" x="24.4" y="776.4" textLength="231.8" clip-path="url(#terminal-1308707172-line-31)">--use-fancy-folders</text><text class="terminal-1308707172-r2" x="292.8" y="776.4" textLength="890.6" clip-path="url(#terminal-1308707172-line-31)">Enable fancy folder view instead of the default Apache directory listing.</text><text class="terminal-1308707172-r2" x="1464" y="776.4" textLength="12.2" clip-path="url(#terminal-1308707172-line-31)">
|
||||
</text><text class="terminal-1308707172-r4" x="24.4" y="800.8" textLength="109.8" clip-path="url(#terminal-1308707172-line-32)">--version</text><text class="terminal-1308707172-r2" x="292.8" y="800.8" textLength="463.6" clip-path="url(#terminal-1308707172-line-32)">show program's version number and exit</text><text class="terminal-1308707172-r2" x="1464" y="800.8" textLength="12.2" clip-path="url(#terminal-1308707172-line-32)">
|
||||
</text>
|
||||
</g>
|
||||
</g>
|
||||
|
||||
|
Before Width: | Height: | Size: 24 KiB After Width: | Height: | Size: 25 KiB |
@@ -1,5 +1,5 @@
|
||||
from dataclasses import dataclass
|
||||
from typing import List, Optional
|
||||
from typing import Optional
|
||||
import os
|
||||
import argparse
|
||||
|
||||
@@ -11,8 +11,6 @@ except ModuleNotFoundError:
|
||||
RICH = False
|
||||
|
||||
|
||||
from modules.logger import logger
|
||||
|
||||
if __package__ is None:
|
||||
PACKAGE = ""
|
||||
else:
|
||||
@@ -31,9 +29,9 @@ class Args:
|
||||
-----------
|
||||
author_name : str
|
||||
The name of the author of the images.
|
||||
exclude_folders : List[str]
|
||||
exclude_folders : list[str]
|
||||
A list of folders to exclude from processing.
|
||||
file_extensions : List[str]
|
||||
file_extensions : list[str]
|
||||
A list of file extensions to include.
|
||||
generate_webmanifest : bool
|
||||
Whether to generate a web manifest file.
|
||||
@@ -58,14 +56,15 @@ class Args:
|
||||
"""
|
||||
|
||||
author_name: str
|
||||
exclude_folders: List[str]
|
||||
file_extensions: 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
|
||||
reread_metadata: bool
|
||||
reverse_sort: bool
|
||||
root_directory: str
|
||||
site_title: str
|
||||
theme_path: str
|
||||
@@ -83,6 +82,7 @@ class Args:
|
||||
result["license_type"] = self.license_type
|
||||
result["non_interactive_mode"] = self.non_interactive_mode
|
||||
result["regenerate_thumbnails"] = self.regenerate_thumbnails
|
||||
result["reverse_sort"] = self.reverse_sort
|
||||
result["reread_metadata"] = self.reread_metadata
|
||||
result["root_directory"] = self.root_directory
|
||||
result["site_title"] = self.site_title
|
||||
@@ -125,6 +125,7 @@ def parse_arguments(version: str) -> Args:
|
||||
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("--regenerate-thumbnails", help="Regenerate thumbnails even if they already exist.", action="store_true", default=False, dest="regenerate_thumbnails")
|
||||
parser.add_argument("--reread-metadata", help="Reread image metadata", action="store_true", default=False, dest="reread_metadata")
|
||||
parser.add_argument("--reverse-sort", help="Sort images in reverse order.", action="store_true", default=False, dest="reverse_sort")
|
||||
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("--version", action="version", version=f"%(prog)s {version}")
|
||||
@@ -140,11 +141,11 @@ def parse_arguments(version: str) -> Args:
|
||||
non_interactive_mode=parsed_args.non_interactive_mode,
|
||||
regenerate_thumbnails=parsed_args.regenerate_thumbnails,
|
||||
reread_metadata=parsed_args.reread_metadata,
|
||||
reverse_sort=parsed_args.reverse_sort,
|
||||
root_directory=parsed_args.root_directory,
|
||||
site_title=parsed_args.site_title,
|
||||
theme_path=parsed_args.theme_path,
|
||||
use_fancy_folders=parsed_args.use_fancy_folders,
|
||||
web_root_url=parsed_args.web_root_url,
|
||||
)
|
||||
logger.debug("parsed arguments", extra={"args": _args.to_dict()})
|
||||
return _args
|
||||
|
||||
@@ -1,11 +1,10 @@
|
||||
import re
|
||||
import colorsys
|
||||
from typing import Dict
|
||||
|
||||
from modules.logger import logger
|
||||
|
||||
|
||||
def extract_colorscheme(theme_path: str) -> Dict[str, str]:
|
||||
def extract_colorscheme(theme_path: str) -> dict[str, str]:
|
||||
"""
|
||||
Extract color scheme from a CSS theme file.
|
||||
|
||||
@@ -16,8 +15,8 @@ def extract_colorscheme(theme_path: str) -> Dict[str, str]:
|
||||
|
||||
Returns:
|
||||
--------
|
||||
Dict[str, str]
|
||||
Dictionary containing color scheme variables and their hexadecimal values.
|
||||
dict[str, str]
|
||||
dictionary containing color scheme variables and their hexadecimal values.
|
||||
"""
|
||||
logger.info("extracting color scheme from theme file", extra={"theme_path": theme_path})
|
||||
pattern = r"--(color[1-4]|bcolor1):\s*(#[0-9a-fA-F]+|rgba?\([^)]*\)|hsla?\([^)]*\)|[a-zA-Z]+);"
|
||||
@@ -127,7 +126,7 @@ def css_color_to_hex(css_color: str) -> str:
|
||||
a = float(groups["a"]) if groups["a"] else 1.0
|
||||
if a < 1.0:
|
||||
logger.debug("converting rgba color to hex", extra={"color": css_color, "r": r, "g": g, "b": b, "a": a})
|
||||
return rgb_to_hex((r, g, b)) + "{:02x}".format(round(a * 255))
|
||||
return rgb_to_hex((r, g, b)) + f"{round(a * 255):02x}"
|
||||
else:
|
||||
logger.debug("converting rgb color to hex", extra={"color": css_color, "r": r, "g": g, "b": b})
|
||||
return rgb_to_hex((r, g, b))
|
||||
@@ -140,7 +139,7 @@ def css_color_to_hex(css_color: str) -> str:
|
||||
rgb_color = hsl_to_rgb((h, s, l))
|
||||
if a < 1.0:
|
||||
logger.debug("converting hsla color to hex", extra={"color": css_color, "hsl": (h, s, l), "a": a})
|
||||
return rgb_to_hex(rgb_color) + "{:02x}".format(round(a * 255))
|
||||
return rgb_to_hex(rgb_color) + f"{round(a * 255):02x}"
|
||||
else:
|
||||
logger.debug("converting hsl color to hex", extra={"color": css_color, "hsl": (h, s, l)})
|
||||
return rgb_to_hex(rgb_color)
|
||||
|
||||
@@ -3,16 +3,15 @@ import re
|
||||
import urllib.parse
|
||||
import fnmatch
|
||||
import json
|
||||
from typing import Any, Dict, List, Tuple
|
||||
from typing import Any
|
||||
from datetime import datetime
|
||||
|
||||
import numpy as np
|
||||
from tqdm.auto import tqdm
|
||||
from PIL import Image, ExifTags, TiffImagePlugin
|
||||
from jinja2 import Environment, FileSystemLoader
|
||||
|
||||
from modules.logger import logger
|
||||
import modules.cclicense as cclicense
|
||||
from modules import cclicense
|
||||
from modules.argumentparser import Args
|
||||
|
||||
# Constants for file paths and exclusions
|
||||
@@ -30,12 +29,13 @@ Image.MAX_IMAGE_PIXELS = 933120000
|
||||
|
||||
# Initialize Jinja2 environment for template rendering
|
||||
env = Environment(loader=FileSystemLoader(os.path.join(SCRIPTDIR, "templates")))
|
||||
thumbnails: List[Tuple[str, str]] = []
|
||||
info: Dict[str, str] = {}
|
||||
pbardict: Dict[str, tqdm] = {}
|
||||
thumbnails: list[tuple[str, str]] = []
|
||||
info: dict[str, str] = {}
|
||||
licens: dict[str, str] = {}
|
||||
pbardict: dict[str, tqdm] = {}
|
||||
|
||||
|
||||
def initialize_sizelist(folder: str) -> Dict[str, Dict[str, int]]:
|
||||
def initialize_sizelist(folder: str) -> dict[str, dict[str, int]]:
|
||||
"""
|
||||
Initializes the size list JSON file if it doesn't exist.
|
||||
|
||||
@@ -43,7 +43,7 @@ def initialize_sizelist(folder: str) -> Dict[str, Dict[str, int]]:
|
||||
folder (str): The folder in which the size list file is located.
|
||||
|
||||
Returns:
|
||||
Dict[str, Dict[str, int]]: The size list dictionary.
|
||||
dict[str, dict[str, int]]: The size list dictionary.
|
||||
"""
|
||||
sizelist = {}
|
||||
sizelist_path = os.path.join(folder, ".sizelist.json")
|
||||
@@ -61,12 +61,12 @@ def initialize_sizelist(folder: str) -> Dict[str, Dict[str, int]]:
|
||||
return sizelist
|
||||
|
||||
|
||||
def update_sizelist(sizelist: Dict[str, Dict[str, Any]], folder: str) -> None:
|
||||
def update_sizelist(sizelist: dict[str, dict[str, Any]], folder: str) -> None:
|
||||
"""
|
||||
Updates the size list JSON file.
|
||||
|
||||
Args:
|
||||
sizelist (Dict[str, Dict[str, int]]): The size list dictionary to be written to the file.
|
||||
sizelist (dict[str, dict[str, int]]): The size list dictionary to be written to the file.
|
||||
folder (str): The folder in which the size list file is located.
|
||||
"""
|
||||
sizelist_path = os.path.join(folder, ".sizelist.json")
|
||||
@@ -80,7 +80,7 @@ def update_sizelist(sizelist: Dict[str, Dict[str, Any]], folder: str) -> None:
|
||||
os.remove(sizelist_path)
|
||||
|
||||
|
||||
def get_image_info(item: str, folder: str) -> Dict[str, Any]:
|
||||
def get_image_info(item: str, folder: str) -> dict[str, Any]:
|
||||
"""
|
||||
Extracts image information and EXIF data.
|
||||
|
||||
@@ -89,7 +89,7 @@ def get_image_info(item: str, folder: str) -> Dict[str, Any]:
|
||||
folder (str): The folder containing the image.
|
||||
|
||||
Returns:
|
||||
Dict[str, Any]: A dictionary containing image width, height, and EXIF data.
|
||||
dict[str, Any]: A dictionary containing image width, height, and EXIF data.
|
||||
"""
|
||||
file = os.path.join(folder, item)
|
||||
with Image.open(file) as img:
|
||||
@@ -112,13 +112,16 @@ def get_image_info(item: str, folder: str) -> Dict[str, Any]:
|
||||
newtuple = ()
|
||||
for i in content:
|
||||
if isinstance(i, TiffImagePlugin.IFDRational):
|
||||
newtuple = newtuple + (i.limit_rational(1000000),)
|
||||
newtuple = (*newtuple, i.limit_rational(1000000))
|
||||
if newtuple:
|
||||
content = newtuple
|
||||
if tag in ["DateTime", "DateTimeOriginal", "DateTimeDigitized"]:
|
||||
epr = r'\d{4}:\d{2}:\d{2} \d{2}:\d{2}:\d{2}'
|
||||
epr = r"\d{4}:\d{2}:\d{2} \d{2}:\d{2}:\d{2}"
|
||||
if re.match(epr, content):
|
||||
content = datetime.strptime(content, "%Y:%m:%d %H:%M:%S").strftime("%Y-%m-%d %H:%M:%S")
|
||||
try:
|
||||
content = datetime.strptime(content, "%Y:%m:%d %H:%M:%S").strftime("%Y-%m-%d %H:%M:%S")
|
||||
except ValueError:
|
||||
content = None
|
||||
else:
|
||||
content = None
|
||||
exifdata[tag] = content
|
||||
@@ -133,7 +136,7 @@ def get_image_info(item: str, folder: str) -> Dict[str, Any]:
|
||||
return {"width": width, "height": height, "exifdata": None}
|
||||
|
||||
|
||||
def process_image(item: str, folder: str, _args: Args, baseurl: str, sizelist: Dict[str, Dict[str, int]], raw: List[str]) -> Dict[str, Any]:
|
||||
def process_image(item: str, folder: str, _args: Args, baseurl: str, sizelist: dict[str, dict[str, int]], raw: list[str]) -> dict[str, Any]:
|
||||
"""
|
||||
Processes an image and prepares its data for the HTML template.
|
||||
|
||||
@@ -142,11 +145,11 @@ def process_image(item: str, folder: str, _args: Args, baseurl: str, sizelist: D
|
||||
folder (str): The folder containing the image.
|
||||
_args (Args): Parsed command line arguments.
|
||||
baseurl (str): Base URL for the web root.
|
||||
sizelist (Dict[str, Dict[str, int]]): Dictionary containing size information for images.
|
||||
raw (List[str]): List of raw image file extensions.
|
||||
sizelist (dict[str, dict[str, int]]): dictionary containing size information for images.
|
||||
raw (list[str]): list of raw image file extensions.
|
||||
|
||||
Returns:
|
||||
Dict[str, Any]: Dictionary containing image details for HTML rendering.
|
||||
dict[str, Any]: dictionary containing image details for HTML rendering.
|
||||
"""
|
||||
extsplit = os.path.splitext(item)
|
||||
if item not in sizelist or _args.reread_metadata:
|
||||
@@ -158,7 +161,7 @@ def process_image(item: str, folder: str, _args: Args, baseurl: str, sizelist: D
|
||||
"name": item,
|
||||
"width": sizelist[item]["width"],
|
||||
"height": sizelist[item]["height"],
|
||||
"exifdata": sizelist[item]["exifdata"],
|
||||
"exifdata": sizelist[item].get("exifdata", ""),
|
||||
}
|
||||
path = os.path.join(_args.root_directory, ".thumbnails", baseurl, item + ".jpg")
|
||||
if not os.path.exists(path) or _args.regenerate_thumbnails:
|
||||
@@ -179,7 +182,7 @@ def process_image(item: str, folder: str, _args: Args, baseurl: str, sizelist: D
|
||||
return image
|
||||
|
||||
|
||||
def generate_html(folder: str, title: str, _args: Args, raw: List[str], version: str) -> None:
|
||||
def generate_html(folder: str, title: str, _args: Args, raw: list[str], version: str, logo) -> None:
|
||||
"""
|
||||
Generates HTML content for a folder of images.
|
||||
|
||||
@@ -187,7 +190,7 @@ def generate_html(folder: str, title: str, _args: Args, raw: List[str], version:
|
||||
folder (str): The folder to generate HTML for.
|
||||
title (str): The title of the HTML page.
|
||||
_args (Args): Parsed command line arguments.
|
||||
raw (List[str]): Raw image file names.
|
||||
raw (list[str]): Raw image file names.
|
||||
"""
|
||||
logger.info("processing folder", extra={"folder": folder})
|
||||
if _args.regenerate_thumbnails:
|
||||
@@ -213,13 +216,15 @@ def generate_html(folder: str, title: str, _args: Args, raw: List[str], version:
|
||||
for item in items:
|
||||
if item not in EXCLUDES and not item.startswith("."):
|
||||
if os.path.isdir(os.path.join(folder, item)):
|
||||
process_subfolder(item, folder, baseurl, subfolders, _args, raw, version)
|
||||
process_subfolder(item, folder, baseurl, subfolders, _args, raw, version, logo)
|
||||
else:
|
||||
contains_files = True
|
||||
if os.path.splitext(item)[1].lower() in _args.file_extensions:
|
||||
images.append(process_image(item, folder, _args, baseurl, sizelist, raw))
|
||||
if item == "info":
|
||||
process_info_file(folder, item)
|
||||
if item == "LICENSE":
|
||||
process_license(folder, item)
|
||||
|
||||
if not _args.non_interactive_mode:
|
||||
pbardict[folder].update(1)
|
||||
@@ -230,7 +235,7 @@ def generate_html(folder: str, title: str, _args: Args, raw: List[str], version:
|
||||
update_sizelist(sizelist, folder)
|
||||
|
||||
if should_generate_html(images, contains_files, _args):
|
||||
create_html_file(folder, title, foldername, images, subfolders, _args, version)
|
||||
create_html_file(folder, title, foldername, images, subfolders, _args, version, logo)
|
||||
else:
|
||||
if os.path.exists(os.path.join(folder, "index.html")):
|
||||
logger.info("removing existing index.html", extra={"folder": folder})
|
||||
@@ -254,7 +259,7 @@ def create_thumbnail_folder(foldername: str, root_directory: str) -> None:
|
||||
os.mkdir(thumbnails_path)
|
||||
|
||||
|
||||
def process_subfolder(item: str, folder: str, baseurl: str, subfolders: List[Dict[str, str]], _args: Args, raw: List[str], version: str) -> None:
|
||||
def process_subfolder(item: str, folder: str, baseurl: str, subfolders: list[dict[str, str]], _args: Args, raw: list[str], version: str, logo: str) -> None:
|
||||
"""
|
||||
Processes a subfolder.
|
||||
|
||||
@@ -262,15 +267,28 @@ def process_subfolder(item: str, folder: str, baseurl: str, subfolders: List[Dic
|
||||
item (str): The name of the subfolder.
|
||||
folder (str): The parent folder containing the subfolder.
|
||||
baseurl (str): Base URL for the web root.
|
||||
subfolders (List[Dict[str, str]]): List to store subfolder details.
|
||||
subfolders (list[dict[str, str]]): list to store subfolder details.
|
||||
_args (Args): Parsed command line arguments.
|
||||
raw (List[str]): Raw image file extensions.
|
||||
raw (list[str]): Raw image file extensions.
|
||||
"""
|
||||
subfolder_url = f"{_args.web_root_url}{baseurl}{urllib.parse.quote(item)}/index.html" if _args.web_root_url.startswith("file://") else f"{_args.web_root_url}{baseurl}{urllib.parse.quote(item)}"
|
||||
subfolders.append({"url": subfolder_url, "name": item})
|
||||
if item not in _args.exclude_folders:
|
||||
if not any(fnmatch.fnmatchcase(os.path.join(folder, item), exclude) for exclude in _args.exclude_folders):
|
||||
generate_html(os.path.join(folder, item), os.path.join(folder, item).removeprefix(_args.root_directory), _args, raw, version)
|
||||
generate_html(os.path.join(folder, item), os.path.join(folder, item).removeprefix(_args.root_directory), _args, raw, version, logo)
|
||||
|
||||
|
||||
def process_license(folder: str, item: str) -> None:
|
||||
"""
|
||||
Processes a LICENSE file.
|
||||
|
||||
Args:
|
||||
folder (str): The folder containing the info file.
|
||||
item (str): The licenses file name.
|
||||
"""
|
||||
with open(os.path.join(folder, item), encoding="utf-8") as f:
|
||||
logger.info("processing LICENSE", extra={"path": os.path.join(folder, item)})
|
||||
licens[urllib.parse.quote(folder)] = f.read().replace("\n", "</br>\n").replace(" ", " ").replace(" ", " ").replace("sp; ", "sp; ").replace("  ", " ")
|
||||
|
||||
|
||||
def process_info_file(folder: str, item: str) -> None:
|
||||
@@ -286,12 +304,12 @@ def process_info_file(folder: str, item: str) -> None:
|
||||
info[urllib.parse.quote(folder)] = f.read()
|
||||
|
||||
|
||||
def should_generate_html(images: List[Dict[str, Any]], contains_files, _args: Args) -> bool:
|
||||
def should_generate_html(images: list[dict[str, Any]], contains_files, _args: Args) -> bool:
|
||||
"""
|
||||
Determines if HTML should be generated.
|
||||
|
||||
Args:
|
||||
images (List[Dict[str, Any]]): List of images.
|
||||
images (list[dict[str, Any]]): list of images.
|
||||
_args (Args): Parsed command line arguments.
|
||||
|
||||
Returns:
|
||||
@@ -300,7 +318,7 @@ def should_generate_html(images: List[Dict[str, Any]], contains_files, _args: Ar
|
||||
return images or (_args.use_fancy_folders and not contains_files) or (_args.use_fancy_folders and _args.ignore_other_files)
|
||||
|
||||
|
||||
def create_html_file(folder: str, title: str, foldername: str, images: List[Dict[str, Any]], subfolders: List[Dict[str, str]], _args: Args, version: str) -> None:
|
||||
def create_html_file(folder: str, title: str, foldername: str, images: list[dict[str, Any]], subfolders: list[dict[str, str]], _args: Args, version: str, logo: str) -> None:
|
||||
"""
|
||||
Creates the HTML file using the template.
|
||||
|
||||
@@ -308,8 +326,8 @@ def create_html_file(folder: str, title: str, foldername: str, images: List[Dict
|
||||
folder (str): The folder to create the HTML file in.
|
||||
title (str): The title of the HTML page.
|
||||
foldername (str): The name of the folder.
|
||||
images (List[Dict[str, Any]]): A list of images to include in the HTML.
|
||||
subfolders (List[Dict[str, str]]): A list of subfolders to include in the HTML.
|
||||
images (list[dict[str, Any]]): A list of images to include in the HTML.
|
||||
subfolders (list[dict[str, str]]): A list of subfolders to include in the HTML.
|
||||
_args (Args): Parsed command line arguments.
|
||||
"""
|
||||
html_file = os.path.join(folder, "index.html")
|
||||
@@ -333,6 +351,34 @@ def create_html_file(folder: str, title: str, foldername: str, images: List[Dict
|
||||
|
||||
folder_info = info.get(urllib.parse.quote(folder), "").split("\n")
|
||||
_info = [i for i in folder_info if len(i) > 1] if folder_info else None
|
||||
if _args.reverse_sort:
|
||||
images.sort(key=lambda i: i["name"], reverse=True)
|
||||
|
||||
folder_license = licens.get(urllib.parse.quote(folder), False)
|
||||
|
||||
license_url = ""
|
||||
|
||||
if folder_license:
|
||||
license_html = os.path.join(folder, "license.html")
|
||||
license_url = _args.web_root_url + urllib.parse.quote(foldername) + "license.html"
|
||||
with open(license_html, "w+", encoding="utf-8") as f:
|
||||
logger.info("writing license html file", extra={"path": license_html})
|
||||
gtml = env.get_template("license.html.j2")
|
||||
content = gtml.render(
|
||||
title=f"{title} - LICENSE",
|
||||
favicon=f"{_args.web_root_url}{FAVICON_PATH}",
|
||||
stylesheet=f"{_args.web_root_url}{GLOBAL_CSS_PATH}",
|
||||
theme=f"{_args.web_root_url}.static/theme.css",
|
||||
root=_args.web_root_url,
|
||||
parent=f"{_args.web_root_url}{urllib.parse.quote(foldername)}",
|
||||
header=f"{header} - LICENSE",
|
||||
license=license_info,
|
||||
webmanifest=_args.generate_webmanifest,
|
||||
version=version,
|
||||
logo=logo,
|
||||
licensefile=folder_license,
|
||||
)
|
||||
f.write(content)
|
||||
|
||||
html = env.get_template("index.html.j2")
|
||||
content = html.render(
|
||||
@@ -347,9 +393,10 @@ def create_html_file(folder: str, title: str, foldername: str, images: List[Dict
|
||||
subdirectories=subfolders,
|
||||
images=images,
|
||||
info=_info,
|
||||
allimages=images,
|
||||
webmanifest=_args.generate_webmanifest,
|
||||
version=version,
|
||||
logo=logo,
|
||||
licensefile=license_url,
|
||||
)
|
||||
|
||||
with open(html_file, "w", encoding="utf-8") as f:
|
||||
@@ -357,21 +404,21 @@ def create_html_file(folder: str, title: str, foldername: str, images: List[Dict
|
||||
f.write(content)
|
||||
|
||||
|
||||
def list_folder(total: int, folder: str, title: str, _args: Args, raw: List[str], version: str) -> List[Tuple[str, str]]:
|
||||
def list_folder(total: int, folder: str, title: str, _args: Args, raw: list[str], version: str, logo: str) -> list[tuple[str, str]]:
|
||||
"""
|
||||
Lists and processes a folder, generating HTML files.
|
||||
lists and processes a folder, generating HTML files.
|
||||
|
||||
Args:
|
||||
total (int): Total number of folders to process.
|
||||
folder (str): The folder to process.
|
||||
title (str): The title of the HTML page.
|
||||
_args (Args): Parsed command line arguments.
|
||||
raw (List[str]): Raw image file names.
|
||||
raw (list[str]): Raw image file names.
|
||||
|
||||
Returns:
|
||||
List[Tuple[str, str]]: List of thumbnails generated.
|
||||
list[tuple[str, str]]: list of thumbnails generated.
|
||||
"""
|
||||
if not _args.non_interactive_mode:
|
||||
pbardict["htmlbar"] = tqdm(total=total, desc="Generating HTML files", unit="folders", ascii=True, dynamic_ncols=True)
|
||||
generate_html(folder, title, _args, raw, version)
|
||||
generate_html(folder, title, _args, raw, version, logo)
|
||||
return thumbnails
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
import os
|
||||
import shutil
|
||||
from typing import List, Dict
|
||||
from subprocess import Popen, PIPE
|
||||
from PIL import Image
|
||||
from jinja2 import Environment, FileSystemLoader
|
||||
@@ -38,14 +37,14 @@ class Icon:
|
||||
purpose: str
|
||||
|
||||
|
||||
def render_svg_icon(colorscheme: Dict[str, str], iconspath: str) -> str:
|
||||
def render_svg_icon(colorscheme: dict[str, str], iconspath: str) -> str:
|
||||
"""
|
||||
Render an SVG icon using the provided color scheme.
|
||||
|
||||
Parameters:
|
||||
-----------
|
||||
colorscheme : Dict[str, str]
|
||||
Dictionary containing color scheme variables and their values.
|
||||
colorscheme : dict[str, str]
|
||||
dictionary containing color scheme variables and their values.
|
||||
iconspath : str
|
||||
Path to the directory where the icon will be saved.
|
||||
|
||||
@@ -134,7 +133,7 @@ def icons(_args: Args) -> None:
|
||||
generate_favicon(iconspath, _args.root_directory)
|
||||
|
||||
|
||||
def render_manifest_json(_args: Args, icon_list: List[Icon], colors: Dict[str, str]) -> None:
|
||||
def render_manifest_json(_args: Args, icon_list: list[Icon], colors: dict[str, str]) -> None:
|
||||
"""
|
||||
Render the manifest.json file for the web application.
|
||||
|
||||
@@ -142,10 +141,10 @@ def render_manifest_json(_args: Args, icon_list: List[Icon], colors: Dict[str, s
|
||||
-----------
|
||||
_args : Args
|
||||
Parsed command-line arguments.
|
||||
icon_list : List[Icon]
|
||||
List of icons to be included in the manifest.
|
||||
colors : Dict[str, str]
|
||||
Dictionary containing color scheme and theme color.
|
||||
icon_list : list[Icon]
|
||||
list of icons to be included in the manifest.
|
||||
colors : dict[str, str]
|
||||
dictionary containing color scheme and theme color.
|
||||
"""
|
||||
manifest = env.get_template("manifest.json.j2")
|
||||
content = manifest.render(
|
||||
@@ -160,14 +159,14 @@ def render_manifest_json(_args: Args, icon_list: List[Icon], colors: Dict[str, s
|
||||
f.write(content)
|
||||
|
||||
|
||||
def create_icons_from_svg(files: List[str], iconspath: str, _args: Args) -> List[Icon]:
|
||||
def create_icons_from_svg(files: list[str], iconspath: str, _args: Args) -> list[Icon]:
|
||||
"""
|
||||
Create icons from an SVG file.
|
||||
|
||||
Parameters:
|
||||
-----------
|
||||
files : List[str]
|
||||
List of files in the icons directory.
|
||||
files : list[str]
|
||||
list of files in the icons directory.
|
||||
iconspath : str
|
||||
Path to the directory where the icons will be saved.
|
||||
_args : Args
|
||||
@@ -175,8 +174,8 @@ def create_icons_from_svg(files: List[str], iconspath: str, _args: Args) -> List
|
||||
|
||||
Returns:
|
||||
--------
|
||||
List[Icon]
|
||||
List of icons created from the SVG file.
|
||||
list[Icon]
|
||||
list of icons created from the SVG file.
|
||||
"""
|
||||
svg = [file for file in files if file.endswith(".svg")][0]
|
||||
logger.info("creating icons for web application", extra={"iconspath": iconspath, "svg": svg})
|
||||
@@ -218,7 +217,7 @@ def create_icons_from_svg(files: List[str], iconspath: str, _args: Args) -> List
|
||||
return icon_list
|
||||
|
||||
|
||||
def create_icons_from_png(iconspath: str, web_root_url: str) -> List[Icon]:
|
||||
def create_icons_from_png(iconspath: str, web_root_url: str) -> list[Icon]:
|
||||
"""
|
||||
Create icons from PNG files.
|
||||
|
||||
@@ -231,8 +230,8 @@ def create_icons_from_png(iconspath: str, web_root_url: str) -> List[Icon]:
|
||||
|
||||
Returns:
|
||||
--------
|
||||
List[Icon]
|
||||
List of icons created from PNG files.
|
||||
list[Icon]
|
||||
list of icons created from PNG files.
|
||||
"""
|
||||
icon_list = []
|
||||
for icon in os.listdir(iconspath):
|
||||
|
||||
@@ -1,8 +1,7 @@
|
||||
CairoSVG==2.7.1
|
||||
Jinja2==3.1.4
|
||||
numpy==2.0.0
|
||||
pillow==10.4.0
|
||||
pyinstaller==6.9.0
|
||||
pyinstaller==6.11.1
|
||||
python-json-logger==2.0.7
|
||||
rich-argparse==1.5.2
|
||||
setuptools==70.3.0
|
||||
|
||||
@@ -8,11 +8,19 @@
|
||||
{%- if webmanifest %}
|
||||
<link rel="manifest" href="/.static/manifest.json">
|
||||
{%- endif %}
|
||||
<link rel="preload" href="{{ stylesheet }}" as="style">
|
||||
{%- if theme %}
|
||||
<link rel="preload" href="{{ theme }}" as="style">
|
||||
{%- endif %}
|
||||
<link rel="icon" type="image/x-icon" href="{{ favicon }}">
|
||||
<link rel="stylesheet" href="{{ stylesheet }}">
|
||||
{%- if theme %}
|
||||
<link rel="stylesheet" href="{{ theme }}">
|
||||
{%- endif %}
|
||||
<link rel="preload" href="{{ root }}.static/pswp/photoswipe.css" as="style">
|
||||
<link rel="preload" href="{{ root }}.static/pswp/default-skin/default-skin.css" as="style">
|
||||
<link rel="modulepreload" href="{{ root }}.static/pswp/photoswipe.min.js">
|
||||
<link rel="modulepreload" href="{{ root }}.static/pswp/photoswipe-ui-default.min.js">
|
||||
{%- if images %}
|
||||
<link rel="stylesheet" href="{{ root }}.static/pswp/photoswipe.css">
|
||||
<link rel="stylesheet" href="{{ root }}.static/pswp/default-skin/default-skin.css">
|
||||
@@ -36,11 +44,14 @@
|
||||
</span></li>
|
||||
{%- endif %}
|
||||
<li class="title"><span class="header">{{ header }}</span></li>
|
||||
{%- if license %}
|
||||
<li class="license"><a href="{{ license.url }}" rel="license noopener noreferrer" target="_blank">License</a></li>
|
||||
{%- if licensefile %}
|
||||
<li class="license"><a href="{{ licensefile }}">License</a></li>
|
||||
{%- endif %}
|
||||
</ul>
|
||||
{% if subdirectories %}
|
||||
{%- for subdirectory in subdirectories %}
|
||||
<link rel="preload" href="{{ subdirectory.url }}/index.html" type="text/html">
|
||||
{%- endfor %}
|
||||
<div class="folders">
|
||||
{%- for subdirectory in subdirectories %}
|
||||
<a href="{{ subdirectory.url }}">
|
||||
@@ -59,7 +70,7 @@
|
||||
{%- for image in images %}
|
||||
<div class="column">
|
||||
<figure>
|
||||
<img src="{{ image.thumbnail }}" alt="{{ image.name }}" onclick="openSwipe({{ ns.count }})" />
|
||||
<img src="{{ image.thumbnail }}" alt="{{ image.name }}" onclick="openSwipe({{ ns.count }})" onmouseover="prefetch({{ ns.count }})" onmouseleave="cancel({{ ns.count }})" />
|
||||
{%- set ns.count = ns.count + 1 %}
|
||||
<figcaption class="caption">{{ image.name }}
|
||||
{%- if image.tiff %}
|
||||
@@ -93,14 +104,14 @@
|
||||
</a>
|
||||
{%- endif %}
|
||||
<span class="attribution">Made with <a href="https://github.com/greflm13/StaticGalleryBuilder" target="_blank" rel="noopener noreferrer">StaticGalleryBuilder {{ version }}</a> by <a
|
||||
href="https://github.com/greflm13" target="_blank" rel="noopener noreferrer">Flo Greistorfer</a>.</span>
|
||||
href="https://github.com/greflm13" target="_blank" rel="noopener noreferrer">{{ logo }}</a>.</span>
|
||||
<button onclick="topFunction()" id="totop" title="Back to Top">Back to Top</button>
|
||||
</div>
|
||||
{%- endif %}
|
||||
{%- else %}
|
||||
<div class="footer">
|
||||
<span class="attribution">Made with <a href="https://github.com/greflm13/StaticGalleryBuilder" target="_blank" rel="noopener noreferrer">StaticGalleryBuilder {{ version }}</a> by <a
|
||||
href="https://github.com/greflm13" target="_blank" rel="noopener noreferrer">Flo Greistorfer</a>.</span>
|
||||
href="https://github.com/greflm13" target="_blank" rel="noopener noreferrer">{{ logo }}</a>.</span>
|
||||
<button onclick="topFunction()" id="totop" title="Back to Top">Back to Top</button>
|
||||
</div>
|
||||
{%- endif %}
|
||||
@@ -144,7 +155,7 @@
|
||||
<script>
|
||||
var pswpElement = document.querySelectorAll('.pswp')[0];
|
||||
var items = [
|
||||
{%- for image in allimages %}
|
||||
{%- for image in images %}
|
||||
{%- if image.exifdata.DateTime %}
|
||||
{ src: "{{ image.url }}", w: {{ image.width }}, h: {{ image.height }}, msrc: "{{ image.thumbnail }}", title: "Captured: {{ image.exifdata.DateTime }}" },
|
||||
{%- else %}
|
||||
@@ -153,6 +164,7 @@
|
||||
{%- endfor %}
|
||||
];
|
||||
var re = /pid=(\d+)/;
|
||||
var controllers = {}
|
||||
|
||||
function openSwipe(img) {
|
||||
var options = {
|
||||
@@ -182,6 +194,23 @@
|
||||
function topFunction() {
|
||||
window.scrollTo({ top: 0, behavior: 'smooth' })
|
||||
}
|
||||
|
||||
function prefetch(img) {
|
||||
const controller = new AbortController()
|
||||
const signal = controller.signal
|
||||
controllers[img] = controller;
|
||||
let urlToFetch = items[img].src;
|
||||
|
||||
fetch(urlToFetch, {
|
||||
method: 'get',
|
||||
signal: signal,
|
||||
}).catch(function (err) {});
|
||||
}
|
||||
|
||||
function cancel(img) {
|
||||
controllers[img].abort();
|
||||
delete controllers[img];
|
||||
}
|
||||
</script>
|
||||
{%- endif %}
|
||||
</body>
|
||||
|
||||
67
templates/license.html.j2
Normal file
67
templates/license.html.j2
Normal file
@@ -0,0 +1,67 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>{{ title }}</title>
|
||||
{%- if webmanifest %}
|
||||
<link rel="manifest" href="/.static/manifest.json">
|
||||
{%- endif %}
|
||||
<link rel="preload" href="{{ stylesheet }}" as="style">
|
||||
{%- if theme %}
|
||||
<link rel="preload" href="{{ theme }}" as="style">
|
||||
{%- endif %}
|
||||
<link rel="icon" type="image/x-icon" href="{{ favicon }}">
|
||||
<link rel="stylesheet" href="{{ stylesheet }}">
|
||||
{%- if theme %}
|
||||
<link rel="stylesheet" href="{{ theme }}">
|
||||
{%- endif %}
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<div class="header">
|
||||
<ul class="navbar">
|
||||
<li><a href="{{ root }}">Home</a></li>
|
||||
{%- if parent %}
|
||||
<li><a href="{{ parent }}">Parent Directory</a></li>
|
||||
{%- endif %}
|
||||
<li class="title"><span class="header">{{ header }}</span></li>
|
||||
</ul>
|
||||
</div>
|
||||
{%- if licensefile %}
|
||||
<div class="licensefile">
|
||||
{{ licensefile }}
|
||||
</div>
|
||||
{%- endif %}
|
||||
{% if license %}
|
||||
{%- if 'CC' in license.type %}
|
||||
<div class="footer" xmlns:cc="http://creativecommons.org/ns#" xmlns:dct="http://purl.org/dc/terms/">
|
||||
{%- if license.type == 'CC0 1.0' %}
|
||||
<a property="dct:title" rel="cc:attributionURL" href="{{ root }}">{{ license.project }}</a> by <span property="cc:attributionName">{{ license.author }}</span> is marked with
|
||||
<a href="{{ license.url }}" target="_blank" rel="license noopener noreferrer" style="display: inline-block">CC0 1.0
|
||||
{%- for pic in license.pics %}
|
||||
<img style="height: 22px !important; margin-left: 3px; vertical-align: text-bottom" src="{{ pic }}" alt="" />
|
||||
{%- endfor %}
|
||||
</a>
|
||||
{%- else %}
|
||||
<a property="dct:title" rel="cc:attributionURL" href="{{ root }}">{{ license.project }}</a> by <span property="cc:attributionName">{{ license.author }}</span> is licensed under
|
||||
<a href="{{ license.url }}" target="_blank" rel="license noopener noreferrer">{{ license.type }}
|
||||
{%- for pic in license.pics %}
|
||||
<img src="{{ pic }}" alt="" />
|
||||
{%- endfor %}
|
||||
</a>
|
||||
{%- endif %}
|
||||
<span class="attribution">Made with <a href="https://github.com/greflm13/StaticGalleryBuilder" target="_blank" rel="noopener noreferrer">StaticGalleryBuilder {{ version }}</a> by <a
|
||||
href="https://github.com/greflm13" target="_blank" rel="noopener noreferrer">{{ logo }}</a>.</span>
|
||||
<button onclick="topFunction()" id="totop" title="Back to Top">Back to Top</button>
|
||||
</div>
|
||||
{%- endif %}
|
||||
{%- else %}
|
||||
<div class="footer">
|
||||
<span class="attribution">Made with <a href="https://github.com/greflm13/StaticGalleryBuilder" target="_blank" rel="noopener noreferrer">StaticGalleryBuilder {{ version }}</a> by <a
|
||||
href="https://github.com/greflm13" target="_blank" rel="noopener noreferrer">{{ logo }}</a>.</span>
|
||||
<button onclick="topFunction()" id="totop" title="Back to Top">Back to Top</button>
|
||||
</div>
|
||||
{%- endif %}
|
||||
</body>
|
||||
427
test/example/LICENSE
Normal file
427
test/example/LICENSE
Normal file
@@ -0,0 +1,427 @@
|
||||
Attribution-ShareAlike 4.0 International
|
||||
|
||||
=======================================================================
|
||||
|
||||
Creative Commons Corporation ("Creative Commons") is not a law firm and
|
||||
does not provide legal services or legal advice. Distribution of
|
||||
Creative Commons public licenses does not create a lawyer-client or
|
||||
other relationship. Creative Commons makes its licenses and related
|
||||
information available on an "as-is" basis. Creative Commons gives no
|
||||
warranties regarding its licenses, any material licensed under their
|
||||
terms and conditions, or any related information. Creative Commons
|
||||
disclaims all liability for damages resulting from their use to the
|
||||
fullest extent possible.
|
||||
|
||||
Using Creative Commons Public Licenses
|
||||
|
||||
Creative Commons public licenses provide a standard set of terms and
|
||||
conditions that creators and other rights holders may use to share
|
||||
original works of authorship and other material subject to copyright
|
||||
and certain other rights specified in the public license below. The
|
||||
following considerations are for informational purposes only, are not
|
||||
exhaustive, and do not form part of our licenses.
|
||||
|
||||
Considerations for licensors: Our public licenses are
|
||||
intended for use by those authorized to give the public
|
||||
permission to use material in ways otherwise restricted by
|
||||
copyright and certain other rights. Our licenses are
|
||||
irrevocable. Licensors should read and understand the terms
|
||||
and conditions of the license they choose before applying it.
|
||||
Licensors should also secure all rights necessary before
|
||||
applying our licenses so that the public can reuse the
|
||||
material as expected. Licensors should clearly mark any
|
||||
material not subject to the license. This includes other CC-
|
||||
licensed material, or material used under an exception or
|
||||
limitation to copyright. More considerations for licensors:
|
||||
wiki.creativecommons.org/Considerations_for_licensors
|
||||
|
||||
Considerations for the public: By using one of our public
|
||||
licenses, a licensor grants the public permission to use the
|
||||
licensed material under specified terms and conditions. If
|
||||
the licensor's permission is not necessary for any reason--for
|
||||
example, because of any applicable exception or limitation to
|
||||
copyright--then that use is not regulated by the license. Our
|
||||
licenses grant only permissions under copyright and certain
|
||||
other rights that a licensor has authority to grant. Use of
|
||||
the licensed material may still be restricted for other
|
||||
reasons, including because others have copyright or other
|
||||
rights in the material. A licensor may make special requests,
|
||||
such as asking that all changes be marked or described.
|
||||
Although not required by our licenses, you are encouraged to
|
||||
respect those requests where reasonable. More considerations
|
||||
for the public:
|
||||
wiki.creativecommons.org/Considerations_for_licensees
|
||||
|
||||
=======================================================================
|
||||
|
||||
Creative Commons Attribution-ShareAlike 4.0 International Public
|
||||
License
|
||||
|
||||
By exercising the Licensed Rights (defined below), You accept and agree
|
||||
to be bound by the terms and conditions of this Creative Commons
|
||||
Attribution-ShareAlike 4.0 International Public License ("Public
|
||||
License"). To the extent this Public License may be interpreted as a
|
||||
contract, You are granted the Licensed Rights in consideration of Your
|
||||
acceptance of these terms and conditions, and the Licensor grants You
|
||||
such rights in consideration of benefits the Licensor receives from
|
||||
making the Licensed Material available under these terms and
|
||||
conditions.
|
||||
|
||||
|
||||
Section 1 -- Definitions.
|
||||
|
||||
a. Adapted Material means material subject to Copyright and Similar
|
||||
Rights that is derived from or based upon the Licensed Material
|
||||
and in which the Licensed Material is translated, altered,
|
||||
arranged, transformed, or otherwise modified in a manner requiring
|
||||
permission under the Copyright and Similar Rights held by the
|
||||
Licensor. For purposes of this Public License, where the Licensed
|
||||
Material is a musical work, performance, or sound recording,
|
||||
Adapted Material is always produced where the Licensed Material is
|
||||
synched in timed relation with a moving image.
|
||||
|
||||
b. Adapter's License means the license You apply to Your Copyright
|
||||
and Similar Rights in Your contributions to Adapted Material in
|
||||
accordance with the terms and conditions of this Public License.
|
||||
|
||||
c. BY-SA Compatible License means a license listed at
|
||||
creativecommons.org/compatiblelicenses, approved by Creative
|
||||
Commons as essentially the equivalent of this Public License.
|
||||
|
||||
d. Copyright and Similar Rights means copyright and/or similar rights
|
||||
closely related to copyright including, without limitation,
|
||||
performance, broadcast, sound recording, and Sui Generis Database
|
||||
Rights, without regard to how the rights are labeled or
|
||||
categorized. For purposes of this Public License, the rights
|
||||
specified in Section 2(b)(1)-(2) are not Copyright and Similar
|
||||
Rights.
|
||||
|
||||
e. Effective Technological Measures means those measures that, in the
|
||||
absence of proper authority, may not be circumvented under laws
|
||||
fulfilling obligations under Article 11 of the WIPO Copyright
|
||||
Treaty adopted on December 20, 1996, and/or similar international
|
||||
agreements.
|
||||
|
||||
f. Exceptions and Limitations means fair use, fair dealing, and/or
|
||||
any other exception or limitation to Copyright and Similar Rights
|
||||
that applies to Your use of the Licensed Material.
|
||||
|
||||
g. License Elements means the license attributes listed in the name
|
||||
of a Creative Commons Public License. The License Elements of this
|
||||
Public License are Attribution and ShareAlike.
|
||||
|
||||
h. Licensed Material means the artistic or literary work, database,
|
||||
or other material to which the Licensor applied this Public
|
||||
License.
|
||||
|
||||
i. Licensed Rights means the rights granted to You subject to the
|
||||
terms and conditions of this Public License, which are limited to
|
||||
all Copyright and Similar Rights that apply to Your use of the
|
||||
Licensed Material and that the Licensor has authority to license.
|
||||
|
||||
j. Licensor means the individual(s) or entity(ies) granting rights
|
||||
under this Public License.
|
||||
|
||||
k. Share means to provide material to the public by any means or
|
||||
process that requires permission under the Licensed Rights, such
|
||||
as reproduction, public display, public performance, distribution,
|
||||
dissemination, communication, or importation, and to make material
|
||||
available to the public including in ways that members of the
|
||||
public may access the material from a place and at a time
|
||||
individually chosen by them.
|
||||
|
||||
l. Sui Generis Database Rights means rights other than copyright
|
||||
resulting from Directive 96/9/EC of the European Parliament and of
|
||||
the Council of 11 March 1996 on the legal protection of databases,
|
||||
as amended and/or succeeded, as well as other essentially
|
||||
equivalent rights anywhere in the world.
|
||||
|
||||
m. You means the individual or entity exercising the Licensed Rights
|
||||
under this Public License. Your has a corresponding meaning.
|
||||
|
||||
|
||||
Section 2 -- Scope.
|
||||
|
||||
a. License grant.
|
||||
|
||||
1. Subject to the terms and conditions of this Public License,
|
||||
the Licensor hereby grants You a worldwide, royalty-free,
|
||||
non-sublicensable, non-exclusive, irrevocable license to
|
||||
exercise the Licensed Rights in the Licensed Material to:
|
||||
|
||||
a. reproduce and Share the Licensed Material, in whole or
|
||||
in part; and
|
||||
|
||||
b. produce, reproduce, and Share Adapted Material.
|
||||
|
||||
2. Exceptions and Limitations. For the avoidance of doubt, where
|
||||
Exceptions and Limitations apply to Your use, this Public
|
||||
License does not apply, and You do not need to comply with
|
||||
its terms and conditions.
|
||||
|
||||
3. Term. The term of this Public License is specified in Section
|
||||
6(a).
|
||||
|
||||
4. Media and formats; technical modifications allowed. The
|
||||
Licensor authorizes You to exercise the Licensed Rights in
|
||||
all media and formats whether now known or hereafter created,
|
||||
and to make technical modifications necessary to do so. The
|
||||
Licensor waives and/or agrees not to assert any right or
|
||||
authority to forbid You from making technical modifications
|
||||
necessary to exercise the Licensed Rights, including
|
||||
technical modifications necessary to circumvent Effective
|
||||
Technological Measures. For purposes of this Public License,
|
||||
simply making modifications authorized by this Section 2(a)
|
||||
(4) never produces Adapted Material.
|
||||
|
||||
5. Downstream recipients.
|
||||
|
||||
a. Offer from the Licensor -- Licensed Material. Every
|
||||
recipient of the Licensed Material automatically
|
||||
receives an offer from the Licensor to exercise the
|
||||
Licensed Rights under the terms and conditions of this
|
||||
Public License.
|
||||
|
||||
b. Additional offer from the Licensor -- Adapted Material.
|
||||
Every recipient of Adapted Material from You
|
||||
automatically receives an offer from the Licensor to
|
||||
exercise the Licensed Rights in the Adapted Material
|
||||
under the conditions of the Adapter's License You apply.
|
||||
|
||||
c. No downstream restrictions. You may not offer or impose
|
||||
any additional or different terms or conditions on, or
|
||||
apply any Effective Technological Measures to, the
|
||||
Licensed Material if doing so restricts exercise of the
|
||||
Licensed Rights by any recipient of the Licensed
|
||||
Material.
|
||||
|
||||
6. No endorsement. Nothing in this Public License constitutes or
|
||||
may be construed as permission to assert or imply that You
|
||||
are, or that Your use of the Licensed Material is, connected
|
||||
with, or sponsored, endorsed, or granted official status by,
|
||||
the Licensor or others designated to receive attribution as
|
||||
provided in Section 3(a)(1)(A)(i).
|
||||
|
||||
b. Other rights.
|
||||
|
||||
1. Moral rights, such as the right of integrity, are not
|
||||
licensed under this Public License, nor are publicity,
|
||||
privacy, and/or other similar personality rights; however, to
|
||||
the extent possible, the Licensor waives and/or agrees not to
|
||||
assert any such rights held by the Licensor to the limited
|
||||
extent necessary to allow You to exercise the Licensed
|
||||
Rights, but not otherwise.
|
||||
|
||||
2. Patent and trademark rights are not licensed under this
|
||||
Public License.
|
||||
|
||||
3. To the extent possible, the Licensor waives any right to
|
||||
collect royalties from You for the exercise of the Licensed
|
||||
Rights, whether directly or through a collecting society
|
||||
under any voluntary or waivable statutory or compulsory
|
||||
licensing scheme. In all other cases the Licensor expressly
|
||||
reserves any right to collect such royalties.
|
||||
|
||||
|
||||
Section 3 -- License Conditions.
|
||||
|
||||
Your exercise of the Licensed Rights is expressly made subject to the
|
||||
following conditions.
|
||||
|
||||
a. Attribution.
|
||||
|
||||
1. If You Share the Licensed Material (including in modified
|
||||
form), You must:
|
||||
|
||||
a. retain the following if it is supplied by the Licensor
|
||||
with the Licensed Material:
|
||||
|
||||
i. identification of the creator(s) of the Licensed
|
||||
Material and any others designated to receive
|
||||
attribution, in any reasonable manner requested by
|
||||
the Licensor (including by pseudonym if
|
||||
designated);
|
||||
|
||||
ii. a copyright notice;
|
||||
|
||||
iii. a notice that refers to this Public License;
|
||||
|
||||
iv. a notice that refers to the disclaimer of
|
||||
warranties;
|
||||
|
||||
v. a URI or hyperlink to the Licensed Material to the
|
||||
extent reasonably practicable;
|
||||
|
||||
b. indicate if You modified the Licensed Material and
|
||||
retain an indication of any previous modifications; and
|
||||
|
||||
c. indicate the Licensed Material is licensed under this
|
||||
Public License, and include the text of, or the URI or
|
||||
hyperlink to, this Public License.
|
||||
|
||||
2. You may satisfy the conditions in Section 3(a)(1) in any
|
||||
reasonable manner based on the medium, means, and context in
|
||||
which You Share the Licensed Material. For example, it may be
|
||||
reasonable to satisfy the conditions by providing a URI or
|
||||
hyperlink to a resource that includes the required
|
||||
information.
|
||||
|
||||
3. If requested by the Licensor, You must remove any of the
|
||||
information required by Section 3(a)(1)(A) to the extent
|
||||
reasonably practicable.
|
||||
|
||||
b. ShareAlike.
|
||||
|
||||
In addition to the conditions in Section 3(a), if You Share
|
||||
Adapted Material You produce, the following conditions also apply.
|
||||
|
||||
1. The Adapter's License You apply must be a Creative Commons
|
||||
license with the same License Elements, this version or
|
||||
later, or a BY-SA Compatible License.
|
||||
|
||||
2. You must include the text of, or the URI or hyperlink to, the
|
||||
Adapter's License You apply. You may satisfy this condition
|
||||
in any reasonable manner based on the medium, means, and
|
||||
context in which You Share Adapted Material.
|
||||
|
||||
3. You may not offer or impose any additional or different terms
|
||||
or conditions on, or apply any Effective Technological
|
||||
Measures to, Adapted Material that restrict exercise of the
|
||||
rights granted under the Adapter's License You apply.
|
||||
|
||||
|
||||
Section 4 -- Sui Generis Database Rights.
|
||||
|
||||
Where the Licensed Rights include Sui Generis Database Rights that
|
||||
apply to Your use of the Licensed Material:
|
||||
|
||||
a. for the avoidance of doubt, Section 2(a)(1) grants You the right
|
||||
to extract, reuse, reproduce, and Share all or a substantial
|
||||
portion of the contents of the database;
|
||||
|
||||
b. if You include all or a substantial portion of the database
|
||||
contents in a database in which You have Sui Generis Database
|
||||
Rights, then the database in which You have Sui Generis Database
|
||||
Rights (but not its individual contents) is Adapted Material,
|
||||
including for purposes of Section 3(b); and
|
||||
|
||||
c. You must comply with the conditions in Section 3(a) if You Share
|
||||
all or a substantial portion of the contents of the database.
|
||||
|
||||
For the avoidance of doubt, this Section 4 supplements and does not
|
||||
replace Your obligations under this Public License where the Licensed
|
||||
Rights include other Copyright and Similar Rights.
|
||||
|
||||
|
||||
Section 5 -- Disclaimer of Warranties and Limitation of Liability.
|
||||
|
||||
a. UNLESS OTHERWISE SEPARATELY UNDERTAKEN BY THE LICENSOR, TO THE
|
||||
EXTENT POSSIBLE, THE LICENSOR OFFERS THE LICENSED MATERIAL AS-IS
|
||||
AND AS-AVAILABLE, AND MAKES NO REPRESENTATIONS OR WARRANTIES OF
|
||||
ANY KIND CONCERNING THE LICENSED MATERIAL, WHETHER EXPRESS,
|
||||
IMPLIED, STATUTORY, OR OTHER. THIS INCLUDES, WITHOUT LIMITATION,
|
||||
WARRANTIES OF TITLE, MERCHANTABILITY, FITNESS FOR A PARTICULAR
|
||||
PURPOSE, NON-INFRINGEMENT, ABSENCE OF LATENT OR OTHER DEFECTS,
|
||||
ACCURACY, OR THE PRESENCE OR ABSENCE OF ERRORS, WHETHER OR NOT
|
||||
KNOWN OR DISCOVERABLE. WHERE DISCLAIMERS OF WARRANTIES ARE NOT
|
||||
ALLOWED IN FULL OR IN PART, THIS DISCLAIMER MAY NOT APPLY TO YOU.
|
||||
|
||||
b. TO THE EXTENT POSSIBLE, IN NO EVENT WILL THE LICENSOR BE LIABLE
|
||||
TO YOU ON ANY LEGAL THEORY (INCLUDING, WITHOUT LIMITATION,
|
||||
NEGLIGENCE) OR OTHERWISE FOR ANY DIRECT, SPECIAL, INDIRECT,
|
||||
INCIDENTAL, CONSEQUENTIAL, PUNITIVE, EXEMPLARY, OR OTHER LOSSES,
|
||||
COSTS, EXPENSES, OR DAMAGES ARISING OUT OF THIS PUBLIC LICENSE OR
|
||||
USE OF THE LICENSED MATERIAL, EVEN IF THE LICENSOR HAS BEEN
|
||||
ADVISED OF THE POSSIBILITY OF SUCH LOSSES, COSTS, EXPENSES, OR
|
||||
DAMAGES. WHERE A LIMITATION OF LIABILITY IS NOT ALLOWED IN FULL OR
|
||||
IN PART, THIS LIMITATION MAY NOT APPLY TO YOU.
|
||||
|
||||
c. The disclaimer of warranties and limitation of liability provided
|
||||
above shall be interpreted in a manner that, to the extent
|
||||
possible, most closely approximates an absolute disclaimer and
|
||||
waiver of all liability.
|
||||
|
||||
|
||||
Section 6 -- Term and Termination.
|
||||
|
||||
a. This Public License applies for the term of the Copyright and
|
||||
Similar Rights licensed here. However, if You fail to comply with
|
||||
this Public License, then Your rights under this Public License
|
||||
terminate automatically.
|
||||
|
||||
b. Where Your right to use the Licensed Material has terminated under
|
||||
Section 6(a), it reinstates:
|
||||
|
||||
1. automatically as of the date the violation is cured, provided
|
||||
it is cured within 30 days of Your discovery of the
|
||||
violation; or
|
||||
|
||||
2. upon express reinstatement by the Licensor.
|
||||
|
||||
For the avoidance of doubt, this Section 6(b) does not affect any
|
||||
right the Licensor may have to seek remedies for Your violations
|
||||
of this Public License.
|
||||
|
||||
c. For the avoidance of doubt, the Licensor may also offer the
|
||||
Licensed Material under separate terms or conditions or stop
|
||||
distributing the Licensed Material at any time; however, doing so
|
||||
will not terminate this Public License.
|
||||
|
||||
d. Sections 1, 5, 6, 7, and 8 survive termination of this Public
|
||||
License.
|
||||
|
||||
|
||||
Section 7 -- Other Terms and Conditions.
|
||||
|
||||
a. The Licensor shall not be bound by any additional or different
|
||||
terms or conditions communicated by You unless expressly agreed.
|
||||
|
||||
b. Any arrangements, understandings, or agreements regarding the
|
||||
Licensed Material not stated herein are separate from and
|
||||
independent of the terms and conditions of this Public License.
|
||||
|
||||
|
||||
Section 8 -- Interpretation.
|
||||
|
||||
a. For the avoidance of doubt, this Public License does not, and
|
||||
shall not be interpreted to, reduce, limit, restrict, or impose
|
||||
conditions on any use of the Licensed Material that could lawfully
|
||||
be made without permission under this Public License.
|
||||
|
||||
b. To the extent possible, if any provision of this Public License is
|
||||
deemed unenforceable, it shall be automatically reformed to the
|
||||
minimum extent necessary to make it enforceable. If the provision
|
||||
cannot be reformed, it shall be severed from this Public License
|
||||
without affecting the enforceability of the remaining terms and
|
||||
conditions.
|
||||
|
||||
c. No term or condition of this Public License will be waived and no
|
||||
failure to comply consented to unless expressly agreed to by the
|
||||
Licensor.
|
||||
|
||||
d. Nothing in this Public License constitutes or may be interpreted
|
||||
as a limitation upon, or waiver of, any privileges and immunities
|
||||
that apply to the Licensor or You, including from the legal
|
||||
processes of any jurisdiction or authority.
|
||||
|
||||
|
||||
=======================================================================
|
||||
|
||||
Creative Commons is not a party to its public
|
||||
licenses. Notwithstanding, Creative Commons may elect to apply one of
|
||||
its public licenses to material it publishes and in those instances
|
||||
will be considered the “Licensor.” The text of the Creative Commons
|
||||
public licenses is dedicated to the public domain under the CC0 Public
|
||||
Domain Dedication. Except for the limited purpose of indicating that
|
||||
material is shared under a Creative Commons public license or as
|
||||
otherwise permitted by the Creative Commons policies published at
|
||||
creativecommons.org/policies, Creative Commons does not authorize the
|
||||
use of the trademark "Creative Commons" or any other trademark or logo
|
||||
of Creative Commons without its prior written consent including,
|
||||
without limitation, in connection with any unauthorized modifications
|
||||
to any of its public licenses or any other arrangements,
|
||||
understandings, or agreements concerning use of licensed material. For
|
||||
the avoidance of doubt, this paragraph does not form part of the
|
||||
public licenses.
|
||||
|
||||
Creative Commons may be contacted at creativecommons.org.
|
||||
467
test/example/license.html
Normal file
467
test/example/license.html
Normal file
@@ -0,0 +1,467 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>example - LICENSE</title>
|
||||
<link rel="manifest" href="/.static/manifest.json">
|
||||
<link rel="preload" href="file:///home/user/git/github.com/greflm13/StaticGalleryBuilder/test/.static/global.css" as="style">
|
||||
<link rel="preload" href="file:///home/user/git/github.com/greflm13/StaticGalleryBuilder/test/.static/theme.css" as="style">
|
||||
<link rel="icon" type="image/x-icon" href="file:///home/user/git/github.com/greflm13/StaticGalleryBuilder/test/.static/favicon.ico">
|
||||
<link rel="stylesheet" href="file:///home/user/git/github.com/greflm13/StaticGalleryBuilder/test/.static/global.css">
|
||||
<link rel="stylesheet" href="file:///home/user/git/github.com/greflm13/StaticGalleryBuilder/test/.static/theme.css">
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<div class="header">
|
||||
<ul class="navbar">
|
||||
<li><a href="file:///home/user/git/github.com/greflm13/StaticGalleryBuilder/test/">Home</a></li>
|
||||
<li><a href="file:///home/user/git/github.com/greflm13/StaticGalleryBuilder/test/example/">Parent Directory</a></li>
|
||||
<li class="title"><span class="header">example - LICENSE</span></li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="licensefile">
|
||||
Attribution-ShareAlike 4.0 International</br>
|
||||
</br>
|
||||
=======================================================================</br>
|
||||
</br>
|
||||
Creative Commons Corporation ("Creative Commons") is not a law firm and</br>
|
||||
does not provide legal services or legal advice. Distribution of</br>
|
||||
Creative Commons public licenses does not create a lawyer-client or</br>
|
||||
other relationship. Creative Commons makes its licenses and related</br>
|
||||
information available on an "as-is" basis. Creative Commons gives no</br>
|
||||
warranties regarding its licenses, any material licensed under their</br>
|
||||
terms and conditions, or any related information. Creative Commons</br>
|
||||
disclaims all liability for damages resulting from their use to the</br>
|
||||
fullest extent possible.</br>
|
||||
</br>
|
||||
Using Creative Commons Public Licenses</br>
|
||||
</br>
|
||||
Creative Commons public licenses provide a standard set of terms and</br>
|
||||
conditions that creators and other rights holders may use to share</br>
|
||||
original works of authorship and other material subject to copyright</br>
|
||||
and certain other rights specified in the public license below. The</br>
|
||||
following considerations are for informational purposes only, are not</br>
|
||||
exhaustive, and do not form part of our licenses.</br>
|
||||
</br>
|
||||
  Considerations for licensors: Our public licenses are</br>
|
||||
  intended for use by those authorized to give the public</br>
|
||||
  permission to use material in ways otherwise restricted by</br>
|
||||
  copyright and certain other rights. Our licenses are</br>
|
||||
  irrevocable. Licensors should read and understand the terms</br>
|
||||
  and conditions of the license they choose before applying it.</br>
|
||||
  Licensors should also secure all rights necessary before</br>
|
||||
  applying our licenses so that the public can reuse the</br>
|
||||
  material as expected. Licensors should clearly mark any</br>
|
||||
  material not subject to the license. This includes other CC-</br>
|
||||
  licensed material, or material used under an exception or</br>
|
||||
  limitation to copyright. More considerations for licensors:</br>
|
||||
 wiki.creativecommons.org/Considerations_for_licensors</br>
|
||||
</br>
|
||||
  Considerations for the public: By using one of our public</br>
|
||||
  licenses, a licensor grants the public permission to use the</br>
|
||||
  licensed material under specified terms and conditions. If</br>
|
||||
  the licensor's permission is not necessary for any reason--for</br>
|
||||
  example, because of any applicable exception or limitation to</br>
|
||||
  copyright--then that use is not regulated by the license. Our</br>
|
||||
  licenses grant only permissions under copyright and certain</br>
|
||||
  other rights that a licensor has authority to grant. Use of</br>
|
||||
  the licensed material may still be restricted for other</br>
|
||||
  reasons, including because others have copyright or other</br>
|
||||
  rights in the material. A licensor may make special requests,</br>
|
||||
  such as asking that all changes be marked or described.</br>
|
||||
  Although not required by our licenses, you are encouraged to</br>
|
||||
  respect those requests where reasonable. More considerations</br>
|
||||
  for the public:</br>
|
||||
 wiki.creativecommons.org/Considerations_for_licensees</br>
|
||||
</br>
|
||||
=======================================================================</br>
|
||||
</br>
|
||||
Creative Commons Attribution-ShareAlike 4.0 International Public</br>
|
||||
License</br>
|
||||
</br>
|
||||
By exercising the Licensed Rights (defined below), You accept and agree</br>
|
||||
to be bound by the terms and conditions of this Creative Commons</br>
|
||||
Attribution-ShareAlike 4.0 International Public License ("Public</br>
|
||||
License"). To the extent this Public License may be interpreted as a</br>
|
||||
contract, You are granted the Licensed Rights in consideration of Your</br>
|
||||
acceptance of these terms and conditions, and the Licensor grants You</br>
|
||||
such rights in consideration of benefits the Licensor receives from</br>
|
||||
making the Licensed Material available under these terms and</br>
|
||||
conditions.</br>
|
||||
</br>
|
||||
</br>
|
||||
Section 1 -- Definitions.</br>
|
||||
</br>
|
||||
 a. Adapted Material means material subject to Copyright and Similar</br>
|
||||
  Rights that is derived from or based upon the Licensed Material</br>
|
||||
  and in which the Licensed Material is translated, altered,</br>
|
||||
  arranged, transformed, or otherwise modified in a manner requiring</br>
|
||||
  permission under the Copyright and Similar Rights held by the</br>
|
||||
  Licensor. For purposes of this Public License, where the Licensed</br>
|
||||
  Material is a musical work, performance, or sound recording,</br>
|
||||
  Adapted Material is always produced where the Licensed Material is</br>
|
||||
  synched in timed relation with a moving image.</br>
|
||||
</br>
|
||||
 b. Adapter's License means the license You apply to Your Copyright</br>
|
||||
  and Similar Rights in Your contributions to Adapted Material in</br>
|
||||
  accordance with the terms and conditions of this Public License.</br>
|
||||
</br>
|
||||
 c. BY-SA Compatible License means a license listed at</br>
|
||||
  creativecommons.org/compatiblelicenses, approved by Creative</br>
|
||||
  Commons as essentially the equivalent of this Public License.</br>
|
||||
</br>
|
||||
 d. Copyright and Similar Rights means copyright and/or similar rights</br>
|
||||
  closely related to copyright including, without limitation,</br>
|
||||
  performance, broadcast, sound recording, and Sui Generis Database</br>
|
||||
  Rights, without regard to how the rights are labeled or</br>
|
||||
  categorized. For purposes of this Public License, the rights</br>
|
||||
  specified in Section 2(b)(1)-(2) are not Copyright and Similar</br>
|
||||
  Rights.</br>
|
||||
</br>
|
||||
 e. Effective Technological Measures means those measures that, in the</br>
|
||||
  absence of proper authority, may not be circumvented under laws</br>
|
||||
  fulfilling obligations under Article 11 of the WIPO Copyright</br>
|
||||
  Treaty adopted on December 20, 1996, and/or similar international</br>
|
||||
  agreements.</br>
|
||||
</br>
|
||||
 f. Exceptions and Limitations means fair use, fair dealing, and/or</br>
|
||||
  any other exception or limitation to Copyright and Similar Rights</br>
|
||||
  that applies to Your use of the Licensed Material.</br>
|
||||
</br>
|
||||
 g. License Elements means the license attributes listed in the name</br>
|
||||
  of a Creative Commons Public License. The License Elements of this</br>
|
||||
  Public License are Attribution and ShareAlike.</br>
|
||||
</br>
|
||||
 h. Licensed Material means the artistic or literary work, database,</br>
|
||||
  or other material to which the Licensor applied this Public</br>
|
||||
  License.</br>
|
||||
</br>
|
||||
 i. Licensed Rights means the rights granted to You subject to the</br>
|
||||
  terms and conditions of this Public License, which are limited to</br>
|
||||
  all Copyright and Similar Rights that apply to Your use of the</br>
|
||||
  Licensed Material and that the Licensor has authority to license.</br>
|
||||
</br>
|
||||
 j. Licensor means the individual(s) or entity(ies) granting rights</br>
|
||||
  under this Public License.</br>
|
||||
</br>
|
||||
 k. Share means to provide material to the public by any means or</br>
|
||||
  process that requires permission under the Licensed Rights, such</br>
|
||||
  as reproduction, public display, public performance, distribution,</br>
|
||||
  dissemination, communication, or importation, and to make material</br>
|
||||
  available to the public including in ways that members of the</br>
|
||||
  public may access the material from a place and at a time</br>
|
||||
  individually chosen by them.</br>
|
||||
</br>
|
||||
 l. Sui Generis Database Rights means rights other than copyright</br>
|
||||
  resulting from Directive 96/9/EC of the European Parliament and of</br>
|
||||
  the Council of 11 March 1996 on the legal protection of databases,</br>
|
||||
  as amended and/or succeeded, as well as other essentially</br>
|
||||
  equivalent rights anywhere in the world.</br>
|
||||
</br>
|
||||
 m. You means the individual or entity exercising the Licensed Rights</br>
|
||||
  under this Public License. Your has a corresponding meaning.</br>
|
||||
</br>
|
||||
</br>
|
||||
Section 2 -- Scope.</br>
|
||||
</br>
|
||||
 a. License grant.</br>
|
||||
</br>
|
||||
  1. Subject to the terms and conditions of this Public License,</br>
|
||||
   the Licensor hereby grants You a worldwide, royalty-free,</br>
|
||||
   non-sublicensable, non-exclusive, irrevocable license to</br>
|
||||
   exercise the Licensed Rights in the Licensed Material to:</br>
|
||||
</br>
|
||||
   a. reproduce and Share the Licensed Material, in whole or</br>
|
||||
    in part; and</br>
|
||||
</br>
|
||||
   b. produce, reproduce, and Share Adapted Material.</br>
|
||||
</br>
|
||||
  2. Exceptions and Limitations. For the avoidance of doubt, where</br>
|
||||
   Exceptions and Limitations apply to Your use, this Public</br>
|
||||
   License does not apply, and You do not need to comply with</br>
|
||||
   its terms and conditions.</br>
|
||||
</br>
|
||||
  3. Term. The term of this Public License is specified in Section</br>
|
||||
   6(a).</br>
|
||||
</br>
|
||||
  4. Media and formats; technical modifications allowed. The</br>
|
||||
   Licensor authorizes You to exercise the Licensed Rights in</br>
|
||||
   all media and formats whether now known or hereafter created,</br>
|
||||
   and to make technical modifications necessary to do so. The</br>
|
||||
   Licensor waives and/or agrees not to assert any right or</br>
|
||||
   authority to forbid You from making technical modifications</br>
|
||||
   necessary to exercise the Licensed Rights, including</br>
|
||||
   technical modifications necessary to circumvent Effective</br>
|
||||
   Technological Measures. For purposes of this Public License,</br>
|
||||
   simply making modifications authorized by this Section 2(a)</br>
|
||||
   (4) never produces Adapted Material.</br>
|
||||
</br>
|
||||
  5. Downstream recipients.</br>
|
||||
</br>
|
||||
   a. Offer from the Licensor -- Licensed Material. Every</br>
|
||||
    recipient of the Licensed Material automatically</br>
|
||||
    receives an offer from the Licensor to exercise the</br>
|
||||
    Licensed Rights under the terms and conditions of this</br>
|
||||
    Public License.</br>
|
||||
</br>
|
||||
   b. Additional offer from the Licensor -- Adapted Material.</br>
|
||||
    Every recipient of Adapted Material from You</br>
|
||||
    automatically receives an offer from the Licensor to</br>
|
||||
    exercise the Licensed Rights in the Adapted Material</br>
|
||||
    under the conditions of the Adapter's License You apply.</br>
|
||||
</br>
|
||||
   c. No downstream restrictions. You may not offer or impose</br>
|
||||
    any additional or different terms or conditions on, or</br>
|
||||
    apply any Effective Technological Measures to, the</br>
|
||||
    Licensed Material if doing so restricts exercise of the</br>
|
||||
    Licensed Rights by any recipient of the Licensed</br>
|
||||
    Material.</br>
|
||||
</br>
|
||||
  6. No endorsement. Nothing in this Public License constitutes or</br>
|
||||
   may be construed as permission to assert or imply that You</br>
|
||||
   are, or that Your use of the Licensed Material is, connected</br>
|
||||
   with, or sponsored, endorsed, or granted official status by,</br>
|
||||
   the Licensor or others designated to receive attribution as</br>
|
||||
   provided in Section 3(a)(1)(A)(i).</br>
|
||||
</br>
|
||||
 b. Other rights.</br>
|
||||
</br>
|
||||
  1. Moral rights, such as the right of integrity, are not</br>
|
||||
   licensed under this Public License, nor are publicity,</br>
|
||||
   privacy, and/or other similar personality rights; however, to</br>
|
||||
   the extent possible, the Licensor waives and/or agrees not to</br>
|
||||
   assert any such rights held by the Licensor to the limited</br>
|
||||
   extent necessary to allow You to exercise the Licensed</br>
|
||||
   Rights, but not otherwise.</br>
|
||||
</br>
|
||||
  2. Patent and trademark rights are not licensed under this</br>
|
||||
   Public License.</br>
|
||||
</br>
|
||||
  3. To the extent possible, the Licensor waives any right to</br>
|
||||
   collect royalties from You for the exercise of the Licensed</br>
|
||||
   Rights, whether directly or through a collecting society</br>
|
||||
   under any voluntary or waivable statutory or compulsory</br>
|
||||
   licensing scheme. In all other cases the Licensor expressly</br>
|
||||
   reserves any right to collect such royalties.</br>
|
||||
</br>
|
||||
</br>
|
||||
Section 3 -- License Conditions.</br>
|
||||
</br>
|
||||
Your exercise of the Licensed Rights is expressly made subject to the</br>
|
||||
following conditions.</br>
|
||||
</br>
|
||||
 a. Attribution.</br>
|
||||
</br>
|
||||
  1. If You Share the Licensed Material (including in modified</br>
|
||||
   form), You must:</br>
|
||||
</br>
|
||||
   a. retain the following if it is supplied by the Licensor</br>
|
||||
    with the Licensed Material:</br>
|
||||
</br>
|
||||
     i. identification of the creator(s) of the Licensed</br>
|
||||
     Material and any others designated to receive</br>
|
||||
     attribution, in any reasonable manner requested by</br>
|
||||
     the Licensor (including by pseudonym if</br>
|
||||
     designated);</br>
|
||||
</br>
|
||||
    ii. a copyright notice;</br>
|
||||
</br>
|
||||
    iii. a notice that refers to this Public License;</br>
|
||||
</br>
|
||||
    iv. a notice that refers to the disclaimer of</br>
|
||||
     warranties;</br>
|
||||
</br>
|
||||
     v. a URI or hyperlink to the Licensed Material to the</br>
|
||||
     extent reasonably practicable;</br>
|
||||
</br>
|
||||
   b. indicate if You modified the Licensed Material and</br>
|
||||
    retain an indication of any previous modifications; and</br>
|
||||
</br>
|
||||
   c. indicate the Licensed Material is licensed under this</br>
|
||||
    Public License, and include the text of, or the URI or</br>
|
||||
    hyperlink to, this Public License.</br>
|
||||
</br>
|
||||
  2. You may satisfy the conditions in Section 3(a)(1) in any</br>
|
||||
   reasonable manner based on the medium, means, and context in</br>
|
||||
   which You Share the Licensed Material. For example, it may be</br>
|
||||
   reasonable to satisfy the conditions by providing a URI or</br>
|
||||
   hyperlink to a resource that includes the required</br>
|
||||
   information.</br>
|
||||
</br>
|
||||
  3. If requested by the Licensor, You must remove any of the</br>
|
||||
   information required by Section 3(a)(1)(A) to the extent</br>
|
||||
   reasonably practicable.</br>
|
||||
</br>
|
||||
 b. ShareAlike.</br>
|
||||
</br>
|
||||
  In addition to the conditions in Section 3(a), if You Share</br>
|
||||
  Adapted Material You produce, the following conditions also apply.</br>
|
||||
</br>
|
||||
  1. The Adapter's License You apply must be a Creative Commons</br>
|
||||
   license with the same License Elements, this version or</br>
|
||||
   later, or a BY-SA Compatible License.</br>
|
||||
</br>
|
||||
  2. You must include the text of, or the URI or hyperlink to, the</br>
|
||||
   Adapter's License You apply. You may satisfy this condition</br>
|
||||
   in any reasonable manner based on the medium, means, and</br>
|
||||
   context in which You Share Adapted Material.</br>
|
||||
</br>
|
||||
  3. You may not offer or impose any additional or different terms</br>
|
||||
   or conditions on, or apply any Effective Technological</br>
|
||||
   Measures to, Adapted Material that restrict exercise of the</br>
|
||||
   rights granted under the Adapter's License You apply.</br>
|
||||
</br>
|
||||
</br>
|
||||
Section 4 -- Sui Generis Database Rights.</br>
|
||||
</br>
|
||||
Where the Licensed Rights include Sui Generis Database Rights that</br>
|
||||
apply to Your use of the Licensed Material:</br>
|
||||
</br>
|
||||
 a. for the avoidance of doubt, Section 2(a)(1) grants You the right</br>
|
||||
  to extract, reuse, reproduce, and Share all or a substantial</br>
|
||||
  portion of the contents of the database;</br>
|
||||
</br>
|
||||
 b. if You include all or a substantial portion of the database</br>
|
||||
  contents in a database in which You have Sui Generis Database</br>
|
||||
  Rights, then the database in which You have Sui Generis Database</br>
|
||||
  Rights (but not its individual contents) is Adapted Material,</br>
|
||||
  including for purposes of Section 3(b); and</br>
|
||||
</br>
|
||||
 c. You must comply with the conditions in Section 3(a) if You Share</br>
|
||||
  all or a substantial portion of the contents of the database.</br>
|
||||
</br>
|
||||
For the avoidance of doubt, this Section 4 supplements and does not</br>
|
||||
replace Your obligations under this Public License where the Licensed</br>
|
||||
Rights include other Copyright and Similar Rights.</br>
|
||||
</br>
|
||||
</br>
|
||||
Section 5 -- Disclaimer of Warranties and Limitation of Liability.</br>
|
||||
</br>
|
||||
 a. UNLESS OTHERWISE SEPARATELY UNDERTAKEN BY THE LICENSOR, TO THE</br>
|
||||
  EXTENT POSSIBLE, THE LICENSOR OFFERS THE LICENSED MATERIAL AS-IS</br>
|
||||
  AND AS-AVAILABLE, AND MAKES NO REPRESENTATIONS OR WARRANTIES OF</br>
|
||||
  ANY KIND CONCERNING THE LICENSED MATERIAL, WHETHER EXPRESS,</br>
|
||||
  IMPLIED, STATUTORY, OR OTHER. THIS INCLUDES, WITHOUT LIMITATION,</br>
|
||||
  WARRANTIES OF TITLE, MERCHANTABILITY, FITNESS FOR A PARTICULAR</br>
|
||||
  PURPOSE, NON-INFRINGEMENT, ABSENCE OF LATENT OR OTHER DEFECTS,</br>
|
||||
  ACCURACY, OR THE PRESENCE OR ABSENCE OF ERRORS, WHETHER OR NOT</br>
|
||||
  KNOWN OR DISCOVERABLE. WHERE DISCLAIMERS OF WARRANTIES ARE NOT</br>
|
||||
  ALLOWED IN FULL OR IN PART, THIS DISCLAIMER MAY NOT APPLY TO YOU.</br>
|
||||
</br>
|
||||
 b. TO THE EXTENT POSSIBLE, IN NO EVENT WILL THE LICENSOR BE LIABLE</br>
|
||||
  TO YOU ON ANY LEGAL THEORY (INCLUDING, WITHOUT LIMITATION,</br>
|
||||
  NEGLIGENCE) OR OTHERWISE FOR ANY DIRECT, SPECIAL, INDIRECT,</br>
|
||||
  INCIDENTAL, CONSEQUENTIAL, PUNITIVE, EXEMPLARY, OR OTHER LOSSES,</br>
|
||||
  COSTS, EXPENSES, OR DAMAGES ARISING OUT OF THIS PUBLIC LICENSE OR</br>
|
||||
  USE OF THE LICENSED MATERIAL, EVEN IF THE LICENSOR HAS BEEN</br>
|
||||
  ADVISED OF THE POSSIBILITY OF SUCH LOSSES, COSTS, EXPENSES, OR</br>
|
||||
  DAMAGES. WHERE A LIMITATION OF LIABILITY IS NOT ALLOWED IN FULL OR</br>
|
||||
  IN PART, THIS LIMITATION MAY NOT APPLY TO YOU.</br>
|
||||
</br>
|
||||
 c. The disclaimer of warranties and limitation of liability provided</br>
|
||||
  above shall be interpreted in a manner that, to the extent</br>
|
||||
  possible, most closely approximates an absolute disclaimer and</br>
|
||||
  waiver of all liability.</br>
|
||||
</br>
|
||||
</br>
|
||||
Section 6 -- Term and Termination.</br>
|
||||
</br>
|
||||
 a. This Public License applies for the term of the Copyright and</br>
|
||||
  Similar Rights licensed here. However, if You fail to comply with</br>
|
||||
  this Public License, then Your rights under this Public License</br>
|
||||
  terminate automatically.</br>
|
||||
</br>
|
||||
 b. Where Your right to use the Licensed Material has terminated under</br>
|
||||
  Section 6(a), it reinstates:</br>
|
||||
</br>
|
||||
  1. automatically as of the date the violation is cured, provided</br>
|
||||
   it is cured within 30 days of Your discovery of the</br>
|
||||
   violation; or</br>
|
||||
</br>
|
||||
  2. upon express reinstatement by the Licensor.</br>
|
||||
</br>
|
||||
  For the avoidance of doubt, this Section 6(b) does not affect any</br>
|
||||
  right the Licensor may have to seek remedies for Your violations</br>
|
||||
  of this Public License.</br>
|
||||
</br>
|
||||
 c. For the avoidance of doubt, the Licensor may also offer the</br>
|
||||
  Licensed Material under separate terms or conditions or stop</br>
|
||||
  distributing the Licensed Material at any time; however, doing so</br>
|
||||
  will not terminate this Public License.</br>
|
||||
</br>
|
||||
 d. Sections 1, 5, 6, 7, and 8 survive termination of this Public</br>
|
||||
  License.</br>
|
||||
</br>
|
||||
</br>
|
||||
Section 7 -- Other Terms and Conditions.</br>
|
||||
</br>
|
||||
 a. The Licensor shall not be bound by any additional or different</br>
|
||||
  terms or conditions communicated by You unless expressly agreed.</br>
|
||||
</br>
|
||||
 b. Any arrangements, understandings, or agreements regarding the</br>
|
||||
  Licensed Material not stated herein are separate from and</br>
|
||||
  independent of the terms and conditions of this Public License.</br>
|
||||
</br>
|
||||
</br>
|
||||
Section 8 -- Interpretation.</br>
|
||||
</br>
|
||||
 a. For the avoidance of doubt, this Public License does not, and</br>
|
||||
  shall not be interpreted to, reduce, limit, restrict, or impose</br>
|
||||
  conditions on any use of the Licensed Material that could lawfully</br>
|
||||
  be made without permission under this Public License.</br>
|
||||
</br>
|
||||
 b. To the extent possible, if any provision of this Public License is</br>
|
||||
  deemed unenforceable, it shall be automatically reformed to the</br>
|
||||
  minimum extent necessary to make it enforceable. If the provision</br>
|
||||
  cannot be reformed, it shall be severed from this Public License</br>
|
||||
  without affecting the enforceability of the remaining terms and</br>
|
||||
  conditions.</br>
|
||||
</br>
|
||||
 c. No term or condition of this Public License will be waived and no</br>
|
||||
  failure to comply consented to unless expressly agreed to by the</br>
|
||||
  Licensor.</br>
|
||||
</br>
|
||||
 d. Nothing in this Public License constitutes or may be interpreted</br>
|
||||
  as a limitation upon, or waiver of, any privileges and immunities</br>
|
||||
  that apply to the Licensor or You, including from the legal</br>
|
||||
  processes of any jurisdiction or authority.</br>
|
||||
</br>
|
||||
</br>
|
||||
=======================================================================</br>
|
||||
</br>
|
||||
Creative Commons is not a party to its public</br>
|
||||
licenses. Notwithstanding, Creative Commons may elect to apply one of</br>
|
||||
its public licenses to material it publishes and in those instances</br>
|
||||
will be considered the “Licensor.” The text of the Creative Commons</br>
|
||||
public licenses is dedicated to the public domain under the CC0 Public</br>
|
||||
Domain Dedication. Except for the limited purpose of indicating that</br>
|
||||
material is shared under a Creative Commons public license or as</br>
|
||||
otherwise permitted by the Creative Commons policies published at</br>
|
||||
creativecommons.org/policies, Creative Commons does not authorize the</br>
|
||||
use of the trademark "Creative Commons" or any other trademark or logo</br>
|
||||
of Creative Commons without its prior written consent including,</br>
|
||||
without limitation, in connection with any unauthorized modifications</br>
|
||||
to any of its public licenses or any other arrangements,</br>
|
||||
understandings, or agreements concerning use of licensed material. For</br>
|
||||
the avoidance of doubt, this paragraph does not form part of the</br>
|
||||
public licenses.</br>
|
||||
</br>
|
||||
Creative Commons may be contacted at creativecommons.org.</br>
|
||||
|
||||
</div>
|
||||
|
||||
<div class="footer" xmlns:cc="http://creativecommons.org/ns#" xmlns:dct="http://purl.org/dc/terms/">
|
||||
<a property="dct:title" rel="cc:attributionURL" href="file:///home/user/git/github.com/greflm13/StaticGalleryBuilder/test/">Pictures</a> by <span property="cc:attributionName">Author</span> is licensed under
|
||||
<a href="https://creativecommons.org/licenses/by-nc-sa/4.0/" target="_blank" rel="license noopener noreferrer">CC BY-NC-SA 4.0
|
||||
<img src="https://mirrors.creativecommons.org/presskit/icons/cc.svg" alt="" />
|
||||
<img src="https://mirrors.creativecommons.org/presskit/icons/by.svg" alt="" />
|
||||
<img src="https://mirrors.creativecommons.org/presskit/icons/nc.svg" alt="" />
|
||||
<img src="https://mirrors.creativecommons.org/presskit/icons/sa.svg" alt="" />
|
||||
</a>
|
||||
<span class="attribution">Made with <a href="https://github.com/greflm13/StaticGalleryBuilder" target="_blank" rel="noopener noreferrer">StaticGalleryBuilder 2.5.0</a> by <a
|
||||
href="https://github.com/greflm13" target="_blank" rel="noopener noreferrer"><svg width="48.858002mm" height="21.24mm" viewBox="0 0 48.858002 21.24" version="1.1" id="svg1" xmlns="http://www.w3.org/2000/svg" xmlns:svg="http://www.w3.org/2000/svg"> <text xml:space="preserve" x="21.124891" y="17.106812" font-style="normal" font-variant="normal" font-weight="300" font-stretch="condensed" font-size="2.46944px" line-height="9.33327px" font-family="Barlow Condensed Light" fill="#6e6e6e" stroke-width="1" fill-opacity="1">sorogon</text> <text xml:space="preserve" x="2.3734004" y="14.853325" font-style="normal" font-variant="normal" font-weight="250" font-stretch="condensed" font-size="16.9333px" line-height="63.9997px" font-family="Barlow Condensed Thin" fill="#6e6e6e" stroke-width="1" fill-opacity="1"></srgn></text> </svg></a>.</span>
|
||||
<button onclick="topFunction()" id="totop" title="Back to Top">Back to Top</button>
|
||||
</div>
|
||||
</body>
|
||||
Reference in New Issue
Block a user