Compare commits

..

1 Commits

Author SHA1 Message Date
Xavier Roche
94c9f8cbf9 Retest: un-skip 230_local-ftp-userpass on Windows
Investigation branch for #1038. The skip landed before the FTP fixes in
 #1039 and #1055; this re-runs the test on x64 to see whether the wedge
survives them.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Signed-off-by: Xavier Roche <roche@httrack.com>
2026-08-08 19:11:12 +02:00
439 changed files with 4365 additions and 13602 deletions

View File

@@ -22,7 +22,7 @@ jobs:
- name: Install appstreamcli
run: |
set -euo pipefail
sudo apt-get update || true # a third-party source in the runner image can 403 (#1097)
sudo apt-get update
sudo apt-get install -y --no-install-recommends appstream
appstreamcli --version

View File

@@ -38,7 +38,7 @@ jobs:
- name: Install build dependencies
run: |
set -euo pipefail
sudo apt-get update || true # a third-party source in the runner image can 403 (#1097)
sudo apt-get update
sudo apt-get install -y --no-install-recommends \
build-essential clang autoconf automake libtool autoconf-archive \
zlib1g-dev libssl-dev libbrotli-dev libzstd-dev \
@@ -80,27 +80,6 @@ jobs:
- name: Build
run: make -j"$(nproc)"
# FTP_PASV is 1 in every build, so #if !FTP_PASV never reaches a compiler
# and rots unnoticed (#1091). Compiling is all this proves; nothing runs it.
- name: Compile the FTP active-mode branch
run: |
set -euo pipefail
objs="src/libhttrack_la-htsftp.lo src/libhttrack_la-htsftp.o src/.libs/libhttrack_la-htsftp.o"
# accept() marks active-mode code: absent from the object Build made,
# present below. One-sided, it passes on a file that ignored the define.
syms=$(nm --undefined-only src/.libs/libhttrack_la-htsftp.o)
if grep -qw accept <<<"$syms"; then
echo "::error::accept() is reachable with FTP_PASV=1; the marker no longer discriminates"
exit 1
fi
rm -f $objs
# Through CC: overriding CPPFLAGS would drop configure's
# -D_FORTIFY_SOURCE and the object-size warnings that come with it.
make -C src libhttrack_la-htsftp.lo CC="$CC -DFTP_PASV=0 -Werror"
syms=$(nm --undefined-only src/.libs/libhttrack_la-htsftp.o)
grep -qw accept <<<"$syms" || { echo "::error::-DFTP_PASV=0 built no active-mode code"; exit 1; }
rm -f $objs
# A backstop only: tests/test-timeout.sh bounds each test, and a healthy run
# is a minute here, two on macOS. Without it a stall ran to the job's 6h default.
- name: Test
@@ -129,7 +108,7 @@ jobs:
- name: Install build dependencies
run: |
set -euo pipefail
sudo apt-get update || true # a third-party source in the runner image can 403 (#1097)
sudo apt-get update
sudo apt-get install -y --no-install-recommends \
build-essential autoconf automake libtool autoconf-archive \
zlib1g-dev libssl-dev libbrotli-dev libzstd-dev
@@ -159,48 +138,6 @@ jobs:
if: failure()
run: cat tests/test-suite.log 2>/dev/null || true
# Reproduces the buildds that refuse TEST-NET-1 instead of dropping it, where
# every fixture needing a stalled connect must skip rather than fail (#1108).
hostile-network:
name: build (network refuses TEST-NET-1)
runs-on: ubuntu-24.04
steps:
- uses: actions/checkout@v7
with:
submodules: recursive
- name: Install build dependencies
run: |
set -euo pipefail
sudo apt-get update
sudo apt-get install -y --no-install-recommends \
build-essential autoconf automake libtool autoconf-archive \
zlib1g-dev libssl-dev libbrotli-dev libzstd-dev iproute2
- name: Configure
run: |
set -euo pipefail
autoreconf -fi
./configure
- name: Build
run: make -j"$(nproc)"
- name: Test on a network that refuses TEST-NET-1
timeout-minutes: 20
run: |
set -euo pipefail
jobs=$(( $(nproc) * 2 )); [ "$jobs" -le 16 ] || jobs=16
tools/hostile-net.sh make check -j"$jobs"
# A refusal landing before connect() returns skips on the older probe
# instead, leaving the settle this leg exists to guard unrun.
cat tests/246_engine-connect-stop.log
grep -q 'within 500 ms' tests/246_engine-connect-stop.log
- name: Print the test log on failure
if: failure()
run: cat tests/test-suite.log 2>/dev/null || true
# The Ubuntu buildds run a development release every runner above is well behind.
# That gap is what shipped 3.49.18 broken on every Ubuntu architecture but
# riscv64, when 25.10 made uutils the default coreutils (#1042).
@@ -355,7 +292,7 @@ jobs:
- name: Install build dependencies
run: |
set -euo pipefail
sudo apt-get update || true # a third-party source in the runner image can 403 (#1097)
sudo apt-get update
sudo apt-get install -y --no-install-recommends \
build-essential autoconf automake libtool autoconf-archive \
zlib1g-dev libssl-dev libbrotli-dev libzstd-dev
@@ -464,7 +401,7 @@ jobs:
run: |
set -euo pipefail
sudo dpkg --add-architecture i386
sudo apt-get update || true # a third-party source in the runner image can 403 (#1097)
sudo apt-get update
sudo apt-get install -y --no-install-recommends \
build-essential gcc-multilib autoconf automake libtool \
autoconf-archive zlib1g-dev:i386 libssl-dev:i386 \
@@ -507,7 +444,7 @@ jobs:
- name: Install build dependencies
run: |
set -euo pipefail
sudo apt-get update || true # a third-party source in the runner image can 403 (#1097)
sudo apt-get update
sudo apt-get install -y --no-install-recommends \
build-essential autoconf automake libtool autoconf-archive \
zlib1g-dev libssl-dev libbrotli-dev libzstd-dev
@@ -562,7 +499,7 @@ jobs:
- name: Install build dependencies
run: |
set -euo pipefail
sudo apt-get update || true # a third-party source in the runner image can 403 (#1097)
sudo apt-get update
sudo apt-get install -y --no-install-recommends \
build-essential clang autoconf automake libtool autoconf-archive \
zlib1g-dev
@@ -611,7 +548,7 @@ jobs:
- name: Install build dependencies
run: |
set -euo pipefail
sudo apt-get update || true # a third-party source in the runner image can 403 (#1097)
sudo apt-get update
sudo apt-get install -y --no-install-recommends \
build-essential clang autoconf automake libtool autoconf-archive \
zlib1g-dev libssl-dev libbrotli-dev libzstd-dev
@@ -647,7 +584,7 @@ jobs:
- name: Install build dependencies
run: |
set -euo pipefail
sudo apt-get update || true # a third-party source in the runner image can 403 (#1097)
sudo apt-get update
sudo apt-get install -y --no-install-recommends \
build-essential clang autoconf automake libtool autoconf-archive \
zlib1g-dev libssl-dev libbrotli-dev libzstd-dev
@@ -677,7 +614,7 @@ jobs:
- name: Install build dependencies (no libssl)
run: |
set -euo pipefail
sudo apt-get update || true # a third-party source in the runner image can 403 (#1097)
sudo apt-get update
sudo apt-get install -y --no-install-recommends \
build-essential autoconf automake libtool autoconf-archive zlib1g-dev
@@ -700,47 +637,6 @@ jobs:
if: failure()
run: cat tests/test-suite.log 2>/dev/null || true
# The cell of #1139: a libc exporting getrandom() without shipping
# <sys/random.h>. Nothing else reaches it, and it is a hard build break when
# the call is not gated on the header. It also runs the /dev/urandom fallback.
no-getrandom:
name: build (getrandom header hidden)
runs-on: ubuntu-24.04
steps:
- uses: actions/checkout@v7
with:
submodules: recursive
- name: Install build dependencies
run: |
set -euo pipefail
sudo apt-get update || true # a third-party source in the runner image can 403 (#1097)
sudo apt-get install -y --no-install-recommends \
build-essential autoconf automake libtool autoconf-archive \
zlib1g-dev libssl-dev libbrotli-dev libzstd-dev
- name: Configure (sys/random.h hidden from configure)
run: |
set -euo pipefail
autoreconf -fi
./configure ac_cv_header_sys_random_h=no
# A libc without getrandom() at all would pass this job vacuously.
grep -q "define HAVE_GETRANDOM 1" config.h
! grep -q "define HAVE_SYS_RANDOM_H" config.h
- name: Build
run: make -j"$(nproc)"
- name: Test
timeout-minutes: 20
run: |
jobs=$(( $(nproc) * 2 )); [ "$jobs" -le 16 ] || jobs=16
make check -j"$jobs"
- name: Print the test log on failure
if: failure()
run: cat tests/test-suite.log 2>/dev/null || true
# OpenSSL 4.0 removes the API 3.x deprecated. Building with that set hidden
# keeps the engine ready for it: a deprecated call fails here rather than the
# day a distro moves. Compile-only, since the headers are what is under test.
@@ -755,7 +651,7 @@ jobs:
- name: Install build dependencies
run: |
set -euo pipefail
sudo apt-get update || true # a third-party source in the runner image can 403 (#1097)
sudo apt-get update
sudo apt-get install -y --no-install-recommends \
build-essential autoconf automake libtool autoconf-archive \
zlib1g-dev libssl-dev libbrotli-dev libzstd-dev
@@ -834,7 +730,7 @@ jobs:
- name: Install build dependencies
run: |
set -euo pipefail
sudo apt-get update || true # a third-party source in the runner image can 403 (#1097)
sudo apt-get update
sudo apt-get install -y --no-install-recommends \
build-essential autoconf automake libtool autoconf-archive \
zlib1g-dev libssl-dev libbrotli-dev libzstd-dev
@@ -878,7 +774,6 @@ jobs:
fi
lint:
# The name is a required status check on master; renaming it blocks every PR.
name: lint (shellcheck, shfmt)
runs-on: ubuntu-24.04
# Every tracked shell script; the globs expand at run time. Kept here so the
@@ -895,25 +790,23 @@ jobs:
src/webhttrack.in
tests/*.sh
tests/*.test
tools/*.sh
tools/macos-app.sh
tools/macos-bundle.sh
tools/macos-release.sh
tools/mkdeb.sh
steps:
- uses: actions/checkout@v7
- name: Install linters
run: |
set -euo pipefail
sudo apt-get update || true # a third-party source in the runner image can 403 (#1097)
sudo apt-get update
# noble ships shfmt 3.8.0 (universe), matching the pinned local dev
# version; use it rather than fetching a release binary from github.com.
sudo apt-get install -y --no-install-recommends shellcheck shfmt appstream \
appstream-util
# Pinned to the local dev versions: black's stable style moves across
# majors, so the runner image's build would reformat on its own schedule.
pip install --quiet black==25.1.0 flake8==7.1.1
shfmt --version
appstreamcli --version
black --version
flake8 --version
- name: shellcheck
run: shellcheck $SHELL_SCRIPTS
@@ -921,22 +814,6 @@ jobs:
- name: shfmt
run: shfmt -d -i 4 $SHELL_SCRIPTS
# Read the list rather than hand-keeping one: a .py added in a new
# directory then gets checked without anyone widening a glob.
- name: List the tracked Python files
run: |
set -euo pipefail
mapfile -t py < <(git ls-files '*.py')
test "${#py[@]}" -gt 0 # flake8 given no paths exits 0, checking nothing
echo "${#py[@]} tracked Python files"
echo "PYTHON_FILES=${py[*]}" >> "$GITHUB_ENV"
- name: black
run: black --check --diff $PYTHON_FILES
- name: flake8
run: flake8 $PYTHON_FILES
# A misnamed test falls outside the glob "make check" runs, so it goes
# missing without failing anything.
- name: test file names
@@ -982,7 +859,7 @@ jobs:
| sudo tee /etc/apt/trusted.gpg.d/apt.llvm.org.asc >/dev/null
echo "deb http://apt.llvm.org/noble/ llvm-toolchain-noble-19 main" \
| sudo tee /etc/apt/sources.list.d/llvm-19.list >/dev/null
sudo apt-get update || true # a third-party source in the runner image can 403 (#1097)
sudo apt-get update
sudo apt-get install -y --no-install-recommends clang-format-19
# The clang-format-19 package ships the git-clang-format driver;
# expose it unsuffixed so "git clang-format" finds it.

View File

@@ -33,12 +33,12 @@ jobs:
- name: Install build dependencies
run: |
set -euo pipefail
sudo apt-get update || true # a third-party source in the runner image can 403 (#1097)
sudo apt-get update
sudo apt-get install -y --no-install-recommends \
build-essential autoconf automake libtool autoconf-archive \
zlib1g-dev libssl-dev
- uses: github/codeql-action/init@v4.37.6
- uses: github/codeql-action/init@v4.37.4
with:
languages: c-cpp
build-mode: manual
@@ -67,6 +67,6 @@ jobs:
./configure
make -j"$(nproc)"
- uses: github/codeql-action/analyze@v4.37.6
- uses: github/codeql-action/analyze@v4.37.4
with:
category: "/language:c-cpp"

View File

@@ -1,78 +0,0 @@
# cross-arch.yml stops at compile for the ports architectures, so the Debian
# buildd is the first machine to run the suite on one, and it reports by failing
# the package build (#1146, #1148). This runs it under qemu-user, where a process
# is not the shape a native one is and every step costs far more.
name: Emulated suite
on:
# The harness is where a native-shape assumption lands, so gate on it rather
# than on every PR: this leg is slow and is not a required check.
pull_request:
paths:
- "tests/**"
- "tools/emulated-suite.sh"
- ".github/workflows/emulated-suite.yml"
push:
branches: [master]
schedule:
- cron: "41 5 * * 1"
workflow_dispatch:
# Least privilege: the workflow only needs to read the repo.
permissions:
contents: read
concurrency:
group: emulated-suite-${{ github.ref }}
cancel-in-progress: true
jobs:
emulated:
name: emulated suite (${{ matrix.arch }})
runs-on: ubuntu-24.04
# The emulated apt, configure and build take the bulk of it, well under the
# 6h ceiling: a wedge should not run that long.
timeout-minutes: 90
strategy:
fail-fast: false
matrix:
# Emulation is what is under test, not parisc: the hppa that reported
# #1146 lives in debian-ports, with no container image and a far more
# fragile archive. s390x is in main, and big-endian, which nothing else
# here covers.
arch: [s390x]
steps:
- name: Register the binfmt handlers
run: |
set -euo pipefail
sudo apt-get update
# Registered with the F flag, so the kernel holds the interpreter open
# and the container needs no copy of it.
sudo apt-get install -y --no-install-recommends qemu-user-static binfmt-support
test -e "/proc/sys/fs/binfmt_misc/qemu-${{ matrix.arch }}" ||
{ ls /proc/sys/fs/binfmt_misc; exit 1; }
- uses: actions/checkout@v7
with:
submodules: recursive
- name: Build and run the suite emulated
run: |
set -euo pipefail
# The build dir is a mounted volume, so the suite log outlives the
# container: a failure here has no detail otherwise.
mkdir -p "$RUNNER_TEMP/emul-bld"
docker run --rm --platform "linux/${{ matrix.arch }}" \
-v "$GITHUB_WORKSPACE:$GITHUB_WORKSPACE" -w "$GITHUB_WORKSPACE" \
-v "$RUNNER_TEMP/emul-bld:/bld" \
-e "GITHUB_WORKSPACE=$GITHUB_WORKSPACE" \
-e "EMULATED_ARCH=${{ matrix.arch }}" \
debian:sid bash ./tools/emulated-suite.sh
- name: Collect the suite log
if: failure()
uses: actions/upload-artifact@v7
with:
name: emulated-suite-${{ matrix.arch }}-log
path: ${{ runner.temp }}/emul-bld/tests/test-suite.log
if-no-files-found: warn

View File

@@ -1,106 +0,0 @@
# Build HTTraQt, the only consumer of our installed headers, against this branch.
name: HTTraQt
# Filtered, so it must never join the required set: a check that a path filter
# skips stays "Expected" forever and blocks the merge.
on:
push:
branches: [master]
paths: ['src/**', 'm4/**', 'configure.ac', '.github/workflows/httraqt.yml']
pull_request:
paths: ['src/**', 'm4/**', 'configure.ac', '.github/workflows/httraqt.yml']
schedule:
- cron: '37 05 * * 1' # upstream is pinned; this catches drift in Qt and the runner image
workflow_dispatch:
permissions:
contents: read
concurrency:
group: httraqt-${{ github.ref }}
cancel-in-progress: true
env:
# Unofficial mirror of the SourceForge tree, so no PR depends on a third-party host.
HTTRAQT_REPO: https://github.com/xroche/httraqt-ci-mirror.git
HTTRAQT_REF: a1175565c61ab9afd7bda2dc96ed1182c2d44ec3 # 1.4.11 + cmake patch, upstream HEAD since 2023-01-06
PREFIX: /usr/local
jobs:
build:
name: build HTTraQt against this branch
runs-on: ubuntu-24.04
steps:
- uses: actions/checkout@v7
with:
submodules: recursive
- name: Install build dependencies
run: |
set -euo pipefail
sudo apt-get update || true # a third-party source in the runner image can 403 (#1097)
sudo apt-get install -y --no-install-recommends \
build-essential autoconf automake libtool autoconf-archive \
zlib1g-dev libssl-dev libbrotli-dev libzstd-dev \
cmake qt6-base-dev qt6-multimedia-dev
- name: Build and install libhttrack
run: |
set -euo pipefail
autoreconf -fi
bld="$RUNNER_TEMP/bld"
mkdir -p "$bld"
(cd "$bld" && "$GITHUB_WORKSPACE/configure" --prefix="$PREFIX" --disable-static)
make -C "$bld" -j"$(nproc)"
sudo make -C "$bld" install
sudo ldconfig
- name: Assert no distribution libhttrack can shadow ours
run: |
set -euo pipefail
# FindHttrack.cmake hardcodes /usr/include/httrack first, so a stray libhttrack-dev would test Debian's headers.
for stray in /usr/include/httrack /usr/lib/libhttrack.so /usr/lib/*/libhttrack.so; do
if [ -e "$stray" ]; then
echo "::error::$stray exists; HTTraQt would build against it, not this branch"
exit 1
fi
done
test -f "$PREFIX/include/httrack/htsglobal.h"
- name: Fetch HTTraQt
run: |
set -euo pipefail
# Fetching the SHA itself needs no pin check afterwards, and keeps the
# tree out of the workspace so our own build cannot pick it up.
rm -rf "$RUNNER_TEMP/httraqt"
git init -q "$RUNNER_TEMP/httraqt"
ok=
for attempt in 1 2 3; do
if git -C "$RUNNER_TEMP/httraqt" fetch -q --depth 1 "$HTTRAQT_REPO" "$HTTRAQT_REF"; then ok=1; break; fi
echo "fetch failed (attempt $attempt)"
[ "$attempt" -eq 3 ] || sleep $((attempt * 15))
done
[ -n "$ok" ] || { echo "::error::cannot reach $HTTRAQT_REPO"; exit 1; }
git -C "$RUNNER_TEMP/httraqt" checkout -q --detach FETCH_HEAD
- name: Configure HTTraQt
run: |
set -euo pipefail
# CMAKE_MINIMUM_REQUIRED is 2.8 upstream, which CMake 4 rejects outright.
# The redirect is load-bearing: a bare MESSAGE() is NOTICE mode, which goes to stderr.
cmake -S "$RUNNER_TEMP/httraqt" -B "$RUNNER_TEMP/httraqt-bld" \
-DCMAKE_POLICY_VERSION_MINIMUM=3.5 \
2>&1 | tee "$RUNNER_TEMP/cmake.log"
# A configure that resolved elsewhere would compile someone else's headers.
grep -q "httrack header directory found: $PREFIX/include/httrack/" "$RUNNER_TEMP/cmake.log"
- name: Build HTTraQt
run: cmake --build "$RUNNER_TEMP/httraqt-bld" -j"$(nproc)"
- name: Assert it linked against the libhttrack we just built
run: |
set -euo pipefail
# Not bin/: CMAKE_RUNTIME_OUTPUT_DIRECTORY is set after ADD_EXECUTABLE, too late.
bin="$RUNNER_TEMP/httraqt-bld/httraqt"
ldd "$bin" | grep -E "libhttrack\.so.* => $PREFIX/lib/" \
|| { ldd "$bin"; exit 1; }

View File

@@ -34,7 +34,7 @@ jobs:
- name: Install build dependencies
run: |
set -euo pipefail
sudo apt-get update || true # a third-party source in the runner image can 403 (#1097)
sudo apt-get update
sudo apt-get install -y --no-install-recommends \
build-essential autoconf automake libtool autoconf-archive \
zlib1g-dev libssl-dev libbrotli-dev libzstd-dev
@@ -52,15 +52,6 @@ jobs:
pip install --quiet playwright
playwright install --with-deps chromium
# The address is on screen in the wizard panes and names the mirror folder,
# so the crawl needs a presentable host rather than 127.0.0.1 and a random
# port. example.com is reserved for documentation (RFC 2606).
- name: Let the crawl address a named site on port 80
run: |
set -euo pipefail
echo "127.0.0.1 www.example.com" | sudo tee -a /etc/hosts
sudo sysctl -w net.ipv4.ip_unprivileged_port_start=80 # bind 80 unprivileged
- name: Capture
env:
LANGN: ${{ inputs.lang || '1' }}
@@ -70,7 +61,6 @@ jobs:
# --root is the dist root; the source tree already holds every piece
# htsserver reads, so this needs no install.
python3 tools/screenshot-walk.py --htsserver src/htsserver --root . \
--site-host www.example.com --site-port 80 \
--lang "$LANGN" --scale "$SCALE" --out shots
- name: Upload the screens

View File

@@ -31,11 +31,6 @@ jobs:
matrix:
platform: [x64, Win32]
configuration: [Release]
# Windows runs from other branches starve this one's runner (#1213), so cap
# them repo-wide at one per platform. queue: max: the default cancels a waiter.
concurrency:
group: windows-build-${{ matrix.platform }}
queue: max
# Redirect vcpkg's default `files` binary cache into the workspace so
# actions/cache can persist it. vcpkg builds openssl/brotli/zlib/zstd from
# source otherwise, several minutes every run.
@@ -72,30 +67,17 @@ jobs:
run: New-Item -ItemType Directory -Force -Path $env:VCPKG_DEFAULT_BINARY_CACHE | Out-Null
# x-gha is gone (vcpkg-tool #1662 dropped it after GitHub changed the cache
# API), so cache the binary archives directly. An exact key hit skips the save,
# so a cache orphaned by a toolchain bump pins itself, and naming every input
# vcpkg's ABI hash folds in is a list that can come up short: key on the run
# id instead, and restore by prefix.
- name: Restore the vcpkg binary archives
uses: actions/cache/restore@v6
# API), so cache the binary archives directly. Keyed on the manifest, which
# carries the builtin-baseline, so a Dependabot bump busts it; restore-keys
# still seeds the unchanged ports' archives, so only the bumped one rebuilds.
- name: Cache vcpkg binary archives
uses: actions/cache@v6
with:
path: ${{ github.workspace }}\vcpkg_cache
key: vcpkg-${{ matrix.platform }}-${{ hashFiles('src/vcpkg.json') }}-${{ github.run_id }}-${{ github.run_attempt }}
key: vcpkg-${{ matrix.platform }}-${{ hashFiles('src/vcpkg.json') }}
restore-keys: |
vcpkg-${{ matrix.platform }}-${{ hashFiles('src/vcpkg.json') }}-
vcpkg-${{ matrix.platform }}-
# Counted before the build, or vcpkg's own writes during it make a cold cache
# look warm.
- name: Count the restored vcpkg archives
shell: pwsh
run: |
$a = @(Get-ChildItem -Recurse -File -Filter *.zip `
$env:VCPKG_DEFAULT_BINARY_CACHE -EA SilentlyContinue)
Write-Host "restored $($a.Count) archive(s)"
$a.FullName | Out-File -FilePath vcpkg-restored.txt
"VCPKG_ARCHIVES_BEFORE=$($a.Count)" | Out-File -FilePath $env:GITHUB_ENV -Append
# The runner image's vcpkg checkout is pinned to some commit; our manifest's
# builtin-baseline is usually newer, so `git show <baseline>:versions/...`
# fails until that commit is local. Fetch exactly the pinned baseline (read
@@ -125,50 +107,6 @@ jobs:
if ($LASTEXITCODE -ne 0) { throw "$proj failed" }
}
# A stale cache and a warm one both restore and rebuild; only archives
# restored and unmatched prove staleness.
- name: Check whether vcpkg could use the restored archives
id: vcpkg
if: ${{ !cancelled() }}
shell: pwsh
run: |
$before = [int]$env:VCPKG_ARCHIVES_BEFORE
$stale = $false
# The log is missing when the build never reached MSBuild.
if (Test-Path msbuild-libhttrack.log) {
$m = Select-String -Path msbuild-libhttrack.log -Pattern 'Restored (\d+) package' |
Select-Object -First 1
if ($m) {
$restored = [int]$m.Matches[0].Groups[1].Value
Write-Host "vcpkg restored $restored of $before archive(s)"
$stale = ($restored -eq 0 -and $before -gt 0)
} else { Write-Host "no vcpkg restore line in the build log" }
} else { Write-Host "no build log" }
if ($stale) {
Write-Host "::warning::stale vcpkg cache: $before archives, none matching this toolchain; every port rebuilt from source"
# Provably dead: drop them rather than carry every past toolchain
# generation in the saved entry forever. -LiteralPath because a piped
# string binds -Path, which globs on a name carrying [ ].
Get-Content vcpkg-restored.txt -EA SilentlyContinue | Where-Object { $_ } |
ForEach-Object { Remove-Item -LiteralPath $_ -Force -EA SilentlyContinue }
}
$after = @(Get-ChildItem -Recurse -File -Filter *.zip `
$env:VCPKG_DEFAULT_BINARY_CACHE -EA SilentlyContinue).Count
Write-Host "$after archive(s) to cache"
# Pruning can leave the count unmoved while replacing every archive, so the
# stale case saves on its own account rather than on growth.
"save=$($stale -or ($after -gt $before))".ToLower() |
Out-File -FilePath $env:GITHUB_OUTPUT -Append
# Only when the archive set changed, so a warm run adds no entry and the
# eviction budget stays for the runs that rebuilt something.
- name: Save the vcpkg binary archives
if: ${{ !cancelled() && steps.vcpkg.outputs.save == 'true' }}
uses: actions/cache/save@v6
with:
path: ${{ github.workspace }}\vcpkg_cache
key: vcpkg-${{ matrix.platform }}-${{ hashFiles('src/vcpkg.json') }}-${{ github.run_id }}-${{ github.run_attempt }}
# WinHTTrack links src\$(Platform)\$(Configuration)\libhttrack.lib, so the
# import lib and the DLL both have to land there under that exact name.
- name: Check the binaries landed where they are expected
@@ -229,33 +167,6 @@ jobs:
throw "CRT mismatch across the boundary: libhttrack.dll=$a httrack.exe=$b"
}
# The DLL build only proves the engine's own fixed include order, the one
# order a consumer need not use, and 205/206/207/269 all gate on an automake
# environment this job has not (#1153).
- name: Compile the installed headers standalone and pairwise
shell: pwsh
timeout-minutes: 20
run: |
$ErrorActionPreference = "Stop"
$vswhere = "${env:ProgramFiles(x86)}\Microsoft Visual Studio\Installer\vswhere.exe"
$vs = & $vswhere -latest -products * -property installationPath | Select-Object -First 1
if (-not $vs) { throw "Visual Studio not found" }
Import-Module "$vs\Common7\Tools\Microsoft.VisualStudio.DevShell.dll"
$arch = if ("${{ matrix.platform }}" -eq "x64") { "x64" } else { "x86" }
Enter-VsDevShell -VsInstallPath $vs -SkipAutomaticLocation `
-DevCmdArguments "-arch=$arch -host_arch=x64"
# htsbasenet.h reaches for <openssl/ssl.h> unless a consumer turns it
# off, so the sweep needs what vcpkg installed for the build. Searched,
# not spelled: the install root nests the triplet twice.
$dirs = @(Get-ChildItem -Path "src\vcpkg_installed" -Recurse -Depth 3 `
-Directory -Filter include -ErrorAction SilentlyContinue)
if (-not ($dirs | Where-Object { Test-Path (Join-Path $_.FullName "openssl\ssl.h") })) {
throw "no vcpkg include directory under src\vcpkg_installed holds openssl/ssl.h"
}
$inc = @($dirs | ForEach-Object { "-I" + $_.FullName })
bash tests/install-headers-sweep.sh --backend cl --srcdir . -- @inc
if ($LASTEXITCODE -ne 0) { throw "the installed headers do not compile standalone and pairwise" }
# The engine ships ~90 tests and none had ever run on Windows: "make check"
# is Linux/macOS only. These are the offline ones, driven from Git Bash
# against the native httrack.exe. They subsume the self-tests this step
@@ -270,9 +181,8 @@ jobs:
# Through the environment, never argv, which the process list exposes.
WATCHDOG_TOKEN: ${{ secrets.GITHUB_TOKEN }}
WATCHDOG_REPO: ${{ github.repository }}
# The PR head, not github.sha: a merge commit is garbage-collected, and
# these statuses are the only trace a lost runner leaves (#1228).
WATCHDOG_SHA: ${{ github.event.pull_request.head.sha || github.sha }}
# github.sha here is the PR's merge commit, so statuses posted against it stay out of the PR's checks UI.
WATCHDOG_SHA: ${{ github.sha }}
WATCHDOG_CONTEXT: windows-suite (${{ matrix.platform }}, ${{ matrix.configuration }})
WATCHDOG_URL: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}
run: |

View File

@@ -30,11 +30,6 @@ the operational checklist: toolchain, invariants, and how to ship a change.
check`, or `PATH="<bld>/src:$PATH"` for a manual run.
- Give new `.test` scripts `set -e`: the older ones predate the rule, so several
`local-crawl.sh` calls with no `set -e` report PASS on any non-last failure.
- Each test runs under a 600s wall-clock guard that reports a wedge as 124. A test
whose own work outlasts it raises the budget with a `# TEST_TIMEOUT_AT_LEAST: N`
line, at column 0 within its first 40 lines, and paces itself with
`skip_if_out_of_budget` so a host too slow to finish skips instead. The value only
ever raises the budget: nothing can disarm the guard.
- Run teardown with errexit off: `trap 'set +e; cleanup' EXIT`. Under `set -e` a
failing cleanup command becomes the test's exit status (#773). Keep the other
signals on their own `trap` line, or errexit stays off for the rest of the run.
@@ -51,12 +46,6 @@ the operational checklist: toolchain, invariants, and how to ship a change.
platform-specific: GNU `tail | head -c 3` survives, the uutils coreutils leg
turns the same line into exit 141 with no output at all. Let the reader seek
instead: `od -An -c -j <skip> -N <len> file`.
- Never assert a fault by signal *number*: SIGBUS is 7 on x86, arm, powerpc and
s390x but 10 on hppa, alpha, mips and sparc. Map it with `kill -l "$n"`.
- A fixture that needs a host to stay silent must settle (500ms), re-probe every
socket, and SKIP when one answered: the powerpc and ppc64 buildds refuse
TEST-NET-1 milliseconds after `connect()` where runners drop it.
`tools/hostile-net.sh` runs a command on such a network.
## Hard invariants
- **Generated autotools files are NOT in git.** `configure`, every

View File

@@ -1,6 +1,6 @@
AC_PREREQ([2.71])
AC_INIT([httrack], [3.49.21], [roche+packaging@httrack.com], [httrack], [http://www.httrack.com/])
AC_INIT([httrack], [3.49.18], [roche+packaging@httrack.com], [httrack], [http://www.httrack.com/])
AC_COPYRIGHT([
HTTrack Website Copier, Offline Browser for Windows and Unix
Copyright (C) 1998-2015 Xavier Roche and other contributors
@@ -29,12 +29,6 @@ AC_CONFIG_SRCDIR(src/httrack.c)
AC_CONFIG_MACRO_DIR([m4])
AC_CONFIG_HEADERS(config.h)
AM_INIT_AUTOMAKE([subdir-objects])
# 3:14:0: revision-only bump. httrackp gained a tail field (host_alias) and #1202
# added an export (hts_host_alias_rule_ok); no layout moved, nothing went away.
# 3:13:0: revision-only bump. htsstrings.h's StringRoomTotal grew saturation in
# its macro body; no installed struct moved and no export came or went.
# 3:12:0: revision-only bump. httrackp gained a tail field (singlefile_state) and
# htsopt.h added volatile qualifiers; no layout moved, nothing went away.
# 3:11:0: revision-only bump. #1001 moved SOCaddr_inetntoa_ out of htsnet.h, adding
# an export where callers had an inline; nothing changed or went away.
# 3:10:0: revision-only bump; only the version macro moved, the engine is untouched.
@@ -46,7 +40,7 @@ AM_INIT_AUTOMAKE([subdir-objects])
# moves nothing). Soname stays .so.3: HTTrackQt is the only consumer of the installed
# headers, so a libhttrack4 rename isn't worth it.
# (3:0:0 was the htsblk mime-buffer widening, the ABI break that moved .so.2 -> .so.3.)
VERSION_INFO="3:14:0"
VERSION_INFO="3:11:0"
AM_MAINTAINER_MODE
AC_USE_SYSTEM_EXTENSIONS

39
debian/changelog vendored
View File

@@ -1,42 +1,3 @@
httrack (3.49.21-2) unstable; urgency=medium
* Fix the FTBFS on hppa: three suite tests measured the build host rather
than the property they cover, and failed on the qemu-user buildd purely
for being slower there. Patched from upstream, which now skips a step a
host is too slow to finish instead of failing the build
(skip-emulated-host-test-failures.patch).
-- Xavier Roche <xavier@debian.org> Thu, 13 Aug 2026 07:26:38 +0200
httrack (3.49.21-1) unstable; urgency=medium
* New upstream release: a site answering to several hostnames can now be
mirrored once rather than once per name, plus fixes to mirror
interruption, to an update pass that purged files it had never reached,
and to several buffer overflows; full list in history.txt.
-- Xavier Roche <xavier@debian.org> Wed, 12 Aug 2026 15:05:15 +0200
httrack (3.49.20-1) unstable; urgency=medium
* New upstream release: an off-site link that looked like a file could pull
in the whole foreign site, and a mirror asked to stop while receiving over
FTP hung; full list in history.txt. The documentation was also refreshed.
* debian/copyright: record the League Spartan webfont the documentation now
bundles (OFL-1.1).
-- Xavier Roche <xavier@debian.org> Mon, 10 Aug 2026 21:08:40 +0200
httrack (3.49.19-1) unstable; urgency=medium
* New upstream release: mostly FTP fixes, plus stack-overflow, mirror
interruption and --update data-loss fixes; full list in history.txt. Two
of them matter to the build: the test suite no longer assumes GNU
coreutils, and the AppStream metainfo no longer declares a non-stock icon
name that appstream-util rejects.
-- Xavier Roche <xavier@debian.org> Sat, 08 Aug 2026 21:29:56 +0200
httrack (3.49.18-1) unstable; urgency=medium
* New upstream release, fixing the 3.49.17-1 build failures on armhf,

95
debian/copyright vendored
View File

@@ -44,13 +44,6 @@ License: FSFAP
permitted in any medium without royalty provided the copyright notice and
this notice are preserved. This file is offered as-is, without any warranty.
Files: html/fonts/*
Copyright: 2020 The League Spartan Project Authors
License: OFL-1.1
Comment:
The woff2 is the latin subset at weight 700, as served by Google Fonts.
Upstream declares no Reserved Font Name, so the subset keeps the family name.
Files: debian/*
Copyright: 2002-2026 Xavier Roche <xavier@debian.org>
License: GPL-3+
@@ -113,91 +106,3 @@ License: BSD-3-clause
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
License: OFL-1.1
-----------------------------------------------------------
SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
-----------------------------------------------------------
.
PREAMBLE
The goals of the Open Font License (OFL) are to stimulate worldwide
development of collaborative font projects, to support the font creation
efforts of academic and linguistic communities, and to provide a free and
open framework in which fonts may be shared and improved in partnership
with others.
.
The OFL allows the licensed fonts to be used, studied, modified and
redistributed freely as long as they are not sold by themselves. The
fonts, including any derivative works, can be bundled, embedded,
redistributed and/or sold with any software provided that any reserved
names are not used by derivative works. The fonts and derivatives,
however, cannot be released under any other type of license. The
requirement for fonts to remain under this license does not apply
to any document created using the fonts or their derivatives.
.
DEFINITIONS
"Font Software" refers to the set of files released by the Copyright
Holder(s) under this license and clearly marked as such. This may
include source files, build scripts and documentation.
.
"Reserved Font Name" refers to any names specified as such after the
copyright statement(s).
.
"Original Version" refers to the collection of Font Software components as
distributed by the Copyright Holder(s).
.
"Modified Version" refers to any derivative made by adding to, deleting,
or substituting -- in part or in whole -- any of the components of the
Original Version, by changing formats or by porting the Font Software to a
new environment.
.
"Author" refers to any designer, engineer, programmer, technical
writer or other person who contributed to the Font Software.
.
PERMISSION & CONDITIONS
Permission is hereby granted, free of charge, to any person obtaining
a copy of the Font Software, to use, study, copy, merge, embed, modify,
redistribute, and sell modified and unmodified copies of the Font
Software, subject to the following conditions:
.
1) Neither the Font Software nor any of its individual components,
in Original or Modified Versions, may be sold by itself.
.
2) Original or Modified Versions of the Font Software may be bundled,
redistributed and/or sold with any software, provided that each copy
contains the above copyright notice and this license. These can be
included either as stand-alone text files, human-readable headers or
in the appropriate machine-readable metadata fields within text or
binary files as long as those fields can be easily viewed by the user.
.
3) No Modified Version of the Font Software may use the Reserved Font
Name(s) unless explicit written permission is granted by the corresponding
Copyright Holder. This restriction only applies to the primary font name as
presented to the users.
.
4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
Software shall not be used to promote, endorse or advertise any
Modified Version, except to acknowledge the contribution(s) of the
Copyright Holder(s) and the Author(s) or with their explicit written
permission.
.
5) The Font Software, modified or unmodified, in part or in whole,
must be distributed entirely under this license, and must not be
distributed under any other license. The requirement for fonts to
remain under this license does not apply to any document created
using the Font Software.
.
TERMINATION
This license becomes null and void if any of the above conditions are
not met.
.
DISCLAIMER
THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
OTHER DEALINGS IN THE FONT SOFTWARE.

View File

@@ -4,59 +4,6 @@ HTTrack Website Copier release history:
This file lists all changes and fixes that have been made for HTTrack
3.49-21
+ New: --host-alias (-%C) folds the several hostnames of one site onto a single canonical host, so a site that answers under more than one hostname is fetched once instead of once per name (#16)
+ New: the WebHTTrack wizard can set the host-alias rules and the guide documents them for every front end; a malformed rule is refused where it can still be corrected, through a newly exported hts_host_alias_rule_ok() (#1161, #1172, #1192)
+ Fixed: any signal caught during a mirror killed every transfer in flight, so a burst of them silently truncated the mirror; a stop now ends an HTTP transfer as the user's stop rather than a fabricated receive error (#1110)
+ Fixed: stopping an FTP transfer against a silent server waited out --timeout twice, once on the data socket and again on a QUIT reply nobody was going to send (#1096)
+ Fixed: a crawl that ended early ran --update's purge against the files it had never reached, deleting good ones (#1109)
+ Fixed: a long URL overflowed the duplicate-detection key buffer (#1160)
+ Fixed: a long command line, a large doit.log or a large .httrackrc aborted the engine while it rebuilt its arguments (#1189, #1198)
+ Fixed: a scan rule beginning with a dash ended the whole run (#1179)
+ Fixed: --index=0 and --noindex enabled the index rather than disabling it, and --purge-old=1 killed the run; an option that takes no value now refuses one instead of silently dropping it (#1195, #1200)
+ Fixed: reloading a WebHTTrack project lost every zero and every cleared field, so a rate limit of 0 came back as 100 KB/s and a cleared user-agent refilled itself (#1177, #1171, #1186)
+ Fixed: the wizard kept only the last of several --strip-query rules, and its domain answers matched beyond the domain they named (#1168, #1119)
+ Fixed: the offer to resume an interrupted mirror printed the program path instead of the command line it would rerun (#1204)
+ Fixed: the build failed where getrandom() has no declaration, and the installed headers did not compile under some include orders (#1139, #1150, #1151)
+ Changed: the documentation and the WebHTTrack pages compute their copyright year instead of carrying a fixed one (#1163, #1165)
+ Changed: refreshed the guide screenshots for all three interfaces, and repaired the documentation's dark mode and its search-target tabs (#1164, #1158)
+ Changed: multiple internal hardening, build, test and CI improvements
3.49-20
+ Fixed: a link to another host whose name looked like a file was scanned as a page, so one link could mirror the whole foreign site on the referring page's depth budget (#121)
+ Fixed: a size-bounded filter built both of its filter URLs wrong when the path had no leading slash (#1095)
+ Fixed: a mirror told to quit while an FTP file was being received announced the exit and then waited forever on that slot (#1106)
+ Fixed: stopping an FTP transfer closed its data socket twice, so a threaded crawl could lose another worker's connection (#1090)
+ Fixed: WebHTTrack's welcome page opened its language menu blank instead of marking the language in use (#1084)
+ Fixed: two suite tests failed on the hppa, powerpc and ppc64 Debian buildds, holding the package back on those ports (#1108)
+ Fixed: a growable string could wrap its capacity to zero instead of saturating (#1062)
+ Changed: the macOS disk image carries its architecture in its name, so an Intel user can tell before downloading that the build is for Apple Silicon (#1083)
+ Changed: refreshed the GUI guide, its screenshots, the documentation typography and the footer contrast
+ Changed: settled on one spelling of the product name across the docs and the site
+ Changed: multiple internal hardening, build, test and CI improvements
3.49-19
+ Fixed: an over-long user name in an ftp:// URL was truncated at the credential boundary, so the login went to a different account (#1032)
+ Fixed: an over-long FTP path or host name aborted the process instead of failing that one link (#1019)
+ Fixed: an FTP crawl ignored --timeout and --max-time, so a server that went quiet held a slot for five minutes (#1039)
+ Fixed: an FTP crawl of a dead host took two minutes to give up, and no signal could shorten it (#1059)
+ Fixed: the engine released the transfer slots while an FTP thread was still writing to one, crashing a mirror that hit its size or time limit (#1051)
+ Fixed: Ctrl-C did not shorten a connection or a name lookup already in flight, so ending a crawl against an unreachable host took minutes (#1073)
+ Fixed: a crawl that gave up mid-loop, on the link limit or an abort, lost its WARC archive and its change report, and a WARC written past teardown was stranded in a .tmp file (#1061, #1060)
+ Fixed: a crawl that rolled back for want of data still replaced the previous WARC archive, stranding its temporary and never writing its index; a stale or unwritable index is now reported rather than left silently in place (#1053)
+ Fixed: a resume the server answered with an unusable Content-Range deleted the partial file and never fetched it again; the restart no longer spends the retry budget, and is latched to one per link (#581, #1052)
+ Fixed: a long argument to -n or -O smashed the stack through an unbounded panic message, and the growable arrays could wrap their capacity to zero (#1040)
+ Fixed: --single-file could write a reference mark longer than it reads back, leaving it in the delivered page as visible text (#1054, #1069)
+ Fixed: on a terminal with no input left, a crawl toggled between the spinner and the full panel on every pass (#1072)
+ Fixed: -%v1 ended each line with a carriage return, so the lines overwrote each other and a redirected log was unreadable; -%v2 now paints its panel only on a terminal
+ Fixed: the installed socket headers did not compile under -std=c99 without _POSIX_C_SOURCE (#1001)
+ Fixed: the 16 px application icon rendered every stem as grey (#938)
+ Fixed: the desktop files installed outside the data directory, and the AppStream metainfo declared an icon name that is not a stock one
+ Fixed: the build failed on distributions whose coreutils are not GNU's (#1042)
+ Changed: --single-file drops its own HTML and CSS scanner and reuses the crawler's parser, so it follows the same references the mirror does (#749)
+ Changed: updated Turkish translation, and repaired two mangled Polish strings (#306)
+ Changed: multiple internal hardening, build, test and CI improvements
3.49-18
+ Fixed: the 3.49.17 package build failed on four architectures: the test suite's mmap interposer did not compile on armhf, powerpc or hppa, and the alternate-stack test rejected loong64's shorter backtrace (#1023)
+ Fixed: the test suite failed on a host with no ps command, such as a Fedora build root; its hang diagnostics now read /proc directly (#1021)

View File

@@ -4,7 +4,6 @@ HelpHtmldir = $(htmldir)
HelpHtmlimgdir = $(HelpHtmldir)/img
HelpHtmldivdir = $(HelpHtmldir)/div
HelpHtmlimagesdir = $(HelpHtmldir)/images
HelpHtmlfontsdir = $(HelpHtmldir)/fonts
HelpHtmlTxtdir = $(HelpHtmldir)
WebHtmldir = $(HelpHtmldir)/server
WebHtmlimagesdir = $(HelpHtmldir)/server/images
@@ -28,8 +27,6 @@ HelpHtml_DATA = $(srcdir)/*.html $(srcdir)/*.js $(srcdir)/*.css
HelpHtmldiv_DATA = div/search.sh
HelpHtmlimg_DATA = $(srcdir)/img/*
HelpHtmlimages_DATA = $(srcdir)/images/*
# doc.css reaches the woff2 by a relative URL, so it installs beside the pages.
HelpHtmlfonts_DATA = $(srcdir)/fonts/*
HelpHtmlTxt_DATA = ../greetings.txt ../history.txt ../license.txt
WebHtml_DATA = $(srcdir)/server/*.html $(srcdir)/server/*.js $(srcdir)/server/*.css
WebHtmlimages_DATA = $(srcdir)/server/images/*
@@ -48,7 +45,6 @@ VFolderEntry_DATA = $(srcdir)/server/div/*.desktop
MetaInfo_DATA = $(srcdir)/server/div/*.metainfo.xml
EXTRA_DIST = $(HelpHtml_DATA) $(HelpHtmlimg_DATA) $(HelpHtmlimages_DATA) \
$(HelpHtmlfonts_DATA) \
$(HelpHtmldiv_DATA) $(WebHtml_DATA) $(WebHtmlimages_DATA) \
$(WebPixmap_DATA) $(WebIcon16x16_DATA) $(WebIcon32x32_DATA) $(WebIcon48x48_DATA) \
$(WebIcon64x64_DATA) $(WebIcon128x128_DATA) $(WebIcon256x256_DATA) \

View File

@@ -13,14 +13,12 @@
<body>
<!-- doc-chrome:top -->
<!-- doc-chrome:masthead -->
<a class="skip" href="#main">Skip to content</a>
<header class="masthead">
<img src="images/wordmark.svg" width="400" height="36" alt="HTTrack Website Copier">
<div class="tagline">Free software offline browser</div>
<div class="tagline">Open Source offline browser</div>
</header>
<!-- /doc-chrome:masthead -->
<div class="wrap">
@@ -536,14 +534,9 @@ And then, put the email address in your pages through:
</div>
<dialog id="zoom" aria-label="Enlarged image"><img src="" alt=""></dialog>
<!-- /doc-chrome:bottom -->
<!-- doc-chrome:footer -->
<footer>
<small>&copy; 1998-2026 Xavier Roche &amp; other contributors - Web Design: Leto Kauler.</small>
<a href="https://endsoftwarepatents.org/innovating-without-patents/" target="_blank" rel="noopener" title="This site is innovating without patents!"><img src="images/esp_chicklet.png" width="91" height="17" alt="End Software Patents"></a>
</footer>
<!-- /doc-chrome:footer -->
<footer>&copy; 1998-2026 Xavier Roche &amp; other contributors - Web Design: Leto Kauler.</footer>
<!-- /doc-chrome:bottom -->
</body>
</html>

View File

@@ -13,14 +13,12 @@
<body>
<!-- doc-chrome:top -->
<!-- doc-chrome:masthead -->
<a class="skip" href="#main">Skip to content</a>
<header class="masthead">
<img src="images/wordmark.svg" width="400" height="36" alt="HTTrack Website Copier">
<div class="tagline">Free software offline browser</div>
<div class="tagline">Open Source offline browser</div>
</header>
<!-- /doc-chrome:masthead -->
<div class="wrap">
@@ -77,8 +75,8 @@ The main advantages of this cache are:
<ul>
<li>One single file for a complete website cache archive</li>
<li>Standard <a href="http://www.pkware.com/products/enterprise/white_papers/appnote.txt" target="_blank">ZIP</a> format, that can be easily reused on most platforms and languages</li>
<li>Compressed data with the efficient and opened <a href="http://www.gzip.org/zlib/" target="_blank">zlib</a> format</li>
<li>Standard <a href="http://www.pkware.com/products/enterprise/white_papers/appnote.txt" target="_new">ZIP</a> format, that can be easily reused on most platforms and languages</li>
<li>Compressed data with the efficient and opened <a href="http://www.gzip.org/zlib/" target="_new">zlib</a> format</li>
</ul>
The cache is made of ZIP files entries ; with one ZIP file entry per fetched URL (successfully or not - errors are also stored).<br />
@@ -86,7 +84,7 @@ For each entry:
<ul>
<li>The ZIP file name is the original URL [<small><a href="#orig">see notes below</a></small>]</li>
<li>The ZIP file contents, <b>if available</b>, is the original (compressed, using the deflate algorythm) data</li>
<li>The ZIP file extra field (in the local file header) contains a list of meta-fields, very similar to the <a href="http://www.ietf.org/rfc/rfc2616.txt?number=2616" target="_blank">HTTP</a> headers fields. See also <a href="http://www.ietf.org/rfc/rfc2396.txt?number=2396" target="_blank">RFC</a>.</li><br />
<li>The ZIP file extra field (in the local file header) contains a list of meta-fields, very similar to the <a href="http://www.ietf.org/rfc/rfc2616.txt?number=2616" target="new_">HTTP</a> headers fields. See also <a href="http://www.ietf.org/rfc/rfc2396.txt?number=2396" target="new_">RFC</a>.</li><br />
<li>The ZIP file timestamp follows the "Last-Modified-Since" field given for this URL, if any</li>
</ul>
@@ -232,14 +230,9 @@ Libraries should generally handle this peculiar format, however.
</div>
<dialog id="zoom" aria-label="Enlarged image"><img src="" alt=""></dialog>
<!-- /doc-chrome:bottom -->
<!-- doc-chrome:footer -->
<footer>
<small>&copy; 1998-2026 Xavier Roche &amp; other contributors - Web Design: Leto Kauler.</small>
<a href="https://endsoftwarepatents.org/innovating-without-patents/" target="_blank" rel="noopener" title="This site is innovating without patents!"><img src="images/esp_chicklet.png" width="91" height="17" alt="End Software Patents"></a>
</footer>
<!-- /doc-chrome:footer -->
<footer>&copy; 1998-2026 Xavier Roche &amp; other contributors - Web Design: Leto Kauler.</footer>
<!-- /doc-chrome:bottom -->
</body>
</html>

View File

@@ -13,14 +13,12 @@
<body>
<!-- doc-chrome:top -->
<!-- doc-chrome:masthead -->
<a class="skip" href="#main">Skip to content</a>
<header class="masthead">
<img src="images/wordmark.svg" width="400" height="36" alt="HTTrack Website Copier">
<div class="tagline">Free software offline browser</div>
<div class="tagline">Open Source offline browser</div>
</header>
<!-- /doc-chrome:masthead -->
<div class="wrap">
@@ -213,14 +211,9 @@ scope: both change what a mirror directory contains.</li>
</div>
<dialog id="zoom" aria-label="Enlarged image"><img src="" alt=""></dialog>
<!-- /doc-chrome:bottom -->
<!-- doc-chrome:footer -->
<footer>
<small>&copy; 1998-2026 Xavier Roche &amp; other contributors - Web Design: Leto Kauler.</small>
<a href="https://endsoftwarepatents.org/innovating-without-patents/" target="_blank" rel="noopener" title="This site is innovating without patents!"><img src="images/esp_chicklet.png" width="91" height="17" alt="End Software Patents"></a>
</footer>
<!-- /doc-chrome:footer -->
<footer>&copy; 1998-2026 Xavier Roche &amp; other contributors - Web Design: Leto Kauler.</footer>
<!-- /doc-chrome:bottom -->
</body>
</html>

View File

@@ -13,14 +13,12 @@
<body>
<!-- doc-chrome:top -->
<!-- doc-chrome:masthead -->
<a class="skip" href="#main">Skip to content</a>
<header class="masthead">
<img src="images/wordmark.svg" width="400" height="36" alt="HTTrack Website Copier">
<div class="tagline">Free software offline browser</div>
<div class="tagline">Open Source offline browser</div>
</header>
<!-- /doc-chrome:masthead -->
<div class="wrap">
@@ -119,7 +117,6 @@ the index" problems disappear.</p>
<tr class="head"><td><b>Option</b></td><td><b>What it controls</b></td></tr>
<tr><td><tt>--depth (-r)</tt></td><td>Maximum link depth. <b>The start page is level 1</b>, so one level of links out is <tt>-r2</tt>, not <tt>-r1</tt>.</td></tr>
<tr><td><tt>--stay-on-same-address (-a), --stay-on-same-domain (-d), --stay-on-same-tld (-l), --go-everywhere (-e)</tt></td><td>How far off the starting host the crawl may travel: same address (host), same principal domain, same top-level domain (for example .com), or everywhere. The default keeps you on the starting host.</td></tr>
<tr><td><tt>--host-alias (-%C)</tt></td><td>Declares that several hostnames serve the same site, for example <tt>--host-alias "www2.example.com,m.example.com=example.com"</tt>. Those names then count as the starting host: their links travel under the same-address rules, are fetched from the canonical host, and are saved once rather than once per name. The left side takes filter-style globs and comma-separated names, the right side one literal host, port included. Either side may name a scheme (<tt>legacy.example.com=https://example.com</tt> reaches a host that only answers over HTTPS, and <tt>https://www.example.com=ftp://files.example.com</tt> matches only the HTTPS form). A path is refused: this maps hosts, not URLs.</td></tr>
<tr><td><tt>--can-go-down (-D), --can-go-up (-U), --stay-on-same-dir (-S), --can-go-up-and-down (-B)</tt></td><td>Directory travel: down into subdirectories only, up to parent directories only, stay in the same directory, or both up and down.</td></tr>
<tr><td><tt>--near (-n)</tt></td><td>Also fetch non-HTML files "near" a followed link, such as an image linked from a page you kept but hosted elsewhere.</td></tr>
<tr><td><tt>--ext-depth (-%e)</tt></td><td>How many levels of external links to follow once the crawl leaves your scope (default 0).</td></tr>
@@ -149,9 +146,7 @@ usually not a scope option at all: it is an off-host redirect. A start URL of
<tt>http://example.com/</tt> that redirects to <tt>https://www.example.com/</tt>
lands you on a different host, and same-host scope stops the crawl there. Start
from the final URL, or add a filter that re-admits the real host (see
<a href="#filters">Filters</a>). The log will show the redirect. When both names
really are one site, <tt>--host-alias</tt> says so once and the mirror stops
depending on which one you started from.</p>
<a href="#filters">Filters</a>). The log will show the redirect.</p>
<p><tt>-n</tt> is the fix for pages that render locally without their images or
stylesheets: it lets HTTrack pull in requisites that sit just outside scope. Note
@@ -508,14 +503,9 @@ all disabled.</small></p>
</div>
<dialog id="zoom" aria-label="Enlarged image"><img src="" alt=""></dialog>
<!-- /doc-chrome:bottom -->
<!-- doc-chrome:footer -->
<footer>
<small>&copy; 1998-2026 Xavier Roche &amp; other contributors - Web Design: Leto Kauler.</small>
<a href="https://endsoftwarepatents.org/innovating-without-patents/" target="_blank" rel="noopener" title="This site is innovating without patents!"><img src="images/esp_chicklet.png" width="91" height="17" alt="End Software Patents"></a>
</footer>
<!-- /doc-chrome:footer -->
<footer>&copy; 1998-2026 Xavier Roche &amp; other contributors - Web Design: Leto Kauler.</footer>
<!-- /doc-chrome:bottom -->
</body>
</html>

View File

@@ -23,14 +23,12 @@
<body>
<!-- doc-chrome:top -->
<!-- doc-chrome:masthead -->
<a class="skip" href="#main">Skip to content</a>
<header class="masthead">
<img src="images/wordmark.svg" width="400" height="36" alt="HTTrack Website Copier">
<div class="tagline">Free software offline browser</div>
<div class="tagline">Open Source offline browser</div>
</header>
<!-- /doc-chrome:masthead -->
<div class="wrap">
@@ -208,14 +206,9 @@ roche at httrack dot com (Xavier ROCHE)<br>
</div>
<dialog id="zoom" aria-label="Enlarged image"><img src="" alt=""></dialog>
<!-- /doc-chrome:bottom -->
<!-- doc-chrome:footer -->
<footer>
<small>&copy; 1998-2026 Xavier Roche &amp; other contributors - Web Design: Leto Kauler.</small>
<a href="https://endsoftwarepatents.org/innovating-without-patents/" target="_blank" rel="noopener" title="This site is innovating without patents!"><img src="images/esp_chicklet.png" width="91" height="17" alt="End Software Patents"></a>
</footer>
<!-- /doc-chrome:footer -->
<footer>&copy; 1998-2026 Xavier Roche &amp; other contributors - Web Design: Leto Kauler.</footer>
<!-- /doc-chrome:bottom -->
</body>
</html>

View File

@@ -13,14 +13,12 @@
<body>
<!-- doc-chrome:top -->
<!-- doc-chrome:masthead -->
<a class="skip" href="#main">Skip to content</a>
<header class="masthead">
<img src="images/wordmark.svg" width="400" height="36" alt="HTTrack Website Copier">
<div class="tagline">Free software offline browser</div>
<div class="tagline">Open Source offline browser</div>
</header>
<!-- /doc-chrome:masthead -->
<div class="wrap">
@@ -105,14 +103,9 @@ compared to the previous mirror. This page describes that file.
</div>
<dialog id="zoom" aria-label="Enlarged image"><img src="" alt=""></dialog>
<!-- /doc-chrome:bottom -->
<!-- doc-chrome:footer -->
<footer>
<small>&copy; 1998-2026 Xavier Roche &amp; other contributors - Web Design: Leto Kauler.</small>
<a href="https://endsoftwarepatents.org/innovating-without-patents/" target="_blank" rel="noopener" title="This site is innovating without patents!"><img src="images/esp_chicklet.png" width="91" height="17" alt="End Software Patents"></a>
</footer>
<!-- /doc-chrome:footer -->
<footer>&copy; 1998-2026 Xavier Roche &amp; other contributors - Web Design: Leto Kauler.</footer>
<!-- /doc-chrome:bottom -->
</body>
</html>

View File

@@ -32,20 +32,6 @@
}
}
/* Additions stay out of the palette block above: it is kept byte-identical with the website's. */
:root {
--body-font: system-ui, -apple-system, "Segoe UI", Roboto, "Trebuchet MS", Verdana, sans-serif;
}
/* Relative URL: the docs are read from an installed directory too. */
@font-face {
font-family: "League Spartan";
src: url(fonts/league-spartan-700-latin.woff2) format("woff2");
font-weight: 700;
font-style: normal;
font-display: swap;
}
* { box-sizing: border-box; }
/* The plain declaration before each var() is what IE11 gets: it drops the
@@ -58,7 +44,6 @@ body {
color: #111;
color: var(--ink);
font: 1em/1.6 "Trebuchet MS", Verdana, system-ui, -apple-system, "Segoe UI", sans-serif;
font-family: var(--body-font);
}
/* ---- page frame ---- */
@@ -87,6 +72,7 @@ body {
/* A one-line label has no use for the body's prose leading. */
line-height: 1;
padding: .3rem .4rem;
margin-top: .4rem;
}
.wrap {
@@ -120,18 +106,11 @@ body {
.wrap.solo { display: block; }
}
/* Colour inherited: nothing lighter than --ink reaches 4.5:1 on the --field
this sits on, and at this size it is small text. */
/* Mirrors site.css's .sitefooter: flush on the panel's black edge, chicklet at the far end. */
footer {
max-width: 68rem;
margin: 0 auto;
margin: .5rem auto 0;
color: #eef;
font-size: .8em;
line-height: 1.3;
display: flex;
justify-content: space-between;
align-items: center;
gap: 1rem;
}
@media (prefers-color-scheme: dark) {
@@ -142,9 +121,6 @@ footer {
h2, h3 { scroll-margin-top: 1rem; }
/* Top two levels only: a display face reads worse than the system font over prose. */
h1, h2 { font-family: "League Spartan", var(--body-font); font-weight: 700; }
h1 { font-size: 1.9em; margin: 0 0 .3em; line-height: 1.2; }
h2 { font-size: 1.45em; margin: 2.5em 0 .5em; padding-bottom: .2em; border-bottom: 2px solid var(--rule); }
h3 { font-size: 1.15em; margin: 2em 0 .4em; }
@@ -366,26 +342,8 @@ dialog#zoom::backdrop { background: rgba(0, 0, 0, .8); }
z-index: 10;
}
/* Some browsers still apply prefers-color-scheme: dark when printing, so the ink
comes out #e6e6ee on white paper. Reset the palette, not each rule reading it. */
@media print {
:root {
--field: #77b;
--panel: #ccd;
--accent: #99c;
--ink: #111;
--ink-soft: #444;
--rule: #aab;
--link: #00c;
--link-hover: #c00;
--code-bg: #e8e8f2;
--chip: #dde;
--shadow: rgba(0, 0, 0, .25);
}
body { background: #fff; }
.toc, .filter { display: none; }
.wrap { display: block; border: 0; }
/* Not a token, same paper: the dark scheme inverts the wordmark to white. */
.masthead img { filter: none; }
}

View File

@@ -13,14 +13,12 @@
<body>
<!-- doc-chrome:top -->
<!-- doc-chrome:masthead -->
<a class="skip" href="#main">Skip to content</a>
<header class="masthead">
<img src="images/wordmark.svg" width="400" height="36" alt="HTTrack Website Copier">
<div class="tagline">Free software offline browser</div>
<div class="tagline">Open Source offline browser</div>
</header>
<!-- /doc-chrome:masthead -->
<div class="wrap">
@@ -320,7 +318,7 @@ However, be sure to always download HTTrack from a <b>trusted source</b> (prefer
<br><br><a NAME="QG0c">Q: <strong>This software is 'free', but I bought it from an authorized reseller . What's going on?</strong></a><br>
A: <em>
HTTrack is free (free as in 'freedom') as it is covered by the <a href="http://www.gnu.org/licenses/gpl.txt" target="_blank">GNU General Public License (GPL)</a>.
HTTrack is free (free as in 'freedom') as it is covered by the <a href="http://www.gnu.org/licenses/gpl.txt" target="_new">GNU General Public License (GPL)</a>.
You can freely download it, without paying any fees, copy it to your friends, and modify it if you respect the license.
There are NO official/authorized resellers, because HTTrack is <b>NOT</b> a commercial product.
But you can be charged for duplication fees, or any other services (example: software CDroms or shareware collections, or fees for maintenance),
@@ -883,14 +881,9 @@ A: <em>Feel free to <a href="contact.html">contact us</a>!
</div>
<dialog id="zoom" aria-label="Enlarged image"><img src="" alt=""></dialog>
<!-- /doc-chrome:bottom -->
<!-- doc-chrome:footer -->
<footer>
<small>&copy; 1998-2026 Xavier Roche &amp; other contributors - Web Design: Leto Kauler.</small>
<a href="https://endsoftwarepatents.org/innovating-without-patents/" target="_blank" rel="noopener" title="This site is innovating without patents!"><img src="images/esp_chicklet.png" width="91" height="17" alt="End Software Patents"></a>
</footer>
<!-- /doc-chrome:footer -->
<footer>&copy; 1998-2026 Xavier Roche &amp; other contributors - Web Design: Leto Kauler.</footer>
<!-- /doc-chrome:bottom -->
</body>
</html>

View File

@@ -13,14 +13,12 @@
<body>
<!-- doc-chrome:top -->
<!-- doc-chrome:masthead -->
<a class="skip" href="#main">Skip to content</a>
<header class="masthead">
<img src="images/wordmark.svg" width="400" height="36" alt="HTTrack Website Copier">
<div class="tagline">Free software offline browser</div>
<div class="tagline">Open Source offline browser</div>
</header>
<!-- /doc-chrome:masthead -->
<div class="wrap">
@@ -176,7 +174,7 @@ Action options:
Proxy options:
P proxy use (-P proxy:port or -P user:pass@proxy:port) (--proxy &lt;param&gt;)
%f *use proxy for ftp (f0 don't use) (--httpproxy-ftp[=0])
%f *use proxy for ftp (f0 don't use) (--httpproxy-ftp[=N])
Limits options:
rN set the mirror depth to N (* r9999) (--depth[=N])
@@ -197,7 +195,7 @@ Flow control:
HN host is abandoned if: 0=never, 1=timeout, 2=slow, 3=timeout or slow (--host-control[=N])
Links options:
%P *extended parsing, attempt to parse all links, even in unknown tags or Javascript (%P0 don't use) (--extended-parsing[=0])
%P *extended parsing, attempt to parse all links, even in unknown tags or Javascript (%P0 don't use) (--extended-parsing[=N])
n get non-html files 'near' an html file (ex: an image located outside) (--near)
t test all URLs (even forbidden ones) (--test)
%L &lt;file&gt; add all URL located in this text file (one URL per line) (--list &lt;param&gt;)
@@ -211,7 +209,7 @@ Build options:
%x do not include any password for external password protected websites (%x0 include) (--no-passwords)
%q *include query string for local files (useless, for information purpose only) (%q0 don't include) (--include-query-string)
o *save the server's error pages (404..) (o0 discard them) (--generate-errors)
X *purge old files after update (X0 keep delete) (--purge-old[=0])
X *purge old files after update (X0 keep delete) (--purge-old[=N])
Spider options:
bN accept cookies in cookies.txt (0=do not accept,* 1=accept) (--cookies[=N])
@@ -2671,14 +2669,9 @@ for only 2 simultaneous sesions.
</div>
<dialog id="zoom" aria-label="Enlarged image"><img src="" alt=""></dialog>
<!-- /doc-chrome:bottom -->
<!-- doc-chrome:footer -->
<footer>
<small>&copy; 1998-2026 Xavier Roche &amp; other contributors - Web Design: Leto Kauler.</small>
<a href="https://endsoftwarepatents.org/innovating-without-patents/" target="_blank" rel="noopener" title="This site is innovating without patents!"><img src="images/esp_chicklet.png" width="91" height="17" alt="End Software Patents"></a>
</footer>
<!-- /doc-chrome:footer -->
<footer>&copy; 1998-2026 Xavier Roche &amp; other contributors - Web Design: Leto Kauler.</footer>
<!-- /doc-chrome:bottom -->
</body>
</html>

View File

@@ -13,14 +13,12 @@
<body>
<!-- doc-chrome:top -->
<!-- doc-chrome:masthead -->
<a class="skip" href="#main">Skip to content</a>
<header class="masthead">
<img src="images/wordmark.svg" width="400" height="36" alt="HTTrack Website Copier">
<div class="tagline">Free software offline browser</div>
<div class="tagline">Open Source offline browser</div>
</header>
<!-- /doc-chrome:masthead -->
<div class="wrap">
@@ -418,14 +416,9 @@ See also: The <a href="faq.html#VF1">FAQ</a><br>
</div>
<dialog id="zoom" aria-label="Enlarged image"><img src="" alt=""></dialog>
<!-- /doc-chrome:bottom -->
<!-- doc-chrome:footer -->
<footer>
<small>&copy; 1998-2026 Xavier Roche &amp; other contributors - Web Design: Leto Kauler.</small>
<a href="https://endsoftwarepatents.org/innovating-without-patents/" target="_blank" rel="noopener" title="This site is innovating without patents!"><img src="images/esp_chicklet.png" width="91" height="17" alt="End Software Patents"></a>
</footer>
<!-- /doc-chrome:footer -->
<footer>&copy; 1998-2026 Xavier Roche &amp; other contributors - Web Design: Leto Kauler.</footer>
<!-- /doc-chrome:bottom -->
</body>
</html>

View File

@@ -1,93 +0,0 @@
Copyright 2020 The League Spartan Project Authors (https://github.com/theleagueof/league-spartan)
This Font Software is licensed under the SIL Open Font License, Version 1.1.
This license is copied below, and is also available with a FAQ at:
https://scripts.sil.org/OFL
-----------------------------------------------------------
SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
-----------------------------------------------------------
PREAMBLE
The goals of the Open Font License (OFL) are to stimulate worldwide
development of collaborative font projects, to support the font creation
efforts of academic and linguistic communities, and to provide a free and
open framework in which fonts may be shared and improved in partnership
with others.
The OFL allows the licensed fonts to be used, studied, modified and
redistributed freely as long as they are not sold by themselves. The
fonts, including any derivative works, can be bundled, embedded,
redistributed and/or sold with any software provided that any reserved
names are not used by derivative works. The fonts and derivatives,
however, cannot be released under any other type of license. The
requirement for fonts to remain under this license does not apply
to any document created using the fonts or their derivatives.
DEFINITIONS
"Font Software" refers to the set of files released by the Copyright
Holder(s) under this license and clearly marked as such. This may
include source files, build scripts and documentation.
"Reserved Font Name" refers to any names specified as such after the
copyright statement(s).
"Original Version" refers to the collection of Font Software components as
distributed by the Copyright Holder(s).
"Modified Version" refers to any derivative made by adding to, deleting,
or substituting -- in part or in whole -- any of the components of the
Original Version, by changing formats or by porting the Font Software to a
new environment.
"Author" refers to any designer, engineer, programmer, technical
writer or other person who contributed to the Font Software.
PERMISSION & CONDITIONS
Permission is hereby granted, free of charge, to any person obtaining
a copy of the Font Software, to use, study, copy, merge, embed, modify,
redistribute, and sell modified and unmodified copies of the Font
Software, subject to the following conditions:
1) Neither the Font Software nor any of its individual components,
in Original or Modified Versions, may be sold by itself.
2) Original or Modified Versions of the Font Software may be bundled,
redistributed and/or sold with any software, provided that each copy
contains the above copyright notice and this license. These can be
included either as stand-alone text files, human-readable headers or
in the appropriate machine-readable metadata fields within text or
binary files as long as those fields can be easily viewed by the user.
3) No Modified Version of the Font Software may use the Reserved Font
Name(s) unless explicit written permission is granted by the corresponding
Copyright Holder. This restriction only applies to the primary font name as
presented to the users.
4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
Software shall not be used to promote, endorse or advertise any
Modified Version, except to acknowledge the contribution(s) of the
Copyright Holder(s) and the Author(s) or with their explicit written
permission.
5) The Font Software, modified or unmodified, in part or in whole,
must be distributed entirely under this license, and must not be
distributed under any other license. The requirement for fonts to
remain under this license does not apply to any document created
using the Font Software.
TERMINATION
This license becomes null and void if any of the above conditions are
not met.
DISCLAIMER
THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
OTHER DEALINGS IN THE FONT SOFTWARE.

View File

@@ -13,14 +13,12 @@
</head>
<body>
<!-- doc-chrome:masthead -->
<a class="skip" href="#main">Skip to content</a>
<header class="masthead">
<img src="images/wordmark.svg" width="400" height="36" alt="HTTrack Website Copier">
<div class="tagline">Free software offline browser</div>
<div class="tagline">Open Source offline browser</div>
</header>
<!-- /doc-chrome:masthead -->
<div class="wrap">
@@ -122,13 +120,13 @@ data-for="droid">Tap <b>Next</b></span> to create a project, or open one you alr
<figure>
<img data-for="win" src="img/guide-win-start.png" alt="WinHTTrack welcome pane" width="1040" height="744">
<img data-for="web" src="img/guide-web-start.png" alt="WebHTTrack welcome page" width="1024" height="387">
<img data-for="web" src="img/guide-web-start.png" alt="WebHTTrack welcome page" width="1024" height="388">
<img data-for="droid" src="img/guide-droid-start.png" alt="HTTrack for Android welcome screen" width="600" height="1300">
<figcaption>The welcome screen.</figcaption>
</figure>
<p class="note" data-for="web">The dropdown shows the language the interface is already in.
Picking another one reloads the page in it.</p>
<p class="note" data-for="web">The language dropdown starts blank on purpose: its first entry
means "leave the interface as it is". Pick a language only if you want to change it.</p>
<p class="note" data-for="web">On macOS, <code>brew install httrack</code> installs WebHTTrack
alongside the command line tool. Open <b>HTTrack.app</b> if you have it, or run
@@ -143,7 +141,7 @@ together in the list.</p>
<figure>
<img data-for="win" src="img/guide-win-project-name.png" alt="WinHTTrack project name, category and base path" width="1040" height="744">
<img data-for="web" src="img/guide-web-project-name.png" alt="WebHTTrack project name, category and base path" width="1024" height="345">
<img data-for="web" src="img/guide-web-project-name.png" alt="WebHTTrack project name, category and base path" width="1024" height="346">
<img data-for="droid" src="img/guide-droid-project-name.png" alt="Android project name, category and base path" width="600" height="1300">
<figcaption>Project name, category, and where the files go.</figcaption>
</figure>
@@ -162,7 +160,7 @@ keep their links to each other.</p>
<figure>
<img data-for="win" src="img/guide-win-project-setup.png" alt="WinHTTrack action and web addresses" width="1040" height="744">
<img data-for="web" src="img/guide-web-project-setup.png" alt="WebHTTrack action and web addresses" width="1024" height="495">
<img data-for="web" src="img/guide-web-project-setup.png" alt="WebHTTrack action and web addresses" width="1024" height="496">
<img data-for="droid" src="img/guide-droid-project-setup.png" alt="Android web address and action" width="600" height="1300">
<figcaption>The addresses to copy, and what to do with them.</figcaption>
</figure>
@@ -217,7 +215,7 @@ port, you point your browser at it as a proxy and click the link or the submit b
usual, and the address the browser asks for is added to the project.</p>
<figure data-for="web">
<img data-for="web" src="img/guide-web-add-url.png" alt="WebHTTrack add-a-URL dialog" width="1024" height="600">
<img data-for="web" src="img/guide-web-add-url.png" alt="WebHTTrack add-a-URL dialog" width="1024" height="634">
<figcaption>Adding a single address, with an optional login.</figcaption>
</figure>
@@ -246,7 +244,7 @@ mirror straight away.</p>
<figure data-for="win web">
<img data-for="win" src="img/guide-win-ready.png" alt="WinHTTrack connection settings before starting" width="1040" height="744">
<img data-for="web" src="img/guide-web-ready.png" alt="WebHTTrack ready to start" width="1024" height="489">
<img data-for="web" src="img/guide-web-ready.png" alt="WebHTTrack ready to start" width="1024" height="508">
<figcaption>The last screen before the mirror runs.</figcaption>
</figure>
@@ -279,7 +277,7 @@ mirrored pages are rewritten to point at each other, so it browses offline in an
<figure>
<img data-for="win" src="img/guide-win-finished.png" alt="WinHTTrack mirror complete" width="1040" height="744">
<img data-for="web" src="img/guide-web-finished.png" alt="WebHTTrack mirror complete" width="1024" height="486">
<img data-for="web" src="img/guide-web-finished.png" alt="WebHTTrack mirror complete" width="1024" height="487">
<img data-for="droid" src="img/guide-droid-finished.png" alt="Android mirror complete" width="600" height="1300">
<figcaption>Done.</figcaption>
</figure>
@@ -443,7 +441,7 @@ bottom are the ones that keep you welcome.</p>
<figure>
<img data-for="win" src="img/guide-win-opt-flow-control.png" alt="WinHTTrack Flow Control tab" width="524" height="448">
<img data-for="web" src="img/guide-web-opt-flow-control.png" alt="WebHTTrack Flow Control tab" width="1024" height="862">
<img data-for="web" src="img/guide-web-opt-flow-control.png" alt="WebHTTrack Flow Control tab" width="1024" height="910">
<img data-for="droid" src="img/guide-droid-opt-flow-control.png" alt="Android Flow Control tab" width="600" height="1300">
</figure>
@@ -486,7 +484,7 @@ bottom are the ones that keep you welcome.</p>
<figure>
<img data-for="win" src="img/guide-win-opt-links.png" alt="WinHTTrack Links tab" width="524" height="448">
<img data-for="web" src="img/guide-web-opt-links.png" alt="WebHTTrack Links tab" width="1024" height="749">
<img data-for="web" src="img/guide-web-opt-links.png" alt="WebHTTrack Links tab" width="1024" height="781">
<img data-for="droid" src="img/guide-droid-opt-links.png" alt="Android Links tab" width="600" height="1300">
</figure>
@@ -523,7 +521,7 @@ bottom are the ones that keep you welcome.</p>
<figure>
<img data-for="win" src="img/guide-win-opt-build.png" alt="WinHTTrack Build tab" width="524" height="448">
<img data-for="web" src="img/guide-web-opt-build.png" alt="WebHTTrack Build tab" width="1024" height="976">
<img data-for="web" src="img/guide-web-opt-build.png" alt="WebHTTrack Build tab" width="1024" height="986">
<img data-for="droid" src="img/guide-droid-opt-build.png" alt="Android Build tab" width="600" height="1300">
</figure>
@@ -589,7 +587,7 @@ bottom are the ones that keep you welcome.</p>
<figure>
<img data-for="win" src="img/guide-win-opt-browser-id.png" alt="WinHTTrack Browser ID tab" width="524" height="448">
<img data-for="web" src="img/guide-web-opt-browser-id.png" alt="WebHTTrack Browser ID tab" width="1024" height="654">
<img data-for="web" src="img/guide-web-opt-browser-id.png" alt="WebHTTrack Browser ID tab" width="1024" height="706">
<img data-for="droid" src="img/guide-droid-opt-browser-id.png" alt="Android Browser ID tab" width="600" height="1300">
</figure>
@@ -629,7 +627,7 @@ bottom are the ones that keep you welcome.</p>
<figure>
<img data-for="win" src="img/guide-win-opt-spider.png" alt="WinHTTrack Spider tab" width="524" height="448">
<img data-for="web" src="img/guide-web-opt-spider.png" alt="WebHTTrack Spider tab" width="1024" height="1770">
<img data-for="web" src="img/guide-web-opt-spider.png" alt="WebHTTrack Spider tab" width="1024" height="1557">
<img data-for="droid" src="img/guide-droid-opt-spider.png" alt="Android Spider tab" width="600" height="1300">
</figure>
@@ -703,23 +701,11 @@ bottom are the ones that keep you welcome.</p>
mirror something that needs you logged in, by exporting the session from your browser.</p>
</div>
<div class="opt" data-for="win web droid">
<div class="opt" data-for="win web">
<div class="opt-head"><span class="opt-name">Strip query keys</span><span class="cli">-%g, --strip-query</span></div>
<p>Comma-separated query keys to drop when naming saved files, such as
<code>sid,utm_source</code>. Keeps one page from being saved several times under tracking
parameters that change nothing. You can scope a rule to the addresses it covers, for example
<code>shop.example.com/*=sid</code>.</p>
<p data-for="web">The box takes one rule per line. Only the last matching rule applies, so keep
the keys for one scope together on a line rather than on lines of their own.</p>
</div>
<div class="opt" data-for="win web droid">
<div class="opt-head"><span class="opt-name">Host aliases</span><span class="cli">-%C, --host-alias</span></div>
<p>Names the other hostnames one site answers to, one rule per line, written
<code>www2.example.com,m.example.com=example.com</code>. They fold onto that host: their links
travel under the same rules and each page is saved once instead of once per name. Either side may
carry a scheme, as in <code>legacy.example.com=https://example.com</code>. A trailing slash is
ignored, but a path is refused: this maps hosts, not addresses.</p>
parameters that change nothing.</p>
</div>
</section>
@@ -728,7 +714,7 @@ bottom are the ones that keep you welcome.</p>
<figure>
<img data-for="win" src="img/guide-win-opt-proxy.png" alt="WinHTTrack Proxy tab" width="524" height="448">
<img data-for="web" src="img/guide-web-opt-proxy.png" alt="WebHTTrack Proxy tab" width="1024" height="760">
<img data-for="web" src="img/guide-web-opt-proxy.png" alt="WebHTTrack Proxy tab" width="1024" height="762">
<img data-for="droid" src="img/guide-droid-opt-proxy.png" alt="Android Proxy tab" width="600" height="1300">
</figure>
@@ -765,7 +751,7 @@ bottom are the ones that keep you welcome.</p>
<figure>
<img data-for="win" src="img/guide-win-opt-log-index-cache.png" alt="WinHTTrack Log, Index, Cache tab" width="524" height="448">
<img data-for="web" src="img/guide-web-opt-log-index-cache.png" alt="WebHTTrack Log, Index, Cache tab" width="1024" height="1266">
<img data-for="web" src="img/guide-web-opt-log-index-cache.png" alt="WebHTTrack Log, Index, Cache tab" width="1024" height="1278">
<img data-for="droid" src="img/guide-droid-opt-log-index-cache.png" alt="Android Log, Index, Cache tab" width="600" height="1300">
</figure>
@@ -864,7 +850,7 @@ bottom are the ones that keep you welcome.</p>
<figure>
<img data-for="win" src="img/guide-win-opt-experts-only.png" alt="WinHTTrack Experts Only tab" width="524" height="448">
<img data-for="web" src="img/guide-web-opt-experts-only.png" alt="WebHTTrack Experts Only tab" width="1024" height="1085">
<img data-for="web" src="img/guide-web-opt-experts-only.png" alt="WebHTTrack Experts Only tab" width="1024" height="1088">
<img data-for="droid" src="img/guide-droid-opt-experts-only.png" alt="Android Experts Only tab" width="600" height="1300">
</figure>
@@ -927,12 +913,7 @@ are how you widen a crawl deliberately.</p>
<dialog id="zoom" aria-label="Enlarged screenshot"><img src="" alt=""></dialog>
<!-- doc-chrome:footer -->
<footer>
<small>&copy; 1998-2026 Xavier Roche &amp; other contributors - Web Design: Leto Kauler.</small>
<a href="https://endsoftwarepatents.org/innovating-without-patents/" target="_blank" rel="noopener" title="This site is innovating without patents!"><img src="images/esp_chicklet.png" width="91" height="17" alt="End Software Patents"></a>
</footer>
<!-- /doc-chrome:footer -->
<footer>&copy; 1998-2026 Xavier Roche &amp; other contributors - Web Design: Leto Kauler.</footer>
</body>
</html>

View File

@@ -76,7 +76,7 @@ offline browser : copy websites to a local directory</p>
[ <b>-w, --mirror</b> ] [ <b>-W, --mirror-wizard</b> ] [
<b>-g, --get-files</b> ] [ <b>-i, --continue</b> ] [ <b>-Y,
--mirrorlinks</b> ] [ <b>-P, --proxy</b> ] [ <b>-%f,
--httpproxy-ftp[=0]</b> ] [ <b>-%b, --bind</b> ] [ <b>-rN,
--httpproxy-ftp[=N]</b> ] [ <b>-%b, --bind</b> ] [ <b>-rN,
--depth[=N]</b> ] [ <b>-%eN, --ext-depth[=N]</b> ] [ <b>-mN,
--max-files[=N]</b> ] [ <b>-MN, --max-size[=N]</b> ] [
<b>-EN, --max-time[=N]</b> ] [ <b>-AN, --max-rate[=N]</b> ]
@@ -85,50 +85,48 @@ offline browser : copy websites to a local directory</p>
--sockets[=N]</b> ] [ <b>-TN, --timeout[=N]</b> ] [ <b>-RN,
--retries[=N]</b> ] [ <b>-JN, --min-rate[=N]</b> ] [ <b>-HN,
--host-control[=N]</b> ] [ <b>-%P,
--extended-parsing[=0]</b> ] [ <b>-n, --near</b> ] [ <b>-t,
--extended-parsing[=N]</b> ] [ <b>-n, --near</b> ] [ <b>-t,
--test</b> ] [ <b>-%L, --list</b> ] [ <b>-%S, --urllist</b>
] [ <b>-%m, --sitemap</b> ] [ <b>-NN, --structure[=N]</b> ]
[ <b>-%N, --delayed-type-check[=N]</b> ] [ <b>-%D,
--cached-delayed-type-check[=0]</b> ] [ <b>-%M,
--mime-html[=0]</b> ] [ <b>-%Z, --single-file[=0]</b> ] [
<b>-LN, --long-names[=N]</b> ] [ <b>-KN,
--keep-links[=N]</b> ] [ <b>-x, --replace-external</b> ] [
<b>-%x, --disable-passwords[=0]</b> ] [ <b>-%q,
--include-query-string[=0]</b> ] [ <b>-%g, --strip-query</b>
] [ <b>-%C, --host-alias</b> ] [ <b>-o,
--generate-errors[=N]</b> ] [ <b>-X, --purge-old[=0]</b> ] [
<b>-%p, --preserve</b> ] [ <b>-%T, --utf8-conversion[=0]</b>
[ <b>-%N, --delayed-type-check</b> ] [ <b>-%D,
--cached-delayed-type-check</b> ] [ <b>-%M, --mime-html</b>
] [ <b>-%Z, --single-file</b> ] [ <b>-LN,
--long-names[=N]</b> ] [ <b>-KN, --keep-links[=N]</b> ] [
<b>-x, --replace-external</b> ] [ <b>-%x,
--disable-passwords</b> ] [ <b>-%q,
--include-query-string</b> ] [ <b>-%g, --strip-query</b> ] [
<b>-o, --generate-errors</b> ] [ <b>-X, --purge-old[=N]</b>
] [ <b>-%p, --preserve</b> ] [ <b>-%T, --utf8-conversion</b>
] [ <b>-bN, --cookies[=N]</b> ] [ <b>-%K, --cookies-file</b>
] [ <b>-%Y, --why</b> ] [ <b>-u, --check-type[=N]</b> ] [
<b>-j, --parse-java[=N]</b> ] [ <b>-sN, --robots[=N]</b> ] [
<b>-%h, --http-10[=0]</b> ] [ <b>-%k, --keep-alive[=0]</b> ]
[ <b>-%z, --disable-compression[=0]</b> ] [ <b>-%B,
--tolerant[=0]</b> ] [ <b>-%s, --updatehack[=0]</b> ] [
<b>-%u, --urlhack[=0]</b> ] [ <b>-%A, --assume</b> ] [
<b>-@iN, --protocol[=N]</b> ] [ <b>-%w, --disable-module</b>
] [ <b>-F, --user-agent</b> ] [ <b>-%R, --referer</b> ] [
<b>-%E, --from</b> ] [ <b>-%F, --footer</b> ] [ <b>-%l,
--language</b> ] [ <b>-%a, --accept</b> ] [ <b>-%X,
--headers</b> ] [ <b>-C, --cache[=N]</b> ] [ <b>-k,
--store-all-in-cache</b> ] [ <b>-%r, --warc</b> ] [ <b>-%d,
--changes[=0]</b> ] [ <b>-%n, --do-not-recatch[=0]</b> ] [
<b>-%v, --display[=N]</b> ] [ <b>-Q, --do-not-log</b> ] [
<b>-q, --quiet</b> ] [ <b>-z, --extra-log</b> ] [ <b>-Z,
--debug-log</b> ] [ <b>-v, --verbose</b> ] [ <b>-f,
--file-log</b> ] [ <b>-f2, --single-log</b> ] [ <b>-I,
--index[=0]</b> ] [ <b>-%i, --build-top-index[=0]</b> ] [
<b>-%I, --search-index[=N]</b> ] [ <b>-pN,
--priority[=N]</b> ] [ <b>-S, --stay-on-same-dir</b> ] [
<b>-D, --can-go-down</b> ] [ <b>-U, --can-go-up</b> ] [
<b>-%h, --http-10</b> ] [ <b>-%k, --keep-alive</b> ] [
<b>-%z, --disable-compression</b> ] [ <b>-%B, --tolerant</b>
] [ <b>-%s, --updatehack</b> ] [ <b>-%u, --urlhack</b> ] [
<b>-%A, --assume</b> ] [ <b>-@iN, --protocol[=N]</b> ] [
<b>-%w, --disable-module</b> ] [ <b>-F, --user-agent</b> ] [
<b>-%R, --referer</b> ] [ <b>-%E, --from</b> ] [ <b>-%F,
--footer</b> ] [ <b>-%l, --language</b> ] [ <b>-%a,
--accept</b> ] [ <b>-%X, --headers</b> ] [ <b>-C,
--cache[=N]</b> ] [ <b>-k, --store-all-in-cache</b> ] [
<b>-%r, --warc</b> ] [ <b>-%d, --changes</b> ] [ <b>-%n,
--do-not-recatch</b> ] [ <b>-%v, --display</b> ] [ <b>-Q,
--do-not-log</b> ] [ <b>-q, --quiet</b> ] [ <b>-z,
--extra-log</b> ] [ <b>-Z, --debug-log</b> ] [ <b>-v,
--verbose</b> ] [ <b>-f, --file-log</b> ] [ <b>-f2,
--single-log</b> ] [ <b>-I, --index</b> ] [ <b>-%i,
--build-top-index</b> ] [ <b>-%I, --search-index</b> ] [
<b>-pN, --priority[=N]</b> ] [ <b>-S, --stay-on-same-dir</b>
] [ <b>-D, --can-go-down</b> ] [ <b>-U, --can-go-up</b> ] [
<b>-B, --can-go-up-and-down</b> ] [ <b>-a,
--stay-on-same-address</b> ] [ <b>-d,
--stay-on-same-domain</b> ] [ <b>-l, --stay-on-same-tld</b>
] [ <b>-e, --go-everywhere</b> ] [ <b>-%H,
--debug-headers</b> ] [ <b>-%!,
--disable-security-limits[=0]</b> ] [ <b>-V,
--userdef-cmd</b> ] [ <b>-%W, --callback</b> ] [ <b>-y,
--background-on-suspend[=0]</b> ] [ <b>-K,
--keep-links[=N]</b> ]</p>
--disable-security-limits</b> ] [ <b>-V, --userdef-cmd</b> ]
[ <b>-%W, --callback</b> ] [ <b>-y,
--background-on-suspend</b> ] [ <b>-K, --keep-links[=N]</b>
]</p>
<h2>DESCRIPTION
<a name="DESCRIPTION"></a>
@@ -299,7 +297,7 @@ httrack --continue</b></p>
<p>*use proxy for ftp (f0 don&rsquo;t use)
(--httpproxy-ftp[=0])</p> </td></tr>
(--httpproxy-ftp[=N])</p> </td></tr>
<tr valign="top" align="left">
<td width="9%"></td>
<td width="4%">
@@ -531,7 +529,7 @@ errors (*R1) (--retries[=N])</p></td></tr>
<p style="margin-top: 1em">*extended parsing, attempt to
parse all links, even in unknown tags or Javascript (%P0
don&rsquo;t use) (--extended-parsing[=0])</p></td></tr>
don&rsquo;t use) (--extended-parsing[=N])</p></td></tr>
<tr valign="top" align="left">
<td width="9%"></td>
<td width="4%">
@@ -637,7 +635,7 @@ structure, 1+: see below) (--structure[=N])</p></td></tr>
make any link test but wait for files download to start
instead (experimental) (%N0 don&rsquo;t use, %N1 use for
unknown extensions, * %N2 always use)
(--delayed-type-check[=N])</p> </td></tr>
(--delayed-type-check)</p> </td></tr>
<tr valign="top" align="left">
<td width="9%"></td>
<td width="4%">
@@ -650,7 +648,7 @@ unknown extensions, * %N2 always use)
<p>cached delayed type check, don&rsquo;t wait for remote
type during updates, to speedup them (%D0 wait, * %D1
don&rsquo;t wait) (--cached-delayed-type-check[=0])</p></td></tr>
don&rsquo;t wait) (--cached-delayed-type-check)</p></td></tr>
<tr valign="top" align="left">
<td width="9%"></td>
<td width="4%">
@@ -662,7 +660,7 @@ don&rsquo;t wait) (--cached-delayed-type-check[=0])</p></td></tr>
<p>generate a RFC MIME-encapsulated full-archive (.mht)
(--mime-html[=0])</p> </td></tr>
(--mime-html)</p> </td></tr>
<tr valign="top" align="left">
<td width="9%"></td>
<td width="4%">
@@ -680,7 +678,7 @@ between pages stay relative; audio and video stay links);
--single-file-max-size N caps each asset (default 10485760
bytes). %M is the better container where a Chromium-family
browser is a given: one archive, no base64 tax on text, a
shared asset stored once (--single-file[=0])</p></td></tr>
shared asset stored once (--single-file)</p></td></tr>
<tr valign="top" align="left">
<td width="9%"></td>
<td width="4%">
@@ -742,8 +740,7 @@ absolute URI links, K5 transparent proxy link)
<p>do not include any password for external password
protected websites (%x0 include)
(--disable-passwords[=0])</p> </td></tr>
protected websites (%x0 include) (--disable-passwords)</p></td></tr>
<tr valign="top" align="left">
<td width="9%"></td>
<td width="4%">
@@ -756,7 +753,7 @@ protected websites (%x0 include)
<p>*include query string for local files (useless, for
information purpose only) (%q0 don&rsquo;t include)
(--include-query-string[=0])</p> </td></tr>
(--include-query-string)</p> </td></tr>
<tr valign="top" align="left">
<td width="9%"></td>
<td width="4%">
@@ -775,26 +772,13 @@ information purpose only) (%q0 don&rsquo;t include)
<td width="4%">
<p>-%C</p></td>
<td width="5%"></td>
<td width="82%">
<p>fold other hostnames of one site onto it
([scheme://]alias[,...]=[scheme://]host) (--host-alias
&lt;param&gt;)</p> </td></tr>
<tr valign="top" align="left">
<td width="9%"></td>
<td width="4%">
<p>-o</p></td>
<td width="5%"></td>
<td width="82%">
<p>*save the server&rsquo;s error pages (404..) (o0 discard
them) (--generate-errors[=N])</p></td></tr>
them) (--generate-errors)</p></td></tr>
<tr valign="top" align="left">
<td width="9%"></td>
<td width="4%">
@@ -806,7 +790,7 @@ them) (--generate-errors[=N])</p></td></tr>
<p>*purge old files after update (X0 keep delete)
(--purge-old[=0])</p> </td></tr>
(--purge-old[=N])</p> </td></tr>
<tr valign="top" align="left">
<td width="9%"></td>
<td width="4%">
@@ -829,7 +813,7 @@ them) (--generate-errors[=N])</p></td></tr>
<td width="82%">
<p>links conversion to UTF-8 (--utf8-conversion[=0])</p></td></tr>
<p>links conversion to UTF-8 (--utf8-conversion)</p></td></tr>
</table>
<h3>Spider options:
@@ -925,7 +909,7 @@ rules)) (--robots[=N])</p></td></tr>
<p>force HTTP/1.0 requests (reduce update features, only
for old servers or proxies) (--http-10[=0])</p></td></tr>
for old servers or proxies) (--http-10)</p></td></tr>
<tr valign="top" align="left">
<td width="9%"></td>
<td width="4%">
@@ -938,7 +922,7 @@ for old servers or proxies) (--http-10[=0])</p></td></tr>
<p>use keep-alive if possible, greately reducing latency
for small files and test requests (%k0 don&rsquo;t use)
(--keep-alive[=0])</p> </td></tr>
(--keep-alive)</p> </td></tr>
<tr valign="top" align="left">
<td width="9%"></td>
<td width="4%">
@@ -950,7 +934,7 @@ for small files and test requests (%k0 don&rsquo;t use)
<p>do not request compressed content (%z0 request)
(--disable-compression[=0])</p> </td></tr>
(--disable-compression)</p> </td></tr>
<tr valign="top" align="left">
<td width="9%"></td>
<td width="4%">
@@ -962,7 +946,7 @@ for small files and test requests (%k0 don&rsquo;t use)
<p>tolerant requests (accept bogus responses on some
servers, but not standard!) (--tolerant[=0])</p></td></tr>
servers, but not standard!) (--tolerant)</p></td></tr>
<tr valign="top" align="left">
<td width="9%"></td>
<td width="4%">
@@ -975,7 +959,7 @@ servers, but not standard!) (--tolerant[=0])</p></td></tr>
<p>update hacks: various hacks to limit re-transfers when
updating (identical size, bogus response..)
(--updatehack[=0])</p> </td></tr>
(--updatehack)</p> </td></tr>
<tr valign="top" align="left">
<td width="9%"></td>
<td width="4%">
@@ -987,7 +971,7 @@ updating (identical size, bogus response..)
<p>url hacks: various hacks to limit duplicate URLs (strip
//, www.foo.com==foo.com..) (--urlhack[=0])</p></td></tr>
//, www.foo.com==foo.com..) (--urlhack)</p></td></tr>
</table>
<p style="margin-left:18%;">opt out of one url-hack part:
@@ -1202,7 +1186,7 @@ past N bytes, --warc-cdx also writes a sorted CDXJ index,
<p>write hts-changes.json listing what this crawl left new,
changed, unchanged and gone compared to the previous mirror
(--changes[=0])</p> </td></tr>
(--changes)</p> </td></tr>
<tr valign="top" align="left">
<td width="9%"></td>
<td width="4%">
@@ -1214,7 +1198,7 @@ changed, unchanged and gone compared to the previous mirror
<p>do not re-download locally erased files
(--do-not-recatch[=0])</p> </td></tr>
(--do-not-recatch)</p> </td></tr>
<tr valign="top" align="left">
<td width="9%"></td>
<td width="4%">
@@ -1226,7 +1210,7 @@ changed, unchanged and gone compared to the previous mirror
<p>display on screen filenames downloaded (in realtime) - *
%v1 short version - %v2 full animation (--display[=N])</p></td></tr>
%v1 short version - %v2 full animation (--display)</p></td></tr>
<tr valign="top" align="left">
<td width="9%"></td>
<td width="4%">
@@ -1314,7 +1298,7 @@ changed, unchanged and gone compared to the previous mirror
<td width="82%">
<p>*make an index (I0 don&rsquo;t make) (--index[=0])</p></td></tr>
<p>*make an index (I0 don&rsquo;t make) (--index)</p></td></tr>
<tr valign="top" align="left">
<td width="9%"></td>
<td width="4%">
@@ -1326,7 +1310,7 @@ changed, unchanged and gone compared to the previous mirror
<p>make a top index for a project folder (* %i0 don&rsquo;t
make) (--build-top-index[=0])</p></td></tr>
make) (--build-top-index)</p></td></tr>
<tr valign="top" align="left">
<td width="9%"></td>
<td width="4%">
@@ -1338,7 +1322,7 @@ make) (--build-top-index[=0])</p></td></tr>
<p>make an searchable index for this mirror (* %I0
don&rsquo;t make) (--search-index[=N])</p></td></tr>
don&rsquo;t make) (--search-index)</p></td></tr>
</table>
<h3>Expert options:
@@ -1643,7 +1627,7 @@ with -#test=NAME [args])</p></td></tr>
<td width="82%">
<p>wait time (--advanced-wait[=N])</p></td></tr>
<p>wait time (--advanced-wait)</p></td></tr>
<tr valign="top" align="left">
<td width="9%"></td>
<td width="8%">
@@ -1677,7 +1661,7 @@ with -#test=NAME [args])</p></td></tr>
<p style="margin-top: 1em">bypass built-in security limits
aimed to avoid bandwidth abuses (bandwidth, simultaneous
connections) (--disable-security-limits[=0])</p></td></tr>
connections) (--disable-security-limits)</p></td></tr>
</table>
<p style="margin-left:18%;">IMPORTANT NOTE: DANGEROUS
@@ -1727,7 +1711,7 @@ myfoo.so[,myparameters]) (--callback &lt;param&gt;)</p></td></tr>
<p>go to background when suspended (y0 don&rsquo;t)
(--background-on-suspend[=0])</p> </td></tr>
(--background-on-suspend)</p> </td></tr>
</table>
<h3>Details: Option N

Binary file not shown.

Before

Width:  |  Height:  |  Size: 842 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 34 KiB

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 50 KiB

After

Width:  |  Height:  |  Size: 41 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 51 KiB

After

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 108 KiB

After

Width:  |  Height:  |  Size: 74 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 103 KiB

After

Width:  |  Height:  |  Size: 65 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 43 KiB

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 40 KiB

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 44 KiB

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 51 KiB

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 54 KiB

After

Width:  |  Height:  |  Size: 37 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 31 KiB

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 42 KiB

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 66 KiB

After

Width:  |  Height:  |  Size: 43 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 31 KiB

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 52 KiB

After

Width:  |  Height:  |  Size: 41 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 36 KiB

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 32 KiB

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 25 KiB

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 37 KiB

After

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 47 KiB

After

Width:  |  Height:  |  Size: 44 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 43 KiB

After

Width:  |  Height:  |  Size: 35 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 64 KiB

After

Width:  |  Height:  |  Size: 58 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 82 KiB

After

Width:  |  Height:  |  Size: 73 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 93 KiB

After

Width:  |  Height:  |  Size: 76 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 72 KiB

After

Width:  |  Height:  |  Size: 64 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 82 KiB

After

Width:  |  Height:  |  Size: 74 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 68 KiB

After

Width:  |  Height:  |  Size: 60 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 97 KiB

After

Width:  |  Height:  |  Size: 83 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 61 KiB

After

Width:  |  Height:  |  Size: 56 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 56 KiB

After

Width:  |  Height:  |  Size: 49 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 98 KiB

After

Width:  |  Height:  |  Size: 85 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 114 KiB

After

Width:  |  Height:  |  Size: 95 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 44 KiB

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 28 KiB

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 36 KiB

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 34 KiB

After

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 33 KiB

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 18 KiB

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.9 KiB

After

Width:  |  Height:  |  Size: 5.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.5 KiB

After

Width:  |  Height:  |  Size: 7.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.4 KiB

After

Width:  |  Height:  |  Size: 7.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.0 KiB

After

Width:  |  Height:  |  Size: 8.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.0 KiB

After

Width:  |  Height:  |  Size: 6.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.7 KiB

After

Width:  |  Height:  |  Size: 7.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.0 KiB

After

Width:  |  Height:  |  Size: 7.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.8 KiB

After

Width:  |  Height:  |  Size: 8.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.5 KiB

After

Width:  |  Height:  |  Size: 5.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.3 KiB

After

Width:  |  Height:  |  Size: 5.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.5 KiB

After

Width:  |  Height:  |  Size: 9.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.0 KiB

After

Width:  |  Height:  |  Size: 8.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 20 KiB

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 16 KiB

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 18 KiB

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 19 KiB

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

After

Width:  |  Height:  |  Size: 10 KiB

View File

@@ -10,14 +10,12 @@
</head>
<body>
<!-- doc-chrome:masthead -->
<a class="skip" href="#main">Skip to content</a>
<header class="masthead">
<img src="images/wordmark.svg" width="400" height="36" alt="HTTrack Website Copier">
<div class="tagline">Free software offline browser</div>
<div class="tagline">Open Source offline browser</div>
</header>
<!-- /doc-chrome:masthead -->
<div class="wrap solo">
<main id="main">
@@ -110,12 +108,7 @@ not own.</p>
</main>
</div>
<!-- doc-chrome:footer -->
<footer>
<small>&copy; 1998-2026 Xavier Roche &amp; other contributors - Web Design: Leto Kauler.</small>
<a href="https://endsoftwarepatents.org/innovating-without-patents/" target="_blank" rel="noopener" title="This site is innovating without patents!"><img src="images/esp_chicklet.png" width="91" height="17" alt="End Software Patents"></a>
</footer>
<!-- /doc-chrome:footer -->
<footer>&copy; 1998-2026 Xavier Roche &amp; other contributors - Web Design: Leto Kauler.</footer>
</body>
</html>

View File

@@ -13,14 +13,12 @@
<body>
<!-- doc-chrome:top -->
<!-- doc-chrome:masthead -->
<a class="skip" href="#main">Skip to content</a>
<header class="masthead">
<img src="images/wordmark.svg" width="400" height="36" alt="HTTrack Website Copier">
<div class="tagline">Free software offline browser</div>
<div class="tagline">Open Source offline browser</div>
</header>
<!-- /doc-chrome:masthead -->
<div class="wrap">
@@ -75,14 +73,9 @@ You may also want to check the <tt>httrack.c</tt> and <tt>httrack.h<tt> files to
</div>
<dialog id="zoom" aria-label="Enlarged image"><img src="" alt=""></dialog>
<!-- /doc-chrome:bottom -->
<!-- doc-chrome:footer -->
<footer>
<small>&copy; 1998-2026 Xavier Roche &amp; other contributors - Web Design: Leto Kauler.</small>
<a href="https://endsoftwarepatents.org/innovating-without-patents/" target="_blank" rel="noopener" title="This site is innovating without patents!"><img src="images/esp_chicklet.png" width="91" height="17" alt="End Software Patents"></a>
</footer>
<!-- /doc-chrome:footer -->
<footer>&copy; 1998-2026 Xavier Roche &amp; other contributors - Web Design: Leto Kauler.</footer>
<!-- /doc-chrome:bottom -->
</body>
</html>

View File

@@ -13,14 +13,12 @@
<body>
<!-- doc-chrome:top -->
<!-- doc-chrome:masthead -->
<a class="skip" href="#main">Skip to content</a>
<header class="masthead">
<img src="images/wordmark.svg" width="400" height="36" alt="HTTrack Website Copier">
<div class="tagline">Free software offline browser</div>
<div class="tagline">Open Source offline browser</div>
</header>
<!-- /doc-chrome:masthead -->
<div class="wrap">
@@ -281,14 +279,9 @@ httrack --wrapper mylibrary,myparameter-string http://www.example.com
</div>
<dialog id="zoom" aria-label="Enlarged image"><img src="" alt=""></dialog>
<!-- /doc-chrome:bottom -->
<!-- doc-chrome:footer -->
<footer>
<small>&copy; 1998-2026 Xavier Roche &amp; other contributors - Web Design: Leto Kauler.</small>
<a href="https://endsoftwarepatents.org/innovating-without-patents/" target="_blank" rel="noopener" title="This site is innovating without patents!"><img src="images/esp_chicklet.png" width="91" height="17" alt="End Software Patents"></a>
</footer>
<!-- /doc-chrome:footer -->
<footer>&copy; 1998-2026 Xavier Roche &amp; other contributors - Web Design: Leto Kauler.</footer>
<!-- /doc-chrome:bottom -->
</body>
</html>

View File

@@ -13,14 +13,12 @@
<body>
<!-- doc-chrome:top -->
<!-- doc-chrome:masthead -->
<a class="skip" href="#main">Skip to content</a>
<header class="masthead">
<img src="images/wordmark.svg" width="400" height="36" alt="HTTrack Website Copier">
<div class="tagline">Free software offline browser</div>
<div class="tagline">Open Source offline browser</div>
</header>
<!-- /doc-chrome:masthead -->
<div class="wrap">
@@ -157,14 +155,9 @@ Below additional function names that can be defined inside the optional libhttra
</div>
<dialog id="zoom" aria-label="Enlarged image"><img src="" alt=""></dialog>
<!-- /doc-chrome:bottom -->
<!-- doc-chrome:footer -->
<footer>
<small>&copy; 1998-2026 Xavier Roche &amp; other contributors - Web Design: Leto Kauler.</small>
<a href="https://endsoftwarepatents.org/innovating-without-patents/" target="_blank" rel="noopener" title="This site is innovating without patents!"><img src="images/esp_chicklet.png" width="91" height="17" alt="End Software Patents"></a>
</footer>
<!-- /doc-chrome:footer -->
<footer>&copy; 1998-2026 Xavier Roche &amp; other contributors - Web Design: Leto Kauler.</footer>
<!-- /doc-chrome:bottom -->
</body>
</html>

View File

@@ -13,14 +13,12 @@
<body>
<!-- doc-chrome:top -->
<!-- doc-chrome:masthead -->
<a class="skip" href="#main">Skip to content</a>
<header class="masthead">
<img src="images/wordmark.svg" width="400" height="36" alt="HTTrack Website Copier">
<div class="tagline">Free software offline browser</div>
<div class="tagline">Open Source offline browser</div>
</header>
<!-- /doc-chrome:masthead -->
<div class="wrap">
@@ -200,14 +198,9 @@ Script example:
</div>
<dialog id="zoom" aria-label="Enlarged image"><img src="" alt=""></dialog>
<!-- /doc-chrome:bottom -->
<!-- doc-chrome:footer -->
<footer>
<small>&copy; 1998-2026 Xavier Roche &amp; other contributors - Web Design: Leto Kauler.</small>
<a href="https://endsoftwarepatents.org/innovating-without-patents/" target="_blank" rel="noopener" title="This site is innovating without patents!"><img src="images/esp_chicklet.png" width="91" height="17" alt="End Software Patents"></a>
</footer>
<!-- /doc-chrome:footer -->
<footer>&copy; 1998-2026 Xavier Roche &amp; other contributors - Web Design: Leto Kauler.</footer>
<!-- /doc-chrome:bottom -->
</body>
</html>

View File

@@ -92,7 +92,7 @@ ${LANG_K3} : ${HTTRACK_WEB}
<table width="76%" border="0" align="center" valign="bottom" cellspacing="0" cellpadding="0">
<tr>
<td id="footer"><small><small>&copy; 1998-${date:year} Xavier Roche &amp; other contributors - Web Design: Leto Kauler.</small></small></td>
<td id="footer"><small><small>&copy; 1998-2026 Xavier Roche & other contributors - Web Design: Leto Kauler.</small></small></td>
</tr>
</table>

View File

@@ -159,7 +159,7 @@ ${do:end-if}
<table width="76%" border="0" align="center" valign="bottom" cellspacing="0" cellpadding="0">
<tr>
<td id="footer"><small><small>&copy; 1998-${date:year} Xavier Roche &amp; other contributors - Web Design: Leto Kauler.</small></small></td>
<td id="footer"><small><small>&copy; 1998-2026 Xavier Roche & other contributors - Web Design: Leto Kauler.</small></small></td>
</tr>
</table>

View File

@@ -44,54 +44,12 @@
<screenshots>
<screenshot type="default">
<caption>Choosing the addresses and options for a new mirror</caption>
<!-- A guide asset, so every screenshot reshoot refreshes this too.
appstream-network.yml resolves the URL weekly if the name moves; it
cannot see a stale deploy, since the name survives a reshoot. -->
<image>https://www.httrack.com/html/img/guide-web-project-setup.png</image>
<image>https://www.httrack.com/html/images/screenshot_01b.jpg</image>
</screenshot>
</screenshots>
<content_rating type="oars-1.1"/>
<!-- Newest first; tests/01_engine-version-macros.test enforces it. -->
<releases>
<release version="3.49.21" date="2026-08-12">
<description>
<ul>
<li>A site that answers to several names is mirrored once, instead of once per name</li>
<li>Stopping a mirror ends the transfers under way instead of reporting them as network errors</li>
<li>A mirror that ends early no longer deletes files the update pass never reached</li>
<li>Reloading a project keeps the boxes you cleared and the values you set to zero</li>
<li>Clearing the option to build an index page now turns it off</li>
<li>A very long address, or a very large settings file, no longer stops the mirror</li>
<li>Refreshed screenshots throughout the documentation</li>
</ul>
</description>
</release>
<release version="3.49.20" date="2026-08-10">
<description>
<ul>
<li>A link pointing to another site is no longer mistaken for a page of your own and mirrored in full</li>
<li>A mirror told to quit while an FTP file is being received now stops, instead of hanging</li>
<li>Stopping an FTP download no longer closes its connection twice, which could interrupt another download</li>
<li>The welcome page's language menu shows the language in use</li>
<li>The macOS download says in its name that it is for Apple Silicon</li>
<li>Refreshed screenshots and typography throughout the documentation</li>
</ul>
</description>
</release>
<release version="3.49.19" date="2026-08-08">
<description>
<ul>
<li>Stopping a mirror now takes effect at once, instead of waiting for connections that were still being opened</li>
<li>A mirror that stops early keeps its web archive and its list of changes</li>
<li>A partly downloaded file the server refuses to resume is fetched again rather than lost</li>
<li>An FTP site that stops responding no longer blocks a download for five minutes</li>
<li>A very long web address or FTP path no longer crashes the mirror</li>
<li>Stopping a mirror while an FTP file is downloading no longer crashes</li>
<li>An FTP address carrying an over-long user name could sign in as a different account</li>
<li>Updated Turkish translation</li>
</ul>
</description>
</release>
<release version="3.49.18" date="2026-08-05">
<description>
<ul>

View File

@@ -72,7 +72,7 @@ ${html:error}
<table width="76%" border="0" align="center" valign="bottom" cellspacing="0" cellpadding="0">
<tr>
<td id="footer"><small><small>&copy; 1998-${date:year} Xavier Roche &amp; other contributors - Web Design: Leto Kauler.</small></small></td>
<td id="footer"><small><small>&copy; 1998-2026 Xavier Roche & other contributors - Web Design: Leto Kauler.</small></small></td>
</tr>
</table>

View File

@@ -61,7 +61,7 @@ function info(str) {
${do:output-mode:html-urlescaped}
href="file://${path}/"
${do:output-mode:}
target="_blank">
target="_new">
${LANG_D8}
</a>
</td></tr>
@@ -96,7 +96,7 @@ ${do:loadhash}
<table width="76%" border="0" align="center" valign="bottom" cellspacing="0" cellpadding="0">
<tr>
<td id="footer"><small><small>&copy; 1998-${date:year} Xavier Roche &amp; other contributors - Web Design: Leto Kauler.</small></small></td>
<td id="footer"><small><small>&copy; 1998-2026 Xavier Roche & other contributors - Web Design: Leto Kauler.</small></small></td>
</tr>
</table>

View File

@@ -99,12 +99,12 @@ ${do:end-if}
${LANG_G8} :
${/* an http: page cannot navigate to file:, so the mirror is reached through the server */}
<a href="/website/index.html" target="_blank">
<a href="/website/index.html" target="_new">
${html:path}/${html:projname}
</a></li>
<ul>
<li><a href="/website/index.html" target="_blank">${LANG_D8}</a></li>
<li><a href="/website/hts-log.txt" target="_blank">${LANG_D4}</a></li>
<li><a href="/website/index.html" target="_new">${LANG_D8}</a></li>
<li><a href="/website/hts-log.txt" target="_new">${LANG_D4}</a></li>
</ul>
<form method="POST" action="exit.html" name="form">
@@ -143,7 +143,7 @@ ${html:path}/${html:projname}
<table width="76%" border="0" align="center" valign="bottom" cellspacing="0" cellpadding="0">
<tr>
<td id="footer"><small><small>&copy; 1998-${date:year} Xavier Roche &amp; other contributors - Web Design: Leto Kauler.</small></small></td>
<td id="footer"><small><small>&copy; 1998-2026 Xavier Roche & other contributors - Web Design: Leto Kauler.</small></small></td>
</tr>
</table>

View File

@@ -57,7 +57,7 @@ function info(str) {
<table class="tableWidth" border="0" width="100%" cellspacing="0">
<tr><td class="tabCtrl" align="left">
<a style="background:black;color: white" href="about.html" target="_blank"
<a style="background:black;color: white" href="about.html" target="_new"
title='${html:LANG_G21}' onMouseOver="info('${js:LANG_G21}'); return true" onMouseOut="info('&nbsp;'); return true"
>
${LANG_O16}...
@@ -66,7 +66,7 @@ ${LANG_O16}...
<tr><td class="tabCtrl" align="left">
<a style="background:black;color: white"
href="http://www.httrack.com/update.php3?Product=HTTrack&Version=${attr:HTTRACK_VERSIONID}&VersionStr=${attr:HTTRACK_VERSION}&Platform=${attr:HTS_PLATFORM}&LanguageId=${attr:lang}" target="_blank"
href="http://www.httrack.com/update.php3?Product=HTTrack&Version=${attr:HTTRACK_VERSIONID}&VersionStr=${attr:HTTRACK_VERSION}&Platform=${attr:HTS_PLATFORM}&LanguageId=${attr:lang}" target="_new"
title='${html:LANG_O17}' onMouseOver="info('${js:LANG_O17}'); return true" onMouseOut="info('&nbsp;'); return true"
>
${LANG_O17}...
@@ -77,7 +77,7 @@ ${/* show help only if available */}
${do:if-file-exists:html/index.html}
<tr><td class="tabCtrl" align="left">
<a style="background:black;color: white"
href="/index.html" target="_blank"
href="/index.html" target="_new"
title='${html:LANG_TIPHELP}' onMouseOver="info('${js:LANG_TIPHELP}'); return true" onMouseOut="info('&nbsp;'); return true"
>
${LANG_P16}
@@ -103,7 +103,7 @@ ${do:end-if}
<table width="76%" border="0" align="center" valign="bottom" cellspacing="0" cellpadding="0">
<tr>
<td id="footer"><small><small>&copy; 1998-${date:year} Xavier Roche &amp; other contributors - Web Design: Leto Kauler.</small></small></td>
<td id="footer"><small><small>&copy; 1998-2026 Xavier Roche & other contributors - Web Design: Leto Kauler.</small></small></td>
</tr>
</table>

View File

@@ -105,7 +105,8 @@ ${LANG_THANKYOU}!
<tr><td align="right">
${LANG_P15}
<select name="lang" onChange="form.redirect.value='index.html'; form.submit()">
${listid:lang:#iso}
<option value=0></option>
${list:#iso}
</select>
</td></tr>
@@ -132,7 +133,7 @@ ${LANG_THANKYOU}!
<table width="76%" border="0" align="center" valign="bottom" cellspacing="0" cellpadding="0">
<tr>
<td id="footer"><small><small>&copy; 1998-${date:year} Xavier Roche &amp; other contributors - Web Design: Leto Kauler.</small></small></td>
<td id="footer"><small><small>&copy; 1998-2026 Xavier Roche & other contributors - Web Design: Leto Kauler.</small></small></td>
</tr>
</table>

View File

@@ -158,7 +158,7 @@ ${do:end-if}
<table width="76%" border="0" align="center" valign="bottom" cellspacing="0" cellpadding="0">
<tr>
<td id="footer"><small><small>&copy; 1998-${date:year} Xavier Roche &amp; other contributors - Web Design: Leto Kauler.</small></small></td>
<td id="footer"><small><small>&copy; 1998-2026 Xavier Roche & other contributors - Web Design: Leto Kauler.</small></small></td>
</tr>
</table>

View File

@@ -163,7 +163,7 @@ ${LANG_IOPT10}:
<table width="76%" border="0" align="center" valign="bottom" cellspacing="0" cellpadding="0">
<tr>
<td id="footer"><small><small>&copy; 1998-${date:year} Xavier Roche &amp; other contributors - Web Design: Leto Kauler.</small></small></td>
<td id="footer"><small><small>&copy; 1998-2026 Xavier Roche & other contributors - Web Design: Leto Kauler.</small></small></td>
</tr>
</table>

View File

@@ -250,7 +250,7 @@ ${LANG_W3}
<table width="76%" border="0" align="center" valign="bottom" cellspacing="0" cellpadding="0">
<tr>
<td id="footer"><small><small>&copy; 1998-${date:year} Xavier Roche &amp; other contributors - Web Design: Leto Kauler.</small></small></td>
<td id="footer"><small><small>&copy; 1998-2026 Xavier Roche & other contributors - Web Design: Leto Kauler.</small></small></td>
</tr>
</table>

View File

@@ -191,7 +191,7 @@ ${listid:build:LISTDEF_3}
<table width="76%" border="0" align="center" valign="bottom" cellspacing="0" cellpadding="0">
<tr>
<td id="footer"><small><small>&copy; 1998-${date:year} Xavier Roche &amp; other contributors - Web Design: Leto Kauler.</small></small></td>
<td id="footer"><small><small>&copy; 1998-2026 Xavier Roche & other contributors - Web Design: Leto Kauler.</small></small></td>
</tr>
</table>

Some files were not shown because too many files have changed in this diff Show More