4.7 KiB
4.7 KiB
Я хочу изменить логику формирования Markdown-отчета в методе buildMarkdownFromReport класса MarketingAnalysisService.
Сейчас метод создает Markdown-таблицы (ASCII tables) для отображения данных (сезонность, конкуренты и т.д.). Мне нужно изменить это поведение: вместо таблиц я хочу встраивать JSON-данные для графиков прямо в текст отчета, используя Markdown code blocks.
Требования:
- Найди метод
buildMarkdownFromReport. - В местах, где сейчас формируются таблицы (например, для "seasonality", "competitors", "audienceSegmentation", "channelsPotential", "conversionFunnel"), замени генерацию таблиц на вставку JSON-блока.
- Формат блока должен быть таким:
{ ... json data ... }
Где `chart-type` — это идентификатор типа графика (например, `json:seasonality`, `json:competitors`, `json:funnel`). Это поможет фронтенду понять, какой компонент графика рисовать.
4\. Используй поле `objectMapper` для сериализации соответствующих карт/списков (chartsData) в JSON-строку перед вставкой.
5\. Убедись, что JSON отформатирован красиво (pretty print), чтобы он был читаемым, если смотреть на raw text.
**Пример желаемого результата в Markdown:**
Вместо таблицы с месяцами, должно получиться:
### 1️⃣ Сезонность спроса (12 месяцев)
```json:seasonality
{
"Январь": 70,
"Февраль": 60,
...
}
```
Пожалуйста, рефактори метод `buildMarkdownFromReport` соответствующим образом.
Как это будет работать (для твоего понимания)
После того как Cursor применит изменения, твой метод buildMarkdownFromReport будет выглядеть примерно так (псевдокод):
// Внутри buildMarkdownFromReport
// ... заголовки ...
if (chartsData.containsKey("seasonality")) {
markdown.append("### 1️⃣ Сезонность спроса (12 месяцев)\n\n");
// Сериализуем данные в JSON
String jsonStr = objectMapper.writerWithDefaultPrettyPrinter()
.writeValueAsString(chartsData.get("seasonality"));
// Вставляем как блок кода с уникальным идентификатором языка
markdown.append("```json:seasonality\n");
markdown.append(jsonStr);
markdown.append("\n```\n\n");
}
Что нужно сделать на Фронтенде?
Так как мы изменили подход, фронтенд (React/Vue) должен использовать библиотеку для рендеринга Markdown (например, react-markdown).
Тебе нужно будет написать кастомный рендерер для элементов code.
Пример логики для фронтенда (React + react-markdown):
import ReactMarkdown from 'react-markdown';
import { SeasonalityChart, FunnelChart } from './MyCharts'; // Твои компоненты графиков
const MarkdownRender = ({ content }) => {
return (
<ReactMarkdown
components={{
code({ node, inline, className, children, ...props }) {
const match = /language-(\w+):(\w+)/.exec(className || '');
// match[1] будет "json", match[2] будет тип графика (seasonality, funnel и т.д.)
if (!inline && match && match[1] === 'json') {
const chartType = match[2];
const data = JSON.parse(String(children).replace(/\n$/, ''));
switch (chartType) {
case 'seasonality':
return <SeasonalityChart data={data} />;
case 'funnel':
return <FunnelChart data={data} />;
default:
return <pre>{children}</pre>; // Фоллбек
}
}
return (
<code className={className} {...props}>
{children}
</code>
);
},
}}
>
{content}
</ReactMarkdown>
);
};