base files from eleventy-plugin-syntaxhighlight-4.2.0 and chromahighlight npm package as dependency
This commit is contained in:
		
						commit
						c40be6836a
					
				| 
						 | 
				
			
			@ -0,0 +1,9 @@
 | 
			
		|||
root = true
 | 
			
		||||
 | 
			
		||||
[*]
 | 
			
		||||
indent_style = space
 | 
			
		||||
indent_size = 2
 | 
			
		||||
end_of_line = lf
 | 
			
		||||
insert_final_newline = true
 | 
			
		||||
trim_trailing_whitespace = true
 | 
			
		||||
charset = utf-8
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,59 @@
 | 
			
		|||
const pkg = require("./package.json");
 | 
			
		||||
const Prism = require("prismjs");
 | 
			
		||||
const hasTemplateFormat = require("./src/hasTemplateFormat");
 | 
			
		||||
const HighlightPairedShortcode = require("./src/HighlightPairedShortcode");
 | 
			
		||||
const LiquidHighlightTag = require("./src/LiquidHighlightTag");
 | 
			
		||||
const CharacterWrap = require("./src/CharacterWrap");
 | 
			
		||||
const markdownPrismJs = require("./src/markdownSyntaxHighlightOptions");
 | 
			
		||||
 | 
			
		||||
module.exports = {
 | 
			
		||||
  initArguments: { Prism },
 | 
			
		||||
  configFunction: function(eleventyConfig, options = {}) {
 | 
			
		||||
    try {
 | 
			
		||||
      eleventyConfig.versionCheck(pkg["11ty"].compatibility);
 | 
			
		||||
    } catch(e) {
 | 
			
		||||
      console.log( `WARN: Eleventy Plugin (${pkg.name}) Compatibility: ${e.message}` );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    options = Object.assign({
 | 
			
		||||
      alwaysWrapLineHighlights: false,
 | 
			
		||||
      // eligible to change the default to \n in a new major version.
 | 
			
		||||
      lineSeparator: "<br>",
 | 
			
		||||
      preAttributes: {},
 | 
			
		||||
      codeAttributes: {}
 | 
			
		||||
    }, options);
 | 
			
		||||
 | 
			
		||||
    // TODO hbs?
 | 
			
		||||
    if( hasTemplateFormat(options.templateFormats, "liquid") ) {
 | 
			
		||||
      eleventyConfig.addLiquidTag("highlight", (liquidEngine) => {
 | 
			
		||||
        // {% highlight js 0 2 %}
 | 
			
		||||
        let highlight = new LiquidHighlightTag(liquidEngine);
 | 
			
		||||
        return highlight.getObject(options);
 | 
			
		||||
      });
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if( hasTemplateFormat(options.templateFormats, "njk") ) {
 | 
			
		||||
      eleventyConfig.addPairedNunjucksShortcode("highlight", (content, args) => {
 | 
			
		||||
        // {% highlight "js 0 2-3" %}
 | 
			
		||||
        let [language, ...highlightNumbers] = args.split(" ");
 | 
			
		||||
        return HighlightPairedShortcode(content, language, highlightNumbers.join(" "), options);
 | 
			
		||||
      });
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if( hasTemplateFormat(options.templateFormats, "md") ) {
 | 
			
		||||
      // ```js/0,2-3
 | 
			
		||||
      eleventyConfig.addMarkdownHighlighter(markdownPrismJs(options));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if( hasTemplateFormat(options.templateFormats, "11ty.js") ) {
 | 
			
		||||
      eleventyConfig.addJavaScriptFunction("highlight", (language, content, highlight1, highlight2) => {
 | 
			
		||||
        let highlightLines = [highlight1, highlight2].filter(entry => entry).join(" ");
 | 
			
		||||
        let result = HighlightPairedShortcode(content, language, highlightLines, options);
 | 
			
		||||
        return result;
 | 
			
		||||
      });
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
module.exports.pairedShortcode = HighlightPairedShortcode;
 | 
			
		||||
module.exports.CharacterWrap = CharacterWrap;
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1 @@
 | 
			
		|||
README.md
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,17 @@
 | 
			
		|||
module.exports = {
 | 
			
		||||
  env: {
 | 
			
		||||
    es6: true,
 | 
			
		||||
    node: true
 | 
			
		||||
  },
 | 
			
		||||
  extends: "eslint:recommended",
 | 
			
		||||
  parserOptions: {
 | 
			
		||||
    sourceType: "module",
 | 
			
		||||
    ecmaVersion: 2017
 | 
			
		||||
  },
 | 
			
		||||
  rules: {
 | 
			
		||||
    indent: ["error", 2],
 | 
			
		||||
    "linebreak-style": ["error", "unix"],
 | 
			
		||||
    quotes: ["error", "double"],
 | 
			
		||||
    semi: ["error", "always"]
 | 
			
		||||
  }
 | 
			
		||||
};
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,2 @@
 | 
			
		|||
# These are supported funding model platforms
 | 
			
		||||
open_collective: 11ty
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,23 @@
 | 
			
		|||
on:
 | 
			
		||||
  push:
 | 
			
		||||
    branches-ignore:
 | 
			
		||||
      - "gh-pages"
 | 
			
		||||
jobs:
 | 
			
		||||
  build:
 | 
			
		||||
    runs-on: ${{ matrix.os }}
 | 
			
		||||
    strategy:
 | 
			
		||||
      matrix:
 | 
			
		||||
        os: ["ubuntu-latest", "macos-latest", "windows-latest"]
 | 
			
		||||
        node: ["14", "16", "18"]
 | 
			
		||||
    name: Node.js ${{ matrix.node }} on ${{ matrix.os }}
 | 
			
		||||
    steps:
 | 
			
		||||
      - uses: actions/checkout@v3
 | 
			
		||||
      - name: Setup node
 | 
			
		||||
        uses: actions/setup-node@v3
 | 
			
		||||
        with:
 | 
			
		||||
          node-version: ${{ matrix.node }}
 | 
			
		||||
          # cache: npm
 | 
			
		||||
      - run: npm install
 | 
			
		||||
      - run: npm test
 | 
			
		||||
env:
 | 
			
		||||
  YARN_GPG: no
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,4 @@
 | 
			
		|||
node_modules/
 | 
			
		||||
_site/
 | 
			
		||||
package-lock.json
 | 
			
		||||
yarn.lock
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,21 @@
 | 
			
		|||
MIT License
 | 
			
		||||
 | 
			
		||||
Copyright (c) 2018 Zach Leatherman @zachleat
 | 
			
		||||
 | 
			
		||||
Permission is hereby granted, free of charge, to any person obtaining a copy
 | 
			
		||||
of this software and associated documentation files (the "Software"), to deal
 | 
			
		||||
in the Software without restriction, including without limitation the rights
 | 
			
		||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 | 
			
		||||
copies of the Software, and to permit persons to whom the Software is
 | 
			
		||||
furnished to do so, subject to the following conditions:
 | 
			
		||||
 | 
			
		||||
The above copyright notice and this permission notice shall be included in all
 | 
			
		||||
copies or substantial portions of the Software.
 | 
			
		||||
 | 
			
		||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 | 
			
		||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 | 
			
		||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 | 
			
		||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 | 
			
		||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 | 
			
		||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 | 
			
		||||
SOFTWARE.
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,8 @@
 | 
			
		|||
<p align="center"><img src="https://www.11ty.dev/img/logo-github.svg" width="200" height="200" alt="eleventy Logo"></p>
 | 
			
		||||
 | 
			
		||||
# eleventy-plugin-syntaxhighlight 🕚⚡️🎈🐀
 | 
			
		||||
 | 
			
		||||
A pack of [Eleventy](https://github.com/11ty/eleventy) plugins for syntax highlighting. No browser/client JavaScript here, these highlight transformations are all done at build-time.
 | 
			
		||||
 | 
			
		||||
## Read the [Full Documentation on 11ty.dev](https://www.11ty.dev/docs/plugins/syntaxhighlight/)
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,10 @@
 | 
			
		|||
const syntaxHighlight = require("../.eleventy.js");
 | 
			
		||||
 | 
			
		||||
module.exports = function(eleventyConfig) {
 | 
			
		||||
  eleventyConfig.addPlugin(syntaxHighlight, {
 | 
			
		||||
    // alwaysWrapLineHighlights: true
 | 
			
		||||
    preAttributes: { tabindex: 0 }
 | 
			
		||||
  });
 | 
			
		||||
 | 
			
		||||
  eleventyConfig.setTemplateFormats("njk,liquid,md,css");
 | 
			
		||||
};
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,148 @@
 | 
			
		|||
pre {
 | 
			
		||||
  display: block;
 | 
			
		||||
  padding: .75rem 1rem;
 | 
			
		||||
  line-height: 1.5;
 | 
			
		||||
 | 
			
		||||
  overflow-x: auto;
 | 
			
		||||
  background-color: #eee;
 | 
			
		||||
  font-size: 0.875em; /* 14px /16 */
 | 
			
		||||
  -moz-tab-size: 2;
 | 
			
		||||
  -o-tab-size: 2;
 | 
			
		||||
  tab-size: 2;
 | 
			
		||||
 | 
			
		||||
  text-align: left;
 | 
			
		||||
  white-space: pre;
 | 
			
		||||
  word-spacing: normal;
 | 
			
		||||
  word-break: normal;
 | 
			
		||||
  word-wrap: normal;
 | 
			
		||||
 | 
			
		||||
  background-color: #272822;
 | 
			
		||||
  color: #fff;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * a11y-dark theme for JavaScript, CSS, and HTML
 | 
			
		||||
 * Based on the okaidia theme: https://github.com/PrismJS/prism/blob/gh-pages/themes/prism-okaidia.css
 | 
			
		||||
 * @author ericwbailey
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/* Inline code */
 | 
			
		||||
:not(pre) > code[class*="language-"] {
 | 
			
		||||
  padding: 0.1em;
 | 
			
		||||
  border-radius: 0.3em;
 | 
			
		||||
  white-space: normal;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.token.comment,
 | 
			
		||||
.token.prolog,
 | 
			
		||||
.token.doctype,
 | 
			
		||||
.token.cdata {
 | 
			
		||||
  color: #d4d0ab;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.token.punctuation {
 | 
			
		||||
  color: #fefefe;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.token.property,
 | 
			
		||||
.token.tag,
 | 
			
		||||
.token.constant,
 | 
			
		||||
.token.symbol,
 | 
			
		||||
.token.deleted {
 | 
			
		||||
  color: #ffa07a;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.token.boolean,
 | 
			
		||||
.token.number {
 | 
			
		||||
  color: #00e0e0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.token.selector,
 | 
			
		||||
.token.attr-name,
 | 
			
		||||
.token.string,
 | 
			
		||||
.token.char,
 | 
			
		||||
.token.builtin,
 | 
			
		||||
.token.inserted {
 | 
			
		||||
  color: #abe338;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.token.operator,
 | 
			
		||||
.token.entity,
 | 
			
		||||
.token.url,
 | 
			
		||||
.language-css .token.string,
 | 
			
		||||
.style .token.string,
 | 
			
		||||
.token.variable {
 | 
			
		||||
  color: #00e0e0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.token.atrule,
 | 
			
		||||
.token.attr-value,
 | 
			
		||||
.token.function {
 | 
			
		||||
  color: #ffd700;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.token.keyword {
 | 
			
		||||
  color: #00e0e0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.token.regex,
 | 
			
		||||
.token.important {
 | 
			
		||||
  color: #ffd700;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.token.important,
 | 
			
		||||
.token.bold {
 | 
			
		||||
  font-weight: bold;
 | 
			
		||||
}
 | 
			
		||||
.token.italic {
 | 
			
		||||
  font-style: italic;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.token.entity {
 | 
			
		||||
  cursor: help;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@media screen and (-ms-high-contrast: active) {
 | 
			
		||||
  code[class*="language-"],
 | 
			
		||||
  pre[class*="language-"] {
 | 
			
		||||
    color: windowText;
 | 
			
		||||
    background: window;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  :not(pre) > code[class*="language-"],
 | 
			
		||||
  pre[class*="language-"] {
 | 
			
		||||
    background: window;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  .token.important {
 | 
			
		||||
    background: highlight;
 | 
			
		||||
    color: window;
 | 
			
		||||
    font-weight: normal;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  .token.atrule,
 | 
			
		||||
  .token.attr-value,
 | 
			
		||||
  .token.function,
 | 
			
		||||
  .token.keyword,
 | 
			
		||||
  .token.operator,
 | 
			
		||||
  .token.selector {
 | 
			
		||||
    font-weight: bold;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  .token.attr-value,
 | 
			
		||||
  .token.comment,
 | 
			
		||||
  .token.doctype,
 | 
			
		||||
  .token.function,
 | 
			
		||||
  .token.keyword,
 | 
			
		||||
  .token.operator,
 | 
			
		||||
  .token.property,
 | 
			
		||||
  .token.string {
 | 
			
		||||
    color: highlight;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  .token.attr-value,
 | 
			
		||||
  .token.url {
 | 
			
		||||
    font-weight: normal;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,33 @@
 | 
			
		|||
<!doctype html>
 | 
			
		||||
<html lang="en">
 | 
			
		||||
  <head>
 | 
			
		||||
    <meta charset="utf-8">
 | 
			
		||||
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
 | 
			
		||||
    <title></title>
 | 
			
		||||
    <link rel="stylesheet" href="../test.css">
 | 
			
		||||
    <link rel="stylesheet" href="../prism-theme.css">
 | 
			
		||||
  </head>
 | 
			
		||||
  <body>
 | 
			
		||||
{% highlight js %}
 | 
			
		||||
function myFunction() {
 | 
			
		||||
  return true;
 | 
			
		||||
}
 | 
			
		||||
{% endhighlight %}
 | 
			
		||||
 | 
			
		||||
{% highlight js %}
 | 
			
		||||
let multilineString = `
 | 
			
		||||
  this is the first line
 | 
			
		||||
  this is the middle line
 | 
			
		||||
  this is the last line
 | 
			
		||||
`;
 | 
			
		||||
{% endhighlight %}
 | 
			
		||||
 | 
			
		||||
{% highlight js 1,3 %}
 | 
			
		||||
let multilineString = `
 | 
			
		||||
  this is the first line
 | 
			
		||||
  this is the middle line
 | 
			
		||||
  this is the last line
 | 
			
		||||
`;
 | 
			
		||||
{% endhighlight %}
 | 
			
		||||
  </body>
 | 
			
		||||
</html>
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,62 @@
 | 
			
		|||
<html lang="en">
 | 
			
		||||
  <head>
 | 
			
		||||
    <meta charset="utf-8">
 | 
			
		||||
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
 | 
			
		||||
    <title></title>
 | 
			
		||||
    <link rel="stylesheet" href="../test.css">
 | 
			
		||||
    <link rel="stylesheet" href="../prism-theme.css">
 | 
			
		||||
  </head>
 | 
			
		||||
  <body>
 | 
			
		||||
 | 
			
		||||
```ts
 | 
			
		||||
function myFunction() {
 | 
			
		||||
  return true;
 | 
			
		||||
}
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
```typescript
 | 
			
		||||
function myFunction() {
 | 
			
		||||
  return true;
 | 
			
		||||
}
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
```js
 | 
			
		||||
function myFunction() {
 | 
			
		||||
  return true;
 | 
			
		||||
}
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
```js
 | 
			
		||||
let multilineString = `
 | 
			
		||||
  this is the first line
 | 
			
		||||
  this is the middle line
 | 
			
		||||
  this is the last line
 | 
			
		||||
`;
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
## Dash line
 | 
			
		||||
 | 
			
		||||
```js/-
 | 
			
		||||
let multilineString = `
 | 
			
		||||
  this is the first line
 | 
			
		||||
  this is the middle line
 | 
			
		||||
  this is the last line
 | 
			
		||||
`;
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
```js/1,3
 | 
			
		||||
let multilineString = `
 | 
			
		||||
  this is the first line
 | 
			
		||||
  this is the middle line
 | 
			
		||||
  this is the last line
 | 
			
		||||
`;
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
## Scrollbar
 | 
			
		||||
 | 
			
		||||
```js
 | 
			
		||||
import { aReallyLongFunctionNameThatCouldBeLongerButThisShouldBeLongEnoughByNowHopefully as anEvenLongerFunctionNameWithMoreCharactersThanCouldBeImaginedByAnyOnePersonInThisEntireWorldOfPeopleThatOneMightKnowAtLeastThatIsWhatIsTheorizedByThisLongName } from 'wow-this-is-so-long-you-might-need-a-scrollbar-to-see-it.long-ol-file-extension-that-should-not-be-this-long-on-a-real-site-but-this-is-to-demonstrate-the-accessibility-of-tabindex-and-scrollbars.js';
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
  </body>
 | 
			
		||||
</html>
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,74 @@
 | 
			
		|||
<!doctype html>
 | 
			
		||||
<html lang="en">
 | 
			
		||||
  <head>
 | 
			
		||||
    <meta charset="utf-8">
 | 
			
		||||
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
 | 
			
		||||
    <title></title>
 | 
			
		||||
    <link rel="stylesheet" href="../test.css">
 | 
			
		||||
    <link rel="stylesheet" href="../prism-theme.css">
 | 
			
		||||
  </head>
 | 
			
		||||
  <body>
 | 
			
		||||
 | 
			
		||||
{% highlight "js" %}
 | 
			
		||||
function myFunction() {
 | 
			
		||||
  return true;
 | 
			
		||||
}
 | 
			
		||||
{% endhighlight %}
 | 
			
		||||
 | 
			
		||||
{% highlight "js" %}
 | 
			
		||||
let multilineString = `
 | 
			
		||||
  this is the first line
 | 
			
		||||
  this is the middle line
 | 
			
		||||
  this is the last line
 | 
			
		||||
`;
 | 
			
		||||
{% endhighlight %}
 | 
			
		||||
 | 
			
		||||
{% highlight "js 1,3" %}
 | 
			
		||||
let multilineString = `
 | 
			
		||||
  this is the first line
 | 
			
		||||
  this is the middle line
 | 
			
		||||
  this is the last line
 | 
			
		||||
`;
 | 
			
		||||
{% endhighlight %}
 | 
			
		||||
 | 
			
		||||
{% highlight "js 1,3" %}
 | 
			
		||||
alert("test");
 | 
			
		||||
 | 
			
		||||
let multilineString = buildSchema(`
 | 
			
		||||
  this is the first line
 | 
			
		||||
  this is the middle line
 | 
			
		||||
  this is the last line
 | 
			
		||||
`);
 | 
			
		||||
 | 
			
		||||
alert("test");
 | 
			
		||||
{% endhighlight %}
 | 
			
		||||
 | 
			
		||||
{% highlight "js" %}
 | 
			
		||||
module.exports = function({collections}) {
 | 
			
		||||
  return `<ul>
 | 
			
		||||
${collections.post.map((post) => `<li>${ post.data.title }</li>`).join("\n")}
 | 
			
		||||
</ul>`;
 | 
			
		||||
};
 | 
			
		||||
{% endhighlight %}
 | 
			
		||||
 | 
			
		||||
{% highlight "js 1,3" %}
 | 
			
		||||
module.exports = function({collections}) {
 | 
			
		||||
  return `<ul>
 | 
			
		||||
${collections.post.map((post) => `<li>${ post.data.title }</li>`).join("\n")}
 | 
			
		||||
</ul>`;
 | 
			
		||||
};
 | 
			
		||||
{% endhighlight %}
 | 
			
		||||
 | 
			
		||||
{% highlight "typescript" %}
 | 
			
		||||
function myFunction() {
 | 
			
		||||
  return true;
 | 
			
		||||
}
 | 
			
		||||
{% endhighlight %}
 | 
			
		||||
 | 
			
		||||
{% highlight "ts" %}
 | 
			
		||||
function myFunction() {
 | 
			
		||||
  return true;
 | 
			
		||||
}
 | 
			
		||||
{% endhighlight %}
 | 
			
		||||
  </body>
 | 
			
		||||
</html>
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,15 @@
 | 
			
		|||
.highlight-line {
 | 
			
		||||
  display: inline-block;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* allow highlighting empty lines */
 | 
			
		||||
.highlight-line:empty:before {
 | 
			
		||||
  content: " ";
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.highlight-line:not(:last-child) {
 | 
			
		||||
  min-width: 100%;
 | 
			
		||||
}
 | 
			
		||||
.highlight-line .highlight-line:not(:last-child) {
 | 
			
		||||
  min-width: 0;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,57 @@
 | 
			
		|||
{
 | 
			
		||||
  "name": "@11ty/eleventy-plugin-syntaxhighlight",
 | 
			
		||||
  "version": "4.2.0",
 | 
			
		||||
  "description": "Prism.js based syntax highlighting for Markdown, Liquid, Nunjucks, and 11ty.js templates.",
 | 
			
		||||
  "publishConfig": {
 | 
			
		||||
    "access": "public"
 | 
			
		||||
  },
 | 
			
		||||
  "main": ".eleventy.js",
 | 
			
		||||
  "scripts": {
 | 
			
		||||
    "test": "npx ava",
 | 
			
		||||
    "demo": "npx @11ty/eleventy --input=demo --output=demo/_site --config=demo/eleventy-config.js",
 | 
			
		||||
    "start": "npx @11ty/eleventy --input=demo --output=demo/_site --config=demo/eleventy-config.js --serve"
 | 
			
		||||
  },
 | 
			
		||||
  "repository": {
 | 
			
		||||
    "type": "git",
 | 
			
		||||
    "url": "git+https://github.com/11ty/eleventy-plugin-syntaxhighlight.git"
 | 
			
		||||
  },
 | 
			
		||||
  "funding": {
 | 
			
		||||
    "type": "opencollective",
 | 
			
		||||
    "url": "https://opencollective.com/11ty"
 | 
			
		||||
  },
 | 
			
		||||
  "keywords": [
 | 
			
		||||
    "eleventy",
 | 
			
		||||
    "eleventy-plugin"
 | 
			
		||||
  ],
 | 
			
		||||
  "author": {
 | 
			
		||||
    "name": "Zach Leatherman",
 | 
			
		||||
    "email": "zachleatherman@gmail.com",
 | 
			
		||||
    "url": "https://zachleat.com/"
 | 
			
		||||
  },
 | 
			
		||||
  "license": "MIT",
 | 
			
		||||
  "bugs": {
 | 
			
		||||
    "url": "https://github.com/11ty/eleventy-plugin-syntaxhighlight/issues"
 | 
			
		||||
  },
 | 
			
		||||
  "homepage": "https://www.11ty.dev/docs/plugins/syntaxhighlight/",
 | 
			
		||||
  "11ty": {
 | 
			
		||||
    "compatibility": ">=0.5.4"
 | 
			
		||||
  },
 | 
			
		||||
  "devDependencies": {
 | 
			
		||||
    "@11ty/eleventy": "^1.0.2",
 | 
			
		||||
    "ava": "^5.0.1",
 | 
			
		||||
    "liquidjs": "^9.42.1",
 | 
			
		||||
    "markdown-it": "^13.0.1"
 | 
			
		||||
  },
 | 
			
		||||
  "dependencies": {
 | 
			
		||||
    "chroma-highlight": "^2.4.2",
 | 
			
		||||
    "linkedom": "^0.14.19",
 | 
			
		||||
    "prismjs": "^1.29.0"
 | 
			
		||||
  },
 | 
			
		||||
  "ava": {
 | 
			
		||||
    "environmentVariables": {},
 | 
			
		||||
    "failFast": false,
 | 
			
		||||
    "files": [
 | 
			
		||||
      "./test/*.js"
 | 
			
		||||
    ]
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,151 @@
 | 
			
		|||
const HighlightPairedShortcode = require("./HighlightPairedShortcode");
 | 
			
		||||
const {parseHTML} = require("linkedom");
 | 
			
		||||
 | 
			
		||||
class IndexCounter {
 | 
			
		||||
  constructor() {
 | 
			
		||||
    this.index = 0;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  add() {
 | 
			
		||||
    this.index++;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  valueOf() {
 | 
			
		||||
    return this.index;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
class CharacterWrap {
 | 
			
		||||
  constructor() {
 | 
			
		||||
    this.multipleCursors = false;
 | 
			
		||||
    // array of character indeces
 | 
			
		||||
    this.typingConfig = ["0"];
 | 
			
		||||
 | 
			
		||||
    this.contentTransforms = [];
 | 
			
		||||
 | 
			
		||||
    this.classPrefix = "charwrap";
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  setClassPrefix(prefix) {
 | 
			
		||||
    this.classPrefix = prefix;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  setMultipleCursors(useMultipleCursors) {
 | 
			
		||||
    this.multipleCursors = !!useMultipleCursors;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  setTypingConfigArray(typingConfig) {
 | 
			
		||||
    this.typingConfig = typingConfig;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  addContentTransform(callback) {
 | 
			
		||||
    this.contentTransforms.push(callback);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // 0 => type to show all
 | 
			
		||||
  // 1 => type to show from 1+
 | 
			
		||||
  // 1,2 => type to show from 1 to 2
 | 
			
		||||
  // 2,3 5,6 => type to show from 2 to 3 and from 5 to 6
 | 
			
		||||
  //   in other words, show 1 and 4 and 7+
 | 
			
		||||
  getTypingConfigResults(indexCounter) {
 | 
			
		||||
    let charIndex = indexCounter.valueOf();
 | 
			
		||||
    let lowestIndex = 99999999;
 | 
			
		||||
    let waitToShow = {};
 | 
			
		||||
    let showCursor = false;
 | 
			
		||||
 | 
			
		||||
    for(let cfg of this.typingConfig) {
 | 
			
		||||
      let start, end;
 | 
			
		||||
      cfg = "" + cfg;
 | 
			
		||||
 | 
			
		||||
      if(cfg.indexOf(",") > -1) { // start,length
 | 
			
		||||
        let split = cfg.split(",");
 | 
			
		||||
        start = parseInt(split[0], 10);
 | 
			
		||||
        end = split.length > 1 ? start + parseInt(split[1], 10) : (charIndex+1);
 | 
			
		||||
      } else if(cfg.indexOf("-") > -1) { // start,end
 | 
			
		||||
        let split = cfg.split("-");
 | 
			
		||||
        start = parseInt(split[0], 10);
 | 
			
		||||
        end = split.length > 1 ? parseInt(split[1], 10) : (charIndex+1);
 | 
			
		||||
      } else {
 | 
			
		||||
        start = parseInt(cfg, 10);
 | 
			
		||||
        end = charIndex + 1;
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      for(let j = start+1; j < end; j++) {
 | 
			
		||||
        waitToShow[j] = true;
 | 
			
		||||
      }
 | 
			
		||||
      if(this.multipleCursors && start === charIndex) {
 | 
			
		||||
        showCursor = true;
 | 
			
		||||
      }
 | 
			
		||||
      lowestIndex = Math.min(lowestIndex, start);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if(!this.multipleCursors && lowestIndex === charIndex) {
 | 
			
		||||
      showCursor = true;
 | 
			
		||||
    }
 | 
			
		||||
    return { showTyped: !waitToShow[charIndex], showCursor };
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  modifyNode(node, indexCounter) {
 | 
			
		||||
    let classes = [this.classPrefix];
 | 
			
		||||
    let showTyped = true;
 | 
			
		||||
    let showCursor = false;
 | 
			
		||||
 | 
			
		||||
    indexCounter.add();
 | 
			
		||||
    let results = this.getTypingConfigResults(indexCounter);
 | 
			
		||||
    showTyped = results.showTyped;
 | 
			
		||||
    showCursor = results.showCursor;
 | 
			
		||||
 | 
			
		||||
    if(showTyped) {
 | 
			
		||||
      classes.push(`${this.classPrefix}-typed ${this.classPrefix}-typed-initial`);
 | 
			
		||||
    }
 | 
			
		||||
    if(showCursor) {
 | 
			
		||||
      classes.push(`${this.classPrefix}-cursor ${this.classPrefix}-cursor-initial`);
 | 
			
		||||
    }
 | 
			
		||||
    node.className = classes.join(" ");
 | 
			
		||||
    node.setAttribute("data-index", indexCounter.valueOf());
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  walkTree(doc, root, indexCounter = null) {
 | 
			
		||||
    for(let node of root.childNodes) {
 | 
			
		||||
      if(node.nodeType === 3) {
 | 
			
		||||
        let characters = Array.from(node.textContent); // convert string to character array
 | 
			
		||||
        for(let char of characters) {
 | 
			
		||||
          let newTextEl = doc.createElement("span");
 | 
			
		||||
          this.modifyNode(newTextEl, indexCounter);
 | 
			
		||||
          newTextEl.innerHTML = char;
 | 
			
		||||
          node.parentNode.insertBefore(newTextEl, node);
 | 
			
		||||
        }
 | 
			
		||||
        node.remove();
 | 
			
		||||
      } else if(node.nodeType === 1) {
 | 
			
		||||
        if(node.classList.contains(this.classPrefix)) {
 | 
			
		||||
          continue;
 | 
			
		||||
        }
 | 
			
		||||
        if(node.nodeName === "BR") {
 | 
			
		||||
          this.modifyNode(node, indexCounter);
 | 
			
		||||
        } else {
 | 
			
		||||
          this.walkTree(doc, node, indexCounter);
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  wrapContent(content, codeFormat) {
 | 
			
		||||
    for(let transform of this.contentTransforms) {
 | 
			
		||||
      let result = transform(content);
 | 
			
		||||
      if(result === false) {
 | 
			
		||||
        return content;
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    let highlightedContent = HighlightPairedShortcode(content, codeFormat, "", {
 | 
			
		||||
      trim: false
 | 
			
		||||
    });
 | 
			
		||||
    let {document} = parseHTML(`<html><body>${highlightedContent}</body></html>`);
 | 
			
		||||
    let counter = new IndexCounter();
 | 
			
		||||
    let bodyEl = document.getElementsByTagName("body")[0];
 | 
			
		||||
    this.walkTree(document, bodyEl, counter);
 | 
			
		||||
    return bodyEl.innerHTML;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
module.exports = CharacterWrap;
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,33 @@
 | 
			
		|||
class HighlightLines {
 | 
			
		||||
  constructor(rangeStr) {
 | 
			
		||||
    this.highlights = this.convertRangeToHash(rangeStr);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  convertRangeToHash(rangeStr) {
 | 
			
		||||
    let hash = {};
 | 
			
		||||
    if( !rangeStr ) {
 | 
			
		||||
      return hash;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    let ranges = rangeStr.split(",").map(function(range) {
 | 
			
		||||
      return range.trim();
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    for(let range of ranges) {
 | 
			
		||||
      let startFinish = range.split('-');
 | 
			
		||||
      let start = parseInt(startFinish[0], 10);
 | 
			
		||||
      let end = parseInt(startFinish[1] || start, 10);
 | 
			
		||||
 | 
			
		||||
      for( let j = start, k = end; j<=k; j++ ) {
 | 
			
		||||
        hash[j] = true;
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
    return hash;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  isHighlighted(lineNumber) {
 | 
			
		||||
    return !!this.highlights[lineNumber];
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
module.exports = HighlightLines;
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,68 @@
 | 
			
		|||
const HighlightLines = require("./HighlightLines");
 | 
			
		||||
 | 
			
		||||
class HighlightLinesGroup {
 | 
			
		||||
  constructor(str, delimiter) {
 | 
			
		||||
    this.init(str, delimiter);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  init(str = "", delimiter = " ") {
 | 
			
		||||
    this.str = str;
 | 
			
		||||
    this.delimiter = delimiter;
 | 
			
		||||
 | 
			
		||||
    let split = str.split(this.delimiter);
 | 
			
		||||
    this.highlights = new HighlightLines(split.length === 1 ? split[0] : "");
 | 
			
		||||
    this.highlightsAdd = new HighlightLines(split.length === 2 ? split[0] : "");
 | 
			
		||||
    this.highlightsRemove = new HighlightLines(split.length === 2 ? split[1] : "");
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  isHighlighted(lineNumber) {
 | 
			
		||||
    return this.highlights.isHighlighted(lineNumber);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  isHighlightedAdd(lineNumber) {
 | 
			
		||||
    return this.highlightsAdd.isHighlighted(lineNumber);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  isHighlightedRemove(lineNumber) {
 | 
			
		||||
    return this.highlightsRemove.isHighlighted(lineNumber);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  hasTagMismatch(line) {
 | 
			
		||||
    let startCount = line.split("<span").length;
 | 
			
		||||
    let endCount = line.split("</span").length;
 | 
			
		||||
    if( startCount !== endCount ) {
 | 
			
		||||
      return true;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return false;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  splitLineMarkup(line, before, after) {
 | 
			
		||||
 | 
			
		||||
    // skip line highlighting if there is an uneven number of <span> or </span> on the line.
 | 
			
		||||
    // for example, we can’t wrap <span> with <span><span></span>
 | 
			
		||||
    if(this.hasTagMismatch(line)) {
 | 
			
		||||
      return line;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return before + line + after;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  getLineMarkup(lineNumber, line, extraClasses = []) {
 | 
			
		||||
    let extraClassesStr = (extraClasses.length ? " " + extraClasses.join(" ") : "");
 | 
			
		||||
 | 
			
		||||
    if (this.isHighlighted(lineNumber)) {
 | 
			
		||||
      return this.splitLineMarkup(line, `<mark class="highlight-line highlight-line-active${extraClassesStr}">`, `</mark>`);
 | 
			
		||||
    }
 | 
			
		||||
    if (this.isHighlightedAdd(lineNumber)) {
 | 
			
		||||
      return this.splitLineMarkup(line, `<ins class="highlight-line highlight-line-add${extraClassesStr}">`, `</ins>`);
 | 
			
		||||
    }
 | 
			
		||||
    if (this.isHighlightedRemove(lineNumber)) {
 | 
			
		||||
      return this.splitLineMarkup(line, `<del class="highlight-line highlight-line-remove${extraClassesStr}">`, `</del>`);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return this.splitLineMarkup( line, `<span class="highlight-line${extraClassesStr}">`, `</span>`);
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
module.exports = HighlightLinesGroup;
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,34 @@
 | 
			
		|||
const Prism = require("prismjs");
 | 
			
		||||
const PrismLoader = require("./PrismLoader");
 | 
			
		||||
const HighlightLinesGroup = require("./HighlightLinesGroup");
 | 
			
		||||
const getAttributes = require("./getAttributes");
 | 
			
		||||
 | 
			
		||||
module.exports = function (content, language, highlightNumbers, options = {}) {
 | 
			
		||||
  // default to on
 | 
			
		||||
  if(options.trim === undefined || options.trim === true) {
 | 
			
		||||
    content = content.trim();
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  let highlightedContent;
 | 
			
		||||
  if( language === "text" ) {
 | 
			
		||||
    highlightedContent = content;
 | 
			
		||||
  } else {
 | 
			
		||||
    highlightedContent = Prism.highlight(content, PrismLoader(language), language);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  let group = new HighlightLinesGroup(highlightNumbers);
 | 
			
		||||
  let lines = highlightedContent.split(/\r?\n/);
 | 
			
		||||
  lines = lines.map(function(line, j) {
 | 
			
		||||
    if(options.alwaysWrapLineHighlights || highlightNumbers) {
 | 
			
		||||
      let lineContent = group.getLineMarkup(j, line);
 | 
			
		||||
      return lineContent;
 | 
			
		||||
    }
 | 
			
		||||
    return line;
 | 
			
		||||
  });
 | 
			
		||||
 | 
			
		||||
  const context = { content: content, language: language,  options: options };
 | 
			
		||||
  const preAttributes = getAttributes(options.preAttributes, context);
 | 
			
		||||
  const codeAttributes = getAttributes(options.codeAttributes, context);
 | 
			
		||||
 | 
			
		||||
  return `<pre${preAttributes}><code${codeAttributes}>` + lines.join(options.lineSeparator || "<br>") + "</code></pre>";
 | 
			
		||||
};
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,49 @@
 | 
			
		|||
const HighlightPairedShortcode = require("./HighlightPairedShortcode");
 | 
			
		||||
 | 
			
		||||
class LiquidHighlightTag {
 | 
			
		||||
  constructor(liquidEngine) {
 | 
			
		||||
    this.liquidEngine = liquidEngine;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  getObject(options = {}) {
 | 
			
		||||
    let ret = function(highlighter) {
 | 
			
		||||
      return {
 | 
			
		||||
        parse: function(tagToken, remainTokens) {
 | 
			
		||||
          let split = tagToken.args.split(" ");
 | 
			
		||||
 | 
			
		||||
          this.language = split.shift();
 | 
			
		||||
          this.highlightLines = split.join(" ");
 | 
			
		||||
 | 
			
		||||
          this.tokens = [];
 | 
			
		||||
 | 
			
		||||
          var stream = highlighter.liquidEngine.parser.parseStream(remainTokens);
 | 
			
		||||
 | 
			
		||||
          stream
 | 
			
		||||
            .on("token", token => {
 | 
			
		||||
              if (token.name === "endhighlight") {
 | 
			
		||||
                stream.stop();
 | 
			
		||||
              } else {
 | 
			
		||||
                this.tokens.push(token);
 | 
			
		||||
              }
 | 
			
		||||
            })
 | 
			
		||||
            .on("end", x => {
 | 
			
		||||
              throw new Error(`tag ${tagToken.getText()} not closed`);
 | 
			
		||||
            });
 | 
			
		||||
 | 
			
		||||
          stream.start();
 | 
			
		||||
        },
 | 
			
		||||
        render: function(scope, hash) {
 | 
			
		||||
          let tokens = this.tokens.map(token => {
 | 
			
		||||
            return token.raw || token.getText();
 | 
			
		||||
          });
 | 
			
		||||
          let tokenStr = tokens.join("").trim();
 | 
			
		||||
          return Promise.resolve(HighlightPairedShortcode(tokenStr, this.language, this.highlightLines, options));
 | 
			
		||||
        }
 | 
			
		||||
      };
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    return ret(this);
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
module.exports = LiquidHighlightTag;
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,42 @@
 | 
			
		|||
const Prism = require("prismjs");
 | 
			
		||||
const PrismLoader = require("prismjs/components/index.js");
 | 
			
		||||
// Avoid "Language does not exist: " console logs
 | 
			
		||||
PrismLoader.silent = true;
 | 
			
		||||
 | 
			
		||||
const PrismAlias = require("./PrismNormalizeAlias");
 | 
			
		||||
 | 
			
		||||
module.exports = function(language) {
 | 
			
		||||
  let diffRemovedRawName = language;
 | 
			
		||||
  if(language.startsWith("diff-")) {
 | 
			
		||||
    diffRemovedRawName = language.substr("diff-".length);
 | 
			
		||||
  }
 | 
			
		||||
  // aliasing should ignore diff-
 | 
			
		||||
  let aliasedName = PrismAlias(diffRemovedRawName);
 | 
			
		||||
 | 
			
		||||
  if(!Prism.languages[ aliasedName ]) {
 | 
			
		||||
    PrismLoader(aliasedName);
 | 
			
		||||
  }
 | 
			
		||||
  if(!Prism.languages[ aliasedName ]) {
 | 
			
		||||
    throw new Error(`"${language}" is not a valid Prism.js language for eleventy-plugin-syntaxhighlight`);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  if(!language.startsWith("diff-")) {
 | 
			
		||||
    return Prism.languages[ aliasedName ];
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // language has diff- prefix
 | 
			
		||||
  let fullLanguageName = `diff-${aliasedName}`;
 | 
			
		||||
 | 
			
		||||
  if(!Prism.languages.diff) {
 | 
			
		||||
    PrismLoader("diff");
 | 
			
		||||
    // Bundled Plugin
 | 
			
		||||
    require("prismjs/plugins/diff-highlight/prism-diff-highlight");
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // Store into with aliased keys
 | 
			
		||||
  //   ts -> diff-typescript
 | 
			
		||||
  //   js -> diff-javascript
 | 
			
		||||
  Prism.languages[ fullLanguageName ] = Prism.languages.diff;
 | 
			
		||||
 | 
			
		||||
  return Prism.languages[ fullLanguageName ];
 | 
			
		||||
};
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,42 @@
 | 
			
		|||
const Prism = require("prismjs");
 | 
			
		||||
 | 
			
		||||
const HARDCODED_ALIASES = {
 | 
			
		||||
  njk: "jinja2",
 | 
			
		||||
  nunjucks: "jinja2",
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
// This was added to make `ts` resolve to `typescript` correctly.
 | 
			
		||||
// The Prism loader doesn’t seem to always handle aliasing correctly.
 | 
			
		||||
module.exports = function(language) {
 | 
			
		||||
  try {
 | 
			
		||||
    // Careful this is not public API stuff:
 | 
			
		||||
    // https://github.com/PrismJS/prism/issues/2146
 | 
			
		||||
    const PrismComponents = require("prismjs/components.json");
 | 
			
		||||
    let langs = PrismComponents.languages;
 | 
			
		||||
 | 
			
		||||
    // Manual override
 | 
			
		||||
    if(HARDCODED_ALIASES[language]) {
 | 
			
		||||
      language = HARDCODED_ALIASES[language];
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if(langs[ language ]) {
 | 
			
		||||
      return language;
 | 
			
		||||
    }
 | 
			
		||||
    for(let langName in langs) {
 | 
			
		||||
      if(Array.isArray(langs[langName].alias)) {
 | 
			
		||||
        for(let alias of langs[langName].alias) {
 | 
			
		||||
          if(alias === language) {
 | 
			
		||||
            return langName;
 | 
			
		||||
          }
 | 
			
		||||
        }
 | 
			
		||||
      } else if(langs[langName].alias === language) {
 | 
			
		||||
        return langName;
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  } catch(e) {
 | 
			
		||||
    // Couldn’t find the components file, aliases may not resolve correctly
 | 
			
		||||
    // See https://github.com/11ty/eleventy-plugin-syntaxhighlight/issues/19
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  return language;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,62 @@
 | 
			
		|||
function attributeEntryToString(attribute, context) {
 | 
			
		||||
  let [key, value] = attribute;
 | 
			
		||||
 | 
			
		||||
  if (typeof value === "function") { // Callback must return a string or a number
 | 
			
		||||
    value = value(context); // Run the provided callback and store the result
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  if (typeof value !== "string" && typeof value !== "number") {
 | 
			
		||||
    throw new Error(
 | 
			
		||||
      `Attribute "${key}" must have, or evaluate to, a value of type string or number, not "${typeof value}".`
 | 
			
		||||
    );
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  return `${key}="${value}"`;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * ## Usage
 | 
			
		||||
 * The function `getAttributes` is used to convert an object, `attributes`, with HTML attributes as keys and the values as the corresponding HTML attribute's values.
 | 
			
		||||
 * If it is falsey, an empty string will be returned.
 | 
			
		||||
 *
 | 
			
		||||
 * ```js
 | 
			
		||||
  getAttributes({
 | 
			
		||||
    tabindex: 0,
 | 
			
		||||
    'data-language': function (context) { return context.language; },
 | 
			
		||||
    'data-otherStuff': 'value'
 | 
			
		||||
  }) // => ' tabindex="0" data-language="JavaScript" data-otherStuff="value"'
 | 
			
		||||
  ```
 | 
			
		||||
 *
 | 
			
		||||
 * @param {{[s: string]: string | number}} attributes An object with key-value pairs that represent attributes.
 | 
			
		||||
 * @param {object} context An object with the current context.
 | 
			
		||||
 * @param {string} context.content The code to parse and highlight.
 | 
			
		||||
 * @param {string} context.language The language for the current instance.
 | 
			
		||||
 * @param {object} context.options The options passed to the syntax highlighter.
 | 
			
		||||
 * @returns {string} A string containing the above HTML attributes preceded by a single space.
 | 
			
		||||
 */
 | 
			
		||||
function getAttributes(attributes, context = {}) {
 | 
			
		||||
  let langClass = context.language ? `language-${context.language}` : "";
 | 
			
		||||
 | 
			
		||||
  if (!attributes) {
 | 
			
		||||
    return langClass ? ` class="${langClass}"` : "";
 | 
			
		||||
  } else if (typeof attributes === "object") {
 | 
			
		||||
    if(!("class" in attributes) && langClass) {
 | 
			
		||||
      // class attribute should be first in order
 | 
			
		||||
      let tempAttrs = { class: langClass };
 | 
			
		||||
      for(let key in attributes) {
 | 
			
		||||
        tempAttrs[key] = attributes[key];
 | 
			
		||||
      }
 | 
			
		||||
      attributes = tempAttrs;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    const formattedAttributes = Object.entries(attributes).map(
 | 
			
		||||
      entry => attributeEntryToString(entry, context)
 | 
			
		||||
    );
 | 
			
		||||
 | 
			
		||||
    return formattedAttributes.length ? ` ${formattedAttributes.join(" ")}` : "";
 | 
			
		||||
  } else if (typeof attributes === "string") {
 | 
			
		||||
    throw new Error("Syntax highlighter plugin custom attributes on <pre> and <code> must be an object. Received: " + JSON.stringify(attributes));
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
module.exports = getAttributes;
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,13 @@
 | 
			
		|||
module.exports = function(templateFormats = ["*"], format = false) {
 | 
			
		||||
  if(!Array.isArray(templateFormats)) {
 | 
			
		||||
    templateFormats = [templateFormats];
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  if( Array.isArray(templateFormats) ) {
 | 
			
		||||
    if( templateFormats.indexOf("*") > -1 || templateFormats.indexOf(format) > -1 ) {
 | 
			
		||||
      return true;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  return false;
 | 
			
		||||
};
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,44 @@
 | 
			
		|||
const Prism = require("prismjs");
 | 
			
		||||
const PrismLoader = require("./PrismLoader");
 | 
			
		||||
const HighlightLinesGroup = require("./HighlightLinesGroup");
 | 
			
		||||
const getAttributes = require("./getAttributes");
 | 
			
		||||
 | 
			
		||||
module.exports = function (options = {}) {
 | 
			
		||||
  return function(str, language) {
 | 
			
		||||
    if(!language) {
 | 
			
		||||
      // empty string means defer to the upstream escaping code built into markdown lib.
 | 
			
		||||
      return "";
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    let split = language.split("/");
 | 
			
		||||
    if( split.length ) {
 | 
			
		||||
      language = split.shift();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    let html;
 | 
			
		||||
    if(language === "text") {
 | 
			
		||||
      html = str;
 | 
			
		||||
    } else {
 | 
			
		||||
      html = Prism.highlight(str, PrismLoader(language), language);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    let hasHighlightNumbers = split.length > 0;
 | 
			
		||||
    let highlights = new HighlightLinesGroup(split.join("/"), "/");
 | 
			
		||||
    let lines = html.split("\n").slice(0, -1); // The last line is empty.
 | 
			
		||||
 | 
			
		||||
    lines = lines.map(function(line, j) {
 | 
			
		||||
      if(options.alwaysWrapLineHighlights || hasHighlightNumbers) {
 | 
			
		||||
        let lineContent = highlights.getLineMarkup(j, line);
 | 
			
		||||
        return lineContent;
 | 
			
		||||
      }
 | 
			
		||||
      return line;
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    const context = { content: str, language: language, options: options };
 | 
			
		||||
    const preAttributes = getAttributes(options.preAttributes, context);
 | 
			
		||||
    const codeAttributes = getAttributes(options.codeAttributes, context);
 | 
			
		||||
 | 
			
		||||
    return `<pre${preAttributes}><code${codeAttributes}>${lines.join(options.lineSeparator || "<br>")}</code></pre>`;
 | 
			
		||||
  };
 | 
			
		||||
};
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,16 @@
 | 
			
		|||
<script webc:type="render" webc:is="template" webc:raw webc:nokeep>
 | 
			
		||||
function() {
 | 
			
		||||
	let errorPrefix = "[11ty/eleventy-plugin-syntaxhighlight] <syntax-highlight> WebC component: ";
 | 
			
		||||
 | 
			
		||||
	if(!this.slots || !this.slots.text) {
 | 
			
		||||
		throw new Error(errorPrefix + "requires WebC v0.6.0");
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if(!this.helpers || !this.helpers.highlight) {
 | 
			
		||||
		throw new Error(errorPrefix+ "missing the `highlight` helper! Did you run addPlugin on the syntax highlighter in your Eleventy config file?");
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	let content = this.slots.text.default;
 | 
			
		||||
	return this.helpers.highlight(this.language, content);
 | 
			
		||||
}
 | 
			
		||||
</script>
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,5 @@
 | 
			
		|||
const syntaxHighlight = require("../../");
 | 
			
		||||
 | 
			
		||||
module.exports = function(eleventyConfig) {
 | 
			
		||||
  eleventyConfig.addPlugin(syntaxHighlight);
 | 
			
		||||
};
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,4 @@
 | 
			
		|||
module.exports = function(data) {
 | 
			
		||||
  let result = this.highlight("diff-js", "-var test;");
 | 
			
		||||
  return result;
 | 
			
		||||
};
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,5 @@
 | 
			
		|||
const syntaxHighlight = require("../../");
 | 
			
		||||
 | 
			
		||||
module.exports = function(eleventyConfig) {
 | 
			
		||||
  eleventyConfig.addPlugin(syntaxHighlight);
 | 
			
		||||
};
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,4 @@
 | 
			
		|||
module.exports = function(data) {
 | 
			
		||||
  let result = this.highlight("js", "var test;");
 | 
			
		||||
  return result;
 | 
			
		||||
};
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,13 @@
 | 
			
		|||
const test = require("ava");
 | 
			
		||||
const CharacterWrap = require("../src/CharacterWrap");
 | 
			
		||||
 | 
			
		||||
test("CharacterWrap", async t => {
 | 
			
		||||
  let wrapper = new CharacterWrap();
 | 
			
		||||
  t.is(wrapper.wrapContent("<html></html>", "html"), `<pre class="language-html"><code class="language-html"><span class="token tag"><span class="token tag"><span class="token punctuation"><span data-index="1" class="charwrap"><</span></span><span data-index="2" class="charwrap">h</span><span data-index="3" class="charwrap">t</span><span data-index="4" class="charwrap">m</span><span data-index="5" class="charwrap">l</span></span><span class="token punctuation"><span data-index="6" class="charwrap">></span></span></span><span class="token tag"><span class="token tag"><span class="token punctuation"><span data-index="7" class="charwrap"><</span><span data-index="8" class="charwrap">/</span></span><span data-index="9" class="charwrap">h</span><span data-index="10" class="charwrap">t</span><span data-index="11" class="charwrap">m</span><span data-index="12" class="charwrap">l</span></span><span class="token punctuation"><span data-index="13" class="charwrap">></span></span></span></code></pre>`);
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
test("CharacterWrap with different class prefix", async t => {
 | 
			
		||||
  let wrapper = new CharacterWrap();
 | 
			
		||||
  wrapper.setClassPrefix("customprefix");
 | 
			
		||||
  t.is(wrapper.wrapContent("<html></html>", "html"), `<pre class="language-html"><code class="language-html"><span class="token tag"><span class="token tag"><span class="token punctuation"><span data-index="1" class="customprefix"><</span></span><span data-index="2" class="customprefix">h</span><span data-index="3" class="customprefix">t</span><span data-index="4" class="customprefix">m</span><span data-index="5" class="customprefix">l</span></span><span class="token punctuation"><span data-index="6" class="customprefix">></span></span></span><span class="token tag"><span class="token tag"><span class="token punctuation"><span data-index="7" class="customprefix"><</span><span data-index="8" class="customprefix">/</span></span><span data-index="9" class="customprefix">h</span><span data-index="10" class="customprefix">t</span><span data-index="11" class="customprefix">m</span><span data-index="12" class="customprefix">l</span></span><span class="token punctuation"><span data-index="13" class="customprefix">></span></span></span></code></pre>`);
 | 
			
		||||
});
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,54 @@
 | 
			
		|||
const test = require("ava");
 | 
			
		||||
const ga = require("../src/getAttributes");
 | 
			
		||||
 | 
			
		||||
test("Falsy", t => {
 | 
			
		||||
  t.is(ga(false), "");
 | 
			
		||||
  t.is(ga(null), "");
 | 
			
		||||
  t.is(ga(undefined), "");
 | 
			
		||||
  t.is(ga(""), "");
 | 
			
		||||
  t.throws(() => {
 | 
			
		||||
    ga(" test='1'");
 | 
			
		||||
  });
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
test("Object syntax", t => {
 | 
			
		||||
  t.is(ga({}), "");
 | 
			
		||||
  t.is(ga({ hi: 1 }), ' hi="1"');
 | 
			
		||||
  t.is(ga({ hi: 1, bye: 2 }), ' hi="1" bye="2"');
 | 
			
		||||
  t.is(ga({ class: "my-class", bye: 2 }), ' class="my-class" bye="2"');
 | 
			
		||||
  t.is(ga({ hi: function(ctx) { return '1'; }, bye: 2 }), ' hi="1" bye="2"');
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
test("Function callback", t => {
 | 
			
		||||
  t.is(ga({ "data-lang": ({language}) => language }, {
 | 
			
		||||
    language: "html"
 | 
			
		||||
  }), ' class="language-html" data-lang="html"');
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
test("Function callback with class attribute (override)", t => {
 | 
			
		||||
  t.is(ga({
 | 
			
		||||
    class: ({language}) => "my-custom-"+language
 | 
			
		||||
  }, {
 | 
			
		||||
    language: "html"
 | 
			
		||||
  }), ' class="my-custom-html"');
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
test("Function callback must return string or integer", t => {
 | 
			
		||||
  t.throws(() => {
 | 
			
		||||
    ga({ "data-lang": ({language}) => undefined }, {
 | 
			
		||||
      language: "html"
 | 
			
		||||
    })
 | 
			
		||||
  });
 | 
			
		||||
 | 
			
		||||
  t.throws(() => {
 | 
			
		||||
    ga({ "data-lang": ({language}) => {} }, {
 | 
			
		||||
      language: "html"
 | 
			
		||||
    })
 | 
			
		||||
  });
 | 
			
		||||
 | 
			
		||||
  t.throws(() => {
 | 
			
		||||
    ga({ "data-lang": ({language}) => false }, {
 | 
			
		||||
      language: "html"
 | 
			
		||||
    })
 | 
			
		||||
  });
 | 
			
		||||
});
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,25 @@
 | 
			
		|||
const test = require("ava");
 | 
			
		||||
const hasTemplateFormat = require("../src/hasTemplateFormat");
 | 
			
		||||
 | 
			
		||||
test("hasTemplateFormats", t => {
 | 
			
		||||
  t.true(hasTemplateFormat("*", "liquid"));
 | 
			
		||||
  t.false(hasTemplateFormat([], "liquid"));
 | 
			
		||||
 | 
			
		||||
  // options not specified, defaults to *
 | 
			
		||||
  t.true(hasTemplateFormat(undefined, "liquid"));
 | 
			
		||||
  t.false(hasTemplateFormat(null, "liquid"));
 | 
			
		||||
 | 
			
		||||
  t.true(hasTemplateFormat("*", false));
 | 
			
		||||
  t.false(hasTemplateFormat([], false));
 | 
			
		||||
 | 
			
		||||
  // options not specified, defaults to *
 | 
			
		||||
  t.true(hasTemplateFormat(undefined, false));
 | 
			
		||||
  t.false(hasTemplateFormat(null, false));
 | 
			
		||||
 | 
			
		||||
  t.true(hasTemplateFormat(["*"], "liquid"));
 | 
			
		||||
  t.true(hasTemplateFormat(["liquid"], "liquid"));
 | 
			
		||||
  t.true(hasTemplateFormat(["liquid", "njk"], "liquid"));
 | 
			
		||||
  t.true(hasTemplateFormat(["liquid", "njk"], "njk"));
 | 
			
		||||
  t.true(hasTemplateFormat(["liquid", "njk", "md"], "md"));
 | 
			
		||||
  t.false(hasTemplateFormat(["liquid", "njk", "md"], "pug"));
 | 
			
		||||
});
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,93 @@
 | 
			
		|||
const test = require("ava");
 | 
			
		||||
const HighlightLinesGroup = require("../src/HighlightLinesGroup");
 | 
			
		||||
 | 
			
		||||
test("Empty", t => {
 | 
			
		||||
  let hilite = new HighlightLinesGroup("");
 | 
			
		||||
  t.is(hilite.isHighlighted(0), false);
 | 
			
		||||
  t.is(hilite.isHighlighted(1), false);
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
test("Highlight irrelevant (-)", t => {
 | 
			
		||||
  let hilite = new HighlightLinesGroup("-");
 | 
			
		||||
  t.is(hilite.isHighlighted(0), false);
 | 
			
		||||
  t.is(hilite.isHighlighted(1), false);
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
test("Highlight simple (0)", t => {
 | 
			
		||||
  let hilite = new HighlightLinesGroup("0");
 | 
			
		||||
  t.is(hilite.isHighlighted(0), true);
 | 
			
		||||
  t.is(hilite.isHighlighted(1), false);
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
test("Highlight simple (1)", t => {
 | 
			
		||||
  let hilite = new HighlightLinesGroup("1");
 | 
			
		||||
  t.is(hilite.isHighlighted(0), false);
 | 
			
		||||
  t.is(hilite.isHighlighted(1), true);
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
test("Highlight complex", t => {
 | 
			
		||||
  let hilite = new HighlightLinesGroup("1-2,4");
 | 
			
		||||
  t.is(hilite.isHighlighted(0), false);
 | 
			
		||||
  t.is(hilite.isHighlighted(1), true);
 | 
			
		||||
  t.is(hilite.isHighlighted(2), true);
 | 
			
		||||
  t.is(hilite.isHighlighted(3), false);
 | 
			
		||||
  t.is(hilite.isHighlighted(4), true);
 | 
			
		||||
  t.is(hilite.isHighlighted(5), false);
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
test("Add/Remove", t => {
 | 
			
		||||
  let hilite = new HighlightLinesGroup("1-2,4 3");
 | 
			
		||||
  t.is(hilite.isHighlighted(0), false);
 | 
			
		||||
  t.is(hilite.isHighlighted(1), false);
 | 
			
		||||
  t.is(hilite.isHighlighted(2), false);
 | 
			
		||||
  t.is(hilite.isHighlighted(3), false);
 | 
			
		||||
  t.is(hilite.isHighlighted(4), false);
 | 
			
		||||
  t.is(hilite.isHighlighted(5), false);
 | 
			
		||||
 | 
			
		||||
  t.is(hilite.isHighlightedAdd(0), false);
 | 
			
		||||
  t.is(hilite.isHighlightedAdd(1), true);
 | 
			
		||||
  t.is(hilite.isHighlightedAdd(2), true);
 | 
			
		||||
  t.is(hilite.isHighlightedAdd(3), false);
 | 
			
		||||
  t.is(hilite.isHighlightedAdd(4), true);
 | 
			
		||||
  t.is(hilite.isHighlightedAdd(5), false);
 | 
			
		||||
 | 
			
		||||
  t.is(hilite.isHighlightedRemove(0), false);
 | 
			
		||||
  t.is(hilite.isHighlightedRemove(1), false);
 | 
			
		||||
  t.is(hilite.isHighlightedRemove(2), false);
 | 
			
		||||
  t.is(hilite.isHighlightedRemove(3), true);
 | 
			
		||||
  t.is(hilite.isHighlightedRemove(4), false);
 | 
			
		||||
  t.is(hilite.isHighlightedRemove(5), false);
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
test("Add/Remove New Delimiter", t => {
 | 
			
		||||
  let hilite = new HighlightLinesGroup("1-2,4/3", "/");
 | 
			
		||||
  t.is(hilite.isHighlighted(0), false);
 | 
			
		||||
  t.is(hilite.isHighlighted(1), false);
 | 
			
		||||
  t.is(hilite.isHighlighted(2), false);
 | 
			
		||||
  t.is(hilite.isHighlighted(3), false);
 | 
			
		||||
  t.is(hilite.isHighlighted(4), false);
 | 
			
		||||
  t.is(hilite.isHighlighted(5), false);
 | 
			
		||||
 | 
			
		||||
  t.is(hilite.isHighlightedAdd(0), false);
 | 
			
		||||
  t.is(hilite.isHighlightedAdd(1), true);
 | 
			
		||||
  t.is(hilite.isHighlightedAdd(2), true);
 | 
			
		||||
  t.is(hilite.isHighlightedAdd(3), false);
 | 
			
		||||
  t.is(hilite.isHighlightedAdd(4), true);
 | 
			
		||||
  t.is(hilite.isHighlightedAdd(5), false);
 | 
			
		||||
 | 
			
		||||
  t.is(hilite.isHighlightedRemove(0), false);
 | 
			
		||||
  t.is(hilite.isHighlightedRemove(1), false);
 | 
			
		||||
  t.is(hilite.isHighlightedRemove(2), false);
 | 
			
		||||
  t.is(hilite.isHighlightedRemove(3), true);
 | 
			
		||||
  t.is(hilite.isHighlightedRemove(4), false);
 | 
			
		||||
  t.is(hilite.isHighlightedRemove(5), false);
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
test("Split Line Markup", t => {
 | 
			
		||||
  let hilite = new HighlightLinesGroup("", " ");
 | 
			
		||||
  t.is(hilite.splitLineMarkup("Test", "BEFORE", "AFTER"), "BEFORETestAFTER");
 | 
			
		||||
  t.is(hilite.splitLineMarkup("<span>Test</span>", "BEFORE", "AFTER"), "BEFORE<span>Test</span>AFTER");
 | 
			
		||||
  t.is(hilite.splitLineMarkup("<span>Test", "BEFORE", "AFTER"), "<span>Test");
 | 
			
		||||
  t.is(hilite.splitLineMarkup("Test</span>", "BEFORE", "AFTER"), "Test</span>");
 | 
			
		||||
});
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,41 @@
 | 
			
		|||
const test = require("ava");
 | 
			
		||||
const HighlightLines = require("../src/HighlightLines");
 | 
			
		||||
 | 
			
		||||
test("HighlightLines empty", t => {
 | 
			
		||||
  let hilite = new HighlightLines("");
 | 
			
		||||
  t.is(hilite.isHighlighted(0), false);
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
test("HighlightLines single 0", t => {
 | 
			
		||||
  let hilite = new HighlightLines("0");
 | 
			
		||||
  t.is(hilite.isHighlighted(0), true);
 | 
			
		||||
  t.is(hilite.isHighlighted(1), false);
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
test("HighlightLines single 1", t => {
 | 
			
		||||
  let hilite = new HighlightLines("1");
 | 
			
		||||
  t.is(hilite.isHighlighted(0), false);
 | 
			
		||||
  t.is(hilite.isHighlighted(1), true);
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
test("HighlightLines range", t => {
 | 
			
		||||
  let hilite = new HighlightLines("1-3");
 | 
			
		||||
  t.is(hilite.isHighlighted(0), false);
 | 
			
		||||
  t.is(hilite.isHighlighted(1), true);
 | 
			
		||||
  t.is(hilite.isHighlighted(2), true);
 | 
			
		||||
  t.is(hilite.isHighlighted(3), true);
 | 
			
		||||
  t.is(hilite.isHighlighted(4), false);
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
test("HighlightLines multiple ranges", t => {
 | 
			
		||||
  let hilite = new HighlightLines("1-3,5-7");
 | 
			
		||||
  t.is(hilite.isHighlighted(0), false);
 | 
			
		||||
  t.is(hilite.isHighlighted(1), true);
 | 
			
		||||
  t.is(hilite.isHighlighted(2), true);
 | 
			
		||||
  t.is(hilite.isHighlighted(3), true);
 | 
			
		||||
  t.is(hilite.isHighlighted(4), false);
 | 
			
		||||
  t.is(hilite.isHighlighted(5), true);
 | 
			
		||||
  t.is(hilite.isHighlighted(6), true);
 | 
			
		||||
  t.is(hilite.isHighlighted(7), true);
 | 
			
		||||
  t.is(hilite.isHighlighted(8), false);
 | 
			
		||||
});
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,104 @@
 | 
			
		|||
const test = require("ava");
 | 
			
		||||
const HighlightPairedShortcode = require("../src/HighlightPairedShortcode");
 | 
			
		||||
 | 
			
		||||
test("Base", async t => {
 | 
			
		||||
  t.is(await HighlightPairedShortcode(`alert();
 | 
			
		||||
alert();`, "js", "", { alwaysWrapLineHighlights: true }), `<pre class="language-js"><code class="language-js"><span class="highlight-line"><span class="token function">alert</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"><span class="token function">alert</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span></code></pre>`);
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
test("Base with LF EOL, always wrap highlights", async t => {
 | 
			
		||||
  t.is(await HighlightPairedShortcode('alert();\nalert();', 
 | 
			
		||||
"js", "", { alwaysWrapLineHighlights: true }), `<pre class="language-js"><code class="language-js"><span class="highlight-line"><span class="token function">alert</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"><span class="token function">alert</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span></code></pre>`);
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
test("Base with LF EOL, no wrap highlights", async t => {
 | 
			
		||||
  t.is(await HighlightPairedShortcode('alert();\nalert();', 
 | 
			
		||||
"js", "", { alwaysWrapLineHighlights: false }), `<pre class="language-js"><code class="language-js"><span class="token function">alert</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br><span class="token function">alert</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre>`);
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
test("Base with CRLF EOL, always wrap highlights", async t => {
 | 
			
		||||
  t.is(await HighlightPairedShortcode('alert();\r\nalert();', 
 | 
			
		||||
"js", "", { alwaysWrapLineHighlights: true }), `<pre class="language-js"><code class="language-js"><span class="highlight-line"><span class="token function">alert</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"><span class="token function">alert</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span></code></pre>`);
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
test("Base with CRLF EOL, no wrap highlights", async t => {
 | 
			
		||||
  t.is(await HighlightPairedShortcode('alert();\r\nalert();', 
 | 
			
		||||
"js", "", { alwaysWrapLineHighlights: false }), `<pre class="language-js"><code class="language-js"><span class="token function">alert</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br><span class="token function">alert</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre>`);
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
test("Base with custom attributes", async t => {
 | 
			
		||||
  t.is(await HighlightPairedShortcode(`alert();
 | 
			
		||||
alert();`, "js", "", { alwaysWrapLineHighlights: true, preAttributes: { tabindex: 0, 'data-testid': 'code' } }), `<pre class="language-js" tabindex="0" data-testid="code"><code class="language-js"><span class="highlight-line"><span class="token function">alert</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><br><span class="highlight-line"><span class="token function">alert</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span></code></pre>`);
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
test("Base change the line separator", async t => {
 | 
			
		||||
  t.is(await HighlightPairedShortcode(`alert();
 | 
			
		||||
alert();`, "js", "", {
 | 
			
		||||
  alwaysWrapLineHighlights: true,
 | 
			
		||||
  lineSeparator: "\n",
 | 
			
		||||
}), `<pre class="language-js"><code class="language-js"><span class="highlight-line"><span class="token function">alert</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
 | 
			
		||||
<span class="highlight-line"><span class="token function">alert</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span></code></pre>`);
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
test("Base No line highlights", async t => {
 | 
			
		||||
  t.is(await HighlightPairedShortcode(`alert();
 | 
			
		||||
alert();`, "js", ""), `<pre class="language-js"><code class="language-js"><span class="token function">alert</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br><span class="token function">alert</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre>`);
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
test("Highlight Active", async t => {
 | 
			
		||||
  t.is(await HighlightPairedShortcode(`alert();
 | 
			
		||||
alert();`, "js", "0", { alwaysWrapLineHighlights: true }), `<pre class="language-js"><code class="language-js"><mark class="highlight-line highlight-line-active"><span class="token function">alert</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></mark><br><span class="highlight-line"><span class="token function">alert</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span></code></pre>`);
 | 
			
		||||
 | 
			
		||||
  t.is(await HighlightPairedShortcode(`alert();
 | 
			
		||||
alert();`, "js", "0-1", { alwaysWrapLineHighlights: true }), `<pre class="language-js"><code class="language-js"><mark class="highlight-line highlight-line-active"><span class="token function">alert</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></mark><br><mark class="highlight-line highlight-line-active"><span class="token function">alert</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></mark></code></pre>`);
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
test("Highlight Add/Remove", async t => {
 | 
			
		||||
  t.is(await HighlightPairedShortcode(`alert();
 | 
			
		||||
alert();`, "js", "0 1", { alwaysWrapLineHighlights: true }), `<pre class="language-js"><code class="language-js"><ins class="highlight-line highlight-line-add"><span class="token function">alert</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></ins><br><del class="highlight-line highlight-line-remove"><span class="token function">alert</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></del></code></pre>`);
 | 
			
		||||
 | 
			
		||||
  t.is(await HighlightPairedShortcode(`alert();
 | 
			
		||||
alert();`, "js", "1 0", { alwaysWrapLineHighlights: true }), `<pre class="language-js"><code class="language-js"><del class="highlight-line highlight-line-remove"><span class="token function">alert</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></del><br><ins class="highlight-line highlight-line-add"><span class="token function">alert</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></ins></code></pre>`);
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
test("Test loader typescript", async t => {
 | 
			
		||||
  let script = `function greeter(person) {
 | 
			
		||||
    return "Hello, " + person;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
let user = "Jane User";
 | 
			
		||||
 | 
			
		||||
document.body.textContent = greeter(user);`;
 | 
			
		||||
 | 
			
		||||
  t.is(await HighlightPairedShortcode(script, "typescript"), `<pre class="language-typescript"><code class="language-typescript"><span class="token keyword">function</span> <span class="token function">greeter</span><span class="token punctuation">(</span>person<span class="token punctuation">)</span> <span class="token punctuation">{</span><br>    <span class="token keyword">return</span> <span class="token string">"Hello, "</span> <span class="token operator">+</span> person<span class="token punctuation">;</span><br><span class="token punctuation">}</span><br><br><span class="token keyword">let</span> user <span class="token operator">=</span> <span class="token string">"Jane User"</span><span class="token punctuation">;</span><br><br>document<span class="token punctuation">.</span>body<span class="token punctuation">.</span>textContent <span class="token operator">=</span> <span class="token function">greeter</span><span class="token punctuation">(</span>user<span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre>`);
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
test("Test loader ts", async t => {
 | 
			
		||||
  let script = `function greeter(person) {
 | 
			
		||||
    return "Hello, " + person;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
let user = "Jane User";
 | 
			
		||||
 | 
			
		||||
document.body.textContent = greeter(user);`
 | 
			
		||||
 | 
			
		||||
  t.is(await HighlightPairedShortcode(script, "ts"), `<pre class="language-ts"><code class="language-ts"><span class="token keyword">function</span> <span class="token function">greeter</span><span class="token punctuation">(</span>person<span class="token punctuation">)</span> <span class="token punctuation">{</span><br>    <span class="token keyword">return</span> <span class="token string">"Hello, "</span> <span class="token operator">+</span> person<span class="token punctuation">;</span><br><span class="token punctuation">}</span><br><br><span class="token keyword">let</span> user <span class="token operator">=</span> <span class="token string">"Jane User"</span><span class="token punctuation">;</span><br><br>document<span class="token punctuation">.</span>body<span class="token punctuation">.</span>textContent <span class="token operator">=</span> <span class="token function">greeter</span><span class="token punctuation">(</span>user<span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre>`);
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
test("Test loader invalid language", async t => {
 | 
			
		||||
  await t.throwsAsync(async () => {
 | 
			
		||||
    await HighlightPairedShortcode("", "asldkjflksdaj");
 | 
			
		||||
  });
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
test("Trim content option (defaults true)", async t => {
 | 
			
		||||
  t.is(await HighlightPairedShortcode(` alert();
 | 
			
		||||
alert(); `, "js", "", {}), `<pre class="language-js"><code class="language-js"><span class="token function">alert</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br><span class="token function">alert</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre>`);
 | 
			
		||||
 | 
			
		||||
  t.is(await HighlightPairedShortcode(` alert();
 | 
			
		||||
alert(); `, "js", "", { trim: true }), `<pre class="language-js"><code class="language-js"><span class="token function">alert</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br><span class="token function">alert</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre>`);
 | 
			
		||||
 | 
			
		||||
  t.is(await HighlightPairedShortcode(` alert();
 | 
			
		||||
alert(); `, "js", "", { trim: false }), `<pre class="language-js"><code class="language-js"> <span class="token function">alert</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br><span class="token function">alert</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> </code></pre>`);
 | 
			
		||||
 | 
			
		||||
});
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,24 @@
 | 
			
		|||
const test = require("ava");
 | 
			
		||||
const Eleventy = require('@11ty/eleventy');
 | 
			
		||||
 | 
			
		||||
test("JavaScript Function", async t => {
 | 
			
		||||
  let elev = new Eleventy("./test/11tyjs-test/", "./test/11tyjs-test/_site/", {
 | 
			
		||||
    configPath: "./test/11tyjs-test/.eleventy.js"
 | 
			
		||||
  });
 | 
			
		||||
  let json = await elev.toJSON();
 | 
			
		||||
 | 
			
		||||
  t.is(json.length, 1);
 | 
			
		||||
  let rendered = json[0].content;
 | 
			
		||||
	t.is(`<pre class="language-js"><code class="language-js"><span class="token keyword">var</span> test<span class="token punctuation">;</span></code></pre>`, rendered);
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
test("JavaScript Function Diff", async t => {
 | 
			
		||||
  let elev = new Eleventy("./test/11tyjs-diff/", "./test/11tyjs-diff/_site/", {
 | 
			
		||||
    configPath: "./test/11tyjs-diff/.eleventy.js"
 | 
			
		||||
  });
 | 
			
		||||
  let json = await elev.toJSON();
 | 
			
		||||
 | 
			
		||||
  t.is(json.length, 1);
 | 
			
		||||
  let rendered = json[0].content;
 | 
			
		||||
	t.is(`<pre class="language-diff-js"><code class="language-diff-js"><span class="token deleted-sign deleted language-js"><span class="token prefix deleted">-</span><span class="token keyword">var</span> test<span class="token punctuation">;</span></span></code></pre>`, rendered);
 | 
			
		||||
});
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,43 @@
 | 
			
		|||
const test = require("ava");
 | 
			
		||||
const { Liquid } = require('liquidjs');
 | 
			
		||||
const LiquidHighlightTag = require("../src/LiquidHighlightTag");
 | 
			
		||||
 | 
			
		||||
async function renderLiquid(str, data = {}, engine = null) {
 | 
			
		||||
	if(!engine) {
 | 
			
		||||
		engine = new Liquid();
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	let result = await engine.parseAndRender(str, data);
 | 
			
		||||
	return result;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
test("Test Render", async t => {
 | 
			
		||||
	t.is("Hi Zach", await renderLiquid("Hi {{name}}", {name: "Zach"}));
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
test("Test Highlight Tag Render", async t => {
 | 
			
		||||
  let engine = new Liquid();
 | 
			
		||||
  let tag = new LiquidHighlightTag(engine);
 | 
			
		||||
  engine.registerTag("highlight", tag.getObject());
 | 
			
		||||
 | 
			
		||||
  let rendered = await renderLiquid("{% highlight js %}var test;{% endhighlight %}", {}, engine);
 | 
			
		||||
	t.is(`<pre class="language-js"><code class="language-js"><span class="token keyword">var</span> test<span class="token punctuation">;</span></code></pre>`, rendered);
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
test("Njk Alias", async t => {
 | 
			
		||||
  let engine = new Liquid();
 | 
			
		||||
  let tag = new LiquidHighlightTag(engine);
 | 
			
		||||
  engine.registerTag("highlight", tag.getObject());
 | 
			
		||||
 | 
			
		||||
  let rendered = await renderLiquid("{% highlight njk %}{% raw %}hello{% endraw %}{% endhighlight %}", {}, engine);
 | 
			
		||||
	t.is(`<pre class="language-njk"><code class="language-njk"><span class="token delimiter punctuation">{%</span> <span class="token tag keyword">raw</span> <span class="token operator">%</span><span class="token punctuation">}</span><span class="token variable">hello</span><span class="token punctuation">{</span><span class="token operator">%</span> <span class="token variable">endraw</span> <span class="token delimiter punctuation">%}</span></code></pre>`, rendered);
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
test("Nunjucks alias", async t => {
 | 
			
		||||
  let engine = new Liquid();
 | 
			
		||||
  let tag = new LiquidHighlightTag(engine);
 | 
			
		||||
  engine.registerTag("highlight", tag.getObject());
 | 
			
		||||
 | 
			
		||||
  let rendered = await renderLiquid("{% highlight nunjucks %}{% raw %}hello{% endraw %}{% endhighlight %}", {}, engine);
 | 
			
		||||
	t.is(`<pre class="language-nunjucks"><code class="language-nunjucks"><span class="token delimiter punctuation">{%</span> <span class="token tag keyword">raw</span> <span class="token operator">%</span><span class="token punctuation">}</span><span class="token variable">hello</span><span class="token punctuation">{</span><span class="token operator">%</span> <span class="token variable">endraw</span> <span class="token delimiter punctuation">%}</span></code></pre>`, rendered);
 | 
			
		||||
});
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,85 @@
 | 
			
		|||
const test = require("ava");
 | 
			
		||||
const md = require("markdown-it");
 | 
			
		||||
const markdownPrismJsOptions = require("../src/markdownSyntaxHighlightOptions");
 | 
			
		||||
 | 
			
		||||
test("Test Markdown Highlighter", t => {
 | 
			
		||||
  let mdLib = md();
 | 
			
		||||
  mdLib.set({
 | 
			
		||||
    highlight: markdownPrismJsOptions({ alwaysWrapLineHighlights: true })
 | 
			
		||||
  });
 | 
			
		||||
  t.is(mdLib.render(`\`\`\`js
 | 
			
		||||
alert();
 | 
			
		||||
\`\`\``).trim(), `<pre class="language-js"><code class="language-js"><span class="highlight-line"><span class="token function">alert</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span></code></pre>`);
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
test("Test Markdown Highlighter No Line Highlights", t => {
 | 
			
		||||
  let mdLib = md();
 | 
			
		||||
  mdLib.set({
 | 
			
		||||
    highlight: markdownPrismJsOptions()
 | 
			
		||||
  });
 | 
			
		||||
  t.is(mdLib.render(`\`\`\`js
 | 
			
		||||
alert();
 | 
			
		||||
\`\`\``).trim(), `<pre class="language-js"><code class="language-js"><span class="token function">alert</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre>`);
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
test("Markdown with `preAttributes`", t => {
 | 
			
		||||
  let mdLib = md();
 | 
			
		||||
  mdLib.set({
 | 
			
		||||
    highlight: markdownPrismJsOptions({
 | 
			
		||||
      alwaysWrapLineHighlights: true,
 | 
			
		||||
      preAttributes: {
 | 
			
		||||
        // will override class="language-js"
 | 
			
		||||
        class: ({language}) => "not-a-lang-" + language
 | 
			
		||||
      }
 | 
			
		||||
    })
 | 
			
		||||
  });
 | 
			
		||||
  t.is(mdLib.render(`\`\`\`js
 | 
			
		||||
alert();
 | 
			
		||||
\`\`\``).trim(), `<pre class="not-a-lang-js"><code class="language-js"><span class="highlight-line"><span class="token function">alert</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span></code></pre>`);
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
test("Test Njk Alias", t => {
 | 
			
		||||
  let mdLib = md();
 | 
			
		||||
  mdLib.set({
 | 
			
		||||
    highlight: markdownPrismJsOptions()
 | 
			
		||||
  });
 | 
			
		||||
  t.is(mdLib.render(`\`\`\`njk
 | 
			
		||||
{% raw %}hello{% endraw %}
 | 
			
		||||
\`\`\``).trim(), `<pre class="language-njk"><code class="language-njk"><span class="token delimiter punctuation">{%</span> <span class="token tag keyword">raw</span> <span class="token operator">%</span><span class="token punctuation">}</span><span class="token variable">hello</span><span class="token punctuation">{</span><span class="token operator">%</span> <span class="token variable">endraw</span> <span class="token operator">%</span><span class="token punctuation">}</span></code></pre>`);
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
test("Test Nunjucks Alias", t => {
 | 
			
		||||
  let mdLib = md();
 | 
			
		||||
  mdLib.set({
 | 
			
		||||
    highlight: markdownPrismJsOptions()
 | 
			
		||||
  });
 | 
			
		||||
  t.is(mdLib.render(`\`\`\`nunjucks
 | 
			
		||||
{% raw %}hello{% endraw %}
 | 
			
		||||
\`\`\``).trim(), `<pre class="language-nunjucks"><code class="language-nunjucks"><span class="token delimiter punctuation">{%</span> <span class="token tag keyword">raw</span> <span class="token operator">%</span><span class="token punctuation">}</span><span class="token variable">hello</span><span class="token punctuation">{</span><span class="token operator">%</span> <span class="token variable">endraw</span> <span class="token operator">%</span><span class="token punctuation">}</span></code></pre>`);
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
// test("Test Markdown Highlighter Block Comment", t => {
 | 
			
		||||
//   let mdLib = md();
 | 
			
		||||
//   mdLib.set({
 | 
			
		||||
//     highlight: markdownPrismJsOptions({ alwaysWrapLineHighlights: true })
 | 
			
		||||
//   });
 | 
			
		||||
//   t.is(mdLib.render(`\`\`\`js
 | 
			
		||||
// /*
 | 
			
		||||
//  * this is a string
 | 
			
		||||
//  */
 | 
			
		||||
// \`\`\``).trim(), `<pre class="language-js"><code class="language-js"><span class="token comment"><span class="highlight-line">/*</span><br><span class="highlight-line"> * this is a string</span><br><span class="highlight-line"> */</span></span></code></pre>`);
 | 
			
		||||
// });
 | 
			
		||||
 | 
			
		||||
// TODO this still ain’t working right with the line highlighter.
 | 
			
		||||
// test("Test Markdown Highlighter GraphQL Example", t => {
 | 
			
		||||
//   let mdLib = md();
 | 
			
		||||
//   mdLib.set({
 | 
			
		||||
//     highlight: markdownPrismJsOptions({ alwaysWrapLineHighlights: true })
 | 
			
		||||
//   });
 | 
			
		||||
//   t.is(mdLib.render(`\`\`\`js
 | 
			
		||||
// var schema = buildSchema(\`type Query {
 | 
			
		||||
//   hello: String
 | 
			
		||||
// }\`);
 | 
			
		||||
// \`\`\``).trim(), ``);
 | 
			
		||||
// });
 | 
			
		||||
		Loading…
	
		Reference in New Issue