Skip to content

Instantly share code, notes, and snippets.

@a-x-
Last active January 26, 2021 10:02
Show Gist options
  • Save a-x-/423137445037f2eb832f2d8fb7823211 to your computer and use it in GitHub Desktop.
Save a-x-/423137445037f2eb832f2d8fb7823211 to your computer and use it in GitHub Desktop.
Хуификатор учитывающий почти все набросы из статьи https://alejo.livejournal.com/57859.html И тут же реализация алгоритма разбиения на слоги
/*
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(' ');
});
@socketpair
Copy link

Браузер -> хуюзер. а должно быть хуяузер

@socketpair
Copy link

Вроде ещё где-то был костыль чтобы новости -> хуёвости

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment