Class Box<T>
Represents an immutable two-dimensional rectangular box of text. The box can be rendered by an IDocumentRenderer<T> or laid out as part of a Document<T>.
Inheritance
- Object
- Box<T>
Declaration
public abstract class Box<T> : Object
Type Parameters
Name | Description |
---|---|
T |
The type of annotations in the box |
Remarks
Boxes can be composed spatially to create bigger boxes: they can be placed LeftOf(Box<T>, Alignment), RightOf(Box<T>, Alignment), Above(Box<T>, Alignment), and Below(Box<T>, Alignment) one another.
You can also put boxes InFrontOf(Box<T>, Alignment) and Behind(Box<T>, Alignment) one another. Text contained in a box that's placed in front of another box will obscure text contained in in the background box. Additionally, boxes may contain Transparent(Int32, Int32) areas, through which background text will be visible.
The box may contain annotations - values of type
T
- which can be interpreted by the
IDocumentRenderer<T>.
This class is intended to be imported under an alias,
since typically the type of annotations won't change within your code:
using Box = Gutenberg.Box<MyAnnotation>;
Properties
Empty
Declaration
public static Box<T> Empty { get; }
Property Value
Type | Description |
---|---|
Box<T> |
Height
The width of the Box<T> in lines.
Declaration
public int Height { get; }
Property Value
Type | Description |
---|---|
Width
The width of the Box<T> in characters.
Declaration
public int Width { get; }
Property Value
Type | Description |
---|---|
Methods
Above(Box<T>, Alignment)
Creates a new Box<T> consisting of this
box with bottom
placed below it.
If either of the boxes is narrower than the other, it will be
padded with a Transparent(Int32, Int32) box until the
Width matches, according to the chosen
alignment
.
See the docs for Alignment for detailed
examples of how the alignment
affects
the layout of the box.
Declaration
public Box<T> Above(Box<T> bottom, Alignment alignment)
Parameters
Type | Name | Description |
---|---|---|
Box<T> |
bottom |
The Box<T> to place below this one |
alignment |
How to align the boxes if one is narrower than the other. |
Returns
Type | Description |
---|---|
Box<T> |
A Box<T> consisting of this
box with |
Examples
var box = Box.FromString("abc")
.Above("def")
.WithBorder();
Console.Write(box.ToString());
// Output:
// ┌───┐
// │abc│
// │def│
// └───┘
See Also
Annotated(T)
Apply an annotation to the current Box<T>. The annotation will be passed to the IDocumentRenderer<T>.
Declaration
public Box<T> Annotated(T value)
Parameters
Type | Name | Description |
---|---|---|
T |
value |
The annotation |
Returns
Type | Description |
---|---|
Box<T> |
A copy of the current Box<T> with an annotation applied. |
Behind(Box<T>, Alignment)
Returns a new Box<T> consisting of
foreground
overlaid onto this one.
Text contained within foreground
will obscure
any corresponding text in this box. If foreground
has Transparent(Int32, Int32) areas, the content of this box
will be visible through the transparent areas.
If either box is shorter or narrower than the other, it will be
padded with a Transparent(Int32, Int32) box until the sizes match,
according to the chosen alignment
.
See the docs for Alignment for detailed
examples of how the alignment
affects
the layout of the box.
Declaration
public Box<T> Behind(Box<T> foreground, Alignment alignment)
Parameters
Type | Name | Description |
---|---|---|
Box<T> |
foreground |
The Box<T> overlay onto this one |
alignment |
How to align the boxes if one is smaller than the other. |
Returns
Type | Description |
---|---|
Box<T> |
A Box<T> consisting of the content of
|
Examples
// a box with a transparent window in the centre
var mask = Box.Transparent(1, 1)
.LeftOf("*").RightOf("*")
.Above("***").Below("***");
var box = Box.FromString("abcde\nfghij\nklmno")
.Behind(mask, Alignment.CenterStart)
.WithBorder();
Console.Write(box.ToString());
// Output:
// ┌─────┐
// │a***e│
// │f*h*j│
// │k***o│
// └─────┘
See Also
Below(Box<T>, Alignment)
Creates a new Box<T> consisting of this
box with top
placed above it.
If either of the boxes is narrower than the other, it will be
padded with a Transparent(Int32, Int32) box until the
Width matches, according to the chosen
alignment
.
See the docs for Alignment for detailed
examples of how the alignment
affects
the layout of the box.
Declaration
public Box<T> Below(Box<T> top, Alignment alignment)
Parameters
Type | Name | Description |
---|---|---|
Box<T> |
top |
The Box<T> to place above this one |
alignment |
How to align the boxes if one is narrower than the other. |
Returns
Type | Description |
---|---|
Box<T> |
A Box<T> consisting of this
box with |
Examples
var box = Box.FromString("abc")
.Below("def")
.WithBorder();
Console.Write(box.ToString());
// Output:
// ┌───┐
// │def│
// │abc│
// └───┘
See Also
FromString(String)
Creates a Box<T> containing the
specified text
.
Declaration
public static Box<T> FromString(string text)
Parameters
Type | Name | Description |
---|---|---|
text |
The text to place into a Box<T> |
Returns
Type | Description |
---|---|
Box<T> |
A Box<T> containing the
specified |
Remarks
If the text contains line breaks, the resulting box's height will be equal to the number of lines in the text, and its width will be equal to the length of the longest line. Each line will be left-aligned.
InFrontOf(Box<T>, Alignment)
Creates a new Box<T> consisting of this
box overlaid onto background
.
Text contained within this box will obscure any corresponding
text in the background
. If this box has
Transparent(Int32, Int32) areas, the background
will be visible through the transparent areas.
If either box is shorter or narrower than the other, it will be
padded with a Transparent(Int32, Int32) box until the sizes match,
according to the chosen alignment
.
See the docs for Alignment for detailed
examples of how the alignment
affects
the layout of the box.
Declaration
public Box<T> InFrontOf(Box<T> background, Alignment alignment)
Parameters
Type | Name | Description |
---|---|---|
Box<T> |
background |
The Box<T> to place behind this one |
alignment |
How to align the boxes if one is smaller than the other. |
Returns
Type | Description |
---|---|
Box<T> |
A Box<T> consisting of this
box overlaid onto |
Examples
// a box with a transparent window in the centre
var mask = Box.Transparent(1, 1)
.LeftOf("*").RightOf("*")
.Above("***").Below("***");
var box = mask
.InFrontOf("abcde\nfghij\nklmno", Alignment.CenterStart)
.WithBorder();
Console.Write(box.ToString());
// Output:
// ┌─────┐
// │a***e│
// │f*h*j│
// │k***o│
// └─────┘
See Also
LeftOf(Box<T>, Alignment)
Creates a new Box<T> consisting of this
box with right
placed to its right.
If either of the boxes is shorter than the other, it will be
padded with a Transparent(Int32, Int32) box until the
Height matches, according to the chosen
alignment
.
See the docs for Alignment for detailed
examples of how the alignment
affects
the layout of the box.
Declaration
public Box<T> LeftOf(Box<T> right, Alignment alignment)
Parameters
Type | Name | Description |
---|---|---|
Box<T> |
right |
The Box<T> to place to the right of this one |
alignment |
How to align the boxes if one is shorter than the other. |
Returns
Type | Description |
---|---|
Box<T> |
A Box<T> consisting of this
box with |
Examples
var box = Box.FromString(string.Join('\n', "abc".AsEnumerable()))
.LeftOf(string.Join('\n', "def".AsEnumerable()))
.WithBorder();
Console.Write(box.ToString());
// Output:
// ┌──┐
// │ad│
// │be│
// │cf│
// └──┘
See Also
MapAnnotations<U>(Func<T, U>)
Apply a function to all the annotations in the current document.
Declaration
public Box<U> MapAnnotations<U>(Func<T, U> selector)
Parameters
Type | Name | Description |
---|---|---|
Func<T, U> |
selector |
The function to apply to the annotations. |
Returns
Type | Description |
---|---|
Box<U> |
A document with all of the annotations replaced
with the return value of |
Type Parameters
Name | Description |
---|---|
U |
MapAnnotations<U>(Func<T, IEnumerable<U>>)
Apply a function to all the annotations in the current document. If the function returns multiple annotations, the annotations are added in a left-to-right fashion.
Declaration
public Box<U> MapAnnotations<U>(Func<T, IEnumerable<U>> selector)
Parameters
Type | Name | Description |
---|---|---|
Func<T, IEnumerable<U>> |
selector |
The function to apply to the annotations. |
Returns
Type | Description |
---|---|
Box<U> |
A document with all of the annotations replaced
with the return values of |
Type Parameters
Name | Description |
---|---|
U |
Render(IDocumentRenderer<T>, CancellationToken)
Write the contents of this Box<T> into
the renderer
.
Declaration
public ValueTask Render(IDocumentRenderer<T> renderer, CancellationToken cancellationToken = null)
Parameters
Type | Name | Description |
---|---|---|
renderer |
The renderer |
|
cancellationToken |
Returns
Type | Description |
---|---|
A ValueTask which completes when
the box has been written to the |
RightOf(Box<T>, Alignment)
Creates a new Box<T> consisting of this
box with left
placed to its left.
If either of the boxes is shorter than the other, it will be
padded with a Transparent(Int32, Int32) box until the
Height matches, according to the chosen
alignment
.
See the docs for Alignment for detailed
examples of how the alignment
affects
the layout of the box.
Declaration
public Box<T> RightOf(Box<T> left, Alignment alignment)
Parameters
Type | Name | Description |
---|---|---|
Box<T> |
left |
The Box<T> to place to the left of this one |
alignment |
How to align the boxes if one is shorter than the other. |
Returns
Type | Description |
---|---|
Box<T> |
A Box<T> consisting of this
box with |
Examples
var box = Box.FromString(string.Join('\n', "abc".AsEnumerable()))
.RightOf(string.Join('\n', "def".AsEnumerable()))
.WithBorder();
Console.Write(box.ToString());
// Output:
// ┌──┐
// │da│
// │eb│
// │fc│
// └──┘
See Also
Select<U>(Func<T, U>)
Apply a function to all the annotations in the current document.
Declaration
public Box<U> Select<U>(Func<T, U> selector)
Parameters
Type | Name | Description |
---|---|---|
Func<T, U> |
selector |
The function to apply to the annotations. |
Returns
Type | Description |
---|---|
Box<U> |
A document with all of the annotations replaced
with the return value of |
Type Parameters
Name | Description |
---|---|
U |
ToString()
Render this Box<T> as a string
Declaration
public override string ToString()
Returns
Type | Description |
---|---|
Transparent(Int32, Int32)
Creates a transparent Box<T> with the specified dimensions. If the box is placed InFrontOf(Box<T>, Alignment) another box, the other box will be visible through the transparent box.
Declaration
public static Box<T> Transparent(int width, int height)
Parameters
Type | Name | Description |
---|---|---|
width |
The width of the box |
|
height |
The height of the box |
Returns
Type | Description |
---|---|
Box<T> |
A transparent Box<T> |
WithBorder()
Creates a Box<T> consisting of the current box with a border drawn around it.
Declaration
public Box<T> WithBorder()
Returns
Type | Description |
---|---|
Box<T> |
A Box<T> consisting of the current box with a border drawn around it. |
Examples
var box = Box.FromString("abc\ndef\nghi")
.WithBorder();
Console.Write(box);
// Output:
// ┌───┐
// │abc│
// │def│
// │ghi│
// └───┘
Write(TextWriter, CancellationToken)
Write the Box<T> into a TextWriter.
Declaration
public ValueTask Write(TextWriter writer, CancellationToken cancellationToken = null)
Parameters
Type | Name | Description |
---|---|---|
writer |
The TextWriter |
|
cancellationToken |
Returns
Type | Description |
---|---|
A ValueTask which will complete when
the Box<T> has been written to
the |
Operators
Implicit(String to Box<T>)
Implicitly convert a string to a Box<T>
Declaration
public static implicit operator Box<T>(string str)
Parameters
Type | Name | Description |
---|---|---|
str |
Returns
Type | Description |
---|---|
Box<T> |
Remarks
This implicit conversion is equivalent to FromString(String).