LINUX.ORG.RU

Автоматические переносы слов по слогам в статьях

 , , , ,


0

1

Если тегу html задать lang=«ru», то с помощью CSS можно произвольным контейнерам задавать перенос слов по слогам.

— Благо, русский поддерживается почти всеми бровзерами на 100%.

Можно даже сделать галку, чтобы отключать класс переноса слов для тегов-контейнеров статей, чтобы автор имел контроль.

Мне представляется это хорошей идеей. Какие аргументы «против»??

★★

Я не против. Давно активно использую на своих сайтах.

Только смысл в этом есть исключительно вкупе с text-align: justify. С просто left оно чужеродно и ненужно.

CrX ★★★★★
()
Ответ на: комментарий от Set440

И ещё, если уж делать, то ещё надо после коротких предлогов и союзов автоматом пробел заменять на неразрываный. Без этого не так красиво смотрится (см. букву «и» на конце первой строки например). Если сделать и это, то получается хорошо.

CrX ★★★★★
()
Ответ на: комментарий от CrX

А синеволосый Натальич давно об этом говорил — поддерживаю. Кстати, давным давно (уже лет 15 как) для своей CMS написал обработчик текстов статей при их сохранении, чтобы вставляло   в нужных местах.

deep-purple ★★★★★
()
Последнее исправление: deep-purple (всего исправлений: 2)
Ответ на: комментарий от CrX

Не вижу никакой проблемы в том что там перенос строки после «и», а не до. «И» действует симметрично в обе стороны, и какую из них отделить на другую строку значения не имеет.

firkax ★★★★★
()
Ответ на: комментарий от firkax

Читать так сложнее, когда короткий предлог или союз оторван от следующего за ним слова. Мне сложно судить, сколько в этом реально объективной удобочитаемости для всех, а сколько это дело привычки (в профессионально свёрстанных изданиях вроде книг, газет, журналов и т.п. есть типографская традиция, не допускающая таких «висячих» предлогов и союзов), но как минимум для человека, много читающего, это выглядит немного некомфортно. Особенно если используется выравнивание по ширине и переносы. При этом человек даже может не осознавать, что именно ему не нравится, но ощущение «что-то не так, читать неудобно» будет.

CrX ★★★★★
()
Ответ на: комментарий от CrX

Когда оторван от предыдущего - ровно та же проблема. И вообще, перенос строки всегда что-то от чего-то разрывает, давайте всё в одну строчку писать. Хотя, после точки можно разрешить, всё-таки разные предложения.

Так что, думаю, это всё-таки твоё личное восприятие, у меня например такого нет.

Вот когда между «не» и следующим словом перенос это уже другое: «не» действует только вперёд (вправо) и толку от соединения его с предыдущими словами намного меньше, чем со следующим. И ещё какие-то такие случаи есть, я их не помню сходу. Но не «и» и не «или» в качестве союзов.

firkax ★★★★★
()
Ответ на: комментарий от firkax

Когда оторван от предыдущего - ровно та же проблема.

Нет, не та же. Так уж устроены языки, что предлоги и (в чуть меньшей степени) союзы связаны именно со следующим за ними словом, а не с предыдущим. И по смыслу и по произношению.

Вот когда между «не» и следующим словом перенос это уже другое: «не» действует только вперёд (вправо) и толку от соединения его с предыдущими словами намного меньше, чем со следующим.

Верно, с «не» это заметно сильнее всего. С «ни» тоже. С предлогами вроде «в», «к», «на», «с» — чуть поменьше, тоже очень заметно. С союзами вроде «и» и «или» в меньшей степени. Не очень удачно получилось в примере на скриншоте, что попалось именно «и» в последней статье, с «в» или тем более «не» пример был бы нагляднее.

Так что, думаю, это всё-таки твоё личное восприятие, у меня например такого нет.

Точно не только моё. Оно общее для людей, достаточно много читающих. Хотя и среди них есть те, кому пофиг. В любом случае, это правила типографики, все книжки, газеты и журналы верстаются так. Я могу допустить, что здесь во многом дело привычки, а не только объективной удобочитаемости. Но в конце концов то, что мы не пишем всё капсом и не ставим в начале предложения маленькую букву, тоже много именно от привычки — мы просто привыкли читать именно так. Вот то же самое и с «висячими» предлогами/союзами, хотя интернет и немного размыл рамки того, что воспринимается как acceptable.

upd: В примере на скриншоте, кстати, во втором и третьем абзацев как раз «в» есть ;)

CrX ★★★★★
()
Последнее исправление: CrX (всего исправлений: 2)
Ответ на: комментарий от CrX

/**
 * Добавляет неразрывные пробелы к русским предлогам, союзам, сокращениям и частицам.
 *
 * @param string $text          Входной текст
 * @param bool   $useHtmlNbsp   true  = использовать " "
 *                              false = использовать U+00A0 (символ NBSP)
 *
 * @return string
 */
function ru_nbsp_typograf(string $text, bool $useHtmlNbsp = true): string
{
    // Неразрывный пробел и тире
    $nbsp  = $useHtmlNbsp ? ' ' : "\u{00A0}";
    $mdash = $useHtmlNbsp ? '—' : '—';

    // ── 1) Устойчивые обороты, сокращения, тире ────────────────────
    //    (без предлогов/союзов — их обрабатываем отдельно ниже)
    $search = [
        // 1) Устойчивые обороты (строчные)
        ' т. е.',
        ' т.е.',
        ' т. к.',
        ' т.к.',
        ' т. о.',
        ' т.о.',
        ' и т. д.',
        ' и т.д.',
        ' и т. п.',
        ' и т.п.',
        ' в т. ч.',
        ' в т.ч.',

        // 3A) Сокращения, прилипают к ПРЕДЫДУЩЕМУ слову/числу (NBSP до сокращения)
        ' г.',
        ' гг.',

        // 3B) Сокращения, прилипают к СЛЕДУЮЩЕМУ слову/числу (NBSP после сокращения)
        ' ул. ',
        ' просп. ',
        ' пр-т ',
        ' д. ',
        ' кв. ',
        ' рис. ',
        ' табл. ',
        ' ст. ',
        ' стр. ',
        ' гл. ',
        ' им. ',
        ' № ',

        // 4) — (типографское тире)
        ' -- ',
    ];

    $replace = [
        // 1) Устойчивые обороты: NBSP между частями
        ' т.' . $nbsp . 'е.',
        ' т.' . $nbsp . 'е.',
        ' т.' . $nbsp . 'к.',
        ' т.' . $nbsp . 'к.',
        ' т.' . $nbsp . 'о.',
        ' т.' . $nbsp . 'о.',
        ' и' . $nbsp . 'т.' . $nbsp . 'д.',
        ' и' . $nbsp . 'т.' . $nbsp . 'д.',
        ' и' . $nbsp . 'т.' . $nbsp . 'п.',
        ' и' . $nbsp . 'т.' . $nbsp . 'п.',
        ' в' . $nbsp . 'т.' . $nbsp . 'ч.',
        ' в' . $nbsp . 'т.' . $nbsp . 'ч.',

        // 3A) Липнут к предыдущему: 2025 г., 1941–1945 гг.
        $nbsp . 'г.',
        $nbsp . 'гг.',

        // 3B) Липнут к следующему: ул. Ленина, рис. 5, № 7
        ' ул.'   . $nbsp,
        ' просп.'. $nbsp,
        ' пр-т'  . $nbsp,
        ' д.'    . $nbsp,
        ' кв.'   . $nbsp,
        ' рис.'  . $nbsp,
        ' табл.' . $nbsp,
        ' ст.'   . $nbsp,
        ' стр.'  . $nbsp,
        ' гл.'   . $nbsp,
        ' им.'   . $nbsp,
        ' №'     . $nbsp,

        // 4) тире: неразрывный пробел + тире + обычный пробел
        $nbsp . $mdash . ' ',
    ];

    // Сначала фиксируем устойчивые конструкции, чтобы потом не разломать их предлогами
    $text = str_replace($search, $replace, $text);

    // ── 2) Короткие союзы/предлоги ─────────────────────────────────
    //    - ' в '      → ' в '
    //    - 'В '       → 'В '
    //    - ' в ' → ' в '
    //    - ' В ' → ' В '
    //
    //    Цепочки "но с ним", "и в то же время" → "но с ним", "и в то же время".

    $shortSpecs = [
        ['а',   'А'],
        ['и',   'И'],
        ['но',  'Но'],
        ['или', 'Или'],
        ['да',  'Да'],
        ['в',   'В'],
        ['к',   'К'],
        ['с',   'С'],
        ['у',   'У'],
        ['о',   'О'],
        ['об',  'Об'],
        ['от',  'От'],
        ['по',  'По'],
        ['из',  'Из'],
        ['за',  'За'],
        ['над', 'Над'],
        ['под', 'Под'],
        ['при','При'],
        ['для','Для'],
        ['без','Без'],
        ['на', 'На'],
        ['ни', 'Ни'],
        ['не', 'Не'],
        ['во', 'Во'],
        ['со',  'Со'],
        ['ко',  'Ко'],
        ['обо', 'Обо'],
        ['безо','Безо'],
    ];

    $searchWords  = [];
    $replaceWords = [];

    foreach ($shortSpecs as [$lower, $upper]) {
        // 2A) Строчная внутри текста: ' в ' → ' в '
        $searchWords[]  = ' ' . $lower . ' ';
        $replaceWords[] = ' ' . $lower . $nbsp;

        // 2B) Заглавная в начале предложения: 'В ' → 'В '
        $searchWords[]  = $upper . ' ';
        $replaceWords[] = $upper . $nbsp;

        // 2C) Уже склеенное слева слово: ' в ' → ' в '
        $searchWords[]  = $nbsp . $lower . ' ';
        $replaceWords[] = $nbsp . $lower . $nbsp;

        // 2D) То же для заглавной: ' В ' → ' В '
        $searchWords[]  = $nbsp . $upper . ' ';
        $replaceWords[] = $nbsp . $upper . $nbsp;
    }

    $text = str_replace($searchWords, $replaceWords, $text);

    // ── 3) Частицы "же", "ли", "бы", "б" ───────────────────────────
    //    NBSP СЛЕВА: "как же выйти" → "как же выйти"
    //    Шаблоны простые: только вариант " ... же ..." с пробелами.
    //    Случаи "как же." (без пробела справа) не ловим — сознательно, без preg_*.

    $searchParticles  = [' же ',      ' ли ',      ' бы ',      ' б '];
    $replaceParticles = [$nbsp.'же ', $nbsp.'ли ', $nbsp.'бы ', $nbsp.'б '];

    $text = str_replace($searchParticles, $replaceParticles, $text);

    return $text;
}


Чат-ЖПТ слепил мне типограф, по моим многочисленным наводкам.

Моя система на ПШП, и в Джаве я не шарю, потому не знаю как портировать.

Но вы можете подсматривать в мой сорцъ

Set440 ★★
() автор топика
Ответ на: комментарий от Set440

    // ── 3) Частицы "же", "ли", "бы", "б" ────────────
    // NBSP СЛЕВА: "как же выйти" → "как же выйти"

    $text = preg_replace(
        "/ (же\b|ли\b|бы\b|б\b)/u",
        $nbsp . '$1',
        $text
    );

Set440 ★★
() автор топика
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.