python.tkinter设计标记语言(渲染5-列表)

@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
            #渲染代码...
相关推荐
无垠的广袤6 分钟前
【工业树莓派 CM0 NANO 单板计算机】本地部署 EMQX
linux·python·嵌入式硬件·物联网·树莓派·emqx·工业物联网
艾莉丝努力练剑1 小时前
【Python基础:语法第一课】Python 基础语法详解:变量、类型、动态特性与运算符实战,构建完整的编程基础认知体系
大数据·人工智能·爬虫·python·pycharm·编辑器
gCode Teacher 格码致知1 小时前
Python基础教学:如何拼接字符串?-由Deepseek产生
python
还债大湿兄1 小时前
阿里通义千问调用图像大模型生成轮动漫风格 python调用
开发语言·前端·python
blank@l1 小时前
python测开小工具--日志查询分析工具
python·python接口自动化测试基础·python测试开发·日志查询分析·日志分析统计查询·软件测试工具·argparse模块
hu_nil2 小时前
LLMOps-第十三周
python·vllm
空影星2 小时前
轻量日记神器RedNotebook,高效记录每一天
python·数据挖掘·数据分析·音视频
搬砖ing换来金砖2 小时前
Python入门-Task02
开发语言·python
databook2 小时前
告别盲人摸象,数据分析的抽样方法总结
后端·python·数据分析
全栈陈序员2 小时前
【Python】基础语法入门(九)—— 代码规范、调试技巧与性能初探
开发语言·python·代码规范