PyQtをUbuntuにインストールしマインドマップをHTMLやWikiに変換するツールをつくる
PyQtが面白くなってきたので、Ubuntuにもインストールする
インストール
PyQtを探す
$ apt-cache search pyqt4
python-pyudev - Python bindings for libudevpython-qt4 - Python bindings for Qt4
python-qt4-dbg - Python bindings for Qt4 (debug extensions)python-qt4-dbus - D-Bus Support for PyQt4
python-qt4-dbus-dbg - D-Bus Support for PyQt4 (debug extensions)
:
インストール
$ sudo apt-get install python-qt4
以上。
使ってみる
インストールがあっけなかったので、自分用のユーティリティを練習がてらGUI化。
普段いろいろなメモや検討、読書の要点などをまとめるのに、Androidの Mindjet というマインドマップ
アプリを使っている。
ということで、Mindjet で、FreeMind 形式で保存したXMLファイルから、FreeStyleWiki の markdown 記法チックに変換したり、HTMLに変換したりするツールをPyQtでGUI化してみる。
できた。この程度なら、すぐできる。素晴らしい!
FreeStyleWiki 書式に変換
HTMLに変換
HTMLプレビュー
以下ソースコード。
かなりやっつけで、ぜんぜん最適化できてないが、自分づかいではこの程度で結構捗るんだよね。
# -*- coding:utf-8 -*-
import sys
import os
import glob
import codecs
from xml.dom.minidom import parse
from xml.dom import Node
from xml.sax.saxutils import escape
from PyQt4 import QtGui as gui
from PyQt4 import QtCore as core
class MainWindow(gui.QWidget):
def __init__(self):
super(MainWindow, self).__init__()
self.initUi()
def initUi(self):
grid = gui.QGridLayout()
boxFile = gui.QHBoxLayout()
self.txtFile = gui.QLineEdit()
btnFile = gui.QPushButton('...')
btnFile.setMaximumWidth(40)
btnFile.clicked.connect(self.chooseMindMapFile)
boxFile.addWidget(self.txtFile)
boxFile.addWidget(btnFile)
grid.addWidget(gui.QLabel(u'FreeMind ファイル'),1,0)
grid.addLayout(boxFile,1,1)
boxCtrl = gui.QHBoxLayout()
rdoGroup = gui.QButtonGroup()
self.rdoFsw = gui.QRadioButton('FreeStyleWiki')
rdoGroup.addButton(self.rdoFsw)
boxCtrl.addWidget(self.rdoFsw)
self.rdoFsw.setChecked(True)
self.rdoHtml = gui.QRadioButton('Html')
rdoGroup.addButton(self.rdoHtml)
boxCtrl.addWidget(self.rdoHtml)
self.rdoHtmlPrv = gui.QRadioButton('Html(Preview)')
rdoGroup.addButton(self.rdoHtmlPrv)
boxCtrl.addWidget(self.rdoHtmlPrv)
btnConv = gui.QPushButton(u'変換')
btnConv.setMaximumWidth(200)
btnConv.clicked.connect(self.doConvert)
boxCtrl.addWidget(btnConv)
grid.addLayout(boxCtrl,2,1)
self.txtOut = gui.QPlainTextEdit()
grid.addWidget(gui.QLabel(u'結果'),3,0)
grid.addWidget(self.txtOut,3,1)
self.setLayout(grid)
self.setWindowTitle('FreeMind xml to FreeStyleWiki/Html')
self.show()
def chooseMindMapFile(self):
dialog = gui.QFileDialog()
dialog.setFileMode(gui.QFileDialog.AnyFile)
dialog.setFilter('FreeMindMap (*.mm)')
if dialog.exec_():
fileNames = dialog.selectedFiles()
for f in fileNames:
self.txtFile.setText(f)
return
return self.txtFile.setText('')
def doConvert(self):
if self.rdoFsw.isChecked():
levelPrefix = wikiLevelPrefix
else:
levelPrefix = htmlLevelPrefix
isHtmlPreview = self.rdoHtmlPrv.isChecked()
convertToWikiFormat(self.txtFile.text(), self.txtOut, levelPrefix, isHtmlPreview)
def convertToWikiFormat(mm_file, txt_out, levelPrefix, isHtmlPreview):
txt_out.clear()
dom = parse(open(mm_file,'r'))
level = 0
handleElement(dom.firstChild, level, txt_out, levelPrefix, isHtmlPreview)
txt_out.verticalScrollBar().triggerAction(gui.QAbstractSlider.SliderToMinimum)
def handleElement(element, level, txt_out, levelPrefix, isHtmlPreview):
if element.hasAttribute('TEXT'):
if isHtmlPreview:
txt_out.appendHtml(levelPrefix(level, element.getAttribute('TEXT')) + element.getAttribute('TEXT'))
else:
txt_out.appendPlainText(levelPrefix(level, element.getAttribute('TEXT')) + element.getAttribute('TEXT'))
if element.hasChildNodes():
for node in element.childNodes:
if Node.ELEMENT_NODE == node.nodeType:
handleElement(node, level + 1, txt_out, levelPrefix, isHtmlPreview)
def wikiLevelPrefix(level, text):
level_prefix_list = ('', '!!!','!!','!','::','*','**')
ret = ''
if len(level_prefix_list) > level:
ret = level_prefix_list[level]
else:
ret = ''.join(['.' for x in range(level - len(level_prefix_list))])
return ret
def htmlLevelPrefix(level, text):
level_prefix_list = ('h1', 'h1','h2','h3','h4')
tag = None
prefix = ''
if len(level_prefix_list) > level:
tag = level_prefix_list[level]
style = ''
else:
tag = 'p'
style = ' style="padding-left:%dem"' % ((level-3) * 2)
prefix = '- '
return '<%S%S>%s%s</%S>\r\n' % (tag, style, prefix, escape(text), tag)
def main():
app = gui.QApplication(sys.argv)
mainWin = MainWindow()
sys.exit(app.exec_())
if __name__ == '__main__':
main()



