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

foliant

v0.0.2

Published

Generator of random synthetic words or names.

Downloads

4

Readme

Description

Generator of random synthetic words or names. Port from Go. Takes sample words, analyses them, and lazily produces a set of similar derived words. Works for any language.

Packaged in a format compatible with CommonJS / Node.js and AngularJS.

Contents

Installation

CommonJS

In a shell:

npm i --save foliant
# or
npm i --save-dev foliant

In your program:

var Traits = require('foliant')

AngularJS

Assuming you have a bower-centric build system, in a shell:

bower i --save foliant
# or
bower i --save-dev foliant

In your program:

angular.module('MyGenerator', ['foliant'])
.factory('MyGenerator', ['Traits', function(Traits) {
  /* do things with Traits */
}])

foliant depends on lodash, so make sure you have window._ available. It's specified as a bower dependency, but not bundled. You might want to use main-bower-files to automatically read dependencies and organise their order.

Usage

// Examine source words and get their shared traits.
var traits = new Traits(['several', 'source', 'words'])
var gen = traits.generator()

// Print twelve random results.
for (var i = 0; i < 12; i++) {
  console.log(gen())
}

/*
woral
ordora
everdo
verdser
verand
andora
andoran
veral
sever
randser
seral
veran
*/

// Find out how many words may be derived from this sample.
var gen = traits.generator()
i = 0
while (gen()) i++
console.log(i)
// -> 213

Example with names:

// Examine source names and get their shared traits.
var traits = new Traits(['jasmine', 'katie', 'nariko', 'karen'])
var gen = traits.generator()

// Print twelve random results.
for (var i = 0; i < 12; i++) {
  console.log(gen())
}

/*
jarik
smiko
ikatik
arinat
nasmin
katie
rikatin
smikas
minena
ikatin
jasmika
rinaren
*/

// Find out how many names may be derived from this sample.
var gen = traits.generator()
i = 0
while (gen()) i++
console.log(i)
// -> 428

To run tests, clone the repo, cd to its directory, run npm i, and use:

npm test

To watch files and rerun tests while tinkering with the source, use:

npm run autotest

To run benchmarks:

node bench/index.bench.js

API Reference

Traits

The Traits class is the package's entry point.

// Transcript of the constructor, using ES5 syntax for accessibility.
function Traits(words) {
  // Minimum and maximum number of sounds.
  this.minNSounds = 0
  this.maxNSounds = 0
  // Minimum and maximum number of vowels.
  this.minNVowels = 0
  this.maxNVowels = 0
  // Maximum number of consequtive vowels.
  this.maxConseqVow = 0
  // Maximum number of consequtive consonants.
  this.maxConseqCons = 0
  // Set of sounds that occur in the words.
  this.soundSet = new StringSet()
  // Set of pairs of sounds that occur in the words.
  this.pairSet = new PairSet()

  // Replacement sound set to use instead of the default `knownSounds`.
  this.knownSounds = null
  // Replacement sound set to use instead of the default `knownVowels`.
  this.knownVowels = null

  if (words instanceof Array) this.examine(words)
}

Traits represent rudimental characteristics of a word or group of words. A traits object unequivocally defines a set of synthetic words that may be derived from it.

The constructor optionally takes existing words as input and examines them with Traits#examine(). The resulting characteristics are assigned to the newly created Traits object. Words must consist of known glyphs, as defined by the default sound sets or by custom sets assigned to a traits object (see below). If an invalid word is encountered, an error is thrown.

The optional fields knownSounds and knownVowels specify custom sets of sounds and vowels. This lets you use foliant with any character set, including non-Latin alphabets.

Traits#examine()

Analyses the given words and merges their characteristics into self.

var traits = new Traits()
traits.examine(['mountain', 'waterfall', 'grotto'])

By default, this uses the sets of known sounds and vowels defined in index.js. This includes the 26 letters of the standard US English alphabet and some common digraphs like th, which are treated as single phonemes.

However, foliant is language-independent. Assign custom knownSounds and knownVowels to teach it a sound system of your choosing. It can be Greek or Cyrillic or Elvish or Clingon — doesn't matter as long as the given sounds and vowels cover the words in your input. Refer to index.js as an example.

Here's how to teach it Greek:

var traits = new Traits()

traits.knownSounds = new Traits.StringSet([
  'α', 'β', 'γ', 'δ', 'ε', 'ζ', 'η', 'θ', 'ι', 'κ', 'λ', 'μ',
  'ν', 'ξ', 'ο', 'π', 'ρ', 'σ', 'ς', 'τ', 'υ', 'φ', 'χ', 'ψ', 'ω'
])

traits.knownVowels = new Traits.StringSet([
  'α', 'ε', 'η', 'ι', 'ο', 'υ', 'ω'
])

traits.examine(['ελ', 'διδασκω', 'ελληνικο', 'αλφαβητο'])

var gen = traits.generator()
for (var word = gen(); word != ''; word = gen()) {
  console.log(word)
}

// ιδαλφ
// κο
// ηνικο
// ...

Traits#generator()

Creates a generator function that yields a new random synthetic word on each call. The words are guaranteed to never repeat, and to be randomly distributed across the total set of possible words for these traits.

After a generator is exhausted, subsequent calls return ''.

A traits object is stateless, and generator() produces a completely new generator on each call. Generators don't affect each other.

Generators are lazy and individual calls are very fast, making foliant suitable for web clients and Node.js servers. See bench/index.bench.js.

var traits = new Traits(['goblin', 'smoke'])
var gen = traits.generator()

var words = [], word
while (word = gen()) words.push(word)

console.log(words.join(' '))

// oblin smobli smoke goblin gobli moblin mobli
// this generator is exhausted

ToDo / WIP

  • Port more tests from the Go version, particularly the randomness test.
  • In a large dataset, the last few words returned by a generator are too similar; random distribution needs improvement.
  • Consider restricting repeated triples in Traits#validComplete().