/// <summary> /// Add the specified task to all the provided blocks, if they don't /// already have a task. /// </summary> /// <param name="blocks">A list of vote blocks.</param> /// <param name="planTask">A task name to apply. If no name is provided, no changes are made.</param> /// <returns>Returns the vote blocks with the task applied.</returns> private static List <string> ApplyTaskToBlocks(List <string> blocks, string planTask) { if (blocks == null) { throw new ArgumentNullException(nameof(blocks)); } if (string.IsNullOrEmpty(planTask)) { return(blocks); } List <string> results = new List <string>(); foreach (var block in blocks) { if (VoteString.GetVoteTask(block).Length == 0) { string rep = VoteString.ModifyVoteLine(block, task: planTask, byPartition: true); results.Add(rep); } else { results.Add(block); } } return(results); }
/// <summary> /// Takes a list of string lines and, if the first line contains a plan /// name using "Base Plan", convert it to a version that only uses "Plan". /// </summary> /// <param name="lines">A list of lines defining a plan.</param> /// <returns>Returns the list of lines, with the assurance that /// any plan name starts with just "Plan".</returns> private static IEnumerable <string> NormalizePlanName(IEnumerable <string> lines) { string firstLine = lines.First(); var remainder = lines.Skip(1); string nameContent = VoteString.GetVoteContent(firstLine, VoteType.Plan); Match m = basePlanRegex.Match(nameContent); if (m.Success) { nameContent = $"Plan{m.Groups[1]}{m.Groups["planname"]}"; firstLine = VoteString.ModifyVoteLine(firstLine, content: nameContent); List <string> results = new List <string>(lines.Count()) { firstLine }; results.AddRange(remainder); return(results); } return(lines); }
/// <summary> /// Partition a vote by line, but carry any task on parent lines down /// to child lines. /// </summary> /// <param name="lines">The lines of the vote.</param> /// <param name="author">The author of the vote, for use in determining /// valid referrals.</param> /// <returns>Returns a list of partitioned vote lines.</returns> private List <string> PartitionByLineTask(IEnumerable <string> lines, string author) { List <string> partitions = new List <string>(); List <string> referralVotes = new List <string>(); string parentTask = string.Empty; foreach (string line in lines) { // If someone copy/pasted a vote with a referral at the top (eg: self-named plan), // skip the copy/pasted section. if (referralVotes.Any()) { if (Agnostic.StringComparer.Equals(line, referralVotes.First())) { referralVotes = referralVotes.Skip(1).ToList(); continue; } referralVotes.Clear(); } referralVotes = VoteCounter.GetVotesFromReference(line, author); if (referralVotes.Any()) { partitions.AddRange(referralVotes); if (Agnostic.StringComparer.Equals(line, referralVotes.First())) { referralVotes = referralVotes.Skip(1).ToList(); continue; } } else { string taskedLine = line; if (string.IsNullOrEmpty(VoteString.GetVotePrefix(line))) { parentTask = VoteString.GetVoteTask(line); } else if (string.IsNullOrEmpty(VoteString.GetVoteTask(line))) { taskedLine = VoteString.ModifyVoteLine(line, task: parentTask); } partitions.Add(taskedLine + "\r\n"); } } return(partitions); }