61959f2705ad1e51416deeaffa423c70195b3cda
[pwl6.git] / tools / generate-nw
1 #!/usr/bin/env python
2
3 # Generate a node-webkit package.json file for a website.
4 #
5 # https://github.com/rogerwang/node-webkit/wiki/Manifest-format
6
7 import os
8 import re
9 import shutil
10 import time
11 import json
12
13 def is_html(filename):
14 return filename.lower().endswith(".html")
15
16 def attr(name):
17 return "data-" + name + """=["']?((?:.(?!["']?\s+(?:\S+)=|[>"']))+.)["']?"""
18
19 def main(appdir, version=None):
20 if not os.path.isdir(appdir):
21 raise StandardError("input (%r) is not a directory" % appdir)
22 indexes = []
23 icons = []
24 for root, dirnames, filenames in os.walk(appdir):
25 root = os.path.relpath(root, appdir)
26 for filename in filenames:
27 if filename.lower() == "index.html":
28 indexes.append(os.path.join(root, filename))
29 if ("icon" in filename.lower()
30 and filename.lower().endswith((".ico", ".png"))):
31 icons.append(os.path.join(root, filename))
32
33 indexes.sort(key=lambda fn: (fn.count("/"), fn))
34 icons.sort(key=lambda fn: (fn.count("/"), fn))
35 name = os.path.basename(appdir).split(".")[0]
36 package = {
37 "main": indexes[0],
38 "name": name,
39 "version": version or "0.0.0",
40 "window": {
41 "show": False,
42 "toolbar": False,
43 "title": name,
44 "min_width": 300,
45 "min_height": 200,
46 }
47 }
48
49 if icons:
50 package["window"]["icon"] = icons[0]
51
52 with open(os.path.join(appdir, indexes[0]), "r") as fobj:
53 header = fobj.read(4096)
54 try:
55 title = re.search("<title>([^<]+)<", header).groups()[0]
56 except AttributeError:
57 print >>sys.stderr, "No <title> found in %r." % fobj.name
58 else:
59 package["window"]["title"] = title
60 try:
61 version = re.search(attr("version"), header).groups()[0]
62 except AttributeError:
63 print >>sys.stderr, "No version found in %r." % fobj.name
64 else:
65 package["version"] = version
66 try:
67 appid = re.search(attr("appid"), header).groups()[0]
68 except AttributeError:
69 print >>sys.stderr, "No appid found in %r." % fobj.name
70 else:
71 package["name"] = appid
72
73 if "+" not in package["version"]:
74 package["version"] += "+"
75 package["version"] += time.strftime("%Y%m%d%H%M%S")
76
77 with open(os.path.join(appdir, "package.json"), "w") as fobj:
78 json.dump(package, fobj)
79
80 if __name__ == "__main__":
81 import sys
82 main(*sys.argv[1:])