Как отформатировать текст как книгу / журнал с PHP? - PullRequest
0 голосов
/ 12 января 2020

У меня есть:

This is a test string. Cool, huh?

Я хочу:

This is a te-
st string. C-
ool, huh?

То есть каждая строка составляет ровно 13 символов, согласно Engli sh правила для этого . То есть я не уверен, можно ли разбить «test» как «te-st», или «Cool» можно разбить до «C -ool», но это «стиль» пытаясь достичь.

Я сделал около тысячи поисковых запросов. Я ничего не нахожу, что это делает.

wordwrap () бесполезен, потому что он работает только со всеми «словами» и оставляет тонны пустого пространства в конце большинства строк.

Это так расстраивает, потому что я не могу продолжить свой проект, пока не разберусь с этим. Я предполагал, что для этого найдется библиотека, но единственное, что я могу найти, - это https://github.com/vanderlee/phpSyllable, но, похоже, это совсем не так. Пример не имеет смысла, так как он не показывает никакого вывода и нигде не упоминает "ширину" строки.

Ответы [ 2 ]

1 голос
/ 12 января 2020

Библиотеки Дефис или Org_Heigl / Hyphenator , похоже, правильно обрабатывают переносы. Основываясь на одном из них, вы сможете написать свой собственный wordwrap(), в котором можно использовать пробелы или дефисы в качестве точек разрыва.

Обратите внимание, что слова Engli sh имеют очень конкретные c точки переноса, и вам абсолютно не обязательно иметь длину каждой строки ровно n символов. Иногда вы теряете несколько символов, если следующий слог окажется длинным - например, «полные» дефисы как thor-ough , в то время как «through» вообще не переносит.

0 голосов
/ 12 января 2020

Вот код, с которым вы сможете работать, используя какую-то библиотеку переносов. Этот код использует ложную трехсимвольную функцию переноса слов. Вы можете увидеть это в действии на https://www.tehplayground.com/eNtxiMTeXj16oPkT - мне понадобилось около 10 минут, чтобы написать это, так что это было на самом деле тривиально - вопреки тому, что вы написали в удаленной ветке.

<?php
$loremipsum = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.";

function FAKE_hyphenate($word) { // use some real library's hyphenation function here
    return explode("-",wordwrap($word,3,"-",true));
}

function hyphenate_text ($text, $line_length) {
    $words = explode(" ",$text);
    $lines = [str_repeat("-",$line_length)];
    $line = "";
    while ($words) {
        $word = array_shift($words);
        if (strlen($line)+strlen($word)+1<=$line_length)
            $line .= (strlen($line)>0 ? " " : "") . $word;
        else {
            $syllables = FAKE_hyphenate($word);
            $syllables[0] = " ".$syllables[0];
            $syl_count=0;
            while ($syllables) {
                $syllable = array_shift($syllables);
                if (strlen($line)+strlen($syllable)<=$line_length-1) {
                    $line .= $syllable;
                    $syl_count++;
                } else {
                    array_unshift($syllables,$syllable);
                    break;
                }
            }
            if ($syl_count>0)
                $line .= "-";
            $syllables[0] = str_replace(" ","",$syllables[0]);
            array_unshift($words,implode("",$syllables));
            $lines[] = $line;
            $line = "";
        }
    }
    $lines[] = $line;
    return implode("\n",$lines);
}

echo hyphenate_text($loremipsum,25);
...