123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230 |
- /**
- * Lorem Ipsum generator.
- *
- * @author Klaxon [klaxon@veyr.com]
- * @copyright Crown Copyright 2018
- * @license Apache-2.0
- */
- /**
- * Generate lorem ipsum paragraphs.
- *
- * @param {number} length
- * @returns {string}
- */
- export function GenerateParagraphs(length=3) {
- const paragraphs = [];
- while (paragraphs.length < length) {
- const paragraphLength = getRandomLength(PARAGRAPH_LENGTH_MEAN, PARAGRAPH_LENGTH_STD_DEV);
- const sentences = [];
- while (sentences.length < paragraphLength) {
- const sentenceLength = getRandomLength(SENTENCE_LENGTH_MEAN, SENTENCE_LENGTH_STD_DEV);
- const sentence = getWords(sentenceLength);
- sentences.push(formatSentence(sentence));
- }
- paragraphs.push(formatParagraph(sentences));
- }
- paragraphs[paragraphs.length-1] = paragraphs[paragraphs.length-1].slice(0, -2);
- paragraphs[0] = replaceStart(paragraphs[0]);
- return paragraphs.join("");
- }
- /**
- * Generate lorem ipsum sentences.
- *
- * @param {number} length
- * @returns {string}
- */
- export function GenerateSentences(length=3) {
- const sentences = [];
- while (sentences.length < length) {
- const sentenceLength = getRandomLength(SENTENCE_LENGTH_MEAN, SENTENCE_LENGTH_STD_DEV);
- const sentence = getWords(sentenceLength);
- sentences.push(formatSentence(sentence));
- }
- const paragraphs = sentencesToParagraphs(sentences);
- return paragraphs.join("");
- }
- /**
- * Generate lorem ipsum words.
- *
- * @param {number} length
- * @returns {string}
- */
- export function GenerateWords(length=3) {
- const words = getWords(length);
- const sentences = wordsToSentences(words);
- const paragraphs = sentencesToParagraphs(sentences);
- return paragraphs.join("");
- }
- /**
- * Generate lorem ipsum bytes.
- *
- * @param {number} length
- * @returns {string}
- */
- export function GenerateBytes(length=3) {
- const str = GenerateWords(length/3);
- return str.slice(0, length);
- }
- /**
- * Get array of randomly selected words from the lorem ipsum wordList.
- *
- * @param {number} length
- * @returns {string[]}
- * @private
- */
- function getWords(length=3) {
- const words = [];
- let word;
- let previousWord;
- while (words.length < length){
- do {
- word = wordList[Math.floor(Math.random() * wordList.length)];
- } while (previousWord === word);
- words.push(word);
- previousWord = word;
- }
- return words;
- }
- /**
- * Convert an array of words into an array of sentences
- *
- * @param {string[]} words
- * @returns {string[]}
- * @private
- */
- function wordsToSentences(words) {
- const sentences = [];
- while (words.length > 0) {
- const sentenceLength = getRandomLength(SENTENCE_LENGTH_MEAN, SENTENCE_LENGTH_STD_DEV);
- if (sentenceLength <= words.length) {
- sentences.push(formatSentence(words.splice(0, sentenceLength)));
- } else {
- sentences.push(formatSentence(words.splice(0, words.length)));
- }
- }
- return sentences;
- }
- /**
- * Convert an array of sentences into an array of paragraphs
- *
- * @param {string[]} sentences
- * @returns {string[]}
- * @private
- */
- function sentencesToParagraphs(sentences) {
- const paragraphs = [];
- while (sentences.length > 0) {
- const paragraphLength = getRandomLength(PARAGRAPH_LENGTH_MEAN, PARAGRAPH_LENGTH_STD_DEV);
- paragraphs.push(formatParagraph(sentences.splice(0, paragraphLength)));
- }
- paragraphs[paragraphs.length-1] = paragraphs[paragraphs.length-1].slice(0, -1);
- paragraphs[0] = replaceStart(paragraphs[0]);
- return paragraphs;
- }
- /**
- * Format an array of words into a sentence.
- *
- * @param {string[]} words
- * @returns {string}
- * @private
- */
- function formatSentence(words) {
- // 0.35 chance of a comma being added randomly to the sentence.
- if (Math.random() < PROBABILITY_OF_A_COMMA) {
- const pos = Math.round(Math.random()*(words.length-1));
- words[pos] +=",";
- }
- let sentence = words.join(" ");
- sentence = sentence.charAt(0).toUpperCase() + sentence.slice(1);
- sentence += ".";
- return sentence;
- }
- /**
- * Format an array of sentences into a paragraph.
- *
- * @param {string[]} sentences
- * @returns {string}
- * @private
- */
- function formatParagraph(sentences) {
- let paragraph = sentences.join(" ");
- paragraph += "\n\n";
- return paragraph;
- }
- /**
- * Get a random number based on a mean and standard deviation.
- *
- * @param {number} mean
- * @param {number} stdDev
- * @returns {number}
- * @private
- */
- function getRandomLength(mean, stdDev) {
- let length;
- do {
- length = Math.round((Math.random()*2-1)+(Math.random()*2-1)+(Math.random()*2-1)*stdDev+mean);
- } while (length <= 0);
- return length;
- }
- /**
- * Replace first 5 words with "Lorem ipsum dolor sit amet"
- *
- * @param {string[]} str
- * @returns {string[]}
- * @private
- */
- function replaceStart(str) {
- let words = str.split(" ");
- if (words.length > 5) {
- words.splice(0, 5, "Lorem", "ipsum", "dolor", "sit", "amet");
- return words.join(" ");
- } else {
- const lorem = ["Lorem", "ipsum", "dolor", "sit", "amet"];
- words = lorem.slice(0, words.length);
- str = words.join(" ");
- str += ".";
- return str;
- }
- }
- const SENTENCE_LENGTH_MEAN = 15;
- const SENTENCE_LENGTH_STD_DEV = 9;
- const PARAGRAPH_LENGTH_MEAN = 5;
- const PARAGRAPH_LENGTH_STD_DEV = 2;
- const PROBABILITY_OF_A_COMMA = 0.35;
- const wordList = [
- "ad", "adipisicing", "aliqua", "aliquip", "amet", "anim",
- "aute", "cillum", "commodo", "consectetur", "consequat", "culpa",
- "cupidatat", "deserunt", "do", "dolor", "dolore", "duis",
- "ea", "eiusmod", "elit", "enim", "esse", "est",
- "et", "eu", "ex", "excepteur", "exercitation", "fugiat",
- "id", "in", "incididunt", "ipsum", "irure", "labore",
- "laboris", "laborum", "Lorem", "magna", "minim", "mollit",
- "nisi", "non", "nostrud", "nulla", "occaecat", "officia",
- "pariatur", "proident", "qui", "quis", "reprehenderit", "sint",
- "sit", "sunt", "tempor", "ullamco", "ut", "velit",
- "veniam", "voluptate",
- ];
|