Большинство сайтов в интернете используют выравнивание текста влево и не используют переносы. Дизайнеры утверждают, что возможности браузеров по форматированию текста далеки от возможностей настольных издательских систем в плане изменения расстояния между словами, между отдельными символами в словах, расстановке переносов и т. д. Все выглядит ужасно, поэтому рекомендуется никогда не использовать выравнивание текста по ширине в Web.

Однако, я решил попробовать читать новостные сайты, habr или lib.ru с "книжным форматированием".

Для внесения изменений в сторонние web-страницы я использую расширение браузера Tampermonkey. Вот скрипт, который меняет форматирование текста на Хабре и других сайтах, которые нужно перечислить в директивах @match:

// ==UserScript==
// @name         P-justify-hyphens
// @version      0.1
// @description  try to take over the world!
// @match        https://www.rbc.ru/*
// @match        https://lenta.ru/*
// @match        https://habr.com/*
// ==/UserScript==

(function() {
    'use strict';

    var styles = `
    p {
        -webkit-hyphens: auto;
        -moz-hyphens: auto;
        -ms-hyphens: auto;
        text-align: justify;
    }
`;

    var styleSheet = document.createElement("style");
    styleSheet.innerText = styles;
    document.head.appendChild(styleSheet);

    document.documentElement.setAttribute("lang", 'ru');
})();

На lib.ru есть формат вывода книг под названием "Fine HTML". Чтобы его можно было читать, кроме выравнивания абзацев и переносов ему нужны поля. Поэтому для lib.ru я сделал отдельный скрипт:

// ==UserScript==
// @name         lib.ru-justify-hyphens
// @version      0.1
// @description  try to take over the world!
// @match        http://lib.ru/*.html
// ==/UserScript==

(function() {
    'use strict';

    var styles = `
    body {
        -moz-hyphens: auto;
        text-align: justify;
        font-size: 28;
        margin-left:500px;
        margin-right:500px;
    }
`;

    var styleSheet = document.createElement("style");
    styleSheet.innerText = styles;
    document.head.appendChild(styleSheet);

    document.documentElement.setAttribute("lang", 'ru');
})();

Комментарии (14)


  1. PereslavlFoto
    19.04.2022 00:46
    +3

    с книжным форматированием.

    Честно говоря, книжное форматирование — это растяжение пробелов + переменная ширина одинаковых букв + переносы + слова, подобранные автором и редактором в таком порядке, чтобы переносов было не больше двух подряд + висячая пунктуация.

    Когда браузер этому научится, все издательства будут верстать в браузере.


    1. NickyX3
      19.04.2022 10:05
      +1

      Казалось бы, при чем тут автор и редактор, если все это в программах верстки и так работает, для любых размеров текта по ширине и размеру кегля? Автоматизированные переносы в них работают 100500 лет как. И да, они в основном используют растягивание пробелов, но совершенно не "переменную ширина одинаковых букв". Оно не идеально, но при явных огрехах таких систем ручные мягкие переносы делает верстальщик книги, но никак не редактор с автором. Кстати мягкие переносы есть и в web, это html-entity ­, которые, впрочем, тоже можно расставлять автоматически на основе морфологии


      1. PereslavlFoto
        19.04.2022 11:15

        Казалось бы, при чем тут автор и редактор, если все это в программах верстки и так работает, для любых размеров текта по ширине и размеру кегля?

        Потому что автоматизированные переносы работают плохо, создают больше 2 переносов подряд. А растягивать пробелы очень опасно: может получиться плохой результат. Поэтому-то и используется микротипографика, которая позволяет масштабировать все буквы по ширине.

        Оно не идеально, но при явных огрехах таких систем ручные мягкие переносы делает верстальщик книги, но никак не редактор с автором.

        Задача не в том, чтобы расставить переносы, это и автомат умеет. Задача — избавиться от переносов.


        1. NickyX3
          19.04.2022 11:39
          +1

          Потому что автоматизированные переносы работают плохо, создают больше 2 переносов подряд.

          Вы давно в программах верстки работали? Да пусть даже не совсем верстки, а к примеру Corel Draw? Автоматизированные переносы в них настраиваются, в том числе, чтобы не делать более указанного числа переносов подряд, минимальных висячек, минимальной длины слова и все такое.


          1. PereslavlFoto
            19.04.2022 11:43

            Вы лишь подтверждаете, что сам браузер этого не делает.


            1. NickyX3
              19.04.2022 14:20

              Сам браузер в принципе мог бы это делать, но нет стандарта и некоторая сложность с морфологией (поддержка языков будет занимать порядочно места на диске, в пре-пресс пакетах это решается словарями, которые инсталируются отдельно)


      1. juunitaki Автор
        19.04.2022 11:29
        +2

        Вот так ваш комментарий выглядит в браузере с переносами и выравниванием по ширине.


  1. haired
    19.04.2022 13:32

    В Опере работает только выравнивание, переносов нет.


    1. juunitaki Автор
      19.04.2022 17:39
      +1

      Судя по таблице, в Opera словарь только для английского.


  1. F1eex
    19.04.2022 17:06

    Имхо, выравнивание по ширине и все эти переносы - это все какое-то устаревшее. Перенос рубит слово на двое и заставляет "разрывать внимание" переходя глазами со конца строки в начало следующей. А выравнивание по ширине делает абзац сливающимся, легче сбиться со строки. Неровный правый край текста как раз избавляет от этого. Поэтому мне уже с экрана читать веб стало приятнее, чем бумажные книги, где как раз текст выравнен с обеих сторон. И если мне сегодня пришлось бы что-то много записывать в тетрадке, я б не переносил слова, а выравнивал свою писанину только слева.


    1. runaway
      19.04.2022 17:33
      +2

      А рваная и драная правая сторона текста вас устраивает? Переносы - да, согласен, ломать слово через колено не надо. Но выравнивание нужно. Точнее, опция выравнивания в браузерах нужна. Пусть каждый настроит так, как ему удобнее. Пусть хоть по центру выровняет, прости господи.

      А для того, чтобы текст не сливался в кашу, умные люди давным-давно придумали абзацы.


      1. F1eex
        19.04.2022 17:43
        +1

        А рваная и драная правая сторона текста вас устраивает?

        Да, меня устраивает. Я благодаря ей быстрее нахожу строку от прочтения которой отвлекся.


    1. juunitaki Автор
      19.04.2022 17:38

      Судя по таблице, в Opera словарь только для английского.


  1. kichrot
    19.04.2022 18:11

    Здесь уже высказали правомерное сомнение об удобстве и целесообразности выравнивания текста по ширине на странице. Но, это дело вкуса.

    Меня интересует иное - реализация механизма автором скрипта.

    Явно, что предложенный скрипт будет тормозным и не будет обрабатывать динамически создаваемое содержимое. Также явно не хватает фильтра необрабатываемых элементов.

    Набросал для примера автору свой вариант скрипта, лишенный указанных недостатков. Но, не проверял. Хотя по идее должен работать:

    // ==UserScript==
    // @name         P-justify-hyphens
    // @version      0.1
    // @description  try to take over the world!
    // @match        https://www.rbc.ru/*
    // @match        https://lenta.ru/*
    // @match        https://habr.com/*
    // @run-at        document-start
    // @grant         unsafeWindow
    // ==/UserScript==
    
    
    (function () {
        'use strict';
        var css = document.createElement('style');
        css.innerHTML += [
        `*:not(img):not(svg):not([class*=\"icon\"]):not([class*=\"ico\"]):not([class*=\"button\"]):not([class*=mjx])`+
        `:not([class*=vjs]):not([class*=fa]):not([class*=ms-Button-icon]):not([class*=bb])`+
        `:not([class*=icon]):not([class*=ll]):not(i):not([role*=button]):not([type*=button]):not([class*=btn])`+
        `:not([class*=button]):not([class*=button] span),`+
        `[class*="text"]:not([class*=fa])  {`,
                          `-moz-hyphens: auto !important;`,
                          `-ms-hyphens: auto !important;`,
                          `-webkit-hyphens: auto  !important;`,
                          `text-align: justify  !important;`,
       `}`
        ].join("\n");
        document.documentElement.appendChild(css);
    }) ();