1
0
Fork 0
mirror of https://github.com/geometer/FBReaderJ.git synced 2025-10-05 10:49:24 +02:00

StyleSheetTable::Key replaced with CSSSelector

This commit is contained in:
Nikolay Pultsin 2014-10-12 01:58:06 +02:00
parent 4d4a096e3f
commit 4de9d69bc0
4 changed files with 51 additions and 40 deletions

View file

@ -21,6 +21,11 @@
#include "CSSSelector.h" #include "CSSSelector.h"
CSSSelector::CSSSelector(const std::string &tag, const std::string &clazz) {
Tag = tag;
Class = clazz;
}
CSSSelector::CSSSelector(const std::string &simple) { CSSSelector::CSSSelector(const std::string &simple) {
const std::size_t index = simple.find('.'); const std::size_t index = simple.find('.');
if (index == std::string::npos) { if (index == std::string::npos) {
@ -84,3 +89,25 @@ shared_ptr<CSSSelector> CSSSelector::parse(const std::string &data) {
return selector; return selector;
} }
bool CSSSelector::operator < (const CSSSelector &selector) const {
int diff = Tag.compare(selector.Tag);
if (diff != 0) {
return diff < 0;
}
diff = Class.compare(selector.Class);
if (diff != 0) {
return diff < 0;
}
if (selector.Next.isNull()) {
return false;
}
if (Next.isNull()) {
return true;
}
diff = Next->Delimiter - selector.Next->Delimiter;
if (diff != 0) {
return diff < 0;
}
return *(Next->Selector) < *(selector.Next->Selector);
}

View file

@ -50,6 +50,10 @@ private:
private: private:
CSSSelector(const std::string &simple); CSSSelector(const std::string &simple);
public:
CSSSelector(const std::string &tag, const std::string &clazz);
bool operator < (const CSSSelector &selector) const;
public: public:
std::string Tag; std::string Tag;
std::string Class; std::string Class;

View file

@ -29,23 +29,23 @@ bool StyleSheetTable::isEmpty() const {
return myControlMap.empty() && myPageBreakBeforeMap.empty() && myPageBreakAfterMap.empty(); return myControlMap.empty() && myPageBreakBeforeMap.empty() && myPageBreakAfterMap.empty();
} }
void StyleSheetTable::addMap(shared_ptr<CSSSelector> selector, const AttributeMap &map) { void StyleSheetTable::addMap(shared_ptr<CSSSelector> selectorPtr, const AttributeMap &map) {
if (!selector.isNull() && selector->Next.isNull() && !map.empty()) { if (!selectorPtr.isNull() && !map.empty()) {
const Key key(selector->Tag, selector->Class); const CSSSelector &selector = *selectorPtr;
myControlMap[key] = createOrUpdateControl(map, myControlMap[key]); myControlMap[selector] = createOrUpdateControl(map, myControlMap[selector]);
const std::string &pbb = value(map, "page-break-before"); const std::string &pbb = value(map, "page-break-before");
if (pbb == "always" || pbb == "left" || pbb == "right") { if (pbb == "always" || pbb == "left" || pbb == "right") {
myPageBreakBeforeMap[key] = true; myPageBreakBeforeMap[selector] = true;
} else if (pbb == "avoid") { } else if (pbb == "avoid") {
myPageBreakBeforeMap[key] = false; myPageBreakBeforeMap[selector] = false;
} }
const std::string &pba = value(map, "page-break-after"); const std::string &pba = value(map, "page-break-after");
if (pba == "always" || pba == "left" || pba == "right") { if (pba == "always" || pba == "left" || pba == "right") {
myPageBreakAfterMap[key] = true; myPageBreakAfterMap[selector] = true;
} else if (pba == "avoid") { } else if (pba == "avoid") {
myPageBreakAfterMap[key] = false; myPageBreakAfterMap[selector] = false;
} }
} }
} }
@ -96,17 +96,17 @@ void StyleSheetTable::setLength(ZLTextStyleEntry &entry, ZLTextStyleEntry::Featu
} }
bool StyleSheetTable::doBreakBefore(const std::string &tag, const std::string &aClass) const { bool StyleSheetTable::doBreakBefore(const std::string &tag, const std::string &aClass) const {
std::map<Key,bool>::const_iterator it = myPageBreakBeforeMap.find(Key(tag, aClass)); std::map<CSSSelector,bool>::const_iterator it = myPageBreakBeforeMap.find(CSSSelector(tag, aClass));
if (it != myPageBreakBeforeMap.end()) { if (it != myPageBreakBeforeMap.end()) {
return it->second; return it->second;
} }
it = myPageBreakBeforeMap.find(Key("", aClass)); it = myPageBreakBeforeMap.find(CSSSelector("", aClass));
if (it != myPageBreakBeforeMap.end()) { if (it != myPageBreakBeforeMap.end()) {
return it->second; return it->second;
} }
it = myPageBreakBeforeMap.find(Key(tag, "")); it = myPageBreakBeforeMap.find(CSSSelector(tag, ""));
if (it != myPageBreakBeforeMap.end()) { if (it != myPageBreakBeforeMap.end()) {
return it->second; return it->second;
} }
@ -115,17 +115,17 @@ bool StyleSheetTable::doBreakBefore(const std::string &tag, const std::string &a
} }
bool StyleSheetTable::doBreakAfter(const std::string &tag, const std::string &aClass) const { bool StyleSheetTable::doBreakAfter(const std::string &tag, const std::string &aClass) const {
std::map<Key,bool>::const_iterator it = myPageBreakAfterMap.find(Key(tag, aClass)); std::map<CSSSelector,bool>::const_iterator it = myPageBreakAfterMap.find(CSSSelector(tag, aClass));
if (it != myPageBreakAfterMap.end()) { if (it != myPageBreakAfterMap.end()) {
return it->second; return it->second;
} }
it = myPageBreakAfterMap.find(Key("", aClass)); it = myPageBreakAfterMap.find(CSSSelector("", aClass));
if (it != myPageBreakAfterMap.end()) { if (it != myPageBreakAfterMap.end()) {
return it->second; return it->second;
} }
it = myPageBreakAfterMap.find(Key(tag, "")); it = myPageBreakAfterMap.find(CSSSelector(tag, ""));
if (it != myPageBreakAfterMap.end()) { if (it != myPageBreakAfterMap.end()) {
return it->second; return it->second;
} }
@ -134,8 +134,8 @@ bool StyleSheetTable::doBreakAfter(const std::string &tag, const std::string &aC
} }
shared_ptr<ZLTextStyleEntry> StyleSheetTable::control(const std::string &tag, const std::string &aClass) const { shared_ptr<ZLTextStyleEntry> StyleSheetTable::control(const std::string &tag, const std::string &aClass) const {
std::map<Key,shared_ptr<ZLTextStyleEntry> >::const_iterator it = std::map<CSSSelector,shared_ptr<ZLTextStyleEntry> >::const_iterator it =
myControlMap.find(Key(tag, aClass)); myControlMap.find(CSSSelector(tag, aClass));
return it != myControlMap.end() ? it->second : 0; return it != myControlMap.end() ? it->second : 0;
} }

View file

@ -29,7 +29,7 @@
#include <ZLTextParagraph.h> #include <ZLTextParagraph.h>
#include <ZLTextStyleEntry.h> #include <ZLTextStyleEntry.h>
class CSSSelector; #include "CSSSelector.h"
class StyleSheetTable { class StyleSheetTable {
@ -52,32 +52,12 @@ public:
void clear(); void clear();
private: private:
struct Key { std::map<CSSSelector,shared_ptr<ZLTextStyleEntry> > myControlMap;
Key(const std::string &tag, const std::string &aClass); std::map<CSSSelector,bool> myPageBreakBeforeMap;
std::map<CSSSelector,bool> myPageBreakAfterMap;
const std::string TagName;
const std::string ClassName;
bool operator < (const Key &key) const;
};
std::map<Key,shared_ptr<ZLTextStyleEntry> > myControlMap;
std::map<Key,bool> myPageBreakBeforeMap;
std::map<Key,bool> myPageBreakAfterMap;
friend class StyleSheetTableParser; friend class StyleSheetTableParser;
friend class StyleSheetParserWithCache; friend class StyleSheetParserWithCache;
}; };
inline StyleSheetTable::Key::Key(const std::string &tag, const std::string &aClass) : TagName(tag), ClassName(aClass) {
}
inline bool StyleSheetTable::Key::operator < (const StyleSheetTable::Key &key) const {
const int diff = TagName.compare(key.TagName);
if (diff != 0) {
return diff < 0;
}
return ClassName < key.ClassName;
}
#endif /* __STYLESHEETTABLE_H__ */ #endif /* __STYLESHEETTABLE_H__ */