Разделение текста по значению смещения и его перемещение в новый объект - PullRequest
0 голосов
/ 22 мая 2019

Я хотел бы разбить paragraph на основе его entityRanges.

Таким образом, фактический абзац выглядит так:

{
    type: 'paragraph',
    depth: 1,
    text: 'Do you have questions or comments and do you wish to contact ABC? Please visit our customer support page.',
    entityRanges: [{
        type: 'LINK',
        offset: 83,
        length: 16,
        data: {
            target: '_self',
            url: '/index.htm'
        }
    }]
}

Но мои ожидаемые результаты должны быть такими, как показано ниже,

{
    type: 'paragraph',
    depth: 1,
    text: 'Do you have questions or comments and do you wish to contact ABC? Please visit our customer support page.',
    entityRanges: [{
        type: 'LINK',
        offset: 83,
        length: 16,
        data: {
            target: '_self',
            url: '/index.htm'
        }
    }],
    embbeded: [{
        type: 'text',
        text: 'Do you have questions or comments and do you wish to contact ABC? Please visit our '
    }, {
        type: 'link',
        text: 'customer support',
        data: {
            target: '_self',
            url: '/index.htm'
        }
    }, {
        type: 'text',
        text: 'page.'
    }]
}

Я хотел разбить text на несколько частей на основе его значений offset & length.

В соответствии с примером customer support - это смещениезначение.

Таким образом, он должен разбиваться в следующем порядке

  1. У вас есть вопросы или комментарии и вы хотите связаться с ABC?Пожалуйста, посетите нашу
  2. страницу поддержки клиентов
  3. .

Все вышеперечисленные детали необходимо подтолкнуть к новому объекту embbeded.

1 Ответ

0 голосов
/ 22 мая 2019

Надеюсь, я вас правильно понял:

const data = {
  "text": "Do you have questions or comments and do you wish to contact ABC? Please visit our customer support page.",
  "entityRanges": [{
      "type": "LINK",
      "offset": 83,
      "length": 16,
      "data": {
        "target": "_self",
        "url": "/index.htm"
      }
    },
    {
      "type": "LINK",
      "offset": 7,
      "length": 4,
      "data": {
        "target": "_self",
        "url": "/index.htm"
      }
    }
  ]
};

function breakData(data) {
  let {
    entityRanges,
    text
  } = data;
  const result = [];
  let finalPart = '';
  let index = 0;

  entityRanges
    .sort((a, b) => a.offset - b.offset)
    .forEach((styleRange) => {
      const {
        offset,
        length,
        type,
        data
      } = styleRange;
      const firstPart = text.substring(index, offset);

      result.push({
        type: 'text',
        text: firstPart,
      });

      index = offset + length; // + 1;
      const secondPart = text.substring(offset, index);
      result.push({
        type,
        data,
        text: secondPart,
      });

      finalPart = text.substring(index);
    });

  if (finalPart) {
    result.push({
      type: 'text',
      text: finalPart,
    });
  }
  data.embbeded = result;

  return data;
}

const result = breakData(data);

document.body.innerHTML = '' + JSON.stringify(result, null, ' ') + '
;
...