refactor: drop install scripts; containerize zddc-server build
Drops the install/distribution machinery in favor of two simpler paths:
- Local: download a tool .html from website/releases/ and open it.
- Server: run zddc-server, which embeds current-stable HTMLs at compile
time via //go:embed (delivered in the next commit).
Removed:
- bootstrap/install.sh, bootstrap/README.md, bootstrap/level{1,2}.html.tmpl
- website/bootstrap/{level1,track-stable,track-beta,track-alpha}/
- website/install.sh symlink
- The bootstrap-stub generation in top-level build.sh
Rewritten:
- website/index.html "Install on your server" section: two cards
(server / local) replacing the old four script-based snippets.
- website/reference.html, website/css/style.css: updated to match.
- website/releases/index.html: regenerated by build.sh from filesystem.
Top-level build.sh:
- All five tool HTMLs now copied into zddc/dist/web/ and into the
new zddc/internal/apps/embedded/ for //go:embed.
- Cross-compile is always containerized via podman or docker against
docker.io/golang:1.24-alpine (the same image the helm prod chart
uses), with named volumes for module + build cache. ZDDC_GO_BUILD_IMAGE
overrides for air-gapped or pinned-mirror deployments.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
parent
d0929a2aa9
commit
9b3b11fc20
29 changed files with 136 additions and 1832 deletions
|
|
@ -1,156 +0,0 @@
|
||||||
# Deployment bootstrap
|
|
||||||
|
|
||||||
ZDDC tools (archive, transmittal, classifier, mdedit, landing) are single-file
|
|
||||||
HTML bundles. The bootstrap pattern lets you install once on a deployment and
|
|
||||||
update by editing a few lines, without re-uploading multi-megabyte HTML files.
|
|
||||||
|
|
||||||
End users install via the unified [`install.sh`](install.sh) script, served at
|
|
||||||
`https://zddc.varasys.io/install.sh`. The script handles all three deployment
|
|
||||||
patterns (self-contained / channel-tracking / pin-to-version) plus both target
|
|
||||||
shapes (deployment root or project subdirectory) via a single command:
|
|
||||||
|
|
||||||
```sh
|
|
||||||
sh -c "$(curl -fsSL https://zddc.varasys.io/install.sh)" -- [options]
|
|
||||||
```
|
|
||||||
|
|
||||||
The published stubs live under `https://zddc.varasys.io/bootstrap/`:
|
|
||||||
|
|
||||||
- `bootstrap/level1/<tool>.html` — same-origin level-1 stubs (4 tools, no
|
|
||||||
landing — landing only lives at deployment root).
|
|
||||||
- `bootstrap/track-{stable,beta,alpha}/<tool>.html` — per-channel level-2
|
|
||||||
stubs (5 tools each).
|
|
||||||
|
|
||||||
Both directories are produced by the project's top-level `build.sh` from
|
|
||||||
`bootstrap/level{1,2}.html.tmpl`. `install.sh` orchestrates which stubs to
|
|
||||||
fetch and where to put them based on `--mode` / `--target` / `--channel`.
|
|
||||||
|
|
||||||
## The two-level model
|
|
||||||
|
|
||||||
A typical `zddc-server` deployment looks like this:
|
|
||||||
|
|
||||||
```
|
|
||||||
<ZDDC_ROOT>/
|
|
||||||
index.html # landing tool (or bootstrap)
|
|
||||||
archive.html # archive tool (or bootstrap; site-wide channel switch lives here)
|
|
||||||
transmittal.html
|
|
||||||
classifier.html
|
|
||||||
mdedit.html
|
|
||||||
<project-A>/
|
|
||||||
archive.html # level-1 bootstrap → fetches ../archive.html
|
|
||||||
transmittal.html
|
|
||||||
classifier.html
|
|
||||||
mdedit.html
|
|
||||||
<project files…>
|
|
||||||
<project-B>/
|
|
||||||
archive.html # level-1 bootstrap (or pinned to a specific version)
|
|
||||||
…
|
|
||||||
```
|
|
||||||
|
|
||||||
- **Level-1 stubs** at `<project>/<tool>.html` always fetch the same-origin
|
|
||||||
`../<tool>.html`. They never touch `zddc.varasys.io`. Install them once;
|
|
||||||
they don't need to change.
|
|
||||||
- **At deployment root** (`<ZDDC_ROOT>/<tool>.html`), put either:
|
|
||||||
- the actual built tool HTML — fully self-contained install, no external
|
|
||||||
dependencies; or
|
|
||||||
- a level-2 bootstrap — fetches `<source>/releases/<tool>_<channel>.html`
|
|
||||||
directly (that path is a checked-in symlink on the upstream that resolves
|
|
||||||
to the current channel mirror). No manifest lookup, no version arithmetic,
|
|
||||||
no Codeberg proxy magic — every URL is a real static file or a static
|
|
||||||
symlink chain.
|
|
||||||
|
|
||||||
The site administrator switches the whole site to a channel by re-running
|
|
||||||
`install.sh --mode track --channel <name>` — that overwrites the root
|
|
||||||
`<tool>.html` files with the matching level-2 stubs. A single project can
|
|
||||||
override one tool by editing just `<project-X>/<tool>.html` (replace the
|
|
||||||
relative `upstream` URL with an absolute zddc.varasys.io URL pointing at
|
|
||||||
the desired version, channel mirror, or partial-version pin).
|
|
||||||
|
|
||||||
## Why two levels
|
|
||||||
|
|
||||||
The level-1 stubs let projects share a single source of truth for "which
|
|
||||||
build of the archive tool runs here." Switching channels is one file change
|
|
||||||
at the root; pinning a single project is one file change in that directory.
|
|
||||||
|
|
||||||
`document.write()` chains across both levels: level-1 fetches and writes,
|
|
||||||
the new document's level-2 script runs and writes again, the third write
|
|
||||||
is the actual tool. Origin stays at the deployment domain throughout, so
|
|
||||||
File System Access API, `crypto.subtle`, and `localStorage` all work and
|
|
||||||
preferences stay scoped to the deployment.
|
|
||||||
|
|
||||||
## Pinning options
|
|
||||||
|
|
||||||
There are two ways to choose a version: edit the stub for a permanent
|
|
||||||
pin, or pass a `?v=` URL parameter for a per-request override.
|
|
||||||
|
|
||||||
### 1. Permanent pin (point the stub at a fixed URL)
|
|
||||||
|
|
||||||
The default level-2 stub fetches `<source>/releases/<tool>_<channel>.html` —
|
|
||||||
which is itself a symlink on the upstream that resolves to the current
|
|
||||||
channel mirror. To pin permanently, change the URL inside the stub:
|
|
||||||
|
|
||||||
| Target stability | URL the stub should fetch |
|
|
||||||
|----------------------------------|------------------------------------------------------------------------|
|
|
||||||
| Exact stable version | `https://zddc.varasys.io/releases/<tool>_vX.Y.Z.html` |
|
|
||||||
| Latest patch within `<X.Y>.*` | `https://zddc.varasys.io/releases/<tool>_v<X.Y>.html` (symlink) |
|
|
||||||
| Latest within `<X>.*.*` | `https://zddc.varasys.io/releases/<tool>_v<X>.html` (symlink) |
|
|
||||||
| Track stable channel (default) | `https://zddc.varasys.io/releases/<tool>_stable.html` (symlink) |
|
|
||||||
| Track beta / alpha channel | `https://zddc.varasys.io/releases/<tool>_<channel>.html` |
|
|
||||||
|
|
||||||
### 2. Per-request `?v=` parameter
|
|
||||||
|
|
||||||
Both stub levels honor a `?v=` URL parameter. The parameter survives the
|
|
||||||
`document.write()` chain, so it flows through level-1 → level-2 →
|
|
||||||
upstream automatically.
|
|
||||||
|
|
||||||
| URL parameter | Resolves to |
|
|
||||||
|--------------------------------|-------------------------------------------------------|
|
|
||||||
| `?v=0.0.4` (or `?v=v0.0.4`) | `<tool>_v0.0.4.html` (exact) |
|
|
||||||
| `?v=0.0` (or `?v=v0.0`) | `<tool>_v0.0.html` (latest 0.0.x patch — symlink) |
|
|
||||||
| `?v=0` (or `?v=v0`) | `<tool>_v0.html` (latest 0.x — symlink) |
|
|
||||||
| `?v=stable` | `<tool>_stable.html` |
|
|
||||||
| `?v=beta` | `<tool>_beta.html` |
|
|
||||||
| `?v=alpha` | `<tool>_alpha.html` |
|
|
||||||
| (omitted) | the default channel baked into the stub at install time |
|
|
||||||
|
|
||||||
When level-1 has `?v=…`, it tries `../<tool>_<suffix>.html` first (useful
|
|
||||||
when the admin has staged specific versions locally — the upstream's
|
|
||||||
symlink layout works the same locally) and falls back to `../<tool>.html`
|
|
||||||
if 404 — which then forwards the parameter via level-2 if one is installed.
|
|
||||||
|
|
||||||
Stable per-version files are immutable. The `<tool>_stable.html`,
|
|
||||||
`<tool>_beta.html`, and `<tool>_alpha.html` symlinks (or real bytes when a
|
|
||||||
channel has active dev) get updated whenever the relevant channel
|
|
||||||
advances upstream — expect them to change. The build label rendered on
|
|
||||||
the tool page tells you exactly which build you're seeing
|
|
||||||
(`v<next-stable>-{alpha,beta} · <date> · <sha>` for channel mirrors,
|
|
||||||
`v<X.Y.Z>` for pinned stables).
|
|
||||||
|
|
||||||
## Auditing what's installed
|
|
||||||
|
|
||||||
Every stub contains a `fallback` (level-1) or `upstream` (level-2)
|
|
||||||
constant. To see what each tool / project on the deployment points at:
|
|
||||||
|
|
||||||
```sh
|
|
||||||
grep -rn "fallback\|upstream" <ZDDC_ROOT>
|
|
||||||
```
|
|
||||||
|
|
||||||
## CORS prerequisite (level-2 only)
|
|
||||||
|
|
||||||
A level-2 fetch is cross-origin (deployment → `zddc.varasys.io`). The
|
|
||||||
upstream must serve `Access-Control-Allow-Origin: *` (or a list including
|
|
||||||
your deployment origin) on each released asset. Verify with:
|
|
||||||
|
|
||||||
```sh
|
|
||||||
curl -I https://zddc.varasys.io/releases/archive_stable.html | grep -i access-control
|
|
||||||
curl -I https://zddc.varasys.io/releases/archive_v0.0.2.html | grep -i access-control
|
|
||||||
```
|
|
||||||
|
|
||||||
Level-1 fetches are same-origin so no CORS is involved.
|
|
||||||
|
|
||||||
## Templates
|
|
||||||
|
|
||||||
`level1.html.tmpl` and `level2.html.tmpl` are the source of truth. The
|
|
||||||
project's top-level `build.sh` substitutes `{{TOOL}}`, `{{TOOL_TITLE}}`,
|
|
||||||
`{{CHANNEL}}`, and `{{FAVICON}}` to produce the per-tool stubs published
|
|
||||||
under `website/bootstrap/level1/` and `website/bootstrap/track-<channel>/`,
|
|
||||||
which the install snippets curl from `https://zddc.varasys.io/bootstrap/`.
|
|
||||||
|
|
@ -1,250 +0,0 @@
|
||||||
#!/bin/sh
|
|
||||||
# install.sh — Bootstrap a ZDDC deployment from zddc.varasys.io
|
|
||||||
# (or any compatible upstream) into the current directory.
|
|
||||||
#
|
|
||||||
# This script replaces the four hand-rolled install snippets that used
|
|
||||||
# to live inline on the home page. It handles all three deployment
|
|
||||||
# patterns (self-contained / channel-tracking / pinned-version) plus
|
|
||||||
# both target shapes (ZDDC root or project subdirectory).
|
|
||||||
#
|
|
||||||
# Usage:
|
|
||||||
# sh -c "$(curl -fsSL https://zddc.varasys.io/install.sh)"
|
|
||||||
# sh -c "$(curl -fsSL https://zddc.varasys.io/install.sh)" -- [options]
|
|
||||||
#
|
|
||||||
# Options:
|
|
||||||
# --channel <stable|beta|alpha|X.Y.Z|X.Y|X>
|
|
||||||
# Channel or pinned-version selector (default: stable).
|
|
||||||
# stable / beta / alpha — channel mirrors (auto-update
|
|
||||||
# on the upstream). X.Y.Z — exact version. X.Y — latest
|
|
||||||
# patch within X.Y.* (symlink-resolved on upstream).
|
|
||||||
# X — latest within X.*.* (symlink-resolved upstream).
|
|
||||||
# Optional leading 'v' is accepted and stripped.
|
|
||||||
#
|
|
||||||
# --source <URL> Upstream base URL (default: https://zddc.varasys.io).
|
|
||||||
# Use this to point at your own dev server during
|
|
||||||
# active alpha development, or at a mirror.
|
|
||||||
#
|
|
||||||
# --mode <copy|track> copy: fetch the actual HTML and save locally —
|
|
||||||
# site does not depend on the upstream after
|
|
||||||
# install. Use for pinned-version installs
|
|
||||||
# and air-gapped deployments. (default)
|
|
||||||
# track: install tiny level-2 stubs that fetch the
|
|
||||||
# chosen channel from the upstream on every
|
|
||||||
# page load. Auto-updates within the channel.
|
|
||||||
# Only valid with channel names (stable / beta
|
|
||||||
# / alpha), not with pinned versions.
|
|
||||||
#
|
|
||||||
# --target <root|project|auto>
|
|
||||||
# root: install at the deployment root — five tool
|
|
||||||
# HTMLs (incl. landing as index.html) plus
|
|
||||||
# a _template/ directory of level-1 stubs
|
|
||||||
# to copy into project subdirs.
|
|
||||||
# project: install in a project subdirectory — four
|
|
||||||
# level-1 stubs that fetch ../<tool>.html
|
|
||||||
# (same-origin) at load time. Use this in
|
|
||||||
# each <project>/ subdir under your root.
|
|
||||||
# auto: detect from CWD (default). 'project' if
|
|
||||||
# CWD's parent has a ZDDC-looking index.html;
|
|
||||||
# 'root' otherwise.
|
|
||||||
#
|
|
||||||
# --tools <list> Comma-separated subset of tools to install
|
|
||||||
# (default: archive,transmittal,classifier,mdedit).
|
|
||||||
# Landing is always included in --target root copy
|
|
||||||
# installs as index.html.
|
|
||||||
#
|
|
||||||
# --dry-run Print what would happen; don't write any files.
|
|
||||||
# -h | --help Show this help.
|
|
||||||
#
|
|
||||||
# Examples:
|
|
||||||
#
|
|
||||||
# Self-contained install of current stable at the deployment root:
|
|
||||||
# cd /srv/archive
|
|
||||||
# sh -c "$(curl -fsSL https://zddc.varasys.io/install.sh)"
|
|
||||||
#
|
|
||||||
# Track beta from upstream:
|
|
||||||
# cd /srv/archive
|
|
||||||
# sh -c "$(curl -fsSL https://zddc.varasys.io/install.sh)" -- \
|
|
||||||
# --mode track --channel beta
|
|
||||||
#
|
|
||||||
# Pin to a specific version (immutable):
|
|
||||||
# cd /srv/archive
|
|
||||||
# sh -c "$(curl -fsSL https://zddc.varasys.io/install.sh)" -- \
|
|
||||||
# --channel 0.0.2
|
|
||||||
#
|
|
||||||
# Track alpha from your own dev server (level-2 stubs point at it):
|
|
||||||
# cd /srv/archive
|
|
||||||
# sh -c "$(curl -fsSL https://zddc.varasys.io/install.sh)" -- \
|
|
||||||
# --mode track --channel alpha --source https://my-dev.local
|
|
||||||
#
|
|
||||||
# Install level-1 stubs in a project subdirectory (auto-detected):
|
|
||||||
# cd /srv/archive/Project-A
|
|
||||||
# sh -c "$(curl -fsSL https://zddc.varasys.io/install.sh)"
|
|
||||||
|
|
||||||
set -eu
|
|
||||||
|
|
||||||
CHANNEL="stable"
|
|
||||||
SOURCE="https://zddc.varasys.io"
|
|
||||||
MODE="copy"
|
|
||||||
TARGET="auto"
|
|
||||||
TOOLS="archive,transmittal,classifier,mdedit"
|
|
||||||
DRY_RUN=0
|
|
||||||
|
|
||||||
usage() {
|
|
||||||
awk '/^# Usage:/,/^$/' "$0" | sed 's/^# \{0,1\}//' >&2
|
|
||||||
exit "${1:-1}"
|
|
||||||
}
|
|
||||||
|
|
||||||
# --- Parse args ------------------------------------------------------------
|
|
||||||
while [ $# -gt 0 ]; do
|
|
||||||
case "$1" in
|
|
||||||
--channel) CHANNEL="${2:-}"; shift 2 ;;
|
|
||||||
--source) SOURCE="${2:-}"; shift 2 ;;
|
|
||||||
--mode) MODE="${2:-}"; shift 2 ;;
|
|
||||||
--target) TARGET="${2:-}"; shift 2 ;;
|
|
||||||
--tools) TOOLS="${2:-}"; shift 2 ;;
|
|
||||||
--dry-run) DRY_RUN=1; shift ;;
|
|
||||||
-h|--help) usage 0 ;;
|
|
||||||
*) echo "install.sh: unknown argument '$1'" >&2; usage ;;
|
|
||||||
esac
|
|
||||||
done
|
|
||||||
|
|
||||||
# Strip a trailing slash from SOURCE so URL composition is consistent.
|
|
||||||
SOURCE="${SOURCE%/}"
|
|
||||||
|
|
||||||
# --- Validate --mode and --target ------------------------------------------
|
|
||||||
case "$MODE" in
|
|
||||||
copy|track) ;;
|
|
||||||
*) echo "install.sh: --mode must be 'copy' or 'track' (got '$MODE')" >&2; exit 1 ;;
|
|
||||||
esac
|
|
||||||
case "$TARGET" in
|
|
||||||
root|project|auto) ;;
|
|
||||||
*) echo "install.sh: --target must be 'root', 'project', or 'auto' (got '$TARGET')" >&2; exit 1 ;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
# --- Resolve --channel into a filename suffix ------------------------------
|
|
||||||
# stable / beta / alpha → _stable / _beta / _alpha
|
|
||||||
# 0.0.4 / v0.0.4 → _v0.0.4
|
|
||||||
# 0.0 / v0.0 → _v0.0
|
|
||||||
# 0 / v0 → _v0
|
|
||||||
_chan_arg="$CHANNEL"
|
|
||||||
case "$_chan_arg" in
|
|
||||||
stable|beta|alpha) SUFFIX="_${_chan_arg}" ;;
|
|
||||||
v*) SUFFIX="_${_chan_arg}" ;;
|
|
||||||
[0-9]*) SUFFIX="_v${_chan_arg}" ;;
|
|
||||||
*) echo "install.sh: --channel must be stable, beta, alpha, or a semver (got '$_chan_arg')" >&2; exit 1 ;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
# --mode track is only meaningful for the three named channels — pinned
|
|
||||||
# version stubs aren't pre-built (they'd need a different stub per version,
|
|
||||||
# and an immutable pin doesn't really benefit from runtime indirection).
|
|
||||||
if [ "$MODE" = "track" ]; then
|
|
||||||
case "$_chan_arg" in
|
|
||||||
stable|beta|alpha) ;;
|
|
||||||
*) echo "install.sh: --mode track only supports channel names (stable, beta, alpha); for pinned versions use --mode copy" >&2; exit 1 ;;
|
|
||||||
esac
|
|
||||||
fi
|
|
||||||
|
|
||||||
# --- Auto-detect --target --------------------------------------------------
|
|
||||||
if [ "$TARGET" = "auto" ]; then
|
|
||||||
# Heuristic: parent dir has an index.html with the ZDDC brand string —
|
|
||||||
# we're inside a project subdirectory of an existing ZDDC deployment.
|
|
||||||
if [ -f "../index.html" ] && grep -q 'ZDDC' "../index.html" 2>/dev/null; then
|
|
||||||
TARGET="project"
|
|
||||||
else
|
|
||||||
TARGET="root"
|
|
||||||
fi
|
|
||||||
echo "install.sh: auto-detected --target=$TARGET (use --target to override)"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# --- Plan summary ----------------------------------------------------------
|
|
||||||
echo "install.sh: $MODE $_chan_arg into $(pwd) (target=$TARGET, source=$SOURCE)"
|
|
||||||
[ "$DRY_RUN" = "1" ] && echo " [DRY RUN — no files will be written]"
|
|
||||||
|
|
||||||
TOOL_LIST=$(echo "$TOOLS" | tr ',' ' ')
|
|
||||||
|
|
||||||
# --- Helpers ---------------------------------------------------------------
|
|
||||||
fetch_to() {
|
|
||||||
_url="$1"; _dest="$2"
|
|
||||||
if [ "$DRY_RUN" = "1" ]; then
|
|
||||||
echo " [dry-run] $_url -> $_dest"
|
|
||||||
return 0
|
|
||||||
fi
|
|
||||||
echo " $_dest"
|
|
||||||
curl -fsSL "$_url" -o "$_dest"
|
|
||||||
}
|
|
||||||
|
|
||||||
# Fetch a track-channel stub and rewrite the upstream URL inside it if
|
|
||||||
# --source is non-default. The stub embeds 'https://zddc.varasys.io/releases/'
|
|
||||||
# as a constant; sed swaps it for the chosen base when the operator's
|
|
||||||
# pointed at a different host. POSIX sed handles this fine (no escaping
|
|
||||||
# concerns since SOURCE doesn't contain ampersand or slash inside the host).
|
|
||||||
fetch_stub_with_source() {
|
|
||||||
_url="$1"; _dest="$2"
|
|
||||||
if [ "$DRY_RUN" = "1" ]; then
|
|
||||||
echo " [dry-run] $_url -> $_dest (rewrite source if needed)"
|
|
||||||
return 0
|
|
||||||
fi
|
|
||||||
echo " $_dest"
|
|
||||||
if [ "$SOURCE" = "https://zddc.varasys.io" ]; then
|
|
||||||
curl -fsSL "$_url" -o "$_dest"
|
|
||||||
else
|
|
||||||
# POSIX sed; pipe through stdin to avoid editing in place.
|
|
||||||
curl -fsSL "$_url" \
|
|
||||||
| sed "s|https://zddc.varasys.io/releases/|${SOURCE}/releases/|g" \
|
|
||||||
> "$_dest"
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
# --- Install ---------------------------------------------------------------
|
|
||||||
case "$MODE:$TARGET" in
|
|
||||||
copy:root)
|
|
||||||
# Five tool HTMLs at the root + level-1 _template/ for project subdirs.
|
|
||||||
for _t in $TOOL_LIST; do
|
|
||||||
fetch_to "$SOURCE/releases/${_t}${SUFFIX}.html" "${_t}.html"
|
|
||||||
done
|
|
||||||
# Landing always becomes index.html in the root install.
|
|
||||||
fetch_to "$SOURCE/releases/landing${SUFFIX}.html" "index.html"
|
|
||||||
if [ "$DRY_RUN" = "1" ]; then
|
|
||||||
echo " [dry-run] mkdir -p _template"
|
|
||||||
else
|
|
||||||
mkdir -p _template
|
|
||||||
fi
|
|
||||||
for _t in $TOOL_LIST; do
|
|
||||||
fetch_to "$SOURCE/bootstrap/level1/${_t}.html" "_template/${_t}.html"
|
|
||||||
done
|
|
||||||
;;
|
|
||||||
|
|
||||||
copy:project)
|
|
||||||
# Four level-1 stubs only — they fetch ../<tool>.html at load time.
|
|
||||||
for _t in $TOOL_LIST; do
|
|
||||||
fetch_to "$SOURCE/bootstrap/level1/${_t}.html" "${_t}.html"
|
|
||||||
done
|
|
||||||
;;
|
|
||||||
|
|
||||||
track:root)
|
|
||||||
# Five level-2 stubs (incl. landing as index.html) + _template/.
|
|
||||||
# Each stub fetches the channel from $SOURCE on every load.
|
|
||||||
for _t in $TOOL_LIST; do
|
|
||||||
fetch_stub_with_source "$SOURCE/bootstrap/track-$_chan_arg/${_t}.html" "${_t}.html"
|
|
||||||
done
|
|
||||||
fetch_stub_with_source "$SOURCE/bootstrap/track-$_chan_arg/index.html" "index.html"
|
|
||||||
if [ "$DRY_RUN" = "1" ]; then
|
|
||||||
echo " [dry-run] mkdir -p _template"
|
|
||||||
else
|
|
||||||
mkdir -p _template
|
|
||||||
fi
|
|
||||||
for _t in $TOOL_LIST; do
|
|
||||||
fetch_to "$SOURCE/bootstrap/level1/${_t}.html" "_template/${_t}.html"
|
|
||||||
done
|
|
||||||
;;
|
|
||||||
|
|
||||||
track:project)
|
|
||||||
# Same as copy:project — level-1 stubs are channel-agnostic
|
|
||||||
# (they fetch ../<tool>.html, which is whatever the root has).
|
|
||||||
for _t in $TOOL_LIST; do
|
|
||||||
fetch_to "$SOURCE/bootstrap/level1/${_t}.html" "${_t}.html"
|
|
||||||
done
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
echo "install.sh: done."
|
|
||||||
|
|
@ -1,74 +0,0 @@
|
||||||
<!doctype html>
|
|
||||||
<html lang="en">
|
|
||||||
<head>
|
|
||||||
<meta charset="utf-8">
|
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
||||||
<title>Loading {{TOOL_TITLE}}…</title>
|
|
||||||
<link rel="icon" type="image/svg+xml" href="{{FAVICON}}">
|
|
||||||
<style>html,body{margin:0;font:14px system-ui,sans-serif;color:#666;padding:1rem}</style>
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
Loading…
|
|
||||||
<script>
|
|
||||||
// Level-1 bootstrap. Fetches the tool from the deployment root (same
|
|
||||||
// origin) and document.write()s it in place. The target may be the real
|
|
||||||
// built tool HTML or a level-2 bootstrap that fetches from upstream.
|
|
||||||
//
|
|
||||||
// URL parameter ?v= selects a specific version or channel:
|
|
||||||
// ?v=0.0.4 (or v0.0.4) tries ../{{TOOL}}_v0.0.4.html locally
|
|
||||||
// ?v=alpha|beta|stable tries ../{{TOOL}}_<channel>.html locally
|
|
||||||
// (none) fetches ../{{TOOL}}.html (default)
|
|
||||||
//
|
|
||||||
// If the requested version is not staged locally, falls back to the
|
|
||||||
// root entry (../{{TOOL}}.html) — which, if it is a level-2 stub,
|
|
||||||
// forwards the param upstream to zddc.varasys.io. So ?v=0.0.4 works
|
|
||||||
// whether admins staged it locally OR a level-2 stub is at root.
|
|
||||||
//
|
|
||||||
// To pin this single tool to a fixed version permanently, replace the
|
|
||||||
// `fallback` constant below with an absolute URL like
|
|
||||||
// https://zddc.varasys.io/releases/{{TOOL}}_v0.0.4.html.
|
|
||||||
(async function () {
|
|
||||||
const params = new URLSearchParams(location.search);
|
|
||||||
const v = params.get('v');
|
|
||||||
const tool = '{{TOOL}}';
|
|
||||||
const channels = { alpha: '_alpha', beta: '_beta', stable: '_stable' };
|
|
||||||
|
|
||||||
function suffixFor(value) {
|
|
||||||
if (!value) return '';
|
|
||||||
if (value in channels) return channels[value];
|
|
||||||
const ver = value.startsWith('v') ? value.slice(1) : value;
|
|
||||||
return '_v' + ver;
|
|
||||||
}
|
|
||||||
|
|
||||||
const versioned = '../' + tool + suffixFor(v) + '.html';
|
|
||||||
const fallback = '../' + tool + '.html';
|
|
||||||
|
|
||||||
async function fetchHTML(url) {
|
|
||||||
const resp = await fetch(url, { cache: 'no-cache', credentials: 'omit' });
|
|
||||||
if (!resp.ok) throw new Error(resp.status + ' ' + resp.statusText);
|
|
||||||
return resp.text();
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
|
||||||
let html;
|
|
||||||
if (v && versioned !== fallback) {
|
|
||||||
try {
|
|
||||||
html = await fetchHTML(versioned);
|
|
||||||
} catch (_) {
|
|
||||||
// Versioned copy not staged locally — let the root entry forward
|
|
||||||
// the request (level-2 stub will see ?v= and fetch upstream).
|
|
||||||
html = await fetchHTML(fallback);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
html = await fetchHTML(fallback);
|
|
||||||
}
|
|
||||||
document.open();
|
|
||||||
document.write(html);
|
|
||||||
document.close();
|
|
||||||
} catch (err) {
|
|
||||||
document.body.textContent = 'Failed to load {{TOOL_TITLE}}: ' + err.message;
|
|
||||||
}
|
|
||||||
})();
|
|
||||||
</script>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
|
|
@ -1,56 +0,0 @@
|
||||||
<!doctype html>
|
|
||||||
<html lang="en">
|
|
||||||
<head>
|
|
||||||
<meta charset="utf-8">
|
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
||||||
<title>Loading {{TOOL_TITLE}}…</title>
|
|
||||||
<link rel="icon" type="image/svg+xml" href="{{FAVICON}}">
|
|
||||||
<style>html,body{margin:0;font:14px system-ui,sans-serif;color:#666;padding:1rem}</style>
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
Loading…
|
|
||||||
<script>
|
|
||||||
// Level-2 bootstrap. Fetches {{TOOL}} from zddc.varasys.io and
|
|
||||||
// document.write()s it in place. The default upstream is the
|
|
||||||
// {{CHANNEL}} channel; the URL parameter ?v= overrides it:
|
|
||||||
//
|
|
||||||
// ?v=stable | beta | alpha switch to that channel
|
|
||||||
// ?v=0.0.4 (or v0.0.4) pin to that exact stable version
|
|
||||||
// ?v=0.0 (or v0.0) pin to latest patch within 0.0.x (symlink)
|
|
||||||
// ?v=0 (or v0) pin to latest within 0.x (symlink)
|
|
||||||
// (none) use the {{CHANNEL}} default
|
|
||||||
//
|
|
||||||
// Resolution is purely static — every URL maps to a real file or a
|
|
||||||
// checked-in symlink under <upstream>/releases/. No manifest lookup,
|
|
||||||
// no JS indirection, no client-side version arithmetic.
|
|
||||||
(async function () {
|
|
||||||
const params = new URLSearchParams(location.search);
|
|
||||||
const v = params.get('v');
|
|
||||||
const tool = '{{TOOL}}';
|
|
||||||
const defaultChannel = '{{CHANNEL}}';
|
|
||||||
const channels = ['stable', 'beta', 'alpha'];
|
|
||||||
const base = 'https://zddc.varasys.io/releases/';
|
|
||||||
|
|
||||||
function suffixFor(value) {
|
|
||||||
if (!value) return '_' + defaultChannel;
|
|
||||||
if (channels.indexOf(value) >= 0) return '_' + value;
|
|
||||||
// Strip optional leading 'v', accept "0.0.4" / "0.0" / "0".
|
|
||||||
const ver = value.startsWith('v') ? value.slice(1) : value;
|
|
||||||
return '_v' + ver;
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
|
||||||
const assetUrl = base + tool + suffixFor(v) + '.html';
|
|
||||||
const resp = await fetch(assetUrl, { cache: 'no-cache', credentials: 'omit' });
|
|
||||||
if (!resp.ok) throw new Error(resp.status + ' ' + resp.statusText);
|
|
||||||
const html = await resp.text();
|
|
||||||
document.open();
|
|
||||||
document.write(html);
|
|
||||||
document.close();
|
|
||||||
} catch (err) {
|
|
||||||
document.body.textContent = 'Failed to load ' + tool + ': ' + err.message;
|
|
||||||
}
|
|
||||||
})();
|
|
||||||
</script>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
178
build.sh
178
build.sh
|
|
@ -2,7 +2,7 @@
|
||||||
set -eu
|
set -eu
|
||||||
|
|
||||||
# Top-level build script — builds all ZDDC HTML tools, the zddc-server
|
# Top-level build script — builds all ZDDC HTML tools, the zddc-server
|
||||||
# binaries, and the bootstrap stubs published under website/bootstrap/.
|
# binaries, and the website/releases/index.html versions index.
|
||||||
|
|
||||||
SCRIPT_DIR=$(cd "$(dirname "$0")" && pwd)
|
SCRIPT_DIR=$(cd "$(dirname "$0")" && pwd)
|
||||||
|
|
||||||
|
|
@ -16,114 +16,87 @@ sh "$SCRIPT_DIR/landing/build.sh" "${1:-}" "${2:-}"
|
||||||
|
|
||||||
echo ""
|
echo ""
|
||||||
echo "=== Assembling zddc/dist/web/ ==="
|
echo "=== Assembling zddc/dist/web/ ==="
|
||||||
# Only landing and archive ship inside the server bundle: they call the
|
# All five tool HTMLs ship inside the server bundle. landing and archive call
|
||||||
# server's JSON API (GET / for the project list, directory listings for the
|
# server APIs (GET / for the project list, directory listings for archive) and
|
||||||
# archive) and are useless without it. transmittal, classifier, and mdedit
|
# are useless without zddc-server. transmittal, classifier, and mdedit are
|
||||||
# are pure client-side tools that work from file:// or any static host;
|
# pure client-side tools but are still bundled — the server uses these copies
|
||||||
# they are released to website/ for download but not bundled with the server.
|
# as the embedded fallback (//go:embed in internal/apps/embedded/) when both
|
||||||
|
# the cache is empty AND the upstream is unreachable.
|
||||||
mkdir -p "$SCRIPT_DIR/zddc/dist/web"
|
mkdir -p "$SCRIPT_DIR/zddc/dist/web"
|
||||||
cp "$SCRIPT_DIR/landing/dist/index.html" "$SCRIPT_DIR/zddc/dist/web/index.html"
|
cp "$SCRIPT_DIR/landing/dist/index.html" "$SCRIPT_DIR/zddc/dist/web/index.html"
|
||||||
cp "$SCRIPT_DIR/archive/dist/archive.html" "$SCRIPT_DIR/zddc/dist/web/archive.html"
|
cp "$SCRIPT_DIR/archive/dist/archive.html" "$SCRIPT_DIR/zddc/dist/web/archive.html"
|
||||||
echo "Wrote zddc/dist/web/index.html"
|
cp "$SCRIPT_DIR/transmittal/dist/transmittal.html" "$SCRIPT_DIR/zddc/dist/web/transmittal.html"
|
||||||
echo "Wrote zddc/dist/web/archive.html"
|
cp "$SCRIPT_DIR/classifier/dist/classifier.html" "$SCRIPT_DIR/zddc/dist/web/classifier.html"
|
||||||
|
cp "$SCRIPT_DIR/mdedit/dist/mdedit.html" "$SCRIPT_DIR/zddc/dist/web/mdedit.html"
|
||||||
|
echo "Wrote zddc/dist/web/{index,archive,transmittal,classifier,mdedit}.html"
|
||||||
|
|
||||||
# Cross-compiled zddc-server binaries — only relevant if you're shipping
|
# Mirror the same five HTMLs into the Go embed source dir so the next
|
||||||
# standalone Linux/macOS/Windows binaries to users. Skipped silently when
|
# `go build` of zddc-server picks them up via //go:embed. Files are checked
|
||||||
# Go isn't on PATH. (zddc/release.sh handles the publish flow that
|
# into git as empty placeholders; the build always overwrites them with the
|
||||||
# uploads these to Codeberg release assets.)
|
# fresh dist/ output.
|
||||||
|
EMBED_DIR="$SCRIPT_DIR/zddc/internal/apps/embedded"
|
||||||
|
mkdir -p "$EMBED_DIR"
|
||||||
|
cp "$SCRIPT_DIR/landing/dist/index.html" "$EMBED_DIR/index.html"
|
||||||
|
cp "$SCRIPT_DIR/archive/dist/archive.html" "$EMBED_DIR/archive.html"
|
||||||
|
cp "$SCRIPT_DIR/transmittal/dist/transmittal.html" "$EMBED_DIR/transmittal.html"
|
||||||
|
cp "$SCRIPT_DIR/classifier/dist/classifier.html" "$EMBED_DIR/classifier.html"
|
||||||
|
cp "$SCRIPT_DIR/mdedit/dist/mdedit.html" "$EMBED_DIR/mdedit.html"
|
||||||
|
echo "Populated $EMBED_DIR/ for //go:embed"
|
||||||
|
|
||||||
|
# Cross-compiled zddc-server binaries for Linux/macOS/Windows. Always built
|
||||||
|
# inside docker.io/golang:1.24-alpine via podman (or docker), matching the
|
||||||
|
# helm/zddc-server-prod chart's `buildImage` so dev binaries are byte-for-byte
|
||||||
|
# what production gets. The build container is downloaded on first run.
|
||||||
echo ""
|
echo ""
|
||||||
echo "=== Building zddc-server binaries ==="
|
echo "=== Building zddc-server binaries (containerized) ==="
|
||||||
if command -v go >/dev/null 2>&1; then
|
mkdir -p "$SCRIPT_DIR/zddc/dist"
|
||||||
cd "$SCRIPT_DIR/zddc"
|
|
||||||
mkdir -p dist
|
# Pick a container runtime. Both work; podman is preferred (rootless default).
|
||||||
|
GO_RUNNER=""
|
||||||
|
if command -v podman >/dev/null 2>&1; then
|
||||||
|
GO_RUNNER=podman
|
||||||
|
elif command -v docker >/dev/null 2>&1; then
|
||||||
|
GO_RUNNER=docker
|
||||||
|
else
|
||||||
|
echo "error: neither podman nor docker is available — cannot build zddc-server binaries." >&2
|
||||||
|
echo " Install podman (preferred) or docker. zddc-server build is containerized as policy." >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
GO_BUILD_IMAGE="${ZDDC_GO_BUILD_IMAGE:-docker.io/golang:1.24-alpine}"
|
||||||
|
|
||||||
|
# Cache the Go module + build cache across runs via named volumes that
|
||||||
|
# persist between container invocations. Second build is fast.
|
||||||
|
GO_MOD_VOL="${ZDDC_GO_MOD_VOL:-zddc-go-mod}"
|
||||||
|
GO_BUILD_VOL="${ZDDC_GO_BUILD_VOL:-zddc-go-cache}"
|
||||||
|
|
||||||
|
# Single container invocation, multiple cross-compile targets inside a
|
||||||
|
# `for` loop — avoids paying image-startup overhead 4×.
|
||||||
|
"$GO_RUNNER" run --rm \
|
||||||
|
-v "$SCRIPT_DIR:/src:Z" \
|
||||||
|
-v "${GO_MOD_VOL}:/go/pkg/mod" \
|
||||||
|
-v "${GO_BUILD_VOL}:/root/.cache/go-build" \
|
||||||
|
-w /src/zddc \
|
||||||
|
-e GOFLAGS=-mod=mod \
|
||||||
|
-e CGO_ENABLED=0 \
|
||||||
|
"$GO_BUILD_IMAGE" \
|
||||||
|
sh -c '
|
||||||
|
set -e
|
||||||
for target in linux/amd64 darwin/amd64 darwin/arm64 windows/amd64; do
|
for target in linux/amd64 darwin/amd64 darwin/arm64 windows/amd64; do
|
||||||
os="${target%/*}"; arch="${target#*/}"
|
os="${target%/*}"; arch="${target#*/}"
|
||||||
out="zddc-server-${os}-${arch}"
|
out="zddc-server-${os}-${arch}"
|
||||||
case "$os" in windows) out="${out}.exe" ;; esac
|
case "$os" in windows) out="${out}.exe" ;; esac
|
||||||
echo " building $out"
|
echo " building $out"
|
||||||
CGO_ENABLED=0 GOOS="$os" GOARCH="$arch" \
|
GOOS="$os" GOARCH="$arch" \
|
||||||
go build -trimpath -ldflags="-s -w" -o "dist/$out" ./cmd/zddc-server
|
go build -trimpath -ldflags="-s -w" -o "dist/$out" ./cmd/zddc-server
|
||||||
done
|
done
|
||||||
cd "$SCRIPT_DIR"
|
'
|
||||||
else
|
|
||||||
echo "go not found — skipping cross-compiled binary build."
|
|
||||||
echo " (Install Go 1.24+ to build standalone binaries.)"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# ─── Bootstrap stubs ─────────────────────────────────────────────────────────
|
|
||||||
# Generated from bootstrap/level{1,2}.html.tmpl on every build and published
|
|
||||||
# as standalone files under website/bootstrap/. The website's "Install on
|
|
||||||
# your server" section prints copy-pasteable shell snippets that curl these
|
|
||||||
# files into the operator's deployment directory.
|
|
||||||
#
|
|
||||||
# bootstrap/level1/<tool>.html — same-origin stubs for
|
|
||||||
# <project>/<tool>.html (4 tools;
|
|
||||||
# landing only lives at root)
|
|
||||||
# bootstrap/track-<channel>/<tool>.html — level-2 stubs that fetch the
|
|
||||||
# named channel from upstream
|
|
||||||
# (5 tools × 3 channels = 15)
|
|
||||||
|
|
||||||
WEBSITE_DIR="$SCRIPT_DIR/website"
|
WEBSITE_DIR="$SCRIPT_DIR/website"
|
||||||
RELEASES_DIR="$WEBSITE_DIR/releases"
|
RELEASES_DIR="$WEBSITE_DIR/releases"
|
||||||
BOOTSTRAP_DIR="$SCRIPT_DIR/bootstrap"
|
|
||||||
|
|
||||||
mkdir -p "$WEBSITE_DIR"
|
mkdir -p "$WEBSITE_DIR"
|
||||||
|
|
||||||
# tool|filename|title
|
|
||||||
TOOL_TABLE='archive|archive.html|Archive
|
|
||||||
transmittal|transmittal.html|Transmittal
|
|
||||||
classifier|classifier.html|Classifier
|
|
||||||
mdedit|mdedit.html|Markdown Editor
|
|
||||||
landing|index.html|ZDDC'
|
|
||||||
|
|
||||||
# Substitute {{TOOL}}, {{TOOL_TITLE}}, {{CHANNEL}}, {{FAVICON}} in a template.
|
|
||||||
# The favicon is a base64-encoded data URI built once from shared/favicon.svg.
|
|
||||||
_favicon_data_uri=""
|
|
||||||
if [ -f "$SCRIPT_DIR/shared/favicon.svg" ]; then
|
|
||||||
_favicon_data_uri="data:image/svg+xml;base64,$(base64 -w 0 "$SCRIPT_DIR/shared/favicon.svg")"
|
|
||||||
fi
|
|
||||||
render_stub() {
|
|
||||||
sed \
|
|
||||||
-e "s|{{TOOL_TITLE}}|$3|g" \
|
|
||||||
-e "s|{{TOOL}}|$2|g" \
|
|
||||||
-e "s|{{CHANNEL}}|${4:-}|g" \
|
|
||||||
-e "s|{{FAVICON}}|$_favicon_data_uri|g" \
|
|
||||||
"$1" > "$5"
|
|
||||||
}
|
|
||||||
|
|
||||||
build_bootstrap_stubs() {
|
|
||||||
_stubs="$WEBSITE_DIR/bootstrap"
|
|
||||||
rm -rf "$_stubs"
|
|
||||||
mkdir -p "$_stubs/level1"
|
|
||||||
|
|
||||||
# Level-1 stubs (same-origin, channel-agnostic). Drop into a project
|
|
||||||
# subdirectory so <project>/<tool>.html fetches ../<tool>.html.
|
|
||||||
# Landing has no level-1 stub — landing only lives at deployment root.
|
|
||||||
while IFS='|' read -r _tool _file _title; do
|
|
||||||
render_stub "$BOOTSTRAP_DIR/level1.html.tmpl" "$_tool" "$_title" "" \
|
|
||||||
"$_stubs/level1/$_file"
|
|
||||||
done <<EOF
|
|
||||||
archive|archive.html|Archive
|
|
||||||
transmittal|transmittal.html|Transmittal
|
|
||||||
classifier|classifier.html|Classifier
|
|
||||||
mdedit|mdedit.html|Markdown Editor
|
|
||||||
EOF
|
|
||||||
echo "Wrote $_stubs/level1/{archive,transmittal,classifier,mdedit}.html"
|
|
||||||
|
|
||||||
# Level-2 stubs, one set per channel. Each fetches its named channel
|
|
||||||
# from upstream on every page load.
|
|
||||||
for _channel in alpha beta stable; do
|
|
||||||
mkdir -p "$_stubs/track-$_channel"
|
|
||||||
while IFS='|' read -r _tool _file _title; do
|
|
||||||
render_stub "$BOOTSTRAP_DIR/level2.html.tmpl" "$_tool" "$_title" "$_channel" \
|
|
||||||
"$_stubs/track-$_channel/$_file"
|
|
||||||
done <<EOF
|
|
||||||
$TOOL_TABLE
|
|
||||||
EOF
|
|
||||||
echo "Wrote $_stubs/track-$_channel/ (5 stubs)"
|
|
||||||
done
|
|
||||||
}
|
|
||||||
|
|
||||||
# Regenerate website/releases/index.html from a filesystem scan of
|
# Regenerate website/releases/index.html from a filesystem scan of
|
||||||
# website/releases/. Lists per-version files (real .html files, immutable
|
# website/releases/. Lists per-version files (real .html files, immutable
|
||||||
# archives) plus channel mirrors and partial-version pins (symlinks).
|
# archives) plus channel mirrors and partial-version pins (symlinks).
|
||||||
|
|
@ -179,9 +152,14 @@ build_releases_index() {
|
||||||
<header class="site-header">
|
<header class="site-header">
|
||||||
<div class="container header-content">
|
<div class="container header-content">
|
||||||
<a href="/" class="brand">
|
<a href="/" class="brand">
|
||||||
<div class="brand-logo">
|
<svg class="brand-logo" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64" aria-hidden="true">
|
||||||
<svg viewBox="0 0 24 24"><path d="M3 5h18v2H3V5zm0 6h12v2H3v-2zm0 6h6v2H3v-2z" /></svg>
|
<rect width="64" height="64" rx="12" fill="#1e3a5f"/>
|
||||||
</div>
|
<g fill="#fff">
|
||||||
|
<rect x="14" y="18" width="36" height="7"/>
|
||||||
|
<polygon points="43,25 50,25 21,43 14,43"/>
|
||||||
|
<rect x="14" y="43" width="36" height="7"/>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
<span class="brand-name">ZDDC</span>
|
<span class="brand-name">ZDDC</span>
|
||||||
</a>
|
</a>
|
||||||
<nav class="header-nav">
|
<nav class="header-nav">
|
||||||
|
|
@ -260,7 +238,7 @@ HEAD
|
||||||
cat <<'TAIL'
|
cat <<'TAIL'
|
||||||
|
|
||||||
<section style="margin-top: var(--spacing-2xl); color: var(--color-text-muted); font-size: 0.9rem;">
|
<section style="margin-top: var(--spacing-2xl); color: var(--color-text-muted); font-size: 0.9rem;">
|
||||||
<p>Append <code>?v=stable</code>, <code>?v=beta</code>, <code>?v=alpha</code>, <code>?v=0.0</code> (latest 0.0.x), or <code>?v=0.0.1</code> (exact) to any deployment URL to switch versions for a single request — see <a href="../">the home page</a>.</p>
|
<p>Each link above is a real static file (or a checked-in symlink resolving to one). Channel chips track the current build of that channel and may change at any time; per-version files are immutable. To install or pin in your own deployment, see <a href="../">the home page</a>.</p>
|
||||||
</section>
|
</section>
|
||||||
</main>
|
</main>
|
||||||
|
|
||||||
|
|
@ -277,8 +255,7 @@ TAIL
|
||||||
}
|
}
|
||||||
|
|
||||||
echo ""
|
echo ""
|
||||||
echo "=== Building bootstrap stubs and releases/index.html ==="
|
echo "=== Building releases/index.html ==="
|
||||||
build_bootstrap_stubs
|
|
||||||
build_releases_index
|
build_releases_index
|
||||||
|
|
||||||
echo ""
|
echo ""
|
||||||
|
|
@ -288,9 +265,4 @@ echo "Server deployment package: zddc/dist/"
|
||||||
echo " Binaries: zddc-server-{linux,darwin,windows}-*"
|
echo " Binaries: zddc-server-{linux,darwin,windows}-*"
|
||||||
echo " Web files: web/ (copy contents to ZDDC_ROOT)"
|
echo " Web files: web/ (copy contents to ZDDC_ROOT)"
|
||||||
echo ""
|
echo ""
|
||||||
echo "Bootstrap stubs: website/bootstrap/"
|
echo "Operator install: see website/index.html 'Install on your server'."
|
||||||
echo " level1/<tool>.html — same-origin stubs for project subdirs"
|
|
||||||
echo " track-{alpha,beta,stable}/ — level-2 stubs for each channel"
|
|
||||||
echo ""
|
|
||||||
echo "The home page's 'Install on your server' section prints copy-pasteable"
|
|
||||||
echo "shell snippets that curl these files into the operator's deployment dir."
|
|
||||||
|
|
|
||||||
|
|
@ -1,74 +0,0 @@
|
||||||
<!doctype html>
|
|
||||||
<html lang="en">
|
|
||||||
<head>
|
|
||||||
<meta charset="utf-8">
|
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
||||||
<title>Loading Archive…</title>
|
|
||||||
<link rel="icon" type="image/svg+xml" href="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA2NCA2NCI+CiAgPHJlY3Qgd2lkdGg9IjY0IiBoZWlnaHQ9IjY0IiByeD0iMTIiIGZpbGw9IiMxZTNhNWYiLz4KICA8ZyBmaWxsPSIjZmZmIj4KICAgIDxyZWN0IHg9IjE0IiB5PSIxOCIgd2lkdGg9IjM2IiBoZWlnaHQ9IjciLz4KICAgIDxwb2x5Z29uIHBvaW50cz0iNDMsMjUgNTAsMjUgMjEsNDMgMTQsNDMiLz4KICAgIDxyZWN0IHg9IjE0IiB5PSI0MyIgd2lkdGg9IjM2IiBoZWlnaHQ9IjciLz4KICA8L2c+Cjwvc3ZnPgo=">
|
|
||||||
<style>html,body{margin:0;font:14px system-ui,sans-serif;color:#666;padding:1rem}</style>
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
Loading…
|
|
||||||
<script>
|
|
||||||
// Level-1 bootstrap. Fetches the tool from the deployment root (same
|
|
||||||
// origin) and document.write()s it in place. The target may be the real
|
|
||||||
// built tool HTML or a level-2 bootstrap that fetches from upstream.
|
|
||||||
//
|
|
||||||
// URL parameter ?v= selects a specific version or channel:
|
|
||||||
// ?v=0.0.4 (or v0.0.4) tries ../archive_v0.0.4.html locally
|
|
||||||
// ?v=alpha|beta|stable tries ../archive_<channel>.html locally
|
|
||||||
// (none) fetches ../archive.html (default)
|
|
||||||
//
|
|
||||||
// If the requested version is not staged locally, falls back to the
|
|
||||||
// root entry (../archive.html) — which, if it is a level-2 stub,
|
|
||||||
// forwards the param upstream to zddc.varasys.io. So ?v=0.0.4 works
|
|
||||||
// whether admins staged it locally OR a level-2 stub is at root.
|
|
||||||
//
|
|
||||||
// To pin this single tool to a fixed version permanently, replace the
|
|
||||||
// `fallback` constant below with an absolute URL like
|
|
||||||
// https://zddc.varasys.io/releases/archive_v0.0.4.html.
|
|
||||||
(async function () {
|
|
||||||
const params = new URLSearchParams(location.search);
|
|
||||||
const v = params.get('v');
|
|
||||||
const tool = 'archive';
|
|
||||||
const channels = { alpha: '_alpha', beta: '_beta', stable: '_stable' };
|
|
||||||
|
|
||||||
function suffixFor(value) {
|
|
||||||
if (!value) return '';
|
|
||||||
if (value in channels) return channels[value];
|
|
||||||
const ver = value.startsWith('v') ? value.slice(1) : value;
|
|
||||||
return '_v' + ver;
|
|
||||||
}
|
|
||||||
|
|
||||||
const versioned = '../' + tool + suffixFor(v) + '.html';
|
|
||||||
const fallback = '../' + tool + '.html';
|
|
||||||
|
|
||||||
async function fetchHTML(url) {
|
|
||||||
const resp = await fetch(url, { cache: 'no-cache', credentials: 'omit' });
|
|
||||||
if (!resp.ok) throw new Error(resp.status + ' ' + resp.statusText);
|
|
||||||
return resp.text();
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
|
||||||
let html;
|
|
||||||
if (v && versioned !== fallback) {
|
|
||||||
try {
|
|
||||||
html = await fetchHTML(versioned);
|
|
||||||
} catch (_) {
|
|
||||||
// Versioned copy not staged locally — let the root entry forward
|
|
||||||
// the request (level-2 stub will see ?v= and fetch upstream).
|
|
||||||
html = await fetchHTML(fallback);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
html = await fetchHTML(fallback);
|
|
||||||
}
|
|
||||||
document.open();
|
|
||||||
document.write(html);
|
|
||||||
document.close();
|
|
||||||
} catch (err) {
|
|
||||||
document.body.textContent = 'Failed to load Archive: ' + err.message;
|
|
||||||
}
|
|
||||||
})();
|
|
||||||
</script>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
|
|
@ -1,74 +0,0 @@
|
||||||
<!doctype html>
|
|
||||||
<html lang="en">
|
|
||||||
<head>
|
|
||||||
<meta charset="utf-8">
|
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
||||||
<title>Loading Classifier…</title>
|
|
||||||
<link rel="icon" type="image/svg+xml" href="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA2NCA2NCI+CiAgPHJlY3Qgd2lkdGg9IjY0IiBoZWlnaHQ9IjY0IiByeD0iMTIiIGZpbGw9IiMxZTNhNWYiLz4KICA8ZyBmaWxsPSIjZmZmIj4KICAgIDxyZWN0IHg9IjE0IiB5PSIxOCIgd2lkdGg9IjM2IiBoZWlnaHQ9IjciLz4KICAgIDxwb2x5Z29uIHBvaW50cz0iNDMsMjUgNTAsMjUgMjEsNDMgMTQsNDMiLz4KICAgIDxyZWN0IHg9IjE0IiB5PSI0MyIgd2lkdGg9IjM2IiBoZWlnaHQ9IjciLz4KICA8L2c+Cjwvc3ZnPgo=">
|
|
||||||
<style>html,body{margin:0;font:14px system-ui,sans-serif;color:#666;padding:1rem}</style>
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
Loading…
|
|
||||||
<script>
|
|
||||||
// Level-1 bootstrap. Fetches the tool from the deployment root (same
|
|
||||||
// origin) and document.write()s it in place. The target may be the real
|
|
||||||
// built tool HTML or a level-2 bootstrap that fetches from upstream.
|
|
||||||
//
|
|
||||||
// URL parameter ?v= selects a specific version or channel:
|
|
||||||
// ?v=0.0.4 (or v0.0.4) tries ../classifier_v0.0.4.html locally
|
|
||||||
// ?v=alpha|beta|stable tries ../classifier_<channel>.html locally
|
|
||||||
// (none) fetches ../classifier.html (default)
|
|
||||||
//
|
|
||||||
// If the requested version is not staged locally, falls back to the
|
|
||||||
// root entry (../classifier.html) — which, if it is a level-2 stub,
|
|
||||||
// forwards the param upstream to zddc.varasys.io. So ?v=0.0.4 works
|
|
||||||
// whether admins staged it locally OR a level-2 stub is at root.
|
|
||||||
//
|
|
||||||
// To pin this single tool to a fixed version permanently, replace the
|
|
||||||
// `fallback` constant below with an absolute URL like
|
|
||||||
// https://zddc.varasys.io/releases/classifier_v0.0.4.html.
|
|
||||||
(async function () {
|
|
||||||
const params = new URLSearchParams(location.search);
|
|
||||||
const v = params.get('v');
|
|
||||||
const tool = 'classifier';
|
|
||||||
const channels = { alpha: '_alpha', beta: '_beta', stable: '_stable' };
|
|
||||||
|
|
||||||
function suffixFor(value) {
|
|
||||||
if (!value) return '';
|
|
||||||
if (value in channels) return channels[value];
|
|
||||||
const ver = value.startsWith('v') ? value.slice(1) : value;
|
|
||||||
return '_v' + ver;
|
|
||||||
}
|
|
||||||
|
|
||||||
const versioned = '../' + tool + suffixFor(v) + '.html';
|
|
||||||
const fallback = '../' + tool + '.html';
|
|
||||||
|
|
||||||
async function fetchHTML(url) {
|
|
||||||
const resp = await fetch(url, { cache: 'no-cache', credentials: 'omit' });
|
|
||||||
if (!resp.ok) throw new Error(resp.status + ' ' + resp.statusText);
|
|
||||||
return resp.text();
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
|
||||||
let html;
|
|
||||||
if (v && versioned !== fallback) {
|
|
||||||
try {
|
|
||||||
html = await fetchHTML(versioned);
|
|
||||||
} catch (_) {
|
|
||||||
// Versioned copy not staged locally — let the root entry forward
|
|
||||||
// the request (level-2 stub will see ?v= and fetch upstream).
|
|
||||||
html = await fetchHTML(fallback);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
html = await fetchHTML(fallback);
|
|
||||||
}
|
|
||||||
document.open();
|
|
||||||
document.write(html);
|
|
||||||
document.close();
|
|
||||||
} catch (err) {
|
|
||||||
document.body.textContent = 'Failed to load Classifier: ' + err.message;
|
|
||||||
}
|
|
||||||
})();
|
|
||||||
</script>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
|
|
@ -1,74 +0,0 @@
|
||||||
<!doctype html>
|
|
||||||
<html lang="en">
|
|
||||||
<head>
|
|
||||||
<meta charset="utf-8">
|
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
||||||
<title>Loading Markdown Editor…</title>
|
|
||||||
<link rel="icon" type="image/svg+xml" href="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA2NCA2NCI+CiAgPHJlY3Qgd2lkdGg9IjY0IiBoZWlnaHQ9IjY0IiByeD0iMTIiIGZpbGw9IiMxZTNhNWYiLz4KICA8ZyBmaWxsPSIjZmZmIj4KICAgIDxyZWN0IHg9IjE0IiB5PSIxOCIgd2lkdGg9IjM2IiBoZWlnaHQ9IjciLz4KICAgIDxwb2x5Z29uIHBvaW50cz0iNDMsMjUgNTAsMjUgMjEsNDMgMTQsNDMiLz4KICAgIDxyZWN0IHg9IjE0IiB5PSI0MyIgd2lkdGg9IjM2IiBoZWlnaHQ9IjciLz4KICA8L2c+Cjwvc3ZnPgo=">
|
|
||||||
<style>html,body{margin:0;font:14px system-ui,sans-serif;color:#666;padding:1rem}</style>
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
Loading…
|
|
||||||
<script>
|
|
||||||
// Level-1 bootstrap. Fetches the tool from the deployment root (same
|
|
||||||
// origin) and document.write()s it in place. The target may be the real
|
|
||||||
// built tool HTML or a level-2 bootstrap that fetches from upstream.
|
|
||||||
//
|
|
||||||
// URL parameter ?v= selects a specific version or channel:
|
|
||||||
// ?v=0.0.4 (or v0.0.4) tries ../mdedit_v0.0.4.html locally
|
|
||||||
// ?v=alpha|beta|stable tries ../mdedit_<channel>.html locally
|
|
||||||
// (none) fetches ../mdedit.html (default)
|
|
||||||
//
|
|
||||||
// If the requested version is not staged locally, falls back to the
|
|
||||||
// root entry (../mdedit.html) — which, if it is a level-2 stub,
|
|
||||||
// forwards the param upstream to zddc.varasys.io. So ?v=0.0.4 works
|
|
||||||
// whether admins staged it locally OR a level-2 stub is at root.
|
|
||||||
//
|
|
||||||
// To pin this single tool to a fixed version permanently, replace the
|
|
||||||
// `fallback` constant below with an absolute URL like
|
|
||||||
// https://zddc.varasys.io/releases/mdedit_v0.0.4.html.
|
|
||||||
(async function () {
|
|
||||||
const params = new URLSearchParams(location.search);
|
|
||||||
const v = params.get('v');
|
|
||||||
const tool = 'mdedit';
|
|
||||||
const channels = { alpha: '_alpha', beta: '_beta', stable: '_stable' };
|
|
||||||
|
|
||||||
function suffixFor(value) {
|
|
||||||
if (!value) return '';
|
|
||||||
if (value in channels) return channels[value];
|
|
||||||
const ver = value.startsWith('v') ? value.slice(1) : value;
|
|
||||||
return '_v' + ver;
|
|
||||||
}
|
|
||||||
|
|
||||||
const versioned = '../' + tool + suffixFor(v) + '.html';
|
|
||||||
const fallback = '../' + tool + '.html';
|
|
||||||
|
|
||||||
async function fetchHTML(url) {
|
|
||||||
const resp = await fetch(url, { cache: 'no-cache', credentials: 'omit' });
|
|
||||||
if (!resp.ok) throw new Error(resp.status + ' ' + resp.statusText);
|
|
||||||
return resp.text();
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
|
||||||
let html;
|
|
||||||
if (v && versioned !== fallback) {
|
|
||||||
try {
|
|
||||||
html = await fetchHTML(versioned);
|
|
||||||
} catch (_) {
|
|
||||||
// Versioned copy not staged locally — let the root entry forward
|
|
||||||
// the request (level-2 stub will see ?v= and fetch upstream).
|
|
||||||
html = await fetchHTML(fallback);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
html = await fetchHTML(fallback);
|
|
||||||
}
|
|
||||||
document.open();
|
|
||||||
document.write(html);
|
|
||||||
document.close();
|
|
||||||
} catch (err) {
|
|
||||||
document.body.textContent = 'Failed to load Markdown Editor: ' + err.message;
|
|
||||||
}
|
|
||||||
})();
|
|
||||||
</script>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
|
|
@ -1,74 +0,0 @@
|
||||||
<!doctype html>
|
|
||||||
<html lang="en">
|
|
||||||
<head>
|
|
||||||
<meta charset="utf-8">
|
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
||||||
<title>Loading Transmittal…</title>
|
|
||||||
<link rel="icon" type="image/svg+xml" href="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA2NCA2NCI+CiAgPHJlY3Qgd2lkdGg9IjY0IiBoZWlnaHQ9IjY0IiByeD0iMTIiIGZpbGw9IiMxZTNhNWYiLz4KICA8ZyBmaWxsPSIjZmZmIj4KICAgIDxyZWN0IHg9IjE0IiB5PSIxOCIgd2lkdGg9IjM2IiBoZWlnaHQ9IjciLz4KICAgIDxwb2x5Z29uIHBvaW50cz0iNDMsMjUgNTAsMjUgMjEsNDMgMTQsNDMiLz4KICAgIDxyZWN0IHg9IjE0IiB5PSI0MyIgd2lkdGg9IjM2IiBoZWlnaHQ9IjciLz4KICA8L2c+Cjwvc3ZnPgo=">
|
|
||||||
<style>html,body{margin:0;font:14px system-ui,sans-serif;color:#666;padding:1rem}</style>
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
Loading…
|
|
||||||
<script>
|
|
||||||
// Level-1 bootstrap. Fetches the tool from the deployment root (same
|
|
||||||
// origin) and document.write()s it in place. The target may be the real
|
|
||||||
// built tool HTML or a level-2 bootstrap that fetches from upstream.
|
|
||||||
//
|
|
||||||
// URL parameter ?v= selects a specific version or channel:
|
|
||||||
// ?v=0.0.4 (or v0.0.4) tries ../transmittal_v0.0.4.html locally
|
|
||||||
// ?v=alpha|beta|stable tries ../transmittal_<channel>.html locally
|
|
||||||
// (none) fetches ../transmittal.html (default)
|
|
||||||
//
|
|
||||||
// If the requested version is not staged locally, falls back to the
|
|
||||||
// root entry (../transmittal.html) — which, if it is a level-2 stub,
|
|
||||||
// forwards the param upstream to zddc.varasys.io. So ?v=0.0.4 works
|
|
||||||
// whether admins staged it locally OR a level-2 stub is at root.
|
|
||||||
//
|
|
||||||
// To pin this single tool to a fixed version permanently, replace the
|
|
||||||
// `fallback` constant below with an absolute URL like
|
|
||||||
// https://zddc.varasys.io/releases/transmittal_v0.0.4.html.
|
|
||||||
(async function () {
|
|
||||||
const params = new URLSearchParams(location.search);
|
|
||||||
const v = params.get('v');
|
|
||||||
const tool = 'transmittal';
|
|
||||||
const channels = { alpha: '_alpha', beta: '_beta', stable: '_stable' };
|
|
||||||
|
|
||||||
function suffixFor(value) {
|
|
||||||
if (!value) return '';
|
|
||||||
if (value in channels) return channels[value];
|
|
||||||
const ver = value.startsWith('v') ? value.slice(1) : value;
|
|
||||||
return '_v' + ver;
|
|
||||||
}
|
|
||||||
|
|
||||||
const versioned = '../' + tool + suffixFor(v) + '.html';
|
|
||||||
const fallback = '../' + tool + '.html';
|
|
||||||
|
|
||||||
async function fetchHTML(url) {
|
|
||||||
const resp = await fetch(url, { cache: 'no-cache', credentials: 'omit' });
|
|
||||||
if (!resp.ok) throw new Error(resp.status + ' ' + resp.statusText);
|
|
||||||
return resp.text();
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
|
||||||
let html;
|
|
||||||
if (v && versioned !== fallback) {
|
|
||||||
try {
|
|
||||||
html = await fetchHTML(versioned);
|
|
||||||
} catch (_) {
|
|
||||||
// Versioned copy not staged locally — let the root entry forward
|
|
||||||
// the request (level-2 stub will see ?v= and fetch upstream).
|
|
||||||
html = await fetchHTML(fallback);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
html = await fetchHTML(fallback);
|
|
||||||
}
|
|
||||||
document.open();
|
|
||||||
document.write(html);
|
|
||||||
document.close();
|
|
||||||
} catch (err) {
|
|
||||||
document.body.textContent = 'Failed to load Transmittal: ' + err.message;
|
|
||||||
}
|
|
||||||
})();
|
|
||||||
</script>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
|
|
@ -1,56 +0,0 @@
|
||||||
<!doctype html>
|
|
||||||
<html lang="en">
|
|
||||||
<head>
|
|
||||||
<meta charset="utf-8">
|
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
||||||
<title>Loading Archive…</title>
|
|
||||||
<link rel="icon" type="image/svg+xml" href="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA2NCA2NCI+CiAgPHJlY3Qgd2lkdGg9IjY0IiBoZWlnaHQ9IjY0IiByeD0iMTIiIGZpbGw9IiMxZTNhNWYiLz4KICA8ZyBmaWxsPSIjZmZmIj4KICAgIDxyZWN0IHg9IjE0IiB5PSIxOCIgd2lkdGg9IjM2IiBoZWlnaHQ9IjciLz4KICAgIDxwb2x5Z29uIHBvaW50cz0iNDMsMjUgNTAsMjUgMjEsNDMgMTQsNDMiLz4KICAgIDxyZWN0IHg9IjE0IiB5PSI0MyIgd2lkdGg9IjM2IiBoZWlnaHQ9IjciLz4KICA8L2c+Cjwvc3ZnPgo=">
|
|
||||||
<style>html,body{margin:0;font:14px system-ui,sans-serif;color:#666;padding:1rem}</style>
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
Loading…
|
|
||||||
<script>
|
|
||||||
// Level-2 bootstrap. Fetches archive from zddc.varasys.io and
|
|
||||||
// document.write()s it in place. The default upstream is the
|
|
||||||
// alpha channel; the URL parameter ?v= overrides it:
|
|
||||||
//
|
|
||||||
// ?v=stable | beta | alpha switch to that channel
|
|
||||||
// ?v=0.0.4 (or v0.0.4) pin to that exact stable version
|
|
||||||
// ?v=0.0 (or v0.0) pin to latest patch within 0.0.x (symlink)
|
|
||||||
// ?v=0 (or v0) pin to latest within 0.x (symlink)
|
|
||||||
// (none) use the alpha default
|
|
||||||
//
|
|
||||||
// Resolution is purely static — every URL maps to a real file or a
|
|
||||||
// checked-in symlink under <upstream>/releases/. No manifest lookup,
|
|
||||||
// no JS indirection, no client-side version arithmetic.
|
|
||||||
(async function () {
|
|
||||||
const params = new URLSearchParams(location.search);
|
|
||||||
const v = params.get('v');
|
|
||||||
const tool = 'archive';
|
|
||||||
const defaultChannel = 'alpha';
|
|
||||||
const channels = ['stable', 'beta', 'alpha'];
|
|
||||||
const base = 'https://zddc.varasys.io/releases/';
|
|
||||||
|
|
||||||
function suffixFor(value) {
|
|
||||||
if (!value) return '_' + defaultChannel;
|
|
||||||
if (channels.indexOf(value) >= 0) return '_' + value;
|
|
||||||
// Strip optional leading 'v', accept "0.0.4" / "0.0" / "0".
|
|
||||||
const ver = value.startsWith('v') ? value.slice(1) : value;
|
|
||||||
return '_v' + ver;
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
|
||||||
const assetUrl = base + tool + suffixFor(v) + '.html';
|
|
||||||
const resp = await fetch(assetUrl, { cache: 'no-cache', credentials: 'omit' });
|
|
||||||
if (!resp.ok) throw new Error(resp.status + ' ' + resp.statusText);
|
|
||||||
const html = await resp.text();
|
|
||||||
document.open();
|
|
||||||
document.write(html);
|
|
||||||
document.close();
|
|
||||||
} catch (err) {
|
|
||||||
document.body.textContent = 'Failed to load ' + tool + ': ' + err.message;
|
|
||||||
}
|
|
||||||
})();
|
|
||||||
</script>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
|
|
@ -1,56 +0,0 @@
|
||||||
<!doctype html>
|
|
||||||
<html lang="en">
|
|
||||||
<head>
|
|
||||||
<meta charset="utf-8">
|
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
||||||
<title>Loading Classifier…</title>
|
|
||||||
<link rel="icon" type="image/svg+xml" href="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA2NCA2NCI+CiAgPHJlY3Qgd2lkdGg9IjY0IiBoZWlnaHQ9IjY0IiByeD0iMTIiIGZpbGw9IiMxZTNhNWYiLz4KICA8ZyBmaWxsPSIjZmZmIj4KICAgIDxyZWN0IHg9IjE0IiB5PSIxOCIgd2lkdGg9IjM2IiBoZWlnaHQ9IjciLz4KICAgIDxwb2x5Z29uIHBvaW50cz0iNDMsMjUgNTAsMjUgMjEsNDMgMTQsNDMiLz4KICAgIDxyZWN0IHg9IjE0IiB5PSI0MyIgd2lkdGg9IjM2IiBoZWlnaHQ9IjciLz4KICA8L2c+Cjwvc3ZnPgo=">
|
|
||||||
<style>html,body{margin:0;font:14px system-ui,sans-serif;color:#666;padding:1rem}</style>
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
Loading…
|
|
||||||
<script>
|
|
||||||
// Level-2 bootstrap. Fetches classifier from zddc.varasys.io and
|
|
||||||
// document.write()s it in place. The default upstream is the
|
|
||||||
// alpha channel; the URL parameter ?v= overrides it:
|
|
||||||
//
|
|
||||||
// ?v=stable | beta | alpha switch to that channel
|
|
||||||
// ?v=0.0.4 (or v0.0.4) pin to that exact stable version
|
|
||||||
// ?v=0.0 (or v0.0) pin to latest patch within 0.0.x (symlink)
|
|
||||||
// ?v=0 (or v0) pin to latest within 0.x (symlink)
|
|
||||||
// (none) use the alpha default
|
|
||||||
//
|
|
||||||
// Resolution is purely static — every URL maps to a real file or a
|
|
||||||
// checked-in symlink under <upstream>/releases/. No manifest lookup,
|
|
||||||
// no JS indirection, no client-side version arithmetic.
|
|
||||||
(async function () {
|
|
||||||
const params = new URLSearchParams(location.search);
|
|
||||||
const v = params.get('v');
|
|
||||||
const tool = 'classifier';
|
|
||||||
const defaultChannel = 'alpha';
|
|
||||||
const channels = ['stable', 'beta', 'alpha'];
|
|
||||||
const base = 'https://zddc.varasys.io/releases/';
|
|
||||||
|
|
||||||
function suffixFor(value) {
|
|
||||||
if (!value) return '_' + defaultChannel;
|
|
||||||
if (channels.indexOf(value) >= 0) return '_' + value;
|
|
||||||
// Strip optional leading 'v', accept "0.0.4" / "0.0" / "0".
|
|
||||||
const ver = value.startsWith('v') ? value.slice(1) : value;
|
|
||||||
return '_v' + ver;
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
|
||||||
const assetUrl = base + tool + suffixFor(v) + '.html';
|
|
||||||
const resp = await fetch(assetUrl, { cache: 'no-cache', credentials: 'omit' });
|
|
||||||
if (!resp.ok) throw new Error(resp.status + ' ' + resp.statusText);
|
|
||||||
const html = await resp.text();
|
|
||||||
document.open();
|
|
||||||
document.write(html);
|
|
||||||
document.close();
|
|
||||||
} catch (err) {
|
|
||||||
document.body.textContent = 'Failed to load ' + tool + ': ' + err.message;
|
|
||||||
}
|
|
||||||
})();
|
|
||||||
</script>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
|
|
@ -1,56 +0,0 @@
|
||||||
<!doctype html>
|
|
||||||
<html lang="en">
|
|
||||||
<head>
|
|
||||||
<meta charset="utf-8">
|
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
||||||
<title>Loading ZDDC…</title>
|
|
||||||
<link rel="icon" type="image/svg+xml" href="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA2NCA2NCI+CiAgPHJlY3Qgd2lkdGg9IjY0IiBoZWlnaHQ9IjY0IiByeD0iMTIiIGZpbGw9IiMxZTNhNWYiLz4KICA8ZyBmaWxsPSIjZmZmIj4KICAgIDxyZWN0IHg9IjE0IiB5PSIxOCIgd2lkdGg9IjM2IiBoZWlnaHQ9IjciLz4KICAgIDxwb2x5Z29uIHBvaW50cz0iNDMsMjUgNTAsMjUgMjEsNDMgMTQsNDMiLz4KICAgIDxyZWN0IHg9IjE0IiB5PSI0MyIgd2lkdGg9IjM2IiBoZWlnaHQ9IjciLz4KICA8L2c+Cjwvc3ZnPgo=">
|
|
||||||
<style>html,body{margin:0;font:14px system-ui,sans-serif;color:#666;padding:1rem}</style>
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
Loading…
|
|
||||||
<script>
|
|
||||||
// Level-2 bootstrap. Fetches landing from zddc.varasys.io and
|
|
||||||
// document.write()s it in place. The default upstream is the
|
|
||||||
// alpha channel; the URL parameter ?v= overrides it:
|
|
||||||
//
|
|
||||||
// ?v=stable | beta | alpha switch to that channel
|
|
||||||
// ?v=0.0.4 (or v0.0.4) pin to that exact stable version
|
|
||||||
// ?v=0.0 (or v0.0) pin to latest patch within 0.0.x (symlink)
|
|
||||||
// ?v=0 (or v0) pin to latest within 0.x (symlink)
|
|
||||||
// (none) use the alpha default
|
|
||||||
//
|
|
||||||
// Resolution is purely static — every URL maps to a real file or a
|
|
||||||
// checked-in symlink under <upstream>/releases/. No manifest lookup,
|
|
||||||
// no JS indirection, no client-side version arithmetic.
|
|
||||||
(async function () {
|
|
||||||
const params = new URLSearchParams(location.search);
|
|
||||||
const v = params.get('v');
|
|
||||||
const tool = 'landing';
|
|
||||||
const defaultChannel = 'alpha';
|
|
||||||
const channels = ['stable', 'beta', 'alpha'];
|
|
||||||
const base = 'https://zddc.varasys.io/releases/';
|
|
||||||
|
|
||||||
function suffixFor(value) {
|
|
||||||
if (!value) return '_' + defaultChannel;
|
|
||||||
if (channels.indexOf(value) >= 0) return '_' + value;
|
|
||||||
// Strip optional leading 'v', accept "0.0.4" / "0.0" / "0".
|
|
||||||
const ver = value.startsWith('v') ? value.slice(1) : value;
|
|
||||||
return '_v' + ver;
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
|
||||||
const assetUrl = base + tool + suffixFor(v) + '.html';
|
|
||||||
const resp = await fetch(assetUrl, { cache: 'no-cache', credentials: 'omit' });
|
|
||||||
if (!resp.ok) throw new Error(resp.status + ' ' + resp.statusText);
|
|
||||||
const html = await resp.text();
|
|
||||||
document.open();
|
|
||||||
document.write(html);
|
|
||||||
document.close();
|
|
||||||
} catch (err) {
|
|
||||||
document.body.textContent = 'Failed to load ' + tool + ': ' + err.message;
|
|
||||||
}
|
|
||||||
})();
|
|
||||||
</script>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
|
|
@ -1,56 +0,0 @@
|
||||||
<!doctype html>
|
|
||||||
<html lang="en">
|
|
||||||
<head>
|
|
||||||
<meta charset="utf-8">
|
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
||||||
<title>Loading Markdown Editor…</title>
|
|
||||||
<link rel="icon" type="image/svg+xml" href="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA2NCA2NCI+CiAgPHJlY3Qgd2lkdGg9IjY0IiBoZWlnaHQ9IjY0IiByeD0iMTIiIGZpbGw9IiMxZTNhNWYiLz4KICA8ZyBmaWxsPSIjZmZmIj4KICAgIDxyZWN0IHg9IjE0IiB5PSIxOCIgd2lkdGg9IjM2IiBoZWlnaHQ9IjciLz4KICAgIDxwb2x5Z29uIHBvaW50cz0iNDMsMjUgNTAsMjUgMjEsNDMgMTQsNDMiLz4KICAgIDxyZWN0IHg9IjE0IiB5PSI0MyIgd2lkdGg9IjM2IiBoZWlnaHQ9IjciLz4KICA8L2c+Cjwvc3ZnPgo=">
|
|
||||||
<style>html,body{margin:0;font:14px system-ui,sans-serif;color:#666;padding:1rem}</style>
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
Loading…
|
|
||||||
<script>
|
|
||||||
// Level-2 bootstrap. Fetches mdedit from zddc.varasys.io and
|
|
||||||
// document.write()s it in place. The default upstream is the
|
|
||||||
// alpha channel; the URL parameter ?v= overrides it:
|
|
||||||
//
|
|
||||||
// ?v=stable | beta | alpha switch to that channel
|
|
||||||
// ?v=0.0.4 (or v0.0.4) pin to that exact stable version
|
|
||||||
// ?v=0.0 (or v0.0) pin to latest patch within 0.0.x (symlink)
|
|
||||||
// ?v=0 (or v0) pin to latest within 0.x (symlink)
|
|
||||||
// (none) use the alpha default
|
|
||||||
//
|
|
||||||
// Resolution is purely static — every URL maps to a real file or a
|
|
||||||
// checked-in symlink under <upstream>/releases/. No manifest lookup,
|
|
||||||
// no JS indirection, no client-side version arithmetic.
|
|
||||||
(async function () {
|
|
||||||
const params = new URLSearchParams(location.search);
|
|
||||||
const v = params.get('v');
|
|
||||||
const tool = 'mdedit';
|
|
||||||
const defaultChannel = 'alpha';
|
|
||||||
const channels = ['stable', 'beta', 'alpha'];
|
|
||||||
const base = 'https://zddc.varasys.io/releases/';
|
|
||||||
|
|
||||||
function suffixFor(value) {
|
|
||||||
if (!value) return '_' + defaultChannel;
|
|
||||||
if (channels.indexOf(value) >= 0) return '_' + value;
|
|
||||||
// Strip optional leading 'v', accept "0.0.4" / "0.0" / "0".
|
|
||||||
const ver = value.startsWith('v') ? value.slice(1) : value;
|
|
||||||
return '_v' + ver;
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
|
||||||
const assetUrl = base + tool + suffixFor(v) + '.html';
|
|
||||||
const resp = await fetch(assetUrl, { cache: 'no-cache', credentials: 'omit' });
|
|
||||||
if (!resp.ok) throw new Error(resp.status + ' ' + resp.statusText);
|
|
||||||
const html = await resp.text();
|
|
||||||
document.open();
|
|
||||||
document.write(html);
|
|
||||||
document.close();
|
|
||||||
} catch (err) {
|
|
||||||
document.body.textContent = 'Failed to load ' + tool + ': ' + err.message;
|
|
||||||
}
|
|
||||||
})();
|
|
||||||
</script>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
|
|
@ -1,56 +0,0 @@
|
||||||
<!doctype html>
|
|
||||||
<html lang="en">
|
|
||||||
<head>
|
|
||||||
<meta charset="utf-8">
|
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
||||||
<title>Loading Transmittal…</title>
|
|
||||||
<link rel="icon" type="image/svg+xml" href="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA2NCA2NCI+CiAgPHJlY3Qgd2lkdGg9IjY0IiBoZWlnaHQ9IjY0IiByeD0iMTIiIGZpbGw9IiMxZTNhNWYiLz4KICA8ZyBmaWxsPSIjZmZmIj4KICAgIDxyZWN0IHg9IjE0IiB5PSIxOCIgd2lkdGg9IjM2IiBoZWlnaHQ9IjciLz4KICAgIDxwb2x5Z29uIHBvaW50cz0iNDMsMjUgNTAsMjUgMjEsNDMgMTQsNDMiLz4KICAgIDxyZWN0IHg9IjE0IiB5PSI0MyIgd2lkdGg9IjM2IiBoZWlnaHQ9IjciLz4KICA8L2c+Cjwvc3ZnPgo=">
|
|
||||||
<style>html,body{margin:0;font:14px system-ui,sans-serif;color:#666;padding:1rem}</style>
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
Loading…
|
|
||||||
<script>
|
|
||||||
// Level-2 bootstrap. Fetches transmittal from zddc.varasys.io and
|
|
||||||
// document.write()s it in place. The default upstream is the
|
|
||||||
// alpha channel; the URL parameter ?v= overrides it:
|
|
||||||
//
|
|
||||||
// ?v=stable | beta | alpha switch to that channel
|
|
||||||
// ?v=0.0.4 (or v0.0.4) pin to that exact stable version
|
|
||||||
// ?v=0.0 (or v0.0) pin to latest patch within 0.0.x (symlink)
|
|
||||||
// ?v=0 (or v0) pin to latest within 0.x (symlink)
|
|
||||||
// (none) use the alpha default
|
|
||||||
//
|
|
||||||
// Resolution is purely static — every URL maps to a real file or a
|
|
||||||
// checked-in symlink under <upstream>/releases/. No manifest lookup,
|
|
||||||
// no JS indirection, no client-side version arithmetic.
|
|
||||||
(async function () {
|
|
||||||
const params = new URLSearchParams(location.search);
|
|
||||||
const v = params.get('v');
|
|
||||||
const tool = 'transmittal';
|
|
||||||
const defaultChannel = 'alpha';
|
|
||||||
const channels = ['stable', 'beta', 'alpha'];
|
|
||||||
const base = 'https://zddc.varasys.io/releases/';
|
|
||||||
|
|
||||||
function suffixFor(value) {
|
|
||||||
if (!value) return '_' + defaultChannel;
|
|
||||||
if (channels.indexOf(value) >= 0) return '_' + value;
|
|
||||||
// Strip optional leading 'v', accept "0.0.4" / "0.0" / "0".
|
|
||||||
const ver = value.startsWith('v') ? value.slice(1) : value;
|
|
||||||
return '_v' + ver;
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
|
||||||
const assetUrl = base + tool + suffixFor(v) + '.html';
|
|
||||||
const resp = await fetch(assetUrl, { cache: 'no-cache', credentials: 'omit' });
|
|
||||||
if (!resp.ok) throw new Error(resp.status + ' ' + resp.statusText);
|
|
||||||
const html = await resp.text();
|
|
||||||
document.open();
|
|
||||||
document.write(html);
|
|
||||||
document.close();
|
|
||||||
} catch (err) {
|
|
||||||
document.body.textContent = 'Failed to load ' + tool + ': ' + err.message;
|
|
||||||
}
|
|
||||||
})();
|
|
||||||
</script>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
|
|
@ -1,56 +0,0 @@
|
||||||
<!doctype html>
|
|
||||||
<html lang="en">
|
|
||||||
<head>
|
|
||||||
<meta charset="utf-8">
|
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
||||||
<title>Loading Archive…</title>
|
|
||||||
<link rel="icon" type="image/svg+xml" href="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA2NCA2NCI+CiAgPHJlY3Qgd2lkdGg9IjY0IiBoZWlnaHQ9IjY0IiByeD0iMTIiIGZpbGw9IiMxZTNhNWYiLz4KICA8ZyBmaWxsPSIjZmZmIj4KICAgIDxyZWN0IHg9IjE0IiB5PSIxOCIgd2lkdGg9IjM2IiBoZWlnaHQ9IjciLz4KICAgIDxwb2x5Z29uIHBvaW50cz0iNDMsMjUgNTAsMjUgMjEsNDMgMTQsNDMiLz4KICAgIDxyZWN0IHg9IjE0IiB5PSI0MyIgd2lkdGg9IjM2IiBoZWlnaHQ9IjciLz4KICA8L2c+Cjwvc3ZnPgo=">
|
|
||||||
<style>html,body{margin:0;font:14px system-ui,sans-serif;color:#666;padding:1rem}</style>
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
Loading…
|
|
||||||
<script>
|
|
||||||
// Level-2 bootstrap. Fetches archive from zddc.varasys.io and
|
|
||||||
// document.write()s it in place. The default upstream is the
|
|
||||||
// beta channel; the URL parameter ?v= overrides it:
|
|
||||||
//
|
|
||||||
// ?v=stable | beta | alpha switch to that channel
|
|
||||||
// ?v=0.0.4 (or v0.0.4) pin to that exact stable version
|
|
||||||
// ?v=0.0 (or v0.0) pin to latest patch within 0.0.x (symlink)
|
|
||||||
// ?v=0 (or v0) pin to latest within 0.x (symlink)
|
|
||||||
// (none) use the beta default
|
|
||||||
//
|
|
||||||
// Resolution is purely static — every URL maps to a real file or a
|
|
||||||
// checked-in symlink under <upstream>/releases/. No manifest lookup,
|
|
||||||
// no JS indirection, no client-side version arithmetic.
|
|
||||||
(async function () {
|
|
||||||
const params = new URLSearchParams(location.search);
|
|
||||||
const v = params.get('v');
|
|
||||||
const tool = 'archive';
|
|
||||||
const defaultChannel = 'beta';
|
|
||||||
const channels = ['stable', 'beta', 'alpha'];
|
|
||||||
const base = 'https://zddc.varasys.io/releases/';
|
|
||||||
|
|
||||||
function suffixFor(value) {
|
|
||||||
if (!value) return '_' + defaultChannel;
|
|
||||||
if (channels.indexOf(value) >= 0) return '_' + value;
|
|
||||||
// Strip optional leading 'v', accept "0.0.4" / "0.0" / "0".
|
|
||||||
const ver = value.startsWith('v') ? value.slice(1) : value;
|
|
||||||
return '_v' + ver;
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
|
||||||
const assetUrl = base + tool + suffixFor(v) + '.html';
|
|
||||||
const resp = await fetch(assetUrl, { cache: 'no-cache', credentials: 'omit' });
|
|
||||||
if (!resp.ok) throw new Error(resp.status + ' ' + resp.statusText);
|
|
||||||
const html = await resp.text();
|
|
||||||
document.open();
|
|
||||||
document.write(html);
|
|
||||||
document.close();
|
|
||||||
} catch (err) {
|
|
||||||
document.body.textContent = 'Failed to load ' + tool + ': ' + err.message;
|
|
||||||
}
|
|
||||||
})();
|
|
||||||
</script>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
|
|
@ -1,56 +0,0 @@
|
||||||
<!doctype html>
|
|
||||||
<html lang="en">
|
|
||||||
<head>
|
|
||||||
<meta charset="utf-8">
|
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
||||||
<title>Loading Classifier…</title>
|
|
||||||
<link rel="icon" type="image/svg+xml" href="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA2NCA2NCI+CiAgPHJlY3Qgd2lkdGg9IjY0IiBoZWlnaHQ9IjY0IiByeD0iMTIiIGZpbGw9IiMxZTNhNWYiLz4KICA8ZyBmaWxsPSIjZmZmIj4KICAgIDxyZWN0IHg9IjE0IiB5PSIxOCIgd2lkdGg9IjM2IiBoZWlnaHQ9IjciLz4KICAgIDxwb2x5Z29uIHBvaW50cz0iNDMsMjUgNTAsMjUgMjEsNDMgMTQsNDMiLz4KICAgIDxyZWN0IHg9IjE0IiB5PSI0MyIgd2lkdGg9IjM2IiBoZWlnaHQ9IjciLz4KICA8L2c+Cjwvc3ZnPgo=">
|
|
||||||
<style>html,body{margin:0;font:14px system-ui,sans-serif;color:#666;padding:1rem}</style>
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
Loading…
|
|
||||||
<script>
|
|
||||||
// Level-2 bootstrap. Fetches classifier from zddc.varasys.io and
|
|
||||||
// document.write()s it in place. The default upstream is the
|
|
||||||
// beta channel; the URL parameter ?v= overrides it:
|
|
||||||
//
|
|
||||||
// ?v=stable | beta | alpha switch to that channel
|
|
||||||
// ?v=0.0.4 (or v0.0.4) pin to that exact stable version
|
|
||||||
// ?v=0.0 (or v0.0) pin to latest patch within 0.0.x (symlink)
|
|
||||||
// ?v=0 (or v0) pin to latest within 0.x (symlink)
|
|
||||||
// (none) use the beta default
|
|
||||||
//
|
|
||||||
// Resolution is purely static — every URL maps to a real file or a
|
|
||||||
// checked-in symlink under <upstream>/releases/. No manifest lookup,
|
|
||||||
// no JS indirection, no client-side version arithmetic.
|
|
||||||
(async function () {
|
|
||||||
const params = new URLSearchParams(location.search);
|
|
||||||
const v = params.get('v');
|
|
||||||
const tool = 'classifier';
|
|
||||||
const defaultChannel = 'beta';
|
|
||||||
const channels = ['stable', 'beta', 'alpha'];
|
|
||||||
const base = 'https://zddc.varasys.io/releases/';
|
|
||||||
|
|
||||||
function suffixFor(value) {
|
|
||||||
if (!value) return '_' + defaultChannel;
|
|
||||||
if (channels.indexOf(value) >= 0) return '_' + value;
|
|
||||||
// Strip optional leading 'v', accept "0.0.4" / "0.0" / "0".
|
|
||||||
const ver = value.startsWith('v') ? value.slice(1) : value;
|
|
||||||
return '_v' + ver;
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
|
||||||
const assetUrl = base + tool + suffixFor(v) + '.html';
|
|
||||||
const resp = await fetch(assetUrl, { cache: 'no-cache', credentials: 'omit' });
|
|
||||||
if (!resp.ok) throw new Error(resp.status + ' ' + resp.statusText);
|
|
||||||
const html = await resp.text();
|
|
||||||
document.open();
|
|
||||||
document.write(html);
|
|
||||||
document.close();
|
|
||||||
} catch (err) {
|
|
||||||
document.body.textContent = 'Failed to load ' + tool + ': ' + err.message;
|
|
||||||
}
|
|
||||||
})();
|
|
||||||
</script>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
|
|
@ -1,56 +0,0 @@
|
||||||
<!doctype html>
|
|
||||||
<html lang="en">
|
|
||||||
<head>
|
|
||||||
<meta charset="utf-8">
|
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
||||||
<title>Loading ZDDC…</title>
|
|
||||||
<link rel="icon" type="image/svg+xml" href="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA2NCA2NCI+CiAgPHJlY3Qgd2lkdGg9IjY0IiBoZWlnaHQ9IjY0IiByeD0iMTIiIGZpbGw9IiMxZTNhNWYiLz4KICA8ZyBmaWxsPSIjZmZmIj4KICAgIDxyZWN0IHg9IjE0IiB5PSIxOCIgd2lkdGg9IjM2IiBoZWlnaHQ9IjciLz4KICAgIDxwb2x5Z29uIHBvaW50cz0iNDMsMjUgNTAsMjUgMjEsNDMgMTQsNDMiLz4KICAgIDxyZWN0IHg9IjE0IiB5PSI0MyIgd2lkdGg9IjM2IiBoZWlnaHQ9IjciLz4KICA8L2c+Cjwvc3ZnPgo=">
|
|
||||||
<style>html,body{margin:0;font:14px system-ui,sans-serif;color:#666;padding:1rem}</style>
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
Loading…
|
|
||||||
<script>
|
|
||||||
// Level-2 bootstrap. Fetches landing from zddc.varasys.io and
|
|
||||||
// document.write()s it in place. The default upstream is the
|
|
||||||
// beta channel; the URL parameter ?v= overrides it:
|
|
||||||
//
|
|
||||||
// ?v=stable | beta | alpha switch to that channel
|
|
||||||
// ?v=0.0.4 (or v0.0.4) pin to that exact stable version
|
|
||||||
// ?v=0.0 (or v0.0) pin to latest patch within 0.0.x (symlink)
|
|
||||||
// ?v=0 (or v0) pin to latest within 0.x (symlink)
|
|
||||||
// (none) use the beta default
|
|
||||||
//
|
|
||||||
// Resolution is purely static — every URL maps to a real file or a
|
|
||||||
// checked-in symlink under <upstream>/releases/. No manifest lookup,
|
|
||||||
// no JS indirection, no client-side version arithmetic.
|
|
||||||
(async function () {
|
|
||||||
const params = new URLSearchParams(location.search);
|
|
||||||
const v = params.get('v');
|
|
||||||
const tool = 'landing';
|
|
||||||
const defaultChannel = 'beta';
|
|
||||||
const channels = ['stable', 'beta', 'alpha'];
|
|
||||||
const base = 'https://zddc.varasys.io/releases/';
|
|
||||||
|
|
||||||
function suffixFor(value) {
|
|
||||||
if (!value) return '_' + defaultChannel;
|
|
||||||
if (channels.indexOf(value) >= 0) return '_' + value;
|
|
||||||
// Strip optional leading 'v', accept "0.0.4" / "0.0" / "0".
|
|
||||||
const ver = value.startsWith('v') ? value.slice(1) : value;
|
|
||||||
return '_v' + ver;
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
|
||||||
const assetUrl = base + tool + suffixFor(v) + '.html';
|
|
||||||
const resp = await fetch(assetUrl, { cache: 'no-cache', credentials: 'omit' });
|
|
||||||
if (!resp.ok) throw new Error(resp.status + ' ' + resp.statusText);
|
|
||||||
const html = await resp.text();
|
|
||||||
document.open();
|
|
||||||
document.write(html);
|
|
||||||
document.close();
|
|
||||||
} catch (err) {
|
|
||||||
document.body.textContent = 'Failed to load ' + tool + ': ' + err.message;
|
|
||||||
}
|
|
||||||
})();
|
|
||||||
</script>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
|
|
@ -1,56 +0,0 @@
|
||||||
<!doctype html>
|
|
||||||
<html lang="en">
|
|
||||||
<head>
|
|
||||||
<meta charset="utf-8">
|
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
||||||
<title>Loading Markdown Editor…</title>
|
|
||||||
<link rel="icon" type="image/svg+xml" href="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA2NCA2NCI+CiAgPHJlY3Qgd2lkdGg9IjY0IiBoZWlnaHQ9IjY0IiByeD0iMTIiIGZpbGw9IiMxZTNhNWYiLz4KICA8ZyBmaWxsPSIjZmZmIj4KICAgIDxyZWN0IHg9IjE0IiB5PSIxOCIgd2lkdGg9IjM2IiBoZWlnaHQ9IjciLz4KICAgIDxwb2x5Z29uIHBvaW50cz0iNDMsMjUgNTAsMjUgMjEsNDMgMTQsNDMiLz4KICAgIDxyZWN0IHg9IjE0IiB5PSI0MyIgd2lkdGg9IjM2IiBoZWlnaHQ9IjciLz4KICA8L2c+Cjwvc3ZnPgo=">
|
|
||||||
<style>html,body{margin:0;font:14px system-ui,sans-serif;color:#666;padding:1rem}</style>
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
Loading…
|
|
||||||
<script>
|
|
||||||
// Level-2 bootstrap. Fetches mdedit from zddc.varasys.io and
|
|
||||||
// document.write()s it in place. The default upstream is the
|
|
||||||
// beta channel; the URL parameter ?v= overrides it:
|
|
||||||
//
|
|
||||||
// ?v=stable | beta | alpha switch to that channel
|
|
||||||
// ?v=0.0.4 (or v0.0.4) pin to that exact stable version
|
|
||||||
// ?v=0.0 (or v0.0) pin to latest patch within 0.0.x (symlink)
|
|
||||||
// ?v=0 (or v0) pin to latest within 0.x (symlink)
|
|
||||||
// (none) use the beta default
|
|
||||||
//
|
|
||||||
// Resolution is purely static — every URL maps to a real file or a
|
|
||||||
// checked-in symlink under <upstream>/releases/. No manifest lookup,
|
|
||||||
// no JS indirection, no client-side version arithmetic.
|
|
||||||
(async function () {
|
|
||||||
const params = new URLSearchParams(location.search);
|
|
||||||
const v = params.get('v');
|
|
||||||
const tool = 'mdedit';
|
|
||||||
const defaultChannel = 'beta';
|
|
||||||
const channels = ['stable', 'beta', 'alpha'];
|
|
||||||
const base = 'https://zddc.varasys.io/releases/';
|
|
||||||
|
|
||||||
function suffixFor(value) {
|
|
||||||
if (!value) return '_' + defaultChannel;
|
|
||||||
if (channels.indexOf(value) >= 0) return '_' + value;
|
|
||||||
// Strip optional leading 'v', accept "0.0.4" / "0.0" / "0".
|
|
||||||
const ver = value.startsWith('v') ? value.slice(1) : value;
|
|
||||||
return '_v' + ver;
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
|
||||||
const assetUrl = base + tool + suffixFor(v) + '.html';
|
|
||||||
const resp = await fetch(assetUrl, { cache: 'no-cache', credentials: 'omit' });
|
|
||||||
if (!resp.ok) throw new Error(resp.status + ' ' + resp.statusText);
|
|
||||||
const html = await resp.text();
|
|
||||||
document.open();
|
|
||||||
document.write(html);
|
|
||||||
document.close();
|
|
||||||
} catch (err) {
|
|
||||||
document.body.textContent = 'Failed to load ' + tool + ': ' + err.message;
|
|
||||||
}
|
|
||||||
})();
|
|
||||||
</script>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
|
|
@ -1,56 +0,0 @@
|
||||||
<!doctype html>
|
|
||||||
<html lang="en">
|
|
||||||
<head>
|
|
||||||
<meta charset="utf-8">
|
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
||||||
<title>Loading Transmittal…</title>
|
|
||||||
<link rel="icon" type="image/svg+xml" href="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA2NCA2NCI+CiAgPHJlY3Qgd2lkdGg9IjY0IiBoZWlnaHQ9IjY0IiByeD0iMTIiIGZpbGw9IiMxZTNhNWYiLz4KICA8ZyBmaWxsPSIjZmZmIj4KICAgIDxyZWN0IHg9IjE0IiB5PSIxOCIgd2lkdGg9IjM2IiBoZWlnaHQ9IjciLz4KICAgIDxwb2x5Z29uIHBvaW50cz0iNDMsMjUgNTAsMjUgMjEsNDMgMTQsNDMiLz4KICAgIDxyZWN0IHg9IjE0IiB5PSI0MyIgd2lkdGg9IjM2IiBoZWlnaHQ9IjciLz4KICA8L2c+Cjwvc3ZnPgo=">
|
|
||||||
<style>html,body{margin:0;font:14px system-ui,sans-serif;color:#666;padding:1rem}</style>
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
Loading…
|
|
||||||
<script>
|
|
||||||
// Level-2 bootstrap. Fetches transmittal from zddc.varasys.io and
|
|
||||||
// document.write()s it in place. The default upstream is the
|
|
||||||
// beta channel; the URL parameter ?v= overrides it:
|
|
||||||
//
|
|
||||||
// ?v=stable | beta | alpha switch to that channel
|
|
||||||
// ?v=0.0.4 (or v0.0.4) pin to that exact stable version
|
|
||||||
// ?v=0.0 (or v0.0) pin to latest patch within 0.0.x (symlink)
|
|
||||||
// ?v=0 (or v0) pin to latest within 0.x (symlink)
|
|
||||||
// (none) use the beta default
|
|
||||||
//
|
|
||||||
// Resolution is purely static — every URL maps to a real file or a
|
|
||||||
// checked-in symlink under <upstream>/releases/. No manifest lookup,
|
|
||||||
// no JS indirection, no client-side version arithmetic.
|
|
||||||
(async function () {
|
|
||||||
const params = new URLSearchParams(location.search);
|
|
||||||
const v = params.get('v');
|
|
||||||
const tool = 'transmittal';
|
|
||||||
const defaultChannel = 'beta';
|
|
||||||
const channels = ['stable', 'beta', 'alpha'];
|
|
||||||
const base = 'https://zddc.varasys.io/releases/';
|
|
||||||
|
|
||||||
function suffixFor(value) {
|
|
||||||
if (!value) return '_' + defaultChannel;
|
|
||||||
if (channels.indexOf(value) >= 0) return '_' + value;
|
|
||||||
// Strip optional leading 'v', accept "0.0.4" / "0.0" / "0".
|
|
||||||
const ver = value.startsWith('v') ? value.slice(1) : value;
|
|
||||||
return '_v' + ver;
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
|
||||||
const assetUrl = base + tool + suffixFor(v) + '.html';
|
|
||||||
const resp = await fetch(assetUrl, { cache: 'no-cache', credentials: 'omit' });
|
|
||||||
if (!resp.ok) throw new Error(resp.status + ' ' + resp.statusText);
|
|
||||||
const html = await resp.text();
|
|
||||||
document.open();
|
|
||||||
document.write(html);
|
|
||||||
document.close();
|
|
||||||
} catch (err) {
|
|
||||||
document.body.textContent = 'Failed to load ' + tool + ': ' + err.message;
|
|
||||||
}
|
|
||||||
})();
|
|
||||||
</script>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
|
|
@ -1,56 +0,0 @@
|
||||||
<!doctype html>
|
|
||||||
<html lang="en">
|
|
||||||
<head>
|
|
||||||
<meta charset="utf-8">
|
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
||||||
<title>Loading Archive…</title>
|
|
||||||
<link rel="icon" type="image/svg+xml" href="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA2NCA2NCI+CiAgPHJlY3Qgd2lkdGg9IjY0IiBoZWlnaHQ9IjY0IiByeD0iMTIiIGZpbGw9IiMxZTNhNWYiLz4KICA8ZyBmaWxsPSIjZmZmIj4KICAgIDxyZWN0IHg9IjE0IiB5PSIxOCIgd2lkdGg9IjM2IiBoZWlnaHQ9IjciLz4KICAgIDxwb2x5Z29uIHBvaW50cz0iNDMsMjUgNTAsMjUgMjEsNDMgMTQsNDMiLz4KICAgIDxyZWN0IHg9IjE0IiB5PSI0MyIgd2lkdGg9IjM2IiBoZWlnaHQ9IjciLz4KICA8L2c+Cjwvc3ZnPgo=">
|
|
||||||
<style>html,body{margin:0;font:14px system-ui,sans-serif;color:#666;padding:1rem}</style>
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
Loading…
|
|
||||||
<script>
|
|
||||||
// Level-2 bootstrap. Fetches archive from zddc.varasys.io and
|
|
||||||
// document.write()s it in place. The default upstream is the
|
|
||||||
// stable channel; the URL parameter ?v= overrides it:
|
|
||||||
//
|
|
||||||
// ?v=stable | beta | alpha switch to that channel
|
|
||||||
// ?v=0.0.4 (or v0.0.4) pin to that exact stable version
|
|
||||||
// ?v=0.0 (or v0.0) pin to latest patch within 0.0.x (symlink)
|
|
||||||
// ?v=0 (or v0) pin to latest within 0.x (symlink)
|
|
||||||
// (none) use the stable default
|
|
||||||
//
|
|
||||||
// Resolution is purely static — every URL maps to a real file or a
|
|
||||||
// checked-in symlink under <upstream>/releases/. No manifest lookup,
|
|
||||||
// no JS indirection, no client-side version arithmetic.
|
|
||||||
(async function () {
|
|
||||||
const params = new URLSearchParams(location.search);
|
|
||||||
const v = params.get('v');
|
|
||||||
const tool = 'archive';
|
|
||||||
const defaultChannel = 'stable';
|
|
||||||
const channels = ['stable', 'beta', 'alpha'];
|
|
||||||
const base = 'https://zddc.varasys.io/releases/';
|
|
||||||
|
|
||||||
function suffixFor(value) {
|
|
||||||
if (!value) return '_' + defaultChannel;
|
|
||||||
if (channels.indexOf(value) >= 0) return '_' + value;
|
|
||||||
// Strip optional leading 'v', accept "0.0.4" / "0.0" / "0".
|
|
||||||
const ver = value.startsWith('v') ? value.slice(1) : value;
|
|
||||||
return '_v' + ver;
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
|
||||||
const assetUrl = base + tool + suffixFor(v) + '.html';
|
|
||||||
const resp = await fetch(assetUrl, { cache: 'no-cache', credentials: 'omit' });
|
|
||||||
if (!resp.ok) throw new Error(resp.status + ' ' + resp.statusText);
|
|
||||||
const html = await resp.text();
|
|
||||||
document.open();
|
|
||||||
document.write(html);
|
|
||||||
document.close();
|
|
||||||
} catch (err) {
|
|
||||||
document.body.textContent = 'Failed to load ' + tool + ': ' + err.message;
|
|
||||||
}
|
|
||||||
})();
|
|
||||||
</script>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
|
|
@ -1,56 +0,0 @@
|
||||||
<!doctype html>
|
|
||||||
<html lang="en">
|
|
||||||
<head>
|
|
||||||
<meta charset="utf-8">
|
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
||||||
<title>Loading Classifier…</title>
|
|
||||||
<link rel="icon" type="image/svg+xml" href="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA2NCA2NCI+CiAgPHJlY3Qgd2lkdGg9IjY0IiBoZWlnaHQ9IjY0IiByeD0iMTIiIGZpbGw9IiMxZTNhNWYiLz4KICA8ZyBmaWxsPSIjZmZmIj4KICAgIDxyZWN0IHg9IjE0IiB5PSIxOCIgd2lkdGg9IjM2IiBoZWlnaHQ9IjciLz4KICAgIDxwb2x5Z29uIHBvaW50cz0iNDMsMjUgNTAsMjUgMjEsNDMgMTQsNDMiLz4KICAgIDxyZWN0IHg9IjE0IiB5PSI0MyIgd2lkdGg9IjM2IiBoZWlnaHQ9IjciLz4KICA8L2c+Cjwvc3ZnPgo=">
|
|
||||||
<style>html,body{margin:0;font:14px system-ui,sans-serif;color:#666;padding:1rem}</style>
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
Loading…
|
|
||||||
<script>
|
|
||||||
// Level-2 bootstrap. Fetches classifier from zddc.varasys.io and
|
|
||||||
// document.write()s it in place. The default upstream is the
|
|
||||||
// stable channel; the URL parameter ?v= overrides it:
|
|
||||||
//
|
|
||||||
// ?v=stable | beta | alpha switch to that channel
|
|
||||||
// ?v=0.0.4 (or v0.0.4) pin to that exact stable version
|
|
||||||
// ?v=0.0 (or v0.0) pin to latest patch within 0.0.x (symlink)
|
|
||||||
// ?v=0 (or v0) pin to latest within 0.x (symlink)
|
|
||||||
// (none) use the stable default
|
|
||||||
//
|
|
||||||
// Resolution is purely static — every URL maps to a real file or a
|
|
||||||
// checked-in symlink under <upstream>/releases/. No manifest lookup,
|
|
||||||
// no JS indirection, no client-side version arithmetic.
|
|
||||||
(async function () {
|
|
||||||
const params = new URLSearchParams(location.search);
|
|
||||||
const v = params.get('v');
|
|
||||||
const tool = 'classifier';
|
|
||||||
const defaultChannel = 'stable';
|
|
||||||
const channels = ['stable', 'beta', 'alpha'];
|
|
||||||
const base = 'https://zddc.varasys.io/releases/';
|
|
||||||
|
|
||||||
function suffixFor(value) {
|
|
||||||
if (!value) return '_' + defaultChannel;
|
|
||||||
if (channels.indexOf(value) >= 0) return '_' + value;
|
|
||||||
// Strip optional leading 'v', accept "0.0.4" / "0.0" / "0".
|
|
||||||
const ver = value.startsWith('v') ? value.slice(1) : value;
|
|
||||||
return '_v' + ver;
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
|
||||||
const assetUrl = base + tool + suffixFor(v) + '.html';
|
|
||||||
const resp = await fetch(assetUrl, { cache: 'no-cache', credentials: 'omit' });
|
|
||||||
if (!resp.ok) throw new Error(resp.status + ' ' + resp.statusText);
|
|
||||||
const html = await resp.text();
|
|
||||||
document.open();
|
|
||||||
document.write(html);
|
|
||||||
document.close();
|
|
||||||
} catch (err) {
|
|
||||||
document.body.textContent = 'Failed to load ' + tool + ': ' + err.message;
|
|
||||||
}
|
|
||||||
})();
|
|
||||||
</script>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
|
|
@ -1,56 +0,0 @@
|
||||||
<!doctype html>
|
|
||||||
<html lang="en">
|
|
||||||
<head>
|
|
||||||
<meta charset="utf-8">
|
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
||||||
<title>Loading ZDDC…</title>
|
|
||||||
<link rel="icon" type="image/svg+xml" href="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA2NCA2NCI+CiAgPHJlY3Qgd2lkdGg9IjY0IiBoZWlnaHQ9IjY0IiByeD0iMTIiIGZpbGw9IiMxZTNhNWYiLz4KICA8ZyBmaWxsPSIjZmZmIj4KICAgIDxyZWN0IHg9IjE0IiB5PSIxOCIgd2lkdGg9IjM2IiBoZWlnaHQ9IjciLz4KICAgIDxwb2x5Z29uIHBvaW50cz0iNDMsMjUgNTAsMjUgMjEsNDMgMTQsNDMiLz4KICAgIDxyZWN0IHg9IjE0IiB5PSI0MyIgd2lkdGg9IjM2IiBoZWlnaHQ9IjciLz4KICA8L2c+Cjwvc3ZnPgo=">
|
|
||||||
<style>html,body{margin:0;font:14px system-ui,sans-serif;color:#666;padding:1rem}</style>
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
Loading…
|
|
||||||
<script>
|
|
||||||
// Level-2 bootstrap. Fetches landing from zddc.varasys.io and
|
|
||||||
// document.write()s it in place. The default upstream is the
|
|
||||||
// stable channel; the URL parameter ?v= overrides it:
|
|
||||||
//
|
|
||||||
// ?v=stable | beta | alpha switch to that channel
|
|
||||||
// ?v=0.0.4 (or v0.0.4) pin to that exact stable version
|
|
||||||
// ?v=0.0 (or v0.0) pin to latest patch within 0.0.x (symlink)
|
|
||||||
// ?v=0 (or v0) pin to latest within 0.x (symlink)
|
|
||||||
// (none) use the stable default
|
|
||||||
//
|
|
||||||
// Resolution is purely static — every URL maps to a real file or a
|
|
||||||
// checked-in symlink under <upstream>/releases/. No manifest lookup,
|
|
||||||
// no JS indirection, no client-side version arithmetic.
|
|
||||||
(async function () {
|
|
||||||
const params = new URLSearchParams(location.search);
|
|
||||||
const v = params.get('v');
|
|
||||||
const tool = 'landing';
|
|
||||||
const defaultChannel = 'stable';
|
|
||||||
const channels = ['stable', 'beta', 'alpha'];
|
|
||||||
const base = 'https://zddc.varasys.io/releases/';
|
|
||||||
|
|
||||||
function suffixFor(value) {
|
|
||||||
if (!value) return '_' + defaultChannel;
|
|
||||||
if (channels.indexOf(value) >= 0) return '_' + value;
|
|
||||||
// Strip optional leading 'v', accept "0.0.4" / "0.0" / "0".
|
|
||||||
const ver = value.startsWith('v') ? value.slice(1) : value;
|
|
||||||
return '_v' + ver;
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
|
||||||
const assetUrl = base + tool + suffixFor(v) + '.html';
|
|
||||||
const resp = await fetch(assetUrl, { cache: 'no-cache', credentials: 'omit' });
|
|
||||||
if (!resp.ok) throw new Error(resp.status + ' ' + resp.statusText);
|
|
||||||
const html = await resp.text();
|
|
||||||
document.open();
|
|
||||||
document.write(html);
|
|
||||||
document.close();
|
|
||||||
} catch (err) {
|
|
||||||
document.body.textContent = 'Failed to load ' + tool + ': ' + err.message;
|
|
||||||
}
|
|
||||||
})();
|
|
||||||
</script>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
|
|
@ -1,56 +0,0 @@
|
||||||
<!doctype html>
|
|
||||||
<html lang="en">
|
|
||||||
<head>
|
|
||||||
<meta charset="utf-8">
|
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
||||||
<title>Loading Markdown Editor…</title>
|
|
||||||
<link rel="icon" type="image/svg+xml" href="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA2NCA2NCI+CiAgPHJlY3Qgd2lkdGg9IjY0IiBoZWlnaHQ9IjY0IiByeD0iMTIiIGZpbGw9IiMxZTNhNWYiLz4KICA8ZyBmaWxsPSIjZmZmIj4KICAgIDxyZWN0IHg9IjE0IiB5PSIxOCIgd2lkdGg9IjM2IiBoZWlnaHQ9IjciLz4KICAgIDxwb2x5Z29uIHBvaW50cz0iNDMsMjUgNTAsMjUgMjEsNDMgMTQsNDMiLz4KICAgIDxyZWN0IHg9IjE0IiB5PSI0MyIgd2lkdGg9IjM2IiBoZWlnaHQ9IjciLz4KICA8L2c+Cjwvc3ZnPgo=">
|
|
||||||
<style>html,body{margin:0;font:14px system-ui,sans-serif;color:#666;padding:1rem}</style>
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
Loading…
|
|
||||||
<script>
|
|
||||||
// Level-2 bootstrap. Fetches mdedit from zddc.varasys.io and
|
|
||||||
// document.write()s it in place. The default upstream is the
|
|
||||||
// stable channel; the URL parameter ?v= overrides it:
|
|
||||||
//
|
|
||||||
// ?v=stable | beta | alpha switch to that channel
|
|
||||||
// ?v=0.0.4 (or v0.0.4) pin to that exact stable version
|
|
||||||
// ?v=0.0 (or v0.0) pin to latest patch within 0.0.x (symlink)
|
|
||||||
// ?v=0 (or v0) pin to latest within 0.x (symlink)
|
|
||||||
// (none) use the stable default
|
|
||||||
//
|
|
||||||
// Resolution is purely static — every URL maps to a real file or a
|
|
||||||
// checked-in symlink under <upstream>/releases/. No manifest lookup,
|
|
||||||
// no JS indirection, no client-side version arithmetic.
|
|
||||||
(async function () {
|
|
||||||
const params = new URLSearchParams(location.search);
|
|
||||||
const v = params.get('v');
|
|
||||||
const tool = 'mdedit';
|
|
||||||
const defaultChannel = 'stable';
|
|
||||||
const channels = ['stable', 'beta', 'alpha'];
|
|
||||||
const base = 'https://zddc.varasys.io/releases/';
|
|
||||||
|
|
||||||
function suffixFor(value) {
|
|
||||||
if (!value) return '_' + defaultChannel;
|
|
||||||
if (channels.indexOf(value) >= 0) return '_' + value;
|
|
||||||
// Strip optional leading 'v', accept "0.0.4" / "0.0" / "0".
|
|
||||||
const ver = value.startsWith('v') ? value.slice(1) : value;
|
|
||||||
return '_v' + ver;
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
|
||||||
const assetUrl = base + tool + suffixFor(v) + '.html';
|
|
||||||
const resp = await fetch(assetUrl, { cache: 'no-cache', credentials: 'omit' });
|
|
||||||
if (!resp.ok) throw new Error(resp.status + ' ' + resp.statusText);
|
|
||||||
const html = await resp.text();
|
|
||||||
document.open();
|
|
||||||
document.write(html);
|
|
||||||
document.close();
|
|
||||||
} catch (err) {
|
|
||||||
document.body.textContent = 'Failed to load ' + tool + ': ' + err.message;
|
|
||||||
}
|
|
||||||
})();
|
|
||||||
</script>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
|
|
@ -1,56 +0,0 @@
|
||||||
<!doctype html>
|
|
||||||
<html lang="en">
|
|
||||||
<head>
|
|
||||||
<meta charset="utf-8">
|
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
||||||
<title>Loading Transmittal…</title>
|
|
||||||
<link rel="icon" type="image/svg+xml" href="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA2NCA2NCI+CiAgPHJlY3Qgd2lkdGg9IjY0IiBoZWlnaHQ9IjY0IiByeD0iMTIiIGZpbGw9IiMxZTNhNWYiLz4KICA8ZyBmaWxsPSIjZmZmIj4KICAgIDxyZWN0IHg9IjE0IiB5PSIxOCIgd2lkdGg9IjM2IiBoZWlnaHQ9IjciLz4KICAgIDxwb2x5Z29uIHBvaW50cz0iNDMsMjUgNTAsMjUgMjEsNDMgMTQsNDMiLz4KICAgIDxyZWN0IHg9IjE0IiB5PSI0MyIgd2lkdGg9IjM2IiBoZWlnaHQ9IjciLz4KICA8L2c+Cjwvc3ZnPgo=">
|
|
||||||
<style>html,body{margin:0;font:14px system-ui,sans-serif;color:#666;padding:1rem}</style>
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
Loading…
|
|
||||||
<script>
|
|
||||||
// Level-2 bootstrap. Fetches transmittal from zddc.varasys.io and
|
|
||||||
// document.write()s it in place. The default upstream is the
|
|
||||||
// stable channel; the URL parameter ?v= overrides it:
|
|
||||||
//
|
|
||||||
// ?v=stable | beta | alpha switch to that channel
|
|
||||||
// ?v=0.0.4 (or v0.0.4) pin to that exact stable version
|
|
||||||
// ?v=0.0 (or v0.0) pin to latest patch within 0.0.x (symlink)
|
|
||||||
// ?v=0 (or v0) pin to latest within 0.x (symlink)
|
|
||||||
// (none) use the stable default
|
|
||||||
//
|
|
||||||
// Resolution is purely static — every URL maps to a real file or a
|
|
||||||
// checked-in symlink under <upstream>/releases/. No manifest lookup,
|
|
||||||
// no JS indirection, no client-side version arithmetic.
|
|
||||||
(async function () {
|
|
||||||
const params = new URLSearchParams(location.search);
|
|
||||||
const v = params.get('v');
|
|
||||||
const tool = 'transmittal';
|
|
||||||
const defaultChannel = 'stable';
|
|
||||||
const channels = ['stable', 'beta', 'alpha'];
|
|
||||||
const base = 'https://zddc.varasys.io/releases/';
|
|
||||||
|
|
||||||
function suffixFor(value) {
|
|
||||||
if (!value) return '_' + defaultChannel;
|
|
||||||
if (channels.indexOf(value) >= 0) return '_' + value;
|
|
||||||
// Strip optional leading 'v', accept "0.0.4" / "0.0" / "0".
|
|
||||||
const ver = value.startsWith('v') ? value.slice(1) : value;
|
|
||||||
return '_v' + ver;
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
|
||||||
const assetUrl = base + tool + suffixFor(v) + '.html';
|
|
||||||
const resp = await fetch(assetUrl, { cache: 'no-cache', credentials: 'omit' });
|
|
||||||
if (!resp.ok) throw new Error(resp.status + ' ' + resp.statusText);
|
|
||||||
const html = await resp.text();
|
|
||||||
document.open();
|
|
||||||
document.write(html);
|
|
||||||
document.close();
|
|
||||||
} catch (err) {
|
|
||||||
document.body.textContent = 'Failed to load ' + tool + ': ' + err.message;
|
|
||||||
}
|
|
||||||
})();
|
|
||||||
</script>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
|
|
@ -114,18 +114,8 @@ body {
|
||||||
.brand-logo {
|
.brand-logo {
|
||||||
width: 28px;
|
width: 28px;
|
||||||
height: 28px;
|
height: 28px;
|
||||||
background: var(--color-accent);
|
|
||||||
border-radius: var(--radius-sm);
|
|
||||||
display: flex;
|
|
||||||
align-items: center;
|
|
||||||
justify-content: center;
|
|
||||||
flex-shrink: 0;
|
flex-shrink: 0;
|
||||||
}
|
display: block;
|
||||||
|
|
||||||
.brand-logo svg {
|
|
||||||
width: 18px;
|
|
||||||
height: 18px;
|
|
||||||
fill: white;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ── Header Navigation ── */
|
/* ── Header Navigation ── */
|
||||||
|
|
|
||||||
|
|
@ -26,6 +26,8 @@
|
||||||
.install-card .when { color: var(--color-text-muted); font-size: 0.92em; margin: 0.1rem 0 0.6rem 0; }
|
.install-card .when { color: var(--color-text-muted); font-size: 0.92em; margin: 0.1rem 0 0.6rem 0; }
|
||||||
.install-card pre { background: var(--color-bg); border: 1px solid var(--color-border); border-radius: 6px; padding: 0.6rem 0.8rem; overflow-x: auto; font-size: 0.82em; line-height: 1.45; margin: 0; }
|
.install-card pre { background: var(--color-bg); border: 1px solid var(--color-border); border-radius: 6px; padding: 0.6rem 0.8rem; overflow-x: auto; font-size: 0.82em; line-height: 1.45; margin: 0; }
|
||||||
.install-card pre code { font-family: "SF Mono", Menlo, Consolas, monospace; }
|
.install-card pre code { font-family: "SF Mono", Menlo, Consolas, monospace; }
|
||||||
|
.install-points { margin: 0.4rem 0 0.4rem 1.4rem; padding: 0; line-height: 1.65; }
|
||||||
|
.install-points li { margin-bottom: 0.15rem; }
|
||||||
.mode-grid { display: grid; grid-template-columns: 1fr; gap: var(--spacing-md); margin-top: var(--spacing-md); }
|
.mode-grid { display: grid; grid-template-columns: 1fr; gap: var(--spacing-md); margin-top: var(--spacing-md); }
|
||||||
@media (min-width: 720px) { .mode-grid { grid-template-columns: 1fr 1fr; } }
|
@media (min-width: 720px) { .mode-grid { grid-template-columns: 1fr 1fr; } }
|
||||||
.mode-card { padding: var(--spacing-md); border: 1px solid var(--color-border); border-radius: 8px; }
|
.mode-card { padding: var(--spacing-md); border: 1px solid var(--color-border); border-radius: 8px; }
|
||||||
|
|
@ -40,11 +42,14 @@
|
||||||
<header class="site-header">
|
<header class="site-header">
|
||||||
<div class="container header-content">
|
<div class="container header-content">
|
||||||
<a href="/" class="brand">
|
<a href="/" class="brand">
|
||||||
<div class="brand-logo">
|
<svg class="brand-logo" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64" aria-hidden="true">
|
||||||
<svg viewBox="0 0 24 24">
|
<rect width="64" height="64" rx="12" fill="#1e3a5f"/>
|
||||||
<path d="M3 5h18v2H3V5zm0 6h12v2H3v-2zm0 6h6v2H3v-2z" />
|
<g fill="#fff">
|
||||||
|
<rect x="14" y="18" width="36" height="7"/>
|
||||||
|
<polygon points="43,25 50,25 21,43 14,43"/>
|
||||||
|
<rect x="14" y="43" width="36" height="7"/>
|
||||||
|
</g>
|
||||||
</svg>
|
</svg>
|
||||||
</div>
|
|
||||||
<span class="brand-name">ZDDC</span>
|
<span class="brand-name">ZDDC</span>
|
||||||
</a>
|
</a>
|
||||||
<nav class="header-nav">
|
<nav class="header-nav">
|
||||||
|
|
@ -183,38 +188,40 @@
|
||||||
|
|
||||||
<section style="margin-top: var(--spacing-2xl);">
|
<section style="margin-top: var(--spacing-2xl);">
|
||||||
<h2>Install on your server</h2>
|
<h2>Install on your server</h2>
|
||||||
<p><code class="inline">cd</code> into your deployment directory and run the appropriate one-liner. The script auto-detects whether you're in a deployment root or a project subdirectory; flags select the install mode and channel.</p>
|
<p>Two paths, no install scripts. The server has built-in fetch-and-cache for the tool HTMLs; the local-file path needs nothing more than a download.</p>
|
||||||
|
|
||||||
<div class="install-grid">
|
<div class="install-grid">
|
||||||
<div class="install-card">
|
<div class="install-card">
|
||||||
<h3>Self-contained install (current stable)</h3>
|
<h3>Server: just run zddc-server</h3>
|
||||||
<p class="when"><strong>Default.</strong> Downloads the five current-stable tool HTMLs (~1.8 MB total) plus a <code class="inline">_template/</code> directory with level-1 stubs for project subdirectories. The deployment does not depend on <code class="inline">zddc.varasys.io</code> after install. Re-run to update.</p>
|
<p class="when">The binary has the current-stable build of all five tools baked in at compile time. They appear automatically at the right paths under <code class="inline">ZDDC_ROOT</code>:</p>
|
||||||
<pre><code>cd /your/deployment/root
|
<ul class="install-points">
|
||||||
sh -c "$(curl -fsSL https://zddc.varasys.io/install.sh)"</code></pre>
|
<li><strong>archive.html</strong> at every level (root, project, archive, vendor)</li>
|
||||||
</div>
|
<li><strong>classifier.html</strong> in any <code class="inline">Incoming</code>, <code class="inline">Working</code>, or <code class="inline">Staging</code> directory and its subtree</li>
|
||||||
<div class="install-card">
|
<li><strong>mdedit.html</strong> in any <code class="inline">Working</code> directory and its subtree</li>
|
||||||
<h3>Track a channel</h3>
|
<li><strong>transmittal.html</strong> in any <code class="inline">Staging</code> directory and its subtree</li>
|
||||||
<p class="when"><strong>Use when:</strong> you want auto-updates whenever the channel advances. Installs five tiny level-2 stubs (~10 KB total) that fetch the channel from <code class="inline">zddc.varasys.io</code> on every page load — visitors need network access.</p>
|
<li><strong>index.html</strong> (the project picker) at the deployment root</li>
|
||||||
<pre><code>cd /your/deployment/root
|
</ul>
|
||||||
sh -c "$(curl -fsSL https://zddc.varasys.io/install.sh)" -- \
|
<pre><code>ZDDC_ROOT=/srv/zddc ./zddc-server</code></pre>
|
||||||
--mode track --channel beta # or stable / alpha</code></pre>
|
<p class="when" style="margin-top: 0.6rem;"><strong>To override a tool</strong> at any path: drop a real <code class="inline">.html</code> file there — that file wins over the baked-in version. <strong>To pin a different version</strong>, write an <code class="inline">apps:</code> entry in any <code class="inline">.zddc</code> file along the path:</p>
|
||||||
</div>
|
<pre><code># <project>/.zddc
|
||||||
<div class="install-card">
|
apps:
|
||||||
<h3>Pin to a specific version</h3>
|
classifier: stable # or beta / alpha / v0.0.4 / v0.0 / v0
|
||||||
<p class="when"><strong>Use when:</strong> you need a known-good build that doesn't move. Per-tool semver pins (<code class="inline">0.0.2</code>) are exact; partial pins (<code class="inline">0.0</code>, <code class="inline">0</code>) float to the latest patch / minor on the upstream.</p>
|
archive: https://my-fork.example/archive.html</code></pre>
|
||||||
<pre><code>cd /your/deployment/root
|
<p class="when" style="margin-top: 0.6rem;">URL sources are fetched once and cached in <code class="inline"><ZDDC_ROOT>/_app/</code>. To force a re-fetch, delete the cache file. Closer-to-leaf <code class="inline">.zddc</code> entries override parent ones.</p>
|
||||||
sh -c "$(curl -fsSL https://zddc.varasys.io/install.sh)" -- \
|
|
||||||
--channel 0.0.2 # or 0.0 (latest 0.0.x), or 0 (latest 0.x)</code></pre>
|
|
||||||
</div>
|
|
||||||
<div class="install-card">
|
|
||||||
<h3>Project subdirectory</h3>
|
|
||||||
<p class="when"><strong>Auto-detected.</strong> Run the same one-liner from inside a <code class="inline"><ZDDC_ROOT>/Project-X/</code> directory. The script sees that the parent has a ZDDC <code class="inline">index.html</code> and installs four level-1 stubs that fetch <code class="inline">../<tool>.html</code> at load time.</p>
|
|
||||||
<pre><code>cd /your/deployment/root/Project-X
|
|
||||||
sh -c "$(curl -fsSL https://zddc.varasys.io/install.sh)"</code></pre>
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<p style="margin-top: var(--spacing-md);"><a href="https://codeberg.org/VARASYS/ZDDC/src/branch/main/bootstrap/install.sh">View the script source</a> for the full flag list. <a href="https://codeberg.org/VARASYS/ZDDC/src/branch/main/bootstrap/README.md">bootstrap/README.md</a> documents the level-1 / level-2 model, the per-project / per-tool override pattern, and the audit grep that lets you see what every project on a deployment is pointing at.</p>
|
<div class="install-card">
|
||||||
|
<h3>Local: just download the .html file</h3>
|
||||||
|
<p class="when">No server, no install — open in any modern browser.</p>
|
||||||
|
<ul class="install-points">
|
||||||
|
<li><a href="releases/archive_stable.html">archive.html</a></li>
|
||||||
|
<li><a href="releases/transmittal_stable.html">transmittal.html</a></li>
|
||||||
|
<li><a href="releases/classifier_stable.html">classifier.html</a></li>
|
||||||
|
<li><a href="releases/mdedit_stable.html">mdedit.html</a></li>
|
||||||
|
</ul>
|
||||||
|
<p class="when" style="margin-top: 0.6rem;">Right-click → Save As. Each tool is a self-contained HTML file with everything inlined; works from <code class="inline">file://</code> or any static host.</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
<section style="margin-top: var(--spacing-2xl);">
|
<section style="margin-top: var(--spacing-2xl);">
|
||||||
|
|
|
||||||
|
|
@ -1 +0,0 @@
|
||||||
../bootstrap/install.sh
|
|
||||||
|
|
@ -20,11 +20,14 @@
|
||||||
<header class="site-header">
|
<header class="site-header">
|
||||||
<div class="container header-content">
|
<div class="container header-content">
|
||||||
<a href="/" class="brand">
|
<a href="/" class="brand">
|
||||||
<div class="brand-logo">
|
<svg class="brand-logo" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64" aria-hidden="true">
|
||||||
<svg viewBox="0 0 24 24">
|
<rect width="64" height="64" rx="12" fill="#1e3a5f"/>
|
||||||
<path d="M3 5h18v2H3V5zm0 6h12v2H3v-2zm0 6h6v2H3v-2z" />
|
<g fill="#fff">
|
||||||
|
<rect x="14" y="18" width="36" height="7"/>
|
||||||
|
<polygon points="43,25 50,25 21,43 14,43"/>
|
||||||
|
<rect x="14" y="43" width="36" height="7"/>
|
||||||
|
</g>
|
||||||
</svg>
|
</svg>
|
||||||
</div>
|
|
||||||
<span class="brand-name">ZDDC</span>
|
<span class="brand-name">ZDDC</span>
|
||||||
</a>
|
</a>
|
||||||
<nav class="header-nav">
|
<nav class="header-nav">
|
||||||
|
|
|
||||||
|
|
@ -37,9 +37,14 @@
|
||||||
<header class="site-header">
|
<header class="site-header">
|
||||||
<div class="container header-content">
|
<div class="container header-content">
|
||||||
<a href="/" class="brand">
|
<a href="/" class="brand">
|
||||||
<div class="brand-logo">
|
<svg class="brand-logo" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64" aria-hidden="true">
|
||||||
<svg viewBox="0 0 24 24"><path d="M3 5h18v2H3V5zm0 6h12v2H3v-2zm0 6h6v2H3v-2z" /></svg>
|
<rect width="64" height="64" rx="12" fill="#1e3a5f"/>
|
||||||
</div>
|
<g fill="#fff">
|
||||||
|
<rect x="14" y="18" width="36" height="7"/>
|
||||||
|
<polygon points="43,25 50,25 21,43 14,43"/>
|
||||||
|
<rect x="14" y="43" width="36" height="7"/>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
<span class="brand-name">ZDDC</span>
|
<span class="brand-name">ZDDC</span>
|
||||||
</a>
|
</a>
|
||||||
<nav class="header-nav">
|
<nav class="header-nav">
|
||||||
|
|
@ -125,7 +130,7 @@
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
<section style="margin-top: var(--spacing-2xl); color: var(--color-text-muted); font-size: 0.9rem;">
|
<section style="margin-top: var(--spacing-2xl); color: var(--color-text-muted); font-size: 0.9rem;">
|
||||||
<p>Append <code>?v=stable</code>, <code>?v=beta</code>, <code>?v=alpha</code>, <code>?v=0.0</code> (latest 0.0.x), or <code>?v=0.0.1</code> (exact) to any deployment URL to switch versions for a single request — see <a href="../">the home page</a>.</p>
|
<p>Each link above is a real static file (or a checked-in symlink resolving to one). Channel chips track the current build of that channel and may change at any time; per-version files are immutable. To install or pin in your own deployment, see <a href="../">the home page</a>.</p>
|
||||||
</section>
|
</section>
|
||||||
</main>
|
</main>
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue