HTML рендерер с ограниченными ресурсами (хорошее управление памятью) - PullRequest
0 голосов
/ 06 июня 2009

Я создаю программу linux на C ++ для портативного устройства для рендеринга html-файлов.

Проблема заключается в том, что устройство ограничено в ОЗУ, что делает невозможным открытие больших файлов (с помощью реального программного обеспечения).

Одним из решений является динамическая загрузка / выгрузка частей файла, но я не уверен, как это реализовать.

Возможность прокрутки является обязательным, с плавным опытом, если это возможно

Хотелось бы услышать от вас, как лучше всего подходить к такой ситуации? Вы можете предложить алгоритм, проект с открытым исходным кодом или библиотеку, которая поддерживает то, что я пытаюсь сделать (webkit?).

EDIT: Я пишу для чтения электронных книг, так что мне просто нужно чистый рендеринг HTML, без JavaScript, без CSS, ...

Ответы [ 2 ]

1 голос
/ 08 июня 2009

Чтобы иметь возможность просматривать древовидный документ (например, HTML) без полной загрузки, вам нужно сделать несколько предположений - например, документ является фактическим деревом. Так что не стоит проверять закрытые теги. В любом случае закрывающие теги предназначены для потребления человеком, компьютеры тоже были бы довольны <>.

Первый шаг - предположить, что первая часть вашего документа представлена ​​первой частью вашего документа. Это звучит как тавтология, но с «современным» HTML и, конечно, с JS, технически это уже не так. Тем не менее, если какая-либо строка HTML может повлиять на любой пиксель, вы просто не сможете частично загрузить страницу.

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

Чтобы упростить разбиение на страницы, разумно сохранять это состояние "границы страницы" для каждой страницы, с которой вы столкнулись до сих пор. Это облегчает пейджинг.

Теперь при рендеринге новой страницы граничное состояние предыдущей страницы даст вам начальное состояние рендеринга. Вы просто читаете HTML и визуализируете его поэлементно, пока не переполните одну страницу. Затем вы возвращаетесь немного назад и определяете новое граничное состояние страницы.

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

0 голосов
/ 06 июня 2009

Dillo - это самый легкий веб-браузер для Linux, который я знаю.

Редактировать : Если он (или его компонент рендеринга) не удовлетворяет вашим потребностям, то вам может пригодиться список Википедии и сравнение механизмов компоновки .

Редактировать 2: Я подозреваю, что динамическая загрузка и выгрузка частей HTML-файла будет непростой задачей; например, как вы узнаете, что случайно выбранный фрагмент файла находится не в середине тега? Вам, вероятно, придется использовать что-то вроде SAX для анализа файла в промежуточном представлении, сохраняя отдельные фрагменты промежуточного представления в постоянном хранилище, чтобы они не занимали слишком много ОЗУ. Или вы можете проанализировать файл с помощью SAX, чтобы показать все, что умещается в оперативной памяти, а затем повторно проанализировать его, когда пользователь прокручивает слишком далеко. (Таблицы стилей и Javascript могут испортить этот подход; какой-то простой HTML тоже может.) Если бы это был я, я бы попытался найти простой язык разметки или какой-нибудь просмотрщик расширенного текста, а не идти на все эти трудности.

...