Рендеринг JSON из Editor.js в HTML

Рендеринг JSON из Editor.js в HTML

KOD

Editor.js — это редактор форматированного текста, который вы можете встраивать в свои приложения. Он обеспечивает чистый, отполированный интерфейс, который выглядит современным и настраиваемым.

Главной преимущество редактора это хранение и представление данных в JSON формате. Особенно поймут те у кого есть и веб-версия продукта и мобильное приложение. Для этого EditorJs рассматривает каждую часть данных как блоки. Блок может быть изображением, абзацем, заголовком и даже вашим персональным блоком редактора.

Все круто, но проблема в том, что EditorJs выводит «JSON» вместо HTML. Теперь JSON хорош, когда вам нужно сохранить его или отправить по сети. Но вы не можете использовать на своем веб-сайте, если не проанализируете его в HTML. К сожалению, на данный момент EditorJs не предоставляет способ отображения этих данных на веб-странице. Однако, с другой стороны, вам остается генерировать HTML таким образом, который лучше всего подходит для вашего проекта. Это звучит лучше всего, но все же оставляет вас с написанием своего парсера.

Есть два варианта: либо написать собственный парсер с нуля, либо использовать какое-нибудь готовое решение. Одно из таких решений — editorjs-html. Он парсит сгенерированный вами editorjs JSON в HTML.

Преимущества использования editorjs-html

  • Вы можете использовать его с любым проектом или фреймворком.
  • Парсить внутри браузера, во время сборки или даже на вашем сервере.
  • Поддержка базовых блоков HTML. Вы даже можете переопределить это поведение синтаксического анализа.
  • Расширьте свои собственные блоки, просто предоставив функцию парсера.
  • Сгенерируйте HTML, который подходит вашему проекту, а не сделайте ваш проект подходящим для библиотеки.

Поскольку editorjs-html выводит простой HTML, вы можете оформить его так, как хотите.

Использование editorjs-html

В этом примере мы просто будем использовать образцы данных JSON, сгенерированные на основном веб-сайте EditorJS.

Пример данных

{
   "time":1616613916918,
   "blocks":[
      {
         "type":"header",
         "data":{
            "text":"Три в одном (сначала код): NestJs, GraphQL и Mongoose",
            "level":3
         }
      },
      {
         "type":"paragraph",
         "data":{
            "text":"Я решил написать этот пост в блоге после работы над личным проектом. Когда я начал это, я подумал о том, как создать прочную архитектуру для создания"
         }
      },
      {
         "type":"header",
         "data":{
            "text":"Почему GraphQL?",
            "level":4
         }
      },
      {
         "type":"paragraph",
         "data":{
            "text":"Больше нет избыточной и недостаточной загрузки;Быстрые итерации продукта во внешнем интерфейсе;Информативная аналитика на бэкэнде;Преимущества системы схем и типов;"
         }
      },
      {
         "type":"paragraph",
         "data":{
            "text":"<a href=\"https://www.howtographql.com/basics/1-graphql-is-the-better-rest/\" target=\"_blank\">Как в GraphQL</a>"
         }
      }
   ],
   "version":"2.19.3"
}

Установите editorjs-html

$ npm install editorjs-html
  • Для браузера используйте CDN или предварительно созданный скрипт, предоставленный в основном репозитории.

Парсинг данных editorjs в HTML.

// Пример кастомного блока
const block = {
  type: 'custom',
  data: {
    text: "Hello World"
  }
};

// Функция парсера для этого блока. 

function customBlockParser(block){
  return `<span> ${block.data.text} </span>`;
}

// Передайте его на этапе инициализации. 
const edjsParser = edjsHTML({custom: customBlockParser});

/** Note: Примечание: ключ объекта parserOptions
   должен соответствовать типу блока.
*/

// Парсинг блока
console.log(edjsParser.parse({block}));

Пользовательские функции парсера

editorjs-html также поддерживает пользовательские функции парсера для ваших пользовательских блоков editorjs. Просто определите их и передайте в editorjsHTML (parserFunctions).

Использование демонстрации в браузере

index.html

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width">
    <title>repl.it</title>
    <link href="style.css" rel="stylesheet" type="text/css" />
    <script src ="https://cdn.jsdelivr.net/npm/editorjs-html@2.0.0/build/edjsHTML.js"> </script>
  </head>
  <body>
    <div id="container"></div>
  </body>
  <script src="script.js"></script>
</html>

script.js

// sample editorjs generated data 
// the result after JSON.parse() of API request
const editorjsData = {
  time: 1589651463720,
  blocks: [
  {
    type: "paragraph",
    data: {
      text: "some text"
    }
  },
  { 
    type: "paragraph",
    data: {
      text: "more text"
   }
  }, {
    type: "paragraph",
    data: {
      text: "some more text"
    }
  }
]}

// parser function for paragraph block type
const paragraph = (block) => {
  return `<p> ${block.data.text} </p>`;
};

// pass the parser function to the intializer function
const edjsParser = edjsHTML({ paragraph });

// render data to html
const html = edjsParser.parse(editorjsData);
console.log(html);

// select a dom element to parse data into
const container = document.querySelector('#container');
console.log(container);
// push the data into a DOM element
container.innerHTML= html.reduce( (a,c)=> a+c, '' );

Report Page