void OEBBookReader::generateTOC(const XHTMLReader &xhtmlReader) { if (!myNCXTOCFileName.empty()) { NCXReader ncxReader(myModelReader); const ZLFile ncxFile(myFilePrefix + myNCXTOCFileName); if (ncxReader.readDocument(ncxFile.inputStream(myEncryptionMap))) { const std::map<int,NCXReader::NavPoint> navigationMap = ncxReader.navigationMap(); if (!navigationMap.empty()) { std::size_t level = 0; for (std::map<int,NCXReader::NavPoint>::const_iterator it = navigationMap.begin(); it != navigationMap.end(); ++it) { const NCXReader::NavPoint &point = it->second; int index = myModelReader.model().label(xhtmlReader.normalizedReference(point.ContentHRef)).ParagraphNumber; while (level > point.Level) { myModelReader.endContentsParagraph(); --level; } while (++level <= point.Level) { myModelReader.beginContentsParagraph(-2); myModelReader.addContentsData("..."); } myModelReader.beginContentsParagraph(index); myModelReader.addContentsData(point.Text); } while (level > 0) { myModelReader.endContentsParagraph(); --level; } return; } } } std::vector<std::pair<std::string,std::string> > &toc = myTourTOC.empty() ? myGuideTOC : myTourTOC; for (std::vector<std::pair<std::string,std::string> >::const_iterator it = toc.begin(); it != toc.end(); ++it) { int index = myModelReader.model().label(it->second).ParagraphNumber; if (index != -1) { myModelReader.beginContentsParagraph(index); myModelReader.addContentsData(it->first); myModelReader.endContentsParagraph(); } } }
void XHTMLTagHyperlinkAction::doAtStart(XHTMLReader &reader, const char **xmlattributes) { const char *href = reader.attributeValue(xmlattributes, "href"); if (href != 0 && href[0] != '\0') { const FBTextKind hyperlinkType = MiscUtil::referenceType(href); std::string link = MiscUtil::decodeHtmlURL(href); if (hyperlinkType == INTERNAL_HYPERLINK) { if (link[0] == '#') { link = reader.myReferenceAlias + link; } else { link = reader.normalizedReference(reader.myReferenceDirName + link); } } myHyperlinkStack.push(hyperlinkType); bookReader(reader).addHyperlinkControl(hyperlinkType, link); } else { myHyperlinkStack.push(REGULAR); } const char *name = reader.attributeValue(xmlattributes, "name"); if (name != 0) { bookReader(reader).addHyperlinkLabel( reader.myReferenceAlias + "#" + MiscUtil::decodeHtmlURL(name) ); } }