66 Commits

Author SHA1 Message Date
Xavier Roche
fbd825d4dd A crawled link can inject header lines into the requests HTTrack sends (#1008)
* Percent-escape network-derived URL pieces in outgoing request headers

A crawled href carrying 
 keeps raw CR and LF in the engine's link
buffers: htsparse.c escapes control bytes before hts_unescapeEntities() decodes
the character references, so the escape runs too early to see them. The request
line survived that because it re-escapes 'fil' at emission, but four other
interpolations in http_sendhead() emitted the same data raw, letting a crawled
page add header lines of its choosing to the requests HTTrack then sends.

Escape at emission with escape_check_url(), the same escaper the request line
already uses, so a poisoned URL now goes out percent-encoded in every field
that carries it. The scratch buffer is sized like the url_adr/url_fil buffers
it mirrors, so escaping can only shrink what reaches the request buffer.

Signed-off-by: Xavier Roche <xroche@gmail.com>
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Signed-off-by: Xavier Roche <xroche@gmail.com>

* Cover the Referer host escape, and state the buffer bound accurately

The proxied leaf pages had no outbound links, so a poisoned host never became
anyone's referer and the Referer host escape went ungraded: reverting it alone
still passed. Give those pages a link so the host reaches a Referer, which also
adds a positive control on the plain proxied host.

The scratch buffer comment claimed escaping only shrinks its input, which is
backwards: percent-escaping expands up to 3x. What holds is that the result is
capped at the source buffer's own size, so the worst case emitted is unchanged.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Signed-off-by: Xavier Roche <xroche@gmail.com>

* Grade the two escapes the probe could not reach, and the bare-LF split

The checker split each captured request on CRLF only, so an injection
that used a bare LF stayed glued inside one line. It reported "none
carrying an injected header" on a wire that carried one; real servers
and proxies do terminate a header line on a bare LF. Split on LF and
strip the CR, the way a tolerant parser reads it.

The proxy leg asserted nothing about the Referer, and no leg reached
the ftp-through-proxy request line at all, so those two escapes were
graded only by the catch-all. A crawl change that stopped following
either link would have un-covered them silently, which is how the
referer host went ungraded the first time round. Give the proxied root
an ftp:// link, and assert that both requests happened and carry the
escaped authority.

The crawl status was discarded, so an assertf abort would have been
graded on whatever bytes it managed to send first. Fail on the deadline
and on death by signal, and add the missing signal trap so the probe
server cannot outlive an interrupted run.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Signed-off-by: Xavier Roche <roche@httrack.com>

* Do not name a signal for an exit status that may be a panic

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Signed-off-by: Xavier Roche <roche@httrack.com>

---------

Signed-off-by: Xavier Roche <xroche@gmail.com>
Signed-off-by: Xavier Roche <roche@httrack.com>
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-04 20:09:55 +00:00
Xavier Roche
c36a5428d7 Release notes understate the #841 cache-header overflow (#1009)
The 3.49.16 entries call it an unbounded sprintf and count it as one of "two
ProxyTrack buffer overflows", but #934 bounded that block in the engine's own
cache_add too, where the field caps sum past the 8192-byte stack buffer and the
values come off the wire. Say so, so a reader does not conclude only proxytrack
was exposed.

Signed-off-by: Xavier Roche <roche@httrack.com>
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-04 22:04:59 +02:00
Xavier Roche
2945f0a5e4 The WebHTTrack progress panel renders crawled URLs into HTML and JavaScript unescaped (#988)
* Escape crawled URLs in the WebHTTrack progress panel

refresh.html interpolated ${info.state}, ${info.name} and ${info.file} as
raw HTML and ${info.url_sav} into a single-quoted JS literal, so a link
path holding < > or ' ran as script in the panel origin. Point them at
htsserver.c's html: and js: modes, and sweep the other templates for the
same shape. Widen 185's scan to any unescaped handler or element-body
interpolation, and add 186 to probe the rendered panel during a crawl.

Closes #973

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Signed-off-by: Xavier Roche <roche@httrack.com>

* Pin the panel's name column in the escaping test

186 asserted only on the leaf of the crawled path, so info.name could go
back to raw and still pass: 185 cannot see it either, because ${unquoted:}
sits in the directive regex it skips. The link now carries metacharacters
in a directory component too, short enough to survive the engine's 40-char
elision of that column, and the poll breaks on either form so the positive
control stays honest.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Signed-off-by: Xavier Roche <roche@httrack.com>

* Make test 186 executable, like its siblings

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Signed-off-by: Xavier Roche <roche@httrack.com>

* Re-arm the output mode that ${do:end-if} clears

${do:end-if} sets outputmode to 0 rather than restoring what it replaced
(htsserver.c), so the if-not-empty block partway down step4.html's command
textarea drops the ${do:output-mode:html} armed above it, and the 17
${unquoted:} settings below render raw. Posting maxtime or url2 as
A</textarea><img src=x onerror=alert(1)>B breaks out of the textarea.
finished.html's <pre> has the same shape; those two are the only ones.

--sitemap-url moves from html: to arg: like its quoted siblings, since
cat_html_escaped() escapes neither " nor \.

Test 185 had unquoted: on its directive skip list, which is how all 17
sailed past it, and now also rejects an html: value on the command line.
Test 83 reads back the escaped forms at runtime.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Signed-off-by: Xavier Roche <roche@httrack.com>

---------

Signed-off-by: Xavier Roche <roche@httrack.com>
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-04 19:42:37 +00:00
Xavier Roche
2312d711e6 A control byte in a link makes the crawler fetch a URL the page never wrote (#1005)
* A vertical tab or form feed in a link is deleted, and the crawler fetches a URL the page never wrote

The link scan treated any byte below 32 as the end of a URL unless is_space()
accepted it, and is_space() counts VT and FF. Neither is among the CR, LF and
TAB stripped from the URL further down, so both survived into
escape_remove_control(), which deletes them: href="/a<VT>bc" resolved to /abc.
The other 28 control bytes ended the scan where they stood, so the crawler
fetched the truncated prefix instead.

A control byte the existing end-of-URL tests did not already consume now costs
the link. CR, LF and TAB keep their exemption because the parser strips them a
few lines later, and the check sits below that end-of-URL logic rather than
above it, so a VT or FF ending an unquoted attribute value still ends it.

Closes #982

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Signed-off-by: Xavier Roche <roche@httrack.com>

* Percent-encode a link's control bytes instead of truncating or deleting them

A control byte inside a link ended the URL where it stood, so
href="/s<SOH>oh.html" fetched /s. VT and FF came out worse: is_space()
counts them, so the scan carried them into the URL, and neither is among
the CR, LF and TAB stripped further down, so escape_remove_control()
deleted them and href="/a<VT>bc" resolved to /abc.

Both now percent-encode as a browser does. The encoding runs on the
extracted link, where the destination capacity is visible, because a byte
grows to three; a link whose encoded form no longer fits is dropped rather
than clipped to a URL nobody wrote.

Closes #982

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Signed-off-by: Xavier Roche <roche@httrack.com>

* Tighten the wording of the encode-site comment

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Signed-off-by: Xavier Roche <roche@httrack.com>

* Assert that a link's CR, LF and TAB are still stripped

Test 158 covered the encoding half of the fix but not the stripping half,
on a line this branch rewrote. Making the strip unconditional, so CR, LF
and TAB percent-encode like every other control byte, left the whole suite
green. The new href carries all three and only its stripped target exists
on the server, so that mutant now fails on the 404 it provokes.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Signed-off-by: Xavier Roche <roche@httrack.com>

* Strip a link's end control bytes, and bound the query's growth too

Review of the encoding change found two holes.

A control byte at either end of a link used to end the scan there, which
threw away nothing and gave the right URL; encoding it instead turned
href="page.html<SOH>" into a 404. Both ends now strip every C0 control or
space, as the WHATWG URL parser does, so only interior bytes are encoded.
The leading loop stops on the terminator the trailing loop just wrote,
since '\0' is <= ' ' and it would otherwise read on into the previous
link's leftovers and fetch those.

The path bound missed the query, which is escaped separately and appended
back by a helper that clips silently. An absolute link whose path and
query together outgrow the buffer was landing just under the URL-length
gate and being fetched truncated; it is now dropped like the path case.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Signed-off-by: Xavier Roche <roche@httrack.com>

---------

Signed-off-by: Xavier Roche <roche@httrack.com>
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-04 19:37:14 +00:00
Xavier Roche
7bff8133bb Two installed headers declare symbols the library does not export (#990)
* Two installed headers declare symbols the library does not export

htsbasenet.h declares openssl_ctx and htsnet.h declares
hts_dns_set_resolver_backend, both hidden by -fvisibility=hidden and both
installed into $(includedir)/httrack. A consumer that includes either header
and uses the name compiles, then fails to link.

Move both behind HTS_INTERNAL_BYTECODE, the guard the other internal
declarations in the installed set already use. Every in-tree caller defines
it, so the engine build is unaffected.

Test 207 installs the headers, derives the hidden set from the library's
symbol table minus its dynamic table, and links a probe for every hidden name
a consumer can reach through an installed header.

Closes #977

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Signed-off-by: Xavier Roche <roche@httrack.com>

* Test 207's floor against a vacuous run counts only header-static symbols

Every one of the 31 symbols that reaches the link probe is a static function
defined in the installed header itself (abortf_ and the rest of htssafe.h,
StringOom_ from htsstrings.h). The probe object compiles its own copy, so the
link cannot fail whatever the library exports, and "probed >= 5" holds without
the harvest ever seeing an extern declaration. Cutting the header loop down to
htssafe.h alone leaves probed at 7, and the test still passes with 13 of the 14
headers unchecked.

So plant a leak: a canary header declaring the hidden symbol the negative
control has already shown cannot link. The loop has to report it, which puts
the install, the harvest, the intersection and the link on the same path a real
leak takes. The cut-down loop now fails.

The HTTRACK_SHLIB comment also blamed the skip on static-only builds. macOS
skips as well, where libtool names the library .dylib.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Signed-off-by: Xavier Roche <roche@httrack.com>

* Trim test 207's comments to the house one-line default

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Signed-off-by: Xavier Roche <roche@httrack.com>

* Declare struct addrinfo at file scope in htsnet.h

Without it the tag in the resolver-backend prototypes is a fresh type scoped
to its own declaration wherever <netdb.h> has not already declared it.

Closes #987

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Signed-off-by: Xavier Roche <roche@httrack.com>

---------

Signed-off-by: Xavier Roche <roche@httrack.com>
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-04 19:10:38 +00:00
Xavier Roche
e5985903e3 The crash report can hang: the symbolizer forks from the signal handler (#985)
* Crash report can hang: the symbolizer forks from the signal handler

fork() runs the pthread_atfork prepare handlers before it forks, and glibc's
malloc registers one that takes every arena lock. A signal raised inside
malloc (glibc's own heap-corruption detector aborts from exactly there, and
SIGABRT is wired to sig_fatal) then leaves the handler blocked on a lock its
own thread holds, and the report is lost.

vfork() bypasses the atfork handlers, at the price of a child that may only
issue syscalls: the PATH search execvp() performs allocates, so the symbolizer
is resolved once at startup and the child execv()s an absolute path.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Signed-off-by: Xavier Roche <roche@httrack.com>

* Test 182 pins a 64-bit address width, so it fails the i386 leg

addr2line -a zero-pads the address to the target's pointer size: 8 nibbles
against a 32-bit ELF, 16 against a 64-bit one. The gate is "is addr2line
installed", not the architecture, so the {16} match fails a correct build on
the gcc -m32 leg and on Debian's 32-bit buildds. Test 80 already matches the
same line unanchored.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Signed-off-by: Xavier Roche <roche@httrack.com>

* Spawn the symbolizer with posix_spawnp() instead of fork()

posix_spawnp() reaches the same child through clone(CLONE_VM|CLONE_VFORK),
which runs no pthread_atfork handler, so the arena lock a signal raised inside
malloc already holds cannot deadlock the report away.

It also does the PATH search itself and reports an exec failure through its
return value, so the hand-rolled find_on_path(), the two statics caching its
answer and the BT_NO_SYMBOLIZER exit protocol all go. Building the file actions
in hts_backtrace_init() keeps the only allocation off the crash path, and with
the rewrite happening in the parent the addr2line to llvm-symbolizer fallback
comes back.

Signed-off-by: Xavier Roche <xroche@gmail.com>
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Signed-off-by: Xavier Roche <roche@httrack.com>

* Assert the symbolizer output lands on the report fd

The child's stdout redirect is now a file actions object built at startup, so a
wrong target sends symbolized frames to the crawler's own stdout instead. The
existing checks merge both streams and cannot see that.

Signed-off-by: Xavier Roche <xroche@gmail.com>
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Signed-off-by: Xavier Roche <roche@httrack.com>

* Take the report fd out of hts_print_backtrace()'s signature

The child's stdout redirect is prebuilt at init against stderr, so passing any
other fd quietly skipped symbolization on a runtime check. The one caller
passed stderr, and htsbacktrace.h ships with the program and not with the
installed dev headers, so there is no ABI cost to making the wrong value
impossible to write.

Test 182 also picks up test 80's ARM gate. A build with no unwind tables
prints "unwinding failed" instead of the OS notice, which 182's skip check
misses, so it would have gone red on armhf rather than skipping.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Signed-off-by: Xavier Roche <roche@httrack.com>

* Assert a symbol name in test 182, not just the frame shape

An all-"??" symbolization regression still emits the address lines.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Signed-off-by: Xavier Roche <roche@httrack.com>

---------

Signed-off-by: Xavier Roche <roche@httrack.com>
Signed-off-by: Xavier Roche <xroche@gmail.com>
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-04 18:52:04 +00:00
Xavier Roche
ed8a376278 escape_remove_control() leaves the original tail glued to the result (#981)
* escape_remove_control() leaves the original tail glued to the result

It compacted the non-control bytes downward in place but never wrote the
new terminator, so any input it actually shortened came back as the
compacted head plus whatever the old tail left behind: "/a\013bc" came
out "/abcc". The function is HTSEXT_API and declared in the installed
httrack-library.h, so the broken contract is a public one.

The parser can reach it: VT and FF pass the link scan as is_space()
members and the later strip only removes CR, LF and TAB, so a page with
href="/a<VT>bc" fetched /abcc before this.

Closes #974

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Signed-off-by: Xavier Roche <roche@httrack.com>

* escape-control self-test lets a shifted cut and a stray write through

Grading mutants against the new test found two survivors. No vector held
a space, so moving the loop's cut to `c > 32` stripped it and the suite
stayed green. Nothing reached above 0x0c either, so `c >= 13` passed too.
The added vectors pin both sides of the cut, and the second drops two
bytes instead of one.

The canary read one byte at `inlen + 1`, so a stray write two or more
past the compacted end went unseen. The buffer is already poisoned in
full, so scanning the rest of it costs nothing.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Signed-off-by: Xavier Roche <roche@httrack.com>

---------

Signed-off-by: Xavier Roche <roche@httrack.com>
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-04 18:19:30 +00:00
Xavier Roche
10fa9315b3 Release 3.49.16 (#1006)
* Release 3.49.16

Version bump across configure.ac, htsglobal.h, version.rc and the AppStream
metainfo, plus the release notes for history.txt and debian/changelog.

VERSION_INFO 3:7:0 -> 3:8:0: no installed struct or exported signature moved
this cycle, so the soname stays .so.3 and Debian needs no package rename.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Signed-off-by: Xavier Roche <roche@httrack.com>

* Correct the 3.49.16 release notes

The AppStream metainfo describes WebHTTrack and is read by Linux software
centres, so it now lists only WebHTTrack-visible changes: the macOS bullet and
the nine option-dialog strings (WinHTTrack-only, no hits outside lang/) are out,
the charset re-encoding is in. Drop the task-switcher claim, which webhttrack
cannot make: it is a script that launches a browser.

Fix two over-claims in history.txt. Only the trailer section after the
terminating chunk was rejected, not any chunked page. The cache aborted the
mirror on an over-long URL rather than merely refusing one it had accepted.

Cite #901 rather than the PR that closed it.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Signed-off-by: Xavier Roche <roche@httrack.com>

---------

Signed-off-by: Xavier Roche <roche@httrack.com>
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-04 17:22:33 +00:00
Xavier Roche
67afcef6c1 Installed headers do not compile under -std=c99 (#986)
* Installed headers do not compile under -std=c99

htssafe.h spells typeof without the underscores in three GNU-only
branches and calls POSIX strnlen from its inline bodies. __GNUC__
survives -std=c99 but neither the keyword nor the declaration does, so
htssafe.h and the three installed headers including it stop a strict-ISO
consumer.

Use __typeof__, and route the inline helpers through a private wrapper
that calls the libc strnlen wherever it is actually declared. tests/206
compiles every installed header under -std=c99 and -std=c11.

Closes #972

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Signed-off-by: Xavier Roche <roche@httrack.com>

* Test 206 asks for more POSIX than it needs

The two socket headers get -D_POSIX_C_SOURCE so getnameinfo() and
NI_NUMERICHOST resolve. At 200809L that also un-hides strnlen, so
htsnet.h and htsopt.h stopped covering the strnlen half of #972: delete
the __STRICT_ANSI__ guard from htssafe_strnlen_ and both still compile
clean. 200112L exposes the networking surface and leaves strnlen hidden,
so both catch that mutant again.

The level is probed rather than hard-coded, because only glibc is
verified here. A libc that needs 200809L still passes, and the test
reports the lost coverage.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Signed-off-by: Xavier Roche <roche@httrack.com>

* Test 206 never expands the macros it is meant to protect

Two of the three __typeof__ sites this PR fixes sit in
htsbuff_must_be_array_, which is a macro. A macro body only reaches the
compiler where it expands, and 206 compiles a bare #include of each
header, so reverting either of those two lines to plain typeof left the
test green. Only HTS_IS_CHAR_BUFFER was covered, and then only because
htsarrays.h happens to expand it.

Add a translation unit that instantiates htsbuff_array(), htsbuff_catn()
and strcpybuff(). Reverting any of the three sites now reds 206; before
this, only one of them did.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Signed-off-by: Xavier Roche <roche@httrack.com>

* Test 206 never runs the byte loop it protects

206 is -fsyntax-only throughout, so htssafe_strnlen_'s fallback was covered
for parsing and nothing else: changing its bound to `i <= maxlen` or its
result to `i - 1` left the test green. That loop is the strict-ISO
consumer's strnlen, and this header bounds copies from the wire.

Compile and run one strict-ISO TU that differentials htssafe_strnlen_
against memchr over every content/bound pair up to 8 bytes, on a poisoned
buffer so an overshot bound cannot land on a NUL and read as correct. The
gate is asserted first, or a build that fell back to libc would grade libc.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Signed-off-by: Xavier Roche <roche@httrack.com>

* Fail rather than silently drop strnlen coverage in test 206

The 200809L fallback un-hides strnlen, so it would report PASS while covering
less than it claims. No CI libc reaches it.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Signed-off-by: Xavier Roche <roche@httrack.com>

* Mark hts_record_assert_memory_failed HTS_UNUSED (#1002)

A C++ consumer of the installed headers hits -Wunused-function on this
static function: it is only called from a TypedArray macro expansion,
so a translation unit that just includes htsarrays.h leaves it unused.
g++ only runs that check on a real compile, not -fsyntax-only, which
is why 206's C loop (all -fsyntax-only) missed it; the new C++ leg
uses a real -c compile for exactly this reason. htssafe.h already
tags the same shape HTS_UNUSED.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Signed-off-by: Xavier Roche <roche@httrack.com>

---------

Signed-off-by: Xavier Roche <roche@httrack.com>
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-04 16:34:18 +00:00
Xavier Roche
8f453a4597 Fix missing letter in Slovak translation of "search" (#1004)
lang/Slovak.txt line 166 read Hľdanie where the windows-1250-encoded
Slovak word is Hľadanie, missing the "a". Pre-existing typo left over
from #963's charset-declaration move, unrelated to that PR's changes.

Closes #994

Signed-off-by: Xavier Roche <roche@httrack.com>
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-04 16:33:30 +00:00
Xavier Roche
8f0489accd Pin addr2line to the C locale in test 157 (#1000)
The frame match keys on addr2line's " at " separator, which binutils
translates: under fr_FR.UTF-8 it reads " a" and the test fails on a
report whose frames are all present.

Signed-off-by: Xavier Roche <roche@httrack.com>
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-04 16:09:39 +00:00
Xavier Roche
5ab645e370 Nothing checks that the data directory comes from the OS path, not argv[0] (#992)
* Nothing checks that the data directory comes from the OS path, not argv[0]

Reverting the startup lines to argv[0] alone left the whole suite green: the
part -#test=datadir cannot see is which path gets handed to
hts_resolve_datadir(). 215_engine-datadir-ospath runs a copy of the engine from
a fabricated bin/ under two lying argv[0]s, one naming a decoy tree that has
templates of its own and one a bare name as a PATH lookup leaves, and asserts
the templates the run resolved are the copy's.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Signed-off-by: Xavier Roche <roche@httrack.com>

* Fall back to src/httrack when the build needed no libtool wrapper

--disable-shared leaves the program in src/ with no .libs copy, and the test
then failed on a missing HTTRACK_BIN instead of running.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Signed-off-by: Xavier Roche <roche@httrack.com>

* Plant a binary at the decoy path so an existence-checked argv[0] is caught

The decoy tree had templates but no program, so an engine that prefers argv[0] only when it names an existing file reached the OS path by accident and passed all three runs. Gating that preference on access(argv[0], F_OK) reproduces it: the test as merged passes that engine, this one fails it on the decoy run.

The decoy also goes first on PATH for the bare-name run, so an engine resolving argv[0] by lookup has something wrong to find.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Signed-off-by: Xavier Roche <roche@httrack.com>

---------

Signed-off-by: Xavier Roche <roche@httrack.com>
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-04 15:45:20 +00:00
Xavier Roche
a8712be127 Make six lang/*.txt files agree with their own LANGUAGE_CHARSET (#983)
* Make six lang/*.txt files agree with their own LANGUAGE_CHARSET

Croatian, Slovak, Polski and Slovenian are stored in CP1250 and Macedonian in
CP1251, but they declared an ISO-8859 charset. html/server/*.html copies
LANGUAGE_CHARSET into its <meta> and htsserver.c decodes the POST body with it,
so every s-caron, z-caron and Cyrillic letter came out wrong in webhttrack.
Strings added since #588 followed the declaration instead of the surrounding
bytes, leaving the files mixed.

The declaration moves to the codepage the bytes are actually in, and the minority
lines are transcoded to match. Going the other way was not an option: Latin-1
cannot spell Slovenian at all, and ISO-8859-2 would lose the typographic quotes
and ellipsis Polski uses. windows-1250 and windows-1251 are already in the
engine's codepage table and already declared by Cesky, Russian, Bulgarian,
Ukrainian and Uzbek.

Svenska declared ISO-8859-2 over Latin-1 bytes, which agree on everything it uses
except a-ring; only the declaration changes there.

62_lang-integrity now decodes every file through its declared charset and rejects
both a byte the charset has no mapping for and a decode landing in the C1 range,
which is the tell of a Windows codepage wearing an ISO-8859 label. Two
deliberately mislabelled copies guard the check itself, one per branch.

Closes #963

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Signed-off-by: Xavier Roche <roche@httrack.com>

* Keep the charset guard honest on macOS

BSD sed does not read \r in an s/// replacement, so the C1 probe would have
been labelled ISO-8859-2r there and failed on the unknown charset name instead
of on the C1 branch it exists to cover. The extractor strips CR anyway, so the
escape bought nothing. Also default n to 1, since a grep that errors leaves it
empty and the comparison then reads as a pass.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Signed-off-by: Xavier Roche <roche@httrack.com>

---------

Signed-off-by: Xavier Roche <roche@httrack.com>
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-04 15:15:22 +00:00
Xavier Roche
c5cd0cc4c2 A crash report names no frame of the httrack executable (#984)
* Name the executable's own frames in a crash report

dladdr() reports the main program's path as argv[0], which is a bare name
when the binary was found on PATH. The symbolizer's access() check then
fails and it drops the whole module, so every frame of the executable stays
a raw offset. A --disable-shared build puts the entire engine there, which
is why 105_suite-timeout failed and 80_engine-crash-symbolize skipped.

Resolve /proc/self/exe once at init and match frames against the main
program's load base, so the symbolizer gets a path it can open.

Not a link-flag problem: relinking with -rdynamic exports none of these
symbols, since -fvisibility=hidden and file-scope statics make them
STB_LOCAL and --export-dynamic only promotes global ones.

Closes #889

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Signed-off-by: Xavier Roche <roche@httrack.com>

* Reject a clipped /proc/self/exe path

readlink() cannot report truncation, so an executable path of BT_PATH_SIZE
bytes or more came back as a prefix that find_main_object() kept. The prefix
fits copy_bounded(), and access() accepts it whenever it names a readable
directory, so the crash report gained a 1023-byte header pointing at that
directory and addr2line's "is a directory" complaint in place of the
executable's frames. A full buffer now reads as unresolved, which falls back
to argv[0] as before.

Checked by hand: an httrack installed 1024 bytes deep and run off PATH prints
the raw trace only, and 1023 still symbolizes.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Signed-off-by: Xavier Roche <roche@httrack.com>

* Pin test 157 to one executable block and the symbol column

A second block for the executable means library frames were misattributed to
it, and the bare symbol match could hit a path component named main.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Signed-off-by: Xavier Roche <roche@httrack.com>

---------

Signed-off-by: Xavier Roche <roche@httrack.com>
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-04 15:10:16 +00:00
Xavier Roche
c553099b6d Add a weekly networked AppStream metainfo check (#979)
* Add a weekly networked AppStream metainfo check

The per-PR lint job and tests/210 validate with --no-net so an httrack.com
outage never reds an unrelated PR, but that also hides the one failure a
software centre user would notice: a dead screenshot URL. Add a scheduled
workflow that runs appstreamcli validate without --no-net weekly, and on
demand via workflow_dispatch; it does not touch the existing --no-net gates.

Closes #971

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Signed-off-by: Xavier Roche <roche@httrack.com>

* Tighten the appstream-network comments to one line each

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Signed-off-by: Xavier Roche <roche@httrack.com>

---------

Signed-off-by: Xavier Roche <roche@httrack.com>
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-04 14:23:45 +00:00
Xavier Roche
2d582348da Ignore the 13 fuzzer binaries an in-tree --enable-fuzzers build drops in fuzz/ (#980)
fuzz/Makefile.am's noinst_PROGRAMS only builds under --enable-fuzzers, so #960
left fuzz/ alone. An anchored per-binary list keeps the tracked fuzz-*.c
sources out of the pattern, unlike a fuzz-* glob that would swallow them too.

Closes #970

Signed-off-by: Xavier Roche <roche@httrack.com>
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-04 14:19:36 +00:00
Xavier Roche
f937b4a4ec A relocated install cannot find its own shared library (#964)
* A relocated install cannot find its own shared library

httrack and htsserver now link with a loader-relative rpath,
$ORIGIN/../lib (@loader_path/../lib on macOS), beside the absolute
libdir libtool records, so a tree configured for one prefix and
unpacked somewhere else finds libhttrack instead of failing before
main.

Not every loader expands that token, so configure probes it instead of
trusting the linker: it builds a small shared library and an executable
that needs it, then runs the executable from an unrelated directory
with the library path cleared. Solaris and the older BSDs get a second
attempt with -Wl,-z,origin. Nothing is added when libdir is already on
the loader's search path, which covers every distribution package.

Closes #906

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Signed-off-by: Xavier Roche <roche@httrack.com>

* Put the configured libdir ahead of the binary-relative rpath

Emitting $ORIGIN/../lib first shadowed the configured libdir whenever
$(bindir)/../lib is a different directory, which a --libdir=$prefix/lib64
or a split-bindir layout makes routine: a stale library sitting there
won the lookup on an ordinary, non-relocated install. Naming $(libdir)
ourselves before the token puts it back in front, so the token only
answers once the configured libdir is gone.

The system-libdir gate no longer reads libtool's
sys_lib_dlsearch_path_spec, which is only augmented when /etc/ld.so.conf
exists and would let a distribution libdir through in a sysroot or a
minimal container; it pattern-matches /lib, /lib64, /usr/lib and
/usr/lib64 and their subdirectories instead. /usr/local is no longer
treated as a system libdir, so a default configure now enables the
rpath and the tests exercise it.

Cross compiling no longer enables the feature unprobed. It defaults to
off with --enable-origin-rpath as the override, and that override takes
the -Wl,-z,origin spelling Solaris and the older BSDs need, since
nothing can run to tell the two apart.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Signed-off-by: Xavier Roche <roche@httrack.com>

* Cover the rpath ordering and the cases that must not get one

195_install-relocate.test asserted only that the token was present, so
it could not see it landing ahead of the configured libdir, and it
skipped outright wherever the rpath was suppressed. It now reads the
rpath entries in order and requires the libdir to come first, requires
proxytrack to carry no token at all, and in a suppressed build asserts
the absence rather than skipping.

Proving the relocated copy started was also not enough: a libhttrack
elsewhere on the loader path would have answered. The copy's own library
is now moved away and the binary has to stop working, which replaces the
ldconfig guard (found by `command -v ldconfig`, which fails for a user
without /sbin on PATH, and matching any soname including a .so.2 that
could never satisfy .so.3) and works on macOS, where there is no ldd.
Staging through DESTDIR rather than overriding the paths keeps libtool
from rewriting the build tree while the rest of the suite runs.

196_install-rpath-gates.test configures a system prefix, a multiarch
libdir, --disable-origin-rpath and --disable-shared and asserts each
one emits no rpath, with a private prefix first so a probe that never
succeeds cannot make the rest vacuous. One shared cache keeps the five
runs to a few seconds.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Signed-off-by: Xavier Roche <roche@httrack.com>

* Suppress the rpath for the 32-bit multilib libdirs too

/lib32, /libx32 and their /usr counterparts are on the loader path, and
libtool's sys_lib_dlsearch_path_spec used to cover them, so replacing
that read with an enumerated list handed a 32-bit distribution build an
rpath it never had and lintian's binary-or-shlib-defines-rpath with it.
Still enumerated rather than globbed as /lib*, which would swallow
/libfoo, /usr/library and /usr/libexec.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Signed-off-by: Xavier Roche <roche@httrack.com>

* Configure a symlink farm, not the already-configured srcdir

196_install-rpath-gates.test configures out of $abs_top_srcdir, which
automake rejects when a config.status sits there. CI builds in-tree, so
every leg that runs the full suite failed; the out-of-tree local runs and
the msan leg (restricted TESTS) never saw it.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Signed-off-by: Xavier Roche <roche@httrack.com>

* Refresh mergeability after master moved

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Signed-off-by: Xavier Roche <roche@httrack.com>

* Turn the binary-relative rpath off on Darwin, and read Mach-O with otool

dyld consults LC_RPATH only for an @rpath/ load path, and libtool stamps
libhttrack with an absolute -install_name, so the @loader_path entry the
Darwin arm emitted was never read. The copied tree stayed just as broken.
Gate the feature off there instead of shipping a dead load command.

That left the two bugs the macOS leg was actually failing on. Test 195
picked its object dumper by whatever happened to be installed, and an ELF
reader handed a Mach-O prints no rpath rather than an error, so a present
rpath read as an absent one; it now picks by platform. Test 196's nested
configures inherit none of the parent's CPPFLAGS/LDFLAGS, so brew's
keg-only openssl turned the default --enable-https into a hard configure
error. The gate has nothing to do with TLS, so they ask for =auto.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Signed-off-by: Xavier Roche <roche@httrack.com>

---------

Signed-off-by: Xavier Roche <roche@httrack.com>
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-04 13:51:48 +00:00
Xavier Roche
e810fc79d0 A stack-overflow SIGSEGV kills httrack with no diagnostic at all (#962)
* A stack-overflow SIGSEGV kills httrack with no diagnostic at all

sig_fatal went in with plain signal(), so it ran on the faulting thread's
own stack. When the fault is stack exhaustion there is no room left for a
signal frame, the kernel falls back to the default action, and the process
dies at 139 having printed nothing. Register the four fatal signals through
sigaction() with SA_ONSTACK, over a 64 kB alternate stack allocated at
startup, and prime backtrace() at init so glibc's lazy libgcc_s dlopen()
does not happen inside the handler.

Only the main thread is covered: htsbacktrace.c is linked into the httrack
binary rather than into libhttrack, so the engine's worker threads cannot
reach the installer. They behave as before, SA_ONSTACK being ignored where
no alternate stack exists.

Closes #866

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Signed-off-by: Xavier Roche <roche@httrack.com>

* Test 180 could not tell a stack overflow from an ordinary fault

Three mutants passed it: a crash_stack() that only dereferences NULL, a
backtrace() truncated to one frame, and a backtrace that returns nothing at
all, since the frame assertion accepted "No stack trace available" as a
match. The reports now have to differ: a runaway recursion repeats the same
return address ~250 times where the segv control repeats none, and the
control asserts the threshold still separates them.

Also stop skipping on macOS and the BSDs, where sigaltstack() exists and the
fix is live; only the trace text is gated on Linux. Each assertion now names
what failed.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Signed-off-by: Xavier Roche <roche@httrack.com>

* The alt stack leaked, and took over the sanitizer's

LeakSanitizer called the 64 kB alt stack a direct leak: nothing retains the
pointer once sigaltstack() owns it. Map it instead of allocating it, which
also keeps the handler's own stack out of the heap whose corruption it may
be reporting.

The leak was the tell for the worse bug. ASan already has an alt stack
installed by the time signal_handlers() runs, 32 kB of it, and the old size
floor rejected it and installed ours over the top, moving ASan's handlers
onto our mapping. Defer to any alt stack already installed regardless of
size: whoever put it there sized it for their own handler, and ours needs
about 10 kB of the 32 that the smallest of them offers.

Test 181 pins both directions through an LD_PRELOAD observer that compares
the mapping the process ends up with against the one it was handed.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Signed-off-by: Xavier Roche <roche@httrack.com>

* Refresh mergeability after master moved

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Signed-off-by: Xavier Roche <roche@httrack.com>

---------

Signed-off-by: Xavier Roche <roche@httrack.com>
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-04 13:06:27 +00:00
Xavier Roche
c13c56d8bb Installed dev headers do not compile standalone (#958)
* Installed dev headers do not compile standalone

Three headers in DevIncludes_DATA fail on their own from $(includedir)/httrack
once HTS_INTERNAL_BYTECODE is defined: htswrap.h includes coucal.h, which is
never installed and which the file does not use; htsmodules.h uses HTSEXT_API
without htsglobal.h; htsdefines.h uses size_t without <stddef.h>.

205_install-headers.test installs the list into a temp dir and compiles a
one-line TU per header in both preprocessor states.

Closes #943

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Signed-off-by: Xavier Roche <roche@httrack.com>

* Split CC so the test runs on the linux-i386 leg

That job configures with CC="gcc -m32", and looking the whole string up as one
executable made the test exit 77. A skip reads as success, so the one leg with a
different data model was checking nothing. Same for CC="ccache gcc".

The compiler now also has to compile a bare <stdio.h> first, or a box without
gcc-multilib blames every installed header instead of reporting its own toolchain.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Signed-off-by: Xavier Roche <roche@httrack.com>

* Pass the build's CPPFLAGS to the installed-header compile

htsbasenet.h includes <openssl/ssl.h> under HTS_USEOPENSSL, so the test needs
OpenSSL's include path like any consumer does. Linux resolves it from
/usr/include, which is why only the macOS leg failed: brew's openssl@3 is
keg-only and reachable only through the CPPFLAGS given to configure.

Reproduced by hiding /usr/include/openssl behind a -nostdinc mirror and exposing
it from a private prefix, which reds htsnet.h and htsopt.h exactly as CI did.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Signed-off-by: Xavier Roche <roche@httrack.com>

---------

Signed-off-by: Xavier Roche <roche@httrack.com>
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-04 12:44:39 +00:00
Xavier Roche
73c99ac3a0 Tooltip JavaScript breaks on any translation containing an apostrophe (#967)
* Tooltip JavaScript breaks on any translation containing an apostrophe

The onMouseOver handlers interpolate through ${html:...}, which escapes
for HTML text. The browser decodes an attribute value before compiling
it as JavaScript, so &#39; arrives as a bare quote and closes the string
literal; a translation carrying a double quote ends the attribute
outright. Add a js: template mode escaping for both layers and move all
304 handler sites onto it.

Closes #864

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Signed-off-by: Xavier Roche <roche@httrack.com>

* Close the step2.html and title-attribute gaps in the js: escaping test

The static check could not match ${html:html:...}, the very shape it was
added to catch, and the runtime probe only fetched option1.html: reverting
all eight step2.html handlers left the test green. Nothing asserted that a
title= attribute stays on html: outside option1.html either.

Walk every server template instead, pairing each ${...} with the attribute
holding it, and fetch step2.html as well. Also feed the fixture a newline
and a tab, which had no coverage.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Signed-off-by: Xavier Roche <roche@httrack.com>

* Emit the backslash as \x5c so a DBCS trail byte cannot swallow it

shift-jis, BIG5 and gb2312 all accept 0x5c as a trail byte, and those are
the declared charsets of three shipped lang files, so the browser really
does run a DBCS decoder over the page. An orphan lead byte followed by the
emitted \\ pair decodes as one glyph plus a stray backslash, which escapes
whatever comes next. Emitting every escape as a \xNN group leaves the
decoder nothing to pair with: the only bytes cat_js_escaped adds are '\',
'x' and hex digits.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Signed-off-by: Xavier Roche <roche@httrack.com>

---------

Signed-off-by: Xavier Roche <roche@httrack.com>
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-04 12:25:36 +00:00
Xavier Roche
5bd0bba4e0 Nine lang.def strings are untranslated in 26 of the 30 language files (#961)
* Nine lang.def strings are untranslated in 26 of the 30 language files

LANG_F15b, LANG_I6c, LANG_I23c/d/e, LANG_I35c and LANG_I43c/d/e were
translated only in English, Francais, Dansk and Portugues-Brasil, so the
Windows GUI's option dialogs fell back to English everywhere else. Fill
them in for the other 26 files, each encoded in that file's declared
LANGUAGE_CHARSET and inserted where English.txt orders it.

Svenska.txt declares ISO-8859-2 but holds Latin-1, and Chinese-BIG5.txt
needs cp950 rather than strict big5. Romanian.txt and Slovenian.txt
declare ISO-8859-1, which cannot spell either language, so both stay
unaccented ASCII the way #862 left them.

Test 62 waived these nine msgids by name and fails once a waiver is no
longer needed, so drop them from that list: it reports 231 untranslated
msgids against master.

Closes #863

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Signed-off-by: Xavier Roche <roche@httrack.com>

* Romanian: restore the two circumflexes ISO-8859-1 can spell

Only the-breve, s-comma and t-comma are unrepresentable in the declared
charset; a- and i-circumflex are 0xE2 and 0xEE, and the rest of the file
already spells them that way.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Signed-off-by: Xavier Roche <roche@httrack.com>

---------

Signed-off-by: Xavier Roche <roche@httrack.com>
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-04 13:31:12 +02:00
dependabot[bot]
fa490d96da Bump github/codeql-action from 4 to 4.37.4 (#976)
Bumps [github/codeql-action](https://github.com/github/codeql-action) from 4 to 4.37.4.
- [Release notes](https://github.com/github/codeql-action/releases)
- [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md)
- [Commits](https://github.com/github/codeql-action/compare/v4...v4.37.4)

---
updated-dependencies:
- dependency-name: github/codeql-action
  dependency-version: 4.37.4
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-08-04 13:26:16 +02:00
dependabot[bot]
17128490f9 Bump github.com/microsoft/vcpkg from 2026.06.24 to 2026.07.29 in /src (#975)
Bumps [github.com/microsoft/vcpkg](https://github.com/microsoft/vcpkg) from 2026.06.24 to 2026.07.29.
- [Release notes](https://github.com/microsoft/vcpkg/releases)
- [Commits](https://github.com/microsoft/vcpkg/compare/master...9e593bb18ea69cc5095e012465dcd675a822ed0d)

---
updated-dependencies:
- dependency-name: github.com/microsoft/vcpkg
  dependency-version: 2026.07.29
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-08-04 13:26:08 +02:00
Xavier Roche
cf830dd5d3 Icon=httrack never resolves through the share/pixmaps fallback (#966)
* Icon=httrack never resolves through the share/pixmaps fallback

share/pixmaps only ever held the sized names, so the bare-basename lookup a
desktop falls back on when no icon theme is installed never matched. Install
httrack.xpm (a 32x32 copy) alongside them rather than renaming one: Debian
globs the whole directory and a rename would strand the old names on upgrade.

Closes #932

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Signed-off-by: Xavier Roche <roche@httrack.com>

* Pin the pixmaps fallback to the icon, not to any 32x32 image

The geometry check passed on a solid-red square, so compare the installed
fallback against the installed 32x32 copy, declaration line aside. Also drop
the banned pipe into grep -q while here.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Signed-off-by: Xavier Roche <roche@httrack.com>

---------

Signed-off-by: Xavier Roche <roche@httrack.com>
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-04 09:37:28 +00:00
Xavier Roche
1e3d51276f The suite watchdog may kill its own taskkill, and an empty category reads as a failing test (#965)
* The suite watchdog may kill its own taskkill, and an empty category reads as a failing test

ci_suite_heartbeat runs in a subshell of the process it targets, and kill_tree
on Windows is taskkill /F /T /PID, so taskkill is a grandchild of its own
target. A leaves-first /T would reap the watchdog before reaching the root: the
annotation is printed, nothing dies, and the step runs on to the 45-minute
cancel with no log. Signal the target directly first, then through the tree, so
the kill no longer depends on taskkill outliving its own ancestors.

The driver's category globs also expanded to themselves when they matched
nothing, handing test-timeout.sh a literal pattern that exits 127 and lands in
the tally as a failing test named after the glob. Categories now carry a label
and expand under nullglob; an empty one names itself and stops the suite before
any test runs.

Closes #952
Closes #953

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Signed-off-by: Xavier Roche <roche@httrack.com>

* Make the empty-category gate cover the one category that names a single test

runnable:00_runnable.test carries no metacharacter, so nullglob cannot empty it
and the gate never fired for it: the name reached test-timeout.sh unexpanded and
was counted as a test failing 127, exactly what the gate exists to prevent. Give
it a pattern like every other category, and empty it in the driver test.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Signed-off-by: Xavier Roche <roche@httrack.com>

---------

Signed-off-by: Xavier Roche <roche@httrack.com>
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-04 08:23:22 +00:00
Xavier Roche
f1c3e1f5ef Ignore the files an in-tree build drops in the checkout (#960)
tools/Info.plist is the one that matters: configure generates it from
Info.plist.in, so a stray "git add -A" would commit a snapshot that
shadows it and pins CFBundleShortVersionString to whatever version built
it (#884, one directory over).

Closes #905

Signed-off-by: Xavier Roche <roche@httrack.com>
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-04 08:03:42 +00:00
Xavier Roche
57b22af27a Validate the AppStream metainfo in CI and under make check (#959)
#897 pinned the metainfo version against htsglobal.h, but nothing checked
the file was valid AppStream: a broken one passes the suite and a software
centre then drops WebHTTrack without saying so.

The lint job gains an appstreamcli step beside the .vcxproj well-formedness
pass, and 210_appstream-metainfo.test runs the same check under make check,
skipping when appstreamcli is absent. --no-net keeps the gate off the
screenshot host's reachability; errors and warnings fail, hints do not.

The test validates a copy with <id> stripped as a positive control, so a
validator that never fails cannot make it vacuous.

Signed-off-by: Xavier Roche <roche@httrack.com>
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-04 07:55:00 +00:00
Xavier Roche
3db75afde4 Cancel superseded windows-build runs (#957)
windows-build.yml was the only workflow without a concurrency group, so
every push left the runs before it going. Match ci.yml and codeql.yml.

Closes #942

Signed-off-by: Xavier Roche <roche@httrack.com>
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-04 09:33:15 +02:00
Xavier Roche
103874dcd8 The macOS bundle declares a minimum OS that nothing checks (#956)
* Derive the bundle's minimum macOS from its payload

tools/Info.plist.in hardcoded LSMinimumSystemVersion 11.0, but nothing
built the payload for 11.0: with no MACOSX_DEPLOYMENT_TARGET set, clang
on the macos-15 runner targets the host, and all nine Mach-Os in the
released DMG report minos 15.0. Finder believes the plist and launches
on macOS 11 through 14, then dyld refuses the binaries.

macos-app.sh now takes the highest minos in the assembled bundle and
writes it to LSMinimumSystemVersion before the ad-hoc signature seals
Info.plist, so the two cannot drift again. The floor has to be the
maximum rather than the main executable's: five of those nine are
Homebrew bottles whose minos was fixed when the bottle was built, so a
deployment target on our own compile would not move them.

Signed-off-by: Xavier Roche <xroche@gmail.com>
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Signed-off-by: Xavier Roche <roche@httrack.com>

* Assert the declared minimum macOS instead of rewriting it

Review pushed back on deriving LSMinimumSystemVersion from the payload:
it makes the shipped minimum follow whatever runner image built the
bundle, so bumping a CI label would move HTTrack's advertised floor with
nobody deciding it. Declare 15.0, which is what the binaries need today,
and fail the build when the payload disagrees.

macho_floor also swallowed an otool failure: the call sat non-final in a
pipeline, so a Mach-O otool could not map contributed nothing and the
floor came from the rest, which is the same wrong-floor bug this fixes.
deps() already guards its otool the same way.

Dropping the plist rewrite drops plist_set with it, and with it the
awk-on-XML edge cases and the read-back check that was only meaningful
while the derived value differed from the template's.

Signed-off-by: Xavier Roche <xroche@gmail.com>
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Signed-off-by: Xavier Roche <roche@httrack.com>

* Trim the comments the review flagged

Signed-off-by: Xavier Roche <xroche@gmail.com>
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Signed-off-by: Xavier Roche <roche@httrack.com>

---------

Signed-off-by: Xavier Roche <xroche@gmail.com>
Signed-off-by: Xavier Roche <roche@httrack.com>
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-04 07:13:10 +00:00
Xavier Roche
f546fc4ddf CI watchdog deadlines stretch under the starvation they exist to catch (#955)
* The CI watchdog deadlines stretch under the starvation they exist to catch

Every deadline in the test harness counts poll iterations and assumes each
costs exactly the tick it asked for. Under the CPU and fork starvation that
wedges a runner, an iteration costs several times that, so the budget arrives
late in wall-clock terms or never: the 45-minute step timeout cancels first,
and a cancelled step keeps neither its log nor its artifacts. That is why the
wedged Windows jobs in #795 name no test.

Measure $SECONDS instead, in test-timeout.sh and in run_with_timeout,
wait_bounded and reap_bounded, which restores the wall-clock contract
run_with_timeout's comment already described.

The guards are checked against a reverted copy via a slow-sleep shim: with
each poll stretched fourfold, the counting code takes 44s to honour a 1s
budget and 16s a 3s one.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Signed-off-by: Xavier Roche <roche@httrack.com>

* Compare the deadlines strictly, and make the guards kill their mutants

$SECONDS is floored, so a reading equal to the budget can be a fraction
under it: -ge fired up to a second early, which kills healthy work. Compare
strictly instead, at the cost of at most a second late.

The 58_watchdog guard also passed on a watchdog that killed everything on
sight, because one stretched reap poll lifted the elapsed time over its lower
bound, and its control raced (the child exited before the first poll). Give
the control a command that outlives several polls, and widen the timing bound
to sit a full poll quantum either side of 8s healthy and 16s counted.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Signed-off-by: Xavier Roche <roche@httrack.com>

---------

Signed-off-by: Xavier Roche <roche@httrack.com>
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-04 00:28:46 +02:00
Xavier Roche
420cfdfd1d Gatekeeper blocks the macOS bundle: nothing signs or notarizes it (#954)
tools/macos-release.sh signs every Mach-O with the hardened runtime, notarizes and staples the app, packs a DMG and notarizes that too. A new macos-release workflow runs it on a tag or on demand, with a Developer ID imported into a throwaway keychain from repo secrets. Signing is per-Mach-O rather than --deep, which reaches nested code but never applies the runtime, and notarytool's status line is read rather than its exit code.

The bundle stub is now a Mach-O (tools/httrack-launcher.c) rather than a shell script, which Apple treats as a resource and TCC cannot attribute a prompt to. The Mach-O walk and the Info.plist reader are shared with macos-app.sh via tools/macos-bundle.sh, and ci.yml's macos-app job runs the same script ad-hoc on every PR.

Closes #901
2026-08-03 21:35:10 +00:00
Xavier Roche
895049bfe1 The Windows suite driver is 140 lines of shell inlined in YAML (#951)
* The Windows suite driver is 140 lines of shell inlined in YAML

Move the "Run the engine test suite" step body to tests/ci-windows-suite.sh,
where shellcheck and shfmt reach it and it can be run by hand. The two
deliberate word-splits in the skip-set compare needed a directive; nothing
else changed, verified by diffing the shfmt-normalized old body against the
new file.

ci_annotate and ci_suite_heartbeat move with it, out of the test library
every test sources on every platform. 171_watchdog-heartbeat.test sources
the driver, which returns early unless run directly.

Closes #948

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Signed-off-by: Xavier Roche <roche@httrack.com>

* Test the driver on this platform, and ask the shell whether it was sourced

The guard read "${BASH_SOURCE[0]}" = "$0", which is only false by accident of
what the caller put in $0: bash -c '. "$0"' <driver> makes the two equal and
falls through into the suite. Ask the shell instead.

172_ci-windows-driver.test pins that case, the bindir contract and the loop's
accounting against a stub bindir, none of which a Windows-only leg proves
before merge.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Signed-off-by: Xavier Roche <roche@httrack.com>

* Silence two shellcheck findings in the new driver test

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Signed-off-by: Xavier Roche <roche@httrack.com>

* Make the driver test survive distcheck's read-only srcdir

cp carries the source's mode over, so under distcheck the neutered testlib
copy came out read-only and the append failed.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Signed-off-by: Xavier Roche <roche@httrack.com>

---------

Signed-off-by: Xavier Roche <roche@httrack.com>
Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
2026-08-03 18:14:46 +00:00
Xavier Roche
9308adc16e A downloaded HTTrack.app cannot launch: Homebrew's OpenSSL never travels with it (#950)
* Bundle the non-system dylibs, or a downloaded HTTrack.app cannot launch

src/Makefile.am links $(OPENSSL_LIBS) into libhttrack, which on a build
machine resolves to Homebrew. The bundle check only rejected the staging
prefix, so /opt/homebrew paths sailed through: fine for someone who ran
brew install, fatal for anyone who mounts a DMG.

macos-app.sh now copies the transitive closure of non-system dylibs into
Contents/Frameworks, rewrites the load commands to @rpath, and adds a
depth-correct @loader_path rpath to every Mach-O. install_name_tool
invalidates the signature and arm64 refuses to run an unsigned binary, so
each rewritten file is re-signed ad-hoc.

The check is now that every load command resolves to /usr/lib,
/System/Library, or a file present in Frameworks, and it fails if it
scanned no Mach-O at all. Because a static check cannot fail while the
loader is quietly falling back to Homebrew, CI also hides Homebrew's
openssl@3 and re-runs the smoke against the moved bundle.

Part of #901.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Signed-off-by: Xavier Roche <roche@httrack.com>

* Give the linker header room for the @rpath rewrite

install_name_tool refuses when the new load commands do not fit the
existing header: "changing install names or rpaths can't be redone".
The bundle build now passes -Wl,-headerpad_max_install_names, and the
script says so when the rewrite fails rather than surfacing the
toolchain's own message.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Signed-off-by: Xavier Roche <roche@httrack.com>

* Fix two bundling bugs the review found, and three checks that could not fail

machos() ended with a while loop, so its status was the last iteration's
file(1) test. The bundle always holds shell scripts, and find walks APFS in
directory-hash order, so whenever a non-Mach-O came last the script died
under set -e with no diagnostic and a half-populated Frameworks. Green CI
here was luck, not evidence.

Two dependencies sharing a basename were both copied in the same pass, the
second clobbering the first, and relink() then pointed both references at
the one survivor. Frameworks is flat and cannot express the difference, so
this now fails with both paths named.

The checks that could not fail:

- machos() prefiltered on mode and suffix, and the same list drove the copy,
  the relink and the audit, so a non-executable Mach-O was unbundled AND
  unchecked. It now enumerates every file.
- deps() piped otool into awk, so a failing otool yielded no dependencies and
  the binary was recorded as clean. Its status is now checked. Reading the
  indented lines rather than tail -n +2 also stops a universal binary's
  per-slice headers from parsing as dependencies.
- The CI probe hid only the openssl@3 opt symlink, which a source-built
  bottle does not reference, and asserted nothing about the bundle first, so
  an empty Frameworks passed it. It now asserts libssl is bundled, then hides
  the kegs of every library in the closure.
- Signing verified the bundle after codesign --force --deep had already
  re-signed it, repairing the damage it was meant to catch. Per-file
  signatures are now verified first.

-Wl,-headerpad_max_install_names moves from the CI job to configure.ac: it
is a precondition of the macos-app target, not a CI preference, and anyone
following the standalone recipe in Makefile.am:22 hit a rebuild-only
failure that ld64's default header slack made intermittent.

The toolchain gate is now unconditional, so a non-Darwin host refuses to
build rather than emitting a bundle nothing verified.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Signed-off-by: Xavier Roche <roche@httrack.com>

* One library reached by two paths is not a basename collision

The bundle depends on both /opt/homebrew/opt/openssl@3/lib/libcrypto.3.dylib
and the Cellar path behind that symlink, so comparing the dependency strings
called Homebrew's own layout a collision and refused to build.

Compare the paths with the directory resolved instead. Two names for one
file now dedupe; two different files under one name still fail, which is the
case that would silently clobber.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Signed-off-by: Xavier Roche <roche@httrack.com>

---------

Signed-off-by: Xavier Roche <roche@httrack.com>
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-03 16:18:28 +00:00
Xavier Roche
ab3ccc4d66 A wedged Windows suite takes the log that would name it (#947)
The Windows job wedges every few dozen runs: the test step never completes, the runner is lost, and the log blob and the `if: always()` artifact uploads go with it. So the wedging test has never been named.

A watchdog now runs beside the suite and ends the step before the runner dies, because a step that fails on its own terms keeps its log and still runs the uploads. It never triggers on elapsed time, since a healthy test and a wedged one look identical by the clock. It watches the progress log instead, where every outcome writes a line, the per-test timeout included: 900 seconds without one means that timeout did not fire, which is the wedge. On the way it names the test in flight as annotations, which is live progress rather than evidence.

That distinction is measured, not assumed. A throwaway workflow emitted notices and then died four ways: a step cancelled by its own timeout keeps its log and every annotation, on Linux and on Windows, from a background subshell as well as the foreground; a runner killed mid-step keeps neither, dropping notices that had been on the wire for twenty seconds.

Refs #795 rather than closing it: this ends the silence, it does not fix the leak behind it. Leftover coverage gap in #949.
2026-08-03 16:33:35 +02:00
Xavier Roche
12a1629bab Catch up to coucal head, now that its log rework is consumer-clean (#946)
Bump src/coucal from 5d2a633 to 0d36322, taking the two commits #945
deliberately skipped.

#31 replaced the log-level #if 0 cascade with COUCAL_LOG_LEVEL, but
defined all five level emitters unconditionally, so the unused ones
warned under -Wall for any consumer lacking coucal's own
-Wno-unused-function. That was the reason #945 pinned behind head.
xroche/coucal#33 tags them with an unused attribute instead and drops
the exemption from coucal's Makefile, so the warnings are gone at the
source rather than masked, and a new upstream CI leg compiles coucal.c
with consumer flags at every verbosity.

The default verbosity is still info, so the compiled-out debug and
trace that #941 measured stay compiled out: the probe from that PR
still reports 0 print handler calls per 20000 inserts. Our build is
clean of compiler diagnostics under gcc and clang. MSVC is unaffected
either way, since it builds at /W3 and the equivalent C4505 is level 4.

Signed-off-by: Xavier Roche <roche@httrack.com>
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-03 10:53:33 +00:00
Xavier Roche
602bdb0065 proxytrack crashes on an .arc record whose body it could not read (#944)
* proxytrack: bound the .arc reader and stop the writer trusting a size it has no bytes for

The reader hands back an element carrying a declared size with adr == NULL when
it could not fetch the body, and the .arc writer took the size at face value:
fwrite(NULL, 1, size) faulted inside libc (#931). Both writers now take the
body from a helper that answers 0 when there is nothing to write, and the
record's own length, the Content-length header and the md5 follow it, so what
is written declares what it holds.

A new fuzz-arc harness drives the reader the way --convert does (#929), and
found the rest in seven executions: PT_Delete never freed the indexes it owns,
PT_Index_Delete__Arc never freed its hashtable, and a record could declare a
two-gigabyte body that the reader allocated before the short read failed.

Signed-off-by: Xavier Roche <xroche@gmail.com>
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Signed-off-by: Xavier Roche <roche@httrack.com>

* proxytrack: commit the merged index slot only once the array holds it

PT_IndexMerge() counted the new slot before growing the array, and assigned
realloc's result straight onto indexes->index: a failed allocation dropped the
array it already had and left index_size counting an entry that was never
stored. Harmless while nothing walked the array; PT_Delete() now does. The
array holds pointers, so size it as such rather than as whole PT_Index structs.

Signed-off-by: Xavier Roche <xroche@gmail.com>
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Signed-off-by: Xavier Roche <roche@httrack.com>

* proxytrack: trim the comments added by the .arc hardening

Signed-off-by: Xavier Roche <xroche@gmail.com>
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Signed-off-by: Xavier Roche <roche@httrack.com>

* proxytrack: initialise the .ndx mutex, keep unsizeable archives loading, and give the bound a positive control

PT_LoadCache__Old() never called MutexInit(), which was survivable while
PT_Index_Delete__Old() was unreachable; PT_Delete() now runs it on every exit.
The readers lock the same handle, so on Windows the .ndx path was serving
unsynchronised.

A .arc past LONG_MAX cannot be sized by a 32-bit ftell, and refusing the whole
archive lost the records that used to load; the bound just stops constraining.

Test 164 asserted only refusals, so a reader that refused every body passed it,
as did an off-by-one on the last record. It now converts an archive whose body
ends on the last byte of the file, and checks the zip writer's own size header.
The truncated.arc seed ran out of file before reaching the bound it is named
for.

Signed-off-by: Xavier Roche <xroche@gmail.com>
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Signed-off-by: Xavier Roche <roche@httrack.com>

---------

Signed-off-by: Xavier Roche <xroche@gmail.com>
Signed-off-by: Xavier Roche <roche@httrack.com>
Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
2026-08-03 10:33:24 +00:00
Xavier Roche
191b35106a The empty-key singleton is handed back with its const cast away (#945)
Bump src/coucal from a0a9e49 to 5d2a633, clearing the one warning #941
knowingly landed: 7a8198d const-qualified the_empty_string but still
returned it through a plain cast to coucal_key (void*), which httrack
compiles with -Wcast-qual. Upstream keeps the const and routes the
singleton through uintptr_t, so it stays in rodata, and adds
-Wcast-qual to its own mandatory flags so the class cannot return.

Pinned at 5d2a633 rather than upstream head. The next commit (#31)
replaces the log-level #if cascade with COUCAL_LOG_LEVEL and defines
all five level functions unconditionally, which warns twice under
-Wall for any consumer without coucal's own -Wno-unused-function.
Filed as xroche/coucal#32; head follows once that is resolved.

The default level is still info, so the compiled-out debug and trace
that #941 measured stay compiled out: the same probe reports 0 print
handler calls per 20000 inserts at both 5d2a633 and head.

Signed-off-by: Xavier Roche <roche@httrack.com>
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-03 10:27:11 +00:00
Xavier Roche
fb786b0501 Coucal's compiled-out trace still formats every URL it inserts (#941)
Bump src/coucal from 93ec411 to a0a9e49, five upstream fixes.

The one that reaches the engine is the logging change. coucal_trace()
in coucal_add_item_() passes coucal_print_key() as an argument, and the
compiled-out macro expanded to an ordinary variadic call, so the
argument still ran. htshash.c installs key_adrfil_debug_print on
hash->adrfil and hash->former_adrfil, where it snprintf()s the full URL
into a scratch buffer, so every insert into the dedup tables paid for a
URL format that was then discarded. Measured on a probe mirroring
htshash.c's setup: 13262 handler calls per 20000 inserts, now 0, with
the table statistics unchanged.

The other four fixes harden coucal without reaching our call sites: the
custom key free at destruction (our dup handler is an identity pointer
copy and the free handler is empty), the mid-walk delete enumeration
skip (all four enum loops in htsback.c are read-only), the pool-aliased
key use-after-free (no call site passes an item name back as a key),
and the coucal_new() shift width (every call site passes 0).

No ABI change: coucal.h is not installed, struct_coucal is opaque,
struct_coucal_enum is byte-identical, and the 36 coucal symbols
libhttrack exports are unchanged.

Signed-off-by: Xavier Roche <roche@httrack.com>
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-03 09:41:43 +00:00
Xavier Roche
50282e52fa Two tests share the number 160, and one hides its own failure (#940)
#933 and #934 merged minutes apart and both landed a test numbered 160, so the icon-theme one becomes 163. Only `tests-list.mk` referred to it, and the Windows job picks tests by topic word rather than number, so its coverage is unchanged.

The cache-hdrbounds test also sent stderr to `/dev/null` to hide an expected warning, which threw away the self-test's own diagnostics with it: a failure printed `cache-hdrbounds: FAIL` and nothing about why. stderr now goes to a file both failure paths report.
2026-08-03 09:38:43 +00:00
Xavier Roche
fd745e3f23 The cache aborts the crawl on URLs it accepts (#939)
Four places built or consumed the cache key, each assuming a different maximum URL length. A URL long enough to fill a `lien_back` field is legal and reachable off the wire, so one of them aborted the crawl where it should have missed the cache, and the index load read entry names into a buffer minizip can fill without a terminator.

All four now size off one bound, and the key is built all-or-nothing with the existing `slcatprintfbuff`: too long to store drops the entry with a warning, too long to look up is a miss. Clipping is never right here, because a clipped key is a valid key for some other URL, and that is a cache hit on the wrong content. The new `cache-urlbounds` self-test (`tests/162`) stores at the cap and pins that neither a twin differing only in its last byte nor a decoy sitting on a clip point can be served in its place.

Closes #935
Closes #936
2026-08-03 10:37:22 +02:00
Xavier Roche
df11ef6bf3 The cached-headers block is built with an unbounded sprintf (#934)
* Bound the cache header block instead of trusting the field caps

ZIP_FIELD_STRING and its integer siblings sprintf'd into a fixed 8192-byte
block with no bound, in both the engine cache writer (cache_add) and
ProxyTrack's new.zip writer. The values are remote-controlled -- ETag,
Location, Content-Disposition, the URL itself -- and in cache_add the caps
they are declared with sum past 8192, so the writer could overrun its own
stack buffer.

Route every field through slcatprintfbuff(), a new all-or-nothing bounded
append: a field that does not fit is dropped whole, since a clipped one reads
back as a valid shorter value. X-Save moves ahead of X-Addr/X-Fil so the one
field the reader consumes is not the first casualty of a full block.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Signed-off-by: Xavier Roche <roche@httrack.com>

* Merge origin/master into fix-841-zip-field-bounds

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Signed-off-by: Xavier Roche <roche@httrack.com>

* Restore the bounded ZIP_FIELD_STRING lost in the merge

The merge commit picked up a mutation-testing revert of this macro from the
shared worktree, putting the unbounded sprintf back.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Signed-off-by: Xavier Roche <roche@httrack.com>

* Make the header-bounds test kill the mutants it was walking past

A test audit built seven mutant writers against the new self-test; five
passed. Restoring the legacy field order passed while silently dropping
X-Save, so the reorder this PR relies on was asserted by nothing. An
early-return writer passed vacuously, the check landing on the control
entry because nothing pinned which entry it read. A truncated Location
passed because any non-empty prefix was accepted, and the size bound was
a literal 8192 decoupled from the buffer it was meant to track.

The block is now identified by a field only the maxed entry carries, the
bound comes from a shared CACHE_HEADERS_SIZE, X-Save must survive, and a
still-present X-Fil reports that the entry stopped filling the block
rather than passing quietly. The wrapper consults httrack's exit status,
so an abort after the verdict is no longer a pass.

Adds an .arc to .zip round trip for ProxyTrack's writer, which had no
runtime coverage: every --convert in the suite writes .arc.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Signed-off-by: Xavier Roche <roche@httrack.com>

---------

Signed-off-by: Xavier Roche <roche@httrack.com>
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-03 07:38:30 +00:00
Xavier Roche
4f4699b12b HTTrack.app ships without an icon (#937)
Add tools/HTTrack.icns from the brand master, declare it in Info.plist.in,
copy it into the bundle, and check the plist and the payload agree.

Closes #900

Signed-off-by: Xavier Roche <roche@httrack.com>
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-03 09:37:53 +02:00
Xavier Roche
6de2187ee6 The application icon is still the pre-brand bitmap set (#933)
* The application icon is still the pre-brand bitmap set

Replace the 16/32/48 PNGs and the .xpm fallbacks with the HT monogram
generated from the same Jost* master as the masthead wordmark, and extend
the hicolor theme with 64, 128, 256 and a scalable SVG.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Signed-off-by: Xavier Roche <roche@httrack.com>

* Assert the icons on what install and dist emit, not on Makefile.am text

Six mutants survived the first version: an emptied EXTRA_DIST, an empty *dir
variable (automake's install rule exits 0 when it is), a _DATA glob with the
wrong extension, a _DATA entry for a directory the tree does not have, a
missing apps context subdirectory, and a size dropped from install entirely.
All six now fail, and the PNGs are indexed rather than RGBA.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Signed-off-by: Xavier Roche <roche@httrack.com>

---------

Signed-off-by: Xavier Roche <roche@httrack.com>
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-03 09:37:50 +02:00
Xavier Roche
69c8069573 proxytrack cannot re-read the .arc it writes (#928)
* proxytrack cannot re-read the .arc it writes

The version block's declared length counted the blank line closing it, so
the reader consumed the first record's separator and every entry was
skipped: a second --convert over proxytrack's own output loaded nothing.

The bytes on disk are unchanged; only the declared length shrinks by one,
which an older proxytrack reads too. The reader now stops on the last of
the newlines closing the version block, so archives already written the
old way still load.

Closes #834

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Signed-off-by: Xavier Roche <roche@httrack.com>

* Bound the version block newline scan and keep rejecting truncated archives

Review of the first commit found two regressions of its own: the newline
run was scanned to its end, so an archive padded with a gigabyte of them
cost a gigabyte of reads where master stopped after two, and tolerating
EOF there turned a length running past the end of the file into a silent
empty load. At most two newlines are read now, and a version block that
does not end on one is rejected as before.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Signed-off-by: Xavier Roche <roche@httrack.com>

* Pin the version block length against a compensating extra newline

A writer that emits the blank line and still counts it round-trips, so
every assertion passed while the length stayed a byte too long. The
declared block must not end on a blank line either.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Signed-off-by: Xavier Roche <roche@httrack.com>

---------

Signed-off-by: Xavier Roche <roche@httrack.com>
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-03 06:52:27 +00:00
Xavier Roche
5ec25f3713 The tagline bar carries prose leading it has no use for (#930)
Signed-off-by: Xavier Roche <xroche@gmail.com>
Signed-off-by: Xavier Roche <roche@httrack.com>
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-03 06:42:02 +00:00
Xavier Roche
12039c54d4 The tagline no longer sits against the wordmark's baseline (#927)
* The tagline no longer sits against the wordmark's baseline

The old GIF was cropped from the cap tops to the baseline, so its box edges were
the letters. The SVG's box is the true ink box, which in Jost also holds the k's
ascender above the caps and the round letters' overshoot below the baseline, and
that shows up as a band of field colour between the wordmark and the tagline.

Neither band can be cropped out of the artwork without cutting ink, so the
masthead takes them back optically. Measured against the old rendering, the
baseline-to-tagline distance is identical and the cap tops land within a third
of a pixel.

Signed-off-by: Xavier Roche <xroche@gmail.com>
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Signed-off-by: Xavier Roche <roche@httrack.com>

* Cut the comments back to one line each

Signed-off-by: Xavier Roche <xroche@gmail.com>
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Signed-off-by: Xavier Roche <roche@httrack.com>

* Say what the margins actually do

The comment claimed both bands were trimmed. The lower one is, in full; the
upper is trimmed only by what the old bitmap did not already carry, which is why
1.7px is not the 3.56px the artwork measures. Derivation recorded beside the
generators.

Signed-off-by: Xavier Roche <xroche@gmail.com>
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Signed-off-by: Xavier Roche <roche@httrack.com>

---------

Signed-off-by: Xavier Roche <xroche@gmail.com>
Signed-off-by: Xavier Roche <roche@httrack.com>
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-03 06:17:16 +00:00
Xavier Roche
c7767990cd ProxyTrack dumps a coucal hashtable stats line on every WebDAV request (#924)
* ProxyTrack dumps a coucal hashtable stats line on every WebDAV request

coucal logs a per-table statistics summary when a table is deleted, and
with no handler installed it prints that line itself, prefixed with the
table's address. ProxyTrack builds and drops one table per WebDAV
enumeration, so every unauthenticated PROPFIND put one on whatever the
service redirects its output to, heap pointer included.

httrack and htsserver were already covered by hts_init(), which installs
a global coucal handler that drops info-level messages unless HTS_LOG is
set (#416). ProxyTrack does not link libhttrack: it compiles coucal
itself and never calls hts_init(), so it was the last binary on coucal's
built-in sink. It now installs its own handler. Critical and warning go
through proxytrack's log, everything below is dropped unless HTS_LOG is
set, and the summaries then come back without the address.

Unnaming the tables would not have fixed it. coucal_delete() logs the
summary for every table, named or not; the name only decorates the
message.

Closes #918

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Signed-off-by: Xavier Roche <roche@httrack.com>

* Whitelist proxytrack's request-time output instead of naming two absent strings

The absence check pinned two literals, so a reworded leak or one whose
pointer was not at column 0 walked through it. Assert instead that every
line the process writes once serving is an access-log line, which is the
property, and pin the routed form under HTS_LOG whole so the address
cannot creep back between the severity and the message.

Also say why the handler passes "debug" rather than the DEBUG macro: the
macro is NULL outside a debug build, which would quietly make HTS_LOG a
no-op.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Signed-off-by: Xavier Roche <roche@httrack.com>

* Order the whitelist against a request's teardown, not just its access log

proxytrack writes the access line before send(), so waiting on it ordered
nothing that a teardown or keep-alive path writes afterwards: a leak
delayed 400ms past the response survived the check. Send both PROPFINDs
over one connection, since the keep-alive loop does not read the second
request until the first one's teardown has run, and read the capture only
once proxytrack is gone and the pty drainer has marked it complete.

Draining alone was not enough. SIGTERM cuts the work short rather than
truncating a buffer, so a still-pending write is never made at all and
there is nothing left to flush; the ordering is what catches it.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Signed-off-by: Xavier Roche <roche@httrack.com>

---------

Signed-off-by: Xavier Roche <roche@httrack.com>
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-02 18:20:23 +00:00
Xavier Roche
0a1a4379c2 configure hangs forever if BASH_SHELL points at a FIFO (#926)
A FIFO passes "test -x", so the #920 check ran it: bash gets EACCES from
execve, falls back to reading the file for a shebang, and blocks in open()
with no writer. AS_EXECUTABLE_P is autoconf's own "test -f && test -x", and
AC_PATH_PROGS on the line above already applied it to the PATH search, so the
override path was simply using the weaker predicate.

A regular executable that never returns stays uncovered: no portable timeout
is worth it, and CC= pointing at the same wrapper hangs stock AC_PROG_CC too.

Test 151 gains the FIFO case, and its run() is capped so a regression fails
instead of wedging "make check" with no log.

Closes #922

Signed-off-by: Xavier Roche <roche@httrack.com>
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-02 20:16:12 +02:00
Xavier Roche
9479913232 http_xfread1's reserve-only read mode has no caller (#925)
* http_xfread1's reserve-only read mode has no caller

The `bufl == -2` branch of `http_xfread1()` allocates the line buffer and
returns without reading. Nothing has ever called it: no call site in the
tree passes -2, and scanning all 2649 revisions in this repository for
`xfread1(` call sites turns up 24 distinct lines, none of them -2. The
branch arrived with the 3.20.2 import commented "force reserve", so it was
probably meant for a preallocate-then-fill pattern that never landed.
Naming it `HTS_XFREAD_RESERVE` in #919 made it read as a supported mode.

No external caller is possible either: `htslib.h` is not installed and the
symbol is hidden, so this is not an API change.

Equivalence checked against the object code. `htsback.o` and
`htsselftest.o` disassemble identically; in `htslib.o` every function
except `http_xfread1` differs only in the `__LINE__` values `htssafe.h`
bakes in, shifted by the seven deleted lines. No new test: nothing changes
for any input a caller can produce, and `01_engine-xfread` plus the chunked
tests still pass.

Closes #923

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Signed-off-by: Xavier Roche <roche@httrack.com>

* Say that any non-positive bufl is line mode, not just the two named

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0199wAkSVZNBNp51mpRkxMvv
Signed-off-by: Xavier Roche <roche@httrack.com>

---------

Signed-off-by: Xavier Roche <roche@httrack.com>
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-02 18:04:31 +00:00
Xavier Roche
8168aa3a45 The masthead wordmark is a 400x34 GIF that blurs on any hi-DPI screen (#916)
* The masthead wordmark is a 400x34 GIF that blurs on any hi-DPI screen

Replaces it with an outlined SVG across the 38 documentation and WebHTTrack
pages that carry it. The original was set in Futura, so the lockup was refitted
in Jost*, the closest free Futura revival, taking weight from the measured stem
thickness, size from the cap heights and tracking by least squares against the
glyph positions in the old bitmap.

tests/82 now asserts that every image a GUI page names is actually served.

Signed-off-by: Xavier Roche <xroche@gmail.com>
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Signed-off-by: Xavier Roche <roche@httrack.com>

* Point the shared chrome generator at the new wordmark

The masthead of the 13 generated pages comes from tools/doc-chrome.py, so
editing the pages alone left the generator disagreeing with its own output and
--check red.

Signed-off-by: Xavier Roche <xroche@gmail.com>
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Signed-off-by: Xavier Roche <roche@httrack.com>

---------

Signed-off-by: Xavier Roche <xroche@gmail.com>
Signed-off-by: Xavier Roche <roche@httrack.com>
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-02 19:17:01 +02:00
Xavier Roche
72fa732f7e A debug fprintf dumps every PROPFIND body to stderr (#917)
* proxytrack: drop the leftover debug traces on the WebDAV path

Two fprintf(stderr) calls in the PROPFIND path shipped by accident: one dumped
the client-supplied request body, the other the whole generated multistatus
response. Both ran on every PROPFIND with no authentication in front of them,
so any client could write bytes of its choosing into the operator's stderr.
The body is never parsed and the response is derivable from the index, so
neither trace has diagnostic value worth keeping behind a debug level.

Closes #911

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Signed-off-by: Xavier Roche <roche@httrack.com>

* tests: make the #911 leak check see stdout and the property, not two literals

The absence checks pinned 'DEBUG: DAV-DATA' and '^RESPONSE:', which four
re-added variants walk straight past: a trace without the hyphen, one with no
marker at all, one prefixed so the '^' misses, and one on stdout. The stdout
case is the worst of them: redirected to a file, proxytrack's stdout is fully
buffered and SIGTERM never flushes it, so the leak never reached the log the
test reads.

Give proxytrack a pty instead of a file, so libc line-buffers its output on
Linux and macOS alike, and assert the property: a PROPFIND carries a canary the
index cannot produce, and neither the canary nor a distinctive string from the
generated response may appear in what proxytrack wrote. The two literals stay as
names for the specific regression. The liveness guard now requires a PROPFIND
answered 207, since a depth-rejected one is logged 403 by the shared reply path
without ever reaching the deleted code.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Signed-off-by: Xavier Roche <roche@httrack.com>

---------

Signed-off-by: Xavier Roche <roche@httrack.com>
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-02 11:31:53 +00:00
Xavier Roche
5a38473343 A failed String allocation is only caught by assert, and the empty-on-failure contract is unstated (#921)
* Bound the ProxyTrack DAV item buffer against an amplified PROPFIND path

proxytrack_add_DAV_Item() reserved a fixed 1024 bytes and then sprintf'd into
it unbounded. The request path lands in the response twice, once as the href
and once as the displayname, and escapexml() turns each '&' into '&amp;', so
an unauthenticated PROPFIND of roughly 900 ampersands writes about 9000 bytes
off the end of the heap block. No cache entry and no Depth: 1 are needed.

Replace the hand-sized reserve with StringSprintf(), which measures the
formatted output and grows the String to fit, and convert the sibling sprintf
sites in the same file so no unbounded write into a String is left to
re-audit. Sizing beats clipping here: the String already owns a growable
buffer, so nothing has to be dropped.

Closes #836

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Signed-off-by: Xavier Roche <roche@httrack.com>

* Bound StringSprintf's pre-C99 retry, and trim the review findings

A genuine vsnprintf conversion error returns -1 just as pre-C99 msvcrt does
for a short buffer, so the doubling search had no way to tell them apart and
grew until realloc aborted. Unreachable from these format strings, which use
only %s and %d, but the helper lives in a shared header and will get more
callers. Cap the search and empty the String past it.

Also: the count assertion piped into wc under pipefail, so a zero count killed
the test through set -e before its diagnostic could print.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Signed-off-by: Xavier Roche <roche@httrack.com>

* Lift the NO_WEBDAV conditional out of a macro argument list

A preprocessor directive inside a macro invocation's arguments is undefined:
it was fine while this was a plain sprintf() call, and MSVC rejected it as
soon as it became StringSprintf(). GCC accepts it, so only the Windows leg
caught it. Compute the DAV header fragment first and pass it as an argument.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Signed-off-by: Xavier Roche <roche@httrack.com>

* Cover StringSprintf's exact-fill case and the WebDAV enumeration branch

StringSprintf_ writes the terminator at buffer[ret], so widening its
`ret < capacity` guard by one byte is a heap overflow that only fires when the
formatted output exactly fills the capacity. No crawl test lands on a
capacity boundary, so the mutant survived the suite. The new `strsprintf`
self-test sweeps lengths around 256, 512, 1024 and 2048 with the String's
capacity pinned to each, plus a growing and shrinking sweep on one reused
String, and checks the length, the bytes and the terminator every time.

Test 147 only ever sent Depth: 0, leaving the enumeration branch the same PR
rewrote with no coverage at all. Its fixture gains a child directory, and a
Depth: 1 listing pins the item URLs, including the trailing '/' that
StringPopRight takes back off a directory name.

Signed-off-by: Xavier Roche <xroche@gmail.com>
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Signed-off-by: Xavier Roche <roche@httrack.com>

* Make the String failure paths safe without assert

StringSprintf empties the String when it gives up, but that contract was
only visible in the implementation, and the WebDAV enumeration in
proxytrack pops the trailing '/' straight after it. State it at the
declaration, no-op StringPopRight on an empty String, and skip an
enumerated item the formatter could not name.

StringRoomTotal reported a failed realloc through STRING_ASSERT alone.
The MSVC Release configuration defines NDEBUG, so that check is already
gone from the shipped Windows builds, leaving a NULL buffer under a
capacity bumped before the allocation was known to succeed. Assign both
only on success, and terminate through StringOom_.

Closes #915

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Signed-off-by: Xavier Roche <roche@httrack.com>

* Renumber the String OOM test to 152

151 is taken by the unmerged tests/151_bash-shell-validate.test (PR #920).
The filenames differ, so git would have carried both onto master rather than
conflicting.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Signed-off-by: Xavier Roche <roche@httrack.com>

* Declare the new WebDAV test in the Windows skip set

It skips on Windows for the same reason as its two neighbours, MSYS
cannot reap a background listener (#595), and the ratchet fails a skip
it was not told about.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0199wAkSVZNBNp51mpRkxMvv
Signed-off-by: Xavier Roche <roche@httrack.com>

* Keep the out-of-memory action overridable

STRING_REALLOC and STRING_FREE are #ifndef hooks, and STRING_ASSERT was one
too; replacing it with a hard-wired call took a hook away from downstreams of
this installed header. Route the failure through STRING_OOM instead, with the
print-and-abort default unchanged.

Also flush stderr before aborting: the Windows CRT buffers a redirected
stderr and abort() flushes nothing, which would drop the message the test
matches on.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Signed-off-by: Xavier Roche <roche@httrack.com>

* Inject the allocation failure instead of asking for a huge one

The engine self-test pinned a String's capacity so the next doubling asked
for SIZE_MAX/2, on the assumption that no allocator would serve it. Six CI
legs disagreed: i386 has a 3G user space, and the 64-bit runners handed the
request out too, so the test reported "NOT aborted" everywhere but here.
Green that depends on how much memory the machine feels like giving is not a
test.

Drive the path from a standalone helper instead, which defines STRING_REALLOC
to a stub returning NULL before including htsstrings.h. Four cases: growth
with the stub allocating for real, the failure reaching the handler with the
size it asked for, a live buffer surviving a failed realloc, and the shipped
handler printing and aborting. Only the automake build produces the helper,
so the test declares its Windows skip.

The self-test had no portable way to force the failure, so it goes rather
than staying as a handler nobody can rely on.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Signed-off-by: Xavier Roche <roche@httrack.com>

* Assert the bytes and the requested size, not just the bookkeeping

An under-allocation survived the helper: shortening the realloc by one byte
while still recording the full capacity left all four cases green, because
only the growth case allocated anything and it checked the capacity number
rather than the memory behind it. Fill the announced capacity to its last
byte and read it back, which the sanitizer legs turn into a hard failure.

The failure cases pinned the initial capacity by asserting 16, so bumping
that policy would have failed a correct tree. Compare the size handed to the
handler against the size the stub was actually asked for instead, which also
catches the under-allocation on legs with no sanitizer.

Drive StringSprintf_ and StringBuffN_ too, the other two places the header
expands STRING_OOM.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Signed-off-by: Xavier Roche <roche@httrack.com>

---------

Signed-off-by: Xavier Roche <roche@httrack.com>
Signed-off-by: Xavier Roche <xroche@gmail.com>
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-02 11:29:24 +00:00
Xavier Roche
6745ec9842 configure accepts a BASH_SHELL that is not a usable bash (#920)
* configure accepts a BASH_SHELL that is not a usable bash

`./configure BASH_SHELL=/bin/sh` was accepted without a word. `AC_PATH_PROGS`
takes any absolute value verbatim, so the macOS problem #895 fixed (a bash in
POSIX sh-mode driving `make deb` and the test harness) came back, surfacing
much later as a `146_bash-shell.test` failure instead of a configure error. A
relative value never reached the Makefiles at all: it was dropped for whatever
the PATH search turned up.

configure now checks the value it resolved. The shell must be executable,
report a `BASH_VERSION`, and not carry `posix` in `SHELLOPTS`, the
discriminator `146_bash-shell.test` already uses, since an sh-mode bash reports
a version too. A relative or whitespace-carrying override is refused before the
search runs; whitespace would otherwise survive into `$(BASH_SHELL)`, which
nothing in the Makefiles quotes.

Only an explicit override is fatal. When the search itself finds nothing
usable, configure warns and carries on, so a box without bash still builds; it
just cannot run `make check` or `make deb`.

Closes #908

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Signed-off-by: Xavier Roche <roche@httrack.com>

* An environment in POSIX mode must not be blamed on the bash path

POSIXLY_CORRECT, or an exported SHELLOPTS, puts every bash into POSIX
sh-mode, so `./configure BASH_SHELL=/bin/bash` failed with advice to pass a
path that cannot exist, and a plain configure warned that no usable bash was
found on a box that has one. The probe now runs a second time under `env -u
POSIXLY_CORRECT -u SHELLOPTS`; if the shell is fine once they are cleared, the
message names them and says how to clear them for make as well, since it
inherits the environment. An override stays fatal, the search still only warns.

The bash-ness probe read `BASH_VERSION`, an ordinary variable any shell echoes
back, so `BASH_VERSION=9.9 ./configure BASH_SHELL=/bin/dash` was accepted and
dash landed in `TEST_LOG_COMPILER`. It reads `${BASH_VERSINFO[0]}` instead,
which no environment can fake.

The path guard covered whitespace alone while claiming to cover what make and
the recipe shell split on, so a real bash under a directory named with `;` or
`$` or `#` still reached the Makefile. It now rejects that whole class. Quoting
`$(BASH_SHELL)` at its three uses was the alternative, but make cuts the value
at a `#` and expands a `$` before any shell sees it, so quoting would cover
less than the guard.

The suite now also pins the branch the fatal/warn split rests on: no override,
an unusable bash first in PATH, configure exits 0 with a warning.

Signed-off-by: Xavier Roche <roche@httrack.com>
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Signed-off-by: Xavier Roche <roche@httrack.com>

* Nothing pinned which cause of POSIX mode gets blamed

A shell can be in POSIX mode because it was invoked as sh or because the
environment forces it, and only the second probe can say which. Nothing held
that down, so a version deciding from the environment alone, without
re-probing, passed every case in the suite while telling the user to clear a
variable that would not have helped. Test 151 now runs a bash symlinked as sh
with POSIXLY_CORRECT=1 set as well, and requires the message to name the path.

The comment records why that branch cannot simply read POSIXLY_CORRECT:
autoconf runs "set -o posix" on configure's own shell, so it is set there no
matter what the user's environment holds.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Signed-off-by: Xavier Roche <roche@httrack.com>

---------

Signed-off-by: Xavier Roche <roche@httrack.com>
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-02 11:08:48 +00:00
Xavier Roche
eb4c1fe64c http_xfread1's read mode is an unnamed integer at every call site (#919)
* A chunked response carrying trailers is discarded as "Invalid chunk"

The chunk automaton expected the line after the terminating zero-length
chunk to be empty. RFC 9112 7.1.2 lets a server put a trailer section
there and asks recipients to discard fields they do not understand;
instead the whole message failed and the resource never reached the
mirror.

The trailer section is now read the way headers are, as a block ending
on a blank line, and thrown away. Reading it as a block also bounds it:
trailers carry no length of their own, so an endless one would hold a
connection slot forever, and the line reader's 8KB buffer caps it. Only
the terminating chunk opens the section, so junk where a data chunk's
own CRLF belongs is still a framing error.

Closes #855

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0199wAkSVZNBNp51mpRkxMvv
Signed-off-by: Xavier Roche <roche@httrack.com>

* Renumber the trailer test to 149, 147 is taken by the WebDAV overflow test

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0199wAkSVZNBNp51mpRkxMvv
Signed-off-by: Xavier Roche <roche@httrack.com>

* Name the line-block bound, and pin the trailer edge cases

Review follow-ups: the 8190-byte cap that bounds a trailer section was an
unnamed literal inside http_xfread1, so raising it for large response
headers would have moved the trailer bound silently. It is now
HTS_LINE_BLOCK_SIZE, named where the reader is declared.

The trailer path also no longer runs the chunk-size parse it then
discards, and eof.html pins the deliberate leniency the change
introduces: past a complete, length-verified body, a trailer section cut
before its blank line still lands. A body cut before the terminating
chunk stays refused.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0199wAkSVZNBNp51mpRkxMvv
Signed-off-by: Xavier Roche <roche@httrack.com>

* Name http_xfread1's read modes instead of passing bare 0, -1 and -2

http_xfread1() selects its read mode from the sign of bufl: a positive
value reads that many bytes, 0 stops at a blank line, -1 at the first LF,
-2 only reserves the buffer. Nothing declared them, so every call site was
an unexplained literal.

Declare HTS_XFREAD_LINE_BLOCK, HTS_XFREAD_LINE and HTS_XFREAD_RESERVE in
htslib.h beside HTS_LINE_BLOCK_SIZE, and use them at each call site. The
selftest keeps its 8192, a byte count rather than a mode.

Behaviour-preserving: the preprocessed output of the changed translation
units is token-identical once the parens around the negative literals and
the __LINE__ digits shifted by the reworded comments are normalized away.

Closes #914

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Signed-off-by: Xavier Roche <roche@httrack.com>

* Note that the reserve-only read mode has no caller

Naming it made it read as a supported mode; it is unreachable (#923).

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0199wAkSVZNBNp51mpRkxMvv
Signed-off-by: Xavier Roche <roche@httrack.com>

* Keep the reserve-mode note on one line

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0199wAkSVZNBNp51mpRkxMvv
Signed-off-by: Xavier Roche <roche@httrack.com>

---------

Signed-off-by: Xavier Roche <roche@httrack.com>
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-02 10:53:02 +00:00
Xavier Roche
2d041866ed An unauthenticated PROPFIND overflows the ProxyTrack DAV item buffer (#909)
* Bound the ProxyTrack DAV item buffer against an amplified PROPFIND path

proxytrack_add_DAV_Item() reserved a fixed 1024 bytes and then sprintf'd into
it unbounded. The request path lands in the response twice, once as the href
and once as the displayname, and escapexml() turns each '&' into '&amp;', so
an unauthenticated PROPFIND of roughly 900 ampersands writes about 9000 bytes
off the end of the heap block. No cache entry and no Depth: 1 are needed.

Replace the hand-sized reserve with StringSprintf(), which measures the
formatted output and grows the String to fit, and convert the sibling sprintf
sites in the same file so no unbounded write into a String is left to
re-audit. Sizing beats clipping here: the String already owns a growable
buffer, so nothing has to be dropped.

Closes #836

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Signed-off-by: Xavier Roche <roche@httrack.com>

* Bound StringSprintf's pre-C99 retry, and trim the review findings

A genuine vsnprintf conversion error returns -1 just as pre-C99 msvcrt does
for a short buffer, so the doubling search had no way to tell them apart and
grew until realloc aborted. Unreachable from these format strings, which use
only %s and %d, but the helper lives in a shared header and will get more
callers. Cap the search and empty the String past it.

Also: the count assertion piped into wc under pipefail, so a zero count killed
the test through set -e before its diagnostic could print.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Signed-off-by: Xavier Roche <roche@httrack.com>

* Lift the NO_WEBDAV conditional out of a macro argument list

A preprocessor directive inside a macro invocation's arguments is undefined:
it was fine while this was a plain sprintf() call, and MSVC rejected it as
soon as it became StringSprintf(). GCC accepts it, so only the Windows leg
caught it. Compute the DAV header fragment first and pass it as an argument.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Signed-off-by: Xavier Roche <roche@httrack.com>

* Cover StringSprintf's exact-fill case and the WebDAV enumeration branch

StringSprintf_ writes the terminator at buffer[ret], so widening its
`ret < capacity` guard by one byte is a heap overflow that only fires when the
formatted output exactly fills the capacity. No crawl test lands on a
capacity boundary, so the mutant survived the suite. The new `strsprintf`
self-test sweeps lengths around 256, 512, 1024 and 2048 with the String's
capacity pinned to each, plus a growing and shrinking sweep on one reused
String, and checks the length, the bytes and the terminator every time.

Test 147 only ever sent Depth: 0, leaving the enumeration branch the same PR
rewrote with no coverage at all. Its fixture gains a child directory, and a
Depth: 1 listing pins the item URLs, including the trailing '/' that
StringPopRight takes back off a directory name.

Signed-off-by: Xavier Roche <xroche@gmail.com>
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Signed-off-by: Xavier Roche <roche@httrack.com>

* Declare the new WebDAV test in the Windows skip set

It skips on Windows for the same reason as its two neighbours, MSYS
cannot reap a background listener (#595), and the ratchet fails a skip
it was not told about.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0199wAkSVZNBNp51mpRkxMvv
Signed-off-by: Xavier Roche <roche@httrack.com>

---------

Signed-off-by: Xavier Roche <roche@httrack.com>
Signed-off-by: Xavier Roche <xroche@gmail.com>
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-02 10:37:22 +00:00
Xavier Roche
5f52c3d942 A chunked response carrying trailers is discarded as "Invalid chunk" (#913)
* A chunked response carrying trailers is discarded as "Invalid chunk"

The chunk automaton expected the line after the terminating zero-length
chunk to be empty. RFC 9112 7.1.2 lets a server put a trailer section
there and asks recipients to discard fields they do not understand;
instead the whole message failed and the resource never reached the
mirror.

The trailer section is now read the way headers are, as a block ending
on a blank line, and thrown away. Reading it as a block also bounds it:
trailers carry no length of their own, so an endless one would hold a
connection slot forever, and the line reader's 8KB buffer caps it. Only
the terminating chunk opens the section, so junk where a data chunk's
own CRLF belongs is still a framing error.

Closes #855

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0199wAkSVZNBNp51mpRkxMvv
Signed-off-by: Xavier Roche <roche@httrack.com>

* Renumber the trailer test to 149, 147 is taken by the WebDAV overflow test

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0199wAkSVZNBNp51mpRkxMvv
Signed-off-by: Xavier Roche <roche@httrack.com>

* Name the line-block bound, and pin the trailer edge cases

Review follow-ups: the 8190-byte cap that bounds a trailer section was an
unnamed literal inside http_xfread1, so raising it for large response
headers would have moved the trailer bound silently. It is now
HTS_LINE_BLOCK_SIZE, named where the reader is declared.

The trailer path also no longer runs the chunk-size parse it then
discards, and eof.html pins the deliberate leniency the change
introduces: past a complete, length-verified body, a trailer section cut
before its blank line still lands. A body cut before the terminating
chunk stays refused.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0199wAkSVZNBNp51mpRkxMvv
Signed-off-by: Xavier Roche <roche@httrack.com>

---------

Signed-off-by: Xavier Roche <roche@httrack.com>
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-02 11:56:22 +02:00
Xavier Roche
592f3dd154 The frozen-slot spool is written inside the mirror namespace (#912)
* Spool a frozen backlog slot outside the mirror namespace

back_cleanup_background() named the spool file by appending ".tmp" to the save
name, so it landed beside the mirrored file. That is the shape #774 fixed for
the re-fetch backup: a site serving <path>.tmp has its mirrored copy truncated
by filecreate() and then unlinked when the slot is woken, and the run still
reports success. It is reachable on defaults, not only under a saturated
backlog: a -Z crawl of the bundled bigcrawl site with -c4 logs slots moving to
background.

Route both name shapes through back_spoolname(), which puts them in the
~hts-tmp directory no save name can spell, and drop that directory at the two
sites that unlink a spool. Left out of the #774 PR because these lines also
carried the overflow in #857.

Closes #859

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Signed-off-by: Xavier Roche <roche@httrack.com>

* Keep the -p0 spool relative when no output directory is set

The new name inserted its own separator before ~hts-tmp, but path_html_utf8
already carries one and is empty when -O is absent, so the spool became
/~hts-tmp/tmpfile0.tmp: absolute, in the filesystem root. Master built
"%stmpfile%d.tmp" and stayed relative to the working directory.

create_back_tmpfile() has spelled it the same way since #842. Its empty
path branch looks unreachable from the three call sites, so this side is a
consistency fix with no test behind it, unlike the spool.

The self-test pinned the doubled slash it observed rather than the shape it
wanted; it now asserts the single-separator form and covers the empty
path_html_utf8 case that produced the root path.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Signed-off-by: Xavier Roche <roche@httrack.com>

---------

Signed-off-by: Xavier Roche <roche@httrack.com>
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-02 08:44:06 +00:00
Xavier Roche
620418a9c6 The rings background is a 501x456 GIF that blurs on any hi-DPI screen (#910)
The panel decoration was drawn as vector and flattened to a 4KB indexed GIF
some time around 2007, with the panel colour baked in as an opaque backdrop.
Refitting its four ellipse boundaries recovers the original geometry, so it
goes back to being what it was: two elliptical annuli, 553 bytes of SVG, with
a transparent background that now composites over the panel instead of having
to match it.

Rasterised at the same size, the only pixels that differ from the GIF are
single-pixel anti-aliasing fringes along the four boundaries. Nothing survives
a 3x3 erosion of that difference, so no edge has moved.

Dark mode still drops the image rather than inverting it, since the ring
lavender is a light-panel tone whichever way the file stores it.

The engine keeps its own embedded copy of this GIF for the backblue.gif it
writes into mirrors. That one is untouched: the filename and byte length are
a contract with pages already on disk.

Signed-off-by: Xavier Roche <roche@httrack.com>
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-02 08:24:21 +00:00
Xavier Roche
f3fa3a8b98 configure discards a user-supplied BASH_SHELL (#907)
* configure discards a user-supplied BASH_SHELL

AS_UNSET erased the variable before AC_PATH_PROGS could honour it, so
"./configure BASH_SHELL=/path" had no effect and there was no way to
point the build at a bash other than the first one on PATH. Nothing
presets BASH_SHELL, which was the whole problem with BASH in #895, so
declaring it precious is enough.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Signed-off-by: Xavier Roche <roche@httrack.com>

* Run the nested configure against a symlink farm

An in-tree build leaves a config.status in srcdir, and autoconf then refuses
the out-of-tree run the test needs. Every CI build leg builds in-tree, so the
check failed there while passing on an out-of-tree tree.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Signed-off-by: Xavier Roche <roche@httrack.com>

* Read the resolved bash from the configure trace, not the Makefile

The nested configure ran without the flags the outer one was given, so on
macOS it died at the openssl check that Homebrew paths satisfy. BASH_SHELL
is resolved long before that, so assert on the trace and let the run fail.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Signed-off-by: Xavier Roche <roche@httrack.com>

* Assert the value that reaches $(BASH_SHELL), not the macro's decision

Reading the configure trace let a mutant through: resolve the override
correctly, clobber BASH_SHELL one line later, and both assertions passed
while every Makefile got the wrong shell. Prefer the generated Makefile
and keep the trace only as a fallback for a configure that dies early.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Signed-off-by: Xavier Roche <roche@httrack.com>

---------

Signed-off-by: Xavier Roche <roche@httrack.com>
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-07-31 12:53:15 +02:00
Xavier Roche
311b99afd4 The AppStream metainfo still advertises WebHTTrack 3.49.8 (#897)
* The AppStream metainfo still advertises WebHTTrack 3.49.8

The metainfo installs to usr/share/metainfo, so GNOME Software and KDE
Discover read both the version and the "What's new" text out of it. Its
releases block held one entry, 3.49.8, and nothing had moved it since.

It now lists 3.49.8 through 3.49.15, newest first, each with a short
user-facing note taken from history.txt. Dates come from the git tags;
that also corrects 3.49.8's, which carried 3.49.7's date.

01_engine-version-macros.test gains two assertions so the next release
cannot miss this file, or configure.ac: AC_INIT and the top release entry
must both match HTTRACK_VERSIONID, and the entries must descend so the
top one really is the newest.

Closes #884

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Signed-off-by: Xavier Roche <roche@httrack.com>

* Harden the metainfo version check and correct four release notes

The release-version extraction matched <releases ...> as well as <release>,
ignored XML comments and took only the last tag on a shared line, so a parked
or wrapper version= could pose as the newest entry and pass a stale metainfo.
Split tags one per line, drop comments, and anchor the match. Widen the awk
ordering key so a component of 1000 or more cannot borrow into the next.

In the notes: "3.49-2" and "site rules with wildcards" are unreadable in a
software centre, the Windows path bullet does not apply to the Unix WebHTTrack
GUI it ships with, and 3.49.15 listed no web-interface fix at all.

Signed-off-by: Xavier Roche <xroche@gmail.com>
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Signed-off-by: Xavier Roche <roche@httrack.com>

---------

Signed-off-by: Xavier Roche <roche@httrack.com>
Signed-off-by: Xavier Roche <xroche@gmail.com>
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-07-31 08:02:00 +00:00
Xavier Roche
ef81f5b488 An install that is not where configure put it cannot find its own data (#899)
* Find the data directory instead of trusting the configure-time one

webhttrack probed a fixed list of prefixes that nothing derived from
--datadir, and the engine baked $(datadir) into the binary with the
argv[0] fallback compiled out. Both fail on any tree that is not where
it was configured.

configure substitutes the real datadir into src/webhttrack, and
hts_resolve_datadir() prefers the compiled-in path but derives one from
argv[0] when it is gone, so a moved install reads its own templates
rather than silently falling back to the built-in defaults.

Closes #887
Closes #894

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Signed-off-by: Xavier Roche <roche@httrack.com>

* Resolve the data directory from the executable, not just argv[0]

MSVC broke: HTS_HTTRACKDIR is only defined on non-Windows, so the
argv[0] branch this replaced was live there, not dead. Windows now
passes an empty builtin and falls back to the executable's own
directory, which is what it did before -- except fconcat inserts no
separator, so the old path_bin lacked its trailing slash and never
resolved a template anyway.

Ask the OS for the executable path (/proc/self/exe, _NSGetExecutablePath,
GetModuleFileName) and keep argv[0] as the fallback, so a mirror run
through a PATH lookup resolves too.

The bundle drops the substituted datadir from its copy of webhttrack:
it is a build-machine path there, and the relative entries ahead of it
already find the payload.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Signed-off-by: Xavier Roche <roche@httrack.com>

* Clip the candidate path instead of aborting on a long argv[0]

strlncatbuff() aborts rather than truncates, and appending the layout
suffix to an already-full buffer reaches that: a directory part within
17 bytes of the candidate buffer's size killed the process. Build the
candidate with snprintf and skip it when it does not fit.

The self-test now drives a directory part long enough to trigger it;
without the fix it aborts on "overflow while appending 'layout[i]'".

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Signed-off-by: Xavier Roche <roche@httrack.com>

* Ignore the generated src/webhttrack

An in-tree build writes it next to webhttrack.in, where it was untracked
and one "git add -A" away from re-entering the tree with a build
machine's datadir frozen into it.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Signed-off-by: Xavier Roche <roche@httrack.com>

---------

Signed-off-by: Xavier Roche <roche@httrack.com>
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-07-31 07:43:50 +00:00
Xavier Roche
22c506944d configure resolves bash to /bin/sh on macOS, and make deb runs a bash script with dash (#898)
* configure resolves bash to /bin/sh on macOS, and make deb runs a bash script with dash

AC_PATH_PROGS searched into BASH, which bash presets to its own invocation
path. configure re-execs through /bin/sh, and on macOS that shell is a bash, so
the macro honoured the pre-set value and reported "checking for bash...
/bin/sh": a bash in sh-mode that rejects process substitution. Search into
BASH_SHELL instead, a name no shell presets, with AS_UNSET in front so the
environment cannot preset it either.

That makes the obvious fix for the deb target safe. It ran tools/mkdeb.sh with
$(SHELL), which is /bin/sh, so "make deb" died on the first bashism on every
Debian and Ubuntu box. macos-app.sh stays on $(SHELL): it is POSIX sh on
purpose, so shellcheck lints it as sh.

tests/146_bash-shell.test asserts the configured shell exists, sets
BASH_VERSION, is not in POSIX sh-mode, and parses a process substitution.

Closes #895
Closes #891

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Signed-off-by: Xavier Roche <roche@httrack.com>

* Trim the comments this branch added, and drop a claim that is no longer true

The four comment blocks the branch added ran two to five lines where one or two
carry the fact. The 146 header also said the macOS shell rejects "the process
substitution the bundle script uses": tools/macos-app.sh has been POSIX sh with
no process substitution since #890, so the gate is there for tests/local-crawl.sh
and tests/webhttrack-smoke.sh, which is what the comment now says.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Signed-off-by: Xavier Roche <roche@httrack.com>

---------

Signed-off-by: Xavier Roche <roche@httrack.com>
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-07-31 07:05:44 +00:00
Xavier Roche
b127323a68 The macOS test server stalls 35s on a reverse DNS lookup nothing reads (#896)
* The test server's bind reverse-resolves 127.0.0.1, which stalls on macOS

http.server's HTTPServer.server_bind() calls getfqdn() on the bind address just
to fill server_name, which nothing in local-server.py reads. On the macos-15
runner that lookup takes ~30s, so the PORT line lands well past every caller's
discovery budget (#870).

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Signed-off-by: Xavier Roche <roche@httrack.com>

* PROBE: macos-15 + startup timing (not for merge)

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Signed-off-by: Xavier Roche <roche@httrack.com>

* Move the macOS CI legs to macos-15, and route the last two port waits through the shared helper

84 and 100 kept their own PORT poll loops with 10s budgets, the copies #869 did
not reach; both use discover_server_port now, so there is one implementation
left.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Signed-off-by: Xavier Roche <roche@httrack.com>

* Cut the server_bind comment to the why

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Signed-off-by: Xavier Roche <roche@httrack.com>

---------

Signed-off-by: Xavier Roche <roche@httrack.com>
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-07-31 06:21:39 +00:00
Xavier Roche
fac60dff4a armhf crash reports have no frames, and the empty backtrace fails the build (#893)
* armhf crash reports have no frames, and the empty backtrace fails the build

gcc emits no unwind tables on armhf, so backtrace() comes back empty and the
handler printed a frameless report, which the crash tests read as a failure and
which left 3.49.15-1 stuck at Build-Attempted there. Ask for
-fasynchronous-unwind-tables where the compiler takes it, and say why the report
has no frames when the unwinder still returns nothing.

Closes #892

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Signed-off-by: Xavier Roche <roche@httrack.com>

* Let ASan tolerate the backtrace shim's link order

An LD_PRELOAD library loads ahead of the executable's own libasan, which ASan
refuses by default, so the sanitize leg never reached the crash it was meant to
inspect. Same waiver the other interposer tests carry.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Signed-off-by: Xavier Roche <roche@httrack.com>

* Keep an empty backtrace a failure everywhere but 32-bit ARM

Relaxing test 80's skip to the shared message prefix let it swallow the new
"unwinding failed" wording too, so a build that traced nothing anywhere would
have gone green on every architecture. Skip only where nothing can be done
about it: the OS-less case, and 32-bit ARM if its toolchain still refuses to
unwind. Test 143 now pins the exact wording rather than the prefix it shares
with the OS-less notice, and its control run skips the symbolizer it has no
reason to spawn.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Signed-off-by: Xavier Roche <roche@httrack.com>

* Declare the new backtrace test's Windows skip

The Windows job compares the skip set exactly, so a test that skips there for a
good reason still fails the gate until it is named.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Signed-off-by: Xavier Roche <roche@httrack.com>

---------

Signed-off-by: Xavier Roche <roche@httrack.com>
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-07-30 18:22:08 +00:00
Xavier Roche
264478c846 HTTrack ships a working GUI on macOS that no Mac user can find (#890)
* Ship a macOS app bundle

macOS users install HTTrack through Homebrew and get a working WebHTTrack they
are never told about: the formula installs webhttrack and htsserver, and the
only thing missing is something to double-click. tools/macos-app.sh assembles
HTTrack.app from an installed prefix, with the payload under Contents/Resources
so webhttrack keeps resolving htsserver and its data from its own location, and
a two-line stub in Contents/MacOS for Launch Services.

Nothing about the engine changes. The bundle is possible because webhttrack was
already relocatable and because the data symlink stopped being absolute (#885);
--disable-shared keeps libhttrack inside the binaries so nothing points back at
the staging prefix. That costs no crash diagnostics here, since backtraces are
gated on __linux (src/htsbacktrace.c:50), though it does trip #889 on Linux.

The script verifies what it builds rather than trusting it: no absolute symlink,
the served UI present, no Mach-O still linking the staging prefix, and the
Info.plist version matching the installed binary. configure generates that
plist, so it cannot drift into a fifth hand-maintained version spot of the kind
#884 describes.

CI assembles the bundle, runs the webhttrack smoke through the stub, then moves
the bundle and deletes the prefix it came from and runs it again, which is the
one thing a .app has to survive that a prefix install does not. An ad-hoc
codesign proves it is well formed enough to sign; Gatekeeper needs a Developer
ID and stays out of scope with the DMG.

No custom icon: the largest artwork in the tree is 48x48 and macOS wants 1024,
so that needs a real source asset.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Signed-off-by: Xavier Roche <roche@httrack.com>

* ci: lint the new bundle script, and mark it executable

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Signed-off-by: Xavier Roche <roche@httrack.com>

* Drive the bundle through a make target, and run it with bash

Adds a macos-app target so assembling the bundle goes through the build system
the way make deb does, rather than CI reaching for the script directly.

It runs the script with $(BASH), not $(SHELL). automake's SHELL is /bin/sh, and
the script uses process substitution, so under dash it died partway: the payload
was already copied by then and only the verification was skipped, leaving a
bundle that looked built and had been checked by nothing.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Signed-off-by: Xavier Roche <roche@httrack.com>

* Make the bundle checks catch what they were missing

The smoke put the bundle's own bin on $PATH, so a launcher that ignored its own
location and just ran "webhttrack" passed as readily as the real one, which is
the most likely way a stub breaks. Dropping $prefix/bin from $PATH kills that:
the browser stub is found through webhttrack's SRCHPATH, not $PATH, so nothing
else needed it.

The bundle also shipped libtool .la files, static archives and include/, none of
them loadable from a static build and the .la files carrying the staging prefix
in libdir=. They are pruned, and a text sweep now fails on any remaining file
that embeds that prefix, which otool cannot see because it reads load commands
only. The prefix is resolved to an absolute path first, or a relative --prefix
made that grep match nothing.

Also: the symlink scan asserts it scanned something, and CFBundleVersion is
compared as well as CFBundleShortVersionString.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Signed-off-by: Xavier Roche <roche@httrack.com>

* Assemble the bundle with POSIX sh, not $(BASH)

$(BASH) is not a reliable bash on macOS. /bin/sh there is bash in sh-mode, which
presets $BASH to the path it was invoked as, and AC_PATH_PROGS honours a
pre-set value rather than searching, so configure reports "checking for bash...
/bin/sh". That shell rejects process substitution, and the bundle job died on
it.

Rather than hunt for a real bash, the script no longer needs one: the three
process substitutions become temp-file loops, pipefail goes (not POSIX), and
the target is back on the ordinary $(SHELL) like deb:. shellcheck now reads it
as sh, so a bashism creeping back fails lint instead of macOS CI.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Signed-off-by: Xavier Roche <roche@httrack.com>

---------

Signed-off-by: Xavier Roche <roche@httrack.com>
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-07-30 20:05:20 +02:00
Xavier Roche
8f383f4caf The installed html symlink is absolute, so an install tree cannot be moved (#888)
* Make the installed html symlink relative

The install-data-hook linked share/httrack/html to an absolute $(htmldir), so
an installed tree only worked at the prefix it was configured for: the link
dangled under DESTDIR staging and in any relocated copy, and webhttrack then
failed its test -d "${DISTPATH}/html" check and exited. It now emits a
relative link when htmldir sits under datadir.

The hook also sat in html/Makefile.am while writing into $(datadir)/httrack,
the directory lang/Makefile.am declares and populates, and it hardcoded
$(prefix)/share instead of following datadir. Moving it to lang/ with
$(langrootdir) drops that cross-subdirectory install-order dependency. A
stale symlink was previously left in place, so an upgrade kept an absolute
one; it is now replaced, a real directory is left alone with a diagnostic,
and a new uninstall-hook removes what install created. A moved datadir still
defeats webhttrack's own data search for an unrelated reason (#887).

The smoke test asserts no installed symlink is absolute and that the link,
resolved inside a copy of the tree at another path, stays inside that copy
and lands on the served UI. It now runs on Linux as well as macOS, since
Linux is where the affected packaging is consumed.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Signed-off-by: Xavier Roche <roche@httrack.com>

* ci: match the Linux build job's package list

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Signed-off-by: Xavier Roche <roche@httrack.com>

* tests: put the stub browser where webhttrack looks first

webhttrack searches its own SRCHPATH (starting at $BINWD, then /usr/local/bin,
/usr/share/bin, /usr/bin) and only appends $PATH after it, so shadowing
x-www-browser through PATH only worked on hosts that have no real one. The
GitHub Linux runners ship /usr/bin/x-www-browser as Edge, which won the search
and then aborted on its SUID sandbox, failing the new Linux job.

Write the stub to $prefix/bin instead, which is SRCHPATH[0] on every platform,
and remove it in the teardown.

Signed-off-by: Xavier Roche <roche@httrack.com>

---------

Signed-off-by: Xavier Roche <roche@httrack.com>
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-07-30 14:52:28 +00:00
217 changed files with 9328 additions and 1350 deletions

34
.github/workflows/appstream-network.yml vendored Normal file
View File

@@ -0,0 +1,34 @@
# The per-PR lint runs --no-net so an httrack.com outage can't red an unrelated
# PR; that also blinds it to a broken screenshot URL, which this job catches.
name: appstream metainfo (networked)
on:
schedule:
- cron: "12 6 * * 1"
workflow_dispatch:
permissions:
contents: read
jobs:
validate:
name: appstreamcli validate (network)
# Scheduled workflows run per-fork independently; skip anywhere but upstream.
if: github.repository == 'xroche/httrack'
runs-on: ubuntu-24.04
steps:
- uses: actions/checkout@v7
- name: Install appstreamcli
run: |
set -euo pipefail
sudo apt-get update
sudo apt-get install -y --no-install-recommends appstream
appstreamcli --version
# appstreamcli exits 3 on a warning, so a dead screenshot fails the job.
- name: AppStream metainfo validation (network)
run: |
set -euo pipefail
appstreamcli validate --explain \
html/server/div/com.httrack.WebHTTrack.metainfo.xml

View File

@@ -143,7 +143,7 @@ jobs:
# so point configure at it; everything else is in the SDK or default paths.
macos:
name: build (macOS arm64, clang)
runs-on: macos-14
runs-on: macos-15
steps:
- uses: actions/checkout@v7
with:
@@ -191,7 +191,7 @@ jobs:
# temp prefix, then check webhttrack brings up htsserver and serves the UI.
webhttrack-macos:
name: webhttrack smoke (macOS arm64)
runs-on: macos-14
runs-on: macos-15
steps:
- uses: actions/checkout@v7
with:
@@ -217,6 +217,112 @@ jobs:
- name: Smoke-test webhttrack
run: bash tests/webhttrack-smoke.sh "$RUNNER_TEMP/inst"
# Same smoke on the platform that ships webhttrack as a package: the install layout
# it asserts (a relative data symlink, #885) is what Debian consumes, and the macOS
# job alone left that untested on Linux.
webhttrack-linux:
name: webhttrack smoke (Linux x86-64)
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
- name: Build and install into a temp prefix
run: |
set -euo pipefail
./bootstrap
./configure --prefix="$RUNNER_TEMP/inst"
make -j"$(nproc)"
make install
- name: Smoke-test webhttrack
run: bash tests/webhttrack-smoke.sh "$RUNNER_TEMP/inst"
# The macOS app bundle (#886): assemble it, then prove it still works after being
# moved, which is the only thing a .app has to survive that a prefix install does not.
macos-app:
name: macOS app bundle (arm64)
runs-on: macos-15
steps:
- uses: actions/checkout@v7
with:
submodules: recursive
- name: Install build dependencies
run: |
set -euo pipefail
brew install autoconf automake libtool autoconf-archive brotli zstd
# --disable-shared keeps libhttrack inside the binaries, so the bundle carries no
# absolute dylib path back to the staging prefix.
- name: Build and install into a temp prefix
run: |
set -euo pipefail
ssl="$(brew --prefix openssl@3)"
brewp="$(brew --prefix)"
./bootstrap
./configure CPPFLAGS="-I${ssl}/include -I${brewp}/include" \
LDFLAGS="-L${ssl}/lib -L${brewp}/lib" \
--prefix="$RUNNER_TEMP/inst" --disable-shared
make -j"$(sysctl -n hw.ncpu)"
make install
- name: Assemble HTTrack.app
run: |
set -euo pipefail
make macos-app APP_FLAGS="--prefix $RUNNER_TEMP/inst --out $RUNNER_TEMP"
plutil -lint "$RUNNER_TEMP/HTTrack.app/Contents/Info.plist"
- name: Run it through the bundle stub
run: |
set -euo pipefail
app="$RUNNER_TEMP/HTTrack.app"
bash tests/webhttrack-smoke.sh "$app/Contents/Resources" "$app/Contents/MacOS/HTTrack"
- name: Run it again after moving it
run: |
set -euo pipefail
mkdir -p "$RUNNER_TEMP/moved"
mv "$RUNNER_TEMP/HTTrack.app" "$RUNNER_TEMP/moved/"
rm -rf "$RUNNER_TEMP/inst"
app="$RUNNER_TEMP/moved/HTTrack.app"
bash tests/webhttrack-smoke.sh "$app/Contents/Resources" "$app/Contents/MacOS/HTTrack"
# The load-command check cannot fail while the loader can still reach Homebrew (#901).
- name: Run it with Homebrew's libraries out of reach
run: |
set -euo pipefail
app="$RUNNER_TEMP/moved/HTTrack.app"
# Without this the hiding below proves nothing: an empty Frameworks passes it.
ls "$app/Contents/Frameworks"/libssl.*.dylib >/dev/null
# The kegs, not just the opt symlinks: a source build records the Cellar path.
hidden=""
for keg in openssl@3 brotli zstd; do
for d in "$(brew --prefix)/opt/$keg" "$(brew --prefix)/Cellar/$keg"; do
if [ -e "$d" ]; then sudo mv "$d" "$d.hidden"; hidden="$hidden $d"; fi
done
done
trap 'for d in $hidden; do sudo mv "$d.hidden" "$d"; done' EXIT
test -n "$hidden"
bash tests/webhttrack-smoke.sh "$app/Contents/Resources" "$app/Contents/MacOS/HTTrack"
# The release path (macos-release.yml) minus Apple, so a bundle that cannot be
# signed or packed fails on the PR rather than on release day.
- name: Sign and pack the bundle, ad hoc
run: |
set -euo pipefail
bash tools/macos-release.sh --app "$RUNNER_TEMP/moved/HTTrack.app" \
--identity - --skip-notarize
# Portability/hardening: 32-bit (i386) build on the x86-64 runner via multilib
# -- no extra hardware. Exercises the 32-bit size_t/pointer ABI, where size
# and bounds math can truncate or wrap in ways 64-bit never reveals (the axis
@@ -593,9 +699,12 @@ jobs:
man/makeman.sh
src/htsbasiccharsets.sh
src/htsentities.sh
src/webhttrack
src/webhttrack.in
tests/*.sh
tests/*.test
tools/macos-app.sh
tools/macos-bundle.sh
tools/macos-release.sh
tools/mkdeb.sh
steps:
- uses: actions/checkout@v7
@@ -606,8 +715,9 @@ jobs:
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
sudo apt-get install -y --no-install-recommends shellcheck shfmt appstream
shfmt --version
appstreamcli --version
- name: shellcheck
run: shellcheck $SHELL_SCRIPTS
@@ -625,6 +735,14 @@ jobs:
echo "ok $f"
done
# A software centre quietly ignores a metainfo it cannot parse. Errors and
# warnings fail; --no-net so the gate is on the file, not httrack.com's uptime.
- name: AppStream metainfo validation
run: |
set -euo pipefail
appstreamcli validate --no-net --explain \
html/server/div/com.httrack.WebHTTrack.metainfo.xml
# Check clang-format on CHANGED LINES ONLY. The engine predates clang-format
# (it was shaped by an old Visual Studio formatter) and does not round-trip,
# so we never reformat the whole tree -- only the lines a PR touches.

View File

@@ -38,7 +38,7 @@ jobs:
build-essential autoconf automake libtool autoconf-archive \
zlib1g-dev libssl-dev
- uses: github/codeql-action/init@v4
- 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
- uses: github/codeql-action/analyze@v4.37.4
with:
category: "/language:c-cpp"

162
.github/workflows/macos-release.yml vendored Normal file
View File

@@ -0,0 +1,162 @@
# Signed, notarized HTTrack.dmg (#901). Its own workflow because a fork's pull request
# never gets the Developer ID secrets, and each run spends two notarization submissions.
name: macOS release
on:
push:
tags: ["[0-9]*"]
workflow_dispatch:
permissions:
contents: read
jobs:
dmg:
name: signed DMG (macOS arm64)
runs-on: macos-15
permissions:
contents: write # attach the DMG to the release the tag belongs to
steps:
- uses: actions/checkout@v7
with:
submodules: recursive
# Notarization is minutes in; a missing secret should not surface there.
- name: Check the signing secrets are present
env:
MACOS_CERT_P12: ${{ secrets.MACOS_CERT_P12 }}
MACOS_CERT_PASSWORD: ${{ secrets.MACOS_CERT_PASSWORD }}
MACOS_NOTARY_KEY: ${{ secrets.MACOS_NOTARY_KEY }}
MACOS_NOTARY_KEY_ID: ${{ secrets.MACOS_NOTARY_KEY_ID }}
MACOS_NOTARY_ISSUER_ID: ${{ secrets.MACOS_NOTARY_ISSUER_ID }}
run: |
set -euo pipefail
hint="see secrets/apple/README.md in httrack-works"
: "${MACOS_CERT_P12:?unset repository secret ($hint)}"
: "${MACOS_CERT_PASSWORD:?unset repository secret ($hint)}"
: "${MACOS_NOTARY_KEY:?unset repository secret ($hint)}"
: "${MACOS_NOTARY_KEY_ID:?unset repository secret ($hint)}"
: "${MACOS_NOTARY_ISSUER_ID:?unset repository secret ($hint)}"
- name: Install build dependencies
run: |
set -euo pipefail
brew install autoconf automake libtool autoconf-archive brotli zstd
# --disable-shared keeps libhttrack inside the binaries.
- name: Build and install into a temp prefix
run: |
set -euo pipefail
ssl="$(brew --prefix openssl@3)"
brewp="$(brew --prefix)"
./bootstrap
./configure CPPFLAGS="-I${ssl}/include -I${brewp}/include" \
LDFLAGS="-L${ssl}/lib -L${brewp}/lib" \
--prefix="$RUNNER_TEMP/inst" --disable-shared
make -j"$(sysctl -n hw.ncpu)"
make install
- name: Assemble HTTrack.app
run: |
set -euo pipefail
make macos-app APP_FLAGS="--prefix $RUNNER_TEMP/inst --out $RUNNER_TEMP"
plutil -lint "$RUNNER_TEMP/HTTrack.app/Contents/Info.plist"
- name: Import the Developer ID certificate
env:
CERT_P12: ${{ secrets.MACOS_CERT_P12 }}
CERT_PASSWORD: ${{ secrets.MACOS_CERT_PASSWORD }}
run: |
set -euo pipefail
kc="$RUNNER_TEMP/signing.keychain-db"
kcpass="$(openssl rand -base64 24)"
echo "::add-mask::$kcpass"
security create-keychain -p "$kcpass" "$kc"
# Notarization holds the job well past the five-minute default lock.
security set-keychain-settings -lut 21600 "$kc"
security unlock-keychain -p "$kcpass" "$kc"
# Armed before the file exists: a failed import must not leave the key on a
# disk that later steps run repository code against.
trap 'rm -f "$RUNNER_TEMP/cert.p12"' EXIT HUP INT TERM
# openssl, not base64: macOS spells the decode flag -D and GNU spells it -d.
printf '%s' "$CERT_P12" | openssl base64 -d -A -out "$RUNNER_TEMP/cert.p12"
security import "$RUNNER_TEMP/cert.p12" -k "$kc" -P "$CERT_PASSWORD" \
-T /usr/bin/codesign
# Without this codesign blocks on a UI prompt no runner can answer.
security set-key-partition-list -S apple-tool:,apple:,codesign: \
-s -k "$kcpass" "$kc" >/dev/null
security list-keychains -d user -s "$kc"
id="$(security find-identity -v -p codesigning "$kc" |
awk '/Developer ID Application/ {print $2; exit}')"
test -n "$id" || {
security find-identity -v -p codesigning "$kc" >&2
echo "the .p12 holds no Developer ID Application identity" >&2
exit 1
}
echo "SIGN_IDENTITY=$id" >>"$GITHUB_ENV"
- name: Sign, notarize and pack the DMG
env:
NOTARY_KEY: ${{ secrets.MACOS_NOTARY_KEY }}
NOTARY_KEY_ID: ${{ secrets.MACOS_NOTARY_KEY_ID }}
NOTARY_ISSUER_ID: ${{ secrets.MACOS_NOTARY_ISSUER_ID }}
run: |
set -euo pipefail
key="$RUNNER_TEMP/notary.p8"
trap 'rm -f "$key"' EXIT HUP INT TERM
printf '%s' "$NOTARY_KEY" | openssl base64 -d -A -out "$key"
bash tools/macos-release.sh --app "$RUNNER_TEMP/HTTrack.app" \
--identity "$SIGN_IDENTITY" --out "$RUNNER_TEMP" \
--notary-key "$key" --notary-key-id "$NOTARY_KEY_ID" \
--notary-issuer "$NOTARY_ISSUER_ID"
# The DMG round-trip is the one thing that can strip the stapled ticket, so assess
# the copy that came out of it rather than the app the signing step still holds.
- name: Assess a quarantined copy out of the DMG
run: |
set -euo pipefail
dmg="$(echo "$RUNNER_TEMP"/HTTrack-*.dmg)"
test -f "$dmg"
hdiutil attach -nobrowse -readonly -mountpoint "$RUNNER_TEMP/mnt" "$dmg"
trap 'hdiutil detach "$RUNNER_TEMP/mnt" >/dev/null || true' EXIT
app="$RUNNER_TEMP/quarantined/HTTrack.app"
ditto "$RUNNER_TEMP/mnt/HTTrack.app" "$app"
# On the root only, as a real download lands it; -r would also chase symlinks.
xattr -w com.apple.quarantine "0083;00000000;Safari;" "$app"
# --no-cache, or the verdict already cached for this cdhash answers instead.
log="$RUNNER_TEMP/assess.log"
spctl --assess --type exec --ignore-cache --no-cache -vv "$app" >"$log" 2>&1 || {
cat "$log" >&2
exit 1
}
cat "$log"
grep -q "source=Notarized Developer ID" "$log"
# spctl alone can be answered online; this is the offline-launch proof.
xcrun stapler validate "$app"
# Not a Gatekeeper check: the stub is a script, so nothing here goes through
# LaunchServices. It proves the hardened runtime did not break the dylib loads.
bash tests/webhttrack-smoke.sh "$app/Contents/Resources" "$app/Contents/MacOS/HTTrack"
- name: Upload the DMG
uses: actions/upload-artifact@v7
with:
name: HTTrack-macos-arm64-dmg
path: ${{ runner.temp }}/HTTrack-*.dmg
if-no-files-found: error
# Releases are cut by hand, so a tag can land before one exists.
- name: Attach the DMG to the release
if: github.ref_type == 'tag'
env:
GH_TOKEN: ${{ github.token }}
run: |
set -euo pipefail
if gh release view "$GITHUB_REF_NAME" >/dev/null 2>&1; then
gh release upload "$GITHUB_REF_NAME" "$RUNNER_TEMP"/HTTrack-*.dmg --clobber
else
echo "no release $GITHUB_REF_NAME yet -- the DMG is on this run's artifacts"
fi
- name: Delete the signing keychain
if: always()
run: security delete-keychain "$RUNNER_TEMP/signing.keychain-db" || true

View File

@@ -15,6 +15,11 @@ on:
permissions:
contents: read
# Cancel superseded runs on the same branch or PR.
concurrency:
group: windows-build-${{ github.ref }}
cancel-in-progress: true
jobs:
libhttrack:
runs-on: windows-2022
@@ -167,132 +172,8 @@ jobs:
working-directory: tests
timeout-minutes: 45
run: |
set -u
bin="$(cygpath -u "$GITHUB_WORKSPACE")/src/${{ matrix.platform }}/${{ matrix.configuration }}"
export PATH="$bin:$PATH"
command -v httrack >/dev/null || { echo "::error::no httrack.exe in $bin"; exit 1; }
# httrack.exe is native, so MSYS rewrites any argument shaped like a
# POSIX path, and a URL path is shaped exactly like one: "/a/b.html"
# reached the engine as "C:/Program Files/Git/a/b.html". Switch that
# off, and hand the tests a TMPDIR that is already a Windows path.
export MSYS_NO_PATHCONV=1
export MSYS2_ARG_CONV_EXCL='*'
TMPDIR="$(cygpath -m "$RUNNER_TEMP")"
export TMPDIR
# Mirror what configure hands the suite. LC_ALL sets the codeset MSYS maps
# a UTF-8 mirror name onto UTF-16 with, which the intl crawls "test -f".
export HTTPS_SUPPORT=yes BROTLI_ENABLED=yes ZSTD_ENABLED=yes
export LC_ALL=C.UTF-8
# A wedged crawl must not eat the job's timeout budget. timeout(1)'s
# signals can't reap a native httrack.exe (MSYS signals don't reach it),
# so a hang orphaned processes that starved the runner; run_with_timeout
# TerminateProcess-es the whole tree. 600s is unchanged: it clears the
# 540s a three-pass crawl may legitimately take under local-crawl.sh's
# own watchdogs, against a slowest healthy test here of 39s.
. ./testlib.sh
per_test=600
# The whole suite must give up before the step timeout above. A cancelled
# step keeps neither its log nor the artifacts the later if:always()
# steps would upload, so an overrun that ends in a cancel tells us
# nothing; failing on our own terms keeps both. Healthy runs take 8-9
# min. The check sits between tests, so the step can still reach 25 min
# plus one per-test budget, and that worst case stays inside the 45.
suite_deadline=1500
started=$SECONDS
# Survives into the artifact even if the tail of the step log does not.
progress=suite-progress.log
: >"$progress"
pass=0 fail=0 skip=0 failed="" skipped="" deadline=0
# Globbed, not enumerated: a new NNN_engine-*.test or NNN_local-*.test
# is picked up automatically instead of silently getting zero coverage.
for t in 00_runnable.test *_engine-*.test *_zlib-*.test \
*_local-*.test *_watchdog*.test *_crawl_proxy_https.test \
*_crawl-log-salvage.test; do
elapsed=$((SECONDS - started))
if [ "$elapsed" -ge "$suite_deadline" ]; then
echo "::error::suite deadline: ${elapsed}s elapsed, stopping before $t"
echo "DEADLINE before $t after ${elapsed}s" >>"$progress"
# Per-test start times, so the slow ones are named rather than guessed.
sed 's/^/ /' "$progress"
deadline=1
break
fi
echo "RUN $t at ${elapsed}s" >>"$progress"
rc=0
# Same guard "make check" uses on POSIX, so a wedge is diagnosed the
# same way on every platform. It dumps before it kills, which a bare
# run_with_timeout cannot: by the time that returns, the tree whose
# stack we wanted is already gone.
HTTRACK_TEST_TIMEOUT=$per_test bash ./test-timeout.sh "$t" >"$t.log" 2>&1 || rc=$?
case "$rc" in
0) pass=$((pass + 1)); echo "PASS $t" ;;
77) skip=$((skip + 1)) skipped="$skipped $t"; echo "SKIP $t" ;;
124)
fail=$((fail + 1)) failed="$failed $t"
# test-timeout.sh has already written the process list, the stacks
# and the killed crawl's own logs into $t.log.
echo "FAIL $t (timed out, tree killed)"
tail -n 25 "$t.log" | sed 's/^/ /'
;;
*)
fail=$((fail + 1)) failed="$failed $t"
echo "FAIL $t (exit $rc)"
# These assert with `test "$(...)" == "..." || exit 1`, which
# says nothing at all on failure. Re-run traced, still bounded.
run_with_timeout "$per_test" bash -x "$t" >>"$t.log" 2>&1 || true
tail -n 25 "$t.log" | sed 's/^/ /'
;;
esac
echo "$rc $t" >>"$progress"
# An orphaned native httrack.exe spins and starves the runner, which
# is how this job dies with "lost communication" rather than a plain
# timeout. Clear them between tests and name whoever leaked them.
reap_leftover_processes "$t" | tee -a "$progress"
done
echo "ran=$((pass + fail + skip)) pass=$pass fail=$fail skip=$skip" |
tee -a "$GITHUB_STEP_SUMMARY"
# Every gate here exits 77, so an all-skipped suite would report green having
# tested nothing: pin the skips, and floor the passes in case the glob empties.
# One name per line, so two branches each appending one don't collide on the
# same line; compared as a sorted set below, so glob discovery order can't
# cause a false mismatch either.
# footer-overflow and purge-longpath skip on Windows (need a path past MAX_PATH);
# crange pending #581;
# webdav-default and webdav-mime need a reapable background listener, which MSYS cannot give them;
# badmtime needs a filesystem that stores an mtime past gmtime's range;
# single-file ends on a GUI half needing htsserver, which this job does not build;
# update-304-leak needs a LeakSanitizer build, which MSVC has no equivalent of;
# crash-symbolize needs backtrace(), which Windows has no equivalent of.
expected_skips="01_engine-footer-overflow.test
100_local-purge-longpath.test
114_local-update-304-leak.test
120_local-proxytrack-webdav-default.test
48_local-crange-memresume.test
71_local-crange-repaircache.test
79_local-proxytrack-webdav-mime.test
80_engine-crash-symbolize.test
88_local-proxytrack-badmtime.test
94_local-single-file.test"
# First, or the deadline reads as an unexplained shortfall in the gates below.
[ "$deadline" -eq 0 ] || { echo "::error::suite did not finish within ${suite_deadline}s"; exit 1; }
[ "$pass" -ge 90 ] || { echo "::error::only $pass tests passed ($skip skipped)"; exit 1; }
# Word-split on whitespace (space-joined $skipped, newline-joined
# expected_skips both work) and sort, so the compare is a set, not a string.
got=$(printf '%s\n' $skipped | sort)
want=$(printf '%s\n' $expected_skips | sort)
if [ "$got" != "$want" ]; then
echo "::error::skip set changed from expected; - missing, + newly skipped"
diff -u <(echo "$want") <(echo "$got") | tail -n +3 | sed 's/^/ /'
exit 1
fi
[ "$fail" -eq 0 ] || { echo "::error::failing:$failed"; exit 1; }
bash ./ci-windows-suite.sh \
"$(cygpath -u "$GITHUB_WORKSPACE")/src/${{ matrix.platform }}/${{ matrix.configuration }}"
- name: Upload the test logs
if: always()

12
.gitignore vendored
View File

@@ -24,8 +24,11 @@ Makefile.in
/config.log
/config.status
/stamp-h1
# src/webhttrack.in is the source; an in-tree build generates this one (#887).
/src/webhttrack
Makefile
.deps/
.dirstamp
.libs/
*.o
*.lo
@@ -34,6 +37,15 @@ Makefile
*.so.*
*.a
# Built into the checkout by an in-tree "make" / "make check".
/src/httrack
/src/htsserver
/src/proxytrack
/tools/Info.plist
/tests/stringoom
/tests/*.log
/tests/*.trs
# make dist output; dist/ holds httrack-gh-release staging artifacts.
/httrack-*.tar.gz
/dist/

View File

@@ -6,13 +6,33 @@ ACLOCAL_AMFLAGS = -I m4
EXTRA_DIST = INSTALL.Linux \
gpl-fr.txt license.txt greetings.txt history.txt \
httrack-doc.html lang.def README.md tools/mkdeb.sh \
tools/macos-app.sh tools/macos-bundle.sh tools/macos-release.sh \
tools/httrack-launcher.c \
tools/Info.plist.in tools/HTTrack.icns \
bootstrap build.sh
# Build the signed Debian packages from a clean source export. Pass the signing
# key and other options through DEB_FLAGS, e.g.:
# make deb DEB_FLAGS="--key BB71C7E6CB1AD8FAF53FE42A60C3AA7180598EFB"
# See tools/mkdeb.sh --help for all options.
# See tools/mkdeb.sh --help for all options. Not $(SHELL): mkdeb.sh is bash, and dash chokes (#891).
DEB_FLAGS =
deb:
$(SHELL) $(top_srcdir)/tools/mkdeb.sh $(DEB_FLAGS)
$(BASH_SHELL) $(top_srcdir)/tools/mkdeb.sh $(DEB_FLAGS)
.PHONY: deb
# Assemble the macOS application bundle from an installed prefix, e.g.
# make macos-app APP_FLAGS="--prefix /tmp/inst --out /tmp"
APP_FLAGS =
macos-app:
$(SHELL) $(top_srcdir)/tools/macos-app.sh --plist tools/Info.plist \
--icon $(top_srcdir)/tools/HTTrack.icns $(APP_FLAGS)
.PHONY: macos-app
# Sign, notarize and pack that bundle into the DMG we publish, e.g.
# make macos-release RELEASE_FLAGS="--app /tmp/HTTrack.app --identity ABCD1234 \
# --notary-key AuthKey.p8 --notary-key-id KEYID --notary-issuer ISSUERID"
# See tools/macos-release.sh for the rest; .github/workflows/macos-release.yml runs it.
RELEASE_FLAGS =
macos-release:
$(SHELL) $(top_srcdir)/tools/macos-release.sh $(RELEASE_FLAGS)
.PHONY: macos-release

View File

@@ -1,6 +1,6 @@
AC_PREREQ([2.71])
AC_INIT([httrack], [3.49.15], [roche+packaging@httrack.com], [httrack], [http://www.httrack.com/])
AC_INIT([httrack], [3.49.16], [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,15 +29,80 @@ AC_CONFIG_SRCDIR(src/httrack.c)
AC_CONFIG_MACRO_DIR([m4])
AC_CONFIG_HEADERS(config.h)
AM_INIT_AUTOMAKE([subdir-objects])
# 3:8:0: revision-only bump, no ABI change.
# 3:7:0: htsblk gained a tail field and lien_back embeds it by value, so
# lien_back.is_update and everything after it shift +8 (httrackp's own tail growth
# 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:7:0"
VERSION_INFO="3:8:0"
AM_MAINTAINER_MODE
AC_USE_SYSTEM_EXTENSIONS
# A real bash, for "make deb" and the test harness. Not searched into BASH: bash presets
# that to its own path, and macOS /bin/sh is a bash, so the macro never searches (#895).
# BASH_SHELL isn't preset the way BASH is, so AC_ARG_VAR needs no guard. Kept ahead of the
# compiler probes so a bad override dies before them.
AC_ARG_VAR([BASH_SHELL], [path to a real (non-POSIX-mode) bash])
# AC_PATH_PROGS drops a relative override and searches instead, which loses the user's intent.
# Nothing quotes $(BASH_SHELL) in the Makefiles, and quoting could not save it anyway: make
# splits on whitespace, expands '$' and treats '#' as a comment before any shell sees it.
case $BASH_SHELL in
*[[[:space:]]]* | *'#'* | *'$'* | *'`'* | *'\'* | *'"'* | *"'"* | *';'* | *'&'* | *'|'* | \
*'<'* | *'>'* | *'('* | *')'* | *'*'* | *'?'* | *'@<:@'* | *'@:>@'* | *'{'* | *'}'*)
AC_MSG_ERROR([BASH_SHELL must not contain shell or make metacharacters, got: $BASH_SHELL]) ;;
'' | [[\\/]]* | ?:[[\\/]]*) ;;
*) AC_MSG_ERROR([BASH_SHELL must be an absolute path, got: $BASH_SHELL]) ;;
esac
hts_bash_override=$BASH_SHELL
AC_PATH_PROGS([BASH_SHELL], [bash], [/bin/bash])
# An absolute override is taken verbatim, so BASH_SHELL=/bin/sh would put #895 back and only
# surface at "make check" or "make deb" (#908). What we found ourselves is only a warning:
# a box with no bash still builds, it just cannot run those two.
AC_MSG_CHECKING([whether $BASH_SHELL is a bash outside POSIX mode])
hts_bash_why=
hts_bash_env=no
# AS_EXECUTABLE_P, not "test -x": the PATH search above already demands a regular file, and
# bash blocks forever reading a FIFO it failed to exec, so -x alone hangs configure (#922).
if ! AS_EXECUTABLE_P(["$BASH_SHELL"]); then
hts_bash_why="not an executable regular file"
elif test -z "$("$BASH_SHELL" -c 'echo "${BASH_VERSINFO[[0]]}"' 2>/dev/null)"; then
# Not BASH_VERSION: that is an ordinary variable, so any shell echoes back a spoofed one.
hts_bash_why="not a bash: it reports no BASH_VERSINFO"
else
# sh-mode bash reports a version too, so only SHELLOPTS tells the two apart.
case $("$BASH_SHELL" -c 'echo ":$SHELLOPTS:"' 2>/dev/null) in
*:posix:*)
hts_bash_why="a bash in POSIX sh-mode"
# POSIXLY_CORRECT and an exported SHELLOPTS do that to every bash on the box, so no path
# can pass and blaming this one would send the user hunting for another. Reading them
# here would not do: configure puts its own shell in posix mode, which sets both.
case $(env -u POSIXLY_CORRECT -u SHELLOPTS "$BASH_SHELL" -c 'echo ":$SHELLOPTS:"' 2>/dev/null) in
'' | *:posix:*) ;; # no "env -u", or posix whatever the environment: blame the path
*) hts_bash_env=yes ;;
esac
;;
esac
fi
if test -z "$hts_bash_why"; then
AC_MSG_RESULT([yes])
else
AC_MSG_RESULT([no])
hts_bash_msg="POSIXLY_CORRECT or SHELLOPTS forces every bash into POSIX sh-mode, $BASH_SHELL included. Clear them for configure and for make, which hands them to make check and make deb: env -u POSIXLY_CORRECT -u SHELLOPTS ..."
if test "$hts_bash_env" = yes; then
if test -n "$hts_bash_override"; then
AC_MSG_ERROR([$hts_bash_msg])
fi
AC_MSG_WARN([$hts_bash_msg])
else
if test -n "$hts_bash_override"; then
AC_MSG_ERROR([BASH_SHELL=$BASH_SHELL is $hts_bash_why])
fi
AC_MSG_WARN([no usable bash found: $BASH_SHELL is $hts_bash_why. "make check" and "make deb" need one; pass BASH_SHELL=/path/to/bash])
fi
fi
AC_PROG_CC
AM_PROG_CC_C_O
m4_warn([obsolete],
@@ -48,14 +113,13 @@ m4_warn([obsolete],
# script's behavior did not change. They are probably safe to remove.
AC_CHECK_INCLUDES_DEFAULT
AC_PROG_EGREP
# $(SED) substitutes $(datadir) into src/webhttrack
AC_PROG_SED
LT_INIT
AC_PROG_LN_S
LT_INIT
# bash, used to run the test scripts (see tests/Makefile.am TEST_LOG_COMPILER)
AC_PATH_PROGS([BASH], [bash], [/bin/bash])
# Export LD_LIBRARY_PATH name or equivalent.
AC_SUBST(SHLIBPATH_VAR,$shlibpath_var)
@@ -100,6 +164,9 @@ AX_CHECK_COMPILE_FLAG([-fstack-protector-strong], [DEFAULT_CFLAGS="$DEFAULT_CFLA
[AX_CHECK_COMPILE_FLAG([-fstack-protector], [DEFAULT_CFLAGS="$DEFAULT_CFLAGS -fstack-protector"], [], [-Werror])], [-Werror])
AX_CHECK_COMPILE_FLAG([-fstack-clash-protection], [DEFAULT_CFLAGS="$DEFAULT_CFLAGS -fstack-clash-protection"], [], [-Werror])
AX_CHECK_COMPILE_FLAG([-fcf-protection], [DEFAULT_CFLAGS="$DEFAULT_CFLAGS -fcf-protection"], [], [-Werror])
# backtrace() unwinds through these; armhf, unlike amd64/arm64, defaults them off
# and printed frameless crash reports.
AX_CHECK_COMPILE_FLAG([-fasynchronous-unwind-tables], [DEFAULT_CFLAGS="$DEFAULT_CFLAGS -fasynchronous-unwind-tables"], [], [-Werror])
# No --discard-all: it drops the local symbols naming every static function, so
# a trace misattributes them to the nearest surviving global. Costs 0.6% size.
AX_CHECK_LINK_FLAG([-Wl,--no-undefined], [DEFAULT_LDFLAGS="$DEFAULT_LDFLAGS -Wl,--no-undefined"])
@@ -131,6 +198,115 @@ AC_SUBST([LDFLAGS_PIE])
# Ties a crash trace from a stripped build back to its separate debug symbols.
AX_CHECK_LINK_FLAG([-Wl,--build-id], [DEFAULT_LDFLAGS="$DEFAULT_LDFLAGS -Wl,--build-id"])
# tools/macos-app.sh rewrites load commands to @rpath, which needs header room ld64 does
# not leave by default; the probe fails on GNU ld, so this self-gates on Darwin.
AX_CHECK_LINK_FLAG([-Wl,-headerpad_max_install_names],
[DEFAULT_LDFLAGS="$DEFAULT_LDFLAGS -Wl,-headerpad_max_install_names"])
### Relocatable install (#906)
# libtool records the configured libdir as an absolute rpath, so a copied tree
# cannot find libhttrack. A binary-relative rpath fixes that where the loader
# expands the token, which the BSDs disagree on: probe by running one.
AC_ARG_ENABLE([origin-rpath],
AS_HELP_STRING([--disable-origin-rpath],
[link the binaries without a binary-relative rpath]),
[hts_origin_asked=yes], [enable_origin_rpath=yes; hts_origin_asked=no])
# hts_origin_ref_make survives make's expansion and libtool's eval of the link line.
hts_origin_ref='$ORIGIN'
hts_origin_ref_make='\$$ORIGIN'
AS_CASE([$host_os], [darwin*], [hts_origin_darwin=yes], [hts_origin_darwin=no])
hts_save_prefix=$prefix
hts_save_exec_prefix=$exec_prefix
test "x$prefix" = xNONE && prefix=$ac_default_prefix
test "x$exec_prefix" = xNONE && exec_prefix=$prefix
eval hts_libdir=\"$libdir\"
eval hts_libdir=\"$hts_libdir\"
prefix=$hts_save_prefix
exec_prefix=$hts_save_exec_prefix
# Enumerated, not read from libtool's sys_lib_dlsearch_path_spec: that one is
# only augmented when /etc/ld.so.conf exists, so a sysroot or minimal container
# would let a distribution libdir through. Spelled out rather than globbed as
# /lib*, which would swallow /libfoo and /usr/libexec.
AS_CASE([$hts_libdir],
[/lib | /lib/* | /lib32 | /lib32/* | /lib64 | /lib64/* | /libx32 | /libx32/*], [hts_origin_sysdir=yes],
[/usr/lib | /usr/lib/* | /usr/lib32 | /usr/lib32/* | /usr/lib64 | /usr/lib64/* | /usr/libx32 | /usr/libx32/*], [hts_origin_sysdir=yes],
[hts_origin_sysdir=no])
ORIGIN_RPATH=no
RPATH_ORIGIN_LDFLAGS=""
if test "x$enable_origin_rpath" = xno; then
AC_MSG_NOTICE([binary-relative rpath disabled by request])
elif test "x$hts_origin_darwin" = xyes; then
# dyld reads LC_RPATH only for an @rpath/ load path, and libtool stamps the
# dylib with an absolute -install_name, so the entry would never be consulted.
AC_MSG_NOTICE([binary-relative rpath not used: libtool records an absolute install_name on Darwin])
elif test "x$enable_shared" = xno; then
AC_MSG_NOTICE([binary-relative rpath not needed: no shared libraries])
elif test "x$hts_origin_sysdir" = xyes; then
# A distribution libdir is already searched, and an rpath there is a lintian tag.
AC_MSG_NOTICE([binary-relative rpath not used: $hts_libdir is a system libdir])
elif test "x$cross_compiling" = xyes && test "x$hts_origin_asked" = xno; then
AC_MSG_NOTICE([binary-relative rpath not probed: cross compiling, pass --enable-origin-rpath to force it])
else
AC_MSG_CHECKING([whether the loader honours a binary-relative rpath])
AC_CACHE_VAL([hts_cv_origin_rpath], [
hts_cv_origin_rpath=no
# Cross compiling cannot run the probe, so take the stricter spelling first.
hts_origin_cands="none origin"
test "x$cross_compiling" = xyes && hts_origin_cands="origin none"
rm -rf conftest.origin
AS_MKDIR_P([conftest.origin/bin])
AS_MKDIR_P([conftest.origin/lib])
AS_MKDIR_P([conftest.origin/run])
cat >conftest.origin/lib.c <<_ACEOF
int hts_origin_probe(void);
int hts_origin_probe(void) { return 42; }
_ACEOF
cat >conftest.origin/main.c <<_ACEOF
int hts_origin_probe(void);
int main(void) { return hts_origin_probe() == 42 ? 0 : 1; }
_ACEOF
hts_origin_mklib="$CC $CFLAGS -fPIC -shared -o conftest.origin/lib/libhtsorigin.so conftest.origin/lib.c"
hts_origin_link="-Lconftest.origin/lib -lhtsorigin"
if $hts_origin_mklib >&AS_MESSAGE_LOG_FD 2>&1; then
for hts_origin_cand in $hts_origin_cands; do
# Solaris and the older BSDs expand the token only with -z origin.
hts_origin_try=
test "x$hts_origin_cand" = xorigin && hts_origin_try=-Wl,-z,origin
$CC $CFLAGS $LDFLAGS -o conftest.origin/bin/probe conftest.origin/main.c \
$hts_origin_link $hts_origin_try "-Wl,-rpath,$hts_origin_ref/../lib" \
>&AS_MESSAGE_LOG_FD 2>&1 || continue
# From an unrelated cwd, so a loader taking the token literally fails.
if test "x$cross_compiling" = xyes ||
(unset LD_LIBRARY_PATH
cd conftest.origin/run && ../bin/probe) >&AS_MESSAGE_LOG_FD 2>&1; then
hts_cv_origin_rpath=$hts_origin_cand
break
fi
done
fi
rm -rf conftest.origin
])
AS_CASE([$hts_cv_origin_rpath],
[no], [AC_MSG_RESULT([no])],
[
# $(libdir) first, so the token only answers once the configured
# libdir is gone: $(bindir)/../lib is a different directory under a
# lib64 or split-bindir layout and must not shadow it.
RPATH_ORIGIN_LDFLAGS='-Wl,-rpath,$(libdir)'
test "x$hts_cv_origin_rpath" = xorigin && RPATH_ORIGIN_LDFLAGS="$RPATH_ORIGIN_LDFLAGS -Wl,-z,origin"
RPATH_ORIGIN_LDFLAGS="$RPATH_ORIGIN_LDFLAGS -Wl,-rpath,$hts_origin_ref_make/../lib"
ORIGIN_RPATH=yes
AC_MSG_RESULT([yes ($hts_origin_ref/../lib)])
])
fi
AC_SUBST([ORIGIN_RPATH])
AC_SUBST([RPATH_ORIGIN_LDFLAGS])
### Check for -fvisibility=hidden support
gl_VISIBILITY
AM_CFLAGS="$AM_CFLAGS $CFLAG_VISIBILITY"
@@ -360,5 +536,6 @@ html/Makefile
libtest/Makefile
tests/Makefile
fuzz/Makefile
tools/Info.plist
])
AC_OUTPUT

10
debian/changelog vendored
View File

@@ -1,3 +1,13 @@
httrack (3.49.16-1) unstable; urgency=medium
* New upstream release: a stack overflow in the cache header writer, which a
server's response headers could trigger in httrack and libhttrack3 as well
as in proxytrack, and a ProxyTrack DAV buffer overflow; chunked trailer
handling, relocatable installs, crash-report backtraces on armhf, a hicolor
icon theme and translation fixes; full list in history.txt.
-- Xavier Roche <xavier@debian.org> Tue, 04 Aug 2026 18:32:40 +0200
httrack (3.49.15-1) unstable; urgency=medium
* New upstream release: single-file mirrors with inlined assets, sitemap

14
fuzz/.gitignore vendored Normal file
View File

@@ -0,0 +1,14 @@
# Anchored: a glob like /fuzz-* would also swallow the tracked fuzz-*.c sources.
/fuzz-charset
/fuzz-meta
/fuzz-idna
/fuzz-entities
/fuzz-unescape
/fuzz-filters
/fuzz-url
/fuzz-header
/fuzz-cachendx
/fuzz-htsparse
/fuzz-singlefile
/fuzz-sitemap
/fuzz-arc

View File

@@ -2,7 +2,7 @@
if FUZZERS
noinst_PROGRAMS = fuzz-charset fuzz-meta fuzz-idna fuzz-entities \
fuzz-unescape fuzz-filters fuzz-url fuzz-header fuzz-cachendx \
fuzz-htsparse fuzz-singlefile fuzz-sitemap
fuzz-htsparse fuzz-singlefile fuzz-sitemap fuzz-arc
endif
AM_CPPFLAGS = \
@@ -30,6 +30,11 @@ fuzz_htsparse_SOURCES = fuzz-htsparse.c fuzz.h
fuzz_singlefile_SOURCES = fuzz-singlefile.c fuzz.h
fuzz_sitemap_SOURCES = fuzz-sitemap.c fuzz.h
# proxytrack does not link libhttrack, so its store compiles into the harness;
# coucal, minizip and md5 still come from the static libhttrack above.
fuzz_arc_SOURCES = fuzz-arc.c fuzz.h $(top_srcdir)/src/proxy/store.c
fuzz_arc_CPPFLAGS = $(AM_CPPFLAGS) -DZLIB_CONST
# List corpus files explicitly: automake does not expand EXTRA_DIST globs.
EXTRA_DIST = README.md run-fuzzers.sh \
corpus/charset/utf8.txt corpus/charset/latin1.txt corpus/charset/sjis.txt \
@@ -55,4 +60,6 @@ EXTRA_DIST = README.md run-fuzzers.sh \
corpus/singlefile/srcset.html corpus/singlefile/rawtext.html \
corpus/singlefile/malformed.html corpus/singlefile/many-attrs.html \
corpus/sitemap/urlset.xml corpus/sitemap/sitemapindex.xml \
corpus/sitemap/truncated.xml corpus/sitemap/urlset.xml.gz
corpus/sitemap/truncated.xml corpus/sitemap/urlset.xml.gz \
corpus/arc/roundtrip.arc corpus/arc/truncated.arc \
corpus/arc/regress-null-body.arc

View File

@@ -13,3 +13,5 @@ bash /path/to/httrack/fuzz/run-fuzzers.sh fuzz 60 # 60s per target
```
Run one target by hand: `fuzz/fuzz-url -max_total_time=300 corpusdir fuzz/corpus/url`. Seed corpora live in `corpus/<target>/`; a crash reproducer is replayed with `fuzz/fuzz-url crash-file`.
`fuzz-arc` is the odd one out: it drives proxytrack's `.arc` reader the way `--convert` does, through a temp file rather than a buffer, and it compiles `src/proxy/store.c` into the harness because proxytrack does not link libhttrack. Both readers and the writer print to stderr on malformed input, so pass `-close_fd_mask=2` for anything longer than a corpus replay.

View File

@@ -0,0 +1,9 @@
filedesc://t.arc 0.0.0.0 20250101000000 text/plain 200 - - 0 t.arc 9
2 0 test
http://example.com/p.html 0.0.0.0 20250101000000 text/html -1 - - 0 t.arc 77
HTTP/1.1 -1 Broken
Content-Type: text/html
Content-Length: 10

View File

@@ -0,0 +1,11 @@
filedesc://t.arc 0.0.0.0 20250101000000 text/plain 200 - - 0 t.arc 9
2 0 test
http://example.com/p.html 0.0.0.0 20250101000000 text/html 200 - - 0 t.arc 120
HTTP/1.1 200 OK
Content-Type: text/html
Last-Modified: Wed, 01 Jan 2025 00:00:00 GMT
Content-Length: 10
BODYMARKER

View File

@@ -0,0 +1,9 @@
filedesc://t.arc 0.0.0.0 20250101000000 text/plain 200 - - 0 t.arc 9
2 0 test
http://example.com/q.html 0.0.0.0 20250101000000 text/html 200 - - 0 t.arc 2000000000
HTTP/1.1 200 OK
Content-Type: text/html
HI

106
fuzz/fuzz-arc.c Normal file
View File

@@ -0,0 +1,106 @@
/* ------------------------------------------------------------ */
/*
HTTrack Website Copier, Offline Browser for Windows and Unix
Copyright (C) 2026 Xavier Roche and other contributors
SPDX-License-Identifier: GPL-3.0-or-later
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
Ethical use: we kindly ask that you NOT use this software to harvest email
addresses or to collect any other private information about people. Doing so
would dishonor our work and waste the many hours we have spent on it.
Please visit our Website: http://www.httrack.com
*/
/* Fuzz proxytrack's .arc reader the way `--convert` drives it: the record loop
seeks on lengths read from the file, and every entry reaches a writer. */
#include "fuzz.h"
#include <stdarg.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include "coucal.h"
#include "proxy/store.h"
/* An .arc past this size says nothing a smaller one cannot. */
#define FUZZ_ARC_MAXSIZE (1024 * 1024)
static char arc_dir[256];
static char arc_in[sizeof(arc_dir) + sizeof("/in.arc")];
static char arc_out[sizeof(arc_dir) + sizeof("/out.arc")];
static void fuzz_arc_cleanup(void) {
(void) unlink(arc_in);
(void) unlink(arc_out);
(void) rmdir(arc_dir);
}
/* proxytrack's main() installs one; without it coucal logs stats per free */
static void fuzz_arc_coucal_log(coucal_opaque arg, coucal_loglevel level,
const char *format, va_list args) {
(void) arg;
(void) level;
(void) format;
(void) args;
}
/* PT_GetType() picks the format from the extension, so the names end in .arc */
static int fuzz_arc_setup(void) {
if (arc_in[0] == '\0') {
const char *const tmp = getenv("TMPDIR");
coucal_set_global_assert_handler(fuzz_arc_coucal_log, NULL);
snprintf(arc_dir, sizeof(arc_dir), "%s/fuzz-arc-XXXXXX",
tmp != NULL && *tmp != '\0' ? tmp : "/tmp");
if (mkdtemp(arc_dir) == NULL) {
return -1;
}
snprintf(arc_out, sizeof(arc_out), "%s/out.arc", arc_dir);
snprintf(arc_in, sizeof(arc_in), "%s/in.arc", arc_dir);
atexit(fuzz_arc_cleanup);
}
return 0;
}
int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
PT_Indexes indexes;
FILE *fp;
hts_boolean written;
if (size > FUZZ_ARC_MAXSIZE || fuzz_arc_setup() != 0) {
return 0;
}
if ((fp = fopen(arc_in, "wb")) == NULL) {
return 0;
}
written = fwrite(data, 1, size, fp) == size ? HTS_TRUE : HTS_FALSE;
if (fclose(fp) != 0 || !written) {
return 0;
}
indexes = PT_New();
if (indexes != NULL) {
if (PT_AddIndex(indexes, arc_in) > 0) {
/* the writer reads back every entry the loader indexed */
(void) PT_SaveCache(indexes, arc_out);
}
PT_Delete(indexes);
}
return 0;
}

View File

@@ -38,7 +38,7 @@ Please visit our Website: http://www.httrack.com
#include "htsbase.h"
/* Heap NUL-terminated copy of the fuzzer input, so ASan bounds every read. */
static char *fuzz_strdup(const uint8_t *data, size_t size) {
HTS_UNUSED static char *fuzz_strdup(const uint8_t *data, size_t size) {
char *s = malloct(size + 1);
memcpy(s, data, size);

View File

@@ -4,6 +4,26 @@ HTTrack Website Copier release history:
This file lists all changes and fixes that have been made for HTTrack
3.49-16
+ New: macOS ships a signed and notarized HTTrack.app with its own icon, bundling the OpenSSL it needs so a downloaded copy launches (#890, #900, #901, #950)
+ New: the desktop icons install into the hicolor theme, scalable SVG included, so Icon=httrack resolves in a launcher (#932, #933)
+ Fixed: an unauthenticated PROPFIND overflowed the ProxyTrack DAV item buffer (#836)
+ Fixed: response headers from the server overflowed the stack buffer holding the cache header block, in both httrack and ProxyTrack (#841)
+ Fixed: a chunked response carrying trailers was rejected as "Invalid chunk" (#855)
+ Fixed: an over-long URL aborted the whole mirror inside the cache instead of reading as a miss (#935, #936)
+ Fixed: ProxyTrack could not re-read the .arc it writes, and crashed on a record whose body it could not read (#834, #929, #931)
+ Fixed: ProxyTrack logged a hashtable stats line and every PROPFIND body to stderr (#911, #918)
+ Fixed: the frozen-slot spool was written inside the mirror namespace, so it landed in the mirrored tree (#859)
+ Fixed: a stack overflow killed httrack with no diagnostic, crash reports named no frame of the executable, and on armhf they had no frames at all (#866, #889, #892)
+ Fixed: an install moved away from its configured prefix could not find its data directory, its shared library, or the html symlink (#885, #887, #894, #906)
+ Fixed: tooltips in the web GUI broke on a translation containing an apostrophe; the escaping now also covers quotes, backslashes, markup and DBCS lead bytes (#864)
+ Fixed: nine strings of the Windows GUI's option dialogs were untranslated in 26 of the 30 language files, and six language files disagreed with their own declared charset (#863, #963)
+ Fixed: the AppStream metainfo still advertised WebHTTrack 3.49.8 (#884)
+ Fixed: the installed development headers did not compile standalone (#943)
+ Fixed: configure discarded a user-supplied BASH_SHELL, resolved bash to /bin/sh on macOS, and hung on one pointing at a FIFO (#891, #895, #908, #922)
+ Changed: the masthead wordmark and the rings background are SVG, so they stay sharp on a hi-DPI screen (#910, #916)
+ Changed: multiple internal hardening, build, test and CI improvements
3.49-15
+ New: --single-file rewrites each saved page with its assets inlined as data: URIs (#713)
+ New: --changes reports what a crawl added, updated or removed against the previous mirror (#714)
@@ -128,7 +148,7 @@ This file lists all changes and fixes that have been made for HTTrack
+ Fixed: report why a -%L URL list could not be loaded (#49)
+ Changed: multiple internal hardening, build and CI improvements
.49-9
3.49-9
+ Fixed: file-type detection from the Content-Type header: trust a declared type over a binary URL extension, honor --assume under the delayed type check, and keep a known extension against a bogus or empty Content-Type (#267, #29, #56)
+ Fixed: an uninitialized-buffer read when the Content-Type is empty (#411)
+ Fixed: restored C++ source-compatibility of the installed headers so reverse dependencies (httraqt) build again (#413)

View File

@@ -11,6 +11,10 @@ WebPixmapdir = $(datadir)/pixmaps
WebIcon16x16dir = $(datadir)/icons/hicolor/16x16/apps
WebIcon32x32dir = $(datadir)/icons/hicolor/32x32/apps
WebIcon48x48dir = $(datadir)/icons/hicolor/48x48/apps
WebIcon64x64dir = $(datadir)/icons/hicolor/64x64/apps
WebIcon128x128dir = $(datadir)/icons/hicolor/128x128/apps
WebIcon256x256dir = $(datadir)/icons/hicolor/256x256/apps
WebIconScalabledir = $(datadir)/icons/hicolor/scalable/apps
VFolderEntrydir = $(prefix)/share/applications
MetaInfodir = $(datadir)/metainfo
@@ -26,24 +30,22 @@ HelpHtmlimages_DATA = $(srcdir)/images/*
HelpHtmlTxt_DATA = ../greetings.txt ../history.txt ../license.txt
WebHtml_DATA = $(srcdir)/server/*.html $(srcdir)/server/*.js $(srcdir)/server/*.css
WebHtmlimages_DATA = $(srcdir)/server/images/*
# note: converted & normalized by
# ico2xpm favicon.ico -o httrack.xpm
# mogrify -format xpm -map /usr/share/doc/menu/examples/cmap.xpm httrack.xpm
# Generated from the brand master by gen/export.py. Asserted by tests/160.
# httrack.xpm duplicates the 32x32 one under the bare basename the .desktop
# Icon= key falls back to here when no icon theme is installed (#932).
WebPixmap_DATA = $(srcdir)/server/div/*.xpm
WebIcon16x16_DATA = $(srcdir)/server/div/16x16/*.png
WebIcon32x32_DATA = $(srcdir)/server/div/32x32/*.png
WebIcon48x48_DATA = $(srcdir)/server/div/48x48/*.png
WebIcon64x64_DATA = $(srcdir)/server/div/64x64/*.png
WebIcon128x128_DATA = $(srcdir)/server/div/128x128/*.png
WebIcon256x256_DATA = $(srcdir)/server/div/256x256/*.png
WebIconScalable_DATA = $(srcdir)/server/div/scalable/*.svg
VFolderEntry_DATA = $(srcdir)/server/div/*.desktop
MetaInfo_DATA = $(srcdir)/server/div/*.metainfo.xml
EXTRA_DIST = $(HelpHtml_DATA) $(HelpHtmlimg_DATA) $(HelpHtmlimages_DATA) \
$(HelpHtmldiv_DATA) $(WebHtml_DATA) $(WebHtmlimages_DATA) \
$(WebPixmap_DATA) $(WebIcon16x16_DATA) $(WebIcon32x32_DATA) $(WebIcon48x48_DATA) \
$(VFolderEntry_DATA) $(MetaInfo_DATA)
install-data-hook:
if test ! -L $(DESTDIR)$(prefix)/share/httrack/html ; then \
( cd $(DESTDIR)$(prefix)/share/httrack \
&& $(LN_S) $(htmldir) html \
) \
fi
$(WebIcon64x64_DATA) $(WebIcon128x128_DATA) $(WebIcon256x256_DATA) \
$(WebIconScalable_DATA) $(VFolderEntry_DATA) $(MetaInfo_DATA)

View File

@@ -16,7 +16,7 @@
<a class="skip" href="#main">Skip to content</a>
<header class="masthead">
<img src="images/header_title_4.gif" width="400" height="34" alt="HTTrack Website Copier">
<img src="images/wordmark.svg" width="400" height="36" alt="HTTrack Website Copier">
<div class="tagline">Open Source offline browser</div>
</header>

View File

@@ -16,7 +16,7 @@
<a class="skip" href="#main">Skip to content</a>
<header class="masthead">
<img src="images/header_title_4.gif" width="400" height="34" alt="HTTrack Website Copier">
<img src="images/wordmark.svg" width="400" height="36" alt="HTTrack Website Copier">
<div class="tagline">Open Source offline browser</div>
</header>

View File

@@ -16,7 +16,7 @@
<a class="skip" href="#main">Skip to content</a>
<header class="masthead">
<img src="images/header_title_4.gif" width="400" height="34" alt="HTTrack Website Copier">
<img src="images/wordmark.svg" width="400" height="36" alt="HTTrack Website Copier">
<div class="tagline">Open Source offline browser</div>
</header>

View File

@@ -16,7 +16,7 @@
<a class="skip" href="#main">Skip to content</a>
<header class="masthead">
<img src="images/header_title_4.gif" width="400" height="34" alt="HTTrack Website Copier">
<img src="images/wordmark.svg" width="400" height="36" alt="HTTrack Website Copier">
<div class="tagline">Open Source offline browser</div>
</header>

View File

@@ -26,7 +26,7 @@
<a class="skip" href="#main">Skip to content</a>
<header class="masthead">
<img src="images/header_title_4.gif" width="400" height="34" alt="HTTrack Website Copier">
<img src="images/wordmark.svg" width="400" height="36" alt="HTTrack Website Copier">
<div class="tagline">Open Source offline browser</div>
</header>

View File

@@ -16,7 +16,7 @@
<a class="skip" href="#main">Skip to content</a>
<header class="masthead">
<img src="images/header_title_4.gif" width="400" height="34" alt="HTTrack Website Copier">
<img src="images/wordmark.svg" width="400" height="36" alt="HTTrack Website Copier">
<div class="tagline">Open Source offline browser</div>
</header>

View File

@@ -57,13 +57,21 @@ body {
padding: .6rem 0 0;
}
.masthead img { display: block; max-width: 100%; height: auto; }
/* Take back the whitespace the SVG carries around the letters, restoring the old bitmap's spacing. */
.masthead img {
display: block;
max-width: 100%;
height: auto;
margin: -1.7px 0 -1.1px;
}
.masthead .tagline {
background: #000;
color: #fff;
font-weight: bold;
padding: .25rem .4rem;
/* A one-line label has no use for the body's prose leading. */
line-height: 1;
padding: .3rem .4rem;
margin-top: .4rem;
}
@@ -72,14 +80,14 @@ body {
background: var(--panel);
border-bottom: 6px solid #000;
padding: 1.5rem;
/* The rings the 2007 pages carried. The image has the light panel colour baked
into it, so it is dropped rather than inverted in dark mode. */
background-image: url(images/bg_rings.gif);
/* The rings the 2007 pages carried. Transparent, so it rides on --panel. */
background-image: url(images/bg_rings.svg);
background-repeat: no-repeat;
background-position: top right;
}
@media (prefers-color-scheme: dark) {
/* Rings dropped, not inverted: their lavender is a light-panel tone. */
.wrap { background-image: none; }
/* The wordmark is black on transparent, and all but vanishes on the dark field. */

View File

@@ -16,7 +16,7 @@
<a class="skip" href="#main">Skip to content</a>
<header class="masthead">
<img src="images/header_title_4.gif" width="400" height="34" alt="HTTrack Website Copier">
<img src="images/wordmark.svg" width="400" height="36" alt="HTTrack Website Copier">
<div class="tagline">Open Source offline browser</div>
</header>

View File

@@ -16,7 +16,7 @@
<a class="skip" href="#main">Skip to content</a>
<header class="masthead">
<img src="images/header_title_4.gif" width="400" height="34" alt="HTTrack Website Copier">
<img src="images/wordmark.svg" width="400" height="36" alt="HTTrack Website Copier">
<div class="tagline">Open Source offline browser</div>
</header>

View File

@@ -16,7 +16,7 @@
<a class="skip" href="#main">Skip to content</a>
<header class="masthead">
<img src="images/header_title_4.gif" width="400" height="34" alt="HTTrack Website Copier">
<img src="images/wordmark.svg" width="400" height="36" alt="HTTrack Website Copier">
<div class="tagline">Open Source offline browser</div>
</header>

View File

@@ -16,7 +16,7 @@
<a class="skip" href="#main">Skip to content</a>
<header class="masthead">
<img src="images/header_title_4.gif" width="400" height="34" alt="HTTrack Website Copier">
<img src="images/wordmark.svg" width="400" height="36" alt="HTTrack Website Copier">
<div class="tagline">Open Source offline browser</div>
</header>
@@ -66,7 +66,7 @@ the screenshots and notes follow along.</p>
<div class="platforms" role="group" aria-label="Choose your version">
<button type="button" data-platform="win" aria-pressed="false">WinHTTrack <small>Windows</small></button>
<button type="button" data-platform="web" aria-pressed="false">WebHTTrack <small>Linux and Unix</small></button>
<button type="button" data-platform="web" aria-pressed="false">WebHTTrack <small>Linux, macOS and Unix</small></button>
<button type="button" data-platform="droid" aria-pressed="false">HTTrack <small>Android</small></button>
</div>
@@ -125,6 +125,11 @@ data-for="droid">Tap <b>Next</b></span> to create a project, or open one you alr
<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
<code>webhttrack</code> in a terminal; either way the interface opens in your browser and
behaves exactly as described here.</p>
<h2 id="step-project">2. Name the project</h2>
<p>A project is one mirror: its name becomes the folder your files land in, so give it something

View File

@@ -37,7 +37,7 @@ a:active { text-decoration: underline; }
border-bottom: 6px solid #000;
padding: 10px; padding-top: 20px;
line-height: 1.65em;
background-image: url(images/bg_rings.gif);
background-image: url(images/bg_rings.svg);
background-repeat: no-repeat;
background-position: top right;
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.1 KiB

8
html/images/bg_rings.svg Normal file
View File

@@ -0,0 +1,8 @@
<svg xmlns="http://www.w3.org/2000/svg" width="501" height="456" viewBox="0 0 501 456">
<title>HTTrack rings</title>
<!-- Transparent, unlike the GIF this replaces: the panel's own #ccd shows through. -->
<g fill="#b9b9d0" fill-rule="evenodd">
<path d="M614.59 346.3A323.36 197.55 21.16 1 0 11.46 112.89A323.36 197.55 21.16 1 0 614.59 346.3 ZM590.57 315.66A262.58 160.99 22.18 1 0 104.26 117.43A262.58 160.99 22.18 1 0 590.57 315.66 Z"/>
<path d="M578.08 292.16A185.6 113.57 21.23 1 0 232.08 157.73A185.6 113.57 21.23 1 0 578.08 292.16 ZM564.4 274.56A150.77 92.55 22.26 1 0 285.34 160.32A150.77 92.55 22.26 1 0 564.4 274.56 Z"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 641 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.9 KiB

1
html/images/wordmark.svg Normal file

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 7.1 KiB

View File

@@ -13,7 +13,7 @@
<a class="skip" href="#main">Skip to content</a>
<header class="masthead">
<img src="images/header_title_4.gif" width="400" height="34" alt="HTTrack Website Copier">
<img src="images/wordmark.svg" width="400" height="36" alt="HTTrack Website Copier">
<div class="tagline">Open Source offline browser</div>
</header>

View File

@@ -16,7 +16,7 @@
<a class="skip" href="#main">Skip to content</a>
<header class="masthead">
<img src="images/header_title_4.gif" width="400" height="34" alt="HTTrack Website Copier">
<img src="images/wordmark.svg" width="400" height="36" alt="HTTrack Website Copier">
<div class="tagline">Open Source offline browser</div>
</header>

View File

@@ -16,7 +16,7 @@
<a class="skip" href="#main">Skip to content</a>
<header class="masthead">
<img src="images/header_title_4.gif" width="400" height="34" alt="HTTrack Website Copier">
<img src="images/wordmark.svg" width="400" height="36" alt="HTTrack Website Copier">
<div class="tagline">Open Source offline browser</div>
</header>

View File

@@ -16,7 +16,7 @@
<a class="skip" href="#main">Skip to content</a>
<header class="masthead">
<img src="images/header_title_4.gif" width="400" height="34" alt="HTTrack Website Copier">
<img src="images/wordmark.svg" width="400" height="36" alt="HTTrack Website Copier">
<div class="tagline">Open Source offline browser</div>
</header>

View File

@@ -16,7 +16,7 @@
<a class="skip" href="#main">Skip to content</a>
<header class="masthead">
<img src="images/header_title_4.gif" width="400" height="34" alt="HTTrack Website Copier">
<img src="images/wordmark.svg" width="400" height="36" alt="HTTrack Website Copier">
<div class="tagline">Open Source offline browser</div>
</header>

View File

@@ -4,7 +4,7 @@
<meta http-equiv="Content-Type" content="text/html; charset=${LANGUAGE_CHARSET}" />
<meta name="description" content="${LANG_METADESC}" />
<meta name="keywords" content="${LANG_METAKEYW}" />
<title>'${projname}' - HTTrack Website Copier</title>
<title>'${html:projname}' - HTTrack Website Copier</title>
<link rel="stylesheet" type="text/css" media="screen" href="style.css">
@@ -28,7 +28,7 @@ function info(str) {
<table width="76%" border="0" align="center" cellspacing="0" cellpadding="0" class="tableWidth">
<tr>
<td><img src="images/header_title_4.gif" width="400" height="34" alt="HTTrack Website Copier" title="" border="0" id="title" /></td>
<td><img src="images/wordmark.svg" width="400" height="36" alt="HTTrack Website Copier" title="" border="0" id="title" /></td>
</tr>
</table>
@@ -69,7 +69,7 @@ ${LANG_K3} : ${HTTRACK_WEB}
<form>
<input type="button" value="OK" onClick="window.close();"
title='${html:LANG_TIPOK}' onMouseOver="info('${html:LANG_TIPOK}'); return true" onMouseOut="info('&nbsp;'); return true"
title='${html:LANG_TIPOK}' onMouseOver="info('${js:LANG_TIPOK}'); return true" onMouseOut="info('&nbsp;'); return true"
>
</form>

View File

@@ -4,7 +4,7 @@
<meta http-equiv="Content-Type" content="text/html; charset=${LANGUAGE_CHARSET}" />
<meta name="description" content="${LANG_METADESC}" />
<meta name="keywords" content="${LANG_METAKEYW}" />
<title>'${projname}' - HTTrack Website Copier</title>
<title>'${html:projname}' - HTTrack Website Copier</title>
@@ -64,7 +64,7 @@ function info(str) {
<table width="76%" border="0" align="center" cellspacing="0" cellpadding="0" class="tableWidth">
<tr>
<td><img src="images/header_title_4.gif" width="400" height="34" alt="HTTrack Website Copier" title="" border="0" id="title" /></td>
<td><img src="images/wordmark.svg" width="400" height="36" alt="HTTrack Website Copier" title="" border="0" id="title" /></td>
</tr>
</table>
<table width="76%" border="0" align="center" cellspacing="0" cellpadding="3" class="tableWidth">
@@ -73,7 +73,7 @@ function info(str) {
<td id="subTitle" align="right">
<a href="/server/file.html" target="_blank"
onClick="window.open('/server/file.html', 'help', 'toolbar=no, location=no, directories=no, status=yes, menubar=no, scrollbars=yes, resizable=yes, width=640, height=480'); return false"
title='${html:LANG_O1}' onMouseOver="info('${html:LANG_O1}'); return true" onMouseOut="info('&nbsp;'); return true"
title='${html:LANG_O1}' onMouseOver="info('${js:LANG_O1}'); return true" onMouseOut="info('&nbsp;'); return true"
style="color:#FFFFFF"
>
${LANG_O1}
@@ -85,7 +85,7 @@ ${do:if-file-exists:html/index.html}
<td id="subTitle" align="right">
<a href="/index.html" target="_blank"
onClick="window.open('/server/help.html', 'help', 'toolbar=no, location=no, directories=no, status=yes, menubar=no, scrollbars=yes, resizable=yes, width=640, height=480'); return false"
title='${html:LANG_TIPHELP}' onMouseOver="info('${html:LANG_TIPHELP}'); return true" onMouseOut="info('&nbsp;'); return true"
title='${html:LANG_TIPHELP}' onMouseOver="info('${js:LANG_TIPHELP}'); return true" onMouseOut="info('&nbsp;'); return true"
style="color:#FFFFFF"
>
${LANG_O5}
@@ -118,20 +118,20 @@ ${do:end-if}
<form action="${thisfile}" name="form">
<table width="100%">
<tr><td>${LANG_T2}</td><td>http://<input name="urladr"
title='${html:LANG_T10}' onMouseOver="info('${html:LANG_T10}'); return true" onMouseOut="info('&nbsp;'); return true"
title='${html:LANG_T10}' onMouseOver="info('${js:LANG_T10}'); return true" onMouseOut="info('&nbsp;'); return true"
></td></tr>
<tr><td colspan=2>
<table width="100%">
<th>${LANG_T4}</th>
<tr><td>${LANG_T5}:</td><td><input name="urllogin"
title='${html:LANG_T12}' onMouseOver="info('${html:LANG_T12}'); return true" onMouseOut="info('&nbsp;'); return true"
title='${html:LANG_T12}' onMouseOver="info('${js:LANG_T12}'); return true" onMouseOut="info('&nbsp;'); return true"
></td></tr>
<tr><td>${LANG_T6}:</td><td><input name="urlpass"
title='${html:LANG_T13}' onMouseOver="info('${html:LANG_T13}'); return true" onMouseOut="info('&nbsp;'); return true"
title='${html:LANG_T13}' onMouseOver="info('${js:LANG_T13}'); return true" onMouseOut="info('&nbsp;'); return true"
></td></tr>
<tr><td>${LANG_T7}:</td><td><input type="button" value="${LANG_T8}" onClick="alert('not yet implemented!')"
title='${html:LANG_T14}' onMouseOver="info('${html:LANG_T14}'); return true" onMouseOut="info('&nbsp;'); return true"
title='${html:LANG_T14}' onMouseOver="info('${js:LANG_T14}'); return true" onMouseOut="info('&nbsp;'); return true"
></td></tr>
</table>
@@ -139,7 +139,7 @@ ${do:end-if}
<tr><td>
<input type="button" value="OK" onClick="if (do_add()) { window.close(); }"
title='${html:LANG_TIPOK}' onMouseOver="info('${html:LANG_TIPOK}'); return true" onMouseOut="info('&nbsp;'); return true"
title='${html:LANG_TIPOK}' onMouseOver="info('${js:LANG_TIPOK}'); return true" onMouseOut="info('&nbsp;'); return true"
>
</td></tr>

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 173 B

After

Width:  |  Height:  |  Size: 447 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 230 B

After

Width:  |  Height:  |  Size: 628 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.5 KiB

After

Width:  |  Height:  |  Size: 752 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 765 B

View File

@@ -49,7 +49,83 @@
</screenshot>
</screenshots>
<content_rating type="oars-1.1"/>
<!-- Newest first; tests/01_engine-version-macros.test enforces it. -->
<releases>
<release version="3.49.8" date="2026-06-07"/>
<release version="3.49.16" date="2026-08-04">
<description>
<ul>
<li>The application has its own icon in the desktop menu, at any screen size</li>
<li>Option tooltips no longer break in languages whose text contains quotes or other special characters</li>
<li>Croatian, Macedonian, Polish, Slovak, Slovenian and Swedish text no longer shows as mangled characters</li>
<li>Pages that failed with an "Invalid chunk" error now download correctly</li>
<li>A very long web address no longer aborts the whole mirror</li>
</ul>
</description>
</release>
<release version="3.49.15" date="2026-07-30">
<description>
<ul>
<li>Save a page and everything it needs as one self-contained file</li>
<li>Read a site's sitemap, so pages nothing links to are still found</li>
<li>See what a new pass added, updated or removed</li>
<li>Updating a mirror no longer destroys a good local copy when a download fails or is interrupted</li>
<li>In the web interface, options ticked by default can be un-ticked again, the size limit applies to the whole site, and the finished mirror opens from its link</li>
</ul>
</description>
</release>
<release version="3.49.14" date="2026-07-24">
<description>
<ul>
<li>Save a mirror as a web archive, indexed and packaged for replay</li>
<li>Choose what the page footer says</li>
<li>A mirror saved to a folder with accented characters in its name lands in the right place</li>
</ul>
</description>
</release>
<release version="3.49.13" date="2026-07-18">
<description>
<ul>
<li>Mirror through a SOCKS5 proxy</li>
<li>Files of 2 GB and over are handled correctly on Windows and on 32-bit systems</li>
<li>The web interface offers options that used to be command-line only, among them a cookies file and a pause between downloads</li>
</ul>
</description>
</release>
<release version="3.49.12" date="2026-07-10">
<description>
<p>Links carrying accented characters are followed again, a page wrongly labelled as compressed is no longer lost, and a new option explains why a given address is kept or skipped.</p>
</description>
</release>
<release version="3.49.11" date="2026-07-05">
<description>
<ul>
<li>Audio and video sources are mirrored along with the page</li>
<li>A site's robots.txt is followed more closely, including its Allow rules and wildcards</li>
<li>A time limit now stops a slow download instead of waiting for it to end</li>
</ul>
</description>
</release>
<release version="3.49.10" date="2026-06-28">
<description>
<ul>
<li>Start from a cookies file, and space downloads out with a random pause</li>
<li>Ignore chosen query parameters when naming saved files</li>
<li>Resuming a partial download no longer duplicates bytes</li>
</ul>
</description>
</release>
<release version="3.49.9" date="2026-06-21">
<description>
<p>Saved files get the right type when the server and the address disagree about it.</p>
</description>
</release>
<release version="3.49.8" date="2026-06-20">
<description>
<ul>
<li>Secure downloads can go through a plain web proxy</li>
<li>Every size of a responsive image is fetched</li>
</ul>
</description>
</release>
</releases>
</component>

View File

@@ -0,0 +1,55 @@
/* XPM */
static char *httrack[] = {
/* columns rows colors chars-per-pixel */
"32 32 17 1 ",
" c #060606",
". c #1C1C25",
"X c #292935",
"o c #3D3D50",
"O c #46465D",
"+ c #595976",
"@ c #727297",
"# c #7D7DA6",
"$ c #8E8EBD",
"% c #8686B3",
"& c #8686B3",
"* c #9999CC",
"= c #9A9ACD",
"- c #9A9ACE",
"; c #9B9BCF",
": c #9C9CD0",
"> c #9999CD",
/* pixels */
"********************************",
"********************************",
"********************************",
"********************************",
"********************************",
"********************************",
"********************************",
"***:::*******::***::::*;:::::***",
"**#+++$*****#+++$&+++++++++++#**",
"*:+ #*****O %@ +:*",
"*:+ #*****+ %@ +:*",
"*:+ #*****+ %#XXX. .XXX@**",
"*:+ #:***:+ #****@ +******",
"**+ @&&&&&O #***:@ +******",
"*:+ ..... #****@ +******",
"*:+ #****@ +******",
"*;+ #***:@ +:*****",
"**+ +@@@@@o #***:@ +:*****",
"**+ #:***:+ #:***@ +:*****",
"**+ #*****+ #****@ +:*****",
"*:+ #:****+ %****@ +:*****",
"*:+ #:****+ %:***@ +:*****",
"*:+ #****:O #***:@ +:*****",
"**#+++$*****#+++$****%+++%******",
"***;::*******::*******:::*******",
"********************************",
"********************************",
"********************************",
"********************************",
"********************************",
"********************************",
"********************************"
};

View File

@@ -1,25 +1,37 @@
/* XPM */
static char *httrack__[] = {
static char *httrack16x16[] = {
/* columns rows colors chars-per-pixel */
"16 16 3 1",
" c #000000000000",
". c #000000008080",
"X c #808080808080",
"16 16 15 1 ",
" c #0D0D10",
". c #191921",
"X c #2A2A38",
"o c #363647",
"O c #424257",
"+ c #53536E",
"@ c #717197",
"# c #7E7EA8",
"$ c #8585B1",
"% c #9898CB",
"& c #9999CC",
"* c #9A9ACE",
"= c #9696C9",
"- c #9C9CD0",
"; c #9999CC",
/* pixels */
"X. XXXXXX .X",
"X. XXXXXX .X",
"X. XXXXXX .X",
"X. XXXXXX .X",
"X. XXXXXX .X",
"X. XXXXXX .X",
"X. .X",
"X. .X",
"X. .X",
"X. XXXXXX .X",
"X. XXXXXX .X",
"X. XXXXXX .X",
"X. XXXXXX .X",
"X. XXXXXX .X",
"X. XXXXXX .X",
"X. XXXXXX .X"
"&&&&&&&&&%%&&&&&",
"&&&&&&&&%%%%&&&&",
"&&&&&&&&%%%%&&&&",
"&%%&&&%%%%%%%%%&",
"%+o$&%+o@ooooo+%",
"%o $-%X @X. .O%",
"%o @$$X $=@ o$=&",
"%o . $-# o&&&",
"%o oOo. $-# o%&&",
"%o $-%X $-# o%&&",
"%X $&%X $-# o%&&",
"%+o$&%+o$&$o+%&&",
"%%%&&&%%&&&%%&&&",
"%%&&&&&&&&&&&&&&",
"%&&&&&&&&&&&&&&&",
"&&&&&&&&&&&&&&&&"
};

View File

@@ -1,45 +1,55 @@
/* XPM */
static char *httrack__[] = {
static char *httrack32x32[] = {
/* columns rows colors chars-per-pixel */
"32 32 7 1",
" c #040404040404",
". c #0C0C0C0C0C0C",
"X c #161616161616",
"o c #333333333333",
"O c #333333336666",
"+ c #666666669999",
"@ c #99999999CCCC",
"32 32 17 1 ",
" c #060606",
". c #1C1C25",
"X c #292935",
"o c #3D3D50",
"O c #46465D",
"+ c #595976",
"@ c #727297",
"# c #7D7DA6",
"$ c #8E8EBD",
"% c #8686B3",
"& c #8686B3",
"* c #9999CC",
"= c #9A9ACD",
"- c #9A9ACE",
"; c #9B9BCF",
": c #9C9CD0",
"> c #9999CD",
/* pixels */
"@@+ @@@@@@@@@@@+ @@@",
"@@+ @@@@@@@@@@@+ @@@",
"@@+ @@@@@@@@@@@+ @@@",
"@@+ @@@@@@@@@@@+ @@@",
"@@+ @@@@@@@@@@@+ @@@",
"@@+ @@@@@@@@@@@+ @@@",
"@@+ @@@@@@@@@@@+ @@@",
"@@+ @@@@@@@@@@@+ @@@",
"@@+ @@@@@@@@@@@+ @@@",
"@@+ @@@@@@@@@@@+ @@@",
"@@+ @@@@@@@@@@@+ @@@",
"@@+ OOOOOOOOOOOo @@@",
"@@+ @@@",
"@@+ @@@",
"@@+ @@@",
"@@+ @@@",
"@@+ @@@",
"@@+ @@@",
"@@+ XXXXXXXXXXX. @@@",
"@@+ @@@@@@@@@@@+ @@@",
"@@+ @@@@@@@@@@@+ @@@",
"@@+ @@@@@@@@@@@+ @@@",
"@@+ @@@@@@@@@@@+ @@@",
"@@+ @@@@@@@@@@@+ @@@",
"@@+ @@@@@@@@@@@+ @@@",
"@@+ @@@@@@@@@@@+ @@@",
"@@+ @@@@@@@@@@@+ @@@",
"@@+ @@@@@@@@@@@+ @@@",
"@@+ @@@@@@@@@@@+ @@@",
"@@+ @@@@@@@@@@@+ @@@",
"@@+ @@@@@@@@@@@+ @@@",
"@@+ @@@@@@@@@@@+ @@@"
"********************************",
"********************************",
"********************************",
"********************************",
"********************************",
"********************************",
"********************************",
"***:::*******::***::::*;:::::***",
"**#+++$*****#+++$&+++++++++++#**",
"*:+ #*****O %@ +:*",
"*:+ #*****+ %@ +:*",
"*:+ #*****+ %#XXX. .XXX@**",
"*:+ #:***:+ #****@ +******",
"**+ @&&&&&O #***:@ +******",
"*:+ ..... #****@ +******",
"*:+ #****@ +******",
"*;+ #***:@ +:*****",
"**+ +@@@@@o #***:@ +:*****",
"**+ #:***:+ #:***@ +:*****",
"**+ #*****+ #****@ +:*****",
"*:+ #:****+ %****@ +:*****",
"*:+ #:****+ %:***@ +:*****",
"*:+ #****:O #***:@ +:*****",
"**#+++$*****#+++$****%+++%******",
"***;::*******::*******:::*******",
"********************************",
"********************************",
"********************************",
"********************************",
"********************************",
"********************************",
"********************************"
};

View File

@@ -1,88 +1,70 @@
/* XPM */
static char *httrack__[] = {
static char *httrack48x48[] = {
/* columns rows colors chars-per-pixel */
"48 48 34 1",
" c #040404040404",
". c #080808080808",
"X c #0C0C0C0C0C0C",
"o c #111111111111",
"O c #161616161616",
"+ c #1C1C1C1C1C1C",
"@ c #222222222222",
"# c #292929292929",
"$ c #333333333333",
"% c #393939393939",
"& c #333333336666",
"* c #424242424242",
"= c #4D4D4D4D4D4D",
"- c #555555555555",
"; c #5F5F5F5F5F5F",
": c #666666666666",
"> c #777777777777",
", c #666666669999",
"< c #66666666CCCC",
"1 c #808080808080",
"2 c #868686868686",
"3 c #969696969696",
"4 c #999999999999",
"5 c #A0A0A0A0A4A4",
"6 c #B2B2B2B2B2B2",
"7 c #99999999CCCC",
"8 c #C0C0C0C0C0C0",
"9 c #CCCCCCCCCCCC",
"0 c #D7D7D7D7D7D7",
"q c #DDDDDDDDDDDD",
"w c #E3E3E3E3E3E3",
"e c #EAEAEAEAEAEA",
"r c #F1F1F1F1F1F1",
"t c None",
"48 48 16 1 ",
" c #060607",
". c #1D1D25",
"X c #282835",
"o c #343445",
"O c #5A5A77",
"+ c #6E6E92",
"@ c #7B7BA4",
"# c #8484B0",
"$ c #9999CC",
"% c #9999CD",
"& c #9A9ACD",
"* c #9B9BCF",
"= c #9292C4",
"- c #9D9DD2",
"; c #9E9ED2",
": c #9999CC",
/* pixels */
"77777777777777777777777777777777777777777<,,<777",
";&,77,&-<-&&&&&,-&&&&&,777777777777777777<$$<777",
"# ,77, +<o -+ *777777777777777777<oo<777",
"# ,77, +<o -+ *777777777777777777<oo<777",
"# ,77, +<o -+ *777777777777777777<oo<777",
"# ,77, +<o -+ *777777777777777777<oo<777",
"# ,77, +<@O oO;#O. oO&777777777777777777<oo<777",
"# ,77, +777+ ,7777% ;77777777777777777777<oo<777",
"# ,77, +777+ ,7777% ;77777777777777777777<oo<777",
"# ,77, +777+ ,7777% ;77<<<<<7<,<<<<77<,<<<oo<<<<",
"# ,77, +777+ ,7777% ;77,-,&<7- -,-,77; O,<oo<,--",
"# #&&$ +777+ ,7777% ;77& & <<o O$ ,7,o $<oo<& #",
"# +777+ ,7777% ;77& + <, X ,7- #<oo<@ &",
"# +777+ ,7777% ;77& <% ,7@ #<oo, ,",
"# +777+ ,7777% ;77& <+ ,<. +$#<oo; O<",
"# +777+ ,7777% ;77& .,o && ,, ,,-<oo% $7",
"# Xooo +777+ ,7777% ;77& O<, .<<o ,, O777<oXX ,7",
"# &,,- +777+ ,7777% ;77& &7, O<7# ,, #777<o ,7",
"# ,77, +777+ ,7777% ;77& -7, #77$ ,, $777<o <7",
"# ,77, +777+ ,7777% ;77& -7, #77$ ,, $777<ooO ,7",
"# ,77, +777+ ,7777% ;77& -7, +77# ,, +777<oo% &7",
"# ,77, +777+ ,7777% ;77& -7, o<<o ,, ,7<<oo- @7",
"# ,77, +777+ ,7777% ;77& -7<o ;; ,, $-%<oo, o<",
"# ,77, +777+ ,7777% ;77& -7<@ ,7o #<oo<O ,",
"# ,77, +777+ ,7777% ;77& -77% ,7$ #<oo<$ -",
"# ,77, +777+ ,7777% ;77& -77, @ ,7; #<oo<& #",
"# ,77, +777+ ,7777% ;77& -77<O #$ ,7<+ $<oo<, o",
"o #&&$ X&&&o $&&&&O #&&+ #&&&+ @O #&&+ @&. %% ",
" ",
" ",
" ",
" ",
"*@ @O **44#3= +w1+=242:41 =r4 #q8O 2>X;+34%21X",
";; -$ 2;tt*qqO:00%1qtq6t8 99q 40e:Xqw=4$rt:9w-",
"$1 1- 4*4=@66$5%:$1%9%5-$ $8#=O9$:8X6:24$6=+6;4",
"O4 51 4*> O4>%5O $1 6 4O >- *2 X0X5O54$3 6O5",
" 6 64O2*4-@42+3: $1 6 5:* 3@ :- 5#5O44$6-@6O4",
" 6O46$>*re*08 =w*$1 6 6e6 5X 2$ 2%6>14$ee;6:2",
" 2=15:=*96$ee% 48$1 6 561 5X 2# 1%wq@4$06*0w$",
" :4-24@*> O4:2 X9*1 6 4O 5O 2% 2$8* 4$3 88 ",
" %w#:0X*> O4#3 4;1 6 4O 3$ :; 6+5 4$3 68X",
" OrO%0 *> O4#24X3;1 6 4+ >1 *6 X8X5 4$4 64#",
" 6 +5 *61#62:6:8*1 6 52: #w=:Xq:13X5 4$81$6;:",
" > : *tt*e0+:r8$1 6 6t8 8eq 3rr%X5 4$rt:6#4",
" @ @ +::O;# O5*O# * *:* $6: +61 % %O;:@% %",
" ",
" ",
" "
"$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
"$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
"$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
"$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
"$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
"$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
"$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
"$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
"$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
"$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
"$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
"$$$$$$$-$$$$$$$$$$$$$$$-$$$$$$$$-$$$$$$$$$$$$$$$",
"$$$=@@@@@=$$$$$$$$=@@@@@=$#@@@@@@@@@@@@@@@@@=$$$",
"$$$@. .@$$$$$$$$+. .@-O .@$$$",
"$$$@ +$$$$$$$$+ @-O @$$$",
"$$$@ +$$$$$$$$+ @-O @$$$",
"$$$@ +$$$$$$$$+ @-O @$$$",
"$$$@ +$$$$$$$$+ @*+ooooo. Xooooo#$$$",
"$$$@ +$$$$$$$-+ @$$$$$$$+ .#$$$$$$$$$",
"$$$@ +-$$$$$$-+ @$$$$$$$+ #$$$$$$$$$",
"$$$@ +########+ @$$$$$$$+ .#$$$$$$$$$",
"$$$@ .......... @$$$$$$-+ .#$$$$$$$$$",
"$$$@ @$$$$$$-+ .#$$$$$$$$$",
"$$$@ @$$$$$$-+ .#$$$$$$$$$",
"$$$@ @$$$$$$-+ #$$$$$$$$$",
"$$$@ .XXXXXXXX. @$$$$$$-+ #$$$$$$$$$",
"$$$@ +$=======+ @$$$$$$-+ #$$$$$$$$$",
"$$$@ +-$$$$$$$+ @$$$$$$-+ #$$$$$$$$$",
"$$$@ +$$$$$$$$+ @$$$$$$-+ .#$$$$$$$$$",
"$$$@ +-$$$$$$$+ @$$$$$$-+ .#$$$$$$$$$",
"$$$@ +$$$$$$$-+ @$$$$$$-+ .#$$$$$$$$$",
"$$$@ +$$$$$$$-+ @$$$$$$-+ .#$$$$$$$$$",
"$$$@ +$$$$$$$$+ @-$$$$$-+ .#$$$$$$$$$",
"$$$@ +$$$$$$$$+ @$$$$$$-+ .#$$$$$$$$$",
"$$$@. .@$$$$$$$$+. .@$$$$$$-+ .#$$$$$$$$$",
"$$$=@@@@@=$$$$$$$$=@@@@@=$$$$$$$#@@@@@=$$$$$$$$$",
"$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$-$$$$$$$$$$$$",
"$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
"$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
"$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
"$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
"$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
"$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
"$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
"$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
"$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
"$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
"$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$"
};

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1024 1024" width="1024" height="1024"><title>HTTrack</title><rect width="1024" height="1024" fill="#9999cc"/><g fill="#8a8ac0" fill-rule="evenodd"><path d="M1105.92 409.6A634.88 409.6 21 1 0 -163.84 409.6A634.88 409.6 21 1 0 1105.92 409.6 ZM1049.6 409.6A578.56 353.28 21 1 0 -107.52 409.6A578.56 353.28 21 1 0 1049.6 409.6 Z"/><path d="M942.08 471.04A409.6 256 21 1 0 122.88 471.04A409.6 256 21 1 0 942.08 471.04 ZM896 471.04A363.52 209.92 21 1 0 168.96 471.04A363.52 209.92 21 1 0 896 471.04 Z"/></g><g fill="#040404"><path d="M189.6 543H480.1V460H189.6ZM421.6 320.1V703.9H514.2V320.1ZM163.8 320.1V703.9H256.5V320.1Z"/><path d="M556.5 403.1H662V703.9H754.6V403.1H860.2V320.1H556.5Z"/></g></svg>

After

Width:  |  Height:  |  Size: 748 B

View File

@@ -4,7 +4,7 @@
<meta http-equiv="Content-Type" content="text/html; charset=${LANGUAGE_CHARSET}" />
<meta name="description" content="${LANG_METADESC}" />
<meta name="keywords" content="${LANG_METAKEYW}" />
<title>'${projname}' - HTTrack Website Copier</title>
<title>'${html:projname}' - HTTrack Website Copier</title>
<link rel="stylesheet" type="text/css" media="screen" href="style.css">
<script type="text/javascript" src="ping.js" defer></script>
@@ -27,7 +27,7 @@ function info(str) {
<table width="76%" border="0" align="center" cellspacing="0" cellpadding="0" class="tableWidth">
<tr>
<td><img src="images/header_title_4.gif" width="400" height="34" alt="HTTrack Website Copier" title="" border="0" id="title" /></td>
<td><img src="images/wordmark.svg" width="400" height="36" alt="HTTrack Website Copier" title="" border="0" id="title" /></td>
</tr>
</table>
@@ -52,7 +52,7 @@ ${LANG_FATALERR}:
</h2>
<br>
<tt>
${error}
${html:error}
</tt>
<br>

View File

@@ -4,7 +4,7 @@
<meta http-equiv="Content-Type" content="text/html; charset=${LANGUAGE_CHARSET}" />
<meta name="description" content="${LANG_METADESC}" />
<meta name="keywords" content="${LANG_METAKEYW}" />
<title>'${projname}' - HTTrack Website Copier</title>
<title>'${html:projname}' - HTTrack Website Copier</title>
<script language="javascript">
<!--

View File

@@ -4,7 +4,7 @@
<meta http-equiv="Content-Type" content="text/html; charset=${LANGUAGE_CHARSET}" />
<meta name="description" content="${LANG_METADESC}" />
<meta name="keywords" content="${LANG_METAKEYW}" />
<title>'${projname}' - HTTrack Website Copier</title>
<title>'${html:projname}' - HTTrack Website Copier</title>
<link rel="stylesheet" type="text/css" media="screen" href="style.css">
<script type="text/javascript" src="ping.js" defer></script>
@@ -27,7 +27,7 @@ function info(str) {
<table width="76%" border="0" align="center" cellspacing="0" cellpadding="0" class="tableWidth">
<tr>
<td><img src="images/header_title_4.gif" width="400" height="34" alt="HTTrack Website Copier" title="" border="0" id="title" /></td>
<td><img src="images/wordmark.svg" width="400" height="36" alt="HTTrack Website Copier" title="" border="0" id="title" /></td>
</tr>
</table>
@@ -71,7 +71,7 @@ ${do:loadhash}
<form method="GET" action="" name="form">
${LANG_S11b}
<select name="name"
onChange="window.open('file://${path}/' + form.name.value + '/index.html')">
onChange="window.open('file://${js:path}/' + form.name.value + '/index.html')">
<option value="">&nbsp;</option>
${liststr:winprofile}
</select>

View File

@@ -4,7 +4,7 @@
<meta http-equiv="Content-Type" content="text/html; charset=${LANGUAGE_CHARSET}" />
<meta name="description" content="${LANG_METADESC}" />
<meta name="keywords" content="${LANG_METAKEYW}" />
<title>'${projname}' - HTTrack Website Copier</title>
<title>'${html:projname}' - HTTrack Website Copier</title>
<link rel="stylesheet" type="text/css" media="screen" href="style.css">
<script type="text/javascript" src="ping.js" defer></script>
@@ -27,7 +27,7 @@ function info(str) {
<table width="76%" border="0" align="center" cellspacing="0" cellpadding="0" class="tableWidth">
<tr>
<td><img src="images/header_title_4.gif" width="400" height="34" alt="HTTrack Website Copier" title="" border="0" id="title" /></td>
<td><img src="images/wordmark.svg" width="400" height="36" alt="HTTrack Website Copier" title="" border="0" id="title" /></td>
</tr>
</table>
<table width="76%" border="0" align="center" cellspacing="0" cellpadding="3" class="tableWidth">
@@ -36,7 +36,7 @@ function info(str) {
<td id="subTitle" align="right">
<a href="/server/file.html" target="_blank"
onClick="window.open('/server/file.html', 'help', 'toolbar=no, location=no, directories=no, status=yes, menubar=no, scrollbars=yes, resizable=yes, width=640, height=480'); return false"
title='${html:LANG_O1}' onMouseOver="info('${html:LANG_O1}'); return true" onMouseOut="info('&nbsp;'); return true"
title='${html:LANG_O1}' onMouseOver="info('${js:LANG_O1}'); return true" onMouseOut="info('&nbsp;'); return true"
style="color:#FFFFFF"
>
${LANG_O1}
@@ -48,7 +48,7 @@ ${do:if-file-exists:html/index.html}
<td id="subTitle" align="right">
<a href="/index.html" target="_blank"
onClick="window.open('/server/help.html', 'help', 'toolbar=no, location=no, directories=no, status=yes, menubar=no, scrollbars=yes, resizable=yes, width=640, height=480'); return false"
title='${html:LANG_TIPHELP}' onMouseOver="info('${html:LANG_TIPHELP}'); return true" onMouseOut="info('&nbsp;'); return true"
title='${html:LANG_TIPHELP}' onMouseOver="info('${js:LANG_TIPHELP}'); return true" onMouseOut="info('&nbsp;'); return true"
style="color:#FFFFFF"
>
${LANG_O5}
@@ -79,7 +79,7 @@ ${do:end-if}
<pre>
${do:if-not-empty:commandReturn}
${do:output-mode:html}${do:if-not-empty:commandReturn}
${LANG_F19}
<font color="red">
${commandReturnMsg}
@@ -89,7 +89,8 @@ ${LANG_F20}
httrack ${commandReturnCmdl}
</font>
${LANG_F21}
${do:end-if}
${/* end-if clears the output mode rather than restoring it, so re-arm it */}
${do:end-if}${do:output-mode:html}
${do:if-empty:commandReturn}
${LANG_F22}
@@ -99,7 +100,7 @@ ${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="_new">
${path}/${projname}
${html:path}/${html:projname}
</a></li>
<ul>
<li><a href="/website/index.html" target="_new">${LANG_D8}</a></li>

View File

@@ -4,7 +4,7 @@
<meta http-equiv="Content-Type" content="text/html; charset=${LANGUAGE_CHARSET}" />
<meta name="description" content="${LANG_METADESC}" />
<meta name="keywords" content="${LANG_METAKEYW}" />
<title>'${projname}' - HTTrack Website Copier</title>
<title>'${html:projname}' - HTTrack Website Copier</title>
<link rel="stylesheet" type="text/css" media="screen" href="style.css">
<script type="text/javascript" src="ping.js" defer></script>
@@ -27,7 +27,7 @@ function info(str) {
<table width="76%" border="0" align="center" cellspacing="0" cellpadding="0" class="tableWidth">
<tr>
<td><img src="images/header_title_4.gif" width="400" height="34" alt="HTTrack Website Copier" title="" border="0" id="title" /></td>
<td><img src="images/wordmark.svg" width="400" height="36" alt="HTTrack Website Copier" title="" border="0" id="title" /></td>
</tr>
</table>
@@ -58,7 +58,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="_new"
title='${html:LANG_G21}' onMouseOver="info('${html:LANG_G21}'); return true" onMouseOut="info('&nbsp;'); return true"
title='${html:LANG_G21}' onMouseOver="info('${js:LANG_G21}'); return true" onMouseOut="info('&nbsp;'); return true"
>
${LANG_O16}...
</a>
@@ -67,7 +67,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=${HTTRACK_VERSIONID}&VersionStr=${HTTRACK_VERSION}&Platform=${HTS_PLATFORM}&LanguageId=${lang}" target="_new"
title='${html:LANG_O17}' onMouseOver="info('${html:LANG_O17}'); return true" onMouseOut="info('&nbsp;'); return true"
title='${html:LANG_O17}' onMouseOver="info('${js:LANG_O17}'); return true" onMouseOut="info('&nbsp;'); return true"
>
${LANG_O17}...
</a>
@@ -78,7 +78,7 @@ ${do:if-file-exists:html/index.html}
<tr><td class="tabCtrl" align="left">
<a style="background:black;color: white"
href="/index.html" target="_new"
title='${html:LANG_TIPHELP}' onMouseOver="info('${html:LANG_TIPHELP}'); return true" onMouseOut="info('&nbsp;'); return true"
title='${html:LANG_TIPHELP}' onMouseOver="info('${js:LANG_TIPHELP}'); return true" onMouseOut="info('&nbsp;'); return true"
>
${LANG_P16}
</a>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.1 KiB

View File

@@ -0,0 +1,8 @@
<svg xmlns="http://www.w3.org/2000/svg" width="501" height="456" viewBox="0 0 501 456">
<title>HTTrack rings</title>
<!-- Transparent, unlike the GIF this replaces: the panel's own #ccd shows through. -->
<g fill="#b9b9d0" fill-rule="evenodd">
<path d="M614.59 346.3A323.36 197.55 21.16 1 0 11.46 112.89A323.36 197.55 21.16 1 0 614.59 346.3 ZM590.57 315.66A262.58 160.99 22.18 1 0 104.26 117.43A262.58 160.99 22.18 1 0 590.57 315.66 Z"/>
<path d="M578.08 292.16A185.6 113.57 21.23 1 0 232.08 157.73A185.6 113.57 21.23 1 0 578.08 292.16 ZM564.4 274.56A150.77 92.55 22.26 1 0 285.34 160.32A150.77 92.55 22.26 1 0 564.4 274.56 Z"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 641 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.9 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 7.1 KiB

View File

@@ -34,7 +34,7 @@ function info(str) {
<table width="76%" border="0" align="center" cellspacing="0" cellpadding="0" class="tableWidth">
<tr>
<td><img src="images/header_title_4.gif" width="400" height="34" alt="HTTrack Website Copier" title="" border="0" id="title" /></td>
<td><img src="images/wordmark.svg" width="400" height="36" alt="HTTrack Website Copier" title="" border="0" id="title" /></td>
</tr>
</table>
<table width="76%" border="0" align="center" cellspacing="0" cellpadding="3" class="tableWidth">
@@ -43,7 +43,7 @@ function info(str) {
<td id="subTitle" align="right">
<a href="/server/file.html" target="_blank"
onClick="window.open('/server/file.html', 'help', 'toolbar=no, location=no, directories=no, status=yes, menubar=no, scrollbars=yes, resizable=yes, width=640, height=480'); return false"
title='${html:LANG_O1}' onMouseOver="info('${html:LANG_O1}'); return true" onMouseOut="info('&nbsp;'); return true"
title='${html:LANG_O1}' onMouseOver="info('${js:LANG_O1}'); return true" onMouseOut="info('&nbsp;'); return true"
style="color:#FFFFFF"
>
${LANG_O1}
@@ -55,7 +55,7 @@ ${do:if-file-exists:html/index.html}
<td id="subTitle" align="right">
<a href="/index.html" target="_blank"
onClick="window.open('/server/help.html', 'help', 'toolbar=no, location=no, directories=no, status=yes, menubar=no, scrollbars=yes, resizable=yes, width=640, height=480'); return false"
title='${html:LANG_TIPHELP}' onMouseOver="info('${html:LANG_TIPHELP}'); return true" onMouseOut="info('&nbsp;'); return true"
title='${html:LANG_TIPHELP}' onMouseOver="info('${js:LANG_TIPHELP}'); return true" onMouseOut="info('&nbsp;'); return true"
style="color:#FFFFFF"
>
${LANG_O5}
@@ -113,7 +113,7 @@ ${LANG_THANKYOU}!
<tr><td align="right">
<input name="nextBtn" type="submit" value=" ${LANG_NEXT} >> "
title='${html:LANG_TIPNEXT}' onMouseOver="info('${html:LANG_TIPNEXT}'); return true" onMouseOut="info('&nbsp;'); return true"
title='${html:LANG_TIPNEXT}' onMouseOver="info('${js:LANG_TIPNEXT}'); return true" onMouseOut="info('&nbsp;'); return true"
>
</td></tr>
</table>

View File

@@ -4,7 +4,7 @@
<meta http-equiv="Content-Type" content="text/html; charset=${LANGUAGE_CHARSET}" />
<meta name="description" content="${LANG_METADESC}" />
<meta name="keywords" content="${LANG_METAKEYW}" />
<title>'${projname}' - HTTrack Website Copier</title>
<title>'${html:projname}' - HTTrack Website Copier</title>
<link rel="stylesheet" type="text/css" media="screen" href="style.css">
<script type="text/javascript" src="ping.js" defer></script>
@@ -31,7 +31,7 @@ function info(str) {
<table width="76%" border="0" align="center" cellspacing="0" cellpadding="0" class="tableWidth">
<tr>
<td><img src="images/header_title_4.gif" width="400" height="34" alt="HTTrack Website Copier" title="" border="0" id="title" /></td>
<td><img src="images/wordmark.svg" width="400" height="36" alt="HTTrack Website Copier" title="" border="0" id="title" /></td>
</tr>
</table>
@@ -60,7 +60,7 @@ ${do:if-file-exists:html/index.html}
<td>
<a href="/guide.html#web/opt-links" target="_blank"
onClick="window.open('/guide.html#web/opt-links', 'help', 'toolbar=no, location=no, directories=no, status=yes, menubar=no, scrollbars=yes, resizable=yes, width=980, height=760'); return false"
title='${html:LANG_TIPHELP}' onMouseOver="info('${html:LANG_TIPHELP}'); return true" onMouseOut="info('&nbsp;'); return true"
title='${html:LANG_TIPHELP}' onMouseOver="info('${js:LANG_TIPHELP}'); return true" onMouseOut="info('&nbsp;'); return true"
>${LANG_TIPHELP}</a>
</td>
${do:end-if}
@@ -71,18 +71,18 @@ ${do:end-if}
<table class="tableWidth" border="0" width="100%" cellspacing="0">
<tr>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option1.html" onClick="form.redirect.value='option1.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT1}' onMouseOver="info('${html:LANG_IOPT1}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT1}</a></td>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option2.html" onClick="form.redirect.value='option2.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT2}' onMouseOver="info('${html:LANG_IOPT2}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT2}</a></td>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option3.html" onClick="form.redirect.value='option3.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT3}' onMouseOver="info('${html:LANG_IOPT3}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT3}</a></td>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option4.html" onClick="form.redirect.value='option4.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT4}' onMouseOver="info('${html:LANG_IOPT4}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT4}</a></td>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option5.html" onClick="form.redirect.value='option5.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT5}' onMouseOver="info('${html:LANG_IOPT5}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT5}</a></td>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option11.html" onClick="form.redirect.value='option11.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT11}' onMouseOver="info('${html:LANG_IOPT11}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT11}</a></td>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option1.html" onClick="form.redirect.value='option1.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT1}' onMouseOver="info('${js:LANG_IOPT1}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT1}</a></td>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option2.html" onClick="form.redirect.value='option2.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT2}' onMouseOver="info('${js:LANG_IOPT2}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT2}</a></td>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option3.html" onClick="form.redirect.value='option3.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT3}' onMouseOver="info('${js:LANG_IOPT3}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT3}</a></td>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option4.html" onClick="form.redirect.value='option4.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT4}' onMouseOver="info('${js:LANG_IOPT4}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT4}</a></td>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option5.html" onClick="form.redirect.value='option5.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT5}' onMouseOver="info('${js:LANG_IOPT5}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT5}</a></td>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option11.html" onClick="form.redirect.value='option11.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT11}' onMouseOver="info('${js:LANG_IOPT11}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT11}</a></td>
</tr><tr>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option6.html" onClick="form.redirect.value='option6.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT6}' onMouseOver="info('${html:LANG_IOPT6}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT6}</a></td>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option7.html" onClick="form.redirect.value='option7.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT7}' onMouseOver="info('${html:LANG_IOPT7}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT7}</a></td>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option8.html" onClick="form.redirect.value='option8.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT8}' onMouseOver="info('${html:LANG_IOPT8}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT8}</a></td>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option9.html" onClick="form.redirect.value='option9.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT9}' onMouseOver="info('${html:LANG_IOPT9}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT9}</a></td>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option10.html" onClick="form.redirect.value='option10.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT10}' onMouseOver="info('${html:LANG_IOPT10}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT10}</a></td>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option6.html" onClick="form.redirect.value='option6.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT6}' onMouseOver="info('${js:LANG_IOPT6}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT6}</a></td>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option7.html" onClick="form.redirect.value='option7.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT7}' onMouseOver="info('${js:LANG_IOPT7}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT7}</a></td>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option8.html" onClick="form.redirect.value='option8.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT8}' onMouseOver="info('${js:LANG_IOPT8}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT8}</a></td>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option9.html" onClick="form.redirect.value='option9.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT9}' onMouseOver="info('${js:LANG_IOPT9}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT9}</a></td>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option10.html" onClick="form.redirect.value='option10.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT10}' onMouseOver="info('${js:LANG_IOPT10}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT10}</a></td>
<td class="tabCtrl" align="center">&nbsp;</td>
</tr>
@@ -107,16 +107,16 @@ ${do:end-if}
<!-- checkboxes -->
<table border="0" width="100%" cellspacing="0">
<tr><td><input type="checkbox" name="parseall" ${checked:parseall}
title='${html:LANG_I1}' onMouseOver="info('${html:LANG_I1}'); return true" onMouseOut="info('&nbsp;'); return true"
title='${html:LANG_I1}' onMouseOver="info('${js:LANG_I1}'); return true" onMouseOut="info('&nbsp;'); return true"
> ${LANG_I31}</td></tr>
<tr><td><input type="checkbox" name="link" ${checked:link}
title='${html:LANG_I2}' onMouseOver="info('${html:LANG_I2}'); return true" onMouseOut="info('&nbsp;'); return true"
title='${html:LANG_I2}' onMouseOver="info('${js:LANG_I2}'); return true" onMouseOut="info('&nbsp;'); return true"
> ${LANG_I32}</td></tr>
<tr><td><input type="checkbox" name="testall" ${checked:testall}
title='${html:LANG_I2b}' onMouseOver="info('${html:LANG_I2b}'); return true" onMouseOut="info('&nbsp;'); return true"
title='${html:LANG_I2b}' onMouseOver="info('${js:LANG_I2b}'); return true" onMouseOut="info('&nbsp;'); return true"
> ${LANG_I32b}</td></tr>
<tr><td><input type="checkbox" name="htmlfirst" ${checked:htmlfirst}
title='${html:LANG_I2c}' onMouseOver="info('${html:LANG_I2c}'); return true" onMouseOut="info('&nbsp;'); return true"
title='${html:LANG_I2c}' onMouseOver="info('${js:LANG_I2c}'); return true" onMouseOut="info('&nbsp;'); return true"
> ${LANG_I32c}</td></tr>
</table>
@@ -125,12 +125,12 @@ ${do:end-if}
<tr><td align="left">
<input type="submit" value="${LANG_OK}"
onClick="form.closeme.value=1; form.submit(); return false;"
title='${html:LANG_TIPOK}' onMouseOver="info('${html:LANG_TIPOK}'); return true" onMouseOut="info('&nbsp;'); return true"
title='${html:LANG_TIPOK}' onMouseOver="info('${js:LANG_TIPOK}'); return true" onMouseOut="info('&nbsp;'); return true"
>
</td><td align="right">
<input type="button" value="${LANG_CANCEL}"
onClick="window.close();"
title='${html:LANG_TIPCANCEL}' onMouseOver="info('${html:LANG_TIPCANCEL}'); return true" onMouseOut="info('&nbsp;'); return true"
title='${html:LANG_TIPCANCEL}' onMouseOver="info('${js:LANG_TIPCANCEL}'); return true" onMouseOut="info('&nbsp;'); return true"
>
</td></tr>
</table>

View File

@@ -4,7 +4,7 @@
<meta http-equiv="Content-Type" content="text/html; charset=${LANGUAGE_CHARSET}" />
<meta name="description" content="${LANG_METADESC}" />
<meta name="keywords" content="${LANG_METAKEYW}" />
<title>'${projname}' - HTTrack Website Copier</title>
<title>'${html:projname}' - HTTrack Website Copier</title>
<link rel="stylesheet" type="text/css" media="screen" href="style.css">
<script type="text/javascript" src="ping.js" defer></script>
@@ -31,7 +31,7 @@ function info(str) {
<table width="76%" border="0" align="center" cellspacing="0" cellpadding="0" class="tableWidth">
<tr>
<td><img src="images/header_title_4.gif" width="400" height="34" alt="HTTrack Website Copier" title="" border="0" id="title" /></td>
<td><img src="images/wordmark.svg" width="400" height="36" alt="HTTrack Website Copier" title="" border="0" id="title" /></td>
</tr>
</table>
@@ -60,7 +60,7 @@ ${do:if-file-exists:html/index.html}
<td>
<a href="/guide.html#web/opt-proxy" target="_blank"
onClick="window.open('/guide.html#web/opt-proxy', 'help', 'toolbar=no, location=no, directories=no, status=yes, menubar=no, scrollbars=yes, resizable=yes, width=980, height=760'); return false"
title='${html:LANG_TIPHELP}' onMouseOver="info('${html:LANG_TIPHELP}'); return true" onMouseOut="info('&nbsp;'); return true"
title='${html:LANG_TIPHELP}' onMouseOver="info('${js:LANG_TIPHELP}'); return true" onMouseOut="info('&nbsp;'); return true"
>${LANG_TIPHELP}</a>
</td>
${do:end-if}
@@ -71,18 +71,18 @@ ${do:end-if}
<table class="tableWidth" border="0" width="100%" cellspacing="0">
<tr>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option1.html" onClick="form.redirect.value='option1.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT1}' onMouseOver="info('${html:LANG_IOPT1}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT1}</a></td>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option2.html" onClick="form.redirect.value='option2.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT2}' onMouseOver="info('${html:LANG_IOPT2}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT2}</a></td>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option3.html" onClick="form.redirect.value='option3.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT3}' onMouseOver="info('${html:LANG_IOPT3}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT3}</a></td>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option4.html" onClick="form.redirect.value='option4.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT4}' onMouseOver="info('${html:LANG_IOPT4}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT4}</a></td>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option5.html" onClick="form.redirect.value='option5.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT5}' onMouseOver="info('${html:LANG_IOPT5}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT5}</a></td>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option11.html" onClick="form.redirect.value='option11.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT11}' onMouseOver="info('${html:LANG_IOPT11}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT11}</a></td>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option1.html" onClick="form.redirect.value='option1.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT1}' onMouseOver="info('${js:LANG_IOPT1}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT1}</a></td>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option2.html" onClick="form.redirect.value='option2.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT2}' onMouseOver="info('${js:LANG_IOPT2}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT2}</a></td>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option3.html" onClick="form.redirect.value='option3.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT3}' onMouseOver="info('${js:LANG_IOPT3}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT3}</a></td>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option4.html" onClick="form.redirect.value='option4.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT4}' onMouseOver="info('${js:LANG_IOPT4}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT4}</a></td>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option5.html" onClick="form.redirect.value='option5.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT5}' onMouseOver="info('${js:LANG_IOPT5}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT5}</a></td>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option11.html" onClick="form.redirect.value='option11.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT11}' onMouseOver="info('${js:LANG_IOPT11}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT11}</a></td>
</tr><tr>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option6.html" onClick="form.redirect.value='option6.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT6}' onMouseOver="info('${html:LANG_IOPT6}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT6}</a></td>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option7.html" onClick="form.redirect.value='option7.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT7}' onMouseOver="info('${html:LANG_IOPT7}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT7}</a></td>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option8.html" onClick="form.redirect.value='option8.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT8}' onMouseOver="info('${html:LANG_IOPT8}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT8}</a></td>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option9.html" onClick="form.redirect.value='option9.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT9}' onMouseOver="info('${html:LANG_IOPT9}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT9}</a></td>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option10.html" onClick="form.redirect.value='option10.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT10}' onMouseOver="info('${html:LANG_IOPT10}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT10}</a></td>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option6.html" onClick="form.redirect.value='option6.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT6}' onMouseOver="info('${js:LANG_IOPT6}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT6}</a></td>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option7.html" onClick="form.redirect.value='option7.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT7}' onMouseOver="info('${js:LANG_IOPT7}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT7}</a></td>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option8.html" onClick="form.redirect.value='option8.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT8}' onMouseOver="info('${js:LANG_IOPT8}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT8}</a></td>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option9.html" onClick="form.redirect.value='option9.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT9}' onMouseOver="info('${js:LANG_IOPT9}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT9}</a></td>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option10.html" onClick="form.redirect.value='option10.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT10}' onMouseOver="info('${js:LANG_IOPT10}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT10}</a></td>
<td class="tabCtrl" align="center">&nbsp;</td>
</tr>
@@ -103,7 +103,7 @@ ${do:end-if}
${LANG_PROXYTYPE}
<select name="proxytype"
title='${html:LANG_PROXYTYPETIP}' onMouseOver="info('${html:LANG_PROXYTYPETIP}'); return true" onMouseOut="info('&nbsp;'); return true"
title='${html:LANG_PROXYTYPETIP}' onMouseOver="info('${js:LANG_PROXYTYPETIP}'); return true" onMouseOut="info('&nbsp;'); return true"
>
<option value=""${ztest:proxytype: selected:}>HTTP</option>
<option value="2"${test:proxytype::: selected}>HTTP (CONNECT tunnel)</option>
@@ -113,15 +113,15 @@ ${LANG_PROXYTYPE}
${LANG_IOPT10}:
<input name="prox" value="${prox}" size="32"
title='${html:LANG_G14}' onMouseOver="info('${html:LANG_G14}'); return true" onMouseOut="info('&nbsp;'); return true"
title='${html:LANG_G14}' onMouseOver="info('${js:LANG_G14}'); return true" onMouseOut="info('&nbsp;'); return true"
>:
<input name="portprox" value="${portprox}" size="4"
title='${html:LANG_G15}' onMouseOver="info('${html:LANG_G15}'); return true" onMouseOut="info('&nbsp;'); return true"
title='${html:LANG_G15}' onMouseOver="info('${js:LANG_G15}'); return true" onMouseOut="info('&nbsp;'); return true"
>
<br>
<input type="checkbox" name="ftpprox" ${checked:ftpprox}
title='${html:LANG_G15c}' onMouseOver="info('${html:LANG_G15c}'); return true" onMouseOut="info('&nbsp;'); return true"
title='${html:LANG_G15c}' onMouseOver="info('${js:LANG_G15c}'); return true" onMouseOut="info('&nbsp;'); return true"
> ${LANG_I47c}
<br><br>
@@ -130,12 +130,12 @@ ${LANG_IOPT10}:
<tr><td align="left">
<input type="submit" value="${LANG_OK}"
onClick="form.closeme.value=1; form.submit(); return false;"
title='${html:LANG_TIPOK}' onMouseOver="info('${html:LANG_TIPOK}'); return true" onMouseOut="info('&nbsp;'); return true"
title='${html:LANG_TIPOK}' onMouseOver="info('${js:LANG_TIPOK}'); return true" onMouseOut="info('&nbsp;'); return true"
>
</td><td align="right">
<input type="button" value="${LANG_CANCEL}"
onClick="window.close();"
title='${html:LANG_TIPCANCEL}' onMouseOver="info('${html:LANG_TIPCANCEL}'); return true" onMouseOut="info('&nbsp;'); return true"
title='${html:LANG_TIPCANCEL}' onMouseOver="info('${js:LANG_TIPCANCEL}'); return true" onMouseOut="info('&nbsp;'); return true"
>
</td></tr>
</table>

View File

@@ -4,7 +4,7 @@
<meta http-equiv="Content-Type" content="text/html; charset=${LANGUAGE_CHARSET}" />
<meta name="description" content="${LANG_METADESC}" />
<meta name="keywords" content="${LANG_METAKEYW}" />
<title>'${projname}' - HTTrack Website Copier</title>
<title>'${html:projname}' - HTTrack Website Copier</title>
<link rel="stylesheet" type="text/css" media="screen" href="style.css">
<script type="text/javascript" src="ping.js" defer></script>
@@ -31,7 +31,7 @@ function info(str) {
<table width="76%" border="0" align="center" cellspacing="0" cellpadding="0" class="tableWidth">
<tr>
<td><img src="images/header_title_4.gif" width="400" height="34" alt="HTTrack Website Copier" title="" border="0" id="title" /></td>
<td><img src="images/wordmark.svg" width="400" height="36" alt="HTTrack Website Copier" title="" border="0" id="title" /></td>
</tr>
</table>
@@ -60,7 +60,7 @@ ${do:if-file-exists:html/index.html}
<td>
<a href="/guide.html#web/opt-log-index-cache" target="_blank"
onClick="window.open('/guide.html#web/opt-log-index-cache', 'help', 'toolbar=no, location=no, directories=no, status=yes, menubar=no, scrollbars=yes, resizable=yes, width=980, height=760'); return false"
title='${html:LANG_TIPHELP}' onMouseOver="info('${html:LANG_TIPHELP}'); return true" onMouseOut="info('&nbsp;'); return true"
title='${html:LANG_TIPHELP}' onMouseOver="info('${js:LANG_TIPHELP}'); return true" onMouseOut="info('&nbsp;'); return true"
>${LANG_TIPHELP}</a>
</td>
${do:end-if}
@@ -71,18 +71,18 @@ ${do:end-if}
<table class="tableWidth" border="0" width="100%" cellspacing="0">
<tr>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option1.html" onClick="form.redirect.value='option1.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT1}' onMouseOver="info('${html:LANG_IOPT1}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT1}</a></td>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option2.html" onClick="form.redirect.value='option2.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT2}' onMouseOver="info('${html:LANG_IOPT2}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT2}</a></td>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option3.html" onClick="form.redirect.value='option3.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT3}' onMouseOver="info('${html:LANG_IOPT3}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT3}</a></td>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option4.html" onClick="form.redirect.value='option4.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT4}' onMouseOver="info('${html:LANG_IOPT4}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT4}</a></td>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option5.html" onClick="form.redirect.value='option5.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT5}' onMouseOver="info('${html:LANG_IOPT5}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT5}</a></td>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option11.html" onClick="form.redirect.value='option11.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT11}' onMouseOver="info('${html:LANG_IOPT11}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT11}</a></td>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option1.html" onClick="form.redirect.value='option1.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT1}' onMouseOver="info('${js:LANG_IOPT1}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT1}</a></td>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option2.html" onClick="form.redirect.value='option2.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT2}' onMouseOver="info('${js:LANG_IOPT2}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT2}</a></td>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option3.html" onClick="form.redirect.value='option3.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT3}' onMouseOver="info('${js:LANG_IOPT3}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT3}</a></td>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option4.html" onClick="form.redirect.value='option4.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT4}' onMouseOver="info('${js:LANG_IOPT4}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT4}</a></td>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option5.html" onClick="form.redirect.value='option5.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT5}' onMouseOver="info('${js:LANG_IOPT5}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT5}</a></td>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option11.html" onClick="form.redirect.value='option11.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT11}' onMouseOver="info('${js:LANG_IOPT11}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT11}</a></td>
</tr><tr>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option6.html" onClick="form.redirect.value='option6.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT6}' onMouseOver="info('${html:LANG_IOPT6}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT6}</a></td>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option7.html" onClick="form.redirect.value='option7.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT7}' onMouseOver="info('${html:LANG_IOPT7}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT7}</a></td>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option8.html" onClick="form.redirect.value='option8.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT8}' onMouseOver="info('${html:LANG_IOPT8}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT8}</a></td>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option9.html" onClick="form.redirect.value='option9.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT9}' onMouseOver="info('${html:LANG_IOPT9}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT9}</a></td>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option10.html" onClick="form.redirect.value='option10.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT10}' onMouseOver="info('${html:LANG_IOPT10}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT10}</a></td>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option6.html" onClick="form.redirect.value='option6.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT6}' onMouseOver="info('${js:LANG_IOPT6}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT6}</a></td>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option7.html" onClick="form.redirect.value='option7.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT7}' onMouseOver="info('${js:LANG_IOPT7}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT7}</a></td>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option8.html" onClick="form.redirect.value='option8.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT8}' onMouseOver="info('${js:LANG_IOPT8}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT8}</a></td>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option9.html" onClick="form.redirect.value='option9.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT9}' onMouseOver="info('${js:LANG_IOPT9}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT9}</a></td>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option10.html" onClick="form.redirect.value='option10.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT10}' onMouseOver="info('${js:LANG_IOPT10}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT10}</a></td>
<td class="tabCtrl" align="center">&nbsp;</td>
</tr>
@@ -112,97 +112,97 @@ ${LANG_W3}
<td align="left">
<input name="ext1" value="${ext1}"
title='${html:LANG_W4}' onMouseOver="info('${html:LANG_W4}'); return true" onMouseOut="info('&nbsp;'); return true"
title='${html:LANG_W4}' onMouseOver="info('${js:LANG_W4}'); return true" onMouseOut="info('&nbsp;'); return true"
>
</td><td align="left">
&#x21d4;
</td><td align="left">
<input name="mime1" value="${mime1}"
title='${html:LANG_W5}' onMouseOver="info('${html:LANG_W5}'); return true" onMouseOut="info('&nbsp;'); return true"
title='${html:LANG_W5}' onMouseOver="info('${js:LANG_W5}'); return true" onMouseOut="info('&nbsp;'); return true"
>
</td></tr>
<!-- -->
<td align="left">
<input name="ext2" value="${ext2}"
title='${html:LANG_W4}' onMouseOver="info('${html:LANG_W4}'); return true" onMouseOut="info('&nbsp;'); return true"
title='${html:LANG_W4}' onMouseOver="info('${js:LANG_W4}'); return true" onMouseOut="info('&nbsp;'); return true"
>
</td><td align="left">
&#x21d4;
</td><td align="left">
<input name="mime2" value="${mime2}"
title='${html:LANG_W5}' onMouseOver="info('${html:LANG_W5}'); return true" onMouseOut="info('&nbsp;'); return true"
title='${html:LANG_W5}' onMouseOver="info('${js:LANG_W5}'); return true" onMouseOut="info('&nbsp;'); return true"
>
</td></tr>
<!-- -->
<td align="left">
<input name="ext3" value="${ext3}"
title='${html:LANG_W4}' onMouseOver="info('${html:LANG_W4}'); return true" onMouseOut="info('&nbsp;'); return true"
title='${html:LANG_W4}' onMouseOver="info('${js:LANG_W4}'); return true" onMouseOut="info('&nbsp;'); return true"
>
</td><td align="left">
&#x21d4;
</td><td align="left">
<input name="mime3" value="${mime3}"
title='${html:LANG_W5}' onMouseOver="info('${html:LANG_W5}'); return true" onMouseOut="info('&nbsp;'); return true"
title='${html:LANG_W5}' onMouseOver="info('${js:LANG_W5}'); return true" onMouseOut="info('&nbsp;'); return true"
>
</td></tr>
<!-- -->
<td align="left">
<input name="ext4" value="${ext4}"
title='${html:LANG_W4}' onMouseOver="info('${html:LANG_W4}'); return true" onMouseOut="info('&nbsp;'); return true"
title='${html:LANG_W4}' onMouseOver="info('${js:LANG_W4}'); return true" onMouseOut="info('&nbsp;'); return true"
>
</td><td align="left">
&#x21d4;
</td><td align="left">
<input name="mime4" value="${mime4}"
title='${html:LANG_W5}' onMouseOver="info('${html:LANG_W5}'); return true" onMouseOut="info('&nbsp;'); return true"
title='${html:LANG_W5}' onMouseOver="info('${js:LANG_W5}'); return true" onMouseOut="info('&nbsp;'); return true"
>
</td></tr>
<!-- -->
<td align="left">
<input name="ext5" value="${ext5}"
title='${html:LANG_W4}' onMouseOver="info('${html:LANG_W4}'); return true" onMouseOut="info('&nbsp;'); return true"
title='${html:LANG_W4}' onMouseOver="info('${js:LANG_W4}'); return true" onMouseOut="info('&nbsp;'); return true"
>
</td><td align="left">
&#x21d4;
</td><td align="left">
<input name="mime5" value="${mime5}"
title='${html:LANG_W5}' onMouseOver="info('${html:LANG_W5}'); return true" onMouseOut="info('&nbsp;'); return true"
title='${html:LANG_W5}' onMouseOver="info('${js:LANG_W5}'); return true" onMouseOut="info('&nbsp;'); return true"
>
</td></tr>
<!-- -->
<td align="left">
<input name="ext6" value="${ext6}"
title='${html:LANG_W4}' onMouseOver="info('${html:LANG_W4}'); return true" onMouseOut="info('&nbsp;'); return true"
title='${html:LANG_W4}' onMouseOver="info('${js:LANG_W4}'); return true" onMouseOut="info('&nbsp;'); return true"
>
</td><td align="left">
&#x21d4;
</td><td align="left">
<input name="mime6" value="${mime6}"
title='${html:LANG_W5}' onMouseOver="info('${html:LANG_W5}'); return true" onMouseOut="info('&nbsp;'); return true"
title='${html:LANG_W5}' onMouseOver="info('${js:LANG_W5}'); return true" onMouseOut="info('&nbsp;'); return true"
>
</td></tr>
<!-- -->
<td align="left">
<input name="ext7" value="${ext7}"
title='${html:LANG_W4}' onMouseOver="info('${html:LANG_W4}'); return true" onMouseOut="info('&nbsp;'); return true"
title='${html:LANG_W4}' onMouseOver="info('${js:LANG_W4}'); return true" onMouseOut="info('&nbsp;'); return true"
>
</td><td align="left">
&#x21d4;
</td><td align="left">
<input name="mime7" value="${mime7}"
title='${html:LANG_W5}' onMouseOver="info('${html:LANG_W5}'); return true" onMouseOut="info('&nbsp;'); return true"
title='${html:LANG_W5}' onMouseOver="info('${js:LANG_W5}'); return true" onMouseOut="info('&nbsp;'); return true"
>
</td></tr>
<!-- -->
<td align="left">
<input name="ext8" value="${ext8}"
title='${html:LANG_W4}' onMouseOver="info('${html:LANG_W4}'); return true" onMouseOut="info('&nbsp;'); return true"
title='${html:LANG_W4}' onMouseOver="info('${js:LANG_W4}'); return true" onMouseOut="info('&nbsp;'); return true"
>
</td><td align="left">
&#x21d4;
</td><td align="left">
<input name="mime8" value="${mime8}"
title='${html:LANG_W5}' onMouseOver="info('${html:LANG_W5}'); return true" onMouseOut="info('&nbsp;'); return true"
title='${html:LANG_W5}' onMouseOver="info('${js:LANG_W5}'); return true" onMouseOut="info('&nbsp;'); return true"
>
</td></tr>
<!-- -->
@@ -217,12 +217,12 @@ ${LANG_W3}
<tr><td align="left">
<input type="submit" value="${LANG_OK}"
onClick="form.closeme.value=1; form.submit(); return false;"
title='${html:LANG_TIPOK}' onMouseOver="info('${html:LANG_TIPOK}'); return true" onMouseOut="info('&nbsp;'); return true"
title='${html:LANG_TIPOK}' onMouseOver="info('${js:LANG_TIPOK}'); return true" onMouseOut="info('&nbsp;'); return true"
>
</td><td align="right">
<input type="button" value="${LANG_CANCEL}"
onClick="window.close();"
title='${html:LANG_TIPCANCEL}' onMouseOver="info('${html:LANG_TIPCANCEL}'); return true" onMouseOut="info('&nbsp;'); return true"
title='${html:LANG_TIPCANCEL}' onMouseOver="info('${js:LANG_TIPCANCEL}'); return true" onMouseOut="info('&nbsp;'); return true"
>
</td></tr>
</table>

View File

@@ -4,7 +4,7 @@
<meta http-equiv="Content-Type" content="text/html; charset=${LANGUAGE_CHARSET}" />
<meta name="description" content="${LANG_METADESC}" />
<meta name="keywords" content="${LANG_METAKEYW}" />
<title>'${projname}' - HTTrack Website Copier</title>
<title>'${html:projname}' - HTTrack Website Copier</title>
<link rel="stylesheet" type="text/css" media="screen" href="style.css">
<script type="text/javascript" src="ping.js" defer></script>
@@ -31,7 +31,7 @@ function info(str) {
<table width="76%" border="0" align="center" cellspacing="0" cellpadding="0" class="tableWidth">
<tr>
<td><img src="images/header_title_4.gif" width="400" height="34" alt="HTTrack Website Copier" title="" border="0" id="title" /></td>
<td><img src="images/wordmark.svg" width="400" height="36" alt="HTTrack Website Copier" title="" border="0" id="title" /></td>
</tr>
</table>
@@ -60,7 +60,7 @@ ${do:if-file-exists:html/index.html}
<td>
<a href="/guide.html#web/opt-build" target="_blank"
onClick="window.open('/guide.html#web/opt-build', 'help', 'toolbar=no, location=no, directories=no, status=yes, menubar=no, scrollbars=yes, resizable=yes, width=980, height=760'); return false"
title='${html:LANG_TIPHELP}' onMouseOver="info('${html:LANG_TIPHELP}'); return true" onMouseOut="info('&nbsp;'); return true"
title='${html:LANG_TIPHELP}' onMouseOver="info('${js:LANG_TIPHELP}'); return true" onMouseOut="info('&nbsp;'); return true"
>${LANG_TIPHELP}</a>
</td>
${do:end-if}
@@ -71,18 +71,18 @@ ${do:end-if}
<table class="tableWidth" border="0" width="100%" cellspacing="0">
<tr>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option1.html" onClick="form.redirect.value='option1.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT1}' onMouseOver="info('${html:LANG_IOPT1}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT1}</a></td>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option2.html" onClick="form.redirect.value='option2.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT2}' onMouseOver="info('${html:LANG_IOPT2}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT2}</a></td>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option3.html" onClick="form.redirect.value='option3.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT3}' onMouseOver="info('${html:LANG_IOPT3}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT3}</a></td>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option4.html" onClick="form.redirect.value='option4.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT4}' onMouseOver="info('${html:LANG_IOPT4}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT4}</a></td>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option5.html" onClick="form.redirect.value='option5.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT5}' onMouseOver="info('${html:LANG_IOPT5}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT5}</a></td>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option11.html" onClick="form.redirect.value='option11.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT11}' onMouseOver="info('${html:LANG_IOPT11}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT11}</a></td>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option1.html" onClick="form.redirect.value='option1.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT1}' onMouseOver="info('${js:LANG_IOPT1}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT1}</a></td>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option2.html" onClick="form.redirect.value='option2.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT2}' onMouseOver="info('${js:LANG_IOPT2}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT2}</a></td>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option3.html" onClick="form.redirect.value='option3.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT3}' onMouseOver="info('${js:LANG_IOPT3}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT3}</a></td>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option4.html" onClick="form.redirect.value='option4.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT4}' onMouseOver="info('${js:LANG_IOPT4}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT4}</a></td>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option5.html" onClick="form.redirect.value='option5.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT5}' onMouseOver="info('${js:LANG_IOPT5}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT5}</a></td>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option11.html" onClick="form.redirect.value='option11.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT11}' onMouseOver="info('${js:LANG_IOPT11}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT11}</a></td>
</tr><tr>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option6.html" onClick="form.redirect.value='option6.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT6}' onMouseOver="info('${html:LANG_IOPT6}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT6}</a></td>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option7.html" onClick="form.redirect.value='option7.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT7}' onMouseOver="info('${html:LANG_IOPT7}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT7}</a></td>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option8.html" onClick="form.redirect.value='option8.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT8}' onMouseOver="info('${html:LANG_IOPT8}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT8}</a></td>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option9.html" onClick="form.redirect.value='option9.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT9}' onMouseOver="info('${html:LANG_IOPT9}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT9}</a></td>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option10.html" onClick="form.redirect.value='option10.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT10}' onMouseOver="info('${html:LANG_IOPT10}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT10}</a></td>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option6.html" onClick="form.redirect.value='option6.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT6}' onMouseOver="info('${js:LANG_IOPT6}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT6}</a></td>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option7.html" onClick="form.redirect.value='option7.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT7}' onMouseOver="info('${js:LANG_IOPT7}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT7}</a></td>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option8.html" onClick="form.redirect.value='option8.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT8}' onMouseOver="info('${js:LANG_IOPT8}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT8}</a></td>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option9.html" onClick="form.redirect.value='option9.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT9}' onMouseOver="info('${js:LANG_IOPT9}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT9}</a></td>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option10.html" onClick="form.redirect.value='option10.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT10}' onMouseOver="info('${js:LANG_IOPT10}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT10}</a></td>
<td class="tabCtrl" align="center">&nbsp;</td>
</tr>
@@ -109,20 +109,20 @@ ${do:end-if}
${LANG_I33}
<br>
<select name="build"
title='${html:LANG_I3}' onMouseOver="info('${html:LANG_I3}'); return true" onMouseOut="info('&nbsp;'); return true"
title='${html:LANG_I3}' onMouseOver="info('${js:LANG_I3}'); return true" onMouseOut="info('&nbsp;'); return true"
>
${listid:build:LISTDEF_3}
</select>
<input type="button" value="${LANG_O2}"
onClick="form.build.selectedIndex=14; window.open('option2b.html', 'option2b', 'toolbar=no, location=no, directories=no, status=yes, menubar=no, scrollbars=yes, resizable=yes, width=640, height=480').wparent=document; form.submit();"
title='${html:LANG_I4}' onMouseOver="info('${html:LANG_I4}'); return true" onMouseOut="info('&nbsp;'); return true"
title='${html:LANG_I4}' onMouseOver="info('${js:LANG_I4}'); return true" onMouseOut="info('&nbsp;'); return true"
>
<!-- checkboxes -->
<table border="0" width="100%" cellspacing="0">
<tr><td>
<select name="dos"
title='${html:LANG_I8} ${html:LANG_I8b}' onMouseOver="info('${html:LANG_I8}\r\n${LANG_I8b}'); return true" onMouseOut="info('&nbsp;'); return true"
title='${html:LANG_I8} ${html:LANG_I8b}' onMouseOver="info('${js:LANG_I8}\r\n${js:LANG_I8b}'); return true" onMouseOut="info('&nbsp;'); return true"
>
<option value="0"${ztest:dos: selected::}>&nbsp;</option>
<option value="1"${ztest:dos:: selected:}>${LANG_I37}</option>
@@ -130,26 +130,26 @@ ${listid:build:LISTDEF_3}
</select>
</td></tr>
<tr><td><input type="checkbox" name="errpage" ${checked:errpage}
title='${html:LANG_I9}' onMouseOver="info('${html:LANG_I9}'); return true" onMouseOut="info('&nbsp;'); return true"
title='${html:LANG_I9}' onMouseOver="info('${js:LANG_I9}'); return true" onMouseOut="info('&nbsp;'); return true"
> ${LANG_I38}</td></tr>
<tr><td><input type="checkbox" name="external" ${checked:external}
title='${html:LANG_I29}' onMouseOver="info('${html:LANG_I29}'); return true" onMouseOut="info('&nbsp;'); return true"
title='${html:LANG_I29}' onMouseOver="info('${js:LANG_I29}'); return true" onMouseOut="info('&nbsp;'); return true"
> ${LANG_I56}</td></tr>
<tr><td><input type="checkbox" name="hidepwd" ${checked:hidepwd}
title='${html:LANG_I30}' onMouseOver="info('${html:LANG_I30}'); return true" onMouseOut="info('&nbsp;'); return true"
title='${html:LANG_I30}' onMouseOver="info('${js:LANG_I30}'); return true" onMouseOut="info('&nbsp;'); return true"
> ${LANG_I66}</td></tr>
<tr><td><input type="checkbox" name="hidequery" ${checked:hidequery}
title='${html:LANG_I30b}' onMouseOver="info('${html:LANG_I30b}'); return true" onMouseOut="info('&nbsp;'); return true"
title='${html:LANG_I30b}' onMouseOver="info('${js:LANG_I30b}'); return true" onMouseOut="info('&nbsp;'); return true"
> ${LANG_I67}</td></tr>
<tr><td><input type="checkbox" name="nopurge" ${checked:nopurge}
title='${html:LANG_I1a}' onMouseOver="info('${html:LANG_I1a}'); return true" onMouseOut="info('&nbsp;'); return true"
title='${html:LANG_I1a}' onMouseOver="info('${js:LANG_I1a}'); return true" onMouseOut="info('&nbsp;'); return true"
> ${LANG_I57}</td></tr>
<tr><td><input type="checkbox" name="singlefile" ${checked:singlefile}
title='${html:LANG_SINGLEFILETIP}' onMouseOver="info('${html:LANG_SINGLEFILETIP}'); return true" onMouseOut="info('&nbsp;'); return true"
title='${html:LANG_SINGLEFILETIP}' onMouseOver="info('${js:LANG_SINGLEFILETIP}'); return true" onMouseOut="info('&nbsp;'); return true"
> ${LANG_SINGLEFILE}</td></tr>
<tr><td>${LANG_SINGLEFILEMAX}
<input name="singlefilemax" value="${singlefilemax}" size="12"
title='${html:LANG_SINGLEFILEMAXTIP}' onMouseOver="info('${html:LANG_SINGLEFILEMAXTIP}'); return true" onMouseOut="info('&nbsp;'); return true"
title='${html:LANG_SINGLEFILEMAXTIP}' onMouseOver="info('${js:LANG_SINGLEFILEMAXTIP}'); return true" onMouseOut="info('&nbsp;'); return true"
></td></tr>
</table>
@@ -158,12 +158,12 @@ ${listid:build:LISTDEF_3}
<tr><td align="left">
<input type="submit" value="${LANG_OK}"
onClick="form.closeme.value=1; form.submit(); return false;"
title='${html:LANG_TIPOK}' onMouseOver="info('${html:LANG_TIPOK}'); return true" onMouseOut="info('&nbsp;'); return true"
title='${html:LANG_TIPOK}' onMouseOver="info('${js:LANG_TIPOK}'); return true" onMouseOut="info('&nbsp;'); return true"
>
</td><td align="right">
<input type="button" value="${LANG_CANCEL}"
onClick="window.close();"
title='${html:LANG_TIPCANCEL}' onMouseOver="info('${html:LANG_TIPCANCEL}'); return true" onMouseOut="info('&nbsp;'); return true"
title='${html:LANG_TIPCANCEL}' onMouseOver="info('${js:LANG_TIPCANCEL}'); return true" onMouseOut="info('&nbsp;'); return true"
>
</td></tr>
</table>

View File

@@ -4,7 +4,7 @@
<meta http-equiv="Content-Type" content="text/html; charset=${LANGUAGE_CHARSET}" />
<meta name="description" content="${LANG_METADESC}" />
<meta name="keywords" content="${LANG_METAKEYW}" />
<title>'${projname}' - HTTrack Website Copier</title>
<title>'${html:projname}' - HTTrack Website Copier</title>
<link rel="stylesheet" type="text/css" media="screen" href="style.css">
<script type="text/javascript" src="ping.js" defer></script>
@@ -41,7 +41,7 @@ function str_replace(str,from,to) {
<table width="76%" border="0" align="center" cellspacing="0" cellpadding="0" class="tableWidth">
<tr>
<td><img src="images/header_title_4.gif" width="400" height="34" alt="HTTrack Website Copier" title="" border="0" id="title" /></td>
<td><img src="images/wordmark.svg" width="400" height="36" alt="HTTrack Website Copier" title="" border="0" id="title" /></td>
</tr>
</table>
@@ -70,7 +70,7 @@ ${do:if-file-exists:html/index.html}
<td>
<a href="/guide.html#web/opt-build" target="_blank"
onClick="window.open('/guide.html#web/opt-build', 'help', 'toolbar=no, location=no, directories=no, status=yes, menubar=no, scrollbars=yes, resizable=yes, width=980, height=760'); return false"
title='${html:LANG_TIPHELP}' onMouseOver="info('${html:LANG_TIPHELP}'); return true" onMouseOut="info('&nbsp;'); return true"
title='${html:LANG_TIPHELP}' onMouseOver="info('${js:LANG_TIPHELP}'); return true" onMouseOut="info('&nbsp;'); return true"
>${LANG_TIPHELP}</a>
</td>
${do:end-if}
@@ -105,14 +105,14 @@ ${LANG_Q3}
<tr><td align="left">
<input type="submit" value="${LANG_OK}"
${do:output-mode:html-urlescaped}
onClick="if (confirm(str_replace(str_replace('${LANG_DIAL7}', '%20', ' '), '%0a', ' '))) { form.closeme.value=1; form.submit(); } return false;"
onClick="if (confirm(str_replace(str_replace('${js:LANG_DIAL7}', '%20', ' '), '%0a', ' '))) { form.closeme.value=1; form.submit(); } return false;"
${do:output-mode:}
title='${html:LANG_TIPOK}' onMouseOver="info('${html:LANG_TIPOK}'); return true" onMouseOut="info('&nbsp;'); return true"
title='${html:LANG_TIPOK}' onMouseOver="info('${js:LANG_TIPOK}'); return true" onMouseOut="info('&nbsp;'); return true"
>
</td><td align="right">
<input type="button" value="${LANG_CANCEL}"
onClick="window.close();"
title='${html:LANG_TIPCANCEL}' onMouseOver="info('${html:LANG_TIPCANCEL}'); return true" onMouseOut="info('&nbsp;'); return true"
title='${html:LANG_TIPCANCEL}' onMouseOver="info('${js:LANG_TIPCANCEL}'); return true" onMouseOut="info('&nbsp;'); return true"
>
</td></tr>
</table>

View File

@@ -4,7 +4,7 @@
<meta http-equiv="Content-Type" content="text/html; charset=${LANGUAGE_CHARSET}" />
<meta name="description" content="${LANG_METADESC}" />
<meta name="keywords" content="${LANG_METAKEYW}" />
<title>'${projname}' - HTTrack Website Copier</title>
<title>'${html:projname}' - HTTrack Website Copier</title>
<link rel="stylesheet" type="text/css" media="screen" href="style.css">
<script type="text/javascript" src="ping.js" defer></script>
@@ -31,7 +31,7 @@ function info(str) {
<table width="76%" border="0" align="center" cellspacing="0" cellpadding="0" class="tableWidth">
<tr>
<td><img src="images/header_title_4.gif" width="400" height="34" alt="HTTrack Website Copier" title="" border="0" id="title" /></td>
<td><img src="images/wordmark.svg" width="400" height="36" alt="HTTrack Website Copier" title="" border="0" id="title" /></td>
</tr>
</table>
@@ -60,7 +60,7 @@ ${do:if-file-exists:html/index.html}
<td>
<a href="/guide.html#web/opt-experts-only" target="_blank"
onClick="window.open('/guide.html#web/opt-experts-only', 'help', 'toolbar=no, location=no, directories=no, status=yes, menubar=no, scrollbars=yes, resizable=yes, width=980, height=760'); return false"
title='${html:LANG_TIPHELP}' onMouseOver="info('${html:LANG_TIPHELP}'); return true" onMouseOut="info('&nbsp;'); return true"
title='${html:LANG_TIPHELP}' onMouseOver="info('${js:LANG_TIPHELP}'); return true" onMouseOut="info('&nbsp;'); return true"
>${LANG_TIPHELP}</a>
</td>
${do:end-if}
@@ -71,18 +71,18 @@ ${do:end-if}
<table class="tableWidth" border="0" width="100%" cellspacing="0">
<tr>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option1.html" onClick="form.redirect.value='option1.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT1}' onMouseOver="info('${html:LANG_IOPT1}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT1}</a></td>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option2.html" onClick="form.redirect.value='option2.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT2}' onMouseOver="info('${html:LANG_IOPT2}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT2}</a></td>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option3.html" onClick="form.redirect.value='option3.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT3}' onMouseOver="info('${html:LANG_IOPT3}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT3}</a></td>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option4.html" onClick="form.redirect.value='option4.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT4}' onMouseOver="info('${html:LANG_IOPT4}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT4}</a></td>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option5.html" onClick="form.redirect.value='option5.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT5}' onMouseOver="info('${html:LANG_IOPT5}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT5}</a></td>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option11.html" onClick="form.redirect.value='option11.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT11}' onMouseOver="info('${html:LANG_IOPT11}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT11}</a></td>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option1.html" onClick="form.redirect.value='option1.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT1}' onMouseOver="info('${js:LANG_IOPT1}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT1}</a></td>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option2.html" onClick="form.redirect.value='option2.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT2}' onMouseOver="info('${js:LANG_IOPT2}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT2}</a></td>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option3.html" onClick="form.redirect.value='option3.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT3}' onMouseOver="info('${js:LANG_IOPT3}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT3}</a></td>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option4.html" onClick="form.redirect.value='option4.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT4}' onMouseOver="info('${js:LANG_IOPT4}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT4}</a></td>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option5.html" onClick="form.redirect.value='option5.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT5}' onMouseOver="info('${js:LANG_IOPT5}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT5}</a></td>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option11.html" onClick="form.redirect.value='option11.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT11}' onMouseOver="info('${js:LANG_IOPT11}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT11}</a></td>
</tr><tr>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option6.html" onClick="form.redirect.value='option6.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT6}' onMouseOver="info('${html:LANG_IOPT6}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT6}</a></td>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option7.html" onClick="form.redirect.value='option7.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT7}' onMouseOver="info('${html:LANG_IOPT7}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT7}</a></td>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option8.html" onClick="form.redirect.value='option8.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT8}' onMouseOver="info('${html:LANG_IOPT8}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT8}</a></td>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option9.html" onClick="form.redirect.value='option9.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT9}' onMouseOver="info('${html:LANG_IOPT9}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT9}</a></td>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option10.html" onClick="form.redirect.value='option10.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT10}' onMouseOver="info('${html:LANG_IOPT10}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT10}</a></td>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option6.html" onClick="form.redirect.value='option6.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT6}' onMouseOver="info('${js:LANG_IOPT6}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT6}</a></td>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option7.html" onClick="form.redirect.value='option7.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT7}' onMouseOver="info('${js:LANG_IOPT7}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT7}</a></td>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option8.html" onClick="form.redirect.value='option8.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT8}' onMouseOver="info('${js:LANG_IOPT8}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT8}</a></td>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option9.html" onClick="form.redirect.value='option9.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT9}' onMouseOver="info('${js:LANG_IOPT9}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT9}</a></td>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option10.html" onClick="form.redirect.value='option10.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT10}' onMouseOver="info('${js:LANG_IOPT10}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT10}</a></td>
<td class="tabCtrl" align="center">&nbsp;</td>
</tr>
@@ -107,7 +107,7 @@ ${LANG_I40c}
<!-- checkboxes -->
<table border="0" width="100%" cellspacing="0">
<tr><td><input type="checkbox" name="cache" ${checked:cache}
title='${html:LANG_I5}' onMouseOver="info('${html:LANG_I5}'); return true" onMouseOut="info('&nbsp;'); return true"
title='${html:LANG_I5}' onMouseOver="info('${js:LANG_I5}'); return true" onMouseOut="info('&nbsp;'); return true"
> ${LANG_I34}</td></tr>
</table>
<br>
@@ -115,7 +115,7 @@ ${LANG_I40c}
${LANG_I39}
<br>
<select name="filter"
title='${html:LANG_I29}' onMouseOver="info('${html:LANG_I29}'); return true" onMouseOut="info('&nbsp;'); return true"
title='${html:LANG_I29}' onMouseOver="info('${js:LANG_I29}'); return true" onMouseOut="info('&nbsp;'); return true"
>
${listid:filter:LISTDEF_4}
</select>
@@ -124,7 +124,7 @@ ${listid:filter:LISTDEF_4}
${LANG_I40}
<br>
<select name="travel"
title='${html:LANG_I11}' onMouseOver="info('${html:LANG_I11}'); return true" onMouseOut="info('&nbsp;'); return true"
title='${html:LANG_I11}' onMouseOver="info('${js:LANG_I11}'); return true" onMouseOut="info('&nbsp;'); return true"
>
${listid:travel:LISTDEF_5}
</select>
@@ -133,7 +133,7 @@ ${listid:travel:LISTDEF_5}
${LANG_I40b}
<br>
<select name="travel2"
title='${html:LANG_I11b}' onMouseOver="info('${html:LANG_I11b}'); return true" onMouseOut="info('&nbsp;'); return true"
title='${html:LANG_I11b}' onMouseOver="info('${js:LANG_I11b}'); return true" onMouseOut="info('&nbsp;'); return true"
>
${listid:travel2:LISTDEF_6}
</select>
@@ -142,7 +142,7 @@ ${listid:travel2:LISTDEF_6}
${LANG_I40e}
<br>
<select name="travel3"
title='${html:LANG_I11c}' onMouseOver="info('${html:LANG_I11c}'); return true" onMouseOut="info('&nbsp;'); return true"
title='${html:LANG_I11c}' onMouseOver="info('${js:LANG_I11c}'); return true" onMouseOut="info('&nbsp;'); return true"
>
${listid:travel3:LISTDEF_11}
</select>
@@ -151,7 +151,7 @@ ${listid:travel3:LISTDEF_11}
<!-- checkboxes -->
<table border="0" width="100%" cellspacing="0">
<tr><td><input type="checkbox" name="windebug" ${checked:windebug}
title='${html:LANG_I1h}' onMouseOver="info('${html:LANG_I1h}'); return true" onMouseOut="info('&nbsp;'); return true"
title='${html:LANG_I1h}' onMouseOver="info('${js:LANG_I1h}'); return true" onMouseOut="info('&nbsp;'); return true"
> ${LANG_I40d}</td></tr>
</table>
<br>
@@ -161,12 +161,12 @@ ${listid:travel3:LISTDEF_11}
<tr><td align="left">
<input type="submit" value="${LANG_OK}"
onClick="form.closeme.value=1; form.submit(); return false;"
title='${html:LANG_TIPOK}' onMouseOver="info('${html:LANG_TIPOK}'); return true" onMouseOut="info('&nbsp;'); return true"
title='${html:LANG_TIPOK}' onMouseOver="info('${js:LANG_TIPOK}'); return true" onMouseOut="info('&nbsp;'); return true"
>
</td><td align="right">
<input type="button" value="${LANG_CANCEL}"
onClick="window.close();"
title='${html:LANG_TIPCANCEL}' onMouseOver="info('${html:LANG_TIPCANCEL}'); return true" onMouseOut="info('&nbsp;'); return true"
title='${html:LANG_TIPCANCEL}' onMouseOver="info('${js:LANG_TIPCANCEL}'); return true" onMouseOut="info('&nbsp;'); return true"
>
</td></tr>
</table>

View File

@@ -4,7 +4,7 @@
<meta http-equiv="Content-Type" content="text/html; charset=${LANGUAGE_CHARSET}" />
<meta name="description" content="${LANG_METADESC}" />
<meta name="keywords" content="${LANG_METAKEYW}" />
<title>'${projname}' - HTTrack Website Copier</title>
<title>'${html:projname}' - HTTrack Website Copier</title>
<link rel="stylesheet" type="text/css" media="screen" href="style.css">
<script type="text/javascript" src="ping.js" defer></script>
@@ -31,7 +31,7 @@ function info(str) {
<table width="76%" border="0" align="center" cellspacing="0" cellpadding="0" class="tableWidth">
<tr>
<td><img src="images/header_title_4.gif" width="400" height="34" alt="HTTrack Website Copier" title="" border="0" id="title" /></td>
<td><img src="images/wordmark.svg" width="400" height="36" alt="HTTrack Website Copier" title="" border="0" id="title" /></td>
</tr>
</table>
@@ -60,7 +60,7 @@ ${do:if-file-exists:html/index.html}
<td>
<a href="/guide.html#web/opt-flow-control" target="_blank"
onClick="window.open('/guide.html#web/opt-flow-control', 'help', 'toolbar=no, location=no, directories=no, status=yes, menubar=no, scrollbars=yes, resizable=yes, width=980, height=760'); return false"
title='${html:LANG_TIPHELP}' onMouseOver="info('${html:LANG_TIPHELP}'); return true" onMouseOut="info('&nbsp;'); return true"
title='${html:LANG_TIPHELP}' onMouseOver="info('${js:LANG_TIPHELP}'); return true" onMouseOut="info('&nbsp;'); return true"
>${LANG_TIPHELP}</a>
</td>
${do:end-if}
@@ -71,18 +71,18 @@ ${do:end-if}
<table class="tableWidth" border="0" width="100%" cellspacing="0">
<tr>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option1.html" onClick="form.redirect.value='option1.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT1}' onMouseOver="info('${html:LANG_IOPT1}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT1}</a></td>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option2.html" onClick="form.redirect.value='option2.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT2}' onMouseOver="info('${html:LANG_IOPT2}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT2}</a></td>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option3.html" onClick="form.redirect.value='option3.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT3}' onMouseOver="info('${html:LANG_IOPT3}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT3}</a></td>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option4.html" onClick="form.redirect.value='option4.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT4}' onMouseOver="info('${html:LANG_IOPT4}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT4}</a></td>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option5.html" onClick="form.redirect.value='option5.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT5}' onMouseOver="info('${html:LANG_IOPT5}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT5}</a></td>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option11.html" onClick="form.redirect.value='option11.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT11}' onMouseOver="info('${html:LANG_IOPT11}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT11}</a></td>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option1.html" onClick="form.redirect.value='option1.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT1}' onMouseOver="info('${js:LANG_IOPT1}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT1}</a></td>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option2.html" onClick="form.redirect.value='option2.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT2}' onMouseOver="info('${js:LANG_IOPT2}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT2}</a></td>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option3.html" onClick="form.redirect.value='option3.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT3}' onMouseOver="info('${js:LANG_IOPT3}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT3}</a></td>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option4.html" onClick="form.redirect.value='option4.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT4}' onMouseOver="info('${js:LANG_IOPT4}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT4}</a></td>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option5.html" onClick="form.redirect.value='option5.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT5}' onMouseOver="info('${js:LANG_IOPT5}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT5}</a></td>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option11.html" onClick="form.redirect.value='option11.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT11}' onMouseOver="info('${js:LANG_IOPT11}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT11}</a></td>
</tr><tr>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option6.html" onClick="form.redirect.value='option6.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT6}' onMouseOver="info('${html:LANG_IOPT6}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT6}</a></td>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option7.html" onClick="form.redirect.value='option7.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT7}' onMouseOver="info('${html:LANG_IOPT7}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT7}</a></td>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option8.html" onClick="form.redirect.value='option8.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT8}' onMouseOver="info('${html:LANG_IOPT8}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT8}</a></td>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option9.html" onClick="form.redirect.value='option9.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT9}' onMouseOver="info('${html:LANG_IOPT9}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT9}</a></td>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option10.html" onClick="form.redirect.value='option10.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT10}' onMouseOver="info('${html:LANG_IOPT10}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT10}</a></td>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option6.html" onClick="form.redirect.value='option6.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT6}' onMouseOver="info('${js:LANG_IOPT6}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT6}</a></td>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option7.html" onClick="form.redirect.value='option7.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT7}' onMouseOver="info('${js:LANG_IOPT7}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT7}</a></td>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option8.html" onClick="form.redirect.value='option8.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT8}' onMouseOver="info('${js:LANG_IOPT8}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT8}</a></td>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option9.html" onClick="form.redirect.value='option9.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT9}' onMouseOver="info('${js:LANG_IOPT9}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT9}</a></td>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option10.html" onClick="form.redirect.value='option10.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT10}' onMouseOver="info('${js:LANG_IOPT10}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT10}</a></td>
<td class="tabCtrl" align="center">&nbsp;</td>
</tr>
@@ -109,11 +109,11 @@ ${do:end-if}
${LANG_I44}
</td><td>
<input name="connexion" value="${connexion}" size="4"
title='${html:LANG_I12}' onMouseOver="info('${html:LANG_I12}'); return true" onMouseOut="info('&nbsp;'); return true"
title='${html:LANG_I12}' onMouseOver="info('${js:LANG_I12}'); return true" onMouseOut="info('&nbsp;'); return true"
>
</td></tr><tr><td></td><td>
<input type="checkbox" name="ka" ${checked:ka}
title='${html:LANG_I47f}' onMouseOver="info('${html:LANG_I47f}'); return true" onMouseOut="info('&nbsp;'); return true"
title='${html:LANG_I47f}' onMouseOver="info('${js:LANG_I47f}'); return true" onMouseOut="info('&nbsp;'); return true"
> ${LANG_I47e}
</td></tr>
@@ -121,11 +121,11 @@ ${LANG_I44}
${LANG_I47d}
</td><td>
<input name="timeout" value="${timeout}" size="4"
title='${html:LANG_I13}' onMouseOver="info('${html:LANG_I13}'); return true" onMouseOut="info('&nbsp;'); return true"
title='${html:LANG_I13}' onMouseOver="info('${js:LANG_I13}'); return true" onMouseOut="info('&nbsp;'); return true"
>
</td></tr><tr><td></td><td>
<input type="checkbox" name="remt" ${checked:remt}
title='${html:LANG_I14}' onMouseOver="info('${html:LANG_I14}'); return true" onMouseOut="info('&nbsp;'); return true"
title='${html:LANG_I14}' onMouseOver="info('${js:LANG_I14}'); return true" onMouseOut="info('&nbsp;'); return true"
> ${LANG_I45}
</td></tr>
@@ -133,7 +133,7 @@ ${LANG_I47d}
${LANG_I48}
</td><td>
<input name="retry" value="${retry}" size="4"
title='${html:LANG_I17}' onMouseOver="info('${html:LANG_I17}'); return true" onMouseOut="info('&nbsp;'); return true"
title='${html:LANG_I17}' onMouseOver="info('${js:LANG_I17}'); return true" onMouseOut="info('&nbsp;'); return true"
>
</td></tr>
@@ -141,11 +141,11 @@ ${LANG_I48}
${LANG_I46}
</td><td>
<input name="rate" value="${rate}" size="4"
title='${html:LANG_I15}' onMouseOver="info('${html:LANG_I15}'); return true" onMouseOut="info('&nbsp;'); return true"
title='${html:LANG_I15}' onMouseOver="info('${js:LANG_I15}'); return true" onMouseOut="info('&nbsp;'); return true"
>
</td></tr><tr><td></td><td>
<input type="checkbox" name="rems" ${checked:rems}
title='${html:LANG_I16}' onMouseOver="info('${html:LANG_I16}'); return true" onMouseOut="info('&nbsp;'); return true"
title='${html:LANG_I16}' onMouseOver="info('${js:LANG_I16}'); return true" onMouseOut="info('&nbsp;'); return true"
> ${LANG_I47}
</td></tr>
@@ -156,12 +156,12 @@ ${LANG_I46}
<tr><td align="left">
<input type="submit" value="${LANG_OK}"
onClick="form.closeme.value=1; form.submit(); return false;"
title='${html:LANG_TIPOK}' onMouseOver="info('${html:LANG_TIPOK}'); return true" onMouseOut="info('&nbsp;'); return true"
title='${html:LANG_TIPOK}' onMouseOver="info('${js:LANG_TIPOK}'); return true" onMouseOut="info('&nbsp;'); return true"
>
</td><td align="right">
<input type="button" value="${LANG_CANCEL}"
onClick="window.close();"
title='${html:LANG_TIPCANCEL}' onMouseOver="info('${html:LANG_TIPCANCEL}'); return true" onMouseOut="info('&nbsp;'); return true"
title='${html:LANG_TIPCANCEL}' onMouseOver="info('${js:LANG_TIPCANCEL}'); return true" onMouseOut="info('&nbsp;'); return true"
>
</td></tr>
</table>

View File

@@ -4,7 +4,7 @@
<meta http-equiv="Content-Type" content="text/html; charset=${LANGUAGE_CHARSET}" />
<meta name="description" content="${LANG_METADESC}" />
<meta name="keywords" content="${LANG_METAKEYW}" />
<title>'${projname}' - HTTrack Website Copier</title>
<title>'${html:projname}' - HTTrack Website Copier</title>
<link rel="stylesheet" type="text/css" media="screen" href="style.css">
<script type="text/javascript" src="ping.js" defer></script>
@@ -31,7 +31,7 @@ function info(str) {
<table width="76%" border="0" align="center" cellspacing="0" cellpadding="0" class="tableWidth">
<tr>
<td><img src="images/header_title_4.gif" width="400" height="34" alt="HTTrack Website Copier" title="" border="0" id="title" /></td>
<td><img src="images/wordmark.svg" width="400" height="36" alt="HTTrack Website Copier" title="" border="0" id="title" /></td>
</tr>
</table>
@@ -60,7 +60,7 @@ ${do:if-file-exists:html/index.html}
<td>
<a href="/guide.html#web/opt-limits" target="_blank"
onClick="window.open('/guide.html#web/opt-limits', 'help', 'toolbar=no, location=no, directories=no, status=yes, menubar=no, scrollbars=yes, resizable=yes, width=980, height=760'); return false"
title='${html:LANG_TIPHELP}' onMouseOver="info('${html:LANG_TIPHELP}'); return true" onMouseOut="info('&nbsp;'); return true"
title='${html:LANG_TIPHELP}' onMouseOver="info('${js:LANG_TIPHELP}'); return true" onMouseOut="info('&nbsp;'); return true"
>${LANG_TIPHELP}</a>
</td>
${do:end-if}
@@ -71,18 +71,18 @@ ${do:end-if}
<table class="tableWidth" border="0" width="100%" cellspacing="0">
<tr>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option1.html" onClick="form.redirect.value='option1.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT1}' onMouseOver="info('${html:LANG_IOPT1}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT1}</a></td>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option2.html" onClick="form.redirect.value='option2.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT2}' onMouseOver="info('${html:LANG_IOPT2}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT2}</a></td>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option3.html" onClick="form.redirect.value='option3.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT3}' onMouseOver="info('${html:LANG_IOPT3}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT3}</a></td>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option4.html" onClick="form.redirect.value='option4.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT4}' onMouseOver="info('${html:LANG_IOPT4}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT4}</a></td>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option5.html" onClick="form.redirect.value='option5.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT5}' onMouseOver="info('${html:LANG_IOPT5}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT5}</a></td>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option11.html" onClick="form.redirect.value='option11.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT11}' onMouseOver="info('${html:LANG_IOPT11}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT11}</a></td>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option1.html" onClick="form.redirect.value='option1.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT1}' onMouseOver="info('${js:LANG_IOPT1}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT1}</a></td>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option2.html" onClick="form.redirect.value='option2.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT2}' onMouseOver="info('${js:LANG_IOPT2}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT2}</a></td>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option3.html" onClick="form.redirect.value='option3.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT3}' onMouseOver="info('${js:LANG_IOPT3}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT3}</a></td>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option4.html" onClick="form.redirect.value='option4.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT4}' onMouseOver="info('${js:LANG_IOPT4}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT4}</a></td>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option5.html" onClick="form.redirect.value='option5.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT5}' onMouseOver="info('${js:LANG_IOPT5}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT5}</a></td>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option11.html" onClick="form.redirect.value='option11.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT11}' onMouseOver="info('${js:LANG_IOPT11}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT11}</a></td>
</tr><tr>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option6.html" onClick="form.redirect.value='option6.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT6}' onMouseOver="info('${html:LANG_IOPT6}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT6}</a></td>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option7.html" onClick="form.redirect.value='option7.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT7}' onMouseOver="info('${html:LANG_IOPT7}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT7}</a></td>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option8.html" onClick="form.redirect.value='option8.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT8}' onMouseOver="info('${html:LANG_IOPT8}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT8}</a></td>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option9.html" onClick="form.redirect.value='option9.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT9}' onMouseOver="info('${html:LANG_IOPT9}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT9}</a></td>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option10.html" onClick="form.redirect.value='option10.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT10}' onMouseOver="info('${html:LANG_IOPT10}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT10}</a></td>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option6.html" onClick="form.redirect.value='option6.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT6}' onMouseOver="info('${js:LANG_IOPT6}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT6}</a></td>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option7.html" onClick="form.redirect.value='option7.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT7}' onMouseOver="info('${js:LANG_IOPT7}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT7}</a></td>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option8.html" onClick="form.redirect.value='option8.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT8}' onMouseOver="info('${js:LANG_IOPT8}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT8}</a></td>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option9.html" onClick="form.redirect.value='option9.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT9}' onMouseOver="info('${js:LANG_IOPT9}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT9}</a></td>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option10.html" onClick="form.redirect.value='option10.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT10}' onMouseOver="info('${js:LANG_IOPT10}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT10}</a></td>
<td class="tabCtrl" align="center">&nbsp;</td>
</tr>
@@ -104,7 +104,7 @@ ${do:end-if}
${LANG_G32}
</td><td>
<input name="depth" value="${depth}" size="4"
title='${html:LANG_I1g}' onMouseOver="info('${html:LANG_I1g}'); return true" onMouseOut="info('&nbsp;'); return true"
title='${html:LANG_I1g}' onMouseOver="info('${js:LANG_I1g}'); return true" onMouseOut="info('&nbsp;'); return true"
>
</td></tr>
@@ -112,7 +112,7 @@ ${LANG_G32}
${LANG_G32b}
</td><td>
<input name="depth2" value="${depth2}" size="4"
title='${html:LANG_I1g2}' onMouseOver="info('${html:LANG_I1g2}'); return true" onMouseOut="info('&nbsp;'); return true"
title='${html:LANG_I1g2}' onMouseOver="info('${js:LANG_I1g2}'); return true" onMouseOut="info('&nbsp;'); return true"
>
</td></tr>
@@ -120,7 +120,7 @@ ${LANG_G32b}
${LANG_I50}
</td><td>
<input name="maxhtml" value="${maxhtml}" size="4"
title='${html:LANG_I18}' onMouseOver="info('${html:LANG_I18}'); return true" onMouseOut="info('&nbsp;'); return true"
title='${html:LANG_I18}' onMouseOver="info('${js:LANG_I18}'); return true" onMouseOut="info('&nbsp;'); return true"
>
</td></tr>
@@ -128,7 +128,7 @@ ${LANG_I50}
${LANG_I50b}
</td><td>
<input name="othermax" value="${othermax}" size="4"
title='${html:LANG_I19}' onMouseOver="info('${html:LANG_I19}'); return true" onMouseOut="info('&nbsp;'); return true"
title='${html:LANG_I19}' onMouseOver="info('${js:LANG_I19}'); return true" onMouseOut="info('&nbsp;'); return true"
>
</td></tr>
@@ -136,7 +136,7 @@ ${LANG_I50b}
${LANG_I51}
</td><td>
<input name="sizemax" value="${sizemax}" size="4"
title='${html:LANG_I20}' onMouseOver="info('${html:LANG_I20}'); return true" onMouseOut="info('&nbsp;'); return true"
title='${html:LANG_I20}' onMouseOver="info('${js:LANG_I20}'); return true" onMouseOut="info('&nbsp;'); return true"
>
</td></tr>
@@ -144,7 +144,7 @@ ${LANG_I51}
${LANG_I65}
</td><td>
<input name="pausebytes" value="${pausebytes}" size="4"
title='${html:LANG_I20b}' onMouseOver="info('${html:LANG_I20b}'); return true" onMouseOut="info('&nbsp;'); return true"
title='${html:LANG_I20b}' onMouseOver="info('${js:LANG_I20b}'); return true" onMouseOut="info('&nbsp;'); return true"
>
</td></tr>
@@ -152,7 +152,7 @@ ${LANG_I65}
${LANG_PAUSEFILES}
</td><td>
<input name="pausefiles" value="${pausefiles}" size="8"
title='${html:LANG_PAUSEFILESTIP}' onMouseOver="info('${html:LANG_PAUSEFILESTIP}'); return true" onMouseOut="info('&nbsp;'); return true"
title='${html:LANG_PAUSEFILESTIP}' onMouseOver="info('${js:LANG_PAUSEFILESTIP}'); return true" onMouseOut="info('&nbsp;'); return true"
>
</td></tr>
@@ -160,7 +160,7 @@ ${LANG_PAUSEFILES}
${LANG_I52}
</td><td>
<input name="maxtime" value="${maxtime}" size="4"
title='${html:LANG_I21}' onMouseOver="info('${html:LANG_I21}'); return true" onMouseOut="info('&nbsp;'); return true"
title='${html:LANG_I21}' onMouseOver="info('${js:LANG_I21}'); return true" onMouseOut="info('&nbsp;'); return true"
>
</td></tr>
@@ -168,7 +168,7 @@ ${LANG_I52}
${LANG_I54}
</td><td>
<input name="maxrate" value="${maxrate}" size="4"
title='${html:LANG_I22}' onMouseOver="info('${html:LANG_I22}'); return true" onMouseOut="info('&nbsp;'); return true"
title='${html:LANG_I22}' onMouseOver="info('${js:LANG_I22}'); return true" onMouseOut="info('&nbsp;'); return true"
>
</td></tr>
@@ -176,7 +176,7 @@ ${LANG_I54}
${LANG_I64}
</td><td>
<input name="maxconn" value="${maxconn}" size="4"
title='${html:LANG_I22b}' onMouseOver="info('${html:LANG_I22b}'); return true" onMouseOut="info('&nbsp;'); return true"
title='${html:LANG_I22b}' onMouseOver="info('${js:LANG_I22b}'); return true" onMouseOut="info('&nbsp;'); return true"
>
</td></tr>
@@ -184,7 +184,7 @@ ${LANG_I64}
${LANG_I64b}
</td><td>
<input name="maxlinks" value="${maxlinks}" size="4"
title='${html:LANG_I22c}' onMouseOver="info('${html:LANG_I22c}'); return true" onMouseOut="info('&nbsp;'); return true"
title='${html:LANG_I22c}' onMouseOver="info('${js:LANG_I22c}'); return true" onMouseOut="info('&nbsp;'); return true"
>
</td></tr>
@@ -193,12 +193,12 @@ ${LANG_I64b}
<tr><td align="left">
<input type="submit" value="${LANG_OK}"
onClick="form.closeme.value=1; form.submit(); return false;"
title='${html:LANG_TIPOK}' onMouseOver="info('${html:LANG_TIPOK}'); return true" onMouseOut="info('&nbsp;'); return true"
title='${html:LANG_TIPOK}' onMouseOver="info('${js:LANG_TIPOK}'); return true" onMouseOut="info('&nbsp;'); return true"
>
</td><td align="right">
<input type="button" value="${LANG_CANCEL}"
onClick="window.close();"
title='${html:LANG_TIPCANCEL}' onMouseOver="info('${html:LANG_TIPCANCEL}'); return true" onMouseOut="info('&nbsp;'); return true"
title='${html:LANG_TIPCANCEL}' onMouseOver="info('${js:LANG_TIPCANCEL}'); return true" onMouseOut="info('&nbsp;'); return true"
>
</td></tr>
</table>

View File

@@ -4,7 +4,7 @@
<meta http-equiv="Content-Type" content="text/html; charset=${LANGUAGE_CHARSET}" />
<meta name="description" content="${LANG_METADESC}" />
<meta name="keywords" content="${LANG_METAKEYW}" />
<title>'${projname}' - HTTrack Website Copier</title>
<title>'${html:projname}' - HTTrack Website Copier</title>
<link rel="stylesheet" type="text/css" media="screen" href="style.css">
<script type="text/javascript" src="ping.js" defer></script>
@@ -31,7 +31,7 @@ function info(str) {
<table width="76%" border="0" align="center" cellspacing="0" cellpadding="0" class="tableWidth">
<tr>
<td><img src="images/header_title_4.gif" width="400" height="34" alt="HTTrack Website Copier" title="" border="0" id="title" /></td>
<td><img src="images/wordmark.svg" width="400" height="36" alt="HTTrack Website Copier" title="" border="0" id="title" /></td>
</tr>
</table>
@@ -60,7 +60,7 @@ ${do:if-file-exists:html/index.html}
<td>
<a href="/guide.html#web/opt-browser-id" target="_blank"
onClick="window.open('/guide.html#web/opt-browser-id', 'help', 'toolbar=no, location=no, directories=no, status=yes, menubar=no, scrollbars=yes, resizable=yes, width=980, height=760'); return false"
title='${html:LANG_TIPHELP}' onMouseOver="info('${html:LANG_TIPHELP}'); return true" onMouseOut="info('&nbsp;'); return true"
title='${html:LANG_TIPHELP}' onMouseOver="info('${js:LANG_TIPHELP}'); return true" onMouseOut="info('&nbsp;'); return true"
>${LANG_TIPHELP}</a>
</td>
${do:end-if}
@@ -71,18 +71,18 @@ ${do:end-if}
<table class="tableWidth" border="0" width="100%" cellspacing="0">
<tr>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option1.html" onClick="form.redirect.value='option1.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT1}' onMouseOver="info('${html:LANG_IOPT1}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT1}</a></td>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option2.html" onClick="form.redirect.value='option2.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT2}' onMouseOver="info('${html:LANG_IOPT2}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT2}</a></td>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option3.html" onClick="form.redirect.value='option3.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT3}' onMouseOver="info('${html:LANG_IOPT3}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT3}</a></td>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option4.html" onClick="form.redirect.value='option4.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT4}' onMouseOver="info('${html:LANG_IOPT4}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT4}</a></td>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option5.html" onClick="form.redirect.value='option5.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT5}' onMouseOver="info('${html:LANG_IOPT5}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT5}</a></td>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option11.html" onClick="form.redirect.value='option11.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT11}' onMouseOver="info('${html:LANG_IOPT11}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT11}</a></td>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option1.html" onClick="form.redirect.value='option1.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT1}' onMouseOver="info('${js:LANG_IOPT1}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT1}</a></td>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option2.html" onClick="form.redirect.value='option2.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT2}' onMouseOver="info('${js:LANG_IOPT2}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT2}</a></td>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option3.html" onClick="form.redirect.value='option3.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT3}' onMouseOver="info('${js:LANG_IOPT3}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT3}</a></td>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option4.html" onClick="form.redirect.value='option4.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT4}' onMouseOver="info('${js:LANG_IOPT4}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT4}</a></td>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option5.html" onClick="form.redirect.value='option5.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT5}' onMouseOver="info('${js:LANG_IOPT5}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT5}</a></td>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option11.html" onClick="form.redirect.value='option11.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT11}' onMouseOver="info('${js:LANG_IOPT11}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT11}</a></td>
</tr><tr>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option6.html" onClick="form.redirect.value='option6.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT6}' onMouseOver="info('${html:LANG_IOPT6}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT6}</a></td>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option7.html" onClick="form.redirect.value='option7.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT7}' onMouseOver="info('${html:LANG_IOPT7}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT7}</a></td>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option8.html" onClick="form.redirect.value='option8.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT8}' onMouseOver="info('${html:LANG_IOPT8}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT8}</a></td>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option9.html" onClick="form.redirect.value='option9.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT9}' onMouseOver="info('${html:LANG_IOPT9}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT9}</a></td>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option10.html" onClick="form.redirect.value='option10.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT10}' onMouseOver="info('${html:LANG_IOPT10}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT10}</a></td>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option6.html" onClick="form.redirect.value='option6.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT6}' onMouseOver="info('${js:LANG_IOPT6}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT6}</a></td>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option7.html" onClick="form.redirect.value='option7.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT7}' onMouseOver="info('${js:LANG_IOPT7}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT7}</a></td>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option8.html" onClick="form.redirect.value='option8.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT8}' onMouseOver="info('${js:LANG_IOPT8}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT8}</a></td>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option9.html" onClick="form.redirect.value='option9.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT9}' onMouseOver="info('${js:LANG_IOPT9}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT9}</a></td>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option10.html" onClick="form.redirect.value='option10.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT10}' onMouseOver="info('${js:LANG_IOPT10}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT10}</a></td>
<td class="tabCtrl" align="center">&nbsp;</td>
</tr>
@@ -104,7 +104,7 @@ ${do:end-if}
${LANG_I43}
</td><td>
<input name="user" value="${user}" size="60"
title='${html:LANG_I23}' onMouseOver="info('${html:LANG_I23}'); return true" onMouseOut="info('&nbsp;'); return true"
title='${html:LANG_I23}' onMouseOver="info('${js:LANG_I23}'); return true" onMouseOut="info('&nbsp;'); return true"
>
</td></tr>
@@ -112,7 +112,7 @@ ${LANG_I43}
${LANG_I43b}
</td><td>
<input name="footer" value="${footer}" size="60"
title='${html:LANG_I23b}' onMouseOver="info('${html:LANG_I23b}'); return true" onMouseOut="info('&nbsp;'); return true"
title='${html:LANG_I23b}' onMouseOver="info('${js:LANG_I23b}'); return true" onMouseOut="info('&nbsp;'); return true"
>
</td></tr>
@@ -123,12 +123,12 @@ ${LANG_I43b}
<tr><td align="left">
<input type="submit" value="${LANG_OK}"
onClick="form.closeme.value=1; form.submit(); return false;"
title='${html:LANG_TIPOK}' onMouseOver="info('${html:LANG_TIPOK}'); return true" onMouseOut="info('&nbsp;'); return true"
title='${html:LANG_TIPOK}' onMouseOver="info('${js:LANG_TIPOK}'); return true" onMouseOut="info('&nbsp;'); return true"
>
</td><td align="right">
<input type="button" value="${LANG_CANCEL}"
onClick="window.close();"
title='${html:LANG_TIPCANCEL}' onMouseOver="info('${html:LANG_TIPCANCEL}'); return true" onMouseOut="info('&nbsp;'); return true"
title='${html:LANG_TIPCANCEL}' onMouseOver="info('${js:LANG_TIPCANCEL}'); return true" onMouseOut="info('&nbsp;'); return true"
>
</td></tr>
</table>

View File

@@ -4,7 +4,7 @@
<meta http-equiv="Content-Type" content="text/html; charset=${LANGUAGE_CHARSET}" />
<meta name="description" content="${LANG_METADESC}" />
<meta name="keywords" content="${LANG_METAKEYW}" />
<title>'${projname}' - HTTrack Website Copier</title>
<title>'${html:projname}' - HTTrack Website Copier</title>
<link rel="stylesheet" type="text/css" media="screen" href="style.css">
<script type="text/javascript" src="ping.js" defer></script>
@@ -31,7 +31,7 @@ function info(str) {
<table width="76%" border="0" align="center" cellspacing="0" cellpadding="0" class="tableWidth">
<tr>
<td><img src="images/header_title_4.gif" width="400" height="34" alt="HTTrack Website Copier" title="" border="0" id="title" /></td>
<td><img src="images/wordmark.svg" width="400" height="36" alt="HTTrack Website Copier" title="" border="0" id="title" /></td>
</tr>
</table>
@@ -60,7 +60,7 @@ ${do:if-file-exists:html/index.html}
<td>
<a href="/guide.html#web/opt-scan-rules" target="_blank"
onClick="window.open('/guide.html#web/opt-scan-rules', 'help', 'toolbar=no, location=no, directories=no, status=yes, menubar=no, scrollbars=yes, resizable=yes, width=980, height=760'); return false"
title='${html:LANG_TIPHELP}' onMouseOver="info('${html:LANG_TIPHELP}'); return true" onMouseOut="info('&nbsp;'); return true"
title='${html:LANG_TIPHELP}' onMouseOver="info('${js:LANG_TIPHELP}'); return true" onMouseOut="info('&nbsp;'); return true"
>${LANG_TIPHELP}</a>
</td>
${do:end-if}
@@ -71,18 +71,18 @@ ${do:end-if}
<table class="tableWidth" border="0" width="100%" cellspacing="0">
<tr>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option1.html" onClick="form.redirect.value='option1.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT1}' onMouseOver="info('${html:LANG_IOPT1}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT1}</a></td>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option2.html" onClick="form.redirect.value='option2.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT2}' onMouseOver="info('${html:LANG_IOPT2}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT2}</a></td>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option3.html" onClick="form.redirect.value='option3.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT3}' onMouseOver="info('${html:LANG_IOPT3}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT3}</a></td>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option4.html" onClick="form.redirect.value='option4.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT4}' onMouseOver="info('${html:LANG_IOPT4}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT4}</a></td>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option5.html" onClick="form.redirect.value='option5.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT5}' onMouseOver="info('${html:LANG_IOPT5}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT5}</a></td>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option11.html" onClick="form.redirect.value='option11.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT11}' onMouseOver="info('${html:LANG_IOPT11}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT11}</a></td>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option1.html" onClick="form.redirect.value='option1.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT1}' onMouseOver="info('${js:LANG_IOPT1}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT1}</a></td>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option2.html" onClick="form.redirect.value='option2.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT2}' onMouseOver="info('${js:LANG_IOPT2}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT2}</a></td>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option3.html" onClick="form.redirect.value='option3.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT3}' onMouseOver="info('${js:LANG_IOPT3}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT3}</a></td>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option4.html" onClick="form.redirect.value='option4.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT4}' onMouseOver="info('${js:LANG_IOPT4}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT4}</a></td>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option5.html" onClick="form.redirect.value='option5.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT5}' onMouseOver="info('${js:LANG_IOPT5}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT5}</a></td>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option11.html" onClick="form.redirect.value='option11.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT11}' onMouseOver="info('${js:LANG_IOPT11}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT11}</a></td>
</tr><tr>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option6.html" onClick="form.redirect.value='option6.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT6}' onMouseOver="info('${html:LANG_IOPT6}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT6}</a></td>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option7.html" onClick="form.redirect.value='option7.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT7}' onMouseOver="info('${html:LANG_IOPT7}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT7}</a></td>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option8.html" onClick="form.redirect.value='option8.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT8}' onMouseOver="info('${html:LANG_IOPT8}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT8}</a></td>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option9.html" onClick="form.redirect.value='option9.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT9}' onMouseOver="info('${html:LANG_IOPT9}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT9}</a></td>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option10.html" onClick="form.redirect.value='option10.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT10}' onMouseOver="info('${html:LANG_IOPT10}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT10}</a></td>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option6.html" onClick="form.redirect.value='option6.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT6}' onMouseOver="info('${js:LANG_IOPT6}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT6}</a></td>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option7.html" onClick="form.redirect.value='option7.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT7}' onMouseOver="info('${js:LANG_IOPT7}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT7}</a></td>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option8.html" onClick="form.redirect.value='option8.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT8}' onMouseOver="info('${js:LANG_IOPT8}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT8}</a></td>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option9.html" onClick="form.redirect.value='option9.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT9}' onMouseOver="info('${js:LANG_IOPT9}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT9}</a></td>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option10.html" onClick="form.redirect.value='option10.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT10}' onMouseOver="info('${js:LANG_IOPT10}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT10}</a></td>
<td class="tabCtrl" align="center">&nbsp;</td>
</tr>
@@ -102,8 +102,8 @@ ${do:end-if}
${LANG_B10}
</tt>
<textarea name="url2" cols="60" rows="8"
title='${html:LANG_C3}' onMouseOver="info('${html:LANG_C3}'); return true" onMouseOut="info('&nbsp;'); return true"
>${url2}</textarea>
title='${html:LANG_C3}' onMouseOver="info('${js:LANG_C3}'); return true" onMouseOut="info('&nbsp;'); return true"
>${do:output-mode:html}${url2}${do:output-mode:}</textarea>
<br>
<tt>
@@ -115,12 +115,12 @@ ${LANG_B13}
<tr><td align="left">
<input type="submit" value="${LANG_OK}"
onClick="form.closeme.value=1; form.submit(); return false;"
title='${html:LANG_TIPOK}' onMouseOver="info('${html:LANG_TIPOK}'); return true" onMouseOut="info('&nbsp;'); return true"
title='${html:LANG_TIPOK}' onMouseOver="info('${js:LANG_TIPOK}'); return true" onMouseOut="info('&nbsp;'); return true"
>
</td><td align="right">
<input type="button" value="${LANG_CANCEL}"
onClick="window.close();"
title='${html:LANG_TIPCANCEL}' onMouseOver="info('${html:LANG_TIPCANCEL}'); return true" onMouseOut="info('&nbsp;'); return true"
title='${html:LANG_TIPCANCEL}' onMouseOver="info('${js:LANG_TIPCANCEL}'); return true" onMouseOut="info('&nbsp;'); return true"
>
</td></tr>
</table>

View File

@@ -4,7 +4,7 @@
<meta http-equiv="Content-Type" content="text/html; charset=${LANGUAGE_CHARSET}" />
<meta name="description" content="${LANG_METADESC}" />
<meta name="keywords" content="${LANG_METAKEYW}" />
<title>'${projname}' - HTTrack Website Copier</title>
<title>'${html:projname}' - HTTrack Website Copier</title>
<link rel="stylesheet" type="text/css" media="screen" href="style.css">
<script type="text/javascript" src="ping.js" defer></script>
@@ -31,7 +31,7 @@ function info(str) {
<table width="76%" border="0" align="center" cellspacing="0" cellpadding="0" class="tableWidth">
<tr>
<td><img src="images/header_title_4.gif" width="400" height="34" alt="HTTrack Website Copier" title="" border="0" id="title" /></td>
<td><img src="images/wordmark.svg" width="400" height="36" alt="HTTrack Website Copier" title="" border="0" id="title" /></td>
</tr>
</table>
@@ -60,7 +60,7 @@ ${do:if-file-exists:html/index.html}
<td>
<a href="/guide.html#web/opt-spider" target="_blank"
onClick="window.open('/guide.html#web/opt-spider', 'help', 'toolbar=no, location=no, directories=no, status=yes, menubar=no, scrollbars=yes, resizable=yes, width=980, height=760'); return false"
title='${html:LANG_TIPHELP}' onMouseOver="info('${html:LANG_TIPHELP}'); return true" onMouseOut="info('&nbsp;'); return true"
title='${html:LANG_TIPHELP}' onMouseOver="info('${js:LANG_TIPHELP}'); return true" onMouseOut="info('&nbsp;'); return true"
>${LANG_TIPHELP}</a>
</td>
${do:end-if}
@@ -71,18 +71,18 @@ ${do:end-if}
<table class="tableWidth" border="0" width="100%" cellspacing="0">
<tr>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option1.html" onClick="form.redirect.value='option1.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT1}' onMouseOver="info('${html:LANG_IOPT1}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT1}</a></td>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option2.html" onClick="form.redirect.value='option2.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT2}' onMouseOver="info('${html:LANG_IOPT2}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT2}</a></td>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option3.html" onClick="form.redirect.value='option3.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT3}' onMouseOver="info('${html:LANG_IOPT3}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT3}</a></td>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option4.html" onClick="form.redirect.value='option4.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT4}' onMouseOver="info('${html:LANG_IOPT4}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT4}</a></td>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option5.html" onClick="form.redirect.value='option5.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT5}' onMouseOver="info('${html:LANG_IOPT5}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT5}</a></td>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option11.html" onClick="form.redirect.value='option11.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT11}' onMouseOver="info('${html:LANG_IOPT11}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT11}</a></td>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option1.html" onClick="form.redirect.value='option1.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT1}' onMouseOver="info('${js:LANG_IOPT1}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT1}</a></td>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option2.html" onClick="form.redirect.value='option2.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT2}' onMouseOver="info('${js:LANG_IOPT2}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT2}</a></td>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option3.html" onClick="form.redirect.value='option3.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT3}' onMouseOver="info('${js:LANG_IOPT3}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT3}</a></td>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option4.html" onClick="form.redirect.value='option4.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT4}' onMouseOver="info('${js:LANG_IOPT4}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT4}</a></td>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option5.html" onClick="form.redirect.value='option5.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT5}' onMouseOver="info('${js:LANG_IOPT5}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT5}</a></td>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option11.html" onClick="form.redirect.value='option11.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT11}' onMouseOver="info('${js:LANG_IOPT11}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT11}</a></td>
</tr><tr>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option6.html" onClick="form.redirect.value='option6.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT6}' onMouseOver="info('${html:LANG_IOPT6}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT6}</a></td>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option7.html" onClick="form.redirect.value='option7.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT7}' onMouseOver="info('${html:LANG_IOPT7}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT7}</a></td>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option8.html" onClick="form.redirect.value='option8.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT8}' onMouseOver="info('${html:LANG_IOPT8}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT8}</a></td>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option9.html" onClick="form.redirect.value='option9.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT9}' onMouseOver="info('${html:LANG_IOPT9}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT9}</a></td>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option10.html" onClick="form.redirect.value='option10.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT10}' onMouseOver="info('${html:LANG_IOPT10}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT10}</a></td>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option6.html" onClick="form.redirect.value='option6.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT6}' onMouseOver="info('${js:LANG_IOPT6}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT6}</a></td>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option7.html" onClick="form.redirect.value='option7.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT7}' onMouseOver="info('${js:LANG_IOPT7}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT7}</a></td>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option8.html" onClick="form.redirect.value='option8.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT8}' onMouseOver="info('${js:LANG_IOPT8}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT8}</a></td>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option9.html" onClick="form.redirect.value='option9.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT9}' onMouseOver="info('${js:LANG_IOPT9}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT9}</a></td>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option10.html" onClick="form.redirect.value='option10.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT10}' onMouseOver="info('${js:LANG_IOPT10}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT10}</a></td>
<td class="tabCtrl" align="center">&nbsp;</td>
</tr>
@@ -111,88 +111,88 @@ ${do:end-if}
<input type="hidden" name="sitemap" value="">
<input type="checkbox" name="cookies" ${checked:cookies}
title='${html:LANG_I1b}' onMouseOver="info('${html:LANG_I1b}'); return true" onMouseOut="info('&nbsp;'); return true"
title='${html:LANG_I1b}' onMouseOver="info('${js:LANG_I1b}'); return true" onMouseOut="info('&nbsp;'); return true"
> ${LANG_I58}
<br><br>
${LANG_COOKIEFILE}
<input name="cookiesfile" value="${cookiesfile}" size="40"
title='${html:LANG_COOKIEFILETIP}' onMouseOver="info('${html:LANG_COOKIEFILETIP}'); return true" onMouseOut="info('&nbsp;'); return true"
title='${html:LANG_COOKIEFILETIP}' onMouseOver="info('${js:LANG_COOKIEFILETIP}'); return true" onMouseOut="info('&nbsp;'); return true"
>
<br><br>
${LANG_I59}
<br>
<select name="checktype"
title='${html:LANG_I1c}' onMouseOver="info('${html:LANG_I1c}'); return true" onMouseOut="info('&nbsp;'); return true"
title='${html:LANG_I1c}' onMouseOver="info('${js:LANG_I1c}'); return true" onMouseOut="info('&nbsp;'); return true"
>
${listid:checktype:LISTDEF_7}
</select>
<br><br>
<input type="checkbox" name="parsejava" ${checked:parsejava}
title='${html:LANG_I1d}' onMouseOver="info('${html:LANG_I1d}'); return true" onMouseOut="info('&nbsp;'); return true"
title='${html:LANG_I1d}' onMouseOver="info('${js:LANG_I1d}'); return true" onMouseOut="info('&nbsp;'); return true"
> ${LANG_I60}
<br><br>
${LANG_I55}
<br>
<select name="robots"
title='${html:LANG_I28}' onMouseOver="info('${html:LANG_I28}'); return true" onMouseOut="info('&nbsp;'); return true"
title='${html:LANG_I28}' onMouseOver="info('${js:LANG_I28}'); return true" onMouseOut="info('&nbsp;'); return true"
>
${listid:robots:LISTDEF_8}
</select>
<br><br>
<input type="checkbox" name="sitemap" ${checked:sitemap}
title='${html:LANG_SITEMAPTIP}' onMouseOver="info('${html:LANG_SITEMAPTIP}'); return true" onMouseOut="info('&nbsp;'); return true"
title='${html:LANG_SITEMAPTIP}' onMouseOver="info('${js:LANG_SITEMAPTIP}'); return true" onMouseOut="info('&nbsp;'); return true"
> ${LANG_SITEMAP}
<br><br>
${LANG_SITEMAPURL}
<input name="sitemapurl" value="${sitemapurl}" size="40"
title='${html:LANG_SITEMAPURLTIP}' onMouseOver="info('${html:LANG_SITEMAPURLTIP}'); return true" onMouseOut="info('&nbsp;'); return true"
title='${html:LANG_SITEMAPURLTIP}' onMouseOver="info('${js:LANG_SITEMAPURLTIP}'); return true" onMouseOut="info('&nbsp;'); return true"
>
<br><br>
<input type="checkbox" name="updhack" ${checked:updhack}
title='${html:LANG_I1k}' onMouseOver="info('${html:LANG_I1k}'); return true" onMouseOut="info('&nbsp;'); return true"
title='${html:LANG_I1k}' onMouseOver="info('${js:LANG_I1k}'); return true" onMouseOut="info('&nbsp;'); return true"
> ${LANG_I62b}
<br><br>
<input type="checkbox" name="urlhack" ${checked:urlhack}
title='${html:LANG_I1k2}' onMouseOver="info('${html:LANG_I1k2}'); return true" onMouseOut="info('&nbsp;'); return true"
title='${html:LANG_I1k2}' onMouseOver="info('${js:LANG_I1k2}'); return true" onMouseOut="info('&nbsp;'); return true"
> ${LANG_I62b2}
<br><br>
<input type="checkbox" name="keepwww" ${checked:keepwww}
title='${html:LANG_KEEPWWWTIP}' onMouseOver="info('${html:LANG_KEEPWWWTIP}'); return true" onMouseOut="info('&nbsp;'); return true"
title='${html:LANG_KEEPWWWTIP}' onMouseOver="info('${js:LANG_KEEPWWWTIP}'); return true" onMouseOut="info('&nbsp;'); return true"
> ${LANG_KEEPWWW}
<br><br>
<input type="checkbox" name="keepslashes" ${checked:keepslashes}
title='${html:LANG_KEEPSLASHESTIP}' onMouseOver="info('${html:LANG_KEEPSLASHESTIP}'); return true" onMouseOut="info('&nbsp;'); return true"
title='${html:LANG_KEEPSLASHESTIP}' onMouseOver="info('${js:LANG_KEEPSLASHESTIP}'); return true" onMouseOut="info('&nbsp;'); return true"
> ${LANG_KEEPSLASHES}
<br><br>
<input type="checkbox" name="keepqueryorder" ${checked:keepqueryorder}
title='${html:LANG_KEEPQUERYORDERTIP}' onMouseOver="info('${html:LANG_KEEPQUERYORDERTIP}'); return true" onMouseOut="info('&nbsp;'); return true"
title='${html:LANG_KEEPQUERYORDERTIP}' onMouseOver="info('${js:LANG_KEEPQUERYORDERTIP}'); return true" onMouseOut="info('&nbsp;'); return true"
> ${LANG_KEEPQUERYORDER}
<br><br>
${LANG_STRIPQUERY}
<input name="stripquery" value="${stripquery}" size="40"
title='${html:LANG_STRIPQUERYTIP}' onMouseOver="info('${html:LANG_STRIPQUERYTIP}'); return true" onMouseOut="info('&nbsp;'); return true"
title='${html:LANG_STRIPQUERYTIP}' onMouseOver="info('${js:LANG_STRIPQUERYTIP}'); return true" onMouseOut="info('&nbsp;'); return true"
>
<br><br>
<input type="checkbox" name="toler" ${checked:toler}
title='${html:LANG_I1i}' onMouseOver="info('${html:LANG_I1i}'); return true" onMouseOut="info('&nbsp;'); return true"
title='${html:LANG_I1i}' onMouseOver="info('${js:LANG_I1i}'); return true" onMouseOut="info('&nbsp;'); return true"
> ${LANG_I62}
<br><br>
<input type="checkbox" name="http10" ${checked:http10}
title='${html:LANG_I1j}' onMouseOver="info('${html:LANG_I1j}'); return true" onMouseOut="info('&nbsp;'); return true"
title='${html:LANG_I1j}' onMouseOver="info('${js:LANG_I1j}'); return true" onMouseOut="info('&nbsp;'); return true"
> ${LANG_I63}
<br><br>
@@ -202,12 +202,12 @@ ${LANG_STRIPQUERY}
<tr><td align="left">
<input type="submit" value="${LANG_OK}"
onClick="form.closeme.value=1; form.submit(); return false;"
title='${html:LANG_TIPOK}' onMouseOver="info('${html:LANG_TIPOK}'); return true" onMouseOut="info('&nbsp;'); return true"
title='${html:LANG_TIPOK}' onMouseOver="info('${js:LANG_TIPOK}'); return true" onMouseOut="info('&nbsp;'); return true"
>
</td><td align="right">
<input type="button" value="${LANG_CANCEL}"
onClick="window.close();"
title='${html:LANG_TIPCANCEL}' onMouseOver="info('${html:LANG_TIPCANCEL}'); return true" onMouseOut="info('&nbsp;'); return true"
title='${html:LANG_TIPCANCEL}' onMouseOver="info('${js:LANG_TIPCANCEL}'); return true" onMouseOut="info('&nbsp;'); return true"
>
</td></tr>
</table>

View File

@@ -4,7 +4,7 @@
<meta http-equiv="Content-Type" content="text/html; charset=${LANGUAGE_CHARSET}" />
<meta name="description" content="${LANG_METADESC}" />
<meta name="keywords" content="${LANG_METAKEYW}" />
<title>'${projname}' - HTTrack Website Copier</title>
<title>'${html:projname}' - HTTrack Website Copier</title>
<link rel="stylesheet" type="text/css" media="screen" href="style.css">
<script type="text/javascript" src="ping.js" defer></script>
@@ -31,7 +31,7 @@ function info(str) {
<table width="76%" border="0" align="center" cellspacing="0" cellpadding="0" class="tableWidth">
<tr>
<td><img src="images/header_title_4.gif" width="400" height="34" alt="HTTrack Website Copier" title="" border="0" id="title" /></td>
<td><img src="images/wordmark.svg" width="400" height="36" alt="HTTrack Website Copier" title="" border="0" id="title" /></td>
</tr>
</table>
@@ -60,7 +60,7 @@ ${do:if-file-exists:html/index.html}
<td>
<a href="/guide.html#web/opt-log-index-cache" target="_blank"
onClick="window.open('/guide.html#web/opt-log-index-cache', 'help', 'toolbar=no, location=no, directories=no, status=yes, menubar=no, scrollbars=yes, resizable=yes, width=980, height=760'); return false"
title='${html:LANG_TIPHELP}' onMouseOver="info('${html:LANG_TIPHELP}'); return true" onMouseOut="info('&nbsp;'); return true"
title='${html:LANG_TIPHELP}' onMouseOver="info('${js:LANG_TIPHELP}'); return true" onMouseOut="info('&nbsp;'); return true"
>${LANG_TIPHELP}</a>
</td>
${do:end-if}
@@ -71,18 +71,18 @@ ${do:end-if}
<table class="tableWidth" border="0" width="100%" cellspacing="0">
<tr>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option1.html" onClick="form.redirect.value='option1.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT1}' onMouseOver="info('${html:LANG_IOPT1}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT1}</a></td>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option2.html" onClick="form.redirect.value='option2.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT2}' onMouseOver="info('${html:LANG_IOPT2}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT2}</a></td>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option3.html" onClick="form.redirect.value='option3.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT3}' onMouseOver="info('${html:LANG_IOPT3}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT3}</a></td>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option4.html" onClick="form.redirect.value='option4.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT4}' onMouseOver="info('${html:LANG_IOPT4}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT4}</a></td>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option5.html" onClick="form.redirect.value='option5.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT5}' onMouseOver="info('${html:LANG_IOPT5}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT5}</a></td>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option11.html" onClick="form.redirect.value='option11.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT11}' onMouseOver="info('${html:LANG_IOPT11}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT11}</a></td>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option1.html" onClick="form.redirect.value='option1.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT1}' onMouseOver="info('${js:LANG_IOPT1}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT1}</a></td>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option2.html" onClick="form.redirect.value='option2.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT2}' onMouseOver="info('${js:LANG_IOPT2}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT2}</a></td>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option3.html" onClick="form.redirect.value='option3.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT3}' onMouseOver="info('${js:LANG_IOPT3}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT3}</a></td>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option4.html" onClick="form.redirect.value='option4.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT4}' onMouseOver="info('${js:LANG_IOPT4}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT4}</a></td>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option5.html" onClick="form.redirect.value='option5.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT5}' onMouseOver="info('${js:LANG_IOPT5}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT5}</a></td>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option11.html" onClick="form.redirect.value='option11.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT11}' onMouseOver="info('${js:LANG_IOPT11}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT11}</a></td>
</tr><tr>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option6.html" onClick="form.redirect.value='option6.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT6}' onMouseOver="info('${html:LANG_IOPT6}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT6}</a></td>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option7.html" onClick="form.redirect.value='option7.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT7}' onMouseOver="info('${html:LANG_IOPT7}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT7}</a></td>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option8.html" onClick="form.redirect.value='option8.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT8}' onMouseOver="info('${html:LANG_IOPT8}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT8}</a></td>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option9.html" onClick="form.redirect.value='option9.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT9}' onMouseOver="info('${html:LANG_IOPT9}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT9}</a></td>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option10.html" onClick="form.redirect.value='option10.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT10}' onMouseOver="info('${html:LANG_IOPT10}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT10}</a></td>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option6.html" onClick="form.redirect.value='option6.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT6}' onMouseOver="info('${js:LANG_IOPT6}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT6}</a></td>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option7.html" onClick="form.redirect.value='option7.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT7}' onMouseOver="info('${js:LANG_IOPT7}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT7}</a></td>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option8.html" onClick="form.redirect.value='option8.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT8}' onMouseOver="info('${js:LANG_IOPT8}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT8}</a></td>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option9.html" onClick="form.redirect.value='option9.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT9}' onMouseOver="info('${js:LANG_IOPT9}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT9}</a></td>
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option10.html" onClick="form.redirect.value='option10.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT10}' onMouseOver="info('${js:LANG_IOPT10}'); return true" onMouseOut="info('&nbsp;'); return true">${LANG_IOPT10}</a></td>
<td class="tabCtrl" align="center">&nbsp;</td>
</tr>
@@ -109,64 +109,64 @@ ${do:end-if}
<input type="hidden" name="index2" value="">
<input type="checkbox" name="cache2" ${checked:cache2}
title='${html:LANG_I1e}' onMouseOver="info('${html:LANG_I1e}'); return true" onMouseOut="info('&nbsp;'); return true"
title='${html:LANG_I1e}' onMouseOver="info('${js:LANG_I1e}'); return true" onMouseOut="info('&nbsp;'); return true"
> ${LANG_I61}
<br><br>
<input type="checkbox" name="warc" ${checked:warc}
title='${html:LANG_WARCTIP}' onMouseOver="info('${html:LANG_WARCTIP}'); return true" onMouseOut="info('&nbsp;'); return true"
title='${html:LANG_WARCTIP}' onMouseOver="info('${js:LANG_WARCTIP}'); return true" onMouseOut="info('&nbsp;'); return true"
> ${LANG_WARC}
<br><br>
${LANG_WARCFILE}
<input name="warcfile" value="${warcfile}" size="40"
title='${html:LANG_WARCFILETIP}' onMouseOver="info('${html:LANG_WARCFILETIP}'); return true" onMouseOut="info('&nbsp;'); return true"
title='${html:LANG_WARCFILETIP}' onMouseOver="info('${js:LANG_WARCFILETIP}'); return true" onMouseOut="info('&nbsp;'); return true"
>
<br><br>
${LANG_WARCMAXSIZE}
<input name="warcmaxsize" value="${warcmaxsize}" size="12"
title='${html:LANG_WARCMAXSIZETIP}' onMouseOver="info('${html:LANG_WARCMAXSIZETIP}'); return true" onMouseOut="info('&nbsp;'); return true"
title='${html:LANG_WARCMAXSIZETIP}' onMouseOver="info('${js:LANG_WARCMAXSIZETIP}'); return true" onMouseOut="info('&nbsp;'); return true"
>
<br><br>
<input type="checkbox" name="warccdx" ${checked:warccdx}
title='${html:LANG_WARCCDXTIP}' onMouseOver="info('${html:LANG_WARCCDXTIP}'); return true" onMouseOut="info('&nbsp;'); return true"
title='${html:LANG_WARCCDXTIP}' onMouseOver="info('${js:LANG_WARCCDXTIP}'); return true" onMouseOut="info('&nbsp;'); return true"
> ${LANG_WARCCDX}
<br><br>
<input type="checkbox" name="wacz" ${checked:wacz}
title='${html:LANG_WACZTIP}' onMouseOver="info('${html:LANG_WACZTIP}'); return true" onMouseOut="info('&nbsp;'); return true"
title='${html:LANG_WACZTIP}' onMouseOver="info('${js:LANG_WACZTIP}'); return true" onMouseOut="info('&nbsp;'); return true"
> ${LANG_WACZ}
<br><br>
<input type="checkbox" name="changes" ${checked:changes}
title='${html:LANG_CHANGESTIP}' onMouseOver="info('${html:LANG_CHANGESTIP}'); return true" onMouseOut="info('&nbsp;'); return true"
title='${html:LANG_CHANGESTIP}' onMouseOver="info('${js:LANG_CHANGESTIP}'); return true" onMouseOut="info('&nbsp;'); return true"
> ${LANG_CHANGES}
<br><br>
<input type="checkbox" name="norecatch" ${checked:norecatch}
title='${html:LANG_I5b}' onMouseOver="info('${html:LANG_I5b}'); return true" onMouseOut="info('&nbsp;'); return true"
title='${html:LANG_I5b}' onMouseOver="info('${js:LANG_I5b}'); return true" onMouseOut="info('&nbsp;'); return true"
> ${LANG_I34b}
<br><br>
<input type="checkbox" name="logf" ${checked:logf}
title='${html:LANG_I7}' onMouseOver="info('${html:LANG_I7}'); return true" onMouseOut="info('&nbsp;'); return true"
title='${html:LANG_I7}' onMouseOver="info('${js:LANG_I7}'); return true" onMouseOut="info('&nbsp;'); return true"
> ${LANG_I36}
<select name="logtype"
title='${html:LANG_I1f}' onMouseOver="info('${html:LANG_I1f}'); return true" onMouseOut="info('&nbsp;'); return true"
title='${html:LANG_I1f}' onMouseOver="info('${js:LANG_I1f}'); return true" onMouseOut="info('&nbsp;'); return true"
>
${listid:logtype:LISTDEF_9}
</select>
<br><br>
<input type="checkbox" name="index" ${checked:index}
title='${html:LANG_I6}' onMouseOver="info('${html:LANG_I6}'); return true" onMouseOut="info('&nbsp;'); return true"
title='${html:LANG_I6}' onMouseOver="info('${js:LANG_I6}'); return true" onMouseOut="info('&nbsp;'); return true"
> ${LANG_I35}
<br><br>
<input type="checkbox" name="index2" ${checked:index2}
title='${html:LANG_I6b}' onMouseOver="info('${html:LANG_I6b}'); return true" onMouseOut="info('&nbsp;'); return true"
title='${html:LANG_I6b}' onMouseOver="info('${js:LANG_I6b}'); return true" onMouseOut="info('&nbsp;'); return true"
> ${LANG_I35b}
<br><br>
@@ -175,12 +175,12 @@ ${listid:logtype:LISTDEF_9}
<tr><td align="left">
<input type="submit" value="${LANG_OK}"
onClick="form.closeme.value=1; form.submit(); return false;"
title='${html:LANG_TIPOK}' onMouseOver="info('${html:LANG_TIPOK}'); return true" onMouseOut="info('&nbsp;'); return true"
title='${html:LANG_TIPOK}' onMouseOver="info('${js:LANG_TIPOK}'); return true" onMouseOut="info('&nbsp;'); return true"
>
</td><td align="right">
<input type="button" value="${LANG_CANCEL}"
onClick="window.close();"
title='${html:LANG_TIPCANCEL}' onMouseOver="info('${html:LANG_TIPCANCEL}'); return true" onMouseOut="info('&nbsp;'); return true"
title='${html:LANG_TIPCANCEL}' onMouseOver="info('${js:LANG_TIPCANCEL}'); return true" onMouseOut="info('&nbsp;'); return true"
>
</td></tr>
</table>

View File

@@ -5,7 +5,7 @@
<meta name="description" content="${LANG_METADESC}" />
<meta name="keywords" content="${LANG_METAKEYW}" />
<META http-equiv="refresh" content="30; URL=finished.html">
<title>'${projname}' - HTTrack Website Copier</title>
<title>'${html:projname}' - HTTrack Website Copier</title>
<link rel="stylesheet" type="text/css" media="screen" href="style.css">
<script type="text/javascript" src="ping.js" defer></script>
@@ -64,7 +64,7 @@ function no_refresh() {
<table width="76%" border="0" align="center" cellspacing="0" cellpadding="0" class="tableWidth">
<tr>
<td><img src="images/header_title_4.gif" width="400" height="34" alt="HTTrack Website Copier" title="" border="0" id="title" /></td>
<td><img src="images/wordmark.svg" width="400" height="36" alt="HTTrack Website Copier" title="" border="0" id="title" /></td>
</tr>
</table>
<table width="76%" border="0" align="center" cellspacing="0" cellpadding="3" class="tableWidth">
@@ -73,7 +73,7 @@ function no_refresh() {
<td id="subTitle" align="right">
<a href="/server/file.html" target="_blank"
onClick="window.open('/server/file.html', 'help', 'toolbar=no, location=no, directories=no, status=yes, menubar=no, scrollbars=yes, resizable=yes, width=640, height=480'); return false"
title='${html:LANG_O1}' onMouseOver="info('${html:LANG_O1}'); return true" onMouseOut="info('&nbsp;'); return true"
title='${html:LANG_O1}' onMouseOver="info('${js:LANG_O1}'); return true" onMouseOut="info('&nbsp;'); return true"
style="color:#FFFFFF"
>
${LANG_O1}
@@ -85,7 +85,7 @@ ${do:if-file-exists:html/index.html}
<td id="subTitle" align="right">
<a href="/index.html" target="_blank"
onClick="window.open('/server/help.html', 'help', 'toolbar=no, location=no, directories=no, status=yes, menubar=no, scrollbars=yes, resizable=yes, width=640, height=480'); return false"
title='${html:LANG_TIPHELP}' onMouseOver="info('${html:LANG_TIPHELP}'); return true" onMouseOut="info('&nbsp;'); return true"
title='${html:LANG_TIPHELP}' onMouseOver="info('${js:LANG_TIPHELP}'); return true" onMouseOut="info('&nbsp;'); return true"
style="color:#FFFFFF"
>
${LANG_O5}
@@ -116,17 +116,17 @@ ${do:end-if}
<table border="0" width="100%">
<tr>
<td>${LANG_H8}</td><td>${info.stat_bytes}</td>
<td>${LANG_H9}</td><td>${info.lien_n}/${info.lien_tot} (+${info.stat_back})</td>
<td>${LANG_H8}</td><td>${html:info.stat_bytes}</td>
<td>${LANG_H9}</td><td>${html:info.lien_n}/${html:info.lien_tot} (+${html:info.stat_back})</td>
</tr><tr>
<td>${LANG_H10}</td><td>${info.stat_time_str}</td>
<td>${LANG_H17}</td><td>${info.stat_written}</td>
<td>${LANG_H10}</td><td>${html:info.stat_time_str}</td>
<td>${LANG_H17}</td><td>${html:info.stat_written}</td>
</tr><tr>
<td>${LANG_H14}</td><td>${info.irate} (${info.rate})</td>
<td>${LANG_H18}</td><td>${info.stat_updated}</td>
<td>${LANG_H14}</td><td>${html:info.irate} (${html:info.rate})</td>
<td>${LANG_H18}</td><td>${html:info.stat_updated}</td>
</tr><tr>
<td>${LANG_H11}</td><td>${info.stat_nsocket}</td>
<td>${LANG_H19}</td><td>${info.stat_errors}</td>
<td>${LANG_H11}</td><td>${html:info.stat_nsocket}</td>
<td>${LANG_H19}</td><td>${html:info.stat_errors}</td>
</tr>
</tr>
@@ -138,7 +138,7 @@ ${do:end-if}
<tr>
<td>
${LANG_H20} ${info.currentjob}
${LANG_H20} ${html:info.currentjob}
</td>
</tr>
@@ -152,20 +152,20 @@ ${LANG_H20} ${info.currentjob}
<table border="0" width="100%">
<tr><td>${info.state[0]}</td><td>${info.name[0]}</td><td>${info.file[0]}</td><td>${info.size[0]}/${info.sizetot[0]}</td><td><input type="submit" value="${LANG_H15}" onClick="form.command.value='cancel-file=${info.url_sav[0]}'; form.submit()" title='${html:LANG_H6}' onMouseOver="info('${html:LANG_H6}'); return true" onMouseOut="info('&nbsp;'); return true"></td></tr>
<tr><td>${info.state[1]}</td><td>${info.name[1]}</td><td>${info.file[1]}</td><td>${info.size[1]}/${info.sizetot[1]}</td><td><input type="submit" value="${LANG_H15}" onClick="form.command.value='cancel-file=${info.url_sav[1]}'; form.submit()" title='${html:LANG_H7}' onMouseOver="info('${html:LANG_H7}'); return true" onMouseOut="info('&nbsp;'); return true"></td></tr>
<tr><td>${info.state[2]}</td><td>${info.name[2]}</td><td>${info.file[2]}</td><td>${info.size[2]}/${info.sizetot[2]}</td><td><input type="submit" value="${LANG_H15}" onClick="form.command.value='cancel-file=${info.url_sav[2]}'; form.submit()" title='${html:LANG_H7}' onMouseOver="info('${html:LANG_H7}'); return true" onMouseOut="info('&nbsp;'); return true"></td></tr>
<tr><td>${info.state[3]}</td><td>${info.name[3]}</td><td>${info.file[3]}</td><td>${info.size[3]}/${info.sizetot[3]}</td><td><input type="submit" value="${LANG_H15}" onClick="form.command.value='cancel-file=${info.url_sav[3]}'; form.submit()" title='${html:LANG_H7}' onMouseOver="info('${html:LANG_H7}'); return true" onMouseOut="info('&nbsp;'); return true"></td></tr>
<tr><td>${info.state[4]}</td><td>${info.name[4]}</td><td>${info.file[4]}</td><td>${info.size[4]}/${info.sizetot[4]}</td><td><input type="submit" value="${LANG_H15}" onClick="form.command.value='cancel-file=${info.url_sav[4]}'; form.submit()" title='${html:LANG_H7}' onMouseOver="info('${html:LANG_H7}'); return true" onMouseOut="info('&nbsp;'); return true"></td></tr>
<tr><td>${info.state[5]}</td><td>${info.name[5]}</td><td>${info.file[5]}</td><td>${info.size[5]}/${info.sizetot[5]}</td><td><input type="submit" value="${LANG_H15}" onClick="form.command.value='cancel-file=${info.url_sav[5]}'; form.submit()" title='${html:LANG_H7}' onMouseOver="info('${html:LANG_H7}'); return true" onMouseOut="info('&nbsp;'); return true"></td></tr>
<tr><td>${info.state[6]}</td><td>${info.name[6]}</td><td>${info.file[6]}</td><td>${info.size[6]}/${info.sizetot[6]}</td><td><input type="submit" value="${LANG_H15}" onClick="form.command.value='cancel-file=${info.url_sav[6]}'; form.submit()" title='${html:LANG_H7}' onMouseOver="info('${html:LANG_H7}'); return true" onMouseOut="info('&nbsp;'); return true"></td></tr>
<tr><td>${info.state[7]}</td><td>${info.name[7]}</td><td>${info.file[7]}</td><td>${info.size[7]}/${info.sizetot[7]}</td><td><input type="submit" value="${LANG_H15}" onClick="form.command.value='cancel-file=${info.url_sav[7]}'; form.submit()" title='${html:LANG_H7}' onMouseOver="info('${html:LANG_H7}'); return true" onMouseOut="info('&nbsp;'); return true"></td></tr>
<tr><td>${info.state[8]}</td><td>${info.name[8]}</td><td>${info.file[8]}</td><td>${info.size[8]}/${info.sizetot[8]}</td><td><input type="submit" value="${LANG_H15}" onClick="form.command.value='cancel-file=${info.url_sav[8]}'; form.submit()" title='${html:LANG_H7}' onMouseOver="info('${html:LANG_H7}'); return true" onMouseOut="info('&nbsp;'); return true"></td></tr>
<tr><td>${info.state[9]}</td><td>${info.name[9]}</td><td>${info.file[9]}</td><td>${info.size[9]}/${info.sizetot[9]}</td><td><input type="submit" value="${LANG_H15}" onClick="form.command.value='cancel-file=${info.url_sav[9]}'; form.submit()" title='${html:LANG_H7}' onMouseOver="info('${html:LANG_H7}'); return true" onMouseOut="info('&nbsp;'); return true"></td></tr>
<tr><td>${info.state[10]}</td><td>${info.name[10]}</td><td>${info.file[10]}</td><td>${info.size[10]}/${info.sizetot[10]}</td><td><input type="submit" value="${LANG_H15}" onClick="form.command.value='cancel-file=${info.url_sav[10]}'; form.submit()" title='${html:LANG_H7}' onMouseOver="info('${html:LANG_H7}'); return true" onMouseOut="info('&nbsp;'); return true"></td></tr>
<tr><td>${info.state[11]}</td><td>${info.name[11]}</td><td>${info.file[11]}</td><td>${info.size[11]}/${info.sizetot[11]}</td><td><input type="submit" value="${LANG_H15}" onClick="form.command.value='cancel-file=${info.url_sav[11]}'; form.submit()" title='${html:LANG_H7}' onMouseOver="info('${html:LANG_H7}'); return true" onMouseOut="info('&nbsp;'); return true"></td></tr>
<tr><td>${info.state[12]}</td><td>${info.name[12]}</td><td>${info.file[12]}</td><td>${info.size[12]}/${info.sizetot[12]}</td><td><input type="submit" value="${LANG_H15}" onClick="form.command.value='cancel-file=${info.url_sav[12]}'; form.submit()" title='${html:LANG_H7}' onMouseOver="info('${html:LANG_H7}'); return true" onMouseOut="info('&nbsp;'); return true"></td></tr>
<tr><td>${info.state[13]}</td><td>${info.name[13]}</td><td>${info.file[13]}</td><td>${info.size[13]}/${info.sizetot[13]}</td><td><input type="submit" value="${LANG_H15}" onClick="form.command.value='cancel-file=${info.url_sav[13]}'; form.submit()" title='${html:LANG_H7}' onMouseOver="info('${html:LANG_H7}'); return true" onMouseOut="info('&nbsp;'); return true"></td></tr>
<tr><td>${html:info.state[0]}</td><td>${html:info.name[0]}</td><td>${html:info.file[0]}</td><td>${html:info.size[0]}/${html:info.sizetot[0]}</td><td><input type="submit" value="${LANG_H15}" onClick="form.command.value='cancel-file=${js:info.url_sav[0]}'; form.submit()" title='${html:LANG_H6}' onMouseOver="info('${js:LANG_H6}'); return true" onMouseOut="info('&nbsp;'); return true"></td></tr>
<tr><td>${html:info.state[1]}</td><td>${html:info.name[1]}</td><td>${html:info.file[1]}</td><td>${html:info.size[1]}/${html:info.sizetot[1]}</td><td><input type="submit" value="${LANG_H15}" onClick="form.command.value='cancel-file=${js:info.url_sav[1]}'; form.submit()" title='${html:LANG_H7}' onMouseOver="info('${js:LANG_H7}'); return true" onMouseOut="info('&nbsp;'); return true"></td></tr>
<tr><td>${html:info.state[2]}</td><td>${html:info.name[2]}</td><td>${html:info.file[2]}</td><td>${html:info.size[2]}/${html:info.sizetot[2]}</td><td><input type="submit" value="${LANG_H15}" onClick="form.command.value='cancel-file=${js:info.url_sav[2]}'; form.submit()" title='${html:LANG_H7}' onMouseOver="info('${js:LANG_H7}'); return true" onMouseOut="info('&nbsp;'); return true"></td></tr>
<tr><td>${html:info.state[3]}</td><td>${html:info.name[3]}</td><td>${html:info.file[3]}</td><td>${html:info.size[3]}/${html:info.sizetot[3]}</td><td><input type="submit" value="${LANG_H15}" onClick="form.command.value='cancel-file=${js:info.url_sav[3]}'; form.submit()" title='${html:LANG_H7}' onMouseOver="info('${js:LANG_H7}'); return true" onMouseOut="info('&nbsp;'); return true"></td></tr>
<tr><td>${html:info.state[4]}</td><td>${html:info.name[4]}</td><td>${html:info.file[4]}</td><td>${html:info.size[4]}/${html:info.sizetot[4]}</td><td><input type="submit" value="${LANG_H15}" onClick="form.command.value='cancel-file=${js:info.url_sav[4]}'; form.submit()" title='${html:LANG_H7}' onMouseOver="info('${js:LANG_H7}'); return true" onMouseOut="info('&nbsp;'); return true"></td></tr>
<tr><td>${html:info.state[5]}</td><td>${html:info.name[5]}</td><td>${html:info.file[5]}</td><td>${html:info.size[5]}/${html:info.sizetot[5]}</td><td><input type="submit" value="${LANG_H15}" onClick="form.command.value='cancel-file=${js:info.url_sav[5]}'; form.submit()" title='${html:LANG_H7}' onMouseOver="info('${js:LANG_H7}'); return true" onMouseOut="info('&nbsp;'); return true"></td></tr>
<tr><td>${html:info.state[6]}</td><td>${html:info.name[6]}</td><td>${html:info.file[6]}</td><td>${html:info.size[6]}/${html:info.sizetot[6]}</td><td><input type="submit" value="${LANG_H15}" onClick="form.command.value='cancel-file=${js:info.url_sav[6]}'; form.submit()" title='${html:LANG_H7}' onMouseOver="info('${js:LANG_H7}'); return true" onMouseOut="info('&nbsp;'); return true"></td></tr>
<tr><td>${html:info.state[7]}</td><td>${html:info.name[7]}</td><td>${html:info.file[7]}</td><td>${html:info.size[7]}/${html:info.sizetot[7]}</td><td><input type="submit" value="${LANG_H15}" onClick="form.command.value='cancel-file=${js:info.url_sav[7]}'; form.submit()" title='${html:LANG_H7}' onMouseOver="info('${js:LANG_H7}'); return true" onMouseOut="info('&nbsp;'); return true"></td></tr>
<tr><td>${html:info.state[8]}</td><td>${html:info.name[8]}</td><td>${html:info.file[8]}</td><td>${html:info.size[8]}/${html:info.sizetot[8]}</td><td><input type="submit" value="${LANG_H15}" onClick="form.command.value='cancel-file=${js:info.url_sav[8]}'; form.submit()" title='${html:LANG_H7}' onMouseOver="info('${js:LANG_H7}'); return true" onMouseOut="info('&nbsp;'); return true"></td></tr>
<tr><td>${html:info.state[9]}</td><td>${html:info.name[9]}</td><td>${html:info.file[9]}</td><td>${html:info.size[9]}/${html:info.sizetot[9]}</td><td><input type="submit" value="${LANG_H15}" onClick="form.command.value='cancel-file=${js:info.url_sav[9]}'; form.submit()" title='${html:LANG_H7}' onMouseOver="info('${js:LANG_H7}'); return true" onMouseOut="info('&nbsp;'); return true"></td></tr>
<tr><td>${html:info.state[10]}</td><td>${html:info.name[10]}</td><td>${html:info.file[10]}</td><td>${html:info.size[10]}/${html:info.sizetot[10]}</td><td><input type="submit" value="${LANG_H15}" onClick="form.command.value='cancel-file=${js:info.url_sav[10]}'; form.submit()" title='${html:LANG_H7}' onMouseOver="info('${js:LANG_H7}'); return true" onMouseOut="info('&nbsp;'); return true"></td></tr>
<tr><td>${html:info.state[11]}</td><td>${html:info.name[11]}</td><td>${html:info.file[11]}</td><td>${html:info.size[11]}/${html:info.sizetot[11]}</td><td><input type="submit" value="${LANG_H15}" onClick="form.command.value='cancel-file=${js:info.url_sav[11]}'; form.submit()" title='${html:LANG_H7}' onMouseOver="info('${js:LANG_H7}'); return true" onMouseOut="info('&nbsp;'); return true"></td></tr>
<tr><td>${html:info.state[12]}</td><td>${html:info.name[12]}</td><td>${html:info.file[12]}</td><td>${html:info.size[12]}/${html:info.sizetot[12]}</td><td><input type="submit" value="${LANG_H15}" onClick="form.command.value='cancel-file=${js:info.url_sav[12]}'; form.submit()" title='${html:LANG_H7}' onMouseOver="info('${js:LANG_H7}'); return true" onMouseOut="info('&nbsp;'); return true"></td></tr>
<tr><td>${html:info.state[13]}</td><td>${html:info.name[13]}</td><td>${html:info.file[13]}</td><td>${html:info.size[13]}/${html:info.sizetot[13]}</td><td><input type="submit" value="${LANG_H15}" onClick="form.command.value='cancel-file=${js:info.url_sav[13]}'; form.submit()" title='${html:LANG_H7}' onMouseOver="info('${js:LANG_H7}'); return true" onMouseOut="info('&nbsp;'); return true"></td></tr>
</table>
@@ -180,9 +180,9 @@ ${LANG_H20} ${info.currentjob}
&nbsp;
</td><td align="right">
<input type="submit" value=" ${LANG_V4} "
title='${html:LANG_D3}' onMouseOver="disable_timer(); info('${LANG_D3}'); return true"
title='${html:LANG_D3}' onMouseOver="disable_timer(); info('${js:LANG_D3}'); return true"
onMouseOut="info('&nbsp;'); enable_timer(); return true"
onClick="if (do_confirm('${LANG_G1}')) { form.command.value='cancel'; form.submit(); } return false"
onClick="if (do_confirm('${js:LANG_G1}')) { form.command.value='cancel'; form.submit(); } return false"
>
</td></tr></table>

View File

@@ -4,7 +4,7 @@
<meta http-equiv="Content-Type" content="text/html; charset=${LANGUAGE_CHARSET}" />
<meta name="description" content="${LANG_METADESC}" />
<meta name="keywords" content="${LANG_METAKEYW}" />
<title>'${projname}' - HTTrack Website Copier</title>
<title>'${html:projname}' - HTTrack Website Copier</title>
<link rel="stylesheet" type="text/css" media="screen" href="style.css">
<script type="text/javascript" src="ping.js" defer></script>
@@ -43,7 +43,7 @@ function info(str) {
<table width="76%" border="0" align="center" cellspacing="0" cellpadding="0" class="tableWidth">
<tr>
<td><img src="images/header_title_4.gif" width="400" height="34" alt="HTTrack Website Copier" title="" border="0" id="title" /></td>
<td><img src="images/wordmark.svg" width="400" height="36" alt="HTTrack Website Copier" title="" border="0" id="title" /></td>
</tr>
</table>
<table width="76%" border="0" align="center" cellspacing="0" cellpadding="3" class="tableWidth">
@@ -52,7 +52,7 @@ function info(str) {
<td id="subTitle" align="right">
<a href="/server/file.html" target="_blank"
onClick="window.open('/server/file.html', 'help', 'toolbar=no, location=no, directories=no, status=yes, menubar=no, scrollbars=yes, resizable=yes, width=640, height=480'); return false"
title='${html:LANG_O1}' onMouseOver="info('${html:html:LANG_O1}'); return true" onMouseOut="info('&nbsp;'); return true"
title='${html:LANG_O1}' onMouseOver="info('${js:LANG_O1}'); return true" onMouseOut="info('&nbsp;'); return true"
style="color:#FFFFFF"
>
${LANG_O1}
@@ -64,7 +64,7 @@ ${do:if-file-exists:html/index.html}
<td id="subTitle" align="right">
<a href="/index.html" target="_blank"
onClick="window.open('/server/help.html', 'help', 'toolbar=no, location=no, directories=no, status=yes, menubar=no, scrollbars=yes, resizable=yes, width=640, height=480'); return false"
title='${html:LANG_TIPHELP}' onMouseOver="info('${html:html:LANG_TIPHELP}'); return true" onMouseOut="info('&nbsp;'); return true"
title='${html:LANG_TIPHELP}' onMouseOver="info('${js:LANG_TIPHELP}'); return true" onMouseOut="info('&nbsp;'); return true"
style="color:#FFFFFF"
>
${LANG_O5}
@@ -93,7 +93,7 @@ ${do:if-file-exists:html/index.html}
<td>
<a href="/step1.html" target="_blank"
onClick="window.open('/step1.html', 'help', 'toolbar=no, location=no, directories=no, status=yes, menubar=no, scrollbars=yes, resizable=yes, width=640, height=480'); return false"
title='${html:LANG_TIPHELP}' onMouseOver="info('${html:html:LANG_TIPHELP}'); return true" onMouseOut="info('&nbsp;'); return true"
title='${html:LANG_TIPHELP}' onMouseOver="info('${js:LANG_TIPHELP}'); return true" onMouseOut="info('&nbsp;'); return true"
>${LANG_TIPHELP}</a>
</td>
${do:end-if}
@@ -228,7 +228,7 @@ ${do:loadhash}
${LANG_S11}
<input name="projname" value="${projname}"
title='${html:LANG_S1}' onMouseOver="info('${html:html:LANG_S1}'); return true" onMouseOut="info('&nbsp;'); return true"
title='${html:LANG_S1}' onMouseOver="info('${js:LANG_S1}'); return true" onMouseOut="info('&nbsp;'); return true"
>
<br>
@@ -243,7 +243,7 @@ ${do:loadhash}
</select>
</td><td>
<input name="projcateg" value="${projcateg}"
title='${html:LANG_S5}' onMouseOver="info('${html:html:LANG_S5}'); return true" onMouseOut="info('&nbsp;'); return true"
title='${html:LANG_S5}' onMouseOver="info('${js:LANG_S5}'); return true" onMouseOut="info('&nbsp;'); return true"
>
</td></tr></table>
@@ -251,7 +251,7 @@ ${do:loadhash}
<br>
${LANG_S12}
<input name="path" value="${path}"
title='${html:LANG_S2}' onMouseOver="info('${html:html:LANG_S2}'); return true" onMouseOut="info('&nbsp;'); return true"
title='${html:LANG_S2}' onMouseOver="info('${js:LANG_S2}'); return true" onMouseOut="info('&nbsp;'); return true"
>
<input type="button" value="refresh" onClick="form.redirect.value='step2.html'; form.submit()">
@@ -260,15 +260,15 @@ ${do:loadhash}
<tr><td>
<table width="100%" border="0"><tr><td align="left">
<input type="submit" value=" << ${LANG_PREVIOUS} " onClick="form.redirect.value='index.html'; form.submit()"
title='${html:LANG_TIPPREV}' onMouseOver="info('${html:html:LANG_TIPPREV}'); return true" onMouseOut="info('&nbsp;'); return true"
title='${html:LANG_TIPPREV}' onMouseOver="info('${js:LANG_TIPPREV}'); return true" onMouseOut="info('&nbsp;'); return true"
>
</td><td align="right">
<input name="nextBtn" type="submit" value=" ${LANG_NEXT} >> " onClick="return checkname();" default
title='${html:LANG_TIPNEXT}' onMouseOver="info('${html:html:LANG_TIPNEXT}'); return true" onMouseOut="info('&nbsp;'); return true"
title='${html:LANG_TIPNEXT}' onMouseOver="info('${js:LANG_TIPNEXT}'); return true" onMouseOut="info('&nbsp;'); return true"
>
</td></tr></table>
${do:if-not-empty:urls}
${do:output-mode:html}${do:if-not-empty:urls}
<br>
<h2>${LANG_URLS}:</h2><br>
<h3><pre>${urls}</pre></h3>

View File

@@ -4,7 +4,7 @@
<meta http-equiv="Content-Type" content="text/html; charset=${LANGUAGE_CHARSET}" />
<meta name="description" content="${LANG_METADESC}" />
<meta name="keywords" content="${LANG_METAKEYW}" />
<title>'${projname}' - HTTrack Website Copier</title>
<title>'${html:projname}' - HTTrack Website Copier</title>
<link rel="stylesheet" type="text/css" media="screen" href="style.css">
<script type="text/javascript" src="ping.js" defer></script>
@@ -52,7 +52,7 @@ function do_check_child() {
<table width="76%" border="0" align="center" cellspacing="0" cellpadding="0" class="tableWidth">
<tr>
<td><img src="images/header_title_4.gif" width="400" height="34" alt="HTTrack Website Copier" title="" border="0" id="title" /></td>
<td><img src="images/wordmark.svg" width="400" height="36" alt="HTTrack Website Copier" title="" border="0" id="title" /></td>
</tr>
</table>
<table width="76%" border="0" align="center" cellspacing="0" cellpadding="3" class="tableWidth">
@@ -61,7 +61,7 @@ function do_check_child() {
<td id="subTitle" align="right">
<a href="/server/file.html" target="_blank"
onClick="window.open('/server/file.html', 'help', 'toolbar=no, location=no, directories=no, status=yes, menubar=no, scrollbars=yes, resizable=yes, width=640, height=480'); return false"
title='${html:LANG_O1}' onMouseOver="info('${html:LANG_O1}'); return true" onMouseOut="info('&nbsp;'); return true"
title='${html:LANG_O1}' onMouseOver="info('${js:LANG_O1}'); return true" onMouseOut="info('&nbsp;'); return true"
style="color:#FFFFFF"
>
${LANG_O1}
@@ -73,7 +73,7 @@ ${do:if-file-exists:html/index.html}
<td id="subTitle" align="right">
<a href="/index.html" target="_blank"
onClick="window.open('/server/help.html', 'help', 'toolbar=no, location=no, directories=no, status=yes, menubar=no, scrollbars=yes, resizable=yes, width=640, height=480'); return false"
title='${html:LANG_TIPHELP}' onMouseOver="info('${html:LANG_TIPHELP}'); return true" onMouseOut="info('&nbsp;'); return true"
title='${html:LANG_TIPHELP}' onMouseOver="info('${js:LANG_TIPHELP}'); return true" onMouseOut="info('&nbsp;'); return true"
style="color:#FFFFFF"
>
${LANG_O5}
@@ -102,7 +102,7 @@ ${do:if-file-exists:html/index.html}
<td>
<a href="/step2.html" target="_blank"
onClick="window.open('/step2.html', 'help', 'toolbar=no, location=no, directories=no, status=yes, menubar=no, scrollbars=yes, resizable=yes, width=640, height=480'); return false"
title='${html:LANG_TIPHELP}' onMouseOver="info('${html:LANG_TIPHELP}'); return true" onMouseOut="info('&nbsp;'); return true"
title='${html:LANG_TIPHELP}' onMouseOver="info('${js:LANG_TIPHELP}'); return true" onMouseOut="info('&nbsp;'); return true"
>${LANG_TIPHELP}</a>
</td>
${do:end-if}
@@ -118,7 +118,7 @@ ${do:end-if}
<tr><td>
${LANG_G31}
<select name="todo"
title='${html:LANG_G9}' onMouseOver="info('${html:LANG_G9}'); return true" onMouseOut="info('&nbsp;'); return true"
title='${html:LANG_G9}' onMouseOver="info('${js:LANG_G9}'); return true" onMouseOut="info('&nbsp;'); return true"
>
${listid:todo:LISTDEF_10}
</select>
@@ -131,12 +131,12 @@ ${do:end-if}
</td><td>
<input type="button" value="${LANG_G43}"
onClick="doOpenWindow()"
title='${html:LANG_G24b}' onMouseOver="info('${html:LANG_G24b}'); return true" onMouseOut="info('&nbsp;'); return true"
title='${html:LANG_G24b}' onMouseOver="info('${js:LANG_G24b}'); return true" onMouseOut="info('&nbsp;'); return true"
>
</td></tr></table>
<br>
<textarea name="urls" cols="50" rows="8"
title='${html:LANG_G11}' onMouseOver="info('${html:LANG_G11}'); return true" onMouseOut="info('&nbsp;'); return true"
title='${html:LANG_G11}' onMouseOver="info('${js:LANG_G11}'); return true" onMouseOut="info('&nbsp;'); return true"
>
${do:output-mode:html}
${urls}
@@ -150,7 +150,7 @@ ${do:output-mode:}
${LANG_URLLIST}:
</td><td>
<input name="filelist" value="${filelist}" size="40"
title='${html:LANG_G24c}' onMouseOver="info('${html:LANG_G24c}'); return true" onMouseOut="info('&nbsp;'); return true"
title='${html:LANG_G24c}' onMouseOver="info('${js:LANG_G24c}'); return true" onMouseOut="info('&nbsp;'); return true"
>
</td></tr></table>
@@ -161,7 +161,7 @@ ${do:output-mode:}
${LANG_G41}
</td><td>
<input type="button" value="${LANG_G40}" onClick="window.open('option1.html', 'option1', 'toolbar=no, location=no, directories=no, status=yes, menubar=no, scrollbars=yes, resizable=yes, width=640, height=480'); return false"
title='${html:LANG_G24}' onMouseOver="info('${html:LANG_G24}'); return true" onMouseOut="info('&nbsp;'); return true"
title='${html:LANG_G24}' onMouseOver="info('${js:LANG_G24}'); return true" onMouseOut="info('&nbsp;'); return true"
>
</td></tr></table>
@@ -170,11 +170,11 @@ ${do:output-mode:}
<tr><td align="right">
<table width="100%" border="0"><tr><td align="left">
<input type="submit" value=" << ${LANG_PREVIOUS} " onClick="form.redirect.value='step2.html'; form.submit()"
title='${html:LANG_TIPPREV}' onMouseOver="info('${html:LANG_TIPPREV}'); return true" onMouseOut="info('&nbsp;'); return true"
title='${html:LANG_TIPPREV}' onMouseOver="info('${js:LANG_TIPPREV}'); return true" onMouseOut="info('&nbsp;'); return true"
>
</td><td align="right">
<input name="nextBtn" type="submit" value=" ${LANG_NEXT} >> "
title='${html:LANG_TIPNEXT}' onMouseOver="info('${html:LANG_TIPNEXT}'); return true" onMouseOut="info('&nbsp;'); return true"
title='${html:LANG_TIPNEXT}' onMouseOver="info('${js:LANG_TIPNEXT}'); return true" onMouseOut="info('&nbsp;'); return true"
>
</td></tr></table>

View File

@@ -4,7 +4,7 @@
<meta http-equiv="Content-Type" content="text/html; charset=${LANGUAGE_CHARSET}" />
<meta name="description" content="${LANG_METADESC}" />
<meta name="keywords" content="${LANG_METAKEYW}" />
<title>'${projname}' - HTTrack Website Copier</title>
<title>'${html:projname}' - HTTrack Website Copier</title>
<link rel="stylesheet" type="text/css" media="screen" href="style.css">
<script type="text/javascript" src="ping.js" defer></script>
@@ -34,7 +34,7 @@ function info(str) {
<table width="76%" border="0" align="center" cellspacing="0" cellpadding="0" class="tableWidth">
<tr>
<td><img src="images/header_title_4.gif" width="400" height="34" alt="HTTrack Website Copier" title="" border="0" id="title" /></td>
<td><img src="images/wordmark.svg" width="400" height="36" alt="HTTrack Website Copier" title="" border="0" id="title" /></td>
</tr>
</table>
<table width="76%" border="0" align="center" cellspacing="0" cellpadding="3" class="tableWidth">
@@ -43,7 +43,7 @@ function info(str) {
<td id="subTitle" align="right">
<a href="/server/file.html" target="_blank"
onClick="window.open('/server/file.html', 'help', 'toolbar=no, location=no, directories=no, status=yes, menubar=no, scrollbars=yes, resizable=yes, width=640, height=480'); return false"
title='${html:LANG_O1}' onMouseOver="info('${html:LANG_O1}'); return true" onMouseOut="info('&nbsp;'); return true"
title='${html:LANG_O1}' onMouseOver="info('${js:LANG_O1}'); return true" onMouseOut="info('&nbsp;'); return true"
style="color:#FFFFFF"
>
${LANG_O1}
@@ -55,7 +55,7 @@ ${do:if-file-exists:html/index.html}
<td id="subTitle" align="right">
<a href="/index.html" target="_blank"
onClick="window.open('/server/help.html', 'help', 'toolbar=no, location=no, directories=no, status=yes, menubar=no, scrollbars=yes, resizable=yes, width=640, height=480'); return false"
title='${html:LANG_TIPHELP}' onMouseOver="info('${html:LANG_TIPHELP}'); return true" onMouseOut="info('&nbsp;'); return true"
title='${html:LANG_TIPHELP}' onMouseOver="info('${js:LANG_TIPHELP}'); return true" onMouseOut="info('&nbsp;'); return true"
style="color:#FFFFFF"
>
${LANG_O5}
@@ -84,7 +84,7 @@ ${do:if-file-exists:html/index.html}
<td>
<a href="/step3.html" target="_blank"
onClick="window.open('/step3.html', 'help', 'toolbar=no, location=no, directories=no, status=yes, menubar=no, scrollbars=yes, resizable=yes, width=640, height=480'); return false"
title='${html:LANG_TIPHELP}' onMouseOver="info('${html:LANG_TIPHELP}'); return true" onMouseOut="info('&nbsp;'); return true"
title='${html:LANG_TIPHELP}' onMouseOver="info('${js:LANG_TIPHELP}'); return true" onMouseOut="info('&nbsp;'); return true"
>${LANG_TIPHELP}</a>
</td>
${do:end-if}
@@ -132,7 +132,8 @@ httrack \
\
${do:if-not-empty:BuildString}
--structure "${arg:BuildString}"
${do:end-if}
${/* end-if clears the output mode rather than restoring it, so re-arm it */}
${do:end-if}${do:output-mode:html}
${test:build:-N0:-N0:-N1:-N2:-N3:-N4:-N5:-N100:-N101:-N102:-N103:-N104:-N105:-N99:-N199:}
\
${ztest:dos::--long-names=0:--long-names=2}
@@ -189,7 +190,7 @@ ${/* -m<n> resets the html limit, so the bare form must precede the -m,<n> one *
${test:http10:--http-10}
${test:cache2:--store-all-in-cache}
${test:sitemap:--sitemap}
${test:sitemapurl:--sitemap-url "}${html:sitemapurl}${test:sitemapurl:"}
${test:sitemapurl:--sitemap-url "}${arg:sitemapurl}${test:sitemapurl:"}
${test:warc:--warc}
${test:warcfile:--warc-file "}${arg:warcfile}${test:warcfile:"}
${test:warcmaxsize:--warc-max-size=}${unquoted:warcmaxsize}
@@ -319,11 +320,11 @@ ${do:output-mode:}
</td></tr><tr><td>
<table width="100%" border="0"><tr><td align="left">
<input type="submit" value=" << ${LANG_PREVIOUS} " onClick="form.command.value=''; form.redirect.value='step3.html'; form.submit()"
title='${html:LANG_TIPPREV}' onMouseOver="info('${html:LANG_TIPPREV}'); return true" onMouseOut="info('&nbsp;'); return true"
title='${html:LANG_TIPPREV}' onMouseOver="info('${js:LANG_TIPPREV}'); return true" onMouseOut="info('&nbsp;'); return true"
>
</td><td align="right">
<input name="nextBtn" type="submit" value=" ${LANG_J9} >> "
title='${html:LANG_TIPNEXT}' onMouseOver="info('${html:LANG_TIPNEXT}'); return true" onMouseOut="info('&nbsp;'); return true"
title='${html:LANG_TIPNEXT}' onMouseOver="info('${js:LANG_TIPNEXT}'); return true" onMouseOut="info('&nbsp;'); return true"
>
</td></tr></table>

View File

@@ -36,7 +36,7 @@ a:active { text-decoration: underline; }
border-bottom: 6px solid #000;
padding: 10px; padding-top: 20px;
line-height: 1.65em;
background-image: url(images/bg_rings.gif);
background-image: url(images/bg_rings.svg);
background-repeat: no-repeat;
background-position: top right;
}

View File

@@ -186,6 +186,8 @@ scanning
ñêàíèðà
Waiting for scheduled time..
Î÷àêâà çàäàäåíîòî âðåìå çà íà÷àëî...
Transferring data..
Ïðåõâúðëÿíå íà äàííè..
Connecting to provider
Ñâúðçâàíå êúì äîñòàâ÷èêà
[%d seconds] to go before start of operation
@@ -370,6 +372,8 @@ Create a Start Page
Ñúçäàé ñòàðòîâà ñòðàíèöà
Create a word database of all html pages
Ñúçäàé áàçà äàííè ñ äóìèòå îò âñè÷êè html ñòðàíèöè
Build a complete RFC822 mail (MHT/EML) archive of the mirror
Ñúçäàé ïúëåí ïîùåíñêè àðõèâ RFC822 (MHT/EML) íà îãëåäàëîòî
Create error logging and report files
Ñúçäàé ôàéëîâå çà îò÷åòè è çàïèñ íà ãðåøêèòå
Generate DOS 8-3 filenames ONLY
@@ -418,6 +422,12 @@ Browser identity
Èäåíòèôèêàöèÿ íà áðàóçúðà
Comment to be placed in each HTML file
Äà áúäå ïîñòàâåí êîìåíòàð âúâ âñåêè HTML ôàéë
Languages accepted by the browser
Åçèöè, ïðèåìàíè îò áðàóçúðà
Additional HTTP headers to be sent in each requests
Äîïúëíèòåëíè HTTP çàãëàâêè, èçïðàùàíè ïðè âñÿêà çàÿâêà
HTTP referer to be sent for initial URLs
HTTP referer, èçïðàùàí çà íà÷àëíèòå àäðåñè
Back to starting page
Íàçàä êúì ñòàðòîâàòà ñòðàíèöà
Save current preferences as default values
@@ -478,6 +488,8 @@ Make an index
Ñúçäàé èíäåêñ
Make a word database
Ñúçäàé áàçà äàííè ñ äóìè
Build a mail archive
Ñúçäàé ïîùåíñêè àðõèâ
Log files
Log ôàéëîâå
DOS names (8+3)
@@ -506,6 +518,12 @@ Identity
Èäåíòè÷íîñò
HTML footer
HTML êðàé (footer)
Languages
Åçèöè
Additional HTTP Headers
Äîïúëíèòåëíè HTTP çàãëàâêè
Default referer URL
Ïîäðàçáèðàù ñå referer àäðåñ
N# connections
Áðîé âðúçêè
Abandon host if error

View File

@@ -186,6 +186,8 @@ scanning
recorriendo
Waiting for scheduled time..
Esperando a la hora especificada para comenzar
Transferring data..
Transfiriendo datos..
Connecting to provider
Conexión con el proveedor
[%d seconds] to go before start of operation
@@ -370,6 +372,8 @@ Create a Start Page
Generar página de inicio
Create a word database of all html pages
Crear una base de datos de palabras de todas las páginas HTML
Build a complete RFC822 mail (MHT/EML) archive of the mirror
Crear un archivo de correo RFC822 (MHT/EML) completo de la copia
Create error logging and report files
Generar ficheros de auditoría para los errores y mensajes
Generate DOS 8-3 filenames ONLY
@@ -418,6 +422,12 @@ Browser identity
Identidad del navegador
Comment to be placed in each HTML file
Pie de página colocado en cada fichero HTML
Languages accepted by the browser
Idiomas aceptados por el navegador
Additional HTTP headers to be sent in each requests
Cabeceras HTTP adicionales a enviar en cada petición
HTTP referer to be sent for initial URLs
Referer HTTP a enviar para las URL iniciales
Back to starting page
Volver a la primera página
Save current preferences as default values
@@ -478,6 +488,8 @@ Make an index
Hacer un índice
Make a word database
Elaborar una base de datos de palabras
Build a mail archive
Crear un archivo de correo
Log files
Ficheros auditoría
DOS names (8+3)
@@ -506,6 +518,12 @@ Identity
Identidad
HTML footer
Pie de página HTML
Languages
Idiomas
Additional HTTP Headers
Cabeceras HTTP adicionales
Default referer URL
URL de referer por defecto
N# connections
Nº de conexiones
Abandon host if error

View File

@@ -186,6 +186,8 @@ scanning
provìøování
Waiting for scheduled time..
Èekání na naplánovaný èas..
Transferring data..
Pøenos dat..
Connecting to provider
Pøipojování k poskytovateli
[%d seconds] to go before start of operation
@@ -370,6 +372,8 @@ Create a Start Page
Vytvoøit úvodní stránku
Create a word database of all html pages
Vytvoøit seznam slov ze všech HTML stránek
Build a complete RFC822 mail (MHT/EML) archive of the mirror
Vytvoøit úplný poštovní archiv RFC822 (MHT/EML) staženého webu
Create error logging and report files
Vytvoøit protokol s chybami a hlášeními
Generate DOS 8-3 filenames ONLY
@@ -418,6 +422,12 @@ Browser identity
Totožnost prohlížeèe
Comment to be placed in each HTML file
Komentáø vložený do každého HTML souboru
Languages accepted by the browser
Jazyky pøijímané prohlížeèem
Additional HTTP headers to be sent in each requests
Další hlavièky HTTP odesílané v každém požadavku
HTTP referer to be sent for initial URLs
Hlavièka HTTP referer odesílaná pro poèáteèní adresy URL
Back to starting page
Zpìt na úvodní stránku
Save current preferences as default values
@@ -478,6 +488,8 @@ Make an index
Vytvoøit rejstøík
Make a word database
Vytvoøit seznam slov
Build a mail archive
Vytvoøit poštovní archiv
Log files
Protokoly
DOS names (8+3)
@@ -506,6 +518,12 @@ Identity
Identifikace
HTML footer
Záhlaví HTML
Languages
Jazyky
Additional HTTP Headers
Další hlavièky HTTP
Default referer URL
Výchozí adresa referer
N# connections
Poèet spojení
Abandon host if error

View File

@@ -186,6 +186,8 @@ scanning
掃描
Waiting for scheduled time..
等待預定的時間..
Transferring data..
傳送資料..
Connecting to provider
正在連線網路
[%d seconds] to go before start of operation
@@ -370,6 +372,8 @@ Create a Start Page
新增一個起始頁面
Create a word database of all html pages
為所有html頁建造一個文字數據庫
Build a complete RFC822 mail (MHT/EML) archive of the mirror
建立鏡像的完整 RFC822 郵件封存檔 (MHT/EML)
Create error logging and report files
新增錯誤記錄及報告檔案
Generate DOS 8-3 filenames ONLY
@@ -418,6 +422,12 @@ Browser identity
瀏覽器身份
Comment to be placed in each HTML file
在每個HTML檔案裏增加的注釋
Languages accepted by the browser
瀏覽器接受的語言
Additional HTTP headers to be sent in each requests
每次要求時額外傳送的 HTTP 標頭
HTTP referer to be sent for initial URLs
起始網址所傳送的 HTTP referer
Back to starting page
回到起始頁面
Save current preferences as default values
@@ -478,6 +488,8 @@ Make an index
新增一個 index.html 檔案
Make a word database
建造一個文字數據庫
Build a mail archive
建立郵件封存檔
Log files
日誌檔案
DOS names (8+3)
@@ -506,6 +518,12 @@ Identity
身份
HTML footer
HTML頁腳
Languages
語言
Additional HTTP Headers
額外的 HTTP 標頭
Default referer URL
預設的 referer 網址
N# connections
連線數
Abandon host if error

View File

@@ -186,6 +186,8 @@ scanning
扫描
Waiting for scheduled time..
等待预定的时间..
Transferring data..
传送数据..
Connecting to provider
正在连接网络
[%d seconds] to go before start of operation
@@ -370,6 +372,8 @@ Create a Start Page
创建一个起始页面
Create a word database of all html pages
根据网页使用语言创建词汇库文件
Build a complete RFC822 mail (MHT/EML) archive of the mirror
创建镜像的完整 RFC822 邮件归档 (MHT/EML)
Create error logging and report files
创建错误记录及汇报文件
Generate DOS 8-3 filenames ONLY
@@ -418,6 +422,12 @@ Browser identity
浏览器身份
Comment to be placed in each HTML file
在每个HTML文件里添加的注释
Languages accepted by the browser
浏览器接受的语言
Additional HTTP headers to be sent in each requests
每次请求时额外发送的 HTTP 头
HTTP referer to be sent for initial URLs
起始网址所发送的 HTTP referer
Back to starting page
回到起始页面
Save current preferences as default values
@@ -478,6 +488,8 @@ Make an index
创建一个 index.html 文件
Make a word database
创建词汇库
Build a mail archive
创建邮件归档
Log files
日志文件
DOS names (8+3)
@@ -506,6 +518,12 @@ Identity
身份
HTML footer
HTML页脚
Languages
语言
Additional HTTP Headers
额外的 HTTP 头
Default referer URL
默认的 referer 网址
N# connections
连接数
Abandon host if error

View File

@@ -7,7 +7,7 @@ hr
LANGUAGE_AUTHOR
Dominko Aždajiæ (domazd@mail.ru) \r\n
LANGUAGE_CHARSET
ISO-8859-2
windows-1250
LANGUAGE_WINDOWSID
Croatian
OK
@@ -372,6 +372,8 @@ Create a Start Page
Napraviti poèetnu stranicu
Create a word database of all html pages
Napraviti spisak rijeèi sa svih stranica HTML-a
Build a complete RFC822 mail (MHT/EML) archive of the mirror
Izraditi potpunu poštansku arhivu RFC822 (MHT/EML) zrcala
Create error logging and report files
Napraviti datoteke zapisnika pogrešaka i izvješæa o tijeku postupka
Generate DOS 8-3 filenames ONLY
@@ -420,6 +422,12 @@ Browser identity
Preglednièko obilježje
Comment to be placed in each HTML file
Komentar koji æe biti smješten u svakoj datoteci HTML-a
Languages accepted by the browser
Jezici koje prihvaæa preglednik
Additional HTTP headers to be sent in each requests
Dodatna HTTP zaglavlja koja se šalju u svakom zahtjevu
HTTP referer to be sent for initial URLs
HTTP referer koji se šalje za poèetne URL-ove
Back to starting page
Natrag na poèetnu stranicu
Save current preferences as default values
@@ -480,6 +488,8 @@ Make an index
Napraviti kazalo
Make a word database
Napraviti spisak rijeèi
Build a mail archive
Izraditi poštansku arhivu
Log files
Zapisnièke datoteke
DOS names (8+3)
@@ -508,6 +518,12 @@ Identity
Obilježje
HTML footer
Podnožje HTML-a
Languages
Jezici
Additional HTTP Headers
Dodatna HTTP zaglavlja
Default referer URL
Zadani referer URL
N# connections
Broj veza
Abandon host if error
@@ -933,7 +949,7 @@ Tijekom ovog zrcaljenja je nastala fatalna pogre
Proxy type:
Vrsta posrednika:
Proxy protocol. HTTP: standard proxy. HTTP (CONNECT tunnel): sends every request through a CONNECT tunnel, for CONNECT-only proxies like Tor's HTTPTunnelPort. SOCKS5: default port 1080.
Protokol posrednika. HTTP: standardni posrednik. HTTP (CONNECT tunel): ¹alje svaki zahtjev kroz CONNECT tunel, za posrednike koji podr¾avaju samo CONNECT poput Torovog HTTPTunnelPorta. SOCKS5: zadani port 1080.
Protokol posrednika. HTTP: standardni posrednik. HTTP (CONNECT tunel): šalje svaki zahtjev kroz CONNECT tunel, za posrednike koji podržavaju samo CONNECT poput Torovog HTTPTunnelPorta. SOCKS5: zadani port 1080.
Load cookies from file:
Uèitati kolaèiæe iz datoteke:
Preload cookies from a Netscape cookies.txt file before crawling.
@@ -943,15 +959,15 @@ Stanka izme
Random delay between file downloads, in seconds. Use MIN:MAX for a random range (e.g. 2:8).
Nasumièna odgoda izmeðu preuzimanja datoteka, u sekundama. Za nasumièni raspon koristiti MIN:MAX (npr. 2:8).
Keep the www. prefix (do not merge www.host with host)
Zadr¾ati www. predmetak (ne spajati www.host s host)
Zadržati www. predmetak (ne spajati www.host s host)
Do not treat www.host and host as the same site.
www.host i host ne smatrati istim web-mjestom.
Keep double slashes in URLs
Zadr¾ati dvostruke kose crte u URL-ovima
Zadržati dvostruke kose crte u URL-ovima
Do not collapse duplicate slashes in URLs.
Ne sa¾imati ponovljene kose crte u URL-ovima.
Ne sažimati ponovljene kose crte u URL-ovima.
Keep the original query-string order
Zadr¾ati izvorni redoslijed teksta za upite
Zadržati izvorni redoslijed teksta za upite
Do not reorder query-string parameters when deduplicating URLs.
Ne mijenjati redoslijed parametara teksta za upite pri uklanjanju dvostrukih URL-ova.
Strip query keys:
@@ -959,7 +975,7 @@ Ukloniti klju
Comma-separated query keys to drop from the saved-file naming (e.g. sid,utm_source).
Zarezom odvojeni kljuèevi upita koji se izostavljaju iz naziva spremljenih datoteka (npr. sid,utm_source).
Write a WARC archive of the crawl
Zapi¹i WARC arhivu obilaska
Zapiši WARC arhivu obilaska
Also save every fetched response into an ISO-28500 WARC/1.1 archive, next to the mirror.
Spremi i svaki preuzeti odgovor u ISO-28500 WARC/1.1 arhivu, uz zrcalo.
WARC archive name:
@@ -967,19 +983,19 @@ Naziv WARC arhive:
Optional base name for the WARC archive; leave blank to auto-name it under the output directory.
Neobavezni osnovni naziv WARC arhive; ostavite prazno za automatsko imenovanje u izlaznom direktoriju.
Report what changed since the previous mirror
Prijavi ¹to se promijenilo od prethodnog zrcaljenja
Prijavi što se promijenilo od prethodnog zrcaljenja
Also write hts-changes.json listing what this crawl left new, changed, unchanged and gone compared to the previous mirror.
Zapi¹i i hts-changes.json s popisom onoga ¹to je u odnosu na prethodno zrcaljenje novo, promijenjeno, nepromijenjeno ili nestalo.
Zapiši i hts-changes.json s popisom onoga što je u odnosu na prethodno zrcaljenje novo, promijenjeno, nepromijenjeno ili nestalo.
Inline assets as data: URIs (self-contained pages)
Ugradi resurse kao data: URI-je (samostalne stranice)
Once the mirror is finished, rewrite every saved page with its stylesheets, scripts, images and fonts embedded, so a page can also be opened on its own.
Nakon dovr¹etka zrcaljenja ponovno zapi¹i svaku spremljenu stranicu s ugraðenim stilskim listovima, skriptama, slikama i fontovima, tako da se stranica mo¾e otvoriti i zasebno.
Nakon dovršetka zrcaljenja ponovno zapiši svaku spremljenu stranicu s ugraðenim stilskim listovima, skriptama, slikama i fontovima, tako da se stranica može otvoriti i zasebno.
Largest inlined asset (bytes):
Najveæi ugraðeni resurs (bajtovi):
An asset above this size keeps an ordinary link; leave blank for the 10485760-byte default.
Resurs veæi od ove velièine zadr¾ava obiènu poveznicu; ostavite prazno za zadanih 10485760 bajtova.
Resurs veæi od ove velièine zadržava obiènu poveznicu; ostavite prazno za zadanih 10485760 bajtova.
Seed the crawl from the site's sitemap
Pokreni pretra¾ivanje iz karte web-mjesta
Pokreni pretraživanje iz karte web-mjesta
Read the site's sitemap (robots.txt Sitemap: lines, then /sitemap.xml) and add every URL it lists as a start URL.
Proèitaj kartu web-mjesta (retke Sitemap: iz robots.txt, zatim /sitemap.xml) i dodaj svaki navedeni URL kao poèetnu adresu.
Sitemap address:
@@ -987,9 +1003,9 @@ Adresa karte web-mjesta:
Address of a sitemap to read instead of probing the site; leave blank to probe robots.txt then /sitemap.xml.
Adresa karte web-mjesta koju treba proèitati umjesto ispitivanja web-mjesta; ostavite prazno za ispitivanje robots.txt pa /sitemap.xml.
Write a CDXJ index of the WARC archive
Zapi¹i CDXJ indeks WARC arhive
Zapiši CDXJ indeks WARC arhive
Also write a sorted CDXJ index listing every record in the WARC archive, for replay tools.
Zapi¹i i sortirani CDXJ indeks sa svim zapisima WARC arhive, za alate za reprodukciju.
Zapiši i sortirani CDXJ indeks sa svim zapisima WARC arhive, za alate za reprodukciju.
Package the crawl as a WACZ file
Zapakiraj obilazak u WACZ datoteku
Bundle the WARC archive, its CDXJ index and the mirrored pages into a single WACZ file; implies the WARC archive and the CDXJ index.

View File

@@ -186,6 +186,8 @@ scanning
scannen
Waiting for scheduled time..
Eingestellte Startzeit abwarten
Transferring data..
Daten werden übertragen..
Connecting to provider
Verbindung aufbauen
[%d seconds] to go before start of operation
@@ -370,6 +372,8 @@ Create a Start Page
Startseite erstellen
Create a word database of all html pages
Liste mit allen Wörtern in den HTML-Seiten anlegen
Build a complete RFC822 mail (MHT/EML) archive of the mirror
Vollständiges RFC822-Mailarchiv (MHT/EML) der Site-Kopie erstellen
Create error logging and report files
Fehlerprotokoll und Ablaufbericht erstellen
Generate DOS 8-3 filenames ONLY
@@ -418,6 +422,12 @@ Browser identity
Browser-Kennung
Comment to be placed in each HTML file
Kommentar, einzufügen in jede HTML-Datei
Languages accepted by the browser
Vom Browser akzeptierte Sprachen
Additional HTTP headers to be sent in each requests
Zusätzliche HTTP-Header, die in jeder Anfrage gesendet werden
HTTP referer to be sent for initial URLs
HTTP-Referer, der für die Start-URLs gesendet wird
Back to starting page
Zurück zur Startseite
Save current preferences as default values
@@ -478,6 +488,8 @@ Make an index
Index erstellen
Make a word database
Wortliste anlegen
Build a mail archive
Mailarchiv erstellen
Log files
Protokolldateien
DOS names (8+3)
@@ -506,6 +518,12 @@ Identity
Identität
HTML footer
HTML-Fußzeile
Languages
Sprachen
Additional HTTP Headers
Zusätzliche HTTP-Header
Default referer URL
Standard-Referer-URL
N# connections
Anzahl Verbindungen
Abandon host if error

View File

@@ -186,6 +186,8 @@ scanning
skaneerimine
Waiting for scheduled time..
Etteantud aja ootamine...
Transferring data..
Andmete edastamine..
Connecting to provider
Ühendusevõtmine
[%d seconds] to go before start of operation
@@ -370,6 +372,8 @@ Create a Start Page
Tee alguslehekülg
Create a word database of all html pages
Loo kõigi HTML-lehekülgede sõnade andmebaas
Build a complete RFC822 mail (MHT/EML) archive of the mirror
Koopia täieliku RFC822 kirjaarhiivi (MHT/EML) koostamine
Create error logging and report files
Tee vealogi ja raporti failid
Generate DOS 8-3 filenames ONLY
@@ -418,6 +422,12 @@ Browser identity
Brauseri identiteet
Comment to be placed in each HTML file
Kommentaar, mis lisatakse igale HTML-failile
Languages accepted by the browser
Brauseri aktsepteeritavad keeled
Additional HTTP headers to be sent in each requests
Täiendavad HTTP-päised, mis saadetakse iga päringuga
HTTP referer to be sent for initial URLs
Algsete URL-ide jaoks saadetav HTTP referer
Back to starting page
Tagasi alguslehele
Save current preferences as default values
@@ -478,6 +488,8 @@ Make an index
Tee indeks
Make a word database
Tee sõnade andmebaas
Build a mail archive
Tee kirjaarhiiv
Log files
Logifailid
DOS names (8+3)
@@ -506,6 +518,12 @@ Identity
Identiteet
HTML footer
HTML-i jalus
Languages
Keeled
Additional HTTP Headers
Täiendavad HTTP-päised
Default referer URL
Vaikimisi referer-URL
N# connections
Ühenduste arv
Abandon host if error

View File

@@ -372,6 +372,8 @@ Create a Start Page
Luo aloitussivu
Create a word database of all html pages
Luo sanatietokanta kaikista html-sivuista
Build a complete RFC822 mail (MHT/EML) archive of the mirror
Luo peilistä täydellinen RFC822-postiarkisto (MHT/EML)
Create error logging and report files
Luo virheloki- ja raporttitiedostot
Generate DOS 8-3 filenames ONLY
@@ -420,6 +422,12 @@ Browser identity
Esittäydy selaimena
Comment to be placed in each HTML file
Jokaiseen HTML-tiedostoon pantava kommentti
Languages accepted by the browser
Selaimen hyväksymät kielet
Additional HTTP headers to be sent in each requests
Lisäotsakkeet, jotka lähetetään jokaisessa HTTP-pyynnössä
HTTP referer to be sent for initial URLs
Alkuperäisille URL-osoitteille lähetettävä HTTP-referer
Back to starting page
Palaa aloitussivulle
Save current preferences as default values
@@ -480,6 +488,8 @@ Make an index
Tee indeksi
Make a word database
Tee sanatietokanta
Build a mail archive
Tee postiarkisto
Log files
Lokitiedostot
DOS names (8+3)
@@ -508,6 +518,12 @@ Identity
Esittäydy
HTML footer
HTML-alatunniste
Languages
Kielet
Additional HTTP Headers
HTTP-lisäotsakkeet
Default referer URL
Oletusarvoinen referer-URL
N# connections
Yhteyksiä
Abandon host if error

View File

@@ -372,6 +372,8 @@ Create a Start Page
Δημιουργία αρχικής σελίδας
Create a word database of all html pages
Δημιουργία λίστας λέξεων από όλες τις σελίδες html
Build a complete RFC822 mail (MHT/EML) archive of the mirror
Δημιουργία πλήρους αρχείου αλληλογραφίας RFC822 (MHT/EML) του αντιγράφου
Create error logging and report files
Δημιουργία αρχείου καταγραφής λαθών και αναφοράς
Generate DOS 8-3 filenames ONLY
@@ -420,6 +422,12 @@ Browser identity
Ταυτότητα που θα δηλώνει ο εξερευνητής
Comment to be placed in each HTML file
Σχόλια που θα τοποθετηθούν σε κάθε αρχείο HTML
Languages accepted by the browser
Γλώσσες που δέχεται ο εξερευνητής
Additional HTTP headers to be sent in each requests
Πρόσθετες κεφαλίδες HTTP που θα στέλνονται σε κάθε αίτηση
HTTP referer to be sent for initial URLs
HTTP referer που θα στέλνεται για τις αρχικές διευθύνσεις URL
Back to starting page
Πίσω στην αρχική σελίδα
Save current preferences as default values
@@ -480,6 +488,8 @@ Make an index
Δημιουργία ευρετηρίου
Make a word database
Δημιουργία βάσης-δεδομένων λέξεων
Build a mail archive
Δημιουργία αρχείου αλληλογραφίας
Log files
Αρχείο γεγονότων
DOS names (8+3)
@@ -508,6 +518,12 @@ Identity
Ταυτότητα
HTML footer
Σημείωση HTML
Languages
Γλώσσες
Additional HTTP Headers
Πρόσθετες κεφαλίδες HTTP
Default referer URL
Προεπιλεγμένη διεύθυνση referer
N# connections
Αριθμός συνδέσεων
Abandon host if error

View File

@@ -186,6 +186,8 @@ scanning
Scansione
Waiting for scheduled time..
Attesa dell'orario specificato per iniziare
Transferring data..
Trasferimento dati..
Connecting to provider
Connesione al provider in corso
[%d seconds] to go before start of operation
@@ -370,6 +372,8 @@ Create a Start Page
Crea la pagina iniziale
Create a word database of all html pages
Crea un database delle parole di tutte le pagine HTML
Build a complete RFC822 mail (MHT/EML) archive of the mirror
Crea un archivio di posta RFC822 (MHT/EML) completo del mirror
Create error logging and report files
Crea file di log per segnalare errori e informazioni
Generate DOS 8-3 filenames ONLY
@@ -418,6 +422,12 @@ Browser identity
Identità del browser
Comment to be placed in each HTML file
Piè di pagina per ogni file HTML
Languages accepted by the browser
Lingue accettate dal browser
Additional HTTP headers to be sent in each requests
Intestazioni HTTP aggiuntive da inviare in ogni richiesta
HTTP referer to be sent for initial URLs
Referer HTTP da inviare per gli URL iniziali
Back to starting page
Torna alla pagina iniziale
Save current preferences as default values
@@ -478,6 +488,8 @@ Make an index
Crea un indice
Make a word database
Crea un database delle parole
Build a mail archive
Crea un archivio di posta
Log files
File di log
DOS names (8+3)
@@ -506,6 +518,12 @@ Identity
Identità
HTML footer
Piè di pagina HTML
Languages
Lingue
Additional HTTP Headers
Intestazioni HTTP aggiuntive
Default referer URL
URL referer predefinito
N# connections
N° di connessioni
Abandon host if error

View File

@@ -186,6 +186,8 @@ scanning
スキャン中
Waiting for scheduled time..
設定された開始時間を待っています..
Transferring data..
データを転送しています..
Connecting to provider
プロバイダへ接続中
[%d seconds] to go before start of operation
@@ -370,6 +372,8 @@ Create a Start Page
スタートページの作成
Create a word database of all html pages
全てのHTMLページに単語データベースを作成する
Build a complete RFC822 mail (MHT/EML) archive of the mirror
ミラーの完全な RFC822 メールアーカイブ (MHT/EML) を作成する
Create error logging and report files
エラーログとレポートファイルを作成する
Generate DOS 8-3 filenames ONLY
@@ -418,6 +422,12 @@ Browser identity
ブラウザID
Comment to be placed in each HTML file
どのHTMLファイルにも挿入されるコメント
Languages accepted by the browser
ブラウザが受け入れる言語
Additional HTTP headers to be sent in each requests
各リクエストで送信する追加の HTTP ヘッダ
HTTP referer to be sent for initial URLs
最初の URL に送信する HTTP リファラ
Back to starting page
スタートページに戻る
Save current preferences as default values
@@ -478,6 +488,8 @@ Make an index
インデックスの作成
Make a word database
単語データベースを作成する
Build a mail archive
メールアーカイブの作成
Log files
ログファイル
DOS names (8+3)
@@ -506,6 +518,12 @@ Identity
ID
HTML footer
HTMLフッタ
Languages
言語
Additional HTTP Headers
追加の HTTP ヘッダ
Default referer URL
既定のリファラ URL
N# connections
接続数
Abandon host if error

View File

@@ -7,7 +7,7 @@ mk
LANGUAGE_AUTHOR
Àëåêñàíäàð Ñàâè<C3A2> (aleks@macedonia.eu.org) \r \n
LANGUAGE_CHARSET
ISO-8859-5
windows-1251
LANGUAGE_WINDOWSID
FYRO Macedonian
OK
@@ -186,6 +186,8 @@ scanning
ñêåíèðà
Waiting for scheduled time..
Ãî ÷åêàì äàäåíîòî âðåìå...
Transferring data..
Ïðåíîñ íà ïîäàòîöè..
Connecting to provider
Ïîâðçóâàœå ñî ïðîâà¼äåðîò
[%d seconds] to go before start of operation
@@ -370,6 +372,8 @@ Create a Start Page
Êðåèðà¼òå Ñòàðò ñòðàíèöà
Create a word database of all html pages
Êðåèðà¼òå word áàçà íà ïîäàòîöè íà ñèòå html ñòðàíèöè
Build a complete RFC822 mail (MHT/EML) archive of the mirror
Èçðàáîòè öåëîñíà ïîøòåíñêà àðõèâà RFC822 (MHT/EML) íà êîïè¼àòà
Create error logging and report files
Êðåèðà¼òå error logging è äàòîòåêè ñî èçâåøòàè
Generate DOS 8-3 filenames ONLY
@@ -418,6 +422,12 @@ Browser identity
Èäåíòèôèêàöè¼à íà ïðåáàðóâà÷îò
Comment to be placed in each HTML file
Êîìåíòàð êî¼ òðåáà äà áèäå ñìåñòåí âî ñåêî¼à HTML äàòîòåêà
Languages accepted by the browser
£àçèöè ïðèôàòåíè îä ïðåëèñòóâà÷îò
Additional HTTP headers to be sent in each requests
Äîïîëíèòåëíè HTTP çàãëàâ¼à øòî ñå èñïðà<C3B0>ààò âî ñåêîå áàðàœå
HTTP referer to be sent for initial URLs
HTTP referer øòî ñå èñïðà<C3B0>à çà ïî÷åòíèòå URL àäðåñè
Back to starting page
Íàçàä äî ñòàðòíàòà ñòðàíèöà
Save current preferences as default values
@@ -478,6 +488,8 @@ Make an index
Íàïðàâè èíäåêñ
Make a word database
Íàïðàâè word áàçà íà ïîäàòîöè
Build a mail archive
Èçðàáîòè ïîøòåíñêà àðõèâà
Log files
Log äàòîòåêè
DOS names (8+3)
@@ -506,6 +518,12 @@ Identity
Èäåíòèôèêàöè¼à
HTML footer
HTML ôóòåð
Languages
£àçèöè
Additional HTTP Headers
Äîïîëíèòåëíè HTTP çàãëàâ¼à
Default referer URL
Ñòàíäàðäíà referer URL àäðåñà
N# connections
Áðî¼ íà êîíåêöèè
Abandon host if error
@@ -929,70 +947,70 @@ Server terminated
A fatal error has occurred during this mirror
Íàñòàíà ôàòàëíà ãðåøêà ïðè îâî¼ mirror
Proxy type:
ÂØß ÝÐ ßàÞÚáØ:
Òèï íà ïðîêñè:
Proxy protocol. HTTP: standard proxy. HTTP (CONNECT tunnel): sends every request through a CONNECT tunnel, for CONNECT-only proxies like Tor's HTTPTunnelPort. SOCKS5: default port 1080.
¿àÞâÞÚÞÛ ÝÐ ßàÞÚáØ. HTTP: áâÐÝÔÐàÔÕÝ ßàÞÚáØ. HTTP (âãÝÕÛ CONNECT): ÓÞ ØáßàÐüÐ áÕÚÞÕ ÑÐàÐúÕ ßàÕÚã âãÝÕÛ CONNECT, ×Ð ßàÞÚáØ èâÞ ßÞÔÔàÖãÒÐÐâ áÐÜÞ CONNECT ÚÐÚÞ HTTPTunnelPort ÝÐ Tor. SOCKS5: áâÐÝÔÐàÔÝÐ ßÞàâÐ 1080.
Ïðîòîêîë íà ïðîêñè. HTTP: ñòàíäàðäåí ïðîêñè. HTTP (òóíåë CONNECT): ãî èñïðà<C3B0>à ñåêîå áàðàœå ïðåêó òóíåë CONNECT, çà ïðîêñè øòî ïîääðæóâààò ñàìî CONNECT êàêî HTTPTunnelPort íà Tor. SOCKS5: ñòàíäàðäíà ïîðòà 1080.
Load cookies from file:
²çØâÐø ÚÞÛÐçØúÐ ÞÔ ÔÐâÞâÕÚÐ:
Â÷èò༠êîëà÷èœà îä äàòîòåêà:
Preload cookies from a Netscape cookies.txt file before crawling.
¾ÔÝÐßàÕÔ ÒçØâÐø ÚÞÛÐçØúÐ ÞÔ ÔÐâÞâÕÚÐ Netscape cookies.txt ßàÕÔ ßàÕ×ÕÜÐúÕâÞ.
Îäíàïðåä â÷èò༠êîëà÷èœà îä äàòîòåêà Netscape cookies.txt ïðåä ïðåçåìàœåòî.
Pause between files:
¿Ðã×Ð ÜÕóã ÔÐâÞâÕÚØ:
Ïàóçà ìåƒó äàòîòåêè:
Random delay between file downloads, in seconds. Use MIN:MAX for a random range (e.g. 2:8).
ÁÛãçÐøÝÞ ÔÞæÝÕúÕ ÜÕóã ßàÕ×ÕÜÐúÐâÐ ÝÐ ÔÐâÞâÕÚØ, ÒÞ áÕÚãÝÔØ. ºÞàØáâØ MIN:MAX ×Ð áÛãçÐÕÝ ÞßáÕÓ (ÝÐ ßàØÜÕà 2:8).
Ñëó÷à¼íî äîöíåœå ìåƒó ïðåçåìàœàòà íà äàòîòåêè, âî ñåêóíäè. Êîðèñòè MIN:MAX çà ñëó÷àåí îïñåã (íà ïðèìåð 2:8).
Keep the www. prefix (do not merge www.host with host)
·ÐÔàÖØ ÓÞ ßàÕäØÚáÞâ www. (ÝÕ áßÞøãÒÐø www.host áÞ host)
Çàäðæè ãî ïðåôèêñîò www. (íå ñïî¼óâ༠www.host ñî host)
Do not treat www.host and host as the same site.
½Õ âàÕâØàÐø ÓØ www.host Ø host ÚÐÚÞ Øáâ áÐøâ.
Íå òðåòèð༠ãè www.host è host êàêî èñò ñà¼ò.
Keep double slashes in URLs
·ÐÔàÖØ ÓØ ÔÒÞøÝØâÕ ÚÞáØ æàâØ ÒÞ URL
Çàäðæè ãè äâî¼íèòå êîñè öðòè âî URL
Do not collapse duplicate slashes in URLs.
½Õ ÞâáâàÐÝãÒÐø ÓØ ßÞÒâÞàÕÝØâÕ ÚÞáØ æàâØ ÒÞ URL.
Íå îòñòðàíóâ༠ãè ïîâòîðåíèòå êîñè öðòè âî URL.
Keep the original query-string order
·ÐÔàÖØ ÓÞ Ø×ÒÞàÝØÞâ àÕÔÞáÛÕÔ ÝÐ ßÐàÐÜÕâàØâÕ ÒÞ ÑÐàÐúÕâÞ
Çàäðæè ãî èçâîðíèîò ðåäîñëåä íà ïàðàìåòðèòå âî áàðàœåòî
Do not reorder query-string parameters when deduplicating URLs.
½Õ ÜÕÝãÒÐø ÓÞ àÕÔÞáÛÕÔÞâ ÝÐ ßÐàÐÜÕâàØâÕ ÝÐ ÑÐàÐúÕâÞ ßàØ ÞâáâàÐÝãÒÐúÕ ÔãßÛØÚÐâØ URL.
Íå ìåíóâ༠ãî ðåäîñëåäîò íà ïàðàìåòðèòå íà áàðàœåòî ïðè îòñòðàíóâàœå äóïëèêàòè URL.
Strip query keys:
¾âáâàÐÝØ ÚÛãçÕÒØ ÞÔ ÑÐàÐúÕâÞ:
Îòñòðàíè êëó÷åâè îä áàðàœåòî:
Comma-separated query keys to drop from the saved-file naming (e.g. sid,utm_source).
ºÛãçÕÒØ ÞÔ ÑÐàÐúÕâÞ, ÞÔÔÕÛÕÝØ áÞ ×ÐߨàÚÐ, èâÞ áÕ ÞâáâàÐÝãÒÐÐâ ÞÔ ØÜÕâÞ ÝÐ ×ÐçãÒÐÝÐâÐ ÔÐâÞâÕÚÐ (ÝÐ ßàØÜÕà sid,utm_source).
Êëó÷åâè îä áàðàœåòî, îääåëåíè ñî çàïèðêà, øòî ñå îòñòðàíóâààò îä èìåòî íà çà÷óâàíàòà äàòîòåêà (íà ïðèìåð sid,utm_source).
Write a WARC archive of the crawl
·ÐßØèØ WARC ÐàåØÒÐ ÝÐ ßàÕÑÐàãÒÐúÕâÞ
Çàïèøè WARC àðõèâà íà ïðåáàðóâàœåòî
Also save every fetched response into an ISO-28500 WARC/1.1 archive, next to the mirror.
·ÐçãÒÐø ÓÞ áÕÚÞø ßàÕ×ÕÜÕÝ ÞÔÓÞÒÞà Ø ÒÞ ISO-28500 WARC/1.1 ÐàåØÒÐ, ßÞÚàÐø ÞÓÛÕÔÐÛÞâÞ.
Çà÷óâ༠ãî ñåêî¼ ïðåçåìåí îäãîâîð è âî ISO-28500 WARC/1.1 àðõèâà, ïîêð༠îãëåäàëîòî.
WARC archive name:
¸ÜÕ ÝÐ WARC ÐàåØÒÐâÐ:
Èìå íà WARC àðõèâàòà:
Optional base name for the WARC archive; leave blank to auto-name it under the output directory.
¸×ÑÞàÝÞ ÞáÝÞÒÝÞ ØÜÕ ×Ð WARC ÐàåØÒÐâÐ; ÞáâÐÒÕâÕ ßàÐ×ÝÞ ×Ð ÐÒâÞÜÐâáÚÞ ØÜÕÝãÒÐúÕ ÒÞ Ø×ÛÕ×ÝØÞâ ÔØàÕÚâÞàØãÜ.
Èçáîðíî îñíîâíî èìå çà WARC àðõèâàòà; îñòàâåòå ïðàçíî çà àâòîìàòñêî èìåíóâàœå âî èçëåçíèîò äèðåêòîðèóì.
Report what changed since the previous mirror
¸×ÒÕáâØ èâÞ Õ ßàÞÜÕÝÕâÞ ÞÔ ßàÕâåÞÔÝÞâÞ ÞÓÛÕÔÐÛÞ
Èçâåñòè øòî å ïðîìåíåòî îä ïðåòõîäíîòî îãëåäàëî
Also write hts-changes.json listing what this crawl left new, changed, unchanged and gone compared to the previous mirror.
·ÐßØèØ Ø hts-changes.json áÞ áߨáÞÚ ÝÐ âÞÐ èâÞ Õ ÝÞÒÞ, ßàÞÜÕÝÕâÞ, ÝÕßàÞÜÕÝÕâÞ ØÛØ ØáçÕ×ÝÐâÞ ÒÞ ÞÔÝÞá ÝÐ ßàÕâåÞÔÝÞâÞ ÞÓÛÕÔÐÛÞ.
Çàïèøè è hts-changes.json ñî ñïèñîê íà òîà øòî å íîâî, ïðîìåíåòî, íåïðîìåíåòî èëè èñ÷åçíàòî âî îäíîñ íà ïðåòõîäíîòî îãëåäàëî.
Inline assets as data: URIs (self-contained pages)
²ÓàÐÔØ ÓØ àÕáãàáØâÕ ÚÐÚÞ data: URI (áÐÜÞáâÞøÝØ áâàÐÝØæØ)
Âãðàäè ãè ðåñóðñèòå êàêî data: URI (ñàìîñòî¼íè ñòðàíèöè)
Once the mirror is finished, rewrite every saved page with its stylesheets, scripts, images and fonts embedded, so a page can also be opened on its own.
¿Þ ×ÐÒàèãÒÐúÕ ÝÐ ÞÓÛÕÔÐÛÞâÞ, áÕÚÞøÐ ×ÐçãÒÐÝÐ áâàÐÝØæÐ áÕ ßàÕߨèãÒÐ áÞ ÒÓàÐÔÕÝØ áâØÛáÚØ ÛØáâÞÒØ, áÚàØßâØ, áÛØÚØ Ø äÞÝâÞÒØ, ×Ð ÔÐ ÜÞÖÕ áâàÐÝØæÐâÐ ÔÐ áÕ ÞâÒÞàØ Ø áÐÜÞáâÞøÝÞ.
Ïî çàâðøóâàœå íà îãëåäàëîòî, ñåêî¼à çà÷óâàíà ñòðàíèöà ñå ïðåïèøóâà ñî âãðàäåíè ñòèëñêè ëèñòîâè, ñêðèïòè, ñëèêè è ôîíòîâè, çà äà ìîæå ñòðàíèöàòà äà ñå îòâîðè è ñàìîñòî¼íî.
Largest inlined asset (bytes):
½ÐøÓÞÛÕÜ ÒÓàÐÔÕÝ àÕáãàá (ÑÐøâØ):
Íà¼ãîëåì âãðàäåí ðåñóðñ (áà¼òè):
An asset above this size keeps an ordinary link; leave blank for the 10485760-byte default.
ÀÕáãàá ßÞÓÞÛÕÜ ÞÔ ÞÒÐÐ ÓÞÛÕÜØÝÐ ×ÐÔàÖãÒÐ ÞÑØçÝÐ ÒàáÚÐ; ÞáâÐÒÕâÕ ßàÐ×ÝÞ ×Ð áâÐÝÔÐàÔÝØâÕ 10485760 ÑÐøâØ.
Ðåñóðñ ïîãîëåì îä îâàà ãîëåìèíà çàäðæóâà îáè÷íà âðñêà; îñòàâåòå ïðàçíî çà ñòàíäàðäíèòå 10485760 áà¼òè.
Seed the crawl from the site's sitemap
·ÐßÞçÝØ ÓÞ ßàÕÑÐàãÒÐúÕâÞ ÞÔ ÚÐàâÐâÐ ÝÐ áÐøâÞâ
Çàïî÷íè ãî ïðåáàðóâàœåòî îä êàðòàòà íà ñà¼òîò
Read the site's sitemap (robots.txt Sitemap: lines, then /sitemap.xml) and add every URL it lists as a start URL.
¿àÞçØâÐø øÐ ÚÐàâÐâÐ ÝÐ áÐøâÞâ (àÕÔÞÒØâÕ Sitemap: ÒÞ robots.txt, ßÞâÞÐ /sitemap.xml) Ø ÔÞÔÐø øÐ áÕÚÞøÐ ÝÐÒÕÔÕÝÐ URL ÐÔàÕáÐ ÚÐÚÞ ßÞçÕâÝÐ.
Ïðî÷èò༠¼à êàðòàòà íà ñà¼òîò (ðåäîâèòå Sitemap: âî robots.txt, ïîòîà /sitemap.xml) è äîä༠¼à ñåêî¼à íàâåäåíà URL àäðåñà êàêî ïî÷åòíà.
Sitemap address:
°ÔàÕáÐ ÝÐ ÚÐàâÐâÐ ÝÐ áÐøâÞâ:
Àäðåñà íà êàðòàòà íà ñà¼òîò:
Address of a sitemap to read instead of probing the site; leave blank to probe robots.txt then /sitemap.xml.
°ÔàÕáÐ ÝÐ ÚÐàâÐ ÝÐ áÐøâÞâ èâÞ âàÕÑÐ ÔÐ áÕ ßàÞçØâÐ ÝÐÜÕáâÞ ØáߨâãÒÐúÕ ÝÐ áÐøâÞâ; ÞáâÐÒÕâÕ ßàÐ×ÝÞ ×Ð ÔÐ áÕ ØáߨâÐ robots.txt, ßÐ /sitemap.xml.
Àäðåñà íà êàðòà íà ñà¼òîò øòî òðåáà äà ñå ïðî÷èòà íàìåñòî èñïèòóâàœå íà ñà¼òîò; îñòàâåòå ïðàçíî çà äà ñå èñïèòà robots.txt, ïà /sitemap.xml.
Write a CDXJ index of the WARC archive
·ÐßØèØ CDXJ ØÝÔÕÚá ÝÐ WARC ÐàåØÒÐâÐ
Çàïèøè CDXJ èíäåêñ íà WARC àðõèâàòà
Also write a sorted CDXJ index listing every record in the WARC archive, for replay tools.
·ÐßØèØ Ø áÞàâØàÐÝ CDXJ ØÝÔÕÚá áÞ áØâÕ ×ÐßØáØ ÞÔ WARC ÐàåØÒÐâÐ, ×Ð ÐÛÐâÚØâÕ ×Ð àÕßàÞÔã򾯿Ð.
Çàïèøè è ñîðòèðàí CDXJ èíäåêñ ñî ñèòå çàïèñè îä WARC àðõèâàòà, çà àëàòêèòå çà ðåïðîäóêöè¼à.
Package the crawl as a WACZ file
ÁßÐÚãÒÐø ÓÞ ßàÕÑÐàãÒÐúÕâÞ ÚÐÚÞ WACZ ÔÐâÞâÕÚÐ
Ñïàêóâ༠ãî ïðåáàðóâàœåòî êàêî WACZ äàòîòåêà
Bundle the WARC archive, its CDXJ index and the mirrored pages into a single WACZ file; implies the WARC archive and the CDXJ index.
ÁÞÑÕàØ ÓØ WARC ÐàåØÒÐâÐ, ÝÕø×ØÝØÞâ CDXJ ØÝÔÕÚá Ø ÞÓÛÕÔÐÝØâÕ áâàÐÝØæØ ÒÞ ÕÔÝÐ WACZ ÔÐâÞâÕÚÐ; ÓØ ÒÚÛãçãÒÐ WARC ÐàåØÒÐâÐ Ø CDXJ ØÝÔÕÚáÞâ.
Ñîáåðè ãè WARC àðõèâàòà, íå¼çèíèîò CDXJ èíäåêñ è îãëåäàíèòå ñòðàíèöè âî åäíà WACZ äàòîòåêà; ãè âêëó÷óâà WARC àðõèâàòà è CDXJ èíäåêñîò.
WARC segment size limit:
½ÐøÓÞÛÕÜÐ ÓÞÛÕÜØÝÐ ÝÐ WARC áÕÓÜÕÝâ:
Íà¼ãîëåìà ãîëåìèíà íà WARC ñåãìåíò:
Start a new WARC segment once the current one grows past this many bytes; leave blank or 0 to keep a single file.
·ÐßÞçÝØ ÝÞÒ WARC áÕÓÜÕÝâ ÚÞÓÐ âÕÚÞÒÝØÞâ üÕ ÓÞ ÝÐÔÜØÝÕ ÞÒÞø ÑàÞø ÑÐøâØ; ÞáâÐÒÕâÕ ßàÐ×ÝÞ ØÛØ 0 ×Ð ÕÔÝÐ ÔÐâÞâÕÚÐ.
Çàïî÷íè íîâ WARC ñåãìåíò êîãà òåêîâíèîò <20>å ãî íàäìèíå îâî¼ áðî¼ áà¼òè; îñòàâåòå ïðàçíî èëè 0 çà åäíà äàòîòåêà.

View File

@@ -186,6 +186,8 @@ scanning
vizsgálat
Waiting for scheduled time..
Várakozás az ütemezett idõpontra
Transferring data..
Adatok átvitele..
Connecting to provider
Csatlakozás a szolgáltatóhoz
[%d seconds] to go before start of operation
@@ -370,6 +372,8 @@ Create a Start Page
Kezdõlap létrehozása
Create a word database of all html pages
Az összes HTML oldal szóadatbázisának létrehozása
Build a complete RFC822 mail (MHT/EML) archive of the mirror
A tükrözés teljes RFC822 levélarchívumának (MHT/EML) létrehozása
Create error logging and report files
Hibanapló- és jelentásfájl létrehozása
Generate DOS 8-3 filenames ONLY
@@ -418,6 +422,12 @@ Browser identity
Böngészõ beazonosítása
Comment to be placed in each HTML file
Mindegyik HTML fájlban elhelyezendõ megjegyzés
Languages accepted by the browser
A böngészõ által elfogadott nyelvek
Additional HTTP headers to be sent in each requests
Minden kérésben elküldendõ további HTTP fejlécek
HTTP referer to be sent for initial URLs
A kiinduló URL-ekhez küldendõ HTTP referer
Back to starting page
Vissza a kezdõlaphoz
Save current preferences as default values
@@ -478,6 +488,8 @@ Make an index
Mutató készítése
Make a word database
Szóadatbázis létrehozása
Build a mail archive
Levélarchívum létrehozása
Log files
Naplófájlok
DOS names (8+3)
@@ -506,6 +518,12 @@ Identity
Azonosítás
HTML footer
HTML lábjegyzet
Languages
Nyelvek
Additional HTTP Headers
További HTTP fejlécek
Default referer URL
Alapértelmezett referer URL
N# connections
Csatlakozások száma
Abandon host if error

View File

@@ -8,4 +8,24 @@ langroot_DATA = ../lang.def ../lang.indexes
EXTRA_DIST = $(lang_DATA) $(langroot_DATA)
# webhttrack and htsserver reach the served UI through $(langrootdir)/html, so the
# link is relative: an absolute $(htmldir) dangles under DESTDIR or relocation (#885).
install-data-hook:
@rel='$(htmldir)'; \
case '$(htmldir)' in \
'$(datadir)'/*) rel="../$${rel#$(datadir)/}" ;; \
esac; \
link='$(DESTDIR)$(langrootdir)/html'; \
if test -L "$$link"; then rm -f "$$link" || exit 1; fi; \
if test -e "$$link"; then \
echo "$$link exists and is not a symlink, leaving it alone" >&2; \
else \
echo " $(LN_S) $$rel $$link"; \
$(LN_S) "$$rel" "$$link"; \
fi
uninstall-hook:
@link='$(DESTDIR)$(langrootdir)/html'; \
if test -L "$$link"; then rm -f "$$link"; fi
#dist-hook:

View File

@@ -186,6 +186,8 @@ scanning
scanning
Waiting for scheduled time..
Wacht op voorgegeven uur om te starten
Transferring data..
Gegevens overdragen..
Connecting to provider
Maak verbinding met de provider
[%d seconds] to go before start of operation
@@ -370,6 +372,8 @@ Create a Start Page
Startpagina aanmaken
Create a word database of all html pages
Kreëer een woorden-gegevensbank van alle HTML paginas
Build a complete RFC822 mail (MHT/EML) archive of the mirror
Maak een volledig RFC822 mailarchief (MHT/EML) van de spiegeling
Create error logging and report files
Aanmaken van Protokolbestanden voor fouten en mededelingen.
Generate DOS 8-3 filenames ONLY
@@ -418,6 +422,12 @@ Browser identity
Browser identiteit
Comment to be placed in each HTML file
Voetnoot in elk HTML bestand
Languages accepted by the browser
Talen die de browser accepteert
Additional HTTP headers to be sent in each requests
Extra HTTP-headers die bij elk verzoek worden verstuurd
HTTP referer to be sent for initial URLs
HTTP-referer die voor de begin-URL's wordt verstuurd
Back to starting page
Terug naar de startpagina
Save current preferences as default values
@@ -478,6 +488,8 @@ Make an index
Maak een index
Make a word database
Kreëer een woorden-gegevensbank
Build a mail archive
Maak een mailarchief
Log files
Protocolbestanden
DOS names (8+3)
@@ -506,6 +518,12 @@ Identity
Identiteit
HTML footer
HTML voetnota
Languages
Talen
Additional HTTP Headers
Extra HTTP-headers
Default referer URL
Standaard referer-URL
N# connections
N# verbindingen
Abandon host if error

View File

@@ -186,6 +186,8 @@ scanning
søker
Waiting for scheduled time..
Venter på planlagt tidspunkt...
Transferring data..
Overfører data..
Connecting to provider
Kobler til leverandør
[%d seconds] to go before start of operation
@@ -370,6 +372,8 @@ Create a Start Page
Opprett en startside
Create a word database of all html pages
Opprett en ord-database over alle HTML-sider
Build a complete RFC822 mail (MHT/EML) archive of the mirror
Lag et komplett RFC822-postarkiv (MHT/EML) av kopien
Create error logging and report files
Opprett feillogging og rapporter
Generate DOS 8-3 filenames ONLY
@@ -418,6 +422,12 @@ Browser identity
Nettleser-identitet
Comment to be placed in each HTML file
Sett inn kommentar i alle HTML-filer
Languages accepted by the browser
Språk nettleseren godtar
Additional HTTP headers to be sent in each requests
Ekstra HTTP-hoder som sendes med hver forespørsel
HTTP referer to be sent for initial URLs
HTTP-referer som sendes for de første URL-ene
Back to starting page
Tilbake til startside
Save current preferences as default values
@@ -478,6 +488,8 @@ Make an index
Opprett en forside
Make a word database
Opprett en ord-database
Build a mail archive
Lag et postarkiv
Log files
Loggfiler
DOS names (8+3)
@@ -506,6 +518,12 @@ Identity
Identitet
HTML footer
HTML-fotnote
Languages
Språk
Additional HTTP Headers
Ekstra HTTP-hoder
Default referer URL
Standard referer-URL
N# connections
Antall forbindelser
Abandon host if error

View File

@@ -7,7 +7,7 @@ pl
LANGUAGE_AUTHOR
Lukasz Jokiel (Opole University of Technology, Lukasz.Jokiel at po.opole.pl) \r\n
LANGUAGE_CHARSET
ISO-8859-2
windows-1250
LANGUAGE_WINDOWSID
Polish
OK
@@ -186,6 +186,8 @@ scanning
skanujê
Waiting for scheduled time..
Czekam na okreœlon¹ godzinê aby wystartowaæ
Transferring data..
Przesy³anie danych..
Connecting to provider
£¹cze siê z us³ugodawc¹
[%d seconds] to go before start of operation
@@ -205,7 +207,7 @@ Zako
* * MIRROR ABORTED! * *\r\nThe current temporary cache is required for any update operation and only contains data downloaded during the present aborted session.\r\nThe former cache might contain more complete information; if you do not want to lose that information, you have to restore it and delete the current cache.\r\n[Note: This can easily be done here by erasing the hts-cache/new.* files]\r\n\r\nDo you think the former cache might contain more complete information, and do you want to restore it?
* * TWORZENIE LUSTRA PRZERWANE! * *\r\nObecnie wykorzystywany cache, wymagany dla jakichkolwiek operacji uaktualniaj¹cych zawiera jedynie dane z obecnej przerwanej sesji.\r\nPoprzedni cache mo¿e zawieraæ bardziej kompletne dane; jeœli nie chcesz ich straciæ, przywróæ je i usuñ obecny cache.\r\n[Uwaga: Mo¿esz to ³atwo zrobiæ tutaj poprzez skasowanie htscache/new.* pliki]\r\nCzy uwa¿asz, ¿e poprzedni cache mo¿e zawieraæ bardziej kompletne informacje i czy przywróciæ go ?
* * MIRROR ERROR! * *\r\nHTTrack has detected that the current mirror is empty. If it was an update, the previous mirror has been restored.\r\nReason: the first page(s) either could not be found, or a connection problem occurred.\r\n=> Ensure that the website still exists, and/or check your proxy settings! <=
* * B£¡D LUSTRA! * *\r\nHTtrack stwierdza ze obecne lustro jest puste. Jeli by³o to uaktualnienie, to przywrócono poprzedni± wersjê lustra. Powód: Nie mo¿na by³o odczytaæ pierwszych stron lub wyst±pi³ b³±d po³±czenia.\r\n=> Upewnij siê czy strona ci±gle istnieje, lub te¿ sprawd¼ ustawienia proxy! <=
* * B£¥D LUSTRA! * *\r\nHTtrack stwierdza ze obecne lustro jest puste. Jeœli by³o to uaktualnienie, to przywrócono poprzedni¹ wersjê lustra. Powód: Nie mo¿na by³o odczytaæ pierwszych stron lub wyst¹pi³ b³¹d po³¹czenia.\r\n=> Upewnij siê czy strona ci¹gle istnieje, lub te¿ sprawdŸ ustawienia proxy! <=
\n\nTip: Click [View log file] to see warning or error messages
Tip: Kliknij (Poka¿ logi) aby zobaczyæ informacje o b³êdach i ostrze¿eniach
Error deleting a hts-cache/new.* file, please do it manually
@@ -369,7 +371,9 @@ Nie pobieraj plik
Create a Start Page
Utwórz stronê startow¹
Create a word database of all html pages
Utwórz bazê s³ów wystêpuj±cych we wszystkich stronach HTML
Utwórz bazê s³ów wystêpuj¹cych we wszystkich stronach HTML
Build a complete RFC822 mail (MHT/EML) archive of the mirror
Utwórz pe³ne archiwum pocztowe RFC822 (MHT/EML) lustra
Create error logging and report files
Utwórz pliki z raportem o b³êdach i informacjach
Generate DOS 8-3 filenames ONLY
@@ -385,7 +389,7 @@ Wybierz katalog lustra w tym serwisie
Select global parsing direction
Wybierz globalny katalog lustra w tym serwisie
Setup URL rewriting rules for internal links (downloaded ones) and external links (not downloaded ones)
Ustaw metody przepisywania URL'i dla l±czy dostêpnych lokalnie (pobranych) oraz ³±czy dostêpnych przez Internet (niepobranych)
Ustaw metody przepisywania URL'i dla l¹czy dostêpnych lokalnie (pobranych) oraz ³¹czy dostêpnych przez Internet (niepobranych)
Max simultaneous connections
Maksymalna liczba po³¹czeñ
File timeout
@@ -413,11 +417,17 @@ Maksymalna pr
Maximum connections/seconds (avoid server overload)
Maksymalna iloœæ po³¹czeñ na sekundê (zapobiwga przec¹¿eniu serwera)
Maximum number of links that can be tested (not saved!)
Maksymalna liczba ³±cz jakie mog± byæ przetestowane (zapisanych mo¿e byæ wiêcej!)
Maksymalna liczba ³¹cz jakie mog¹ byæ przetestowane (zapisanych mo¿e byæ wiêcej!)
Browser identity
Identyfikacja przegl¹darki
Comment to be placed in each HTML file
Stopka do umieszczenia w ka¿dym pliku HTML
Languages accepted by the browser
Jêzyki akceptowane przez przegl¹darkê
Additional HTTP headers to be sent in each requests
Dodatkowe nag³ówki HTTP wysy³ane w ka¿dym ¿¹daniu
HTTP referer to be sent for initial URLs
Nag³ówek HTTP referer wysy³any dla pocz¹tkowych adresów URL
Back to starting page
Z powortem do strony startowej
Save current preferences as default values
@@ -453,7 +463,7 @@ Spr
Use old HTTP/1.0 requests (limits engine power!)
U¿yj trybu zgodnoœci z starszym standardem HTTP/1.0 (ogranicza moc silnika programu)
Attempt to limit retransfers through several tricks (file size test..)
Próba ograniczenia powtórnych transferów dziêki kilku trikom (test wielkoci pliku)
Próba ograniczenia powtórnych transferów dziêki kilku trikom (test wielkoœci pliku)
Attempt to limit the number of links by skipping similar URLs (www.foo.com==foo.com, http=https ..)
Spróbuj ogranicznyc ilosc lacz poprzez pomijanie podobnych URL'i (www.foo.com==foo.com, http=https ..)
Write external links without login/password
@@ -478,6 +488,8 @@ Make an index
Utwórz indeks
Make a word database
Utwórz bazê s³ów
Build a mail archive
Utwórz archiwum pocztowe
Log files
Raportuj pobrane pliki
DOS names (8+3)
@@ -497,7 +509,7 @@ Zwykle te opcje nie powinny by
Activate Debugging Mode (winhttrack.log)
Aktywacja trybu dla debuggera (winthhrack.log)
Rewrite links: internal / external
Przepisz ³±cza: na dostêpne lokalnie (pobierane i lokalne)/ na dostêpne przez Internet (zewnêtrzne i niepobierane)
Przepisz ³¹cza: na dostêpne lokalnie (pobierane i lokalne)/ na dostêpne przez Internet (zewnêtrzne i niepobierane)
Flow control
Kontrola przep³ywu
Limits
@@ -506,6 +518,12 @@ Identity
Identyfikacja
HTML footer
Stopka HTML
Languages
Jêzyki
Additional HTTP Headers
Dodatkowe nag³ówki HTTP
Default referer URL
Domyœlny adres URL referera
N# connections
N# po³¹czeñ
Abandon host if error
@@ -565,7 +583,7 @@ U
Max connections / seconds
Maksymalna iloœæ po³¹czeñ na sekundê
Maximum number of links
Maksymalna liczba ³±cz
Maksymalna liczba ³¹cz
Pause after downloading..
Pauza po pobraniu
Hide passwords
@@ -741,7 +759,7 @@ Zapisz j&ako...
&Delete...
&Usuñ
&Browse sites...
&Przegl±daj strony sieciowe...
&Przegl¹daj strony sieciowe...
User-defined structure
Struktura zdefiniowana przez u¿ytkownika
%n\tName of file without file type (ex: image)\r\n%N\tName of file including file type (ex: image.gif)\r\n%t\tFile type only (ex: gif)\r\n%p\tPath [without ending /] (ex: /someimages)\r\n%h\tHost name (ex: www.someweb.com)\r\n%M\tMD5 URL (128 bits, 32 ascii bytes)\r\n%Q\tMD5 query string (128 bits, 32 ascii bytes)\r\n%q\tMD5 small query string (16 bits, 4 ascii bytes)\r\n\r\n%s?\tShort name (ex: %sN)
@@ -901,7 +919,7 @@ normalny\nrozszerzony\ntestowy
Download web site(s)\nDownload web site(s) + questions\nGet individual files\nDownload all sites in pages (multiple mirror)\nTest links in pages (bookmark test)\n* Continue interrupted download\n* Update existing download
Pobierz stronê(y) Web\nPobierz stronê(y) Web + pytania\npobierz oddzielne pliki\nPobierz strony Web w stronach (wiele luster)\nTestuj ³¹cza na stronach (test zak³adek)\n* Wznów tworzenie lustra\n* Uaktualnij lustro
Relative URI / Absolute URL (default)\nAbsolute URL / Absolute URL\nAbsolute URI / Absolute URL\nOriginal URL / Original URL
Relatywne URI / Absolutne URI (domylnie)\nAbsolutne RRL / Absolutne URL\nAbsolutne URI / Absolutne URL\nOriginalne URL / Oryginalne URL
Relatywne URI / Absolutne URI (domyœlnie)\nAbsolutne RRL / Absolutne URL\nAbsolutne URI / Absolutne URL\nOriginalne URL / Oryginalne URL
Open Source offline browser
Przegladarka Offline Open Source
Website Copier/Offline Browser. Copy remote websites to your computer. Free.
@@ -931,7 +949,7 @@ Podczas tworzenia lustra wydarzyl sie fatalny blad.
Proxy type:
Typ proxy:
Proxy protocol. HTTP: standard proxy. HTTP (CONNECT tunnel): sends every request through a CONNECT tunnel, for CONNECT-only proxies like Tor's HTTPTunnelPort. SOCKS5: default port 1080.
Protokó³ proxy. HTTP: standardowe proxy. HTTP (tunel CONNECT): wysy³a ka¿de ¿±danie przez tunel CONNECT, dla proxy obs³uguj±cych tylko CONNECT, jak HTTPTunnelPort w Torze. SOCKS5: port domylny 1080.
Protokó³ proxy. HTTP: standardowe proxy. HTTP (tunel CONNECT): wysy³a ka¿de ¿¹danie przez tunel CONNECT, dla proxy obs³uguj¹cych tylko CONNECT, jak HTTPTunnelPort w Torze. SOCKS5: port domyœlny 1080.
Load cookies from file:
Wczytaj ciasteczka z pliku:
Preload cookies from a Netscape cookies.txt file before crawling.
@@ -939,19 +957,19 @@ Wczytaj ciasteczka z pliku Netscape cookies.txt przed rozpocz
Pause between files:
Pauza miêdzy plikami:
Random delay between file downloads, in seconds. Use MIN:MAX for a random range (e.g. 2:8).
Losowe opó¼nienie miêdzy pobieraniem plików, w sekundach. U¿yj MIN:MAX dla losowego zakresu (np. 2:8).
Losowe opóŸnienie miêdzy pobieraniem plików, w sekundach. U¿yj MIN:MAX dla losowego zakresu (np. 2:8).
Keep the www. prefix (do not merge www.host with host)
Zachowaj przedrostek www. (nie ³±cz www.host z host)
Zachowaj przedrostek www. (nie ³¹cz www.host z host)
Do not treat www.host and host as the same site.
Nie traktuj www.host i host jako tej samej witryny.
Keep double slashes in URLs
Zachowaj podwójne ukoniki w adresach URL
Zachowaj podwójne ukoœniki w adresach URL
Do not collapse duplicate slashes in URLs.
Nie scalaj powtórzonych ukoników w adresach URL.
Nie scalaj powtórzonych ukoœników w adresach URL.
Keep the original query-string order
Zachowaj oryginaln± kolejnoæ ci±gu zapytania
Zachowaj oryginaln¹ kolejnoœæ ci¹gu zapytania
Do not reorder query-string parameters when deduplicating URLs.
Nie zmieniaj kolejnoci parametrów zapytania podczas usuwania duplikatów adresów URL.
Nie zmieniaj kolejnoœci parametrów zapytania podczas usuwania duplikatów adresów URL.
Strip query keys:
Usuñ klucze zapytania:
Comma-separated query keys to drop from the saved-file naming (e.g. sid,utm_source).
@@ -959,27 +977,27 @@ Rozdzielone przecinkami klucze zapytania pomijane przy nazywaniu zapisanych plik
Write a WARC archive of the crawl
Zapisz archiwum WARC z indeksowania
Also save every fetched response into an ISO-28500 WARC/1.1 archive, next to the mirror.
Zapisz te¿ ka¿d± pobran± odpowied¼ do archiwum WARC/1.1 ISO-28500, obok kopii lustrzanej.
Zapisz te¿ ka¿d¹ pobran¹ odpowiedŸ do archiwum WARC/1.1 ISO-28500, obok kopii lustrzanej.
WARC archive name:
Nazwa archiwum WARC:
Optional base name for the WARC archive; leave blank to auto-name it under the output directory.
Opcjonalna nazwa bazowa archiwum WARC; pozostaw puste, aby nazwaæ je automatycznie w katalogu wyjciowym.
Opcjonalna nazwa bazowa archiwum WARC; pozostaw puste, aby nazwaæ je automatycznie w katalogu wyjœciowym.
Report what changed since the previous mirror
Zg³o, co zmieni³o siê od poprzedniej kopii
Zg³oœ, co zmieni³o siê od poprzedniej kopii
Also write hts-changes.json listing what this crawl left new, changed, unchanged and gone compared to the previous mirror.
Zapisz równie¿ plik hts-changes.json z list± tego, co w porównaniu z poprzedni± kopi± jest nowe, zmienione, niezmienione lub usuniête.
Zapisz równie¿ plik hts-changes.json z list¹ tego, co w porównaniu z poprzedni¹ kopi¹ jest nowe, zmienione, niezmienione lub usuniête.
Inline assets as data: URIs (self-contained pages)
Osad¼ zasoby jako identyfikatory data: URI (samodzielne strony)
OsadŸ zasoby jako identyfikatory data: URI (samodzielne strony)
Once the mirror is finished, rewrite every saved page with its stylesheets, scripts, images and fonts embedded, so a page can also be opened on its own.
Po zakoñczeniu tworzenia kopii przepisz ka¿d± zapisan± stronê z osadzonymi arkuszami stylów, skryptami, obrazami i czcionkami, aby stronê mo¿na by³o otworzyæ równie¿ samodzielnie.
Po zakoñczeniu tworzenia kopii przepisz ka¿d¹ zapisan¹ stronê z osadzonymi arkuszami stylów, skryptami, obrazami i czcionkami, aby stronê mo¿na by³o otworzyæ równie¿ samodzielnie.
Largest inlined asset (bytes):
Najwiêkszy osadzony zasób (bajty):
An asset above this size keeps an ordinary link; leave blank for the 10485760-byte default.
Zasób wiêkszy ni¿ ten rozmiar zachowuje zwyk³y odnonik; pozostaw puste, aby u¿yæ domylnych 10485760 bajtów.
Zasób wiêkszy ni¿ ten rozmiar zachowuje zwyk³y odnoœnik; pozostaw puste, aby u¿yæ domyœlnych 10485760 bajtów.
Seed the crawl from the site's sitemap
Rozpocznij pobieranie od mapy witryny
Read the site's sitemap (robots.txt Sitemap: lines, then /sitemap.xml) and add every URL it lists as a start URL.
Odczytaj mapê witryny (wiersze Sitemap: w pliku robots.txt, nastêpnie /sitemap.xml) i dodaj ka¿dy wymieniony adres URL jako adres pocz±tkowy.
Odczytaj mapê witryny (wiersze Sitemap: w pliku robots.txt, nastêpnie /sitemap.xml) i dodaj ka¿dy wymieniony adres URL jako adres pocz¹tkowy.
Sitemap address:
Adres mapy witryny:
Address of a sitemap to read instead of probing the site; leave blank to probe robots.txt then /sitemap.xml.
@@ -991,8 +1009,8 @@ Zapisz te
Package the crawl as a WACZ file
Spakuj indeksowanie do pliku WACZ
Bundle the WARC archive, its CDXJ index and the mirrored pages into a single WACZ file; implies the WARC archive and the CDXJ index.
Po³±cz archiwum WARC, jego indeks CDXJ i strony kopii lustrzanej w jeden plik WACZ; wymusza archiwum WARC i indeks CDXJ.
Po³¹cz archiwum WARC, jego indeks CDXJ i strony kopii lustrzanej w jeden plik WACZ; wymusza archiwum WARC i indeks CDXJ.
WARC segment size limit:
Maksymalny rozmiar segmentu WARC:
Start a new WARC segment once the current one grows past this many bytes; leave blank or 0 to keep a single file.
Rozpocznij nowy segment WARC, gdy bie¿±cy przekroczy tê liczbê bajtów; pozostaw puste lub 0, aby zachowaæ jeden plik.
Rozpocznij nowy segment WARC, gdy bie¿¹cy przekroczy tê liczbê bajtów; pozostaw puste lub 0, aby zachowaæ jeden plik.

View File

@@ -186,6 +186,8 @@ scanning
analisando
Waiting for scheduled time..
Aguardando hora programada para começar
Transferring data..
A transferir dados..
Connecting to provider
Ligação ao fornecedor de acesso
[%d seconds] to go before start of operation
@@ -370,6 +372,8 @@ Create a Start Page
Criar uma página inicial
Create a word database of all html pages
Criar base de dados de palavras de todas as páginas html
Build a complete RFC822 mail (MHT/EML) archive of the mirror
Criar um arquivo de correio RFC822 (MHT/EML) completo da cópia
Create error logging and report files
Criar ficheiros para as mensagens de erro e avisos
Generate DOS 8-3 filenames ONLY
@@ -418,6 +422,12 @@ Browser identity
Identidade do browser
Comment to be placed in each HTML file
Nota de rodapé em cada ficheiro HTML
Languages accepted by the browser
Idiomas aceites pelo browser
Additional HTTP headers to be sent in each requests
Cabeçalhos HTTP adicionais a enviar em cada pedido
HTTP referer to be sent for initial URLs
Referer HTTP a enviar para os URL iniciais
Back to starting page
Voltar à página inicial
Save current preferences as default values
@@ -478,6 +488,8 @@ Make an index
Construir um índice
Make a word database
Criar base de dados de palavras
Build a mail archive
Criar um arquivo de correio
Log files
Relatórios
DOS names (8+3)
@@ -506,6 +518,12 @@ Identity
Identificação
HTML footer
Rodapé HTML
Languages
Idiomas
Additional HTTP Headers
Cabeçalhos HTTP adicionais
Default referer URL
URL de referer predefinido
N# connections
Número de conexões
Abandon host if error

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