diff --git a/manuskript/importer/__init__.py b/manuskript/importer/__init__.py index d5a0aef..16e4b7e 100644 --- a/manuskript/importer/__init__.py +++ b/manuskript/importer/__init__.py @@ -4,6 +4,7 @@ from manuskript.importer.folderImporter import folderImporter from manuskript.importer.markdownImporter import markdownImporter from manuskript.importer.opmlImporter import opmlImporter +from manuskript.importer.mindMapImporter import mindMapImporter from manuskript.importer.pandocImporters import markdownPandocImporter, \ odtPandocImporter, ePubPandocImporter, docXPandocImporter, HTMLPandocImporter, \ rstPandocImporter, LaTeXPandocImporter, OPMLPandocImporter @@ -13,6 +14,7 @@ importers = [ markdownImporter, folderImporter, opmlImporter, + mindMapImporter, # Pandoc markdownPandocImporter, diff --git a/manuskript/importer/mindMapImporter.py b/manuskript/importer/mindMapImporter.py new file mode 100644 index 0000000..af215ab --- /dev/null +++ b/manuskript/importer/mindMapImporter.py @@ -0,0 +1,80 @@ +#!/usr/bin/env python +# --!-- coding: utf8 --!-- + +from PyQt5.QtWidgets import qApp, QMessageBox +from manuskript.models.outlineModel import outlineItem +from manuskript.enums import Outline +from lxml import etree as ET +from manuskript.functions import mainWindow +from manuskript.importer.abstractImporter import abstractImporter + +class mindMapImporter(abstractImporter): + + name = "Mind Map" + description = "" + fileFormat = "Mind map Files (*.mm)" + icon = "text-x-opml+xml" + + @classmethod + def isValid(cls): + return True + + @classmethod + def startImport(cls, filePath, parentItem, settingsWidget, fromString=None): + """ + Import/export outline cards in mind map free plane. + """ + ret = False + + if filePath != "": + # We have a filePath, so we read the file + try: + with open(filePath, 'rb') as f: + content = f.read() + except: + return None + + elif fromString == "": + # We have neither filePath nor fromString, so we leave + return None + + else: + # We load from string + content = bytes(fromString, "utf-8") + + root = ET.fromstring(content) + + node = root.find("node") + items = [] + + if node is not None: + items.extend(cls.parseItems(node, parentItem)) + ret = True + + if not ret: + QMessageBox.critical( + settingsWidget, + qApp.translate("Import", "Mind Map Import"), + qApp.translate("Import", "This does not appear to be a valid Mind Map file.")) + + return None + + return items + + @classmethod + def parseItems(cls, underElement, parentItem=None): + items = [] + title = underElement.get('TEXT') + if title is not None: + + item = outlineItem(parent=parentItem, title=title) + items.append(item) + + children = underElement.findall('node') + if children is not None and len(children) > 0: + for c in children: + items.extend(cls.parseItems(c, item)) + else: + item.setData(Outline.type.value, 'md') + + return items