PostHTML is a tool for transforming HTML/XML with JS plugins. PostHTML itself is very small. It includes only a HTML parser, a HTML node tree API and a node tree stringifier.
All HTML transformations are made by plugins. And these plugins are just small plain JS functions, which receive a HTML node tree, transform it, and return a modified tree.
For more detailed information about PostHTML in general take a look at the docs.
Name | Status | Description |
---|---|---|
posthtml-parser | Parser HTML/XML to PostHTMLTree | |
posthtml-render | Render PostHTMLTree to HTML/XML |
npm i -D posthtml
Sync
import posthtml from 'posthtml'
const html = `
<component>
<title>Super Title</title>
<text>Awesome Text</text>
</component>
`
const result = posthtml()
.use(require('posthtml-custom-elements')())
.process(html, { sync: true })
.html
console.log(result)
<div class="component">
<div class="title">Super Title</div>
<div class="text">Awesome Text</div>
</div>
⚠️ Async Plugins can't be used in sync mode and will throw an Error. It's recommended to use PostHTML asynchronously whenever possible.
Async
import posthtml from 'posthtml'
const html = `
<html>
<body>
<p class="wow">OMG</p>
</body>
</html>
`
posthtml(
[
require('posthtml-to-svg-tags')(),
require('posthtml-extend-attrs')({
attrsTree: {
'.wow' : {
id: 'wow_id',
fill: '#4A83B4',
'fill-rule': 'evenodd',
'font-family': 'Verdana'
}
}
})
])
.process(html/*, options */)
.then((result) => console.log(result.html))
<svg xmlns="http://www.w3.org/2000/svg">
<text
class="wow"
id="wow_id"
fill="#4A83B4"
fill-rule="evenodd" font-family="Verdana">
OMG
</text>
</svg>
Directives
import posthtml from 'posthtml'
const php = `
<component>
<title><?php echo $title; ?></title>
<text><?php echo $article; ?></text>
</component>
`
const result = posthtml()
.use(require('posthtml-custom-elements')())
.process(html, {
directives: [
{ name: '?php', start: '<', end: '>' }
]
})
.html
console.log(result)
<div class="component">
<div class="title"><?php echo $title; ?></div>
<div class="text"><?php echo $article; ?></div>
</div>
npm i posthtml-cli
"scripts": {
"posthtml": "posthtml -o output.html -i input.html -c config.json"
}
npm run posthtml
npm i -D gulp-posthtml
import tap from 'gulp-tap'
import posthtml from 'gulp-posthtml'
import { task, src, dest } from 'gulp'
task('html', () => {
let path
const plugins = [ require('posthtml-include')({ root: `${path}` }) ]
const options = {}
src('src/**/*.html')
.pipe(tap((file) => path = file.path))
.pipe(posthtml(plugins, options))
.pipe(dest('build/'))
})
Check project-stub for an example with Gulp
npm i -D grunt-posthtml
posthtml: {
options: {
use: [
require('posthtml-doctype')({ doctype: 'HTML 5' }),
require('posthtml-include')({ root: './', encoding: 'utf-8' })
]
},
build: {
files: [
{
dot: true,
cwd: 'html/',
src: ['*.html'],
dest: 'tmp/',
expand: true,
}
]
}
}
npm i -D html-loader posthtml-loader
webpack.config.js
const config = {
module: {
loaders: [
{
test: /\.html$/,
loader: 'html!posthtml'
}
]
},
posthtml: (ctx) => ({
parser: require('posthtml-pug'),
plugins: [
require('posthtml-bem')()
]
})
}
export default config
webpack.config.js
import { LoaderOptionsPlugin } from 'webpack'
const config = {
module: {
rules: [
{
test: /\.html$/,
use: [
{
loader: 'html-loader',
options: { minimize: true }
},
{
loader: 'posthtml-loader'
}
]
}
]
},
plugins: [
new LoaderOptionsPlugin({
options: {
posthtml(ctx) {
return {
parser: require('posthtml-pug'),
plugins: [
require('posthtml-bem')()
]
}
}
}
})
]
}
export default config
$ npm i rollup-plugin-posthtml -D
# or
$ npm i rollup-plugin-posthtml-template -D
import { join } from 'path';
import posthtml from 'rollup-plugin-posthtml-template';
// or
// import posthtml from 'rollup-plugin-posthtml';
import sugarml from 'posthtml-sugarml'; // npm i posthtml-sugarml -D
import include from 'posthtml-include'; // npm i posthtml-include -D
export default {
entry: join(__dirname, 'main.js'),
dest: join(__dirname, 'bundle.js'),
format: 'iife',
plugins: [
posthtml(
parser: sugarml(),
plugins: [include()],
template: true // only rollup-plugin-posthtml-template
})
]
};
import pug from 'posthtml-pug'
posthtml().process(html, { parser: pug(options) }).then((result) => result.html)
Name | Status | Description |
---|---|---|
posthtml-pug | Pug Parser | |
sugarml | SugarML Parser |
In case you want to develop your own plugin, we recommend using posthtml-plugin-boilerplate for getting started.
Name | Status | Description |
---|---|---|
posthtml-md | Easily use context-sensitive markdown within HTML | |
posthtml-lorem | Add lorem ipsum placeholder text to any document | |
posthtml-retext | Extensible system for analysing and manipulating natural language |
Name | Status | Description |
---|---|---|
posthtml-doctype | Set !DOCTYPE | |
posthtml-head-elements | Include head elements from JSON file | |
posthtml-include | Include HTML | |
posthtml-modules | Include and process HTML | |
posthtml-extend | Extend Layout (Pug-like) | |
posthtml-extend-attrs | Extend Attrs | |
posthtml-expressions | Template Expressions | |
posthtml-inline-assets | Inline external scripts, styles, and images | |
posthtml-static-react | Render custom elements as static React components | |
posthtml-custom-elements | Use custom elements | |
posthtml-web-component | Web Component server-side rendering, Component as a Service (CaaS) | |
posthtml-spaceless | Remove whitespace between HTML tags | |
posthtml-cache | Add a nanoid to links in you tags |
Name | Status | Description |
---|---|---|
posthtml-bem | Support BEM naming in html structure | |
posthtml-postcss | Use PostCSS in HTML document | |
posthtml-px2rem | Change px to rem in Inline CSS | |
posthtml-css-modules | Use CSS modules in HTML | |
posthtml-postcss-modules | CSS Modules in html | |
posthtml-classes | Get a list of classes from HTML | |
posthtml-prefix-class | Prefix class names | |
posthtml-modular-css | Make CSS modular | |
posthtml-inline-css | CSS Inliner | |
posthtml-collect-styles | Collect styles from html and put it in the head | |
posthtml-collect-inline-styles | Collect inline styles and insert to head tag | |
posthtml-style-to-file | Save HTML style nodes and attributes to CSS file | |
posthtml-color-shorthand-hex-to-six-digit | Enforce all hex color codes to be 6-char long |
Name | Status | Description |
---|---|---|
posthtml-img-autosize | Auto setting the width and height of <img> | |
posthtml-to-svg-tags | Convert html tags to svg equals | |
posthtml-webp | Add WebP support for images |
Name | Status | Description |
---|---|---|
posthtml-aria-tabs | Write accessible tabs with minimal markup | |
posthtml-alt-always | Always add alt attribute for images that don't have it | |
posthtml-schemas | Add microdata to your HTML |
Name | Status | Description |
---|---|---|
posthtml-shorten | Shorten URLs in HTML | |
posthtml-uglify | Shorten CSS in HTML | |
posthtml-minifier | Minify HTML | |
posthtml-remove-attributes | Remove attributes unconditionally or with content match | |
posthtml-remove-tags | Remove tags with content match | |
posthtml-remove-duplicates | Remove duplicate elements from your html | |
posthtml-transformer | Process HTML by directives in node attrs, such as inline scripts and styles, remove useless tags, concat scripts and styles etc. | |
htmlnano | HTML Minifier | |
posthtml-email-remove-unused-css | Remove unused CSS from email templates |
Name | Status | Description |
---|---|---|
posthtml-load-plugins | Autoload Plugins | |
posthtml-load-options | Autoload Options (Parser && Render) | |
posthtml-load-config | Autoload Config (Plugins && Options) | |
posthtml-w3c | Validate HTML with W3C Validation | |
posthtml-hint | Lint HTML with HTML Hint | |
posthtml-tidy | Sanitize HTML with HTML Tidy |
Name | Status | Description |
---|---|---|
koa-posthtml | Koa Middleware | |
hapi-posthtml | Hapi Plugin | |
express-posthtml | Express Middleware | |
electron-posthtml | Electron Plugin | |
metalsmith-posthtml | Metalsmith Plugin |
Ivan Voischev |
Anton Winogradov |
Alexej Yaroshevich |
Vasiliy |
See PostHTML Guidelines and CONTRIBUTING.