From 246d64c2a04555b977ccabe4c96f5fe4389e3d29 Mon Sep 17 00:00:00 2001 From: Alex Mickelson Date: Wed, 25 Oct 2023 10:06:55 -0600 Subject: [PATCH] wrote rubric parsing tests --- .../AssignmentForm/RubricMarkdownEditor.razor | 1 + Management/Models/Local/LocalAssignment.cs | 48 ++++++++++++------- 2 files changed, 32 insertions(+), 17 deletions(-) diff --git a/Management.Web/Shared/Components/AssignmentForm/RubricMarkdownEditor.razor b/Management.Web/Shared/Components/AssignmentForm/RubricMarkdownEditor.razor index e891616..efb2e49 100644 --- a/Management.Web/Shared/Components/AssignmentForm/RubricMarkdownEditor.razor +++ b/Management.Web/Shared/Components/AssignmentForm/RubricMarkdownEditor.razor @@ -9,6 +9,7 @@ private string rubricText = ""; private int rubricReloadKey = 0; + protected override void OnInitialized() { assignmentContext.StateHasChanged += reload; diff --git a/Management/Models/Local/LocalAssignment.cs b/Management/Models/Local/LocalAssignment.cs index 36193b6..bdbf0a0 100644 --- a/Management/Models/Local/LocalAssignment.cs +++ b/Management/Models/Local/LocalAssignment.cs @@ -1,4 +1,5 @@ using System.Collections; +using System.Text; using System.Text.RegularExpressions; using YamlDotNet.Serialization; @@ -97,28 +98,41 @@ public record LocalAssignment return assignmentMarkdown; } + public string RubricToMarkdown() + { + var builder = new StringBuilder(); + foreach (var item in Rubric) + { + var pointLabel = item.Points > 1 ? "pts" : "pt"; + builder.Append($"- {item.Points}{pointLabel}: {item.Label}" + Environment.NewLine); + } + return builder.ToString(); + } + public static IEnumerable ParseRubricMarkdown(string rawMarkdown) { var lines = rawMarkdown.Trim().Split(Environment.NewLine); - var items = lines.Select(l => - { - var pointsPattern = @"\s*-\s*(\d+)\s*pt(s)?:"; - var match = Regex.Match(l, pointsPattern); - if (!match.Success) - throw new RubricMarkdownParseException($"points not found: {l}"); - - var points = int.Parse(match.Groups[1].Value); - - var label = string.Join(": ", l.Split(": ").Skip(1)); - - return new RubricItem() - { - Points = points, - Label = label - }; - }).ToArray(); + var items = lines.Select(parseIndividualRubricItemMarkdown).ToArray(); return items; } + + private static RubricItem parseIndividualRubricItemMarkdown(string rawMarkdown) + { + var pointsPattern = @"\s*-\s*(\d+)\s*pt(s)?:"; + var match = Regex.Match(rawMarkdown, pointsPattern); + if (!match.Success) + throw new RubricMarkdownParseException($"points not found: {rawMarkdown}"); + + var points = int.Parse(match.Groups[1].Value); + + var label = string.Join(": ", rawMarkdown.Split(": ").Skip(1)); + + return new RubricItem() + { + Points = points, + Label = label + }; + } } public class RubricMarkdownParseException : Exception