diff --git a/lib/Epub/Epub/ParsedText.cpp b/lib/Epub/Epub/ParsedText.cpp index 73a3988..b666192 100644 --- a/lib/Epub/Epub/ParsedText.cpp +++ b/lib/Epub/Epub/ParsedText.cpp @@ -27,6 +27,8 @@ void ParsedText::layoutAndExtractLines(const GfxRenderer& renderer, const int fo const size_t totalWordCount = words.size(); const int pageWidth = renderer.getScreenWidth() - horizontalMargin; const int spaceWidth = renderer.getSpaceWidth(fontId); + // width of 1em to indent first line of paragraph if Extra Spacing is enabled + const int indentWidth = (!extraParagraphSpacing) ? 1 * renderer.getTextWidth(fontId, "m", REGULAR) : 0; std::vector wordWidths; wordWidths.reserve(totalWordCount); @@ -51,7 +53,7 @@ void ParsedText::layoutAndExtractLines(const GfxRenderer& renderer, const int fo ans[totalWordCount - 1] = totalWordCount - 1; for (int i = totalWordCount - 2; i >= 0; --i) { - int currlen = -spaceWidth; + int currlen = -spaceWidth + indentWidth; dp[i] = MAX_COST; for (size_t j = i; j < totalWordCount; ++j) { @@ -122,7 +124,11 @@ void ParsedText::layoutAndExtractLines(const GfxRenderer& renderer, const int fo } // Calculate spacing - const int spareSpace = pageWidth - lineWordWidthSum; + int spareSpace = pageWidth - lineWordWidthSum; + if (wordWidthIndex == 0) { + spareSpace -= indentWidth; + } + int spacing = spaceWidth; const bool isLastLine = lineBreak == totalWordCount; @@ -131,7 +137,8 @@ void ParsedText::layoutAndExtractLines(const GfxRenderer& renderer, const int fo } // Calculate initial x position - uint16_t xpos = 0; + uint16_t xpos = (wordWidthIndex == 0) ? indentWidth : 0; + if (style == TextBlock::RIGHT_ALIGN) { xpos = spareSpace - (lineWordCount - 1) * spaceWidth; } else if (style == TextBlock::CENTER_ALIGN) { diff --git a/lib/Epub/Epub/ParsedText.h b/lib/Epub/Epub/ParsedText.h index 188cb12..0bd2544 100644 --- a/lib/Epub/Epub/ParsedText.h +++ b/lib/Epub/Epub/ParsedText.h @@ -16,9 +16,11 @@ class ParsedText { std::list words; std::list wordStyles; TextBlock::BLOCK_STYLE style; + bool extraParagraphSpacing; public: - explicit ParsedText(const TextBlock::BLOCK_STYLE style) : style(style) {} + explicit ParsedText(const TextBlock::BLOCK_STYLE style, const bool extraParagraphSpacing) + : style(style), extraParagraphSpacing(extraParagraphSpacing) {} ~ParsedText() = default; void addWord(std::string word, EpdFontStyle fontStyle); diff --git a/lib/Epub/Epub/parsers/ChapterHtmlSlimParser.cpp b/lib/Epub/Epub/parsers/ChapterHtmlSlimParser.cpp index 3c1f5ca..ea15e1a 100644 --- a/lib/Epub/Epub/parsers/ChapterHtmlSlimParser.cpp +++ b/lib/Epub/Epub/parsers/ChapterHtmlSlimParser.cpp @@ -25,7 +25,7 @@ constexpr int NUM_IMAGE_TAGS = sizeof(IMAGE_TAGS) / sizeof(IMAGE_TAGS[0]); const char* SKIP_TAGS[] = {"head", "table"}; constexpr int NUM_SKIP_TAGS = sizeof(SKIP_TAGS) / sizeof(SKIP_TAGS[0]); -bool isWhitespace(const char c) { return c == ' ' || c == '\r' || c == '\n'; } +bool isWhitespace(const char c) { return c == ' ' || c == '\r' || c == '\n' || c == '\t'; } // given the start and end of a tag, check to see if it matches a known tag bool matches(const char* tag_name, const char* possible_tags[], const int possible_tag_count) { @@ -48,7 +48,7 @@ void ChapterHtmlSlimParser::startNewTextBlock(const TextBlock::BLOCK_STYLE style makePages(); } - currentTextBlock.reset(new ParsedText(style)); + currentTextBlock.reset(new ParsedText(style, extraParagraphSpacing)); } void XMLCALL ChapterHtmlSlimParser::startElement(void* userData, const XML_Char* name, const XML_Char** atts) {