npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

ansi_up

v6.0.2

Published

Convert ansi sequences in strings to colorful HTML

Downloads

315,786

Readme

ansi_up.js

ansi_up is an easy to use library that transforms text containing ANSI color escape codes into HTML.

This module is a single ES6 Javascript file with no dependencies. It is "isomorphic" javascript. This is just another way of saying that the ansi_up.js file will work in both the browser or node.js. The js library is compiled from TypeScript and its type description ships with the NPM. This code has been used in production since 2011 and is actively maintained.

For example, turn this terminal output:

ESC[1;Foreground
 30   30   30   30   30   30   30   30  
 31   31   31   31   31   31   31   31  
 32   32   32   32   32   32   32   32  
...

...into this browser output:

Browser Example


    <script type="module" type="text/javascript">

    var txt  = "\n\n\033[1;33;40m 33;40  \033[1;33;41m 33;41  \033[1;33;42m 33;42  \033[1;33;43m 33;43  \033[1;33;44m 33;44  \033[1;33;45m 33;45  \033[1;33;46m 33;46  \033[1m\033[0\n\n\033[1;33;42m >> Tests OK\n\n"

    import { AnsiUp } from './ansi_up.js'
    var ansi_up = new AnsiUp();

    var html = ansi_up.ansi_to_html(txt);

    var cdiv = document.getElementById("console");

    cdiv.innerHTML = html;

    </script>

Node Example

    import { AnsiUp } from './ansi_up.js'
    var ansi_up = new AnsiUp();

    var txt  = "\n\n\033[1;33;40m 33;40  \033[1;33;41m 33;41  \033[1;33;42m 33;42  \033[1;33;43m 33;43  \033[1;33;44m 33;44  \033[1;33;45m 33;45  \033[1;33;46m 33;46  \033[1m\033[0\n\n\033[1;33;42m >> Tests OK\n\n"

    var html = ansi_up.ansi_to_html(txt);

More examples are in the 'examples' directory in the repo.

Typescript Example

    import { AnsiUp } from './ansi_up.js'
    const ansi_up = new AnsiUp();

    const txt  = "\n\n\x1B[1;33;40m 33;40  \x1B[1;33;41m 33;41  \x1B[1;33;42m 33;42  \x1B[1;33;43m 33;43  \x1B[1;33;44m 33;44  \x1B[1;33;45m 33;45  \x1B[1;33;46m 33;46  \x1B[1m\x1B[0\n\n\x1B[1;33;42m >> Tests OK\n\n"

    let html = ansi_up.ansi_to_html(txt);

Installation

$ npm install ansi_up

Versions

  • Version 6.0 - Switch to ES6 module. Add faint styles. Style css configurable.
  • Version 5.1 - Add italic and underline styles (@DaoDaoNoCode)
  • Version 5.0 - Security fix for OSC URLs
  • Version 4.0 - Re-architect code to support terminal URL codes.
  • Version 3.0 - now treats ANSI bold sequences as CSS font-weight:bold
  • Version 2.0 - moved to a stateful, streaming version of the API
  • Version 1.3 - was the last of the older, deprecated API.

Quick Start

  1. Use whatever module system to import the ansi_up module.
  2. Instantiate the object.
  3. For every piece of ansi escaped text string, call ansi_to_html.
  4. Append the emitted HTML to the previous HTML already emitted.
  5. DONE

API Methods and Recommended Settings

You only need the ansi_to_html method. The other properties listed below allow you to override some of the escaping behaviour. You probably don't need to change these from their default values.

It is recommended that the HTML container that holds the span tags is styled with a monospace font. A PRE tag would work just fine for this. It is also recommended that the HTML container is styled with a black background. See the examples, for more CSS theming.

ansi_to_html (txt)

This transforms ANSI terminal escape codes/sequences into SPAN tags that wrap and style the content.

This method only interprets ANSI SGR (Select Graphic Rendition) codes or escaped URL codes. For example, cursor movement codes are ignored and hidden from output.

This method also safely escapes any unsafe HTML characters.

The default style uses colors that are very close to the prescribed standard. The standard assumes that the text will have a black background. These colors are set as inline styles on the SPAN tags. Another option is to set the 'use_classes' property to true'. This will instead set classes on the spans so the colors can be set via CSS. The class names used are of the format ansi-*-fg/bg and ansi-bright-*-fg/bg where * is the colour name, i.e black/red/green/yellow/blue/magenta/cyan/white. See the examples directory for a complete CSS theme for these classes.

Properties

escape_html

(default: true)

By default, HTML's reserved characters & < > " ' are replaced with HTML entities to make them appear as literal characters in your application, rather than being interpreted as HTML structure. If you prefer keeping HTML's reserved characters untouched, you can set this to false.

use_classes

(default: false)

This causes the SPAN tags to use classes to style the SPAN tags instead of specified RGB values.

url_allowlist

(default: { 'http':1, 'https':1 })

This mapping is an 'allow' list of URI schemes that will be allowed to render HTML anchor tags.

boldStyle

(default: 'font-weight:bold')

faintStyle

(default: 'opacity:0.7')

italicStyle

(default: 'font-style:italic')

underlineStyle

(default: 'text-decoration:underline')

Buffering

In general, the ansi_to_html should emit HTML output when invoked with a non-empty string. The only exceptions are an incomplete ESC sequence or an incomplete OSC URL sequence. For those cases, the library will buffer (not emit output), until it receives input that completes those sequences.

Example of a Use Case

I have used this library to 'tail' a file.

On a remote machine, I had process generating a log file. I had a web server running on the same machine. The server hosted a simple HTML page that used AJAX to poll an object with a range query. Specifically I used an HTTP/1.1 GET request with RFC 7233 Range query. The first range query would start at 0, but then progressively move forward after new data was received.

For each new chunk of data received, I would transform the data with ansi_up, and append the new spans to the innerHTML of a PRE tag.

UTF8 note

One last important note, ansi_up takes its input in the form of a Javascript string. These strings are UTF8. When you take the output of some program and send it to Javascript, there will be buffering. Be sure that you do not send incomplete UTF8 sequences. Javascript will ignore or drop the sequence from the stream when it converts it to a string.

Building

To build, a simple Makefile handles it all.

    $ make

Running tests

To run the tests for ansi_up, run npm install to install dev dependencies. Then:

    $ make test

Credits

This code was developed by Dru Nelson (https://github.com/drudru).

Thanks goes to the following contributors for their patches: