Nondigestible Purple Mayonnaise

    printable-characters

    1.0.42 • Public • Published

    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

    Install

    npm i printable-characters

    DownloadsWeekly Downloads

    81,107

    Version

    1.0.42

    License

    Unlicense

    Unpacked Size

    192 kB

    Total Files

    13

    Last publish

    Collaborators

    • xpl