UNPKG

@n8body/tiptap-spoiler

Version:
75 lines (66 loc) 2.92 kB
# tiptap-spoiler Just a simple React extension (actually two extensions) for [TipTap](https://github.com/ueberdosis/tiptap) to add spoilers to the editor. ### Installing Via [npm](https://www.npmjs.com/package/@n8body/tiptap-spoiler): ``` npm i @n8body/tiptap-spoiler ``` ### What's in there The extensions are - ```SpoilerEditor``` and ```SpoilerOutput```. The names are pretty self-descriptive... You can provide the following options to them: | ```SpoilerEditor``` Options | Type | Optional | Description | | ------ | ------ | ----- | ----- | | spoilerClass | ```string``` | No | Class name for the spoiler in the editor | | inputRegex | ```RegExp``` | Yes | Input regular expression, the default one matches ```\|\| text \|\|``` | | pasteRegex | ```RegExp``` | Yes | Same as the previous one, but for pasting | | inline | ```boolean``` | Yes | Sets extension's ```inline``` and ```group``` properties. Default: ```true``` | | inclusive | ```boolean``` | Yes | Sets extension's ```inclusive``` property. Default: ```false``` | and | ```SpoilerOutput``` Options | Type | Optional | Description | | ------ | ------ | ----- | ----- | | spoilerClass | ```string``` | No | Main spoiler class | | spoilerOpenClass | ```string``` | No | Open spoiler class | | spoilerCloseClass | ```string``` | No | Closed spoiler class | | as | ```ElementType``` | Yes | Tag to be rendered. Default: ```'span'``` | | inline | ```boolean``` | Yes | Sets extension's ```inline``` and ```group``` properties. Default: ```true``` | | content | ```string``` | Yes | Sets extension's ```content``` property. Default: ```'inline*'``` | To be said: you can omit some of the classes, depending on your CSS - just be sure, that it works properly. Also there is a function ```cleanSpoilersHTML``` that removes ```class``` atrtributes from ```spoiler``` tags. ### Example Exemplary TipTap instance for editing: ```ts const editor = useEditor({ extensions: [ SpoilerEditor.configure({ spoilerClass: 'beautiful-spoiler', inputRegex: /(?:^|\s)((?:\[spoiler\])((?:[^||]+))(?:\[\/spoiler\]))$/, // to match [spoiler]text[/spoiler] pasteRegex: /(?:^|\s)((?:\[spoiler\])((?:[^||]+))(?:\[\/spoiler\]))/g, // same here inclusive: true, }) ], content: '', editable: true, }) ``` ...and for output: ```ts const editor = useEditor({ extensions: [ SpoilerOutput.configure({ spoilerClass: 'beautiful-spoiler', spoilerOpenClass: 'open-spoiler', spoilerCloseClass: 'closed-spoiler', as: 'code', inline: false, }) ], content: '<p>The best website for manga is <spoiler>manga.ovh</spoiler></p>', editable: false, }) ``` And to get clean HTML from your editor: ```ts cleanSpoilersHTML(editor.getHTML()) ``` ### That's it! If you have any questions, don't hesitate to contact me or open an issue.