@@ -2,12 +2,106 @@ import Alpine from 'alpinejs'
22import collapse from '@alpinejs/collapse'
33import persist from '@alpinejs/persist'
44import focus from '@alpinejs/focus'
5-
5+ import { marked } from 'marked'
6+ import hljs from 'highlight.js/lib/core'
7+ // Import languages relevant to Docker docs
8+ import bash from 'highlight.js/lib/languages/bash'
9+ import dockerfile from 'highlight.js/lib/languages/dockerfile'
10+ import yaml from 'highlight.js/lib/languages/yaml'
11+ import json from 'highlight.js/lib/languages/json'
12+ import javascript from 'highlight.js/lib/languages/javascript'
13+ import python from 'highlight.js/lib/languages/python'
14+ import go from 'highlight.js/lib/languages/go'
15+
616window . Alpine = Alpine
717
818Alpine . plugin ( collapse )
919Alpine . plugin ( persist )
1020Alpine . plugin ( focus )
21+
22+ // Register highlight.js languages
23+ hljs . registerLanguage ( 'bash' , bash )
24+ hljs . registerLanguage ( 'sh' , bash )
25+ hljs . registerLanguage ( 'shell' , bash )
26+ hljs . registerLanguage ( 'console' , bash )
27+ hljs . registerLanguage ( 'dockerfile' , dockerfile )
28+ hljs . registerLanguage ( 'yaml' , yaml )
29+ hljs . registerLanguage ( 'yml' , yaml )
30+ hljs . registerLanguage ( 'json' , json )
31+ hljs . registerLanguage ( 'javascript' , javascript )
32+ hljs . registerLanguage ( 'js' , javascript )
33+ hljs . registerLanguage ( 'python' , python )
34+ hljs . registerLanguage ( 'py' , python )
35+ hljs . registerLanguage ( 'go' , go )
36+ hljs . registerLanguage ( 'golang' , go )
37+
38+ // Configure marked to escape HTML in text tokens only (not code blocks)
39+ marked . use ( {
40+ walkTokens ( token ) {
41+ // Escape HTML in text and HTML tokens, preserve code blocks
42+ if ( token . type === 'text' || token . type === 'html' ) {
43+ const text = token . text || token . raw
44+ const escaped = text
45+ . replace ( / & / g, '&' )
46+ . replace ( / < / g, '<' )
47+ . replace ( / > / g, '>' )
48+ if ( token . text ) token . text = escaped
49+ if ( token . raw ) token . raw = escaped
50+ }
51+ }
52+ } )
53+
54+ // Add $markdown magic for rendering markdown with syntax highlighting
55+ Alpine . magic ( 'markdown' , ( ) => {
56+ return ( content ) => {
57+ if ( ! content ) return ''
58+ const html = marked ( content )
59+
60+ // Parse and highlight code blocks
61+ const div = document . createElement ( 'div' )
62+ div . innerHTML = html
63+
64+ // Handle code blocks (pre > code)
65+ div . querySelectorAll ( 'pre' ) . forEach ( ( pre ) => {
66+ // Add not-prose to prevent Tailwind Typography styling
67+ pre . classList . add ( 'not-prose' )
68+ const code = pre . querySelector ( 'code' )
69+ if ( code ) {
70+ // Preserve the original text with newlines
71+ const codeText = code . textContent
72+
73+ // Clear and set as plain text first to preserve structure
74+ code . textContent = codeText
75+
76+ // Now apply highlight.js which will work with the text nodes
77+ hljs . highlightElement ( code )
78+ }
79+ } )
80+
81+ // Handle inline code elements (not in pre blocks)
82+ div . querySelectorAll ( 'code:not(pre code)' ) . forEach ( ( code ) => {
83+ code . classList . add ( 'not-prose' )
84+ } )
85+
86+ return div . innerHTML
87+ }
88+ } )
89+
90+ // Stores
1191Alpine . store ( "showSidebar" , false )
92+ Alpine . store ( 'gordon' , {
93+ isOpen : false ,
94+ query : '' ,
95+ toggle ( ) {
96+ this . isOpen = ! this . isOpen
97+ } ,
98+ open ( query ) {
99+ this . isOpen = true
100+ if ( query ) this . query = query
101+ } ,
102+ close ( ) {
103+ this . isOpen = false
104+ }
105+ } )
12106
13107Alpine . start ( )
0 commit comments