AnyMath 文档

[医]杂丝

请注意,StyledStrings和AnnotatedStrings的API被认为是实验性的,并且在Julia版本之间可能会发生变化。

造型设计

在处理字符串时,格式化和样式通常作为次要问题出现。

例如,当打印到终端时,您可能需要洒https://en.wikipedia.org/wiki/ANSI_escape_code#SGR_(Select_Graphic_Rendition)_parameters[ANSI转义序列]在输出时,输出HTML样式构造(<span style="。.."> 等。)服务于类似的目的,等等。 可以简单地将原始样式结构插入到内容本身旁边的字符串中,但很快就会发现,除了最基本的用例之外,这并不适合任何东西。 并非所有终端都支持相同的ANSI代码,在计算已样式内容的宽度时,样式结构需要费力地删除,这是在您处理多种输出格式之前。

而不是让这种头痛被广泛的下游体验,而是通过引入一种特殊的字符串类型(注释字符串). 此字符串类型包装任何其他 抽象字符串键入并允许将格式信息应用于区域(例如,字符1到7是粗体和红色)。

字符串的区域通过应用设置样式 脸部s(想想"字体")给他们—​一个保存样式信息的结构。 为方便起见,全局面孔字典中的面孔(例如 影子)可以命名而不是给 脸部直接。

除了这些功能外,我们还提供了一种方便的构建方法 注释字符串s,详细在 样式字符串文字

带注释的字符串

有时,能够保存与字符串区域相关的元数据是很有用的。 A 注释字符串包装另一个字符串,并允许用标记的值(:标签=>值). 所有泛型字符串操作都应用于基础字符串。 但是,在可能的情况下,样式信息会被保留。 这意味着你可以操纵一个 注释字符串--取子字符串,填充它们,将它们与其他字符串连接起来—​元数据注释将"顺其自然"。

此字符串类型是基本的 StyledStrings stdlib,它使用 :脸-标记注释以保存样式信息。

当连接一个 注释字符串,小心使用 注释字符串而不是 字符串如果你想保留字符串注释。

julia> str = AnnotatedString("hello there", [(1:5, :word, :greeting), (7:11, :label, 1)])
"hello there"

julia> length(str)
11

julia> lpad(str, 14)
"   hello there"

julia> typeof(lpad(str, 7))
AnnotatedString{String}

julia> str2 = AnnotatedString(" julia", [(2:6, :face, :magenta)])
" julia"

julia> annotatedstring(str, str2)
"hello there julia"

julia> str &ast; str2 == annotatedstring(str, str2) # &ast;-concatenation works
true

A的注释 注释字符串可透过 说明注释!功能。

造型通过 注释字符串s

面孔

脸部 类型

A 脸部指定文本可以设置的字体的详细信息。 它涵盖了一组基本属性,这些属性在不同的格式中很好地概括,即:

* 字体 * 身高 * 重量 * 倾斜,倾斜 * 前景 * 背景资料 * 下划线 * 删除线 * * 继承

有关这些属性采用的特定形式的详细信息,请参阅 脸部docstring,但特别感兴趣的是 继承 因为它允许您从其他属性_inherit_属性 脸部s.

全球面孔词典

为了使引用特定样式更方便,有一个全局 Dict,Dict{Symbol, Face} 这允许 脸部[英语背诵文选简单地用名字来称呼。 包可以通过 xref:stdlib/StyledStrings.adoc#StyledStrings.addface![脸!功能,加载的面可以很容易地 定制

适当的脸部命名任何注册新脸部的包都应该确保它们以包名称为前缀,即遵循格式 我的脸. 这对于可预测性和防止名称冲突非常重要。

此外,包应该注意使用(并引入)_semantic_faces(如 `密码`)超过直接的颜色和样式(如 `青色`). 这在许多方面都很有用,从使使用意图更明显,帮助可组合性,以及使用户自定义更直观。

包前缀规则有两组豁免:

*作为faces字典默认值一部分的基本面孔集 *Julia自己的标准库引入的faces,即 [医]照明

基本面孔

基本面旨在表示广泛适用的一般想法。

为了设置一些具有特定属性的文本,我们有 大胆的, , 斜体, 下划线, 删除线,而 面孔。

还有16种终端颜色的命名面孔: 黑色, 红色, 绿色, 黄色, 蓝色, 品红色, 青色, 白色, 明亮的,明亮的/灰色/灰色, 明亮的,明亮的, 明亮的绿色, 明亮的蓝色, 明亮的,明亮的, 明亮的,明亮的,而 明亮的白色.

对于阴影文本(即暗淡但有)有 影子 脸。 要表示选定的区域,有 区域 脸。 同样,强调和突出 重点重点介绍 面进行定义。 还有 密码 为类似代码的文本。

为了直观地指示消息的严重性, 错误, 警告, 成功, 资料, 注意事项,而 小费 面进行定义。

脸部定制(面孔。汤姆尔)

全局人脸字典中的名称人脸可自定义是很好的。 主题和美学很好,而且由于可访问性原因也很重要。 一个TOML文件可以被解析成一个列表 脸部与人脸字典中预先存在的条目合并的规范。

A 脸部在TOML中是这样表示的:

[facename]
attribute = "value"
...

[package.facename]
attribute = "value"

例如,如果 影子 脸太难读它可以像这样变得更亮:

[shadow]
foreground = "white"

在初始化时, 配置/面孔。汤姆尔 第一个Julia depot下的文件(通常 ~/.朱莉娅)被加载。

将面应用于 注释字符串

按照惯例, :脸 a的属性 注释字符串持有有关 脸部`目前适用的。 这可以以多种形式给出,作为单个 `符号 命名a xref:stdlib/StyledStrings.adoc#StyledStrings.Face[脸部s在全局人脸字典中,a 脸部本身,或任一者的向量。

show(::IO,::MIME"text/plain",::AnnotatedString)show(::IO,::MIME"text/html",::AnnotatedString) 方法都看 :脸 属性,并在确定整体造型时将它们全部合并在一起。

我们可以供应 :脸 a的属性 注释字符串 在构建过程中,之后将它们添加到属性列表中,或者使用方便的 样式字符串文字

样式字符串文字

为了便于施工 注释字符串s与 脸部s应用, 风格"。.."样式字符串文字允许内容和属性通过自定义语法轻松地表达在一起。

内一 风格"。.."字面,花括号被认为是特殊字符,必须在正常用法中进行转义(\{, \}). 这允许它们用于用(nestable)表示注释 {annotations...:text} 构造物。

注释。.. 组件是由三种类型的注释组成的逗号分隔列表。

*脸部名称 *内联 脸部 表达方式 (键=val,...) * 键=值 对,对

除了内联面键之外,任何地方都可以进行插值。

有关语法的更多信息,请参阅 风格"。.."docstring。

作为一个例子,我们可以演示上面提到的内置面列表,如下所示:

julia> println(styled"
The basic font-style attributes are {bold:bold}, {light:light}, {italic:italic},
{underline:underline}, and {strikethrough:strikethrough}.

In terms of color, we have named faces for the 16 standard terminal colors:
 {black:■} {red:■} {green:■} {yellow:■} {blue:■} {magenta:■} {cyan:■} {white:■}
 {bright_black:■} {bright_red:■} {bright_green:■} {bright_yellow:■} {bright_blue:■} {bright_magenta:■} {bright_cyan:■} {bright_white:■}

Since {code:bright_black} is effectively grey, we define two aliases for it:
{code:grey} and {code:gray} to allow for regional spelling differences.

To flip the foreground and background colors of some text, you can use the
{code:inverse} face, for example: {magenta:some {inverse:inverse} text}.

基于意图的基本面是 {shadow:shadow} (对于暗淡但可见的文本),
{region:region} 供选择, {emphasis:emphasis},而 {highlight:highlight}.
如上, {code:code} 用于类似代码的文本。

最后,我们有"消息严重性"面孔: {error:error}, {warning:warning},
{success:success}, {info:info}, {note:note},而 {tip:tip}.

请记住,所有这些面(以及任何用户或包定义的面)都可以
任意嵌套和重叠, {region,tip:like {bold,italic:so}}.")
 基本的字体样式属性是粗体、浅体、斜体,
 下划线和删除线。

 在颜色方面,我们为16种标准终端颜色命名了面孔:
  ■ ■ ■ ■ ■ ■ ■ ■
  ■ ■ ■ ■ ■ ■ ■ ■

 由于bright_black实际上是灰色的,我们为它定义了两个别名:
 灰色和灰色以允许区域拼写差异。

 要翻转某些文本的前景色和背景色,您可以使用
 逆面,例如:一些逆文字。

 基于意图的基本面是阴影(对于暗淡但可见的文本),
 用于选择、强调和突出显示的区域。
 如上所述,代码用于类似代码的文本。

 最后,我们有"消息严重性"面临:错误,警告,
 成功,信息,注意和提示。

 请记住,所有这些面(以及任何用户或包定义的面)都可以
 任意嵌套和重叠,就像这样。

空气污染指数参考

造型和面部

@styled_str -> AnnotatedString

构造样式字符串。 字符串内, {<specs>:<content>} 结构将格式应用于 <内容>,根据逗号分隔的规格列表 <规格>. 每个规范可以采用人脸名称、内联人脸规范或 键=值 一对。 该值必须由 {...} 它应该包含任何字符吗 ,=:{}.

字符串插值与 $ 函数的方式与常规字符串相同,但引号需要转义。 面、键和值也可以用 $.

*例子*

styled"The {bold:{italic:quick} {(foreground=#cd853f):brown} fox} jumped over the {link={https://en.wikipedia.org/wiki/Laziness}:lazy} dog"

*扩展帮助*

这个宏可以用下面的EBNF语法来描述:

styledstring = { styled | interpolated | escaped | plain } ;

specialchar = '{' | '}' | '$' | '\"' ;
anychar = [\u0-\u1fffff] ;
plain = { anychar - specialchar } ;
escaped = '\\', specialchar ;

interpolated = '$', ? expr ? | '$(', ? expr ?, ')' ;

styled = '{', ws, annotations, ':', content, '}' ;
content = { interpolated | plain | escaped | styled } ;
annotations = annotation | annotations, ws, ',', ws, annotation ;
annotation = face | inlineface | keyvalue ;
ws = { ' ' | '\t' | '\n' } ; (&ast; whitespace &ast;)

face = facename | interpolated ;
facename = [A-Za-z0-9_]+ ;

inlineface = '(', ws, [ faceprop ], { ws, ',', faceprop }, ws, ')' ;
faceprop = [a-z]+, ws, '=', ws, ( [^,)]+ | interpolated) ;

keyvalue = key, ws, '=', ws, value ;
key = ( [^\0${}=,:], [^\0=,:]&ast; ) | interpolated ;
value = simplevalue | curlybraced | interpolated ;
curlybraced = '{' { escaped | plain } '}' ;
simplevalue = [^${},:], [^,:]&ast; ;

在上述语法中没有编码的额外规定是 平原 应该是一个有效的输入 unescape_string,与 特别研究 保存着。

上述语法为 内嵌面,内嵌面 被简化,因为实际的实现有点复杂。 下面给出了完整的行为。

faceprop = ( 'face', ws, '=', ws, ( ? string ? | interpolated ) ) |
           ( 'height', ws, '=', ws, ( ? number ? | interpolated ) ) |
           ( 'weight', ws, '=', ws, ( symbol | interpolated ) ) |
           ( 'slant', ws, '=', ws, ( symbol | interpolated ) ) |
           ( ( 'foreground' | 'fg' | 'background' | 'bg' ),
               ws, '=', ws, ( simplecolor | interpolated ) ) |
           ( 'underline', ws, '=', ws, ( underline | interpolated ) ) |
           ( 'strikethrough', ws, '=', ws, ( bool | interpolated ) ) |
           ( 'inverse', ws, '=', ws, ( bool | interpolated ) ) |
           ( 'inherit', ws, '=', ws, ( inherit | interpolated ) ) ;

nothing='没什么' ;
bool='true|/'false' ;
符号=[^,)]+ ;
hexcolor=('#'|'0x'),[0-9a-f]{6} ;
simplecolor=hexcolor/symbol/nothing ;

下划线=无|bool/simplecolor/underlinestyled;
underlinestyled='(',ws,(|/nothing|simplecolor/interpolated),ws,
                  ',',ws,(符号/插值),ws')' ;

继承=('[',继承值, { ',', inheritval },']')|继承值;
inheritval=ws,':'?,符号 ;
styled(content::AbstractString) -> AnnotatedString

构造样式字符串。 字符串内, {<specs>:<content>} 结构将格式应用于 <内容>,根据逗号分隔的规格列表 <规格>. 每个规范可以采用人脸名称、内联人脸规范或 键=值 一对。 该值必须由 {...} 它应该包含任何字符吗 ,=:{}.

这是一个功能等价的 @styled_str宏,只是没有插值功能。

A 脸部是用于显示文本的图形属性的集合。 面控制文本在终端中的显示方式,也可能控制其他地方。

大多数时候, 脸部将作为与_face name_符号的唯一关联存储在全局面dicts中,并且最常使用此名称而不是 脸部对象本身。

*属性*

所有属性都可以通过关键字构造函数设置,默认为 什么都没有.

* 身高 (安 Int型漂浮64):在任一deci-pt的高度(当 Int型),或作为基础尺寸的一个因素(当 漂浮64). * 重量 (一 符号):其中一个符号(从最微弱到最密集) :瘦, :外光, :光, :半光, :正常, :中等, :semibold, :粗体, :外展,或 :黑色. 在终端任何重量大于 :正常 显示为粗体,并且在支持可变亮度文本的终端中,任何重量小于 :正常 显示为微弱。 * 倾斜,倾斜 (一 符号):符号之一 :斜体, :斜,或 :正常. * 前景 (一 [医]单纯色):文本前景色。 * 背景资料 (一 [医]单纯色):文本背景颜色。 * 下划线,文本下划线,采用以下形式之一: **一个 布尔:文本是否应该加下划线。 马克顿斯特。LineBreak() **一个 [医]单纯色:文本应该用这种颜色加下划线。 马克顿斯特。LineBreak() **一个 元组{Nothing, Symbol}:文本应使用符号设置的样式加下划线, :直, :双倍, :卷曲, :点,或 :虚线. 马克顿斯特。LineBreak() **一个 元组{SimpleColor, Symbol}:文本应在指定的SimpleColor中加下划线,并使用符号指定的样式,如前所述。 * 删除线 (一 布尔):文本是否应被划破。 * (一 布尔):前景色和背景色是否应该反转。 * 继承 (一 向量{Symbol}):要继承的人脸的名称,优先使用较早的人脸。 所有的面孔都继承自 :默认值 脸。

addface!(name::Symbol => default::Face)

按名称创建新面孔 姓名. 只要没有脸已经存在这个名字, 违约情况 被添加到两者 面孔`.违约情况` 及(副本)至 面孔.电流,并返回当前值。

应该面对 姓名 已经存在, 什么都没有 被退回。

*例子*

julia> addface!(:mypkg_myface => Face(slant=:italic, underline=true))
Face (sample)
         slant: italic
     underline: true
withfaces(f, kv::Pair...)
withfaces(f, kvpair_itr)

执行 f面孔`.电流` 临时修改为零或更多 :名称=>val 争论 千伏,千伏,或 kvpair_itr 其产生 千伏,千伏-表单值。

带面 通常通过 withfaces(kv。..)做。.. 结束 语法。 的值 什么都没有 可用于暂时取消设置面部(如果已设置)。 何时 带面 返回,原来的 面孔`.电流` 已经恢复。

*例子*

julia> withfaces(:yellow => Face(foreground=:red), :green => :blue) do
           println(styled"{yellow:red} and {green:blue} mixed make {magenta:purple}")
       end
red and blue mixed make purple
struct SimpleColor

颜色的基本表示,用于字符串样式目的。 它可以包含一个命名的颜色(如 :红色),或一个 [医]研资局 这是一个指定 r, g, b 位深度为8的颜色。

*构造函数*

SimpleColor(name::Symbol)  # e.g. :red
SimpleColor(rgb::RGBTuple) # e.g. (r=1, b=2, g=3)
SimpleColor(r::Integer, b::Integer, b::Integer)
SimpleColor(rgb::UInt32)   # e.g. 0x123456

另请参阅 tryparse(SimpleColor,rgb::String).

parse(::Type{SimpleColor}, rgb::String)

的类似物 tryparse(SimpleColor,rgb::String) (见),这引发了一个错误,而不是返回 什么都没有.

tryparse(::Type{SimpleColor}, rgb::String)

尝试解析 rgb,rgb 作为一个 [医]单纯色. 如果 rgb,rgb 开始于 # 并具有7的长度,它被转换成一个 [医]研资局-支持 [医]单纯色. 如果 rgb,rgb 开始于 a-z, rgb,rgb 被解释为颜色名称并转换为 符号-支持 [医]单纯色.

否则的话, 什么都没有 被退回。

*例子*

julia> tryparse(SimpleColor, "blue")
SimpleColor(blue)

julia> tryparse(SimpleColor, "#9558b2")
SimpleColor(#9558b2)

julia> tryparse(SimpleColor, "#nocolor")
merge(initial::StyledStrings.Face, others::StyledStrings.Face...)

合并的属性 初始 脸和 其他,后脸优先。

这用于组合多个面的样式,并解决继承。