HXNORMALIZE(1)

πŸ“¦
version 8.8 Β· 2 versions
, in alpine 3.24, arch rolling, fedora 43, fedora 44, nixos 26.05, nixpkgs unstable, opensuse-leap 16.0

✨ HXNORMALIZE ✨ (section 1 of the manual, bestie)

okay so hi πŸ’– you found hxnormalize(1) β€” it's part of HTML-XML-utils, and it is literally the glow-up artist for your markup. let's get into it.


🌸 NAME 🌸

hxnormalize β€” pretty-print an HTML file πŸ’…


πŸŽ€ SYNOPSIS πŸŽ€

hxnormalize [ -x ] [ -X ] [ -e ] [ -d ] [ -s ] [ -L ] [ -i indent ] [ -l
line-length ] [ -c commentmagic ] [ file-or-URL ]

no cap, that's the whole vibe. ✨


πŸ¦‹ DESCRIPTION πŸ¦‹

so the hxnormalize command pretty-prints an HTML or XML file, and also tries to fix small HTML errors. it's giving makeover montage. 🫢

the output is the same file, but with a maximum line length and with optional indentation to indicate the nesting level of each line. same content, better outfit. periodt.


πŸ’… OPTIONS πŸ’…

The following options are supported:

  • -x β€” applies XML conventions: empty elements are written with a slash at the end (e.g., <IMG />) and, if the input is HTML, any β€˜<’ and β€˜&’ inside <style> and <script> elements are escaped as β€˜&lt;’ and β€˜&amp;’. (the input is assumed to be HTML unless the -X option is present.) Implies -e.
  • -e β€” always inserts endtags, even if HTML does not require them (for example: </p> and </li>). it's a closer, bestie. πŸ”₯
  • -X β€” makes hxnormalize assume the input is well-formed XML. it does not try to infer omitted HTML tags, does not assume elements such as <img> and <br> are empty, and does not treat β€˜<’ and β€˜&’ inside <style> and <script> as normal characters. it's in its no-nonsense era.
  • -d β€” omit the DOCTYPE from the output. bye bye πŸ‘‹
  • -i indent β€” set the number of spaces to indent each nesting level. default is 2. not all elements cause an indent. in general, elements that can occur in a block environment are started on a new line and cause an indent, but inline elements, such as EM and SPAN, do not cause an indent. (so SPAN stays cozy, it doesn't get its own line πŸ’œ)
  • -l line-length β€” sets the maximum length of lines. hxnormalize will wrap lines so that all lines are as long as possible, but no longer than this length. default is 72. words that are longer than the line length will not be broken, and will extend past this length. a β€˜word’ is a sequence of characters delimited by white space.) the content of the STYLE, SCRIPT and PRE elements will not be line-wrapped. (yes PRE gets to keep its shape, iconic of it πŸŽ€)
  • -s β€” omit <span> tags that don't have any attributes. if it's not doing anything, it's not staying. πŸ’€
  • -L β€” remove redundant β€˜lang’ and β€˜xml:lang’ attributes. (i.e., those whose value is the same as the language inherited from the parent element.) inheritance check, slay.
  • -c commentmagic β€” comments are normally placed right after the preceding text. that is usually correct for short comments, but some comments are meant to be on a separate line. commentmagic is a string and when that string occurs inside a comment, hxnormalize will output an empty line before that comment. e.g. -c "====" can be used to put all comments that contain β€˜====’ on a separate line, preceded by an empty line. by default, no comments are treated that way. πŸͺ„

🌈 OPERANDS 🌈

The following operand is supported:

  • file-or-URL β€” the name or URL of an HTML file. if absent, standard input is read instead. (so you can totally just pipe into it, bestie 🫢)

⭐ EXIT STATUS ⭐

The following exit values are returned:

  • 0 β€” successful completion. πŸŽ‰
  • > 0 β€” an error occurred in the parsing of the HTML file. hxnormalize will try to correct the error and produce output anyway. (it's not gonna leave you hanging, it's gonna fix it AND deliver πŸ˜­πŸ’–)

🧚 ENVIRONMENT 🧚

to use a proxy to retrieve remote files, set the environment variables http_proxy and ftp_proxy. e.g.,

http_proxy="http://localhost:8080/"

proxy era, we love to see it. ✨


πŸ’€ BUGS πŸ’€

ok so listen, we gotta be honest here, some of this is a little rough. not me being shady, just being real.

The error recovery for incorrect HTML is primitive. (it's trying its best πŸ™ˆ)

hxnormalize will not omit an endtag if the white space after it could possibly be significant. e.g., it will not remove the first </p> from β€˜<div><p>text</p> <p>text</p></div>’.

hxnormalize can currently only retrieve remote files over HTTP. it doesn't handle password-protected files, nor files whose content depends on HTTP β€˜cookies.’

When converting from XML to HTML (option -X without option -x), any pairs of <![CDATA[ and β€˜]]>’ are removed and character entities &lt; &gt; &quot; &apos; and &amp; are expanded (to β€˜<’, β€˜>’, β€˜"’, β€˜'’ and β€˜&’, respectively), but any other character entities are not expanded. to expand other character entities, pipe the input through hxunent(1) first. πŸ”₯

To limit lines to a given number of characters, hxnormalize breaks lines at spaces (or inside tags). some writing systems do not use spaces between words and thus hxnormalize may not be able to break lines, except at already existing line breaks. 😭

To make short lines longer, hxnormalize will combine lines and replace a line break by a space, except in writing systems that do not put spaces between words, where the line break is replaced by nothing. hxnormalize currently only does the latter for Japanese, Chinese, Korean, Khmer and Thai. (the text must be correctly marked up with β€˜lang’ or β€˜xml:lang’.) πŸ¦‹


πŸ‘‘ SEE ALSO πŸ‘‘

asc2xml(1), xml2asc(1), hxunent(1), UTF-8 (RFC 2279)

go read those next bestie, it's a whole universe πŸ’œ


and that's the page!! this one's from HTML-XML-utils, version 7.x, dated 10 Jul 2011 β€” yeah she's vintage but she still ate πŸ’…βœ¨ no cap. bye bestie, go normalize something πŸŽ€πŸ«Ά