Compare commits
46 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
559ff6a7b3
|
|||
|
3e3bb67884
|
|||
|
d0935a474f
|
|||
|
a57bc8e3b5
|
|||
| 08622bd092 | |||
| a8b2df43bd | |||
|
b249ae9d46
|
|||
| b4badfbd15 | |||
| cb0fe96654 | |||
| 6b04b75314 | |||
|
6076b5f6f2
|
|||
|
5036ff79f7
|
|||
|
50ca8ab5bf
|
|||
|
3f427dfa32
|
|||
|
9b7c3dc697
|
|||
|
c732b49339
|
|||
|
9829a74f95
|
|||
|
372b960261
|
|||
|
c671c2a4bc
|
|||
|
8088b2e69c
|
|||
|
e4d63de680
|
|||
|
0e8287e4a8
|
|||
|
48950d1d82
|
|||
|
e1d74c3091
|
|||
|
f57d81f508
|
|||
|
67a9058b7d
|
|||
|
79e34d7e43
|
|||
|
0cda1706fa
|
|||
|
85467f4f1e
|
|||
|
00ccb96581
|
|||
|
5227beb02a
|
|||
|
22f9cb4e00
|
|||
|
dbf3e5c27a
|
|||
|
d9ca40bf77
|
|||
|
b8cbc49647
|
|||
|
b80e98a4ec
|
|||
|
350f41f439
|
|||
|
00b5020642
|
|||
|
492ea8755f
|
|||
|
39da474db6
|
|||
|
44bcd5607f
|
|||
|
5ff44a1912
|
|||
|
4241f3965a
|
|||
|
002e9c62db
|
|||
| cf494401c8 | |||
|
2a0323e579
|
3
.gitignore
vendored
@@ -164,7 +164,8 @@ cython_debug/
|
|||||||
test/.static
|
test/.static
|
||||||
test/.thumbnails
|
test/.thumbnails
|
||||||
test/**/index.html
|
test/**/index.html
|
||||||
test/**/.sizelist.json
|
test/**/license.html
|
||||||
|
test/**/.metadata.json
|
||||||
test/manifest.json
|
test/manifest.json
|
||||||
themes/previews
|
themes/previews
|
||||||
logs
|
logs
|
||||||
|
|||||||
10
.hintrc
@@ -3,6 +3,14 @@
|
|||||||
"development"
|
"development"
|
||||||
],
|
],
|
||||||
"hints": {
|
"hints": {
|
||||||
"apple-touch-icons": "off"
|
"apple-touch-icons": "off",
|
||||||
|
"compat-api/css": [
|
||||||
|
"default",
|
||||||
|
{
|
||||||
|
"ignore": [
|
||||||
|
"-webkit-app-region"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1 +1 @@
|
|||||||
3.12
|
StaticGalleryBuilder
|
||||||
|
|||||||
@@ -55,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.
|
- `--ignore-other-files`: Ignore files that do not match the specified extensions.
|
||||||
- `--regenerate-thumbnails`: Regenerate thumbnails even if they already exist.
|
- `--regenerate-thumbnails`: Regenerate thumbnails even if they already exist.
|
||||||
- `--reread-metadata`: Reread image metadata if it already exists.
|
- `--reread-metadata`: Reread image metadata if it already exists.
|
||||||
|
- `--reread-sidecar`: Reread sidecar file data.
|
||||||
- `--reverse-sort`: Sort images by reverse name order.
|
- `--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.
|
- `--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.
|
- `--use-fancy-folders`: Enable fancy folder view instead of the default Apache directory listing.
|
||||||
@@ -97,6 +98,7 @@ To generate a web manifest file:
|
|||||||
- The script generates the preview thumbnails in a `.thumbnails` subdirectory within the root folder.
|
- 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.
|
- 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.
|
- Add a `info` file into any directory containing pictures and it will be read and displayed as a tooltip on the website.
|
||||||
|
- Add tags to the Image xmp `subject` or to `.metadata.json` to tag images for filtering.
|
||||||
|
|
||||||
## License
|
## License
|
||||||
|
|
||||||
|
|||||||
@@ -9,14 +9,14 @@
|
|||||||
"ms-python.vscode-pylance",
|
"ms-python.vscode-pylance",
|
||||||
"samuelcolvin.jinjahtml",
|
"samuelcolvin.jinjahtml",
|
||||||
"vscode.css-language-features",
|
"vscode.css-language-features",
|
||||||
"vscode.html-language-features",
|
"vscode.html-language-features"
|
||||||
],
|
]
|
||||||
},
|
},
|
||||||
"folders": [
|
"folders": [
|
||||||
{
|
{
|
||||||
"name": "StaticGalleryBuilder",
|
"name": "StaticGalleryBuilder",
|
||||||
"path": "./",
|
"path": "./"
|
||||||
},
|
}
|
||||||
],
|
],
|
||||||
"launch": {
|
"launch": {
|
||||||
"version": "0.2.0",
|
"version": "0.2.0",
|
||||||
@@ -40,14 +40,14 @@
|
|||||||
"--reverse-sort",
|
"--reverse-sort",
|
||||||
"--regenerate-thumbnails",
|
"--regenerate-thumbnails",
|
||||||
"--reread-metadata",
|
"--reread-metadata",
|
||||||
"--folderthumbnails",
|
"--folderthumbnails"
|
||||||
],
|
],
|
||||||
"console": "integratedTerminal",
|
"console": "integratedTerminal",
|
||||||
"name": "Testfolder",
|
"name": "Testfolder",
|
||||||
"postDebugTask": "Delete Lockfile",
|
"postDebugTask": "Delete Lockfile",
|
||||||
"program": "${workspaceFolder}/builder.py",
|
"program": "${workspaceFolder}/builder.py",
|
||||||
"request": "launch",
|
"request": "launch",
|
||||||
"type": "debugpy",
|
"type": "debugpy"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"args": [
|
"args": [
|
||||||
@@ -65,61 +65,83 @@
|
|||||||
"-m",
|
"-m",
|
||||||
// "--regenerate-thumbnails",
|
// "--regenerate-thumbnails",
|
||||||
// "--reread-metadata",
|
// "--reread-metadata",
|
||||||
"--folderthumbnails",
|
"--folderthumbnails"
|
||||||
],
|
],
|
||||||
"console": "integratedTerminal",
|
"console": "integratedTerminal",
|
||||||
"name": "woek",
|
"name": "woek",
|
||||||
"postDebugTask": "Delete Lockfile 2",
|
"postDebugTask": "Delete Lockfile 2",
|
||||||
"program": "${workspaceFolder}/builder.py",
|
"program": "${workspaceFolder}/builder.py",
|
||||||
"request": "launch",
|
"request": "launch",
|
||||||
"type": "debugpy",
|
"type": "debugpy"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"args": [
|
||||||
|
"--use-fancy-folders",
|
||||||
|
"-p",
|
||||||
|
"/mnt/nfs/pictures/",
|
||||||
|
"-w",
|
||||||
|
"https://pictures.sorogon.eu/",
|
||||||
|
"-t",
|
||||||
|
"Sorogon's Pictures",
|
||||||
|
"--theme",
|
||||||
|
"/home/user/git/github.com/greflm13/simple-picture-server/themes/alpenglow.css",
|
||||||
|
"-m",
|
||||||
|
"--exclude-folder",
|
||||||
|
"Scans",
|
||||||
|
"--exclude-folder",
|
||||||
|
"*/Galleries/*",
|
||||||
|
"--exclude-folder",
|
||||||
|
"*/Wallpaper/*",
|
||||||
|
"--folderthumbnails"
|
||||||
|
],
|
||||||
|
"console": "integratedTerminal",
|
||||||
|
"name": "production",
|
||||||
|
"program": "${workspaceFolder}/builder.py",
|
||||||
|
"request": "launch",
|
||||||
|
"type": "debugpy"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"args": [
|
"args": [
|
||||||
"${workspaceFolder}/themes",
|
"${workspaceFolder}/themes",
|
||||||
"https://pictures.sorogon.eu/Analog/Example/"
|
"https://pictures.sorogon.eu/public/Example/"
|
||||||
],
|
],
|
||||||
"console": "integratedTerminal",
|
"console": "integratedTerminal",
|
||||||
"name": "Generate Themes previews",
|
"name": "Generate Themes previews",
|
||||||
"program": "${workspaceFolder}/generate_previews.py",
|
"program": "${workspaceFolder}/generate_previews.py",
|
||||||
"request": "launch",
|
"request": "launch",
|
||||||
"type": "debugpy",
|
"type": "debugpy"
|
||||||
}
|
}
|
||||||
],
|
]
|
||||||
},
|
},
|
||||||
"settings": {
|
"settings": {
|
||||||
"[css]": {
|
"[css]": {
|
||||||
"editor.defaultFormatter": "vscode.css-language-features",
|
"editor.defaultFormatter": "vscode.css-language-features"
|
||||||
},
|
},
|
||||||
"[jinja-css]": {
|
"[jinja-css]": {
|
||||||
"editor.defaultFormatter": "vscode.css-language-features",
|
"editor.defaultFormatter": "vscode.css-language-features"
|
||||||
},
|
},
|
||||||
"[jinja-html]": {
|
"[jinja-html]": {
|
||||||
"editor.defaultFormatter": "vscode.html-language-features",
|
"editor.defaultFormatter": "vscode.html-language-features"
|
||||||
},
|
},
|
||||||
"[jinja-js]": {
|
"[jinja-js]": {
|
||||||
"editor.defaultFormatter": "esbenp.prettier-vscode",
|
"editor.defaultFormatter": "esbenp.prettier-vscode"
|
||||||
},
|
},
|
||||||
"[python]": {
|
"[python]": {
|
||||||
"editor.defaultFormatter": "charliermarsh.ruff",
|
"editor.defaultFormatter": "charliermarsh.ruff"
|
||||||
},
|
},
|
||||||
"black-formatter.args": [
|
"black-formatter.args": ["-l 260"],
|
||||||
"-l 260",
|
"black-formatter.interpreter": ["/usr/bin/python3"],
|
||||||
],
|
|
||||||
"black-formatter.interpreter": [
|
|
||||||
"/usr/bin/python3",
|
|
||||||
],
|
|
||||||
"editor.formatOnSave": false,
|
"editor.formatOnSave": false,
|
||||||
"emmet.includeLanguages": {
|
"emmet.includeLanguages": {
|
||||||
"jinja-css": "css",
|
"jinja-css": "css",
|
||||||
"jinja-html": "html",
|
"jinja-html": "html",
|
||||||
"jinja-js": "javascript",
|
"jinja-js": "javascript",
|
||||||
"jinja-json": "json",
|
"jinja-json": "json"
|
||||||
},
|
},
|
||||||
"files.associations": {
|
"files.associations": {
|
||||||
"**/*.css.j2": "jinja-css",
|
"**/*.css.j2": "jinja-css",
|
||||||
"**/*.css": "css",
|
"**/*.css": "css",
|
||||||
"**/*.html.j2": "jinja-html",
|
"**/*.html.j2": "jinja-html"
|
||||||
},
|
},
|
||||||
"gitblame.inlineMessageEnabled": true,
|
"gitblame.inlineMessageEnabled": true,
|
||||||
"gitblame.inlineMessageFormat": "${author.name}, ${time.ago} • ${commit.summary}",
|
"gitblame.inlineMessageFormat": "${author.name}, ${time.ago} • ${commit.summary}",
|
||||||
@@ -135,17 +157,17 @@
|
|||||||
"json.schemaDownload.enable": true,
|
"json.schemaDownload.enable": true,
|
||||||
"json.schemas": [
|
"json.schemas": [
|
||||||
{
|
{
|
||||||
"fileMatch": [
|
"fileMatch": ["manifest.json.j2"],
|
||||||
"manifest.json.j2",
|
"url": "https://json.schemastore.org/web-manifest-combined.json"
|
||||||
],
|
}
|
||||||
"url": "https://json.schemastore.org/web-manifest-combined.json",
|
|
||||||
},
|
|
||||||
],
|
],
|
||||||
"prettier.htmlWhitespaceSensitivity": "css",
|
"prettier.htmlWhitespaceSensitivity": "css",
|
||||||
"pylint.args": [
|
"python-envs.pythonProjects": [
|
||||||
"--disable=C0111",
|
{
|
||||||
"--disable=C0301",
|
"path": "",
|
||||||
"--good-names-rgxs=^[_a-z][_a-z0-9]?$",
|
"envManager": "ms-python.python:pyenv",
|
||||||
|
"packageManager": "ms-python.python:pip"
|
||||||
|
}
|
||||||
],
|
],
|
||||||
"python.analysis.inlayHints.callArgumentNames": "off",
|
"python.analysis.inlayHints.callArgumentNames": "off",
|
||||||
"python.analysis.inlayHints.functionReturnTypes": false,
|
"python.analysis.inlayHints.functionReturnTypes": false,
|
||||||
@@ -153,7 +175,7 @@
|
|||||||
"yaml.schemas": {
|
"yaml.schemas": {
|
||||||
"https://raw.githubusercontent.com/pamburus/hl/master/schema/json/config.schema.json": "file:///home/user/git/github.com/greflm13/StaticGalleryBuilder/hl_config.yaml"
|
"https://raw.githubusercontent.com/pamburus/hl/master/schema/json/config.schema.json": "file:///home/user/git/github.com/greflm13/StaticGalleryBuilder/hl_config.yaml"
|
||||||
},
|
},
|
||||||
"ruff.lineLength": 180,
|
"ruff.lineLength": 180
|
||||||
},
|
},
|
||||||
"tasks": {
|
"tasks": {
|
||||||
"version": "2.0.0",
|
"version": "2.0.0",
|
||||||
@@ -206,9 +228,7 @@
|
|||||||
"kind": "build",
|
"kind": "build",
|
||||||
"isDefault": true
|
"isDefault": true
|
||||||
},
|
},
|
||||||
"dependsOn": [
|
"dependsOn": ["Clean"]
|
||||||
"Clean"
|
|
||||||
]
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"command": "rm -rf build dist",
|
"command": "rm -rf build dist",
|
||||||
@@ -240,7 +260,22 @@
|
|||||||
"showReuseMessage": false,
|
"showReuseMessage": false,
|
||||||
"clear": true
|
"clear": true
|
||||||
}
|
}
|
||||||
}
|
|
||||||
],
|
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"command": "COLUMNS=120 ./builder.py --generate-help-preview help.svg",
|
||||||
|
"isBackground": false,
|
||||||
|
"label": "Create help svg",
|
||||||
|
"problemMatcher": [],
|
||||||
|
"type": "shell",
|
||||||
|
"presentation": {
|
||||||
|
"echo": false,
|
||||||
|
"reveal": "always",
|
||||||
|
"focus": true,
|
||||||
|
"panel": "dedicated",
|
||||||
|
"showReuseMessage": false,
|
||||||
|
"clear": true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
}
|
}
|
||||||
11
builder.py
@@ -11,6 +11,7 @@ from pathlib import Path
|
|||||||
|
|
||||||
from tqdm.auto import tqdm
|
from tqdm.auto import tqdm
|
||||||
from PIL import Image, ImageOps
|
from PIL import Image, ImageOps
|
||||||
|
from jsmin import jsmin
|
||||||
|
|
||||||
from modules.argumentparser import parse_arguments, Args
|
from modules.argumentparser import parse_arguments, Args
|
||||||
|
|
||||||
@@ -34,8 +35,6 @@ IMG_EXTENSIONS = [".jpg", ".jpeg", ".png"]
|
|||||||
NOT_LIST = ["*/Galleries/*", "Archives"]
|
NOT_LIST = ["*/Galleries/*", "Archives"]
|
||||||
# fmt: on
|
# fmt: on
|
||||||
|
|
||||||
pbardict: dict[str, tqdm] = {}
|
|
||||||
|
|
||||||
args = parse_arguments(VERSION)
|
args = parse_arguments(VERSION)
|
||||||
|
|
||||||
lock_file = os.path.join(args.root_directory, ".lock")
|
lock_file = os.path.join(args.root_directory, ".lock")
|
||||||
@@ -45,7 +44,7 @@ if os.path.exists(lock_file):
|
|||||||
else:
|
else:
|
||||||
from modules.logger import logger
|
from modules.logger import logger
|
||||||
from modules.svg_handling import icons, webmanifest, extract_colorscheme
|
from modules.svg_handling import icons, webmanifest, extract_colorscheme
|
||||||
from modules.generate_html import list_folder, EXCLUDES
|
from modules.generate_html import list_folder
|
||||||
|
|
||||||
|
|
||||||
def init_globals(_args: Args, raw: list[str]) -> tuple[Args, list[str]]:
|
def init_globals(_args: Args, raw: list[str]) -> tuple[Args, list[str]]:
|
||||||
@@ -125,6 +124,10 @@ def copy_static_files(_args: Args) -> None:
|
|||||||
with open(os.path.join(static_dir, "theme.css"), "x", encoding="utf-8") as f:
|
with open(os.path.join(static_dir, "theme.css"), "x", encoding="utf-8") as f:
|
||||||
logger.info("writing theme file")
|
logger.info("writing theme file")
|
||||||
f.write(themehead + '\n.foldericon {\n content: url("data:image/svg+xml,' + svg + '");\n}\n' + themetail)
|
f.write(themehead + '\n.foldericon {\n content: url("data:image/svg+xml,' + svg + '");\n}\n' + themetail)
|
||||||
|
logger.info("minifying javascript")
|
||||||
|
with open(os.path.join(SCRIPTDIR, "templates", "functionality.js"), "r", encoding="utf-8") as js_file:
|
||||||
|
with open(os.path.join(static_dir, "functionality.min.js"), "w+", encoding="utf-8") as min_file:
|
||||||
|
min_file.write(jsmin(js_file.read()))
|
||||||
|
|
||||||
|
|
||||||
def generate_thumbnail(arguments: tuple[str, str, str]) -> None:
|
def generate_thumbnail(arguments: tuple[str, str, str]) -> None:
|
||||||
@@ -171,7 +174,7 @@ def main(args) -> None:
|
|||||||
|
|
||||||
try:
|
try:
|
||||||
Path(lock_file).touch()
|
Path(lock_file).touch()
|
||||||
logger.info("starting builder", extra={"version": VERSION})
|
logger.info("starting builder", extra={"version": VERSION, "arguments": args})
|
||||||
|
|
||||||
logger.info("getting logo from sorogon.eu")
|
logger.info("getting logo from sorogon.eu")
|
||||||
req = urllib.request.Request("https://files.sorogon.eu/logo.svg")
|
req = urllib.request.Request("https://files.sorogon.eu/logo.svg")
|
||||||
|
|||||||
109
files/global.css
@@ -66,6 +66,13 @@ body {
|
|||||||
padding: 0 2px;
|
padding: 0 2px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.centerload {
|
||||||
|
margin-top: 100px;
|
||||||
|
display: flex;
|
||||||
|
justify-content: center;
|
||||||
|
align-items: center;
|
||||||
|
}
|
||||||
|
|
||||||
figure {
|
figure {
|
||||||
margin: 0;
|
margin: 0;
|
||||||
}
|
}
|
||||||
@@ -131,14 +138,18 @@ figure {
|
|||||||
text-decoration: none;
|
text-decoration: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
.navbar .title {
|
.navbar .navleft {
|
||||||
|
float: left;
|
||||||
|
}
|
||||||
|
|
||||||
|
.navbar .navcenter {
|
||||||
position: absolute;
|
position: absolute;
|
||||||
left: 50%;
|
left: 50%;
|
||||||
transform: translateX(-50%);
|
transform: translateX(-50%);
|
||||||
}
|
}
|
||||||
|
|
||||||
.navbar .license {
|
.navbar .navright {
|
||||||
float: right;
|
float: right
|
||||||
}
|
}
|
||||||
|
|
||||||
.navbar li .header {
|
.navbar li .header {
|
||||||
@@ -150,28 +161,110 @@ figure {
|
|||||||
|
|
||||||
.tooltip {
|
.tooltip {
|
||||||
position: relative;
|
position: relative;
|
||||||
|
cursor: pointer;
|
||||||
}
|
}
|
||||||
|
|
||||||
.tooltip .tooltiptext {
|
.tooltip a {
|
||||||
display: none;
|
cursor: pointer;
|
||||||
width: max-content;
|
}
|
||||||
|
|
||||||
|
.tagtoggle {
|
||||||
|
cursor: pointer;
|
||||||
|
float: right;
|
||||||
|
padding: 12px;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
.tagflex {
|
||||||
|
display: flex;
|
||||||
|
}
|
||||||
|
|
||||||
|
.tag {
|
||||||
|
flex: 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
input {
|
||||||
|
pointer-events: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.tooltiptext {
|
||||||
|
cursor: default;
|
||||||
position: absolute;
|
position: absolute;
|
||||||
z-index: 100;
|
z-index: 100;
|
||||||
opacity: 0;
|
opacity: 0;
|
||||||
transition: opacity 0.3s;
|
transition: opacity 0.3s;
|
||||||
|
float: left;
|
||||||
|
max-height: 286px;
|
||||||
|
overflow: scroll;
|
||||||
|
}
|
||||||
|
|
||||||
|
.tooltip .infotext {
|
||||||
padding: 12px;
|
padding: 12px;
|
||||||
|
width: max-content;
|
||||||
}
|
}
|
||||||
|
|
||||||
.tooltip:hover .tooltiptext {
|
.tooltiptext.tagdropdown {
|
||||||
|
width: max-content;
|
||||||
|
right: 0;
|
||||||
|
padding: 0;
|
||||||
|
margin: 0;
|
||||||
|
overflow: hidden;
|
||||||
|
transition: max-height 0.3s ease, opacity 0.3s ease;
|
||||||
|
max-height: 0;
|
||||||
|
opacity: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.tooltiptext.tagdropdown.show {
|
||||||
|
max-height: 80vh;
|
||||||
|
overflow-y: scroll;
|
||||||
|
opacity: 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
.tooltip:hover .infotext {
|
||||||
display: block;
|
display: block;
|
||||||
opacity: 1;
|
opacity: 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
.tooltip:active .tooltiptext {
|
.tooltip:active .infotext {
|
||||||
display: block;
|
display: block;
|
||||||
opacity: 1;
|
opacity: 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.tagentryparent {
|
||||||
|
width: 100%;
|
||||||
|
overflow: hidden;
|
||||||
|
transition: max-height 0.3s ease, opacity 0.3s ease;
|
||||||
|
max-height: 0;
|
||||||
|
opacity: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.tagentryparent.show {
|
||||||
|
max-height: 80vh;
|
||||||
|
opacity: 1;
|
||||||
|
overflow-y: scroll;
|
||||||
|
}
|
||||||
|
|
||||||
|
.tagentry {
|
||||||
|
list-style: none;
|
||||||
|
width: 100%;
|
||||||
|
cursor: pointer;
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
display: block;
|
||||||
|
}
|
||||||
|
|
||||||
|
.tooltip .tooltiptext ol {
|
||||||
|
margin-left: 0;
|
||||||
|
padding-left: 0.5em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.tooltip .tooltiptext .tagentry label {
|
||||||
|
cursor: pointer;
|
||||||
|
height: 100%;
|
||||||
|
padding: 12px;
|
||||||
|
display: block;
|
||||||
|
}
|
||||||
|
|
||||||
.column {
|
.column {
|
||||||
-ms-flex: 12.5%;
|
-ms-flex: 12.5%;
|
||||||
flex: 12.5%;
|
flex: 12.5%;
|
||||||
|
|||||||
@@ -35,8 +35,7 @@
|
|||||||
transition: opacity 0.2s;
|
transition: opacity 0.2s;
|
||||||
-webkit-box-shadow: none;
|
-webkit-box-shadow: none;
|
||||||
box-shadow: none; }
|
box-shadow: none; }
|
||||||
.pswp__button:focus,
|
.pswp__button:focus, .pswp__button:hover {
|
||||||
.pswp__button:hover {
|
|
||||||
opacity: 1; }
|
opacity: 1; }
|
||||||
.pswp__button:active {
|
.pswp__button:active {
|
||||||
outline: none;
|
outline: none;
|
||||||
@@ -272,14 +271,13 @@ a.pswp__share--download:hover {
|
|||||||
color: #BBB; }
|
color: #BBB; }
|
||||||
|
|
||||||
.pswp__caption__center {
|
.pswp__caption__center {
|
||||||
text-align: center;
|
text-align: left;
|
||||||
max-width: 420px;
|
max-width: 420px;
|
||||||
margin: 0 auto;
|
margin: 0 auto;
|
||||||
font-size: 13px;
|
font-size: 13px;
|
||||||
padding: 10px;
|
padding: 10px;
|
||||||
line-height: 20px;
|
line-height: 20px;
|
||||||
color: #CCC;
|
color: #CCC; }
|
||||||
font-weight: bold; }
|
|
||||||
|
|
||||||
.pswp__caption--empty {
|
.pswp__caption--empty {
|
||||||
display: none; }
|
display: none; }
|
||||||
|
|||||||
@@ -1,131 +1 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
<svg width="264" height="88" viewBox="0 0 264 88" xmlns="http://www.w3.org/2000/svg"><title>default-skin 2</title><g fill="none" fill-rule="evenodd"><g><path d="M67.002 59.5v3.768c-6.307.84-9.184 5.75-10.002 9.732 2.22-2.83 5.564-5.098 10.002-5.098V71.5L73 65.585 67.002 59.5z" id="Shape" fill="#fff"/><g fill="#fff"><path d="M13 29v-5h2v3h3v2h-5zM13 15h5v2h-3v3h-2v-5zM31 15v5h-2v-3h-3v-2h5zM31 29h-5v-2h3v-3h2v5z" id="Shape"/></g><g fill="#fff"><path d="M62 24v5h-2v-3h-3v-2h5zM62 20h-5v-2h3v-3h2v5zM70 20v-5h2v3h3v2h-5zM70 24h5v2h-3v3h-2v-5z"/></g><path d="M20.586 66l-5.656-5.656 1.414-1.414L22 64.586l5.656-5.656 1.414 1.414L23.414 66l5.656 5.656-1.414 1.414L22 67.414l-5.656 5.656-1.414-1.414L20.586 66z" fill="#fff"/><path d="M111.785 65.03L110 63.5l3-3.5h-10v-2h10l-3-3.5 1.785-1.468L117 59l-5.215 6.03z" fill="#fff"/><path d="M152.215 65.03L154 63.5l-3-3.5h10v-2h-10l3-3.5-1.785-1.468L147 59l5.215 6.03z" fill="#fff"/><g><path id="Rectangle-11" fill="#fff" d="M160.957 28.543l-3.25-3.25-1.413 1.414 3.25 3.25z"/><path d="M152.5 27c3.038 0 5.5-2.462 5.5-5.5s-2.462-5.5-5.5-5.5-5.5 2.462-5.5 5.5 2.462 5.5 5.5 5.5z" id="Oval-1" stroke="#fff" stroke-width="1.5"/><path fill="#fff" d="M150 21h5v1h-5z"/></g><g><path d="M116.957 28.543l-1.414 1.414-3.25-3.25 1.414-1.414 3.25 3.25z" fill="#fff"/><path d="M108.5 27c3.038 0 5.5-2.462 5.5-5.5s-2.462-5.5-5.5-5.5-5.5 2.462-5.5 5.5 2.462 5.5 5.5 5.5z" stroke="#fff" stroke-width="1.5"/><path fill="#fff" d="M106 21h5v1h-5z"/><path fill="#fff" d="M109.043 19.008l-.085 5-1-.017.085-5z"/></g></g></g></svg>
|
||||||
<svg
|
|
||||||
width="264"
|
|
||||||
height="88"
|
|
||||||
viewBox="0 0 264 88"
|
|
||||||
version="1.1"
|
|
||||||
id="svg12"
|
|
||||||
sodipodi:docname="default-skin.svg"
|
|
||||||
inkscape:version="1.3.2 (091e20ef0f, 2023-11-25, custom)"
|
|
||||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
|
||||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
|
||||||
xmlns="http://www.w3.org/2000/svg"
|
|
||||||
xmlns:svg="http://www.w3.org/2000/svg"
|
|
||||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
|
||||||
xmlns:cc="http://creativecommons.org/ns#"
|
|
||||||
xmlns:dc="http://purl.org/dc/elements/1.1/">
|
|
||||||
<defs
|
|
||||||
id="defs12" />
|
|
||||||
<sodipodi:namedview
|
|
||||||
id="namedview12"
|
|
||||||
pagecolor="#ffffff"
|
|
||||||
bordercolor="#000000"
|
|
||||||
borderopacity="0.25"
|
|
||||||
inkscape:showpageshadow="true"
|
|
||||||
inkscape:pageopacity="0.0"
|
|
||||||
inkscape:pagecheckerboard="true"
|
|
||||||
inkscape:deskcolor="#d1d1d1"
|
|
||||||
showborder="true"
|
|
||||||
borderlayer="true"
|
|
||||||
inkscape:zoom="3.0855569"
|
|
||||||
inkscape:cx="95.606729"
|
|
||||||
inkscape:cy="65.142212"
|
|
||||||
inkscape:window-width="1896"
|
|
||||||
inkscape:window-height="1016"
|
|
||||||
inkscape:window-x="1932"
|
|
||||||
inkscape:window-y="52"
|
|
||||||
inkscape:window-maximized="1"
|
|
||||||
inkscape:current-layer="g11" />
|
|
||||||
<title
|
|
||||||
id="title1">default-skin 2</title>
|
|
||||||
<g
|
|
||||||
fill="none"
|
|
||||||
fill-rule="evenodd"
|
|
||||||
id="g12">
|
|
||||||
<g
|
|
||||||
id="g11">
|
|
||||||
<g
|
|
||||||
fill="#fff"
|
|
||||||
id="g1">
|
|
||||||
<path
|
|
||||||
d="M13 29v-5h2v3h3v2h-5zM13 15h5v2h-3v3h-2v-5zM31 15v5h-2v-3h-3v-2h5zM31 29h-5v-2h3v-3h2v5z"
|
|
||||||
id="path1" />
|
|
||||||
</g>
|
|
||||||
<g
|
|
||||||
fill="#fff"
|
|
||||||
id="g2">
|
|
||||||
<path
|
|
||||||
d="M62 24v5h-2v-3h-3v-2h5zM62 20h-5v-2h3v-3h2v5zM70 20v-5h2v3h3v2h-5zM70 24h5v2h-3v3h-2v-5z"
|
|
||||||
id="path2" />
|
|
||||||
</g>
|
|
||||||
<path
|
|
||||||
d="M20.586 66l-5.656-5.656 1.414-1.414L22 64.586l5.656-5.656 1.414 1.414L23.414 66l5.656 5.656-1.414 1.414L22 67.414l-5.656 5.656-1.414-1.414L20.586 66z"
|
|
||||||
fill="#fff"
|
|
||||||
id="path3" />
|
|
||||||
<path
|
|
||||||
d="M111.785 65.03L110 63.5l3-3.5h-10v-2h10l-3-3.5 1.785-1.468L117 59l-5.215 6.03z"
|
|
||||||
fill="#fff"
|
|
||||||
id="path4" />
|
|
||||||
<path
|
|
||||||
d="M152.215 65.03L154 63.5l-3-3.5h10v-2h-10l3-3.5-1.785-1.468L147 59l5.215 6.03z"
|
|
||||||
fill="#fff"
|
|
||||||
id="path5" />
|
|
||||||
<g
|
|
||||||
id="g6">
|
|
||||||
<path
|
|
||||||
id="Rectangle-11"
|
|
||||||
fill="#fff"
|
|
||||||
d="M160.957 28.543l-3.25-3.25-1.413 1.414 3.25 3.25z" />
|
|
||||||
<path
|
|
||||||
d="M152.5 27c3.038 0 5.5-2.462 5.5-5.5s-2.462-5.5-5.5-5.5-5.5 2.462-5.5 5.5 2.462 5.5 5.5 5.5z"
|
|
||||||
id="Oval-1"
|
|
||||||
stroke="#fff"
|
|
||||||
stroke-width="1.5" />
|
|
||||||
<path
|
|
||||||
fill="#fff"
|
|
||||||
d="M150 21h5v1h-5z"
|
|
||||||
id="path6" />
|
|
||||||
</g>
|
|
||||||
<g
|
|
||||||
id="g10">
|
|
||||||
<path
|
|
||||||
d="M116.957 28.543l-1.414 1.414-3.25-3.25 1.414-1.414 3.25 3.25z"
|
|
||||||
fill="#fff"
|
|
||||||
id="path7" />
|
|
||||||
<path
|
|
||||||
d="M108.5 27c3.038 0 5.5-2.462 5.5-5.5s-2.462-5.5-5.5-5.5-5.5 2.462-5.5 5.5 2.462 5.5 5.5 5.5z"
|
|
||||||
stroke="#fff"
|
|
||||||
stroke-width="1.5"
|
|
||||||
id="path8" />
|
|
||||||
<path
|
|
||||||
fill="#fff"
|
|
||||||
d="M106 21h5v1h-5z"
|
|
||||||
id="path9" />
|
|
||||||
<path
|
|
||||||
fill="#fff"
|
|
||||||
d="M109.043 19.008l-.085 5-1-.017.085-5z"
|
|
||||||
id="path10" />
|
|
||||||
</g>
|
|
||||||
<g
|
|
||||||
id="g14">
|
|
||||||
<path
|
|
||||||
id="Shape"
|
|
||||||
style="fill:#ffffff"
|
|
||||||
d="M 63.708984 57.572266 L 63.708984 66.917969 L 62.773438 66.917969 L 59.173828 66.917969 L 65.089844 72.916016 L 71.173828 66.917969 L 67.40625 66.917969 L 66.640625 66.917969 L 66.640625 57.572266 L 63.708984 57.572266 z " />
|
|
||||||
<path
|
|
||||||
id="rect13"
|
|
||||||
style="fill:#ffffff;stroke:#ffffff;stroke-width:0.649;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1"
|
|
||||||
d="m 56.24391,72.078606 v 3.51729 h 17.859837 v -3.51729 h -1.210961 v 2.324677 H 57.456705 v -2.324677 z" />
|
|
||||||
</g>
|
|
||||||
</g>
|
|
||||||
</g>
|
|
||||||
<metadata
|
|
||||||
id="metadata12">
|
|
||||||
<rdf:RDF>
|
|
||||||
<cc:Work
|
|
||||||
rdf:about="">
|
|
||||||
<dc:title>default-skin 2</dc:title>
|
|
||||||
</cc:Work>
|
|
||||||
</rdf:RDF>
|
|
||||||
</metadata>
|
|
||||||
</svg>
|
|
||||||
|
Before Width: | Height: | Size: 4.1 KiB After Width: | Height: | Size: 1.5 KiB |
6
files/pswp/photoswipe-ui-default.min.js
vendored
@@ -15,21 +15,14 @@
|
|||||||
touch-action: none;
|
touch-action: none;
|
||||||
z-index: 1500;
|
z-index: 1500;
|
||||||
-webkit-text-size-adjust: 100%;
|
-webkit-text-size-adjust: 100%;
|
||||||
text-size-adjust: 100%;
|
|
||||||
/* create separate layer, to avoid paint on window.onscroll in webkit/blink */
|
/* create separate layer, to avoid paint on window.onscroll in webkit/blink */
|
||||||
-webkit-backface-visibility: hidden;
|
-webkit-backface-visibility: hidden;
|
||||||
backface-visibility: hidden;
|
outline: none; }
|
||||||
outline: none;
|
.pswp * {
|
||||||
}
|
|
||||||
|
|
||||||
.pswp * {
|
|
||||||
-webkit-box-sizing: border-box;
|
-webkit-box-sizing: border-box;
|
||||||
box-sizing: border-box;
|
box-sizing: border-box; }
|
||||||
}
|
.pswp img {
|
||||||
|
max-width: none; }
|
||||||
.pswp img {
|
|
||||||
max-width: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* style is added when JS option showHideOpacity is set to true */
|
/* style is added when JS option showHideOpacity is set to true */
|
||||||
.pswp--animate_opacity {
|
.pswp--animate_opacity {
|
||||||
@@ -38,33 +31,28 @@
|
|||||||
will-change: opacity;
|
will-change: opacity;
|
||||||
/* for open/close transition */
|
/* for open/close transition */
|
||||||
-webkit-transition: opacity 333ms cubic-bezier(0.4, 0, 0.22, 1);
|
-webkit-transition: opacity 333ms cubic-bezier(0.4, 0, 0.22, 1);
|
||||||
transition: opacity 333ms cubic-bezier(0.4, 0, 0.22, 1);
|
transition: opacity 333ms cubic-bezier(0.4, 0, 0.22, 1); }
|
||||||
}
|
|
||||||
|
|
||||||
.pswp--open {
|
.pswp--open {
|
||||||
display: block;
|
display: block; }
|
||||||
}
|
|
||||||
|
|
||||||
.pswp--zoom-allowed .pswp__img {
|
.pswp--zoom-allowed .pswp__img {
|
||||||
/* autoprefixer: off */
|
/* autoprefixer: off */
|
||||||
cursor: -webkit-zoom-in;
|
cursor: -webkit-zoom-in;
|
||||||
cursor: -moz-zoom-in;
|
cursor: -moz-zoom-in;
|
||||||
cursor: zoom-in;
|
cursor: zoom-in; }
|
||||||
}
|
|
||||||
|
|
||||||
.pswp--zoomed-in .pswp__img {
|
.pswp--zoomed-in .pswp__img {
|
||||||
/* autoprefixer: off */
|
/* autoprefixer: off */
|
||||||
cursor: -webkit-grab;
|
cursor: -webkit-grab;
|
||||||
cursor: -moz-grab;
|
cursor: -moz-grab;
|
||||||
cursor: grab;
|
cursor: grab; }
|
||||||
}
|
|
||||||
|
|
||||||
.pswp--dragging .pswp__img {
|
.pswp--dragging .pswp__img {
|
||||||
/* autoprefixer: off */
|
/* autoprefixer: off */
|
||||||
cursor: -webkit-grabbing;
|
cursor: -webkit-grabbing;
|
||||||
cursor: -moz-grabbing;
|
cursor: -moz-grabbing;
|
||||||
cursor: grabbing;
|
cursor: grabbing; }
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Background is added as a separate element.
|
Background is added as a separate element.
|
||||||
@@ -78,10 +66,10 @@
|
|||||||
height: 100%;
|
height: 100%;
|
||||||
background: #000;
|
background: #000;
|
||||||
opacity: 0;
|
opacity: 0;
|
||||||
|
-webkit-transform: translateZ(0);
|
||||||
|
transform: translateZ(0);
|
||||||
-webkit-backface-visibility: hidden;
|
-webkit-backface-visibility: hidden;
|
||||||
backface-visibility: hidden;
|
will-change: opacity; }
|
||||||
will-change: opacity;
|
|
||||||
}
|
|
||||||
|
|
||||||
.pswp__scroll-wrap {
|
.pswp__scroll-wrap {
|
||||||
position: absolute;
|
position: absolute;
|
||||||
@@ -89,8 +77,7 @@
|
|||||||
top: 0;
|
top: 0;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
height: 100%;
|
height: 100%;
|
||||||
overflow: hidden;
|
overflow: hidden; }
|
||||||
}
|
|
||||||
|
|
||||||
.pswp__container,
|
.pswp__container,
|
||||||
.pswp__zoom-wrap {
|
.pswp__zoom-wrap {
|
||||||
@@ -100,8 +87,7 @@
|
|||||||
left: 0;
|
left: 0;
|
||||||
right: 0;
|
right: 0;
|
||||||
top: 0;
|
top: 0;
|
||||||
bottom: 0;
|
bottom: 0; }
|
||||||
}
|
|
||||||
|
|
||||||
/* Prevent selection and tap highlights */
|
/* Prevent selection and tap highlights */
|
||||||
.pswp__container,
|
.pswp__container,
|
||||||
@@ -111,8 +97,7 @@
|
|||||||
-ms-user-select: none;
|
-ms-user-select: none;
|
||||||
user-select: none;
|
user-select: none;
|
||||||
-webkit-tap-highlight-color: transparent;
|
-webkit-tap-highlight-color: transparent;
|
||||||
-webkit-touch-callout: none;
|
-webkit-touch-callout: none; }
|
||||||
}
|
|
||||||
|
|
||||||
.pswp__zoom-wrap {
|
.pswp__zoom-wrap {
|
||||||
position: absolute;
|
position: absolute;
|
||||||
@@ -122,27 +107,22 @@
|
|||||||
transform-origin: left top;
|
transform-origin: left top;
|
||||||
/* for open/close transition */
|
/* for open/close transition */
|
||||||
-webkit-transition: -webkit-transform 333ms cubic-bezier(0.4, 0, 0.22, 1);
|
-webkit-transition: -webkit-transform 333ms cubic-bezier(0.4, 0, 0.22, 1);
|
||||||
transition: transform 333ms cubic-bezier(0.4, 0, 0.22, 1);
|
transition: transform 333ms cubic-bezier(0.4, 0, 0.22, 1); }
|
||||||
}
|
|
||||||
|
|
||||||
.pswp__bg {
|
.pswp__bg {
|
||||||
will-change: opacity;
|
will-change: opacity;
|
||||||
/* for open/close transition */
|
/* for open/close transition */
|
||||||
-webkit-transition: opacity 333ms cubic-bezier(0.4, 0, 0.22, 1);
|
-webkit-transition: opacity 333ms cubic-bezier(0.4, 0, 0.22, 1);
|
||||||
transition: opacity 333ms cubic-bezier(0.4, 0, 0.22, 1);
|
transition: opacity 333ms cubic-bezier(0.4, 0, 0.22, 1); }
|
||||||
}
|
|
||||||
|
|
||||||
.pswp--animated-in .pswp__bg,
|
.pswp--animated-in .pswp__bg,
|
||||||
.pswp--animated-in .pswp__zoom-wrap {
|
.pswp--animated-in .pswp__zoom-wrap {
|
||||||
-webkit-transition: none;
|
-webkit-transition: none;
|
||||||
transition: none;
|
transition: none; }
|
||||||
}
|
|
||||||
|
|
||||||
.pswp__container,
|
.pswp__container,
|
||||||
.pswp__zoom-wrap {
|
.pswp__zoom-wrap {
|
||||||
-webkit-backface-visibility: hidden;
|
-webkit-backface-visibility: hidden; }
|
||||||
backface-visibility: hidden;
|
|
||||||
}
|
|
||||||
|
|
||||||
.pswp__item {
|
.pswp__item {
|
||||||
position: absolute;
|
position: absolute;
|
||||||
@@ -150,40 +130,34 @@
|
|||||||
right: 0;
|
right: 0;
|
||||||
top: 0;
|
top: 0;
|
||||||
bottom: 0;
|
bottom: 0;
|
||||||
overflow: hidden;
|
overflow: hidden; }
|
||||||
}
|
|
||||||
|
|
||||||
.pswp__img {
|
.pswp__img {
|
||||||
position: absolute;
|
position: absolute;
|
||||||
width: auto;
|
width: auto;
|
||||||
height: auto;
|
height: auto;
|
||||||
top: 0;
|
top: 0;
|
||||||
left: 0;
|
left: 0; }
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
stretched thumbnail or div placeholder element (see below)
|
stretched thumbnail or div placeholder element (see below)
|
||||||
style is added to avoid flickering in webkit/blink when layers overlap
|
style is added to avoid flickering in webkit/blink when layers overlap
|
||||||
*/
|
*/
|
||||||
.pswp__img--placeholder {
|
.pswp__img--placeholder {
|
||||||
-webkit-backface-visibility: hidden;
|
-webkit-backface-visibility: hidden; }
|
||||||
backface-visibility: hidden;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
div element that matches size of large image
|
div element that matches size of large image
|
||||||
large image loads on top of it
|
large image loads on top of it
|
||||||
*/
|
*/
|
||||||
.pswp__img--placeholder--blank {
|
.pswp__img--placeholder--blank {
|
||||||
background: #222;
|
background: #222; }
|
||||||
}
|
|
||||||
|
|
||||||
.pswp--ie .pswp__img {
|
.pswp--ie .pswp__img {
|
||||||
width: 100% !important;
|
width: 100% !important;
|
||||||
height: auto !important;
|
height: auto !important;
|
||||||
left: 0;
|
left: 0;
|
||||||
top: 0;
|
top: 0; }
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Error message appears when image is not loaded
|
Error message appears when image is not loaded
|
||||||
@@ -198,10 +172,8 @@
|
|||||||
font-size: 14px;
|
font-size: 14px;
|
||||||
line-height: 16px;
|
line-height: 16px;
|
||||||
margin-top: -8px;
|
margin-top: -8px;
|
||||||
color: #CCC;
|
color: #CCC; }
|
||||||
}
|
|
||||||
|
|
||||||
.pswp__error-msg a {
|
.pswp__error-msg a {
|
||||||
color: #CCC;
|
color: #CCC;
|
||||||
text-decoration: underline;
|
text-decoration: underline; }
|
||||||
}
|
|
||||||
3788
files/pswp/photoswipe.js
Normal file
9
files/pswp/photoswipe.min.js
vendored
@@ -1,7 +1,6 @@
|
|||||||
import os
|
import os
|
||||||
import re
|
import re
|
||||||
import sys
|
import sys
|
||||||
import time
|
|
||||||
import shutil
|
import shutil
|
||||||
import base64
|
import base64
|
||||||
import fileinput
|
import fileinput
|
||||||
|
|||||||
168
help.svg
@@ -1,4 +1,4 @@
|
|||||||
<svg class="rich-terminal" viewBox="0 0 1482 855.1999999999999" xmlns="http://www.w3.org/2000/svg">
|
<svg class="rich-terminal" viewBox="0 0 1482 928.4" xmlns="http://www.w3.org/2000/svg">
|
||||||
<!-- Generated with Rich https://www.textualize.io -->
|
<!-- Generated with Rich https://www.textualize.io -->
|
||||||
<style>
|
<style>
|
||||||
|
|
||||||
@@ -19,171 +19,183 @@
|
|||||||
font-weight: 700;
|
font-weight: 700;
|
||||||
}
|
}
|
||||||
|
|
||||||
.terminal-1308707172-matrix {
|
.terminal-3378394567-matrix {
|
||||||
font-family: Fira Code, monospace;
|
font-family: Fira Code, monospace;
|
||||||
font-size: 20px;
|
font-size: 20px;
|
||||||
line-height: 24.4px;
|
line-height: 24.4px;
|
||||||
font-variant-east-asian: full-width;
|
font-variant-east-asian: full-width;
|
||||||
}
|
}
|
||||||
|
|
||||||
.terminal-1308707172-title {
|
.terminal-3378394567-title {
|
||||||
font-size: 18px;
|
font-size: 18px;
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
font-family: arial;
|
font-family: arial;
|
||||||
}
|
}
|
||||||
|
|
||||||
.terminal-1308707172-r1 { fill: #ff8700 }
|
.terminal-3378394567-r1 { fill: #ff8700 }
|
||||||
.terminal-1308707172-r2 { fill: #c5c8c6 }
|
.terminal-3378394567-r2 { fill: #c5c8c6 }
|
||||||
.terminal-1308707172-r3 { fill: #808080 }
|
.terminal-3378394567-r3 { fill: #808080 }
|
||||||
.terminal-1308707172-r4 { fill: #68a0b3 }
|
.terminal-3378394567-r4 { fill: #68a0b3 }
|
||||||
.terminal-1308707172-r5 { fill: #00af87 }
|
.terminal-3378394567-r5 { fill: #00af87 }
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
<defs>
|
<defs>
|
||||||
<clipPath id="terminal-1308707172-clip-terminal">
|
<clipPath id="terminal-3378394567-clip-terminal">
|
||||||
<rect x="0" y="0" width="1463.0" height="804.1999999999999" />
|
<rect x="0" y="0" width="1463.0" height="877.4" />
|
||||||
</clipPath>
|
</clipPath>
|
||||||
<clipPath id="terminal-1308707172-line-0">
|
<clipPath id="terminal-3378394567-line-0">
|
||||||
<rect x="0" y="1.5" width="1464" height="24.65"/>
|
<rect x="0" y="1.5" width="1464" height="24.65"/>
|
||||||
</clipPath>
|
</clipPath>
|
||||||
<clipPath id="terminal-1308707172-line-1">
|
<clipPath id="terminal-3378394567-line-1">
|
||||||
<rect x="0" y="25.9" width="1464" height="24.65"/>
|
<rect x="0" y="25.9" width="1464" height="24.65"/>
|
||||||
</clipPath>
|
</clipPath>
|
||||||
<clipPath id="terminal-1308707172-line-2">
|
<clipPath id="terminal-3378394567-line-2">
|
||||||
<rect x="0" y="50.3" width="1464" height="24.65"/>
|
<rect x="0" y="50.3" width="1464" height="24.65"/>
|
||||||
</clipPath>
|
</clipPath>
|
||||||
<clipPath id="terminal-1308707172-line-3">
|
<clipPath id="terminal-3378394567-line-3">
|
||||||
<rect x="0" y="74.7" width="1464" height="24.65"/>
|
<rect x="0" y="74.7" width="1464" height="24.65"/>
|
||||||
</clipPath>
|
</clipPath>
|
||||||
<clipPath id="terminal-1308707172-line-4">
|
<clipPath id="terminal-3378394567-line-4">
|
||||||
<rect x="0" y="99.1" width="1464" height="24.65"/>
|
<rect x="0" y="99.1" width="1464" height="24.65"/>
|
||||||
</clipPath>
|
</clipPath>
|
||||||
<clipPath id="terminal-1308707172-line-5">
|
<clipPath id="terminal-3378394567-line-5">
|
||||||
<rect x="0" y="123.5" width="1464" height="24.65"/>
|
<rect x="0" y="123.5" width="1464" height="24.65"/>
|
||||||
</clipPath>
|
</clipPath>
|
||||||
<clipPath id="terminal-1308707172-line-6">
|
<clipPath id="terminal-3378394567-line-6">
|
||||||
<rect x="0" y="147.9" width="1464" height="24.65"/>
|
<rect x="0" y="147.9" width="1464" height="24.65"/>
|
||||||
</clipPath>
|
</clipPath>
|
||||||
<clipPath id="terminal-1308707172-line-7">
|
<clipPath id="terminal-3378394567-line-7">
|
||||||
<rect x="0" y="172.3" width="1464" height="24.65"/>
|
<rect x="0" y="172.3" width="1464" height="24.65"/>
|
||||||
</clipPath>
|
</clipPath>
|
||||||
<clipPath id="terminal-1308707172-line-8">
|
<clipPath id="terminal-3378394567-line-8">
|
||||||
<rect x="0" y="196.7" width="1464" height="24.65"/>
|
<rect x="0" y="196.7" width="1464" height="24.65"/>
|
||||||
</clipPath>
|
</clipPath>
|
||||||
<clipPath id="terminal-1308707172-line-9">
|
<clipPath id="terminal-3378394567-line-9">
|
||||||
<rect x="0" y="221.1" width="1464" height="24.65"/>
|
<rect x="0" y="221.1" width="1464" height="24.65"/>
|
||||||
</clipPath>
|
</clipPath>
|
||||||
<clipPath id="terminal-1308707172-line-10">
|
<clipPath id="terminal-3378394567-line-10">
|
||||||
<rect x="0" y="245.5" width="1464" height="24.65"/>
|
<rect x="0" y="245.5" width="1464" height="24.65"/>
|
||||||
</clipPath>
|
</clipPath>
|
||||||
<clipPath id="terminal-1308707172-line-11">
|
<clipPath id="terminal-3378394567-line-11">
|
||||||
<rect x="0" y="269.9" width="1464" height="24.65"/>
|
<rect x="0" y="269.9" width="1464" height="24.65"/>
|
||||||
</clipPath>
|
</clipPath>
|
||||||
<clipPath id="terminal-1308707172-line-12">
|
<clipPath id="terminal-3378394567-line-12">
|
||||||
<rect x="0" y="294.3" width="1464" height="24.65"/>
|
<rect x="0" y="294.3" width="1464" height="24.65"/>
|
||||||
</clipPath>
|
</clipPath>
|
||||||
<clipPath id="terminal-1308707172-line-13">
|
<clipPath id="terminal-3378394567-line-13">
|
||||||
<rect x="0" y="318.7" width="1464" height="24.65"/>
|
<rect x="0" y="318.7" width="1464" height="24.65"/>
|
||||||
</clipPath>
|
</clipPath>
|
||||||
<clipPath id="terminal-1308707172-line-14">
|
<clipPath id="terminal-3378394567-line-14">
|
||||||
<rect x="0" y="343.1" width="1464" height="24.65"/>
|
<rect x="0" y="343.1" width="1464" height="24.65"/>
|
||||||
</clipPath>
|
</clipPath>
|
||||||
<clipPath id="terminal-1308707172-line-15">
|
<clipPath id="terminal-3378394567-line-15">
|
||||||
<rect x="0" y="367.5" width="1464" height="24.65"/>
|
<rect x="0" y="367.5" width="1464" height="24.65"/>
|
||||||
</clipPath>
|
</clipPath>
|
||||||
<clipPath id="terminal-1308707172-line-16">
|
<clipPath id="terminal-3378394567-line-16">
|
||||||
<rect x="0" y="391.9" width="1464" height="24.65"/>
|
<rect x="0" y="391.9" width="1464" height="24.65"/>
|
||||||
</clipPath>
|
</clipPath>
|
||||||
<clipPath id="terminal-1308707172-line-17">
|
<clipPath id="terminal-3378394567-line-17">
|
||||||
<rect x="0" y="416.3" width="1464" height="24.65"/>
|
<rect x="0" y="416.3" width="1464" height="24.65"/>
|
||||||
</clipPath>
|
</clipPath>
|
||||||
<clipPath id="terminal-1308707172-line-18">
|
<clipPath id="terminal-3378394567-line-18">
|
||||||
<rect x="0" y="440.7" width="1464" height="24.65"/>
|
<rect x="0" y="440.7" width="1464" height="24.65"/>
|
||||||
</clipPath>
|
</clipPath>
|
||||||
<clipPath id="terminal-1308707172-line-19">
|
<clipPath id="terminal-3378394567-line-19">
|
||||||
<rect x="0" y="465.1" width="1464" height="24.65"/>
|
<rect x="0" y="465.1" width="1464" height="24.65"/>
|
||||||
</clipPath>
|
</clipPath>
|
||||||
<clipPath id="terminal-1308707172-line-20">
|
<clipPath id="terminal-3378394567-line-20">
|
||||||
<rect x="0" y="489.5" width="1464" height="24.65"/>
|
<rect x="0" y="489.5" width="1464" height="24.65"/>
|
||||||
</clipPath>
|
</clipPath>
|
||||||
<clipPath id="terminal-1308707172-line-21">
|
<clipPath id="terminal-3378394567-line-21">
|
||||||
<rect x="0" y="513.9" width="1464" height="24.65"/>
|
<rect x="0" y="513.9" width="1464" height="24.65"/>
|
||||||
</clipPath>
|
</clipPath>
|
||||||
<clipPath id="terminal-1308707172-line-22">
|
<clipPath id="terminal-3378394567-line-22">
|
||||||
<rect x="0" y="538.3" width="1464" height="24.65"/>
|
<rect x="0" y="538.3" width="1464" height="24.65"/>
|
||||||
</clipPath>
|
</clipPath>
|
||||||
<clipPath id="terminal-1308707172-line-23">
|
<clipPath id="terminal-3378394567-line-23">
|
||||||
<rect x="0" y="562.7" width="1464" height="24.65"/>
|
<rect x="0" y="562.7" width="1464" height="24.65"/>
|
||||||
</clipPath>
|
</clipPath>
|
||||||
<clipPath id="terminal-1308707172-line-24">
|
<clipPath id="terminal-3378394567-line-24">
|
||||||
<rect x="0" y="587.1" width="1464" height="24.65"/>
|
<rect x="0" y="587.1" width="1464" height="24.65"/>
|
||||||
</clipPath>
|
</clipPath>
|
||||||
<clipPath id="terminal-1308707172-line-25">
|
<clipPath id="terminal-3378394567-line-25">
|
||||||
<rect x="0" y="611.5" width="1464" height="24.65"/>
|
<rect x="0" y="611.5" width="1464" height="24.65"/>
|
||||||
</clipPath>
|
</clipPath>
|
||||||
<clipPath id="terminal-1308707172-line-26">
|
<clipPath id="terminal-3378394567-line-26">
|
||||||
<rect x="0" y="635.9" width="1464" height="24.65"/>
|
<rect x="0" y="635.9" width="1464" height="24.65"/>
|
||||||
</clipPath>
|
</clipPath>
|
||||||
<clipPath id="terminal-1308707172-line-27">
|
<clipPath id="terminal-3378394567-line-27">
|
||||||
<rect x="0" y="660.3" width="1464" height="24.65"/>
|
<rect x="0" y="660.3" width="1464" height="24.65"/>
|
||||||
</clipPath>
|
</clipPath>
|
||||||
<clipPath id="terminal-1308707172-line-28">
|
<clipPath id="terminal-3378394567-line-28">
|
||||||
<rect x="0" y="684.7" width="1464" height="24.65"/>
|
<rect x="0" y="684.7" width="1464" height="24.65"/>
|
||||||
</clipPath>
|
</clipPath>
|
||||||
<clipPath id="terminal-1308707172-line-29">
|
<clipPath id="terminal-3378394567-line-29">
|
||||||
<rect x="0" y="709.1" width="1464" height="24.65"/>
|
<rect x="0" y="709.1" width="1464" height="24.65"/>
|
||||||
</clipPath>
|
</clipPath>
|
||||||
<clipPath id="terminal-1308707172-line-30">
|
<clipPath id="terminal-3378394567-line-30">
|
||||||
<rect x="0" y="733.5" width="1464" height="24.65"/>
|
<rect x="0" y="733.5" width="1464" height="24.65"/>
|
||||||
</clipPath>
|
</clipPath>
|
||||||
<clipPath id="terminal-1308707172-line-31">
|
<clipPath id="terminal-3378394567-line-31">
|
||||||
<rect x="0" y="757.9" width="1464" height="24.65"/>
|
<rect x="0" y="757.9" width="1464" height="24.65"/>
|
||||||
</clipPath>
|
</clipPath>
|
||||||
|
<clipPath id="terminal-3378394567-line-32">
|
||||||
|
<rect x="0" y="782.3" width="1464" height="24.65"/>
|
||||||
|
</clipPath>
|
||||||
|
<clipPath id="terminal-3378394567-line-33">
|
||||||
|
<rect x="0" y="806.7" width="1464" height="24.65"/>
|
||||||
|
</clipPath>
|
||||||
|
<clipPath id="terminal-3378394567-line-34">
|
||||||
|
<rect x="0" y="831.1" width="1464" height="24.65"/>
|
||||||
|
</clipPath>
|
||||||
</defs>
|
</defs>
|
||||||
|
|
||||||
<rect fill="#292929" stroke="rgba(255,255,255,0.35)" stroke-width="1" x="1" y="1" width="1480" height="853.2" rx="8"/>
|
<rect fill="#292929" stroke="rgba(255,255,255,0.35)" stroke-width="1" x="1" y="1" width="1480" height="926.4" rx="8"/>
|
||||||
<g transform="translate(26,22)">
|
<g transform="translate(26,22)">
|
||||||
<circle cx="0" cy="0" r="7" fill="#ff5f57"/>
|
<circle cx="0" cy="0" r="7" fill="#ff5f57"/>
|
||||||
<circle cx="22" cy="0" r="7" fill="#febc2e"/>
|
<circle cx="22" cy="0" r="7" fill="#febc2e"/>
|
||||||
<circle cx="44" cy="0" r="7" fill="#28c840"/>
|
<circle cx="44" cy="0" r="7" fill="#28c840"/>
|
||||||
</g>
|
</g>
|
||||||
|
|
||||||
<g transform="translate(9, 41)" clip-path="url(#terminal-1308707172-clip-terminal)">
|
<g transform="translate(9, 41)" clip-path="url(#terminal-3378394567-clip-terminal)">
|
||||||
|
|
||||||
<g class="terminal-1308707172-matrix">
|
<g class="terminal-3378394567-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 class="terminal-3378394567-r1" x="0" y="20" textLength="73.2" clip-path="url(#terminal-3378394567-line-0)">Usage:</text><text class="terminal-3378394567-r3" x="85.4" y="20" textLength="122" clip-path="url(#terminal-3378394567-line-0)">builder.py</text><text class="terminal-3378394567-r2" x="207.4" y="20" textLength="24.4" clip-path="url(#terminal-3378394567-line-0)"> [</text><text class="terminal-3378394567-r4" x="231.8" y="20" textLength="24.4" clip-path="url(#terminal-3378394567-line-0)">-h</text><text class="terminal-3378394567-r2" x="256.2" y="20" textLength="36.6" clip-path="url(#terminal-3378394567-line-0)">] [</text><text class="terminal-3378394567-r4" x="292.8" y="20" textLength="24.4" clip-path="url(#terminal-3378394567-line-0)">-a</text><text class="terminal-3378394567-r5" x="329.4" y="20" textLength="73.2" clip-path="url(#terminal-3378394567-line-0)">AUTHOR</text><text class="terminal-3378394567-r2" x="402.6" y="20" textLength="36.6" clip-path="url(#terminal-3378394567-line-0)">] [</text><text class="terminal-3378394567-r4" x="439.2" y="20" textLength="24.4" clip-path="url(#terminal-3378394567-line-0)">-e</text><text class="terminal-3378394567-r5" x="475.8" y="20" textLength="109.8" clip-path="url(#terminal-3378394567-line-0)">EXTENSION</text><text class="terminal-3378394567-r2" x="585.6" y="20" textLength="36.6" clip-path="url(#terminal-3378394567-line-0)">] [</text><text class="terminal-3378394567-r4" x="622.2" y="20" textLength="24.4" clip-path="url(#terminal-3378394567-line-0)">-l</text><text class="terminal-3378394567-r5" x="658.8" y="20" textLength="85.4" clip-path="url(#terminal-3378394567-line-0)">LICENSE</text><text class="terminal-3378394567-r2" x="744.2" y="20" textLength="36.6" clip-path="url(#terminal-3378394567-line-0)">] [</text><text class="terminal-3378394567-r4" x="780.8" y="20" textLength="24.4" clip-path="url(#terminal-3378394567-line-0)">-m</text><text class="terminal-3378394567-r2" x="805.2" y="20" textLength="36.6" clip-path="url(#terminal-3378394567-line-0)">] [</text><text class="terminal-3378394567-r4" x="841.8" y="20" textLength="24.4" clip-path="url(#terminal-3378394567-line-0)">-n</text><text class="terminal-3378394567-r2" x="866.2" y="20" textLength="24.4" clip-path="url(#terminal-3378394567-line-0)">] </text><text class="terminal-3378394567-r4" x="890.6" y="20" textLength="24.4" clip-path="url(#terminal-3378394567-line-0)">-p</text><text class="terminal-3378394567-r5" x="927.2" y="20" textLength="48.8" clip-path="url(#terminal-3378394567-line-0)">ROOT</text><text class="terminal-3378394567-r4" x="988.2" y="20" textLength="24.4" clip-path="url(#terminal-3378394567-line-0)">-t</text><text class="terminal-3378394567-r5" x="1024.8" y="20" textLength="61" clip-path="url(#terminal-3378394567-line-0)">TITLE</text><text class="terminal-3378394567-r4" x="1098" y="20" textLength="24.4" clip-path="url(#terminal-3378394567-line-0)">-w</text><text class="terminal-3378394567-r5" x="1134.6" y="20" textLength="36.6" clip-path="url(#terminal-3378394567-line-0)">URL</text><text class="terminal-3378394567-r2" x="1464" y="20" textLength="12.2" clip-path="url(#terminal-3378394567-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-3378394567-r2" x="0" y="44.4" textLength="231.8" clip-path="url(#terminal-3378394567-line-1)">                  [</text><text class="terminal-3378394567-r4" x="231.8" y="44.4" textLength="195.2" clip-path="url(#terminal-3378394567-line-1)">--exclude-folder</text><text class="terminal-3378394567-r5" x="439.2" y="44.4" textLength="73.2" clip-path="url(#terminal-3378394567-line-1)">FOLDER</text><text class="terminal-3378394567-r2" x="512.4" y="44.4" textLength="36.6" clip-path="url(#terminal-3378394567-line-1)">] [</text><text class="terminal-3378394567-r4" x="549" y="44.4" textLength="219.6" clip-path="url(#terminal-3378394567-line-1)">--folderthumbnails</text><text class="terminal-3378394567-r2" x="768.6" y="44.4" textLength="36.6" clip-path="url(#terminal-3378394567-line-1)">] [</text><text class="terminal-3378394567-r4" x="805.2" y="44.4" textLength="244" clip-path="url(#terminal-3378394567-line-1)">--ignore-other-files</text><text class="terminal-3378394567-r2" x="1049.2" y="44.4" textLength="36.6" clip-path="url(#terminal-3378394567-line-1)">] [</text><text class="terminal-3378394567-r4" x="1085.8" y="44.4" textLength="280.6" clip-path="url(#terminal-3378394567-line-1)">--regenerate-thumbnails</text><text class="terminal-3378394567-r2" x="1366.4" y="44.4" textLength="12.2" clip-path="url(#terminal-3378394567-line-1)">]</text><text class="terminal-3378394567-r2" x="1464" y="44.4" textLength="12.2" clip-path="url(#terminal-3378394567-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-3378394567-r2" x="0" y="68.8" textLength="231.8" clip-path="url(#terminal-3378394567-line-2)">                  [</text><text class="terminal-3378394567-r4" x="231.8" y="68.8" textLength="207.4" clip-path="url(#terminal-3378394567-line-2)">--reread-metadata</text><text class="terminal-3378394567-r2" x="439.2" y="68.8" textLength="36.6" clip-path="url(#terminal-3378394567-line-2)">] [</text><text class="terminal-3378394567-r4" x="475.8" y="68.8" textLength="195.2" clip-path="url(#terminal-3378394567-line-2)">--reread-sidecar</text><text class="terminal-3378394567-r2" x="671" y="68.8" textLength="36.6" clip-path="url(#terminal-3378394567-line-2)">] [</text><text class="terminal-3378394567-r4" x="707.6" y="68.8" textLength="170.8" clip-path="url(#terminal-3378394567-line-2)">--reverse-sort</text><text class="terminal-3378394567-r2" x="878.4" y="68.8" textLength="36.6" clip-path="url(#terminal-3378394567-line-2)">] [</text><text class="terminal-3378394567-r4" x="915" y="68.8" textLength="146.4" clip-path="url(#terminal-3378394567-line-2)">--theme-path</text><text class="terminal-3378394567-r5" x="1073.6" y="68.8" textLength="48.8" clip-path="url(#terminal-3378394567-line-2)">PATH</text><text class="terminal-3378394567-r2" x="1122.4" y="68.8" textLength="36.6" clip-path="url(#terminal-3378394567-line-2)">] [</text><text class="terminal-3378394567-r4" x="1159" y="68.8" textLength="231.8" clip-path="url(#terminal-3378394567-line-2)">--use-fancy-folders</text><text class="terminal-3378394567-r2" x="1390.8" y="68.8" textLength="12.2" clip-path="url(#terminal-3378394567-line-2)">]</text><text class="terminal-3378394567-r2" x="1464" y="68.8" textLength="12.2" clip-path="url(#terminal-3378394567-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-3378394567-r2" x="0" y="93.2" textLength="231.8" clip-path="url(#terminal-3378394567-line-3)">                  [</text><text class="terminal-3378394567-r4" x="231.8" y="93.2" textLength="109.8" clip-path="url(#terminal-3378394567-line-3)">--version</text><text class="terminal-3378394567-r2" x="341.6" y="93.2" textLength="12.2" clip-path="url(#terminal-3378394567-line-3)">]</text><text class="terminal-3378394567-r2" x="1464" y="93.2" textLength="12.2" clip-path="url(#terminal-3378394567-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-3378394567-r2" x="1464" y="117.6" textLength="12.2" clip-path="url(#terminal-3378394567-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-3378394567-r2" x="0" y="142" textLength="658.8" clip-path="url(#terminal-3378394567-line-5)">generate HTML files for a static image hosting website</text><text class="terminal-3378394567-r2" x="1464" y="142" textLength="12.2" clip-path="url(#terminal-3378394567-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-3378394567-r2" x="1464" y="166.4" textLength="12.2" clip-path="url(#terminal-3378394567-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-3378394567-r1" x="0" y="190.8" textLength="97.6" clip-path="url(#terminal-3378394567-line-7)">Options:</text><text class="terminal-3378394567-r2" x="1464" y="190.8" textLength="12.2" clip-path="url(#terminal-3378394567-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-3378394567-r4" x="24.4" y="215.2" textLength="24.4" clip-path="url(#terminal-3378394567-line-8)">-h</text><text class="terminal-3378394567-r2" x="48.8" y="215.2" textLength="24.4" clip-path="url(#terminal-3378394567-line-8)">, </text><text class="terminal-3378394567-r4" x="73.2" y="215.2" textLength="73.2" clip-path="url(#terminal-3378394567-line-8)">--help</text><text class="terminal-3378394567-r2" x="292.8" y="215.2" textLength="378.2" clip-path="url(#terminal-3378394567-line-8)">show this help message and exit</text><text class="terminal-3378394567-r2" x="1464" y="215.2" textLength="12.2" clip-path="url(#terminal-3378394567-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-3378394567-r4" x="24.4" y="239.6" textLength="24.4" clip-path="url(#terminal-3378394567-line-9)">-a</text><text class="terminal-3378394567-r2" x="48.8" y="239.6" textLength="24.4" clip-path="url(#terminal-3378394567-line-9)">, </text><text class="terminal-3378394567-r4" x="73.2" y="239.6" textLength="158.6" clip-path="url(#terminal-3378394567-line-9)">--author-name</text><text class="terminal-3378394567-r5" x="244" y="239.6" textLength="73.2" clip-path="url(#terminal-3378394567-line-9)">AUTHOR</text><text class="terminal-3378394567-r2" x="1464" y="239.6" textLength="12.2" clip-path="url(#terminal-3378394567-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-3378394567-r2" x="292.8" y="264" textLength="390.4" clip-path="url(#terminal-3378394567-line-10)">name of the author of the images</text><text class="terminal-3378394567-r2" x="1464" y="264" textLength="12.2" clip-path="url(#terminal-3378394567-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-3378394567-r4" x="24.4" y="288.4" textLength="24.4" clip-path="url(#terminal-3378394567-line-11)">-e</text><text class="terminal-3378394567-r2" x="48.8" y="288.4" textLength="24.4" clip-path="url(#terminal-3378394567-line-11)">, </text><text class="terminal-3378394567-r4" x="73.2" y="288.4" textLength="207.4" clip-path="url(#terminal-3378394567-line-11)">--file-extensions</text><text class="terminal-3378394567-r5" x="292.8" y="288.4" textLength="109.8" clip-path="url(#terminal-3378394567-line-11)">EXTENSION</text><text class="terminal-3378394567-r2" x="1464" y="288.4" textLength="12.2" clip-path="url(#terminal-3378394567-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-3378394567-r2" x="292.8" y="312.8" textLength="732" clip-path="url(#terminal-3378394567-line-12)">file extensions to include (can be specified multiple times)</text><text class="terminal-3378394567-r2" x="1464" y="312.8" textLength="12.2" clip-path="url(#terminal-3378394567-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-3378394567-r4" x="24.4" y="337.2" textLength="24.4" clip-path="url(#terminal-3378394567-line-13)">-l</text><text class="terminal-3378394567-r2" x="48.8" y="337.2" textLength="24.4" clip-path="url(#terminal-3378394567-line-13)">, </text><text class="terminal-3378394567-r4" x="73.2" y="337.2" textLength="170.8" clip-path="url(#terminal-3378394567-line-13)">--license-type</text><text class="terminal-3378394567-r5" x="256.2" y="337.2" textLength="85.4" clip-path="url(#terminal-3378394567-line-13)">LICENSE</text><text class="terminal-3378394567-r2" x="1464" y="337.2" textLength="12.2" clip-path="url(#terminal-3378394567-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-3378394567-r2" x="292.8" y="361.6" textLength="475.8" clip-path="url(#terminal-3378394567-line-14)">specify the license type for the images</text><text class="terminal-3378394567-r2" x="1464" y="361.6" textLength="12.2" clip-path="url(#terminal-3378394567-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-3378394567-r4" x="24.4" y="386" textLength="24.4" clip-path="url(#terminal-3378394567-line-15)">-m</text><text class="terminal-3378394567-r2" x="48.8" y="386" textLength="24.4" clip-path="url(#terminal-3378394567-line-15)">, </text><text class="terminal-3378394567-r4" x="73.2" y="386" textLength="170.8" clip-path="url(#terminal-3378394567-line-15)">--web-manifest</text><text class="terminal-3378394567-r2" x="292.8" y="386" textLength="341.6" clip-path="url(#terminal-3378394567-line-15)">generate a web manifest file</text><text class="terminal-3378394567-r2" x="1464" y="386" textLength="12.2" clip-path="url(#terminal-3378394567-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-3378394567-r4" x="24.4" y="410.4" textLength="24.4" clip-path="url(#terminal-3378394567-line-16)">-n</text><text class="terminal-3378394567-r2" x="48.8" y="410.4" textLength="24.4" clip-path="url(#terminal-3378394567-line-16)">, </text><text class="terminal-3378394567-r4" x="73.2" y="410.4" textLength="268.4" clip-path="url(#terminal-3378394567-line-16)">--non-interactive-mode</text><text class="terminal-3378394567-r2" x="1464" y="410.4" textLength="12.2" clip-path="url(#terminal-3378394567-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-3378394567-r2" x="292.8" y="434.8" textLength="634.4" clip-path="url(#terminal-3378394567-line-17)">run in non-interactive mode, disabling progress bars</text><text class="terminal-3378394567-r2" x="1464" y="434.8" textLength="12.2" clip-path="url(#terminal-3378394567-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-3378394567-r4" x="24.4" y="459.2" textLength="24.4" clip-path="url(#terminal-3378394567-line-18)">-p</text><text class="terminal-3378394567-r2" x="48.8" y="459.2" textLength="24.4" clip-path="url(#terminal-3378394567-line-18)">, </text><text class="terminal-3378394567-r4" x="73.2" y="459.2" textLength="195.2" clip-path="url(#terminal-3378394567-line-18)">--root-directory</text><text class="terminal-3378394567-r5" x="280.6" y="459.2" textLength="48.8" clip-path="url(#terminal-3378394567-line-18)">ROOT</text><text class="terminal-3378394567-r2" x="1464" y="459.2" textLength="12.2" clip-path="url(#terminal-3378394567-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-3378394567-r2" x="292.8" y="483.6" textLength="439.2" clip-path="url(#terminal-3378394567-line-19)">root directory containing the images</text><text class="terminal-3378394567-r2" x="1464" y="483.6" textLength="12.2" clip-path="url(#terminal-3378394567-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-3378394567-r4" x="24.4" y="508" textLength="24.4" clip-path="url(#terminal-3378394567-line-20)">-t</text><text class="terminal-3378394567-r2" x="48.8" y="508" textLength="24.4" clip-path="url(#terminal-3378394567-line-20)">, </text><text class="terminal-3378394567-r4" x="73.2" y="508" textLength="146.4" clip-path="url(#terminal-3378394567-line-20)">--site-title</text><text class="terminal-3378394567-r5" x="231.8" y="508" textLength="61" clip-path="url(#terminal-3378394567-line-20)">TITLE</text><text class="terminal-3378394567-r2" x="1464" y="508" textLength="12.2" clip-path="url(#terminal-3378394567-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-3378394567-r2" x="292.8" y="532.4" textLength="378.2" clip-path="url(#terminal-3378394567-line-21)">title of the image hosting site</text><text class="terminal-3378394567-r2" x="1464" y="532.4" textLength="12.2" clip-path="url(#terminal-3378394567-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-3378394567-r4" x="24.4" y="556.8" textLength="24.4" clip-path="url(#terminal-3378394567-line-22)">-w</text><text class="terminal-3378394567-r2" x="48.8" y="556.8" textLength="24.4" clip-path="url(#terminal-3378394567-line-22)">, </text><text class="terminal-3378394567-r4" x="73.2" y="556.8" textLength="170.8" clip-path="url(#terminal-3378394567-line-22)">--web-root-url</text><text class="terminal-3378394567-r5" x="256.2" y="556.8" textLength="36.6" clip-path="url(#terminal-3378394567-line-22)">URL</text><text class="terminal-3378394567-r2" x="1464" y="556.8" textLength="12.2" clip-path="url(#terminal-3378394567-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-3378394567-r2" x="292.8" y="581.2" textLength="622.2" clip-path="url(#terminal-3378394567-line-23)">base URL of the web root for the image hosting site</text><text class="terminal-3378394567-r2" x="1464" y="581.2" textLength="12.2" clip-path="url(#terminal-3378394567-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-3378394567-r4" x="24.4" y="605.6" textLength="195.2" clip-path="url(#terminal-3378394567-line-24)">--exclude-folder</text><text class="terminal-3378394567-r5" x="231.8" y="605.6" textLength="73.2" clip-path="url(#terminal-3378394567-line-24)">FOLDER</text><text class="terminal-3378394567-r2" x="1464" y="605.6" textLength="12.2" clip-path="url(#terminal-3378394567-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-3378394567-r2" x="292.8" y="630" textLength="1037" clip-path="url(#terminal-3378394567-line-25)">folders to exclude from processing, globs supported (can be specified multiple times)</text><text class="terminal-3378394567-r2" x="1464" y="630" textLength="12.2" clip-path="url(#terminal-3378394567-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-3378394567-r4" x="24.4" y="654.4" textLength="219.6" clip-path="url(#terminal-3378394567-line-26)">--folderthumbnails</text><text class="terminal-3378394567-r2" x="292.8" y="654.4" textLength="817.4" clip-path="url(#terminal-3378394567-line-26)">generate subfolder thumbnails (first image in folder will be shown)</text><text class="terminal-3378394567-r2" x="1464" y="654.4" textLength="12.2" clip-path="url(#terminal-3378394567-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-3378394567-r4" x="24.4" y="678.8" textLength="244" clip-path="url(#terminal-3378394567-line-27)">--ignore-other-files</text><text class="terminal-3378394567-r2" x="292.8" y="678.8" textLength="671" clip-path="url(#terminal-3378394567-line-27)">ignore files that do not match the specified extensions</text><text class="terminal-3378394567-r2" x="1464" y="678.8" textLength="12.2" clip-path="url(#terminal-3378394567-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-3378394567-r4" x="24.4" y="703.2" textLength="280.6" clip-path="url(#terminal-3378394567-line-28)">--regenerate-thumbnails</text><text class="terminal-3378394567-r2" x="1464" y="703.2" textLength="12.2" clip-path="url(#terminal-3378394567-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-3378394567-r2" x="292.8" y="727.6" textLength="585.6" clip-path="url(#terminal-3378394567-line-29)">regenerate thumbnails even if they already exist</text><text class="terminal-3378394567-r2" x="1464" y="727.6" textLength="12.2" clip-path="url(#terminal-3378394567-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-3378394567-r4" x="24.4" y="752" textLength="207.4" clip-path="url(#terminal-3378394567-line-30)">--reread-metadata</text><text class="terminal-3378394567-r2" x="292.8" y="752" textLength="256.2" clip-path="url(#terminal-3378394567-line-30)">reread image metadata</text><text class="terminal-3378394567-r2" x="1464" y="752" textLength="12.2" clip-path="url(#terminal-3378394567-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-3378394567-r4" x="24.4" y="776.4" textLength="195.2" clip-path="url(#terminal-3378394567-line-31)">--reread-sidecar</text><text class="terminal-3378394567-r2" x="292.8" y="776.4" textLength="244" clip-path="url(#terminal-3378394567-line-31)">reread sidecar files</text><text class="terminal-3378394567-r2" x="1464" y="776.4" textLength="12.2" clip-path="url(#terminal-3378394567-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><text class="terminal-3378394567-r4" x="24.4" y="800.8" textLength="170.8" clip-path="url(#terminal-3378394567-line-32)">--reverse-sort</text><text class="terminal-3378394567-r2" x="292.8" y="800.8" textLength="341.6" clip-path="url(#terminal-3378394567-line-32)">sort images in reverse order</text><text class="terminal-3378394567-r2" x="1464" y="800.8" textLength="12.2" clip-path="url(#terminal-3378394567-line-32)">
|
||||||
|
</text><text class="terminal-3378394567-r4" x="24.4" y="825.2" textLength="146.4" clip-path="url(#terminal-3378394567-line-33)">--theme-path</text><text class="terminal-3378394567-r5" x="183" y="825.2" textLength="48.8" clip-path="url(#terminal-3378394567-line-33)">PATH</text><text class="terminal-3378394567-r2" x="292.8" y="825.2" textLength="317.2" clip-path="url(#terminal-3378394567-line-33)">path to the CSS theme file</text><text class="terminal-3378394567-r2" x="1464" y="825.2" textLength="12.2" clip-path="url(#terminal-3378394567-line-33)">
|
||||||
|
</text><text class="terminal-3378394567-r4" x="24.4" y="849.6" textLength="231.8" clip-path="url(#terminal-3378394567-line-34)">--use-fancy-folders</text><text class="terminal-3378394567-r2" x="292.8" y="849.6" textLength="878.4" clip-path="url(#terminal-3378394567-line-34)">enable fancy folder view instead of the default Apache directory listing</text><text class="terminal-3378394567-r2" x="1464" y="849.6" textLength="12.2" clip-path="url(#terminal-3378394567-line-34)">
|
||||||
|
</text><text class="terminal-3378394567-r4" x="24.4" y="874" textLength="109.8" clip-path="url(#terminal-3378394567-line-35)">--version</text><text class="terminal-3378394567-r2" x="292.8" y="874" textLength="463.6" clip-path="url(#terminal-3378394567-line-35)">show program's version number and exit</text><text class="terminal-3378394567-r2" x="1464" y="874" textLength="12.2" clip-path="url(#terminal-3378394567-line-35)">
|
||||||
</text>
|
</text>
|
||||||
</g>
|
</g>
|
||||||
</g>
|
</g>
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 25 KiB After Width: | Height: | Size: 28 KiB |
@@ -67,6 +67,7 @@ class Args:
|
|||||||
non_interactive_mode: bool
|
non_interactive_mode: bool
|
||||||
regenerate_thumbnails: bool
|
regenerate_thumbnails: bool
|
||||||
reread_metadata: bool
|
reread_metadata: bool
|
||||||
|
reread_sidecar: bool
|
||||||
reverse_sort: bool
|
reverse_sort: bool
|
||||||
root_directory: str
|
root_directory: str
|
||||||
site_title: str
|
site_title: str
|
||||||
@@ -87,6 +88,7 @@ class Args:
|
|||||||
result["non_interactive_mode"] = self.non_interactive_mode
|
result["non_interactive_mode"] = self.non_interactive_mode
|
||||||
result["regenerate_thumbnails"] = self.regenerate_thumbnails
|
result["regenerate_thumbnails"] = self.regenerate_thumbnails
|
||||||
result["reread_metadata"] = self.reread_metadata
|
result["reread_metadata"] = self.reread_metadata
|
||||||
|
result["reread_sidecar"] = self.reread_sidecar
|
||||||
result["reverse_sort"] = self.reverse_sort
|
result["reverse_sort"] = self.reverse_sort
|
||||||
result["root_directory"] = self.root_directory
|
result["root_directory"] = self.root_directory
|
||||||
result["site_title"] = self.site_title
|
result["site_title"] = self.site_title
|
||||||
@@ -112,27 +114,28 @@ def parse_arguments(version: str) -> Args:
|
|||||||
"""
|
"""
|
||||||
# fmt: off
|
# fmt: off
|
||||||
if RICH:
|
if RICH:
|
||||||
parser = argparse.ArgumentParser(description="Generate HTML files for a static image hosting website.", formatter_class=RichHelpFormatter)
|
parser = argparse.ArgumentParser(description="generate HTML files for a static image hosting website", formatter_class=RichHelpFormatter)
|
||||||
else:
|
else:
|
||||||
parser = argparse.ArgumentParser(description="Generate HTML files for a static image hosting website.")
|
parser = argparse.ArgumentParser(description="generate HTML files for a static image hosting website")
|
||||||
parser.add_argument("-a", "--author-name", help="Name of the author of the images.", default=DEFAULT_AUTHOR, type=str, dest="author_name", metavar="AUTHOR")
|
parser.add_argument("-a", "--author-name", help="name of the author of the images", default=DEFAULT_AUTHOR, type=str, dest="author_name", metavar="AUTHOR")
|
||||||
parser.add_argument("-e", "--file-extensions", help="File extensions to include (can be specified multiple times).", action="append", dest="file_extensions", metavar="EXTENSION")
|
parser.add_argument("-e", "--file-extensions", help="file extensions to include (can be specified multiple times)", action="append", dest="file_extensions", metavar="EXTENSION")
|
||||||
parser.add_argument("-l", "--license-type", help="Specify the license type for the images.", choices=["cc-zero", "cc-by", "cc-by-sa", "cc-by-nd", "cc-by-nc", "cc-by-nc-sa", "cc-by-nc-nd"], default=None, dest="license_type", metavar="LICENSE")
|
parser.add_argument("-l", "--license-type", help="specify the license type for the images", choices=["cc-zero", "cc-by", "cc-by-sa", "cc-by-nd", "cc-by-nc", "cc-by-nc-sa", "cc-by-nc-nd"], default=None, dest="license_type", metavar="LICENSE")
|
||||||
parser.add_argument("-m", "--web-manifest", help="Generate a web manifest file.", action="store_true", default=False, dest="generate_webmanifest")
|
parser.add_argument("-m", "--web-manifest", help="generate a web manifest file", action="store_true", default=False, dest="generate_webmanifest")
|
||||||
parser.add_argument("-n", "--non-interactive-mode", help="Run in non-interactive mode, disabling progress bars.", action="store_true", default=False, dest="non_interactive_mode")
|
parser.add_argument("-n", "--non-interactive-mode", help="run in non-interactive mode, disabling progress bars", action="store_true", default=False, dest="non_interactive_mode")
|
||||||
parser.add_argument("-p", "--root-directory", help="Root directory containing the images.", required=True, type=str, dest="root_directory", metavar="ROOT")
|
parser.add_argument("-p", "--root-directory", help="root directory containing the images", required=True, type=str, dest="root_directory", metavar="ROOT")
|
||||||
parser.add_argument("-t", "--site-title", help="Title of the image hosting site.", required=True, type=str, dest="site_title", metavar="TITLE")
|
parser.add_argument("-t", "--site-title", help="title of the image hosting site", required=True, type=str, dest="site_title", metavar="TITLE")
|
||||||
parser.add_argument("-w", "--web-root-url", help="Base URL of the web root for the image hosting site.", required=True, type=str, dest="web_root_url", metavar="URL")
|
parser.add_argument("-w", "--web-root-url", help="base URL of the web root for the image hosting site", required=True, type=str, dest="web_root_url", metavar="URL")
|
||||||
parser.add_argument("--exclude-folder", help="Folders to exclude from processing, globs supported (can be specified multiple times).", action="append", dest="exclude_folders", metavar="FOLDER")
|
parser.add_argument("--exclude-folder", help="folders to exclude from processing, globs supported (can be specified multiple times)", action="append", dest="exclude_folders", metavar="FOLDER")
|
||||||
parser.add_argument("--folderthumbnails", help="Generate subfolder thumbnails (first image in folder will be shown)", action="store_true", default=False, dest="folder_thumbs")
|
parser.add_argument("--folderthumbnails", help="generate subfolder thumbnails (first image in folder will be shown)", action="store_true", default=False, dest="folder_thumbs")
|
||||||
if RICH:
|
if RICH:
|
||||||
parser.add_argument("--generate-help-preview", action=HelpPreviewAction, path="help.svg", )
|
parser.add_argument("--generate-help-preview", action=HelpPreviewAction, path="help.svg", )
|
||||||
parser.add_argument("--ignore-other-files", help="Ignore files that do not match the specified extensions.", action="store_true", default=False, dest="ignore_other_files")
|
parser.add_argument("--ignore-other-files", help="ignore files that do not match the specified extensions", action="store_true", default=False, dest="ignore_other_files")
|
||||||
parser.add_argument("--regenerate-thumbnails", help="Regenerate thumbnails even if they already exist.", action="store_true", default=False, dest="regenerate_thumbnails")
|
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("--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("--reread-sidecar", help="reread sidecar files", action="store_true", default=False, dest="reread_sidecar")
|
||||||
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("--reverse-sort", help="sort images in reverse order", action="store_true", default=False, dest="reverse_sort")
|
||||||
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("--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}")
|
parser.add_argument("--version", action="version", version=f"%(prog)s {version}")
|
||||||
parsed_args = parser.parse_args()
|
parsed_args = parser.parse_args()
|
||||||
# fmt: on
|
# fmt: on
|
||||||
@@ -147,6 +150,7 @@ def parse_arguments(version: str) -> Args:
|
|||||||
non_interactive_mode=parsed_args.non_interactive_mode,
|
non_interactive_mode=parsed_args.non_interactive_mode,
|
||||||
regenerate_thumbnails=parsed_args.regenerate_thumbnails,
|
regenerate_thumbnails=parsed_args.regenerate_thumbnails,
|
||||||
reread_metadata=parsed_args.reread_metadata,
|
reread_metadata=parsed_args.reread_metadata,
|
||||||
|
reread_sidecar=parsed_args.reread_sidecar,
|
||||||
reverse_sort=parsed_args.reverse_sort,
|
reverse_sort=parsed_args.reverse_sort,
|
||||||
root_directory=parsed_args.root_directory,
|
root_directory=parsed_args.root_directory,
|
||||||
site_title=parsed_args.site_title,
|
site_title=parsed_args.site_title,
|
||||||
|
|||||||
@@ -3,12 +3,16 @@ import re
|
|||||||
import urllib.parse
|
import urllib.parse
|
||||||
import fnmatch
|
import fnmatch
|
||||||
import json
|
import json
|
||||||
|
import html
|
||||||
from typing import Any
|
from typing import Any
|
||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
|
from collections import defaultdict
|
||||||
|
|
||||||
from tqdm.auto import tqdm
|
from tqdm.auto import tqdm
|
||||||
from PIL import Image, ExifTags, TiffImagePlugin
|
from PIL import Image, ExifTags, TiffImagePlugin, UnidentifiedImageError
|
||||||
from jinja2 import Environment, FileSystemLoader
|
from jinja2 import Environment, FileSystemLoader
|
||||||
|
from defusedxml import ElementTree
|
||||||
|
from bs4 import BeautifulSoup
|
||||||
|
|
||||||
from modules.logger import logger
|
from modules.logger import logger
|
||||||
from modules import cclicense
|
from modules import cclicense
|
||||||
@@ -29,55 +33,119 @@ Image.MAX_IMAGE_PIXELS = 933120000
|
|||||||
|
|
||||||
# Initialize Jinja2 environment for template rendering
|
# Initialize Jinja2 environment for template rendering
|
||||||
env = Environment(loader=FileSystemLoader(os.path.join(SCRIPTDIR, "templates")))
|
env = Environment(loader=FileSystemLoader(os.path.join(SCRIPTDIR, "templates")))
|
||||||
thumbnails: list[tuple[str, str]] = []
|
thumbnails: list[tuple[str, str, str]] = []
|
||||||
info: dict[str, str] = {}
|
info: dict[str, str] = {}
|
||||||
licens: dict[str, str] = {}
|
licens: dict[str, str] = {}
|
||||||
pbardict: dict[str, tqdm] = {}
|
|
||||||
|
|
||||||
|
|
||||||
def initialize_sizelist(folder: str) -> dict[str, dict[str, int]]:
|
def getxmp(strbuffer: str) -> dict[str, Any]:
|
||||||
"""
|
"""
|
||||||
Initializes the size list JSON file if it doesn't exist.
|
Returns a dictionary containing the XMP tags.
|
||||||
|
Requires defusedxml to be installed.
|
||||||
|
|
||||||
|
:returns: XMP tags in a dictionary.
|
||||||
|
"""
|
||||||
|
|
||||||
|
def get_name(tag: str) -> str:
|
||||||
|
return re.sub("^{[^}]+}", "", tag)
|
||||||
|
|
||||||
|
def get_value(element) -> str | dict[str, Any] | None:
|
||||||
|
value: dict[str, Any] = {get_name(k): v for k, v in element.attrib.items()}
|
||||||
|
children = list(element)
|
||||||
|
if children:
|
||||||
|
for child in children:
|
||||||
|
name = get_name(child.tag)
|
||||||
|
child_value = get_value(child)
|
||||||
|
if name in value:
|
||||||
|
if not isinstance(value[name], list):
|
||||||
|
value[name] = [value[name]]
|
||||||
|
value[name].append(child_value)
|
||||||
|
else:
|
||||||
|
value[name] = child_value
|
||||||
|
elif value:
|
||||||
|
if element.text:
|
||||||
|
value["text"] = element.text
|
||||||
|
else:
|
||||||
|
return element.text
|
||||||
|
return value
|
||||||
|
|
||||||
|
root = ElementTree.fromstring(strbuffer)
|
||||||
|
return {get_name(root.tag): get_value(root)}
|
||||||
|
|
||||||
|
|
||||||
|
def initialize_metadata(folder: str) -> dict[str, dict[str, int]]:
|
||||||
|
"""
|
||||||
|
Initializes the metadata JSON file if it doesn't exist.
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
folder (str): The folder in which the size list file is located.
|
folder (str): The folder in which the metadata file is located.
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
dict[str, dict[str, int]]: The size list dictionary.
|
dict[str, dict[str, int]]: The metadata dictionary.
|
||||||
"""
|
"""
|
||||||
sizelist = {}
|
metadata = {}
|
||||||
sizelist_path = os.path.join(folder, ".sizelist.json")
|
metadata_path = os.path.join(folder, ".metadata.json")
|
||||||
if not os.path.exists(sizelist_path):
|
if not os.path.exists(metadata_path):
|
||||||
logger.info("creating new size list file", extra={"file": sizelist_path})
|
logger.info("creating new metadata file", extra={"file": metadata_path})
|
||||||
with open(sizelist_path, "x", encoding="utf-8") as sizelistfile:
|
with open(metadata_path, "x", encoding="utf-8") as metadatafile:
|
||||||
sizelistfile.write("{}")
|
metadatafile.write("{}")
|
||||||
with open(sizelist_path, "r+", encoding="utf-8") as sizelistfile:
|
with open(metadata_path, "r+", encoding="utf-8") as metadatafile:
|
||||||
logger.info("reading size list file", extra={"file": sizelist_path})
|
logger.info("reading metadata file", extra={"file": metadata_path})
|
||||||
try:
|
try:
|
||||||
sizelist = json.loads(sizelistfile.read())
|
metadata = json.loads(metadatafile.read())
|
||||||
except json.decoder.JSONDecodeError:
|
except json.decoder.JSONDecodeError:
|
||||||
logger.warning("invalid JSON in size list file", extra={"file": sizelist_path})
|
logger.warning("invalid JSON in metadata file", extra={"file": metadata_path})
|
||||||
sizelist = {}
|
metadata = {}
|
||||||
return sizelist
|
|
||||||
|
# remove old sizelist if it exists
|
||||||
|
sizelist_path = os.path.join(folder, ".sizelist.json")
|
||||||
|
if os.path.exists(sizelist_path):
|
||||||
|
with open(sizelist_path, "r") as sizelist:
|
||||||
|
metadata = json.loads(sizelist.read())
|
||||||
|
logger.warning("found old .sizelist.json, removing it...", extra={"path": sizelist_path})
|
||||||
|
os.remove(sizelist_path)
|
||||||
|
|
||||||
|
# convert from old metadata format
|
||||||
|
if "images" not in metadata and "subfolders" not in metadata:
|
||||||
|
images = metadata.copy()
|
||||||
|
metadata = {}
|
||||||
|
metadata["images"] = images
|
||||||
|
elif "images" not in metadata:
|
||||||
|
metadata["images"] = {}
|
||||||
|
for k, v in metadata["images"].items():
|
||||||
|
if "width" in v:
|
||||||
|
metadata["images"][k]["w"] = v["width"]
|
||||||
|
del metadata["images"][k]["width"]
|
||||||
|
if "height" in v:
|
||||||
|
metadata["images"][k]["h"] = v["height"]
|
||||||
|
del metadata["images"][k]["height"]
|
||||||
|
if "tags" not in v:
|
||||||
|
metadata["images"][k]["tags"] = []
|
||||||
|
if "exifdata" not in v:
|
||||||
|
metadata["images"][k]["exifdata"] = None
|
||||||
|
if "xmp" not in v:
|
||||||
|
metadata["images"][k]["xmp"] = None
|
||||||
|
|
||||||
|
return metadata
|
||||||
|
|
||||||
|
|
||||||
def update_sizelist(sizelist: dict[str, dict[str, Any]], folder: str) -> None:
|
def update_metadata(metadata: dict[str, dict[str, Any]], folder: str) -> None:
|
||||||
"""
|
"""
|
||||||
Updates the size list JSON file.
|
Updates the metadata JSON file.
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
sizelist (dict[str, dict[str, int]]): The size list dictionary to be written to the file.
|
metadata (dict[str, dict[str, int]]): The metadata dictionary to be written to the file.
|
||||||
folder (str): The folder in which the size list file is located.
|
folder (str): The folder in which the metadata file is located.
|
||||||
"""
|
"""
|
||||||
sizelist_path = os.path.join(folder, ".sizelist.json")
|
metadata_path = os.path.join(folder, ".metadata.json")
|
||||||
if sizelist:
|
if metadata:
|
||||||
with open(sizelist_path, "w", encoding="utf-8") as sizelistfile:
|
with open(metadata_path, "w", encoding="utf-8") as metadatafile:
|
||||||
logger.info("writing size list file", extra={"file": sizelist_path})
|
logger.info("writing metadata file", extra={"file": metadata_path})
|
||||||
sizelistfile.write(json.dumps(sizelist, indent=4))
|
metadatafile.write(json.dumps(metadata, indent=4))
|
||||||
else:
|
else:
|
||||||
if os.path.exists(sizelist_path):
|
if os.path.exists(metadata_path):
|
||||||
logger.info("deleting empty size list file", extra={"file": sizelist_path})
|
logger.info("deleting empty metadata file", extra={"file": metadata_path})
|
||||||
os.remove(sizelist_path)
|
os.remove(metadata_path)
|
||||||
|
|
||||||
|
|
||||||
def get_image_info(item: str, folder: str) -> dict[str, Any]:
|
def get_image_info(item: str, folder: str) -> dict[str, Any]:
|
||||||
@@ -92,10 +160,17 @@ def get_image_info(item: str, folder: str) -> dict[str, Any]:
|
|||||||
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)
|
file = os.path.join(folder, item)
|
||||||
|
try:
|
||||||
with Image.open(file) as img:
|
with Image.open(file) as img:
|
||||||
logger.info("extracting image information", extra={"file": file})
|
logger.info("extracting image information", extra={"file": file})
|
||||||
exif = img.getexif()
|
|
||||||
width, height = img.size
|
width, height = img.size
|
||||||
|
exif = img.getexif()
|
||||||
|
xmpdata = img.getxmp()
|
||||||
|
|
||||||
|
except UnidentifiedImageError:
|
||||||
|
logger.error("cannot identify image file", extra={"file": file})
|
||||||
|
print(f"cannot identify image file: {file}")
|
||||||
|
return {"w": None, "h": None, "tags": None, "exifdata": None, "xmp": None}
|
||||||
if exif:
|
if exif:
|
||||||
logger.info("extracting EXIF data", extra={"file": file})
|
logger.info("extracting EXIF data", extra={"file": file})
|
||||||
ifd = exif.get_ifd(ExifTags.IFD.Exif)
|
ifd = exif.get_ifd(ExifTags.IFD.Exif)
|
||||||
@@ -117,9 +192,9 @@ def get_image_info(item: str, folder: str) -> dict[str, Any]:
|
|||||||
content = newtuple
|
content = newtuple
|
||||||
if tag in ["DateTime", "DateTimeOriginal", "DateTimeDigitized"]:
|
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):
|
if re.match(epr, str(content)):
|
||||||
try:
|
try:
|
||||||
content = datetime.strptime(content, "%Y:%m:%d %H:%M:%S").strftime("%Y-%m-%d %H:%M:%S")
|
content = datetime.strptime(str(content), "%Y:%m:%d %H:%M:%S").strftime("%Y-%m-%d %H:%M:%S")
|
||||||
except ValueError:
|
except ValueError:
|
||||||
content = None
|
content = None
|
||||||
else:
|
else:
|
||||||
@@ -131,12 +206,135 @@ def get_image_info(item: str, folder: str) -> dict[str, Any]:
|
|||||||
for key in ["PrintImageMatching", "UserComment", "MakerNote"]:
|
for key in ["PrintImageMatching", "UserComment", "MakerNote"]:
|
||||||
if key in exifdata:
|
if key in exifdata:
|
||||||
del exifdata[key]
|
del exifdata[key]
|
||||||
return {"width": width, "height": height, "exifdata": exifdata}
|
|
||||||
else:
|
else:
|
||||||
return {"width": width, "height": height, "exifdata": None}
|
exifdata = None
|
||||||
|
tags = []
|
||||||
|
xmp = None
|
||||||
|
if xmpdata:
|
||||||
|
logger.info("extracting XMP data", extra={"file": file})
|
||||||
|
try:
|
||||||
|
tags = xmpdata["xmpmeta"]["RDF"]["Description"]["subject"]["Bag"]["li"]
|
||||||
|
if isinstance(tags, str):
|
||||||
|
tags = [tags]
|
||||||
|
except TypeError:
|
||||||
|
pass
|
||||||
|
except KeyError:
|
||||||
|
pass
|
||||||
|
try:
|
||||||
|
tags = xmpdata["xapmeta"]["RDF"]["Description"]["subject"]["Bag"]["li"]
|
||||||
|
if isinstance(tags, str):
|
||||||
|
tags = [tags]
|
||||||
|
except TypeError:
|
||||||
|
pass
|
||||||
|
except KeyError:
|
||||||
|
pass
|
||||||
|
try:
|
||||||
|
tags = xmpdata["xmpmeta"]["RDF"]["Description"]["hierarchicalSubject"]["Bag"]["li"]
|
||||||
|
if isinstance(tags, str):
|
||||||
|
tags = [tags]
|
||||||
|
except TypeError:
|
||||||
|
pass
|
||||||
|
except KeyError:
|
||||||
|
pass
|
||||||
|
try:
|
||||||
|
tags = xmpdata["xapmeta"]["RDF"]["Description"]["hierarchicalSubject"]["Bag"]["li"]
|
||||||
|
if isinstance(tags, str):
|
||||||
|
tags = [tags]
|
||||||
|
except TypeError:
|
||||||
|
pass
|
||||||
|
except KeyError:
|
||||||
|
pass
|
||||||
|
sidecarfile = os.path.join(folder, item + ".xmp")
|
||||||
|
if os.path.exists(sidecarfile):
|
||||||
|
logger.info("xmp sidecar file found", extra={"file": sidecarfile})
|
||||||
|
try:
|
||||||
|
tags = get_tags(sidecarfile)
|
||||||
|
except Exception as e:
|
||||||
|
logger.error(e)
|
||||||
|
if None in tags:
|
||||||
|
tags.remove(None)
|
||||||
|
return {"w": width, "h": height, "tags": tags, "exifdata": exifdata, "xmp": xmp}
|
||||||
|
|
||||||
|
|
||||||
def process_image(item: str, folder: str, _args: Args, baseurl: str, sizelist: dict[str, dict[str, int]], raw: list[str]) -> dict[str, Any]:
|
def nested_dict():
|
||||||
|
return defaultdict(nested_dict)
|
||||||
|
|
||||||
|
|
||||||
|
def insert_path(d, path):
|
||||||
|
for part in path[:-1]:
|
||||||
|
d = d[part]
|
||||||
|
last = path[-1]
|
||||||
|
if not isinstance(d[last], dict):
|
||||||
|
d[last] = {}
|
||||||
|
|
||||||
|
|
||||||
|
def finalize(d):
|
||||||
|
if isinstance(d, defaultdict):
|
||||||
|
return {k: finalize(d[k]) for k in sorted(d)}
|
||||||
|
return d or []
|
||||||
|
|
||||||
|
|
||||||
|
def parse_hierarchical_tags(tags, delimiter="|"):
|
||||||
|
tree = nested_dict()
|
||||||
|
for tag in tags:
|
||||||
|
parts = tag.split(delimiter)
|
||||||
|
insert_path(tree, parts)
|
||||||
|
return finalize(tree)
|
||||||
|
|
||||||
|
|
||||||
|
def get_tags(sidecarfile: str) -> list[str]:
|
||||||
|
"""
|
||||||
|
Extracts Tags from XMP sidecar file
|
||||||
|
|
||||||
|
Args:
|
||||||
|
sidecarfile (str): The path to the XMP sidecar file.
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
list[str]: List containing image tags.
|
||||||
|
"""
|
||||||
|
logger.info("extracting XMP sidecar file data", extra={"file": sidecarfile})
|
||||||
|
with open(sidecarfile) as sidecar:
|
||||||
|
strbuffer = sidecar.read()
|
||||||
|
xmpdata = getxmp(strbuffer)
|
||||||
|
tags = []
|
||||||
|
try:
|
||||||
|
tags = xmpdata["xmpmeta"]["RDF"]["Description"]["subject"]["Bag"]["li"]
|
||||||
|
if isinstance(tags, str):
|
||||||
|
tags = [tags]
|
||||||
|
except TypeError:
|
||||||
|
pass
|
||||||
|
except KeyError:
|
||||||
|
pass
|
||||||
|
try:
|
||||||
|
tags = xmpdata["xapmeta"]["RDF"]["Description"]["subject"]["Bag"]["li"]
|
||||||
|
if isinstance(tags, str):
|
||||||
|
tags = [tags]
|
||||||
|
except TypeError:
|
||||||
|
pass
|
||||||
|
except KeyError:
|
||||||
|
pass
|
||||||
|
try:
|
||||||
|
tags = xmpdata["xmpmeta"]["RDF"]["Description"]["hierarchicalSubject"]["Bag"]["li"]
|
||||||
|
if isinstance(tags, str):
|
||||||
|
tags = [tags]
|
||||||
|
except TypeError:
|
||||||
|
pass
|
||||||
|
except KeyError:
|
||||||
|
pass
|
||||||
|
try:
|
||||||
|
tags = xmpdata["xapmeta"]["RDF"]["Description"]["hierarchicalSubject"]["Bag"]["li"]
|
||||||
|
if isinstance(tags, str):
|
||||||
|
tags = [tags]
|
||||||
|
except TypeError:
|
||||||
|
pass
|
||||||
|
except KeyError:
|
||||||
|
pass
|
||||||
|
if None in tags:
|
||||||
|
tags.remove(None)
|
||||||
|
return tags
|
||||||
|
|
||||||
|
|
||||||
|
def process_image(item: str, folder: str, _args: Args, baseurl: str, metadata: dict[str, dict[str, int]], raw: list[str]) -> dict[str, Any]:
|
||||||
"""
|
"""
|
||||||
Processes an image and prepares its data for the HTML template.
|
Processes an image and prepares its data for the HTML template.
|
||||||
|
|
||||||
@@ -145,23 +343,30 @@ def process_image(item: str, folder: str, _args: Args, baseurl: str, sizelist: d
|
|||||||
folder (str): The folder containing the image.
|
folder (str): The folder containing the image.
|
||||||
_args (Args): Parsed command line arguments.
|
_args (Args): Parsed command line arguments.
|
||||||
baseurl (str): Base URL for the web root.
|
baseurl (str): Base URL for the web root.
|
||||||
sizelist (dict[str, dict[str, int]]): dictionary containing size information for images.
|
metadata (dict[str, dict[str, int]]): dictionary containing size information for images.
|
||||||
raw (list[str]): list of raw image file extensions.
|
raw (list[str]): list of raw image file extensions.
|
||||||
|
|
||||||
Returns:
|
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)
|
extsplit = os.path.splitext(item)
|
||||||
if item not in sizelist or _args.reread_metadata:
|
sidecarfile = os.path.join(folder, item + ".xmp")
|
||||||
sizelist[item] = get_image_info(item, folder)
|
if item not in metadata["images"] or _args.reread_metadata:
|
||||||
|
metadata["images"][item] = get_image_info(item, folder)
|
||||||
|
if _args.reread_sidecar and os.path.exists(sidecarfile):
|
||||||
|
logger.info("xmp sidecar file found", extra={"file": sidecarfile})
|
||||||
|
try:
|
||||||
|
metadata["images"][item]["tags"] = get_tags(sidecarfile)
|
||||||
|
except Exception as e:
|
||||||
|
logger.error(e)
|
||||||
|
|
||||||
image = {
|
image = {
|
||||||
"url": f"{_args.web_root_url}{baseurl}{urllib.parse.quote(item)}",
|
"src": f"{_args.web_root_url}{baseurl}{urllib.parse.quote(item)}",
|
||||||
"thumbnail": f"{_args.web_root_url}.thumbnails/{baseurl}{urllib.parse.quote(item)}.jpg",
|
"msrc": f"{_args.web_root_url}.thumbnails/{baseurl}{urllib.parse.quote(item)}.jpg",
|
||||||
"name": item,
|
"name": item,
|
||||||
"width": sizelist[item]["width"],
|
"w": metadata["images"][item]["w"],
|
||||||
"height": sizelist[item]["height"],
|
"h": metadata["images"][item]["h"],
|
||||||
"exifdata": sizelist[item].get("exifdata", ""),
|
"tags": metadata["images"][item]["tags"],
|
||||||
}
|
}
|
||||||
path = os.path.join(_args.root_directory, ".thumbnails", baseurl, item + ".jpg")
|
path = os.path.join(_args.root_directory, ".thumbnails", baseurl, item + ".jpg")
|
||||||
if not os.path.exists(path) or _args.regenerate_thumbnails:
|
if not os.path.exists(path) or _args.regenerate_thumbnails:
|
||||||
@@ -179,10 +384,13 @@ def process_image(item: str, folder: str, _args: Args, baseurl: str, sizelist: d
|
|||||||
else:
|
else:
|
||||||
logger.info("raw file found", extra={"file": file, "extension": _raw})
|
logger.info("raw file found", extra={"file": file, "extension": _raw})
|
||||||
image["raw"] = url
|
image["raw"] = url
|
||||||
return image
|
|
||||||
|
metadata["images"][item].update(image)
|
||||||
|
|
||||||
|
return image, metadata
|
||||||
|
|
||||||
|
|
||||||
def generate_html(folder: str, title: str, _args: Args, raw: list[str], version: str, logo) -> None:
|
def generate_html(folder: str, title: str, _args: Args, raw: list[str], version: str, logo: str) -> list[str]:
|
||||||
"""
|
"""
|
||||||
Generates HTML content for a folder of images.
|
Generates HTML content for a folder of images.
|
||||||
|
|
||||||
@@ -194,19 +402,24 @@ def generate_html(folder: str, title: str, _args: Args, raw: list[str], version:
|
|||||||
"""
|
"""
|
||||||
logger.info("processing folder", extra={"folder": folder})
|
logger.info("processing folder", extra={"folder": folder})
|
||||||
if _args.regenerate_thumbnails:
|
if _args.regenerate_thumbnails:
|
||||||
if os.path.exists(os.path.join(folder, ".sizelist.json")):
|
if os.path.exists(os.path.join(folder, ".metadata.json")):
|
||||||
logger.info("removing .sizelist.json", extra={"folder": folder})
|
logger.info("removing .metadata.json", extra={"folder": folder})
|
||||||
os.remove(os.path.join(folder, ".sizelist.json"))
|
os.remove(os.path.join(folder, ".metadata.json"))
|
||||||
sizelist = initialize_sizelist(folder)
|
metadata = initialize_metadata(folder)
|
||||||
items = sorted(os.listdir(folder))
|
items = sorted(os.listdir(folder))
|
||||||
|
|
||||||
contains_files = False
|
contains_files = False
|
||||||
images = []
|
images = []
|
||||||
subfolders = []
|
subfolders = []
|
||||||
|
subfoldertags = set()
|
||||||
foldername = folder.removeprefix(_args.root_directory)
|
foldername = folder.removeprefix(_args.root_directory)
|
||||||
foldername = f"{foldername}/" if foldername else ""
|
foldername = f"{foldername}/" if foldername else ""
|
||||||
baseurl = urllib.parse.quote(foldername)
|
baseurl = urllib.parse.quote(foldername)
|
||||||
|
|
||||||
|
gone = [item for item in metadata["images"] if item not in items]
|
||||||
|
for gon in gone:
|
||||||
|
del metadata["images"][gon]
|
||||||
|
|
||||||
create_thumbnail_folder(foldername, _args.root_directory)
|
create_thumbnail_folder(foldername, _args.root_directory)
|
||||||
|
|
||||||
logger.info("processing contents", extra={"folder": folder})
|
logger.info("processing contents", extra={"folder": folder})
|
||||||
@@ -214,11 +427,12 @@ def generate_html(folder: str, title: str, _args: Args, raw: list[str], version:
|
|||||||
for item in tqdm(items, total=len(items), desc=f"Getting image infos - {folder}", unit="files", ascii=True, dynamic_ncols=True):
|
for item in tqdm(items, total=len(items), desc=f"Getting image infos - {folder}", unit="files", ascii=True, dynamic_ncols=True):
|
||||||
if item not in EXCLUDES and not item.startswith("."):
|
if item not in EXCLUDES and not item.startswith("."):
|
||||||
if os.path.isdir(os.path.join(folder, item)):
|
if os.path.isdir(os.path.join(folder, item)):
|
||||||
process_subfolder(item, folder, baseurl, subfolders, _args, raw, version, logo)
|
subfoldertags.update(process_subfolder(item, folder, baseurl, subfolders, _args, raw, version, logo))
|
||||||
else:
|
else:
|
||||||
contains_files = True
|
contains_files = True
|
||||||
if os.path.splitext(item)[1].lower() in _args.file_extensions:
|
if os.path.splitext(item)[1].lower() in _args.file_extensions:
|
||||||
images.append(process_image(item, folder, _args, baseurl, sizelist, raw))
|
img, metadata = process_image(item, folder, _args, baseurl, metadata, raw)
|
||||||
|
images.append(img)
|
||||||
if item == "info":
|
if item == "info":
|
||||||
process_info_file(folder, item)
|
process_info_file(folder, item)
|
||||||
if item == "LICENSE":
|
if item == "LICENSE":
|
||||||
@@ -227,24 +441,31 @@ def generate_html(folder: str, title: str, _args: Args, raw: list[str], version:
|
|||||||
for item in items:
|
for item in items:
|
||||||
if item not in EXCLUDES and not item.startswith("."):
|
if item not in EXCLUDES and not item.startswith("."):
|
||||||
if os.path.isdir(os.path.join(folder, item)):
|
if os.path.isdir(os.path.join(folder, item)):
|
||||||
process_subfolder(item, folder, baseurl, subfolders, _args, raw, version, logo)
|
subfoldertags.update(process_subfolder(item, folder, baseurl, subfolders, _args, raw, version, logo))
|
||||||
else:
|
else:
|
||||||
contains_files = True
|
contains_files = True
|
||||||
if os.path.splitext(item)[1].lower() in _args.file_extensions:
|
if os.path.splitext(item)[1].lower() in _args.file_extensions:
|
||||||
images.append(process_image(item, folder, _args, baseurl, sizelist, raw))
|
img, metadata = process_image(item, folder, _args, baseurl, metadata, raw)
|
||||||
|
images.append(img)
|
||||||
if item == "info":
|
if item == "info":
|
||||||
process_info_file(folder, item)
|
process_info_file(folder, item)
|
||||||
if item == "LICENSE":
|
if item == "LICENSE":
|
||||||
process_license(folder, item)
|
process_license(folder, item)
|
||||||
|
|
||||||
update_sizelist(sizelist, folder)
|
metadata["subfolders"] = subfolders
|
||||||
|
if _args.reverse_sort:
|
||||||
|
metadata["images"] = {key: metadata["images"][key] for key in sorted(metadata["images"], reverse=True)}
|
||||||
|
else:
|
||||||
|
metadata["images"] = {key: metadata["images"][key] for key in sorted(metadata["images"])}
|
||||||
|
update_metadata(metadata, folder)
|
||||||
|
|
||||||
if should_generate_html(images, contains_files, _args):
|
if should_generate_html(images, contains_files, _args):
|
||||||
create_html_file(folder, title, foldername, images, subfolders, _args, version, logo)
|
subfoldertags = create_html_file(folder, title, foldername, images, subfolders, _args, version, logo, subfoldertags)
|
||||||
else:
|
else:
|
||||||
if os.path.exists(os.path.join(folder, "index.html")):
|
if os.path.exists(os.path.join(folder, "index.html")):
|
||||||
logger.info("removing existing index.html", extra={"folder": folder})
|
logger.info("removing existing index.html", extra={"folder": folder})
|
||||||
os.remove(os.path.join(folder, "index.html"))
|
os.remove(os.path.join(folder, "index.html"))
|
||||||
|
return subfoldertags
|
||||||
|
|
||||||
|
|
||||||
def create_thumbnail_folder(foldername: str, root_directory: str) -> None:
|
def create_thumbnail_folder(foldername: str, root_directory: str) -> None:
|
||||||
@@ -261,7 +482,7 @@ def create_thumbnail_folder(foldername: str, root_directory: str) -> None:
|
|||||||
os.mkdir(thumbnails_path)
|
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, logo: str) -> None:
|
def process_subfolder(item: str, folder: str, baseurl: str, subfolders: list[dict[str, str | None]], _args: Args, raw: list[str], version: str, logo: str) -> list[str]:
|
||||||
"""
|
"""
|
||||||
Processes a subfolder.
|
Processes a subfolder.
|
||||||
|
|
||||||
@@ -287,25 +508,28 @@ def process_subfolder(item: str, folder: str, baseurl: str, subfolders: list[dic
|
|||||||
else:
|
else:
|
||||||
thumb = f"{_args.web_root_url}.thumbnails/{baseurl}{urllib.parse.quote(item)}/{urllib.parse.quote(thumbitems[0])}.jpg"
|
thumb = f"{_args.web_root_url}.thumbnails/{baseurl}{urllib.parse.quote(item)}/{urllib.parse.quote(thumbitems[0])}.jpg"
|
||||||
|
|
||||||
subfolders.append({"url": subfolder_url, "name": item, "thumb": thumb})
|
|
||||||
if item not in _args.exclude_folders:
|
if item not in _args.exclude_folders:
|
||||||
if not any(fnmatch.fnmatchcase(os.path.join(folder, item), exclude) for exclude 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, logo)
|
subfolders.append({"url": subfolder_url, "name": item, "thumb": thumb, "metadata": f"{_args.web_root_url}{baseurl}{urllib.parse.quote(item)}/.metadata.json"})
|
||||||
|
return generate_html(os.path.join(folder, item), os.path.join(folder, item).removeprefix(_args.root_directory), _args, raw, version, logo)
|
||||||
|
subfolders.append({"url": subfolder_url, "name": item, "thumb": thumb, "metadata": None})
|
||||||
|
return []
|
||||||
|
|
||||||
|
|
||||||
def process_license(folder: str, item: str) -> None:
|
def process_license(folder: str, item: str) -> None:
|
||||||
"""
|
"""
|
||||||
Processes a LICENSE file.
|
Processes a LICENSE file, preserving formatting in HTML.
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
folder (str): The folder containing the info file.
|
folder (str): The folder containing the LICENSE file.
|
||||||
item (str): The licenses file name.
|
item (str): The LICENSE file name.
|
||||||
"""
|
"""
|
||||||
with open(os.path.join(folder, item), encoding="utf-8") as f:
|
path = os.path.join(folder, item)
|
||||||
logger.info("processing LICENSE", extra={"path": os.path.join(folder, item)})
|
with open(path, encoding="utf-8") as f:
|
||||||
licens[urllib.parse.quote(folder)] = (
|
logger.info("processing LICENSE", extra={"path": path})
|
||||||
f.read().replace("\n", "</br>\n").replace(" ", " ").replace(" ", " ").replace("sp; ", "sp; ").replace("  ", " ")
|
raw_text = f.read()
|
||||||
)
|
escaped_text = html.escape(raw_text)
|
||||||
|
licens[urllib.parse.quote(folder)] = f"<pre>{escaped_text}</pre>"
|
||||||
|
|
||||||
|
|
||||||
def process_info_file(folder: str, item: str) -> None:
|
def process_info_file(folder: str, item: str) -> None:
|
||||||
@@ -335,7 +559,14 @@ 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)
|
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, logo: str) -> None:
|
def format_html(html: str) -> str:
|
||||||
|
soup = BeautifulSoup(html, "html5lib")
|
||||||
|
return soup.prettify()
|
||||||
|
|
||||||
|
|
||||||
|
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, subfoldertags: list[str]
|
||||||
|
) -> list[str]:
|
||||||
"""
|
"""
|
||||||
Creates the HTML file using the template.
|
Creates the HTML file using the template.
|
||||||
|
|
||||||
@@ -366,6 +597,13 @@ def create_html_file(folder: str, title: str, foldername: str, images: list[dict
|
|||||||
else None
|
else None
|
||||||
)
|
)
|
||||||
|
|
||||||
|
alltags = set()
|
||||||
|
for img in images:
|
||||||
|
if img["tags"]:
|
||||||
|
alltags.update(img["tags"])
|
||||||
|
|
||||||
|
alltags.update(set(subfoldertags))
|
||||||
|
|
||||||
folder_info = info.get(urllib.parse.quote(folder), "").split("\n")
|
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
|
_info = [i for i in folder_info if len(i) > 1] if folder_info else None
|
||||||
if _args.reverse_sort:
|
if _args.reverse_sort:
|
||||||
@@ -395,7 +633,7 @@ def create_html_file(folder: str, title: str, foldername: str, images: list[dict
|
|||||||
logo=logo,
|
logo=logo,
|
||||||
licensefile=folder_license,
|
licensefile=folder_license,
|
||||||
)
|
)
|
||||||
f.write(content)
|
f.write(format_html(content))
|
||||||
|
|
||||||
html = env.get_template("index.html.j2")
|
html = env.get_template("index.html.j2")
|
||||||
content = html.render(
|
content = html.render(
|
||||||
@@ -408,20 +646,22 @@ def create_html_file(folder: str, title: str, foldername: str, images: list[dict
|
|||||||
header=header,
|
header=header,
|
||||||
license=license_info,
|
license=license_info,
|
||||||
subdirectories=subfolders,
|
subdirectories=subfolders,
|
||||||
images=images,
|
|
||||||
info=_info,
|
info=_info,
|
||||||
webmanifest=_args.generate_webmanifest,
|
webmanifest=_args.generate_webmanifest,
|
||||||
version=version,
|
version=version,
|
||||||
logo=logo,
|
logo=logo,
|
||||||
licensefile=license_url,
|
licensefile=license_url,
|
||||||
|
tags=parse_hierarchical_tags(alltags),
|
||||||
)
|
)
|
||||||
|
|
||||||
with open(html_file, "w", encoding="utf-8") as f:
|
with open(html_file, "w", encoding="utf-8") as f:
|
||||||
logger.info("writing html file", extra={"path": html_file})
|
logger.info("writing formatted html file", extra={"path": html_file})
|
||||||
f.write(content)
|
f.write(format_html(content))
|
||||||
|
|
||||||
|
return sorted(alltags)
|
||||||
|
|
||||||
|
|
||||||
def list_folder(folder: str, title: str, _args: Args, raw: list[str], version: str, logo: str) -> list[tuple[str, str]]:
|
def list_folder(folder: str, title: str, _args: Args, raw: list[str], version: str, logo: str) -> list[tuple[str, str, str]]:
|
||||||
"""
|
"""
|
||||||
lists and processes a folder, generating HTML files.
|
lists and processes a folder, generating HTML files.
|
||||||
|
|
||||||
|
|||||||
@@ -95,7 +95,7 @@ def setup_logger(level=logging.INFO):
|
|||||||
"""
|
"""
|
||||||
_logger = logging.getLogger(name="defaultlogger")
|
_logger = logging.getLogger(name="defaultlogger")
|
||||||
|
|
||||||
supported_keys = ["asctime", "created", "filename", "funcName", "levelname", "levelno", "lineno", "module", "msecs", "message", "name", "pathname", "process", "processName", "relativeCreated", "thread", "threadName", "taskName"]
|
supported_keys = ["asctime", "created", "filename", "funcName", "levelname", "levelno", "lineno", "module", "msecs", "message", "process", "processName", "relativeCreated", "thread", "threadName"]
|
||||||
|
|
||||||
custom_format = " ".join(log_format(supported_keys))
|
custom_format = " ".join(log_format(supported_keys))
|
||||||
formatter = jsonlogger.JsonFormatter(custom_format)
|
formatter = jsonlogger.JsonFormatter(custom_format)
|
||||||
@@ -121,7 +121,7 @@ def setup_consolelogger(level=logging.INFO):
|
|||||||
"""
|
"""
|
||||||
_logger = logging.getLogger(name="consolelogger")
|
_logger = logging.getLogger(name="consolelogger")
|
||||||
|
|
||||||
supported_keys = ["asctime", "created", "filename", "funcName", "levelname", "levelno", "lineno", "module", "msecs", "message", "name", "pathname", "process", "processName", "relativeCreated", "thread", "threadName", "taskName"]
|
supported_keys = ["asctime", "created", "filename", "funcName", "levelname", "levelno", "lineno", "module", "msecs", "message", "process", "processName", "relativeCreated", "thread", "threadName"]
|
||||||
|
|
||||||
custom_format = " ".join(log_format(supported_keys))
|
custom_format = " ".join(log_format(supported_keys))
|
||||||
formatter = jsonlogger.JsonFormatter(custom_format)
|
formatter = jsonlogger.JsonFormatter(custom_format)
|
||||||
|
|||||||
@@ -146,7 +146,7 @@ def render_manifest_json(_args: Args, icon_list: list[Icon], colors: dict[str, s
|
|||||||
colors : dict[str, str]
|
colors : dict[str, str]
|
||||||
dictionary containing color scheme and theme color.
|
dictionary containing color scheme and theme color.
|
||||||
"""
|
"""
|
||||||
manifest = env.get_template("manifest.json.j2")
|
manifest = env.get_template("manifest.webmanifest.j2")
|
||||||
content = manifest.render(
|
content = manifest.render(
|
||||||
name=_args.web_root_url.replace("https://", "").replace("http://", "").replace("/", ""),
|
name=_args.web_root_url.replace("https://", "").replace("http://", "").replace("/", ""),
|
||||||
short_name=_args.site_title,
|
short_name=_args.site_title,
|
||||||
@@ -154,8 +154,8 @@ def render_manifest_json(_args: Args, icon_list: list[Icon], colors: dict[str, s
|
|||||||
background_color=colors["bcolor1"],
|
background_color=colors["bcolor1"],
|
||||||
theme_color=colors["theme_color"],
|
theme_color=colors["theme_color"],
|
||||||
)
|
)
|
||||||
with open(os.path.join(_args.root_directory, ".static", "manifest.json"), "w", encoding="utf-8") as f:
|
with open(os.path.join(_args.root_directory, ".static", "manifest.webmanifest"), "w", encoding="utf-8") as f:
|
||||||
logger.info("rendering manifest.json", extra={"path": os.path.join(_args.root_directory, ".static", "manifest.json")})
|
logger.info("rendering manifest.webmanifest", extra={"path": os.path.join(_args.root_directory, ".static", "manifest.webmanifest")})
|
||||||
f.write(content)
|
f.write(content)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,8 +1,12 @@
|
|||||||
CairoSVG==2.7.1
|
beautifulsoup4~=4.13.4
|
||||||
Jinja2==3.1.5
|
CairoSVG~=2.7.1
|
||||||
Pillow==11.1.0
|
defusedxml~=0.7.1
|
||||||
pyinstaller==6.11.1
|
html5lib~=1.1
|
||||||
python_json_logger==2.0.7
|
Jinja2~=3.1.6
|
||||||
rich_argparse==1.7.0
|
jsmin~=3.0.1
|
||||||
selenium==4.28.1
|
Pillow~=11.3.0
|
||||||
tqdm==4.66.4
|
pyinstaller~=6.11.1
|
||||||
|
python_json_logger~=2.0.7
|
||||||
|
rich_argparse~=1.7.1
|
||||||
|
selenium~=4.34.2
|
||||||
|
tqdm~=4.66.4
|
||||||
|
|||||||
@@ -52,6 +52,14 @@
|
|||||||
background-color: var(--color2);
|
background-color: var(--color2);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.tagentry label:hover {
|
||||||
|
background-color: var(--color7);
|
||||||
|
}
|
||||||
|
|
||||||
|
.tagentry .tagtoggle:hover {
|
||||||
|
background-color: var(--color4);
|
||||||
|
}
|
||||||
|
|
||||||
.column img {
|
.column img {
|
||||||
background-color: var(--color2);
|
background-color: var(--color2);
|
||||||
}
|
}
|
||||||
|
|||||||
419
templates/functionality.js
Normal file
@@ -0,0 +1,419 @@
|
|||||||
|
class PhotoGallery {
|
||||||
|
constructor() {
|
||||||
|
this.pswpElement = document.querySelector(".pswp");
|
||||||
|
this.items = [];
|
||||||
|
this.shown = [];
|
||||||
|
this.subfolders = [];
|
||||||
|
this.controllers = {};
|
||||||
|
this.tagDropdownShown = false;
|
||||||
|
|
||||||
|
this.debounce = this.debounce.bind(this);
|
||||||
|
this.openSwipe = this.openSwipe.bind(this);
|
||||||
|
this.prefetch = this.prefetch.bind(this);
|
||||||
|
this.cancel = this.cancel.bind(this);
|
||||||
|
this.reset = this.reset.bind(this);
|
||||||
|
this.recursive = this.recursive.bind(this);
|
||||||
|
this.requestMetadata = this.requestMetadata.bind(this);
|
||||||
|
this.filter = this.filter.bind(this);
|
||||||
|
this.updateImageList = this.updateImageList.bind(this);
|
||||||
|
this.setFilter = this.setFilter.bind(this);
|
||||||
|
this.toggleTag = this.toggleTag.bind(this);
|
||||||
|
this.setupDropdownToggle = this.setupDropdownToggle.bind(this);
|
||||||
|
this.setupTagHandlers = this.setupTagHandlers.bind(this);
|
||||||
|
this.setupClickHandlers = this.setupClickHandlers.bind(this);
|
||||||
|
this.scrollFunction = this.scrollFunction.bind(this);
|
||||||
|
this.topFunction = this.topFunction.bind(this);
|
||||||
|
this.onLoad = this.onLoad.bind(this);
|
||||||
|
|
||||||
|
this.init();
|
||||||
|
}
|
||||||
|
|
||||||
|
debounce(fn, delay) {
|
||||||
|
let timeoutId;
|
||||||
|
return (...args) => {
|
||||||
|
clearTimeout(timeoutId);
|
||||||
|
timeoutId = setTimeout(() => fn.apply(this, args), delay);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
openSwipe(imgIndex) {
|
||||||
|
const options = { index: imgIndex };
|
||||||
|
const gallery = new PhotoSwipe(
|
||||||
|
this.pswpElement,
|
||||||
|
PhotoSwipeUI_Default,
|
||||||
|
this.shown,
|
||||||
|
options
|
||||||
|
);
|
||||||
|
gallery.init();
|
||||||
|
}
|
||||||
|
|
||||||
|
prefetch(imgIndex) {
|
||||||
|
if (this.controllers[imgIndex]) {
|
||||||
|
this.cancel(imgIndex);
|
||||||
|
}
|
||||||
|
const controller = new AbortController();
|
||||||
|
const signal = controller.signal;
|
||||||
|
this.controllers[imgIndex] = controller;
|
||||||
|
const urlToFetch = this.shown[imgIndex]?.src;
|
||||||
|
if (urlToFetch) {
|
||||||
|
fetch(urlToFetch, { method: "GET", signal }).catch(() => {});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
cancel(imgIndex) {
|
||||||
|
if (this.controllers[imgIndex]) {
|
||||||
|
this.controllers[imgIndex].abort();
|
||||||
|
delete this.controllers[imgIndex];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
reset() {
|
||||||
|
const content = document.documentElement.innerHTML;
|
||||||
|
const title = document.title;
|
||||||
|
const folders = document.querySelector(".folders");
|
||||||
|
let path = window.location.origin + window.location.pathname;
|
||||||
|
if (path.startsWith("null")) {
|
||||||
|
path = window.location.protocol + "//" + path.substring(4);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (folders) folders.style.display = "";
|
||||||
|
document.getElementById("recursive").checked = false;
|
||||||
|
document
|
||||||
|
.querySelectorAll("#tagdropdown input.tagcheckbox:checked")
|
||||||
|
.forEach((checkbox) => (checkbox.checked = false));
|
||||||
|
window.history.replaceState({ html: content, pageTitle: title }, "", path);
|
||||||
|
this.requestMetadata();
|
||||||
|
}
|
||||||
|
|
||||||
|
showLoader() {
|
||||||
|
const imagelist = document.getElementById("imagelist");
|
||||||
|
imagelist.innerHTML = '<span class="loader"></span>';
|
||||||
|
imagelist.classList.add("centerload");
|
||||||
|
imagelist.classList.remove("row");
|
||||||
|
}
|
||||||
|
|
||||||
|
async recursive() {
|
||||||
|
this.showLoader();
|
||||||
|
const loc = new URL(window.location.href);
|
||||||
|
const content = document.documentElement.innerHTML;
|
||||||
|
const title = document.title;
|
||||||
|
const isChecked = document.getElementById("recursive")?.checked;
|
||||||
|
const folders = document.querySelector(".folders");
|
||||||
|
|
||||||
|
if (!isChecked) {
|
||||||
|
if (folders) folders.style.display = "";
|
||||||
|
loc.searchParams.delete("recursive");
|
||||||
|
window.history.replaceState({ html: content, pageTitle: title }, "", loc);
|
||||||
|
this.requestMetadata();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (folders) folders.style.display = "none";
|
||||||
|
loc.searchParams.delete("recursive");
|
||||||
|
loc.searchParams.append("recursive", true);
|
||||||
|
window.history.replaceState({ html: content, pageTitle: title }, "", loc);
|
||||||
|
|
||||||
|
const visited = new Set();
|
||||||
|
const existingItems = new Set();
|
||||||
|
const newItems = [];
|
||||||
|
|
||||||
|
try {
|
||||||
|
const response = await fetch(".metadata.json");
|
||||||
|
if (!response.ok) throw new Error("Failed to fetch metadata");
|
||||||
|
const data = await response.json();
|
||||||
|
|
||||||
|
this.items = [];
|
||||||
|
this.subfolders = data.subfolders || [];
|
||||||
|
|
||||||
|
for (const image of Object.values(data.images || {})) {
|
||||||
|
newItems.push(image);
|
||||||
|
existingItems.add(image.src);
|
||||||
|
}
|
||||||
|
} catch {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const fetchFoldersRecursively = async (folderList) => {
|
||||||
|
if (!Array.isArray(folderList)) return;
|
||||||
|
const nextLevel = [];
|
||||||
|
await Promise.all(
|
||||||
|
folderList.map(async (folder) => {
|
||||||
|
if (!folder || !folder.metadata || visited.has(folder.url)) return;
|
||||||
|
visited.add(folder.url);
|
||||||
|
try {
|
||||||
|
const response = await fetch(folder.metadata);
|
||||||
|
if (!response.ok) throw new Error();
|
||||||
|
const data = await response.json();
|
||||||
|
for (const image of Object.values(data.images || {})) {
|
||||||
|
if (!existingItems.has(image.src)) {
|
||||||
|
newItems.push(image);
|
||||||
|
existingItems.add(image.src);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (Array.isArray(data.subfolders))
|
||||||
|
nextLevel.push(...data.subfolders);
|
||||||
|
} catch {}
|
||||||
|
})
|
||||||
|
);
|
||||||
|
if (nextLevel.length > 0) await fetchFoldersRecursively(nextLevel);
|
||||||
|
};
|
||||||
|
|
||||||
|
await fetchFoldersRecursively(this.subfolders);
|
||||||
|
this.items = [...newItems];
|
||||||
|
this.filter();
|
||||||
|
}
|
||||||
|
|
||||||
|
requestMetadata() {
|
||||||
|
this.showLoader();
|
||||||
|
const hash = window.location.hash;
|
||||||
|
const searchParams = new URLSearchParams(window.location.search);
|
||||||
|
fetch(".metadata.json")
|
||||||
|
.then((response) => {
|
||||||
|
if (!response.ok) throw new Error("Failed to fetch metadata");
|
||||||
|
return response.json();
|
||||||
|
})
|
||||||
|
.then((data) => {
|
||||||
|
this.items = Object.values(data.images || {});
|
||||||
|
this.subfolders = data.subfolders || [];
|
||||||
|
|
||||||
|
if (hash != "") {
|
||||||
|
const selected = hash.replace("#", "").split(",");
|
||||||
|
this.setFilter(selected);
|
||||||
|
}
|
||||||
|
if (searchParams.get("recursive") != null) {
|
||||||
|
const recChk = document.getElementById("recursive");
|
||||||
|
if (recChk) recChk.checked = true;
|
||||||
|
this.recursive();
|
||||||
|
} else {
|
||||||
|
this.filter();
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.catch(() => {});
|
||||||
|
}
|
||||||
|
|
||||||
|
filter() {
|
||||||
|
const searchParams = new URLSearchParams(window.location.search);
|
||||||
|
this.shown = [];
|
||||||
|
let path = decodeURIComponent(
|
||||||
|
window.location.origin +
|
||||||
|
window.location.pathname.replace("index.html", "")
|
||||||
|
);
|
||||||
|
if (path.startsWith("null")) {
|
||||||
|
path = window.location.protocol + "//" + path.substring(4);
|
||||||
|
}
|
||||||
|
const selectedTags = [];
|
||||||
|
|
||||||
|
document
|
||||||
|
.querySelectorAll("#tagdropdown input.tagcheckbox:checked")
|
||||||
|
.forEach((checkbox) => {
|
||||||
|
let tag = checkbox.parentElement.id.trim().substring(1);
|
||||||
|
if (checkbox.parentElement.parentElement.children.length > 1)
|
||||||
|
tag += "|";
|
||||||
|
selectedTags.push(tag);
|
||||||
|
});
|
||||||
|
|
||||||
|
const urltags = selectedTags.join(",");
|
||||||
|
|
||||||
|
let isRecursiveChecked = false;
|
||||||
|
try {
|
||||||
|
isRecursiveChecked =
|
||||||
|
document.getElementById("recursive")?.checked || false;
|
||||||
|
} catch {}
|
||||||
|
|
||||||
|
for (const item of this.items) {
|
||||||
|
const tags = item.tags || [];
|
||||||
|
const include = selectedTags.every((selected) => {
|
||||||
|
const isParent = selected.endsWith("|");
|
||||||
|
return isParent
|
||||||
|
? tags.some((t) => t.startsWith(selected))
|
||||||
|
: tags.includes(selected);
|
||||||
|
});
|
||||||
|
|
||||||
|
if (include || selectedTags.length === 0) {
|
||||||
|
if (!isRecursiveChecked) {
|
||||||
|
if (decodeURIComponent(item.src).replace(item.name, "") === path) {
|
||||||
|
this.shown.push(item);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
this.shown.push(item);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
this.updateImageList();
|
||||||
|
window.location.hash = urltags;
|
||||||
|
|
||||||
|
const pid = searchParams.get("pid") - 1;
|
||||||
|
if (pid != -1) {
|
||||||
|
this.openSwipe(pid);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
updateImageList() {
|
||||||
|
const imagelist = document.getElementById("imagelist");
|
||||||
|
if (!imagelist) return;
|
||||||
|
let str = "";
|
||||||
|
this.shown.forEach((item, index) => {
|
||||||
|
str += `<div class="column"><figure><img src="${item.msrc}" data-index="${index}" /><figcaption class="caption">${item.name}`;
|
||||||
|
if (item.tiff) str += ` <a href="${item.tiff}">TIFF</a>`;
|
||||||
|
if (item.raw) str += ` <a href="${item.raw}">RAW</a>`;
|
||||||
|
str += "</figcaption></figure></div>";
|
||||||
|
});
|
||||||
|
imagelist.classList.add("row");
|
||||||
|
imagelist.classList.remove("centerload");
|
||||||
|
imagelist.innerHTML = str;
|
||||||
|
}
|
||||||
|
|
||||||
|
setFilter(selected) {
|
||||||
|
document
|
||||||
|
.querySelectorAll("#tagdropdown input.tagcheckbox")
|
||||||
|
.forEach((checkbox) => {
|
||||||
|
selected.forEach((tag) => {
|
||||||
|
if (
|
||||||
|
checkbox.parentElement.id
|
||||||
|
.trim()
|
||||||
|
.substring(1)
|
||||||
|
.replace(" ", "%20") === tag
|
||||||
|
) {
|
||||||
|
checkbox.checked = true;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
toggleTag(tagid) {
|
||||||
|
const tag = document.getElementById(tagid);
|
||||||
|
const ol = tag?.closest(".tagentry")?.querySelector(".tagentryparent");
|
||||||
|
const svg = tag?.parentElement.querySelector(".tagtoggle svg");
|
||||||
|
if (!ol || !svg) return;
|
||||||
|
ol.classList.toggle("show");
|
||||||
|
svg.style.transform = ol.classList.contains("show")
|
||||||
|
? "rotate(180deg)"
|
||||||
|
: "rotate(0deg)";
|
||||||
|
}
|
||||||
|
|
||||||
|
setupDropdownToggle() {
|
||||||
|
const toggleLink = document.getElementById("tagtogglelink");
|
||||||
|
const dropdown = document.getElementById("tagdropdown");
|
||||||
|
if (!toggleLink) return;
|
||||||
|
|
||||||
|
toggleLink.addEventListener("click", (event) => {
|
||||||
|
event.stopPropagation();
|
||||||
|
const svg = toggleLink.querySelector("svg");
|
||||||
|
dropdown.classList.toggle("show");
|
||||||
|
if (svg)
|
||||||
|
svg.style.transform = dropdown.classList.contains("show")
|
||||||
|
? "rotate(180deg)"
|
||||||
|
: "rotate(0deg)";
|
||||||
|
this.tagDropdownShown = dropdown.classList.contains("show");
|
||||||
|
});
|
||||||
|
|
||||||
|
document.addEventListener("click", (event) => {
|
||||||
|
if (
|
||||||
|
!dropdown.contains(event.target) &&
|
||||||
|
!toggleLink.contains(event.target)
|
||||||
|
) {
|
||||||
|
dropdown.classList.remove("show");
|
||||||
|
this.tagDropdownShown = false;
|
||||||
|
const svg = toggleLink.querySelector("svg");
|
||||||
|
if (svg) svg.style.transform = "rotate(0deg)";
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
setupTagHandlers() {
|
||||||
|
const tagContainer = document.getElementById("tagdropdown");
|
||||||
|
if (!tagContainer) return;
|
||||||
|
|
||||||
|
const debouncedFilter = this.debounce(this.filter, 150);
|
||||||
|
tagContainer.addEventListener("change", debouncedFilter);
|
||||||
|
|
||||||
|
tagContainer.addEventListener("click", (event) => {
|
||||||
|
const toggle = event.target.closest(".tagtoggle");
|
||||||
|
if (toggle) {
|
||||||
|
event.stopPropagation();
|
||||||
|
const tagid = toggle.dataset.toggleid;
|
||||||
|
this.toggleTag(tagid);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
setupClickHandlers() {
|
||||||
|
const resetEl = document
|
||||||
|
.getElementById("reset-filter")
|
||||||
|
?.querySelector("label");
|
||||||
|
if (resetEl) resetEl.addEventListener("click", this.reset);
|
||||||
|
|
||||||
|
const recurseEl = document.getElementById("recursive");
|
||||||
|
if (recurseEl)
|
||||||
|
recurseEl.addEventListener("change", this.debounce(this.recursive, 150));
|
||||||
|
|
||||||
|
const totop = document.getElementById("totop");
|
||||||
|
if (totop) totop.addEventListener("click", this.topFunction);
|
||||||
|
|
||||||
|
const imagelist = document.getElementById("imagelist");
|
||||||
|
if (imagelist) {
|
||||||
|
imagelist.addEventListener("click", (event) => {
|
||||||
|
const img = event.target.closest("img");
|
||||||
|
if (!img || !img.dataset.index) return;
|
||||||
|
const index = parseInt(img.dataset.index);
|
||||||
|
if (!isNaN(index)) this.openSwipe(index);
|
||||||
|
});
|
||||||
|
|
||||||
|
imagelist.addEventListener("mouseover", (event) => {
|
||||||
|
const img = event.target.closest("img");
|
||||||
|
if (!img || !img.dataset.index) return;
|
||||||
|
const index = parseInt(img.dataset.index);
|
||||||
|
if (!isNaN(index)) this.prefetch(index);
|
||||||
|
});
|
||||||
|
|
||||||
|
imagelist.addEventListener("mouseleave", (event) => {
|
||||||
|
const img = event.target.closest("img");
|
||||||
|
if (!img || !img.dataset.index) return;
|
||||||
|
const index = parseInt(img.dataset.index);
|
||||||
|
if (!isNaN(index)) this.cancel(index);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
scrollFunction() {
|
||||||
|
const totopbutton = document.getElementById("totop");
|
||||||
|
if (!totopbutton) return;
|
||||||
|
if (
|
||||||
|
document.body.scrollTop > 20 ||
|
||||||
|
document.documentElement.scrollTop > 20
|
||||||
|
) {
|
||||||
|
totopbutton.style.display = "block";
|
||||||
|
} else {
|
||||||
|
totopbutton.style.display = "none";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
topFunction() {
|
||||||
|
window.scrollTo({ top: 0, behavior: "smooth" });
|
||||||
|
}
|
||||||
|
|
||||||
|
onLoad() {
|
||||||
|
document.querySelectorAll(".tagtoggle").forEach((toggle) => {
|
||||||
|
toggle.addEventListener("mouseup", (event) => {
|
||||||
|
event.stopPropagation();
|
||||||
|
const tagid = toggle.getAttribute("data-tagid");
|
||||||
|
this.toggleTag(tagid);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
this.requestMetadata();
|
||||||
|
this.setupDropdownToggle();
|
||||||
|
this.setupTagHandlers();
|
||||||
|
this.setupClickHandlers();
|
||||||
|
|
||||||
|
window.addEventListener("scroll", this.scrollFunction);
|
||||||
|
}
|
||||||
|
|
||||||
|
init() {
|
||||||
|
if (window.addEventListener) {
|
||||||
|
window.addEventListener("load", this.onLoad, false);
|
||||||
|
} else if (window.attachEvent) {
|
||||||
|
window.attachEvent("onload", this.onLoad);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,3 +1,25 @@
|
|||||||
|
{%- macro render_tags(tag_tree, parent) -%}
|
||||||
|
{%- for key, value in tag_tree.items() %}
|
||||||
|
<li class="tagentry">
|
||||||
|
<div class="tagflex">
|
||||||
|
<label class="tag" title="{{ key }}" id="{{ parent }}|{{ key }}">
|
||||||
|
<input type="checkbox" class="tagcheckbox" />{{ key }}
|
||||||
|
</label>{% if value %} <span class="tagtoggle" data-tagid="{{ parent }}|{{ key }}">
|
||||||
|
<svg width="1em" height="1em" viewBox="0 0 129.87601 129.87624">
|
||||||
|
<g id="layer1" transform="translate(-33.816833,-52.685642)">
|
||||||
|
<path stroke="currentColor" style="fill:none;stroke-width:20;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1"
|
||||||
|
d="M 54.476483,95.484647 98.754836,139.76308 143.03319,95.484647" id="path1" />
|
||||||
|
</g>
|
||||||
|
</svg></span>{% endif %}
|
||||||
|
</div>
|
||||||
|
{%- if value %}
|
||||||
|
<ol class="tagentryparent">
|
||||||
|
{{ render_tags(value, parent + '|' + key) }}
|
||||||
|
</ol>
|
||||||
|
{%- endif %}
|
||||||
|
</li><br>
|
||||||
|
{%- endfor %}
|
||||||
|
{%- endmacro -%}
|
||||||
<!DOCTYPE html>
|
<!DOCTYPE html>
|
||||||
<html lang="en">
|
<html lang="en">
|
||||||
|
|
||||||
@@ -6,7 +28,7 @@
|
|||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
<title>{{ title }}</title>
|
<title>{{ title }}</title>
|
||||||
{%- if webmanifest %}
|
{%- if webmanifest %}
|
||||||
<link rel="manifest" href="/.static/manifest.json">
|
<link rel="manifest" href="/.static/manifest.webmanifest">
|
||||||
{%- endif %}
|
{%- endif %}
|
||||||
<link rel="preload" href="{{ stylesheet }}" as="style">
|
<link rel="preload" href="{{ stylesheet }}" as="style">
|
||||||
{%- if theme %}
|
{%- if theme %}
|
||||||
@@ -21,37 +43,59 @@
|
|||||||
<link rel="preload" href="{{ root }}.static/pswp/default-skin/default-skin.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.min.js">
|
||||||
<link rel="modulepreload" href="{{ root }}.static/pswp/photoswipe-ui-default.min.js">
|
<link rel="modulepreload" href="{{ root }}.static/pswp/photoswipe-ui-default.min.js">
|
||||||
{%- if images %}
|
<link rel="modulepreload" href="{{ root }}.static/functionality.min.js">
|
||||||
<link rel="stylesheet" href="{{ root }}.static/pswp/photoswipe.css">
|
<link rel="stylesheet" href="{{ root }}.static/pswp/photoswipe.css">
|
||||||
<link rel="stylesheet" href="{{ root }}.static/pswp/default-skin/default-skin.css">
|
<link rel="stylesheet" href="{{ root }}.static/pswp/default-skin/default-skin.css">
|
||||||
<script src="{{ root }}.static/pswp/photoswipe.min.js"></script>
|
<script src="{{ root }}.static/pswp/photoswipe.min.js"></script>
|
||||||
<script src="{{ root }}.static/pswp/photoswipe-ui-default.min.js"></script>
|
<script src="{{ root }}.static/pswp/photoswipe-ui-default.min.js"></script>
|
||||||
{%- endif %}
|
<script src="{{ root }}.static/functionality.min.js"></script>
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body>
|
<body>
|
||||||
<div class="header">
|
<div class="header">
|
||||||
<ul class="navbar">
|
<ol class="navbar">
|
||||||
|
<div class="navleft">
|
||||||
<li><a href="{{ root }}">Home</a></li>
|
<li><a href="{{ root }}">Home</a></li>
|
||||||
{%- if parent %}
|
{%- if parent %}
|
||||||
<li><a href="{{ parent }}">Parent Directory</a></li>
|
<li><a href="{{ parent }}">Parent Directory</a></li>
|
||||||
{%- endif %}
|
{%- endif %}
|
||||||
{%- if info %}
|
{%- if info %}
|
||||||
<li class="tooltip"><a>Info</a><span class="tooltiptext">
|
<li class="tooltip"><a>Info</a><span class="tooltiptext infotext">
|
||||||
{%- for infoline in info -%}
|
{%- for infoline in info -%}
|
||||||
{{ infoline }}<br />
|
{{ infoline }}<br />
|
||||||
{%- endfor -%}
|
{%- endfor -%}
|
||||||
</span></li>
|
</span></li>
|
||||||
{%- endif %}
|
{%- endif %}
|
||||||
|
</div>
|
||||||
|
<div class="navcenter">
|
||||||
<li class="title"><span class="header">{{ header }}</span></li>
|
<li class="title"><span class="header">{{ header }}</span></li>
|
||||||
|
</div>
|
||||||
|
<div class="navright">
|
||||||
|
{% if tags %}
|
||||||
|
<li class="tooltip">
|
||||||
|
<a id="tagtogglelink">Filter by Tags <svg width="0.8em" height="0.8em" viewBox="0 0 129.87601 129.87624">
|
||||||
|
<g id="layer1" transform="translate(-33.816833,-52.685642)">
|
||||||
|
<path stroke="currentColor" style="fill:none;stroke-width:20;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1"
|
||||||
|
d="M 54.476483,95.484647 98.754836,139.76308 143.03319,95.484647" id="path1" />
|
||||||
|
</g>
|
||||||
|
</svg></a>
|
||||||
|
<ol class="tooltiptext tagdropdown" id="tagdropdown">
|
||||||
|
<span class="tagentry" id="reset-filter"><label>reset filter</label></span>
|
||||||
|
<span class="tagentry">
|
||||||
|
<label>
|
||||||
|
<input type="checkbox" id="recursive" />recursive filter
|
||||||
|
</label>
|
||||||
|
</span>
|
||||||
|
{{ render_tags(tags, '') }}
|
||||||
|
</ol>
|
||||||
|
</li>
|
||||||
|
{% endif %}
|
||||||
{%- if licensefile %}
|
{%- if licensefile %}
|
||||||
<li class="license"><a href="{{ licensefile }}">License</a></li>
|
<li class="license"><a href="{{ licensefile }}">License</a></li>
|
||||||
{%- endif %}
|
{%- endif %}
|
||||||
</ul>
|
</div>
|
||||||
|
</ol>
|
||||||
{% if subdirectories %}
|
{% if subdirectories %}
|
||||||
{%- for subdirectory in subdirectories %}
|
|
||||||
<link rel="preload" href="{{ subdirectory.url }}/index.html" type="text/html">
|
|
||||||
{%- endfor %}
|
|
||||||
<div class="folders">
|
<div class="folders">
|
||||||
{%- for subdirectory in subdirectories %}
|
{%- for subdirectory in subdirectories %}
|
||||||
<a href="{{ subdirectory.url }}">
|
<a href="{{ subdirectory.url }}">
|
||||||
@@ -67,27 +111,8 @@
|
|||||||
</div>
|
</div>
|
||||||
{%- endif %}
|
{%- endif %}
|
||||||
</div>
|
</div>
|
||||||
{% if images %}
|
<div class="row" id="imagelist">
|
||||||
{%- set ns = namespace(count = 0) -%}
|
|
||||||
<div class="row">
|
|
||||||
{%- for image in images %}
|
|
||||||
<div class="column">
|
|
||||||
<figure>
|
|
||||||
<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 %}
|
|
||||||
<a href="{{ image.tiff }}">TIFF</a>
|
|
||||||
{%- endif %}
|
|
||||||
{%- if image.raw %}
|
|
||||||
<a href="{{ image.raw }}">RAW</a>
|
|
||||||
{%- endif %}
|
|
||||||
</figcaption>
|
|
||||||
</figure>
|
|
||||||
</div>
|
</div>
|
||||||
{%- endfor %}
|
|
||||||
</div>
|
|
||||||
{%- endif %}
|
|
||||||
{% if license %}
|
{% if license %}
|
||||||
{%- if 'CC' in license.type %}
|
{%- if 'CC' in license.type %}
|
||||||
<div class="footer" xmlns:cc="http://creativecommons.org/ns#" xmlns:dct="http://purl.org/dc/terms/">
|
<div class="footer" xmlns:cc="http://creativecommons.org/ns#" xmlns:dct="http://purl.org/dc/terms/">
|
||||||
@@ -108,17 +133,16 @@
|
|||||||
{%- endif %}
|
{%- endif %}
|
||||||
<span class="attribution">Made with <a href="https://github.com/greflm13/StaticGalleryBuilder" target="_blank" rel="noopener noreferrer">StaticGalleryBuilder {{ version }}</a> by <a
|
<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>
|
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>
|
<button type="button" id="totop" title="Back to Top">Back to Top</button>
|
||||||
</div>
|
</div>
|
||||||
{%- endif %}
|
{%- endif %}
|
||||||
{%- else %}
|
{%- else %}
|
||||||
<div class="footer">
|
<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
|
<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>
|
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>
|
<button type="button" id="totop" title="Back to Top">Back to Top</button>
|
||||||
</div>
|
</div>
|
||||||
{%- endif %}
|
{%- endif %}
|
||||||
{% if images %}
|
|
||||||
<div class="pswp" tabindex="-1" role="dialog" aria-hidden="true">
|
<div class="pswp" tabindex="-1" role="dialog" aria-hidden="true">
|
||||||
<div class="pswp__bg"></div>
|
<div class="pswp__bg"></div>
|
||||||
<div class="pswp__scroll-wrap">
|
<div class="pswp__scroll-wrap">
|
||||||
@@ -155,67 +179,9 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<script>
|
|
||||||
var pswpElement = document.querySelectorAll('.pswp')[0];
|
|
||||||
var items = [
|
|
||||||
{%- 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 %}
|
|
||||||
{ src: "{{ image.url }}", w: {{ image.width }}, h: {{ image.height }}, msrc: "{{ image.thumbnail }}" },
|
|
||||||
{%- endif %}
|
|
||||||
{%- endfor %}
|
|
||||||
];
|
|
||||||
var re = /pid=(\d+)/;
|
|
||||||
var controllers = {}
|
|
||||||
|
|
||||||
function openSwipe(img) {
|
|
||||||
var options = {
|
|
||||||
index: img
|
|
||||||
};
|
|
||||||
var gallery = new PhotoSwipe(pswpElement, PhotoSwipeUI_Default, items, options);
|
|
||||||
gallery.init();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (re.test(window.location.href)) {
|
|
||||||
var pid = window.location.href.match(re)[1];
|
|
||||||
openSwipe(parseInt(pid));
|
|
||||||
}
|
|
||||||
|
|
||||||
let totopbutton = document.getElementById("totop");
|
|
||||||
|
|
||||||
window.onscroll = function () { scrollFunction() };
|
|
||||||
|
|
||||||
function scrollFunction() {
|
|
||||||
if (document.body.scrollTop > 20 || document.documentElement.scrollTop > 20) {
|
|
||||||
totopbutton.style.display = "block";
|
|
||||||
} else {
|
|
||||||
totopbutton.style.display = "none";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
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>
|
</body>
|
||||||
|
<script>
|
||||||
|
new PhotoGallery();
|
||||||
|
</script>
|
||||||
|
|
||||||
</html>
|
</html>
|
||||||
@@ -21,13 +21,16 @@
|
|||||||
|
|
||||||
<body>
|
<body>
|
||||||
<div class="header">
|
<div class="header">
|
||||||
<ul class="navbar">
|
<ol class="navbar">
|
||||||
|
<div class="navleft">
|
||||||
<li><a href="{{ root }}">Home</a></li>
|
<li><a href="{{ root }}">Home</a></li>
|
||||||
{%- if parent %}
|
{%- if parent %}
|
||||||
<li><a href="{{ parent }}">Parent Directory</a></li>
|
<li><a href="{{ parent }}">Parent Directory</a></li>
|
||||||
{%- endif %}
|
{%- endif %}
|
||||||
|
</div>
|
||||||
|
<div class="navcenter">
|
||||||
<li class="title"><span class="header">{{ header }}</span></li>
|
<li class="title"><span class="header">{{ header }}</span></li>
|
||||||
</ul>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{%- if licensefile %}
|
{%- if licensefile %}
|
||||||
<div class="licensefile">
|
<div class="licensefile">
|
||||||
@@ -54,14 +57,14 @@
|
|||||||
{%- endif %}
|
{%- endif %}
|
||||||
<span class="attribution">Made with <a href="https://github.com/greflm13/StaticGalleryBuilder" target="_blank" rel="noopener noreferrer">StaticGalleryBuilder {{ version }}</a> by <a
|
<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>
|
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>
|
<button type="button" onclick="topFunction()" id="totop" title="Back to Top">Back to Top</button>
|
||||||
</div>
|
</div>
|
||||||
{%- endif %}
|
{%- endif %}
|
||||||
{%- else %}
|
{%- else %}
|
||||||
<div class="footer">
|
<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
|
<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>
|
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>
|
<button type="button" onclick="topFunction()" id="totop" title="Back to Top">Back to Top</button>
|
||||||
</div>
|
</div>
|
||||||
{%- endif %}
|
{%- endif %}
|
||||||
</body>
|
</body>
|
||||||
BIN
test/example/DSC00009.jpg
Normal file
|
After Width: | Height: | Size: 28 MiB |
7
test/example/DSC00009.jpg.xmp
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<x:xmpmeta x:xmptk="XMP Core 4.4.0-Exiv2" xmlns:x="adobe:ns:meta/">
|
||||||
|
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
|
||||||
|
<rdf:Description rdf:about="" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:exif="http://ns.adobe.com/exif/1.0/" xmlns:lr="http://ns.adobe.com/lightroom/1.0/" xmlns:xmp="http://ns.adobe.com/xap/1.0/" xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/" xmpMM:DerivedFrom="DSC00009.jpg">
|
||||||
|
<dc:subject><rdf:Bag><rdf:li>st</rdf:li><rdf:li>aqueduct</rdf:li><rdf:li>arch</rdf:li><rdf:li>arch bridge</rdf:li><rdf:li>bridge</rdf:li><rdf:li>hillside</rdf:li><rdf:li>passenger train</rdf:li><rdf:li>railroad</rdf:li><rdf:li>railroad bridge</rdf:li><rdf:li>span</rdf:li><rdf:li>train track</rdf:li><rdf:li>tree</rdf:li><rdf:li>viaduct</rdf:li></rdf:Bag></dc:subject><lr:hierarchicalSubject><rdf:Bag><rdf:li>st|aqueduct</rdf:li><rdf:li>st|arch</rdf:li><rdf:li>st|arch bridge</rdf:li><rdf:li>st|bridge</rdf:li><rdf:li>st|hillside</rdf:li><rdf:li>st|passenger train</rdf:li><rdf:li>st|railroad</rdf:li><rdf:li>st|railroad bridge</rdf:li><rdf:li>st|span</rdf:li><rdf:li>st|train track</rdf:li><rdf:li>st|tree</rdf:li><rdf:li>st|viaduct</rdf:li></rdf:Bag></lr:hierarchicalSubject></rdf:Description>
|
||||||
|
</rdf:RDF>
|
||||||
|
</x:xmpmeta>
|
||||||
39
test/example/DSC03470.JPG.xmp
Normal file
@@ -0,0 +1,39 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<x:xmpmeta x:xmptk="XMP Core 4.4.0-Exiv2" xmlns:x="adobe:ns:meta/">
|
||||||
|
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
|
||||||
|
<rdf:Description rdf:about="" xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||||
|
xmlns:exif="http://ns.adobe.com/exif/1.0/" xmlns:lr="http://ns.adobe.com/lightroom/1.0/"
|
||||||
|
xmlns:xmp="http://ns.adobe.com/xap/1.0/" xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/"
|
||||||
|
xmpMM:DerivedFrom="DSC03470.JPG">
|
||||||
|
<dc:subject>
|
||||||
|
<rdf:Bag>
|
||||||
|
<rdf:li>st</rdf:li>
|
||||||
|
<rdf:li>bus</rdf:li>
|
||||||
|
<rdf:li>illuminate</rdf:li>
|
||||||
|
<rdf:li>neon</rdf:li>
|
||||||
|
<rdf:li>neon light</rdf:li>
|
||||||
|
<rdf:li>night</rdf:li>
|
||||||
|
<rdf:li>sign</rdf:li>
|
||||||
|
<rdf:li>train car</rdf:li>
|
||||||
|
<rdf:li>trolley</rdf:li>
|
||||||
|
<rdf:li>window</rdf:li>
|
||||||
|
<rdf:li>train</rdf:li>
|
||||||
|
</rdf:Bag>
|
||||||
|
</dc:subject>
|
||||||
|
<lr:hierarchicalSubject>
|
||||||
|
<rdf:Bag>
|
||||||
|
<rdf:li>st|bus</rdf:li>
|
||||||
|
<rdf:li>st|illuminate</rdf:li>
|
||||||
|
<rdf:li>st|neon</rdf:li>
|
||||||
|
<rdf:li>st|neon light</rdf:li>
|
||||||
|
<rdf:li>st|night</rdf:li>
|
||||||
|
<rdf:li>st|sign</rdf:li>
|
||||||
|
<rdf:li>st|train car</rdf:li>
|
||||||
|
<rdf:li>st|trolley</rdf:li>
|
||||||
|
<rdf:li>st|window</rdf:li>
|
||||||
|
<rdf:li>st|train</rdf:li>
|
||||||
|
</rdf:Bag>
|
||||||
|
</lr:hierarchicalSubject>
|
||||||
|
</rdf:Description>
|
||||||
|
</rdf:RDF>
|
||||||
|
</x:xmpmeta>
|
||||||
7
test/example/DSC03508.ARW.xmp
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<x:xmpmeta x:xmptk="XMP Core 4.4.0-Exiv2" xmlns:x="adobe:ns:meta/">
|
||||||
|
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
|
||||||
|
<rdf:Description rdf:about="" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:exif="http://ns.adobe.com/exif/1.0/" xmlns:lr="http://ns.adobe.com/lightroom/1.0/" xmlns:xmp="http://ns.adobe.com/xap/1.0/" xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/" xmpMM:DerivedFrom="DSC03508.ARW">
|
||||||
|
<dc:subject><rdf:Bag><rdf:li>st</rdf:li><rdf:li>building</rdf:li><rdf:li>ceiling</rdf:li><rdf:li>pillar</rdf:li><rdf:li>display</rdf:li><rdf:li>rail</rdf:li><rdf:li>steam engine</rdf:li><rdf:li>steam locomotive</rdf:li><rdf:li>train</rdf:li><rdf:li>train car</rdf:li><rdf:li>train track</rdf:li></rdf:Bag></dc:subject><lr:hierarchicalSubject><rdf:Bag><rdf:li>st|building</rdf:li><rdf:li>st|ceiling</rdf:li><rdf:li>st|pillar</rdf:li><rdf:li>st|display</rdf:li><rdf:li>st|rail</rdf:li><rdf:li>st|steam engine</rdf:li><rdf:li>st|steam locomotive</rdf:li><rdf:li>st|train</rdf:li><rdf:li>st|train car</rdf:li><rdf:li>st|train track</rdf:li></rdf:Bag></lr:hierarchicalSubject></rdf:Description>
|
||||||
|
</rdf:RDF>
|
||||||
|
</x:xmpmeta>
|
||||||
49
test/example/DSC03508.JPG.xmp
Normal file
@@ -0,0 +1,49 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<x:xmpmeta x:xmptk="XMP Core 4.4.0-Exiv2" xmlns:x="adobe:ns:meta/">
|
||||||
|
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
|
||||||
|
<rdf:Description rdf:about="" xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||||
|
xmlns:exif="http://ns.adobe.com/exif/1.0/" xmlns:lr="http://ns.adobe.com/lightroom/1.0/"
|
||||||
|
xmlns:xmp="http://ns.adobe.com/xap/1.0/" xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/"
|
||||||
|
xmpMM:DerivedFrom="DSC03508.JPG">
|
||||||
|
<dc:subject>
|
||||||
|
<rdf:Bag>
|
||||||
|
<rdf:li>st</rdf:li>
|
||||||
|
<rdf:li>attach</rdf:li>
|
||||||
|
<rdf:li>basement</rdf:li>
|
||||||
|
<rdf:li>beam</rdf:li>
|
||||||
|
<rdf:li>building</rdf:li>
|
||||||
|
<rdf:li>ceiling</rdf:li>
|
||||||
|
<rdf:li>equipment</rdf:li>
|
||||||
|
<rdf:li>floor</rdf:li>
|
||||||
|
<rdf:li>pipe</rdf:li>
|
||||||
|
<rdf:li>red</rdf:li>
|
||||||
|
<rdf:li>room</rdf:li>
|
||||||
|
<rdf:li>scaffold</rdf:li>
|
||||||
|
<rdf:li>tube</rdf:li>
|
||||||
|
<rdf:li>warehouse</rdf:li>
|
||||||
|
<rdf:li>water pipe</rdf:li>
|
||||||
|
<rdf:li>train</rdf:li>
|
||||||
|
</rdf:Bag>
|
||||||
|
</dc:subject>
|
||||||
|
<lr:hierarchicalSubject>
|
||||||
|
<rdf:Bag>
|
||||||
|
<rdf:li>st|attach</rdf:li>
|
||||||
|
<rdf:li>st|basement</rdf:li>
|
||||||
|
<rdf:li>st|beam</rdf:li>
|
||||||
|
<rdf:li>st|building</rdf:li>
|
||||||
|
<rdf:li>st|ceiling</rdf:li>
|
||||||
|
<rdf:li>st|equipment</rdf:li>
|
||||||
|
<rdf:li>st|floor</rdf:li>
|
||||||
|
<rdf:li>st|pipe</rdf:li>
|
||||||
|
<rdf:li>st|red</rdf:li>
|
||||||
|
<rdf:li>st|room</rdf:li>
|
||||||
|
<rdf:li>st|scaffold</rdf:li>
|
||||||
|
<rdf:li>st|tube</rdf:li>
|
||||||
|
<rdf:li>st|warehouse</rdf:li>
|
||||||
|
<rdf:li>st|water pipe</rdf:li>
|
||||||
|
<rdf:li>st|train</rdf:li>
|
||||||
|
</rdf:Bag>
|
||||||
|
</lr:hierarchicalSubject>
|
||||||
|
</rdf:Description>
|
||||||
|
</rdf:RDF>
|
||||||
|
</x:xmpmeta>
|
||||||
35
test/example/example.jpg.xmp
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<x:xmpmeta x:xmptk="XMP Core 4.4.0-Exiv2" xmlns:x="adobe:ns:meta/">
|
||||||
|
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
|
||||||
|
<rdf:Description rdf:about="" xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||||
|
xmlns:exif="http://ns.adobe.com/exif/1.0/" xmlns:lr="http://ns.adobe.com/lightroom/1.0/"
|
||||||
|
xmlns:xmp="http://ns.adobe.com/xap/1.0/" xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/"
|
||||||
|
xmpMM:DerivedFrom="example.jpg">
|
||||||
|
<dc:subject>
|
||||||
|
<rdf:Bag>
|
||||||
|
<rdf:li>st</rdf:li>
|
||||||
|
<rdf:li>cloudy</rdf:li>
|
||||||
|
<rdf:li>evening sky</rdf:li>
|
||||||
|
<rdf:li>sea</rdf:li>
|
||||||
|
<rdf:li>sky</rdf:li>
|
||||||
|
<rdf:li>storm cloud</rdf:li>
|
||||||
|
<rdf:li>stormy</rdf:li>
|
||||||
|
<rdf:li>sun</rdf:li>
|
||||||
|
<rdf:li>sunset</rdf:li>
|
||||||
|
</rdf:Bag>
|
||||||
|
</dc:subject>
|
||||||
|
<lr:hierarchicalSubject>
|
||||||
|
<rdf:Bag>
|
||||||
|
<rdf:li>st|cloudy</rdf:li>
|
||||||
|
<rdf:li>st|evening sky</rdf:li>
|
||||||
|
<rdf:li>st|sea</rdf:li>
|
||||||
|
<rdf:li>st|sky</rdf:li>
|
||||||
|
<rdf:li>st|storm cloud</rdf:li>
|
||||||
|
<rdf:li>st|stormy</rdf:li>
|
||||||
|
<rdf:li>st|sun</rdf:li>
|
||||||
|
<rdf:li>st|sunset</rdf:li>
|
||||||
|
</rdf:Bag>
|
||||||
|
</lr:hierarchicalSubject>
|
||||||
|
</rdf:Description>
|
||||||
|
</rdf:RDF>
|
||||||
|
</x:xmpmeta>
|
||||||
7
test/example/example.tif.xmp
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<x:xmpmeta x:xmptk="XMP Core 4.4.0-Exiv2" xmlns:x="adobe:ns:meta/">
|
||||||
|
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
|
||||||
|
<rdf:Description rdf:about="" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:exif="http://ns.adobe.com/exif/1.0/" xmlns:lr="http://ns.adobe.com/lightroom/1.0/" xmlns:xmp="http://ns.adobe.com/xap/1.0/" xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/" xmpMM:DerivedFrom="example.tif">
|
||||||
|
<dc:subject><rdf:Bag><rdf:li>st</rdf:li><rdf:li>cloud</rdf:li><rdf:li>cloudy</rdf:li><rdf:li>evening sky</rdf:li><rdf:li>sea</rdf:li><rdf:li>sky</rdf:li><rdf:li>storm cloud</rdf:li><rdf:li>stormy</rdf:li><rdf:li>sun</rdf:li><rdf:li>sunset</rdf:li></rdf:Bag></dc:subject><lr:hierarchicalSubject><rdf:Bag><rdf:li>st|cloud</rdf:li><rdf:li>st|cloudy</rdf:li><rdf:li>st|evening sky</rdf:li><rdf:li>st|sea</rdf:li><rdf:li>st|sky</rdf:li><rdf:li>st|storm cloud</rdf:li><rdf:li>st|stormy</rdf:li><rdf:li>st|sun</rdf:li><rdf:li>st|sunset</rdf:li></rdf:Bag></lr:hierarchicalSubject></rdf:Description>
|
||||||
|
</rdf:RDF>
|
||||||
|
</x:xmpmeta>
|
||||||
@@ -1,467 +0,0 @@
|
|||||||
<!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>
|
|
||||||
BIN
test/example/subfolder/DSC01106.jpg
Normal file
|
After Width: | Height: | Size: 3.5 MiB |
30
test/example/subfolder/DSC01106.jpg.xmp
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<x:xmpmeta x:xmptk="XMP Core 4.4.0-Exiv2" xmlns:x="adobe:ns:meta/">
|
||||||
|
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
|
||||||
|
<rdf:Description rdf:about="" xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||||
|
xmlns:exif="http://ns.adobe.com/exif/1.0/" xmlns:lr="http://ns.adobe.com/lightroom/1.0/"
|
||||||
|
xmlns:xmp="http://ns.adobe.com/xap/1.0/" xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/"
|
||||||
|
xmpMM:DerivedFrom="DSC01106.jpg">
|
||||||
|
<dc:subject>
|
||||||
|
<rdf:Bag>
|
||||||
|
<rdf:li>st</rdf:li>
|
||||||
|
<rdf:li>clear</rdf:li>
|
||||||
|
<rdf:li>dark</rdf:li>
|
||||||
|
<rdf:li>moon</rdf:li>
|
||||||
|
<rdf:li>night</rdf:li>
|
||||||
|
<rdf:li>night sky</rdf:li>
|
||||||
|
<rdf:li>sky</rdf:li>
|
||||||
|
</rdf:Bag>
|
||||||
|
</dc:subject>
|
||||||
|
<lr:hierarchicalSubject>
|
||||||
|
<rdf:Bag>
|
||||||
|
<rdf:li>st|clear</rdf:li>
|
||||||
|
<rdf:li>st|dark</rdf:li>
|
||||||
|
<rdf:li>st|moon</rdf:li>
|
||||||
|
<rdf:li>st|night</rdf:li>
|
||||||
|
<rdf:li>st|sky|night sky</rdf:li>
|
||||||
|
</rdf:Bag>
|
||||||
|
</lr:hierarchicalSubject>
|
||||||
|
</rdf:Description>
|
||||||
|
</rdf:RDF>
|
||||||
|
</x:xmpmeta>
|
||||||
|
After Width: | Height: | Size: 7.3 MiB |
@@ -0,0 +1,25 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<x:xmpmeta x:xmptk="XMP Core 4.4.0-Exiv2" xmlns:x="adobe:ns:meta/">
|
||||||
|
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
|
||||||
|
<rdf:Description rdf:about="" xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||||
|
xmlns:exif="http://ns.adobe.com/exif/1.0/" xmlns:lr="http://ns.adobe.com/lightroom/1.0/"
|
||||||
|
xmlns:xmp="http://ns.adobe.com/xap/1.0/" xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/"
|
||||||
|
xmpMM:DerivedFrom="000041900001.jpg">
|
||||||
|
<dc:subject>
|
||||||
|
<rdf:Bag>
|
||||||
|
<rdf:li>st</rdf:li>
|
||||||
|
<rdf:li>cloud</rdf:li>
|
||||||
|
<rdf:li>fly</rdf:li>
|
||||||
|
<rdf:li>sky</rdf:li>
|
||||||
|
</rdf:Bag>
|
||||||
|
</dc:subject>
|
||||||
|
<lr:hierarchicalSubject>
|
||||||
|
<rdf:Bag>
|
||||||
|
<rdf:li>st|cloud</rdf:li>
|
||||||
|
<rdf:li>st|fly</rdf:li>
|
||||||
|
<rdf:li>st|sky</rdf:li>
|
||||||
|
</rdf:Bag>
|
||||||
|
</lr:hierarchicalSubject>
|
||||||
|
</rdf:Description>
|
||||||
|
</rdf:RDF>
|
||||||
|
</x:xmpmeta>
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<x:xmpmeta x:xmptk="XMP Core 4.4.0-Exiv2" xmlns:x="adobe:ns:meta/">
|
||||||
|
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
|
||||||
|
<rdf:Description rdf:about="" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:exif="http://ns.adobe.com/exif/1.0/" xmlns:lr="http://ns.adobe.com/lightroom/1.0/" xmlns:xmp="http://ns.adobe.com/xap/1.0/" xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/" xmpMM:DerivedFrom="000041900001.tif">
|
||||||
|
<dc:subject><rdf:Bag><rdf:li>st</rdf:li><rdf:li>cloud</rdf:li><rdf:li>cloudy</rdf:li><rdf:li>fly</rdf:li><rdf:li>sky</rdf:li></rdf:Bag></dc:subject><lr:hierarchicalSubject><rdf:Bag><rdf:li>st|cloud</rdf:li><rdf:li>st|cloudy</rdf:li><rdf:li>st|fly</rdf:li><rdf:li>st|sky</rdf:li></rdf:Bag></lr:hierarchicalSubject></rdf:Description>
|
||||||
|
</rdf:RDF>
|
||||||
|
</x:xmpmeta>
|
||||||
@@ -97,6 +97,14 @@ body {
|
|||||||
background-color: var(--color6);
|
background-color: var(--color6);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.tagentry label:hover {
|
||||||
|
background-color: var(--color3);
|
||||||
|
}
|
||||||
|
|
||||||
|
.tagentry .tagtoggle:hover {
|
||||||
|
background-color: var(--color3);
|
||||||
|
}
|
||||||
|
|
||||||
.column img {
|
.column img {
|
||||||
background-color: var(--bcolor2);
|
background-color: var(--bcolor2);
|
||||||
}
|
}
|
||||||
@@ -110,3 +118,23 @@ body {
|
|||||||
color: var(--bcolor1);
|
color: var(--bcolor1);
|
||||||
font-weight: 600;
|
font-weight: 600;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.loader {
|
||||||
|
width: 48px;
|
||||||
|
height: 48px;
|
||||||
|
border-radius: 50%;
|
||||||
|
display: inline-block;
|
||||||
|
border-top: 3px solid var(--bcolor1);
|
||||||
|
border-right: 3px solid transparent;
|
||||||
|
box-sizing: border-box;
|
||||||
|
animation: rotation 1s linear infinite;
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes rotation {
|
||||||
|
0% {
|
||||||
|
transform: rotate(0deg);
|
||||||
|
}
|
||||||
|
100% {
|
||||||
|
transform: rotate(360deg);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -96,6 +96,14 @@ body {
|
|||||||
background-color: var(--color3);
|
background-color: var(--color3);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.tagentry label:hover {
|
||||||
|
background-color: var(--color7);
|
||||||
|
}
|
||||||
|
|
||||||
|
.tagentry .tagtoggle:hover {
|
||||||
|
background-color: var(--color7);
|
||||||
|
}
|
||||||
|
|
||||||
.column img {
|
.column img {
|
||||||
background-color: var(--bcolor1);
|
background-color: var(--bcolor1);
|
||||||
}
|
}
|
||||||
@@ -109,3 +117,23 @@ body {
|
|||||||
color: var(--bcolor2);
|
color: var(--bcolor2);
|
||||||
font-weight: 600;
|
font-weight: 600;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.loader {
|
||||||
|
width: 48px;
|
||||||
|
height: 48px;
|
||||||
|
border-radius: 50%;
|
||||||
|
display: inline-block;
|
||||||
|
border-top: 3px solid var(--bcolor2);
|
||||||
|
border-right: 3px solid transparent;
|
||||||
|
box-sizing: border-box;
|
||||||
|
animation: rotation 1s linear infinite;
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes rotation {
|
||||||
|
0% {
|
||||||
|
transform: rotate(0deg);
|
||||||
|
}
|
||||||
|
100% {
|
||||||
|
transform: rotate(360deg);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -74,6 +74,14 @@
|
|||||||
background-color: var(--bcolor1);
|
background-color: var(--bcolor1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.tagentry label:hover {
|
||||||
|
background-color: var(--bcolor3);
|
||||||
|
}
|
||||||
|
|
||||||
|
.tagentry .tagtoggle:hover {
|
||||||
|
background-color: var(--bcolor3);
|
||||||
|
}
|
||||||
|
|
||||||
.column img {
|
.column img {
|
||||||
background-color: var(--bcolor1);
|
background-color: var(--bcolor1);
|
||||||
}
|
}
|
||||||
@@ -88,6 +96,52 @@
|
|||||||
font-weight: 600;
|
font-weight: 600;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.loader {
|
||||||
|
width: 48px;
|
||||||
|
height: 48px;
|
||||||
|
border-radius: 50%;
|
||||||
|
position: relative;
|
||||||
|
animation: rotate 1s linear infinite
|
||||||
|
}
|
||||||
|
|
||||||
|
.loader::before {
|
||||||
|
content: "";
|
||||||
|
box-sizing: border-box;
|
||||||
|
position: absolute;
|
||||||
|
inset: 0px;
|
||||||
|
border-radius: 50%;
|
||||||
|
border: 5px solid var(--bcolor2);
|
||||||
|
animation: prixClipFix 2s linear infinite;
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes rotate {
|
||||||
|
100% {
|
||||||
|
transform: rotate(360deg)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes prixClipFix {
|
||||||
|
0% {
|
||||||
|
clip-path: polygon(50% 50%, 0 0, 0 0, 0 0, 0 0, 0 0)
|
||||||
|
}
|
||||||
|
|
||||||
|
25% {
|
||||||
|
clip-path: polygon(50% 50%, 0 0, 100% 0, 100% 0, 100% 0, 100% 0)
|
||||||
|
}
|
||||||
|
|
||||||
|
50% {
|
||||||
|
clip-path: polygon(50% 50%, 0 0, 100% 0, 100% 100%, 100% 100%, 100% 100%)
|
||||||
|
}
|
||||||
|
|
||||||
|
75% {
|
||||||
|
clip-path: polygon(50% 50%, 0 0, 100% 0, 100% 100%, 0 100%, 0 100%)
|
||||||
|
}
|
||||||
|
|
||||||
|
100% {
|
||||||
|
clip-path: polygon(50% 50%, 0 0, 100% 0, 100% 100%, 0 100%, 0 0)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
body {
|
body {
|
||||||
color: var(--bcolor2);
|
color: var(--bcolor2);
|
||||||
background-color: var(--bcolor3);
|
background-color: var(--bcolor3);
|
||||||
|
|||||||
@@ -74,6 +74,14 @@
|
|||||||
background-color: var(--bcolor1);
|
background-color: var(--bcolor1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.tagentry label:hover {
|
||||||
|
background-color: var(--bcolor3);
|
||||||
|
}
|
||||||
|
|
||||||
|
.tagentry .tagtoggle:hover {
|
||||||
|
background-color: var(--bcolor3);
|
||||||
|
}
|
||||||
|
|
||||||
.column img {
|
.column img {
|
||||||
background-color: var(--bcolor1);
|
background-color: var(--bcolor1);
|
||||||
}
|
}
|
||||||
@@ -88,6 +96,52 @@
|
|||||||
font-weight: 600;
|
font-weight: 600;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.loader {
|
||||||
|
width: 48px;
|
||||||
|
height: 48px;
|
||||||
|
border-radius: 50%;
|
||||||
|
position: relative;
|
||||||
|
animation: rotate 1s linear infinite
|
||||||
|
}
|
||||||
|
|
||||||
|
.loader::before {
|
||||||
|
content: "";
|
||||||
|
box-sizing: border-box;
|
||||||
|
position: absolute;
|
||||||
|
inset: 0px;
|
||||||
|
border-radius: 50%;
|
||||||
|
border: 5px solid var(--bcolor2);
|
||||||
|
animation: prixClipFix 2s linear infinite;
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes rotate {
|
||||||
|
100% {
|
||||||
|
transform: rotate(360deg)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes prixClipFix {
|
||||||
|
0% {
|
||||||
|
clip-path: polygon(50% 50%, 0 0, 0 0, 0 0, 0 0, 0 0)
|
||||||
|
}
|
||||||
|
|
||||||
|
25% {
|
||||||
|
clip-path: polygon(50% 50%, 0 0, 100% 0, 100% 0, 100% 0, 100% 0)
|
||||||
|
}
|
||||||
|
|
||||||
|
50% {
|
||||||
|
clip-path: polygon(50% 50%, 0 0, 100% 0, 100% 100%, 100% 100%, 100% 100%)
|
||||||
|
}
|
||||||
|
|
||||||
|
75% {
|
||||||
|
clip-path: polygon(50% 50%, 0 0, 100% 0, 100% 100%, 0 100%, 0 100%)
|
||||||
|
}
|
||||||
|
|
||||||
|
100% {
|
||||||
|
clip-path: polygon(50% 50%, 0 0, 100% 0, 100% 100%, 0 100%, 0 0)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
body {
|
body {
|
||||||
color: var(--bcolor2);
|
color: var(--bcolor2);
|
||||||
background-color: var(--bcolor3);
|
background-color: var(--bcolor3);
|
||||||
|
|||||||
@@ -1,14 +1,22 @@
|
|||||||
@import url("https://fonts.googleapis.com/css2?family=Playfair+Display:wght@400;500;600;700;800;900&display=swap");
|
@import url("https://fonts.googleapis.com/css2?family=Playfair+Display:wght@400;500;600;700;800;900&display=swap");
|
||||||
|
|
||||||
* {
|
* {
|
||||||
--color1: #FF7F50; /* Coral */
|
--color1: #FF7F50;
|
||||||
--color2: #D2691E; /* Chocolate */
|
/* Coral */
|
||||||
--color3: #8B4513; /* SaddleBrown */
|
--color2: #D2691E;
|
||||||
--color4: #FFA07A; /* LightSalmon */
|
/* Chocolate */
|
||||||
--bcolor1: #FFF8DC; /* Cornsilk */
|
--color3: #8B4513;
|
||||||
--bcolor2: #2F4F4F; /* DarkSlateGray */
|
/* SaddleBrown */
|
||||||
--bcolor3: #3E2723; /* Darker brown */
|
--color4: #FFA07A;
|
||||||
--bcolor4: #4E342E; /* Slightly lighter brown */
|
/* LightSalmon */
|
||||||
|
--bcolor1: #FFF8DC;
|
||||||
|
/* Cornsilk */
|
||||||
|
--bcolor2: #2F4F4F;
|
||||||
|
/* DarkSlateGray */
|
||||||
|
--bcolor3: #3E2723;
|
||||||
|
/* Darker brown */
|
||||||
|
--bcolor4: #4E342E;
|
||||||
|
/* Slightly lighter brown */
|
||||||
}
|
}
|
||||||
|
|
||||||
.navbar {
|
.navbar {
|
||||||
@@ -79,6 +87,14 @@
|
|||||||
font-family: "Playfair Display", serif;
|
font-family: "Playfair Display", serif;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.tagentry label:hover {
|
||||||
|
background-color: var(--color3);
|
||||||
|
}
|
||||||
|
|
||||||
|
.tagentry .tagtoggle:hover {
|
||||||
|
background-color: var(--color3);
|
||||||
|
}
|
||||||
|
|
||||||
.column img {
|
.column img {
|
||||||
background-color: var(--bcolor4);
|
background-color: var(--bcolor4);
|
||||||
}
|
}
|
||||||
@@ -94,6 +110,54 @@
|
|||||||
font-family: "Playfair Display", serif;
|
font-family: "Playfair Display", serif;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.loader,
|
||||||
|
.loader:before,
|
||||||
|
.loader:after {
|
||||||
|
border-radius: 50%;
|
||||||
|
width: 2.5em;
|
||||||
|
height: 2.5em;
|
||||||
|
animation-fill-mode: both;
|
||||||
|
animation: bblFadInOut 1.8s infinite ease-in-out;
|
||||||
|
}
|
||||||
|
|
||||||
|
.loader {
|
||||||
|
color: var(--bcolor2);
|
||||||
|
font-size: 7px;
|
||||||
|
position: relative;
|
||||||
|
text-indent: -9999em;
|
||||||
|
transform: translateZ(0);
|
||||||
|
animation-delay: -0.16s;
|
||||||
|
}
|
||||||
|
|
||||||
|
.loader:before,
|
||||||
|
.loader:after {
|
||||||
|
content: '';
|
||||||
|
position: absolute;
|
||||||
|
top: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.loader:before {
|
||||||
|
left: -3.5em;
|
||||||
|
animation-delay: -0.32s;
|
||||||
|
}
|
||||||
|
|
||||||
|
.loader:after {
|
||||||
|
left: 3.5em;
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes bblFadInOut {
|
||||||
|
|
||||||
|
0%,
|
||||||
|
80%,
|
||||||
|
100% {
|
||||||
|
box-shadow: 0 2.5em 0 -1.3em
|
||||||
|
}
|
||||||
|
|
||||||
|
40% {
|
||||||
|
box-shadow: 0 2.5em 0 0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
body {
|
body {
|
||||||
color: var(--bcolor1);
|
color: var(--bcolor1);
|
||||||
background-color: var(--bcolor3);
|
background-color: var(--bcolor3);
|
||||||
|
|||||||
@@ -73,6 +73,14 @@
|
|||||||
background-color: var(--bcolor2);
|
background-color: var(--bcolor2);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.tagentry label:hover {
|
||||||
|
background-color: var(--bcolor4);
|
||||||
|
}
|
||||||
|
|
||||||
|
.tagentry .tagtoggle:hover {
|
||||||
|
background-color: var(--bcolor4);
|
||||||
|
}
|
||||||
|
|
||||||
.column img {
|
.column img {
|
||||||
background-color: var(--bcolor4);
|
background-color: var(--bcolor4);
|
||||||
}
|
}
|
||||||
@@ -87,6 +95,36 @@
|
|||||||
font-weight: 800;
|
font-weight: 800;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.loader {
|
||||||
|
width: 12px;
|
||||||
|
height: 12px;
|
||||||
|
border-radius: 50%;
|
||||||
|
display: block;
|
||||||
|
margin: 15px auto;
|
||||||
|
position: relative;
|
||||||
|
color: var(--color1);
|
||||||
|
box-sizing: border-box;
|
||||||
|
animation: animloader 1s linear infinite alternate;
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes animloader {
|
||||||
|
0% {
|
||||||
|
box-shadow: -38px -12px, -14px 0, 14px 0, 38px 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
33% {
|
||||||
|
box-shadow: -38px 0px, -14px -12px, 14px 0, 38px 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
66% {
|
||||||
|
box-shadow: -38px 0px, -14px 0, 14px -12px, 38px 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
100% {
|
||||||
|
box-shadow: -38px 0, -14px 0, 14px 0, 38px -12px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
body {
|
body {
|
||||||
color: var(--bcolor1);
|
color: var(--bcolor1);
|
||||||
background-color: var(--bcolor3);
|
background-color: var(--bcolor3);
|
||||||
|
|||||||
@@ -79,6 +79,14 @@
|
|||||||
font-family: "Nunito", sans-serif;
|
font-family: "Nunito", sans-serif;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.tagentry label:hover {
|
||||||
|
background-color: var(--color4);
|
||||||
|
}
|
||||||
|
|
||||||
|
.tagentry .tagtoggle:hover {
|
||||||
|
background-color: var(--color4);
|
||||||
|
}
|
||||||
|
|
||||||
.column img {
|
.column img {
|
||||||
background-color: var(--bcolor4);
|
background-color: var(--bcolor4);
|
||||||
}
|
}
|
||||||
@@ -95,6 +103,91 @@
|
|||||||
font-family: "Nunito", sans-serif;
|
font-family: "Nunito", sans-serif;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.loader {
|
||||||
|
transform: rotateZ(45deg);
|
||||||
|
perspective: 1000px;
|
||||||
|
border-radius: 50%;
|
||||||
|
width: 48px;
|
||||||
|
height: 48px;
|
||||||
|
color: var(--color1);
|
||||||
|
}
|
||||||
|
|
||||||
|
.loader:before,
|
||||||
|
.loader:after {
|
||||||
|
content: '';
|
||||||
|
display: block;
|
||||||
|
position: absolute;
|
||||||
|
top: 0;
|
||||||
|
left: 0;
|
||||||
|
width: inherit;
|
||||||
|
height: inherit;
|
||||||
|
border-radius: 50%;
|
||||||
|
transform: rotateX(70deg);
|
||||||
|
animation: 1s spin linear infinite;
|
||||||
|
}
|
||||||
|
|
||||||
|
.loader:after {
|
||||||
|
color: var(--bcolor4);
|
||||||
|
transform: rotateY(70deg);
|
||||||
|
animation-delay: .4s;
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes rotate {
|
||||||
|
0% {
|
||||||
|
transform: translate(-50%, -50%) rotateZ(0deg);
|
||||||
|
}
|
||||||
|
|
||||||
|
100% {
|
||||||
|
transform: translate(-50%, -50%) rotateZ(360deg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes rotateccw {
|
||||||
|
0% {
|
||||||
|
transform: translate(-50%, -50%) rotate(0deg);
|
||||||
|
}
|
||||||
|
|
||||||
|
100% {
|
||||||
|
transform: translate(-50%, -50%) rotate(-360deg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes spin {
|
||||||
|
|
||||||
|
0%,
|
||||||
|
100% {
|
||||||
|
box-shadow: .2em 0px 0 0px currentcolor;
|
||||||
|
}
|
||||||
|
|
||||||
|
12% {
|
||||||
|
box-shadow: .2em .2em 0 0 currentcolor;
|
||||||
|
}
|
||||||
|
|
||||||
|
25% {
|
||||||
|
box-shadow: 0 .2em 0 0px currentcolor;
|
||||||
|
}
|
||||||
|
|
||||||
|
37% {
|
||||||
|
box-shadow: -.2em .2em 0 0 currentcolor;
|
||||||
|
}
|
||||||
|
|
||||||
|
50% {
|
||||||
|
box-shadow: -.2em 0 0 0 currentcolor;
|
||||||
|
}
|
||||||
|
|
||||||
|
62% {
|
||||||
|
box-shadow: -.2em -.2em 0 0 currentcolor;
|
||||||
|
}
|
||||||
|
|
||||||
|
75% {
|
||||||
|
box-shadow: 0px -.2em 0 0 currentcolor;
|
||||||
|
}
|
||||||
|
|
||||||
|
87% {
|
||||||
|
box-shadow: .2em -.2em 0 0 currentcolor;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
body {
|
body {
|
||||||
color: var(--bcolor2);
|
color: var(--bcolor2);
|
||||||
background-color: var(--bcolor3);
|
background-color: var(--bcolor3);
|
||||||
|
|||||||
@@ -73,6 +73,14 @@
|
|||||||
background-color: var(--bcolor2);
|
background-color: var(--bcolor2);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.tagentry label:hover {
|
||||||
|
background-color: var(--bcolor4);
|
||||||
|
}
|
||||||
|
|
||||||
|
.tagentry .tagtoggle:hover {
|
||||||
|
background-color: var(--bcolor4);
|
||||||
|
}
|
||||||
|
|
||||||
.column img {
|
.column img {
|
||||||
background-color: var(--bcolor4);
|
background-color: var(--bcolor4);
|
||||||
}
|
}
|
||||||
@@ -87,6 +95,36 @@
|
|||||||
font-weight: 800;
|
font-weight: 800;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.loader {
|
||||||
|
width: 12px;
|
||||||
|
height: 12px;
|
||||||
|
border-radius: 50%;
|
||||||
|
display: block;
|
||||||
|
margin: 15px auto;
|
||||||
|
position: relative;
|
||||||
|
color: var(--color1);
|
||||||
|
box-sizing: border-box;
|
||||||
|
animation: animloader 1s linear infinite alternate;
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes animloader {
|
||||||
|
0% {
|
||||||
|
box-shadow: -38px -12px, -14px 0, 14px 0, 38px 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
33% {
|
||||||
|
box-shadow: -38px 0px, -14px -12px, 14px 0, 38px 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
66% {
|
||||||
|
box-shadow: -38px 0px, -14px 0, 14px -12px, 38px 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
100% {
|
||||||
|
box-shadow: -38px 0, -14px 0, 14px 0, 38px -12px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
body {
|
body {
|
||||||
color: var(--bcolor1);
|
color: var(--bcolor1);
|
||||||
background-color: var(--bcolor3);
|
background-color: var(--bcolor3);
|
||||||
|
|||||||
@@ -52,6 +52,14 @@
|
|||||||
background-color: var(--color3);
|
background-color: var(--color3);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.tagentry label:hover {
|
||||||
|
background-color: var(--color4);
|
||||||
|
}
|
||||||
|
|
||||||
|
.tagentry .tagtoggle:hover {
|
||||||
|
background-color: var(--color4);
|
||||||
|
}
|
||||||
|
|
||||||
.column img {
|
.column img {
|
||||||
background-color: var(--bcolor2);
|
background-color: var(--bcolor2);
|
||||||
}
|
}
|
||||||
@@ -66,6 +74,27 @@
|
|||||||
font-weight: 800;
|
font-weight: 800;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.loader {
|
||||||
|
width: 48px;
|
||||||
|
height: 48px;
|
||||||
|
border-radius: 50%;
|
||||||
|
display: inline-block;
|
||||||
|
border-top: 3px solid var(--bcolor1);
|
||||||
|
border-right: 3px solid transparent;
|
||||||
|
box-sizing: border-box;
|
||||||
|
animation: rotation 1s linear infinite;
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes rotation {
|
||||||
|
0% {
|
||||||
|
transform: rotate(0deg);
|
||||||
|
}
|
||||||
|
|
||||||
|
100% {
|
||||||
|
transform: rotate(360deg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
body {
|
body {
|
||||||
color: var(--bcolor1);
|
color: var(--bcolor1);
|
||||||
background-color: var(--color4);
|
background-color: var(--color4);
|
||||||
|
|||||||
@@ -52,6 +52,14 @@
|
|||||||
background-color: var(--color2);
|
background-color: var(--color2);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.tagentry label:hover {
|
||||||
|
background-color: var(--color4);
|
||||||
|
}
|
||||||
|
|
||||||
|
.tagentry .tagtoggle:hover {
|
||||||
|
background-color: var(--color4);
|
||||||
|
}
|
||||||
|
|
||||||
.column img {
|
.column img {
|
||||||
background-color: var(--color2);
|
background-color: var(--color2);
|
||||||
}
|
}
|
||||||
@@ -66,6 +74,27 @@
|
|||||||
font-weight: 800;
|
font-weight: 800;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.loader {
|
||||||
|
width: 48px;
|
||||||
|
height: 48px;
|
||||||
|
border-radius: 50%;
|
||||||
|
display: inline-block;
|
||||||
|
border-top: 3px solid var(--bcolor2);
|
||||||
|
border-right: 3px solid transparent;
|
||||||
|
box-sizing: border-box;
|
||||||
|
animation: rotation 1s linear infinite;
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes rotation {
|
||||||
|
0% {
|
||||||
|
transform: rotate(0deg);
|
||||||
|
}
|
||||||
|
|
||||||
|
100% {
|
||||||
|
transform: rotate(360deg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
body {
|
body {
|
||||||
color: var(--bcolor2);
|
color: var(--bcolor2);
|
||||||
background-color: var(--bcolor1);
|
background-color: var(--bcolor1);
|
||||||
|
|||||||
@@ -73,6 +73,14 @@
|
|||||||
background-color: var(--bcolor2);
|
background-color: var(--bcolor2);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.tagentry label:hover {
|
||||||
|
background-color: var(--bcolor4);
|
||||||
|
}
|
||||||
|
|
||||||
|
.tagentry .tagtoggle:hover {
|
||||||
|
background-color: var(--bcolor4);
|
||||||
|
}
|
||||||
|
|
||||||
.column img {
|
.column img {
|
||||||
background-color: var(--bcolor4);
|
background-color: var(--bcolor4);
|
||||||
}
|
}
|
||||||
@@ -85,6 +93,36 @@
|
|||||||
background-color: var(--color1);
|
background-color: var(--color1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.loader {
|
||||||
|
width: 12px;
|
||||||
|
height: 12px;
|
||||||
|
border-radius: 50%;
|
||||||
|
display: block;
|
||||||
|
margin: 15px auto;
|
||||||
|
position: relative;
|
||||||
|
color: var(--color1);
|
||||||
|
box-sizing: border-box;
|
||||||
|
animation: animloader 1s linear infinite alternate;
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes animloader {
|
||||||
|
0% {
|
||||||
|
box-shadow: -38px -12px, -14px 0, 14px 0, 38px 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
33% {
|
||||||
|
box-shadow: -38px 0px, -14px -12px, 14px 0, 38px 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
66% {
|
||||||
|
box-shadow: -38px 0px, -14px 0, 14px -12px, 38px 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
100% {
|
||||||
|
box-shadow: -38px 0, -14px 0, 14px 0, 38px -12px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
body {
|
body {
|
||||||
color: var(--bcolor1);
|
color: var(--bcolor1);
|
||||||
background-color: var(--bcolor3);
|
background-color: var(--bcolor3);
|
||||||
|
|||||||
@@ -72,6 +72,14 @@
|
|||||||
background-color: var(--color3);
|
background-color: var(--color3);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.tagentry label:hover {
|
||||||
|
background-color: var(--color2);
|
||||||
|
}
|
||||||
|
|
||||||
|
.tagentry .tagtoggle:hover {
|
||||||
|
background-color: var(--color2);
|
||||||
|
}
|
||||||
|
|
||||||
.column img {
|
.column img {
|
||||||
background-color: var(--bcolor3);
|
background-color: var(--bcolor3);
|
||||||
}
|
}
|
||||||
@@ -86,6 +94,36 @@
|
|||||||
font-weight: 800;
|
font-weight: 800;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.loader {
|
||||||
|
width: 12px;
|
||||||
|
height: 12px;
|
||||||
|
border-radius: 50%;
|
||||||
|
display: block;
|
||||||
|
margin: 15px auto;
|
||||||
|
position: relative;
|
||||||
|
color: var(--bcolor1);
|
||||||
|
box-sizing: border-box;
|
||||||
|
animation: animloader 1s linear infinite alternate;
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes animloader {
|
||||||
|
0% {
|
||||||
|
box-shadow: -38px -12px, -14px 0, 14px 0, 38px 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
33% {
|
||||||
|
box-shadow: -38px 0px, -14px -12px, 14px 0, 38px 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
66% {
|
||||||
|
box-shadow: -38px 0px, -14px 0, 14px -12px, 38px 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
100% {
|
||||||
|
box-shadow: -38px 0, -14px 0, 14px 0, 38px -12px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
body {
|
body {
|
||||||
color: var(--bcolor1);
|
color: var(--bcolor1);
|
||||||
background-color: var(--bcolor2);
|
background-color: var(--bcolor2);
|
||||||
|
|||||||
@@ -55,6 +55,14 @@
|
|||||||
background-color: var(--bcolor2);
|
background-color: var(--bcolor2);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.tagentry label:hover {
|
||||||
|
background-color: var(--bcolor3);
|
||||||
|
}
|
||||||
|
|
||||||
|
.tagentry .tagtoggle:hover {
|
||||||
|
background-color: var(--bcolor3);
|
||||||
|
}
|
||||||
|
|
||||||
.column img {
|
.column img {
|
||||||
background-color: var(--bcolor5);
|
background-color: var(--bcolor5);
|
||||||
}
|
}
|
||||||
@@ -69,6 +77,91 @@
|
|||||||
font-weight: 800;
|
font-weight: 800;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.loader {
|
||||||
|
transform: rotateZ(45deg);
|
||||||
|
perspective: 1000px;
|
||||||
|
border-radius: 50%;
|
||||||
|
width: 48px;
|
||||||
|
height: 48px;
|
||||||
|
color: var(--color2);
|
||||||
|
}
|
||||||
|
|
||||||
|
.loader:before,
|
||||||
|
.loader:after {
|
||||||
|
content: '';
|
||||||
|
display: block;
|
||||||
|
position: absolute;
|
||||||
|
top: 0;
|
||||||
|
left: 0;
|
||||||
|
width: inherit;
|
||||||
|
height: inherit;
|
||||||
|
border-radius: 50%;
|
||||||
|
transform: rotateX(70deg);
|
||||||
|
animation: 1s spin linear infinite;
|
||||||
|
}
|
||||||
|
|
||||||
|
.loader:after {
|
||||||
|
color: var(--color4);
|
||||||
|
transform: rotateY(70deg);
|
||||||
|
animation-delay: .4s;
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes rotate {
|
||||||
|
0% {
|
||||||
|
transform: translate(-50%, -50%) rotateZ(0deg);
|
||||||
|
}
|
||||||
|
|
||||||
|
100% {
|
||||||
|
transform: translate(-50%, -50%) rotateZ(360deg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes rotateccw {
|
||||||
|
0% {
|
||||||
|
transform: translate(-50%, -50%) rotate(0deg);
|
||||||
|
}
|
||||||
|
|
||||||
|
100% {
|
||||||
|
transform: translate(-50%, -50%) rotate(-360deg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes spin {
|
||||||
|
|
||||||
|
0%,
|
||||||
|
100% {
|
||||||
|
box-shadow: .2em 0px 0 0px currentcolor;
|
||||||
|
}
|
||||||
|
|
||||||
|
12% {
|
||||||
|
box-shadow: .2em .2em 0 0 currentcolor;
|
||||||
|
}
|
||||||
|
|
||||||
|
25% {
|
||||||
|
box-shadow: 0 .2em 0 0px currentcolor;
|
||||||
|
}
|
||||||
|
|
||||||
|
37% {
|
||||||
|
box-shadow: -.2em .2em 0 0 currentcolor;
|
||||||
|
}
|
||||||
|
|
||||||
|
50% {
|
||||||
|
box-shadow: -.2em 0 0 0 currentcolor;
|
||||||
|
}
|
||||||
|
|
||||||
|
62% {
|
||||||
|
box-shadow: -.2em -.2em 0 0 currentcolor;
|
||||||
|
}
|
||||||
|
|
||||||
|
75% {
|
||||||
|
box-shadow: 0px -.2em 0 0 currentcolor;
|
||||||
|
}
|
||||||
|
|
||||||
|
87% {
|
||||||
|
box-shadow: .2em -.2em 0 0 currentcolor;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
body {
|
body {
|
||||||
color: var(--bcolor1);
|
color: var(--bcolor1);
|
||||||
background-color: var(--bcolor4);
|
background-color: var(--bcolor4);
|
||||||
|
|||||||
@@ -76,6 +76,14 @@
|
|||||||
background-color: var(--bcolor2);
|
background-color: var(--bcolor2);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.tagentry label:hover {
|
||||||
|
background-color: var(--bcolor4);
|
||||||
|
}
|
||||||
|
|
||||||
|
.tagentry .tagtoggle:hover {
|
||||||
|
background-color: var(--bcolor4);
|
||||||
|
}
|
||||||
|
|
||||||
.column img {
|
.column img {
|
||||||
background-color: var(--bcolor5);
|
background-color: var(--bcolor5);
|
||||||
}
|
}
|
||||||
@@ -90,6 +98,36 @@
|
|||||||
font-weight: 800;
|
font-weight: 800;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.loader {
|
||||||
|
width: 12px;
|
||||||
|
height: 12px;
|
||||||
|
border-radius: 50%;
|
||||||
|
display: block;
|
||||||
|
margin: 15px auto;
|
||||||
|
position: relative;
|
||||||
|
color: var(--color4);
|
||||||
|
box-sizing: border-box;
|
||||||
|
animation: animloader 1s linear infinite alternate;
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes animloader {
|
||||||
|
0% {
|
||||||
|
box-shadow: -38px -12px, -14px 0, 14px 0, 38px 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
33% {
|
||||||
|
box-shadow: -38px 0px, -14px -12px, 14px 0, 38px 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
66% {
|
||||||
|
box-shadow: -38px 0px, -14px 0, 14px -12px, 38px 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
100% {
|
||||||
|
box-shadow: -38px 0, -14px 0, 14px 0, 38px -12px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
body {
|
body {
|
||||||
color: var(--bcolor3);
|
color: var(--bcolor3);
|
||||||
background-color: var(--bcolor1);
|
background-color: var(--bcolor1);
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 1.3 MiB After Width: | Height: | Size: 1.1 MiB |
|
Before Width: | Height: | Size: 1.3 MiB After Width: | Height: | Size: 1.1 MiB |
|
Before Width: | Height: | Size: 1.3 MiB After Width: | Height: | Size: 1.0 MiB |
|
Before Width: | Height: | Size: 1.3 MiB After Width: | Height: | Size: 1.1 MiB |
|
Before Width: | Height: | Size: 1.3 MiB After Width: | Height: | Size: 1.1 MiB |
|
Before Width: | Height: | Size: 1.3 MiB After Width: | Height: | Size: 1.1 MiB |
|
Before Width: | Height: | Size: 1.3 MiB After Width: | Height: | Size: 1.1 MiB |
|
Before Width: | Height: | Size: 1.3 MiB After Width: | Height: | Size: 1.1 MiB |
|
Before Width: | Height: | Size: 1.3 MiB After Width: | Height: | Size: 1.1 MiB |
|
Before Width: | Height: | Size: 1.3 MiB After Width: | Height: | Size: 1.1 MiB |
|
Before Width: | Height: | Size: 1.3 MiB After Width: | Height: | Size: 1.1 MiB |
|
Before Width: | Height: | Size: 1.3 MiB After Width: | Height: | Size: 1.1 MiB |
|
Before Width: | Height: | Size: 1.3 MiB After Width: | Height: | Size: 1.1 MiB |
|
Before Width: | Height: | Size: 1.3 MiB After Width: | Height: | Size: 1.1 MiB |
|
Before Width: | Height: | Size: 1.3 MiB After Width: | Height: | Size: 1.1 MiB |
|
Before Width: | Height: | Size: 1.3 MiB After Width: | Height: | Size: 1.0 MiB |
|
Before Width: | Height: | Size: 1.3 MiB After Width: | Height: | Size: 1.1 MiB |
|
Before Width: | Height: | Size: 1.3 MiB After Width: | Height: | Size: 1.1 MiB |
|
Before Width: | Height: | Size: 1.3 MiB After Width: | Height: | Size: 1.1 MiB |
@@ -1,14 +1,22 @@
|
|||||||
@import url("https://fonts.googleapis.com/css2?family=Lora:wght@300;400;500;600;700&display=swap");
|
@import url("https://fonts.googleapis.com/css2?family=Lora:wght@300;400;500;600;700&display=swap");
|
||||||
|
|
||||||
* {
|
* {
|
||||||
--color1: #FFB6C1; /* LightPink */
|
--color1: #FFB6C1;
|
||||||
--color2: #98FB98; /* PaleGreen */
|
/* LightPink */
|
||||||
--color3: #FFD700; /* Gold */
|
--color2: #98FB98;
|
||||||
--color4: #87CEFA; /* LightSkyBlue */
|
/* PaleGreen */
|
||||||
--bcolor1: #FFFFFF; /* White */
|
--color3: #FFD700;
|
||||||
--bcolor2: #2F4F4F; /* DarkSlateGray */
|
/* Gold */
|
||||||
--bcolor3: #FAF0E6; /* Linen */
|
--color4: #87CEFA;
|
||||||
--bcolor4: #E6E6FA; /* Lavender */
|
/* LightSkyBlue */
|
||||||
|
--bcolor1: #FFFFFF;
|
||||||
|
/* White */
|
||||||
|
--bcolor2: #2F4F4F;
|
||||||
|
/* DarkSlateGray */
|
||||||
|
--bcolor3: #FAF0E6;
|
||||||
|
/* Linen */
|
||||||
|
--bcolor4: #E6E6FA;
|
||||||
|
/* Lavender */
|
||||||
}
|
}
|
||||||
|
|
||||||
.navbar {
|
.navbar {
|
||||||
@@ -79,6 +87,14 @@
|
|||||||
font-family: "Lora", serif;
|
font-family: "Lora", serif;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.tagentry label:hover {
|
||||||
|
background-color: var(--bcolor3);
|
||||||
|
}
|
||||||
|
|
||||||
|
.tagentry .tagtoggle:hover {
|
||||||
|
background-color: var(--bcolor3);
|
||||||
|
}
|
||||||
|
|
||||||
.column img {
|
.column img {
|
||||||
background-color: var(--bcolor4);
|
background-color: var(--bcolor4);
|
||||||
}
|
}
|
||||||
@@ -94,6 +110,54 @@
|
|||||||
font-family: "Lora", serif;
|
font-family: "Lora", serif;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.loader,
|
||||||
|
.loader:before,
|
||||||
|
.loader:after {
|
||||||
|
border-radius: 50%;
|
||||||
|
width: 2.5em;
|
||||||
|
height: 2.5em;
|
||||||
|
animation-fill-mode: both;
|
||||||
|
animation: bblFadInOut 1.8s infinite ease-in-out;
|
||||||
|
}
|
||||||
|
|
||||||
|
.loader {
|
||||||
|
color: var(--bcolor2);
|
||||||
|
font-size: 7px;
|
||||||
|
position: relative;
|
||||||
|
text-indent: -9999em;
|
||||||
|
transform: translateZ(0);
|
||||||
|
animation-delay: -0.16s;
|
||||||
|
}
|
||||||
|
|
||||||
|
.loader:before,
|
||||||
|
.loader:after {
|
||||||
|
content: '';
|
||||||
|
position: absolute;
|
||||||
|
top: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.loader:before {
|
||||||
|
left: -3.5em;
|
||||||
|
animation-delay: -0.32s;
|
||||||
|
}
|
||||||
|
|
||||||
|
.loader:after {
|
||||||
|
left: 3.5em;
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes bblFadInOut {
|
||||||
|
|
||||||
|
0%,
|
||||||
|
80%,
|
||||||
|
100% {
|
||||||
|
box-shadow: 0 2.5em 0 -1.3em
|
||||||
|
}
|
||||||
|
|
||||||
|
40% {
|
||||||
|
box-shadow: 0 2.5em 0 0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
body {
|
body {
|
||||||
color: var(--bcolor2);
|
color: var(--bcolor2);
|
||||||
background-color: var(--bcolor3);
|
background-color: var(--bcolor3);
|
||||||
|
|||||||
@@ -80,6 +80,14 @@
|
|||||||
background-color: var(--color4);
|
background-color: var(--color4);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.tagentry label:hover {
|
||||||
|
background-color: var(--color3);
|
||||||
|
}
|
||||||
|
|
||||||
|
.tagentry .tagtoggle:hover {
|
||||||
|
background-color: var(--color3);
|
||||||
|
}
|
||||||
|
|
||||||
.column img {
|
.column img {
|
||||||
background-color: var(--color4);
|
background-color: var(--color4);
|
||||||
}
|
}
|
||||||
@@ -94,6 +102,52 @@
|
|||||||
font-weight: 700;
|
font-weight: 700;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.loader {
|
||||||
|
width: 48px;
|
||||||
|
height: 48px;
|
||||||
|
border-radius: 50%;
|
||||||
|
position: relative;
|
||||||
|
animation: rotate 1s linear infinite
|
||||||
|
}
|
||||||
|
|
||||||
|
.loader::before {
|
||||||
|
content: "";
|
||||||
|
box-sizing: border-box;
|
||||||
|
position: absolute;
|
||||||
|
inset: 0px;
|
||||||
|
border-radius: 50%;
|
||||||
|
border: 5px solid var(--color2);
|
||||||
|
animation: prixClipFix 2s linear infinite;
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes rotate {
|
||||||
|
100% {
|
||||||
|
transform: rotate(360deg)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes prixClipFix {
|
||||||
|
0% {
|
||||||
|
clip-path: polygon(50% 50%, 0 0, 0 0, 0 0, 0 0, 0 0)
|
||||||
|
}
|
||||||
|
|
||||||
|
25% {
|
||||||
|
clip-path: polygon(50% 50%, 0 0, 100% 0, 100% 0, 100% 0, 100% 0)
|
||||||
|
}
|
||||||
|
|
||||||
|
50% {
|
||||||
|
clip-path: polygon(50% 50%, 0 0, 100% 0, 100% 100%, 100% 100%, 100% 100%)
|
||||||
|
}
|
||||||
|
|
||||||
|
75% {
|
||||||
|
clip-path: polygon(50% 50%, 0 0, 100% 0, 100% 100%, 0 100%, 0 100%)
|
||||||
|
}
|
||||||
|
|
||||||
|
100% {
|
||||||
|
clip-path: polygon(50% 50%, 0 0, 100% 0, 100% 100%, 0 100%, 0 0)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
body {
|
body {
|
||||||
color: var(--bcolor1);
|
color: var(--bcolor1);
|
||||||
background-color: var(--bcolor2);
|
background-color: var(--bcolor2);
|
||||||
|
|||||||
@@ -80,6 +80,15 @@
|
|||||||
font-family: "Roboto", sans-serif;
|
font-family: "Roboto", sans-serif;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.tagentry label:hover {
|
||||||
|
background-color: var(--bcolor3);
|
||||||
|
}
|
||||||
|
|
||||||
|
.tagentry .tagtoggle:hover {
|
||||||
|
background-color: var(--bcolor3);
|
||||||
|
color: var(--bcolor2);
|
||||||
|
}
|
||||||
|
|
||||||
.column img {
|
.column img {
|
||||||
background-color: var(--bcolor4);
|
background-color: var(--bcolor4);
|
||||||
}
|
}
|
||||||
@@ -95,6 +104,54 @@
|
|||||||
font-family: "Roboto", sans-serif;
|
font-family: "Roboto", sans-serif;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.loader,
|
||||||
|
.loader:before,
|
||||||
|
.loader:after {
|
||||||
|
border-radius: 50%;
|
||||||
|
width: 2.5em;
|
||||||
|
height: 2.5em;
|
||||||
|
animation-fill-mode: both;
|
||||||
|
animation: bblFadInOut 1.8s infinite ease-in-out;
|
||||||
|
}
|
||||||
|
|
||||||
|
.loader {
|
||||||
|
color: var(--bcolor2);
|
||||||
|
font-size: 7px;
|
||||||
|
position: relative;
|
||||||
|
text-indent: -9999em;
|
||||||
|
transform: translateZ(0);
|
||||||
|
animation-delay: -0.16s;
|
||||||
|
}
|
||||||
|
|
||||||
|
.loader:before,
|
||||||
|
.loader:after {
|
||||||
|
content: '';
|
||||||
|
position: absolute;
|
||||||
|
top: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.loader:before {
|
||||||
|
left: -3.5em;
|
||||||
|
animation-delay: -0.32s;
|
||||||
|
}
|
||||||
|
|
||||||
|
.loader:after {
|
||||||
|
left: 3.5em;
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes bblFadInOut {
|
||||||
|
|
||||||
|
0%,
|
||||||
|
80%,
|
||||||
|
100% {
|
||||||
|
box-shadow: 0 2.5em 0 -1.3em
|
||||||
|
}
|
||||||
|
|
||||||
|
40% {
|
||||||
|
box-shadow: 0 2.5em 0 0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
body {
|
body {
|
||||||
color: var(--bcolor2);
|
color: var(--bcolor2);
|
||||||
background-color: var(--bcolor3);
|
background-color: var(--bcolor3);
|
||||||
|
|||||||
@@ -74,6 +74,14 @@
|
|||||||
background-color: var(--bcolor2);
|
background-color: var(--bcolor2);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.tagentry label:hover {
|
||||||
|
background-color: var(--bcolor4);
|
||||||
|
}
|
||||||
|
|
||||||
|
.tagentry .tagtoggle:hover {
|
||||||
|
background-color: var(--bcolor4);
|
||||||
|
}
|
||||||
|
|
||||||
.column img {
|
.column img {
|
||||||
background-color: var(--bcolor4);
|
background-color: var(--bcolor4);
|
||||||
}
|
}
|
||||||
@@ -88,6 +96,36 @@
|
|||||||
font-weight: 800;
|
font-weight: 800;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.loader {
|
||||||
|
width: 12px;
|
||||||
|
height: 12px;
|
||||||
|
border-radius: 50%;
|
||||||
|
display: block;
|
||||||
|
margin: 15px auto;
|
||||||
|
position: relative;
|
||||||
|
color: var(--color1);
|
||||||
|
box-sizing: border-box;
|
||||||
|
animation: animloader 1s linear infinite alternate;
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes animloader {
|
||||||
|
0% {
|
||||||
|
box-shadow: -38px -12px, -14px 0, 14px 0, 38px 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
33% {
|
||||||
|
box-shadow: -38px 0px, -14px -12px, 14px 0, 38px 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
66% {
|
||||||
|
box-shadow: -38px 0px, -14px 0, 14px -12px, 38px 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
100% {
|
||||||
|
box-shadow: -38px 0, -14px 0, 14px 0, 38px -12px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
body {
|
body {
|
||||||
color: var(--bcolor1);
|
color: var(--bcolor1);
|
||||||
background-color: var(--bcolor3);
|
background-color: var(--bcolor3);
|
||||||
|
|||||||
@@ -88,6 +88,14 @@
|
|||||||
font-family: "Montserrat", sans-serif;
|
font-family: "Montserrat", sans-serif;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.tagentry label:hover {
|
||||||
|
background-color: var(--color2);
|
||||||
|
}
|
||||||
|
|
||||||
|
.tagentry .tagtoggle:hover {
|
||||||
|
background-color: var(--color2);
|
||||||
|
}
|
||||||
|
|
||||||
.column img {
|
.column img {
|
||||||
background-color: var(--bcolor4);
|
background-color: var(--bcolor4);
|
||||||
}
|
}
|
||||||
@@ -103,6 +111,54 @@
|
|||||||
font-family: "Montserrat", sans-serif;
|
font-family: "Montserrat", sans-serif;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.loader,
|
||||||
|
.loader:before,
|
||||||
|
.loader:after {
|
||||||
|
border-radius: 50%;
|
||||||
|
width: 2.5em;
|
||||||
|
height: 2.5em;
|
||||||
|
animation-fill-mode: both;
|
||||||
|
animation: bblFadInOut 1.8s infinite ease-in-out;
|
||||||
|
}
|
||||||
|
|
||||||
|
.loader {
|
||||||
|
color: var(--bcolor2);
|
||||||
|
font-size: 7px;
|
||||||
|
position: relative;
|
||||||
|
text-indent: -9999em;
|
||||||
|
transform: translateZ(0);
|
||||||
|
animation-delay: -0.16s;
|
||||||
|
}
|
||||||
|
|
||||||
|
.loader:before,
|
||||||
|
.loader:after {
|
||||||
|
content: '';
|
||||||
|
position: absolute;
|
||||||
|
top: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.loader:before {
|
||||||
|
left: -3.5em;
|
||||||
|
animation-delay: -0.32s;
|
||||||
|
}
|
||||||
|
|
||||||
|
.loader:after {
|
||||||
|
left: 3.5em;
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes bblFadInOut {
|
||||||
|
|
||||||
|
0%,
|
||||||
|
80%,
|
||||||
|
100% {
|
||||||
|
box-shadow: 0 2.5em 0 -1.3em
|
||||||
|
}
|
||||||
|
|
||||||
|
40% {
|
||||||
|
box-shadow: 0 2.5em 0 0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
body {
|
body {
|
||||||
color: var(--bcolor2);
|
color: var(--bcolor2);
|
||||||
background-color: var(--bcolor3);
|
background-color: var(--bcolor3);
|
||||||
|
|||||||