Browse Source

Refactoring for highlighted code blocks

pull/9409/head
EngincanV 5 years ago
parent
commit
f96097eca2
  1. 4
      modules/docs/src/Volo.Docs.Web/Markdown/Extensions/HighlightedCodeBlockExtension.cs
  2. 4
      modules/docs/src/Volo.Docs.Web/Markdown/Extensions/MarkdownPipelineBuilderExtensions.cs
  3. 2
      modules/docs/src/Volo.Docs.Web/Markdown/MarkDigMarkdownConverter.cs
  4. 78
      modules/docs/src/Volo.Docs.Web/Markdown/Renderers/HighlightedCodeBlockRenderer.cs

4
modules/docs/src/Volo.Docs.Web/Markdown/Extensions/CustomCodeBlockExtension.cs → modules/docs/src/Volo.Docs.Web/Markdown/Extensions/HighlightedCodeBlockExtension.cs

@ -6,7 +6,7 @@ using Volo.Docs.Markdown.Renderers;
namespace Volo.Docs.Markdown.Extensions
{
public class CustomCodeBlockExtension : IMarkdownExtension
public class HighlightedCodeBlockExtension : IMarkdownExtension
{
public void Setup(MarkdownPipelineBuilder pipeline)
{
@ -27,7 +27,7 @@ namespace Volo.Docs.Markdown.Extensions
htmlRenderer.ObjectRenderers.Remove(codeBlockRenderer);
}
htmlRenderer.ObjectRenderers.AddIfNotAlready(new CustomCodeBlockRenderer());
htmlRenderer.ObjectRenderers.AddIfNotAlready(new HighlightedCodeBlockRenderer());
}
}
}

4
modules/docs/src/Volo.Docs.Web/Markdown/Extensions/MarkdownPipelineBuilderExtensions.cs

@ -4,9 +4,9 @@ namespace Volo.Docs.Markdown.Extensions
{
public static class MarkdownPipelineBuilderExtensions
{
public static MarkdownPipelineBuilder UseCustomCodeBlock(this MarkdownPipelineBuilder pipeline)
public static MarkdownPipelineBuilder UseHighlightedCodeBlocks(this MarkdownPipelineBuilder pipeline)
{
pipeline.Extensions.AddIfNotAlready<CustomCodeBlockExtension>();
pipeline.Extensions.AddIfNotAlready<HighlightedCodeBlockExtension>();
return pipeline;
}
}

2
modules/docs/src/Volo.Docs.Web/Markdown/MarkDigMarkdownConverter.cs

@ -16,7 +16,7 @@ namespace Volo.Docs.Markdown
.UseBootstrap()
.UseGridTables()
.UsePipeTables()
.UseCustomCodeBlock()
.UseHighlightedCodeBlocks()
.Build();
}

78
modules/docs/src/Volo.Docs.Web/Markdown/Renderers/CustomCodeBlockRenderer.cs → modules/docs/src/Volo.Docs.Web/Markdown/Renderers/HighlightedCodeBlockRenderer.cs

@ -10,14 +10,14 @@ using Markdig.Syntax;
namespace Volo.Docs.Markdown.Renderers
{
public class CustomCodeBlockRenderer : HtmlObjectRenderer<CodeBlock>
public class HighlightedCodeBlockRenderer : HtmlObjectRenderer<CodeBlock>
{
private const string Pattern = @"\{([^}]+)\}";
public bool OutputAttributesOnPre { get; set; }
public HashSet<string> BlocksAsDiv { get; }
public CustomCodeBlockRenderer()
public HighlightedCodeBlockRenderer()
{
BlocksAsDiv = new HashSet<string>(StringComparer.OrdinalIgnoreCase);
}
@ -46,7 +46,6 @@ namespace Volo.Docs.Markdown.Renderers
{
renderer.WriteLine("</div>");
}
}
else
{
@ -58,19 +57,8 @@ namespace Volo.Docs.Markdown.Renderers
{
renderer.WriteAttributes(obj);
}
var highlightedLines = GetHighlightedLines(fencedCodeBlock);
if (highlightedLines.Any())
{
renderer.WriteAttributes(new HtmlAttributes {Classes = new List<string> {"line-numbers"}});
var lines = string.Join(",", highlightedLines);
renderer.Write($"data-line={lines}><code");
}
else
{
renderer.Write("><code");
}
WriteHighlightedCodeLines(renderer, fencedCodeBlock);
if (!OutputAttributesOnPre)
{
@ -90,41 +78,65 @@ namespace Volo.Docs.Markdown.Renderers
renderer.EnsureLine();
}
private void WriteHighlightedCodeLines(HtmlRenderer renderer, FencedCodeBlock fencedCodeBlock)
{
var highlightedLines = GetHighlightedLines(fencedCodeBlock);
if (highlightedLines.Any())
{
renderer.WriteAttributes(new HtmlAttributes
{
Classes = new List<string> {"line-numbers"} //prevents adding line-numbers for highlighted lines
});
var lines = string.Join(",", highlightedLines);
renderer.Write($"data-line={lines}><code");
}
else
{
renderer.Write("><code");
}
}
private List<int> GetHighlightedLines(FencedCodeBlock fencedCodeBlock)
{
var highlightedLines = new List<int>();
if (string.IsNullOrWhiteSpace(fencedCodeBlock?.Arguments))
if (string.IsNullOrWhiteSpace(fencedCodeBlock?.Arguments) || !Regex.IsMatch(pattern: Pattern, input: fencedCodeBlock.Arguments))
{
return highlightedLines;
}
if (Regex.IsMatch(pattern: Pattern, input: fencedCodeBlock.Arguments))
var match = Regex.Match(fencedCodeBlock.Arguments, Pattern);
var groups = match.Groups;
if (groups.Count < 2 || string.IsNullOrWhiteSpace(groups[1].Value))
{
var match = Regex.Match(fencedCodeBlock.Arguments, Pattern);
var groups = match.Groups;
if (groups.Count < 2 || string.IsNullOrWhiteSpace(groups[1].Value))
{
return highlightedLines;
}
return highlightedLines;
}
var lines = groups[1].Value.Split(",");
foreach (var line in lines)
var lines = groups[1].Value.Split(",");
foreach (var line in lines)
{
if (line.Contains("-"))
{
if (line.Contains("-"))
var numbers = line.Split("-");
foreach (var number in numbers)
{
var numbers = line.Split("-");
highlightedLines.AddRange(numbers.Select(number => Convert.ToInt32(number)));
if (int.TryParse(number, out var lineNumber))
{
highlightedLines.Add(lineNumber);
}
}
else
}
else
{
if (int.TryParse(line, out var lineNumber))
{
highlightedLines.Add(Convert.ToInt32(line));
highlightedLines.Add(lineNumber);
}
}
}
return highlightedLines;
}
}
Loading…
Cancel
Save