fencedCodeBlock and

removed h1 when matches link title
This commit is contained in:
Mike Phares 2023-08-10 19:45:58 -07:00
parent ba5427b049
commit 71baf499c7

View File

@ -286,10 +286,10 @@ internal static partial class HelperMarkdown
segments = afterTrim.Split(": "); segments = afterTrim.Split(": ");
if (segments.Length != 2) if (segments.Length != 2)
{ {
if (results.Last()[^1] == '[') if (results[^1][^1] == '[')
{ {
_ = stringBuilder.Clear(); _ = stringBuilder.Clear();
_ = stringBuilder.Append(results.Last()); _ = stringBuilder.Append(results[^1]);
results.RemoveAt(results.Count - 1); results.RemoveAt(results.Count - 1);
for (int j = i; j < parsedLines.Length; j++) for (int j = i; j < parsedLines.Length; j++)
{ {
@ -325,7 +325,7 @@ internal static partial class HelperMarkdown
string? result; string? result;
List<string> results; List<string> results;
Dictionary<string, JsonElement>? keyValuePairs; Dictionary<string, JsonElement>? keyValuePairs;
string jsonLinesLast = jsonLines.Last(); string jsonLinesLast = jsonLines[^1];
jsonLines.RemoveAt(jsonLines.Count - 1); jsonLines.RemoveAt(jsonLines.Count - 1);
jsonLines.Add(jsonLinesLast[..^1]); jsonLines.Add(jsonLinesLast[..^1]);
jsonLines.Insert(0, "{"); jsonLines.Insert(0, "{");
@ -365,23 +365,23 @@ internal static partial class HelperMarkdown
jsonLines.Clear(); jsonLines.Clear();
break; break;
} }
segmentsLast = segments.Last().Trim(); segmentsLast = segments[^1].Trim();
segmentsFirst = segments[0].Trim(); segmentsFirst = segments[0].Trim();
if (string.IsNullOrEmpty(segmentsLast)) if (string.IsNullOrEmpty(segmentsLast))
continue; continue;
if (segmentsFirst[0] == '"' && segmentsFirst.Last() == '"') if (segmentsFirst[0] == '"' && segmentsFirst[^1] == '"')
jsonLines.Add($"{segmentsFirst}: "); jsonLines.Add($"{segmentsFirst}: ");
else if (segmentsFirst[0] == '\'' && segmentsFirst.Last() == '\'') else if (segmentsFirst[0] == '\'' && segmentsFirst[^1] == '\'')
jsonLines.Add($"\"{segmentsFirst[1..^1]}\": "); jsonLines.Add($"\"{segmentsFirst[1..^1]}\": ");
else else
jsonLines.Add($"\"{segmentsFirst}\": "); jsonLines.Add($"\"{segmentsFirst}\": ");
if (segmentsLast == "[]") if (segmentsLast == "[]")
jsonLines.RemoveAt(jsonLines.Count - 1); jsonLines.RemoveAt(jsonLines.Count - 1);
else if (segmentsLast.Length > 4 && segmentsLast[0] == '[' && segmentsLast.Last() == ']' && segmentsLast[1] == '"' && segmentsLast[^2] == '"') else if (segmentsLast.Length > 4 && segmentsLast[0] == '[' && segmentsLast[^1] == ']' && segmentsLast[1] == '"' && segmentsLast[^2] == '"')
jsonLines.Add($"{segmentsLast},"); jsonLines.Add($"{segmentsLast},");
else if (segmentsLast[0] == '"' && segmentsLast.Last() == '"') else if (segmentsLast[0] == '"' && segmentsLast[^1] == '"')
jsonLines.Add($"{segmentsLast},"); jsonLines.Add($"{segmentsLast},");
else if (segmentsLast[0] == '"' && segmentsLast.Last() == '"') else if (segmentsLast[0] == '"' && segmentsLast[^1] == '"')
jsonLines.Add($"\"{segmentsLast[1..^1]}\""); jsonLines.Add($"\"{segmentsLast[1..^1]}\"");
else if (!segmentsLast.Contains('"') && !segmentsLast.Contains('\'')) else if (!segmentsLast.Contains('"') && !segmentsLast.Contains('\''))
{ {
@ -394,7 +394,7 @@ internal static partial class HelperMarkdown
else else
{ {
segmentsB = segmentsLast.Split('.'); segmentsB = segmentsLast.Split('.');
if (segmentsB.Length == 2 && segmentsB[0].Length < 7 && segmentsB.Last().Length < 7 && segmentsB[0].All(l => char.IsNumber(l)) && segmentsB.Last().All(l => char.IsNumber(l))) if (segmentsB.Length == 2 && segmentsB[0].Length < 7 && segmentsB[^1].Length < 7 && segmentsB[0].All(l => char.IsNumber(l)) && segmentsB[^1].All(l => char.IsNumber(l)))
jsonLines.Add($"{segmentsLast},"); jsonLines.Add($"{segmentsLast},");
else if (!segmentsLast.Contains('[') && !segmentsLast.Contains('{')) else if (!segmentsLast.Contains('[') && !segmentsLast.Contains('{'))
jsonLines.Add($"\"{segmentsLast}\","); jsonLines.Add($"\"{segmentsLast}\",");
@ -771,14 +771,14 @@ internal static partial class HelperMarkdown
segmentsB = segmentsA[0].Split("[["); segmentsB = segmentsA[0].Split("[[");
if (segmentsB.Length is not 2 or 3) if (segmentsB.Length is not 2 or 3)
continue; continue;
segmentsC = segmentsB.Last().Split('|'); segmentsC = segmentsB[^1].Split('|');
markdownFileH1AndRelativePath = GetRelativePath(keyValuePairs, markdownFile, segmentsC[0]); markdownFileH1AndRelativePath = GetRelativePath(keyValuePairs, markdownFile, segmentsC[0]);
if (markdownFileH1AndRelativePath.MarkdownFile is null || markdownFileH1AndRelativePath.H1 is null || markdownFileH1AndRelativePath.RelativePath is null) if (markdownFileH1AndRelativePath.MarkdownFile is null || markdownFileH1AndRelativePath.H1 is null || markdownFileH1AndRelativePath.RelativePath is null)
{ {
logger.LogInformation("Didn't find {line} in <{file}>", lines[i], markdownFile.FileNameWithoutExtension); logger.LogInformation("Didn't find {line} in <{file}>", lines[i], markdownFile.FileNameWithoutExtension);
continue; continue;
} }
line = $"{segmentsB[0]}[{markdownFileH1AndRelativePath.H1}]({markdownFileH1AndRelativePath.RelativePath.Replace('\\', '/')}){segmentsA.Last()}"; line = $"{segmentsB[0]}[{markdownFileH1AndRelativePath.H1}]({markdownFileH1AndRelativePath.RelativePath.Replace('\\', '/')}){segmentsA[^1]}";
if (lines[i] == line) if (lines[i] == line)
continue; continue;
lines[i] = line; lines[i] = line;
@ -872,7 +872,7 @@ internal static partial class HelperMarkdown
segmentsA = lines[i].Split("]("); segmentsA = lines[i].Split("](");
if (segmentsA.Length != 2) if (segmentsA.Length != 2)
continue; continue;
segmentsALast = segmentsA.Last(); segmentsALast = segmentsA[^1];
if (appSettings.ExcludeSchemes.Any(l => segmentsALast.StartsWith(l))) if (appSettings.ExcludeSchemes.Any(l => segmentsALast.StartsWith(l)))
continue; continue;
segmentsB = segmentsALast.Split(")"); segmentsB = segmentsALast.Split(")");
@ -893,7 +893,7 @@ internal static partial class HelperMarkdown
logger.LogInformation("Didn't find {line} in <{file}>", lines[i], markdownFile.FileNameWithoutExtension); logger.LogInformation("Didn't find {line} in <{file}>", lines[i], markdownFile.FileNameWithoutExtension);
continue; continue;
} }
line = $"{string.Join('[', segmentsC, 0, segmentsC.Length - 1)}[{markdownFileH1AndRelativePath.H1}]({markdownFileH1AndRelativePath.RelativePath.Replace('\\', '/')}){segmentsB.Last()}"; line = $"{string.Join('[', segmentsC, 0, segmentsC.Length - 1)}[{markdownFileH1AndRelativePath.H1}]({markdownFileH1AndRelativePath.RelativePath.Replace('\\', '/')}){segmentsB[^1]}";
if (lines[i] == line) if (lines[i] == line)
continue; continue;
if (fileName.Contains(' ') || fileName.Contains("%20")) if (fileName.Contains(' ') || fileName.Contains("%20"))
@ -934,7 +934,7 @@ internal static partial class HelperMarkdown
return result; return result;
} }
private static void SetRecursiveLines(AppSettings appSettings, ILogger<Worker> logger, ReadOnlyDictionary<string, List<MarkdownFileAndLines>> keyValuePairs, MarkdownFile markdownFile, string[] lines, List<char> indentations, List<string> recursiveLines) private static void SetRecursiveLines(AppSettings appSettings, ILogger<Worker> logger, ReadOnlyDictionary<string, List<MarkdownFileAndLines>> keyValuePairs, string linkTitle, MarkdownFile markdownFile, string[] lines, List<char> indentations, List<string> recursiveLines)
{ {
if (recursiveLines is null) if (recursiveLines is null)
throw new Exception(); throw new Exception();
@ -942,7 +942,7 @@ internal static partial class HelperMarkdown
string[] segmentsA; string[] segmentsA;
string[] segmentsB; string[] segmentsB;
string segmentsALast; string segmentsALast;
string segmentsBFirst; bool fencedCodeBlock = false;
string indentation = new(indentations.ToArray()); string indentation = new(indentations.ToArray());
MarkdownFileH1AndRelativePath markdownFileH1AndRelativePath; MarkdownFileH1AndRelativePath markdownFileH1AndRelativePath;
for (int i = 0; i < lines.Length; i++) for (int i = 0; i < lines.Length; i++)
@ -954,22 +954,27 @@ internal static partial class HelperMarkdown
} }
if (lines[i].Length < 1) if (lines[i].Length < 1)
continue; continue;
if (lines[i].Length > 4 && lines[i][..3] == "```")
fencedCodeBlock = !fencedCodeBlock;
if (fencedCodeBlock)
continue;
if (lines[i][0] == '#') if (lines[i][0] == '#')
{ {
if (lines[i] == $"# {linkTitle}")
continue;
recursiveLines.Add($"{indentation}{lines[i]}"); recursiveLines.Add($"{indentation}{lines[i]}");
continue; continue;
} }
segmentsA = lines[i].Split("]("); segmentsA = lines[i].Split("](");
if (segmentsA.Length != 2) if (segmentsA.Length != 2)
continue; continue;
segmentsALast = segmentsA.Last(); segmentsALast = segmentsA[^1];
if (appSettings.ExcludeSchemes.Any(l => segmentsALast.StartsWith(l))) if (appSettings.ExcludeSchemes.Any(l => segmentsALast.StartsWith(l)))
continue; continue;
segmentsB = segmentsALast.Split(")"); segmentsB = segmentsALast.Split(")");
if (segmentsB.Length != 2) if (segmentsB.Length != 2)
continue; continue;
segmentsBFirst = segmentsB[0]; file = Path.GetFullPath(Path.Combine(markdownFile.Directory, segmentsB[0]));
file = Path.GetFullPath(Path.Combine(markdownFile.Directory, segmentsBFirst));
markdownFileH1AndRelativePath = GetRelativePath(keyValuePairs, markdownFile, file); markdownFileH1AndRelativePath = GetRelativePath(keyValuePairs, markdownFile, file);
if (markdownFileH1AndRelativePath.MarkdownFile is null || markdownFileH1AndRelativePath.H1 is null || markdownFileH1AndRelativePath.RelativePath is null) if (markdownFileH1AndRelativePath.MarkdownFile is null || markdownFileH1AndRelativePath.H1 is null || markdownFileH1AndRelativePath.RelativePath is null)
{ {
@ -981,7 +986,7 @@ internal static partial class HelperMarkdown
continue; continue;
indentations.Add('\t'); indentations.Add('\t');
recursiveLines.Add($"{indentation}{lines[i]}"); recursiveLines.Add($"{indentation}{lines[i]}");
SetRecursiveLines(appSettings, logger, keyValuePairs, markdownFileH1AndRelativePath.MarkdownFile, markdownFileH1AndRelativePath.Lines, indentations, recursiveLines); SetRecursiveLines(appSettings, logger, keyValuePairs, segmentsA[0].Split('[')[^1], markdownFileH1AndRelativePath.MarkdownFile, markdownFileH1AndRelativePath.Lines, indentations, recursiveLines);
} }
if (indentations.Count > 0) if (indentations.Count > 0)
indentations.RemoveAt(0); indentations.RemoveAt(0);
@ -1005,7 +1010,7 @@ internal static partial class HelperMarkdown
recursiveLines = new(); recursiveLines = new();
lines = relativeTo.Value.Lines; lines = relativeTo.Value.Lines;
markdownFile = relativeTo.Value.MarkdownFile; markdownFile = relativeTo.Value.MarkdownFile;
SetRecursiveLines(appSettings, logger, keyValuePairs, markdownFile, lines, indentations, recursiveLines); SetRecursiveLines(appSettings, logger, keyValuePairs, markdownFile.FileNameWithoutExtension, markdownFile, lines, indentations, recursiveLines);
results.Add(new(relativeTo.Value.MarkdownFile, recursiveLines.ToArray())); results.Add(new(relativeTo.Value.MarkdownFile, recursiveLines.ToArray()));
} }
return results; return results;
@ -1121,7 +1126,7 @@ internal static partial class HelperMarkdown
segmentsA = lines[i].Split("]("); segmentsA = lines[i].Split("](");
if (segmentsA.Length != 2) if (segmentsA.Length != 2)
continue; continue;
segmentsALast = segmentsA.Last(); segmentsALast = segmentsA[^1];
if (appSettings.ExcludeSchemes.Any(l => segmentsALast.StartsWith(l))) if (appSettings.ExcludeSchemes.Any(l => segmentsALast.StartsWith(l)))
continue; continue;
segmentsB = segmentsALast.Split(")"); segmentsB = segmentsALast.Split(")");
@ -1133,7 +1138,7 @@ internal static partial class HelperMarkdown
else else
file = Path.GetFullPath(Path.Combine(markdownFile.Directory, segmentsBFirst[..^3])); file = Path.GetFullPath(Path.Combine(markdownFile.Directory, segmentsBFirst[..^3]));
relativeFile = Path.GetRelativePath(record.Source, file).Replace('\\', '/'); relativeFile = Path.GetRelativePath(record.Source, file).Replace('\\', '/');
line = $"{segmentsA[0]}]({relativeFile}){segmentsB.Last()}"; line = $"{segmentsA[0]}]({relativeFile}){segmentsB[^1]}";
if (lines[i] == line) if (lines[i] == line)
throw new NotSupportedException($"Line {i} shouldn't match with {line}"); throw new NotSupportedException($"Line {i} shouldn't match with {line}");
lines[i] = line; lines[i] = line;