Skip to content

Commit

Permalink
fix: Fix parsing literals in Span, Paragraph, ..
Browse files Browse the repository at this point in the history
  • Loading branch information
Youssef1313 committed Aug 30, 2022
1 parent d26dc5b commit 703c073
Show file tree
Hide file tree
Showing 4 changed files with 44 additions and 9 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -469,10 +469,18 @@ private XamlMemberDefinition VisitMember(XamlXmlReader reader, XamlObjectDefinit
return member;
}

private bool IsLiteralInlineText(object value, XamlMemberDefinition member, XamlObjectDefinition xamlObject)
private static bool IsLiteralInlineText(object value, XamlMemberDefinition member, XamlObjectDefinition xamlObject)
{
return value is string
&& (xamlObject.Type.Name == "TextBlock" || xamlObject.Type.Name == "Span")
&& (
xamlObject.Type.Name is "TextBlock"
or "Bold"
or "Hyperlink"
or "Italic"
or "Underline"
or "Span"
or "Paragraph"
)
&& (member.Member.Name == "_UnknownContent" || member.Member.Name == "Inlines");
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1254,6 +1254,31 @@ public void When_StaticResource_In_ResourceDictionary()
Assert.AreEqual(b2.Color, c2);
}

[TestMethod]
public void When_Run_In_Inlines_Span()
{
When_Run_In_Inlines_Helper("Span", p => ((Span)p).Inlines);
}

[TestMethod]
public void When_Run_In_Inlines_Paragraph()
{
When_Run_In_Inlines_Helper("Paragraph", p => ((Paragraph)p).Inlines);
}

private void When_Run_In_Inlines_Helper(string rootName, Func<object, InlineCollection> getInlines)
{
var root = Windows.UI.Xaml.Markup.XamlReader.Load($@"<{rootName} xml:space=""preserve"" xmlns=""http://schemas.microsoft.com/winfx/2006/xaml/presentation"">regular text<Bold>bold text</Bold><Underline>underline text</Underline><Italic>italic text</Italic><Hyperlink Name=""name"">this is a hyperlink</Hyperlink>more regular text</{rootName}>");
var inlines = getInlines(root).ToArray();
Assert.AreEqual(6, inlines.Length);
Assert.AreEqual("regular text", ((Run)inlines[0]).Text);
Assert.AreEqual("bold text", ((Run)((Bold)inlines[1]).Inlines.Single()).Text);
Assert.AreEqual("underline text", ((Run)((Underline)inlines[2]).Inlines.Single()).Text);
Assert.AreEqual("italic text", ((Run)((Italic)inlines[3]).Inlines.Single()).Text);
Assert.AreEqual("this is a hyperlink", ((Run)((Hyperlink)inlines[4]).Inlines.Single()).Text);
Assert.AreEqual("more regular text", ((Run)inlines[5]).Text);
}

/// <summary>
/// XamlReader.Load the xaml and type-check result.
/// </summary>
Expand Down
2 changes: 1 addition & 1 deletion src/Uno.UI/UI/Xaml/Documents/InlineCollection.cs
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ private void OnCollectionChanged()
public bool Contains(Inline item) => _collection.Contains(item);

/// <inheritdoc />
public void CopyTo(Inline[] array, int arrayIndex) => throw new NotSupportedException();
public void CopyTo(Inline[] array, int arrayIndex) => _collection.CopyTo(array, arrayIndex);

/// <inheritdoc />
public bool Remove(Inline item) => _collection.Remove(item);
Expand Down
14 changes: 8 additions & 6 deletions src/Uno.UI/UI/Xaml/Markup/Reader/XamlStringParser.cs
Original file line number Diff line number Diff line change
Expand Up @@ -170,15 +170,17 @@ private XamlMemberDefinition VisitMember(XamlXmlReader reader, XamlObjectDefinit
return member;
}

private bool IsLiteralInlineText(object value, XamlMemberDefinition member, XamlObjectDefinition xamlObject)
private static bool IsLiteralInlineText(object value, XamlMemberDefinition member, XamlObjectDefinition xamlObject)
{
return value is string
&& (
xamlObject.Type.Name == nameof(Controls.TextBlock)
|| xamlObject.Type.Name == nameof(Documents.Bold)
|| xamlObject.Type.Name == nameof(Documents.Hyperlink)
|| xamlObject.Type.Name == nameof(Documents.Italic)
|| xamlObject.Type.Name == nameof(Documents.Underline)
xamlObject.Type.Name is nameof(Controls.TextBlock)
or nameof(Documents.Bold)
or nameof(Documents.Hyperlink)
or nameof(Documents.Italic)
or nameof(Documents.Underline)
or nameof(Documents.Span)
or nameof(Documents.Paragraph)
)
&& (member.Member.Name == "_UnknownContent" || member.Member.Name == "Inlines");
}
Expand Down

0 comments on commit 703c073

Please sign in to comment.