Преобразование HTML в обычный текст с сохранением ссылок жирным шрифтом и курсивом в Javascript

Я настраиваю API для отправки электронного письма, используя содержимое публикации в качестве тела электронного письма. Текстовый редактор, используемый для публикации, сохраняет текст в формате HTML, поэтому мне нужно было преобразовать результат в обычный текст. Есть и другие вопросы, которые дали мне решение, но я хотел бы сохранить из исходного текста жирный текст, курсив и ссылки. Итак, вот что у меня есть:

  • Текст тестовой публикации:

Это жирный текст.


Это обычный текст.


Это курсив.


Это ссылка.

Затем в сценарии у меня есть следующая функция:

function htmlToText(html){
    //remove code brakes and tabs
    html = html.replace(/\n/g, "");
    html = html.replace(/\t/g, "");

    //keep html brakes and tabs
    html = html.replace(/</td>/g, "\t");
    html = html.replace(/</table>/g, "\n");
    html = html.replace(/</tr>/g, "\n");
    html = html.replace(/</p>/g, "\n");
    html = html.replace(/</div>/g, "\n");
    html = html.replace(/</h>/g, "\n");
    html = html.replace(/<br>/g, "\n"); html = html.replace(/<br( )*/>/g, "\n");
    html = html.replace(/<a.*href = "(.*?)".*>(.*?)</a>/gi, " $2 (Link->$1) ");

    //parse html into text
    var dom = (new DOMParser()).parseFromString('<!doctype html><body>' + html, 'text/html');
    return dom.body.textContent;
}

Это дает мне простой текст с хорошими разрывами строк, но мне было интересно, смогу ли я получить жирный шрифт, курсив и ссылки.

Спасибо.

Вы должны стилизовать ссылку с помощью CSS, обычный текст не имеет стилей.

Teemu 19.03.2022 10:46

Вот почему это в первую очередь называется текстом простой ^^

connexo 19.03.2022 11:08
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
2
55
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

У меня было немного свободного времени, и я поиграл. Вот что я придумал:

const copy=document.createElement("div");
copy.innerHTML=container.innerHTML.replace(/\n/g," ").replace(/[\t\n]+/g,"");
const tags = {B:["**","**",1],  // [<prefix>, <postfix>, <sequence-number> ]
            I:["*","*",2],
            H2:["##","\n",3],
            P:["\n","\n",4],
            DIV:["","\n",5],
            TD:["","\t",6]};
[...copy.querySelectorAll(Object.keys(tags).join(","))]
 .sort((a,b)=>tags[a.tagName][2]-tags[b.tagName][2])
 .forEach(e=>{
 const [a,b]=tags[e.tagName];
 e.innerHTML=(e.matches("TD:first-child") ? "\n": a) + e.innerHTML + b;
});
console.info(copy.textContent.replace(/^ */mg,""));
<div id = "container">
<H2>Second level heading</H2>
<div><div>
A <b>first div</b> with a 
<a href = "abc.html">link (abc)</a> and a
<p>paragraph having itself another <a href = "def.html">link (def)</a> in it.</p>
</div>
</div>
And here is some more <i>"lost" text</i> ...
<table>
<tr><td>one</td><td><b>two</b></td><td>three</td></tr>
<tr><td>a</td><td>b</td><td>c</td></tr>
<tr><td>d</td><td>e</td><td>f</td></tr>
</table>
</div>

Вместо того, чтобы использовать регулярное выражение для «разбора» html, я решил на самом деле обрабатывать его способом DOM: я создаю новый элемент div (copy), в который я вставляю исходный .innerHTML. Затем для определенных типов элементов я определяю некоторые пре- и постфиксы, которые должны окружать исходный .innerHTML. Они хранятся в tags и применяются к только что созданному элементу div.

Это делается путем выбора всех «специальных» элементов (указанных клавишами tags) и их обработки в заданном последовательном порядке. После этого я просто возвращаю .textContent измененного copy элемента.

Обычный текст не может отображать полужирное или курсивное оформление текста. По этой причине я использовал модификаторы в стиле уценки (*: курсив, **: полужирный).

Другие вопросы по теме