• 基于vue的tiptap编辑器插件(三)


    美化编辑器

            前面介绍过,tiptap是一个headless的编辑器,所以他自己是没有样式的,我们需要手动给他添加一些样式。文档中介绍了三种美化编辑器的方式,听我一一道来。

    Option 1: Style the plain HTML

            整个编辑器都是被一个class为ProseMirror的div所包裹,所以你可以直接在样式表中对class为ProseMirror的样式进行修饰。比如:

    1. /* Scoped to the editor */
    2. .ProseMirror p {
    3. margin: 1em 0;
    4. }

    Option 2: Add custom classes

            你可以自定义一些class,然后将这些class通过配置项载入到对应扩展或editor本身中。如果是editor本身,则如下所示

    1. new Editor({
    2. editorProps: {
    3. attributes: {
    4. class: 'prose prose-sm sm:prose lg:prose-lg xl:prose-2xl mx-auto focus:outline-none',
    5. },
    6. },
    7. })

    如果是一些扩展,如下所示

    1. new Editor({
    2. extensions: [
    3. Document,
    4. Paragraph.configure({
    5. HTMLAttributes: {
    6. class: 'my-custom-paragraph',
    7. },
    8. }),
    9. Heading.configure({
    10. HTMLAttributes: {
    11. class: 'my-custom-heading',
    12. },
    13. }),
    14. Text,
    15. ],
    16. })

    Option 3: Customize the HTML

            你也可以在原来扩展的基础上做一些样式上的修改,成为一个新的扩展

    1. import Bold from '@tiptap/extension-bold'
    2. const CustomBold = Bold.extend({
    3. renderHTML({ HTMLAttributes }) {
    4. // Original:
    5. // return ['strong', HTMLAttributes, 0]
    6. return ['b', HTMLAttributes, 0]
    7. },
    8. })
    9. new Editor({
    10. extensions: [
    11. // …
    12. CustomBold,
    13. ],
    14. })

            这三种方式,我比较推荐第二种,一方面这种配置的方式比较灵活,另一方面,可以操作到node上,比第一种方式更精细也不容易出错。

    输出

            这一节主要讲,如何将编辑器里的内容转化为json字符串或者html字符串存储起来,以及如何把这两种格式的字符串传给编辑器并呈现内容。

    导出字符串

            如何得到当前编辑器文本内容的json字符串?

            const json = editor.getJSON()

            同理对于html字符串:

            const html = editor.getHTML()

            如何将json字符串传给编辑器并显示内容?

            首先,你要知道,getJSON()返回的json字符串是类似以下的格式:

    1. {
    2. "type": "doc",
    3. "content": [
    4. {
    5. "type": "paragraph",
    6. "content": [
    7. {
    8. "type": "text",
    9. "text": "Wow, this editor instance exports its content as JSON."
    10. }
    11. ]
    12. }
    13. ]
    14. }

    符合这样的格式,且最外层的"type"为"doc",那么将该字符串content传入以下方法

    editor.commands.setContent(content)

    同理对于html字符串

    editor.commands.setContent(`

    Example Text

    `)

    监听改变

            如果你想监听内容的改变,那么可以这么做

    1. const editor = new Editor({
    2. // intial content
    3. content: `

      Example Content

      `
      ,
    4. // triggered on every change
    5. onUpdate: ({ editor }) => {
    6. const json = editor.getJSON()
    7. // send the content to an API here
    8. },
    9. })

    HTML与JSON格式的转换

            在某些场景下,需要对内容的格式进行转换。比如,用户在web端的某个tiptap编辑器内写了内容并以json格式保存至远程服务器中,而远程服务器需要根据这段内容生成html并返回,那么就需要用到这个功能。

    JSON转HTML

    1. <script>
    2. // Option 1: Browser + server-side
    3. import Bold from '@tiptap/extension-bold'
    4. // Option 2: Browser-only (lightweight)
    5. // import { generateHTML } from '@tiptap/core'
    6. import Document from '@tiptap/extension-document'
    7. import Paragraph from '@tiptap/extension-paragraph'
    8. import Text from '@tiptap/extension-text'
    9. import { generateHTML } from '@tiptap/html'
    10. const json = {
    11. type: 'doc',
    12. content: [
    13. {
    14. type: 'paragraph',
    15. content: [
    16. {
    17. type: 'text',
    18. text: 'Example ',
    19. },
    20. {
    21. type: 'text',
    22. marks: [
    23. {
    24. type: 'bold',
    25. },
    26. ],
    27. text: 'Text',
    28. },
    29. ],
    30. },
    31. ],
    32. }
    33. export default {
    34. computed: {
    35. output() {
    36. return generateHTML(json, [
    37. Document,
    38. Paragraph,
    39. Text,
    40. Bold,
    41. // other extensions …
    42. ])
    43. },
    44. },
    45. }
    46. script>

    显示结果:

    Example Text

    HTML转JSON

    1. <script>
    2. // Option 1: Browser + server-side
    3. import Bold from '@tiptap/extension-bold'
    4. // Option 2: Browser-only (lightweight)
    5. // import { generateHTML } from '@tiptap/core'
    6. import Document from '@tiptap/extension-document'
    7. import Paragraph from '@tiptap/extension-paragraph'
    8. import Text from '@tiptap/extension-text'
    9. import { generateHTML } from '@tiptap/html'
    10. const json = {
    11. type: 'doc',
    12. content: [
    13. {
    14. type: 'paragraph',
    15. content: [
    16. {
    17. type: 'text',
    18. text: 'Example ',
    19. },
    20. {
    21. type: 'text',
    22. marks: [
    23. {
    24. type: 'bold',
    25. },
    26. ],
    27. text: 'Text',
    28. },
    29. ],
    30. },
    31. ],
    32. }
    33. export default {
    34. computed: {
    35. output() {
    36. return generateHTML(json, [
    37. Document,
    38. Paragraph,
    39. Text,
    40. Bold,
    41. // other extensions …
    42. ])
    43. },
    44. },
    45. }
    46. script>

    显示结果:

    Example Text

  • 相关阅读:
    正则表达式——4.贪婪与非贪婪搜寻、特殊字符
    爬虫-浏览器自动化
    Windbg分析高内存占用问题
    简单易用的任务队列-beanstalkd
    【监督学习】基于合取子句进化算法(CCEA)和析取范式进化算法(DNFEA)解决分类问题(Matlab代码实现)
    LeetCode 2652. 倍数求和【数学,容斥原理】简单
    【融云出海白皮书免费看】-巴西成增量潜力「应许之地」
    05_2D3D转换
    虚函数 纯虚函数 抽象类
    音频——I2S TDM 模式(六)
  • 原文地址:https://blog.csdn.net/hlz_12345/article/details/126525518