// 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.Text;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Html;
using Microsoft.AspNetCore.Mvc.Internal;
namespace Microsoft.AspNetCore.Mvc.ViewFeatures.Internal
{
///
/// implementation which writes to an instance.
///
public class HtmlContentWrapperTextWriter : HtmlTextWriter
{
private const int MaxCharToStringLength = 1024;
///
/// Initializes a new instance of the class.
///
/// The to write to.
/// The in which output is written.
public HtmlContentWrapperTextWriter(IHtmlContentBuilder contentBuilder, Encoding encoding)
{
if (contentBuilder == null)
{
throw new ArgumentNullException(nameof(contentBuilder));
}
if (encoding == null)
{
throw new ArgumentNullException(nameof(encoding));
}
ContentBuilder = contentBuilder;
Encoding = encoding;
}
///
/// The this writes to.
///
public IHtmlContentBuilder ContentBuilder { get; }
///
public override Encoding Encoding { get; }
///
public override void Write(char value)
{
Write(value.ToString());
}
///
public override void Write(char[] buffer, int index, int count)
{
if (buffer == null)
{
throw new ArgumentNullException(nameof(buffer));
}
if (index < 0)
{
throw new ArgumentOutOfRangeException(nameof(index));
}
if (count < 0 || (index + count > buffer.Length))
{
throw new ArgumentOutOfRangeException(nameof(count));
}
while (count > 0)
{
// Split large char arrays into 1KB strings.
var currentCount = count;
if (MaxCharToStringLength < currentCount)
{
currentCount = MaxCharToStringLength;
}
Write(new string(buffer, index, currentCount));
index += currentCount;
count -= currentCount;
}
}
///
public override void Write(string value)
{
if (string.IsNullOrEmpty(value))
{
return;
}
ContentBuilder.Append(value);
}
///
public override void Write(IHtmlContent value)
{
if (value == null)
{
throw new ArgumentNullException(nameof(value));
}
ContentBuilder.AppendHtml(value);
}
///
public override Task WriteAsync(char value)
{
Write(value.ToString());
return TaskCache.CompletedTask;
}
///
public override Task WriteAsync(char[] buffer, int index, int count)
{
if (buffer == null)
{
throw new ArgumentNullException(nameof(buffer));
}
Write(buffer, index, count);
return TaskCache.CompletedTask;
}
///
public override Task WriteAsync(string value)
{
Write(value);
return TaskCache.CompletedTask;
}
///
public override void WriteLine()
{
Write(Environment.NewLine);
}
///
public override void WriteLine(string value)
{
Write(value);
WriteLine();
}
///
public override Task WriteLineAsync(char value)
{
WriteLine(value);
return TaskCache.CompletedTask;
}
///
public override Task WriteLineAsync(char[] value, int start, int offset)
{
WriteLine(value, start, offset);
return TaskCache.CompletedTask;
}
///
public override Task WriteLineAsync(string value)
{
WriteLine(value);
return TaskCache.CompletedTask;
}
///
public override Task WriteLineAsync()
{
WriteLine();
return TaskCache.CompletedTask;
}
}
}