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

@mojule/string-node

v0.2.6

Published

Tree nodes where the value is a string

Downloads

7

Readme

string-node

A package for trees where the node values are strings

npm install @mojule/string-node

const StringNode = require( '@mojule/string-node' )

const root = Node( 'Root' )
const child = Node( 'Child' )

root.appendChild( child )

Exactly the same as Node except that it enforces the value being a string (via String( value ) ) and has two static methods, stringify and parse

StringNode.stringify( str )

Creates a string representation of the tree. EOL characters within string nodes are normalized to \n and escaped.

The example data used, as raw nodes

const nodeUtils = require( '@mojule/node-utils' )
const StringNode = require( '@mojule/string-node' )
const data = require( './test/fixtures/biology.json' )

const { deserialize } = nodeUtils

const tree = deserialize( StringNode, data )

console.log( StringNode.stringify( tree ) )
Animalia
  Chordate
    Mammal
      Primate
        Hominidae
          Homo
            Sapiens
              Human
        Pongidae
          Pan
            Troglodytes
              Chimpanzee
      Carnivora
        Felidae
          Felis
            Domestica
              House Cat
            Leo
              Lion
  Arthropoda
    Insect
      Diptera
        Muscidae
          Musca
            Domestica
              Housefly

StringNode.parse

The default behaviour is to take a tree as a string in the format outlined above and returns a root node with child nodes nested as appropriate.

  • root must have no indent.
  • will throw if there is more than one root or nesting doesn't make sense.
  • tabs are converted to two spaces.
  • EOL within strings is expected to be escaped, eg \n rather than a literal EOL.
  • empty lines are ignored unless the option retainEmpty is passed, see below.

If the deserializeMultiple : true option is set there may be multiple roots in the passed string. Returns an array of root nodes with child nodes nested as appropriate.

const data = `
Root
  Child 1
    Grandchild 1
  Child 2
    Grandchild 2
`

const root = StringNode.parse( data )

// 'Root'
console.log( root.value )

const child = root.firstChild

// 'Child'
console.log( child.value )

// etc.

options

You can pass an optional options parameter. By default it is:

{
  "retainEmpty": false
}

Even with retainEmpty set to true, any leading empty lines are removed, as they cannot have a parent to be added to.

Empty lines between non-empty lines are added at the same level as the next non-empty line.

Empty lines at the end of the data are added at the same level as the previous non-empty line.

The value property of an empty node will be an empty string.

const data = `

Root

  Child 1

    Grandchild 1
  Child 2
    Grandchild 2

`

const root = StringNode.parse( data, { retainEmpty: true } )

console.log( StringNode.stringify( root ).replace( / /g, '.' ) )
Root
..
..Child.1
....
....Grandchild.1
..Child.2
....Grandchild.2
....
....

License

MIT