#!/usr/bin/env python # --!-- coding: utf8 --!-- import os from manuskript.importer.abstractImporter import abstractImporter from manuskript.models.outlineModel import outlineItem from manuskript.enums import Outline from PyQt5.QtWidgets import qApp class folderImporter(abstractImporter): name = "Folder" description = "" fileFormat = "<>" icon = "folder" @classmethod def isValid(cls): return True def startImport(self, filePath, parentItem, settingsWidget, fromString=None): """ Imports from a folder. """ ext = self.getSetting("ext").value() ext = [e.strip().replace("*", "") for e in ext.split(",")] sorting = self.getSetting("sortItems").value() items = [] stack = {} if self.getSetting("topLevelFolder").value(): parent = outlineItem(title=os.path.basename(filePath), parent=parentItem) items.append(parent) stack[filePath] = parent for dirpath, dirnames, filenames in os.walk(filePath): if dirpath in stack: item = stack[dirpath] else: # It's the parent folder, and we are not including it # so every item is attached to parentItem item = parentItem def addFile(f): fName, fExt = os.path.splitext(f) if fExt in ext: child = outlineItem(title=fName, _type="md", parent=item) with open(os.path.join(dirpath, f), "r") as fr: child._data[Outline.text] = fr.read() items.append(child) def addFolder(d): child = outlineItem(title=d, parent=item) items.append(child) stack[os.path.join(dirpath, d)] = child if not self.getSetting("separateFolderFiles").value(): # Import folder and files together (only makes differences if # they are sorted, really) allFiles = dirnames + filenames if sorting: allFiles = sorted(allFiles) for f in allFiles: if f in dirnames: addFolder(f) else: addFile(f) else: # Import first folders, then files if sorting: dirnames = sorted(dirnames) filenames = sorted(filenames) # Import folders for d in dirnames: addFolder(d) # Import files for f in filenames: addFile(f) return items def settingsWidget(self, widget): """ Takes a QWidget that can be modified and must be returned. """ # Add group group = self.addGroup(widget.toolBox.widget(0), qApp.translate("Import", "Folder import")) #group = cls.addPage(widget, "Folder import") self.addSetting("info", "label", qApp.translate("Import", """Info: Imports a whole directory structure. Folders are added as folders, and plaintext documents within (you chose which ones by extension) are added as scene.
 """)) self.addSetting("ext", "text", qApp.translate("Import", "Include only those extensions:"), default="*.txt, *.md", tooltip=qApp.translate("Import", "Coma separated values")), self.addSetting("topLevelFolder", "checkbox", qApp.translate("Import", "Include top-level folder"), default=False), self.addSetting("sortItems", "checkbox", qApp.translate("Import", "Sort items by name"), default=True), self.addSetting("separateFolderFiles", "checkbox", qApp.translate("Import", "Import folder then files"), default=True), for s in self.settings: self.settings[s].widget(group) return widget