Красивый перенос строк по слогам



Представлена процедура, позволяющая разбить исходную строку на две строки с учетом переноса слов по слогам по правилам русского языка. Поддерживаются различные варианты переноса слов. Предназначена для использования при заполнении форм с ограничениями на длину строки.

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

Разумеется, процедура работает на 7.7-8.3.

4 Comments

  1. Serj1C

    почему бы было не описать какие значений может иметь «параметр» и почему вся длинная строка не разбивается на массив подстрок или строку с переносами до конца длины?

    Reply
  2. gubanoff

    Вот описание процедуры:

    // Процедура глПеренестиСлово(_СловоИсточник,_КоличествоСимволов,СловоРезультат1,СловоРезультат2,МягкийПеренос=0)
    //
    //  разбивает исходную строку _СловоИсточник на две строки СловоРезультат1 и СловоРезультат2
    //  при этом в СловоРезультат1 попадает не более _КоличествоСимволов, остальные идут в СловоРезультат2
    //   параметр МягкийПеренос определяет метод разбиения:
    //   МягкийПеренос  =  0   — слова переносятся по слогам;
    //   МягкийПеренос  = -1   — слова переносятся по слогам или на символе, не являющемся не буквой не цифрой;
    //   МягкийПеренос  =  1   — перенос осуществляется только на символах, не являющихся не буквой не цифрой.
    //   Результат возвращается в виде двух строк СловоРезультат1 и СловоРезультат2.
    //
    //   Гарантии и предупреждения:
    //   отдельные слова делятся на слоги почти всегда корректно; предложения могут переносится некорректно из-за
    //   знаков препинания, примыкающих к словам и прочих символов; числа и даты могут переносится некорректно,
    //   если они отформатированы с применением точек, запятых, пробелов и проч.
    //
    //   Рекомендации:
    //   если в тексте есть даты и/или форматированные числа, то МягкийПеренос = 0
    //   если в тексте нет дат и/или форматированных чисел и необходимо 100% верно перенести слова, то МягкийПеренос=1
    //   если в тексте нет дат и/или форматированных чисел то МягкийПеренос=0
    //
    

    Показать

    а вот пример деления строки на массив строк заданной длины:

     Строка2 = ИсходнаяСтрока;
    мСтрок = Новый Массив;
    Пока СтрДлина(СокрЛП(Строка2)) > 0 Цикл
    ИсходнаяСтрока = Строка2;
    Строка1 = «»;
    Строка2 = «»;
    глПеренестиСловоЛокал(ИсходнаяСтрока, КоличествоСимволовВПервойСтроке, Строка1, Строка2, Параметр);
    мСтрок.Добавить(Строка1);
    КонецЦикла;
    

    Показать

    Reply
  3. SheremetevaValentina

    Я бы не сказала, что данная процедура работает очень красиво. В примере — перенос дал в первой строке явно меньшее количество символов, чем это возможно

    Reply
  4. gubanoff

    (3) SheremetevaValentina, все нормально в вашем примере. Нужно 27 символов, вот эта позиция в строке «Котик, котик — обормотик, Котик — тепленький животик». Переносить «к-отик» по правилам русского языка нельзя. Взять больше, чем 27 букв, чтобы перенести «ко-тик» тоже нельзя, так как указано 27 букв. Поэтому идем назад и ищем подходящее место для переноса. Ближайшее такое место и получается «обормо-тик». Может, вы хотели, чтобы переносло так «обормотик, (тут перенос) котик»? Тогда нужно Параметр установить в 1 — будет перенос не в середине слов, а между ними. Или попробуйте Параметр установить в «-1».

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *