Как «FBReader» выполняет нумерацию html-файлов в epub - PullRequest
19 голосов
/ 17 мая 2011

Я пытаюсь сделать epub reader

Я хочу сделать нумерацию страниц, как fbreader делает

Теперь у меня есть исходный код fbreader, но я не знаю, где он реализованнумерация страниц

У меня есть реализация других функций

Все, что мне нужно от fbreader, - это нумерация страниц

Кто-нибудь делал подобные вещи?

Спасибо за ваше время, чтобы прочитать этот вопрос.

ps: разбиение на страницы заключается в том, чтобы разбивать html-файл на страницы, в зависимости от размера экрана и размера шрифта, и также учитывается язык , при изменении размера шрифта, номер страницы также изменился.И содержимое файла epub в формате html

Ответы [ 3 ]

4 голосов
/ 25 июня 2011

Как говорит McLaren, FBReader не реализует нумерацию страниц: он использует ZLibrary , который доступен с того же веб-сайта , что и FBReader.

Исходный код использует это для вычисления номера текущей страницы:

size_t ZLTextView::pageNumber() const {
    if (textArea().isEmpty()) {
        return 0;
    }
    std::vector<size_t>::const_iterator i = nextBreakIterator();
    const size_t startIndex = (i != myTextBreaks.begin()) ? *(i - 1) : 0;
    const size_t endIndex = (i != myTextBreaks.end()) ? *i : 
            textArea().model()->paragraphsNumber();
    return (myTextSize[endIndex] - myTextSize[startIndex]) / 2048 + 1;
}

Версия Java использует эту функцию для вычисления номера страницы:

private synchronized int computeTextPageNumber(int textSize) {
    if (myModel == null || myModel.getParagraphsNumber() == 0) {
        return 1;
    }

    final float factor = 1.0f / computeCharsPerPage();
    final float pages = textSize * factor;
    return Math.max((int)(pages + 1.0f - 0.5f * factor), 1);
}

Это находится в org.geometerplus.zlibrary.text.view.TextView

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

4 голосов
/ 24 июня 2011

Это увлекательный код. Я хотел бы увидеть перевод оригинального студенческого проекта (но я предполагаю, что оригинальный документ на русском языке). Так как это порт проекта C ++, он имеет интересный стиль кодирования местами.

Приложение отслеживает, где вы находитесь в книге, с помощью курсоров абзаца ( ZLTextParagraphCursor ). Эта ситуация сопоставима с курсорами базы данных и разбиением на страницы записи. Класс, который отвечает за обслуживание текущей страницы и вычисление количества страниц: ZLTextView .

Поскольку epubs являются перерабатываемыми документами и не ориентированы на страницы, на самом деле нет конкретного определения страницы - это просто зависит от того, где в документе вы ищете (абзац, слово, символ ) и с какими настройками дисплея.

2 голосов
/ 06 декабря 2011

Насколько я понял, это то, что он использует 3 битовые карты предыдущего текущего и следующего. То, что они сделали, это написали текст, который был сохранен и прочитан в этих 3 растровых изображениях. По тому, что вы видите наверху, они вычисляют данные абзацев о том, сколько времени у прокрутки, которую вы видите на другом примере. Обратный инжиниринг можно запустить в классе пакета android.view bitmapManager. Это должно объяснить все, как они выполняют пейджинг.

...