Last active
January 26, 2021 10:02
-
-
Save a-x-/423137445037f2eb832f2d8fb7823211 to your computer and use it in GitHub Desktop.
Хуификатор учитывающий почти все набросы из статьи https://alejo.livejournal.com/57859.html И тут же реализация алгоритма разбиения на слоги
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
/* | |
https://sites.google.com/site/foliantapp/project-updates/hyphenation | |
*/ | |
function hypenate (word) { | |
return _substitute(Array.from(word).reduce((res, c) => { | |
return _substitute(res) + c; | |
}, '')); | |
} | |
/* original: | |
"xgg" -> "x-gg" | |
"xgs" -> "x-gs" | |
"xsg" -> "x-sg" | |
"xss" -> "x-ss" | |
"gssssg" -> "gss-ssg" | |
"gsssg" -> "gss-sg" | |
"gsssg" -> "gs-ssg" | |
"sgsg" -> "sg-sg" | |
"gssg" -> "gs-sg" | |
"sggg" -> "sg-gg" | |
"sggs" -> "sg-gs" | |
*/ | |
var SUBST_MAP = { | |
'xgg': -2, | |
'xgs': -2, | |
'xsg': -2, | |
'xss': -2, | |
'gssssg': -2, | |
// 'gsssg': -2, | |
'gsssg': -3, | |
'sgsg': -2, | |
'gssg': -2, | |
'sggg': -2, | |
'sggs': -2, | |
}; | |
var X = 'йьъ'; | |
var G = 'аеёиоуыэюяaeiouy'; | |
var S = 'бвгджзклмнпрстфхцчшщbcdfghjklmnpqrstvwxz'; | |
function is (c, kind) { | |
return Array.from(kind).includes(c.toLowerCase()); | |
} | |
function _substitute (part) { | |
return Object.entries(SUBST_MAP) | |
.reduce((res, [trigger, hypPos]) => _encode(res).endsWith(trigger) ? _injectHypen(res, hypPos) : res, part); | |
} | |
function _encode (part) { | |
return Array.from(part).map((c) => is(c, X) && 'x' || is(c, G) && 'g' || is(c, S) && 's').join(''); | |
} | |
function _injectHypen (part, pos) { | |
const arr = Array.from(part); | |
arr.splice(pos, 0, '-'); | |
return arr.join(''); | |
} | |
// //////////////////////////////////////////////////////////////////// | |
// //////////////////////////////////////////////////////////////////// | |
// //////////////////////////////////////////////////////////////////// | |
/* | |
https://alejo.livejournal.com/57859.html — Хуефикация — дело непростое | |
*/ | |
function huefy (w) { | |
const word = w.trim(); | |
if (!word || word.includes('.')) return word; | |
// Половина слогов в начале заменяется на ху[еёия] | |
// TODO: в идеале надо заменять приставки и начало корня | |
const syllabes = hypenate(word).split('-'); | |
const midIndex = syllabes.length > 3 ? Math.ceil(syllabes.length / 2) + 1 : Math.ceil(syllabes.length / 2); | |
const secondWordPath = syllabes.slice(syllabes.length - midIndex).join(''); | |
// Если слог только один, вырезаем все согласные в начале слова и прилегающую с ним гласную | |
const rest = syllabes.length === 1 ? word.replace(new RegExp(`^[${ S }]*[${ G }]?`, 'i'), '') : secondWordPath; | |
const removed = word.replace(rest, ''); | |
const removed_ = removed.toLowerCase().replace(new RegExp(`[${ S }]+$`, 'i'), ''); | |
// TODO: в идеале буква тут должна согласовываться с ударением слова | |
const huefied = ( | |
removed_.endsWith('а') && 'хуя' || | |
removed_.endsWith('и') && 'хуи' || | |
removed_.endsWith('ы') && 'хуи' || | |
removed_.endsWith('о') && 'хуё' || | |
'хуе' | |
) + rest; | |
return _withCapitalization(huefied.replace(/^(ху[яе])х/i, '$1').replace(/^ху[ея]о/i, 'хуё'), word); | |
} | |
function _withCapitalization (part, orig) { | |
if (!part || !orig) return part; | |
if (orig[0] !== orig[0].toLowerCase()) return part[0].toUpperCase() + part.slice(1); | |
return part; | |
} | |
// //////////////////////////////////////////////////////////////////// | |
// //////////////////////////////////////////////////////////////////// | |
// //////////////////////////////////////////////////////////////////// | |
![...document.querySelectorAll('th, button span, h3')].filter((el) => typeof el.innerHTML === 'string' && Math.random() > .5).map((el) => { | |
const words = el.innerText.split(' '); | |
const [toHuefy] = words; // todo: лучше первое прилагательное/наречие или подлежащее | |
const huefied = huefy(toHuefy); | |
el.title = el.innerText; | |
el.innerText = [huefied, ...words.slice(1)].join(' '); | |
}); |
Вроде ещё где-то был костыль чтобы новости -> хуёвости
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Браузер -> хуюзер. а должно быть хуяузер