TextPage* TextParser::getPage(unsigned int no) { while ((! tokenizer.isFinished()) && (pages.size() <= no)) parseNextPage(); if (pages.size() <= no) return NULL; else return pages[no]; }
TextPage* TextParser::getPage(unsigned int no) { while ((! tokenizer.isFinished()) && (pages.size() <= no)) parseNextPage(); return (pages.size() > no)? pages[no] : NULL; }
void TextParser::parseNextPage() { if (tokenizer.isFinished()) return; int curPosY = 0; int lineWidth = 0; TextPage *page = new TextPage(); std::wstring line; while (true) { Token t = tokenizer.getNextToken(); if (Token::Eof == t.getType()) break; if (Token::Para == t.getType()) { if (0 < line.length()) addLine(page, line, curPosY, lineWidth); if (! page->isEmpty()) curPosY += 10; } else if (Token::Word == t.getType()) { const std::wstring &word = t.getContent(); if (isImage(word)) { addLine(page, line, curPosY, lineWidth); SDL_Surface *image = getImage(keywordToImage(word)); if ((image->h + curPosY < pageHeight) || page->isEmpty()) { int x = offsetX + (pageWidth - image->w) / 2; page->add(new Picture(x, offsetY + curPosY, image)); curPosY += image->h; } else { tokenizer.unget(t); break; } } else { int width = font.getWidth(word); if (lineWidth + width > pageWidth) { if (! lineWidth) { line = word; addLine(page, line, curPosY, lineWidth); } else { addLine(page, line, curPosY, lineWidth); if (curPosY >= pageHeight) { tokenizer.unget(t); break; } line = word; lineWidth = width; } } else { lineWidth += width; if (line.size()) { line += L' '; lineWidth += spaceWidth; } line += word; } } } if (curPosY >= pageHeight) break; } addLine(page, line, curPosY, lineWidth); if (! page->isEmpty()) pages.push_back(page); else delete page; }