aspnetcore/src/Microsoft.AspNetCore.Html.A.../HtmlContentBuilder.cs

139 lines
4.0 KiB
C#

// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System;
using System.Collections.Generic;
using System.IO;
using System.Text.Encodings.Web;
namespace Microsoft.AspNetCore.Html
{
/// <summary>
/// An <see cref="IHtmlContentBuilder"/> implementation using an in memory list.
/// </summary>
public class HtmlContentBuilder : IHtmlContentBuilder
{
/// <summary>
/// Creates a new <see cref="HtmlContentBuilder"/>.
/// </summary>
public HtmlContentBuilder()
: this(new List<object>())
{
}
/// <summary>
/// Creates a new <see cref="HtmlContentBuilder"/> with the given initial capacity.
/// </summary>
/// <param name="capacity">The initial capacity of the backing store.</param>
public HtmlContentBuilder(int capacity)
: this(new List<object>(capacity))
{
}
/// <summary>
/// Creates a new <see cref="HtmlContentBuilder"/> with the given list of entries.
/// </summary>
/// <param name="entries">
/// The list of entries. The <see cref="HtmlContentBuilder"/> will use this list without making a copy.
/// </param>
public HtmlContentBuilder(IList<object> entries)
{
if (entries == null)
{
throw new ArgumentNullException(nameof(entries));
}
Entries = entries;
}
// This is not List<IHtmlContent> because that would lead to wrapping all strings to IHtmlContent
// which is not space performant.
//
// In general unencoded strings are added here. We're optimizing for that case, and allocating
// a wrapper when encoded strings are used.
//
// internal for testing.
internal IList<object> Entries { get; }
/// <inheritdoc />
public IHtmlContentBuilder Append(string unencoded)
{
if (!string.IsNullOrEmpty(unencoded))
{
Entries.Add(unencoded);
}
return this;
}
/// <inheritdoc />
public IHtmlContentBuilder AppendHtml(IHtmlContent htmlContent)
{
if (htmlContent == null)
{
return this;
}
Entries.Add(htmlContent);
return this;
}
/// <inheritdoc />
public IHtmlContentBuilder AppendHtml(string encoded)
{
if (!string.IsNullOrEmpty(encoded))
{
Entries.Add(new HtmlEncodedString(encoded));
}
return this;
}
/// <inheritdoc />
public IHtmlContentBuilder Clear()
{
Entries.Clear();
return this;
}
/// <inheritdoc />
public void WriteTo(TextWriter writer, HtmlEncoder encoder)
{
if (writer == null)
{
throw new ArgumentNullException(nameof(writer));
}
if (encoder == null)
{
throw new ArgumentNullException(nameof(encoder));
}
for (var i = 0; i < Entries.Count; i++)
{
var entry = Entries[i];
var entryAsString = entry as string;
if (entryAsString != null)
{
encoder.Encode(writer, entryAsString);
}
else
{
// Only string, IHtmlContent values can be added to the buffer.
((IHtmlContent)entry).WriteTo(writer, encoder);
}
}
}
private string DebuggerToString()
{
using (var writer = new StringWriter())
{
WriteTo(writer, HtmlEncoder.Default);
return writer.ToString();
}
}
}
}