15

I have been reading up on the docs for the Spanned/Spannable class for a project that I am working on. I have been puzzled by the definition and usage of the spans that contain MARK and POINT.

A MARK seems to be defined in the Doc as "attached" to a character's location while a POINT is defined as being "glued" to a character. Thus a MARK won't move when text is changed and a POINT will move with the character it was "glued" to when text is changed.

These definitions seem to show that MARK is synonymous with INCLUSIVE and that POINT is synonymous with EXCLUSIVE.

However, this is not the case as neither SPAN_MARK_MARK nor SPAN_POINT_POINT are synonymous with either SPAN_INCLUSIVE_INCLUSIVEor SPAN_EXCLUSIVE_EXCLUSIVE. In fact, SPAN_INCLUSIVE_INCLUSIVE is the same as SPAN_MARK_POINT and SPAN_POINT_MARK is the same as SPAN_EXCLUSIVE_EXCLUSIVE.

My questions are as follows

  1. Why is SPAN_POINT_MARK synonymous with SPAN_EXCLUSIVE_EXCLUSIVE? and why is SPAN_MARK_POINT synonymous with SPAN_INCLUSIVE_INCLUSIVE?

  2. Why aren't SPAN_MARK_MARK and SPAN_POINT_POINT synonymous with SPAN_INCLUSIVE_INCLUSIVEand SPAN_EXCLUSIVE_EXCLUSIVE respectively?

  3. What are the true definitions of MARK and POINT in this usage?

4

2 回答 2

14

我喜欢解释 MARK 与 POINT 的方式是将它们表示为方括号,它们在文本范围中存在的任何偏移量。括号指向的方向显示了标记或点“附加”到的字符。

因此,对于 POINT,您将使用左括号 - 它附加到它后面的字符。对于 MARK,您将使用右括号 - 它附加到它前面的字符。

让我们看一下每种类型的一些示例:

SPAN_MARK_MARK

在 0 长度跨度的偏移处插入:标记保持固定。

之前:Lorem ]]ipsum dolor 坐。
之后:Lorem ]] INSERT ipsum dolor 坐。

在非 0 长度 span 的开头插入:插入的文本包含在 span 的范围内。

之前:Lorem]ipsum] dolor 坐。
之后:Lorem] INSERT ipsum] dolor 坐。

在非 0 长度跨度的末尾插入:插入的文本被排除在跨度范围之外。

之前:Lorem]ipsum] dolor 坐。
之后:Lorem ]ipsum] INSERT dolor 坐。

您可以从最后两个示例中看到,为什么SPAN_MARK_MARK标志与标志是同义词SPAN_INCLUSIVE_EXCLUSIVE。在范围开头插入的文本包含在范围内,而在末尾插入的文本不包括在内。

SPAN_POINT_POINT

在 0 长度跨度的偏移处插入:点被向前推。

之前:Lorem [[ipsum dolor 坐。
之后:Lorem INSERT [[ipsum dolor 坐下。

在非 0 长度跨度的开头插入:插入的文本被排除在跨度范围之外。

之前:Lorem [ipsum[dolor sit。
之后:Lorem INSERT [ipsum[dolor sit。

在非 0 长度 span 的末尾插入:插入的文本包含在 span 的范围内。

之前:Lorem [ipsum[dolor sit。
之后:Lorem [ipsum INSERT [dolor sit。

您可以再次从最后两个示例中看到为什么SPAN_POINT_POINT标志与标志同义SPAN_EXCLUSIVE_INCLUSIVE。在范围开始处插入的文本被排除在范围之外,而在结束处插入的文本被包括在内。

SPAN_MARK_POINT

在跨度开头插入:插入的文本包含在范围内。

之前:Lorem ]ipsum[dolor sit。
之后:Lorem ] INSERT ipsum [ dolor sit。

在跨度末尾插入:插入的文本仍包含在范围内。

之前:Lorem ]ipsum[dolor sit。
之后:Lorem ]ipsum INSERT [dolor sit。

因此它具有同义词SPAN_INCLUSIVE_INCLUSIVE- 插入的文本始终包含在跨度范围内。

SPAN_POINT_MARK

在跨度开始处插入:插入的文本被排除在范围之外。

之前:Lorem [ipsum] dolor 坐。
之后:Lorem INSERT [ipsum] dolor 坐。

在跨度末尾插入:插入的文本仍被排除在范围之外。

之前:Lorem [ipsum] dolor 坐。
之后:Lorem [ipsum] INSERT dolor sit。

因此它具有同义词SPAN_EXCLUSIVE_EXCLUSIVE- 插入的文本始终被排除在跨度范围之外。

我认为文档通过拆分一些同义词的定义来混淆事物。例如,在描述 时SPAN_MARK_MARK,它们仅根据 0 长度跨度来定义其用法。然后在定义SPAN_INCLUSIVE_EXCLUSIVE(这是同义词)时,他们仅根据非 0 长度跨度定义其用法。我认为如果他们事先声明它们是同义词,并且两个术语都有一个共同的定义,那会更清楚。

于 2013-07-24T23:14:51.147 回答
6

它们是概念性概念,按照它们出现的顺序来思考它们

从文档:

MARK 和 POINT 在概念上位于两个相邻字符之间。MARK 被“附着”到之前的角色上,而 POINT 将附着在之后的角色上。插入光标在概念上位于 MARK 和 POINT 之间。因此, 在 MARK 和 POINT 之间插入一个新字符将使 MARK 保持不变,而 POINT将被移动,现在位于插入的字符之后,并且仍然粘在它之后的同一个字符上。根据插入发生在跨度的开头还是结尾,跨度将因此扩展以包含新字符(当跨度在其开头使用 MARK 或在其末尾使用 POINT 时)否则将被排除在外。注意这里的before和after指的是String中的偏移量,它独立于文本的视觉表示

你的观点

这些定义似乎表明 MARK 是 INCLUSIVE 的同义词,而 POINT 是 EXCLUSIVE 的同义词。

事实并非如此。基本上将标记视为跨度的起始标记,将视为端点。这两个点之间发生的事情(样式化、向样式化文本添加更多文本等)现在被归类为包容性和排斥性,因此与它们直接相关。

让我们看一个例子:假设我们有以下文本样式

这是一个示例文本

如果我们在粗体跨度上使用了 SPAN_EXCLUSIVE_EXCLUSIVE,并且我们在跨度中间插入文本,它仍然是粗体:

这是一个令人难以置信的好示例文本

但是如果我们在粗体跨度的开头或结尾插入文本,则插入的文本不是粗体:

这不是示例文本

如果我们使用 SPAN_INCLUSIVE_EXCLUSIVE,那么在开头插入文本将作为 span 的一部分包含在内,我们将拥有:

这是一个很好的示例文本不是吗

现在所有这些只是我对文档的解释。为什么 SPAN_POINT_MARK 是 SPAN_EXCLUSIVE_EXCLUSIVE 的同义词,我想来自 google 的人将不得不发表评论,但在我看来,MARK_POINT 运动代表包容,POINT_MARK 代表排斥。SPAN_POINT_POINT 和 SPAN_MARK_MARK 表示长度为 0 的字符串,因此不能归因于包含/排除。

:EDIT: SPAN_MARK_MARK 和 SPAN_POINT_POINT 是长度为 0 的字符串,即字符串以 0 位置的标记开始,然后任何后续添加都附加到字符串但标记位置不会改变,或者字符串以点位置开始,并且任何后续添加到字符串将点移向末尾。这些标志本质上表示起点是一个可扩展的字符串,因此表示长度为 0 的字符串。然后可以根据字符串是 mark_mark 还是 point_point 来使用包含、排他标志。还有 SPAN_EXCLUSIVE_INCLUSIVE,当长度为 0 时,表现得像标记,当长度为 0 时,SPAN_INCLUSIVE_EXCLUSIVE 表现得像点,这从它们的定义方式很明显。这也是我对文档的解释

于 2013-07-24T05:33:18.437 回答