1 //===--- Markup.h -------------------------------------------*- C++-*------===//
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7 //===----------------------------------------------------------------------===//
9 // A model of formatted text that can be rendered to plaintext or markdown.
11 //===----------------------------------------------------------------------===//
12 #ifndef LLVM_CLANG_TOOLS_EXTRA_CLANGD_SUPPORT_MARKUP_H
13 #define LLVM_CLANG_TOOLS_EXTRA_CLANGD_SUPPORT_MARKUP_H
15 #include "llvm/Support/raw_ostream.h"
25 /// Holds text and knows how to lay it out. Multiple blocks can be grouped to
26 /// form a document. Blocks include their own trailing newlines, container
27 /// should trim them if need be.
30 virtual void renderMarkdown(llvm::raw_ostream
&OS
) const = 0;
31 virtual void renderPlainText(llvm::raw_ostream
&OS
) const = 0;
32 virtual std::unique_ptr
<Block
> clone() const = 0;
33 std::string
asMarkdown() const;
34 std::string
asPlainText() const;
36 virtual bool isRuler() const { return false; }
37 virtual ~Block() = default;
40 /// Represents parts of the markup that can contain strings, like inline code,
41 /// code block or plain text.
42 /// One must introduce different paragraphs to create separate blocks.
43 class Paragraph
: public Block
{
45 void renderMarkdown(llvm::raw_ostream
&OS
) const override
;
46 void renderPlainText(llvm::raw_ostream
&OS
) const override
;
47 std::unique_ptr
<Block
> clone() const override
;
49 /// Append plain text to the end of the string.
50 Paragraph
&appendText(llvm::StringRef Text
);
52 /// Append inline code, this translates to the ` block in markdown.
53 /// \p Preserve indicates the code span must be apparent even in plaintext.
54 Paragraph
&appendCode(llvm::StringRef Code
, bool Preserve
= false);
56 /// Ensure there is space between the surrounding chunks.
57 /// Has no effect at the beginning or end of a paragraph.
58 Paragraph
&appendSpace();
66 // Preserve chunk markers in plaintext.
67 bool Preserve
= false;
69 // Whether this chunk should be surrounded by whitespace.
70 // Consecutive SpaceAfter and SpaceBefore will be collapsed into one space.
71 // Code spans don't usually set this: their spaces belong "inside" the span.
72 bool SpaceBefore
= false;
73 bool SpaceAfter
= false;
75 std::vector
<Chunk
> Chunks
;
78 /// Represents a sequence of one or more documents. Knows how to print them in a
79 /// list like format, e.g. by prepending with "- " and indentation.
80 class BulletList
: public Block
{
82 void renderMarkdown(llvm::raw_ostream
&OS
) const override
;
83 void renderPlainText(llvm::raw_ostream
&OS
) const override
;
84 std::unique_ptr
<Block
> clone() const override
;
86 class Document
&addItem();
89 std::vector
<class Document
> Items
;
92 /// A format-agnostic representation for structured text. Allows rendering into
93 /// markdown and plaintext.
97 Document(const Document
&Other
) { *this = Other
; }
98 Document
&operator=(const Document
&);
99 Document(Document
&&) = default;
100 Document
&operator=(Document
&&) = default;
102 void append(Document Other
);
104 /// Adds a semantical block that will be separate from others.
105 Paragraph
&addParagraph();
106 /// Inserts a horizontal separator to the document.
108 /// Adds a block of code. This translates to a ``` block in markdown. In plain
109 /// text representation, the code block will be surrounded by newlines.
110 void addCodeBlock(std::string Code
, std::string Language
= "cpp");
111 /// Heading is a special type of paragraph that will be prepended with \p
112 /// Level many '#'s in markdown.
113 Paragraph
&addHeading(size_t Level
);
115 BulletList
&addBulletList();
117 /// Doesn't contain any trailing newlines.
118 /// We try to make the markdown human-readable, e.g. avoid extra escaping.
119 /// At least one client (coc.nvim) displays the markdown verbatim!
120 std::string
asMarkdown() const;
121 /// Doesn't contain any trailing newlines.
122 std::string
asPlainText() const;
125 std::vector
<std::unique_ptr
<Block
>> Children
;
127 } // namespace markup
128 } // namespace clangd