Skip to content

Commit

Permalink
Declare lowlight as a peerDependency
Browse files Browse the repository at this point in the history
Declare lowlight as a peerDependency to delegate
the control of which version of lowlight is used
to the client application
  • Loading branch information
ealcantara-gitlab committed Jun 6, 2022
1 parent f019f70 commit f0c85b9
Show file tree
Hide file tree
Showing 7 changed files with 55 additions and 27 deletions.
3 changes: 2 additions & 1 deletion demos/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,8 @@
"shiki": "^0.10.0",
"simplify-js": "^1.2.4",
"y-webrtc": "^10.2.2",
"yjs": "^13.5.26"
"yjs": "^13.5.26",
"lowlight": "^1.20.0"
},
"devDependencies": {
"@types/uuid": "^8.3.4",
Expand Down
22 changes: 20 additions & 2 deletions docs/api/nodes/code-block-lowlight.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,17 +7,35 @@ icon: terminal-box-fill
[![Version](https://img.shields.io/npm/v/@tiptap/extension-code-block-lowlight.svg?label=version)](https://www.npmjs.com/package/@tiptap/extension-code-block-lowlight)
[![Downloads](https://img.shields.io/npm/dm/@tiptap/extension-code-block-lowlight.svg)](https://npmcharts.com/compare/@tiptap/extension-code-block-lowlight?minimal=true)

With the CodeBlock extension you can add fenced code blocks to your documents. It’ll wrap the code in `<pre>` and `<code>` HTML tags.
With the CodeBlockLowlight extension you can add fenced code blocks to your documents. It’ll wrap the code in `<pre>` and `<code>` HTML tags.

::: warning Syntax highlight dependency
This extension relies on the [lowlight](https://github.com/wooorm/lowlight) library to apply syntax highlight to the code block’s content.
:::

Type <code>&grave;&grave;&grave;&nbsp;</code> (three backticks and a space) or <code>&Tilde;&Tilde;&Tilde;&nbsp;</code> (three tildes and a space) and a code block is instantly added for you. You can even specify the language, try writing <code>&grave;&grave;&grave;css&nbsp;</code>. That should add a `language-css` class to the `<code>`-tag.

## Installation
```bash
npm install @tiptap/extension-code-block-lowlight
npm install lowlight @tiptap/extension-code-block-lowlight
```

## Settings

### lowlight

You should provide the `lowlight` module to this extension. Decoupling the `lowlight`
package from the extension allows the client application to control which
version of lowlight it uses and which programming language packages it needs to load.

```js
import { lowlight } from 'lowlight/lib/core'

CodeBlockLowlight.configure({
lowlight,
})
```

### HTMLAttributes
Custom HTML attributes that should be added to the rendered HTML tag.

Expand Down
38 changes: 20 additions & 18 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 2 additions & 2 deletions packages/extension-code-block-lowlight/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -21,12 +21,12 @@
"dist"
],
"peerDependencies": {
"@tiptap/core": "^2.0.0-beta.1"
"@tiptap/core": "^2.0.0-beta.1",
"lowlight": ">=1.20.0"
},
"dependencies": {
"@tiptap/extension-code-block": "^2.0.0-beta.37",
"@types/lowlight": "^0.0.3",
"lowlight": "^1.20.0",
"prosemirror-model": "^1.16.1",
"prosemirror-state": "^1.3.4",
"prosemirror-view": "^1.23.6"
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
import lowlight from 'lowlight/lib/core'
import CodeBlock, { CodeBlockOptions } from '@tiptap/extension-code-block'
import { LowlightPlugin } from './lowlight-plugin'

Expand All @@ -11,7 +10,7 @@ export const CodeBlockLowlight = CodeBlock.extend<CodeBlockLowlightOptions>({
addOptions() {
return {
...this.parent?.(),
lowlight,
lowlight: {},
defaultLanguage: null,
}
},
Expand Down
8 changes: 8 additions & 0 deletions packages/extension-code-block-lowlight/src/lowlight-plugin.ts
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,15 @@ function getDecorations({
return DecorationSet.create(doc, decorations)
}

function isFunction(param: Function) {
return typeof param === 'function'
}

export function LowlightPlugin({ name, lowlight, defaultLanguage }: { name: string, lowlight: any, defaultLanguage: string | null | undefined }) {
if (!['highlight', 'highlightAuto', 'listLanguages'].every(api => isFunction(lowlight[api]))) {
throw Error('You should provide an instance of lowlight to use the code-block-lowlight extension')
}

return new Plugin({
key: new PluginKey('lowlight'),

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,18 +25,18 @@ describe('code block highlight', () => {

beforeEach(() => {
Frontmatter = CodeBlockLowlight
.configure({ lowlight })
.extend({
name: 'frontmatter',
})
.configure({ lowlight })

editor = new Editor({
element: createEditorEl(),
extensions: [
Document,
Text,
Paragraph,
CodeBlockLowlight,
CodeBlockLowlight.configure({ lowlight }),
Frontmatter,
],
content: {
Expand Down

0 comments on commit f0c85b9

Please sign in to comment.