From 4b3bc3e024f8a688cfb48867e9fac0c250467d02 Mon Sep 17 00:00:00 2001 From: Fovway Date: Tue, 4 Nov 2025 11:12:38 +0700 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D1=8B=20=D0=BD=D0=BE=D0=B2=D1=8B=D0=B5=20=D0=BF=D0=B0?= =?UTF-8?q?=D1=80=D0=B0=D0=BC=D0=B5=D1=82=D1=80=D1=8B=20=D0=B4=D0=BB=D1=8F?= =?UTF-8?q?=20=D0=BA=D0=BE=D0=BC=D0=BF=D0=BE=D0=BD=D0=B5=D0=BD=D1=82=D0=B0?= =?UTF-8?q?=20BrowserRouter=20=D0=B2=20App.tsx=20=D0=B4=D0=BB=D1=8F=20?= =?UTF-8?q?=D0=BF=D0=BE=D0=B4=D0=B4=D0=B5=D1=80=D0=B6=D0=BA=D0=B8=20=D0=B1?= =?UTF-8?q?=D1=83=D0=B4=D1=83=D1=89=D0=B8=D1=85=20=D1=84=D1=83=D0=BD=D0=BA?= =?UTF-8?q?=D1=86=D0=B8=D0=B9.=20=D0=9E=D0=B1=D0=BD=D0=BE=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=B0=20=D0=BB=D0=BE=D0=B3=D0=B8=D0=BA=D0=B0=20?= =?UTF-8?q?=D0=BE=D0=B1=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D0=BA=D0=B8=20=D1=82?= =?UTF-8?q?=D0=BE=D0=BA=D0=B5=D0=BD=D0=BE=D0=B2=20=D0=B2=20markdown.ts=20?= =?UTF-8?q?=D0=B4=D0=BB=D1=8F=20=D1=83=D0=BB=D1=83=D1=87=D1=88=D0=B5=D0=BD?= =?UTF-8?q?=D0=B8=D1=8F=20=D0=BE=D0=B1=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D0=BA?= =?UTF-8?q?=D0=B8=20=D0=B1=D0=BB=D0=BE=D0=BA=D0=BE=D0=B2=D1=8B=D1=85=20?= =?UTF-8?q?=D0=B8=20=D0=B8=D0=BD=D0=BB=D0=B0=D0=B9=D0=BD=20=D1=8D=D0=BB?= =?UTF-8?q?=D0=B5=D0=BC=D0=B5=D0=BD=D1=82=D0=BE=D0=B2,=20=D0=B2=D0=BA?= =?UTF-8?q?=D0=BB=D1=8E=D1=87=D0=B0=D1=8F=20=D0=BE=D0=B1=D1=80=D0=B0=D0=B1?= =?UTF-8?q?=D0=BE=D1=82=D0=BA=D1=83=20=D0=BE=D1=88=D0=B8=D0=B1=D0=BE=D0=BA?= =?UTF-8?q?=20=D0=B8=20=D0=B8=D1=81=D0=BF=D0=BE=D0=BB=D1=8C=D0=B7=D0=BE?= =?UTF-8?q?=D0=B2=D0=B0=D0=BD=D0=B8=D0=B5=20fallback=20=D0=B4=D0=BB=D1=8F?= =?UTF-8?q?=20=D0=BF=D1=83=D1=81=D1=82=D0=BE=D0=B3=D0=BE=20=D1=82=D0=B5?= =?UTF-8?q?=D0=BA=D1=81=D1=82=D0=B0.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dev-dist/sw.js | 2 +- src/App.tsx | 7 ++++- src/utils/markdown.ts | 65 +++++++++++++++++++++++++++++++++++++++---- 3 files changed, 67 insertions(+), 7 deletions(-) diff --git a/dev-dist/sw.js b/dev-dist/sw.js index d3e568e..278d092 100644 --- a/dev-dist/sw.js +++ b/dev-dist/sw.js @@ -82,7 +82,7 @@ define(['./workbox-9dc17825'], (function (workbox) { 'use strict'; "revision": "3ca0b8505b4bec776b69afdba2768812" }, { "url": "/index.html", - "revision": "0.3mraah3n9jg" + "revision": "0.6dag44kodlo" }], {}); workbox.cleanupOutdatedCaches(); workbox.registerRoute(new workbox.NavigationRoute(workbox.createHandlerBoundToURL("/index.html"), { diff --git a/src/App.tsx b/src/App.tsx index 9b7c16e..6d6a875 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -19,7 +19,12 @@ const AppContent: React.FC = () => { <> - + } /> } /> diff --git a/src/utils/markdown.ts b/src/utils/markdown.ts index ce2c9b8..409690f 100644 --- a/src/utils/markdown.ts +++ b/src/utils/markdown.ts @@ -56,14 +56,69 @@ renderer.listitem = function(token: any) { const tokens = token.tokens || []; let text: string; - // Используем this.parser.parseInline для обработки токенов (this указывает на renderer) + // Блоковые типы токенов, которые нельзя обрабатывать через parseInline + const blockTypes = ['list', 'blockquote', 'code', 'heading', 'paragraph', 'hr', 'table']; + + // Обрабатываем токены вручную, избегая parseInline для блоковых элементов if (tokens.length > 0) { try { - text = this.parser.parseInline(tokens); + // Разделяем токены на inline и блоковые + const inlineTokens: any[] = []; + const blockTokens: any[] = []; + + tokens.forEach((t: any) => { + if (blockTypes.includes(t.type)) { + blockTokens.push(t); + } else { + inlineTokens.push(t); + } + }); + + // Обрабатываем inline токены только если они есть + let inlineText = ''; + if (inlineTokens.length > 0) { + try { + inlineText = this.parser.parseInline(inlineTokens); + } catch (inlineError) { + // Если ошибка при обработке inline, просто игнорируем их + console.warn('Error parsing inline tokens in listitem:', inlineError); + } + } + + // Обрабатываем блоковые токены через parser + let blockText = ''; + if (blockTokens.length > 0) { + try { + blockText = this.parser.parse(blockTokens); + } catch (blockError) { + // Если ошибка при обработке блоков, обрабатываем через стандартный renderer + console.warn('Error parsing block tokens in listitem:', blockError); + // Пытаемся обработать каждый блок отдельно + blockText = blockTokens.map((bt: any) => { + try { + return this.parser.parse([bt]); + } catch { + return ''; + } + }).join(''); + } + } + + text = inlineText + blockText; + + // Если после обработки текст пустой, используем fallback + if (!text || text.trim() === '') { + text = token.text || ''; + } } catch (error) { - // Если ошибка, используем fallback - console.warn('Error parsing list item tokens:', error); - text = token.text || ''; + // Если общая ошибка, используем fallback - обрабатываем через стандартный parser + try { + text = this.parser.parse(tokens); + } catch (parseError) { + // Последний fallback - используем raw text + console.warn('Error parsing list item tokens:', parseError); + text = token.text || token.raw || ''; + } } } else { text = token.text || '';