Воспроизведение текста HTML с использованием сохраненных индексов

#javascript #html

#javascript #HTML

Вопрос:

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

Lorem Ipsum — это просто фиктивный текст, используемый в индустрии печати и набора текста.

Предположим, что этот текст сохранен в базе данных и загружается при входе пользователя в систему. Пользователь также может выделить области в тексте, чтобы создать следующий html:

 <p>
<mark>Lorem Ipsum</mark> is simply dummy <mark>text of the printing</mark> and typesetting industry. 
</p>
  

где были выделены «Lorem Ipsum» и «текст печати». У меня работает javascript, который вставляет <mark> теги в нужное место, теперь мне нужно найти способ по существу воссоздать выделенные области при повторном входе пользователя в систему. Один из способов — сохранить весь html-элемент с <mark> тегами, но поскольку эти абзацы могут быть очень длинными, мне это кажется крайне неэффективным, особенно если учесть, что многие пользователи будут использовать это, и вам придется копировать такой объем контента для каждого пользователя.

Я подумал, может быть, другой способ — сохранить индексы того, где в строке встречаются <mark> теги, но это звучит сложно, потому что индексы меняются, как только вы вставляете <mark> теги в строку, а в (самой) оригинальной сохраненной строке нет никакого html (в базе данных).

Есть ли более простой способ, о котором я не думаю?

Комментарии:

1. Я просто хочу убедиться, что у меня это правильно: пользователь может выделять части текста, которые остаются выделенными, и вы хотите, чтобы основные моменты сохранялись, когда пользователь возвращается на страницу?

2. ДА. В настоящее время в базе данных хранится строка текста. Теперь пользователь входит в систему, выделяет часть текста, и я хочу иметь возможность сохранять эти части, чтобы при повторном входе пользователя в систему эти части оставались выделенными. В идеале без сохранения всего абзаца с html-тегами, поскольку мои абзацы могут стать длинными, и, кроме того, исходный неосвещенный html-текст уже сохранен в базе данных, мне просто по существу нужно сохранить расположение mark тегов.

3. Возможным подходом может быть сохранение индекса начала каждого тега метки открытия И закрытия независимо от ДРУГИХ тегов метки. Восстановление всего выделенного текста может быть выполнено путем чтения исходного текста с начала, пока вы не дойдете до сохраненного индекса, вставьте тег Open или Close (альтернативным способом) и переходите к чтению исходного текста без изменения индекса. Более того, при таком подходе, когда пользователь снимает пометку с текста, вам не нужно беспокоиться об изменении индексов других выделенных областей.

Ответ №1:

Вы можете получить индексы каждой <mark> / </mark> пары следующим образом:

 var s = '<mark>Lorem Ipsum</mark> is simply dummy <mark>text of the printing</mark> and typesetting industry.';

var a = [];
while(/<mark>/.test(s)) {
  a.push(s.indexOf('<mark>'));
  s= s.replace('<mark>','');
  a.push(s.indexOf('</mark>'));
  s= s.replace('</mark>','');
}
  

Обратите внимание, как теги удаляются при разборе строки.

Затем вы можете восстановить теги, выполнив итерацию в обратном направлении по массиву:

 a.reverse().forEach(function(v, i) {
  if(i%2===0) {
    s = s.slice(0,v)   '</mark>'   s.slice(v);
  } else{
    s = s.slice(0,v)   '<mark>'   s.slice(v);
  }
});
  

Таким образом, вы можете сохранить в базе данных только сам массив, а затем восстановить метки, когда пользователь перезагружает страницу.

 var s = '<mark>Lorem Ipsum</mark> is simply dummy <mark>text of the printing</mark> and typesetting industry.';

var a = [];
while(/<mark>/.test(s)) {
  a.push(s.indexOf('<mark>'));
  s= s.replace('<mark>','');
  a.push(s.indexOf('</mark>'));
  s= s.replace('</mark>','');
}
console.log('marks removed: '   s);

a.reverse().forEach(function(v, i) {
  if(i%2===0) {
    s = s.slice(0,v)   '</mark>'   s.slice(v);
  } else{
    s = s.slice(0,v)   '<mark>'   s.slice(v);
  }
});
console.log('marks restored: '   s);  

Комментарии:

1. Отлично, это потрясающе!