@@ -16,23 +16,92 @@ function pygmentize()
1616 return _pygmentize[]
1717end
1818
19+ const _pygmentize_version = Ref{Union{VersionNumber,Nothing}}()
20+ function pygmentize_version()
21+ isassigned(_pygmentize_version) && return _pygmentize_version[]
22+
23+ pygmentize_cmd = pygmentize()
24+ if isnothing(pygmentize_cmd)
25+ return _pygmentize_version[] = nothing
26+ end
27+
28+ cmd = ` $pygmentize_cmd -V`
29+ @static if Sys. iswindows()
30+ # Avoid encoding issues with pipes on Windows by using cmd.exe to capture stdout for us
31+ cmd = ` cmd.exe /C $cmd `
32+ cmd = addenv(cmd, " PYTHONUTF8" => 1 )
33+ end
34+ version_str = readchomp(cmd)
35+
36+ pos = findfirst(" Pygments version " , version_str)
37+ if ! isnothing(pos)
38+ version_start = last(pos) + 1
39+ version_end = findnext(' ,' , version_str, version_start) - 1
40+ version = tryparse(VersionNumber, version_str[version_start: version_end])
41+ else
42+ version = nothing
43+ end
44+
45+ if isnothing(version)
46+ @warn " Could not parse Pygments version:\n $version_str "
47+ end
48+
49+ return _pygmentize_version[] = version
50+ end
51+
52+ function pygmentize_support(lexer)
53+ highlighter_ver = pygmentize_version()
54+ if isnothing(highlighter_ver)
55+ @warn " Syntax highlighting of $lexer code relies on Pygments.\n \
56+ Use `pip install pygments` to install the lastest version" maxlog= 1
57+ return false
58+ elseif lexer == " ptx"
59+ if highlighter_ver < v" 2.16"
60+ @warn " Pygments supports PTX highlighting starting from version 2.16\n \
61+ Detected version $highlighter_ver \n \
62+ Please update with `pip install pygments -U`" maxlog= 1
63+ return false
64+ end
65+ return true
66+ elseif lexer == " gcn"
67+ if highlighter_ver < v" 2.8"
68+ @warn " Pygments supports GCN highlighting starting from version 2.8\n \
69+ Detected version $highlighter_ver \n \
70+ Please update with `pip install pygments -U`" maxlog= 1
71+ return false
72+ end
73+ return true
74+ else
75+ return false
76+ end
77+ end
78+
1979function highlight(io:: IO , code, lexer)
20- highlighter = pygmentize()
2180 have_color = get(io, :color, false )
2281 if ! have_color
2382 print(io, code)
2483 elseif lexer == " llvm"
2584 InteractiveUtils. print_llvm(io, code)
26- elseif highlighter != = nothing
27- custom_lexer = joinpath(dirname(@__DIR__), " res" , " pygments" , " $lexer .py" )
28- if isfile(custom_lexer)
29- lexer = ` $custom_lexer -x`
85+ elseif pygmentize_support(lexer)
86+ lexer = lexer == " gcn" ? " amdgpu" : lexer
87+ pygments_args = String[pygmentize(), " -f" , " terminal" , " -P" , " bg=dark" , " -l" , lexer]
88+ @static if Sys. iswindows()
89+ # Avoid encoding issues with pipes on Windows by using a temporary file
90+ mktemp() do tmp_path, tmp_io
91+ println(tmp_io, code)
92+ close(tmp_io)
93+ push!(pygments_args, " -o" , tmp_path, tmp_path)
94+ cmd = Cmd(pygments_args)
95+ wait(open(cmd)) # stdout and stderr go to devnull
96+ print(io, read(tmp_path, String))
97+ end
98+ else
99+ cmd = Cmd(pygments_args)
100+ pipe = open(cmd, " r+" )
101+ print(pipe, code)
102+ close(pipe. in)
103+ print(io, read(pipe, String))
30104 end
31-
32- pipe = open(` $highlighter -f terminal -P bg=dark -l $lexer ` , " r+" )
33- print(pipe, code)
34- close(pipe. in)
35- print(io, read(pipe, String))
36105 else
37106 print(io, code)
38107 end
0 commit comments