A Vite plugin to rewrite HTML tags.
// vite.config.js
import { defineConfig } from 'vite';
import rewriteHTML from 'vite-plugin-html-rewrite';
export default defineConfig({
plugins: [
rewriteHTML([
{
match: (element) => element.name.startsWith('php-'),
render({ name, ...elementDetails }) {
return `<?php do_something('${name}', '${JSON.stringify(
elementDetails,
).replaceAll("'", "\\'")}}$'); ?>`;
},
},
]),
],
});
<!-- index.html -->
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
</head>
<body>
<php-header variant="dark" size="big">
<a href="/">Home</a>
<a href="/about">about</a>
</php-header>
<div>Here some ordinary content.</div>
<php-footer src="src/partials/footer" />
</body>
</html>
This will result in a dev and runtime generated index.html looking like
<!-- generated index.html -->
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
</head>
<body>
<?php do_something('php-header', '{"attribs":{"variant":"dark","size":"big"},"attributes":[{"name":"variant","value":"dark"},{"name":"size","value":"big"}],"nodeType":1,"startIndex":231,"tagName":"php-header","type":"tag","innerHTML":"\n <a href=\"/\">Home</a>\n <a href=\"/about\">about</a>\n "}}$'); ?>
<div>Here some ordinary content.</div>
<?php do_something('php-footer', '{"attribs":{"src":"src/partials/footer"},"attributes":[{"name":"src","value":"src/partials/footer"}],"nodeType":1,"startIndex":276,"tagName":"php-footer","type":"tag","innerHTML":""}}$'); ?>
</body>
</html>
You are able to specify when the rewrites are going to happen.
It's either pre
, post
or undefined
. See Vite's guide on transformIndexHtml
.
Defaults is set pre
, so before other hooks.
rewriteHTML([
{
order: 'post',
match: (element) => element.name.startsWith('php-'),
render({ name, ...elementDetails }) {
return `<?php do_something('${name}', '${JSON.stringify(
elementDetails,
).replaceAll("'", "\\'")}}$'); ?>`;
},
},
]);
type Transformation = {
order?: 'pre' | 'post' | undefined;
match: (element: Element) => boolean;
render: (
elementDetails: Pick<
Element,
| 'attribs'
| 'attributes'
| 'name'
| 'namespace'
| 'nodeType'
| 'startIndex'
| 'endIndex'
| 'tagName'
| 'type'
| 'x-attribsNamespace'
| 'x-attribsPrefix'
> & { innerHTML: string },
index: number,
) => false | undefined | null | string;
};
Love open source? Enjoying my project?
Your support can keep the momentum going! Consider a donation to fuel the creation of more innovative open source software.
via Ko-Fi | Buy me a coffee | via PayPal |
---|---|---|