Important: This documentation covers Yarn 1 (Classic).
For Yarn 2+ docs and migration guide, see yarnpkg.com.

Package detail

printable-characters

xpl6.2mUnlicense1.0.42

A little helper for handling strings containing zero width control characters, ANSI styling, whitespaces, newlines, 💩, etc.

string width, string length, real string width, real string length, optical string width, printed width, unicode, codepoints, code points, strlen, zero width, zero width symbols, zero width characters, visible characters, visible symbols, visible, invisible, invisible symbols, invisible characters, printable, printable length, printable symbols, printable characters, non-printable characters, nonprintable characters, characters, symbols, string length, real string length, string trimming, trimming, escapes, escape codes, codes, ansi escapes, tokenizing, ansi, whitespaces

readme

printable-characters

Build Status Coverage Status npm Scrutinizer Code Quality dependencies Status

A little helper for handling strings containing zero width characters, ANSI styling, whitespaces, newlines, weird Unicode 💩 symbols, etc.

Determining the real (visible) length of a string

const { strlen } = require ('printable-characters')

strlen ('foo bar') // === 7
strlen ('\u001b[106mfoo bar\u001b[49m') // === 7

Detecting blank text

const { isBlank } = require ('printable-characters')

isBlank ('foobar') // === false
isBlank ('\u001b[106m  \t  \t   \n     \u001b[49m') // === true

Obtaining a blank string of the same width

const { blank } = require ('printable-characters')

blank ('💩')          // === ' '
blank ('foo')         // === '   '
blank ('\tfoo \nfoo') // === '\t    \n   '
blank ('\u001b[22m\u001b[1mfoo \t\u001b[39m\u001b[22m')) // === '    \t'

Matching invisible characters

const { ansiEscapeCodes, zeroWidthCharacters } = require ('printable-characters')

const s = '\u001b[106m' + 'foo' + '\n' + 'bar' + '\u001b[49m'

s.replace (ansiEscapeCodes, '')     // === 'foo\nbar'
 .replace (zeroWidthCharacters, '') // === 'foobar'

Getting the first N visible symbols, preserving the invisible parts

Use for safely truncating strings to maximum width without breaking ANSI codes:

const { first } = require ('printable-characters')

const s = '\u001b[22mfoobar\u001b[22m'

first (s, 0) // === '\u001b[22m\u001b[22m'
first (s, 1) // === '\u001b[22mf\u001b[22m'
first (s, 3) // === '\u001b[22mfoo\u001b[22m'
first (s, 6) // === '\u001b[22mfoobar\u001b[22m'

Extracting the invisible parts followed by the visible ones (parsing)

const { partition } = require ('printable-characters')

partition ('')                        // [                                                     ])
partition ('foo')                     // [['',          'foo']                                 ])
partition ('\u001b[1mfoo')            // [['\u001b[1m', 'foo']                                 ])
partition ('\u001b[1mfoo\u0000bar')   // [['\u001b[1m', 'foo'],   ['\u0000', 'bar']            ])
partition ('\u001b[1mfoo\u0000bar\n') // [['\u001b[1m', 'foo'],   ['\u0000', 'bar'], ['\n', '']])

Applications

  • as-table — a simple function that prints objects as ASCII tables
  • string.bullet — ASCII-mode bulleting for the list-style data
  • string.ify — a fancy pretty printer for the JavaScript entities
  • Ololog! — a better console.log for the log-driven debugging junkies!

TODO

Handle multi-component emojis, as in this article:

assert.equal (strlen ('👩‍❤️‍💋‍👩'), 1)  // FAILING, see http://blog.jonnew.com/posts/poo-dot-length-equals-two for possible solution
assert.equal (blank ('👩‍❤️‍💋‍👩'), ' ') // FAILING, see http://blog.jonnew.com/posts/poo-dot-length-equals-two for possible solution

changelog

Recent updates