0.16.6 • Published 2 years ago

posthtml v0.16.6

Weekly downloads
758,353
License
MIT
Repository
github
Last release
2 years ago

NPM Tests Coverage Standard Code Style Twitter

PostHTML

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.

Dependencies

NameStatusDescription
posthtml-parsernpmParser HTML/XML to PostHTMLTree
posthtml-rendernpmRender PostHTMLTree to HTML/XML

Create to your project

npm init posthtml

Install

npm i -D posthtml

Usage

API

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>

:warning: 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>

CLI

npm i posthtml-cli
"scripts": {
  "posthtml": "posthtml -o output.html -i input.html -c config.json"
}
npm run posthtml

Gulp

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

Grunt

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,
      }
    ]
  }
}

Webpack

npm i -D html-loader posthtml-loader

v1.x

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

v2.x

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

Rollup

$ 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
    })
  ]
};

Parser

import pug from 'posthtml-pug'

posthtml().process(html, { parser: pug(options) }).then((result) => result.html)
NameStatusDescription
posthtml-pugnpmPug Parser
sugarmlnpmSugarML Parser

Plugins

In case you want to develop your own plugin, we recommend using posthtml-plugin-starter to get started.

Maintainers

Contributors

Backers

Thank you to all our backers! 🙏 [Become a backer]

@parcel-nightly-unofficial/optimizer-htmlnano@parcel-nightly-unofficial/packager-html@parcel-nightly-unofficial/transformer-html@parcel-nightly-unofficial/transformer-posthtmlproject-name-here@ianlucas/parcel-bundlerswarm-websitetzar-core@eb3n/posthtml-components@eztool/prettier-plugin-formatter@ephesus/ephesus-coreposthtml-partposthtml-partialbuildgem-md2htmlalinesno-do-vueposthtml-fragmentposthtml-browser@twigger/posthtml@sdf-1/posthtml@everything-registry/sub-chunk-2463t3-buildtailwind-to-styledsveltemodwebtampwxml-minifyxcim-codesandboxsticky-scroll-catchsvg-fill-loadersvg-clrz-loadersvg-to-vue-componentvite-plugin-legacy-devvite-plugin-move-scriptvtexyvite-plugin-html-resolve-aliasvite-plugin-imgvite-plugin-posthtmlvue-ast-editorvue-cli-plugin-eliar@dkwasniewski/paczka@divriots/legacy-jampack@coco-platform/critical@compiled/parcel-optimizer@demon673/webpack-panorama@coyote-labs/ember-fingerprint-assets@bundless/cli@braiwet/rollup-plugin-svelte-static-htmlgenerator-bootstrap-boilerplate-templatejstransformer-posthtmljgb-plugin-htmlkigokeywords-highlight-htmlkoa-posthtmlkwasniew-parcel-bundlerchain_diggerserver-side-jsx@esbuild-plugins/html@contentful/contentful-extension-scriptsstyled-vuest-require-packsr-require-packsuntmollitiatwo-faces-svg-to-vue-componentultron-tooltranslate-wepy-template-loaderunco-webpack-panoramaunder-the-wave@ash9g/parcel-bundler@atlaspack/transformer-html@atlaspack/packager-html@atlaspack/packager-svg@atlaspack/optimizer-htmlnano@atlaspack/transformer-posthtml@atlaspack/transformer-svg@agrarium/plugin-markdown@alexlafroscia/parcel-bundler@beeanco/render-wordpress-post@ayc0/parcel-bundler@alterjs/saber@alxmtr/vite-plugin-posthtml@blackblock/generate-sitemap@blackblock/posthtml@bitfirer/vue-qriously@cabin-icarus/webpack-panorama@11ty/eleventy-plugin-rss@11ty/eleventy@achil/parcel-bundler@aabao/webpack-panorama@abidibo/js-word-event@bouygues-telecom/parcel-bundler@deja-vu/cli@designsystemsinternational/email@devorso/dcountdown@danmarshall/parcel-bundler@darekkay/11tyyubi-svg-loaderzeev-mailzeev-runvue-ts-componentvue-tmlwebpack4-cdn-plugin
0.16.7-beta.0

2 years ago

0.16.7-0

2 years ago

0.16.6

3 years ago

0.16.5

4 years ago

0.16.3

4 years ago

0.16.4

4 years ago

0.16.0

4 years ago

0.16.1

4 years ago

0.16.2

4 years ago

0.15.2

4 years ago

0.15.1

4 years ago

0.15.0

4 years ago

0.14.0

4 years ago

0.13.4

5 years ago

0.13.3

5 years ago

0.13.2

5 years ago

0.13.1

5 years ago

0.13.0

5 years ago

0.12.3

5 years ago

0.12.2

5 years ago

0.12.1

5 years ago

0.12.0

6 years ago

0.11.6

6 years ago

0.11.5

6 years ago

0.11.4

6 years ago

0.11.3

7 years ago

0.11.2

7 years ago

0.11.1

7 years ago

0.11.0

7 years ago

0.10.1

7 years ago

0.10.0

7 years ago

0.9.2

8 years ago

0.9.1

9 years ago

0.9.0

9 years ago

0.8.7

9 years ago

0.8.6

9 years ago

0.8.5

9 years ago

0.8.4

9 years ago

0.8.3

9 years ago

0.8.2

9 years ago

0.8.1

9 years ago

0.8.0

9 years ago

0.7.0

10 years ago

0.6.0

10 years ago

0.5.0

10 years ago

0.4.1

10 years ago

0.4.0

10 years ago

0.3.0

10 years ago

0.2.1

10 years ago

0.2.0

10 years ago

0.1.0

10 years ago

0.0.4

10 years ago

0.0.3

10 years ago

0.0.2

10 years ago

0.0.1

10 years ago