summaryrefslogtreecommitdiffstats
path: root/Mac/Tools/CGI/BuildCGIApplet.py
blob: c94eca954eb9f0baed9e7a6a2376565b2fa7246a (plain)
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
"""BuildCGIApplet.py -- Create a CGI applet from a Python script.

Specilized version of BuildApplet, enabling Python CGI scripts to be
used under Mac web servers like WebStar. The __main__ program is
PythonCGISlave.py, which provides a compatibility layer, emulating
Unix-style CGI scripts. See CGI_README.txt for details.
"""

import sys
import os
import macfs
import MacOS
import Res
import EasyDialogs
import buildtools
import py_resource


def main():
	try:
		buildcgiapplet()
	except buildtools.BuildError, detail:
		EasyDialogs.Message(detail)


def buildcgiapplet():
	buildtools.DEBUG=1
	
	# Find the template
	# (there's no point in proceeding if we can't find it)
	
	template = buildtools.findtemplate()
	wrapper = "PythonCGISlave.py"
	if not os.path.exists("PythonCGISlave.py"):
		wrapper = os.path.join(sys.exec_prefix, ":Mac:Tools:CGI", wrapper)
	
	# Ask for source text if not specified in sys.argv[1:]
	if not sys.argv[1:]:
		srcfss, ok = macfs.PromptGetFile('Select a CGI script:', 'TEXT', 'APPL')
		if not ok:
			return
		filename = srcfss.as_pathname()
		dstfilename = mkcgifilename(filename)
		dstfss, ok = macfs.StandardPutFile('Save application as:', 
				os.path.basename(dstfilename))
		if not ok:
			return
		dstfilename = dstfss.as_pathname()
		buildone(template, wrapper, filename, dstfilename)
	else:
		# Loop over all files to be processed
		for filename in sys.argv[1:]:
			dstfilename = mkcgifilename(filename)
			buildone(template, wrapper, filename, dstfilename)


def mkcgifilename(filename):
	if filename[-3:] == '.py':
		filename = filename[:-3]
	filename = filename + ".cgi"
	return filename


def buildone(template, wrapper, src, dst):
	buildtools.process(template, wrapper, dst, 1)
	# write source as a PYC resource into dst
	ref = Res.FSpOpenResFile(dst, 1)
	try:
		Res.UseResFile(ref)
		py_resource.frompyfile(src, "CGI_MAIN", preload=1)
	finally:
		Res.CloseResFile(ref)


if __name__ == '__main__':
	main()