Pergunta

Estou criando um programa de linux em C ++ para um dispositivo portátil, a fim de tornar os arquivos html.

O problema é que o dispositivo é limitado em RAM, tornando-se assim impossível de grandes arquivos abertos (com software real).

Uma solução é dinamicamente carregar / descarregar partes do arquivo, mas eu não tenho certeza de como implementar isso.

A capacidade de rolagem é uma obrigação, com uma experiência suave, se possível

Eu gostaria de ouvir de você qual é a melhor abordagem para essa situação? Você pode sugerir um algoritmo, um projeto de código aberto para dar uma olhada, ou uma biblioteca que suporte o que eu estou tentando fazer (webkit?).

EDIT: Eu estou escrevendo um leitor de ebook, então eu só preciso de renderização html puro, sem javascript, sem CSS, ...

Foi útil?

Solução

Para ser capaz de navegar um documento de árvore (como HTML) sem totalmente de carga, você vai ter que fazer algumas suposições - como o documento a ser uma árvore real. Então, não perca tempo verificando as tags próximos. Fechar etiquetas são projetados para o consumo humano de qualquer forma, computadores ficaria feliz com <> também.

O primeiro passo é assumir que a primeira parte do documento é representada pela primeira parte do seu documento. Isso soa como uma tautologia, mas com "moderno" HTML e certamente JS isso é tecnicamente não é verdade. Ainda assim, se qualquer linha de HTML pode afetar qualquer pixel, você simplesmente não pode carregar parcialmente uma página.

Então, se há uma relação simples entre a posição do arquivo HTML e páginas na tela, o próximo passo é definir o estado de análise no final de cada página. Este, então, incluir um único arquivo offset, provavelmente (mas não necessariamente) no final de um parágrafo. Também fazem parte deste estado é uma pilha de etiquetas abertos.

Para fazer a paginação mais fácil, é inteligente para manter este estado "página limite" para cada página que você encontrou até agora. Isso faz com que a paginação de volta fácil.

Agora, quando o processamento de uma nova página, o estado limite de página anterior lhe dará o estado prestação inicial. Você simplesmente ler HTML e torná-lo elemento por elemento até transbordar uma única página. Você, então, recuar um pouco e determinar o novo estado limite de página.

rolagem suave é basicamente uma questão de prestação de duas páginas adjacentes e mostrando x% da primeira e 100-x% da segunda. Depois de implementar este bit, pode ser inteligente para terminar um parágrafo ao renderizar cada página. Isto lhe dará um pouco diferentes comprimentos de página, mas você não tem que lidar com os parágrafos quebrados, e que por sua vez faz com que sua página estado limite um pouco menor.

Outras dicas

Dillo é o mais leve navegador peso Linux que eu estou ciente de.

Editar : Se ele (ou seu componente de renderização) não vai atender às suas necessidades, então você pode encontrar uma lista de Wikipedia de e comparação de motores de layout para ser útil.

Editar 2: Eu suspeito que o carregamento de forma dinâmica e descarga partes de um arquivo HTML seria complicado; por exemplo, como é que você sabe que um pedaço escolhidos aleatoriamente do arquivo não está no meio de uma tag? Você provavelmente teria que usar algo como SAX para analisar o arquivo em uma representação intermediária, poupando pedaços discretos da representação intermediária para armazenamento persistente para que eles não ocupam muito RAM. Ou você poderia analisar o arquivo com SAX para mostrar o que se encaixa na memória RAM de uma só vez, em seguida, re-analisá-lo sempre que o usuário rola longe demais. (Folhas de Estilo e Javascript iria estragar esta abordagem, alguns HTML simples pode também.) Se fosse comigo, eu iria tentar encontrar uma linguagem de marcação simples ou algum tipo de visualizador de rich text em vez de ir a todos que a dificuldade

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top