Skip to content

Commit 9ec55b0

Browse files
committed
SourceRange.prettyRange: escape sourceName
1 parent fa3e4e5 commit 9ec55b0

File tree

1 file changed

+13
-2
lines changed

1 file changed

+13
-2
lines changed

commonmark/src/Commonmark/Types.hs

+13-2
Original file line numberDiff line numberDiff line change
@@ -126,19 +126,30 @@ prettyRange (SourceRange xs) = go "" xs
126126
go _ [] = ""
127127
go curname ((p1,p2):rest)
128128
= (if sourceName p1 /= curname
129-
then sourceName p1 ++ "@"
129+
then escapeSourceName (sourceName p1) ++ "@"
130130
else "") ++
131131
show (sourceLine p1) ++ ":" ++
132132
show (sourceColumn p1) ++ "-" ++
133133
(if sourceName p2 /= sourceName p1
134-
then sourceName p2 ++ "@"
134+
then escapeSourceName (sourceName p2) ++ "@"
135135
else "") ++
136136
show (sourceLine p2) ++
137137
":" ++ show (sourceColumn p2) ++
138138
if null rest
139139
then ""
140140
else ";" ++ go (sourceName p2) rest
141141

142+
-- if the source name contains special characters it can lead to ambiguity when
143+
-- a filename exactly matches a fragment of syntax of the range
144+
escapeSourceName :: String -> String
145+
escapeSourceName = concatMap escapeChar
146+
where
147+
escapeChar '-' = "%-"
148+
escapeChar '%' = "%%"
149+
escapeChar ':' = "%:"
150+
escapeChar ';' = "%;"
151+
escapeChar x = [x]
152+
142153
type Attribute = (Text, Text)
143154

144155
type Attributes = [Attribute]

0 commit comments

Comments
 (0)