78 lines
2 KiB
C#
78 lines
2 KiB
C#
using System;
|
|
using System.Buffers;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using System.Threading.Tasks;
|
|
|
|
namespace Nyanbyte.Minime.Processing;
|
|
|
|
public class CssProcessor : IProcessor
|
|
{
|
|
internal const string
|
|
L_COMMENT_OPEN = "/*",
|
|
L_COMMENT_CLOSE = "*/";
|
|
internal const char
|
|
L_STRING = '"',
|
|
L_STRING_C = '\'',
|
|
L_SEMI = ';';
|
|
|
|
public async Task Execute(FileContext ctx, CancellationToken cancellation)
|
|
{
|
|
var write = ctx.Output;
|
|
var read = ctx.Input;
|
|
|
|
bool isQuote = false, isComment = false;
|
|
|
|
Memory<char> buf = MemoryPool<char>.Shared.Rent(32 * 1024).Memory;
|
|
int len = await read.ReadBlockAsync(buf, cancellation);
|
|
|
|
for (int i = 0; i < len; i++)
|
|
{
|
|
char c = buf.Span[i];
|
|
|
|
if (isComment)
|
|
{
|
|
if (buf.Slice(i, 2).Span.SequenceEqual(L_COMMENT_CLOSE))
|
|
{
|
|
isComment = false;
|
|
++i;
|
|
continue;
|
|
}
|
|
}
|
|
|
|
|
|
switch (c)
|
|
{
|
|
case L_STRING or L_STRING_C:
|
|
isQuote = !isQuote;
|
|
continue;
|
|
case ' ':
|
|
if (!isQuote)
|
|
continue;
|
|
await write.WriteAsync(c);
|
|
break;
|
|
case '\n':
|
|
continue;
|
|
case '/':
|
|
if (!isQuote)
|
|
{
|
|
if (buf.Slice(i, 2).Span.SequenceEqual(L_COMMENT_OPEN))
|
|
{
|
|
isComment = true;
|
|
++i;
|
|
continue;
|
|
}
|
|
|
|
}
|
|
continue;
|
|
default:
|
|
if (isQuote)
|
|
{
|
|
await write.WriteAsync(c);
|
|
continue;
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|