SP/web2py/scripts/import_static.py

104 lines
3.4 KiB
Python
Raw Permalink Normal View History

2018-10-25 15:33:07 +00:00
"""
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])