Compare commits

...

23 Commits

Author SHA1 Message Date
f1d0e3e067 simplify slug base (de)date valids
Signed-off-by: AGentooCat <agentoocat@mail.i2p>
2023-03-14 17:29:32 +00:00
ae7a7b00a4 simplify slug (de)date valids
Signed-off-by: AGentooCat <agentoocat@mail.i2p>
2023-03-14 17:26:56 +00:00
bdb34cc646 simplify dict init of blog feeds
Signed-off-by: AGentooCat <agentoocat@mail.i2p>
2023-03-14 17:23:25 +00:00
e98ef3f151 simplify dict init of meeting feeds (2)
Signed-off-by: AGentooCat <agentoocat@mail.i2p>
2023-03-14 17:16:34 +00:00
050001228c simplify dict init of meeting feeds
Signed-off-by: AGentooCat <agentoocat@mail.i2p>
2023-03-14 17:15:20 +00:00
453cc0cc14 simplify file reading in netdb.i2p2 init
Signed-off-by: AGentooCat <agentoocat@mail.i2p>
2023-03-14 17:11:59 +00:00
bf5bb863d2 simplify dup-code of python<->html lang
Signed-off-by: AGentooCat <agentoocat@mail.i2p>
2023-03-14 15:59:47 +00:00
be26e555ec simplify a small lang attachment
Signed-off-by: AGentooCat <agentoocat@mail.i2p>
2023-03-14 15:57:10 +00:00
34490e41e8 simplify sitemap url appending
Signed-off-by: AGentooCat <agentoocat@mail.i2p>
2023-03-14 15:52:04 +00:00
0ba93d331f fix legacy resolving
Signed-off-by: AGentooCat <agentoocat@mail.i2p>
2023-03-14 15:51:16 +00:00
1f30255706 simplify the redirection returns on legacy_show
Signed-off-by: AGentooCat <agentoocat@mail.i2p>
2023-03-14 15:39:12 +00:00
052ece4336 simplify the decision of encoding the output on no-formatting output
Signed-off-by: AGentooCat <agentoocat@mail.i2p>
2023-03-14 15:34:55 +00:00
178f6f8c87 simplify the tower-length htmlformatter init
Signed-off-by: AGentooCat <agentoocat@mail.i2p>
2023-03-14 15:31:34 +00:00
e2a3aa76b5 simplify selection of formatter classes
Signed-off-by: AGentooCat <agentoocat@mail.i2p>
2023-03-14 15:24:01 +00:00
af2dfadfe6 simplify the render_template calls for downloads
Signed-off-by: AGentooCat <agentoocat@mail.i2p>
2023-03-14 15:17:50 +00:00
1b01ee50d2 simplify mirror file reading
Signed-off-by: AGentooCat <agentoocat@mail.i2p>
2023-03-14 15:13:09 +00:00
99cf7985b7 simplify dict inits
Signed-off-by: AGentooCat <agentoocat@mail.i2p>
2023-03-14 15:10:31 +00:00
95e395daaa simplify the code on the decision of showing i2p mirror links
Signed-off-by: AGentooCat <agentoocat@mail.i2p>
2023-03-14 15:08:17 +00:00
7401f930ba simplify temp-link resolving for default-args
Signed-off-by: AGentooCat <agentoocat@mail.i2p>
2023-03-14 15:04:14 +00:00
d7787511bd simplify temp-link resolving
Signed-off-by: AGentooCat <agentoocat@mail.i2p>
2023-03-14 15:02:53 +00:00
fadcb56439 simplify the decision of showing i2p links
Signed-off-by: AGentooCat <agentoocat@mail.i2p>
2023-03-14 15:00:12 +00:00
34654b6954 simplify theme getting from cookies
Signed-off-by: AGentooCat <agentoocat@mail.i2p>
2023-03-14 14:58:23 +00:00
34062eaf2d simplify $DEV check
Signed-off-by: AGentooCat <agentoocat@mail.i2p>
2023-03-14 14:56:05 +00:00
13 changed files with 141 additions and 197 deletions

View File

@ -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

View File

@ -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)

View File

@ -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)

View File

@ -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)

View 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

View File

@ -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()

View File

@ -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)

View File

@ -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):

View File

@ -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))

View File

@ -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

View File

@ -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

View File

@ -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)

View File

@ -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)