Skip to content

Instantly share code, notes, and snippets.

@nikcorg
Last active October 18, 2016 19:08
Show Gist options
  • Save nikcorg/fc7935eda3c85f4155f4 to your computer and use it in GitHub Desktop.
Save nikcorg/fc7935eda3c85f4155f4 to your computer and use it in GitHub Desktop.
Finnish hyphenation a la Haiku-editori
// Paraphrased from http://teppo.tv/haikueditori/haikueditori.js
var rVowels = /[aeiouyåäö]/i;
var rConsonants = /[bcdfghjklmnpqrstvwxz]/i;
var rDiphthongs = /(aa|ee|ii|oo|uu|yy|åå|ää|öö|ai|ei|oi|ui|yi|åi|äi|öi|au|eu|iu|ou|äy|öy|ie|uo|yö|ey|iy)/i;
function isVowel(chr) {
return rVowels.test(chr);
}
function isConsonant(chr) {
return rConsonants.test(chr);
}
function isDiphthong(str) {
return rDiphthongs.test(str);
}
function hyphenate(word, separator) {
var charsIn = ("!" + word + "!").split(""), charsOut = [];
var i = 1, l = charsIn.length - 2;
var twoBehind, oneBehind, cursor, oneAhead;
for (; i < l; i += 1) {
twoBehind = charsIn[i - 1];
oneBehind = charsIn[i];
cursor = charsIn[i + 1];
oneAhead = charsIn[i + 2];
charsOut.push(oneBehind);
// 1. Konsonanttisääntö: Jos tavuun kuuluvaa vokaalia seuraa yksi
// tai useampia konsonantteja, joita vielä seuraa vokaali, tavuraja
// sijoittuu välittömästi ennen viimeistä konsonanttia.
if (isConsonant(cursor) && isVowel(oneAhead) && charsOut.slice(0).reverse().some(isVowel)) {
return charsOut.concat(separator, hyphenate(charsIn.slice(i + 1, -1).join(""), separator)).join("");
}
// 2. Vokaalisääntö: Jos tavun ensimmäistä vokaalia seuraa toinen vokaali,
// niiden väliin tulee tavuraja, ellei
// a) edellinen vokaali ole sama kuin jälkimmäinen (pitkä vokaali).
// b) jälkimmäinen vokaali ole i (i:hin loppuva diftongi).
// c) kysymyksessä ole jokin vokaalipareista au, eu, ie, iu, ou, uo, yö, äy, öy, ey tai iy (muu diftongi).
if (isVowel(oneBehind) && isVowel(cursor) && ! isDiphthong(oneBehind + cursor)) {
return charsOut.concat(separator, hyphenate(charsIn.slice(i + 1, -1).join(""), separator)).join("");
}
// 3. Diftongisääntö: Jos tavun kuuluvaa diftongia tai pitkää vokaalia
// seuraa vokaali, tähän väliin tulee aina tavuraja.
if (isVowel(cursor) && isDiphthong(twoBehind + oneBehind)) {
return charsOut.concat(separator, hyphenate(charsIn.slice(i + 1, -1).join(""), separator)).join("");
}
}
return word;
}
function fi(input, separator) {
separator = separator || "-";
return input.match(/[^ ]+/g).map(function (word) {
return word.match(/[^-]+/g).map(function (word) {
return hyphenate(word, separator);
}).join("-");
}).join(" ");
};
if (typeof module !== "undefined" && module.exports) {
module.exports = fi;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment