5.0.4 • Published 1 year ago

xhtml2slim v5.0.4

Weekly downloads
-
License
MIT
Repository
github
Last release
1 year ago

Credit

This package is a derivative/fork of xhtml2pug, created by dimensi. I simply modified it to generate compliant Slim code (which is very similar to Pug) from HTML that heavily utilizes TailwindCSS classes. Traditional converters have not been updated in some time to be able to handle a lot of TailwindCSS class names as they contain various special charcters such as [:, /] to name a few. This tool fixes that by moving away from the dot notated CSS h1#myTitle.text-neutral-800.dark:text-neutral-100 foo classes (which tend to throw off the Slim language processor) to inline CSS classes h1#myTitle[class="text-neutral-800 dark:text-neutral-100"] foo. I'm a heavy user of both Ruby Slim rendering engine and TailwindCSS and tool allows me to move at the speed of light when it comes to converting HTML code to Slim.

xhtml2slim

Converts HTML and Vue like syntax to Slim or Pug templating language.
Requires Node.js version 14 or higher.

Using the following command (take note of the -w square attribute wrapper flag):

xhtml2slim -w square < example.html

Turns this:

<!DOCTYPE html>
<html lang="en">
  <head>
    <title>Hello World!</title>
  </head>
  <body class="bg-neutral-100 dark:bg-neutral-800 group/home:body">
    <div id="content" class="text-neutral-800 dark:text-neutral-100">
      <h1 id="myTitle" class="title">Hello World!</h1>
    </div>
  </body>
</html>

Into this:

doctype html
html[lang='en']
  head
    title Hello World!
   body[class="bg-neutral-100 dark:bg-neutral-800 group/home:body"]
    #content[class="text-neutral-800 dark:text-neutral-100"]
      h1#myTitle.title Hello World!

Install

Get it on npm:

npm install -g xhtml2slim

Usage

CLI

Accept input from a file or stdin and write to stdout:

# choose a file
xhtml2slim -w square < example.html

# use pipe
echo '<h1 id="myTitle" class="text-neutral-800 dark:text-neutral-100">foo</h1>' | xhtml2slim -w square -f
# yields
h1#myTitle[class="text-neutral-800 dark:text-neutral-100"] foo

Write output to a file:

xhtml2slim -w square < example.html > example.slim

See xhtml2slim --help for more information. The -w aka attrWrapper is the key differentiator between xhtml2pug and this package. It accepts curly, round, and square attribute wrappers to be able to wrap your tags with the appropriate style of brackets. This makes it useful outside of the scope of my personal use case.

Programmatically

import { convert } from "xhtml2slim";

const html = '<header><h1 class="title">Hello World!</h1></header>';
const slim = convert(html, { symbol: "\t" });

Cli Options

  -b, --bodyLess      Don't wrap into html > body      [boolean] [default: true]
  -t, --tabs          Use tabs as indent              [boolean] [default: false]
  -s, --spaces        Number of spaces for indent          [number] [default: 2]
  -a, --attrComma     Commas in attributes            [boolean] [default: false]
  -e, --encode        Encode html characters           [boolean] [default: true]
  -q, --doubleQuotes  Use double quotes for attributes [boolean] [default: true]
  -i, --inlineCSS     Place all classes in class attribute
                                                       [boolean] [default: true]
  -c, --classesAtEnd  Place all classes after attributes
                                                      [boolean] [default: false]
  -w, --attrWrapper   Wrap attributes in round brackets
               [string] [choices: "curly", "round", "square"] [default: "round"]
  -p, --parser        html for any standard html, vue for any vue-like html
                             [string] [choices: "html", "vue"] [default: "html"]

Api Options

export interface PublicOptions {
  /** Don't wrap into html > body */
  bodyLess: boolean;
  /** Commas in attributes */
  attrComma: boolean;
  /**  Encode html characters */
  encode: boolean;
  /** Use double quotes for attributes */
  doubleQuotes: boolean;
  /** Place all classes in class attribute */
  inlineCSS: boolean;
  /** Symbol for indents, can be anything */
  symbol: string;
  /** Wrapper for attributes: curly{}, default:round(), square[] */
  attrWrapper: "curly" | "round" | "square";
  /** Html for any standard html, vue for any vue-like html */
  parser: "html" | "vue";
  /** Place all classes after attributes */
  classesAtEnd: boolean;
}