Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
59 commits
Select commit Hold shift + click to select a range
31cbf3a
tbdocs-gh-pages: background the book PDF render so it runs in paralle…
KubaO Oct 9, 2026
ec0b9c6
Screenshots in both IDE themes: shoot_docs takes dark and Light, the …
KubaO Oct 9, 2026
9f18770
Screenshots increment 6 group A: Services Unavailable/Limited, Commun…
KubaO Oct 10, 2026
b358acf
tb-registry: an association a run found pointing into the temp folder…
KubaO Oct 10, 2026
986cc65
Screenshots increment 6 group B: 16 running-program and IDE pictures …
KubaO Oct 10, 2026
8425785
scripts/csspngstrip: a twinBASIC console program that strips the meta…
KubaO Oct 10, 2026
d93117b
BETA 1005 pass: 16 filed defects fixed (callouts removed, pages state…
KubaO Oct 10, 2026
3833d76
Screenshots increment 6 group C: package server pictures on BETA 1005…
KubaO Oct 10, 2026
d113a52
scripts/imagestrip (was csspngstrip): strips every image a CSS or SVG…
KubaO Oct 10, 2026
1a776c6
imagestrip, compactSvgText: the XML declaration is <?xml and white sp…
KubaO Oct 10, 2026
c948086
Screenshots increment 6 group D: VBP import (synthetic project and .r…
KubaO Oct 10, 2026
17ef5b0
Tools.md and WIP.md: shoot_docs's setups from increment 6 (the web Ch…
KubaO Oct 10, 2026
be9c8bc
Retake every screenshot on BETA 1005: 25 dark and 24 light pictures c…
KubaO Oct 10, 2026
5aa9f75
imagestrip: its own twinBASIC unit tests, 35 [TestCase]s in six [Test…
KubaO Oct 10, 2026
1e63e38
tbrun --tests: run a project's [TestCase] Subs (compiler test mode) a…
KubaO Oct 10, 2026
33b604b
Follow-up issues for what closed issues left out: eight new entries w…
KubaO Oct 10, 2026
0a431c1
Badge tooltips as a replica of the Windows tooltip holding the badge'…
KubaO Oct 10, 2026
807de7d
BUGS-TO-REPORT: a ParamArray element that is a Variant variable holdi…
KubaO Oct 10, 2026
5784311
tbrun: refuse a probe whose module holds a procedure named like the m…
KubaO Oct 10, 2026
5365cec
bugs/filed: #2471 is fixed in BETA 1005 (a Public array Const in a cl…
KubaO Oct 10, 2026
20a89fd
NOTE on Err.Raise, Error and CallByName: in BETA 1005 an error a memb…
KubaO Oct 10, 2026
5ade7d9
BUGS-TO-REPORT: file statements and functions raise -2147467259 where…
KubaO Oct 10, 2026
10b2c69
imagestrip, stripFile: an SVG's character and entity references are u…
KubaO Oct 10, 2026
2eb37c4
imagestrip, stripFile: a style sheet in a data:text/css URI, in base6…
KubaO Oct 10, 2026
86008b4
imagestrip, stripFile: an SVG's <style> elements and style attributes…
KubaO Oct 10, 2026
bfa628d
tbrun: a [RunAfterBuild] probe may be in a subfolder of Sources/, and…
KubaO Oct 10, 2026
9c58f5c
imagestrip: its test modules and TestImages move to src/Sources/Tests…
KubaO Oct 10, 2026
20c6202
Help add-in: drop the hover z-index workaround, BETA 1005 draws its h…
KubaO Oct 10, 2026
c78e8b6
BUGS-TO-REPORT: the IDE's styles.css mislabels four embedded images (…
KubaO Oct 10, 2026
2cd1f4f
Getting-Started.md: an error not passed to the caller under LLVM is a…
KubaO Oct 10, 2026
2612241
tbdocs: a picture's SVG (X.svg, X.light.svg beside its PNG) shown in …
KubaO Oct 10, 2026
365b1ec
svgshot: IDE screenshots as SVG from a DOM snapshot, text in per-pict…
KubaO Oct 10, 2026
f52e90c
SVGs retaken on BETA 1005; page baseline
KubaO Oct 10, 2026
dd45297
svgshot draws solid underlines as Chromium does (decoratingBoxes, und…
KubaO Oct 10, 2026
3afd59c
svgshot sizes a background image by its bytes (naturalSize reads JPEG…
KubaO Oct 10, 2026
5dac0db
SVGs of Menu_Help_About and Splash_Screen, both themes; 23 SVGs redra…
KubaO Oct 10, 2026
d9291a9
WIP notes: history removed (finished plans and increments, dated narr…
KubaO Oct 10, 2026
e71a030
Tools and Scripts split into a landing page (wrappers, conventions, c…
KubaO Oct 10, 2026
84e0953
svgshot draws same-process frames: every document of the snapshot dec…
KubaO Oct 10, 2026
898eb35
SVGs of Help_Pane, Help_Search and Help_Settings, both themes; 7 SVGs…
KubaO Oct 10, 2026
003ca80
subset_font.py: patch fontTools' gvar subsetting to read a glyph miss…
KubaO Oct 10, 2026
3d405bf
shoot_docs: a capture's unsteady regions ({on: anchor, pad}), where t…
KubaO Oct 10, 2026
1340179
Figures: every lone image (diagram, screenshot, raster) gets one icon…
KubaO Oct 10, 2026
60a30fd
Zoom locks the page's scrolling, so the overlay's scrollbar is the on…
KubaO Oct 10, 2026
9ff4d7c
Pipeline Stages: themePairPlugin row in the plugin table, rows renumb…
KubaO Oct 10, 2026
57bd1bf
Gantt chart: its own width and height, its figure marked tall when th…
KubaO Oct 10, 2026
99b020d
SVG screenshots: colour filters baked into the colours they paint and…
KubaO Oct 10, 2026
894b6fd
SVG screenshots: boxes and text drawn under their elements' and ances…
KubaO Oct 10, 2026
a2f5754
SVG screenshots: shoot_docs --svg saves each picture's bundle (snapsh…
KubaO Oct 10, 2026
81cabdc
SVG replay in about 20 s: the fonts' cuts kept in .svgshot-bundles/su…
KubaO Oct 10, 2026
31a1d3f
Pictures retaken whose bundles named a PNG the file no longer held: t…
KubaO Oct 10, 2026
056d036
SVG bundles: one Brotli file per picture holding both themes (the lig…
KubaO Oct 10, 2026
23fc32d
svgshot: web fonts split by unicode-range (each character from the ru…
KubaO Oct 10, 2026
c56a229
shoot_docs: text drawn in grey levels, never ClearType (--disable-lcd…
KubaO Oct 11, 2026
6642a88
Pictures retaken with ClearType off: 311 PNGs in grey levels (most we…
KubaO Oct 11, 2026
8face8a
Tools map clickable: each tool's box links to its entry and each grou…
KubaO Oct 11, 2026
322254b
Diagrams: Graphviz's titles (DOT identifiers) dropped from every inli…
KubaO Oct 11, 2026
841ea35
WIP notes: a piece of work in a short-lived worktree unless the owner…
KubaO Oct 11, 2026
6433bce
Pictures that were not figures made figures: the <br> spacers after t…
KubaO Oct 11, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
4 changes: 4 additions & 0 deletions .gitattributes
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,10 @@ add-in/Resources/** -text
bugs/** -text
*.twinproj binary

# The twinBASIC program in scripts/imagestrip/ is laid out as a reproducer is, and is
# checked out byte for byte for the same reason: its .twinproj is packed from its src/.
scripts/imagestrip/** -text

# The VB6 template `bug_repro.mjs new --with-vb6` copies into a reproducer's vb6/
# is CRLF in every checkout, as the bugs/** files it becomes are, and VB6 needs it.
test/repro-templates/vb6/** -text
Expand Down
45 changes: 37 additions & 8 deletions .github/actions/run-gates/action.yml
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,28 @@ description: The gate steps both workflows share, checked against test.bat and c
runs:
using: composite
steps:
# check_a11y runs FIRST. The deploy workflow backgrounds the book PDF
# render just before this composite action and joins it after, so the
# 24 non-a11y gates below mostly run in parallel with the book: they are
# Node scripts, CPU-bound, and the only two Chromium workloads (axe here
# and paged.js in the book render) overlap for just the ~40 s a11y
# takes, at the START of the run. a11y last would mean the two Chromiums
# fought over the runner's 2 vCPUs at the END, when the book render
# cannot amortise the slowdown.
#
# In check.bat, check_a11y now sits right after check_tree_fresh and
# before check_dot_fit / pick_a11y_sample --- the gate roster check
# requires check.bat's order to match the composite action's order after
# filtering to the gates both have.
#
# Matches check.bat: the build's own link check gates this, and a link
# failure short-circuits before the (slower) browser scan runs. Scans
# _site-offline/, whose relative asset paths actually resolve -- _site/
# uses root-absolute URLs that render unstyled here, making every
# colour-contrast result meaningless.
- name: Accessibility check (check_a11y.mjs)
shell: bash
run: node scripts/check_a11y.mjs
# The build is the only pass over the site's HTML. This step is NOT a
# second one: it runs the differential harness against a nine-file
# synthetic tree that carries one fault of every kind, so
Expand Down Expand Up @@ -90,6 +112,21 @@ runs:
- name: Unit-test the bug reproducers' pictures (test/png.test.mjs)
shell: bash
run: node --test test/png.test.mjs
# What an embedded image keeps (scripts/lib/compact-image.mjs's
# compactImage): an editor's metadata goes, and a notice of whose the
# picture is and on what terms stays, over images built in the test. The
# half that runs scripts/imagestrip/ needs its exe and Windows, which CI
# has not, and is skipped. No browser, no built tree, well under a second.
- name: Unit-test what an embedded image keeps (test/compact-image.test.mjs)
shell: bash
run: node --test test/compact-image.test.mjs
# An SVG screenshot is written on one line (scripts/svgshot/snapshot-svg.mjs's
# oneLine), so that a CRLF checkout changes only its last line ending. What
# it keeps of an image it embeds is test/compact-image.test.mjs's, above.
# No browser, no built tree, well under a second.
- name: Unit-test that SVG screenshots are one line (test/svgshot.test.mjs)
shell: bash
run: node --test test/svgshot.test.mjs
# check_examples.mjs's probes: batching, crash isolation through a fake
# lane, the canaries and the fence classifier. check_examples.mjs needs a
# twinBASIC install, which CI has not; its probes need none.
Expand Down Expand Up @@ -258,11 +295,3 @@ runs:
- name: Verify a11y sample coverage (pick_a11y_sample.mjs)
shell: bash
run: node scripts/pick_a11y_sample.mjs --check
# Matches check.bat: the build's own link check gates this, and a link
# failure short-circuits before the (slower) browser scan runs. Scans
# _site-offline/, whose relative asset paths actually resolve -- _site/
# uses root-absolute URLs that render unstyled here, making every
# colour-contrast result meaningless.
- name: Accessibility check (check_a11y.mjs)
shell: bash
run: node scripts/check_a11y.mjs
6 changes: 5 additions & 1 deletion .github/workflows/checks.yml
Original file line number Diff line number Diff line change
Expand Up @@ -106,7 +106,11 @@ jobs:
# The gates both workflows run, in one list: see
# .github/actions/run-gates/action.yml, which check_ci_workflows.mjs
# checks against test.bat and check.bat. Each gate is its own group in
# this step's log.
# this step's log. check_a11y.mjs is the FIRST step inside the
# composite action -- the deploy workflow backgrounds the book PDF
# render just before it, and a11y running first means the two Chromium
# workloads overlap for ~40 s at the start instead of fighting at the
# end over the book's PDF-generation phase.
- name: Run the gates
uses: ./.github/actions/run-gates
# The action's first step compares the standalone link checker's two
Expand Down
69 changes: 64 additions & 5 deletions .github/workflows/tbdocs-gh-pages.yml
Original file line number Diff line number Diff line change
Expand Up @@ -98,19 +98,78 @@ jobs:
# offers. Never pass --no-help-archive here: the download would lose
# the archive (check_ci_workflows.mjs refuses the flag).
run: node builder/tbdocs.mjs --src docs --url '${{ steps.pages.outputs.origin }}' --baseurl '${{ steps.pages.outputs.base_path }}' --no-fetch-assets --check-audit-index
# The book PDF render runs in parallel with the gates. This step starts
# it in the background and returns as soon as the process is up, so the
# gates begin immediately; the "Wait for the book PDF render" step
# below joins the backgrounded process, prints its captured output,
# and exits with its code. On the deploy workflow this saves ~90 s
# against the previous sequential layout (the book render takes about
# as long as the gates). checks.yml is unaffected -- it has no PDF to
# render -- and the gates' composite-action rendering stays as it was.
#
# nohup makes the child ignore SIGHUP and redirected stdio decouples
# it from this step's shell; together they keep the child alive after
# the shell exits -- the runner reparents it and leaves it running
# until the join step reads /tmp/book-render.log and
# /tmp/book-render.exit.
#
# No `setsid`: when bash backgrounds `setsid cmd`, the backgrounded
# setsid is a process-group leader and forks, the parent exits, and
# the real command runs under the child's PID -- so `$!` captures a
# dead PID and the join step's `kill -0` returns false in ~0 s,
# usually before the render has finished. nohup does not fork; `$!`
# captures the real PID, which stays live until the render completes.
- name: Start the book PDF render in the background
working-directory: ./docs
run: |
mkdir -p _pdf
nohup bash -c '
node ../book/render-book.mjs _site-pdf/book.html -o "_pdf/twinBASIC Book.pdf" --outline-tags h1,h2,h3,h4 --additional-script ../perf/detach-pages.js
echo $? > /tmp/book-render.exit
' >/tmp/book-render.log 2>&1 </dev/null &
BOOK_PID=$!
echo "$BOOK_PID" > /tmp/book-render.pid
echo "started book render as PID $BOOK_PID"
# The gates both workflows run, in one list: see
# .github/actions/run-gates/action.yml, which check_ci_workflows.mjs
# checks against test.bat and check.bat. checks.yml runs only on pull
# requests, so this is the one place a change pushed straight to
# `staging`, or a manual dispatch, meets them. Each gate is its own
# group in this step's log.
# step in the composite action's rendering, with its own duration.
#
# check_a11y.mjs is the FIRST step of the composite action, so its
# Chromium work overlaps with the backgrounded book render's early
# Chromium-heavy phase for ~40 s. The 24 Node gates below it are
# CPU-bound, so they run through the rest of the book render without
# Chromium contention.
- name: Run the gates
uses: ./.github/actions/run-gates
- name: Render book PDF
# Join the backgrounded book render, print its output, and exit with
# its code. This step's own duration shows how much the book overlapped
# with the gates: 0 s if the book finished during them, or
# book_time - gates_time if the gates finished first. The 15-minute
# step timeout is a backstop against a wedged render; a missing PID
# or exit file aborts rather than hanging.
- name: Wait for the book PDF render
timeout-minutes: 15
run: |
mkdir -p _pdf
node ../book/render-book.mjs _site-pdf/book.html -o "_pdf/twinBASIC Book.pdf" --outline-tags h1,h2,h3,h4 --additional-script ../perf/detach-pages.js
working-directory: ./docs
if [ ! -f /tmp/book-render.pid ]; then
echo "::error::no PID file; the start step did not run"
exit 2
fi
BOOK_PID=$(cat /tmp/book-render.pid)
echo "waiting for book render PID $BOOK_PID"
while kill -0 "$BOOK_PID" 2>/dev/null; do
sleep 2
done
cat /tmp/book-render.log
if [ ! -f /tmp/book-render.exit ]; then
echo "::error::the book render process ended without writing its exit status"
exit 1
fi
BOOK_EXIT=$(cat /tmp/book-render.exit)
echo "book render exit code: $BOOK_EXIT"
exit "$BOOK_EXIT"
- name: Upload Pages artifact
uses: actions/upload-pages-artifact@v5
with:
Expand Down
7 changes: 7 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -36,3 +36,10 @@ indexer/.packages/
# A bug reproducer's zip is only for attaching to its GitHub issue (see
# BUGS-TO-REPORT.md); the .twinproj beside it is committed.
/bugs/**/*.zip

# The IDE builds scripts/imagestrip/imagestrip.twinproj into Build\ beside it.
/scripts/imagestrip/Build/

# shoot_docs.mjs --svg: each picture's bundle (scripts/svgshot/bundle.mjs), what its SVG
# is drawn from, for scripts/svgshot/replay.mjs. Bundles hold the Windows user name.
/.svgshot-bundles/
Loading
Loading