eric6/Preferences/HighlightingStylesFile.py

branch
jsonfiles
changeset 8022
2da0139f4f91
child 8026
d3eacdbcb18b
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/eric6/Preferences/HighlightingStylesFile.py	Thu Jan 28 18:29:00 2021 +0100
@@ -0,0 +1,139 @@
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2021 Detlev Offenbach <detlev@die-offenbachs.de>
+#
+
+"""
+Module implementing a class representing the highlighting styles JSON file.
+"""
+
+import json
+import time
+
+from PyQt5.QtCore import QObject
+from PyQt5.QtGui import QColor, QFont
+
+from E5Gui import E5MessageBox
+from E5Gui.E5OverrideCursor import E5OverridenCursor
+
+import Preferences
+
+
+class HighlightingStylesFile(QObject):
+    """
+    Class representing the highlighting styles JSON file.
+    """
+    def __init__(self, parent: QObject = None):
+        """
+        Constructor
+        
+        @param parent reference to the parent object (defaults to None)
+        @type QObject (optional)
+        """
+        super(HighlightingStylesFile, self).__init__(parent)
+    
+    def writeFile(self, filename: str, lexers: list) -> bool:
+        """
+        Public method to write the highlighting styles data to a highlighting
+        styles JSON file.
+        
+        @param filename name of the highlighting styles file
+        @type str
+        @param lexers list of lexers for which to export the styles
+        @type list of PreferencesLexer
+        @return flag indicating a successful write
+        @rtype bool
+        """
+        stylesDict = {}
+        # step 0: header
+        stylesDict["header"] = {
+            "comment": "eric highlighting styles file",
+            "saved": time.strftime('%Y-%m-%d, %H:%M:%S'),
+            "author": Preferences.getUser("Email"),
+        }
+        
+        # step 1: add the lexer style data
+        stylesDict["lexers"] = []
+        for lexer in lexers:
+            lexerDict = {
+                "name": lexer.language(),
+                "styles": [],
+            }
+            for description, style, substyle in lexer.getStyles():
+                lexerDict["styles"].append({
+                    "description": description,
+                    "style": style,
+                    "substyle": substyle,
+                    "color": lexer.color(style, substyle).name(),
+                    "paper": lexer.paper(style, substyle).name(),
+                    "font": lexer.font(style, substyle).toString(),
+                    "eolfill": lexer.eolFill(style, substyle),
+                    "words": lexer.words(style, substyle).strip(),
+                })
+            stylesDict["lexers"].append(lexerDict)
+        
+        try:
+            jsonString = json.dumps(stylesDict, indent=2)
+            with open(filename, "w") as f:
+                f.write(jsonString)
+        except (TypeError, EnvironmentError) as err:
+            with E5OverridenCursor():
+                E5MessageBox.critical(
+                    None,
+                    self.tr("Export Highlighting Styles"),
+                    self.tr(
+                        "<p>The highlighting styles file <b>{0}</b> could not"
+                        " be written.</p><p>Reason: {1}</p>"
+                    ).format(filename, str(err))
+                )
+                return False
+        
+        return True
+    
+    def readFile(self, filename: str, lexers: dict) -> bool:
+        """
+        Public method to read the highlighting styles data from a highlighting
+        styles JSON file.
+        
+        @param filename name of the highlighting styles file
+        @type str
+        @param lexers dictionary of lexer objects for which to import the
+            styles
+        @type dict of {str: PreferencesLexer}
+        @return flag indicating a successful read
+        @rtype bool
+        """
+        try:
+            with open(filename, "r") as f:
+                jsonString = f.read()
+            stylesDict = json.loads(jsonString)
+        except (EnvironmentError, json.JSONDecodeError) as err:
+            E5MessageBox.critical(
+                None,
+                self.tr("Import Highlighting Styles"),
+                self.tr(
+                    "<p>The highlighting styles file <b>{0}</b> could not be"
+                    " read.</p><p>Reason: {1}</p>"
+                ).format(filename, str(err))
+            )
+            return False
+        
+        for lexerDict in stylesDict["lexers"]:
+            if lexerDict["name"] in lexers:
+                lexer = lexers[lexerDict["name"]]
+                for styleDict in lexerDict["styles"]:
+                    style = styleDict["style"]
+                    substyle = styleDict["substyle"]
+                    lexer.setColor(QColor(styleDict["color"]), style, substyle)
+                    lexer.setPaper(QColor(styleDict["paper"]), style, substyle)
+                    font = QFont()
+                    font.fromString(styleDict["font"])
+                    lexer.setFont(font, style, substyle)
+                    lexer.setEolFill(styleDict["eolfill"], style, substyle)
+                    if substyle >= 0:
+                        # description and words can only be set for sub-styles
+                        lexer.setDescription(styleDict["description"],
+                                             style, substyle)
+                        lexer.setWords(styleDict["words"], style, substyle)
+        
+        return True

eric ide

mercurial