[poincare] Fix VerticalOffsetLayout serialization

"2^3 !" would be serialized as "2^3*!", which is wrong. It is now serialized
as "2 Ion::Charset::Superscript 3 Ion::Charset::Superscript !" and
parsed correctly.
This commit is contained in:
Léa Saviot
2018-11-21 10:47:45 +01:00
committed by Émilie Feral
parent 3f88d631af
commit 67f940dfd2
6 changed files with 36 additions and 16 deletions

View File

@@ -174,20 +174,14 @@ int VerticalOffsetLayoutNode::serialize(char * buffer, int bufferSize, Preferenc
return numberOfChar;
}
assert(m_type == Type::Superscript);
// If the layout is a superscript, write "^(indice)"
int numberOfChar = SerializationHelper::Prefix(this, buffer, bufferSize, floatDisplayMode, numberOfSignificantDigits, "^");
// If the layout is a superscript, write "Ion::Charset::Superscript indice Ion::Charset::Superscript"
int numberOfChar = SerializationHelper::Char(buffer, bufferSize, Ion::Charset::Superscript);
if (numberOfChar >= bufferSize-1) { return bufferSize-1; }
numberOfChar += const_cast<VerticalOffsetLayoutNode *>(this)->indiceLayout()->serialize(buffer+numberOfChar, bufferSize-numberOfChar, floatDisplayMode, numberOfSignificantDigits);
if (numberOfChar >= bufferSize-1) { return bufferSize-1; }
numberOfChar += SerializationHelper::Char(buffer+numberOfChar, bufferSize-numberOfChar, Ion::Charset::Superscript);
if (numberOfChar >= bufferSize-1) { return bufferSize-1; }
// Add a multiplication if omitted.
int indexInParent = -1;
LayoutNode * parentNode = parent();
if (parentNode != nullptr) {
indexInParent = parentNode->indexOfChild(this);
}
if (indexInParent >= 0 && indexInParent < (parentNode->numberOfChildren() - 1) && parentNode->isHorizontal() && parentNode->childAtIndex(indexInParent + 1)->canBeOmittedMultiplicationRightFactor()) {
buffer[numberOfChar++] = Ion::Charset::MiddleDot;
if (numberOfChar >= bufferSize-1) { return bufferSize-1;}
}
buffer[numberOfChar] = 0;
return numberOfChar;
}