Review comments
This commit is contained in:
@@ -18,17 +18,22 @@ void TextBlock::render(const GfxRenderer& renderer, const int fontId, const int
|
||||
renderer.drawText(fontId, wordX, y, words[i].c_str(), true, currentStyle);
|
||||
|
||||
const std::string& w = words[i];
|
||||
const int fullWordWidth = renderer.getTextWidth(fontId, w.c_str(), currentStyle);
|
||||
int startX = wordX;
|
||||
int lineWidth = fullWordWidth;
|
||||
const bool hasEmSpacePrefix = w.size() >= 3 && static_cast<uint8_t>(w[0]) == 0xE2 &&
|
||||
static_cast<uint8_t>(w[1]) == 0x80 && static_cast<uint8_t>(w[2]) == 0x83;
|
||||
if (hasEmSpacePrefix) {
|
||||
const char* visiblePtr = w.c_str() + 3;
|
||||
const int prefixWidth = renderer.getTextAdvanceX(fontId, "\xe2\x80\x83", currentStyle);
|
||||
const int visibleWidth = renderer.getTextWidth(fontId, visiblePtr, currentStyle);
|
||||
startX = wordX + prefixWidth;
|
||||
lineWidth = visibleWidth;
|
||||
const bool hasDecoration = (currentStyle & (EpdFontFamily::UNDERLINE | EpdFontFamily::STRIKETHROUGH)) != 0;
|
||||
int startX = wordX;
|
||||
int lineWidth = 0;
|
||||
|
||||
if (hasEmSpacePrefix || hasDecoration) {
|
||||
const int fullWordWidth = renderer.getTextWidth(fontId, w.c_str(), currentStyle);
|
||||
lineWidth = fullWordWidth;
|
||||
if (hasEmSpacePrefix) {
|
||||
const char* visiblePtr = w.c_str() + 3;
|
||||
const int prefixWidth = renderer.getTextAdvanceX(fontId, "\xe2\x80\x83", currentStyle);
|
||||
const int visibleWidth = renderer.getTextWidth(fontId, visiblePtr, currentStyle);
|
||||
startX = wordX + prefixWidth;
|
||||
lineWidth = visibleWidth;
|
||||
}
|
||||
}
|
||||
|
||||
if ((currentStyle & EpdFontFamily::UNDERLINE) != 0) {
|
||||
|
||||
@@ -894,6 +894,19 @@ void XMLCALL ChapterHtmlSlimParser::startElement(void* userData, const XML_Char*
|
||||
entry.hasStrikethrough = true;
|
||||
entry.strikethrough = true;
|
||||
}
|
||||
if (cssStyle.hasTextDecoration()) {
|
||||
const uint8_t dec = static_cast<uint8_t>(cssStyle.textDecoration);
|
||||
if (dec & static_cast<uint8_t>(CssTextDecoration::Underline)) {
|
||||
entry.hasUnderline = true;
|
||||
entry.underline = true;
|
||||
self->underlineUntilDepth = std::min(self->underlineUntilDepth, self->depth);
|
||||
}
|
||||
if (dec & static_cast<uint8_t>(CssTextDecoration::LineThrough)) {
|
||||
entry.hasStrikethrough = true;
|
||||
entry.strikethrough = true;
|
||||
self->strikethroughUntilDepth = std::min(self->strikethroughUntilDepth, self->depth);
|
||||
}
|
||||
}
|
||||
if (cssStyle.hasFontWeight()) {
|
||||
entry.hasBold = true;
|
||||
entry.bold = cssStyle.fontWeight == CssFontWeight::Bold;
|
||||
|
||||
+4
-6
@@ -93,7 +93,7 @@ std::vector<Span> parseInline(const std::string& text) {
|
||||
// Escaped character
|
||||
if (c == '\\' && i + 1 < text.size()) {
|
||||
char next = text[i + 1];
|
||||
if (next == '*' || next == '_' || next == '`' || next == '[' || next == '!' || next == '\\') {
|
||||
if (next == '*' || next == '_' || next == '`' || next == '[' || next == '!' || next == '~' || next == '\\') {
|
||||
current += next;
|
||||
i += 2;
|
||||
continue;
|
||||
@@ -329,12 +329,10 @@ ParsedLine parseLine(const std::string& rawLine, bool inCodeBlock) {
|
||||
result.blockType = BlockType::Header3;
|
||||
|
||||
result.spans = parseInline(content);
|
||||
// Force bold on all header spans
|
||||
// Force bold on all header spans while preserving any existing decoration bits.
|
||||
for (auto& span : result.spans) {
|
||||
if (span.style == EpdFontFamily::REGULAR)
|
||||
span.style = EpdFontFamily::BOLD;
|
||||
else if (span.style == EpdFontFamily::ITALIC)
|
||||
span.style = EpdFontFamily::BOLD_ITALIC;
|
||||
span.style = static_cast<EpdFontFamily::Style>(static_cast<uint8_t>(span.style) |
|
||||
static_cast<uint8_t>(EpdFontFamily::BOLD));
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user