""" converts a static file to a web2py view. needs work """ import os import sys import glob import shutil import re regex_link = re.compile("""(href|src)\s*=\s*("|')(.+?)("|')""") def getname(filename): return re.compile('\W').sub('',filename.split('/')[-1].rsplit('.',1)[0]) def make_controller(html_files): controller = '' for filename in html_files: name = getname(filename) controller += 'def %s():\n return locals()\n\n' % name return controller def fix_links(html,prefix): def fix(match): href,link = match.group(1), match.group(3) if not '://' in link: if link.lower().endswith('.html') and not '/' in link: link = "{{=URL('%s','%s')}}" % (prefix, getname(link)) elif link.startswith('./'): link = "{{=URL('static','%s/%s')}}" % (prefix,link[2:]) elif link.startswith('/'): link = "{{=URL('static','%s/%s')}}" % (prefix,link[1:]) else: link = "{{=URL('static','%s/%s')}}" % (prefix,link) return '%s="%s"' % (href,link) return regex_link.sub(fix,html) def make_views(html_files,prefix): views = {} layout_name = os.path.join(prefix,'layout.html') extend = "{{extend '%s'}}" % layout_name for filename in html_files: html = open(filename).read() name = getname(filename) views[os.path.join(prefix,name+'.html')] = fix_links(html,prefix) start = stop = None k = 0 while start is None or stop is None: try: if start is None: if len(set(v[k] for v in views.values()))>1: start=k if stop is None: if len(set(v[len(v)-k] for v in views.values()))>1: stop=k except: if start is None: start = k if stop is None: stop = k k+=1 header = footer = '' for name in views: html = views[name] n = len(html) header, views[name], footer = \ html[:start], extend+html[start:n-stop], html[n-stop:] layout_html = header+'{{include}}'+footer views[layout_name] = layout_html return views def recursive_overwrite(src, dest, ignore=None): if os.path.isdir(src): if not os.path.isdir(dest): os.makedirs(dest) files = os.listdir(src) if ignore is not None: ignored = ignore(src, files) else: ignored = set() for f in files: if f not in ignored: recursive_overwrite(os.path.join(src, f), os.path.join(dest, f), ignore) else: shutil.copyfile(src, dest) def convert(source, destination,prefix='imported'): html_files = glob.glob(os.path.join(source,'*.html')) static_folder = os.path.join(destination,'static',prefix) recursive_overwrite(source,static_folder) controller = make_controller(html_files) views = make_views(html_files,prefix) controller_filename = os.path.join(destination,'controllers',prefix+'.py') open(controller_filename,'w').write(controller) for name in views: fullname = os.path.join(destination,'views',name) if not os.path.exists(os.path.split(fullname)[0]): os.makedirs(os.path.split(fullname)[0]) open(fullname,'w').write(views[name]) convert(sys.argv[1],sys.argv[2])