FazBrowse GitHub Viewer
|
Trending
|
URL:
|
Home
Tools:
[Download Repo ZIP]
[View Raw Code]
[Original HTTPS Page]
bpython-bpython/bpython/curtsiesfrontend/parse.py at main · sthagen/bpython-bpython · GitHub
sthagen
/
bpython-bpython
Public
forked from
bpython/bpython
Notifications
You must be signed in to change notification settings
Fork
0
Star
0
Code
Security and quality
0
Insights
Additional navigation options
Code
Security and quality
Insights
Expand file tree
Breadcrumbs
bpython-bpython
/
bpython
/
curtsiesfrontend
/
parse.py
Copy path
More file actions
More file actions
Latest commit
History
History
History
109 lines (92 loc) · 2.86 KB
Breadcrumbs
bpython-bpython
/
bpython
/
curtsiesfrontend
/
parse.py
Copy path
File metadata and controls
109 lines (92 loc) · 2.86 KB
Raw
Copy raw file
Download raw file
Open symbols panel
Edit and raw actions
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
import
re
from
functools
import
partial
from
typing
import
Any
from
collections
.
abc
import
Callable
from
curtsies
.
formatstring
import
fmtstr
,
FmtStr
from
curtsies
.
termformatconstants
import
(
FG_COLORS
,
BG_COLORS
,
colors
as
CURTSIES_COLORS
,
)
from
..
config
import
COLOR_LETTERS
from
..
lazyre
import
LazyReCompile
COLORS
=
CURTSIES_COLORS
+
(
"default"
,)
CNAMES
=
dict
(
zip
(
COLOR_LETTERS
,
COLORS
))
# hack for finding the "inverse"
INVERSE_COLORS
=
{
CURTSIES_COLORS
[
idx
]:
CURTSIES_COLORS
[
(
idx
+
(
len
(
CURTSIES_COLORS
)
//
2
))
%
len
(
CURTSIES_COLORS
)
]
for
idx
in
range
(
len
(
CURTSIES_COLORS
))
}
INVERSE_COLORS
[
"default"
]
=
INVERSE_COLORS
[
CURTSIES_COLORS
[
0
]]
def
func_for_letter
(
letter_color_code
:
str
,
default
:
str
=
"k"
)
->
Callable
[...,
FmtStr
]:
"""Returns FmtStr constructor for a bpython-style color code"""
if
letter_color_code
==
"d"
:
letter_color_code
=
default
elif
letter_color_code
==
"D"
:
letter_color_code
=
default
.
upper
()
return
partial
(
fmtstr
,
fg
=
CNAMES
[
letter_color_code
.
lower
()],
bold
=
letter_color_code
.
isupper
(),
)
def
color_for_letter
(
letter_color_code
:
str
,
default
:
str
=
"k"
)
->
str
:
if
letter_color_code
==
"d"
:
letter_color_code
=
default
return
CNAMES
[
letter_color_code
.
lower
()]
def
parse
(
s
:
str
)
->
FmtStr
:
"""Returns a FmtStr object from a bpython-formatted colored string"""
rest
=
s
stuff
=
[]
while
rest
:
start
,
rest
=
peel_off_string
(
rest
)
stuff
.
append
(
start
)
return
(
sum
((
fs_from_match
(
d
)
for
d
in
stuff
[
1
:]),
fs_from_match
(
stuff
[
0
]))
if
len
(
stuff
)
>
0
else
FmtStr
()
)
def
fs_from_match
(
d
:
dict
[
str
,
Any
])
->
FmtStr
:
atts
=
{}
color
=
"default"
if
d
[
"fg"
]:
# this isn't according to spec as I understand it
if
d
[
"fg"
].
isupper
():
d
[
"bold"
]
=
True
# TODO figure out why boldness isn't based on presence of \x02
color
=
CNAMES
[
d
[
"fg"
].
lower
()]
if
color
!=
"default"
:
atts
[
"fg"
]
=
FG_COLORS
[
color
]
if
d
[
"bg"
]:
if
d
[
"bg"
]
==
"I"
:
# hack for finding the "inverse"
color
=
INVERSE_COLORS
[
color
]
else
:
color
=
CNAMES
[
d
[
"bg"
].
lower
()]
if
color
!=
"default"
:
atts
[
"bg"
]
=
BG_COLORS
[
color
]
if
d
[
"bold"
]:
atts
[
"bold"
]
=
True
return
fmtstr
(
d
[
"string"
],
**
atts
)
peel_off_string_re
=
LazyReCompile
(
r"""(?P<colormarker>\x01
(?P<fg>[krgybmcwdKRGYBMCWD]?)
(?P<bg>[krgybmcwdKRGYBMCWDI]?)?)
(?P<bold>\x02?)
\x03
(?P<string>[^\x04]*)
\x04
(?P<rest>.*)
"""
,
re
.
VERBOSE
|
re
.
DOTALL
,
)
def
peel_off_string
(
s
:
str
)
->
tuple
[
dict
[
str
,
Any
],
str
]:
m
=
peel_off_string_re
.
match
(
s
)
assert
m
,
repr
(
s
)
d
=
m
.
groupdict
()
rest
=
d
[
"rest"
]
del
d
[
"rest"
]
return
d
,
rest
Back
|
FazBrowse Home
|
New Git URL