Navigation Menu

Skip to content

Commit

Permalink
Hypertext: Fix alignment tags adding unwanted newlines (#9548)
Browse files Browse the repository at this point in the history
  • Loading branch information
pyrollo committed Mar 26, 2020
1 parent a099875 commit 49a5585
Show file tree
Hide file tree
Showing 2 changed files with 29 additions and 10 deletions.
33 changes: 24 additions & 9 deletions src/gui/guiHyperText.cpp
Expand Up @@ -167,6 +167,7 @@ ParsedText::ParsedText(const wchar_t *text)

m_element = NULL;
m_paragraph = NULL;
m_end_paragraph_reason = ER_NONE;

parse(text);
}
Expand All @@ -191,7 +192,7 @@ void ParsedText::parse(const wchar_t *text)
cursor++;
// If text has begun, don't skip empty line
if (m_paragraph) {
endParagraph();
endParagraph(ER_NEWLINE);
enterElement(ELEMENT_SEPARATOR);
}
escape = false;
Expand All @@ -201,7 +202,7 @@ void ParsedText::parse(const wchar_t *text)
if (c == L'\n') { // Unix breaks
// If text has begun, don't skip empty line
if (m_paragraph) {
endParagraph();
endParagraph(ER_NEWLINE);
enterElement(ELEMENT_SEPARATOR);
}
escape = false;
Expand Down Expand Up @@ -232,19 +233,28 @@ void ParsedText::parse(const wchar_t *text)
pushChar(c);
}

endParagraph();
endParagraph(ER_NONE);
}

void ParsedText::endElement()
{
m_element = NULL;
}

void ParsedText::endParagraph()
void ParsedText::endParagraph(EndReason reason)
{
if (!m_paragraph)
return;

EndReason previous = m_end_paragraph_reason;
m_end_paragraph_reason = reason;
if (m_empty_paragraph && (reason == ER_TAG ||
(reason == ER_NEWLINE && previous == ER_TAG))) {
// Ignore last empty paragraph
m_paragraph = nullptr;
m_paragraphs.pop_back();
return;
}
endElement();
m_paragraph = NULL;
}
Expand All @@ -255,6 +265,7 @@ void ParsedText::enterParagraph()
m_paragraphs.emplace_back();
m_paragraph = &m_paragraphs.back();
m_paragraph->setStyle(m_style);
m_empty_paragraph = true;
}
}

Expand All @@ -274,11 +285,15 @@ void ParsedText::enterElement(ElementType type)
void ParsedText::pushChar(wchar_t c)
{
// New word if needed
if (c == L' ' || c == L'\t')
enterElement(ELEMENT_SEPARATOR);
else
if (c == L' ' || c == L'\t') {
if (!m_empty_paragraph)
enterElement(ELEMENT_SEPARATOR);
else
return;
} else {
m_empty_paragraph = false;
enterElement(ELEMENT_TEXT);

}
m_element->text += c;
}

Expand Down Expand Up @@ -571,7 +586,7 @@ u32 ParsedText::parseTag(const wchar_t *text, u32 cursor)
} else {
openTag(name, attrs)->style = m_paragraphtags[name];
}
endParagraph();
endParagraph(ER_TAG);

} else
return 0; // Unknown tag
Expand Down
6 changes: 5 additions & 1 deletion src/gui/guiHyperText.h
Expand Up @@ -134,11 +134,13 @@ class ParsedText
Tag m_root_tag;

protected:
typedef enum { ER_NONE, ER_TAG, ER_NEWLINE } EndReason;

// Parser functions
void enterElement(ElementType type);
void endElement();
void enterParagraph();
void endParagraph();
void endParagraph(EndReason reason);
void pushChar(wchar_t c);
ParsedText::Tag *newTag(const std::string &name, const AttrsList &attrs);
ParsedText::Tag *openTag(const std::string &name, const AttrsList &attrs);
Expand All @@ -160,6 +162,8 @@ class ParsedText
StyleList m_style;
Element *m_element;
Paragraph *m_paragraph;
bool m_empty_paragraph;
EndReason m_end_paragraph_reason;
};

class TextDrawer
Expand Down

0 comments on commit 49a5585

Please sign in to comment.