Скрыть комментарии в VS Code
Есть встроенная возможность сворачивать блоки многострочных комментариев. Но это работает только с несколькими видами знаков комментариев. Например, многострочные комментарии при использовании // или /* */ символов.
Чтобы свернуть Ctrl + K Ctrl + ‘ , или:
- Открыть Command Palette , Ctrl + Shift + P
- Ввести Fold All Blocks Comment
Чтобы развернуть Ctrl + K Ctrl + J , или:
- Открыть Command Palette , Ctrl + Shift + P
- Ввести Unfold All
Для python кода, данная возможность не работает.
Удалить комментарии всех или определенного автора в документе обработки текста
В этом разделе показано, как использовать классы в пакете SDK Open XML для Office для программного удаления комментариев всех или определенных авторов в текстовом документе без необходимости загружать документ в microsoft Word. Для иллюстрации данной задачи в разделе приведен пример использования метода DeleteComments.
Метод DeleteComments
Метод DeleteComments используется для удаления всех комментариев из текстового документа или только тех комментариев, которые написаны определенным автором. Как показано в следующем коде, этот метод принимает два параметра, задающие имя изменяемого документа (строковый параметр) и, дополнительно, имя автора, чьи комментарии требуется удалить (строковый параметр). Если предоставить имя автора, код удаляет комментарии, написанные заданным автором. Если не предоставить имя автора, код удаляет все комментарии.
// Delete comments by a specific author. Pass an empty string for the // author to delete all comments, by all authors. public static void DeleteComments(string fileName, string author = "")
' Delete comments by a specific author. Pass an empty string for the author ' to delete all comments, by all authors. Public Sub DeleteComments(ByVal fileName As String, Optional ByVal author As String = "")
Вызов метода DeleteComments
Чтобы вызвать метод DeleteComments, передайте требуемые параметры, как показано в следующем коде:
DeleteComments(@"C:\Users\Public\Documents\DeleteComments.docx", "David Jones");
DeleteComments("C:\Users\Public\Documents\DeleteComments.docx", "David Jones")
Как работает код
Сначала приведенный ниже код открывает документ, используя метод WordprocessingDocument.Open и указывая, что документ должен быть открыт для чтения и записи (значение последнего параметра true). Затем код извлекает ссылку на часть комментариев с помощью свойства WordprocessingCommentsPart части документа main после получения ссылки на часть документа main из свойства MainDocumentPart текстового документа. Если часть комментариев отсутствует, продолжение не имеет смысла, так как нет комментариев (и удалять нечего).
// Get an existing Wordprocessing document. using (WordprocessingDocument document = WordprocessingDocument.Open(fileName, true)) < // Set commentPart to the document WordprocessingCommentsPart, // if it exists. WordprocessingCommentsPart commentPart = document.MainDocumentPart.WordprocessingCommentsPart; // If no WordprocessingCommentsPart exists, there can be no // comments. Stop execution and return from the method. if (commentPart == null) < return; >// Code removed here… >
' Get an existing Wordprocessing document. Using document As WordprocessingDocument = WordprocessingDocument.Open(fileName, True) ' Set commentPart to the document ' WordprocessingCommentsPart, if it exists. Dim commentPart As WordprocessingCommentsPart = document.MainDocumentPart.WordprocessingCommentsPart ' If no WordprocessingCommentsPart exists, there can be no ' comments. Stop execution and return from the method. If (commentPart Is Nothing) Then Return End If ' Code removed here… End Using
Создание списка комментариев
Далее код выполняет две задачи: создание списка всех удаляемых комментариев и создание списка идентификаторов комментариев, соответствующих удаляемой примечания. Учитывая эти списки, код может как удалить комментарии из части примечаний, содержащей примечания, так и ссылки на комментарии из части документа. Следующий код начинается с получения списка элементов Comment . Чтобы получить список, он преобразует коллекцию Elements , предоставленную переменной commentPart , в список объектов Comment .
List commentsToDelete = commentPart.Comments.Elements().ToList();
Dim commentsToDelete As List(Of Comment) = _ commentPart.Comments.Elements(Of Comment)().ToList()
Пока что список комментариев содержит все комментарии. Если параметр автора не является пустой строкой, следующий код ограничивает список только теми комментариями, для которых свойство Author совпадает с заданным параметром.
if (!String.IsNullOrEmpty(author)) < commentsToDelete = commentsToDelete. Where(c =>c.Author == author).ToList(); >
If Not String.IsNullOrEmpty(author) Then commentsToDelete = commentsToDelete. Where(Function(c) c.Author = author).ToList() End If
Перед удалением комментариев код получает список со значениями идентификаторов (ID) комментариев, чтобы позже удалить совпадающие элементы из части документа. Вызов метода Select эффективно проецирует список комментариев, получая IEnumerable строк, содержащих все значения идентификатора комментария.
IEnumerable commentIds = commentsToDelete.Select(r => r.Id.Value);
Dim commentIds As IEnumerable(Of String) = commentsToDelete.Select(Function(r) r.Id.Value)
Удаление комментариев и сохранение части
Имея коллекцию commentsToDelete, следующий код перебирает все комментарии, которые необходимо удалить, и выполняет удаление. Затем код сохраняет часть, предназначенную для хранения комментариев.
// Delete each comment in commentToDelete from the // Comments collection. foreach (Comment c in commentsToDelete) < c.Remove(); >// Save the comment part changes. commentPart.Comments.Save();
' Delete each comment in commentToDelete from the Comments ' collection. For Each c As Comment In commentsToDelete c.Remove() Next ' Save the comment part changes. commentPart.Comments.Save()
Удаление ссылок на комментарии из документа
Хотя код успешно удалил все комментарии к этому моменту, этого недостаточно. Код также должен удалить ссылки на примечания из части документа. Для этого действия требуется три шага, так как ссылка на комментарий включает элементы CommentRangeStart, CommentRangeEnd и CommentReference , а код должен удалить все три элемента для каждого комментария. Перед удалением код сначала извлекает ссылку на корневой элемент части документа main, как показано в следующем коде.
Document doc = document.MainDocumentPart.Document;
Dim doc As Document = document.MainDocumentPart.Document
Имея ссылку на элемент документа, следующий код выполняет цикл удаления три раза: по одному разу для каждого из элементов, предназначенных для удаления. В каждом случае код ищет всех потомков правильного типа (CommentRangeStart, CommentRangeEnd или CommentReference) и ограничивает список теми, у кого значение свойства Id содержится в списке идентификаторов комментариев, которые необходимо удалить. Имея список удаляемых элементов, код удаляет каждый из них. Наконец, код завершает работу, сохраняя документ.
// Delete CommentRangeStart for each // deleted comment in the main document. List commentRangeStartToDelete = doc.Descendants(). Where(c => commentIds.Contains(c.Id.Value)).ToList(); foreach (CommentRangeStart c in commentRangeStartToDelete) < c.Remove(); >// Delete CommentRangeEnd for each deleted comment in the main document. List commentRangeEndToDelete = doc.Descendants(). Where(c => commentIds.Contains(c.Id.Value)).ToList(); foreach (CommentRangeEnd c in commentRangeEndToDelete) < c.Remove(); >// Delete CommentReference for each deleted comment in the main document. List commentRangeReferenceToDelete = doc.Descendants(). Where(c => commentIds.Contains(c.Id.Value)).ToList(); foreach (CommentReference c in commentRangeReferenceToDelete) < c.Remove(); >// Save changes back to the MainDocumentPart part. doc.Save();
' Delete CommentRangeStart for each ' deleted comment in the main document. Dim commentRangeStartToDelete As List(Of CommentRangeStart) = _ doc.Descendants(Of CommentRangeStart). _ Where(Function(c) commentIds.Contains(c.Id.Value)).ToList() For Each c As CommentRangeStart In commentRangeStartToDelete c.Remove() Next ' Delete CommentRangeEnd for each deleted comment in the main document. Dim commentRangeEndToDelete As List(Of CommentRangeEnd) = _ doc.Descendants(Of CommentRangeEnd). _ Where(Function(c) commentIds.Contains(c.Id.Value)).ToList() For Each c As CommentRangeEnd In commentRangeEndToDelete c.Remove() Next ' Delete CommentReference for each deleted comment in the main document. Dim commentRangeReferenceToDelete As List(Of CommentReference) = _ doc.Descendants(Of CommentReference). _ Where(Function(c) commentIds.Contains(c.Id.Value)).ToList For Each c As CommentReference In commentRangeReferenceToDelete c.Remove() Next ' Save changes back to the MainDocumentPart part. doc.Save()
Пример кода
Ниже приведен полный пример кода на C# и Visual Basic.
using DocumentFormat.OpenXml.Packaging; using DocumentFormat.OpenXml.Wordprocessing; using System; using System.Collections.Generic; using System.Linq; DeleteComments(args[0], args[1]); // Delete comments by a specific author. Pass an empty string for the // author to delete all comments, by all authors. static void DeleteComments(string fileName, string author = "") < // Get an existing Wordprocessing document. using (WordprocessingDocument document = WordprocessingDocument.Open(fileName, true)) < if (document.MainDocumentPart is null || document.MainDocumentPart.WordprocessingCommentsPart is null) < throw new ArgumentNullException("MainDocumentPart and/or WordprocessingCommentsPart is null."); >// Set commentPart to the document WordprocessingCommentsPart, // if it exists. WordprocessingCommentsPart commentPart = document.MainDocumentPart.WordprocessingCommentsPart; // If no WordprocessingCommentsPart exists, there can be no // comments. Stop execution and return from the method. if (commentPart is null) < return; >// Create a list of comments by the specified author, or // if the author name is empty, all authors. List commentsToDelete = commentPart.Comments.Elements().ToList(); if (!String.IsNullOrEmpty(author)) < commentsToDelete = commentsToDelete. Where(c =>c.Author == author).ToList(); > IEnumerable commentIds = commentsToDelete.Where(r => r.Id is not null && r.Id.HasValue).Select(r => r.Id?.Value); // Delete each comment in commentToDelete from the // Comments collection. foreach (Comment c in commentsToDelete) < c.Remove(); >// Save the comment part change. commentPart.Comments.Save(); Document doc = document.MainDocumentPart.Document; // Delete CommentRangeStart for each // deleted comment in the main document. List commentRangeStartToDelete = doc.Descendants(). Where(c => c.Id is not null && c.Id.HasValue && commentIds.Contains(c.Id.Value)).ToList(); foreach (CommentRangeStart c in commentRangeStartToDelete) < c.Remove(); >// Delete CommentRangeEnd for each deleted comment in the main document. List commentRangeEndToDelete = doc.Descendants(). Where(c => c.Id is not null && c.Id.HasValue && commentIds.Contains(c.Id.Value)).ToList(); foreach (CommentRangeEnd c in commentRangeEndToDelete) < c.Remove(); >// Delete CommentReference for each deleted comment in the main document. List commentRangeReferenceToDelete = doc.Descendants(). Where(c => c.Id is not null && c.Id.HasValue && commentIds.Contains(c.Id.Value)).ToList(); foreach (CommentReference c in commentRangeReferenceToDelete) < c.Remove(); >// Save changes back to the MainDocumentPart part. doc.Save(); > >
Imports DocumentFormat.OpenXml.Packaging Imports DocumentFormat.OpenXml.Wordprocessing Module Program Sub Main(args As String()) End Sub ' Delete comments by a specific author. Pass an empty string for the author ' to delete all comments, by all authors. Public Sub DeleteComments(ByVal fileName As String, Optional ByVal author As String = "") ' Get an existing Wordprocessing document. Using document As WordprocessingDocument = WordprocessingDocument.Open(fileName, True) ' Set commentPart to the document ' WordprocessingCommentsPart, if it exists. Dim commentPart As WordprocessingCommentsPart = document.MainDocumentPart.WordprocessingCommentsPart ' If no WordprocessingCommentsPart exists, there can be no ' comments. Stop execution and return from the method. If (commentPart Is Nothing) Then Return End If ' Create a list of comments by the specified author, or ' if the author name is empty, all authors. Dim commentsToDelete As List(Of Comment) = commentPart.Comments.Elements(Of Comment)().ToList() If Not String.IsNullOrEmpty(author) Then commentsToDelete = commentsToDelete. Where(Function(c) c.Author = author).ToList() End If Dim commentIds As IEnumerable(Of String) = commentsToDelete.Select(Function(r) r.Id.Value) ' Delete each comment in commentToDelete from the Comments ' collection. For Each c As Comment In commentsToDelete c.Remove() Next ' Save the comment part change. commentPart.Comments.Save() Dim doc As Document = document.MainDocumentPart.Document ' Delete CommentRangeStart for each ' deleted comment in the main document. Dim commentRangeStartToDelete As List(Of CommentRangeStart) = doc.Descendants(Of CommentRangeStart). Where(Function(c) commentIds.Contains(c.Id.Value)).ToList() For Each c As CommentRangeStart In commentRangeStartToDelete c.Remove() Next ' Delete CommentRangeEnd for each deleted comment in main document. Dim commentRangeEndToDelete As List(Of CommentRangeEnd) = doc.Descendants(Of CommentRangeEnd). Where(Function(c) commentIds.Contains(c.Id.Value)).ToList() For Each c As CommentRangeEnd In commentRangeEndToDelete c.Remove() Next ' Delete CommentReference for each deleted comment in the main document. Dim commentRangeReferenceToDelete As List(Of CommentReference) = doc.Descendants(Of CommentReference). Where(Function(c) commentIds.Contains(c.Id.Value)).ToList For Each c As CommentReference In commentRangeReferenceToDelete c.Remove() Next ' Save changes back to the MainDocumentPart part. doc.Save() End Using End Sub End Module
См. также
Как удалить комментарии из кода?
Есть папка под именем source в которой есть подпапки, в которых собственно размещены файлы с кодом (Например JS). Мне нужно при помощи cmd или PowerShell скрипта используя регулярку выше обработать все эти файлы и сохранить копии в папку runtime рядом с папкой source сохраняя дерево папок тем же, но уже без комментариев в файлах.
P.S. Я могу сделать программу консольную с таким функционалом, но думаю, что это излишне, по этому при помощи cmd или PowerShell (желательно). Сейчас хожу по сайтам ищу то что нужно, просто заранее создал вопрос, вдруг не найду в сети.
- Вопрос задан более трёх лет назад
- 233 просмотра
4 комментария
Простой 4 комментария
Удаление комментариев кода (Си/Си++)
Напишите программу, убирающую все комментарии из любой Си-программы. Не забудьте должным образом обработать строки символов и строковые константы. Комментарии в Си не могут быть вложены друг в друга.
Идея:
Считать код из входного файла, удалить комментарии в коде и вывести в выходной файл. В качестве кода используем код самой программы.
Решение (Visual studio):
#include "stdio.h" #include "stdlib.h" int main() < char c; FILE *fin, *fout; fopen_s(&fin, "in.txt", "r"); //чтение файла fopen_s(&fout, "out.txt", "w"); //запись файла while ((c = fgetc(fin)) != EOF) //конец потока < if (c != '/') < fputc(c, fout); >else if ((c = fgetc(fin)) == '/') < while (c != '\n') < fputc(' ', fout); c = fgetc(fin); >fputc('\n', fout); > else < fputc('/', fout); fputc(c, fout); >> fclose(fout); //закрыть fclose(fin); return 0; >
Пример входного файла in.txt:

Пример выходного файла out.txt: