Fix parsing self-closing tags with no space (such as <br/>)
If there was no space between the tag name and the slash of a self-closing tag, the code assumes that the tag name is "br/". This commit adds the slash as a character to close a tag on, so that "<br/>" is treated as a self-closing "br". BUG: 487377
This commit is contained in:
@@ -46,6 +46,7 @@ private Q_SLOTS:
|
|||||||
void sendCustomEmojiCode_data();
|
void sendCustomEmojiCode_data();
|
||||||
void sendCustomEmojiCode();
|
void sendCustomEmojiCode();
|
||||||
|
|
||||||
|
void receiveSpacelessSelfClosingTag();
|
||||||
void receiveStripReply();
|
void receiveStripReply();
|
||||||
void receivePlainTextIn();
|
void receivePlainTextIn();
|
||||||
|
|
||||||
@@ -252,6 +253,19 @@ void TextHandlerTest::sendCustomEmojiCode()
|
|||||||
QCOMPARE(testTextHandler.handleSendText(), testOutputString);
|
QCOMPARE(testTextHandler.handleSendText(), testOutputString);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void TextHandlerTest::receiveSpacelessSelfClosingTag()
|
||||||
|
{
|
||||||
|
const QString testInputString = QStringLiteral("Test...<br/>...ing");
|
||||||
|
const QString testRichOutputString = QStringLiteral("Test...<br/>...ing");
|
||||||
|
const QString testPlainOutputString = QStringLiteral("Test...\n...ing");
|
||||||
|
|
||||||
|
TextHandler testTextHandler;
|
||||||
|
testTextHandler.setData(testInputString);
|
||||||
|
|
||||||
|
QCOMPARE(testTextHandler.handleRecieveRichText(), testRichOutputString);
|
||||||
|
QCOMPARE(testTextHandler.handleRecievePlainText(Qt::RichText), testPlainOutputString);
|
||||||
|
}
|
||||||
|
|
||||||
void TextHandlerTest::receiveStripReply()
|
void TextHandlerTest::receiveStripReply()
|
||||||
{
|
{
|
||||||
const QString testInputString = QStringLiteral(
|
const QString testInputString = QStringLiteral(
|
||||||
@@ -536,7 +550,7 @@ void TextHandlerTest::componentOutput_data()
|
|||||||
"someField }\nCustomQml {\n someTextProperty: someField.text\n}\n</code></pre>Sure you can, it's still local to the same file where you "
|
"someField }\nCustomQml {\n someTextProperty: someField.text\n}\n</code></pre>Sure you can, it's still local to the same file where you "
|
||||||
"defined the id")
|
"defined the id")
|
||||||
<< QList<MessageComponent>{
|
<< QList<MessageComponent>{
|
||||||
MessageComponent{MessageComponentType::Text, QStringLiteral("Ah, you mean something like"), {}},
|
MessageComponent{MessageComponentType::Text, QStringLiteral("Ah, you mean something like<br/>"), {}},
|
||||||
MessageComponent{
|
MessageComponent{
|
||||||
MessageComponentType::Code,
|
MessageComponentType::Code,
|
||||||
QStringLiteral(
|
QStringLiteral(
|
||||||
|
|||||||
@@ -459,7 +459,7 @@ QString TextHandler::cleanAttributes(const QString &tag, const QString &tagStrin
|
|||||||
nextAttributeIndex += 1;
|
nextAttributeIndex += 1;
|
||||||
|
|
||||||
while (nextAttributeIndex < tagString.length()) {
|
while (nextAttributeIndex < tagString.length()) {
|
||||||
nextSpaceIndex = tagString.indexOf(TextRegex::endTagType, nextAttributeIndex);
|
nextSpaceIndex = tagString.indexOf(TextRegex::endAttributeType, nextAttributeIndex);
|
||||||
if (nextSpaceIndex == -1) {
|
if (nextSpaceIndex == -1) {
|
||||||
nextSpaceIndex = tagString.length();
|
nextSpaceIndex = tagString.length();
|
||||||
}
|
}
|
||||||
@@ -505,7 +505,7 @@ QVariantMap TextHandler::getAttributes(const QString &tag, const QString &tagStr
|
|||||||
nextAttributeIndex += 1;
|
nextAttributeIndex += 1;
|
||||||
|
|
||||||
while (nextAttributeIndex < tagString.length()) {
|
while (nextAttributeIndex < tagString.length()) {
|
||||||
nextSpaceIndex = tagString.indexOf(TextRegex::endTagType, nextAttributeIndex);
|
nextSpaceIndex = tagString.indexOf(TextRegex::endAttributeType, nextAttributeIndex);
|
||||||
if (nextSpaceIndex == -1) {
|
if (nextSpaceIndex == -1) {
|
||||||
nextSpaceIndex = tagString.length();
|
nextSpaceIndex = tagString.length();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -57,7 +57,8 @@ inline QColor getUserColor(qreal hueF)
|
|||||||
|
|
||||||
namespace TextRegex
|
namespace TextRegex
|
||||||
{
|
{
|
||||||
static const QRegularExpression endTagType{QStringLiteral("(>| )")};
|
static const QRegularExpression endTagType{QStringLiteral("[> /]")};
|
||||||
|
static const QRegularExpression endAttributeType{QStringLiteral("[> ]")};
|
||||||
static const QRegularExpression attributeData{QStringLiteral("['\"](.*?)['\"]")};
|
static const QRegularExpression attributeData{QStringLiteral("['\"](.*?)['\"]")};
|
||||||
static const QRegularExpression removeReply{QStringLiteral("> <.*?>.*?\\n\\n"), QRegularExpression::DotMatchesEverythingOption};
|
static const QRegularExpression removeReply{QStringLiteral("> <.*?>.*?\\n\\n"), QRegularExpression::DotMatchesEverythingOption};
|
||||||
static const QRegularExpression removeRichReply{QStringLiteral("<mx-reply>.*?</mx-reply>"), QRegularExpression::DotMatchesEverythingOption};
|
static const QRegularExpression removeRichReply{QStringLiteral("<mx-reply>.*?</mx-reply>"), QRegularExpression::DotMatchesEverythingOption};
|
||||||
|
|||||||
Reference in New Issue
Block a user