コード例 #1
0
ファイル: XHTMLReader.cpp プロジェクト: Alexander--/FBReaderJ
void XHTMLTagParagraphWithControlAction::doAtStart(XHTMLReader &reader, const char**) {
	if ((myControl == TITLE) && (bookReader(reader).model().bookTextModel()->paragraphsNumber() > 1)) {
		bookReader(reader).insertEndOfSectionParagraph();
	}
	bookReader(reader).pushKind(myControl);
	beginParagraph(reader);
}
コード例 #2
0
ファイル: XHTMLReader.cpp プロジェクト: euroelessar/FBReader
void XHTMLTagImageAction::doAtStart(XHTMLReader &reader, const char **xmlattributes) {
	const char *fileName = reader.attributeValue(xmlattributes, *myPredicate);
	if (fileName == 0) {
		return;
	}

	const std::string fullfileName = pathPrefix(reader) + MiscUtil::decodeHtmlURL(fileName);
	ZLFile imageFile(fullfileName);
	if (!imageFile.exists()) {
		return;
	}

	bool flag = bookReader(reader).paragraphIsOpen();
	if (flag) {
		endParagraph(reader);
	}
	if (std::strlen(fileName) > 2 && std::strncmp(fileName, "./", 2) == 0) {
		fileName +=2;
	}
	bookReader(reader).addImageReference(fullfileName);
	bookReader(reader).addImage(fullfileName, new ZLFileImage(ZLFile(fullfileName), 0));
	if (flag) {
		beginParagraph(reader);
	}
}
コード例 #3
0
void HtmlSectionHrefTagAction::run(const HtmlReader::HtmlTag &tag) {
	if (tag.Start) {
		HtmlSectionReader &reader = (HtmlSectionReader&)myReader;
		for (unsigned int i = 0; i < tag.Attributes.size(); ++i) {
			if (tag.Attributes[i].Name == "NAME") {
				bookReader().addHyperlinkLabel(ZLUnicodeUtil::toLower(reader.myCurrentSectionName + '#' + tag.Attributes[i].Value));
			} else if ((hyperlinkType() == REGULAR) && (tag.Attributes[i].Name == "HREF")) {
				const std::string &value = tag.Attributes[i].Value;
				if (!value.empty()) {
					FBTextKind referenceType = MiscUtil::referenceType(value);
					if (referenceType != INTERNAL_HYPERLINK) {
						bookReader().addHyperlinkControl(referenceType, value);
						setHyperlinkType(referenceType);
					} else {
						const int index = value.find('#');
						std::string sectionName = (index == -1) ? value : value.substr(0, index);
						sectionName = ZLUnicodeUtil::toLower(MiscUtil::decodeHtmlURL(sectionName));
						if (sectionName.empty()) {
							sectionName = reader.myCurrentSectionName;
						} else {
							sectionName = reader.myReferenceCollection.addReference(sectionName, true);
						}
						bookReader().addHyperlinkControl(
							INTERNAL_HYPERLINK, ZLUnicodeUtil::toLower((index == -1) ? sectionName : (sectionName + value.substr(index)))
						);
						setHyperlinkType(INTERNAL_HYPERLINK);
					}
				}
			}
		}
	} else if (hyperlinkType() != REGULAR) {
		bookReader().addControl(hyperlinkType(), false);
		setHyperlinkType(REGULAR);
	}
}
コード例 #4
0
void HtmlHrefTagAction::run(const HtmlReader::HtmlTag &tag) {
	if (tag.Start) {
		for (unsigned int i = 0; i < tag.Attributes.size(); ++i) {
			if (tag.Attributes[i].Name == "NAME") {
				bookReader().addHyperlinkLabel(tag.Attributes[i].Value);
			} else if ((hyperlinkType() == REGULAR) && (tag.Attributes[i].Name == "HREF")) {
				std::string value = tag.Attributes[i].Value;
				if (!myReader.myFileName.empty() &&
						(value.length() > myReader.myFileName.length()) &&
						(value.substr(0, myReader.myFileName.length()) == myReader.myFileName)) {
					value = value.substr(myReader.myFileName.length());
				}
				if (!value.empty()) {
					if (value[0] == '#') {
						setHyperlinkType(INTERNAL_HYPERLINK);
						bookReader().addHyperlinkControl(INTERNAL_HYPERLINK, value.substr(1));
					} else {
						FBTextKind hyperlinkType = MiscUtil::referenceType(value);
						if (hyperlinkType != INTERNAL_HYPERLINK) {
							setHyperlinkType(hyperlinkType);
							bookReader().addHyperlinkControl(hyperlinkType, value);
						}
					}
				}
			}
		}
	} else if (hyperlinkType() != REGULAR) {
		bookReader().addControl(hyperlinkType(), false);
		setHyperlinkType(REGULAR);
	}
}
コード例 #5
0
ファイル: XHTMLReader.cpp プロジェクト: BrendanL79/FBReaderJ
void XHTMLTagImageAction::doAtStart(XHTMLReader &reader, const char **xmlattributes) {
	const char *fileName = reader.attributeValue(xmlattributes, *myPredicate);
	if (fileName == 0) {
		return;
	}

	const std::string fullfileName = pathPrefix(reader) + MiscUtil::decodeHtmlURL(fileName);
	ZLFile imageFile(fullfileName);
	if (!imageFile.exists()) {
		return;
	}

	const bool flagParagraphIsOpen = bookReader(reader).paragraphIsOpen();
	if (flagParagraphIsOpen) {
		if (reader.myCurrentParagraphIsEmpty) {
			bookReader(reader).addControl(IMAGE, true);
		} else {
			endParagraph(reader);
		}
	}
	const std::string imageName = imageFile.name(false);
	bookReader(reader).addImageReference(imageName, 0, reader.myMarkNextImageAsCover);
	bookReader(reader).addImage(imageName, new ZLFileImage(imageFile, "", 0, 0, reader.myEncryptionMap->info(imageFile.path())));
	reader.myMarkNextImageAsCover = false;
	if (flagParagraphIsOpen && reader.myCurrentParagraphIsEmpty) {
		bookReader(reader).addControl(IMAGE, false);
		endParagraph(reader);
	}
}
コード例 #6
0
void XHTMLTagItemAction::doAtStart(XHTMLReader &reader, const char**) {
    bookReader(reader).endParagraph();
    // TODO: increase left indent
    bookReader(reader).beginParagraph();
    // TODO: replace bullet sign by number inside OL tag
    const std::string bullet = "\xE2\x80\xA2\xC0\xA0";
    bookReader(reader).addData(bullet);
}
コード例 #7
0
void MobipocketHtmlHrTagAction::run(const HtmlReader::HtmlTag &tag) {
	if (tag.Start) {
		if (bookReader().contentsParagraphIsOpen()) {
			bookReader().endContentsParagraph();
			bookReader().exitTitle();
		}
		bookReader().insertEndOfSectionParagraph();
	}
}
コード例 #8
0
void HtmlPreTagAction::run(const HtmlReader::HtmlTag &tag) {
	bookReader().endParagraph();
	myReader.myIsPreformatted = tag.Start;
	myReader.mySpaceCounter = -1;
	myReader.myBreakCounter = 0;
	if (myReader.myFormat.breakType() == PlainTextFormat::BREAK_PARAGRAPH_AT_NEW_LINE) {
		if (tag.Start) {
			bookReader().pushKind(PREFORMATTED);
		} else {
			bookReader().popKind();
		}
	}
	bookReader().beginParagraph();
}
コード例 #9
0
void XHTMLTagHyperlinkAction::doAtStart(XHTMLReader &reader, const char **xmlattributes) {
    const char *href = reader.attributeValue(xmlattributes, "href");
    if (href != 0) {
        const std::string link = (*href == '#') ? (reader.myReferenceName + href) : href;
        FBTextKind hyperlinkType = MiscUtil::isReference(link) ? EXTERNAL_HYPERLINK : INTERNAL_HYPERLINK;
        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.myReferenceName + "#" + name);
    }
}
コード例 #10
0
ファイル: HtmlBookReader.cpp プロジェクト: Ca5th/FBReaderJ
void HtmlImageTagAction::run(const HtmlReader::HtmlTag &tag) {
	if (tag.Start) {
		bookReader().endParagraph();
		const std::string *ptr = tag.find("src");
		if (ptr != 0) {
			const std::string fileName = MiscUtil::decodeHtmlURL(*ptr);
			const ZLFile file(myReader.myBaseDirPath + fileName);
			if (file.exists()) {
				bookReader().addImageReference(fileName, 0, false);
				bookReader().addImage(fileName, new ZLFileImage(file, "", 0));
			}
		}
		bookReader().beginParagraph();
	}
}
コード例 #11
0
void HtmlBreakTagAction::run(const HtmlReader::HtmlTag &tag) {
	if (myReader.myDontBreakParagraph) {
		myReader.myDontBreakParagraph = false;
		return;
	}

	if ((tag.Start && (myBreakType & BREAK_AT_START)) ||
			(!tag.Start && (myBreakType & BREAK_AT_END))) {
		bookReader().endParagraph();
		if (bookReader().isKindStackEmpty()) {
			bookReader().pushKind(REGULAR);
		}
		bookReader().beginParagraph();
	}
}
コード例 #12
0
ファイル: XHTMLReader.cpp プロジェクト: BrendanL79/FBReaderJ
void XHTMLTagVideoAction::doAtEnd(XHTMLReader &reader) {
	if (reader.myReadState == XHTML_READ_VIDEO) {
		bookReader(reader).addVideoEntry(*reader.myVideoEntry);
		reader.myVideoEntry.reset();
		reader.myReadState = XHTML_READ_BODY;
	}
}
コード例 #13
0
ファイル: XHTMLReader.cpp プロジェクト: Ca5th/FBReaderJ
void XHTMLTagItemAction::doAtStart(XHTMLReader &reader, const char**) {
	endParagraph(reader);
	beginParagraph(reader);
	if (!reader.myListNumStack.empty()) {
		bookReader(reader).addFixedHSpace(3 * reader.myListNumStack.size());
		int &index = reader.myListNumStack.top();
		if (index == 0) {
			static const std::string bullet = "\xE2\x80\xA2\xC0\xA0";
			bookReader(reader).addData(bullet);
		} else {
			bookReader(reader).addData(ZLStringUtil::numberToString(index++) + ".");
		}
		bookReader(reader).addFixedHSpace(1);
	}
	reader.myNewParagraphInProgress = true;
}
コード例 #14
0
ファイル: XHTMLReader.cpp プロジェクト: Alexander--/FBReaderJ
void XHTMLTagHyperlinkAction::doAtEnd(XHTMLReader &reader) {
	FBTextKind kind = myHyperlinkStack.top();
	if (kind != REGULAR) {
		bookReader(reader).addControl(kind, false);
	}
	myHyperlinkStack.pop();
}
コード例 #15
0
void EReaderPlugin::readDocumentInternal(const ZLFile &file, BookModel &model, const PlainTextFormat &format, const std::string &encoding, ZLInputStream &stream) const {
	if (!stream.open())	{
		//TODO maybe anything else opens stream
		return;
	}
	BookReader bookReader(model);
	PmlBookReader pmlBookReader(bookReader, format, encoding);
	bookReader.setMainTextModel();
	pmlBookReader.readDocument(stream);
	EReaderStream &estream = (EReaderStream&)stream;
	const std::map<std::string, EReaderStream::ImageInfo>& imageIds = estream.images();
	for(std::map<std::string, EReaderStream::ImageInfo>::const_iterator it = imageIds.begin(); it != imageIds.end(); ++it) {
		const std::string id = it->first;
		bookReader.addImage(id, new ZLFileImage(ZLFile(file.path(), it->second.Type), it->second.Offset, it->second.Size));
	}
	const std::map<std::string, unsigned short>& footnoteIds = estream.footnotes();
	for(std::map<std::string, unsigned short>::const_iterator it = footnoteIds.begin(); it != footnoteIds.end(); ++it) {
		const std::string id = it->first;
		if (estream.switchStreamDestination(EReaderStream::FOOTNOTE, id)) {
			bookReader.setFootnoteTextModel(id);
			bookReader.addHyperlinkLabel(id);
			pmlBookReader.readDocument(estream);
		}
	}
	stream.close();
}
コード例 #16
0
void MobipocketHtmlHrefTagAction::run(const HtmlReader::HtmlTag &tag) {
	MobipocketHtmlBookReader &reader = (MobipocketHtmlBookReader&)myReader;
	if (tag.Start) {
		for (unsigned int i = 0; i < tag.Attributes.size(); ++i) {
			if (tag.Attributes[i].Name == "FILEPOS") {
				const std::string &value = tag.Attributes[i].Value;
				if (!value.empty()) {
					std::string label = "&";
					int intValue = atoi(value.c_str());
					if (intValue > 0) {
						if (reader.myTocReader.rangeContainsPosition(tag.Offset)) {
							reader.myTocReader.startReadEntry(intValue);
							if (reader.myTocReader.rangeContainsPosition(intValue)) {
								reader.myTocReader.setEndOffset(intValue);
							}
						}
						reader.myFileposReferences.insert(intValue);
						ZLStringUtil::appendNumber(label, intValue);
						setHyperlinkType(INTERNAL_HYPERLINK);
						bookReader().addHyperlinkControl(INTERNAL_HYPERLINK, label);
						return;
					}
				}
			}
		}
	} else {
		reader.myTocReader.endReadEntry();
	}
	HtmlHrefTagAction::run(tag);
}
コード例 #17
0
ファイル: XHTMLReader.cpp プロジェクト: Alexander--/FBReaderJ
void XHTMLTagRestartParagraphAction::doAtStart(XHTMLReader &reader, const char**) {
	if (reader.myCurrentParagraphIsEmpty) {
		bookReader(reader).addData(" ");
	}
	endParagraph(reader);
	beginParagraph(reader);
}
コード例 #18
0
void HtmlSectionImageTagAction::run(const HtmlReader::HtmlTag &tag) {
	if (tag.Start) {
		//bookReader().endParagraph();
		HtmlSectionReader &reader = (HtmlSectionReader&)myReader;
		for (unsigned int i = 0; i < tag.Attributes.size(); ++i) {
			if (tag.Attributes[i].Name == "SRC") {
				std::string fileName = MiscUtil::decodeHtmlURL(tag.Attributes[i].Value);
				fileName = CHMReferenceCollection::fullReference(reader.myReferenceCollection.prefix(), fileName);
				fileName = ZLUnicodeUtil::toLower(fileName);
				bookReader().addImageReference(fileName);
				bookReader().addImage(fileName, new CHMFileImage(reader.myInfo, fileName));
				break;
			}
		}
		//bookReader().beginParagraph();
	}
}
コード例 #19
0
void HtmlImageTagAction::run(const HtmlReader::HtmlTag &tag) {
	if (tag.Start) {
		bookReader().endParagraph();
		for (unsigned int i = 0; i < tag.Attributes.size(); ++i) {
			if (tag.Attributes[i].Name == "SRC") {
				const std::string fileName = MiscUtil::decodeHtmlURL(tag.Attributes[i].Value);
				const ZLFile file(myReader.myBaseDirPath + fileName);
				if (file.exists()) {
					bookReader().addImageReference(fileName, 0, false);
					bookReader().addImage(fileName, new ZLFileImage(file, "", 0));
				}
				break;
			}
		}
		bookReader().beginParagraph();
	}
}
コード例 #20
0
void XHTMLTagImageAction::doAtStart(XHTMLReader &reader, const char **xmlattributes) {
    const char *fileName = reader.attributeValue(xmlattributes, myNameAttribute.c_str());
    if (fileName != 0) {
        bool flag = bookReader(reader).paragraphIsOpen();
        if (flag) {
            bookReader(reader).endParagraph();
        }
        if ((strlen(fileName) > 2) && strncmp(fileName, "./", 2) == 0) {
            fileName +=2;
        }
        const std::string fullfileName = pathPrefix(reader) + fileName;
        bookReader(reader).addImageReference(fullfileName);
        bookReader(reader).addImage(fullfileName, new ZLFileImage("image/auto", fullfileName, 0));
        if (flag) {
            bookReader(reader).beginParagraph();
        }
    }
}
コード例 #21
0
void XHTMLTagLineBreakAction::doAtEnd(XHTMLReader& reader) {
	BookReader &br = bookReader(reader);
	if (br.paragraphIsOpen()) {
		br.addLineBreak();
	} else {
		beginParagraph(reader);
		br.addLineBreak();
		endParagraph(reader);
	}
}
コード例 #22
0
ファイル: HtmlBookReader.cpp プロジェクト: Ca5th/FBReaderJ
void HtmlListItemTagAction::run(const HtmlReader::HtmlTag &tag) {
	if (tag.Start) {
		bookReader().endParagraph();
		bookReader().beginParagraph();
		if (!myReader.myListNumStack.empty()) {
			bookReader().addFixedHSpace(3 * myReader.myListNumStack.size());
			int &index = myReader.myListNumStack.top();
			if (index == 0) {
				myReader.addConvertedDataToBuffer("\342\200\242", 3, false);
			} else {
				const std::string number = ZLStringUtil::numberToString(index++) + ".";
				myReader.addConvertedDataToBuffer(number.data(), number.length(), false);
			}
			bookReader().addFixedHSpace(1);
			myReader.myDontBreakParagraph = true;
		}
	} else {
		myReader.myDontBreakParagraph = false;
	}
}
コード例 #23
0
void HtmlControlTagAction::run(const HtmlReader::HtmlTag &tag) {
	std::vector<FBTextKind> &list = myReader.myKindList;
	int index;
	for (index = list.size() - 1; index >= 0; --index) {
		if (list[index] == myKind) {
			break;
		}
	}
	if (tag.Start) {
		if (index == -1) {
			bookReader().pushKind(myKind);
			myReader.myKindList.push_back(myKind);
			bookReader().addControl(myKind, true);
		}
	} else {
		if (index >= 0) {
			for (int i = list.size() - 1; i >= index; --i) {
				bookReader().addControl(list[i], false);
				bookReader().popKind();
			}
			for (unsigned int j = index + 1; j < list.size(); ++j) {
				bookReader().addControl(list[j], true);
				bookReader().pushKind(list[j]);
			}
			list.erase(list.begin() + index);
		}
	}
}
コード例 #24
0
ファイル: XHTMLReader.cpp プロジェクト: Darion/FBReader
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) {
			link = (link[0] == '#') ?
				reader.myReferenceName + link :
				reader.myReferenceDirName + link;
			link = ZLFileUtil::normalizeUnixPath(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.myReferenceName + "#" + MiscUtil::decodeHtmlURL(name)
		);
	}
}
コード例 #25
0
void HtmlHeaderTagAction::run(const HtmlReader::HtmlTag &tag) {
	myReader.myIsStarted = false;
	if (tag.Start) {
		if (myReader.myBuildTableOfContent && !myReader.myIgnoreTitles) {
			if (!bookReader().contentsParagraphIsOpen()) {
				bookReader().insertEndOfSectionParagraph();
				bookReader().enterTitle();
				bookReader().beginContentsParagraph();
			}
		}
		bookReader().pushKind(myKind);
	} else {
		bookReader().popKind();
		if (myReader.myBuildTableOfContent && !myReader.myIgnoreTitles) {
			bookReader().endContentsParagraph();
			bookReader().exitTitle();
		}
	}
	bookReader().beginParagraph();
}
コード例 #26
0
void MobipocketHtmlImageTagAction::run(const HtmlReader::HtmlTag &tag) {
	if (tag.Start) {
		for (unsigned int i = 0; i < tag.Attributes.size(); ++i) {
			if (tag.Attributes[i].Name == "RECINDEX") {
				int index = atoi(tag.Attributes[i].Value.c_str());
				if (index > 0) {
					int &imageCounter = ((MobipocketHtmlBookReader&)myReader).myImageCounter;
					imageCounter = std::max(imageCounter, index);
					bool stopParagraph = bookReader().paragraphIsOpen();
					if (stopParagraph) {
						bookReader().endParagraph();
					}
					std::string id;
					ZLStringUtil::appendNumber(id, index);
					bookReader().addImageReference(id);
					if (stopParagraph) {
						bookReader().beginParagraph();
					}
				}
				break;
			}
		}
	}
}
コード例 #27
0
ファイル: XHTMLReader.cpp プロジェクト: Alexander--/FBReaderJ
void XHTMLTagPreAction::doAtEnd(XHTMLReader &reader) {
	bookReader(reader).addControl(CODE, false);
	endParagraph(reader);
	reader.myPreformatted = false;
}
コード例 #28
0
ファイル: XHTMLReader.cpp プロジェクト: Alexander--/FBReaderJ
void XHTMLTagPreAction::doAtStart(XHTMLReader &reader, const char**) {
	reader.myPreformatted = true;
	beginParagraph(reader);
	bookReader(reader).addControl(CODE, true);
}
コード例 #29
0
ファイル: XHTMLReader.cpp プロジェクト: Alexander--/FBReaderJ
void XHTMLTagParagraphWithControlAction::doAtEnd(XHTMLReader &reader) {
	endParagraph(reader);
	bookReader(reader).popKind();
}
コード例 #30
0
ファイル: XHTMLReader.cpp プロジェクト: Alexander--/FBReaderJ
void XHTMLTagControlAction::doAtEnd(XHTMLReader &reader) {
	bookReader(reader).addControl(myControl, false);
	bookReader(reader).popKind();
}