I just wanna share with you a test I did few days ago.
There are a lot of Markdown editors on the market (and some of them are expensive).
Why not try to do one by yourself ?
This experiment will show you that it's pretty easy to do.
Introduction
Python is often the weapon of choice when you want to build a little
crossplatform tool. Here I will use 2 well known Python librairies :
- Pyside for the GUI (Pyside is the official QT wrapper)
- Markdown2 for markdown conversion
Of, course, you will not get a "professional" editor at the end of this article
but I hope this will be a good enough proof of concept to start your own.
Last, the source code on GitHub for an easier access :
https://github.com/MeyerDumont/markdown-editor
Let's go !
1. Download Pyside
This is generally a two step process
- install qt librairies
- install the python wrapper
Please follow the exact instructions for your system here :
http://qt-project.org/wiki/Get-PySide
2. Download Markdown2
To install it in your Python installation run one of the following:
- pip install markdown2
- pypm install markdown2 # if you use ActivePython
- easy_install markdown2 # if this is the best you have
- python setup.py install
For more information, please go here :
https://github.com/trentm/python-markdown2
4. Let's code (Code Explanation)
We want to have 2 panels, a text editor on the left and a web browser on the right. In QT terms, we need a QSplitter with a QTextEdit on the left and a QWebView on the right :
self.editor = QTextEdit(self)
self.web = QWebView()
splitter = QSplitter(Qt.Horizontal) splitter.addWidget(self.editor) splitter.addWidget(self.web)
We also need to be notified when the text editor content changes. This is easy with the textChanged signal (=callback) our onTextChanged method will be called :
self.editor.textChanged.connect(self.onTextChanged)The last thing to do is to get the content of the text editor, convert it to html
try: html = markdown2.markdown(self.my_editor.toPlainText()) except: html = 'Error decoding '
and send the result to the browser :
self.web.setHtml(html)
That's all folks , here is the entire source code and a video to show you the result
import sys from PySide.QtCore import * from PySide.QtGui import * from PySide.QtWebKit import * from PySide.QtNetwork import * import markdown2 class MarkdownEditor(QWidget): def __init__(self): super(MarkdownEditor, self).__init__() self.initUI() def initUI(self): hbox = QHBoxLayout(self) self.editor = QTextEdit(self) self.editor.setFrameShape(QFrame.StyledPanel) self.editor.textChanged.connect(self.onTextChanged) self.web = QWebView() self.web.setHtml("start typing on the left pane") splitter = QSplitter(Qt.Horizontal) splitter.addWidget(self.editor) splitter.addWidget(self.web) hbox.addWidget(splitter) self.setLayout(hbox) QApplication.setStyle(QStyleFactory.create('Cleanlooks')) self.setGeometry(300, 300, 800, 400) self.setWindowTitle('MarkdownEditor') self.show() def onTextChanged(self): try: html = markdown2.markdown(self.editor.toPlainText()) except: html = 'Error decoding ' self.web.setHtml(html) def main(): app = QApplication(sys.argv) ex = MarkdownEditor() sys.exit(app.exec_()) if __name__ == '__main__': main()
I hope it helps
Meyer