mirror of
https://github.com/gchq/CyberChef.git
synced 2024-11-16 08:58:30 +01:00
add lorem ipsum generator
This commit is contained in:
parent
a1b161493c
commit
f2d115ee4d
3 changed files with 293 additions and 1 deletions
|
@ -375,7 +375,8 @@
|
||||||
"Parse QR Code",
|
"Parse QR Code",
|
||||||
"Haversine distance",
|
"Haversine distance",
|
||||||
"Numberwang",
|
"Numberwang",
|
||||||
"XKCD Random Number"
|
"XKCD Random Number",
|
||||||
|
"Lorem Ipsum Generator"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|
221
src/core/lib/LoremIpsum.mjs
Normal file
221
src/core/lib/LoremIpsum.mjs
Normal file
|
@ -0,0 +1,221 @@
|
||||||
|
/**
|
||||||
|
* Lorem Ipsum generator.
|
||||||
|
*
|
||||||
|
* @author Klaxon [klaxon@veyr.com]
|
||||||
|
* @copyright Crown Copyright 2016
|
||||||
|
* @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 or 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 or 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",
|
||||||
|
];
|
70
src/core/operations/LoremIpsumGenerator.mjs
Normal file
70
src/core/operations/LoremIpsumGenerator.mjs
Normal file
|
@ -0,0 +1,70 @@
|
||||||
|
/**
|
||||||
|
* @author klaxon [klaxon@veyr.com]
|
||||||
|
* @copyright Crown Copyright 2018
|
||||||
|
* @license Apache-2.0
|
||||||
|
*/
|
||||||
|
|
||||||
|
import Operation from "../Operation";
|
||||||
|
import OperationError from "../errors/OperationError";
|
||||||
|
import { GenerateParagraphs, GenerateSentences, GenerateWords, GenerateBytes } from "../lib/LoremIpsum";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Lorem Ipsum Generator operation
|
||||||
|
*/
|
||||||
|
class LoremIpsumGenerator extends Operation {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* LoremIpsumGenerator constructor
|
||||||
|
*/
|
||||||
|
constructor() {
|
||||||
|
super();
|
||||||
|
|
||||||
|
this.name = "Lorem Ipsum Generator";
|
||||||
|
this.module = "Default";
|
||||||
|
this.description = "Generate varying length lorem ipsum placeholder text.";
|
||||||
|
this.infoURL = "https://wikipedia.org/wiki/Lorem_ipsum";
|
||||||
|
this.inputType = "string";
|
||||||
|
this.outputType = "string";
|
||||||
|
this.args = [
|
||||||
|
{
|
||||||
|
"name": "Length",
|
||||||
|
"type": "number",
|
||||||
|
"value": "3"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Length in",
|
||||||
|
"type": "option",
|
||||||
|
"value": ["Paragraphs", "Sentences", "Words", "Bytes"]
|
||||||
|
}
|
||||||
|
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param {string} input
|
||||||
|
* @param {Object[]} args
|
||||||
|
* @returns {string}
|
||||||
|
*/
|
||||||
|
run(input, args) {
|
||||||
|
const [length, lengthType] = args;
|
||||||
|
if (length < 1){
|
||||||
|
throw new OperationError("Length must be greater than 0");
|
||||||
|
}
|
||||||
|
switch (lengthType) {
|
||||||
|
case "Paragraphs":
|
||||||
|
return GenerateParagraphs(length);
|
||||||
|
case "Sentences":
|
||||||
|
return GenerateSentences(length);
|
||||||
|
case "Words":
|
||||||
|
return GenerateWords(length);
|
||||||
|
case "Bytes":
|
||||||
|
return GenerateBytes(length);
|
||||||
|
default:
|
||||||
|
throw new OperationError("invalid lengthType");
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
export default LoremIpsumGenerator;
|
Loading…
Reference in a new issue