-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathpythonl.pynl
More file actions
executable file
·157 lines (127 loc) · 4.55 KB
/
pythonl.pynl
File metadata and controls
executable file
·157 lines (127 loc) · 4.55 KB
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
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
#!/bin/env python3
"""
Dit bestand is mede gebaseerd op de volgende twee voorbeelden:
- https://github.com/aroberge/ideas/blob/master/ideas/examples/french.py
- https://stackoverflow.com/a/43573798
"""
importeer sys
importeer os als bs
importeer importlib als importeerbib
importeer code
van token_utils importeer tokenize als tekeniseer, untokenize als ontekeniseer
van importlib.abc importeer MetaPathFinder als MetaPadVinder, Loader als Laader
van importlib.util importeer spec_from_file_location als spec_van_bestandslocatie
van importlib.machinery importeer FileFinder als BestandsVinder
py_naar_nl = {
"and" : "en",
"as" : "als",
"assert" : "eis",
"async" : "async",
"await" : "wachtop",
"break" : "stop",
"case" : "geval",
"class" : "klasse",
"continue": "doorgaan",
"def": "def",
"del": "verwijder",
"if": "indien",
"elif": "andien",
"else": "anders",
"except": "behalve",
"False": "Onwaar",
"finally": "uiteindelijk",
"for": "voor",
"from": "van",
"global": "globaal",
"import": "importeer",
"in": "in",
"is": "is",
"lambda": "lambda",
"match": "vergelijk",
"None": "Niets",
"nonlocal": "nietlokaal",
"not": "niet",
"or": "of",
"pass": "pas",
"raise": "hef",
"return": "retour",
"True": "Waar",
"try": "probeer",
"type": "type",
"while": "zolang",
"with": "met",
"yield": "lever",
}
py_naar_nl = {nl_kwd: py_kwd voor py_kwd, nl_kwd in py_naar_nl.items()}
def vertaal_teken(teken, vertalingen):
probeer:
teken.string = vertalingen[teken.string]
behalve KeyError:
pas
retour teken
def vertaal_bron(bron, vertalingen = py_naar_nl):
brontekens = tekeniseer(bron)
vertaalde_tekens = [vertaal_teken(token, vertalingen) voor token in brontekens]
retour ontekeniseer(vertaalde_tekens)
klasse PynlMetaPadVinder(MetaPadVinder):
def find_spec(self, volledige_naam, pad, doel=None):
indien pad is Niets of pad == "":
pad = [bs.getcwd()] # import op het hoogste niveau --
indien "." in volledige_naam:
*ouders, naam = volledige_naam.split(".")
anders:
naam = volledige_naam
voor deel in pad:
indien bs.path.isdir(bs.path.join(deel, naam)):
# deze module heeft onderliggende modules
bestandsnaam = bs.path.join(deel, naam, "__init__.pynl")
submodule_locaties = [bs.path.join(deel, naam)]
anders:
bestandsnaam = bs.path.join(deel, naam + ".pynl")
submodule_locaties = Niets
indien niet bs.path.exists(bestandsnaam):
doorgaan
retour spec_van_bestandslocatie(volledige_naam, bestandsnaam, loader=PynlLaader(bestandsnaam),
submodule_search_locations=submodule_locaties)
retour Niets # we weten niet hoe we dit moeten importeren
klasse PynlLaader(Laader):
def __init__(self, bestandsnaam):
self.bestandsnaam = bestandsnaam
def create_module(self, spec):
retour Niets # gebruik standaard modulecreatiesemantiek
def exec_module(self, module):
met open(self.bestandsnaam) als f:
bron = f.read()
vertaald = vertaal_bron(bron, vertalingen=py_naar_nl)
exec(vertaald, vars(module))
def hoofd_uitvoeren(locatie, argumenten):
met open(locatie) als f:
bron = f.read()
vertaald = vertaal_bron(bron, vertalingen=py_naar_nl)
exec(vertaald, {'argv_external': argumenten, '__name__': '__main__'})
indien __name__ == '__main__':
sys.meta_path.insert(0, PynlMetaPadVinder())
# wis eventuele caches
sys.path_importer_cache.clear()
importeerbib.invalidate_caches()
probeer:
# injecteer externe argumenten in het script
indien argv_external == []:
sys.argv = sys.argv[:1] # Doe alleen de naam van dit script in argv
anders:
voor idx, x in enumerate(argv_external):
sys.argv[idx] = x
behalve NameError:
pas
probeer:
locatie = sys.argv[1]
hoofd_uitvoeren(locatie, sys.argv[2:])
behalve IndexError:
# Also geen files start dan maar de pythonl shell
shell = code.InteractiveConsole(locals=globals())
oorspronkelijk_compile = shell.compile
def compile(code, file, lines):
code = vertaal_bron(code)
retour oorspronkelijk_compile(code, file, lines)
shell.compile = compile
shell.interact(banner=f"Pythonl (0.1.0) interactive shell {sys.version}")