feat: tip component
This commit is contained in:
+30
-2
@@ -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: [],
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user