mirror of
https://github.com/sharkdp/bat.git
synced 2025-10-16 08:43:50 +01:00
Merge pull request #3435 from MuntasirSZN/fix/markdown-typescript
feat: add typescript codeblock highlight patches for markdown
This commit is contained in:
@@ -7,6 +7,7 @@
|
||||
- Support negative relative line ranges, e.g. `bat -r :-10` / `bat -r='-10:'`, see #3068 (@ajesipow)
|
||||
- Support context in line ranges, e.g. `bat -r 30::5` / `bat -r 30:40:5`, see #3345 (@cavanaug)
|
||||
- Add built-in 'minus' pager, e.g. `bat --pager=builtin` see PR #3402 (@academician)
|
||||
- Syntax highlighting for typescript code blocks within Markdown files, see #3435 (@MuntasirSZN)
|
||||
|
||||
## Bugfixes
|
||||
|
||||
|
19
assets/patches/Markdown.sublime-syntax.patch
vendored
19
assets/patches/Markdown.sublime-syntax.patch
vendored
@@ -166,7 +166,7 @@ index 19dc685d..3a45ea05 100644
|
||||
- match: ^\s*$\n?
|
||||
scope: invalid.illegal.non-terminated.bold-italic.markdown
|
||||
pop: true
|
||||
@@ -1073,6 +1031,21 @@ contexts:
|
||||
@@ -1073,6 +1031,36 @@ contexts:
|
||||
escape: '{{code_fence_escape}}'
|
||||
escape_captures:
|
||||
0: meta.code-fence.definition.end.python.markdown-gfm
|
||||
@@ -185,10 +185,25 @@ index 19dc685d..3a45ea05 100644
|
||||
+ escape: '{{code_fence_escape}}'
|
||||
+ escape_captures:
|
||||
+ 0: meta.code-fence.definition.end.puppet.markdown-gfm
|
||||
+ 1: punctuation.definition.raw.code-fence.end.markdown
|
||||
+ - match: |-
|
||||
+ (?x)
|
||||
+ {{fenced_code_block_start}}
|
||||
+ ((?i:typescript|ts))
|
||||
+ {{fenced_code_block_trailing_infostring_characters}}
|
||||
+ captures:
|
||||
+ 0: meta.code-fence.definition.begin.typescript.markdown-gfm
|
||||
+ 2: punctuation.definition.raw.code-fence.begin.markdown
|
||||
+ 5: constant.other.language-name.markdown
|
||||
+ embed: scope:source.ts
|
||||
+ embed_scope: markup.raw.code-fence.typescript.markdown-gfm
|
||||
+ escape: '{{code_fence_escape}}'
|
||||
+ escape_captures:
|
||||
+ 0: meta.code-fence.definition.end.typescript.markdown-gfm
|
||||
1: punctuation.definition.raw.code-fence.end.markdown
|
||||
- match: |-
|
||||
(?x)
|
||||
@@ -1152,7 +1125,7 @@ contexts:
|
||||
@@ -1152,7 +1155,7 @@ contexts:
|
||||
- match: |-
|
||||
(?x)
|
||||
{{fenced_code_block_start}}
|
||||
|
57
tests/syntax-tests/highlighted/Markdown/typescript.md
vendored
Normal file
57
tests/syntax-tests/highlighted/Markdown/typescript.md
vendored
Normal file
@@ -0,0 +1,57 @@
|
||||
[38;2;253;151;31m#[0m[38;2;253;151;31m [0m[38;2;253;151;31mTypescript test[0m
|
||||
|
||||
[38;2;255;255;255m```[0m[38;2;190;132;255mtypescript[0m
|
||||
[3;38;2;102;217;239menum[0m[38;2;255;255;255m [0m[38;2;166;226;46mStatus[0m[38;2;255;255;255m [0m[38;2;255;255;255m{[0m
|
||||
[38;2;255;255;255m [0m[38;2;255;255;255mPending[0m[38;2;255;255;255m,[0m
|
||||
[38;2;255;255;255m [0m[38;2;255;255;255mInProgress[0m[38;2;255;255;255m,[0m
|
||||
[38;2;255;255;255m [0m[38;2;255;255;255mCompleted[0m[38;2;255;255;255m,[0m
|
||||
[38;2;255;255;255m}[0m
|
||||
|
||||
[3;38;2;102;217;239minterface[0m[38;2;255;255;255m [0m[38;2;166;226;46mTask[0m[38;2;255;255;255m [0m[38;2;255;255;255m{[0m
|
||||
[38;2;255;255;255m [0m[38;2;255;255;255mid[0m[38;2;249;38;114m:[0m[38;2;255;255;255m [0m[3;38;2;166;226;46mnumber[0m[38;2;255;255;255m;[0m
|
||||
[38;2;255;255;255m [0m[38;2;255;255;255mtitle[0m[38;2;249;38;114m:[0m[38;2;255;255;255m [0m[3;38;2;166;226;46mstring[0m[38;2;255;255;255m;[0m
|
||||
[38;2;255;255;255m [0m[38;2;255;255;255mstatus[0m[38;2;249;38;114m:[0m[38;2;255;255;255m [0m[38;2;166;226;46mStatus[0m[38;2;255;255;255m;[0m
|
||||
[38;2;255;255;255m [0m[38;2;255;255;255massignee[0m[38;2;249;38;114m?[0m[38;2;249;38;114m:[0m[38;2;255;255;255m [0m[3;38;2;166;226;46mstring[0m[38;2;255;255;255m;[0m
|
||||
[38;2;255;255;255m}[0m
|
||||
|
||||
[3;38;2;102;217;239mclass[0m[38;2;255;255;255m [0m[38;2;166;226;46mTaskManager[0m[38;2;255;255;255m<[0m[38;2;166;226;46mT[0m[38;2;255;255;255m [0m[38;2;249;38;114mextends[0m[38;2;255;255;255m [0m[38;2;166;226;46mTask[0m[38;2;255;255;255m>[0m[38;2;255;255;255m [0m[38;2;255;255;255m{[0m
|
||||
[38;2;255;255;255m [0m[38;2;249;38;114mprivate[0m[38;2;255;255;255m [0m[38;2;255;255;255mtasks[0m[38;2;249;38;114m:[0m[38;2;255;255;255m [0m[38;2;166;226;46mT[0m[38;2;255;255;255m[[0m[38;2;255;255;255m][0m[38;2;255;255;255m [0m[38;2;249;38;114m=[0m[38;2;255;255;255m [0m[38;2;255;255;255m[[0m[38;2;255;255;255m][0m[38;2;255;255;255m;[0m
|
||||
|
||||
[38;2;255;255;255m [0m[38;2;166;226;46maddTask[0m[38;2;255;255;255m([0m[3;38;2;253;151;31mtask[0m[38;2;249;38;114m:[0m[38;2;255;255;255m [0m[38;2;166;226;46mT[0m[38;2;255;255;255m)[0m[38;2;249;38;114m:[0m[38;2;255;255;255m [0m[3;38;2;166;226;46mvoid[0m[38;2;255;255;255m [0m[38;2;255;255;255m{[0m
|
||||
[38;2;255;255;255m [0m[38;2;255;255;255mthis[0m[38;2;255;255;255m.[0m[38;2;255;255;255mtasks[0m[38;2;255;255;255m.[0m[38;2;102;217;239mpush[0m[38;2;255;255;255m([0m[38;2;255;255;255mtask[0m[38;2;255;255;255m)[0m[38;2;255;255;255m;[0m
|
||||
[38;2;255;255;255m [0m[38;2;255;255;255m}[0m
|
||||
|
||||
[38;2;255;255;255m [0m[38;2;166;226;46mgetTasksByStatus[0m[38;2;255;255;255m([0m[3;38;2;253;151;31mstatus[0m[38;2;249;38;114m:[0m[38;2;255;255;255m [0m[38;2;166;226;46mStatus[0m[38;2;255;255;255m)[0m[38;2;249;38;114m:[0m[38;2;255;255;255m [0m[38;2;166;226;46mT[0m[38;2;255;255;255m[[0m[38;2;255;255;255m][0m[38;2;255;255;255m [0m[38;2;255;255;255m{[0m
|
||||
[38;2;255;255;255m [0m[38;2;249;38;114mreturn[0m[38;2;255;255;255m [0m[38;2;255;255;255mthis[0m[38;2;255;255;255m.[0m[38;2;255;255;255mtasks[0m[38;2;255;255;255m.[0m[38;2;166;226;46mfilter[0m[38;2;255;255;255m([0m[3;38;2;253;151;31mtask[0m[38;2;255;255;255m [0m[3;38;2;102;217;239m=>[0m[38;2;255;255;255m [0m[38;2;255;255;255mtask[0m[38;2;255;255;255m.[0m[38;2;255;255;255mstatus[0m[38;2;255;255;255m [0m[38;2;249;38;114m===[0m[38;2;255;255;255m [0m[38;2;255;255;255mstatus[0m[38;2;255;255;255m)[0m[38;2;255;255;255m;[0m
|
||||
[38;2;255;255;255m [0m[38;2;255;255;255m}[0m
|
||||
|
||||
[38;2;255;255;255m [0m[38;2;249;38;114masync[0m[38;2;255;255;255m [0m[38;2;166;226;46mfetchTasks[0m[38;2;255;255;255m([0m[38;2;255;255;255m)[0m[38;2;249;38;114m:[0m[38;2;255;255;255m [0m[38;2;166;226;46mPromise[0m[38;2;255;255;255m<[0m[38;2;166;226;46mT[0m[38;2;255;255;255m[[0m[38;2;255;255;255m][0m[38;2;255;255;255m>[0m[38;2;255;255;255m [0m[38;2;255;255;255m{[0m
|
||||
[38;2;255;255;255m [0m[38;2;117;113;94m//[0m[38;2;117;113;94m Simulate async fetch[0m
|
||||
[38;2;255;255;255m [0m[38;2;249;38;114mreturn[0m[38;2;255;255;255m [0m[38;2;249;38;114mnew[0m[38;2;255;255;255m [0m[3;38;2;166;226;46mPromise[0m[38;2;255;255;255m([0m[3;38;2;253;151;31mresolve[0m[38;2;255;255;255m [0m[3;38;2;102;217;239m=>[0m[38;2;255;255;255m [0m[38;2;102;217;239msetTimeout[0m[38;2;255;255;255m([0m[38;2;255;255;255m([0m[38;2;255;255;255m)[0m[38;2;255;255;255m [0m[3;38;2;102;217;239m=>[0m[38;2;255;255;255m [0m[38;2;166;226;46mresolve[0m[38;2;255;255;255m([0m[38;2;255;255;255mthis[0m[38;2;255;255;255m.[0m[38;2;255;255;255mtasks[0m[38;2;255;255;255m)[0m[38;2;255;255;255m,[0m[38;2;255;255;255m [0m[38;2;190;132;255m500[0m[38;2;255;255;255m)[0m[38;2;255;255;255m)[0m[38;2;255;255;255m;[0m
|
||||
[38;2;255;255;255m [0m[38;2;255;255;255m}[0m
|
||||
[38;2;255;255;255m}[0m
|
||||
|
||||
[38;2;117;113;94m//[0m[38;2;117;113;94m Type guard[0m
|
||||
[3;38;2;102;217;239mfunction[0m[38;2;255;255;255m [0m[38;2;166;226;46misTask[0m[38;2;255;255;255m([0m[3;38;2;253;151;31mobj[0m[38;2;249;38;114m:[0m[38;2;255;255;255m [0m[3;38;2;166;226;46many[0m[38;2;255;255;255m)[0m[38;2;249;38;114m:[0m[38;2;255;255;255m [0m[3;38;2;253;151;31mobj[0m[38;2;255;255;255m [0m[38;2;249;38;114mis[0m[38;2;255;255;255m [0m[38;2;166;226;46mTask[0m[38;2;255;255;255m [0m[38;2;255;255;255m{[0m
|
||||
[38;2;255;255;255m [0m[38;2;249;38;114mreturn[0m[38;2;255;255;255m [0m[38;2;249;38;114mtypeof[0m[38;2;255;255;255m [0m[38;2;255;255;255mobj[0m[38;2;255;255;255m.[0m[38;2;255;255;255mid[0m[38;2;255;255;255m [0m[38;2;249;38;114m===[0m[38;2;255;255;255m [0m[38;2;230;219;116m'[0m[38;2;230;219;116mnumber[0m[38;2;230;219;116m'[0m[38;2;255;255;255m [0m[38;2;249;38;114m&&[0m[38;2;255;255;255m [0m[38;2;249;38;114mtypeof[0m[38;2;255;255;255m [0m[38;2;255;255;255mobj[0m[38;2;255;255;255m.[0m[38;2;255;255;255mtitle[0m[38;2;255;255;255m [0m[38;2;249;38;114m===[0m[38;2;255;255;255m [0m[38;2;230;219;116m'[0m[38;2;230;219;116mstring[0m[38;2;230;219;116m'[0m[38;2;255;255;255m;[0m
|
||||
[38;2;255;255;255m}[0m
|
||||
|
||||
[38;2;117;113;94m//[0m[38;2;117;113;94m Usage[0m
|
||||
[3;38;2;102;217;239mconst[0m[38;2;255;255;255m [0m[38;2;255;255;255mmanager[0m[38;2;255;255;255m [0m[38;2;249;38;114m=[0m[38;2;255;255;255m [0m[38;2;249;38;114mnew[0m[38;2;255;255;255m [0m[38;2;166;226;46mTaskManager[0m[38;2;255;255;255m<[0m[38;2;166;226;46mTask[0m[38;2;255;255;255m>[0m[38;2;255;255;255m([0m[38;2;255;255;255m)[0m[38;2;255;255;255m;[0m
|
||||
[38;2;255;255;255mmanager[0m[38;2;255;255;255m.[0m[38;2;166;226;46maddTask[0m[38;2;255;255;255m([0m[38;2;255;255;255m{[0m[38;2;255;255;255m [0m[38;2;255;255;255mid[0m[38;2;255;255;255m:[0m[38;2;255;255;255m [0m[38;2;190;132;255m1[0m[38;2;255;255;255m,[0m[38;2;255;255;255m [0m[38;2;255;255;255mtitle[0m[38;2;255;255;255m:[0m[38;2;255;255;255m [0m[38;2;230;219;116m"[0m[38;2;230;219;116mWrite docs[0m[38;2;230;219;116m"[0m[38;2;255;255;255m,[0m[38;2;255;255;255m [0m[38;2;255;255;255mstatus[0m[38;2;255;255;255m:[0m[38;2;255;255;255m [0m[38;2;255;255;255mStatus[0m[38;2;255;255;255m.[0m[38;2;255;255;255mPending[0m[38;2;255;255;255m [0m[38;2;255;255;255m}[0m[38;2;255;255;255m)[0m[38;2;255;255;255m;[0m
|
||||
[38;2;255;255;255mmanager[0m[38;2;255;255;255m.[0m[38;2;166;226;46maddTask[0m[38;2;255;255;255m([0m[38;2;255;255;255m{[0m[38;2;255;255;255m [0m[38;2;255;255;255mid[0m[38;2;255;255;255m:[0m[38;2;255;255;255m [0m[38;2;190;132;255m2[0m[38;2;255;255;255m,[0m[38;2;255;255;255m [0m[38;2;255;255;255mtitle[0m[38;2;255;255;255m:[0m[38;2;255;255;255m [0m[38;2;230;219;116m"[0m[38;2;230;219;116mReview PR[0m[38;2;230;219;116m"[0m[38;2;255;255;255m,[0m[38;2;255;255;255m [0m[38;2;255;255;255mstatus[0m[38;2;255;255;255m:[0m[38;2;255;255;255m [0m[38;2;255;255;255mStatus[0m[38;2;255;255;255m.[0m[38;2;255;255;255mInProgress[0m[38;2;255;255;255m,[0m[38;2;255;255;255m [0m[38;2;255;255;255massignee[0m[38;2;255;255;255m:[0m[38;2;255;255;255m [0m[38;2;230;219;116m"[0m[38;2;230;219;116mAlice[0m[38;2;230;219;116m"[0m[38;2;255;255;255m [0m[38;2;255;255;255m}[0m[38;2;255;255;255m)[0m[38;2;255;255;255m;[0m
|
||||
|
||||
[38;2;255;255;255m([0m[38;2;249;38;114masync[0m[38;2;255;255;255m [0m[38;2;255;255;255m([0m[38;2;255;255;255m)[0m[38;2;255;255;255m [0m[3;38;2;102;217;239m=>[0m[38;2;255;255;255m [0m[38;2;255;255;255m{[0m
|
||||
[38;2;255;255;255m [0m[3;38;2;102;217;239mconst[0m[38;2;255;255;255m [0m[38;2;255;255;255mallTasks[0m[38;2;255;255;255m [0m[38;2;249;38;114m=[0m[38;2;255;255;255m [0m[38;2;249;38;114mawait[0m[38;2;255;255;255m [0m[38;2;255;255;255mmanager[0m[38;2;255;255;255m.[0m[38;2;166;226;46mfetchTasks[0m[38;2;255;255;255m([0m[38;2;255;255;255m)[0m[38;2;255;255;255m;[0m
|
||||
[38;2;255;255;255m [0m[38;2;255;255;255mallTasks[0m[38;2;255;255;255m.[0m[38;2;102;217;239mforEach[0m[38;2;255;255;255m([0m[3;38;2;253;151;31mtask[0m[38;2;255;255;255m [0m[3;38;2;102;217;239m=>[0m[38;2;255;255;255m [0m[38;2;255;255;255m{[0m
|
||||
[38;2;255;255;255m [0m[38;2;249;38;114mif[0m[38;2;255;255;255m [0m[38;2;255;255;255m([0m[38;2;166;226;46misTask[0m[38;2;255;255;255m([0m[38;2;255;255;255mtask[0m[38;2;255;255;255m)[0m[38;2;255;255;255m)[0m[38;2;255;255;255m [0m[38;2;255;255;255m{[0m
|
||||
[38;2;255;255;255m [0m[3;38;2;166;226;46mconsole[0m[38;2;255;255;255m.[0m[38;2;102;217;239mlog[0m[38;2;255;255;255m([0m[38;2;230;219;116m`[0m[38;2;230;219;116mTask #[0m[38;2;230;219;116m${[0m[38;2;255;255;255mtask[0m[38;2;230;219;116m.[0m[38;2;230;219;116mid[0m[38;2;230;219;116m}[0m[38;2;230;219;116m: [0m[38;2;230;219;116m${[0m[38;2;255;255;255mtask[0m[38;2;230;219;116m.[0m[38;2;230;219;116mtitle[0m[38;2;230;219;116m}[0m[38;2;230;219;116m [[0m[38;2;230;219;116m${[0m[38;2;255;255;255mStatus[0m[38;2;230;219;116m[[0m[38;2;255;255;255mtask[0m[38;2;230;219;116m.[0m[38;2;230;219;116mstatus[0m[38;2;230;219;116m][0m[38;2;230;219;116m}[0m[38;2;230;219;116m][0m[38;2;230;219;116m`[0m[38;2;255;255;255m)[0m[38;2;255;255;255m;[0m
|
||||
[38;2;255;255;255m [0m[38;2;255;255;255m}[0m
|
||||
[38;2;255;255;255m [0m[38;2;255;255;255m}[0m[38;2;255;255;255m)[0m[38;2;255;255;255m;[0m
|
||||
[38;2;255;255;255m}[0m[38;2;255;255;255m)[0m[38;2;255;255;255m([0m[38;2;255;255;255m)[0m[38;2;255;255;255m;[0m
|
||||
|
||||
[38;2;117;113;94m//[0m[38;2;117;113;94m Type assertion[0m
|
||||
[3;38;2;102;217;239mconst[0m[38;2;255;255;255m [0m[38;2;255;255;255munknownValue[0m[38;2;249;38;114m:[0m[38;2;255;255;255m [0m[3;38;2;166;226;46munknown[0m[38;2;255;255;255m [0m[38;2;249;38;114m=[0m[38;2;255;255;255m [0m[38;2;255;255;255m{[0m[38;2;255;255;255m [0m[38;2;255;255;255mid[0m[38;2;255;255;255m:[0m[38;2;255;255;255m [0m[38;2;190;132;255m3[0m[38;2;255;255;255m,[0m[38;2;255;255;255m [0m[38;2;255;255;255mtitle[0m[38;2;255;255;255m:[0m[38;2;255;255;255m [0m[38;2;230;219;116m"[0m[38;2;230;219;116mTest[0m[38;2;230;219;116m"[0m[38;2;255;255;255m,[0m[38;2;255;255;255m [0m[38;2;255;255;255mstatus[0m[38;2;255;255;255m:[0m[38;2;255;255;255m [0m[38;2;255;255;255mStatus[0m[38;2;255;255;255m.[0m[38;2;255;255;255mCompleted[0m[38;2;255;255;255m [0m[38;2;255;255;255m}[0m[38;2;255;255;255m;[0m
|
||||
[3;38;2;102;217;239mconst[0m[38;2;255;255;255m [0m[38;2;255;255;255massertedTask[0m[38;2;255;255;255m [0m[38;2;249;38;114m=[0m[38;2;255;255;255m [0m[38;2;255;255;255munknownValue[0m[38;2;255;255;255m [0m[38;2;249;38;114mas[0m[38;2;255;255;255m [0m[38;2;166;226;46mTask[0m[38;2;255;255;255m;[0m
|
||||
[3;38;2;166;226;46mconsole[0m[38;2;255;255;255m.[0m[38;2;102;217;239mlog[0m[38;2;255;255;255m([0m[38;2;255;255;255massertedTask[0m[38;2;255;255;255m.[0m[38;2;255;255;255mtitle[0m[38;2;255;255;255m)[0m[38;2;255;255;255m;[0m
|
||||
[38;2;255;255;255m```[0m
|
57
tests/syntax-tests/source/Markdown/typescript.md
vendored
Normal file
57
tests/syntax-tests/source/Markdown/typescript.md
vendored
Normal file
@@ -0,0 +1,57 @@
|
||||
# Typescript test
|
||||
|
||||
```typescript
|
||||
enum Status {
|
||||
Pending,
|
||||
InProgress,
|
||||
Completed,
|
||||
}
|
||||
|
||||
interface Task {
|
||||
id: number;
|
||||
title: string;
|
||||
status: Status;
|
||||
assignee?: string;
|
||||
}
|
||||
|
||||
class TaskManager<T extends Task> {
|
||||
private tasks: T[] = [];
|
||||
|
||||
addTask(task: T): void {
|
||||
this.tasks.push(task);
|
||||
}
|
||||
|
||||
getTasksByStatus(status: Status): T[] {
|
||||
return this.tasks.filter(task => task.status === status);
|
||||
}
|
||||
|
||||
async fetchTasks(): Promise<T[]> {
|
||||
// Simulate async fetch
|
||||
return new Promise(resolve => setTimeout(() => resolve(this.tasks), 500));
|
||||
}
|
||||
}
|
||||
|
||||
// Type guard
|
||||
function isTask(obj: any): obj is Task {
|
||||
return typeof obj.id === 'number' && typeof obj.title === 'string';
|
||||
}
|
||||
|
||||
// Usage
|
||||
const manager = new TaskManager<Task>();
|
||||
manager.addTask({ id: 1, title: "Write docs", status: Status.Pending });
|
||||
manager.addTask({ id: 2, title: "Review PR", status: Status.InProgress, assignee: "Alice" });
|
||||
|
||||
(async () => {
|
||||
const allTasks = await manager.fetchTasks();
|
||||
allTasks.forEach(task => {
|
||||
if (isTask(task)) {
|
||||
console.log(`Task #${task.id}: ${task.title} [${Status[task.status]}]`);
|
||||
}
|
||||
});
|
||||
})();
|
||||
|
||||
// Type assertion
|
||||
const unknownValue: unknown = { id: 3, title: "Test", status: Status.Completed };
|
||||
const assertedTask = unknownValue as Task;
|
||||
console.log(assertedTask.title);
|
||||
```
|
Reference in New Issue
Block a user