Skip to content

Commit ce6dda9

Browse files
authored
Merge pull request #30 from alxbl/support-hljs
hljs - Added compatibility for CSS styles.
2 parents 793b58a + df0d1cf commit ce6dda9

File tree

2 files changed

+61
-9
lines changed

2 files changed

+61
-9
lines changed

lib/highlight.js

Lines changed: 28 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -5,23 +5,28 @@ var Entities = require('html-entities').XmlEntities;
55
var entities = new Entities();
66
var alias = require('../highlight_alias.json');
77

8-
hljs.configure({
9-
classPrefix: ''
10-
});
11-
128
function highlightUtil(str, options) {
139
if (typeof str !== 'string') throw new TypeError('str must be a string!');
1410
options = options || {};
1511

12+
var useHljs = options.hasOwnProperty('hljs') ? options.hljs : false;
1613
var gutter = options.hasOwnProperty('gutter') ? options.gutter : true;
1714
var wrap = options.hasOwnProperty('wrap') ? options.wrap : true;
1815
var firstLine = options.hasOwnProperty('firstLine') ? +options.firstLine : 1;
1916
var caption = options.caption;
2017
var mark = options.hasOwnProperty('mark') ? options.mark : [];
2118
var tab = options.tab;
19+
20+
hljs.configure({ classPrefix: useHljs ? 'hljs-' : ''});
21+
2222
var data = highlight(str, options);
2323

24-
if (!wrap) return data.value;
24+
if (useHljs && !gutter) wrap = false;
25+
26+
var before = useHljs ? '<pre><code class="hljs ' + options.lang + '">' : '<pre>';
27+
var after = useHljs ? '</code></pre>' : '</pre>';
28+
29+
if (!wrap) return useHljs ? before + data.value + after : data.value;
2530

2631
var lines = data.value.split('\n');
2732
var numbers = '';
@@ -33,9 +38,7 @@ function highlightUtil(str, options) {
3338
line = lines[i];
3439
if (tab) line = replaceTabs(line, tab);
3540
numbers += '<span class="line">' + (firstLine + i) + '</span><br>';
36-
content += '<span class="line';
37-
content += (mark.indexOf(firstLine + i) !== -1) ? ' marked' : '';
38-
content += '">' + line + '</span><br>';
41+
content += formatLine(line, firstLine + i, mark, options);
3942
}
4043

4144
result += '<figure class="highlight' + (data.language ? ' ' + data.language : '') + '">';
@@ -50,12 +53,26 @@ function highlightUtil(str, options) {
5053
result += '<td class="gutter"><pre>' + numbers + '</pre></td>';
5154
}
5255

53-
result += '<td class="code"><pre>' + content + '</pre></td>';
56+
result += '<td class="code">' + before + content + after + '</td>';
5457
result += '</tr></table></figure>';
5558

5659
return result;
5760
}
5861

62+
function formatLine(line, lineno, marked, options) {
63+
var useHljs = options.hljs || false;
64+
var res = useHljs ? '' : '<span class="line';
65+
if (marked.indexOf(lineno) !== -1) {
66+
// Handle marked lines.
67+
res += useHljs ? '<mark>' + line + '</mark>' : ' marked">' + line + '</span>';
68+
} else {
69+
res += useHljs ? line : '">' + line + '</span>';
70+
}
71+
72+
res += '<br>';
73+
return res;
74+
}
75+
5976
function encodePlainString(str) {
6077
return entities.encode(str);
6178
}
@@ -121,6 +138,8 @@ function highlight(str, options) {
121138
return result;
122139
}
123140

141+
if (options.hljs) return hljs.highlight(lang, str);
142+
124143
return tryHighlight(str, result.language) || result;
125144
}
126145

test/scripts/highlight.js

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -267,4 +267,37 @@ describe('highlight', function() {
267267
result.should.include('class="line">and');
268268
validateHtmlAsync(result, done);
269269
});
270+
271+
it('hljs compatibility - with lines', (done) => {
272+
var str = [
273+
'function (a) {',
274+
' if (a > 3)',
275+
' return true;',
276+
' return false;',
277+
'}'
278+
].join('\n');
279+
var result = highlight(str, {hljs: true, lang: 'javascript' });
280+
result.should.include(gutterStart);
281+
result.should.include(codeStart);
282+
result.should.include('code class="hljs javascript"');
283+
result.should.include('class="hljs-function"');
284+
result.should.include(gutter(1, 5));
285+
validateHtmlAsync(result, done);
286+
});
287+
288+
it('hljs compatibility - no lines', (done) => {
289+
var str = [
290+
'function (a) {',
291+
' if (a > 3)',
292+
' return true;',
293+
' return false;',
294+
'}'
295+
].join('\n');
296+
var result = highlight(str, {hljs: true, gutter: false, lang: 'javascript' });
297+
result.should.not.include(gutterStart);
298+
result.should.not.include(codeStart);
299+
result.should.include('code class="hljs javascript"');
300+
result.should.include('class="hljs-function"');
301+
validateHtmlAsync(result, done);
302+
});
270303
});

0 commit comments

Comments
 (0)