Proper support of superscript/subscript
This commit is contained in:
@@ -205,6 +205,8 @@ void ChapterHtmlSlimParser::updateEffectiveInlineStyle() {
|
||||
effectiveStrikethrough =
|
||||
currentCssStyle.hasTextDecoration() && (static_cast<uint8_t>(currentCssStyle.textDecoration) &
|
||||
static_cast<uint8_t>(CssTextDecoration::LineThrough)) != 0;
|
||||
effectiveSup = false;
|
||||
effectiveSub = false;
|
||||
|
||||
// Apply inline style stack in order
|
||||
for (const auto& entry : inlineStyleStack) {
|
||||
@@ -220,6 +222,14 @@ void ChapterHtmlSlimParser::updateEffectiveInlineStyle() {
|
||||
if (entry.hasStrikethrough) {
|
||||
effectiveStrikethrough = entry.strikethrough;
|
||||
}
|
||||
if (entry.hasSup) {
|
||||
effectiveSup = entry.sup;
|
||||
if (entry.sup) effectiveSub = false;
|
||||
}
|
||||
if (entry.hasSub) {
|
||||
effectiveSub = entry.sub;
|
||||
if (entry.sub) effectiveSup = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -280,6 +290,11 @@ bool ChapterHtmlSlimParser::flushPartWordBuffer() {
|
||||
if (isStrikethrough) {
|
||||
fontStyle = static_cast<EpdFontFamily::Style>(fontStyle | EpdFontFamily::STRIKETHROUGH);
|
||||
}
|
||||
if (effectiveSup) {
|
||||
fontStyle = static_cast<EpdFontFamily::Style>(fontStyle | EpdFontFamily::SUP);
|
||||
} else if (effectiveSub) {
|
||||
fontStyle = static_cast<EpdFontFamily::Style>(fontStyle | EpdFontFamily::SUB);
|
||||
}
|
||||
|
||||
// flush the buffer — route to table cell text when inside a <td>/<th>
|
||||
partWordBuffer[partWordBufferIndex] = '\0';
|
||||
@@ -1168,12 +1183,17 @@ void XMLCALL ChapterHtmlSlimParser::startElement(void* userData, const XML_Char*
|
||||
if (!self->flushPartWordBuffer()) return;
|
||||
self->nextWordContinues = true;
|
||||
}
|
||||
const char* prefix = (strcmp(name, "sup") == 0) ? "^" : "_";
|
||||
self->currentTextBlock->addWord(prefix, EpdFontFamily::REGULAR, false, true);
|
||||
self->nextWordContinues = true;
|
||||
StyleStackEntry entry;
|
||||
entry.depth = self->depth;
|
||||
if (strcmp(name, "sup") == 0) {
|
||||
entry.hasSup = true;
|
||||
entry.sup = true;
|
||||
} else {
|
||||
entry.hasSub = true;
|
||||
entry.sub = true;
|
||||
}
|
||||
self->inlineStyleStack.push_back(entry);
|
||||
self->updateEffectiveInlineStyle();
|
||||
} else if (strcmp(name, "span") == 0 || !isHeaderOrBlock(name)) {
|
||||
// Handle span and other inline elements for CSS styling
|
||||
if (cssStyle.hasFontWeight() || cssStyle.hasFontStyle() || cssStyle.hasTextDecoration()) {
|
||||
|
||||
@@ -66,6 +66,8 @@ class ChapterHtmlSlimParser final : public Print {
|
||||
bool hasItalic = false, italic = false;
|
||||
bool hasUnderline = false, underline = false;
|
||||
bool hasStrikethrough = false, strikethrough = false;
|
||||
bool hasSup = false, sup = false;
|
||||
bool hasSub = false, sub = false;
|
||||
};
|
||||
std::vector<StyleStackEntry> inlineStyleStack;
|
||||
CssStyle currentCssStyle;
|
||||
@@ -73,6 +75,8 @@ class ChapterHtmlSlimParser final : public Print {
|
||||
bool effectiveItalic = false;
|
||||
bool effectiveUnderline = false;
|
||||
bool effectiveStrikethrough = false;
|
||||
bool effectiveSup = false;
|
||||
bool effectiveSub = false;
|
||||
// Buffered table model — populated while inside <table>, emitted on </table>
|
||||
struct BufferedTableCell {
|
||||
std::unique_ptr<ParsedText> text;
|
||||
|
||||
Reference in New Issue
Block a user