python解析markdown
1.マークダウンモジュールをインストールする
pip install markdown
2、python解析markdown
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ページ読み込みエラー
-
- インストールされていないエラー
- インストールされていないエラー
Web エンジンを個別にインストールします。
pip install PyQtWebEngine
またはダウンロードソースを指定します
pip install PyQtWebEngine -i http://pypi.douban.com/simple --trusted-host=pypi.douban.com
-
- 読み込み中の Web ページが空白ですpyqt5+QWebEngine ウィンドウのグラフィックが表示できない場合の解決策を
参照してください。
- 読み込み中の Web ページが空白ですpyqt5+QWebEngine ウィンドウのグラフィックが表示できない場合の解決策を
問題に対する私の解決策:
声明窗口程序时,输入参数添加"--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-Markdown
John 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 パラメーターを使用して有効または無効にできます。デフォルトは です。この関数を呼び出すと、元に戻す/やり直しの履歴がリセットされます。MarkdownDialectCommonMark
Markdown格式
'* bold * text'
markdown字符串
HTML解析
setHtml
不支持HTML块内的Markdown格式化
MarkdownDialectGitHub
QTextBrowser(QTextEdit).setMarkdown(markdown)
QTextEdit.setMarkdown(markdown)
このプロパティは、テキスト編集用の Markdown インターフェイスを提供します。HTML 書式設定を埋め込まずにテキスト エディタのテキストを返しますtoMarkdown()
。特定の色や名前付きフォントの使用など、サポートされている一部の機能は「純粋に」表現できないため、無視されます。テキストエディタのテキストを変更します。以前のテキストをすべて削除し、元に戻す/やり直しの履歴をクリアします。入力されたテキストはMarkdown形式のリッチテキストとして解釈されます。に含まれる は、と同じように扱われますが、. パーサーの特定の機能は、 features パラメーターを使用して有効または無効にすることができます。デフォルト値は です。纯文本Markdown
QTextDocument
Markdown
setMarkdown()
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_())