From 2fd5a098b1b6b6b2d9546e6fe7147233e8692a11 Mon Sep 17 00:00:00 2001 From: Zaine Date: Thu, 7 May 2026 13:53:45 +0100 Subject: [PATCH] authoring server 4 --- ...-4a746efb-e97f-4492-a281-a4dd2d3fa509.jpeg | Bin .../05/20260507-134236-example-png-image.png | Bin .../05/20260507-134526-example-png-image.png | Bin .../05/20260507-135058-example-png-image.png | Bin 0 -> 22470 bytes authoring_server.py | 80 ++++++++++++++++-- lima/index.md | 4 +- posts/posts-list.org | 2 +- 7 files changed, 75 insertions(+), 11 deletions(-) mode change 100644 => 100755 assets/images/hzone/2026/05/20260507-133807-4a746efb-e97f-4492-a281-a4dd2d3fa509.jpeg mode change 100644 => 100755 assets/images/hzone/2026/05/20260507-134236-example-png-image.png mode change 100644 => 100755 assets/images/hzone/2026/05/20260507-134526-example-png-image.png create mode 100644 assets/images/hzone/2026/05/20260507-135058-example-png-image.png diff --git a/assets/images/hzone/2026/05/20260507-133807-4a746efb-e97f-4492-a281-a4dd2d3fa509.jpeg b/assets/images/hzone/2026/05/20260507-133807-4a746efb-e97f-4492-a281-a4dd2d3fa509.jpeg old mode 100644 new mode 100755 diff --git a/assets/images/hzone/2026/05/20260507-134236-example-png-image.png b/assets/images/hzone/2026/05/20260507-134236-example-png-image.png old mode 100644 new mode 100755 diff --git a/assets/images/hzone/2026/05/20260507-134526-example-png-image.png b/assets/images/hzone/2026/05/20260507-134526-example-png-image.png old mode 100644 new mode 100755 diff --git a/assets/images/hzone/2026/05/20260507-135058-example-png-image.png b/assets/images/hzone/2026/05/20260507-135058-example-png-image.png new file mode 100644 index 0000000000000000000000000000000000000000..d63b4a20e9d1f2a80dde945ce6301048f56f3883 GIT binary patch literal 22470 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 literal 0 HcmV?d00001 diff --git a/authoring_server.py b/authoring_server.py index 28a45f3..51dd4b1 100755 --- a/authoring_server.py +++ b/authoring_server.py @@ -6,7 +6,9 @@ from __future__ import annotations import json import mimetypes import os +import posixpath import re +import struct import subprocess import sys import threading @@ -455,7 +457,61 @@ def save_page(data: dict[str, Any]) -> dict[str, Any]: return page_to_dict(read_page(target)) -def save_upload(filename: str, payload: bytes) -> dict[str, str]: +def image_dimensions(payload: bytes, ext: str) -> tuple[int, int] | None: + if ext == ".png" and payload.startswith(b"\x89PNG\r\n\x1a\n") and len(payload) >= 24: + width, height = struct.unpack(">II", payload[16:24]) + return width, height + if ext == ".gif" and payload[:6] in {b"GIF87a", b"GIF89a"} and len(payload) >= 10: + width, height = struct.unpack(" len(payload): + break + size = int.from_bytes(payload[i:i + 2], "big") + if size < 2: + break + if marker in {0xC0, 0xC1, 0xC2, 0xC3, 0xC5, 0xC6, 0xC7, 0xC9, 0xCA, 0xCB, 0xCD, 0xCE, 0xCF}: + if i + 7 <= len(payload): + height = int.from_bytes(payload[i + 3:i + 5], "big") + width = int.from_bytes(payload[i + 5:i + 7], "big") + return width, height + break + i += size + return None + + +def relative_asset_path(page_path: str, asset_path: str) -> str: + page = safe_relative_path(page_path) if page_path else LIMA_DIR / "index.md" + if page.suffix != ".md" or not page.is_relative_to(LIMA_DIR): + page = LIMA_DIR / "index.md" + page_rel = page.relative_to(ROOT).as_posix() + page_output_dir = posixpath.dirname(page_rel) + return posixpath.relpath(asset_path, page_output_dir or ".") + + +def gallery_image_html(filename: str, asset_path: str, page_path: str, payload: bytes, ext: str) -> str: + absolute_url = f"https://zainezq.com/{asset_path}" + relative_url = relative_asset_path(page_path, asset_path) + dims = image_dimensions(payload, ext) + width, height = dims if dims else (1920, 1080) + alt = html_escape(filename) + return ( + f'' + f'{alt}' + ) + + +def save_upload(filename: str, payload: bytes, page_path: str = "") -> dict[str, str]: original = Path(filename or "attachment").name ext = Path(original).suffix.lower() if ext not in ALLOWED_UPLOAD_EXTENSIONS: @@ -471,14 +527,20 @@ def save_upload(filename: str, payload: bytes) -> dict[str, str]: counter += 1 target.write_bytes(payload) rel = target.relative_to(ROOT).as_posix() - url = f"/{rel}" + absolute_url = f"https://zainezq.com/{rel}" + relative_url = relative_asset_path(page_path, rel) mime = mimetypes.guess_type(target.name)[0] or "" - alt = Path(original).stem.replace("-", " ").replace("_", " ").strip() or "attachment" if mime.startswith("video/") or ext in {".mp4", ".webm", ".mov"}: - markdown = f'' + markdown = f'' else: - markdown = f"![{alt}]({url})" - return {"url": url, "path": rel, "markdown": markdown, "filename": target.name} + markdown = gallery_image_html(target.name, rel, page_path, payload, ext) + return { + "url": absolute_url, + "relativeUrl": relative_url, + "path": rel, + "markdown": markdown, + "filename": target.name, + } def run_build_commands() -> tuple[bool, str, str]: @@ -893,6 +955,7 @@ APP_HTML = r""" saveMessage.textContent = "Uploading attachment."; const body = new FormData(); body.append("attachment", file); + body.append("pagePath", state.currentPath || editor.targetPath.value || "lima/index.md"); try { const res = await fetch("/api/upload", { method: "POST", body }); const data = await res.json(); @@ -974,7 +1037,10 @@ class Handler(BaseHTTPRequestHandler): payload = field.file.read() if not payload: raise ValueError("Attachment is empty.") - self.send_json(save_upload(field.filename, payload)) + page_path = "" + if "pagePath" in form: + page_path = str(form["pagePath"].value or "") + self.send_json(save_upload(field.filename, payload, page_path)) except Exception as exc: self.send_json({"error": str(exc)}, HTTPStatus.BAD_REQUEST) return diff --git a/lima/index.md b/lima/index.md index 0bc96e8..98de6d2 100755 --- a/lima/index.md +++ b/lima/index.md @@ -11,7 +11,5 @@ I made quite a few changes. It all started when I realised that not everyone kno - One other thing, a more personal one: what do you think of all this? am i doing too much? am i doing too little? am i overengineering things? am i forcing you to do something you dont wanna do? these little trinkets work for me, but i’m not sure if it would work for someone else, so at any point if you have reservations, let me know okay? -# **This is a test** - -![Example PNG Image](/assets/images/hzone/2026/05/20260507-134236-example-png-image.png) +20260507-135058-example-png-image.png diff --git a/posts/posts-list.org b/posts/posts-list.org index da837fc..2176af5 100755 --- a/posts/posts-list.org +++ b/posts/posts-list.org @@ -4,7 +4,7 @@ See the categories: @@html:Categories@@ * Posts: -- [[file:career/career-list.org][Career List]] @@html:@@ +- [[file:career/career-list.org][Career List]] @@html:@@ - [[file:posts-list.sync-conflict-20260417-233432-VT6366A.org][Posts List]] @@html:@@ - [[file:career/ha-dr.org][High Availability, Disaster Recovery and Business Continuity]] @@html:@@ @@html:@@ @@html:@@ - [[file:career/javascript.org][Understands the Javascript language]] @@html:@@ @@html:@@ @@html:@@