1"""
2 pygments.lexers._lua_builtins
3 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
4
5 This file contains the names and modules of lua functions
6 It is able to re-generate itself, but for adding new functions you
7 probably have to add some callbacks (see function module_callbacks).
8
9 Do not edit the MODULES dict by hand.
10
11 Run with `python -I` to regenerate.
12
13 :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
14 :license: BSD, see LICENSE for details.
15"""
16
17MODULES = {'basic': ('_G',
18 '_VERSION',
19 'assert',
20 'collectgarbage',
21 'dofile',
22 'error',
23 'getmetatable',
24 'ipairs',
25 'load',
26 'loadfile',
27 'next',
28 'pairs',
29 'pcall',
30 'print',
31 'rawequal',
32 'rawget',
33 'rawlen',
34 'rawset',
35 'select',
36 'setmetatable',
37 'tonumber',
38 'tostring',
39 'type',
40 'warn',
41 'xpcall'),
42 'bit32': ('bit32.arshift',
43 'bit32.band',
44 'bit32.bnot',
45 'bit32.bor',
46 'bit32.btest',
47 'bit32.bxor',
48 'bit32.extract',
49 'bit32.lrotate',
50 'bit32.lshift',
51 'bit32.replace',
52 'bit32.rrotate',
53 'bit32.rshift'),
54 'coroutine': ('coroutine.close',
55 'coroutine.create',
56 'coroutine.isyieldable',
57 'coroutine.resume',
58 'coroutine.running',
59 'coroutine.status',
60 'coroutine.wrap',
61 'coroutine.yield'),
62 'debug': ('debug.debug',
63 'debug.gethook',
64 'debug.getinfo',
65 'debug.getlocal',
66 'debug.getmetatable',
67 'debug.getregistry',
68 'debug.getupvalue',
69 'debug.getuservalue',
70 'debug.sethook',
71 'debug.setlocal',
72 'debug.setmetatable',
73 'debug.setupvalue',
74 'debug.setuservalue',
75 'debug.traceback',
76 'debug.upvalueid',
77 'debug.upvaluejoin'),
78 'io': ('io.close',
79 'io.flush',
80 'io.input',
81 'io.lines',
82 'io.open',
83 'io.output',
84 'io.popen',
85 'io.read',
86 'io.stderr',
87 'io.stdin',
88 'io.stdout',
89 'io.tmpfile',
90 'io.type',
91 'io.write'),
92 'math': ('math.abs',
93 'math.acos',
94 'math.asin',
95 'math.atan',
96 'math.atan2',
97 'math.ceil',
98 'math.cos',
99 'math.cosh',
100 'math.deg',
101 'math.exp',
102 'math.floor',
103 'math.fmod',
104 'math.frexp',
105 'math.huge',
106 'math.ldexp',
107 'math.log',
108 'math.max',
109 'math.maxinteger',
110 'math.min',
111 'math.mininteger',
112 'math.modf',
113 'math.pi',
114 'math.pow',
115 'math.rad',
116 'math.random',
117 'math.randomseed',
118 'math.sin',
119 'math.sinh',
120 'math.sqrt',
121 'math.tan',
122 'math.tanh',
123 'math.tointeger',
124 'math.type',
125 'math.ult'),
126 'modules': ('package.config',
127 'package.cpath',
128 'package.loaded',
129 'package.loadlib',
130 'package.path',
131 'package.preload',
132 'package.searchers',
133 'package.searchpath',
134 'require'),
135 'os': ('os.clock',
136 'os.date',
137 'os.difftime',
138 'os.execute',
139 'os.exit',
140 'os.getenv',
141 'os.remove',
142 'os.rename',
143 'os.setlocale',
144 'os.time',
145 'os.tmpname'),
146 'string': ('string.byte',
147 'string.char',
148 'string.dump',
149 'string.find',
150 'string.format',
151 'string.gmatch',
152 'string.gsub',
153 'string.len',
154 'string.lower',
155 'string.match',
156 'string.pack',
157 'string.packsize',
158 'string.rep',
159 'string.reverse',
160 'string.sub',
161 'string.unpack',
162 'string.upper'),
163 'table': ('table.concat',
164 'table.insert',
165 'table.move',
166 'table.pack',
167 'table.remove',
168 'table.sort',
169 'table.unpack'),
170 'utf8': ('utf8.char',
171 'utf8.charpattern',
172 'utf8.codepoint',
173 'utf8.codes',
174 'utf8.len',
175 'utf8.offset')}
176
177if __name__ == '__main__': # pragma: no cover
178 import re
179 from urllib.request import urlopen
180 import pprint
181
182 # you can't generally find out what module a function belongs to if you
183 # have only its name. Because of this, here are some callback functions
184 # that recognize if a gioven function belongs to a specific module
185 def module_callbacks():
186 def is_in_coroutine_module(name):
187 return name.startswith('coroutine.')
188
189 def is_in_modules_module(name):
190 if name in ['require', 'module'] or name.startswith('package'):
191 return True
192 else:
193 return False
194
195 def is_in_string_module(name):
196 return name.startswith('string.')
197
198 def is_in_table_module(name):
199 return name.startswith('table.')
200
201 def is_in_math_module(name):
202 return name.startswith('math')
203
204 def is_in_io_module(name):
205 return name.startswith('io.')
206
207 def is_in_os_module(name):
208 return name.startswith('os.')
209
210 def is_in_debug_module(name):
211 return name.startswith('debug.')
212
213 return {'coroutine': is_in_coroutine_module,
214 'modules': is_in_modules_module,
215 'string': is_in_string_module,
216 'table': is_in_table_module,
217 'math': is_in_math_module,
218 'io': is_in_io_module,
219 'os': is_in_os_module,
220 'debug': is_in_debug_module}
221
222
223
224 def get_newest_version():
225 f = urlopen('http://www.lua.org/manual/')
226 r = re.compile(r'^<A HREF="(\d\.\d)/">(Lua )?\1</A>')
227 for line in f:
228 m = r.match(line.decode('iso-8859-1'))
229 if m is not None:
230 return m.groups()[0]
231
232 def get_lua_functions(version):
233 f = urlopen(f'http://www.lua.org/manual/{version}/')
234 r = re.compile(r'^<A HREF="manual.html#pdf-(?!lua|LUA)([^:]+)">\1</A>')
235 functions = []
236 for line in f:
237 m = r.match(line.decode('iso-8859-1'))
238 if m is not None:
239 functions.append(m.groups()[0])
240 return functions
241
242 def get_function_module(name):
243 for mod, cb in module_callbacks().items():
244 if cb(name):
245 return mod
246 if '.' in name:
247 return name.split('.')[0]
248 else:
249 return 'basic'
250
251 def regenerate(filename, modules):
252 with open(filename, encoding='utf-8') as fp:
253 content = fp.read()
254
255 header = content[:content.find('MODULES = {')]
256 footer = content[content.find("if __name__ == '__main__':"):]
257
258
259 with open(filename, 'w', encoding='utf-8') as fp:
260 fp.write(header)
261 fp.write(f'MODULES = {pprint.pformat(modules)}\n\n')
262 fp.write(footer)
263
264 def run():
265 version = get_newest_version()
266 functions = set()
267 for v in ('5.2', version):
268 print(f'> Downloading function index for Lua {v}')
269 f = get_lua_functions(v)
270 print('> %d functions found, %d new:' %
271 (len(f), len(set(f) - functions)))
272 functions |= set(f)
273
274 functions = sorted(functions)
275
276 modules = {}
277 for full_function_name in functions:
278 print(f'>> {full_function_name}')
279 m = get_function_module(full_function_name)
280 modules.setdefault(m, []).append(full_function_name)
281 modules = {k: tuple(v) for k, v in modules.items()}
282
283 regenerate(__file__, modules)
284
285 run()