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 namespace Volo.Docs.Markdown.Extensions
{ {
public class CustomCodeBlockExtension : IMarkdownExtension public class HighlightedCodeBlockExtension : IMarkdownExtension
{ {
public void Setup(MarkdownPipelineBuilder pipeline) public void Setup(MarkdownPipelineBuilder pipeline)
{ {
@ -27,7 +27,7 @@ namespace Volo.Docs.Markdown.Extensions
htmlRenderer.ObjectRenderers.Remove(codeBlockRenderer); 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 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; return pipeline;
} }
} }

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

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