From c9b015ec2b757f0e698c43d846f9fbff5bb2651a Mon Sep 17 00:00:00 2001 From: Mathijs Bernson Date: Fri, 31 Jan 2025 18:57:07 +0100 Subject: [PATCH 1/2] Expand emoji detection to detect Slack emojis --- haiku.js | 11 +++++++++-- haiku.test.js | 24 +++++++++++++++++++++++- 2 files changed, 32 insertions(+), 3 deletions(-) diff --git a/haiku.js b/haiku.js index d7ff9ad..99dc020 100644 --- a/haiku.js +++ b/haiku.js @@ -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: [] }; @@ -90,4 +96,5 @@ module.exports = { tryAndMakeHaiku: tryAndMakeHaiku, expandMessage: expandMessage, formatMessage: formatMessage, + isEmoji: isEmoji, }; \ No newline at end of file diff --git a/haiku.test.js b/haiku.test.js index 32d037c..c6b5140 100644 --- a/haiku.test.js +++ b/haiku.test.js @@ -44,4 +44,26 @@ invalidHaikus.forEach((haiku) => { expect(possibleHaiku).toBeUndefined(); }); -}) \ No newline at end of file +}); + +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(); + }); +}); From 15d0b45b104d4e2c81cd01ab2fe4ed6244db2cb1 Mon Sep 17 00:00:00 2001 From: Mathijs Bernson Date: Fri, 31 Jan 2025 18:58:08 +0100 Subject: [PATCH 2/2] Update test to use parametrisation --- haiku.test.js | 58 +++++++++++++++++++++++++-------------------------- 1 file changed, 28 insertions(+), 30 deletions(-) diff --git a/haiku.test.js b/haiku.test.js index c6b5140..0e3d24b 100644 --- a/haiku.test.js +++ b/haiku.test.js @@ -1,33 +1,25 @@ 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); @@ -35,10 +27,16 @@ validHaikus.forEach((haiku) => { 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);