16个版本

0.1.14 2024年7月9日
0.1.13 2024年2月9日
0.1.12 2024年1月30日
0.1.8 2023年11月15日
0.1.4 2022年11月6日

#252解析器实现

Download history 3/week @ 2024-04-19 2/week @ 2024-04-26 1/week @ 2024-05-17 4/week @ 2024-05-31 12/week @ 2024-06-07 4/week @ 2024-06-14 110/week @ 2024-07-05 22/week @ 2024-07-12 11/week @ 2024-07-19 149/week @ 2024-07-26 15/week @ 2024-08-02

每月206次下载

MPL-2.0许可证

68KB
1.5K SLoC

gigtag

crates.io Docs Dependencies Testing License: MPL 2.0

轻量级的文本标签系统,旨在为DJ管理自定义元数据。

结构

gig tag是一个具有以下预定义字段或组件的平面结构:

  • 标签
  • 方面(包括可选的日历日期)
  • 属性

所有组件都是可选的,以下有一些限制:

  • 有效的gig tag必须有一个标签或一个方面
  • 有效的gig tag只有方面,既没有标签也没有属性,如果方面有日期后缀,则是有效的

标签

标签是一个非空字符串,包含任意文本,没有前导/尾随空白。

标签应由用户编辑,并在UI中以原始形式显示。

示例

标签 评论
愿望清单 单个单词
地板填充物 以PascalCase连接的多个单词
地板填充物 以空格分隔的多个单词

方面

适用于标签的内容规则也适用于方面。此外,方面不得以反斜杠字符开始,否则会与序列化格式冲突(见下文)。

方面与标签具有不同的语义目的。它们用于分类、命名空间或对一组标签进行分组,或用于定义相关属性的上下文。

方面应表示预定义标识符,既不可编辑也不直接在UI中显示。

日期类型方面

可以保留后缀将日历日期编码到方面。

以8位十进制数字结束的方面,后面跟着一个@字符,被认为是日期类型方面。数字应编码ISO 8601日历日期,不包含时区,格式为yyyyMMdd

即使8位十进制数字不编码有效日期,也视为日期类型。这种较宽松的约束是故意选择的,以便可以使用正则表达式识别日期类型方面。

日期后缀中的 @ 字符必须紧跟在前面文本之后,中间不能有空格。因此,在去除日期后缀后剩下的前缀仍然是有效的属性。

以下正则表达式可以用来

正则表达式 描述
(^|[^\s])@\d{8}$ 识别日期类似的属性
[\s]+@\d{8}$ 如果前面有空格,则拒绝具有日期后缀的属性

有效示例

方面 描述
spotify 一个用于编码与 Spotify 相关属性的标签
@20220625 没有前缀的日期类似属性,表示任何时区的日历日 2022-06-25
wishlist@20220625 具有前缀 wishlist 的日期类似属性,表示任何时区的日历日 2022-06-25
@00000000 没有前缀和无效日期的日期类似属性
abc xyz@99999999 具有前缀 abc xyz 和无效日期的日期类似属性

无效示例

方面 描述
played@20220625 包含日期后缀之前有空格的前缀的无效日期类似属性

属性

可以将自定义 属性附加到标签上,简称 props

属性以非空、有序的 列表 的形式表示。

名称 是非空字符串,包含任意文本,没有前导/尾随空格。没有对名称唯一性的限制,即允许重复名称。

是任意字符串,没有任何限制。允许空值。

应用程序负责在其相应上下文中解释名称和值。属性可以用于定义此上下文。

序列化

单个标签

单个标签编码为 URI

URI = scheme ":" ["//" authority] path ["?" query] ["#" fragment] > authority = [userinfo "@"] host [":" port]

只有 路径查询片段 组件可以存在。所有其他组件都必须不存在,即 URI 字符串必须既不包含 方案 也不包含 授权 组件。

以下表格定义了组件映射

标签组件 URI 组件 百分号编码字符集
标签 片段 片段百分号编码集 + '%'
属性 路径 路径百分号编码集 + '%'
props(名称/值) 查询 查询百分号编码集 + '%' + '&' + '='

标签及其各自的URI被序列化为文本,并按照RFC 2396/1738进行百分号编码。上述表格指定了每个标签组件需要编码的字符。属性名/值分别进行编码。

在解析URI字符串中的gig标签时,空组件被视为不存在。

示例

以下示例显示了空组件的编码字符串变异,这些空组件在解码URI时将被忽略。

编码 方面 日期 标签 属性:名称 属性:值
#MyTag
?#MyTag
MyTag
wishlist@20220625#%20you wishlist@20220625 2022-06-25 为你
played@20220625
played@20220625?
played20220625#
played@20220625?#
played@20220625 2022-06-25
audio-features?energy=0.78&valence=0.61
audio-features?energy=0.78&valence=0.61#
audio-features energy
valence
0.78
0.61

示例(无效)

以下令牌不代表有效的gig标签

编码 评论
https://#MyTag 存在URL方案/权限
My%20Tag 仅有一个没有日期的方面,既没有标签也没有属性
/my-facet#Label 方面以/开头
wishlist%20@20220625#标签 方面中的日期后缀前有空白字符
?=val#标签 空属性名
?name=my+val#My label 特殊字符如+和空白字符不进行百分号编码
# 空标签被视为不存在
? 空方面和属性被视为不存在
?# 空方面、属性和标签被视为不存在

多个标签

格式化

通过连接相应的、编码的URI,对多个标签进行格式化和存储为文本。后续URI由空白字符分隔,例如单个ASCII空格字符。

后配

通常无法将编码的gig标签存储在预留字段中。在这种情况下,gig标签可以与任何文本字段一起附加,通过与前一个文本中的任意空白字符进行分隔。

解析

文本被分割成由空白字符分隔的令牌。解析从最后一个令牌开始,从后向前继续。它停止遇到一个无法解析为有效gig标签的令牌。

后配

第一个无法解析为有效gig标签的令牌被视为前一个文本的最后一个令牌。包括此令牌及其前第一个有效gig标签令牌之间的空白字符必须保留为未解码的前缀

在重新编码gig标签时,在解析过程中捕获的未解码的前缀必须附加到重新编码的gig标签字符串前。此规则确保在解码/重新编码往返过程中只能丢失空白字符,即在不故意解析前一个文本中的任意单词作为有效gig标签(假阳性)时。

存储

文件元数据

包含编码gig标签的文本(通过空白字符分隔)附加到音频文件的内容组字段

  • ID3v2: GRP1(主要/首选)/ TIT11(传统/备用)
  • Vorbis: GROUPING
  • MPEG-4: ©grp

许可

根据Mozilla公共许可证2.0(MPL-2.0)许可(见MPL-2.0.txthttps://www.mozilla.org/MPL/2.0/)。

本开源许可证的权限取决于提供受许可文件的源代码及其修改版本,这些修改版本应使用相同的许可证(或在某些情况下,使用GNU许可证之一)。必须保留版权和许可证声明。贡献者提供专利权的明确授予。然而,使用许可作品的较大作品可能根据不同的条款进行分发,并且不提供较大作品中添加的文件的源代码。

贡献

您有意提交以包含在作品中的任何贡献均应按照Mozilla公共许可证2.0(MPL-2.0)进行许可。

必须在每个文件的顶部添加以下带有相应SPDX简短标识符的标题。

// SPDX-License-Identifier: MPL-2.0

依赖关系

约5-7MB
约151K SLoC