@TOC
前言
本文只作为笔记记录。
列表文本是一个较为独立的文本块,但是内部包含层级关系。在新版TinML设计中,使用一个标签表示整个列表文本块。
<ls>list-1;
|list-2;
|...|
不同的层级在列表行文本前加|
确定,一级列表不需要|
,然后逐级增加,最多三个,即支持四级列表。
<ls>list-1;
||list-1-1
|||list-1-1-1
||||list-1-1-1-1
|list-2
||list-2-1
|...|
TinML支持两种列表标签:<ls>, <nl>
,分别为无序列表和有序列表。
无序列表只需要根据|
的数量,设定行文本缩进空间即可;而有序列表涉及到列表编号从属问题,需要进一步的设计。
思路设计
以下为思路,并非可用代码。
预处理
首先,我们需要从TinML文本中获得有意义的列表参数和文本,这部分由TinML解释器完成。具体处理结果如下:
<nl>这是第一个;
|第二个
||第二-1个
|||第二-1-1个
||||第二-1-1-1个
|第三个|
tag:"<nl>",
lists:(
(0,"这是第一个"),
(0,"第二个"),
(1,"第二-1个"),
(2,"第二-1-1个"),
(3,"第二-1-1-1个"),
(0,"第三个")
)
编号记录
由于有序列表(<nl> | <numlist>
)每行列表文本之间有顺序与从属关系,我们必然需要用一个起始编号变量,来记录当前渲染的列表的序号和从属。同时,我们也可以创建一个列表序号列表,包含四个整数,来表示当前列表序号。
python
levels=[0,0,0,0]#层级
lastlevel=1
lastlevel
指上一个列表行文本的层级
对每一个列表行文本,我们都可以获得其层级level
,然后在接下来的操作完成之后,将level
赋值给lastlevel
。
编号变化
同等级变化
最常见的变化,就是同等级变化,也就是列表编号之间的平级升序,对此,只需要在记录为加一即可:
python
levels[level]+=1
下一级变化
如果level>lastlevel
,即层级发生缩小,这种情况,我们默认level = lastlevel + 1
,因为跨行增加时没有意义的。因此,和上面一样,只需要在当前记录为加一:
python
levels[level]+=1
升级变化
这时,level<lastlevel
,层级上升,但是我们不知道上升了多少。
不过,我们能够确定,上升的层级一定是该从属层级的第一个,也就是说,层级列表levels
中,从第level
位起,所有的序号均为0。
这样,我们就可以进行如下处理:
python
if level<lastlevel:
for l in range(level+1,lastlevel+1):
levels[l]=0
levels[level]+=1
代码实现
我们假设已经从TinML解释器中获取了列表有意义参数文本信息。
python
contents = {
tag:"<nl>",
lists:(
(0,"这是第一个"),
(0,"第二个"),
(1,"第二-1个"),
(2,"第二-1-1个"),
(3,"第二-1-1-1个"),
(0,"第三个"),
),
}
实现编号变化:
python
def __render_numlist(self,contents):
#有序列表
levels=[0,0,0,0]#层级
lastlevel=0
for item in contents:
level=item[0]
if level<lastlevel:
for l in range(level+1,lastlevel+1):
levels[l]=0
levels[level]+=1
level_text=''
for i in levels:
if i!=0:
level_text+=str(i)+'.'
lastlevel=level
#渲染代码...