feat: tip component

This commit is contained in:
2026-02-08 09:48:39 +03:30
parent aba27e78fb
commit ec6e121993
3 changed files with 92 additions and 4 deletions
+30 -2
View File
@@ -12,7 +12,7 @@ import type { Element } from "domhandler";
// ─── انواع بلاک (برای گسترش بعدی) ───────────────────────────────────────────
/** نام نوع بلاک؛ با افزودن بلاک جدید این یونیون را گسترش دهید. */
export type BlockType = "collapse" | "blockquote" | "pullquote" | "code";
export type BlockType = "collapse" | "blockquote" | "pullquote" | "tip" | "code";
/** Payload بلاک collapse (سوالات متداول / accordion). */
export interface CollapseBlockPayload {
@@ -27,13 +27,21 @@ export interface BlockquoteBlockPayload {
citation?: string;
}
/** Payload بلاک tip (نکته / اینفو با variant: info, warn, danger). */
export interface TipBlockPayload {
variant: "info" | "warn" | "danger";
/** HTML محتوای داخل بلاک (عنوان + متن). */
content: string;
}
/** Payload بلاک code — بعداً پیاده‌سازی می‌شود. */
// export interface CodeBlockPayload { ... }
/** یونیون همهٔ payloadها برای تایپ‌امن رندر. */
export type BlockPayload =
| CollapseBlockPayload
| BlockquoteBlockPayload;
| BlockquoteBlockPayload
| TipBlockPayload;
// | CodeBlockPayload
// ─── سگمنت خروجی برای لایه رندر ─────────────────────────────────────────────
@@ -143,6 +151,20 @@ function extractPullquotePayload(
return { content, citation };
}
/**
* استخراج از بلاک tip وردپرس: div.wp-block-group.tip با کلاس tip-info | tip-warn | tip-danger.
*/
function extractTipPayload($: cheerio.CheerioAPI, el: Element): TipBlockPayload {
const $el = $(el);
const classList = ($el.attr("class") ?? "").split(/\s+/);
let variant: "info" | "warn" | "danger" = "info";
if (classList.includes("tip-danger")) variant = "danger";
else if (classList.includes("tip-warn")) variant = "warn";
else if (classList.includes("tip-info")) variant = "info";
const content = ($el.html() ?? "").trim();
return { variant, content };
}
/**
* ثبت همهٔ بلاک‌های شناخته‌شده.
* برای بلاک‌های جدید (مثلاً blockquote, code) فقط یک مورد جدید به این آرایه اضافه کنید.
@@ -168,6 +190,11 @@ export const BLOCK_DEFINITIONS: BlockDefinition[] = [
selector: "figure.wp-block-pullquote",
extract: extractPullquotePayload as BlockDefinition["extract"],
},
{
blockType: "tip",
selector: "div.wp-block-group.tip",
extract: extractTipPayload as BlockDefinition["extract"],
},
// { blockType: "code", selector: "pre.wp-block-code", extract: extractCodePayload },
];
@@ -215,6 +242,7 @@ export function discoverBlocks(html: string): DiscoveredContent {
collapse: [],
blockquote: [],
pullquote: [],
tip: [],
code: [],
};