Для интеграции библиотеки Markdown-it в проект на Angular необходимо сначала установить сам пакет через npm:
npm install markdown-it
После установки можно импортировать библиотеку в компонент или сервис:
import MarkdownIt from 'markdown-it';
Создание экземпляра Markdown-it позволяет настроить парсер в соответствии с требованиями проекта:
const md = new MarkdownIt({
html: true, // разрешает HTML-теги в тексте
linkify: true, // автоматически преобразует URL в ссылки
typographer: true // включение типографических замен
});
В Angular часто используют привязку данных для динамического отображения Markdown. В компоненте создаётся метод для преобразования текста:
export class MarkdownComponent {
rawMarkdown: string = '# Заголовок\n\nПример **Markdown** текста';
htmlContent: string;
private md = new MarkdownIt({ html: true, linkify: true });
constructor() {
this.htmlContent = this.md.render(this.rawMarkdown);
}
}
В шаблоне Angular результат можно выводить с использованием
innerHTML:
<div [innerHTML]="htmlContent"></div>
Важно помнить о безопасности: innerHTML уязвим для
XSS-атак. Для защиты рекомендуется использовать
DomSanitizer:
import { DomSanitizer, SafeHtml } from '@angular/platform-browser';
export class MarkdownComponent {
htmlContent: SafeHtml;
constructor(private sanitizer: DomSanitizer) {
const rawHtml = this.md.render(this.rawMarkdown);
this.htmlContent = this.sanitizer.bypassSecurityTrustHtml(rawHtml);
}
}
Markdown-it поддерживает систему плагинов, позволяющих добавлять
новые синтаксические возможности. Подключение плагина выполняется через
метод use():
import mila from 'markdown-it-link-attributes';
this.md.use(mila, {
pattern: /^https?:\/\//,
attrs: {
target: '_blank',
rel: 'noopener'
}
});
Это позволяет автоматически добавлять атрибуты ко всем внешним ссылкам. Аналогично подключаются другие плагины для таблиц, сносок, подсветки синтаксиса.
Для проектов с динамическим контентом (например, Markdown, получаемый
из API) важно корректно обновлять HTML при изменении исходного текста. В
Angular это реализуется через геттеры или ngOnChanges:
ngOnChanges(changes: SimpleChanges) {
if (changes['rawMarkdown']) {
const rawHtml = this.md.render(this.rawMarkdown);
this.htmlContent = this.sanitizer.bypassSecurityTrustHtml(rawHtml);
}
}
Для отображения блоков кода с подсветкой можно использовать связку Markdown-it и highlight.js:
import hljs from 'highlight.js';
const md = new MarkdownIt({
highlight: function (str, lang) {
if (lang && hljs.getLanguage(lang)) {
try {
return hljs.highlight(str, { language: lang }).value;
} catch {}
}
return ''; // использование обычного текста, если подсветка не доступна
}
});
В шаблоне Angular блоки <pre><code> будут
содержать CSS-классы highlight.js, что позволяет применять стили
подсветки.
При работе с большими текстами Markdown рекомендуется создавать один экземпляр Markdown-it на уровне сервиса и использовать его для всех компонентов. Это предотвращает многократное создание парсера и ускоряет рендеринг:
@Injectable({ providedIn: 'root' })
export class MarkdownService {
private md = new MarkdownIt({ html: true, linkify: true });
render(markdown: string): string {
return this.md.render(markdown);
}
}
Компоненты получают HTML через сервис:
this.htmlContent = this.sanitizer.bypassSecurityTrustHtml(
this.markdownService.render(this.rawMarkdown)
);
block.ruler и inline.ruler можно добавлять
собственный синтаксис.Эта библиотека обеспечивает гибкую и высокопроизводительную работу с Markdown, легко масштабируется и позволяет тонко настраивать поведение для любого Angular-приложения.