简介#
[1]:
#r "nuget:YiJingFramework.Annotating"
#r "nuget:YiJingFramework.PrimitiveTypes"
using System.Diagnostics;
using System.Text.Json;
using YiJingFramework.Annotating;
using YiJingFramework.PrimitiveTypes;
Installed Packages
- YiJingFramework.Annotating, 5.0.1
- YiJingFramework.PrimitiveTypes, 4.0.1
此包提供了一个泛用的注解仓库结构。所谓的注解,例如《周易》就是为卦和卦爻所作的注解。
此仓库关注的是通用结构,如果只关注《周易》,可以使用 YiJingFramework.Annotating.Zhouyi 。
此包原来给出的结构相对复杂,有好多种可以作为 key 的类型,比如一整个卦、某几根爻。但是在 4.0.0 版本之后,只有字符串类型可以作为 key ,因此现在的结构是非常简单的。
每个 AnnotationStore 应该对应一个 json 文件,其中包含一个 string? Title (对应的 json 文件中为 n )、一个 IList<string> Tags ( t )和一个 IList<AnnotationGroup> Groups ( g )。其中每个 AnnotationGroup 又包含 string? Title ( t )、 string? Comment ( c )和 IList<AnnotationEntry> Entries ( e )。而每个 AnnotationEntry 中又包含 string? Target ( t )和 string? Content ( c )。
举例而言:
[2]:
var store = new AnnotationStore()
{
Title = "Sample Store"
};
store.Tags.Add("Tag1");
store.Tags.Add("Tag2");
store.Tags.Add("Tag3");
var qian = new Gua(Enumerable.Repeat(Yinyang.Yang, 3));
var kun = new Gua(Enumerable.Repeat(Yinyang.Yin, 3));
var namingGroup = store.AddGroup(title: "Gua Name", comment: "Names of the Guas");
namingGroup.AddEntry(qian.ToString(), "Qian");
namingGroup.AddEntry(kun.ToString(), "Kun");
var options = new JsonSerializerOptions() { WriteIndented = true };
var serialized = store.SerializeToJsonString(options);
Console.WriteLine(serialized);
var d = AnnotationStore.DeserializeFromJsonString(serialized);
Debug.Assert(d is not null);
Console.WriteLine(d.Groups.Single(x => x.Title == "Gua Name").Entries[0].Target); // 111
{
"n": "Sample Store",
"t": [
"Tag1",
"Tag2",
"Tag3"
],
"g": [
{
"t": "Gua Name",
"e": [
{
"t": "111",
"c": "Qian"
},
{
"t": "000",
"c": "Kun"
}
],
"c": "Names of the Guas"
}
]
}
111
总之,这个包给出的是通用结构,没有具体关注的内容。除非是在自己制作一种新的注解仓库,一般情况下不会直接依赖此包。