summaryrefslogtreecommitdiff
path: root/interface/input/parsers.py
diff options
context:
space:
mode:
Diffstat (limited to 'interface/input/parsers.py')
-rwxr-xr-xinterface/input/parsers.py39
1 files changed, 37 insertions, 2 deletions
diff --git a/interface/input/parsers.py b/interface/input/parsers.py
index 5e53e03..f97dbf1 100755
--- a/interface/input/parsers.py
+++ b/interface/input/parsers.py
@@ -73,7 +73,7 @@ def parse_channelrange(s):
def parse_value(s):
if not s:
- return None, s
+ return None, s, None
buff = ""
while s:
@@ -87,7 +87,7 @@ def parse_value(s):
def parse_num(s):
if not s:
- return None, s
+ return None, s, None
buff = ""
while s:
@@ -99,6 +99,39 @@ def parse_num(s):
return (None if not buff else int(buff)), s, buff
+_POSTFIXES = "mcisahkegtp"
+
+def parse_time(s):
+ if not s:
+ return None, s, None
+
+ v, s, d = parse_num(s)
+ if v is None:
+ return None, s, None
+
+ if not s:
+ return v, s, d
+
+ try:
+ idx = _POSTFIXES.index(s[0].lower())
+ except ValueError:
+ return v, s, d
+
+ v *= 10**idx
+ return v, s[1:], d+s[0].lower()
+
+_ALL_LETTERS = "abcdefghijklmnopqrstuvwxyz"
+def parse_any_letter(s):
+ if not s:
+ return None, s
+
+ l = s[0].lower()
+
+ if l not in _ALL_LETTERS:
+ return None, s, None
+
+ return _ALL_LETTERS.index(l), s[1:], l
+
def make_parse_letter(letter, display):
def inner(s):
if not s or s[0] != letter:
@@ -162,4 +195,6 @@ PARSE_MAP = {
"$string": parse_string,
"$num": parse_num,
"$quoted_string": parse_quotedstring,
+ "$letter": parse_any_letter,
+ "$time": parse_time,
}