Skip to content
master
Switch branches/tags
Code

Latest commit

 

Git stats

Files

Permalink
Failed to load latest commit information.
Type
Name
Latest commit message
Commit time
 
 
lib
 
 
 
 
 
 
 
 
 
 
 
 

Safe Class Names

Replace escaped characters in class names and CSS selectors

Version License Build Downloads

Introduction

This plugin replaces escaped characters in class names from your <style> tags and inside class="" attributes with safe characters, that do not need CSS escaping.

For example, it replaces:

  • \: and \/ with -
  • \% with pc
  • \. with _

See the full list of replacements.

But... why?

So you can use those cool Tailwind CSS selectors in HTML emails. 😎

Escaped characters in CSS selectors or HTML class names are not supported by all email clients (currently Gmail being the biggest one), so you can use this plugin to replace them with safe alternatives.

Install

$ npm i posthtml posthtml-safe-class-names

Usage

Consider example.html:

<!DOCTYPE html>
<html>
<head>
  <style>
    .w-3\/5 {
      width: 60%;
    }
    
    /* JIT arbitrary values are also supported */
    .bg-\[\#1da1f1\] {
      background-color: #1da1f1;
    }

    @media (max-width: 600px) {
      .sm\:w-1\/2 {
        width: 50%;
      }
    }
  </style>
</head>
<body>
  <div class="w-3/5 sm:w-1/2 bg-[#1da1f1]">Lorem ipsum</div>
</body>
</html>
import {readFileSync, writeFileSync} from 'node:fs'
import posthtml from 'posthtml'
import safeClassNames from 'posthtml-safe-class-names'

const html = readFileSync('./example.html')

posthtml([
  safeClassNames()
])
  .process(html)
  .then(result => writeFileSync('./after.html', result.html))

Result:

<!DOCTYPE html>
<html>
<head>
  <style>
    .sm-w-3-5 {
      width: 60%;
    }

    .bg-_1da1f1 {
      background-color: #1da1f1;
    }

    @media (max-width: 600px) {
      .sm-w-1-2 {
        width: 50%;
      }
    }
  </style>
</head>
<body>
  <div class="w-3-5 sm-w-1-2 bg-_1da1f1">Lorem ipsum</div>
</body>
</html>

Options

replacements

The plugin accepts an options object where you can define character replacement mappings:

{
  ':': '-',
  '\/': '-',
  '%': 'pc',
  '.': '_',
  // ...
}

See the full list of replacements.

Besides adding new mappings, you can of course override the default ones.

Using the same example.html, let's choose to replace \: in our class names with __ instead of -:

posthtml([
  safeClassNames({
    replacements: {
      ':': '__',
    }
  })
])
  .process(html)
  .then(result => writeFileSync('./after.html', result.html))

Result:

<!DOCTYPE html>
<html>
<head>
  <style>
    .sm__w-3-5 {
      width: 60%;
    }

    .bg-_1da1f1 {
      background-color: #1da1f1;
    }

    @media (max-width: 600px) {
      .sm__w-1-2 {
        width: 50%;
      }
    }
  </style>
</head>
<body>
  <div class="w-3-5 sm__w-1-2 bg-_1da1f1">Lorem ipsum</div>
</body>
</html>