разбиение на страницы на основе символов - вставка разрывов страниц в текст, а не в пунктуацию или код - PullRequest
0 голосов
/ 11 декабря 2008

Я пишу код для генерации пагинации на основе символов. У меня на сайте есть статьи, которые я хочу разделить по длине.

Код, который у меня есть, работает, хотя есть две проблемы:

  1. Это расщепляет страницы в середине слов и тэгов HTML; Я хочу это разделяется только после полного слова, тега или знака препинания.
  2. В строке нумерации страниц создается неверное количество страниц.

В полоса нумерации страниц, она генерирует неверное количество страниц.

Нужна помощь в решении этих двух вопросов. Код следует:

$text = file_get_contents($View);
$ArticleLength = strlen($text);
$CharsPerPage = 5000;
$NoOfPages = round((double)$ArticleLength / (double)$CharsPerPage);
$CurrentPage = $this->ReturnNeededObject('pagenumber');
$Page = (isset($CurrentPage) && '' !== $CurrentPage) ? $CurrentPage : '1';
$PageText = substr($text, $CharsPerPage*($Page-1), $CharsPerPage);
echo $PageText, '<p>';
for ($i=1; $i<$NoOfPages+1; $i++)
{
    if ($i == $CurrentPage)
    {
        echo '<strong>', $i, '</strong>';
    }
    else
    {
         echo '<a href="', $i, '">', $i, '</a>';
    }
    echo ' | ';
}
echo '</p>';

Что я делаю не так?

Ответы [ 4 ]

1 голос
/ 11 декабря 2008

Спасибо, ребята. Я положил в исправление для 1-й точки, и он работал прекрасно.

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

Еще раз спасибо.

0 голосов
/ 11 декабря 2008

На основании вашего первого заявления,

Разбивает страницы на слова и теги HTML

Похоже, что ваш счет символов выполняется после вставки разметки. Это будет означать, что, например, длинные URL-адреса в ссылках будут сравниваться с длиной страницы, которую вы пытаетесь достичь. Однако вы не сказали, как изначально создавались статьи.

Я бы предложил поискать точку в процессе создания статьи, где вы могли бы изучить необработанный текст. Рассматривая фактическое содержимое (без разметки) как набор абзацев и оценивая вертикальную длину каждого абзаца на основе типичного количества символов в строке, вы можете придать более согласованный размер.

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

0 голосов
/ 11 декабря 2008

Вы рассчитываете количество страниц неправильно ... вы должны использовать ceil(), а не round() (например, текст объемом 4,1 страницы по-прежнему отображается на 5 страницах).

Чтобы решить другую проблему, у вас будут большие проблемы, если там будет произвольный HTML. Например, вам нужно знать, что <div> s и <p> s - это нормально для разделения, но <table> s - нет (если только вы не хотите стать действительно модным)!

Чтобы сделать это правильно, вы должны использовать библиотеку HTML для построения дерева элементов, а затем перейти оттуда.

0 голосов
/ 11 декабря 2008
$NoOfPages = round((double)$ArticleLength / (double)$CharsPerPage);

Это должно использовать ceil вместо round - если вы используете round, 4.2 страницы покажут только 1-4 - вам нужна 5-ая страница, чтобы показать последние .2 страницы.

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

Если вы настаиваете на этом, предложите некоторую логику, которая сначала работает вперед / назад до ближайшего пробела при создании разрыва страницы, что не так уж сложно. Более сложно решить, когда вы находитесь внутри тега или нет .... думаю, что вам понадобится довольно тяжелое регулярное выражение или инструмент разбора HTML.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...