forked from I2P_Developers/i2p.www
Compare commits
23 Commits
master
...
simplify-p
Author | SHA1 | Date | |
---|---|---|---|
f1d0e3e067 | |||
ae7a7b00a4 | |||
bdb34cc646 | |||
e98ef3f151 | |||
050001228c | |||
453cc0cc14 | |||
bf5bb863d2 | |||
be26e555ec | |||
34490e41e8 | |||
0ba93d331f | |||
1f30255706 | |||
052ece4336 | |||
178f6f8c87 | |||
e2a3aa76b5 | |||
af2dfadfe6 | |||
1b01ee50d2 | |||
99cf7985b7 | |||
95e395daaa | |||
7401f930ba | |||
d7787511bd | |||
fadcb56439 | |||
34654b6954 | |||
34062eaf2d |
@ -210,9 +210,7 @@ def set_lang(endpoint, values):
|
||||
# Detect and store chosen theme
|
||||
@app.before_request
|
||||
def detect_theme():
|
||||
theme = 'duck'
|
||||
if 'style' in request.cookies:
|
||||
theme = request.cookies['style']
|
||||
theme = request.cookies.get('style', 'duck')
|
||||
if 'theme' in request.args.keys():
|
||||
theme = request.args['theme']
|
||||
# TEMPORARY: enable external themes
|
||||
|
@ -30,13 +30,13 @@ def get_blog_feed_items(num=0, category=None):
|
||||
for post in posts:
|
||||
meta = post[1]
|
||||
parts = post[2]
|
||||
a = {}
|
||||
a['title'] = meta['title']
|
||||
a['content'] = meta['excerpt'] if len(meta['excerpt']) > 0 else parts['fragment']
|
||||
a['author'] = meta['author']
|
||||
a['url'] = url_for('blog_post', lang=g.lang, slug=post[0])
|
||||
a['updated'] = datetime.datetime.strptime(meta['date'], '%Y-%m-%d')
|
||||
items.append(a)
|
||||
items.append({
|
||||
'title': meta['title'],
|
||||
'content': meta['excerpt'] if len(meta['excerpt']) > 0 else parts['fragment'],
|
||||
'author': meta['author'],
|
||||
'url': url_for('blog_post', lang=g.lang, slug=post[0]),
|
||||
'updated': datetime.datetime.strptime(meta['date'], '%Y-%m-%d')
|
||||
})
|
||||
return items
|
||||
|
||||
def get_blog_posts(num=0, return_parts=False, category=None):
|
||||
@ -80,36 +80,35 @@ def get_blog_slugs(num=0):
|
||||
return slugs[:num]
|
||||
return slugs
|
||||
|
||||
def _slug_base(slugbase, func):
|
||||
parts = slugbase.split('/')
|
||||
slugParts = []
|
||||
for p in parts:
|
||||
slugParts.append(func(p))
|
||||
return "/".join(slugParts)
|
||||
|
||||
# reads a date and if it finds a one-digit representation of a day or month,
|
||||
# lengthens it to two
|
||||
def slug_base_datevalidate(slugbase):
|
||||
parts = slugbase.split('/')
|
||||
slugParts = []
|
||||
for p in parts:
|
||||
slugParts.append(datevalidate(p))
|
||||
return "/".join(slugParts)
|
||||
return _slug_base(slugbase, datevalidate)
|
||||
|
||||
# turns a one-digit date unit into a two-digit date unit
|
||||
def datevalidate(slugfrag):
|
||||
if len(str(slugfrag)) == 1:
|
||||
return "0"+str(slugfrag)
|
||||
else:
|
||||
return str(slugfrag)
|
||||
slug = str(slugfrag)
|
||||
if len(slug) == 1:
|
||||
slug = "0" + slug
|
||||
return slug
|
||||
|
||||
# turns a two-digit date unit into a one-digit date unit
|
||||
def dedatevalidate(slugfrag):
|
||||
if len(str(slugfrag)) == 2:
|
||||
return str(slugfrag).lstrip("0")
|
||||
else:
|
||||
return str(slugfrag)
|
||||
slug = str(slugfrag)
|
||||
if len(slug) == 2:
|
||||
return slug.lstrip("0")
|
||||
return slug
|
||||
|
||||
# reverses slug_base_datevalidate
|
||||
def slug_base_dedatevalidate(slugbase):
|
||||
parts = slugbase.split('/')
|
||||
slugParts = []
|
||||
for p in parts:
|
||||
slugParts.append(dedatevalidate(p))
|
||||
return "/".join(slugParts)
|
||||
return _slug_base(slugbase, dedatevalidate)
|
||||
|
||||
def get_date_from_slug(slug):
|
||||
slug = slug_base_datevalidate(slug)
|
||||
|
@ -1,6 +1,8 @@
|
||||
from flask import redirect, render_template, request
|
||||
from i2p2www import CURRENT_I2P_VERSION, MIRRORS_FILE
|
||||
|
||||
temp = lambda a: 'site/browser/' + a + '.html'
|
||||
|
||||
def browser_frontpage():
|
||||
useragent = request.headers.get('User-Agent')
|
||||
osname = "unknown"
|
||||
@ -10,41 +12,39 @@ def browser_frontpage():
|
||||
osname = "windows"
|
||||
elif 'Linux' in useragent:
|
||||
osname = "linux"
|
||||
return render_template('site/browser/_front.html', user_agent=useragent, detected_os=osname)
|
||||
return render_template(temp('_front'), user_agent=useragent, detected_os=osname)
|
||||
|
||||
deftemp = lambda a: render_template(temp(a))
|
||||
def browser_intro():
|
||||
return render_template('site/browser/intro.html')
|
||||
return deftemp('intro')
|
||||
|
||||
def browser_download():
|
||||
return render_template('site/browser/download.html')
|
||||
return deftemp('download')
|
||||
|
||||
def browser_releasenotes():
|
||||
return render_template('site/browser/releasenotes.html')
|
||||
return deftemp('releasenotes')
|
||||
|
||||
def browser_roadmap():
|
||||
return render_template('site/browser/roadmap.html')
|
||||
return deftemp('roadmap')
|
||||
|
||||
#def browser_known_issues():
|
||||
# return render_template('site/browser/known_issues.html')
|
||||
# return deftemp('known_issues')
|
||||
|
||||
#def browser_troubleshooting():
|
||||
# return render_template('site/browser/troubleshooting.html')
|
||||
# return deftemp('troubleshooting')
|
||||
|
||||
#def browser_updating():
|
||||
# return render_template('site/browser/updating.html')
|
||||
# return deftemp('updating')
|
||||
|
||||
def browser_develop():
|
||||
return render_template('site/browser/develop.html')
|
||||
return deftemp('develop')
|
||||
|
||||
def browser_donate():
|
||||
return render_template('site/browser/donate.html')
|
||||
return deftemp('donate')
|
||||
|
||||
|
||||
def browser_faq():
|
||||
if request.headers.get('X-I2P-Desthash') and not request.headers.get('X-Forwarded-Server'):
|
||||
show_i2p_links = True
|
||||
else:
|
||||
show_i2p_links = False
|
||||
return render_template('site/browser/faq.html', is_i2p_internal=show_i2p_links)
|
||||
show_i2p_links = request.headers.get('X-I2P-Desthash') and not request.headers.get('X-Forwarded-Server')
|
||||
return render_template(temp('faq'), is_i2p_internal=show_i2p_links)
|
||||
|
||||
|
||||
|
@ -49,10 +49,8 @@ DEFAULT_I2P_MIRROR = {
|
||||
|
||||
# Read in mirrors from file
|
||||
def read_mirrors():
|
||||
file = open(MIRRORS_FILE, 'r')
|
||||
dat = file.read()
|
||||
file.close()
|
||||
lines=dat.split('\n')
|
||||
with open(MIRRORS_FILE, 'r') as file:
|
||||
lines = file.read().split('\n')
|
||||
ret={}
|
||||
for line in lines:
|
||||
try:
|
||||
@ -73,84 +71,71 @@ def read_mirrors():
|
||||
ret[net][protocol][domain]=obj
|
||||
return ret
|
||||
|
||||
# List of downloads
|
||||
def downloads_list():
|
||||
def get_mirror(request):
|
||||
# TODO: read mirror list or list of available files
|
||||
if request.headers.get('X-I2P-Desthash') and not request.headers.get('X-Forwarded-Server'):
|
||||
def_mirror = DEFAULT_I2P_MIRROR
|
||||
return DEFAULT_I2P_MIRROR
|
||||
else:
|
||||
def_mirror = DEFAULT_MIRROR
|
||||
return render_template('downloads/list.html', def_mirror=def_mirror)
|
||||
return DEFAULT_MIRROR
|
||||
|
||||
deflist = lambda a: render_template('downloads/' + a + '.html')
|
||||
deflist2 = lambda a: render_template('downloads/' + a + '.html', def_mirror=get_mirror(request))
|
||||
|
||||
# List of downloads
|
||||
def downloads_list():
|
||||
return deflist2('list')
|
||||
|
||||
# Debian-specific page
|
||||
def downloads_debian():
|
||||
return render_template('downloads/debian.html')
|
||||
return deflist('debian')
|
||||
|
||||
# Windows-specific page
|
||||
def downloads_windows():
|
||||
return render_template('downloads/windows.html')
|
||||
return deflist('windows')
|
||||
|
||||
# MacOS-specific page
|
||||
def downloads_macos():
|
||||
return render_template('downloads/macos.html')
|
||||
return deflist('macos')
|
||||
|
||||
# AIO-Windows-specific page
|
||||
def downloads_easyinstall():
|
||||
# TODO: read mirror list or list of available files
|
||||
if request.headers.get('X-I2P-Desthash') and not request.headers.get('X-Forwarded-Server'):
|
||||
def_mirror = DEFAULT_I2P_MIRROR
|
||||
else:
|
||||
def_mirror = DEFAULT_MIRROR
|
||||
return render_template('downloads/easyinstall.html', def_mirror=def_mirror)
|
||||
return deflist2('easyinstall')
|
||||
|
||||
# Docker-specific page
|
||||
def downloads_docker():
|
||||
return render_template('downloads/docker.html')
|
||||
return deflist('docker')
|
||||
|
||||
# Firefox-specific page
|
||||
def downloads_firefox():
|
||||
# TODO: read mirror list or list of available files
|
||||
if request.headers.get('X-I2P-Desthash') and not request.headers.get('X-Forwarded-Server'):
|
||||
def_mirror = DEFAULT_I2P_MIRROR
|
||||
else:
|
||||
def_mirror = DEFAULT_MIRROR
|
||||
return render_template('downloads/firefox.html', def_mirror=def_mirror)
|
||||
return deflist2('firefox')
|
||||
|
||||
# The Lab
|
||||
def downloads_lab():
|
||||
# TODO: read mirror list or list of available files
|
||||
if request.headers.get('X-I2P-Desthash') and not request.headers.get('X-Forwarded-Server'):
|
||||
def_mirror = DEFAULT_I2P_MIRROR
|
||||
else:
|
||||
def_mirror = DEFAULT_MIRROR
|
||||
return render_template('downloads/lab.html', def_mirror=def_mirror)
|
||||
return deflist2('lab')
|
||||
|
||||
# Mac DMG page
|
||||
def downloads_mac():
|
||||
# TODO: read mirror list or list of available files
|
||||
if request.headers.get('X-I2P-Desthash') and not request.headers.get('X-Forwarded-Server'):
|
||||
def_mirror = DEFAULT_I2P_MIRROR
|
||||
else:
|
||||
def_mirror = DEFAULT_MIRROR
|
||||
return render_template('downloads/mac.html', def_mirror=def_mirror)
|
||||
return deflist2('mac')
|
||||
|
||||
def downloads_config():
|
||||
return render_template('downloads/config.html')
|
||||
return deflist('config')
|
||||
|
||||
# Specific file downloader
|
||||
def downloads_select(version, file):
|
||||
mirrors=read_mirrors()
|
||||
obj=[]
|
||||
for net in mirrors.keys():
|
||||
a={}
|
||||
a['key']=net
|
||||
a['name']=net
|
||||
a['protocols']=[]
|
||||
a = {
|
||||
'key': net,
|
||||
'name': net,
|
||||
'protocols': []
|
||||
}
|
||||
for protocol in mirrors[net].keys():
|
||||
b={}
|
||||
b['key']=protocol
|
||||
b['name']=protocol
|
||||
b['domains']=mirrors[net][protocol]
|
||||
b = {
|
||||
'key': protocol,
|
||||
'name': protocol,
|
||||
'domains': mirrors[net][protocol]
|
||||
}
|
||||
a['protocols'].append(b)
|
||||
obj.append(a)
|
||||
return render_template('downloads/select.html', mirrors=obj, version=version, file=file)
|
||||
|
@ -113,9 +113,7 @@ class HighlightExtension(Extension):
|
||||
lang = g.lang
|
||||
parameters['tagurlformat'] = '/spec/%(path)s%(fname)s'
|
||||
|
||||
if formatter == 'textspec':
|
||||
formatter = TextSpecFormatter(**parameters)
|
||||
else:
|
||||
formatter = I2PHtmlFormatter(**parameters)
|
||||
func = TextSpecFormatter if formatter == 'textspec' else I2PHtmlFormatter
|
||||
formatter = func(**parameters)
|
||||
code = highlight(Markup(body).unescape(), lexer, formatter)
|
||||
return code
|
||||
|
@ -376,17 +376,19 @@ class I2PHtmlFormatter(Formatter):
|
||||
|
||||
def __init__(self, **options):
|
||||
Formatter.__init__(self, **options)
|
||||
dec = lambda t, d='': self._decodeifneeded(options.get(t, d))
|
||||
getbool = lambda key, d=False: get_bool_opt(options, key, d)
|
||||
self.title = self._decodeifneeded(self.title)
|
||||
self.nowrap = get_bool_opt(options, 'nowrap', False)
|
||||
self.noclasses = get_bool_opt(options, 'noclasses', False)
|
||||
self.nowrap = getbool('nowrap')
|
||||
self.noclasses = getbool('noclasses')
|
||||
self.classprefix = options.get('classprefix', '')
|
||||
self.cssclass = self._decodeifneeded(options.get('cssclass', 'highlight'))
|
||||
self.cssstyles = self._decodeifneeded(options.get('cssstyles', ''))
|
||||
self.prestyles = self._decodeifneeded(options.get('prestyles', ''))
|
||||
self.cssfile = self._decodeifneeded(options.get('cssfile', ''))
|
||||
self.noclobber_cssfile = get_bool_opt(options, 'noclobber_cssfile', False)
|
||||
self.tagsfile = self._decodeifneeded(options.get('tagsfile', ''))
|
||||
self.tagurlformat = self._decodeifneeded(options.get('tagurlformat', ''))
|
||||
self.cssclass = dec('cssclass', 'highlight')
|
||||
self.cssstyles = dec('cssstyles')
|
||||
self.prestyles = dec('prestyles')
|
||||
self.cssfile = dec('cssfile')
|
||||
self.noclobber_cssfile = getbool('noclobber_cssfile')
|
||||
self.tagsfile = dec('tagsfile')
|
||||
self.tagurlformat = dec('tagurlformat')
|
||||
|
||||
if self.tagsfile:
|
||||
if not ctags:
|
||||
@ -405,7 +407,7 @@ class I2PHtmlFormatter(Formatter):
|
||||
self.linenostart = abs(get_int_opt(options, 'linenostart', 1))
|
||||
self.linenostep = abs(get_int_opt(options, 'linenostep', 1))
|
||||
self.linenospecial = abs(get_int_opt(options, 'linenospecial', 0))
|
||||
self.nobackground = get_bool_opt(options, 'nobackground', False)
|
||||
self.nobackground = getbool('nobackground')
|
||||
self.lineseparator = options.get('lineseparator', '\n')
|
||||
self.lineanchors = options.get('lineanchors', '')
|
||||
self.linespans = options.get('linespans', '')
|
||||
@ -841,8 +843,9 @@ class TextSpecFormatter(Formatter):
|
||||
|
||||
def __init__(self, **options):
|
||||
Formatter.__init__(self, **options)
|
||||
self.tagsfile = self._decodeifneeded(options.get('tagsfile', ''))
|
||||
self.tagurlformat = self._decodeifneeded(options.get('tagurlformat', ''))
|
||||
dec = lambda t, d='': self._decodeifneeded(options.get(t, d))
|
||||
self.tagsfile = dec('tagsfile', '')
|
||||
self.tagurlformat = dec('tagurlformat', '')
|
||||
|
||||
if self.tagsfile:
|
||||
if not ctags:
|
||||
@ -878,17 +881,14 @@ class TextSpecFormatter(Formatter):
|
||||
'fext': extension}
|
||||
refs[value] = '\n[%s]: %s#%s-%s' % (value, url, kinds[kind], value.lower())
|
||||
value = '[%s]' % value
|
||||
|
||||
if enc:
|
||||
outfile.write(value.encode(enc))
|
||||
else:
|
||||
outfile.write(value)
|
||||
value = value.encode(enc)
|
||||
outfile.write(value)
|
||||
|
||||
for ref in refs.values():
|
||||
if enc:
|
||||
outfile.write(ref.encode(enc))
|
||||
else:
|
||||
outfile.write(ref)
|
||||
ref = ref.encode(enc)
|
||||
outfile.write(ref)
|
||||
|
||||
def _lookup_ctag(self, token):
|
||||
entry = ctags.TagEntry()
|
||||
|
@ -206,16 +206,20 @@ def legacy_show(f):
|
||||
lang = g.lang
|
||||
if lang == 'zh':
|
||||
lang = 'zh_CN'
|
||||
if f in SHORTLINKS:
|
||||
return redirect(url_for(SHORTLINKS[f]['function'], lang=lang, **SHORTLINKS[f]['params']), 301)
|
||||
elif f in LEGACY_FUNCTIONS_MAP:
|
||||
return redirect(url_for(LEGACY_FUNCTIONS_MAP[f]['function'], lang=lang, **LEGACY_FUNCTIONS_MAP[f]['params']), 301)
|
||||
elif f in LEGACY_PAGES_MAP:
|
||||
return redirect(url_for('site_show', lang=lang, page=LEGACY_PAGES_MAP[f]), 301)
|
||||
elif f in LEGACY_BLOG_POSTS_MAP:
|
||||
mapit = True
|
||||
if f in LEGACY_BLOG_POSTS_MAP:
|
||||
return legacy_blog(lang, LEGACY_BLOG_POSTS_MAP[f]['date'], LEGACY_BLOG_POSTS_MAP[f]['title'])
|
||||
elif f in SHORTLINKS:
|
||||
a = SHORTLINKS[f]
|
||||
elif f in LEGACY_FUNCTIONS_MAP:
|
||||
a = LEGACY_FUNCTIONS_MAP[f]
|
||||
else:
|
||||
return redirect(url_for('site_show', lang=lang, page=f), 301)
|
||||
a = 'site_show'
|
||||
b = LEGACY_PAGES_MAP[f] if f in LEGACY_PAGES_MAP else f
|
||||
mapit = False
|
||||
if mapit:
|
||||
return redirect(url_for(a['function'], lang=lang, **a['params']), 301)
|
||||
return redirect(url_for(a, lang=lang, page=b), 301)
|
||||
|
||||
def legacy_meeting(id):
|
||||
return redirect(url_for('meetings_show', id=id, lang='en'), 301)
|
||||
|
@ -15,12 +15,12 @@ def get_meetings_feed_items(num=0):
|
||||
meetings = get_meetings(num)
|
||||
items = []
|
||||
for meeting in meetings:
|
||||
a = {}
|
||||
a['title'] = meeting['parts']['title']
|
||||
a['content'] = meeting['parts']['fragment']
|
||||
a['url'] = url_for('meetings_show', lang=g.lang, id=meeting['id'])
|
||||
a['updated'] = (meeting['date'] if meeting['date'] else datetime.datetime(0))
|
||||
items.append(a)
|
||||
items.append({
|
||||
'title': meeting['parts']['title'],
|
||||
'content': meeting['parts']['fragment'],
|
||||
'url': url_for('meetings_show', lang=g.lang, id=meeting['id']),
|
||||
'updated': (meeting['date'] if meeting['date'] else datetime.datetime(0))
|
||||
})
|
||||
return items
|
||||
|
||||
def get_meetings(num=0):
|
||||
@ -36,11 +36,11 @@ def get_meetings(num=0):
|
||||
date = datetime.datetime.strptime(parts['title'], 'I2P dev meeting, %B %d, %Y')
|
||||
except ValueError:
|
||||
date = None
|
||||
a = {}
|
||||
a['id'] = id
|
||||
a['date'] = date
|
||||
a['parts'] = parts
|
||||
meetings.append(a)
|
||||
meetings.append({
|
||||
'id': id,
|
||||
'date': date,
|
||||
'parts': parts
|
||||
})
|
||||
return meetings
|
||||
|
||||
def get_meetings_ids(num=0):
|
||||
|
@ -48,6 +48,10 @@ def render_sitemap():
|
||||
# Main site urls
|
||||
# --------------
|
||||
# walk over all directories/files
|
||||
def xappend(path):
|
||||
urls.append({
|
||||
'path': path
|
||||
})
|
||||
for v in os.walk(SITE_DIR):
|
||||
# iterate over all files
|
||||
pathbase = os.path.relpath(v[0], SITE_DIR)
|
||||
@ -62,71 +66,36 @@ def render_sitemap():
|
||||
path = path[1:]
|
||||
if not path.startswith('/'):
|
||||
path = '/%s' % path
|
||||
urls.append({
|
||||
'path': path,
|
||||
})
|
||||
xappend(path)
|
||||
|
||||
# -----------
|
||||
# Papers urls
|
||||
# -----------
|
||||
urls.append({
|
||||
'path': '/papers/',
|
||||
})
|
||||
urls.append({
|
||||
'path': '/papers/bibtex',
|
||||
})
|
||||
xappend('/papers/')
|
||||
xappend('/papers/bibtex')
|
||||
|
||||
# ---------
|
||||
# Blog urls
|
||||
# ---------
|
||||
urls.append({
|
||||
'path': '/blog/',
|
||||
})
|
||||
xappend('/blog/')
|
||||
blog_slugs = get_blog_slugs()
|
||||
for slug in blog_slugs:
|
||||
urls.append({
|
||||
'path': '/blog/post/%s' % slug,
|
||||
})
|
||||
xappend('/blog/post/%s' % slug)
|
||||
|
||||
# -------------
|
||||
# Meetings urls
|
||||
# -------------
|
||||
urls.append({
|
||||
'path': '/meetings/',
|
||||
})
|
||||
xappend('/meetings/')
|
||||
meetings = get_meetings_ids()
|
||||
for id in meetings:
|
||||
urls.append({
|
||||
'path': '/meetings/%d' % id,
|
||||
})
|
||||
xappend('/meetings/%d' % id)
|
||||
|
||||
# --------------
|
||||
# Downloads urls
|
||||
# --------------
|
||||
urls.append({
|
||||
'path': '/download',
|
||||
})
|
||||
urls.append({
|
||||
'path': '/download/debian',
|
||||
})
|
||||
urls.append({
|
||||
'path': '/download/firefox',
|
||||
})
|
||||
urls.append({
|
||||
'path': '/download/lab',
|
||||
})
|
||||
urls.append({
|
||||
'path': '/download/mac',
|
||||
})
|
||||
urls.append({
|
||||
'path': '/download/easyinstall',
|
||||
})
|
||||
urls.append({
|
||||
'path': '/download/windows',
|
||||
})
|
||||
urls.append({
|
||||
'path': '/download/macos',
|
||||
})
|
||||
xappend('/download')
|
||||
for i in ['debian', 'firefox', 'lab', 'mac', 'easyinstall', 'windows', 'macos']:
|
||||
xappend('/download/%s' % i)
|
||||
# Render and return the sitemap
|
||||
response = make_response(render_template('global/sitemap.xml', url_root=url_root, langs=LANG_FRAGS,
|
||||
curlang=to_url(g.lang), urls=urls))
|
||||
|
@ -117,19 +117,17 @@ def utility_processor():
|
||||
|
||||
def is_rtl_lang(lang=None):
|
||||
if not lang:
|
||||
lang = 'en'
|
||||
if hasattr(g, 'lang') and g.lang:
|
||||
lang = g.lang
|
||||
else:
|
||||
lang = 'en'
|
||||
return lang in RTL_LANGS
|
||||
|
||||
# Get a specific language flag, or the flag for the current language
|
||||
def get_flag(lang=None):
|
||||
if not lang:
|
||||
lang = 'en'
|
||||
if hasattr(g, 'lang') and g.lang:
|
||||
lang = g.lang
|
||||
else:
|
||||
lang = 'en'
|
||||
return url_for('static', filename='images/flags/'+lang+'.png')
|
||||
|
||||
# Provide the canonical link to the current page
|
||||
|
@ -12,17 +12,17 @@ class LangConverter(BaseConverter):
|
||||
super(LangConverter, self).__init__(url_map)
|
||||
self.regex = '(?:[a-z]{2})(-[a-z]{2})?'
|
||||
|
||||
def to_python(self, value):
|
||||
parts = value.split('-')
|
||||
def _to_from(self, spl, add, upper):
|
||||
parts = value.split(spl)
|
||||
if len(parts) == 2:
|
||||
return parts[0] + '_' + parts[1].upper()
|
||||
return parts[0] + spl + parts[1].upper() if upper else parts[1].lower()
|
||||
return value
|
||||
|
||||
def to_python(self, value):
|
||||
return self._to_from('-', '_', True)
|
||||
|
||||
def to_url(self, value):
|
||||
parts = value.split('_')
|
||||
if len(parts) == 2:
|
||||
return parts[0] + '-' + parts[1].lower()
|
||||
return value
|
||||
return self._to_from('_', '-', False)
|
||||
|
||||
app.url_map.converters['lang'] = LangConverter
|
||||
|
||||
|
@ -50,9 +50,8 @@ def app(environ, start_response):
|
||||
resp = Response(dat, mimetype='text/plain')
|
||||
else:
|
||||
# load file
|
||||
f = open(os.path.join('netdb', path), 'rb')
|
||||
resp = Response(f.read(), mimetype='application/octet-stream')
|
||||
f.close()
|
||||
with open(os.path.join('netdb', path), 'rb') as f:
|
||||
resp = Response(f.read(), mimetype='application/octet-stream')
|
||||
resp.add_etag()
|
||||
return resp(environ, start_response)
|
||||
|
||||
|
@ -7,13 +7,7 @@ import os
|
||||
# most likely python files as well.
|
||||
# To enable this, run with:
|
||||
# DEV=whatever ./runserver.py
|
||||
is_development = False
|
||||
try:
|
||||
os.environ['DEV']
|
||||
is_development = True
|
||||
except KeyError:
|
||||
pass
|
||||
|
||||
is_development = os.environ.get('DEV') != None
|
||||
|
||||
if __name__ == '__main__':
|
||||
app.run(host='127.0.0.1', port=5000, debug=is_development)
|
||||
|
Reference in New Issue
Block a user