@@ -5,6 +5,60 @@ import * as vscode from 'vscode';
55import * as markdownitContainer from 'markdown-it-container' ;
66import * as S from 'string' ;
77
8+ import * as Prism from 'prismjs' ;
9+
10+ require ( 'prismjs/components/prism-wiki' )
11+ require ( 'prismjs/components/prism-haskell' )
12+ require ( 'prismjs/components/prism-go' )
13+ require ( 'prismjs/components/prism-typescript' )
14+ require ( 'prismjs/components/prism-jsx' )
15+ require ( 'prismjs/components/prism-makefile' )
16+ require ( 'prismjs/components/prism-gherkin' )
17+ require ( 'prismjs/components/prism-sas' )
18+ require ( 'prismjs/components/prism-javascript' )
19+ require ( 'prismjs/components/prism-json' )
20+ require ( 'prismjs/components/prism-c' )
21+ require ( 'prismjs/components/prism-cpp' )
22+ require ( 'prismjs/components/prism-java' )
23+ require ( 'prismjs/components/prism-csharp' )
24+ require ( 'prismjs/components/prism-objectivec' )
25+ require ( 'prismjs/components/prism-scala' )
26+ require ( 'prismjs/components/prism-kotlin' )
27+ require ( 'prismjs/components/prism-groovy' )
28+ require ( 'prismjs/components/prism-r' )
29+ require ( 'prismjs/components/prism-rust' )
30+ require ( 'prismjs/components/prism-yaml' )
31+ require ( 'prismjs/components/prism-pug' )
32+ require ( 'prismjs/components/prism-sass' )
33+
34+ import * as hljs from 'highlight.js/lib/highlight' ;
35+
36+ hljs . registerLanguage ( 'bash' , require ( 'highlight.js/lib/languages/bash' ) )
37+ hljs . registerLanguage ( 'clojure' , require ( 'highlight.js/lib/languages/clojure' ) )
38+ hljs . registerLanguage ( 'coffeescript' , require ( 'highlight.js/lib/languages/coffeescript' ) )
39+ hljs . registerLanguage ( 'cs' , require ( 'highlight.js/lib/languages/cs' ) )
40+ hljs . registerLanguage ( 'css' , require ( 'highlight.js/lib/languages/css' ) )
41+ hljs . registerLanguage ( 'elm' , require ( 'highlight.js/lib/languages/elm' ) )
42+ hljs . registerLanguage ( 'xml' , require ( 'highlight.js/lib/languages/xml' ) )
43+ hljs . registerLanguage ( 'handlebars' , require ( 'highlight.js/lib/languages/handlebars' ) )
44+ hljs . registerLanguage ( 'http' , require ( 'highlight.js/lib/languages/http' ) )
45+ hljs . registerLanguage ( 'ini' , require ( 'highlight.js/lib/languages/ini' ) )
46+ hljs . registerLanguage ( 'prolog' , require ( 'highlight.js/lib/languages/prolog' ) )
47+ hljs . registerLanguage ( 'python' , require ( 'highlight.js/lib/languages/python' ) )
48+ hljs . registerLanguage ( 'ruby' , require ( 'highlight.js/lib/languages/ruby' ) )
49+ hljs . registerLanguage ( 'sql' , require ( 'highlight.js/lib/languages/sql' ) )
50+ hljs . registerLanguage ( 'swift' , require ( 'highlight.js/lib/languages/swift' ) )
51+ hljs . registerLanguage ( 'diff' , require ( 'highlight.js/lib/languages/diff' ) )
52+ hljs . registerLanguage ( 'shell' , require ( 'highlight.js/lib/languages/shell' ) )
53+ hljs . registerLanguage ( 'php' , require ( 'highlight.js/lib/languages/php' ) )
54+ hljs . registerLanguage ( 'lua' , require ( 'highlight.js/lib/languages/lua' ) )
55+ hljs . registerLanguage ( 'nginx' , require ( 'highlight.js/lib/languages/nginx' ) )
56+ hljs . registerLanguage ( 'perl' , require ( 'highlight.js/lib/languages/perl' ) )
57+ hljs . registerLanguage ( 'dockerfile' , require ( 'highlight.js/lib/languages/dockerfile' ) )
58+
59+ let prismLangs = [ 'haskell' , 'go' , 'groovy' , 'typescript' , 'json' , 'jsx' , 'gherkin' , 'sas' , 'javascript' , 'c' , 'cpp' , 'java' , 'csharp' , 'objectivec' , 'scala' , 'kotlin' , 'r' , 'rust' , 'yaml' , 'pug' , 'sass' ]
60+
61+
862function render ( tokens , idx , options , env , self ) : string {
963 tokens [ idx ] . attrJoin ( 'role' , 'alert' ) ;
1064 tokens [ idx ] . attrJoin ( 'class' , 'alert' ) ;
@@ -47,7 +101,10 @@ function parseFenceCodeParams (lang) {
47101}
48102
49103function highlightRender ( code , lang ) {
50- if ( ! lang || / n o ( - ? ) h i g h l i g h t | p l a i n | t e x t / . test ( lang ) ) { return }
104+ if ( ! lang || / n o ( - ? ) h i g h l i g h t | p l a i n | t e x t / . test ( lang ) ) {
105+ // fallback
106+ return highlight ( code , lang ) ;
107+ }
51108 // support adding extra attributes for fence code block
52109 // ex: ```graphviz {engine="neato"}
53110 const params = parseFenceCodeParams ( lang ) as any ;
@@ -69,9 +126,30 @@ function highlightRender (code, lang) {
69126 } else if ( lang === 'abc' ) {
70127 return `<span class="abc raw">${ code } </span>`
71128 }
129+
72130 const result = {
73131 value : code
74132 }
133+
134+ if ( prismLangs . indexOf ( lang ) !== - 1 ) {
135+ code = S ( code ) . unescapeHTML ( ) . s
136+ result . value = Prism . highlight ( code , Prism . languages [ lang ] )
137+ } else if ( lang === 'tiddlywiki' || lang === 'mediawiki' ) {
138+ code = S ( code ) . unescapeHTML ( ) . s
139+ result . value = Prism . highlight ( code , Prism . languages . wiki )
140+ } else if ( lang === 'cmake' ) {
141+ code = S ( code ) . unescapeHTML ( ) . s
142+ result . value = Prism . highlight ( code , Prism . languages . makefile )
143+ } else {
144+ code = S ( code ) . unescapeHTML ( ) . s
145+ const languages = hljs . listLanguages ( )
146+ if ( ! languages . includes ( lang ) ) {
147+ result . value = hljs . highlightAuto ( code ) . value
148+ } else {
149+ result . value = hljs . highlight ( lang , code ) . value
150+ }
151+ }
152+
75153 const showlinenumbers = / = $ | = \d + $ | = \+ $ / . test ( lang )
76154 if ( showlinenumbers ) {
77155 let startnumber = 1
@@ -86,9 +164,11 @@ function highlightRender (code, lang) {
86164 const linegutter = `<div class='gutter linenumber${ continuelinenumber ? ' continue' : '' } '>${ linenumbers . join ( '\n' ) } </div>`
87165 result . value = `<div class='wrapper'>${ linegutter } <div class='code'>${ result . value } </div></div>`
88166 }
89- return result . value
167+ return result . value ;
90168}
91169
170+ let highlight
171+
92172// this method is called when your extension is activated
93173// your extension is activated the very first time the command is executed
94174export function activate ( context : vscode . ExtensionContext ) {
@@ -121,6 +201,7 @@ export function activate(context: vscode.ExtensionContext) {
121201
122202 md . options . linkify = true ;
123203 md . options . typographer = true ;
204+ highlight = md . options . highlight ;
124205 md . options . highlight = highlightRender ;
125206
126207 return md ;
0 commit comments