Changes for version 3.021 - 2026-08-24
- Extended wdlint to inspect inline Perl chunks, processing instructions, and substitution expressions in addition to __PERL__ sections. Each chunk is checked independently so later syntax errors are still reported after an earlier chunk fails. Added line-preserving regression coverage.
- Added require and import attributes to <start_html>, using the same dependency-loading and function-import behaviour as <perl>. Declared dependencies are loaded before normal, SSE, and WebSocket handlers are dispatched.
- Passed CGI parameter hashes to PAGI SSE and WebSocket subroutines as their second argument, allowing async handlers to use request parameters explicitly across await points.
- Fixed URL-encoded form POST handling under PAGI by asynchronously buffering request bodies before synchronous CGI::Simple parsing. Kept the cached body available to the WebDyne PAGI request adapter and avoided crossing localized environment scopes during await. Added repeated-request regression coverage for the former Future panic.
- Added documentation and WebDyne authoring guidance for start_html dependencies, PAGI parameters, SSE/WebSocket handlers, HTMX fragments, and the required hx-vals="js:{ ... }" syntax when supplying values from PSP pages.
- Added release-board and pizza-order SSE/HTMX demonstration pages, including WebDyne-rendered fragments, status refreshes, and PAGI handler examples. Kept these developer demos and scratch material out of distribution manifests.
Documentation
Install or uninstall WebDyne Apache configuration files
parse and display internal data representation of WebDyne files
enable or disable debugging in the WebDyne packages
dump the data structure of a WebDyne page in the cache directory
check Perl syntax embedded in a WebDyne file
parse and render WebDyne files
Modules
Primary runtime module for the WebDyne framework, with support for standalone .psp to HTML rendering
Provides abstracted access to GET and POST parameters and file upload objects.
CGI-style parameter wrapper used by WebDyne request handling
WebDyne module to cache dynamic output for improved performance.
WebDyne chaining module, allows extension of base WebDyne handler pipeline with additional modules.
constant namespace for WebDyne::Chain
compiler for WebDyne .psp source files
WebDyne module that sets constants and defaults for WebDyne processing
error rendering and eval-error support for WebDyne
error-template and low-level error-mode constants for WebDyne
request and response filter module for the WebDyne handler chain
request and response filter callback constants for WebDyne
HTML::Tiny subclass with WebDyne page and form helpers
HTML::TreeBuilder subclass used by the WebDyne compiler
WebDyne handler module, forces use non-chained WebDyne handler.
base installation helper for WebDyne cache setup
Apache configuration installer for WebDyne
Apache-install discovery and template constants for WebDyne
installer defaults used by WebDyne installation helpers
PAGI application wrapper for WebDyne
PAGI runtime constants for WebDyne
PSGI application wrapper for WebDyne
PSGI runtime constants for WebDyne
Apache mod_perl request adapter for WebDyne
helper functions for building normalized WebDyne request adapters
synthetic request/response object used for direct WebDyne rendering
PAGI request adapter for WebDyne
PSGI request adapter for WebDyne
request-adapter constants for the PSGI request layer
simple static-file responder for WebDyne PSGI request flows
simple session-cookie module for the WebDyne handler chain
session-cookie constants for WebDyne
WebDyne module to flag pages as static and compile once to HTML
wrapper-template module for embedding WebDyne page output
debugging and error-stack utility functions for WebDyne
Provides
in lib/WebDyne/CGI/Simple.pm
in lib/WebDyne/Request/Apache.pm
in lib/WebDyne.pm
in t.error/error_require.pm
Examples
- examples/README.md
- examples/api.psp
- examples/block1.psp
- examples/block1a.psp
- examples/block2.psp
- examples/block3.psp
- examples/block4.psp
- examples/block5.psp
- examples/block6.psp
- examples/block_toggle1.psp
- examples/cache1.psp
- examples/cache2.psp
- examples/cgi1.psp
- examples/cgi2.psp
- examples/cgi3.psp
- examples/cgi4.psp
- examples/cgi5.psp
- examples/cgi6.psp
- examples/chart1.psp
- examples/content1.psp
- examples/dump1.psp
- examples/dump2.psp
- examples/err1.psp
- examples/err2.psp
- examples/err3.psp
- examples/err4.psp
- examples/hello1.psp
- examples/hello2.psp
- examples/hello3.psp
- examples/htmx_demo1.psp
- examples/htmx_demo2.psp
- examples/htmx_demo3.psp
- examples/htmx_time1.psp
- examples/htmx_time2.psp
- examples/htmx_time3.psp
- examples/include1.psp
- examples/include2.psp
- examples/include3.psp
- examples/include4.psp
- examples/include5.psp
- examples/inherit1.psp
- examples/inline1.psp
- examples/inline2.psp
- examples/inline3.psp
- examples/inline4.psp
- examples/introduction1.psp
- examples/introduction2.psp
- examples/introduction3.psp
- examples/introduction4.psp
- examples/introduction5.psp
- examples/introduction6.psp
- examples/introduction7.psp
- examples/introduction8.psp
- examples/introduction9.psp
- examples/json1.psp
- examples/noninline1.psp
- examples/noninline2.psp
- examples/noninline3.psp
- examples/noninline3a.psp
- examples/noninline4.psp
- examples/noninline5.psp
- examples/noninline6.psp
- examples/noninline7.psp
- examples/output1.psp
- examples/session1.psp
- examples/start_html1.psp
- examples/state1.psp
- examples/static1.psp
- examples/static2.psp
- examples/static3.psp
- examples/static3a.psp
- examples/static4.psp
- examples/template1.psp
- examples/var1.psp
- examples/var2.psp
- examples/var3.psp
- examples/var4.psp