Migrate from node-webkit to NW.js.
[pwl6.git] / tools / generate-nw
1 #!/usr/bin/env python
2
3 # Generate an NW.js package.json file for a website.
4 #
5 # https://github.com/nwjs/nw.js/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 "chromium-args": "--enable-webgl --ignore-gpu-blacklist",
41 "window": {
42 "show": False,
43 "toolbar": False,
44 "title": name,
45 "min_width": 300,
46 "min_height": 200,
47 }
48 }
49
50 if icons:
51 package["window"]["icon"] = icons[0]
52
53 with open(os.path.join(appdir, indexes[0]), "r") as fobj:
54 header = fobj.read(4096)
55 try:
56 title = re.search("<title>([^<]+)<", header).groups()[0]
57 except AttributeError:
58 print >>sys.stderr, "No <title> found in %r." % fobj.name
59 else:
60 package["window"]["title"] = title
61 try:
62 version = re.search(attr("version"), header).groups()[0]
63 except AttributeError:
64 print >>sys.stderr, "No version found in %r." % fobj.name
65 else:
66 package["version"] = version
67 try:
68 appid = re.search(attr("appid"), header).groups()[0]
69 except AttributeError:
70 print >>sys.stderr, "No appid found in %r." % fobj.name
71 else:
72 package["name"] = appid
73
74 if "+" not in package["version"]:
75 package["version"] += "+"
76 package["version"] += time.strftime("%Y%m%d%H%M%S")
77
78 with open(os.path.join(appdir, "package.json"), "w") as fobj:
79 json.dump(package, fobj)
80
81 if __name__ == "__main__":
82 import sys
83 main(*sys.argv[1:])