File: TagHelpers\CustomEncoderTagHelper.cs
Web Access
Project: src\src\Mvc\test\WebSites\TagHelpersWebSite\TagHelpersWebSite.csproj (TagHelpersWebSite)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
 
using System.Text.Encodings.Web;
using Microsoft.AspNetCore.Razor.TagHelpers;
 
namespace TagHelpersWebSite.TagHelpers;
 
[HtmlTargetElement("pre")]
public class CustomEncoderTagHelper : TagHelper
{
    public override int Order => 1;
 
    public override async Task ProcessAsync(TagHelperContext context, TagHelperOutput output)
    {
        var encoder = new CustomEncoder();
        var customContent = await output.GetChildContentAsync(encoder);
 
        // Note this is very unsafe. Should always post-process content that may not be fully HTML encoded before
        // writing it into a response. Here for example, could pass SetContent() a string and that would be
        // HTML encoded later.
        output.PreContent
            .SetHtmlContent("Custom encoder: ")
            .AppendHtml(customContent)
            .AppendHtml("<br />");
    }
 
    // Simple encoder that just wraps "string" as "Custom[[string]]". Note: Lacks all parameter checks.
    private class CustomEncoder : HtmlEncoder
    {
        public CustomEncoder()
        {
        }
 
        public override int MaxOutputCharactersPerInputCharacter => 1;
 
        public override string Encode(string value) => $"Custom[[{ value }]]";
 
        public override void Encode(TextWriter output, char[] value, int startIndex, int characterCount)
        {
            if (characterCount == 0)
            {
                return;
            }
 
            output.Write("Custom[[");
            output.Write(value, startIndex, characterCount);
            output.Write("]]");
        }
 
        public override void Encode(TextWriter output, string value, int startIndex, int characterCount)
        {
            if (characterCount == 0)
            {
                return;
            }
 
            output.Write("Custom[[");
            output.Write(value.Substring(startIndex, characterCount));
            output.Write("]]");
        }
 
        public override unsafe int FindFirstCharacterToEncode(char* text, int textLength) => -1;
 
        public override unsafe bool TryEncodeUnicodeScalar(
            int unicodeScalar,
            char* buffer,
            int bufferLength,
            out int numberOfCharactersWritten)
        {
            numberOfCharactersWritten = 0;
 
            return false;
        }
 
        public override bool WillEncode(int unicodeScalar) => false;
    }
}