]>
Commit | Line | Data |
---|---|---|
1 | import os, sys, pages, subprocess, re, optionsgen, config | |
2 | ||
3 | class HGException(Exception): | |
4 | pass | |
5 | ||
6 | def jslist(name, debug): | |
7 | ui = pages.UIs[name] | |
8 | if debug: | |
9 | x = [pages.JS_BASE, ui.get("extra", []), pages.DEBUG, ["debug/ui/frontends/%s" % y for y in ui["uifiles"]]] | |
10 | hgid = "" | |
11 | else: | |
12 | #x = [pages.JS_BASE, ui.get("buildextra", ui.get("extra", [])), pages.BUILD_BASE, name] | |
13 | x = [name] | |
14 | hgid = "-" + gethgid() | |
15 | ||
16 | return list("js/%s%s.js" % (y, hgid) for y in pages.flatten(x)) | |
17 | ||
18 | def csslist(name, debug, gen=False): | |
19 | ui = pages.UIs[name] | |
20 | nocss = ui.get("nocss") | |
21 | if not debug: | |
22 | return ["css/%s-%s.css" % (name, gethgid())] | |
23 | css = pages.flatten([ui.get("extracss", []), "colours", "dialogs"]) | |
24 | if not nocss: | |
25 | css = list(css) + [name] | |
26 | return list("css/%s%s.css" % ("debug/" if gen else "", x) for x in css) | |
27 | ||
28 | def _gethgid(): | |
29 | try: | |
30 | p = subprocess.Popen(["hg", "id"], stdout=subprocess.PIPE) | |
31 | except Exception, e: | |
32 | if hasattr(e, "errno") and e.errno == 2: | |
33 | raise HGException, "unable to execute" | |
34 | raise HGException, "unknown exception running hg: %s" % repr(e) | |
35 | ||
36 | data = p.communicate()[0] | |
37 | if p.wait() != 0: | |
38 | raise HGException, "unable to get id" | |
39 | return re.match("^([0-9a-f]+).*", data).group(1) | |
40 | ||
41 | HGID = None | |
42 | def gethgid(): | |
43 | global HGID | |
44 | if HGID is None: | |
45 | try: | |
46 | HGID = _gethgid() | |
47 | except HGException, e: | |
48 | print >>sys.stderr, "warning: hg: %s (using a random id)." % e | |
49 | HGID = os.urandom(10).encode("hex") | |
50 | return HGID | |
51 | ||
52 | def producehtml(name, debug): | |
53 | ui = pages.UIs[name] | |
54 | js = jslist(name, debug) | |
55 | css = csslist(name, debug, gen=True) | |
56 | csshtml = "\n".join(" <link rel=\"stylesheet\" href=\"%s%s\" type=\"text/css\"/>" % (config.STATIC_BASE_URL, x) for x in css) | |
57 | jshtml = "\n".join(" <script type=\"text/javascript\" src=\"%s%s\"></script>" % (config.STATIC_BASE_URL, x) for x in js) | |
58 | ||
59 | div = ui.get("div", "") | |
60 | customjs = ui.get("customjs", "") | |
61 | ||
62 | return """%s | |
63 | <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> | |
64 | <head> | |
65 | <base /> | |
66 | <title>%s (qwebirc)</title> | |
67 | <meta http-equiv="Content-Type" content="text/html;charset=utf-8"/> | |
68 | <link rel="icon" type="image/png" href="%simages/favicon.png"/> | |
69 | %s%s | |
70 | %s | |
71 | <script type="text/javascript"> | |
72 | var ui = new qwebirc.ui.Interface("ircui", qwebirc.ui.%s, %s); | |
73 | </script> | |
74 | </head> | |
75 | <body> | |
76 | <div id="ircui"> | |
77 | <noscript> | |
78 | <div id="noscript">Javascript is required to use IRC.</div> | |
79 | </noscript>%s | |
80 | </div> | |
81 | </body> | |
82 | </html> | |
83 | """ % (ui["doctype"], config.APP_TITLE, config.STATIC_BASE_URL, csshtml, customjs, jshtml, ui["class"], optionsgen.get_options(), div) | |
84 | ||
85 | def main(outputdir=".", produce_debug=True): | |
86 | p = os.path.join(outputdir, "static") | |
87 | for x in pages.UIs: | |
88 | if produce_debug: | |
89 | f = open(os.path.join(p, "%sdebug.html" % x), "wb") | |
90 | try: | |
91 | f.write(producehtml(x, debug=True)) | |
92 | finally: | |
93 | f.close() | |
94 | ||
95 | f = open(os.path.join(p, "%s.html" % x), "wb") | |
96 | try: | |
97 | f.write(producehtml(x, debug=False)) | |
98 | finally: | |
99 | f.close() | |
100 | ||
101 | if __name__ == "__main__": | |
102 | main() | |
103 |