python解析markdown

1.マークダウンモジュールをインストールする

pip install markdown

ここに画像の説明を挿入します

2、python解析markdown

参照6.5. Python マークダウン モジュール

2.1 QtWebEngineWidgets で Web ページを表示する

2.1.1 Webページの読み込み

QWebEngineView#load(url)
QWebEngineView#setHtml(url)

# !/usr/bin/python3
# -*- coding: utf-8 -*-

from PyQt5.QtWebEngineWidgets import QWebEngineView
from PyQt5.QtCore import QUrl
from PyQt5.QtWidgets import QMainWindow, QApplication, QTabWidget
import sys


class UIDemo(QMainWindow):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.setWindowTitle('WebView')
        self.resize(800, 500)
        # 添加标签栏
        self.tabs = QTabWidget()
        self.tabs.setDocumentMode(True)

        self.add_new_tab(QUrl('http://www.baidu.com'), 'Homepage')
        self.setCentralWidget(self.tabs)

    # 添加新的标签页
    def add_new_tab(self, qurl=QUrl(''), label='Blank'):
        # 设置浏览器
        self.browser = QWebEngineView(self)
        # 加载cookie

        self.browser.page().load(qurl)
        self.browser.setToolTip("xhbrue")
        # 添加标签
        i = self.tabs.addTab(self.browser, label)
        self.tabs.setCurrentIndex(i)
        # 将标签标题改为网页相关的标题
        self.browser.loadFinished.connect(
            lambda _, i=i, browser=self.browser: self.tabs.setTabText(i, self.browser.page().title()))


if __name__ == '__main__':
    app = QApplication(sys.argv + ["--no-sandbox"])  # 若加载网页空白,添加 "--no-sandbox"
    demo = UIDemo()
    demo.showMaximized()
    app.exec_()

2.1.2 Webページ読み込みエラー

    1. インストールされていないエラー
      ここに画像の説明を挿入します

Web エンジンを個別にインストールします。

pip install PyQtWebEngine

またはダウンロードソースを指定します

pip install PyQtWebEngine -i http://pypi.douban.com/simple --trusted-host=pypi.douban.com

問題に対する私の解決策: 声明窗口程序时,输入参数添加"--no-sandbox"、たとえば:
app = QApplication(sys.argv+["--no-sandbox"])

if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv + ["--no-sandbox"])
    htmlview = QWebEngineView()
    url = QUrl(r"https://www.baidu.com/")
    htmlview.load(url)
    htmlview.show()
    sys.exit(app.exec_())

ここに画像の説明を挿入します

2.2 Python-Markdown モジュール ライブラリ

pip install markdown

マークダウンをHTMLに変換するmarkdown.markdown(text)

Python-MarkdownJohn Gruber の Markdown 構文の Python 実装です。ただし、通常の Markdown とは異なる点がいくつかあります。これらの違いには次のようなものがあります。

  • Python-Markdown は、デフォルトで中間語の強調を無視します。たとえば、some_long_filename.txt は somelongfilename.txt には変換されません。

  • マークダウン文法規則では、リスト コンポーネントに複数の段落が含まれる場合、後続の段落には 4 つのスペースまたはタブを残す必要があると指摘しています。他の構文インタープリターとは異なり、Python-Markdown はこのルールを厳密に遵守し、リスト内のすべてのブロックレベル要素に対してこれを実行します。

  • リストの行が他のリスト識別子 (アスタリスク、数字など) に遭遇した場合、公式ルールでは新しい行が必要かどうかは指定されていません。一貫性を保つため、Python-Markdown は変更されません。ただし、Sane List 拡張モジュールは、よりフレンドリーなソリューションを提供します。

さらに、Python-Markdown は柔軟な拡張メカニズムも提供します。

2.3 QTextDocument、QTextBrowser、QTextEdit

QTextDocument.setMarkdown(markdown[,features=QTextDocument.MarkdownDialectGitHub])

サポートされている指定された関数を使用して、markdown字符串ドキュメントMarkdown格式の内容全体を指定されたテキストに置き換えます。デフォルトでは、より基本的な解析を行うGitHub样式的Markdown功能ことで、サポートされているすべてのものが含まれます。可能な限り尊重する必要があります。たとえば、最初の単語のフォントの太さがより目立つようにテキストが生成されます。に含まれる は、と同じように扱われますが. パーサーの特定の機能は、 features パラメーターを使用して有効または無効にできます。デフォルトは ですこの関数を呼び出すと、元に戻す/やり直しの履歴がリセットされます。MarkdownDialectCommonMarkMarkdown格式'* bold * text'markdown字符串HTML解析setHtml不支持HTML块内的Markdown格式化MarkdownDialectGitHub

QTextBrowser(QTextEdit).setMarkdown(markdown)

QTextEdit.setMarkdown(markdown)

このプロパティは、テキスト編集用の Markdown インターフェイスを提供します。HTML 書式設定を埋め込まずにテキスト エディタのテキストを返しますtoMarkdown()特定の色や名前付きフォントの使用など、サポートされている一部の機能は「純粋に」表現できないため、無視されます。テキストエディタのテキストを変更します。以前のテキストをすべて削除し、元に戻す/やり直しの履歴をクリアします。入力されたテキストはMarkdown形式のリッチテキストとして解釈されます。に含まれる は、と同じように扱われますが. パーサーの特定の機能は、 features パラメーターを使用して有効または無効にすることができます。デフォルト値は です纯文本MarkdownQTextDocumentMarkdownsetMarkdown()markdown字符串HTML的解析setHtml不支持HTML块内的Markdown格式MarkdownDialectGitHub

3. ケースデモ

3.1 最初の写真

ここに画像の説明を挿入します

3.2 コードファイル

ファイルapp.py:

# !/usr/bin/python3
# -*- coding: utf-8 -*-
import os

import markdown
from PyQt5 import QtCore, QtWidgets
from PyQt5.QtGui import QIcon
from PyQt5.QtWebEngineWidgets import QWebEngineView
from PyQt5.QtWidgets import QDesktopWidget, QMessageBox, QMainWindow, QFileSystemModel, QHBoxLayout, \
    QTreeView, QWidget, QAction, QFileDialog


class Ui_MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.initUI()
        self.show()

    def initUI(self):
        _translate = QtCore.QCoreApplication.translate
        self.setWindowTitle(_translate("XhNote", "Xh笔记"))
        # self.setWindowTitle("XhNote")
        icon = QIcon("icon.ico")
        self.setWindowIcon(icon)
        self.resize(800, 600)
        self.menuBarUI()
        self.statusBarUI()
        self.centralwidgetUI()
        # self.center()
        QtCore.QMetaObject.connectSlotsByName(self)

    def menuBarUI(self):
        menubar = self.menuBar()
        menubar.setGeometry(QtCore.QRect(0, 0, 800, 22))
        menubar.setObjectName("menubar")

        openAct = QAction(menubar)
        openAct.setCheckable(False)
        openAct.setObjectName('openFileAction')
        openAct.triggered.connect(self.opendir)
        openAct.setText('打开')

        menu_2 = QtWidgets.QMenu(menubar)
        menu_2.setObjectName("menu_2")
        # self.setMenuBar(menubar)

        # self.setStatusBar(statusbar)
        menubar.addAction(openAct)
        menubar.addAction(menu_2.menuAction())
        _translate = QtCore.QCoreApplication.translate
        # openmenu.setTitle(_translate("open", "打开"))
        menu_2.setTitle(_translate("new", "新建"))

    def statusBarUI(self):
        statusbar = self.statusBar()
        statusbar.setObjectName("statusbar")
        statusbar.showMessage('Ready')

    def centralwidgetUI(self):
        mainWidget = QWidget()
        hbox = QHBoxLayout(mainWidget)
        self.treeView = QTreeView()
        self.treeView.setFixedWidth(200)
        self.htmlview = QWebEngineView()
        hbox.addWidget(self.treeView)
        hbox.addWidget(self.htmlview)
        # mainWidget.addWidget(hbox)

        # 建立文件模型
        self.fileModel = QFileSystemModel()
        # 设置模型根目录
        pathIndex = self.fileModel.setRootPath(
            os.path.abspath(r"E:\Books\Python\PyQt5&PyQt6中文手册\PyQt-Chinese-tutorial-master\translated\pyqt5"))
        print(self.fileModel.rootPath())
        # 绑定视图与模型
        self.treeView.setModel(self.fileModel)
        self.treeView.setRootIndex(pathIndex)  # 视图根目录文件模型根目录要一致
        for i in [1, 2, 3]:  # 这里隐藏了文件的信息展示
            self.treeView.setColumnHidden(i, True)
        self.treeView.clicked.connect(self.loadDoc)  # 建立左侧树视图与右侧文本查看器的连接

        self.setCentralWidget(mainWidget)

    # QWebEngineView 加载 Html
    def loadDoc(self, pathIndex):
        filepath = self.fileModel.filePath(pathIndex)
        print(f"选择了文件【{
      
      filepath}】")
        if os.path.isfile(filepath):
            self.htmlview.setHtml(self.txt2html(filepath))
        self.statusBar().showMessage(filepath)

    @staticmethod
    def txt2html(filepath):
        with open(filepath, mode="r", encoding='utf-8') as f:
            result = f.read()
        return markdown.markdown(result)

    # QWebEngineView 加载 Html
    def opendir(self):
        dir = QFileDialog.getExistingDirectory(self, r"Open Directory",
                                               "./",
                                               QFileDialog.ShowDirsOnly
                                               | QFileDialog.DontResolveSymlinks)
        print(str(dir))
        pathIndex = self.fileModel.setRootPath(dir)
        self.treeView.setModel(self.fileModel)
        self.treeView.setRootIndex(pathIndex)

    def closeEvent(self, event):
        reply = QMessageBox.question(self, 'Message',
                                     "Are you sure to quit?", QMessageBox.Yes |
                                     QMessageBox.No, QMessageBox.No)
        if reply == QMessageBox.Yes:
            event.accept()
        else:
            event.ignore()

    def center(self):
        qr = self.frameGeometry()
        cp = QDesktopWidget().availableGeometry().center()
        qr.moveCenter(cp)
        self.move(qr.topLeft())

ファイルxhnote.py:

#!/usr/bin/python3
# -*- coding: utf-8 -*-

import sys

from PyQt5.QtWidgets import QApplication

from app import Ui_MainWindow

if __name__ == '__main__':
    app = QApplication(sys.argv + ["--no-sandbox"])
    # app = QtWidgets.QApplication(sys.argv)
    ui = Ui_MainWindow()
    sys.exit(app.exec_())

おすすめ

転載: blog.csdn.net/qq_23452385/article/details/131859827