diff --git a/src/components/md-deck/CardLayer.tsx b/src/components/md-deck/CardLayer.tsx index 76948b3..b99573a 100644 --- a/src/components/md-deck/CardLayer.tsx +++ b/src/components/md-deck/CardLayer.tsx @@ -1,53 +1,44 @@ -import { For } from 'solid-js'; +import {createMemo, For} from 'solid-js'; import { marked } from '../../markdown'; import { getLayerStyle } from './hooks/dimensions'; -import type { LayerConfig, Dimensions, CardData } from './types'; +import type { CardData } from './types'; +import {DeckStore} from "./hooks/deckStore"; +import {processVariables} from "../utils/csv-loader"; export interface CardLayerProps { - layers: LayerConfig[]; - dimensions: Dimensions; cardData: CardData; - showBounds?: boolean; -} - -/** - * 处理 body 内容中的 {{prop}} 语法并解析 markdown - */ -function processBody(body: string, currentRow: CardData): string { - const processedBody = body.replace(/\{\{(\w+)\}\}/g, (_, key) => currentRow[key] || ''); - return marked.parse(processedBody) as string; -} - -/** - * 渲染 layer 内容 - */ -function renderLayerContent(layer: { prop: string }, cardData: CardData): string { - const content = cardData[layer.prop] || ''; - return processBody(content, cardData); + store: DeckStore; } export function CardLayer(props: CardLayerProps) { + const layers = createMemo(() => props.store.state.layerConfigs.filter((l) => l.visible)); + const dimensions = () => props.store.state.dimensions!; + const showBounds = () => props.store.state.isEditing; + + function renderLayerContent(content: string) { + return marked.parse(processVariables(content, props.cardData, props.store.state.cards)) as string; + } return ( - + {(layer) => { return ( <>
- {props.showBounds && ( + {showBounds() && (
)} diff --git a/src/components/md-deck/CardPreview.tsx b/src/components/md-deck/CardPreview.tsx index 93576b3..568dbce 100644 --- a/src/components/md-deck/CardPreview.tsx +++ b/src/components/md-deck/CardPreview.tsx @@ -15,7 +15,6 @@ export function CardPreview(props: CardPreviewProps) { const { store } = props; const currentCard = createMemo(() => store.state.cards[store.state.activeTab]); - const visibleLayers = createMemo(() => store.state.layerConfigs.filter((l) => l.visible)); const selectionStyle = createMemo(() => getSelectionBoxStyle(store.state.selectStart, store.state.selectEnd, store.state.dimensions) ); @@ -78,10 +77,8 @@ export function CardPreview(props: CardPreviewProps) {
diff --git a/src/components/md-deck/hooks/deckStore.ts b/src/components/md-deck/hooks/deckStore.ts index 3237e08..262c289 100644 --- a/src/components/md-deck/hooks/deckStore.ts +++ b/src/components/md-deck/hooks/deckStore.ts @@ -1,6 +1,6 @@ import { createStore } from 'solid-js/store'; import { calculateDimensions } from './dimensions'; -import { loadCSV } from '../../utils/csv-loader'; +import { loadCSV, CSV } from '../../utils/csv-loader'; import { initLayerConfigs, formatLayers } from './layer-parser'; import type { CardData, LayerConfig, Dimensions } from '../types'; @@ -32,7 +32,7 @@ export interface DeckState { dimensions: Dimensions | null; // 卡牌数据 - cards: CardData[]; + cards: CSV; activeTab: number; // 图层配置 diff --git a/src/components/utils/csv-loader.ts b/src/components/utils/csv-loader.ts index 2a74488..baa454a 100644 --- a/src/components/utils/csv-loader.ts +++ b/src/components/utils/csv-loader.ts @@ -91,7 +91,7 @@ export function processVariables (body: string, currentRow const frontMatter = csv.frontmatter; if(key in row) return row[key]; if(frontMatter && key in frontMatter) return frontMatter[key]; - return ''; + return `{{${key}}}`; } return body.replace(/\{\{(\w+)\}\}/g, (_, key) => `${replaceProp(key)}`);