Last active
October 18, 2016 19:08
-
-
Save nikcorg/fc7935eda3c85f4155f4 to your computer and use it in GitHub Desktop.
Finnish hyphenation a la Haiku-editori
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// 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