Skip to content

Commit ce7e6b4

Browse files
committed
Merge branch 'main' into marquee
2 parents 8102102 + f69e533 commit ce7e6b4

File tree

154 files changed

+2776
-1179
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

154 files changed

+2776
-1179
lines changed

.devcontainer/Dockerfile

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,5 +12,13 @@ RUN if [ "${NODE_VERSION}" != "none" ]; then su vscode -c "umask 0002 && . /usr/
1212
# RUN apt-get update && export DEBIAN_FRONTEND=noninteractive \
1313
# && apt-get -y install --no-install-recommends <your-package-list-here>
1414

15+
RUN apt-get update && export DEBIAN_FRONTEND=noninteractive \
16+
&& apt-get -y install --no-install-recommends ninja-build
17+
18+
RUN apt-get update && apt-get install -y --no-install-recommends apt-transport-https dirmngr gnupg ca-certificates \
19+
&& apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 3FA7E0328081BFF6A14DA29AA6A19B38D3D831EF \
20+
&& echo "deb https://download.mono-project.com/repo/debian stable-buster main" | tee /etc/apt/sources.list.d/mono-official-stable.list \
21+
&& apt-get update && apt-get -y --no-install-recommends install mono-complete
22+
1523
# [Optional] Uncomment this line to install global node packages.
1624
# RUN su vscode -c "source /usr/local/share/nvm/nvm.sh && npm install -g <your-package-here>" 2>&1

.github/ISSUE_TEMPLATE/experiment.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -109,5 +109,5 @@ body:
109109
label: Community Help?
110110
description: Would you like others to help you work on the deliverables for this experiment?
111111
options:
112-
- Yes
113-
- No
112+
- "Yes"
113+
- "No"

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ bld/
3939

4040
# Visual Studio 2017 auto generated files
4141
Generated\ Files/
42+
*.g.cs
4243

4344
# MSTest test Results
4445
[Tt]est[Rr]esult*/

.vscode/launch.json

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,7 @@
1414
"/p:UnoSourceGeneratorUseGenerationHost=true",
1515
"/p:UnoSourceGeneratorUseGenerationController=false",
1616
"/p:UnoRemoteControlPort=443",
17-
"--project=${workspaceFolder}/platforms/CommunityToolkit.Labs.Wasm/CommunityToolkit.Labs.Wasm.csproj",
18-
"-p:TargetFrameworks=netstandard2.0",
19-
"-p:TargetFramework=net5.0"
17+
"--project=${workspaceFolder}/platforms/CommunityToolkit.Labs.Wasm/CommunityToolkit.Labs.Wasm.csproj"
2018
],
2119
"presentation": {
2220
"group": "1",

DiscoverSamples.ps1

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,7 @@ function CreateVsCodeLaunchConfigJson {
2424
`"/p:UnoSourceGeneratorUseGenerationHost=true`",
2525
`"/p:UnoSourceGeneratorUseGenerationController=false`",
2626
`"/p:UnoRemoteControlPort=443`",
27-
`"--project=`$`{workspaceFolder`}/labs/$projectName/samples/$projectName.Wasm/$projectName.Wasm.csproj`",
28-
`"-p:TargetFrameworks=netstandard2.0`",
29-
`"-p:TargetFramework=net5.0`"
27+
`"--project=`$`{workspaceFolder`}/labs/$projectName/samples/$projectName.Wasm/$projectName.Wasm.csproj`"
3028
],
3129
`"presentation`": {
3230
`"group`": `"2`"

common/CommunityToolkit.Labs.Core.SourceGenerators.Tests/CommunityToolkit.Labs.Core.SourceGenerators.Tests/ToolkitSampleMetadataTests.Documentation.cs

Lines changed: 58 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,8 @@ Without any front matter.
4848
[DataRow(4, DisplayName = "Keywords")]
4949
[DataRow(7, DisplayName = "Category")]
5050
[DataRow(8, DisplayName = "Subcategory")]
51+
[DataRow(9, DisplayName = "GitHub Discussion Id")]
52+
[DataRow(10, DisplayName = "GitHub Issue Id")]
5153
[TestMethod]
5254
public void MissingFrontMatterField(int removeline)
5355
{
@@ -60,6 +62,8 @@ public void MissingFrontMatterField(int removeline)
6062
- csharp
6163
category: Controls
6264
subcategory: Layout
65+
discussion-id: 0
66+
issue-id: 0
6367
---
6468
# This is some test documentation...
6569
> [!SAMPLE Sample]
@@ -85,6 +89,8 @@ public void MarkdownInvalidSampleReference()
8589
- csharp
8690
category: Controls
8791
subcategory: Layout
92+
discussion-id: 0
93+
issue-id: 0
8894
---
8995
# This is some test documentation...
9096
> [!SAMPLE SampINVALIDle]
@@ -108,9 +114,11 @@ public void DocumentationMissingSample()
108114
- csharp
109115
category: Controls
110116
subcategory: Layout
117+
discussion-id: 0
118+
issue-id: 0
111119
---
112120
# This is some test documentation...
113-
Without any front matter.";
121+
Without any sample.";
114122

115123
VerifyGeneratedDiagnostics<ToolkitSampleMetadataGenerator>(SimpleSource, markdown,
116124
DiagnosticDescriptors.DocumentationHasNoSamples.Id,
@@ -129,11 +137,59 @@ public void DocumentationValid()
129137
- csharp
130138
category: Controls
131139
subcategory: Layout
140+
discussion-id: 0
141+
issue-id: 0
132142
---
133143
# This is some test documentation...
134-
Without any front matter.
144+
Which is valid.
135145
> [!SAMPLE Sample]";
136146

137147
VerifyGeneratedDiagnostics<ToolkitSampleMetadataGenerator>(SimpleSource, markdown);
138148
}
149+
150+
[TestMethod]
151+
public void DocumentationInvalidDiscussionId()
152+
{
153+
string markdown = @"---
154+
title: Canvas Layout
155+
author: mhawker
156+
description: A canvas-like VirtualizingLayout for use in an ItemsRepeater
157+
keywords: CanvasLayout, ItemsRepeater, VirtualizingLayout, Canvas, Layout, Panel, Arrange
158+
dev_langs:
159+
- csharp
160+
category: Controls
161+
subcategory: Layout
162+
discussion-id: https://github.com/1234
163+
issue-id: 0
164+
---
165+
# This is some test documentation...
166+
Without an invalid discussion id.";
167+
168+
VerifyGeneratedDiagnostics<ToolkitSampleMetadataGenerator>(string.Empty, markdown,
169+
DiagnosticDescriptors.MarkdownYAMLFrontMatterException.Id,
170+
DiagnosticDescriptors.DocumentationHasNoSamples.Id);
171+
}
172+
173+
[TestMethod]
174+
public void DocumentationInvalidIssueId()
175+
{
176+
string markdown = @"---
177+
title: Canvas Layout
178+
author: mhawker
179+
description: A canvas-like VirtualizingLayout for use in an ItemsRepeater
180+
keywords: CanvasLayout, ItemsRepeater, VirtualizingLayout, Canvas, Layout, Panel, Arrange
181+
dev_langs:
182+
- csharp
183+
category: Controls
184+
subcategory: Layout
185+
discussion-id: 0
186+
issue-id: https://github.com/1234
187+
---
188+
# This is some test documentation...
189+
Without an invalid discussion id.";
190+
191+
VerifyGeneratedDiagnostics<ToolkitSampleMetadataGenerator>(string.Empty, markdown,
192+
DiagnosticDescriptors.MarkdownYAMLFrontMatterException.Id,
193+
DiagnosticDescriptors.DocumentationHasNoSamples.Id);
194+
}
139195
}

common/CommunityToolkit.Labs.Core.SourceGenerators/Metadata/ToolkitFrontMatter.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,10 @@ public sealed class ToolkitFrontMatter : DocsFrontMatter
1818
public ToolkitSampleCategory Category { get; set; }
1919
public ToolkitSampleSubcategory Subcategory { get; set; }
2020

21+
public int DiscussionId { get; set; }
22+
public int IssueId { get; set; }
23+
2124
//// Extra Metadata needed for Sample App
2225
public string? FilePath { get; set; }
23-
2426
public string[]? SampleIdReferences { get; set; }
2527
}

common/CommunityToolkit.Labs.Core.SourceGenerators/ToolkitSampleMetadataGenerator.Documentation.cs

Lines changed: 40 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,12 @@ public partial class ToolkitSampleMetadataGenerator
2929
private const string FrontMatterRegexSubcategoryExpression = @"^subcategory:\s*(?<subcategory>.*)$";
3030
private static readonly Regex FrontMatterRegexSubcategory = new Regex(FrontMatterRegexSubcategoryExpression, RegexOptions.Compiled | RegexOptions.IgnoreCase | RegexOptions.Multiline);
3131

32+
private const string FrontMatterRegexDiscussionIdExpression = @"^discussion-id:\s*(?<discussionid>.*)$";
33+
private static readonly Regex FrontMatterRegexDiscussionId = new Regex(FrontMatterRegexDiscussionIdExpression, RegexOptions.Compiled | RegexOptions.IgnoreCase | RegexOptions.Multiline);
34+
35+
private const string FrontMatterRegexIssueIdExpression = @"^issue-id:\s*(?<issueid>.*)$";
36+
private static readonly Regex FrontMatterRegexIssueId = new Regex(FrontMatterRegexIssueIdExpression, RegexOptions.Compiled | RegexOptions.IgnoreCase | RegexOptions.Multiline);
37+
3238
private const string MarkdownRegexSampleTagExpression = @"^>\s*\[!SAMPLE\s*(?<sampleid>.*)\s*\]\s*$";
3339
private static readonly Regex MarkdownRegexSampleTag = new Regex(MarkdownRegexSampleTagExpression, RegexOptions.Compiled | RegexOptions.IgnoreCase | RegexOptions.Multiline);
3440

@@ -105,9 +111,13 @@ private ImmutableArray<ToolkitFrontMatter> GatherDocumentFrontMatter(SourceProdu
105111
var category = ParseYamlField(ref ctx, file.Path, ref frontmatter, FrontMatterRegexCategory, "category");
106112
var subcategory = ParseYamlField(ref ctx, file.Path, ref frontmatter, FrontMatterRegexSubcategory, "subcategory");
107113

114+
// TODO: Should these just be optional?
115+
var discussion = ParseYamlField(ref ctx, file.Path, ref frontmatter, FrontMatterRegexDiscussionId, "discussionid")?.Trim();
116+
var issue = ParseYamlField(ref ctx, file.Path, ref frontmatter, FrontMatterRegexIssueId, "issueid")?.Trim();
117+
108118
// Check we have all the fields we expect to continue (errors will have been spit out otherwise already from the ParseYamlField method)
109119
if (title == null || description == null || keywords == null ||
110-
category == null || subcategory == null)
120+
category == null || subcategory == null || discussion == null || issue == null)
111121
{
112122
return null;
113123
}
@@ -159,6 +169,28 @@ private ImmutableArray<ToolkitFrontMatter> GatherDocumentFrontMatter(SourceProdu
159169
file.Path));
160170
}
161171

172+
if (!int.TryParse(discussion, out var discussionId) || discussionId < 0)
173+
{
174+
ctx.ReportDiagnostic(
175+
Diagnostic.Create(
176+
DiagnosticDescriptors.MarkdownYAMLFrontMatterException,
177+
Location.Create(file.Path, TextSpan.FromBounds(0, 1), new LinePositionSpan(LinePosition.Zero, LinePosition.Zero)),
178+
file.Path,
179+
"Can't parse discussion-id field, must be a positive integer or zero."));
180+
return null;
181+
}
182+
183+
if (!int.TryParse(issue, out var issueId) || issueId < 0)
184+
{
185+
ctx.ReportDiagnostic(
186+
Diagnostic.Create(
187+
DiagnosticDescriptors.MarkdownYAMLFrontMatterException,
188+
Location.Create(file.Path, TextSpan.FromBounds(0, 1), new LinePositionSpan(LinePosition.Zero, LinePosition.Zero)),
189+
file.Path,
190+
"Can't parse issue-id field, must be a positive integer or zero."));
191+
return null;
192+
}
193+
162194
// Finally, construct the complete object.
163195
return new ToolkitFrontMatter()
164196
{
@@ -168,13 +200,15 @@ private ImmutableArray<ToolkitFrontMatter> GatherDocumentFrontMatter(SourceProdu
168200
Category = categoryValue,
169201
Subcategory = subcategoryValue,
170202
FilePath = filepath,
171-
SampleIdReferences = sampleids.ToArray()
203+
SampleIdReferences = sampleids.ToArray(),
204+
DiscussionId = discussionId,
205+
IssueId = issueId,
172206
};
173207
}
174208
}).OfType<ToolkitFrontMatter>().ToImmutableArray();
175209
}
176210

177-
private string? ParseYamlField(ref SourceProductionContext ctx, string filepath, ref string content, Regex pattern, string fieldname)
211+
private string? ParseYamlField(ref SourceProductionContext ctx, string filepath, ref string content, Regex pattern, string captureGroupName)
178212
{
179213
var match = pattern.Match(content);
180214

@@ -185,11 +219,11 @@ private ImmutableArray<ToolkitFrontMatter> GatherDocumentFrontMatter(SourceProdu
185219
DiagnosticDescriptors.MarkdownYAMLFrontMatterMissingField,
186220
Location.Create(filepath, TextSpan.FromBounds(0, 1), new LinePositionSpan(LinePosition.Zero, LinePosition.Zero)),
187221
filepath,
188-
fieldname));
222+
captureGroupName));
189223
return null;
190224
}
191225

192-
return match.Groups[fieldname].Value.Trim();
226+
return match.Groups[captureGroupName].Value.Trim();
193227
}
194228

195229
private void CreateDocumentRegistry(SourceProductionContext ctx, ImmutableArray<ToolkitFrontMatter> matter)
@@ -223,6 +257,6 @@ private static string FrontMatterToRegistryCall(ToolkitFrontMatter metadata)
223257
var categoryParam = $"{nameof(ToolkitSampleCategory)}.{metadata.Category}";
224258
var subcategoryParam = $"{nameof(ToolkitSampleSubcategory)}.{metadata.Subcategory}";
225259

226-
return @$"yield return new {typeof(ToolkitFrontMatter).FullName}() {{ Title = ""{metadata.Title}"", Author = ""{metadata.Author}"", Description = ""{metadata.Description}"", Keywords = ""{metadata.Keywords}"", Category = {categoryParam}, Subcategory = {subcategoryParam}, FilePath = @""{metadata.FilePath}"", SampleIdReferences = new string[] {{ ""{string.Join("\",\"", metadata.SampleIdReferences)}"" }} }};"; // TODO: Add list of sample ids in document
260+
return @$"yield return new {typeof(ToolkitFrontMatter).FullName}() {{ Title = ""{metadata.Title}"", Author = ""{metadata.Author}"", Description = ""{metadata.Description}"", Keywords = ""{metadata.Keywords}"", Category = {categoryParam}, Subcategory = {subcategoryParam}, DiscussionId = {metadata.DiscussionId}, IssueId = {metadata.IssueId}, FilePath = @""{metadata.FilePath}"", SampleIdReferences = new string[] {{ ""{string.Join("\",\"", metadata.SampleIdReferences)}"" }} }};"; // TODO: Add list of sample ids in document
227261
}
228262
}

common/CommunityToolkit.Labs.Core.SourceGenerators/ToolkitSampleSubcategory.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,5 +31,10 @@ public enum ToolkitSampleSubcategory : byte
3131
/// A sample that focuses input controls.
3232
/// </summary>
3333
Input,
34+
35+
/// <summary>
36+
/// A sample that focuses on media controls or behaviors.
37+
/// </summary>
38+
Media,
3439
}
3540

common/CommunityToolkit.Labs.Shared/App.xaml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
<ResourceDictionary.MergedDictionaries>
88
<XamlControlsResources xmlns="using:Microsoft.UI.Xaml.Controls" />
99
<ResourceDictionary Source="/Styles/Buttons.xaml" />
10+
<ResourceDictionary Source="/Styles/Colors.xaml" />
1011
<ResourceDictionary Source="/Styles/ItemTemplates.xaml" />
1112
<ResourceDictionary Source="/Controls/TitleBar/TitleBar.xaml" />
1213
</ResourceDictionary.MergedDictionaries>
@@ -28,6 +29,7 @@
2829

2930
<!-- Breakpoints -->
3031
<x:Double x:Key="Breakpoint1008Plus">1008</x:Double>
32+
<x:Double x:Key="Breakpoint840Plus">840</x:Double>
3133
<x:Double x:Key="Breakpoint641Plus">641</x:Double>
3234
</ResourceDictionary>
3335
</Application.Resources>

0 commit comments

Comments
 (0)