Skip to content

Commit

Permalink
feat(paragraph): Support paragraphs and sentences
Browse files Browse the repository at this point in the history
  • Loading branch information
justinvdm committed Apr 30, 2020
1 parent a68a3d2 commit ab2e6dd
Show file tree
Hide file tree
Showing 8 changed files with 271 additions and 56 deletions.
2 changes: 2 additions & 0 deletions index.js
Expand Up @@ -7,5 +7,7 @@ exports.int = require('./int')
exports.float = require('./float')
exports.word = require('./word')
exports.words = require('./words')
exports.sentence = require('./sentence')
exports.paragraph = require('./paragraph')
exports.bool = require('./bool')
exports.datestr = require('./datestr')
2 changes: 2 additions & 0 deletions index.mjs
Expand Up @@ -7,5 +7,7 @@ export { default as int } from './int'
export { default as float } from './float'
export { default as word } from './word'
export { default as words } from './words'
export { default as sentence } from './sentence'
export { default as paragraph } from './paragraph'
export { default as bool } from './bool'
export { default as datestr } from './datestr'
8 changes: 7 additions & 1 deletion internal/fit.js
@@ -1,4 +1,10 @@
module.exports = function fit(v, lo, hi) {
lo = lo || 0
return hi == null ? v + lo : (v % (hi + 1 - lo)) + lo

if (hi == null) {
return v + lo
}

hi = Math.max(hi, lo)
return (v % (hi + 1 - lo)) + lo
}
40 changes: 40 additions & 0 deletions paragraph.js
@@ -0,0 +1,40 @@
var hash = require('./hash')
var conj = require('./internal/conj')
var fit = require('./internal/fit')
var defaults = require('./internal/defaults')
var sentence = require('./sentence')

var DEFAULT_MIN_SENTENCES = 4
var DEFAULT_MAX_SENTENCES = 5

function paragraph(input, opts) {
opts = opts || 0
var minSentences = defaults(opts.minSentences, DEFAULT_MIN_SENTENCES)
var maxSentences = defaults(opts.maxSentences, DEFAULT_MAX_SENTENCES)

var id = hash(input)
var n = fit(id, minSentences, maxSentences)
var i = 0
id = hash([id, 'paragraph', i])

var result = sentence(id, opts)

while (++i < n) {
id = hash([id, 'paragraph', i])
result += ' ' + sentence(id, opts)
}

return result
}

paragraph.options = function paragraphOptions(opts) {
var base = this
paragraphFn.options = paragraph.options
return paragraphFn

function paragraphFn(input, overrides) {
return base(input, conj(opts, overrides))
}
}

module.exports = paragraph
55 changes: 55 additions & 0 deletions sentence.js
@@ -0,0 +1,55 @@
var hash = require('./hash')
var conj = require('./internal/conj')
var fit = require('./internal/fit')
var defaults = require('./internal/defaults')
var words = require('./words')

var DEFAULT_MIN_CLAUSES = 1
var DEFAULT_MAX_CLAUSES = 2
var DEFAULT_MIN_SYLLABLES = 1
var DEFAULT_MIN_WORDS = 5
var DEFAULT_MAX_WORDS = 8

function sentence(input, opts) {
opts = opts || 0
var minSyllables = defaults(opts.minSyllables, DEFAULT_MIN_SYLLABLES)
var minWords = defaults(opts.minWords, DEFAULT_MIN_WORDS)
var maxWords = defaults(opts.minWords, DEFAULT_MAX_WORDS)
var minClauses = defaults(opts.minClauses, DEFAULT_MIN_CLAUSES)
var maxClauses = defaults(opts.maxClauses, DEFAULT_MAX_CLAUSES)

var id = hash(input)
var n = fit(id, minClauses, maxClauses)
var i = 0
id = hash([id, 'sentence', i])

var firstOpts = conj(opts, {
capitalize: true,
minWords: minWords,
maxWords: maxWords,
minSyllables: minSyllables
})

var restOpts = conj(firstOpts, { capitalize: false })

var result = words(id, firstOpts)

while (++i < n) {
id = hash([id, 'sentence', i])
result += ', ' + words(id, restOpts)
}

return result + '.'
}

sentence.options = function sentenceOptions(opts) {
var base = this
sentenceFn.options = sentence.options
return sentenceFn

function sentenceFn(input, overrides) {
return base(input, conj(opts, overrides))
}
}

module.exports = sentence

0 comments on commit ab2e6dd

Please sign in to comment.