Skip to content

Commit

Permalink
feat: 支持复制节点。
Browse files Browse the repository at this point in the history
  • Loading branch information
CYJB committed Mar 10, 2024
1 parent 5eb4c47 commit 8bdb3f8
Show file tree
Hide file tree
Showing 37 changed files with 927 additions and 11 deletions.
19 changes: 19 additions & 0 deletions Cyjb.Markdown/Document.cs
Original file line number Diff line number Diff line change
Expand Up @@ -102,4 +102,23 @@ public override TResult Accept<TResult>(SyntaxVisitor<TResult> visitor)
{
return visitor.VisitDocument(this)!;
}

/// <summary>
/// 复制当前节点。
/// </summary>
/// <param name="deep">是仅复制当前节点还是需要复制所有子节点。</param>
/// <param name="context">节点复制上下文。</param>
/// <returns>复制的结果。</returns>
internal override Node CloneNode(bool deep, NodeCloneContext context)
{
Document doc = new(Span)
{
Locator = Locator
};
if (deep)
{
children.CloneTo(doc.children, context);
}
return doc;
}
}
14 changes: 14 additions & 0 deletions Cyjb.Markdown/Renderer/FootnoteBackref.cs
Original file line number Diff line number Diff line change
Expand Up @@ -45,4 +45,18 @@ public override TResult Accept<TResult>(SyntaxVisitor<TResult> visitor)
{
return default!;
}

/// <summary>
/// 复制当前节点。
/// </summary>
/// <param name="deep">是仅复制当前节点还是需要复制所有子节点。</param>
/// <param name="context">节点复制上下文。</param>
/// <returns>复制的结果。</returns>
internal override Node CloneNode(bool deep, NodeCloneContext context)
{
return new FootnoteBackref(Info, Identifier)
{
Locator = Locator,
};
}
}
19 changes: 19 additions & 0 deletions Cyjb.Markdown/Syntax/Blockquote.cs
Original file line number Diff line number Diff line change
Expand Up @@ -57,4 +57,23 @@ public override TResult Accept<TResult>(SyntaxVisitor<TResult> visitor)
{
return visitor.VisitBlockquote(this)!;
}

/// <summary>
/// 复制当前节点。
/// </summary>
/// <param name="deep">是仅复制当前节点还是需要复制所有子节点。</param>
/// <param name="context">节点复制上下文。</param>
/// <returns>复制的结果。</returns>
internal override Node CloneNode(bool deep, NodeCloneContext context)
{
Blockquote node = new(Span)
{
Locator = Locator,
};
if (deep)
{
children.CloneTo(node.children, context);
}
return node;
}
}
25 changes: 25 additions & 0 deletions Cyjb.Markdown/Syntax/Break.cs
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,17 @@ public Break(bool isHard, TextSpan span = default)
Span = span;
}

/// <summary>
/// 使用指定的节点类型和文本范围初始化 <see cref="Break"/> 类的新实例。
/// </summary>
/// <param name="kind">节点类型。</param>
/// <param name="span">文本的范围。</param>
public Break(MarkdownKind kind, TextSpan span = default)
: base(kind)
{
Span = span;
}

/// <summary>
/// 应用指定的访问器。
/// </summary>
Expand All @@ -38,6 +49,20 @@ public override TResult Accept<TResult>(SyntaxVisitor<TResult> visitor)
return visitor.VisitBreak(this)!;
}

/// <summary>
/// 复制当前节点。
/// </summary>
/// <param name="deep">是仅复制当前节点还是需要复制所有子节点。</param>
/// <param name="context">节点复制上下文。</param>
/// <returns>复制的结果。</returns>
internal override Node CloneNode(bool deep, NodeCloneContext context)
{
return new Break(Kind, Span)
{
Locator = Locator,
};
}

#region IEquatable<Break> 成员

/// <summary>
Expand Down
17 changes: 17 additions & 0 deletions Cyjb.Markdown/Syntax/CodeBlock.cs
Original file line number Diff line number Diff line change
Expand Up @@ -88,6 +88,23 @@ public override TResult Accept<TResult>(SyntaxVisitor<TResult> visitor)
return visitor.VisitCodeBlock(this)!;
}

/// <summary>
/// 复制当前节点。
/// </summary>
/// <param name="deep">是仅复制当前节点还是需要复制所有子节点。</param>
/// <param name="context">节点复制上下文。</param>
/// <returns>复制的结果。</returns>
internal override Node CloneNode(bool deep, NodeCloneContext context)
{
CodeBlock node = new(content, Span)
{
info = info,
Locator = Locator,
};
attributes.CloneTo(node.attributes);
return node;
}

/// <summary>
/// 返回当前对象的字符串表示形式。
/// </summary>
Expand Down
14 changes: 14 additions & 0 deletions Cyjb.Markdown/Syntax/CodeSpan.cs
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,20 @@ public override TResult Accept<TResult>(SyntaxVisitor<TResult> visitor)
return visitor.VisitCodeSpan(this)!;
}

/// <summary>
/// 复制当前节点。
/// </summary>
/// <param name="deep">是仅复制当前节点还是需要复制所有子节点。</param>
/// <param name="context">节点复制上下文。</param>
/// <returns>复制的结果。</returns>
internal override Node CloneNode(bool deep, NodeCloneContext context)
{
return new CodeSpan(content, Span)
{
Locator = Locator,
};
}

/// <summary>
/// 返回当前对象的字符串表示形式。
/// </summary>
Expand Down
21 changes: 21 additions & 0 deletions Cyjb.Markdown/Syntax/CustomContainer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -91,4 +91,25 @@ public override TResult Accept<TResult>(SyntaxVisitor<TResult> visitor)
{
return visitor.VisitCustomContainer(this)!;
}

/// <summary>
/// 复制当前节点。
/// </summary>
/// <param name="deep">是仅复制当前节点还是需要复制所有子节点。</param>
/// <param name="context">节点复制上下文。</param>
/// <returns>复制的结果。</returns>
internal override Node CloneNode(bool deep, NodeCloneContext context)
{
CustomContainer node = new(Span)
{
info = info,
Locator = Locator,
};
attributes.CloneTo(node.attributes);
if (deep)
{
children.CloneTo(node.children, context);
}
return node;
}
}
14 changes: 14 additions & 0 deletions Cyjb.Markdown/Syntax/Emoji.cs
Original file line number Diff line number Diff line change
Expand Up @@ -129,6 +129,20 @@ public override TResult Accept<TResult>(SyntaxVisitor<TResult> visitor)
return visitor.VisitEmoji(this)!;
}

/// <summary>
/// 复制当前节点。
/// </summary>
/// <param name="deep">是仅复制当前节点还是需要复制所有子节点。</param>
/// <param name="context">节点复制上下文。</param>
/// <returns>复制的结果。</returns>
internal override Node CloneNode(bool deep, NodeCloneContext context)
{
return new Emoji(Code, info, Span)
{
Locator = Locator,
};
}

/// <summary>
/// 返回当前对象的字符串表示形式。
/// </summary>
Expand Down
19 changes: 19 additions & 0 deletions Cyjb.Markdown/Syntax/Emphasis.cs
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,25 @@ public override TResult Accept<TResult>(SyntaxVisitor<TResult> visitor)
return visitor.VisitEmphasis(this)!;
}

/// <summary>
/// 复制当前节点。
/// </summary>
/// <param name="deep">是仅复制当前节点还是需要复制所有子节点。</param>
/// <param name="context">节点复制上下文。</param>
/// <returns>复制的结果。</returns>
internal override Node CloneNode(bool deep, NodeCloneContext context)
{
Emphasis node = new(Span)
{
Locator = Locator,
};
if (deep)
{
children.CloneTo(node.children, context);
}
return node;
}

#region IEquatable<Emphasis> 成员

/// <summary>
Expand Down
26 changes: 26 additions & 0 deletions Cyjb.Markdown/Syntax/Footnote.cs
Original file line number Diff line number Diff line change
Expand Up @@ -98,6 +98,32 @@ public override TResult Accept<TResult>(SyntaxVisitor<TResult> visitor)
return visitor.VisitFootnote(this)!;
}

/// <summary>
/// 复制当前节点。
/// </summary>
/// <param name="deep">是仅复制当前节点还是需要复制所有子节点。</param>
/// <param name="context">节点复制上下文。</param>
/// <returns>复制的结果。</returns>
internal override Node CloneNode(bool deep, NodeCloneContext context)
{
// 先检查是否存在已被复制的脚注。
if (context.Footnotes.TryGetValue(this, out var cloned))
{
return cloned;
}
Footnote node = new(label, Span)
{
identifier = identifier,
Locator = Locator,
};
context.Footnotes.Add(this, node);
if (deep)
{
children.CloneTo(node.children, context);
}
return node;
}

/// <summary>
/// 返回当前对象的字符串表示形式。
/// </summary>
Expand Down
14 changes: 14 additions & 0 deletions Cyjb.Markdown/Syntax/FootnoteRef.cs
Original file line number Diff line number Diff line change
Expand Up @@ -58,4 +58,18 @@ public override TResult Accept<TResult>(SyntaxVisitor<TResult> visitor)
{
return visitor.VisitFootnoteRef(this)!;
}

/// <summary>
/// 复制当前节点。
/// </summary>
/// <param name="deep">是仅复制当前节点还是需要复制所有子节点。</param>
/// <param name="context">节点复制上下文。</param>
/// <returns>复制的结果。</returns>
internal override Node CloneNode(bool deep, NodeCloneContext context)
{
return new FootnoteRef((Footnote)footnote.CloneNode(deep, context), Span)
{
Locator = Locator,
};
}
}
20 changes: 20 additions & 0 deletions Cyjb.Markdown/Syntax/Heading.cs
Original file line number Diff line number Diff line change
Expand Up @@ -91,6 +91,26 @@ public override TResult Accept<TResult>(SyntaxVisitor<TResult> visitor)
return visitor.VisitHeading(this)!;
}

/// <summary>
/// 复制当前节点。
/// </summary>
/// <param name="deep">是仅复制当前节点还是需要复制所有子节点。</param>
/// <param name="context">节点复制上下文。</param>
/// <returns>复制的结果。</returns>
internal override Node CloneNode(bool deep, NodeCloneContext context)
{
Heading node = new(depth, Span)
{
Locator = Locator,
};
attributes.CloneTo(node.attributes);
if (deep)
{
children.CloneTo(node.children, context);
}
return node;
}

/// <summary>
/// 返回当前对象的字符串表示形式。
/// </summary>
Expand Down
15 changes: 15 additions & 0 deletions Cyjb.Markdown/Syntax/Html.cs
Original file line number Diff line number Diff line change
Expand Up @@ -113,6 +113,21 @@ public override TResult Accept<TResult>(SyntaxVisitor<TResult> visitor)
return visitor.VisitHtml(this)!;
}

/// <summary>
/// 复制当前节点。
/// </summary>
/// <param name="deep">是仅复制当前节点还是需要复制所有子节点。</param>
/// <param name="context">节点复制上下文。</param>
/// <returns>复制的结果。</returns>
internal override Node CloneNode(bool deep, NodeCloneContext context)
{
return new Html(Kind, content, Span)
{
value = value,
Locator = Locator,
};
}

/// <summary>
/// 返回当前对象的字符串表示形式。
/// </summary>
Expand Down
11 changes: 10 additions & 1 deletion Cyjb.Markdown/Syntax/HtmlAttributeList.cs
Original file line number Diff line number Diff line change
Expand Up @@ -114,7 +114,7 @@ public void AddRange(IEnumerable<KeyValuePair<string, string>> attrs)
{
if (attr.Key.ToLowerInvariant() == "class")
{
this.AddClass(attr.Value);
AddClass(attr.Value);
}
else
{
Expand Down Expand Up @@ -219,6 +219,15 @@ internal void AddPrefix(string? prefix)
}
}

/// <summary>
/// 将当前属性列表复制到指定列表中。
/// </summary>
/// <param name="other">要复制到的列表,会假设该列表是空的。</param>
internal void CloneTo(HtmlAttributeList other)
{
other.list.AddRange(list);
}

#region ReadOnlyListBase<KeyValuePair<string, string>> 成员

/// <summary>
Expand Down
14 changes: 14 additions & 0 deletions Cyjb.Markdown/Syntax/HtmlBlock.cs
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,20 @@ public override TResult Accept<TResult>(SyntaxVisitor<TResult> visitor)
return visitor.VisitHtmlBlock(this)!;
}

/// <summary>
/// 复制当前节点。
/// </summary>
/// <param name="deep">是仅复制当前节点还是需要复制所有子节点。</param>
/// <param name="context">节点复制上下文。</param>
/// <returns>复制的结果。</returns>
internal override Node CloneNode(bool deep, NodeCloneContext context)
{
return new HtmlBlock(content, Span)
{
Locator = Locator,
};
}

#region IEquatable<HtmlBlock> 成员

/// <summary>
Expand Down
Loading

0 comments on commit 8bdb3f8

Please sign in to comment.