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

news/2024/10/7 17:28:15/

@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=0for item in contents:level=item[0]if level<lastlevel:for l in range(level+1,lastlevel+1):levels[l]=0levels[level]+=1level_text=''for i in levels:if i!=0:level_text+=str(i)+'.'lastlevel=level#渲染代码...

http://www.ppmy.cn/news/1535793.html

相关文章

javacv FFmpegFrameGrabber 阻塞重连解决方法汇总

JavaCV中FrameGrabber类可以连接直播流地址, 进行解码, 获取Frame帧信息, 常用方式如下 FrameGrabber grabber new FrameGrabber("rtsp:/192.168.0.0"); while(true) {Frame frame grabber.grabImage();// ... } 在如上代码中, 若连接地址网络不通, 或者连接超时…

高速机器人的点动与直线运动

工业机器人中的点动和直线运动非常之重要&#xff0c;接下来说一下他们的实现过程。 点动&#xff1a; 点动包括两个部分&#xff0c;第一个点动是每一个关节电机的点动&#xff0c;第二个是机器末端向xyz的三个方向进行点动处理。 第一个点动是非常简单的&#xff0c;即把对…

Docker安装mysql8并配置主从复制

1. 安装mysql8 1.1 新增挂载文件 # 新增mysql挂载文件夹 mkdir -p /root/docker/mysql/m01/log mkdir -p /root/docker/mysql/m01/data mkdir -p /root/docker/mysql/m01/conf1.2 新增mysql配置文件 # 新增mysql配置文件 cd /root/docker/mysql/m01/conf vim my.cnf # 下面是…

stm32四足机器人(标准库)

项目技术要求 PWM波形的学习 参考文章stm32 TIM输出比较(PWM驱动LED呼吸灯&&PWM驱动舵机&&PWM驱动直流电机)_ttl pwm 驱动激光头区别-CSDN博客 舵机的学习 参考文章 stm32 TIM输出比较(PWM驱动LED呼吸灯&&PWM驱动舵机&&PWM驱动直流电机)…

太速科技-FMCJ457-基于JESD204B的2路2Gsps AD 2路2Gsps DA FMC子卡

FMCJ457-基于JESD204B的2路2Gsps AD 2路2Gsps DA FMC子卡 一、板卡概述 该子卡是高速AD9172 DAC和AD9689 ADC的FMC板。为客户提供高达2 GHz 的可用模拟带宽以及 JESD204B 接口&#xff0c;以快速地对各种宽带 RF 应用进行原型制作。 AD芯片AD9689&#xff0c;AD9689-2…

Qt中使用QPainter绘制阴影

困扰了很久的问题&#xff0c;今天终于明白了如何绘制QGraphicDropShadowEffect同样效果的阴影&#xff0c;故写下这篇文章分享给大家。其方法是复制Qt源代码中QGraphicDropShadowEffect绘制实现的核心代码然后稍作修改实现&#xff0c;先看效果和封装过后的源代码&#xff1a;…

Final Glory推出“荣耀勋章-神龙”,推动游戏叙事范式发展

GameFi赛道因基建设施的缺失而长期处于加密市场的边缘位置&#xff0c;该叙事在市场中的占有率正在下降。不过好的一面是&#xff0c;随着MetaArena引擎面向市场&#xff0c;正在推动区块链游戏市场的叙事向全新的范式发展。 MetaArena引擎是以零知识证明方案为基础的Web3游戏基…

微服务实战——SpringCache 整合 Redis

SpringCache 整合 Redis 1.配置 spring.cache.typeredis EnableCaching EnableFeignClients(basePackages "com.cwh.gulimall.product.feign") EnableDiscoveryClient SpringBootApplication public class GulimallProductApplication {public static void main(…