char *GetHtml() { // first add the homepage const char *index = doc->GetHomePath(); ScopedMem<WCHAR> url(doc->ToStr(index)); Visit(NULL, url, 0); // then add all pages linked to from the table of contents doc->ParseToc(this); // finally add all the remaining HTML files Vec<char *> *paths = doc->GetAllPaths(); for (size_t i = 0; i < paths->Count(); i++) { char *path = paths->At(i); if (str::EndsWithI(path, ".htm") || str::EndsWithI(path, ".html")) { if (*path == '/') path++; url.Set(str::conv::FromUtf8(path)); Visit(NULL, url, -1); } } FreeVecMembers(*paths); delete paths; return html.StealData(); }
DocTocItem *Chm2EngineImpl::GetTocTree() { EbookTocBuilder builder(this); doc->ParseToc(&builder); if (doc->HasIndex()) { // TODO: ToC code doesn't work too well for displaying an index, // so this should really become a tree of its own (which // doesn't rely on entries being in the same order as pages) builder.Visit(L"Index", NULL, 1); builder.SetIsIndex(true); doc->ParseIndex(&builder); } return builder.GetRoot(); }
bool ChmEngineImpl::Load(const WCHAR *fileName) { this->fileName = str::Dup(fileName); Timer t(true); doc = ChmDoc::CreateFromFile(fileName); dbglog::LogF("ChmDoc::CreateFromFile(): %.2f ms", t.GetTimeInMs()); if (!doc) return false; // always make the document's homepage page 1 pages.Append(str::conv::FromAnsi(doc->GetHomePath())); // parse the ToC here, since page numbering depends on it t.Start(); doc->ParseToc(&ChmTocBuilder(doc, &pages, &tocRoot)); dbglog::LogF("doc->ParseToc(): %.2f ms", t.GetTimeInMs()); CrashIf(pages.Count() == 0); return pages.Count() > 0; }