From abdec9e64f1975cbc3811d53319c56fde0fb278a Mon Sep 17 00:00:00 2001 From: Levi Gruspe Date: Fri, 16 Sep 2022 19:33:32 +0800 Subject: [PATCH 1/5] Add tests for HeaderDecrease and HeaderIncrease --- test/header-decrease.vader | 91 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 91 insertions(+) create mode 100644 test/header-decrease.vader diff --git a/test/header-decrease.vader b/test/header-decrease.vader new file mode 100644 index 00000000..0e26c933 --- /dev/null +++ b/test/header-decrease.vader @@ -0,0 +1,91 @@ +Given markdown; +# a + +## b + +### c + +#### d + +##### e + +Execute (HeaderIncrease without forbidden level): + :HeaderIncrease + +Expect (increase level of all headers): + ## a + + ### b + + #### c + + ##### d + + ###### e + +Given markdown; +# a + +###### b + +Execute (HeaderIncrease with forbidden level): + :HeaderIncrease + +Expect (no changes): + # a + + ###### b + +Given markdown; +## a + +### b + +#### c + +##### d + +###### e + +Execute (HeaderDecrease without forbidden level): + :HeaderDecrease + +Expect (decrease level of all headers): + # a + + ## b + + ### c + + #### d + + ##### e + +Given markdown; +# a + +## b + +### c + +#### d + +##### e + +###### f + +Execute (HeaderDecrease with forbidden level): + :HeaderDecrease + +Expect (no changes): + # a + + ## b + + ### c + + #### d + + ##### e + + ###### f From 05e5742d90ee841c70f64356d0ecfdd68e97edcf Mon Sep 17 00:00:00 2001 From: Levi Gruspe Date: Fri, 16 Sep 2022 18:48:09 +0800 Subject: [PATCH 2/5] Add space in header regex --- ftplugin/markdown.vim | 16 ++++++++-------- test/map.vader | 12 +++++++++--- test/toc.vader | 3 --- 3 files changed, 17 insertions(+), 14 deletions(-) diff --git a/ftplugin/markdown.vim b/ftplugin/markdown.vim index 5e402269..27c87678 100644 --- a/ftplugin/markdown.vim +++ b/ftplugin/markdown.vim @@ -48,12 +48,12 @@ " For each level, contains the regexp that matches at that level only. " let s:levelRegexpDict = { - \ 1: '\v^(#[^#]@=|.+\n\=+$)', - \ 2: '\v^(##[^#]@=|.+\n-+$)', - \ 3: '\v^###[^#]@=', - \ 4: '\v^####[^#]@=', - \ 5: '\v^#####[^#]@=', - \ 6: '\v^######[^#]@=' + \ 1: '\v^(#[^#]@=\s+|.+\n\=+$)', + \ 2: '\v^(##[^#]@=\s+|.+\n-+$)', + \ 3: '\v^###[^#]@=\s+', + \ 4: '\v^####[^#]@=\s+', + \ 5: '\v^#####[^#]@=\s+', + \ 6: '\v^######[^#]@=\s+' \ } " Maches any header level of any type. @@ -61,7 +61,7 @@ let s:levelRegexpDict = { " This could be deduced from `s:levelRegexpDict`, but it is more " efficient to have a single regexp for this. " -let s:headersRegexp = '\v^(#|.+\n(\=+|-+)$)' +let s:headersRegexp = '\v^(#{1,6}\s+|.+\n(\=+|-+)$)' " Returns the line number of the first header before `line`, called the " current header. @@ -526,7 +526,7 @@ function! s:HeaderDecrease(line1, line2, ...) let l:numSubstitutions = s:SetexToAtx(a:line1, a:line2) let l:flags = (&gdefault ? '' : 'g') for l:level in range(replaceLevels[0], replaceLevels[1], -l:levelDelta) - execute 'silent! ' . a:line1 . ',' . (a:line2 - l:numSubstitutions) . 'substitute/' . s:levelRegexpDict[l:level] . '/' . repeat('#', l:level + l:levelDelta) . '/' . l:flags + execute 'silent! ' . a:line1 . ',' . (a:line2 - l:numSubstitutions) . 'substitute/' . s:levelRegexpDict[l:level] . '/' . repeat('#', l:level + l:levelDelta) . ' /' . l:flags endfor endfunction diff --git a/test/map.vader b/test/map.vader index 57fe6190..715fd4e3 100644 --- a/test/map.vader +++ b/test/map.vader @@ -94,6 +94,8 @@ Given markdown; b +#ignore + # c d @@ -101,7 +103,7 @@ d Execute (]] same level): AssertEqual line('.'), 1 normal ]] - AssertEqual line('.'), 5 + AssertEqual line('.'), 7 normal [[ AssertEqual line('.'), 1 @@ -110,6 +112,8 @@ Given markdown; b +##ignore + ## c d @@ -117,7 +121,7 @@ d Execute (]] different levels level): AssertEqual line('.'), 1 normal ]] - AssertEqual line('.'), 5 + AssertEqual line('.'), 7 normal [[ AssertEqual line('.'), 1 @@ -126,6 +130,8 @@ Given markdown; b +#ignore + ## c d @@ -137,7 +143,7 @@ f Execute (][ different levels level): AssertEqual line('.'), 1 normal ][ - AssertEqual line('.'), 9 + AssertEqual line('.'), 11 normal [] AssertEqual line('.'), 1 diff --git a/test/toc.vader b/test/toc.vader index 51269526..545c5419 100644 --- a/test/toc.vader +++ b/test/toc.vader @@ -138,14 +138,11 @@ Execute (Toc multiple headers): Expect (multiple headers): h1 space - h1 nospace h1 2 spaces h1 trailing hash h2 space - h2 nospace h2 trailing hash h3 space - h3 nospace h3 trailing hash h4 h5 From 4455ea62213838fdf0797f769f8360fdd10ea631 Mon Sep 17 00:00:00 2001 From: Levi Gruspe Date: Fri, 16 Sep 2022 19:49:49 +0800 Subject: [PATCH 3/5] Test HeaderDecrease on #hashtags --- test/header-decrease.vader | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/test/header-decrease.vader b/test/header-decrease.vader index 0e26c933..17e36699 100644 --- a/test/header-decrease.vader +++ b/test/header-decrease.vader @@ -89,3 +89,29 @@ Expect (no changes): ##### e ###### f + +Given markdown; +## a + +##hashtag + +Execute (HeaderDecrease with hashtag): + :HeaderDecrease + +Expect (hashtags are not affected): + # a + + ##hashtag + +Given markdown; +# a + +#hashtag + +Execute (HeaderIncrease with hashtag): + :HeaderIncrease + +Expect (hashtags are not affected): + ## a + + #hashtag From 7b9425eb0c410865e20d4668e9fc0c1e5d310cdc Mon Sep 17 00:00:00 2001 From: Levi Gruspe Date: Sat, 17 Sep 2022 20:35:09 +0800 Subject: [PATCH 4/5] Match empty atx headings --- ftplugin/markdown.vim | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/ftplugin/markdown.vim b/ftplugin/markdown.vim index 27c87678..812583a8 100644 --- a/ftplugin/markdown.vim +++ b/ftplugin/markdown.vim @@ -48,12 +48,12 @@ " For each level, contains the regexp that matches at that level only. " let s:levelRegexpDict = { - \ 1: '\v^(#[^#]@=\s+|.+\n\=+$)', - \ 2: '\v^(##[^#]@=\s+|.+\n-+$)', - \ 3: '\v^###[^#]@=\s+', - \ 4: '\v^####[^#]@=\s+', - \ 5: '\v^#####[^#]@=\s+', - \ 6: '\v^######[^#]@=\s+' + \ 1: '\v^(#\_s@=|.+\n\=+$)', + \ 2: '\v^(##\_s@=|.+\n-+$)', + \ 3: '\v^###\_s@=', + \ 4: '\v^####\_s@=', + \ 5: '\v^#####\_s@=', + \ 6: '\v^######\_s@=' \ } " Maches any header level of any type. @@ -61,7 +61,7 @@ let s:levelRegexpDict = { " This could be deduced from `s:levelRegexpDict`, but it is more " efficient to have a single regexp for this. " -let s:headersRegexp = '\v^(#{1,6}\s+|.+\n(\=+|-+)$)' +let s:headersRegexp = '\v^(#{1,6}\_s|.+\n(\=+|-+)$)' " Returns the line number of the first header before `line`, called the " current header. @@ -526,7 +526,7 @@ function! s:HeaderDecrease(line1, line2, ...) let l:numSubstitutions = s:SetexToAtx(a:line1, a:line2) let l:flags = (&gdefault ? '' : 'g') for l:level in range(replaceLevels[0], replaceLevels[1], -l:levelDelta) - execute 'silent! ' . a:line1 . ',' . (a:line2 - l:numSubstitutions) . 'substitute/' . s:levelRegexpDict[l:level] . '/' . repeat('#', l:level + l:levelDelta) . ' /' . l:flags + execute 'silent! ' . a:line1 . ',' . (a:line2 - l:numSubstitutions) . 'substitute/' . s:levelRegexpDict[l:level] . '/' . repeat('#', l:level + l:levelDelta) . '/' . l:flags endfor endfunction From aa0dafb8a3c441f5294f8cdb68610d9e43e2b162 Mon Sep 17 00:00:00 2001 From: Levi Gruspe Date: Sat, 17 Sep 2022 20:39:12 +0800 Subject: [PATCH 5/5] Add tests for empty atx headings --- test/header-decrease.vader | 26 ++++++++++++++++++++++++++ test/map.vader | 20 ++++++++++++++++++++ 2 files changed, 46 insertions(+) diff --git a/test/header-decrease.vader b/test/header-decrease.vader index 17e36699..39510d3c 100644 --- a/test/header-decrease.vader +++ b/test/header-decrease.vader @@ -115,3 +115,29 @@ Expect (hashtags are not affected): ## a #hashtag + +Given markdown; +# + +## + +Execute (HeaderIncrease with empty atx headings): + :HeaderIncrease + +Expect (increase level of all headers): + ## + + ### + +Given markdown; +## + +### + +Execute (HeaderDecrease with empty atx headings): + :HeaderDecrease + +Expect (decrease level of all headers): + # + + ## diff --git a/test/map.vader b/test/map.vader index 715fd4e3..7c9304bd 100644 --- a/test/map.vader +++ b/test/map.vader @@ -157,3 +157,23 @@ Execute (]h): AssertEqual line('.'), 3 normal ]h AssertEqual line('.'), 1 + +Given markdown; +# + +## + +# + +## + +Execute (]] empty atx heading): + AssertEqual line('.'), 1 + normal ]] + AssertEqual line('.'), 3 + normal [[ + AssertEqual line('.'), 1 + normal ][ + AssertEqual line('.'), 5 + normal [] + AssertEqual line('.'), 1