|
3 | 3 | * Licensed under the MIT License. See License.txt in the project root for license information. |
4 | 4 | *--------------------------------------------------------------------------------------------*/ |
5 | 5 |
|
6 | | -import * as nls from 'vs/nls'; |
7 | 6 | import { isNonEmptyArray } from 'vs/base/common/arrays'; |
8 | 7 | import { Emitter, Event } from 'vs/base/common/event'; |
9 | 8 | import { MarkdownString } from 'vs/base/common/htmlContent'; |
| 9 | +import { escape } from 'vs/base/common/strings'; |
10 | 10 | import { Disposable, IDisposable, dispose } from 'vs/base/common/lifecycle'; |
11 | 11 | import * as network from 'vs/base/common/network'; |
12 | 12 | import { basename } from 'vs/base/common/paths'; |
@@ -192,36 +192,47 @@ class ModelMarkerHandler { |
192 | 192 | let { message, source, relatedInformation, code } = marker; |
193 | 193 |
|
194 | 194 | if (typeof message === 'string') { |
195 | | - message = message.trim(); |
196 | 195 |
|
| 196 | + hoverMessage = new MarkdownString(); |
| 197 | + // Disable markdown renderer sanitize to allow html |
| 198 | + // Hence, escape all input strings |
| 199 | + hoverMessage.sanitize = false; |
197 | 200 | if (source) { |
198 | | - if (/\n/g.test(message)) { |
199 | | - if (code) { |
200 | | - message = nls.localize('diagAndSourceAndCodeMultiline', "[{0}]\n{1} [{2}]", source, message, code); |
201 | | - } else { |
202 | | - message = nls.localize('diagAndSourceMultiline', "[{0}]\n{1}", source, message); |
203 | | - } |
204 | | - } else { |
205 | | - if (code) { |
206 | | - message = nls.localize('diagAndSourceAndCode', "[{0}] {1} [{2}]", source, message, code); |
207 | | - } else { |
208 | | - message = nls.localize('diagAndSource', "[{0}] {1}", source, message); |
209 | | - } |
| 201 | + hoverMessage.appendMarkdown(`<span style='opacity: 0.6'>[${escape(source)}]</span>`); |
| 202 | + hoverMessage.appendText(' '); |
| 203 | + } |
| 204 | + |
| 205 | + message = message.trim(); |
| 206 | + const lines = message.split(/\r\n|\r|\n/g); |
| 207 | + if (lines.length > 1) { |
| 208 | + if (source) { |
| 209 | + hoverMessage.appendMarkdown(`</br>`); |
210 | 210 | } |
| 211 | + for (const line of lines) { |
| 212 | + hoverMessage.appendText(line); |
| 213 | + hoverMessage.appendMarkdown(`</br>`); |
| 214 | + } |
| 215 | + } else { |
| 216 | + hoverMessage.appendText(message); |
211 | 217 | } |
212 | 218 |
|
213 | | - hoverMessage = new MarkdownString().appendCodeblock('_', message); |
| 219 | + if (code) { |
| 220 | + if (lines.length === 1) { |
| 221 | + hoverMessage.appendText(' '); |
| 222 | + } |
| 223 | + hoverMessage.appendMarkdown(`<span style='opacity: 0.6'>[${escape(code)}]</span>`); |
| 224 | + } |
214 | 225 |
|
215 | 226 | if (isNonEmptyArray(relatedInformation)) { |
216 | | - hoverMessage.appendMarkdown('\n'); |
| 227 | + hoverMessage.appendMarkdown(`\n`); |
217 | 228 | for (const { message, resource, startLineNumber, startColumn } of relatedInformation) { |
218 | 229 | hoverMessage.appendMarkdown( |
219 | | - `* [${basename(resource.path)}(${startLineNumber}, ${startColumn})](${resource.toString(false)}#${startLineNumber},${startColumn}): ` |
| 230 | + escape(`* [${basename(resource.path)}(${startLineNumber}, ${startColumn})](${resource.toString(false)}#${startLineNumber},${startColumn}): `) |
220 | 231 | ); |
221 | | - hoverMessage.appendText(`${message}`); |
222 | | - hoverMessage.appendMarkdown('\n'); |
| 232 | + hoverMessage.appendText(`${escape(message)}`); |
| 233 | + hoverMessage.appendMarkdown(`\n`); |
223 | 234 | } |
224 | | - hoverMessage.appendMarkdown('\n'); |
| 235 | + hoverMessage.appendMarkdown(`\n`); |
225 | 236 | } |
226 | 237 | } |
227 | 238 |
|
|
0 commit comments