Tkinter简单的Markdown解析器删除Markdown标记

2024-03-28 22:20:13 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在tkinter中做一个简单的降价解析。概念是标题可以被星号符号包围,例如*Heading 1***Heading 2**。你知道吗

我正在使用regex来查找这种格式的字符串,标记它们并更改标记的样式。你知道吗

我正在努力解决的一个问题是在搜索完文本后删除文本中的星号符号。我尝试了一些代码(包括注释掉的代码),但它只是删除了标记的文本。你知道吗

我的代码正确地找到*Heading 1*并将其转换为*Heading 1*,但不会删除标记符号以获得标题1

有人能帮我从保留格式的标题中删除星号符号的算法吗?你知道吗

import tkinter as tk
from tkinter.scrolledtext import ScrolledText
from tkinter import font


class HelpDialog(tk.Toplevel):
    """Seperate window to show the results of SSO Search"""
    def __init__(self, parent,text):
        super().__init__(parent)

        self.title("Help")
        self.defaultfont = font.Font(family="Sans Serif",size=12)
        self.textbox = ScrolledText(self,height=40,width=80,font=self.defaultfont)
        self.textbox.config(wrap=tk.WORD)
        self.textbox.grid()


        self.textbox.insert(0.0,text)
        self.style()

    def style(self):
        self.h1font = font.Font(family="Sans Serif", size=18, weight="bold")
        self.h2font = font.Font(family="Sans Serif", size=14, weight="bold")
        self.h3font = font.Font(family="Sans Serif", size=12, weight="bold", slant="italic")
        self.textbox.tag_configure("h1",font=self.h1font)
        self.textbox.tag_configure("h2",font=self.h2font)
        self.textbox.tag_configure("h3",font=self.h3font)

        self.tag_match(r"^[\*]{1}[\w\d -]+[\*]{1}$", "h1")
        self.tag_match(r"^[\*]{2}[\w\d -]+[\*]{2}$", "h2")
        self.tag_match(r"^[\*]{3}[\w\d -]+[\*]{3}$", "h3")

    def tag_match(self,regex,tag):
        count = tk.IntVar()
        self.textbox.mark_set("matchStart", "1.0")
        self.textbox.mark_set("matchEnd", "1.0")
        while True:
            index = self.textbox.search(regex,"matchEnd","end",count=count,regexp=True)
            if index=="": break

            self.textbox.mark_set("matchStart",index)
            self.textbox.mark_set("matchEnd", "%s+%sc" % (index, count.get()))
            self.textbox.tag_add(tag,"matchStart","matchEnd")

            #Futile attempt to remove the ** from the headings
            #text = self.textbox.get("matchStart", "matchEnd")
            #orig_length = len(text)
            #text = text.replace("*","").ljust(orig_length, " ")
            #self.textbox.delete("matchStart", "matchEnd")
            #self.textbox.insert("matchStart", text)

if __name__ == '__main__':
    text = """*Heading 1*
A paragraph
**Heading 2**
Some more text

***Heading 3***
Conclusion
"""
    root = tk.Tk()
    root.withdraw()
    HelpDialog(root,text)

Tags: textselfsizetkintertagfamilytkfont
1条回答
网友
1楼 · 发布于 2024-03-28 22:20:13

简而言之,您可以使用文本小部件的delete方法删除范围开头和结尾的字符。你可以对索引做简单的数学运算来调整它们。因此,例如,要删除“matchEnd”处的字符(它实际上表示匹配范围中最后一个字符后面的点),可以执行delete("matchEnd-1c"),其中-1c是“减去一个字符”的缩写。你知道吗

tag_match内循环的每一端,添加以下两行:

self.textbox.delete("matchStart")
self.textbox.delete("matchEnd-1c")

但是,此代码假定标记只是一个字节。您将需要传递信息来告诉函数文本的每一侧有多少个字符要删除,因为这些信息在其他情况下并不存在。你知道吗

例如,您可以这样传递:

self.tag_match(r"^[\*]{1}[\w\d -]+[\*]{1}$", "h1", 1)

然后需要调整删除字符的代码,以考虑这些信息。例如,假设您将该数字作为变量n传入,它将如下所示:

def tag_match(self, regex, tag, n):
    ...
    while True:
        ...
        self.textbox.delete("matchEnd-{}c".format(n), "matchEnd")
        self.textbox.delete("matchStart", "matchStart+{}c".format(n))

相关问题 更多 >