功能描述
- 分析和呈现短代码。
- 支持异步短代码,以便在负载下更有效地执行数据库查询和异步操作。
- 命名和定位的参数。
预定义短代码
using Shortcodes;
var processor = new ShortcodesProcessor(new NamedShortcodeProvider
{
["hello"] = (args, content, ctx) => new ValueTask<string>("Hello world!")
});
Console.WriteLine(await processor.EvaluateAsync("This is an [hello]"));
命名参数
参数可以包含任何字符,但如果参数包含空格,则需要用 '或"括起来。字符串可以使用标准字符串转义序列,如 \u03A9 和 \n
var processor = new ShortcodesProcessor(new NamedShortcodeProvider
{
["bold"] = (args, content, ctx) =>
{
var text = args.Named("text");
return new ValueTask<string>(#34;<b>{text}</b>");
}
});
Console.WriteLine(await processor.EvaluateAsync("[bold text='bold text' 1234]"));
内容参数
使用开始和结束标签的简码可以访问其内部内容
var processor = new ShortcodesProcessor(new NamedShortcodeProvider
{
["bold"] = (args, content, ctx) =>
{
return new ValueTask<string>(#34;<b>{content}</b>");
}
});
Console.WriteLine(await processor.EvaluateAsync("[bold]bold text[/bold]"));
对于单个标记,内容为 null。这意味着您可以检测短代码是否与结束标记一起使用,即使内部内容为空
位置参数
如果参数没有名称,则可以使用默认索引
var processor = new ShortcodesProcessor(new NamedShortcodeProvider
{
["bold"] = (args, content, ctx) =>
{
var text = args.NamedOrDefault("text");
return new ValueTask<string>(#34;<b>{text}</b>");
}
});
Console.WriteLine(await processor.EvaluateAsync("[bold 'bold text']"));
//输出:<b>bold text</b>
命名参数和位置参数可以混合在一起。每当参数没有名称时,索引就会递增
var processor = new ShortcodesProcessor(new NamedShortcodeProvider
{
["bold"] = (args, content, ctx) =>
{
var text = args.At(0);
return new ValueTask<string>(#34;<b>{text}</b>");
}
});
Console.WriteLine(await processor.EvaluateAsync("[bold id='a' 'some text']"));
//输出:<b>some text</b>
转义标签
如果要渲染快捷代码而不是对其求值,可以将大括号和大括号加倍。
输入:
[[bold] some text to show [/bold]]
输出:
[bold] some text to show [/bold]
对于单个标签
输入:
[[bold 'text']]
输出:
[bold 'text']
如果使用了多个中括号,并且它们是平衡的,则单个中括号将被转义。
输入:
[[[bold 'text']]]
输出:
[[bold 'text']]
非平衡中括号
输入:
[[[[bold 'text']]
输出:
[[[[bold 'text']]
上下文对象
在计算模板时,可以传递 Context 对象。此对象在所有短代码之间共享
一种常见的用法是传递某些短代码可能使用的自定义数据,例如,如果模板在 Web 应用程序中运行并且需要访问当前请求,则传递当前的 HttpContext。
另一种用法是将其用作可以在短代码之间共享的值包。
// From a Startup.cs class
var processor = new ShortcodesProcessor(new NamedShortcodeProvider
{
["username"] = (args, content, ctx) =>
{
var httpContext = (HttpContext)ctx["HttpContext"];
return new ValueTask<string>(httpContext.User.Identity.Name);
}
});
app.Run((httpContext) =>
{
var context = new Context(){ ["HttpContext"] = httpContext };
var result = await processor.EvaluateAsync("The current user is [username]", context);
return context.Response.WriteAsync(result);
});
//输出:The current user is admin