chore: migrate Regex Tools to LocalToolBox

This commit is contained in:
2026-07-27 15:55:58 +02:00
parent d2e9b3b569
commit cbcf640ee7
27 changed files with 201 additions and 87 deletions

3
.npmrc
View File

@@ -1,2 +1 @@
@add-ideas:registry=https://git.add-ideas.de/api/packages/zemion/npm/
@add-ideas:registry=https://git.add-ideas.de/api/packages/lotobo/npm/

View File

@@ -2,6 +2,17 @@
## Unreleased
## 0.4.2 — 2026-07-27
- Move canonical source and package identity from the `zemion` account to the
`lotobo` organization and consume Toolbox SDK 0.2.3 from its new namespace.
- Remove the outer application frame and align the workbench with the shared
`min(100%, 90rem)` Toolbox content width.
- Replace the favicon with a file-style Regex mark derived from the MIT-licensed
OOjs regular-expression icon, retaining its licence and attribution.
- Rebuild the Go WebAssembly engine so its embedded module path uses the new
canonical repository identity.
## 0.4.1 — 2026-07-27
- Keep the last completed syntax and execution frame visible while edited

View File

@@ -0,0 +1,28 @@
OOjs UI regular-expression-progressive icon
Source:
https://commons.wikimedia.org/wiki/File:OOjs_UI_icon_regular-expression-progressive.svg
The icon path is adapted into public/favicon.svg and recoloured. The
surrounding rounded square, document shape, gradient and shadow are original
Regex Tools artwork and are not part of the upstream icon.
Copyright © 20112017 OOjs UI Team and other contributors
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

View File

@@ -8,9 +8,9 @@ Patterns, replacement templates, test text and project files stay in the
browser. There is no account, backend, upload, remote execution, telemetry,
runtime CDN, remote font, or cloud-save service.
## Current release — 0.4.1
## Current release — 0.4.2
The v0.4.1 release contains twelve selectable, executable profiles:
The v0.4.2 release contains twelve selectable, executable profiles:
- **JavaScript (ECMAScript)** — the current browser's native `RegExp`, with
ECMAScript 2025 syntax supplied by regexpp 4.12.2;
@@ -356,7 +356,7 @@ The normal build performs no network download. `vite.config.ts` uses
## Toolbox SDK and Portal
The application uses Toolbox SDK 0.2.2 `AppShell`. Its canonical typed/static
The application uses Toolbox SDK 0.2.3 `AppShell`. Its canonical typed/static
manifest source is `src/toolbox/manifest.source.json`; generation fails if its
version or source identity drifts.

View File

@@ -1,10 +1,10 @@
# Source identity
- Project: Regex Tools
- Release version: `0.4.1`
- Release tag: `v0.4.1`
- Repository: <https://git.add-ideas.de/zemion/regex-tools>
- Previous release tag: `v0.4.0`
- Release version: `0.4.2`
- Release tag: `v0.4.2`
- Repository: <https://git.add-ideas.de/lotobo/regex-tools>
- Previous release tag: `v0.4.1`
- Licence: GPL-3.0-or-later
- Copyright: © 2026 Albrecht Degering
@@ -82,7 +82,7 @@ metadata, closed file sets, checksums and exact licence/notice material are
installed under `public/engines/` and included in the application source and
build.
The v0.4.1 release includes native browser ECMAScript, standalone PCRE2 10.47,
The v0.4.2 release includes native browser ECMAScript, standalone PCRE2 10.47,
PHP 8.5.8 `preg` with PCRE2 10.44, legacy Perl 5.28.1 via WebPerl 0.09-beta,
CPython 3.14.2 `re`, CRuby 4.0.0 `Regexp`, TeaVM 0.15.0 `java.util.regex`,
Emscripten 6.0.4 libc++ `std::wregex`, Go 1.26.5 `regexp`, Rust `regex` 1.13.1,
@@ -91,4 +91,4 @@ TeaVM-backed Scala/JVM compatibility profile.
Earlier releases remain available under their historical tags and artifact
coordinates. A future public artifact must bump package, manifest, tag and
source identity together; it must not reuse `v0.4.1`.
source identity together; it must not reuse `v0.4.2`.

View File

@@ -6,8 +6,8 @@ Exact dependency resolution is recorded in `package-lock.json`.
| Component | Version | Licence | Shipped | Role and source |
| -------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------- | ---------------------------- | -------------------------------------------------------------------------------------------------------------------------- |
| `@add-ideas/toolbox-contract` | 0.2.2 | Apache-2.0 | Runtime | Manifest contract; <https://git.add-ideas.de/zemion/toolbox-sdk> |
| `@add-ideas/toolbox-shell-react` | 0.2.2 | Apache-2.0 | Runtime | Shared shell; same source |
| `@add-ideas/toolbox-contract` | 0.2.3 | Apache-2.0 | Runtime | Manifest contract; <https://git.add-ideas.de/lotobo/toolbox-sdk> |
| `@add-ideas/toolbox-shell-react` | 0.2.3 | Apache-2.0 | Runtime | Shared shell; same source |
| `@eslint-community/regexpp` | 4.12.2 | MIT | Syntax worker | ECMAScript parser; <https://github.com/eslint-community/regexpp> |
| CodeMirror packages | state 6.7.1; view 6.43.6; language 6.12.4; commands 6.10.4; search 6.7.1 | MIT | Runtime | Editors; <https://github.com/codemirror> |
| `@lezer/highlight` | 1.2.3 | MIT | Runtime | Editor highlighting support; <https://github.com/lezer-parser/highlight> |
@@ -46,7 +46,12 @@ Exact dependency resolution is recorded in `package-lock.json`.
| Vite | 8.1.5 | MIT | Generated helpers | Production build; <https://github.com/vitejs/vite> |
| Rolldown | 1.1.5 | MIT | Generated helpers | Production bundling; <https://github.com/rolldown/rolldown> |
`@add-ideas/toolbox-testkit` 0.2.2 and the other test/build dependencies are
The application icon adapts and recolours the MIT-licensed
[OOjs UI regular-expression-progressive icon](https://commons.wikimedia.org/wiki/File:OOjs_UI_icon_regular-expression-progressive.svg)
inside original Regex Tools file artwork. Its copyright notice, source and
licence are preserved in `LICENSES/OOjs-UI-icon-MIT.txt`.
`@add-ideas/toolbox-testkit` 0.2.3 and the other test/build dependencies are
development-only and are not part of the static runtime bundle.
The PHP pack's `native-components.json` is scoped to the exact

View File

@@ -18,7 +18,7 @@ budget. Consumers must inspect the preview status rather than treating a
preview as complete. In particular, list export is disabled if its template
would consume an incomplete value.
Repeated captures expose only the final retained value in all twelve v0.4.1
Repeated captures expose only the final retained value in all twelve v0.4.2
profiles. This includes .NET even though its native API can retain capture
history: the current adapter deliberately normalizes only the final record and
reports `captureHistory: false`. The UI labels the limitation and does not

View File

@@ -1,6 +1,6 @@
# Flavour support
Version 0.4.1 exposes twelve executable profiles. “Partial lexical provider”
Version 0.4.2 exposes twelve executable profiles. “Partial lexical provider”
means that Regex Tools recognizes common structure and replacement tokens for
explanation only; the named runtime compiler and replacement operation remain
authoritative.

View File

@@ -11,7 +11,7 @@ selected real ECMAScript or PCRE2 worker. It can preserve:
authoritative, untruncated output.
PHP, Perl, Python, Ruby, Java, C++, Go, Rust, .NET and Scala compatibility are
not supported minimization targets in v0.4.1. The workspace disables reduction
not supported minimization targets in v0.4.2. The workspace disables reduction
for those active profiles; it does not substitute ECMAScript, PCRE2 or a
lexical provider as an execution oracle.

View File

@@ -38,9 +38,9 @@ should test both a direct root mount and a nested mount such as
`/apps/regex/`, including cold loading of all twelve profiles.
The Portal must consume the immutable release ZIP, verify its SHA-256, verify
manifest ID `de.add-ideas.regex-tools` and version `0.4.1`, and mount it at a
manifest ID `de.add-ideas.regex-tools` and version `0.4.2`, and mount it at a
relative target such as `apps/regex/`.
The package, manifest, tag, artifact URL and checksum must all use the v0.4.1
The package, manifest, tag, artifact URL and checksum must all use the v0.4.2
identity. Historical artifact coordinates remain immutable and must not be
overwritten or reused.

View File

@@ -4,9 +4,9 @@ Inspection date: 2026-07-27.
| Reference | Exact revision/version | Licence | Use and copying status |
| -------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------- |
| Regex Tools | Release identity `v0.4.1` | GPL-3.0-or-later | Application source written for this project. |
| Toolbox SDK | `53c40a61ba1581246f65773fcbb1c1cfd31ac98e` / 0.2.2 | Apache-2.0 | Contract, shell and release conventions; package APIs used, no source adapted. |
| Toolbox Portal | `9347554324299c8ec9dfaec2c9730907736f62c3` / aggregate v0.8.0 / package 0.2.7 | AGPL-3.0-only | Assembly/lock conventions inspected; no source copied into the app. |
| Regex Tools | Release identity `v0.4.2` | GPL-3.0-or-later | Application source written for this project. |
| Toolbox SDK | `ef2dab4b46c61812c9a877d8a19fe497b4a4630a` / 0.2.3 | Apache-2.0 | Contract, shell and release conventions; package APIs used, no source adapted. |
| Toolbox Portal | `43670a58249a920d37b7465cfda6724f644a92f7` / aggregate v0.9.1 / package 0.2.9 | AGPL-3.0-only | Assembly/lock conventions inspected; no source copied into the app. |
| regexpp | 4.12.2; pinned npm integrity in `package-lock.json` | MIT | ECMAScript 2025 syntax provider; normalized in the syntax worker. |
| PCRE2 | Signed tag 10.47; commit `f454e231fe5006dd7ff8f4693fd2b8eb94333429` | BSD-3-Clause WITH PCRE2-exception | Standalone pinned offline build; verified 8-bit WebAssembly pack shipped, source not vendored. |
| PHP | Executable identity 8.5.8; embedded PCRE2 identity 10.44 | PHP License version 4 (BSD-3-Clause), elected through the earlier licence's later-version option | Actual PHP `preg_*` compiler, matcher and replacement runtime; PHP source not vendored. |
@@ -30,6 +30,6 @@ Inspection date: 2026-07-27.
| RegexLib | Website inspected | Redistribution licence not established | No fixture copied. |
| RGXP.RU | Website inspected | Redistribution licence not established | No fixture copied. |
All v0.1.0 through v0.4.1 conformance cases are project-authored. See
All v0.1.0 through v0.4.2 conformance cases are project-authored. See
`tests/fixtures/README.md`. Runtime pack metadata and adjacent licence/notice
files are authoritative for the exact binary distribution.

View File

@@ -18,8 +18,8 @@ on publication failure, replaces an existing exact version only with
`--force`, and produces:
```text
release/regex-tools-0.4.1.zip
release/regex-tools-0.4.1.zip.sha256
release/regex-tools-0.4.2.zip
release/regex-tools-0.4.2.zip.sha256
```
The release scan checks ASCII/UTF-8, UTF-16LE and UTF-16BE content in text,
@@ -43,5 +43,5 @@ anchored base-runtime legal files. The C++ gate requires its exact traced
component/source manifest and six independently pinned legal files. The release
packager names every one of those files explicitly.
The existing v0.1.0 through v0.4.0 ZIPs and matching sidecars are historical
immutable artifacts. Creating v0.4.1 must not replace, rename or remove them.
The existing v0.1.0 through v0.4.1 ZIPs and matching sidecars are historical
immutable artifacts. Creating v0.4.2 must not replace, rename or remove them.

View File

@@ -1,4 +1,4 @@
module git.add-ideas.de/zemion/regex-tools/engines/go
module git.add-ideas.de/lotobo/regex-tools/engines/go
go 1.26.0

32
package-lock.json generated
View File

@@ -1,16 +1,16 @@
{
"name": "regex-tools",
"version": "0.4.1",
"version": "0.4.2",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "regex-tools",
"version": "0.4.1",
"version": "0.4.2",
"license": "GPL-3.0-or-later",
"dependencies": {
"@add-ideas/toolbox-contract": "0.2.2",
"@add-ideas/toolbox-shell-react": "0.2.2",
"@add-ideas/toolbox-contract": "0.2.3",
"@add-ideas/toolbox-shell-react": "0.2.3",
"@codemirror/commands": "6.10.4",
"@codemirror/language": "6.12.4",
"@codemirror/search": "6.7.1",
@@ -23,7 +23,7 @@
"react-dom": "19.2.7"
},
"devDependencies": {
"@add-ideas/toolbox-testkit": "0.2.2",
"@add-ideas/toolbox-testkit": "0.2.3",
"@bjorn3/browser_wasi_shim": "0.4.2",
"@eslint/js": "10.0.1",
"@php-wasm/universal": "3.1.46",
@@ -55,18 +55,18 @@
}
},
"node_modules/@add-ideas/toolbox-contract": {
"version": "0.2.2",
"resolved": "https://git.add-ideas.de/api/packages/zemion/npm/%40add-ideas%2Ftoolbox-contract/-/0.2.2/toolbox-contract-0.2.2.tgz",
"integrity": "sha512-VcZ8j4O2PgFaIYgxs6r9u0uPxA+hHKwhCW+omfeVCtbjAAYhH2KhRlBGm0ERVVYcK5kchyzZLXrC4LKWRotVzg==",
"version": "0.2.3",
"resolved": "https://git.add-ideas.de/api/packages/lotobo/npm/%40add-ideas%2Ftoolbox-contract/-/0.2.3/toolbox-contract-0.2.3.tgz",
"integrity": "sha512-T0PVSuMT40GjTDfQJhEEY3ZawQq8zz1/ry95JdKI6W39CdLacaRXdGnEpDCMHt+jUbf1Jz7Nat/M5dFCgKVM9A==",
"license": "Apache-2.0"
},
"node_modules/@add-ideas/toolbox-shell-react": {
"version": "0.2.2",
"resolved": "https://git.add-ideas.de/api/packages/zemion/npm/%40add-ideas%2Ftoolbox-shell-react/-/0.2.2/toolbox-shell-react-0.2.2.tgz",
"integrity": "sha512-w/xbLCd50a2Jq7vQ9Z9ygUOuqlOCRkIYlk4vSJx0mf4REJNeMYi3PE2MbaLUC4DkQWyrmatsa5HNT89o0l91BA==",
"version": "0.2.3",
"resolved": "https://git.add-ideas.de/api/packages/lotobo/npm/%40add-ideas%2Ftoolbox-shell-react/-/0.2.3/toolbox-shell-react-0.2.3.tgz",
"integrity": "sha512-DT5lQDH48BFkFcmFLZnQh7+Cm73JzBPcmp5WzUXypfkUXpEyDYHzaXgmW4kZ0edSwh4RK4sPmx+JPtK0X4aKCQ==",
"license": "Apache-2.0",
"dependencies": {
"@add-ideas/toolbox-contract": "0.2.2"
"@add-ideas/toolbox-contract": "0.2.3"
},
"peerDependencies": {
"react": ">=18 <20",
@@ -74,13 +74,13 @@
}
},
"node_modules/@add-ideas/toolbox-testkit": {
"version": "0.2.2",
"resolved": "https://git.add-ideas.de/api/packages/zemion/npm/%40add-ideas%2Ftoolbox-testkit/-/0.2.2/toolbox-testkit-0.2.2.tgz",
"integrity": "sha512-ZxrRYiJI/j5aXwcd3mQItgDl1iOJ6N26+MpIG18qVZNwKKFCTCfSTzgzRooPt8rRc1MQYTPo4c+l/QpOWuTXxA==",
"version": "0.2.3",
"resolved": "https://git.add-ideas.de/api/packages/lotobo/npm/%40add-ideas%2Ftoolbox-testkit/-/0.2.3/toolbox-testkit-0.2.3.tgz",
"integrity": "sha512-sq1MwhKWfFKen+N+124hl74qQimRSvmQ9sOU7jdcI+2qCKZ67+2B8rWyezeV80uTFu4Jv6deHksfYQ/tKNV6XQ==",
"dev": true,
"license": "Apache-2.0",
"dependencies": {
"@add-ideas/toolbox-contract": "0.2.2"
"@add-ideas/toolbox-contract": "0.2.3"
},
"bin": {
"toolbox-check": "dist/cli.js"

View File

@@ -1,16 +1,16 @@
{
"name": "regex-tools",
"version": "0.4.1",
"version": "0.4.2",
"description": "Develop, explain, test and apply regular expressions locally in the browser.",
"license": "GPL-3.0-or-later",
"author": "Albrecht Degering",
"repository": {
"type": "git",
"url": "git+https://git.add-ideas.de/zemion/regex-tools.git"
"url": "git+https://git.add-ideas.de/lotobo/regex-tools.git"
},
"homepage": "https://git.add-ideas.de/zemion/regex-tools",
"homepage": "https://git.add-ideas.de/lotobo/regex-tools",
"bugs": {
"url": "https://git.add-ideas.de/zemion/regex-tools/issues"
"url": "https://git.add-ideas.de/lotobo/regex-tools/issues"
},
"private": true,
"type": "module",
@@ -72,8 +72,8 @@
"release:artifact": "npm run check && npm run test:browser && npm run package:release"
},
"dependencies": {
"@add-ideas/toolbox-contract": "0.2.2",
"@add-ideas/toolbox-shell-react": "0.2.2",
"@add-ideas/toolbox-contract": "0.2.3",
"@add-ideas/toolbox-shell-react": "0.2.3",
"@codemirror/commands": "6.10.4",
"@codemirror/language": "6.12.4",
"@codemirror/search": "6.7.1",
@@ -86,7 +86,7 @@
"react-dom": "19.2.7"
},
"devDependencies": {
"@add-ideas/toolbox-testkit": "0.2.2",
"@add-ideas/toolbox-testkit": "0.2.3",
"@bjorn3/browser_wasi_shim": "0.4.2",
"@eslint/js": "10.0.1",
"@php-wasm/universal": "3.1.46",

View File

@@ -1,4 +1,4 @@
911f8f5782931320f5b8d1160a76365b83aea6447ee6c04fa6d5591467db9dad LICENSE-Go.txt
208034ac6bb2a1867fa082c51edd5e77098f16ff55e7907f9c9a51b59e6390ff engine-metadata.json
ddafd6401e0674c048ee066677157db0b03480f716262845ea30639daffb3ae5 go-regex.wasm
38a8e5518e670ca40efce95753d6836ed4686c5d25bb049df2c97e418ec76636 engine-metadata.json
d2faa632cc35d4d63040f9a8d7ad15e1bd5866a4d69c72a7bbefadf7fadcb676 go-regex.wasm
0c949f4996f9a89698e4b5c586de32249c3b69b7baadb64d220073cc04acba14 wasm_exec.mjs

View File

@@ -35,7 +35,7 @@
},
{
"path": "engines/go/go.mod",
"sha256": "b2744a26c11ce6be55fabd2109b89f34b0db413abab8b40c9f7e8ea83e8b7bff",
"sha256": "1d84837beaa0d734f26a7e87ed83f5a8ffbc4e9d049260636ef127ec163c5f58",
"bytes": 85
},
{
@@ -70,7 +70,7 @@
},
{
"path": "go-regex.wasm",
"sha256": "ddafd6401e0674c048ee066677157db0b03480f716262845ea30639daffb3ae5",
"sha256": "d2faa632cc35d4d63040f9a8d7ad15e1bd5866a4d69c72a7bbefadf7fadcb676",
"bytes": 3904895
},
{

Binary file not shown.

View File

@@ -1,7 +1,26 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64" role="img" aria-labelledby="title">
<title id="title">Regex Tools</title>
<rect width="64" height="64" rx="15" fill="#5532a8"/>
<path d="M15 22h20M15 32h12M15 42h20" fill="none" stroke="#fff" stroke-width="5" stroke-linecap="round"/>
<path d="m46 20-3 24m-7-8 20-8" fill="none" stroke="#80e1cb" stroke-width="5" stroke-linecap="round"/>
<metadata>
The regular-expression symbol is adapted from the OOjs UI
regular-expression-progressive icon, Copyright 20112017 OOjs UI Team and
other contributors, MIT licensed. The surrounding application icon is
Copyright 2026 Albrecht Degering, GPL-3.0-or-later.
</metadata>
<defs>
<linearGradient id="regex-bg" x1="8" y1="5" x2="56" y2="59" gradientUnits="userSpaceOnUse">
<stop offset="0" stop-color="#6d5cff"/>
<stop offset="1" stop-color="#18224d"/>
</linearGradient>
<filter id="regex-shadow" x="-20%" y="-20%" width="140%" height="140%">
<feDropShadow dx="0" dy="2" stdDeviation="1.25" flood-color="#060b24" flood-opacity="0.32"/>
</filter>
</defs>
<rect width="64" height="64" rx="14" fill="url(#regex-bg)"/>
<g filter="url(#regex-shadow)">
<path d="M18 9h22l9 9v33a4 4 0 0 1-4 4H18a4 4 0 0 1-4-4V13a4 4 0 0 1 4-4Z" fill="#fff"/>
<path d="M40 9v9h9Z" fill="#d9ddff"/>
<g transform="translate(20 25) scale(1.2)" fill="#36c">
<path d="M1.62 10a13.63 13.63 0 0 0 .45 3.51A13.39 13.39 0 0 0 3.4 16.7a.91.91 0 0 1 .1.27.41.41 0 0 1 0 .21.38.38 0 0 1-.1.15l-.14.11-.83.5a14.89 14.89 0 0 1-1.11-2 13.62 13.62 0 0 1-.74-2 13.22 13.22 0 0 1-.42-2 16.4 16.4 0 0 1 0-4.14 13.22 13.22 0 0 1 .42-2 13.84 13.84 0 0 1 .74-2A14.94 14.94 0 0 1 2.4 2l.83.51.14.11a.4.4 0 0 1 .1.15.41.41 0 0 1 0 .21.93.93 0 0 1-.1.27A13.6 13.6 0 0 0 1.62 10ZM5 13.51a1.53 1.53 0 0 1 .11-.59 1.5 1.5 0 0 1 .31-.48 1.5 1.5 0 0 1 1.65-.32 1.51 1.51 0 0 1 .8.8 1.47 1.47 0 0 1 .12.59 1.46 1.46 0 0 1-.12.59 1.56 1.56 0 0 1-.32.48 1.46 1.46 0 0 1-.48.32 1.57 1.57 0 0 1-1.18 0 1.4 1.4 0 0 1-.47-.32A1.5 1.5 0 0 1 5 13.51Zm10.8-4.72-.54.94-1.75-1-.34-.23a1.38 1.38 0 0 1-.27-.26A1.84 1.84 0 0 1 13 9v2h-1V9a2.16 2.16 0 0 1 .12-.76 1.82 1.82 0 0 1-.58.48l-1.74 1-.54-.94 1.73-1a2.25 2.25 0 0 1 .75-.29 1.77 1.77 0 0 1-.75-.28L9.2 6.2l.54-.94 1.75 1 .33.24a1.64 1.64 0 0 1 .27.27A2 2 0 0 1 12 6V4h1v2a2.93 2.93 0 0 1 0 .4 1.36 1.36 0 0 1-.1.36 2.24 2.24 0 0 1 .59-.49l1.74-1 .54.94-1.73 1-.36.18a1.29 1.29 0 0 1-.36.1 2.11 2.11 0 0 1 .36.1 2 2 0 0 1 .36.19ZM18.37 10a13.65 13.65 0 0 0-.45-3.51 13.81 13.81 0 0 0-1.32-3.27.93.93 0 0 1-.1-.27.45.45 0 0 1 0-.21.36.36 0 0 1 .1-.15l.14-.11.86-.48a15.54 15.54 0 0 1 1.1 2 13.79 13.79 0 0 1 .74 2 13.18 13.18 0 0 1 .42 2 16.16 16.16 0 0 1 .14 2 16.21 16.21 0 0 1-.13 2 13.18 13.18 0 0 1-.42 2 13.57 13.57 0 0 1-.74 2 15.49 15.49 0 0 1-1.1 2l-.84-.5-.14-.11a.35.35 0 0 1-.1-.15.44.44 0 0 1 0-.21.91.91 0 0 1 .1-.27 13.62 13.62 0 0 0 1.31-3.23 13.69 13.69 0 0 0 .43-3.53Z"/>
</g>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 413 B

After

Width:  |  Height:  |  Size: 2.7 KiB

View File

@@ -1,9 +1,9 @@
{
"$schema": "https://git.add-ideas.de/zemion/toolbox-sdk/raw/branch/main/schemas/toolbox-app.v1.schema.json",
"$schema": "https://git.add-ideas.de/lotobo/toolbox-sdk/raw/branch/main/schemas/toolbox-app.v1.schema.json",
"schemaVersion": 1,
"id": "de.add-ideas.regex-tools",
"name": "Regex Tools",
"version": "0.4.1",
"version": "0.4.2",
"description": "Develop, explain, test and apply regular expressions locally in the browser.",
"entry": "./",
"icon": "./favicon.svg",
@@ -27,14 +27,14 @@
"telemetry": false
},
"source": {
"repository": "https://git.add-ideas.de/zemion/regex-tools",
"repository": "https://git.add-ideas.de/lotobo/regex-tools",
"license": "GPL-3.0-or-later"
},
"actions": [
{
"id": "source",
"label": "Source",
"url": "https://git.add-ideas.de/zemion/regex-tools"
"url": "https://git.add-ideas.de/lotobo/regex-tools"
}
],
"assets": [

View File

@@ -29,7 +29,7 @@ if (
}
if (
source.source?.repository !== "https://git.add-ideas.de/zemion/regex-tools" ||
source.source?.repository !== "https://git.add-ideas.de/lotobo/regex-tools" ||
source.source?.license !== "GPL-3.0-or-later"
) {
throw new Error("Manifest source identity is incomplete or inconsistent");

View File

@@ -19,7 +19,7 @@ const root = path.resolve(path.dirname(fileURLToPath(import.meta.url)), "..");
const zipEpoch = new Date(1980, 0, 1, 0, 0, 0);
const gplVersion3TextSha256 =
"fb981668c18a279e285fc4d83fba1e836cc84dd4daa73c9697d3cfd2d8aca6e0";
const expectedApplicationVersion = "0.4.1";
const expectedApplicationVersion = "0.4.2";
const requiredRootFiles = [
"LICENSE",
"README.md",
@@ -341,7 +341,7 @@ async function collectReleaseEntries() {
packageJson.version !== expectedApplicationVersion ||
packageJson.license !== "GPL-3.0-or-later" ||
packageJson.repository?.url !==
"git+https://git.add-ideas.de/zemion/regex-tools.git"
"git+https://git.add-ideas.de/lotobo/regex-tools.git"
) {
throw new Error("Package version, licence or source identity drifted.");
}
@@ -354,7 +354,7 @@ async function collectReleaseEntries() {
`- Release tag: \`v${expectedApplicationVersion}\``,
) ||
!sourceIdentity.includes(
"- Repository: <https://git.add-ideas.de/zemion/regex-tools>",
"- Repository: <https://git.add-ideas.de/lotobo/regex-tools>",
)
) {
throw new Error("SOURCE.md release identity drifted.");
@@ -565,7 +565,7 @@ async function collectReleaseEntries() {
manifest.id !== "de.add-ideas.regex-tools" ||
manifest.version !== packageJson.version ||
manifest.source?.repository !==
"https://git.add-ideas.de/zemion/regex-tools" ||
"https://git.add-ideas.de/lotobo/regex-tools" ||
manifest.source?.license !== "GPL-3.0-or-later"
) {
throw new Error("Packaged manifest identity is inconsistent.");

View File

@@ -6,7 +6,7 @@ import {
} from "../regex/generation/generation-limits";
import { manifest } from "../toolbox/manifest";
const releaseSourceUrl = `https://git.add-ideas.de/zemion/regex-tools/src/tag/v${manifest.version}`;
const releaseSourceUrl = `https://git.add-ideas.de/lotobo/regex-tools/src/tag/v${manifest.version}`;
export function HelpDialog({
open,

View File

@@ -48,6 +48,18 @@
box-sizing: border-box;
}
html {
min-width: 320px;
min-height: 100%;
background: var(--toolbox-background);
}
body {
min-width: 320px;
min-height: 100vh;
margin: 0;
}
button,
input,
select,
@@ -74,7 +86,7 @@ textarea:focus-visible,
position: relative;
width: min(100%, 90rem);
margin-inline: auto;
padding: 1rem clamp(0.75rem, 2.5vw, 2rem) 3rem;
padding: 1rem 0 3rem;
color: var(--toolbox-text);
}
@@ -2025,10 +2037,6 @@ tbody tr.is-selected {
}
@media (max-width: 40rem) {
.regex-application {
padding-inline: 0.5rem;
}
.command-bar > label:not(.check-control) {
flex: 1 1 10rem;
min-width: 0;

View File

@@ -1,9 +1,9 @@
{
"$schema": "https://git.add-ideas.de/zemion/toolbox-sdk/raw/branch/main/schemas/toolbox-app.v1.schema.json",
"$schema": "https://git.add-ideas.de/lotobo/toolbox-sdk/raw/branch/main/schemas/toolbox-app.v1.schema.json",
"schemaVersion": 1,
"id": "de.add-ideas.regex-tools",
"name": "Regex Tools",
"version": "0.4.1",
"version": "0.4.2",
"description": "Develop, explain, test and apply regular expressions locally in the browser.",
"entry": "./",
"icon": "./favicon.svg",
@@ -27,14 +27,14 @@
"telemetry": false
},
"source": {
"repository": "https://git.add-ideas.de/zemion/regex-tools",
"repository": "https://git.add-ideas.de/lotobo/regex-tools",
"license": "GPL-3.0-or-later"
},
"actions": [
{
"id": "source",
"label": "Source",
"url": "https://git.add-ideas.de/zemion/regex-tools"
"url": "https://git.add-ideas.de/lotobo/regex-tools"
}
],
"assets": [

View File

@@ -1,3 +1,3 @@
export const APPLICATION_VERSION = "0.4.1";
export const APPLICATION_VERSION = "0.4.2";
export const SYNTAX_PROFILE = "community";
export const REGEXPP_VERSION = "4.12.2";

View File

@@ -15,6 +15,49 @@ async function waitForReady(page: Page) {
});
}
async function attemptRunWhileDisabled(page: Page) {
return page.evaluate(() => {
const button = document.querySelector<HTMLButtonElement>(".run-button");
if (!button) throw new Error("Run button missing");
if (!button.disabled) return false;
button.click();
return true;
});
}
test("uses the shared 90rem content width without a browser body frame", async ({
page,
}) => {
await page.setViewportSize({ width: 1800, height: 900 });
await page.goto("./");
await expect(page.locator(".regex-application")).toBeVisible();
const layout = await page.evaluate(() => {
const shellMain = document.querySelector<HTMLElement>(
".toolbox-shell__main",
);
const application =
document.querySelector<HTMLElement>(".regex-application");
if (!shellMain || !application)
throw new Error("Application shell missing");
const shellMainStyle = getComputedStyle(shellMain);
return {
bodyMargin: getComputedStyle(document.body).margin,
shellMainWidth: shellMain.getBoundingClientRect().width,
shellMainContentWidth:
shellMain.clientWidth -
Number.parseFloat(shellMainStyle.paddingLeft) -
Number.parseFloat(shellMainStyle.paddingRight),
applicationWidth: application.getBoundingClientRect().width,
};
});
expect(layout.bodyMargin).toBe("0px");
expect(layout.shellMainWidth).toBe(1440);
expect(layout.applicationWidth).toBe(layout.shellMainContentWidth);
});
test("standalone ECMAScript workbench parses, explains and extracts", async ({
page,
}) => {
@@ -451,18 +494,20 @@ test("rapid pattern and replacement edits cannot run with stale syntax", async (
await setEditor(page, "editor-regular-expression-pattern", "(?<stale>\\w+)");
await setEditor(page, "editor-replacement-template", "$<stale>");
await setEditor(page, "editor-replacement-template", "[$<letter>]");
await setEditor(page, "editor-test-text", "A B");
await setEditor(
page,
"editor-regular-expression-pattern",
"(?<letter>[A-Z])",
);
await setEditor(page, "editor-replacement-template", "[$<letter>]");
await setEditor(page, "editor-test-text", "A B");
const runButton = page.getByRole("button", { name: "Run", exact: true });
await expect(runButton).toBeDisabled();
await runButton.evaluate((button: HTMLButtonElement) => button.click());
await expect(page.locator(".run-status")).not.toHaveClass(/status-running/u);
expect(await attemptRunWhileDisabled(page)).toBe(true);
await expect(page.locator(".run-status")).toHaveClass(/status-idle/u);
await expect(page.locator(".run-status")).toContainText(
"last completed result remains visible",
);
await expect(page.locator(".extraction-row")).toHaveCount(
initialExtractionCount,
);
@@ -476,9 +521,8 @@ test("rapid pattern and replacement edits cannot run with stale syntax", async (
await expect(currentNamedToken.locator("small")).toHaveText("named capture");
await page.getByRole("checkbox", { name: "Ignore case (i)" }).check();
await expect(runButton).toBeDisabled();
await runButton.evaluate((button: HTMLButtonElement) => button.click());
await expect(page.locator(".run-status")).not.toHaveClass(/status-running/u);
expect(await attemptRunWhileDisabled(page)).toBe(true);
await expect(page.locator(".run-status")).toHaveClass(/status-idle/u);
await expect(runButton).toBeEnabled();
await runButton.click();