From 17d3e10079cb277e5428fbe359665269b60a58a4 Mon Sep 17 00:00:00 2001
From: Vanessa Stehr <vanessa.stehr@ptb.de>
Date: Wed, 20 Sep 2023 13:59:07 +0200
Subject: [PATCH] Refactor code to better represent the parser

---
 dist/dsiParser-1.0.0-py3-none-any.whl | Bin 0 -> 4645 bytes
 dist/dsiParser-1.0.0.tar.gz           | Bin 0 -> 5242 bytes
 setup.cfg                             |   2 +-
 src/dsiParser.py                      | 262 ++++++++++++--------------
 4 files changed, 126 insertions(+), 138 deletions(-)
 create mode 100644 dist/dsiParser-1.0.0-py3-none-any.whl
 create mode 100644 dist/dsiParser-1.0.0.tar.gz

diff --git a/dist/dsiParser-1.0.0-py3-none-any.whl b/dist/dsiParser-1.0.0-py3-none-any.whl
new file mode 100644
index 0000000000000000000000000000000000000000..fe1664a79c4ec84e9ff95c4d64cce91e010352e3
GIT binary patch
literal 4645
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
XI>4Ki4WyclfsJ7^BLhQ>0Eh<w$n`3J

literal 0
HcmV?d00001

diff --git a/dist/dsiParser-1.0.0.tar.gz b/dist/dsiParser-1.0.0.tar.gz
new file mode 100644
index 0000000000000000000000000000000000000000..41bc5dee470fc1cd6a27ea6042c9aae1632583a5
GIT binary patch
literal 5242
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
IPB1V40CfC<qW}N^

literal 0
HcmV?d00001

diff --git a/setup.cfg b/setup.cfg
index c567c9e..5662678 100644
--- a/setup.cfg
+++ b/setup.cfg
@@ -1,6 +1,6 @@
 [metadata]
 name = dsiParser
-version = 0.2.0
+version = 1.0.0
 description = Parse D-SI unit strings to LaTeX
 long_description = file: README.md
 
diff --git a/src/dsiParser.py b/src/dsiParser.py
index 313c839..8d1d204 100644
--- a/src/dsiParser.py
+++ b/src/dsiParser.py
@@ -17,27 +17,145 @@ class dsiParser:
         self.latexDefaultSuffix = latexDefaultSuffix
 
     def parse(self, dsiString: str):
-        """Parse D-SI unit string into tree structure
+        """parses a D-SI string into a tree structure
+
+
+        Args:
+            dsiString (str): D-SI unit raw string
+
+        Raises:
+            RuntimeWarning: double backslashes in D-SI string
+            RuntimeWarning: empty D-SI string
+
+        Returns:
+            dsiTree: dsiTree object containing the D-SI unit
+        """
+        warningMessages = []
+        # Catch any double (triple...) \ before they annoy us
+        while r'\\' in dsiString:
+            warningMessages.append(_warn(f"Double backslash found in string, treating as one backslash: \"{dsiString}\"", RuntimeWarning))
+            dsiString = dsiString.replace(r'\\', '\\')
+
+        if dsiString == "":
+            warningMessages.append(_warn("Given D-SI string is empty!", RuntimeWarning))
+            return _dsiTree(dsiString, [], warningMessages, self.latexDefaultWrapper, self.latexDefaultPrefix, self.latexDefaultSuffix)
+
+        tree = []
+        (tree, fractionWarnings) = self._parseDsiFraction(dsiString)
+        warningMessages += fractionWarnings
+        for i, node in enumerate(tree):
+            (tree[i], fractionlessWarnings) = self._parseFractionlessDsi(node)
+            warningMessages += fractionlessWarnings
+        return _dsiTree(dsiString, tree, warningMessages, self.latexDefaultWrapper, self.latexDefaultPrefix, self.latexDefaultSuffix)
+    
+    def _parseDsiFraction(self, dsiString: str):
+        """parses D-SI fraction into list of fraction elements
 
         Args:
-            dsiString (str): The D-SI string to be parsed
+            dsiString (str): D-SI unit raw string
+
+        Raises:
+            RuntimeWarning: String must not contain more than one "per", 
+                            as defined in the D-SI specs
 
         Returns:
-            _dsiTree: The generated tree
+            list: strings separated by the "per"
+            list: warning messages of problems encountered while parsing
         """
-        return _dsiTree(dsiString, self.latexDefaultWrapper, self.latexDefaultPrefix, self.latexDefaultSuffix)
+        tree = []
+        warningMessages = []
+        tree = dsiString.split(r"\per")
+        if len(tree) > 2:
+            warningMessages.append(_warn(r"The dsi string contains more than one \per, does not "+
+                        f"match specs! Given string: {dsiString}", 
+                        RuntimeWarning))
+        return (tree, warningMessages)
+
+    def _parseFractionlessDsi(self, dsiString:str):
+        """parses D-SI unit string without fractions
 
+        Args:
+            dsiString (str): D-SI unit raw string, not containing any fractions
+
+        Raises:
+            RuntimeWarning: if string does not meet the specs
+
+        Returns:
+            list: list of nodes
+            list: warning messages of problems encountered while parsing
+        """
+        warningMessages = []
+        items = dsiString.split("\\")
+        if items[0] == '': #first item of List should be empty, remove it
+            items.pop(0) 
+        else:
+            warningMessages.append(_warn(f"string should start with \\, string given was \"{dsiString}\"", RuntimeWarning))
+        nodes = []
+
+        (prefix, unit, exponent) = ('','','')
+        item = items.pop(0)
+        while True:
+            if item in _dsiPrefixesLatex:
+                prefix = item
+                try:
+                    item = items.pop(0)
+                except IndexError:
+                    item = ''
+            if item in _dsiUnitsLatex:
+                unit = item
+                try:
+                    item = items.pop(0)
+                except IndexError:
+                    item = ''
+            if re.match(r'tothe\{-?\d+\.?\d?\}', item):
+                exponent = item.split('{')[1].split('}')[0]
+                try:
+                    item = items.pop(0)
+                except IndexError:
+                    item = ''
+            elif re.match(r'tothe\{.*\}', item):
+                exponent = item.split('{')[1].split('}')[0]
+                _warn(f"The exponent \"{exponent}\" is not a number!", RuntimeWarning)
+                try:
+                    item = items.pop(0)
+                except IndexError:
+                    item = ''
+            if (prefix, unit, exponent) == ('','',''):
+                unit = item
+                try:
+                    item = items.pop(0)
+                except IndexError:
+                    item = ''
+                warningMessages.append(_warn(f"The identifier \"{unit}\" does not match any D-SI units!", RuntimeWarning))
+            elif unit == '':
+                itemStr = ""
+                if prefix != "":
+                    itemStr = itemStr + "\\" + prefix
+                if exponent != "":
+                    itemStr = itemStr + r"\tothe{" + exponent + r"}"
+                warningMessages.append(_warn(f"This D-SI unit seems to be missing the base unit! \"{itemStr}\"", RuntimeWarning))
+
+            nodes.append(_node(prefix, unit, exponent))
+            if (len(items) == 0) and (item == ''): break
+            (prefix, unit, exponent) = ('','','')
+        
+        return (nodes, warningMessages)
 
 class _dsiTree:
-    """D-SI representation in tree form, also includes validity check and warnings about D-SI string
+    """D-SI representation in tree form, also includes validity check and warnings about D-SI string.
+       Tree format: list of lists:
+           List format: 
+           First layer: items of the fraction 
+           Second layer: nodes containing prefix, unit, power
     """
-    def __init__(self, dsiString: str, latexDefaultWrapper='$$', latexDefaultPrefix='', latexDefaultSuffix=''):
+    def __init__(self, dsiString: str, dsiTree, warningMessages, latexDefaultWrapper='$$', latexDefaultPrefix='', latexDefaultSuffix=''):
         """
         Args:
             dsiString (str): the D-SI unit string to be parsed
         """
         self.dsiString = dsiString
-        (self.tree, self.warnings) = _parseDsi(dsiString)
+        self.tree = dsiTree
+        self.warnings = warningMessages
         self.valid = len(self.warnings) == 0
         self._latexDefaultWrapper = latexDefaultWrapper
         self._latexDefaultPrefix = latexDefaultPrefix
@@ -126,136 +244,6 @@ class _node:
 
         return latexString
 
-
-def _parseDsi(dsiString: str):
-    """parses a D-SI string into a list of lists:
-    List format: 
-    First layer: items of the fraction 
-    Second layer: nodes containing prefix, unit, power
-
-
-    Args:
-        dsiString (str): D-SI unit raw string
-
-    Raises:
-        RuntimeWarning: double backslashes in D-SI string
-        RuntimeWarning: empty D-SI string
-
-    Returns:
-        list: tree containing the D-SI unit
-        list: warning messages of problems encountered while parsing
-    """
-    warningMessages = []
-    # Catch any double (triple...) \ before they annoy us
-    while r'\\' in dsiString:
-        warningMessages.append(_warn(f"Double backslash found in string, treating as one backslash: \"{dsiString}\"", RuntimeWarning))
-        dsiString = dsiString.replace(r'\\', '\\')
-
-    if dsiString == "":
-        warningMessages.append(_warn("Given D-SI string is empty!", RuntimeWarning))
-        return ([], warningMessages)
-
-    tree = []
-    (tree, fractionWarnings) = _parseDsiFraction(dsiString)
-    warningMessages += fractionWarnings
-    for i, node in enumerate(tree):
-        (tree[i], fractionlessWarnings) = _parseFractionlessDsi(node)
-        warningMessages += fractionlessWarnings
-    return (tree, warningMessages)
-
-def _parseDsiFraction(dsiString: str):
-    """parses D-SI fraction into list of fraction elements
-
-    Args:
-        dsiString (str): D-SI unit raw string
-
-    Raises:
-        RuntimeWarning: String must not contain more than one "per", 
-                        as defined in the D-SI specs
-
-    Returns:
-        list: strings separated by the "per"
-        list: warning messages of problems encountered while parsing
-    """
-    tree = []
-    warningMessages = []
-    tree = dsiString.split(r"\per")
-    if len(tree) > 2:
-        warningMessages.append(_warn(r"The dsi string contains more than one \per, does not "+
-                    f"match specs! Given string: {dsiString}", 
-                    RuntimeWarning))
-    return (tree, warningMessages)
-
-def _parseFractionlessDsi(dsiString:str):
-    """parses D-SI unit string without fractions
-
-    Args:
-        dsiString (str): D-SI unit raw string, not containing any fractions
-
-    Raises:
-        RuntimeWarning: if string does not meet the specs
-
-    Returns:
-        list: list of nodes
-        list: warning messages of problems encountered while parsing
-    """
-    warningMessages = []
-    items = dsiString.split("\\")
-    if items[0] == '': #first item of List should be empty, remove it
-        items.pop(0) 
-    else:
-        warningMessages.append(_warn(f"string should start with \\, string given was \"{dsiString}\"", RuntimeWarning))
-    nodes = []
-
-    (prefix, unit, exponent) = ('','','')
-    item = items.pop(0)
-    while True:
-        if item in _dsiPrefixesLatex:
-            prefix = item
-            try:
-                item = items.pop(0)
-            except IndexError:
-                item = ''
-        if item in _dsiUnitsLatex:
-            unit = item
-            try:
-                item = items.pop(0)
-            except IndexError:
-                item = ''
-        if re.match(r'tothe\{-?\d+\.?\d?\}', item):
-            exponent = item.split('{')[1].split('}')[0]
-            try:
-                item = items.pop(0)
-            except IndexError:
-                item = ''
-        elif re.match(r'tothe\{.*\}', item):
-            exponent = item.split('{')[1].split('}')[0]
-            _warn(f"The exponent \"{exponent}\" is not a number!", RuntimeWarning)
-            try:
-                item = items.pop(0)
-            except IndexError:
-                item = ''
-        if (prefix, unit, exponent) == ('','',''):
-            unit = item
-            try:
-                item = items.pop(0)
-            except IndexError:
-                item = ''
-            warningMessages.append(_warn(f"The identifier \"{unit}\" does not match any D-SI units!", RuntimeWarning))
-        elif unit == '':
-            itemStr = ""
-            if prefix != "":
-                itemStr = itemStr + "\\" + prefix
-            if exponent != "":
-                itemStr = itemStr + r"\tothe{" + exponent + r"}"
-            warningMessages.append(_warn(f"This D-SI unit seems to be missing the base unit! \"{itemStr}\"", RuntimeWarning))
-
-        nodes.append(_node(prefix, unit, exponent))
-        if (len(items) == 0) and (item == ''): break
-        (prefix, unit, exponent) = ('','','')
-    
-    return (nodes, warningMessages)
-
 def _warn(message: str, warningClass):
     """Output warning on command line and return warning message
 
-- 
GitLab