Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 9 additions & 2 deletions haiku.js
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Currently, emojis are considered to be a single-syllable word. Should we filter out the emoji entirely instead?

function expandMessage(msg) {
  return msg
    .split(/\s+/)
    .filter((x) => x.length > 0 && x != "\u200B")
    .filter((x) => !isEmoji(x));
}

Original file line number Diff line number Diff line change
Expand Up @@ -63,11 +63,17 @@ function takeNSyllablesFromList(list, n) {
return recurse(list, [], 0);
}

const emoji = /:.*:/;
const accentedCharacters = "àèìòùÀÈÌÒÙáéíóúýÁÉÍÓÚÝâêîôûÂÊÎÔÛãñõÃÑÕäëïöüÿÄËÏÖÜŸçÇߨøÅ寿œ";
const slackEmoji = new RegExp("^:[\\w\\d-_" + accentedCharacters + "]+:$");
const emoji = /^\p{Emoji}$/u;
const punctuation = /(-|–|'|"|:|;)/;

function isEmoji(word) {
return slackEmoji.test(word) || emoji.test(word);
}

function getSyllables(word) {
if (emoji.test(word)) {
if (isEmoji(word)) {
return { word: word, syllables: [word] };
} else if (punctuation.test(word)) {
return { word: word, syllables: [] };
Expand All @@ -90,4 +96,5 @@ module.exports = {
tryAndMakeHaiku: tryAndMakeHaiku,
expandMessage: expandMessage,
formatMessage: formatMessage,
isEmoji: isEmoji,
};
82 changes: 51 additions & 31 deletions haiku.test.js
Original file line number Diff line number Diff line change
@@ -1,47 +1,67 @@
const haikubot = require('./haiku');

// Sources:
// - https://www.robinkerkhof.nl/poezie/haiku/haiku-gedichten/
// - https://nl.wikipedia.org/wiki/Haiku_(dichtvorm)
const validHaikus = [
"Een bliksemschicht flitst, en een purperreiger schreeuwt in de duisternis.",
"Een bliksemschicht flitst, en een purperreiger :scream_cat: in de duisternis.",
"In het morgenrood op de tip van het graanblad de rijp van voorjaar.",
"Velden geel koolzaad de maan staat in het oosten de zon in westen.",
"Dikke huisjesslak, ook jij beklimt de Fuji – maar langzaam, langzaam.",
"Ach oude vijver, de kikkers springen erin - geluid van water.",
"door zomerregens zijn de kraanvogelpoten korter geworden",
"Twitterende kwal, Kwetteren is wat je zal, Maar niet in mijn nest.",
"na de plechtigheid. tientallen handen schudden. geen naam onthouden",
"het druppelen van een waterkraan beklemtoont de stilte in huis",
"Denk je nou echt dat je de haiku bot kan fop? Stomme guido san",
"Animaties kan ik nog in meekomen, maar die scrolljacking :cry:",
"zou ik ze pakken, de witvis in 't wier bijeen, dan schoten ze weg",
];
function log() {}

const invalidHaikus = [
"jaap ​ hij ​ is ​ stuk ​ alles ​ is een haiku zie je", // Contains unicode zero width spacers ("\u200B")
"Laag over de spoorlijn vliegen de wilde ganzen door maan beschenen.",
];

function log() { }

validHaikus.forEach((haiku) => {
test(`'${haiku}' is a valid haiku.`, () => {
describe(`Valid haikus`, () => {
// Sources:
// - https://www.robinkerkhof.nl/poezie/haiku/haiku-gedichten/
// - https://nl.wikipedia.org/wiki/Haiku_(dichtvorm)
const validHaikus = [
"Een bliksemschicht flitst, en een purperreiger schreeuwt in de duisternis.",
"In het morgenrood op de tip van het graanblad de rijp van voorjaar.",
"Velden geel koolzaad de maan staat in het oosten de zon in westen.",
"Dikke huisjesslak, ook jij beklimt de Fuji – maar langzaam, langzaam.",
"Ach oude vijver, de kikkers springen erin - geluid van water.",
"door zomerregens zijn de kraanvogelpoten korter geworden",
"Twitterende kwal, Kwetteren is wat je zal, Maar niet in mijn nest.",
"na de plechtigheid. tientallen handen schudden. geen naam onthouden",
"het druppelen van een waterkraan beklemtoont de stilte in huis",
"Denk je nou echt dat je de haiku bot kan fop? Stomme guido san",
"zou ik ze pakken, de witvis in 't wier bijeen, dan schoten ze weg",
];
it.each(validHaikus)("'%s' is a valid haiku", (haiku) => {
const words = haikubot.expandMessage(haiku);
const possibleHaiku = haikubot.tryAndMakeHaiku(words, log);

expect(possibleHaiku).toBeDefined();
expect(typeof possibleHaiku).toEqual('object'); // Array
expect(possibleHaiku.length).toEqual(3); // Three word groups
});
})
});

invalidHaikus.forEach((haiku) => {
test(`'${haiku}' is not a valid haiku.`, () => {
describe(`Invalid haikus`, () => {
const invalidHaikus = [
"jaap ​ hij ​ is ​ stuk ​ alles ​ is een haiku zie je", // Contains unicode zero width spacers ("\u200B")
"Laag over de spoorlijn vliegen de wilde ganzen door maan beschenen.",
"Een bliksemschicht flitst, en een purperreiger :scream_cat: in de duisternis.",
"Animaties kan ik nog in meekomen, maar die scrolljacking :cry:",
];
it.each(invalidHaikus)("'%s' is not a valid haiku", (haiku) => {
const words = haikubot.expandMessage(haiku);
const possibleHaiku = haikubot.tryAndMakeHaiku(words, log);

expect(possibleHaiku).toBeUndefined();
});
})
});

describe(`Valid emojis`, () => {
const emojis = [
":writing_hand:", ":cherry_blossom:", ":scream_cat:",
":1000-9138:", ":björkloven:", ":bitterballen-party:", ":aliensguy-8174:",
":1337:", ":1337-pride:"
];
it.each(emojis)("'%s' is a valid emoji", (emoji) => {
expect(haikubot.isEmoji(emoji)).toBeTruthy();
});
});

describe(`Invalid emojis`, () => {
const notEmojis = [
":writing_hand", "writing_hand:", "writing_hand", "writing_hand", "writing_hand", "writing_hand",
"Hey: I thought.:", "What: is: this:?", "This is a sentence with a :emoji: in it", "This is a sentence with a :emoji: in it",
":foo bar:", ":foo", "bar:", "Hello", "World", "word", "w0rd", "1234",
];
it.each(notEmojis)("'%s' is not a valid emoji", (emoji) => {
expect(haikubot.isEmoji(emoji)).toBeFalsy();
});
});