CommentRangeEnd

CommentRangeEnd class

Bezeichnet das Ende eines Textbereichs, dem ein Kommentar zugeordnet ist.

public sealed class CommentRangeEnd : Node

Konstrukteure

Name Beschreibung
CommentRangeEnd(DocumentBase, int) Initialisiert eine neue Instanz dieser Klasse.

Eigenschaften

Name Beschreibung
CustomNodeId { get; set; } Gibt die benutzerdefinierte Knotenkennung an.
virtual Document { get; } Ruft das Dokument ab, zu dem dieser Knoten gehört.
Id { get; set; } Gibt die Kennung des Kommentars an, mit dem dieser Bereich verknüpft ist.
virtual IsComposite { get; } Gibt wahr zurück, wenn dieser Knoten andere Knoten enthalten kann.
NextSibling { get; } Ruft den Knoten ab, der diesem Knoten unmittelbar folgt.
override NodeType { get; } gibt zurückCommentRangeEnd .
ParentNode { get; } Ruft den unmittelbar übergeordneten Knoten dieses Knotens ab.
PreviousSibling { get; } Ruft den Knoten unmittelbar vor diesem Knoten ab.
Range { get; } Gibt a zurück Bereich Objekt, das den Teil eines Dokuments darstellt, das in diesem Knoten enthalten ist.

Methoden

Name Beschreibung
override Accept(DocumentVisitor) Akzeptiert einen Besucher.
Clone(bool) Erstellt ein Duplikat des Knotens.
GetAncestor(NodeType) Ruft den ersten Vorfahren der angegebenen abNodeType .
GetAncestor(Type) Ruft den ersten Vorfahren des angegebenen Objekttyps ab.
virtual GetText() Ruft den Text dieses Knotens und aller seiner Kinder ab.
NextPreOrder(Node) Ruft den nächsten Knoten gemäß dem Traversalalgorithmus des Vorbestellungsbaums ab.
PreviousPreOrder(Node) Ruft den vorherigen Knoten gemäß dem Traversalalgorithmus des Vorbestellungsbaums ab.
Remove() Entfernt sich selbst vom übergeordneten Element.
ToString(SaveFormat) Exportiert den Inhalt des Knotens in einen String im angegebenen Format.
ToString(SaveOptions) Exportiert den Inhalt des Knotens unter Verwendung der angegebenen Speicheroptionen in einen String.

Bemerkungen

Um einen Kommentar zu erstellen, der mit einem Textbereich verankert ist, müssen Sie eine erstellenComment and dann erstellenCommentRangeStart undCommentRangeEndund setzen Sie ihre Kennungen auf die gleichenId Wert.

CommentRangeEnd ist ein Knoten auf Inline-Ebene und kann nur ein Kind von seinParagraph.

Beispiele

Zeigt, wie der Inhalt aller Kommentare und ihre Kommentarbereiche mithilfe eines Dokumentbesuchers gedruckt werden.

public void CreateCommentsAndPrintAllInfo()
{
    Document doc = new Document();

    Comment newComment = new Comment(doc)
    {
        Author = "VDeryushev",
        Initial = "VD",
        DateTime = DateTime.Now
    };

    newComment.SetText("Comment regarding text.");

    // Fügen Sie dem Dokument Text hinzu, verzerren Sie es in einen Kommentarbereich und fügen Sie dann Ihren Kommentar hinzu.
    Paragraph para = doc.FirstSection.Body.FirstParagraph;
    para.AppendChild(new CommentRangeStart(doc, newComment.Id));
    para.AppendChild(new Run(doc, "Commented text."));
    para.AppendChild(new CommentRangeEnd(doc, newComment.Id));
    para.AppendChild(newComment); 

    // Dem Kommentar zwei Antworten hinzufügen.
    newComment.AddReply("John Doe", "JD", DateTime.Now, "New reply.");
    newComment.AddReply("John Doe", "JD", DateTime.Now, "Another reply.");

    PrintAllCommentInfo(doc.GetChildNodes(NodeType.Comment, true));
}

/// <summary>
/// Iteriert über jeden Kommentar der obersten Ebene und gibt dessen Kommentarbereich, Inhalt und Antworten aus.
/// </summary>
private static void PrintAllCommentInfo(NodeCollection comments)
{
    CommentInfoPrinter commentVisitor = new CommentInfoPrinter();

    // Über alle Kommentare der obersten Ebene iterieren. Im Gegensatz zu Kommentaren vom Antworttyp haben Kommentare auf oberster Ebene keinen Vorfahren.
    foreach (Comment comment in comments.Where(c => ((Comment)c).Ancestor == null))
    {
        // Besuchen Sie zuerst den Anfang des Kommentarbereichs.
        CommentRangeStart commentRangeStart = (CommentRangeStart)comment.PreviousSibling.PreviousSibling.PreviousSibling;
        commentRangeStart.Accept(commentVisitor);

        // Besuchen Sie dann den Kommentar und alle Antworten, die er möglicherweise enthält.
        comment.Accept(commentVisitor);

        foreach (Comment reply in comment.Replies)
            reply.Accept(commentVisitor);

        // Besuchen Sie schließlich das Ende des Kommentarbereichs und drucken Sie dann den Textinhalt des Besuchers aus.
        CommentRangeEnd commentRangeEnd = (CommentRangeEnd)comment.PreviousSibling;
        commentRangeEnd.Accept(commentVisitor);

        Console.WriteLine(commentVisitor.GetText());
    }
}

/// <summary>
/// Gibt Informationen und Inhalte aller Kommentare und Kommentarbereiche aus, die im Dokument vorkommen.
/// </summary>
public class CommentInfoPrinter : DocumentVisitor
{
    public CommentInfoPrinter()
    {
        mBuilder = new StringBuilder();
        mVisitorIsInsideComment = false;
    }

    /// <summary>
    /// Ruft den Klartext des Dokuments ab, das vom Besucher angesammelt wurde.
    /// </summary>
    public string GetText()
    {
        return mBuilder.ToString();
    }

    /// <summary>
    /// Wird aufgerufen, wenn im Dokument ein Run-Knoten gefunden wird.
    /// </summary>
    public override VisitorAction VisitRun(Run run)
    {
        if (mVisitorIsInsideComment) IndentAndAppendLine("[Run] \"" + run.Text + "\"");

        return VisitorAction.Continue;
    }

    /// <summary>
    /// Wird aufgerufen, wenn im Dokument ein CommentRangeStart-Knoten gefunden wird.
    /// </summary>
    public override VisitorAction VisitCommentRangeStart(CommentRangeStart commentRangeStart)
    {
        IndentAndAppendLine("[Comment range start] ID: " + commentRangeStart.Id);
        mDocTraversalDepth++;
        mVisitorIsInsideComment = true;

        return VisitorAction.Continue;
    }

    /// <summary>
    /// Wird aufgerufen, wenn im Dokument ein CommentRangeEnd-Knoten gefunden wird.
    /// </summary>
    public override VisitorAction VisitCommentRangeEnd(CommentRangeEnd commentRangeEnd)
    {
        mDocTraversalDepth--;
        IndentAndAppendLine("[Comment range end] ID: " + commentRangeEnd.Id + "\n");
        mVisitorIsInsideComment = false;

        return VisitorAction.Continue;
    }

    /// <summary>
    /// Wird aufgerufen, wenn im Dokument ein Kommentarknoten gefunden wird.
    /// </summary>
    public override VisitorAction VisitCommentStart(Comment comment)
    {
        IndentAndAppendLine(
            $"[Comment start] For comment range ID {comment.Id}, By {comment.Author} on {comment.DateTime}");
        mDocTraversalDepth++;
        mVisitorIsInsideComment = true;

        return VisitorAction.Continue;
    }

    /// <summary>
    /// Wird aufgerufen, wenn der Besuch eines Kommentarknotens im Dokument beendet wird.
    /// </summary>
    public override VisitorAction VisitCommentEnd(Comment comment)
    {
        mDocTraversalDepth--;
        IndentAndAppendLine("[Comment end]");
        mVisitorIsInsideComment = false;

        return VisitorAction.Continue;
    }

    /// <summary>
    /// Eine Zeile an den StringBuilder anhängen und einrücken, je nachdem, wie tief der Besucher in den Dokumentenbaum eindringt.
    /// </summary>
    /// <param name="text"></param>
    private void IndentAndAppendLine(string text)
    {
        for (int i = 0; i < mDocTraversalDepth; i++)
        {
            mBuilder.Append("|  ");
        }

        mBuilder.AppendLine(text);
    }

    private bool mVisitorIsInsideComment;
    private int mDocTraversalDepth;
    private readonly StringBuilder mBuilder;
}

Siehe auch