CommentRangeStart

CommentRangeStart class

Bezeichnet den Anfang eines Textbereichs, dem ein Kommentar zugeordnet ist.

Um mehr zu erfahren, besuchen Sie dieArbeiten mit Kommentaren Dokumentationsartikel.

public sealed class CommentRangeStart : Node

Konstrukteure

NameBeschreibung
CommentRangeStart(DocumentBase, int)Initialisiert eine neue Instanz dieser Klasse.

Eigenschaften

NameBeschreibung
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 diese Region verknüpft ist.
virtual IsComposite { get; }Gibt zurückWAHR ob dieser Knoten andere Knoten enthalten kann.
NextSibling { get; }Ruft den Knoten ab, der diesem Knoten unmittelbar folgt.
override NodeType { get; }Gibt zurückCommentRangeStart .
ParentNode { get; }Ruft das unmittelbare übergeordnete Element dieses Knotens ab.
PreviousSibling { get; }Ruft den Knoten ab, der diesem Knoten unmittelbar vorangeht.
Range { get; }Gibt a zurückRange Objekt, das den Teil eines Dokuments darstellt, der in diesem Knoten enthalten ist.

Methoden

NameBeschreibung
override Accept(DocumentVisitor)Akzeptiert einen Besucher.
Clone(bool)Erstellt ein Duplikat des Knotens.
GetAncestor(NodeType)Ruft den ersten Vorfahren des angegebenen abNodeType .
GetAncestor(Type)Ruft den ersten Vorfahren des angegebenen Objekttyps ab.
virtual GetText()Ruft den Text dieses Knotens und aller seiner untergeordneten Knoten ab.
NextPreOrder(Node)Ruft den nächsten Knoten gemäß dem Pre-Order-Tree-Traversal-Algorithmus ab.
PreviousPreOrder(Node)Ruft den vorherigen Knoten gemäß dem Pre-Order-Tree-Traversal-Algorithmus 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 mit den angegebenen Speicheroptionen in einen String.

Bemerkungen

Um einen Kommentar zu erstellen, der in einem Textbereich verankert ist, müssen Sie einen erstellenComment and dann erstellenCommentRangeStart UndCommentRangeEndund setzen Sie ihre Bezeichner auf den gleichen WertId Wert.

CommentRangeStart ist ein Knoten auf Inline-Ebene und kann nur ein untergeordnetes Element von seinParagraph.

Beispiele

Zeigt, wie der Inhalt aller Kommentare und deren Kommentarbereiche mithilfe eines Dokumentbesuchers gedruckt wird.

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 ihn in einem 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); 

    // Zwei Antworten zum Kommentar 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>
/// Durchläuft jeden Kommentar der obersten Ebene und gibt dessen Kommentarbereich, Inhalte und Antworten aus.
/// </summary>
private static void PrintAllCommentInfo(NodeCollection comments)
{
    CommentInfoPrinter commentVisitor = new CommentInfoPrinter();

    // Alle Kommentare der obersten Ebene durchlaufen. Im Gegensatz zu Kommentaren vom Typ „Antwort“ haben Kommentare der obersten Ebene keinen Vorfahren.
    foreach (Comment comment in comments.Where(c => ((Comment)c).Ancestor == null))
    {
        // Besuchen Sie zunächst den Anfang des Kommentarbereichs.
        CommentRangeStart commentRangeStart = (CommentRangeStart)comment.PreviousSibling.PreviousSibling.PreviousSibling;
        commentRangeStart.Accept(commentVisitor);

        // Dann besuchen Sie den Kommentar und eventuelle Antworten.
        comment.Accept(commentVisitor);

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

        // Besuchen Sie abschließend 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>
/// Druckt Informationen und Inhalte aller im Dokument vorkommenden Kommentare und Kommentarbereiche.
/// </summary>
public class CommentInfoPrinter : DocumentVisitor
{
    public CommentInfoPrinter()
    {
        mBuilder = new StringBuilder();
        mVisitorIsInsideComment = false;
    }

    /// <summary>
    /// Ruft den Klartext des vom Besucher gesammelten Dokuments ab.
    /// </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>
    /// Hängen Sie eine Zeile an den StringBuilder an und rücken Sie sie ein, je nachdem, wie tief sich der Besucher im Dokumentbaum befindet.
    /// </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