NoteJS/public/test-external-links.html
Fovway ce803b4c20 Добавлена поддержка внешних ссылок в рендерере marked.js
- Реализована функция для определения внешних ссылок и переопределен рендеринг ссылок, чтобы открывать их в новом окне.
- Добавлены обработчики для внешних ссылок, которые учитывают режим PWA.
- Обновлены стили для внешних ссылок, добавлен значок для визуального обозначения.
2025-10-26 14:52:22 +07:00

161 lines
5.9 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Тест внешних ссылок - NoteJS</title>
<link rel="stylesheet" href="style.css" />
<link rel="manifest" href="manifest.json" />
<meta name="theme-color" content="#007bff" />
</head>
<body>
<div class="container">
<h1>Тест внешних ссылок в PWA</h1>
<div class="textNote">
<h2>Примеры ссылок:</h2>
<h3>Внутренние ссылки (открываются в PWA):</h3>
<p><a href="/notes">Перейти к заметкам</a></p>
<p><a href="/profile">Перейти к профилю</a></p>
<h3>Внешние ссылки (открываются в браузере):</h3>
<p>
<a
href="https://www.google.com"
target="_blank"
rel="noopener noreferrer"
class="external-link"
>Google</a
>
</p>
<p>
<a
href="https://github.com"
target="_blank"
rel="noopener noreferrer"
class="external-link"
>GitHub</a
>
</p>
<p>
<a
href="https://www.wikipedia.org"
target="_blank"
rel="noopener noreferrer"
class="external-link"
>Wikipedia</a
>
</p>
<h3>Markdown ссылки:</h3>
<p>Внутренняя ссылка: [Заметки](/notes)</p>
<p>Внешняя ссылка: [Google](https://www.google.com)</p>
<p>Внешняя ссылка: [GitHub](https://github.com)</p>
</div>
<div class="test-results">
<h3>Ожидаемое поведение:</h3>
<ul>
<li>Внутренние ссылки должны открываться в том же PWA окне</li>
<li>Внешние ссылки должны открываться в браузере (новой вкладке)</li>
<li>Внешние ссылки должны иметь иконку ↗</li>
<li>
В PWA режиме внешние ссылки должны принудительно открываться в
браузере
</li>
</ul>
</div>
</div>
<script src="https://cdn.jsdelivr.net/npm/marked/marked.min.js"></script>
<script>
// Настройка marked.js для поддержки внешних ссылок
function setupMarkedRenderer() {
// Функция для определения внешних ссылок
function isExternalLink(href) {
try {
const url = new URL(href);
return url.origin !== window.location.origin;
} catch (e) {
// Если URL невалидный, считаем его внутренним
return false;
}
}
// Создаем renderer для marked
const renderer = new marked.Renderer();
// Переопределяем рендеринг ссылок для открытия внешних ссылок в браузере
const originalLink = renderer.link.bind(renderer);
renderer.link = function (href, title, text) {
const isExternal = isExternalLink(href);
if (isExternal) {
// Внешние ссылки открываем в браузере
return `<a href="${href}" title="${
title || ""
}" target="_blank" rel="noopener noreferrer" class="external-link">${text}</a>`;
} else {
// Внутренние ссылки обрабатываем как обычно
return originalLink(href, title, text);
}
};
// Настраиваем marked
marked.setOptions({
gfm: true,
breaks: true,
renderer: renderer,
html: true,
});
}
// Функция для добавления обработчиков внешних ссылок
function addExternalLinkListeners() {
// Обработчики для внешних ссылок
document.querySelectorAll(".external-link").forEach((linkElement) => {
// Проверяем, не добавлен ли уже обработчик
if (linkElement._externalClickHandler) {
return; // Пропускаем, если обработчик уже добавлен
}
// Создаем новый обработчик
linkElement._externalClickHandler = function (event) {
// Для PWA приложений открываем ссылку в браузере
if (
window.matchMedia("(display-mode: standalone)").matches ||
window.navigator.standalone === true
) {
event.preventDefault();
window.open(this.href, "_blank", "noopener,noreferrer");
}
// В обычном браузере оставляем стандартное поведение (target="_blank")
};
linkElement.addEventListener(
"click",
linkElement._externalClickHandler
);
});
}
// Инициализация
document.addEventListener("DOMContentLoaded", function () {
setupMarkedRenderer();
// Обрабатываем markdown ссылки
const markdownLinks = document.querySelectorAll(".textNote p");
markdownLinks.forEach((p) => {
if (p.textContent.includes("[") && p.textContent.includes("](")) {
const htmlContent = marked.parse(p.textContent);
p.innerHTML = htmlContent;
}
});
addExternalLinkListeners();
});
</script>
</body>
</html>