From abebca2f89e4d4d6bc319e4c663fd660522fa428 Mon Sep 17 00:00:00 2001 From: Baoshuo Ren Date: Sat, 16 Jul 2022 13:55:29 +0800 Subject: [PATCH] feat(highlight): add `languageAttr` option (#278) --- README.md | 1 + lib/highlight.js | 7 ++++--- test/highlight.spec.js | 30 ++++++++++++++++++++++++++++++ 3 files changed, 35 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index a4e55a60..d041c298 100644 --- a/README.md +++ b/README.md @@ -290,6 +290,7 @@ Option | Description | Default `tab`| Replace tabs | `autoDetect` | Detect language automatically (warning: slow)
_Sublanguage highlight requires `autoDetect` to be enabled and `lang` to be unset_ | false `mark` | Line highlight specific line(s) | +`languageAttr` | Output code language into `data-language` attr | false ### htmlTag(tag, attrs, text, escape) diff --git a/lib/highlight.js b/lib/highlight.js index b267fbaa..eee871b4 100644 --- a/lib/highlight.js +++ b/lib/highlight.js @@ -14,6 +14,7 @@ function highlightUtil(str, options = {}) { firstLine = 1, caption, mark = [], + languageAttr = false, tab } = options; let { wrap = true } = options; @@ -26,7 +27,7 @@ function highlightUtil(str, options = {}) { if (gutter && !wrap) wrap = true; // arbitrate conflict ("gutter:true" takes priority over "wrap:false") - const before = useHljs ? `
` : '
';
+  const before = useHljs ? `
` : '
';
   const after = useHljs ? '
' : '
'; @@ -50,10 +51,10 @@ function highlightUtil(str, options = {}) { if (!wrap) { // if original content has one trailing newline, replace it only once, else remove all trailing newlines content = /\r?\n$/.test(data.value) ? content.replace(/\n$/, '') : content.trimEnd(); - return `
${codeCaption}${content}
`; + return `
${codeCaption}${content}
`; } - let result = `
`; + let result = `
`; result += codeCaption; diff --git a/test/highlight.spec.js b/test/highlight.spec.js index 6e215c0e..0ee4e8df 100644 --- a/test/highlight.spec.js +++ b/test/highlight.spec.js @@ -428,4 +428,34 @@ describe('highlight', () => { result.should.include('class="hljs-keyword"'); validateHtmlAsync(result, done); }); + + it('languageAttr: true', done => { + const str = [ + 'var string = `', + ' Multi', + ' line', + ' string', + '`' + ].join('\n'); + + const result = highlight(str, {languageAttr: true, lang: 'js'}); + result.should.eql([ + '
', + gutter(1, 5), + code('var string = `\n Multi\n line\n string\n`', null), + end + ].join('')); + validateHtmlAsync(result, done); + }); + + it('languageAttr: true (wrap: false)', done => { + const result = highlight(testString, {gutter: false, wrap: false, languageAttr: true}); + console.log(result); + result.should.eql([ + '
',
+      entities.encode(testString),
+      '
' + ].join('')); + validateHtmlAsync(result, done); + }); });