python.tkinter设计标记语言(转译2-html)

news2024/9/21 0:43:08

@TOC

前言

本文只作为笔记记录。

前文我们已经通过TinText渲染器部分和TinML获得了test.tin解释后的标记内容列表。本文,我们将根据这个解释结果将Tin标记转为html文件。

转为html的好处

第一,Tin标记语言作为一个小小小小小项目,光把编写内容呈现在TinText中是不够的,需要导出为其它常见文件。

第二,html足够常见,而且可以通过html格式继续转化为其它格式文件。html转图片、PDF、Markdown等格式的功能,已经有了完善的实现。我们只需要把Tin标记文本转译为html格式文本,就相当于打开了一扇落地窗😇,进而可以借助html格式转变为其它能够转变的任何格式文件。

而如果我们想给Tin标记文本转化为另一个新的格式文件,或者单纯就是为了练手,同样可以根据解释结果列表来进行编写。本篇文章中,就以HTML为例。

tin转译为html

工具类

我们先定义一下转译工具类。

class TinTranslator():
    """
    tin->html的转译工具类
    *后续可能支持tin->markdown
    """

    def __init__(self,tinml:TinML):
        self.tinml=tinml
        self.doc=None
        
        self.tinPmark=('*','/','_','-','!')
        self.tinPlink_re=re.compile('.*?!\[(.*?)\]\((..*?)\)')

这里,我们定义了一些基础属性和小工具。

TinTranslator直接绑定TinML,做到实时同步。

转译功能

这里先以<title>为例。

TinText使用dominate作为html生成工具。

    def tohtml(self,_title='TinText',_style=''):
        #tin->html
        doc=dominate.document(title=_title)
        doc.head.add(meta(charset='utf-8'))
        if _style!='':
            doc.head.add(style(_style))
        _body=div()
        doc.body.add(_body)
        for tag,kw in self.tinml:
            if tag == '<title>':
                #标题
                text=kw['title']
                level=int(kw['level'])
                if level==1:
                    _body.add(h1(text))
                elif level==2:
                    _body.add(h2(text))
                elif level==3:
                    _body.add(h3(text))
                elif level==4:
                    _body.add(h4(text))
                elif level==5:
                    _body.add(h5(text))
                elif level==6:
                    _body.add(h6(text))

有了解释结果,转译就很方便了,不需要处理可能的错误。

<p>有点复杂,因为Tin的p标记与html的p标记并不同级,而是包含了html中的b, u, i, s, a等标记,还要继续下分情况,因此需要类似TinText中的预渲染步骤。

    def __tinP_to_html(self,texts):
        #tin段落转html段落
        res=[]
        for text in texts:
            if text=='':
                res.append(br())
            elif text[0]==' ':
                res.append(text[1:])
            elif text[0] not in self.tinPmark:
                res.append(text)
            else:
                head_mark=text[:5]
                head_num=0
                now_p=None#初始化,空
                if '*' in head_mark: head_num+=1
                if '/' in head_mark: head_num+=1
                if '_' in head_mark: head_num+=1
                if '-' in head_mark: head_num+=1
                #开始具体转义html<p>
                if '!' in head_mark:
                    result=self.tinPlink_re.match(text)
                    if result:
                        url_text,url=result.groups()
                        if url_text=='':
                            url_text=url
                        now_p=a(url_text,href=url)
                    else:
                        head_num+=1
                if '*' in head_mark:
                    if now_p:
                        now_p=b(now_p)
                    else:
                        now_p=b(text[head_num:])
                if '/' in head_mark:
                    if now_p:
                        now_p=i(now_p)
                    else:
                        now_p=i(text[head_num:])
                if '_' in head_mark:
                    if now_p:
                        now_p=u(now_p)
                    else:
                        now_p=u(text[head_num:])
                if '-' in head_mark:
                    if now_p:
                        now_p=s(now_p)
                    else:
                        now_p=s(text[head_num:])
                res.append(now_p)
        return res

转译部分的代码如下:

            elif tag == '<p>':
                #段落
                texts=kw['text']
                _p=p('')
                htmltexts=self.__tinP_to_html(texts)
                for htmltext in htmltexts:
                    _p.add(htmltext)
                _body.add(_p)

尽量保持转译部分的干净,额外的处理交给转译器类的内置函数。

效果展示

下图中,左侧为浏览器,右侧为TinText.TinReader。
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1990736.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

34-《球兰》

球兰 球兰&#xff08;学名&#xff1a;Hoya carnosa&#xff08;L.f.&#xff09;R. Br&#xff09;&#xff0c;又名&#xff1a;马骝解、狗舌藤、铁脚板等&#xff0c;马利筋亚科球兰属多年生植物 。攀援灌木&#xff0c;附生于树上或石上&#xff0c;茎节上生气根。分布于云…

单链表-数据结构

一、单链表 1.结构定义 typedef struct LNode {int data;struct LNode* next; }LNode, * LinkList; 2.功能实现 ①创造结点 //创造结点 LNode* NewNode(int x) {struct LNode* ret (LNode*)malloc(sizeof(LNode));ret->data x;ret->next NULL;return ret; } ②插…

TypeError: (0 , _xxx.default) is not a function

1.首先从控制台报错信息看很让人疑惑&#xff0c;好像并没有这个函数&#xff0c;我这里是引入了address.js这个这个文件里面的函数导致的 2. 直接说原因&#xff1a;导入的函数不是default&#xff0c;但使用的时候没有使用"{}" import xxx from yyy 3.直接加上&q…

Golang | Leetcode Golang题解之第330题按要求补齐数组

题目&#xff1a; 题解&#xff1a; func minPatches(nums []int, n int) (patches int) {for i, x : 0, 1; x < n; {if i < len(nums) && nums[i] < x {x nums[i]i} else {x * 2patches}}return }

【vulnhub】Matrix:1靶机

靶机安装 下载地址&#xff1a;https://download.vulnhub.com/matrix/Machine_Matrix.zip 运行环境&#xff1a;VirtualBox 信息收集 靶机扫描 netdiscover -i eth0 -r 192.168.7.0/24 端口扫描&#xff0c;开放端口22、80、31337 nmap -A 192.168.7.203 -p- 目录扫描 d…

「C++系列」引用

文章目录 一、引用及定义引用的基本用法注意事项 二、引用与指针1. 定义和初始化2. 语法糖3. 空值4. 数组和函数5. 性能6. 用途 三、引用作为参数/返回值1. 把引用作为函数参数2. 把引用作为函数返回值 四、相关链接 一、引用及定义 在C中&#xff0c;引用&#xff08;Referen…

2025深圳国际户外用品暨跨境电商工厂选品展览会

2025深圳国际户外用品暨跨境电商工厂选品展览会 2025 Shenzhen International Outdoor Products and Cross border E-commerce Factory Selection Exhibition 时间&#xff1a;2025年02月27-3月01日 地点&#xff1a;深圳会展中心&#xff08;福田馆&#xff09; 详询主办方…

地接侠小程序(Taro)兼容IOS系统Bug解决(redux持久化不成功、整个页面会拖动)

在写地接侠小程序的时候就是有考虑过兼容问题的&#xff0c;但是在写的过程中并没有用苹果手机进行调式&#xff0c;一直都是用的自己的安卓手机&#xff0c;一直都是没有问题的&#xff0c;但是毕竟项目需要上线&#xff0c;于是在上线前用苹果手机测试果然出现了预想中的问题…

Leetcode JAVA刷刷站(3)无重复字符的最长子串

一、题目概述 二、思路方向 为了找出给定字符串中不含有重复字符的最长子串的长度&#xff0c;我们可以使用滑动窗口的方法。这种方法通过维护一个窗口&#xff08;或称为子串&#xff09;&#xff0c;并动态地调整窗口的左右边界来找到最长的无重复字符子串。 三、代码实现 …

利用自然语言处理(NLP)技术挖掘旅游评论数据

目录 简单了解 延伸 如何使用自然语言处理技术提高旅游评论情感倾向的准确性&#xff1f; 旅游评论数据中多模态信息融合的最佳实践是什么&#xff1f; 在旅游评论数据预处理和清洗过程中&#xff0c;哪些方法最有效&#xff1f; 使用Python网络爬虫技术进行旅游评论数据的…

便携式气象监测设备:精准掌握自然气象变化

在探索自然、指导农业生产、保障户外活动安全以及进行科学研究等多个领域&#xff0c;便携式气象监测设备正逐渐成为重要的工具。这些小巧而强大的设备&#xff0c;以其便携性、实时性和高精度&#xff0c;让我们能够轻松掌握周围环境的微妙变化。 便携式气象监测设备集成了多种…

35 搜索插入位置

解题思路&#xff1a; \qquad 时间复杂度要求为O(Log N)&#xff0c;可知此题用二分查找解决。 \qquad 二分基本思路是&#xff0c;通过锚定一个中间值mid&#xff0c;把搜索区间一分为二&#xff0c;根据mid与目标值的比较结果&#xff0c;更新下一次搜索区间&#xff08;左…

Java | Leetcode Java题解之第330题按要求补齐数组

题目&#xff1a; 题解&#xff1a; class Solution {public int minPatches(int[] nums, int n) {int patches 0;long x 1;int length nums.length, index 0;while (x < n) {if (index < length && nums[index] < x) {x nums[index];index;} else {x *…

华南理工大学-大学物理实验-不良导体热导率测量

不良导体热导率测量 引言 导热系数(又叫热导率)是反映材料热性能的重要物理量。热传导是热交换的三种(热传导、对流和辐射)基本形式之一,是工程热物理、材料科学、固体物理及能源、环保等各个研究领域的课题。材料的导热机理在很大程度上取决于它的微观结构,热量的传递依靠…

搜维尔科技:利用虚拟现实优化汽车仪表盘或飞机驾驶舱的人机工程学设计

利用虚拟现实优化汽车仪表盘或飞机驾驶舱的人机工程学设计 消费者对新推出的车型有何反应&#xff1f;驾驶感舒适吗&#xff1f;驾驶员能否轻松触及并操作仪表盘上的所有命令装置&#xff1f;车内的视野足够清晰开阔吗&#xff1f;汽车或飞机制造商必须回答所有这些问题&#…

Java中运用SpirngAOP的来思想实现自定义日志注解并使用

1.AOP的思想 面向切面编程。它是对OOP(面向对象编程)的一种补充&#xff0c;OOP往往是继承或者是实现都是纵向进行的&#xff0c;而AOP是切面编程&#xff0c;是横向的&#xff0c;它出现的目的是将我们某些与业务无关的公共代码提取出来&#xff0c;找到一个切点进行切入形成…

服务优雅上下线实现方案-运维

1、前言 前一篇文章介绍了nginx通过nginx_upstream_check_module模块实现后端健康检查&#xff0c;基于这篇文章介绍一下服务优雅上下线的实现方案。 对于微服务来说&#xff0c;服务的优雅上下线是必要的。对于上线来说&#xff0c;如果服务没有启动成功&#xff0c;就不应该对…

sqli-labs-master 25-30关

sqli-labs第25关 由本题意可得过滤and和or&#xff0c;我用双写进行绕过&#xff0c;例如&#xff1a;infoorrmation,aandnd 数据库名 http://127.0.0.1/sqli-labs-master/Less-25/?id-1%27%20union%20select%201,2,database()-- 表名 127.0.0.1/sqli-labs-master/Less-25…

24/8/7算法笔记 决策树分类

决策树是一种常用的机器学习算法&#xff0c;用于分类和回归任务。它通过学习简单的决策规则从数据特征中推断出目标值。以下是决策树的一些关键特点&#xff1a; 树形结构&#xff1a;决策树由一系列的问题组成&#xff0c;每个问题对应一个特征和可能的取值。这些问题按照树状…

orcad和allegro无法交互的解决方案

当Orcad和Allegro无法交互时&#xff0c;可能是由于多种原因导致的。以下是一些常见的解决方案&#xff0c;旨在帮助用户解决这一问题&#xff1a; 1. 检查并设置Enable Intertool Communication选项 首先&#xff0c;确保在Orcad Capture CIS中启用了“Enable Intertool Com…