diff --git a/ChangeLog b/ChangeLog
index a0c7a4057..0ca91fe41 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -7,6 +7,7 @@
===== 2.1.4 (Sep ??, 2014) =====
* (planned) Fixed authors list/tags list editing
+* CSS: fixed
/ top/bottom margin behaviour
===== 2.1.3 (Sep 18, 2014) =====
* CSS: fixed multiple entries for same selector
diff --git a/jni/NativeFormats/fbreader/src/formats/xhtml/XHTMLReader.cpp b/jni/NativeFormats/fbreader/src/formats/xhtml/XHTMLReader.cpp
index f58aeeb57..241c342a5 100644
--- a/jni/NativeFormats/fbreader/src/formats/xhtml/XHTMLReader.cpp
+++ b/jni/NativeFormats/fbreader/src/formats/xhtml/XHTMLReader.cpp
@@ -329,17 +329,25 @@ XHTMLTagListAction::XHTMLTagListAction(int startIndex) : myStartIndex(startIndex
void XHTMLTagListAction::doAtStart(XHTMLReader &reader, const char**) {
reader.myListNumStack.push(myStartIndex);
+ beginParagraph(reader);
}
void XHTMLTagListAction::doAtEnd(XHTMLReader &reader) {
+ endParagraph(reader);
if (!reader.myListNumStack.empty()) {
reader.myListNumStack.pop();
}
}
void XHTMLTagItemAction::doAtStart(XHTMLReader &reader, const char**) {
- endParagraph(reader);
- beginParagraph(reader);
+ bool restart = true;
+ if (reader.myTagDataStack.size() >= 2) {
+ restart = reader.myTagDataStack[reader.myTagDataStack.size() - 2]->ChildCount > 1;
+ }
+ if (restart) {
+ endParagraph(reader);
+ beginParagraph(reader);
+ }
if (!reader.myListNumStack.empty()) {
bookReader(reader).addFixedHSpace(3 * reader.myListNumStack.size());
int &index = reader.myListNumStack.top();
@@ -355,7 +363,6 @@ void XHTMLTagItemAction::doAtStart(XHTMLReader &reader, const char**) {
}
void XHTMLTagItemAction::doAtEnd(XHTMLReader &reader) {
- endParagraph(reader);
}
bool XHTMLTagVideoAction::isEnabled(XHTMLReadingState state) {
@@ -673,7 +680,7 @@ bool XHTMLReader::readFile(const ZLFile &file, const std::string &referenceName)
bool XHTMLReader::addTextStyleEntry(const std::string tag, const std::string aClass) {
shared_ptr entry = myStyleSheetTable.control(tag, aClass);
if (!entry.isNull()) {
- addTextStyleEntry(*entry);
+ addTextStyleEntry(*(entry->start()));
myTagDataStack.back()->StyleEntries.push_back(entry);
return true;
}
@@ -725,6 +732,9 @@ void XHTMLReader::startElementHandler(const char *tag, const char **attributes)
return;
}
+ if (!myTagDataStack.empty()) {
+ myTagDataStack.back()->ChildCount += 1;
+ }
myTagDataStack.push_back(new TagData());
static const std::string HASH = "#";
@@ -783,17 +793,28 @@ void XHTMLReader::endElementHandler(const char *tag) {
return;
}
+ const TagData &tagData = *myTagDataStack.back();
+ const std::vector > &entries = tagData.StyleEntries;
+ size_t entryCount = entries.size();
+ for (std::vector >::const_iterator jt = entries.begin(); jt != entries.end(); ++jt) {
+ shared_ptr endEntry = (*jt)->end();
+ if (!endEntry.isNull()) {
+ addTextStyleEntry(*endEntry);
+ ++entryCount;
+ }
+ }
+
XHTMLTagAction *action = getAction(sTag);
if (action != 0 && action->isEnabled(myReadState)) {
action->doAtEnd(*this);
myNewParagraphInProgress = false;
}
- for (int i = myTagDataStack.back()->StyleEntries.size(); i > 0; --i) {
+ for (; entryCount > 0; --entryCount) {
myModelReader.addStyleCloseEntry();
}
- if (myTagDataStack.back()->PageBreakAfter) {
+ if (tagData.PageBreakAfter) {
myModelReader.insertEndOfSectionParagraph();
}
@@ -811,7 +832,7 @@ void XHTMLReader::beginParagraph(bool restarted) {
const std::vector > &entries = (*it)->StyleEntries;
bool inheritedOnly = !restarted || it + 1 != myTagDataStack.end();
for (std::vector >::const_iterator jt = entries.begin(); jt != entries.end(); ++jt) {
- shared_ptr entry = inheritedOnly ? (*jt)->inherited() : *jt;
+ shared_ptr entry = inheritedOnly ? (*jt)->inherited() : (*jt)->start();
addTextStyleEntry(*entry);
}
}
@@ -929,3 +950,6 @@ const std::string &XHTMLReader::fileAlias(const std::string &fileName) const {
it = myFileNumbers.find(correctedFileName);
return it->second;
}
+
+XHTMLReader::TagData::TagData() : PageBreakAfter(false), ChildCount(0) {
+}
diff --git a/jni/NativeFormats/fbreader/src/formats/xhtml/XHTMLReader.h b/jni/NativeFormats/fbreader/src/formats/xhtml/XHTMLReader.h
index 68f2821b4..322fc0783 100644
--- a/jni/NativeFormats/fbreader/src/formats/xhtml/XHTMLReader.h
+++ b/jni/NativeFormats/fbreader/src/formats/xhtml/XHTMLReader.h
@@ -70,6 +70,9 @@ public:
std::vector TextKinds;
std::vector > StyleEntries;
bool PageBreakAfter;
+ size_t ChildCount;
+
+ TagData();
};
public:
diff --git a/jni/NativeFormats/zlibrary/text/src/model/ZLTextStyleEntry.cpp b/jni/NativeFormats/zlibrary/text/src/model/ZLTextStyleEntry.cpp
index 412021763..c9d044b93 100644
--- a/jni/NativeFormats/zlibrary/text/src/model/ZLTextStyleEntry.cpp
+++ b/jni/NativeFormats/zlibrary/text/src/model/ZLTextStyleEntry.cpp
@@ -19,6 +19,29 @@
#include "ZLTextStyleEntry.h"
+shared_ptr ZLTextStyleEntry::start() const {
+ ZLTextStyleEntry *clone = new ZLTextStyleEntry(myEntryKind);
+ clone->myFeatureMask = myFeatureMask & ~(1 << LENGTH_SPACE_AFTER);
+ for (int i = 0; i < NUMBER_OF_LENGTHS; ++i) {
+ clone->myLengths[i] = myLengths[i];
+ }
+ clone->myAlignmentType = myAlignmentType;
+ clone->mySupportedFontModifier = mySupportedFontModifier;
+ clone->myFontModifier = myFontModifier;
+ clone->myFontFamilies = myFontFamilies;
+ return clone;
+}
+
+shared_ptr ZLTextStyleEntry::end() const {
+ if ((myFeatureMask & (1 << LENGTH_SPACE_AFTER)) == 0) {
+ return 0;
+ }
+ ZLTextStyleEntry *clone = new ZLTextStyleEntry(myEntryKind);
+ clone->myFeatureMask = 1 << LENGTH_SPACE_AFTER;
+ clone->myLengths[LENGTH_SPACE_AFTER] = myLengths[LENGTH_SPACE_AFTER];
+ return clone;
+}
+
shared_ptr ZLTextStyleEntry::inherited() const {
ZLTextStyleEntry *clone = new ZLTextStyleEntry(myEntryKind);
clone->myFeatureMask = myFeatureMask & ~(1 << LENGTH_SPACE_BEFORE) & ~(1 << LENGTH_SPACE_AFTER);
diff --git a/jni/NativeFormats/zlibrary/text/src/model/ZLTextStyleEntry.h b/jni/NativeFormats/zlibrary/text/src/model/ZLTextStyleEntry.h
index 636ca32f8..fcc95adbb 100644
--- a/jni/NativeFormats/zlibrary/text/src/model/ZLTextStyleEntry.h
+++ b/jni/NativeFormats/zlibrary/text/src/model/ZLTextStyleEntry.h
@@ -102,6 +102,8 @@ public:
const std::vector &fontFamilies() const;
void setFontFamilies(const std::vector &fontFamilies);
+ shared_ptr start() const;
+ shared_ptr end() const;
shared_ptr inherited() const;
private: