Tkinter Simple Markdown Parser - Удалить теги уценки - PullRequest
0 голосов
/ 07 февраля 2019

Я работаю над простым анализом уценки в tkinter.Концепция заключается в том, что заголовки могут быть окружены символами звездочки, например *Heading 1*, **Heading 2**.

Я использую регулярное выражение, чтобы найти строки в этом формате, пометить их и изменить стиль тегов.

Элемент, с которым я борюсь, - это удаление символов звездочки из текста послеони были обысканы.Я попробовал некоторый код (включая закомментированный), но он просто удаляет помеченный текст.

Мой код правильно находит *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)

1 Ответ

0 голосов
/ 07 февраля 2019

Краткий ответ: вы можете использовать метод текстового виджета 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))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...