summaryrefslogtreecommitdiff
path: root/autoload/filetype/markdown.kak
diff options
context:
space:
mode:
authorthing1 <thing1@seacrossedlovers.xyz>2025-01-28 09:14:32 +0000
committerthing1 <thing1@seacrossedlovers.xyz>2025-01-28 09:14:32 +0000
commit904cec3c4a329cf89fc3219d359239910d61f3f6 (patch)
tree8d113899921dfbaca0e77c49ab5fc827362d1091 /autoload/filetype/markdown.kak
init commitHEADmaster
Diffstat (limited to 'autoload/filetype/markdown.kak')
-rw-r--r--autoload/filetype/markdown.kak130
1 files changed, 130 insertions, 0 deletions
diff --git a/autoload/filetype/markdown.kak b/autoload/filetype/markdown.kak
new file mode 100644
index 0000000..b515909
--- /dev/null
+++ b/autoload/filetype/markdown.kak
@@ -0,0 +1,130 @@
+# http://daringfireball.net/projects/markdown
+# ‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾
+
+# Detection
+# ‾‾‾‾‾‾‾‾‾
+
+hook global BufCreate .*[.](markdown|md|mkd) %{
+ set-option buffer filetype markdown
+}
+
+# Initialization
+# ‾‾‾‾‾‾‾‾‾‾‾‾‾‾
+
+hook global WinSetOption filetype=markdown %{
+ require-module markdown
+
+ hook window ModeChange pop:insert:.* -group markdown-trim-indent markdown-trim-indent
+ hook window InsertChar \n -group markdown-insert markdown-insert-on-new-line
+ hook window InsertChar \n -group markdown-indent markdown-indent-on-new-line
+ hook -once -always window WinSetOption filetype=.* %{ remove-hooks window markdown-.+ }
+}
+
+hook -group markdown-load-languages global WinSetOption filetype=markdown %{
+ markdown-load-languages '%'
+}
+
+hook -group markdown-load-languages global WinSetOption filetype=markdown %{
+ hook -group markdown-load-languages window NormalIdle .* %{markdown-load-languages gtGbGl}
+ hook -group markdown-load-languages window InsertIdle .* %{markdown-load-languages gtGbGl}
+}
+
+
+hook -group markdown-highlight global WinSetOption filetype=markdown %{
+ add-highlighter window/markdown ref markdown
+ hook -once -always window WinSetOption filetype=.* %{ remove-highlighter window/markdown }
+}
+
+
+provide-module markdown %{
+
+# Highlighters
+# ‾‾‾‾‾‾‾‾‾‾‾‾
+
+add-highlighter shared/markdown regions
+add-highlighter shared/markdown/inline default-region regions
+add-highlighter shared/markdown/inline/text default-region group
+
+add-highlighter shared/markdown/listblock region ^\h*[-*]\s ^(?=\S) regions
+add-highlighter shared/markdown/listblock/g default-region group
+add-highlighter shared/markdown/listblock/g/ ref markdown/inline
+add-highlighter shared/markdown/listblock/g/marker regex ^\h*([-*])\s 1:bullet
+
+add-highlighter shared/markdown/codeblock region -match-capture \
+ ^(\h*)```\h* \
+ ^(\h*)```\h*$ \
+ regions
+add-highlighter shared/markdown/codeblock/ default-region fill meta
+add-highlighter shared/markdown/listblock/codeblock region -match-capture \
+ ^(\h*)```\h* \
+ ^(\h*)```\h*$ \
+ regions
+add-highlighter shared/markdown/listblock/codeblock/ default-region fill meta
+add-highlighter shared/markdown/codeline region "^( {4}|\t)" "$" fill meta
+
+# https://spec.commonmark.org/0.29/#link-destination
+add-highlighter shared/markdown/angle_bracket_url region (?<=<)([a-z]+://|(mailto|magnet|xmpp):) (?!\\).(?=>)|\n fill link
+add-highlighter shared/markdown/inline/url region -recurse \( (\b[a-z]+://|(mailto|magnet|xmpp):) (?!\\).(?=\))|\s fill link
+add-highlighter shared/markdown/listblock/angle_bracket_url region (?<=<)(\b[a-z]+://|(mailto|magnet|xmpp):) (?!\\).(?=>)|\n fill link
+
+try %{
+ require-module html
+ add-highlighter shared/markdown/inline/tag region (?i)</?[a-z][a-z0-9-]*\s*([a-z_:]|(?=>)) > ref html/tag
+}
+
+add-highlighter shared/markdown/inline/code region -match-capture (`+) (`+) fill mono
+
+# Setext-style header
+add-highlighter shared/markdown/inline/text/ regex (\A|^\n)[^\n]+\n={2,}\h*\n\h*$ 0:title
+add-highlighter shared/markdown/inline/text/ regex (\A|^\n)[^\n]+\n-{2,}\h*\n\h*$ 0:header
+
+# Atx-style header
+add-highlighter shared/markdown/inline/text/ regex ^#[^\n]* 0:header
+
+add-highlighter shared/markdown/inline/text/ regex (?<!\*)(\*([^\s*]|([^\s*](\n?[^\n*])*[^\s*]))\*)(?!\*) 1:+i
+add-highlighter shared/markdown/inline/text/ regex (?<!_)(_([^\s_]|([^\s_](\n?[^\n_])*[^\s_]))_)(?!_) 1:+i
+add-highlighter shared/markdown/inline/text/ regex (?<!\*)(\*\*([^\s*]|([^\s*](\n?[^\n*])*[^\s*]))\*\*)(?!\*) 1:+b
+add-highlighter shared/markdown/inline/text/ regex (?<!_)(__([^\s_]|([^\s_](\n?[^\n_])*[^\s_]))__)(?!_) 1:+b
+add-highlighter shared/markdown/inline/text/ regex ^\h*(>\h*)+ 0:comment
+add-highlighter shared/markdown/inline/text/ regex "\H( {2,})$" 1:+r@meta
+
+# Commands
+# ‾‾‾‾‾‾‾‾
+
+define-command markdown-load-languages -params 1 %{
+ evaluate-commands -draft %{ try %{
+ execute-keys "%arg{1}1s```\h*\{?[.=]?(\w+)\}?<ret>"
+ evaluate-commands -itersel %{ try %{
+ require-module %val{selection}
+ add-highlighter "shared/markdown/codeblock/%val{selection}" region -match-capture "^(\h*)```\h*(%val{selection}\b|\{[.=]?%val{selection}\})" ^(\h*)``` regions
+ add-highlighter "shared/markdown/codeblock/%val{selection}/" default-region fill meta
+ add-highlighter "shared/markdown/codeblock/%val{selection}/inner" region \A\h*```[^\n]*\K (?=```) ref %val{selection}
+ add-highlighter "shared/markdown/listblock/codeblock/%val{selection}" region -match-capture "^(\h*)```\h*(%val{selection}\b|\{[.=]?%val{selection}\})" ^(\h*)``` regions
+ add-highlighter "shared/markdown/listblock/codeblock/%val{selection}/" default-region fill meta
+ add-highlighter "shared/markdown/listblock/codeblock/%val{selection}/inner" region \A\h*```[^\n]*\K (?=```) ref %val{selection}
+ }}
+ }}
+}
+
+define-command -hidden markdown-trim-indent %{
+ evaluate-commands -no-hooks -draft -itersel %{
+ execute-keys x
+ # remove trailing white spaces
+ try %{ execute-keys -draft s \h + $ <ret> d }
+ }
+}
+
+define-command -hidden markdown-insert-on-new-line %{
+ try %{ execute-keys -draft -itersel k x s ^\h*\K((>\h*)+([*+-]\h)?|(>\h*)*[*+-]\h)\h* <ret> y gh j P }
+}
+
+define-command -hidden markdown-indent-on-new-line %{
+ evaluate-commands -draft -itersel %{
+ # preserve previous line indent
+ try %{ execute-keys -draft <semicolon> K <a-&> }
+ # remove trailing white spaces
+ try %{ execute-keys -draft k x s \h+$ <ret> d }
+ }
+}
+
+}