Coder Social home page Coder Social logo

gulp-posthtml's Introduction

NPM Tests Coverage Standard Code Style

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

Name Status Description
posthtml-parser npm Parser HTML/XML to PostHTMLTree
posthtml-render npm Render 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>

⚠️ 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

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
$ 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)
Name Status Description
posthtml-pug npm Pug Parser
sugarml npm SugarML Parser

Plugins

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

Maintainers


Ivan Demidov

Ivan Voischev

Contributors

Backers

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

gulp-posthtml's People

Contributors

dependabot[bot] avatar guerrero avatar michael-ciniawsky avatar qard avatar scrum avatar shvaikalesh avatar silvenon avatar thedancingcode avatar voischev avatar yustnip avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar

gulp-posthtml's Issues

Malformed HTML generated

gulp-posthtml runs with no errors but generates malformed HTML only in Ubuntu

Details

I use gulp-posthtml in my Polymer project to strip the CSS from a component and apply autoprefixer, like this

...
.pipe(gulpif(/\.html$/, postHtml([postHtmlPostCss([autoprefixer('last 2 versions')])])))
...

On MacOS 10.13.2 everything works perfectly. But if I run exactly the same on a Jenkins setup I have detected that gulp-posthtml generates some malformed HTML:

The original part of the code (part of an iron-ajax call)
body='{"start":[[startingItem]], "count":[[itemsPerPage]], "query": "[[query]]"}'

The part of the code generated on MacOS (html works)
body="{&quot;start&quot;:[[startingItem]], &quot;count&quot;:[[itemsPerPage]], &quot;query&quot;: &quot;[[query]]&quot;}"

The code generated by Jenkins (on an Ubuntu 16)
body="{" start":[[startingitem]],="" "count":[[itemsperpage]],="" "query":="" "[[query]]"}"=""

Notice the space added before start and the ="" in several positions

Environment

MacOS environment

OS node npm/yarn package
MacOS 10.13.2 8.10.0 5.6.0 3.0.0

Jenkins environment

OS node npm/yarn package
Ubuntu 16 8.10.0 5.6.0 3.0.0

v2.0.0

@voischev npm publish please :)

  • Update dotfiles
  • Update README.md
  • Update posthtml to v0.9.1 (options.parser)
  • Add tests
  • Add posthtml-load-config ( posthtml.config.js ) => Autoload Config relative to dirname(file.path)

Problems setting the Options object

I'm working with email templates, which have to be in XHTML, so I need closing slashes on single tags.

However, when I set the options object:

var options = { closingSingleTag: 'slash' }

and use it:

.pipe(posthtml(plugins, options))

all my closing slashes are still removed. I raised and later closed an issue with PostHTML regarding this — it's not caused by PostHTML since its unit tests prove the settings do work.

I don't see any unit tests covering settings actually working.

Can somebody investigate, is it actually possible to set the closingSingleTag in gulp-posthtml?

thank you.

add result.messages

Pass result.messages = [ { 'type': 'error', error: 'message'}, ...] to gulp-util (Gulp)

Example with plugins and options is not working

Details

I failed to get gulp-posthtml running in a project where I had posthtml-include and posthtml-expressions already working with Parcel, Vite and as NPM scripts testcases. But I had to go back to good old gulp.

So I created a test repo with the example gulpfile.js and made commits named with the errors. After switching from import to require, removing options and plugins the file was created in dest.

Error (Logs|Stacks)

  • SyntaxError: Cannot use import statement outside a module
  • Error: Cannot parse character "<" at 1:1
  • tree.parser is not a function

Reproduction (Code)

$ git clone https://github.com/mattweb/gulp-posthtml-test

Environment

OS node npm package
macOS 12.3.1 18.0.0 8.6.0 3.0.5

Many thanks in advance!

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.