Skip to main content

sevenmark_parser/ast/
elements.rs

1use serde::Serialize;
2
3use super::{Element, Expression, MentionType, Parameters, ResolvedMediaInfo, Span};
4
5// === Leaf nodes (span only) ===
6
7/// Null 매크로 [null]
8#[derive(Debug, Clone, Serialize)]
9pub struct NullElement {
10    #[cfg_attr(not(feature = "include_locations"), serde(skip_serializing))]
11    pub span: Span,
12}
13
14/// 각주 위치 [fn]
15#[derive(Debug, Clone, Serialize)]
16pub struct FootnoteRefElement {
17    #[cfg_attr(not(feature = "include_locations"), serde(skip_serializing))]
18    pub span: Span,
19}
20
21/// 현재 시간 [now]
22#[derive(Debug, Clone, Serialize)]
23pub struct TimeNowElement {
24    #[cfg_attr(not(feature = "include_locations"), serde(skip_serializing))]
25    pub span: Span,
26}
27
28/// 소프트 브레이크 (줄바꿈)
29#[derive(Debug, Clone, Serialize)]
30pub struct SoftBreakElement {
31    #[cfg_attr(not(feature = "include_locations"), serde(skip_serializing))]
32    pub span: Span,
33}
34
35/// 하드 브레이크 [br]
36#[derive(Debug, Clone, Serialize)]
37pub struct HardBreakElement {
38    #[cfg_attr(not(feature = "include_locations"), serde(skip_serializing))]
39    pub span: Span,
40}
41
42/// 수평선 ----
43#[derive(Debug, Clone, Serialize)]
44pub struct HLineElement {
45    #[cfg_attr(not(feature = "include_locations"), serde(skip_serializing))]
46    pub span: Span,
47}
48
49// === Text-carrying leaf nodes ===
50
51/// 텍스트 요소
52#[derive(Debug, Clone, Serialize)]
53pub struct TextElement {
54    #[cfg_attr(not(feature = "include_locations"), serde(skip_serializing))]
55    pub span: Span,
56    pub value: String,
57}
58
59/// 주석 요소
60#[derive(Debug, Clone, Serialize)]
61pub struct CommentElement {
62    #[cfg_attr(not(feature = "include_locations"), serde(skip_serializing))]
63    pub span: Span,
64    pub value: String,
65}
66
67/// 이스케이프 요소
68#[derive(Debug, Clone, Serialize)]
69pub struct EscapeElement {
70    #[cfg_attr(not(feature = "include_locations"), serde(skip_serializing))]
71    pub span: Span,
72    pub value: String,
73}
74
75/// 에러 요소 (파싱 실패한 내용)
76#[derive(Debug, Clone, Serialize)]
77pub struct ErrorElement {
78    #[cfg_attr(not(feature = "include_locations"), serde(skip_serializing))]
79    pub span: Span,
80    pub value: String,
81}
82
83// === Inline containers ===
84
85/// 텍스트 스타일 (Bold, Italic, Strikethrough, Underline, Superscript, Subscript 공유)
86#[derive(Debug, Clone, Serialize)]
87pub struct TextStyleElement {
88    #[cfg_attr(not(feature = "include_locations"), serde(skip_serializing))]
89    pub span: Span,
90    pub children: Vec<Element>,
91}
92
93// === Block elements ===
94
95/// 리터럴 {{{ content }}}
96#[derive(Debug, Clone, Serialize)]
97pub struct LiteralElement {
98    #[cfg_attr(not(feature = "include_locations"), serde(skip_serializing))]
99    pub span: Span,
100    pub children: Vec<Element>,
101}
102
103/// 변수 정의 {{{#define #varname="value" ...}}}
104#[derive(Debug, Clone, Serialize)]
105pub struct DefineElement {
106    #[cfg_attr(not(feature = "include_locations"), serde(skip_serializing))]
107    pub span: Span,
108    pub parameters: Parameters,
109}
110
111/// 스타일 적용 {{{#style="..." content}}}
112#[derive(Debug, Clone, Serialize)]
113pub struct StyledElement {
114    #[cfg_attr(not(feature = "include_locations"), serde(skip_serializing))]
115    pub span: Span,
116    pub parameters: Parameters,
117    pub children: Vec<Element>,
118}
119
120/// 인용 블록 {{{#blockquote ...}}}
121#[derive(Debug, Clone, Serialize)]
122pub struct BlockQuoteElement {
123    #[cfg_attr(not(feature = "include_locations"), serde(skip_serializing))]
124    pub span: Span,
125    pub parameters: Parameters,
126    pub children: Vec<Element>,
127}
128
129/// 루비 텍스트 {{{#ruby ...}}}
130#[derive(Debug, Clone, Serialize)]
131pub struct RubyElement {
132    #[cfg_attr(not(feature = "include_locations"), serde(skip_serializing))]
133    pub span: Span,
134    pub parameters: Parameters,
135    pub children: Vec<Element>,
136}
137
138/// 각주 {{{#footnote ...}}}
139#[derive(Debug, Clone, Serialize)]
140pub struct FootnoteElement {
141    #[cfg_attr(not(feature = "include_locations"), serde(skip_serializing))]
142    pub span: Span,
143    pub footnote_index: usize,
144    pub parameters: Parameters,
145    pub children: Vec<Element>,
146}
147
148/// 코드 블록 {{{#code ...}}}
149#[derive(Debug, Clone, Serialize)]
150pub struct CodeElement {
151    #[cfg_attr(not(feature = "include_locations"), serde(skip_serializing))]
152    pub span: Span,
153    pub parameters: Parameters,
154    pub value: String,
155}
156
157/// TeX 수식 $ ... $ 또는 $$ ... $$
158#[derive(Debug, Clone, Serialize)]
159pub struct TeXElement {
160    #[cfg_attr(not(feature = "include_locations"), serde(skip_serializing))]
161    pub span: Span,
162    pub is_block: bool,
163    pub value: String,
164}
165
166/// 폴드 내부 요소
167#[derive(Debug, Clone, Serialize)]
168pub struct FoldInnerElement {
169    #[cfg_attr(not(feature = "include_locations"), serde(skip_serializing))]
170    pub span: Span,
171    pub parameters: Parameters,
172    pub children: Vec<Element>,
173}
174
175/// 폴드/접기 {{{#fold ...}}}
176#[derive(Debug, Clone, Serialize)]
177pub struct FoldElement {
178    #[cfg_attr(not(feature = "include_locations"), serde(skip_serializing))]
179    pub span: Span,
180    pub parameters: Parameters,
181    pub summary: FoldInnerElement,
182    pub details: FoldInnerElement,
183}
184
185// === Wiki elements ===
186
187/// 포함 {{{#include ...}}}
188#[derive(Debug, Clone, Serialize)]
189pub struct IncludeElement {
190    #[cfg_attr(not(feature = "include_locations"), serde(skip_serializing))]
191    pub span: Span,
192    pub parameters: Parameters,
193    pub children: Vec<Element>,
194}
195
196/// 카테고리 {{{#category ...}}}
197#[derive(Debug, Clone, Serialize)]
198pub struct CategoryElement {
199    #[cfg_attr(not(feature = "include_locations"), serde(skip_serializing))]
200    pub span: Span,
201    pub children: Vec<Element>,
202}
203
204/// 리다이렉트 {{{#redirect ...}}}
205#[derive(Debug, Clone, Serialize)]
206pub struct RedirectElement {
207    #[cfg_attr(not(feature = "include_locations"), serde(skip_serializing))]
208    pub span: Span,
209    pub parameters: Parameters,
210    pub children: Vec<Element>,
211}
212
213// === Media ===
214
215/// 미디어 [[...]]
216#[derive(Debug, Clone, Serialize)]
217pub struct MediaElement {
218    #[cfg_attr(not(feature = "include_locations"), serde(skip_serializing))]
219    pub span: Span,
220    pub parameters: Parameters,
221    pub children: Vec<Element>,
222    #[serde(skip_serializing_if = "Option::is_none")]
223    pub resolved_info: Option<ResolvedMediaInfo>,
224}
225
226/// 외부 미디어 [[#youtube ...]], [[#vimeo ...]], [[#nicovideo ...]], [[#spotify ...]]
227#[derive(Debug, Clone, Serialize)]
228pub struct ExternalMediaElement {
229    #[cfg_attr(not(feature = "include_locations"), serde(skip_serializing))]
230    pub span: Span,
231    pub provider: String,
232    pub parameters: Parameters,
233}
234
235// === Macros ===
236
237/// 나이 계산 [age(...)]
238#[derive(Debug, Clone, Serialize)]
239pub struct AgeElement {
240    #[cfg_attr(not(feature = "include_locations"), serde(skip_serializing))]
241    pub span: Span,
242    pub date: String,
243}
244
245/// 변수 참조 [var(...)]
246#[derive(Debug, Clone, Serialize)]
247pub struct VariableElement {
248    #[cfg_attr(not(feature = "include_locations"), serde(skip_serializing))]
249    pub span: Span,
250    pub name: String,
251}
252
253/// 멘션 <@uuid> 또는 <#uuid>
254#[derive(Debug, Clone, Serialize)]
255pub struct MentionElement {
256    #[cfg_attr(not(feature = "include_locations"), serde(skip_serializing))]
257    pub span: Span,
258    pub kind: MentionType,
259    pub id: String,
260}
261
262// === Headers ===
263
264/// 헤더 = Title =
265#[derive(Debug, Clone, Serialize)]
266pub struct HeaderElement {
267    #[cfg_attr(not(feature = "include_locations"), serde(skip_serializing))]
268    pub span: Span,
269    pub level: usize,
270    pub is_folded: bool,
271    pub section_index: usize,
272    pub children: Vec<Element>,
273}
274
275// === Conditional ===
276
277/// If 조건문 {{{#if condition :: content}}}
278#[derive(Debug, Clone, Serialize)]
279pub struct IfElement {
280    #[cfg_attr(not(feature = "include_locations"), serde(skip_serializing))]
281    pub span: Span,
282    pub condition: Expression,
283    pub children: Vec<Element>,
284}