1 |
|
2 | const xmlEscape = s => (`${s}`).replace(/[<>&"'\x00-\x1F\x7F\u0080-\uFFFF]/g, c => {
|
3 | switch (c) {
|
4 | case '<':
|
5 | return '<';
|
6 | case '>':
|
7 | return '>';
|
8 | case '&':
|
9 | return '&';
|
10 | case '"':
|
11 | return '"';
|
12 | case '\'':
|
13 | return ''';
|
14 | default:
|
15 | return `&#${c.charCodeAt(0)};`;
|
16 | }
|
17 | });
|
18 |
|
19 | module.exports = results => {
|
20 | const files = results.map(file => {
|
21 | const warnings = file.warnings.map(({column, line, text}) => {
|
22 | const css = file._postcssResult && file._postcssResult.css;
|
23 | const lines = css && css.split('\n') || [];
|
24 | const evidence = lines[line - 1];
|
25 |
|
26 | return [
|
27 | `<issue line="${line}"`,
|
28 | ` char="${column}"`,
|
29 | ` evidence="${evidence ? xmlEscape(evidence) : ''}"`,
|
30 | ` reason="${xmlEscape(text)}" />`
|
31 | ].join('');
|
32 | });
|
33 |
|
34 | return `<file name="${file.source}">${warnings.join('')}</file>`;
|
35 | });
|
36 |
|
37 | return `<?xml version="1.0" encoding="utf-8"?><jslint>${files.join('')}</jslint>`;
|
38 | };
|