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
            #渲染代码...
相关推荐
鹏码纵横3 小时前
已解决:java.lang.ClassNotFoundException: com.mysql.jdbc.Driver 异常的正确解决方法,亲测有效!!!
java·python·mysql
仙人掌_lz3 小时前
Qwen-3 微调实战:用 Python 和 Unsloth 打造专属 AI 模型
人工智能·python·ai·lora·llm·微调·qwen3
猎人everest3 小时前
快速搭建运行Django第一个应用—投票
后端·python·django
猎人everest3 小时前
Django的HelloWorld程序
开发语言·python·django
chusheng18404 小时前
2025最新版!Windows Python3 超详细安装图文教程(支持 Python3 全版本)
windows·python·python3下载·python 安装教程·python3 安装教程
别勉.4 小时前
Python Day50
开发语言·python
xiaohanbao095 小时前
day54 python对抗生成网络
网络·python·深度学习·学习
爬虫程序猿5 小时前
利用 Python 爬虫按关键字搜索 1688 商品
开发语言·爬虫·python
英杰.王5 小时前
深入 Java 泛型:基础应用与实战技巧
java·windows·python
安替-AnTi5 小时前
基于Django的购物系统
python·sql·django·毕设·购物系统