From 3b776ef8cdba6163fe703a034de0bd32d4ee74de Mon Sep 17 00:00:00 2001 From: Eduard Urbach Date: Tue, 2 Apr 2024 20:31:09 +0200 Subject: [PATCH 01/10] Simplified switch statement --- Render.go | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Render.go b/Render.go index 3bc3df4..c8cd507 100644 --- a/Render.go +++ b/Render.go @@ -270,9 +270,8 @@ func (r *renderer) writeText(markdown string) { i += searchStart searchStart = i + 1 - c := markdown[i] - switch c { + switch markdown[i] { case '[': r.WriteString(html.EscapeString(markdown[tokenStart:i])) tokenStart = i From d7fd8c74e8e36ba4d14f1e41d46b995981ac387e Mon Sep 17 00:00:00 2001 From: Eduard Urbach Date: Tue, 2 Apr 2024 20:50:33 +0200 Subject: [PATCH 02/10] Implemented strikethrough text --- README.md | 9 +++++---- Render.go | 20 +++++++++++++++++++- Render_test.go | 5 +++++ 3 files changed, 29 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index b0d3057..d724855 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ A markdown renderer that supports only a subset of the CommonMark spec in order ## Features - Code blocks -- Formatting (bold, italic, monospace) +- Formatting (bold, italic, monospace and strikethrough) - Links - Lists - Headers @@ -34,6 +34,7 @@ PASS: TestParagraph PASS: TestHeader PASS: TestItalic PASS: TestBold +PASS: TestStrike PASS: TestLink PASS: TestList PASS: TestTables @@ -48,9 +49,9 @@ coverage: 100.0% of statements ## Benchmarks ``` -BenchmarkSmall-12 5986922 187.5 ns/op 32 B/op 1 allocs/op -BenchmarkMedium-12 1000000 1077 ns/op 512 B/op 1 allocs/op -BenchmarkLarge-12 255178 4055 ns/op 2560 B/op 2 allocs/op +BenchmarkSmall-12 6202569 190.9 ns/op 32 B/op 1 allocs/op +BenchmarkMedium-12 1000000 1080 ns/op 512 B/op 1 allocs/op +BenchmarkLarge-12 271048 4115 ns/op 2560 B/op 2 allocs/op ``` ## License diff --git a/Render.go b/Render.go index c8cd507..72472be 100644 --- a/Render.go +++ b/Render.go @@ -257,11 +257,12 @@ func (r *renderer) writeText(markdown string) { codeStart = -1 emStart = -1 strongStart = -1 + strikeStart = -1 parentheses = 0 ) for { - i := strings.IndexAny(markdown[searchStart:], "[]()`*_") + i := strings.IndexAny(markdown[searchStart:], "[]()`*_~") if i == -1 { r.WriteString(html.EscapeString(markdown[tokenStart:])) @@ -342,6 +343,23 @@ func (r *renderer) writeText(markdown string) { tokenStart = i emStart = i + 1 } + + case '~': + if i+1 >= len(markdown) || markdown[i+1] != '~' { + continue + } + + if strikeStart != -1 { + r.WriteString("") + r.WriteString(html.EscapeString(markdown[strikeStart:i])) + r.WriteString("") + strikeStart = -1 + tokenStart = i + 2 + } else { + r.WriteString(html.EscapeString(markdown[tokenStart:i])) + tokenStart = i + strikeStart = i + 2 + } } } } diff --git a/Render_test.go b/Render_test.go index 33c2be7..4e98dc2 100644 --- a/Render_test.go +++ b/Render_test.go @@ -39,6 +39,11 @@ func TestBold(t *testing.T) { assert.Equal(t, markdown.Render("__bold__"), "

bold

") } +func TestStrike(t *testing.T) { + assert.Equal(t, markdown.Render("~normal text~"), "

~normal text~

") + assert.Equal(t, markdown.Render("~~deleted text~~"), "

deleted text

") +} + func TestLink(t *testing.T) { assert.Equal(t, markdown.Render("[text](https://example.com/)"), "

text

") assert.Equal(t, markdown.Render("[text](https://example.com/"), "

[text](https://example.com/

") From 891e3938fa2c945a0f6eb886dbe1ce417e914de0 Mon Sep 17 00:00:00 2001 From: Eduard Urbach Date: Tue, 2 Apr 2024 20:52:48 +0200 Subject: [PATCH 03/10] Simplified feature list --- README.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index d724855..16fb7bf 100644 --- a/README.md +++ b/README.md @@ -4,14 +4,16 @@ A markdown renderer that supports only a subset of the CommonMark spec in order ## Features -- Code blocks -- Formatting (bold, italic, monospace and strikethrough) +- Bold +- Code +- Italic - Links - Lists - Headers - Paragraphs - Quotes - Separators +- Strikethrough - Tables ## Installation From 9e6767fb12dfa1868d4984ef152d05afcb5f284e Mon Sep 17 00:00:00 2001 From: Eduard Urbach Date: Tue, 2 Apr 2024 21:30:50 +0200 Subject: [PATCH 04/10] Disabled formatting in URLs --- README.md | 6 +++--- Render.go | 53 ++++++++++++++++++++++++++++++++------------------ Render_test.go | 1 + 3 files changed, 38 insertions(+), 22 deletions(-) diff --git a/README.md b/README.md index 16fb7bf..62900f1 100644 --- a/README.md +++ b/README.md @@ -51,9 +51,9 @@ coverage: 100.0% of statements ## Benchmarks ``` -BenchmarkSmall-12 6202569 190.9 ns/op 32 B/op 1 allocs/op -BenchmarkMedium-12 1000000 1080 ns/op 512 B/op 1 allocs/op -BenchmarkLarge-12 271048 4115 ns/op 2560 B/op 2 allocs/op +BenchmarkSmall-12 5933677 190.8 ns/op 32 B/op 1 allocs/op +BenchmarkMedium-12 971929 1085 ns/op 512 B/op 1 allocs/op +BenchmarkLarge-12 277028 4075 ns/op 2560 B/op 2 allocs/op ``` ## License diff --git a/Render.go b/Render.go index 72472be..a2d353d 100644 --- a/Render.go +++ b/Render.go @@ -253,14 +253,13 @@ func (r *renderer) writeText(markdown string) { searchStart = 0 linkTextStart = -1 linkTextEnd = -1 - urlStart = -1 codeStart = -1 emStart = -1 strongStart = -1 strikeStart = -1 - parentheses = 0 ) +begin: for { i := strings.IndexAny(markdown[searchStart:], "[]()`*_~") @@ -282,30 +281,46 @@ func (r *renderer) writeText(markdown string) { linkTextEnd = i case '(': - if parentheses == 0 { - urlStart = i + if linkTextStart == -1 || linkTextEnd == -1 { + continue } - parentheses++ + level := 1 - case ')': - parentheses-- + for { + pos := strings.IndexAny(markdown[searchStart:], "()") - if parentheses == 0 && linkTextStart >= 0 && linkTextEnd >= 0 && urlStart >= 0 { - linkText := markdown[linkTextStart+1 : linkTextEnd] - linkURL := markdown[urlStart+1 : i] + if pos == -1 { + goto begin + } - r.WriteString("") - r.WriteString(html.EscapeString(linkText)) - r.WriteString("") + switch markdown[searchStart+pos] { + case '(': + level++ + case ')': + level-- - linkTextStart = -1 - linkTextEnd = -1 - urlStart = -1 + if level == 0 { + urlEnd := searchStart + pos + searchStart = urlEnd + 1 - tokenStart = i + 1 + linkText := markdown[linkTextStart+1 : linkTextEnd] + linkURL := markdown[i+1 : urlEnd] + + r.WriteString("") + r.WriteString(html.EscapeString(linkText)) + r.WriteString("") + + linkTextStart = -1 + linkTextEnd = -1 + tokenStart = urlEnd + 1 + goto begin + } + } + + searchStart += pos + 1 } case '`': diff --git a/Render_test.go b/Render_test.go index 4e98dc2..144cc60 100644 --- a/Render_test.go +++ b/Render_test.go @@ -50,6 +50,7 @@ func TestLink(t *testing.T) { assert.Equal(t, markdown.Render("[text]https://example.com/)"), "

[text]https://example.com/)

") assert.Equal(t, markdown.Render("[text(https://example.com/)"), "

[text(https://example.com/)

") assert.Equal(t, markdown.Render("text](https://example.com/)"), "

text](https://example.com/)

") + assert.Equal(t, markdown.Render("[text](https://example.com/_test_)"), "

text

") assert.Equal(t, markdown.Render("Prefix [text](https://example.com/) suffix."), "

Prefix text suffix.

") } From 1c7f9f2f7d1a97c1d455f3b716a9ccd213c83a0c Mon Sep 17 00:00:00 2001 From: Eduard Urbach Date: Tue, 2 Apr 2024 21:46:23 +0200 Subject: [PATCH 05/10] Disabled formatting in inline codes --- Render.go | 23 ++++++++++++----------- Render_test.go | 1 + 2 files changed, 13 insertions(+), 11 deletions(-) diff --git a/Render.go b/Render.go index a2d353d..148bf9a 100644 --- a/Render.go +++ b/Render.go @@ -253,7 +253,6 @@ func (r *renderer) writeText(markdown string) { searchStart = 0 linkTextStart = -1 linkTextEnd = -1 - codeStart = -1 emStart = -1 strongStart = -1 strikeStart = -1 @@ -324,18 +323,20 @@ begin: } case '`': - if codeStart != -1 { - r.WriteString("") - r.WriteString(html.EscapeString(markdown[codeStart:i])) - r.WriteString("") - codeStart = -1 - tokenStart = i + 1 - } else { - r.WriteString(html.EscapeString(markdown[tokenStart:i])) - tokenStart = i - codeStart = i + 1 + end := strings.IndexByte(markdown[searchStart:], '`') + + if end == -1 { + continue } + r.WriteString(html.EscapeString(markdown[tokenStart:i])) + r.WriteString("") + r.WriteString(html.EscapeString(markdown[searchStart : searchStart+end])) + r.WriteString("") + + searchStart += end + 1 + tokenStart = searchStart + case '*', '_': if i == emStart { strongStart = i + 1 diff --git a/Render_test.go b/Render_test.go index 144cc60..9e96cc0 100644 --- a/Render_test.go +++ b/Render_test.go @@ -70,6 +70,7 @@ func TestCode(t *testing.T) { assert.Equal(t, markdown.Render("```\nText\n```"), "
Text
") assert.Equal(t, markdown.Render("```go\ntype A struct {\n\t\n}\n```"), "
type A struct {\n\t\n}
") assert.Equal(t, markdown.Render("`monospace`"), "

monospace

") + assert.Equal(t, markdown.Render("`unfinished"), "

`unfinished

") assert.Equal(t, markdown.Render("Inline `monospace` text."), "

Inline monospace text.

") } From 463c8b4a85fcd6d0d75b4c891ab08349c2c774b4 Mon Sep 17 00:00:00 2001 From: Eduard Urbach Date: Wed, 3 Apr 2024 09:23:52 +0200 Subject: [PATCH 06/10] Implemented ordered lists --- README.md | 6 +++--- Render.go | 26 ++++++++++++++++++++++++++ Render_test.go | 13 +++++++++++-- 3 files changed, 40 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 62900f1..4c65a88 100644 --- a/README.md +++ b/README.md @@ -51,9 +51,9 @@ coverage: 100.0% of statements ## Benchmarks ``` -BenchmarkSmall-12 5933677 190.8 ns/op 32 B/op 1 allocs/op -BenchmarkMedium-12 971929 1085 ns/op 512 B/op 1 allocs/op -BenchmarkLarge-12 277028 4075 ns/op 2560 B/op 2 allocs/op +BenchmarkSmall-12 5836533 205.3 ns/op 32 B/op 1 allocs/op +BenchmarkMedium-12 967740 1103 ns/op 512 B/op 1 allocs/op +BenchmarkLarge-12 277908 4099 ns/op 2560 B/op 2 allocs/op ``` ## License diff --git a/Render.go b/Render.go index 148bf9a..eeae870 100644 --- a/Render.go +++ b/Render.go @@ -17,6 +17,7 @@ type renderer struct { paragraphLevel int quoteLevel int listLevel int + olistLevel int tableLevel int codeLines int tableHeaderWritten bool @@ -200,6 +201,26 @@ func (r *renderer) processLine(line string) { } } + pos := 0 + + for pos < len(line) && line[pos] >= '0' && line[pos] <= '9' { + pos++ + + if pos < len(line) && (line[pos] == '.' || line[pos] == ')') { + line = strings.TrimSpace(line[pos+1:]) + + if r.olistLevel == 0 { + r.WriteString("
    ") + r.olistLevel++ + } + + r.WriteString("
  1. ") + r.writeText(line) + r.WriteString("
  2. ") + return + } + } + if r.paragraphLevel == 0 { r.WriteString("

    ") r.paragraphLevel++ @@ -233,7 +254,12 @@ func (r *renderer) closeLists() { r.WriteString("") } + for range r.olistLevel { + r.WriteString("

") + } + r.listLevel = 0 + r.olistLevel = 0 } // closeTables closes open tables. diff --git a/Render_test.go b/Render_test.go index 9e96cc0..db81fd4 100644 --- a/Render_test.go +++ b/Render_test.go @@ -55,10 +55,19 @@ func TestLink(t *testing.T) { } func TestList(t *testing.T) { + assert.Equal(t, markdown.Render("-"), "

-

") + assert.Equal(t, markdown.Render("- "), "
") assert.Equal(t, markdown.Render("- Entry"), "
  • Entry
") assert.Equal(t, markdown.Render("- Entry 1\n- Entry 2"), "
  • Entry 1
  • Entry 2
") - assert.Equal(t, markdown.Render("- Entry 1\n- Entry 2\n- Entry 3"), "
  • Entry 1
  • Entry 2
  • Entry 3
") - assert.Equal(t, markdown.Render("-"), "

-

") +} + +func TestOrderedList(t *testing.T) { + assert.Equal(t, markdown.Render("1"), "

1

") + assert.Equal(t, markdown.Render("1."), "
") + assert.Equal(t, markdown.Render("1. "), "
") + assert.Equal(t, markdown.Render("1. Entry"), "
  1. Entry
") + assert.Equal(t, markdown.Render("999) Entry"), "
  1. Entry
") + assert.Equal(t, markdown.Render("1. Entry\n2. Entry"), "
  1. Entry
  2. Entry
") } func TestTables(t *testing.T) { From 809b89d689ab6ade1d52fcb6efac9c396baa9209 Mon Sep 17 00:00:00 2001 From: Eduard Urbach Date: Wed, 3 Apr 2024 21:13:59 +0200 Subject: [PATCH 07/10] Implemented image links --- README.md | 8 +++++--- Render.go | 32 ++++++++++++++++++++++++------ Render_test.go | 53 +++++++++++++++++++++++++++++--------------------- 3 files changed, 62 insertions(+), 31 deletions(-) diff --git a/README.md b/README.md index 4c65a88..c19ffd8 100644 --- a/README.md +++ b/README.md @@ -9,6 +9,7 @@ A markdown renderer that supports only a subset of the CommonMark spec in order - Italic - Links - Lists +- Images - Headers - Paragraphs - Quotes @@ -38,6 +39,7 @@ PASS: TestItalic PASS: TestBold PASS: TestStrike PASS: TestLink +PASS: TestImage PASS: TestList PASS: TestTables PASS: TestCode @@ -51,9 +53,9 @@ coverage: 100.0% of statements ## Benchmarks ``` -BenchmarkSmall-12 5836533 205.3 ns/op 32 B/op 1 allocs/op -BenchmarkMedium-12 967740 1103 ns/op 512 B/op 1 allocs/op -BenchmarkLarge-12 277908 4099 ns/op 2560 B/op 2 allocs/op +BenchmarkSmall-12 5884641 201.5 ns/op 32 B/op 1 allocs/op +BenchmarkMedium-12 938371 1124 ns/op 512 B/op 1 allocs/op +BenchmarkLarge-12 277065 4115 ns/op 2560 B/op 2 allocs/op ``` ## License diff --git a/Render.go b/Render.go index eeae870..15aad80 100644 --- a/Render.go +++ b/Render.go @@ -279,6 +279,7 @@ func (r *renderer) writeText(markdown string) { searchStart = 0 linkTextStart = -1 linkTextEnd = -1 + linkIsImage = false emStart = -1 strongStart = -1 strikeStart = -1 @@ -286,7 +287,7 @@ func (r *renderer) writeText(markdown string) { begin: for { - i := strings.IndexAny(markdown[searchStart:], "[]()`*_~") + i := strings.IndexAny(markdown[searchStart:], "[]()`*_~!") if i == -1 { r.WriteString(html.EscapeString(markdown[tokenStart:])) @@ -332,11 +333,19 @@ begin: linkText := markdown[linkTextStart+1 : linkTextEnd] linkURL := markdown[i+1 : urlEnd] - r.WriteString("") - r.WriteString(html.EscapeString(linkText)) - r.WriteString("") + if linkIsImage { + r.WriteString("\"")") + } else { + r.WriteString("") + r.WriteString(html.EscapeString(linkText)) + r.WriteString("") + } linkTextStart = -1 linkTextEnd = -1 @@ -402,6 +411,17 @@ begin: tokenStart = i strikeStart = i + 2 } + + case '!': + if i+1 >= len(markdown) || markdown[i+1] != '[' { + continue + } + + r.WriteString(html.EscapeString(markdown[tokenStart:i])) + tokenStart = i + linkTextStart = i + 1 + searchStart++ + linkIsImage = true } } } diff --git a/Render_test.go b/Render_test.go index db81fd4..c71d402 100644 --- a/Render_test.go +++ b/Render_test.go @@ -45,13 +45,22 @@ func TestStrike(t *testing.T) { } func TestLink(t *testing.T) { - assert.Equal(t, markdown.Render("[text](https://example.com/)"), "

text

") - assert.Equal(t, markdown.Render("[text](https://example.com/"), "

[text](https://example.com/

") - assert.Equal(t, markdown.Render("[text]https://example.com/)"), "

[text]https://example.com/)

") - assert.Equal(t, markdown.Render("[text(https://example.com/)"), "

[text(https://example.com/)

") - assert.Equal(t, markdown.Render("text](https://example.com/)"), "

text](https://example.com/)

") - assert.Equal(t, markdown.Render("[text](https://example.com/_test_)"), "

text

") - assert.Equal(t, markdown.Render("Prefix [text](https://example.com/) suffix."), "

Prefix text suffix.

") + assert.Equal(t, markdown.Render("[text](https://example.com/)"), `

text

`) + assert.Equal(t, markdown.Render("[text](https://example.com/"), `

[text](https://example.com/

`) + assert.Equal(t, markdown.Render("[text]https://example.com/)"), `

[text]https://example.com/)

`) + assert.Equal(t, markdown.Render("[text(https://example.com/)"), `

[text(https://example.com/)

`) + assert.Equal(t, markdown.Render("text](https://example.com/)"), `

text](https://example.com/)

`) + assert.Equal(t, markdown.Render("[text](https://example.com/_test_)"), `

text

`) + assert.Equal(t, markdown.Render("Prefix [text](https://example.com/) suffix."), `

Prefix text suffix.

`) +} + +func TestImage(t *testing.T) { + assert.Equal(t, markdown.Render("!"), `

!

`) + assert.Equal(t, markdown.Render("!["), `

![

`) + assert.Equal(t, markdown.Render("![]"), `

![]

`) + assert.Equal(t, markdown.Render("![]("), `

![](

`) + assert.Equal(t, markdown.Render("![]()"), `

`) + assert.Equal(t, markdown.Render("![title](https://example.com/image.png)"), `

title

`) } func TestList(t *testing.T) { @@ -97,22 +106,22 @@ func TestSeparator(t *testing.T) { } func TestCombined(t *testing.T) { - assert.Equal(t, markdown.Render("# Header\n\nLine 1."), "

Header

Line 1.

") - assert.Equal(t, markdown.Render("# Header\nLine 1.\nLine 2.\nLine 3."), "

Header

Line 1. Line 2. Line 3.

") - assert.Equal(t, markdown.Render("# Header 1\nLine 1.\n# Header 2\nLine 2."), "

Header 1

Line 1.

Header 2

Line 2.

") - assert.Equal(t, markdown.Render("# [Header Link](https://example.com/)"), "

Header Link

") - assert.Equal(t, markdown.Render("# Title\n\n- Entry 1\n- Entry 2\n\nText."), "

Title

  • Entry 1
  • Entry 2

Text.

") - assert.Equal(t, markdown.Render("- Entry\n# Header"), "
  • Entry

Header

") - assert.Equal(t, markdown.Render("> - Entry\n> # Header"), "
  • Entry

Header

") - assert.Equal(t, markdown.Render("> **bold** and *italic* text."), "

bold and italic text.

") - assert.Equal(t, markdown.Render("> __bold__ and _italic_ text."), "

bold and italic text.

") + assert.Equal(t, markdown.Render("# Header\n\nLine 1."), `

Header

Line 1.

`) + assert.Equal(t, markdown.Render("# Header\nLine 1.\nLine 2.\nLine 3."), `

Header

Line 1. Line 2. Line 3.

`) + assert.Equal(t, markdown.Render("# Header 1\nLine 1.\n# Header 2\nLine 2."), `

Header 1

Line 1.

Header 2

Line 2.

`) + assert.Equal(t, markdown.Render("# [Header Link](https://example.com/)"), `

Header Link

`) + assert.Equal(t, markdown.Render("# Title\n\n- Entry 1\n- Entry 2\n\nText."), `

Title

  • Entry 1
  • Entry 2

Text.

`) + assert.Equal(t, markdown.Render("- Entry\n# Header"), `
  • Entry

Header

`) + assert.Equal(t, markdown.Render("> - Entry\n> # Header"), `
  • Entry

Header

`) + assert.Equal(t, markdown.Render("> **bold** and *italic* text."), `

bold and italic text.

`) + assert.Equal(t, markdown.Render("> __bold__ and _italic_ text."), `

bold and italic text.

`) } func TestSecurity(t *testing.T) { - assert.Equal(t, markdown.Render("[text](javascript:alert(\"xss\"))"), "

text

") - assert.Equal(t, markdown.Render("[text](javAscRipt:alert(\"xss\"))"), "

text

") - assert.Equal(t, markdown.Render("[text]( javascript:alert(\"xss\"))"), "

text

") - assert.Equal(t, markdown.Render("[text]('javAscRipt:alert(\"xss\")')"), "

text

") - assert.Equal(t, markdown.Render("[text](\">)"), "

text

") - assert.Equal(t, markdown.Render("[]()"), "

<script>alert(123)</script>

") + assert.Equal(t, markdown.Render(`[text](javascript:alert("xss"))`), `

text

`) + assert.Equal(t, markdown.Render(`[text](javAscRipt:alert("xss"))`), `

text

`) + assert.Equal(t, markdown.Render(`[text]( javascript:alert("xss"))`), `

text

`) + assert.Equal(t, markdown.Render(`[text]('javAscRipt:alert("xss")')`), `

text

`) + assert.Equal(t, markdown.Render(`[text](">)`), `

text

`) + assert.Equal(t, markdown.Render(`[]()`), `

<script>alert(123)</script>

`) } From 0b31c9f8886d504f9238e0f486f8b73785baab2c Mon Sep 17 00:00:00 2001 From: Eduard Urbach Date: Tue, 25 Feb 2025 16:51:04 +0100 Subject: [PATCH 08/10] Updated module path --- README.md | 4 ++-- Render_test.go | 4 ++-- benchmarks_test.go | 10 +++++----- go.mod | 6 +++--- go.sum | 4 ++-- 5 files changed, 14 insertions(+), 14 deletions(-) diff --git a/README.md b/README.md index c19ffd8..ea5cc1b 100644 --- a/README.md +++ b/README.md @@ -20,7 +20,7 @@ A markdown renderer that supports only a subset of the CommonMark spec in order ## Installation ```shell -go get git.akyoto.dev/go/markdown +go get git.urbach.dev/go/markdown ``` ## Usage @@ -60,7 +60,7 @@ BenchmarkLarge-12 277065 4115 ns/op 2560 B/op ## License -Please see the [license documentation](https://akyoto.dev/license). +Please see the [license documentation](https://urbach.dev/license). ## Copyright diff --git a/Render_test.go b/Render_test.go index c71d402..abfb318 100644 --- a/Render_test.go +++ b/Render_test.go @@ -3,8 +3,8 @@ package markdown_test import ( "testing" - "git.akyoto.dev/go/assert" - "git.akyoto.dev/go/markdown" + "git.urbach.dev/go/assert" + "git.urbach.dev/go/markdown" ) func TestEmpty(t *testing.T) { diff --git a/benchmarks_test.go b/benchmarks_test.go index c9231e9..3957b84 100644 --- a/benchmarks_test.go +++ b/benchmarks_test.go @@ -4,8 +4,8 @@ import ( "os" "testing" - "git.akyoto.dev/go/assert" - "git.akyoto.dev/go/markdown" + "git.urbach.dev/go/assert" + "git.urbach.dev/go/markdown" ) func BenchmarkSmall(b *testing.B) { @@ -13,7 +13,7 @@ func BenchmarkSmall(b *testing.B) { assert.Nil(b, err) input := string(small) - for range b.N { + for b.Loop() { markdown.Render(input) } } @@ -23,7 +23,7 @@ func BenchmarkMedium(b *testing.B) { assert.Nil(b, err) input := string(medium) - for range b.N { + for b.Loop() { markdown.Render(input) } } @@ -33,7 +33,7 @@ func BenchmarkLarge(b *testing.B) { assert.Nil(b, err) input := string(large) - for range b.N { + for b.Loop() { markdown.Render(input) } } diff --git a/go.mod b/go.mod index f178769..39637f4 100644 --- a/go.mod +++ b/go.mod @@ -1,5 +1,5 @@ -module git.akyoto.dev/go/markdown +module git.urbach.dev/go/markdown -go 1.22.1 +go 1.24 -require git.akyoto.dev/go/assert v0.1.3 +require git.urbach.dev/go/assert v0.0.0-20250225153414-fc1f84f19edf diff --git a/go.sum b/go.sum index 9fc2547..af0fe0b 100644 --- a/go.sum +++ b/go.sum @@ -1,2 +1,2 @@ -git.akyoto.dev/go/assert v0.1.3 h1:QwCUbmG4aZYsNk/OuRBz1zWVKmGlDUHhOnnDBfn8Qw8= -git.akyoto.dev/go/assert v0.1.3/go.mod h1:0GzMaM0eURuDwtGkJJkCsI7r2aUKr+5GmWNTFPgDocM= +git.urbach.dev/go/assert v0.0.0-20250225153414-fc1f84f19edf h1:BQWa5GKNUsA5CSUa/+UlFWYCEVe3IDDKRbVqBLK0mAE= +git.urbach.dev/go/assert v0.0.0-20250225153414-fc1f84f19edf/go.mod h1:y9jGII9JFiF1HNIju0u87OyPCt82xKCtqnAFyEreCDo= From 4aea4ae42ca2d075da71d407e34b10f51289d793 Mon Sep 17 00:00:00 2001 From: Eduard Urbach Date: Thu, 12 Jun 2025 11:42:56 +0200 Subject: [PATCH 09/10] Updated formatting --- Render.go | 2 +- Render_test.go | 2 +- benchmarks_test.go | 2 +- go.mod | 2 +- go.sum | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Render.go b/Render.go index 15aad80..d9facae 100644 --- a/Render.go +++ b/Render.go @@ -459,4 +459,4 @@ func nextPowerOf2(x uint32) uint32 { x |= x >> 16 x++ return x -} +} \ No newline at end of file diff --git a/Render_test.go b/Render_test.go index abfb318..86fbe97 100644 --- a/Render_test.go +++ b/Render_test.go @@ -124,4 +124,4 @@ func TestSecurity(t *testing.T) { assert.Equal(t, markdown.Render(`[text]('javAscRipt:alert("xss")')`), `

text

`) assert.Equal(t, markdown.Render(`[text](">)`), `

text

`) assert.Equal(t, markdown.Render(`[]()`), `

<script>alert(123)</script>

`) -} +} \ No newline at end of file diff --git a/benchmarks_test.go b/benchmarks_test.go index 3957b84..50501be 100644 --- a/benchmarks_test.go +++ b/benchmarks_test.go @@ -36,4 +36,4 @@ func BenchmarkLarge(b *testing.B) { for b.Loop() { markdown.Render(input) } -} +} \ No newline at end of file diff --git a/go.mod b/go.mod index 39637f4..50b869e 100644 --- a/go.mod +++ b/go.mod @@ -2,4 +2,4 @@ module git.urbach.dev/go/markdown go 1.24 -require git.urbach.dev/go/assert v0.0.0-20250225153414-fc1f84f19edf +require git.urbach.dev/go/assert v0.0.0-20250225153414-fc1f84f19edf \ No newline at end of file diff --git a/go.sum b/go.sum index af0fe0b..6016d21 100644 --- a/go.sum +++ b/go.sum @@ -1,2 +1,2 @@ git.urbach.dev/go/assert v0.0.0-20250225153414-fc1f84f19edf h1:BQWa5GKNUsA5CSUa/+UlFWYCEVe3IDDKRbVqBLK0mAE= -git.urbach.dev/go/assert v0.0.0-20250225153414-fc1f84f19edf/go.mod h1:y9jGII9JFiF1HNIju0u87OyPCt82xKCtqnAFyEreCDo= +git.urbach.dev/go/assert v0.0.0-20250225153414-fc1f84f19edf/go.mod h1:y9jGII9JFiF1HNIju0u87OyPCt82xKCtqnAFyEreCDo= \ No newline at end of file From 5e3c6d42f7015caed6bf49233c53580ecdc723ad Mon Sep 17 00:00:00 2001 From: Eduard Urbach Date: Thu, 12 Jun 2025 11:43:43 +0200 Subject: [PATCH 10/10] Updated dependencies --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 50b869e..229a4be 100644 --- a/go.mod +++ b/go.mod @@ -2,4 +2,4 @@ module git.urbach.dev/go/markdown go 1.24 -require git.urbach.dev/go/assert v0.0.0-20250225153414-fc1f84f19edf \ No newline at end of file +require git.urbach.dev/go/assert v0.0.0-20250606150337-559d3d3afcda diff --git a/go.sum b/go.sum index 6016d21..7684754 100644 --- a/go.sum +++ b/go.sum @@ -1,2 +1,2 @@ -git.urbach.dev/go/assert v0.0.0-20250225153414-fc1f84f19edf h1:BQWa5GKNUsA5CSUa/+UlFWYCEVe3IDDKRbVqBLK0mAE= -git.urbach.dev/go/assert v0.0.0-20250225153414-fc1f84f19edf/go.mod h1:y9jGII9JFiF1HNIju0u87OyPCt82xKCtqnAFyEreCDo= \ No newline at end of file +git.urbach.dev/go/assert v0.0.0-20250606150337-559d3d3afcda h1:VN6ZQwtwLOm2xTms+v8IIeeNjvs55qyEBNArv3dPq9g= +git.urbach.dev/go/assert v0.0.0-20250606150337-559d3d3afcda/go.mod h1:PNI/NSBOqvoeU58/7eBsIR09Yoq2S/qtSRiTrctkiq0=