@tiptap/extension-code-block-lowlight 3.4.4 → 3.4.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +2 -2
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/package.json +7 -7
- package/src/lowlight-plugin.ts +10 -12
package/dist/index.cjs
CHANGED
|
@@ -44,7 +44,7 @@ var import_state = require("@tiptap/pm/state");
|
|
|
44
44
|
var import_view = require("@tiptap/pm/view");
|
|
45
45
|
var import_core2 = __toESM(require("highlight.js/lib/core"), 1);
|
|
46
46
|
function parseNodes(nodes, className = []) {
|
|
47
|
-
return nodes.
|
|
47
|
+
return nodes.flatMap((node) => {
|
|
48
48
|
const classes = [...className, ...node.properties ? node.properties.className : []];
|
|
49
49
|
if (node.children) {
|
|
50
50
|
return parseNodes(node.children, classes);
|
|
@@ -53,7 +53,7 @@ function parseNodes(nodes, className = []) {
|
|
|
53
53
|
text: node.value,
|
|
54
54
|
classes
|
|
55
55
|
};
|
|
56
|
-
})
|
|
56
|
+
});
|
|
57
57
|
}
|
|
58
58
|
function getHighlightNodes(result) {
|
|
59
59
|
return result.value || result.children || [];
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/code-block-lowlight.ts","../src/lowlight-plugin.ts"],"sourcesContent":["import { CodeBlockLowlight } from './code-block-lowlight.js'\n\nexport * from './code-block-lowlight.js'\n\nexport default CodeBlockLowlight\n","import type { CodeBlockOptions } from '@tiptap/extension-code-block'\nimport CodeBlock from '@tiptap/extension-code-block'\n\nimport { LowlightPlugin } from './lowlight-plugin.js'\n\nexport interface CodeBlockLowlightOptions extends CodeBlockOptions {\n /**\n * The lowlight instance.\n */\n lowlight: any\n}\n\n/**\n * This extension allows you to highlight code blocks with lowlight.\n * @see https://tiptap.dev/api/nodes/code-block-lowlight\n */\nexport const CodeBlockLowlight = CodeBlock.extend<CodeBlockLowlightOptions>({\n addOptions() {\n return {\n ...this.parent?.(),\n lowlight: {},\n languageClassPrefix: 'language-',\n exitOnTripleEnter: true,\n exitOnArrowDown: true,\n defaultLanguage: null,\n enableTabIndentation: false,\n tabSize: 4,\n HTMLAttributes: {},\n }\n },\n\n addProseMirrorPlugins() {\n return [\n ...(this.parent?.() || []),\n LowlightPlugin({\n name: this.name,\n lowlight: this.options.lowlight,\n defaultLanguage: this.options.defaultLanguage,\n }),\n ]\n },\n})\n","import { findChildren } from '@tiptap/core'\nimport type { Node as ProsemirrorNode } from '@tiptap/pm/model'\nimport { Plugin, PluginKey } from '@tiptap/pm/state'\nimport { Decoration, DecorationSet } from '@tiptap/pm/view'\n// @ts-ignore\nimport highlight from 'highlight.js/lib/core'\n\nfunction parseNodes(nodes: any[], className: string[] = []): { text: string; classes: string[] }[] {\n return nodes
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/code-block-lowlight.ts","../src/lowlight-plugin.ts"],"sourcesContent":["import { CodeBlockLowlight } from './code-block-lowlight.js'\n\nexport * from './code-block-lowlight.js'\n\nexport default CodeBlockLowlight\n","import type { CodeBlockOptions } from '@tiptap/extension-code-block'\nimport CodeBlock from '@tiptap/extension-code-block'\n\nimport { LowlightPlugin } from './lowlight-plugin.js'\n\nexport interface CodeBlockLowlightOptions extends CodeBlockOptions {\n /**\n * The lowlight instance.\n */\n lowlight: any\n}\n\n/**\n * This extension allows you to highlight code blocks with lowlight.\n * @see https://tiptap.dev/api/nodes/code-block-lowlight\n */\nexport const CodeBlockLowlight = CodeBlock.extend<CodeBlockLowlightOptions>({\n addOptions() {\n return {\n ...this.parent?.(),\n lowlight: {},\n languageClassPrefix: 'language-',\n exitOnTripleEnter: true,\n exitOnArrowDown: true,\n defaultLanguage: null,\n enableTabIndentation: false,\n tabSize: 4,\n HTMLAttributes: {},\n }\n },\n\n addProseMirrorPlugins() {\n return [\n ...(this.parent?.() || []),\n LowlightPlugin({\n name: this.name,\n lowlight: this.options.lowlight,\n defaultLanguage: this.options.defaultLanguage,\n }),\n ]\n },\n})\n","import { findChildren } from '@tiptap/core'\nimport type { Node as ProsemirrorNode } from '@tiptap/pm/model'\nimport { Plugin, PluginKey } from '@tiptap/pm/state'\nimport { Decoration, DecorationSet } from '@tiptap/pm/view'\n// @ts-ignore\nimport highlight from 'highlight.js/lib/core'\n\nfunction parseNodes(nodes: any[], className: string[] = []): { text: string; classes: string[] }[] {\n return nodes.flatMap(node => {\n const classes = [...className, ...(node.properties ? node.properties.className : [])]\n\n if (node.children) {\n return parseNodes(node.children, classes)\n }\n\n return {\n text: node.value,\n classes,\n }\n })\n}\n\nfunction getHighlightNodes(result: any) {\n // `.value` for lowlight v1, `.children` for lowlight v2\n return result.value || result.children || []\n}\n\nfunction registered(aliasOrLanguage: string) {\n return Boolean(highlight.getLanguage(aliasOrLanguage))\n}\n\nfunction getDecorations({\n doc,\n name,\n lowlight,\n defaultLanguage,\n}: {\n doc: ProsemirrorNode\n name: string\n lowlight: any\n defaultLanguage: string | null | undefined\n}) {\n const decorations: Decoration[] = []\n\n findChildren(doc, node => node.type.name === name).forEach(block => {\n let from = block.pos + 1\n const language = block.node.attrs.language || defaultLanguage\n const languages = lowlight.listLanguages()\n\n const nodes =\n language && (languages.includes(language) || registered(language) || lowlight.registered?.(language))\n ? getHighlightNodes(lowlight.highlight(language, block.node.textContent))\n : getHighlightNodes(lowlight.highlightAuto(block.node.textContent))\n\n parseNodes(nodes).forEach(node => {\n const to = from + node.text.length\n\n if (node.classes.length) {\n const decoration = Decoration.inline(from, to, {\n class: node.classes.join(' '),\n })\n\n decorations.push(decoration)\n }\n\n from = to\n })\n })\n\n return DecorationSet.create(doc, decorations)\n}\n\n// eslint-disable-next-line @typescript-eslint/no-unsafe-function-type\nfunction isFunction(param: any): param is Function {\n return typeof param === 'function'\n}\n\nexport function LowlightPlugin({\n name,\n lowlight,\n defaultLanguage,\n}: {\n name: string\n lowlight: any\n defaultLanguage: string | null | undefined\n}) {\n if (!['highlight', 'highlightAuto', 'listLanguages'].every(api => isFunction(lowlight[api]))) {\n throw Error('You should provide an instance of lowlight to use the code-block-lowlight extension')\n }\n\n const lowlightPlugin: Plugin<any> = new Plugin({\n key: new PluginKey('lowlight'),\n\n state: {\n init: (_, { doc }) =>\n getDecorations({\n doc,\n name,\n lowlight,\n defaultLanguage,\n }),\n apply: (transaction, decorationSet, oldState, newState) => {\n const oldNodeName = oldState.selection.$head.parent.type.name\n const newNodeName = newState.selection.$head.parent.type.name\n const oldNodes = findChildren(oldState.doc, node => node.type.name === name)\n const newNodes = findChildren(newState.doc, node => node.type.name === name)\n\n if (\n transaction.docChanged &&\n // Apply decorations if:\n // selection includes named node,\n ([oldNodeName, newNodeName].includes(name) ||\n // OR transaction adds/removes named node,\n newNodes.length !== oldNodes.length ||\n // OR transaction has changes that completely encapsulte a node\n // (for example, a transaction that affects the entire document).\n // Such transactions can happen during collab syncing via y-prosemirror, for example.\n transaction.steps.some(step => {\n // @ts-ignore\n return (\n // @ts-ignore\n step.from !== undefined &&\n // @ts-ignore\n step.to !== undefined &&\n oldNodes.some(node => {\n // @ts-ignore\n return (\n // @ts-ignore\n node.pos >= step.from &&\n // @ts-ignore\n node.pos + node.node.nodeSize <= step.to\n )\n })\n )\n }))\n ) {\n return getDecorations({\n doc: transaction.doc,\n name,\n lowlight,\n defaultLanguage,\n })\n }\n\n return decorationSet.map(transaction.mapping, transaction.doc)\n },\n },\n\n props: {\n decorations(state) {\n return lowlightPlugin.getState(state)\n },\n },\n })\n\n return lowlightPlugin\n}\n"],"mappings":"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","names":["import_core","highlight","CodeBlock"]}
|
package/dist/index.js
CHANGED
|
@@ -7,7 +7,7 @@ import { Plugin, PluginKey } from "@tiptap/pm/state";
|
|
|
7
7
|
import { Decoration, DecorationSet } from "@tiptap/pm/view";
|
|
8
8
|
import highlight from "highlight.js/lib/core";
|
|
9
9
|
function parseNodes(nodes, className = []) {
|
|
10
|
-
return nodes.
|
|
10
|
+
return nodes.flatMap((node) => {
|
|
11
11
|
const classes = [...className, ...node.properties ? node.properties.className : []];
|
|
12
12
|
if (node.children) {
|
|
13
13
|
return parseNodes(node.children, classes);
|
|
@@ -16,7 +16,7 @@ function parseNodes(nodes, className = []) {
|
|
|
16
16
|
text: node.value,
|
|
17
17
|
classes
|
|
18
18
|
};
|
|
19
|
-
})
|
|
19
|
+
});
|
|
20
20
|
}
|
|
21
21
|
function getHighlightNodes(result) {
|
|
22
22
|
return result.value || result.children || [];
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/code-block-lowlight.ts","../src/lowlight-plugin.ts","../src/index.ts"],"sourcesContent":["import type { CodeBlockOptions } from '@tiptap/extension-code-block'\nimport CodeBlock from '@tiptap/extension-code-block'\n\nimport { LowlightPlugin } from './lowlight-plugin.js'\n\nexport interface CodeBlockLowlightOptions extends CodeBlockOptions {\n /**\n * The lowlight instance.\n */\n lowlight: any\n}\n\n/**\n * This extension allows you to highlight code blocks with lowlight.\n * @see https://tiptap.dev/api/nodes/code-block-lowlight\n */\nexport const CodeBlockLowlight = CodeBlock.extend<CodeBlockLowlightOptions>({\n addOptions() {\n return {\n ...this.parent?.(),\n lowlight: {},\n languageClassPrefix: 'language-',\n exitOnTripleEnter: true,\n exitOnArrowDown: true,\n defaultLanguage: null,\n enableTabIndentation: false,\n tabSize: 4,\n HTMLAttributes: {},\n }\n },\n\n addProseMirrorPlugins() {\n return [\n ...(this.parent?.() || []),\n LowlightPlugin({\n name: this.name,\n lowlight: this.options.lowlight,\n defaultLanguage: this.options.defaultLanguage,\n }),\n ]\n },\n})\n","import { findChildren } from '@tiptap/core'\nimport type { Node as ProsemirrorNode } from '@tiptap/pm/model'\nimport { Plugin, PluginKey } from '@tiptap/pm/state'\nimport { Decoration, DecorationSet } from '@tiptap/pm/view'\n// @ts-ignore\nimport highlight from 'highlight.js/lib/core'\n\nfunction parseNodes(nodes: any[], className: string[] = []): { text: string; classes: string[] }[] {\n return nodes
|
|
1
|
+
{"version":3,"sources":["../src/code-block-lowlight.ts","../src/lowlight-plugin.ts","../src/index.ts"],"sourcesContent":["import type { CodeBlockOptions } from '@tiptap/extension-code-block'\nimport CodeBlock from '@tiptap/extension-code-block'\n\nimport { LowlightPlugin } from './lowlight-plugin.js'\n\nexport interface CodeBlockLowlightOptions extends CodeBlockOptions {\n /**\n * The lowlight instance.\n */\n lowlight: any\n}\n\n/**\n * This extension allows you to highlight code blocks with lowlight.\n * @see https://tiptap.dev/api/nodes/code-block-lowlight\n */\nexport const CodeBlockLowlight = CodeBlock.extend<CodeBlockLowlightOptions>({\n addOptions() {\n return {\n ...this.parent?.(),\n lowlight: {},\n languageClassPrefix: 'language-',\n exitOnTripleEnter: true,\n exitOnArrowDown: true,\n defaultLanguage: null,\n enableTabIndentation: false,\n tabSize: 4,\n HTMLAttributes: {},\n }\n },\n\n addProseMirrorPlugins() {\n return [\n ...(this.parent?.() || []),\n LowlightPlugin({\n name: this.name,\n lowlight: this.options.lowlight,\n defaultLanguage: this.options.defaultLanguage,\n }),\n ]\n },\n})\n","import { findChildren } from '@tiptap/core'\nimport type { Node as ProsemirrorNode } from '@tiptap/pm/model'\nimport { Plugin, PluginKey } from '@tiptap/pm/state'\nimport { Decoration, DecorationSet } from '@tiptap/pm/view'\n// @ts-ignore\nimport highlight from 'highlight.js/lib/core'\n\nfunction parseNodes(nodes: any[], className: string[] = []): { text: string; classes: string[] }[] {\n return nodes.flatMap(node => {\n const classes = [...className, ...(node.properties ? node.properties.className : [])]\n\n if (node.children) {\n return parseNodes(node.children, classes)\n }\n\n return {\n text: node.value,\n classes,\n }\n })\n}\n\nfunction getHighlightNodes(result: any) {\n // `.value` for lowlight v1, `.children` for lowlight v2\n return result.value || result.children || []\n}\n\nfunction registered(aliasOrLanguage: string) {\n return Boolean(highlight.getLanguage(aliasOrLanguage))\n}\n\nfunction getDecorations({\n doc,\n name,\n lowlight,\n defaultLanguage,\n}: {\n doc: ProsemirrorNode\n name: string\n lowlight: any\n defaultLanguage: string | null | undefined\n}) {\n const decorations: Decoration[] = []\n\n findChildren(doc, node => node.type.name === name).forEach(block => {\n let from = block.pos + 1\n const language = block.node.attrs.language || defaultLanguage\n const languages = lowlight.listLanguages()\n\n const nodes =\n language && (languages.includes(language) || registered(language) || lowlight.registered?.(language))\n ? getHighlightNodes(lowlight.highlight(language, block.node.textContent))\n : getHighlightNodes(lowlight.highlightAuto(block.node.textContent))\n\n parseNodes(nodes).forEach(node => {\n const to = from + node.text.length\n\n if (node.classes.length) {\n const decoration = Decoration.inline(from, to, {\n class: node.classes.join(' '),\n })\n\n decorations.push(decoration)\n }\n\n from = to\n })\n })\n\n return DecorationSet.create(doc, decorations)\n}\n\n// eslint-disable-next-line @typescript-eslint/no-unsafe-function-type\nfunction isFunction(param: any): param is Function {\n return typeof param === 'function'\n}\n\nexport function LowlightPlugin({\n name,\n lowlight,\n defaultLanguage,\n}: {\n name: string\n lowlight: any\n defaultLanguage: string | null | undefined\n}) {\n if (!['highlight', 'highlightAuto', 'listLanguages'].every(api => isFunction(lowlight[api]))) {\n throw Error('You should provide an instance of lowlight to use the code-block-lowlight extension')\n }\n\n const lowlightPlugin: Plugin<any> = new Plugin({\n key: new PluginKey('lowlight'),\n\n state: {\n init: (_, { doc }) =>\n getDecorations({\n doc,\n name,\n lowlight,\n defaultLanguage,\n }),\n apply: (transaction, decorationSet, oldState, newState) => {\n const oldNodeName = oldState.selection.$head.parent.type.name\n const newNodeName = newState.selection.$head.parent.type.name\n const oldNodes = findChildren(oldState.doc, node => node.type.name === name)\n const newNodes = findChildren(newState.doc, node => node.type.name === name)\n\n if (\n transaction.docChanged &&\n // Apply decorations if:\n // selection includes named node,\n ([oldNodeName, newNodeName].includes(name) ||\n // OR transaction adds/removes named node,\n newNodes.length !== oldNodes.length ||\n // OR transaction has changes that completely encapsulte a node\n // (for example, a transaction that affects the entire document).\n // Such transactions can happen during collab syncing via y-prosemirror, for example.\n transaction.steps.some(step => {\n // @ts-ignore\n return (\n // @ts-ignore\n step.from !== undefined &&\n // @ts-ignore\n step.to !== undefined &&\n oldNodes.some(node => {\n // @ts-ignore\n return (\n // @ts-ignore\n node.pos >= step.from &&\n // @ts-ignore\n node.pos + node.node.nodeSize <= step.to\n )\n })\n )\n }))\n ) {\n return getDecorations({\n doc: transaction.doc,\n name,\n lowlight,\n defaultLanguage,\n })\n }\n\n return decorationSet.map(transaction.mapping, transaction.doc)\n },\n },\n\n props: {\n decorations(state) {\n return lowlightPlugin.getState(state)\n },\n },\n })\n\n return lowlightPlugin\n}\n","import { CodeBlockLowlight } from './code-block-lowlight.js'\n\nexport * from './code-block-lowlight.js'\n\nexport default CodeBlockLowlight\n"],"mappings":"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","names":[]}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tiptap/extension-code-block-lowlight",
|
|
3
3
|
"description": "code block extension for tiptap",
|
|
4
|
-
"version": "3.4.
|
|
4
|
+
"version": "3.4.5",
|
|
5
5
|
"homepage": "https://tiptap.dev",
|
|
6
6
|
"keywords": [
|
|
7
7
|
"tiptap",
|
|
@@ -32,16 +32,16 @@
|
|
|
32
32
|
],
|
|
33
33
|
"devDependencies": {
|
|
34
34
|
"lowlight": "^3.3.0",
|
|
35
|
-
"@tiptap/core": "^3.4.
|
|
36
|
-
"@tiptap/
|
|
37
|
-
"@tiptap/
|
|
35
|
+
"@tiptap/core": "^3.4.5",
|
|
36
|
+
"@tiptap/extension-code-block": "^3.4.5",
|
|
37
|
+
"@tiptap/pm": "^3.4.5"
|
|
38
38
|
},
|
|
39
39
|
"peerDependencies": {
|
|
40
40
|
"lowlight": "^2 || ^3",
|
|
41
41
|
"highlight.js": "^11",
|
|
42
|
-
"@tiptap/core": "^3.4.
|
|
43
|
-
"@tiptap/extension-code-block": "^3.4.
|
|
44
|
-
"@tiptap/pm": "^3.4.
|
|
42
|
+
"@tiptap/core": "^3.4.5",
|
|
43
|
+
"@tiptap/extension-code-block": "^3.4.5",
|
|
44
|
+
"@tiptap/pm": "^3.4.5"
|
|
45
45
|
},
|
|
46
46
|
"repository": {
|
|
47
47
|
"type": "git",
|
package/src/lowlight-plugin.ts
CHANGED
|
@@ -6,20 +6,18 @@ import { Decoration, DecorationSet } from '@tiptap/pm/view'
|
|
|
6
6
|
import highlight from 'highlight.js/lib/core'
|
|
7
7
|
|
|
8
8
|
function parseNodes(nodes: any[], className: string[] = []): { text: string; classes: string[] }[] {
|
|
9
|
-
return nodes
|
|
10
|
-
|
|
11
|
-
const classes = [...className, ...(node.properties ? node.properties.className : [])]
|
|
9
|
+
return nodes.flatMap(node => {
|
|
10
|
+
const classes = [...className, ...(node.properties ? node.properties.className : [])]
|
|
12
11
|
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
12
|
+
if (node.children) {
|
|
13
|
+
return parseNodes(node.children, classes)
|
|
14
|
+
}
|
|
16
15
|
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
.flat()
|
|
16
|
+
return {
|
|
17
|
+
text: node.value,
|
|
18
|
+
classes,
|
|
19
|
+
}
|
|
20
|
+
})
|
|
23
21
|
}
|
|
24
22
|
|
|
25
23
|
function getHighlightNodes(result: any) {
|