Сериализаторы здравомыслия в одиннадцать (11 лет)

#sanity #eleventy

Вопрос:

Я внедрил CMS Sanity в Eleventy, и у меня есть рабочий фильтр 11ty, который преобразует переносимый текст в HTML.

У меня есть достаточное количество пользовательских блоков, и поэтому я также передаю сериализаторы. Однако я не в состоянии заставить работать один из этих сериализаторов.

Вот мой код:

Дальше .eleventy.js

     // Portable Text to HTML Filter for Sanity
eleventyConfig.addFilter('sanityToHTML', function(value) {
    return blocksToHtml({
      blocks: value,
      serializers: serializers
    })
  })
 

На serializers.js

 const { h } = require("@sanity/block-content-to-html");

module.exports = {
  types: {
      cta: ({ node }) => {
        return h(
          'a',
          {
            className:
              'bg-yellow-500 text-white',
            href: node.ctaUrl,
          },
          node.ctaText,
        )
      },
      infoText: ({ node }) => {
        return h(
          'p',
          {
            className:
              'bg-blue-500 text-white',
          },
          node.bodyInfo.map(children => children.text).join(''),
        )
      },
    },
  }
 

Одиннадцать опутывает <p class="bg-blue-500 text-white"></p> , но без содержания.

Я перепробовал все комбинации, какие только мог придумать.

Мой пост в блоге о здравомыслии имеет следующую структуру:

 {
  "_createdAt": "2021-09-14T11:25:05Z",
  "_id": "89ff5403-326b-4db1-8752-04ea1c85f114",
  "_rev": "7dkOKJtWoyCn0kHUhHzZu7",
  "_type": "post",
  "_updatedAt": "2021-09-20T06:38:14Z",
  "body": [
    {
      "_key": "f84e932860bf",
      "_type": "block",
      "children": [
        {
          "_key": "bd29bce1dda1",
          "_type": "span",
          "marks": [],
          "text": ""
        }
      ],
      "markDefs": [
        {
          "_key": "38aa715c6214",
          "_type": "link",
          "href": "........"
        }
      ],
      "style": "normal"
    },
    {
      "_key": "bf5d17f3da91",
      "_type": "cta",
      "ctaText": "test",
      "ctaUrl": ".........."
    },
    {
      "_key": "595873ddfc54",
      "_type": "block",
      "children": [
        {
          "_key": "ba794ddbef68",
          "_type": "span",
          "marks": [],
          "text": ""
        }
      ],
      "markDefs": [
        {
          "_key": "38aa715c6214",
          "_type": "link",
          "href": ".........."
        }
      ],
      "style": "normal"
    },
    {
      "_key": "8acb94638c0c",
      "_type": "infoText",
      "bodyInfo": [
        {
          "_key": "6b6e533e67fd",
          "_type": "block",
          "children": [
            {
              "_key": "3593ad3abdf9",
              "_type": "span",
              "marks": [],
              "text": "test test info"
            }
          ],
          "markDefs": [],
          "style": "normal"
        }
      ]
    },
    .....etc
 

Есть какие-нибудь советы о том, как заставить его отображать фактический контент?

Ответ №1:

Я полагаю, что проблема в вашем infoText сериализаторе. В этой функции вы сопоставляете node.bodyInfo , а затем получаете доступ к text свойству для объектов внутри bodyInfo . Однако объекты в bodyInfo действительности не имеют text свойства.

 {
  "_key": "8acb94638c0c",
  "_type": "infoText",
  "bodyInfo": [
    {
      "_key": "6b6e533e67fd",
      "_type": "block",
      "children": [
        {
          "_key": "3593ad3abdf9",
          "_type": "span",
          "marks": [],
          "text": "test test info"
        }
      ],
      "markDefs": [],
      "style": "normal"
    }
  ]
}
 

Строка , которую вы пытаетесь извлечь, находится на bodyInfo[].children[].text , нет bodyInfo[].text . Чтобы исправить это, вам может потребоваться обновить infoText сериализатор.

 infoText: ({ node }) => {
  return h(
    'p',
    {
      className: 'bg-blue-500 text-white',
    },
    node.bodyInfo.map(({children}) => children.map(child => child.text)).flat().join(''),
  )
}
 

В этой версии мы сначала сопоставляем bodyInfo , что является массивом, а затем разрушаем children свойство из объектов внутри. Затем мы сопоставляем это, чтобы получить наши внутренние строки, а затем выравниваем массив для объединения.