Skip to content

Commit

Permalink
Fixes Nerd Font fallback (#50)
Browse files Browse the repository at this point in the history
Fixes #1
  • Loading branch information
David-Rushton committed Aug 28, 2022
1 parent 2f486b7 commit 6bf6013
Show file tree
Hide file tree
Showing 22 changed files with 471 additions and 64 deletions.
67 changes: 67 additions & 0 deletions docs/markdown-console/release-notes.md
@@ -1,5 +1,72 @@
# Release Notes

## `v1.6.0`

We've improved our [Nerd Fonts](https://www.nerdfonts.com/) support.

Previously Nerd Fonts where enabled by default. Which Nerd Fonts are awesome, no al fonts support the
full range of glyphs. This led to ugly fallbacks.

## Examples

Let's look at three examples, which all use this markdown:

```md
## With Nerd Fonts

To enable Nerd Fonts: `MarkdownConsole.UseNerdFonts(UseNerdFonts.Yes)`.

> *Nerd Fonts* patches developer targeted fonts with a high number of glyphs (icons).

Number List:
1. Item 1
1. Item 2
1. Item 3

To Do List:
- [ ] Item 1
- [x] Item 2
- [ ] Item 3

Bullet List:
- Bullet 1
- Bullet 2
- Bullet 3
```

### Nerd Fonts Enabled But Not Supported

As you can see we don't fallback gracefully.

Our numbered lists, bullet lists and to do lists all look the same. The numbered list has lost it numbers - arguably the most important bit!

Inline code is pre and postfixed with your font's default fallback glyph.

![Nerd Fonts enabled and not supported](../../images/examples/nerd-fonts-enabled-not-supported.png)

### Nerd Fonts Disabled

Our new default. We stick to characters from the standard and extended ASCII table. This should be supported by virtually all fonts.

Lists and inline code have been restored.

We have also picked a different quote glyph. This one has wider support.

![Nerd Fonts disabled](../../images/examples/nerd-fonts-disabled.png)

### With Nerd Fonts Enabled and Supported

You can still opt-in to Nerd Fonts.

To do lists and inline code blocks make great use of the extended glyph set.

![Nerd Fonts endabled and supported](../../images/examples/nerd-fonts-enabled-and-supported.png)

To enable Nerd Fonts:

1. [Install](https://www.nerdfonts.com/font-downloads) a supported font
1. Enable: `MarkdownConsole.UseNerdFonts(UseNerdFonts.Yes);`

## `v1.5.0`

We have added support for [auto links](https://spec.commonmark.org/0.30/#autolinks).
Expand Down
Binary file added images/examples/Thumbs.db
Binary file not shown.
Binary file added images/examples/nerd-fonts-disabled.png
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Expand Up @@ -16,8 +16,10 @@ public abstract class MarkdownConsoleTests
public const string AnsiBoldItalicEscape = "\u001b[1;3m";
public const string AnsiStrikethroughEscape = "\u001b[9m";
public const string AnsiBoldStrikethroughEscape = "\u001b[1;9m";
public const string AnsiCodeStartEscape = "\u001b[38;5;5m\u001b[0m\u001b[7;38;5;5m";
public const string AnsiCodeEndEscape = "\u001b[0m\u001b[38;5;5m";
public const string AnsiCodeStartEscapeNF = "\u001b[38;5;5m\u001b[0m\u001b[7;38;5;5m";
public const string AnsiCodeStartEscapeASCII = "\u001b[38;5;5m├\u001b[0m\u001b[7;38;5;5m";
public const string AnsiCodeEndEscapeNF = "\u001b[0m\u001b[38;5;5m";
public const string AnsiCodeEndEscapeASCII = "\u001b[0m\u001b[38;5;5m┤";
public const string AnsiLinkEscape = "\u001b]8;";
public const string AnsiPurpleEscape = "\u001b[38;5;5m";
public const string AnsiPurpleItalicEscape = "\u001b[3;38;5;5m";
Expand Down
Expand Up @@ -60,15 +60,20 @@ string expected
}

[Theory]
[InlineData("`code`", $"{AnsiCodeStartEscape}code{AnsiCodeEndEscape}{AnsiResetEscape}\n\n")]
[InlineData("some inline `code` and plain text", $"some inline {AnsiCodeStartEscape}code{AnsiCodeEndEscape}{AnsiResetEscape} and plain text\n\n")]
[InlineData("`code` and plain text", $"{AnsiCodeStartEscape}code{AnsiCodeEndEscape}{AnsiResetEscape} and plain text\n\n")]
[InlineData("`code`", UseNerdFonts.Yes, $"{AnsiCodeStartEscapeNF}code{AnsiCodeEndEscapeNF}{AnsiResetEscape}\n\n")]
[InlineData("some inline `code` and plain text", UseNerdFonts.Yes, $"some inline {AnsiCodeStartEscapeNF}code{AnsiCodeEndEscapeNF}{AnsiResetEscape} and plain text\n\n")]
[InlineData("`code` and plain text", UseNerdFonts.Yes, $"{AnsiCodeStartEscapeNF}code{AnsiCodeEndEscapeNF}{AnsiResetEscape} and plain text\n\n")]
[InlineData("`code`", UseNerdFonts.No, $"{AnsiCodeStartEscapeASCII}code{AnsiCodeEndEscapeASCII}{AnsiResetEscape}\n\n")]
[InlineData("some inline `code` and plain text", UseNerdFonts.No, $"some inline {AnsiCodeStartEscapeASCII}code{AnsiCodeEndEscapeASCII}{AnsiResetEscape} and plain text\n\n")]
[InlineData("`code` and plain text", UseNerdFonts.No, $"{AnsiCodeStartEscapeASCII}code{AnsiCodeEndEscapeASCII}{AnsiResetEscape} and plain text\n\n")]
public void Given_markdown_with_inline_code_should_return_correct_ansi_escaped_string(
string markdown,
UseNerdFonts useNerdFonts,
string expected
)
{
var actual = new TestConsole()
.SetNerdFonts(useNerdFonts)
.Write(markdown)
.Output
.NormaliseNewLines();
Expand All @@ -77,16 +82,22 @@ string expected
}

[Theory]
[InlineData("_italic with **bold** text_", $"{AnsiItalicEscape}italic with {AnsiResetEscape}{AnsiBoldItalicEscape}bold{AnsiResetEscape}{AnsiItalicEscape} text{AnsiResetEscape}\n\n")]
[InlineData("**bold with _italic_ text**", $"{AnsiBoldEscape}bold with {AnsiResetEscape}{AnsiBoldItalicEscape}italic{AnsiResetEscape}{AnsiBoldEscape} text{AnsiResetEscape}\n\n")]
[InlineData("~strikethrough with **bold** text~", $"{AnsiStrikethroughEscape}strikethrough with {AnsiResetEscape}{AnsiBoldStrikethroughEscape}bold{AnsiResetEscape}{AnsiStrikethroughEscape} text{AnsiResetEscape}\n\n")]
[InlineData("`code ignores embedded **styles**`", $"{AnsiCodeStartEscape}code ignores embedded **styles**{AnsiCodeEndEscape}{AnsiResetEscape}\n\n")]
[InlineData("_italic with **bold** text_", UseNerdFonts.Yes, $"{AnsiItalicEscape}italic with {AnsiResetEscape}{AnsiBoldItalicEscape}bold{AnsiResetEscape}{AnsiItalicEscape} text{AnsiResetEscape}\n\n")]
[InlineData("**bold with _italic_ text**", UseNerdFonts.Yes, $"{AnsiBoldEscape}bold with {AnsiResetEscape}{AnsiBoldItalicEscape}italic{AnsiResetEscape}{AnsiBoldEscape} text{AnsiResetEscape}\n\n")]
[InlineData("~strikethrough with **bold** text~", UseNerdFonts.Yes, $"{AnsiStrikethroughEscape}strikethrough with {AnsiResetEscape}{AnsiBoldStrikethroughEscape}bold{AnsiResetEscape}{AnsiStrikethroughEscape} text{AnsiResetEscape}\n\n")]
[InlineData("`code ignores embedded **styles**`", UseNerdFonts.Yes, $"{AnsiCodeStartEscapeNF}code ignores embedded **styles**{AnsiCodeEndEscapeNF}{AnsiResetEscape}\n\n")]
[InlineData("_italic with **bold** text_", UseNerdFonts.No, $"{AnsiItalicEscape}italic with {AnsiResetEscape}{AnsiBoldItalicEscape}bold{AnsiResetEscape}{AnsiItalicEscape} text{AnsiResetEscape}\n\n")]
[InlineData("**bold with _italic_ text**", UseNerdFonts.No, $"{AnsiBoldEscape}bold with {AnsiResetEscape}{AnsiBoldItalicEscape}italic{AnsiResetEscape}{AnsiBoldEscape} text{AnsiResetEscape}\n\n")]
[InlineData("~strikethrough with **bold** text~", UseNerdFonts.No, $"{AnsiStrikethroughEscape}strikethrough with {AnsiResetEscape}{AnsiBoldStrikethroughEscape}bold{AnsiResetEscape}{AnsiStrikethroughEscape} text{AnsiResetEscape}\n\n")]
[InlineData("`code ignores embedded **styles**`", UseNerdFonts.No, $"{AnsiCodeStartEscapeASCII}code ignores embedded **styles**{AnsiCodeEndEscapeASCII}{AnsiResetEscape}\n\n")]
public void Given_markdown_with_embedded_inlines_should_render_mix_of_styles(
string markdown,
UseNerdFonts useNerdFonts,
string expected
)
{
var actual = new TestConsole()
.SetNerdFonts(useNerdFonts)
.Write(markdown)
.Output
.NormaliseNewLines();
Expand Down
Expand Up @@ -6,7 +6,7 @@ namespace Morello.Markdown.Console.Tests;
public partial class MarkdownConsoleListTests : MarkdownConsoleTests
{
[Fact]
public void Given_markdown_with_bullet_list_block_should_return_correct_ansi_escaped_string()
public void Given_markdown_with_bullet_list_block_should_return_correct_nerd_font_ansi_escaped_string()
{
var input = @"Some list:
- item one
Expand All @@ -16,13 +16,65 @@ public void Given_markdown_with_bullet_list_block_should_return_correct_ansi_esc

var expected = $@"Some list:
{AnsiEscape}[38;5;5m {AnsiEscape}[0m item one
{AnsiEscape}[38;5;5m {AnsiEscape}[0m item two
{AnsiEscape}[38;5;5m {AnsiEscape}[0m item three
{AnsiEscape}[38;5;5m{AnsiEscape}[0m item one
{AnsiEscape}[38;5;5m{AnsiEscape}[0m item two
{AnsiEscape}[38;5;5m{AnsiEscape}[0m item three
";

var actual = new TestConsole()
.SetNerdFonts(UseNerdFonts.Yes).Write(input).Output.NormaliseNewLines();

Assert.Equal(expected, actual);
}

[Fact]
public void Given_markdown_with_bullet_list_block_should_return_correct_ascii_font_ansi_escaped_string()
{
var input = @"Some list:
- item one
- item two
- item three
";

var expected = $@"Some list:
{AnsiEscape}[38;5;5m■{AnsiEscape}[0m item one
{AnsiEscape}[38;5;5m■{AnsiEscape}[0m item two
{AnsiEscape}[38;5;5m■{AnsiEscape}[0m item three
";

var actual = new TestConsole()
.SetNerdFonts(UseNerdFonts.No)
.Write(input)
.Output
.NormaliseNewLines();

Assert.Equal(expected, actual);
}

[Fact]
public void Given_markdown_with_task_list_block_should_return_correct_nerd_font_ansi_escaped_string()
{
var input = @"Some list:
- [ ] item one
- [x] item two
- [ ] item three
";

var expected = $@"Some list:
{AnsiEscape}[38;5;5m{AnsiEscape}[0m item one
{AnsiEscape}[38;5;5m{AnsiEscape}[0m item two
{AnsiEscape}[38;5;5m{AnsiEscape}[0m item three
";

var actual = new TestConsole()
.SetNerdFonts(UseNerdFonts.Yes)
.Write(input)
.Output
.NormaliseNewLines();
Expand All @@ -31,7 +83,7 @@ public void Given_markdown_with_bullet_list_block_should_return_correct_ansi_esc
}

[Fact]
public void Given_markdown_with_task_list_block_should_return_correct_ansi_escaped_string()
public void Given_markdown_with_task_list_block_should_return_correct_ascii_font_ansi_escaped_string()
{
var input = @"Some list:
Expand All @@ -43,22 +95,66 @@ public void Given_markdown_with_task_list_block_should_return_correct_ansi_escap

var expected = $@"Some list:
{AnsiEscape}[38;5;5m {AnsiEscape}[0m item one
{AnsiEscape}[38;5;5m {AnsiEscape}[0m item two
{AnsiEscape}[38;5;5m {AnsiEscape}[0m item three
{AnsiEscape}[38;5;5m[ ]{AnsiEscape}[0m item one
{AnsiEscape}[38;5;5m[x]{AnsiEscape}[0m item two
{AnsiEscape}[38;5;5m[ ]{AnsiEscape}[0m item three
";

var actual = new TestConsole()
.SetNerdFonts(UseNerdFonts.No)
.Write(input)
.Output
.NormaliseNewLines();

Assert.Equal(expected, actual);
}

[Fact]
public void Given_markdown_with_numbered_list_block_should_return_correct_nerd_font_ansi_escaped_string()
{
var input = @"Some list:
1. item 1
1. item 2
1. item 3
1. item 4
1. item 5
1. item 6
1. item 7
1. item 8
1. item 9
1. item 10
";

var expected = $@"Some list:
{AnsiEscape}[38;5;5m {AnsiEscape}[0mitem 1
{AnsiEscape}[38;5;5m {AnsiEscape}[0mitem 2
{AnsiEscape}[38;5;5m {AnsiEscape}[0mitem 3
{AnsiEscape}[38;5;5m {AnsiEscape}[0mitem 4
{AnsiEscape}[38;5;5m {AnsiEscape}[0mitem 5
{AnsiEscape}[38;5;5m {AnsiEscape}[0mitem 6
{AnsiEscape}[38;5;5m {AnsiEscape}[0mitem 7
{AnsiEscape}[38;5;5m {AnsiEscape}[0mitem 8
{AnsiEscape}[38;5;5m {AnsiEscape}[0mitem 9
{AnsiEscape}[38;5;5m {AnsiEscape}[0mitem 10
";

var actual = new TestConsole()
.SetNerdFonts(UseNerdFonts.Yes)
.Write(input)
.Output
.NormaliseNewLines();

Assert.Equal(expected, actual);
}


[Fact]
public void Given_markdown_with_numbered_list_block_should_return_correct_ansi_escaped_string()
public void Given_markdown_with_numbered_list_block_should_return_correct_ascii_font_ansi_escaped_string()
{
var input = @"Some list:
Expand All @@ -77,20 +173,21 @@ public void Given_markdown_with_numbered_list_block_should_return_correct_ansi_e

var expected = $@"Some list:
{AnsiEscape}[38;5;5m {AnsiEscape}[0mitem 1
{AnsiEscape}[38;5;5m {AnsiEscape}[0mitem 2
{AnsiEscape}[38;5;5m {AnsiEscape}[0mitem 3
{AnsiEscape}[38;5;5m {AnsiEscape}[0mitem 4
{AnsiEscape}[38;5;5m {AnsiEscape}[0mitem 5
{AnsiEscape}[38;5;5m {AnsiEscape}[0mitem 6
{AnsiEscape}[38;5;5m {AnsiEscape}[0mitem 7
{AnsiEscape}[38;5;5m {AnsiEscape}[0mitem 8
{AnsiEscape}[38;5;5m {AnsiEscape}[0mitem 9
{AnsiEscape}[38;5;5m {AnsiEscape}[0mitem 10
{AnsiEscape}[38;5;5m1 {AnsiEscape}[0mitem 1
{AnsiEscape}[38;5;5m2 {AnsiEscape}[0mitem 2
{AnsiEscape}[38;5;5m3 {AnsiEscape}[0mitem 3
{AnsiEscape}[38;5;5m4 {AnsiEscape}[0mitem 4
{AnsiEscape}[38;5;5m5 {AnsiEscape}[0mitem 5
{AnsiEscape}[38;5;5m6 {AnsiEscape}[0mitem 6
{AnsiEscape}[38;5;5m7 {AnsiEscape}[0mitem 7
{AnsiEscape}[38;5;5m8 {AnsiEscape}[0mitem 8
{AnsiEscape}[38;5;5m9 {AnsiEscape}[0mitem 9
{AnsiEscape}[38;5;5m10 {AnsiEscape}[0mitem 10
";

var actual = new TestConsole()
.SetNerdFonts(UseNerdFonts.No)
.Write(input)
.Output
.NormaliseNewLines();
Expand Down

0 comments on commit 6bf6013

Please sign in to comment.