Расстановка переносов
Данный алгоритм предназначен для автоматической расстановки переносов в русских текстах. Точное его происхождение неизвестно, по сети он бродит под именем «алгоритм П. Хpистова в модификации Дымченко и Ваpсанофьева».
Словесное описание:
«х» — одна из «ьъй», «c» — согласная, «г» — гласная, «-» — вставляемый знак переноса
К тексту последовательно применяются шесть правил-замен:
- х → х-
- гг → г-г
- гссг → гс-сг
- сгсг → сг-сг
- гсссг → гс-ссг
- гссссг → гсс-ссг
Реализация на JavaScript
var RusA = "[абвгдеёжзийклмнопрстуфхцчшщъыьэюя]"; var RusV = "[аеёиоуыэю\я]"; var RusN = "[бвгджзклмнпрстфхцчшщ]"; var RusX = "[йъь]"; var Hyphen = "\xAD"; var re1 = new RegExp("("+RusX+")("+RusA+RusA+")","ig"); var re2 = new RegExp("("+RusV+")("+RusV+RusA+")","ig"); var re3 = new RegExp("("+RusV+RusN+")("+RusN+RusV+")","ig"); var re4 = new RegExp("("+RusN+RusV+")("+RusN+RusV+")","ig"); var re5 = new RegExp("("+RusV+RusN+")("+RusN+RusN+RusV+")","ig"); var re6 = new RegExp("("+RusV+RusN+RusN+")("+RusN+RusN+RusV+")","ig"); text = text.replace(re1, "$1"+Hyphen+"$2"); text = text.replace(re2, "$1"+Hyphen+"$2"); text = text.replace(re3, "$1"+Hyphen+"$2"); text = text.replace(re4, "$1"+Hyphen+"$2"); text = text.replace(re5, "$1"+Hyphen+"$2"); text = text.replace(re6, "$1"+Hyphen+"$2");
Реализация на Perl
$RusAll = "абвгдеёжзийклмнопрстуфхцчшщъыьэюя"; $RusV = "аеёиоуыэюя"; $RusN = "бвгджзклмнпрстфхцчшщ"; $RusX = "ьъй"; $Hyphen = "-"; $text =~ s/(?<=[$RusAll])([$RusX])(?=[$RusAll]{2})/\1$Hyphen/ig; $text =~ s/(?<=[$RusAll])([$RusV])(?=[$RusV][$RusAll])/\1$Hyphen/ig; $text =~ s/(?<=[$RusV])([$RusN])(?=[$RusN][$RusV])/\1$Hyphen/ig; $text =~ s/(?<=[$RusN])([$RusV])(?=[$RusN][$RusV])/\1$Hyphen/ig; $text =~ s/(?<=[$RusV])([$RusN])(?=[$RusN][$RusN][$RusV])/\1$Hyphen/ig; $text =~ s/(?<=[$RusV][$RusN])([$RusN])(?=[$RusN][$RusN][$RusV])/\1$Hyphen/ig;
Возможные проблемы в браузерах
В стандарте Unicode предусмотрен специальный символ для обозначения мягкого (т.е. отображаемого только в случае необходимости) переноса — 0x00AD (SOFT HYPHEN). Ему соответствует HTML-entity ­. Однако правильная интерпретация этого символа неоднозначна, и на данный момент только IE поддерживает такие переносы в текстах (и соответствующим образом форматирует колонки). Многие старые браузеры отображают ­ как обязательный знак дефиса. Кроме того, в IE возникают проблемы при попытке скопировать текст с переносами в буфер обмена (туда добавляются и дефисы). Способ обхода этого недостатка можно посмотреть, например, здесь: http://shy.dklab.ru/newest/.
![[logo]](/site/images/logo.jpg)