1
0
Fork 0
mirror of https://github.com/geometer/FBReaderJ.git synced 2025-10-04 18:29:23 +02:00

fixed svg namespace processing

This commit is contained in:
Nikolay Pultsin 2013-01-03 01:36:19 +00:00
parent 8b57df7dc9
commit 9711842566
9 changed files with 140 additions and 99 deletions

View file

@ -38,6 +38,7 @@
#include "../../bookmodel/BookModel.h"
std::map<std::string,XHTMLTagAction*> XHTMLReader::ourTagActions;
std::map<shared_ptr<XHTMLReader::FullNamePredicate>,XHTMLTagAction*> XHTMLReader::ourNsTagActions;
XHTMLTagAction::~XHTMLTagAction() {
}
@ -96,20 +97,20 @@ public:
class XHTMLTagImageAction : public XHTMLTagAction {
public:
XHTMLTagImageAction(shared_ptr<ZLXMLReader::AttributeNamePredicate> predicate);
XHTMLTagImageAction(shared_ptr<ZLXMLReader::NamePredicate> predicate);
XHTMLTagImageAction(const std::string &attributeName);
void doAtStart(XHTMLReader &reader, const char **xmlattributes);
void doAtEnd(XHTMLReader &reader);
private:
shared_ptr<ZLXMLReader::AttributeNamePredicate> myPredicate;
shared_ptr<ZLXMLReader::NamePredicate> myPredicate;
};
class XHTMLSvgImageAttributeNamePredicate : public ZLXMLReader::NamespaceAttributeNamePredicate {
class XHTMLSvgImageNamePredicate : public ZLXMLReader::FullNamePredicate {
public:
XHTMLSvgImageAttributeNamePredicate();
XHTMLSvgImageNamePredicate();
bool accepts(const ZLXMLReader &reader, const char *name) const;
private:
@ -121,12 +122,12 @@ friend class XHTMLTagSvgAction;
class XHTMLTagSvgAction : public XHTMLTagAction {
public:
XHTMLTagSvgAction(XHTMLSvgImageAttributeNamePredicate &predicate);
XHTMLTagSvgAction(XHTMLSvgImageNamePredicate &predicate);
void doAtStart(XHTMLReader &reader, const char **xmlattributes);
void doAtEnd(XHTMLReader &reader);
private:
XHTMLSvgImageAttributeNamePredicate &myPredicate;
XHTMLSvgImageNamePredicate &myPredicate;
};
class XHTMLTagItemAction : public XHTMLTagAction {
@ -275,12 +276,12 @@ void XHTMLTagItemAction::doAtEnd(XHTMLReader &reader) {
endParagraph(reader);
}
XHTMLTagImageAction::XHTMLTagImageAction(shared_ptr<ZLXMLReader::AttributeNamePredicate> predicate) {
XHTMLTagImageAction::XHTMLTagImageAction(shared_ptr<ZLXMLReader::NamePredicate> predicate) {
myPredicate = predicate;
}
XHTMLTagImageAction::XHTMLTagImageAction(const std::string &attributeName) {
myPredicate = new ZLXMLReader::FixedAttributeNamePredicate(attributeName);
myPredicate = new ZLXMLReader::SimpleNamePredicate(attributeName);
}
void XHTMLTagImageAction::doAtStart(XHTMLReader &reader, const char **xmlattributes) {
@ -307,7 +308,7 @@ void XHTMLTagImageAction::doAtStart(XHTMLReader &reader, const char **xmlattribu
}
}
XHTMLTagSvgAction::XHTMLTagSvgAction(XHTMLSvgImageAttributeNamePredicate &predicate) : myPredicate(predicate) {
XHTMLTagSvgAction::XHTMLTagSvgAction(XHTMLSvgImageNamePredicate &predicate) : myPredicate(predicate) {
}
void XHTMLTagSvgAction::doAtStart(XHTMLReader&, const char**) {
@ -318,11 +319,11 @@ void XHTMLTagSvgAction::doAtEnd(XHTMLReader&) {
myPredicate.myIsEnabled = false;
}
XHTMLSvgImageAttributeNamePredicate::XHTMLSvgImageAttributeNamePredicate() : ZLXMLReader::NamespaceAttributeNamePredicate(ZLXMLNamespace::XLink, "href"), myIsEnabled(false) {
XHTMLSvgImageNamePredicate::XHTMLSvgImageNamePredicate() : ZLXMLReader::FullNamePredicate(ZLXMLNamespace::XLink, "href"), myIsEnabled(false) {
}
bool XHTMLSvgImageAttributeNamePredicate::accepts(const ZLXMLReader &reader, const char *name) const {
return myIsEnabled && NamespaceAttributeNamePredicate::accepts(reader, name);
bool XHTMLSvgImageNamePredicate::accepts(const ZLXMLReader &reader, const char *name) const {
return myIsEnabled && FullNamePredicate::accepts(reader, name);
}
void XHTMLTagImageAction::doAtEnd(XHTMLReader&) {
@ -407,81 +408,104 @@ XHTMLTagAction *XHTMLReader::addAction(const std::string &tag, XHTMLTagAction *a
return old;
}
XHTMLTagAction *XHTMLReader::addAction(const std::string &ns, const std::string &name, XHTMLTagAction *action) {
shared_ptr<FullNamePredicate> predicate = new FullNamePredicate(ns, name);
XHTMLTagAction *old = ourNsTagActions[predicate];
ourNsTagActions[predicate] = action;
return old;
}
XHTMLTagAction *XHTMLReader::getAction(const std::string &tag) {
const std::string lTag = ZLUnicodeUtil::toLower(tag);
XHTMLTagAction *action = ourTagActions[lTag];
if (action != 0) {
return action;
}
for (std::map<shared_ptr<FullNamePredicate>,XHTMLTagAction*>::const_iterator it = ourNsTagActions.begin(); it != ourNsTagActions.end(); ++it) {
if (it->first->accepts(*this, lTag)) {
return it->second;
}
}
return 0;
}
void XHTMLReader::fillTagTable() {
if (ourTagActions.empty()) {
//addAction("html", new XHTMLTagAction());
addAction("body", new XHTMLTagBodyAction());
//addAction("title", new XHTMLTagAction());
//addAction("meta", new XHTMLTagAction());
//addAction("script", new XHTMLTagAction());
//addAction("html", new XHTMLTagAction());
addAction("body", new XHTMLTagBodyAction());
//addAction("title", new XHTMLTagAction());
//addAction("meta", new XHTMLTagAction());
//addAction("script", new XHTMLTagAction());
//addAction("font", new XHTMLTagAction());
addAction("style", new XHTMLTagStyleAction());
//addAction("font", new XHTMLTagAction());
addAction("style", new XHTMLTagStyleAction());
addAction("p", new XHTMLTagParagraphAction());
addAction("h1", new XHTMLTagParagraphWithControlAction(H1));
addAction("h2", new XHTMLTagParagraphWithControlAction(H2));
addAction("h3", new XHTMLTagParagraphWithControlAction(H3));
addAction("h4", new XHTMLTagParagraphWithControlAction(H4));
addAction("h5", new XHTMLTagParagraphWithControlAction(H5));
addAction("h6", new XHTMLTagParagraphWithControlAction(H6));
addAction("p", new XHTMLTagParagraphAction());
addAction("h1", new XHTMLTagParagraphWithControlAction(H1));
addAction("h2", new XHTMLTagParagraphWithControlAction(H2));
addAction("h3", new XHTMLTagParagraphWithControlAction(H3));
addAction("h4", new XHTMLTagParagraphWithControlAction(H4));
addAction("h5", new XHTMLTagParagraphWithControlAction(H5));
addAction("h6", new XHTMLTagParagraphWithControlAction(H6));
//addAction("ol", new XHTMLTagAction());
//addAction("ul", new XHTMLTagAction());
//addAction("dl", new XHTMLTagAction());
addAction("li", new XHTMLTagItemAction());
//addAction("ol", new XHTMLTagAction());
//addAction("ul", new XHTMLTagAction());
//addAction("dl", new XHTMLTagAction());
addAction("li", new XHTMLTagItemAction());
addAction("strong", new XHTMLTagControlAction(STRONG));
addAction("b", new XHTMLTagControlAction(BOLD));
addAction("em", new XHTMLTagControlAction(EMPHASIS));
addAction("i", new XHTMLTagControlAction(ITALIC));
addAction("code", new XHTMLTagControlAction(CODE));
addAction("tt", new XHTMLTagControlAction(CODE));
addAction("kbd", new XHTMLTagControlAction(CODE));
addAction("var", new XHTMLTagControlAction(CODE));
addAction("samp", new XHTMLTagControlAction(CODE));
addAction("cite", new XHTMLTagControlAction(CITE));
addAction("sub", new XHTMLTagControlAction(SUB));
addAction("sup", new XHTMLTagControlAction(SUP));
addAction("dd", new XHTMLTagControlAction(DEFINITION_DESCRIPTION));
addAction("dfn", new XHTMLTagControlAction(DEFINITION));
addAction("strike", new XHTMLTagControlAction(STRIKETHROUGH));
addAction("strong", new XHTMLTagControlAction(STRONG));
addAction("b", new XHTMLTagControlAction(BOLD));
addAction("em", new XHTMLTagControlAction(EMPHASIS));
addAction("i", new XHTMLTagControlAction(ITALIC));
addAction("code", new XHTMLTagControlAction(CODE));
addAction("tt", new XHTMLTagControlAction(CODE));
addAction("kbd", new XHTMLTagControlAction(CODE));
addAction("var", new XHTMLTagControlAction(CODE));
addAction("samp", new XHTMLTagControlAction(CODE));
addAction("cite", new XHTMLTagControlAction(CITE));
addAction("sub", new XHTMLTagControlAction(SUB));
addAction("sup", new XHTMLTagControlAction(SUP));
addAction("dd", new XHTMLTagControlAction(DEFINITION_DESCRIPTION));
addAction("dfn", new XHTMLTagControlAction(DEFINITION));
addAction("strike", new XHTMLTagControlAction(STRIKETHROUGH));
addAction("a", new XHTMLTagHyperlinkAction());
addAction("a", new XHTMLTagHyperlinkAction());
addAction("img", new XHTMLTagImageAction("src"));
addAction("object", new XHTMLTagImageAction("data"));
XHTMLSvgImageAttributeNamePredicate *predicate = new XHTMLSvgImageAttributeNamePredicate();
addAction("image", new XHTMLTagImageAction(predicate));
addAction("svg", new XHTMLTagSvgAction(*predicate));
addAction("img", new XHTMLTagImageAction("src"));
addAction("object", new XHTMLTagImageAction("data"));
XHTMLSvgImageNamePredicate *predicate = new XHTMLSvgImageNamePredicate();
addAction("svg", new XHTMLTagSvgAction(*predicate));
addAction("image", new XHTMLTagImageAction(predicate));
addAction(ZLXMLNamespace::Svg, "svg", new XHTMLTagSvgAction(*predicate));
addAction(ZLXMLNamespace::Svg, "image", new XHTMLTagImageAction(predicate));
//addAction("area", new XHTMLTagAction());
//addAction("map", new XHTMLTagAction());
//addAction("area", new XHTMLTagAction());
//addAction("map", new XHTMLTagAction());
//addAction("base", new XHTMLTagAction());
//addAction("blockquote", new XHTMLTagAction());
addAction("br", new XHTMLTagRestartParagraphAction());
//addAction("center", new XHTMLTagAction());
//addAction("base", new XHTMLTagAction());
//addAction("blockquote", new XHTMLTagAction());
addAction("br", new XHTMLTagRestartParagraphAction());
//addAction("center", new XHTMLTagAction());
addAction("div", new XHTMLTagParagraphAction());
addAction("dt", new XHTMLTagParagraphAction());
//addAction("head", new XHTMLTagAction());
//addAction("hr", new XHTMLTagAction());
addAction("link", new XHTMLTagLinkAction());
//addAction("param", new XHTMLTagAction());
//addAction("q", new XHTMLTagAction());
//addAction("s", new XHTMLTagAction());
//addAction("head", new XHTMLTagAction());
//addAction("hr", new XHTMLTagAction());
addAction("link", new XHTMLTagLinkAction());
//addAction("param", new XHTMLTagAction());
//addAction("q", new XHTMLTagAction());
//addAction("s", new XHTMLTagAction());
addAction("pre", new XHTMLTagPreAction());
//addAction("big", new XHTMLTagAction());
//addAction("small", new XHTMLTagAction());
//addAction("u", new XHTMLTagAction());
addAction("pre", new XHTMLTagPreAction());
//addAction("big", new XHTMLTagAction());
//addAction("small", new XHTMLTagAction());
//addAction("u", new XHTMLTagAction());
//addAction("table", new XHTMLTagAction());
addAction("td", new XHTMLTagParagraphAction());
addAction("th", new XHTMLTagParagraphAction());
//addAction("tr", new XHTMLTagAction());
//addAction("caption", new XHTMLTagAction());
//addAction("span", new XHTMLTagAction());
//addAction("table", new XHTMLTagAction());
addAction("td", new XHTMLTagParagraphAction());
addAction("th", new XHTMLTagParagraphAction());
//addAction("tr", new XHTMLTagAction());
//addAction("caption", new XHTMLTagAction());
//addAction("span", new XHTMLTagAction());
}
}
@ -542,7 +566,7 @@ void XHTMLReader::startElementHandler(const char *tag, const char **attributes)
}
myDoPageBreakAfterStack.push_back(myStyleSheetTable.doBreakAfter(sTag, sClass));
XHTMLTagAction *action = ourTagActions[sTag];
XHTMLTagAction *action = getAction(sTag);
if (action != 0) {
action->doAtStart(*this, attributes);
}
@ -569,7 +593,7 @@ void XHTMLReader::endElementHandler(const char *tag) {
myStylesToRemove = myCSSStack.back();
myCSSStack.pop_back();
XHTMLTagAction *action = ourTagActions[ZLUnicodeUtil::toLower(tag)];
XHTMLTagAction *action = getAction(tag);
if (action != 0) {
action->doAtEnd(*this);
myNewParagraphInProgress = false;