Snake case

merge-requests/30/head
Bob Mottram 2021-12-31 21:18:12 +00:00
parent 63334f8250
commit 2099cad0ac
33 changed files with 1404 additions and 1387 deletions

345
daemon.py

File diff suppressed because it is too large Load Diff

View File

@ -282,14 +282,14 @@ def _desktop_clear_screen() -> None:
def _desktop_show_banner() -> None:
"""Shows the banner at the top
"""
bannerFilename = 'banner.txt'
if not os.path.isfile(bannerFilename):
banner_filename = 'banner.txt'
if not os.path.isfile(banner_filename):
bannerTheme = 'starlight'
bannerFilename = 'theme/' + bannerTheme + '/banner.txt'
if not os.path.isfile(bannerFilename):
banner_filename = 'theme/' + bannerTheme + '/banner.txt'
if not os.path.isfile(banner_filename):
return
with open(bannerFilename, 'r') as bannerFile:
banner = bannerFile.read()
with open(banner_filename, 'r') as banner_file:
banner = banner_file.read()
if banner:
print(banner + '\n')

View File

@ -16,33 +16,33 @@ from utils import save_json
def fitness_performance(startTime, fitnessState: {},
fitnessId: str, watchPoint: str, debug: bool) -> None:
fitnessId: str, watch_point: str, debug: bool) -> None:
"""Log a performance watchpoint
"""
if 'performance' not in fitnessState:
fitnessState['performance'] = {}
if fitnessId not in fitnessState['performance']:
fitnessState['performance'][fitnessId] = {}
if watchPoint not in fitnessState['performance'][fitnessId]:
fitnessState['performance'][fitnessId][watchPoint] = {
if watch_point not in fitnessState['performance'][fitnessId]:
fitnessState['performance'][fitnessId][watch_point] = {
"total": float(0),
"ctr": int(0)
}
timeDiff = float(time.time() - startTime)
time_diff = float(time.time() - startTime)
fitnessState['performance'][fitnessId][watchPoint]['total'] += timeDiff
fitnessState['performance'][fitnessId][watchPoint]['ctr'] += 1
if fitnessState['performance'][fitnessId][watchPoint]['ctr'] >= 1024:
fitnessState['performance'][fitnessId][watchPoint]['total'] /= 2
fitnessState['performance'][fitnessId][watchPoint]['ctr'] = \
int(fitnessState['performance'][fitnessId][watchPoint]['ctr'] / 2)
fitnessState['performance'][fitnessId][watch_point]['total'] += time_diff
fitnessState['performance'][fitnessId][watch_point]['ctr'] += 1
if fitnessState['performance'][fitnessId][watch_point]['ctr'] >= 1024:
fitnessState['performance'][fitnessId][watch_point]['total'] /= 2
fitnessState['performance'][fitnessId][watch_point]['ctr'] = \
int(fitnessState['performance'][fitnessId][watch_point]['ctr'] / 2)
if debug:
ctr = fitnessState['performance'][fitnessId][watchPoint]['ctr']
total = fitnessState['performance'][fitnessId][watchPoint]['total']
ctr = fitnessState['performance'][fitnessId][watch_point]['ctr']
total = fitnessState['performance'][fitnessId][watch_point]['total']
print('FITNESS: performance/' + fitnessId + '/' +
watchPoint + '/' + str(total * 1000 / ctr))
watch_point + '/' + str(total * 1000 / ctr))
def sorted_watch_points(fitness: {}, fitnessId: str) -> []:
@ -54,12 +54,12 @@ def sorted_watch_points(fitness: {}, fitnessId: str) -> []:
if not fitness['performance'].get(fitnessId):
return []
result = []
for watchPoint, item in fitness['performance'][fitnessId].items():
for watch_point, item in fitness['performance'][fitnessId].items():
if not item.get('total'):
continue
averageTime = item['total'] * 1000 / item['ctr']
averageTimeStr = str(averageTime).zfill(8)
result.append(averageTimeStr + ' ' + watchPoint)
average_time = item['total'] * 1000 / item['ctr']
average_time_str = str(average_time).zfill(8)
result.append(average_time_str + ' ' + watch_point)
result.sort(reverse=True)
return result
@ -68,16 +68,17 @@ def html_watch_points_graph(base_dir: str, fitness: {}, fitnessId: str,
maxEntries: int) -> str:
"""Returns the html for a graph of watchpoints
"""
watchPointsList = sorted_watch_points(fitness, fitnessId)
watch_points_list = sorted_watch_points(fitness, fitnessId)
cssFilename = base_dir + '/epicyon-graph.css'
css_filename = base_dir + '/epicyon-graph.css'
if os.path.isfile(base_dir + '/graph.css'):
cssFilename = base_dir + '/graph.css'
css_filename = base_dir + '/graph.css'
instanceTitle = \
instance_title = \
get_config_param(base_dir, 'instanceTitle')
htmlStr = html_header_with_external_style(cssFilename, instanceTitle, None)
htmlStr += \
html_str = \
html_header_with_external_style(css_filename, instance_title, None)
html_str += \
'<table class="graph">\n' + \
'<caption>Watchpoints for ' + fitnessId + '</caption>\n' + \
'<thead>\n' + \
@ -88,23 +89,23 @@ def html_watch_points_graph(base_dir: str, fitness: {}, fitnessId: str,
'</thead><tbody>\n'
# get the maximum time
maxAverageTime = float(1)
if len(watchPointsList) > 0:
maxAverageTime = float(watchPointsList[0].split(' ')[0])
for watchPoint in watchPointsList:
averageTime = float(watchPoint.split(' ')[0])
if averageTime > maxAverageTime:
maxAverageTime = averageTime
max_average_time = float(1)
if len(watch_points_list) > 0:
max_average_time = float(watch_points_list[0].split(' ')[0])
for watch_point in watch_points_list:
average_time = float(watch_point.split(' ')[0])
if average_time > max_average_time:
max_average_time = average_time
ctr = 0
for watchPoint in watchPointsList:
name = watchPoint.split(' ', 1)[1]
averageTime = float(watchPoint.split(' ')[0])
heightPercent = int(averageTime * 100 / maxAverageTime)
timeMS = int(averageTime)
for watch_point in watch_points_list:
name = watch_point.split(' ', 1)[1]
average_time = float(watch_point.split(' ')[0])
heightPercent = int(average_time * 100 / max_average_time)
timeMS = int(average_time)
if heightPercent == 0:
continue
htmlStr += \
html_str += \
'<tr style="height:' + str(heightPercent) + '%">\n' + \
' <th scope="row">' + name + '</th>\n' + \
' <td><span>' + str(timeMS) + '</span></td>\n' + \
@ -113,8 +114,8 @@ def html_watch_points_graph(base_dir: str, fitness: {}, fitnessId: str,
if ctr >= maxEntries:
break
htmlStr += '</tbody></table>\n' + html_footer()
return htmlStr
html_str += '</tbody></table>\n' + html_footer()
return html_str
def fitness_thread(base_dir: str, fitness: {}):

View File

@ -301,15 +301,15 @@ def _verify_recent_signature(signedDateStr: str) -> bool:
currDate = datetime.datetime.utcnow()
dateFormat = "%a, %d %b %Y %H:%M:%S %Z"
signedDate = datetime.datetime.strptime(signedDateStr, dateFormat)
timeDiffSec = (currDate - signedDate).seconds
time_diffSec = (currDate - signedDate).seconds
# 12 hours tollerance
if timeDiffSec > 43200:
if time_diffSec > 43200:
print('WARN: Header signed too long ago: ' + signedDateStr)
print(str(timeDiffSec / (60 * 60)) + ' hours')
print(str(time_diffSec / (60 * 60)) + ' hours')
return False
if timeDiffSec < 0:
if time_diffSec < 0:
print('WARN: Header signed in the future! ' + signedDateStr)
print(str(timeDiffSec / (60 * 60)) + ' hours')
print(str(time_diffSec / (60 * 60)) + ' hours')
return False
return True

View File

@ -174,8 +174,8 @@ def _update_cached_hashtag_swarm(base_dir: str, nickname: str, domain: str,
pass
if modifiedDate:
currDate = datetime.datetime.utcnow()
timeDiff = currDate - modifiedDate
diffMins = int(timeDiff.total_seconds() / 60)
time_diff = currDate - modifiedDate
diffMins = int(time_diff.total_seconds() / 60)
if diffMins < 10:
# was saved recently, so don't save again
# This avoids too much disk I/O
@ -566,11 +566,11 @@ def save_post_to_inbox_queue(base_dir: str, http_prefix: str,
digestStartTime = time.time()
digestAlgorithm = get_digest_algorithm_from_headers(httpHeaders)
digest = message_content_digest(messageBytes, digestAlgorithm)
timeDiffStr = str(int((time.time() - digestStartTime) * 1000))
time_diffStr = str(int((time.time() - digestStartTime) * 1000))
if debug:
while len(timeDiffStr) < 6:
timeDiffStr = '0' + timeDiffStr
print('DIGEST|' + timeDiffStr + '|' + filename)
while len(time_diffStr) < 6:
time_diffStr = '0' + time_diffStr
print('DIGEST|' + time_diffStr + '|' + filename)
newQueueItem = {
'originalId': originalPostId,
@ -3602,12 +3602,12 @@ def _inbox_after_initial(recent_posts_cache: {}, max_recent_posts: int,
cw_lists,
lists_enabled)
if debug:
timeDiff = \
time_diff = \
str(int((time.time() - htmlCacheStartTime) *
1000))
print('Saved ' + boxname +
' post as html to cache in ' +
timeDiff + ' mS')
time_diff + ' mS')
handleName = handle.split('@')[0]

View File

@ -196,8 +196,8 @@ def masto_api_v1_response(path: str, calling_domain: str,
sendJsonStr = \
'masto API custom emojis sent ' + path + callingInfo
adminNickname = get_config_param(base_dir, 'admin')
if adminNickname and path == '/api/v1/instance':
admin_nickname = get_config_param(base_dir, 'admin')
if admin_nickname and path == '/api/v1/instance':
instanceDescriptionShort = \
get_config_param(base_dir, 'instanceDescriptionShort')
if not instanceDescriptionShort:
@ -224,7 +224,7 @@ def masto_api_v1_response(path: str, calling_domain: str,
instanceDescription,
http_prefix,
base_dir,
adminNickname,
admin_nickname,
domain,
domain_full,
registration,

View File

@ -86,13 +86,13 @@ def meta_data_instance(showAccounts: bool,
instanceDescriptionShort: str,
instanceDescription: str,
http_prefix: str, base_dir: str,
adminNickname: str, domain: str, domain_full: str,
admin_nickname: str, domain: str, domain_full: str,
registration: bool, system_language: str,
version: str) -> {}:
""" /api/v1/instance endpoint
"""
adminActorFilename = \
base_dir + '/accounts/' + adminNickname + '@' + domain + '.json'
base_dir + '/accounts/' + admin_nickname + '@' + domain + '.json'
if not os.path.isfile(adminActorFilename):
return {}

View File

@ -1060,10 +1060,10 @@ def suspend_account(base_dir: str, nickname: str, domain: str) -> None:
"""Suspends the given account
"""
# Don't suspend the admin
adminNickname = get_config_param(base_dir, 'admin')
if not adminNickname:
admin_nickname = get_config_param(base_dir, 'admin')
if not admin_nickname:
return
if nickname == adminNickname:
if nickname == admin_nickname:
return
# Don't suspend moderators
@ -1118,10 +1118,10 @@ def can_remove_post(base_dir: str, nickname: str,
domain_full = get_full_domain(domain, port)
# is the post by the admin?
adminNickname = get_config_param(base_dir, 'admin')
if not adminNickname:
admin_nickname = get_config_param(base_dir, 'admin')
if not admin_nickname:
return False
if domain_full + '/users/' + adminNickname + '/' in post_id:
if domain_full + '/users/' + admin_nickname + '/' in post_id:
return False
# is the post by a moderator?
@ -1177,10 +1177,10 @@ def remove_account(base_dir: str, nickname: str,
"""Removes an account
"""
# Don't remove the admin
adminNickname = get_config_param(base_dir, 'admin')
if not adminNickname:
admin_nickname = get_config_param(base_dir, 'admin')
if not admin_nickname:
return False
if nickname == adminNickname:
if nickname == admin_nickname:
return False
# Don't remove moderators

View File

@ -3937,9 +3937,9 @@ def _test_constant_time_string():
constant_time_string_check(test_str, test_str)
end = time.time()
avTime2 = ((end - start) * 1000000 / itterations)
timeDiffMicroseconds = abs(avTime2 - avTime1)
time_diffMicroseconds = abs(avTime2 - avTime1)
# time difference should be less than 10uS
assert int(timeDiffMicroseconds) < 10
assert int(time_diffMicroseconds) < 10
# change multiple characters and observe timing difference
start = time.time()
@ -3948,9 +3948,9 @@ def _test_constant_time_string():
constant_time_string_check(test_str, test_str2)
end = time.time()
avTime2 = ((end - start) * 1000000 / itterations)
timeDiffMicroseconds = abs(avTime2 - avTime1)
time_diffMicroseconds = abs(avTime2 - avTime1)
# time difference should be less than 10uS
assert int(timeDiffMicroseconds) < 10
assert int(time_diffMicroseconds) < 10
def _test_replace_email_quote():

View File

@ -397,13 +397,13 @@ def _set_background_format(base_dir: str, name: str,
"""
if extension == 'jpg':
return
cssFilename = base_dir + '/' + backgroundType + '.css'
if not os.path.isfile(cssFilename):
css_filename = base_dir + '/' + backgroundType + '.css'
if not os.path.isfile(css_filename):
return
with open(cssFilename, 'r') as cssfile:
with open(css_filename, 'r') as cssfile:
css = cssfile.read()
css = css.replace('background.jpg', 'background.' + extension)
with open(cssFilename, 'w+') as cssfile2:
with open(css_filename, 'w+') as cssfile2:
cssfile2.write(css)
@ -594,9 +594,9 @@ def _set_theme_fonts(base_dir: str, theme_name: str) -> None:
def get_text_mode_banner(base_dir: str) -> str:
"""Returns the banner used for shell browsers, like Lynx
"""
text_mode_bannerFilename = base_dir + '/accounts/banner.txt'
if os.path.isfile(text_mode_bannerFilename):
with open(text_mode_bannerFilename, 'r') as fp:
text_mode_banner_filename = base_dir + '/accounts/banner.txt'
if os.path.isfile(text_mode_banner_filename):
with open(text_mode_banner_filename, 'r') as fp:
bannerStr = fp.read()
if bannerStr:
return bannerStr.replace('\n', '<br>')
@ -640,7 +640,7 @@ def _set_text_mode_theme(base_dir: str, name: str) -> None:
base_dir + '/accounts/logo.txt')
# set the text mode banner which appears in browsers such as Lynx
text_mode_bannerFilename = \
text_mode_banner_filename = \
base_dir + '/theme/' + name + '/banner.txt'
if os.path.isfile(base_dir + '/accounts/banner.txt'):
try:
@ -648,13 +648,13 @@ def _set_text_mode_theme(base_dir: str, name: str) -> None:
except OSError:
print('EX: _set_text_mode_theme unable to delete ' +
base_dir + '/accounts/banner.txt')
if os.path.isfile(text_mode_bannerFilename):
if os.path.isfile(text_mode_banner_filename):
try:
copyfile(text_mode_bannerFilename,
copyfile(text_mode_banner_filename,
base_dir + '/accounts/banner.txt')
except OSError:
print('EX: _set_text_mode_theme unable to copy ' +
text_mode_bannerFilename + ' ' +
text_mode_banner_filename + ' ' +
base_dir + '/accounts/banner.txt')
@ -666,7 +666,7 @@ def _set_theme_images(base_dir: str, name: str) -> None:
profileImageFilename = \
base_dir + '/theme/' + theme_name_lower + '/image.png'
bannerFilename = \
banner_filename = \
base_dir + '/theme/' + theme_name_lower + '/banner.png'
searchBannerFilename = \
base_dir + '/theme/' + theme_name_lower + '/search_banner.png'
@ -721,7 +721,7 @@ def _set_theme_images(base_dir: str, name: str) -> None:
backgroundType + '-background.' + ext)
if os.path.isfile(profileImageFilename) and \
os.path.isfile(bannerFilename):
os.path.isfile(banner_filename):
try:
copyfile(profileImageFilename,
accountDir + '/image.png')
@ -730,11 +730,11 @@ def _set_theme_images(base_dir: str, name: str) -> None:
profileImageFilename)
try:
copyfile(bannerFilename,
copyfile(banner_filename,
accountDir + '/banner.png')
except OSError:
print('EX: _set_theme_images unable to copy ' +
bannerFilename)
banner_filename)
try:
if os.path.isfile(searchBannerFilename):

View File

@ -20,7 +20,7 @@ def html_about(css_cache: {}, base_dir: str, http_prefix: str,
system_language: str) -> str:
"""Show the about screen
"""
adminNickname = get_config_param(base_dir, 'admin')
admin_nickname = get_config_param(base_dir, 'admin')
if not os.path.isfile(base_dir + '/accounts/about.md'):
copyfile(base_dir + '/default_about.md',
base_dir + '/accounts/about.md')
@ -36,14 +36,14 @@ def html_about(css_cache: {}, base_dir: str, http_prefix: str,
aboutText = markdown_to_html(aboutFile.read())
aboutForm = ''
cssFilename = base_dir + '/epicyon-profile.css'
css_filename = base_dir + '/epicyon-profile.css'
if os.path.isfile(base_dir + '/epicyon.css'):
cssFilename = base_dir + '/epicyon.css'
css_filename = base_dir + '/epicyon.css'
instanceTitle = \
get_config_param(base_dir, 'instanceTitle')
aboutForm = \
html_header_with_website_markup(cssFilename, instanceTitle,
html_header_with_website_markup(css_filename, instanceTitle,
http_prefix, domain_full,
system_language)
aboutForm += '<div class="container">' + aboutText + '</div>'
@ -52,13 +52,13 @@ def html_about(css_cache: {}, base_dir: str, http_prefix: str,
'<div class="container"><center>\n' + \
'<p class="administeredby">' + \
'http://' + onion_domain + '</p>\n</center></div>\n'
if adminNickname:
adminActor = '/users/' + adminNickname
if admin_nickname:
adminActor = '/users/' + admin_nickname
aboutForm += \
'<div class="container"><center>\n' + \
'<p class="administeredby">' + \
translate['Administered by'] + ' <a href="' + \
adminActor + '">' + adminNickname + '</a>. ' + \
adminActor + '">' + admin_nickname + '</a>. ' + \
translate['Version'] + ' ' + __version__ + \
'</p>\n</center></div>\n'
aboutForm += html_footer()

View File

@ -17,7 +17,7 @@ from webapp_utils import html_footer
def load_access_keys_for_accounts(base_dir: str, keyShortcuts: {},
accessKeysTemplate: {}) -> None:
access_keysTemplate: {}) -> None:
"""Loads key shortcuts for each account
"""
for subdir, dirs, files in os.walk(base_dir + '/accounts'):
@ -25,57 +25,57 @@ def load_access_keys_for_accounts(base_dir: str, keyShortcuts: {},
if not is_account_dir(acct):
continue
accountDir = os.path.join(base_dir + '/accounts', acct)
accessKeysFilename = accountDir + '/accessKeys.json'
if not os.path.isfile(accessKeysFilename):
access_keysFilename = accountDir + '/access_keys.json'
if not os.path.isfile(access_keysFilename):
continue
nickname = acct.split('@')[0]
accessKeys = load_json(accessKeysFilename)
if accessKeys:
keyShortcuts[nickname] = accessKeysTemplate.copy()
for variableName, key in accessKeysTemplate.items():
if accessKeys.get(variableName):
access_keys = load_json(access_keysFilename)
if access_keys:
keyShortcuts[nickname] = access_keysTemplate.copy()
for variableName, key in access_keysTemplate.items():
if access_keys.get(variableName):
keyShortcuts[nickname][variableName] = \
accessKeys[variableName]
access_keys[variableName]
break
def html_access_keys(css_cache: {}, base_dir: str,
nickname: str, domain: str,
translate: {}, accessKeys: {},
translate: {}, access_keys: {},
defaultAccessKeys: {},
defaultTimeline: str) -> str:
"""Show and edit key shortcuts
"""
accessKeysFilename = \
acct_dir(base_dir, nickname, domain) + '/accessKeys.json'
if os.path.isfile(accessKeysFilename):
accessKeysFromFile = load_json(accessKeysFilename)
if accessKeysFromFile:
accessKeys = accessKeysFromFile
access_keysFilename = \
acct_dir(base_dir, nickname, domain) + '/access_keys.json'
if os.path.isfile(access_keysFilename):
access_keysFromFile = load_json(access_keysFilename)
if access_keysFromFile:
access_keys = access_keysFromFile
accessKeysForm = ''
cssFilename = base_dir + '/epicyon-profile.css'
access_keysForm = ''
css_filename = base_dir + '/epicyon-profile.css'
if os.path.isfile(base_dir + '/epicyon.css'):
cssFilename = base_dir + '/epicyon.css'
css_filename = base_dir + '/epicyon.css'
instanceTitle = \
get_config_param(base_dir, 'instanceTitle')
accessKeysForm = \
html_header_with_external_style(cssFilename, instanceTitle, None)
accessKeysForm += '<div class="container">\n'
access_keysForm = \
html_header_with_external_style(css_filename, instanceTitle, None)
access_keysForm += '<div class="container">\n'
accessKeysForm += \
access_keysForm += \
' <h1>' + translate['Key Shortcuts'] + '</h1>\n'
accessKeysForm += \
access_keysForm += \
'<p>' + translate['These access keys may be used'] + \
'<label class="labels"></label></p>'
accessKeysForm += ' <form method="POST" action="' + \
access_keysForm += ' <form method="POST" action="' + \
'/users/' + nickname + '/changeAccessKeys">\n'
timelineKey = accessKeys['menuTimeline']
submitKey = accessKeys['submitButton']
accessKeysForm += \
timelineKey = access_keys['menuTimeline']
submitKey = access_keys['submitButton']
access_keysForm += \
' <center>\n' + \
' <button type="submit" class="button" ' + \
'name="submitAccessKeysCancel" accesskey="' + timelineKey + '">' + \
@ -84,12 +84,12 @@ def html_access_keys(css_cache: {}, base_dir: str,
'name="submitAccessKeys" accesskey="' + submitKey + '">' + \
translate['Submit'] + '</button>\n </center>\n'
accessKeysForm += ' <table class="accesskeys">\n'
accessKeysForm += ' <colgroup>\n'
accessKeysForm += ' <col span="1" class="accesskeys-left">\n'
accessKeysForm += ' <col span="1" class="accesskeys-center">\n'
accessKeysForm += ' </colgroup>\n'
accessKeysForm += ' <tbody>\n'
access_keysForm += ' <table class="accesskeys">\n'
access_keysForm += ' <colgroup>\n'
access_keysForm += ' <col span="1" class="accesskeys-left">\n'
access_keysForm += ' <col span="1" class="accesskeys-center">\n'
access_keysForm += ' </colgroup>\n'
access_keysForm += ' <tbody>\n'
for variableName, key in defaultAccessKeys.items():
if not translate.get(variableName):
@ -98,8 +98,8 @@ def html_access_keys(css_cache: {}, base_dir: str,
keyStr += \
'<td><label class="labels">' + \
translate[variableName] + '</label></td>'
if accessKeys.get(variableName):
key = accessKeys[variableName]
if access_keys.get(variableName):
key = access_keys[variableName]
if len(key) > 1:
key = key[0]
keyStr += \
@ -107,11 +107,11 @@ def html_access_keys(css_cache: {}, base_dir: str,
'name="' + variableName.replace(' ', '_') + '" ' + \
'value="' + key + '">'
keyStr += '</td></tr>\n'
accessKeysForm += keyStr
access_keysForm += keyStr
accessKeysForm += ' </tbody>\n'
accessKeysForm += ' </table>\n'
accessKeysForm += ' </form>\n'
accessKeysForm += '</div>\n'
accessKeysForm += html_footer()
return accessKeysForm
access_keysForm += ' </tbody>\n'
access_keysForm += ' </table>\n'
access_keysForm += ' </form>\n'
access_keysForm += '</div>\n'
access_keysForm += html_footer()
return access_keysForm

View File

@ -52,14 +52,14 @@ def html_calendar_delete_confirm(css_cache: {}, translate: {}, base_dir: str,
return None
delete_postStr = None
cssFilename = base_dir + '/epicyon-profile.css'
css_filename = base_dir + '/epicyon-profile.css'
if os.path.isfile(base_dir + '/epicyon.css'):
cssFilename = base_dir + '/epicyon.css'
css_filename = base_dir + '/epicyon.css'
instanceTitle = \
get_config_param(base_dir, 'instanceTitle')
delete_postStr = \
html_header_with_external_style(cssFilename, instanceTitle, None)
html_header_with_external_style(css_filename, instanceTitle, None)
delete_postStr += \
'<center><h1>' + postTime + ' ' + str(year) + '/' + \
str(monthNumber) + \
@ -111,9 +111,9 @@ def _html_calendar_day(person_cache: {}, css_cache: {}, translate: {},
except OSError:
print('EX: _html_calendar_day unable to delete ' + calendarFile)
cssFilename = base_dir + '/epicyon-calendar.css'
css_filename = base_dir + '/epicyon-calendar.css'
if os.path.isfile(base_dir + '/calendar.css'):
cssFilename = base_dir + '/calendar.css'
css_filename = base_dir + '/calendar.css'
calActor = actor
if '/users/' in actor:
@ -121,7 +121,7 @@ def _html_calendar_day(person_cache: {}, css_cache: {}, translate: {},
instanceTitle = get_config_param(base_dir, 'instanceTitle')
calendarStr = \
html_header_with_external_style(cssFilename, instanceTitle, None)
html_header_with_external_style(css_filename, instanceTitle, None)
calendarStr += '<main><table class="calendar">\n'
calendarStr += '<caption class="calendar__banner--month">\n'
calendarStr += \
@ -249,7 +249,7 @@ def _html_calendar_day(person_cache: {}, css_cache: {}, translate: {},
def html_calendar(person_cache: {}, css_cache: {}, translate: {},
base_dir: str, path: str,
http_prefix: str, domain_full: str,
text_mode_banner: str, accessKeys: {}) -> str:
text_mode_banner: str, access_keys: {}) -> str:
"""Show the calendar for a person
"""
domain = remove_domain_port(domain_full)
@ -334,9 +334,9 @@ def html_calendar(person_cache: {}, css_cache: {}, translate: {},
(date(year + 1, 1, 1) - date(year, monthNumber, 1)).days
# print('daysInMonth ' + str(monthNumber) + ': ' + str(daysInMonth))
cssFilename = base_dir + '/epicyon-calendar.css'
css_filename = base_dir + '/epicyon-calendar.css'
if os.path.isfile(base_dir + '/calendar.css'):
cssFilename = base_dir + '/calendar.css'
css_filename = base_dir + '/calendar.css'
calActor = actor
if '/users/' in actor:
@ -345,7 +345,7 @@ def html_calendar(person_cache: {}, css_cache: {}, translate: {},
instanceTitle = \
get_config_param(base_dir, 'instanceTitle')
headerStr = \
html_header_with_external_style(cssFilename, instanceTitle, None)
html_header_with_external_style(css_filename, instanceTitle, None)
# the main graphical calendar as a table
calendarStr = '<main><table class="calendar">\n'
@ -353,19 +353,19 @@ def html_calendar(person_cache: {}, css_cache: {}, translate: {},
calendarStr += \
' <a href="' + calActor + '/calendar?year=' + str(prevYear) + \
'?month=' + str(prevMonthNumber) + '" ' + \
'accesskey="' + accessKeys['Page up'] + '">'
'accesskey="' + access_keys['Page up'] + '">'
calendarStr += \
' <img loading="lazy" alt="' + translate['Previous month'] + \
'" title="' + translate['Previous month'] + '" src="/icons' + \
'/prev.png" class="buttonprev"/></a>\n'
calendarStr += ' <a href="' + calActor + '/inbox" title="'
calendarStr += translate['Switch to timeline view'] + '" ' + \
'accesskey="' + accessKeys['menuTimeline'] + '">'
'accesskey="' + access_keys['menuTimeline'] + '">'
calendarStr += ' <h1>' + monthName + '</h1></a>\n'
calendarStr += \
' <a href="' + calActor + '/calendar?year=' + str(nextYear) + \
'?month=' + str(nextMonthNumber) + '" ' + \
'accesskey="' + accessKeys['Page down'] + '">'
'accesskey="' + access_keys['Page down'] + '">'
calendarStr += \
' <img loading="lazy" alt="' + translate['Next month'] + \
'" title="' + translate['Next month'] + '" src="/icons' + \
@ -382,10 +382,10 @@ def html_calendar(person_cache: {}, css_cache: {}, translate: {},
calendarStr += '<tbody>\n'
# beginning of the links used for accessibility
navLinks = {}
nav_links = {}
timelineLinkStr = html_hide_from_screen_reader('🏠') + ' ' + \
translate['Switch to timeline view']
navLinks[timelineLinkStr] = calActor + '/inbox'
nav_links[timelineLinkStr] = calActor + '/inbox'
dayOfMonth = 0
dow = week_day_of_month_start(monthNumber, year)
@ -415,7 +415,7 @@ def html_calendar(person_cache: {}, css_cache: {}, translate: {},
menuOptionStr = \
html_hide_from_screen_reader('📅') + ' ' + \
dayDescription
navLinks[menuOptionStr] = url
nav_links[menuOptionStr] = url
# there are events for this day
if not isToday:
calendarStr += \
@ -447,16 +447,16 @@ def html_calendar(person_cache: {}, css_cache: {}, translate: {},
# end of the links used for accessibility
nextMonthStr = \
html_hide_from_screen_reader('') + ' ' + translate['Next month']
navLinks[nextMonthStr] = calActor + '/calendar?year=' + str(nextYear) + \
nav_links[nextMonthStr] = calActor + '/calendar?year=' + str(nextYear) + \
'?month=' + str(nextMonthNumber)
prevMonthStr = \
html_hide_from_screen_reader('') + ' ' + translate['Previous month']
navLinks[prevMonthStr] = calActor + '/calendar?year=' + str(prevYear) + \
nav_links[prevMonthStr] = calActor + '/calendar?year=' + str(prevYear) + \
'?month=' + str(prevMonthNumber)
navAccessKeys = {
nav_access_keys = {
}
screenReaderCal = \
html_keyboard_navigation(text_mode_banner, navLinks, navAccessKeys,
html_keyboard_navigation(text_mode_banner, nav_links, nav_access_keys,
monthName)
newEventStr = \

View File

@ -28,88 +28,90 @@ from shares import share_category_icon
def _links_exist(base_dir: str) -> bool:
"""Returns true if links have been created
"""
linksFilename = base_dir + '/accounts/links.txt'
return os.path.isfile(linksFilename)
links_filename = base_dir + '/accounts/links.txt'
return os.path.isfile(links_filename)
def _get_left_column_shares(base_dir: str,
http_prefix: str, domain: str, domain_full: str,
nickname: str,
maxSharesInLeftColumn: int,
max_shares_in_left_column: int,
translate: {},
shared_items_federated_domains: []) -> []:
"""get any shares and turn them into the left column links format
"""
pageNumber = 1
page_number = 1
actor = local_actor_url(http_prefix, nickname, domain_full)
# NOTE: this could potentially be slow if the number of federated
# shared items is large
sharesJson, lastPage = \
shares_timeline_json(actor, pageNumber, maxSharesInLeftColumn,
base_dir, domain, nickname, maxSharesInLeftColumn,
shares_json, last_page = \
shares_timeline_json(actor, page_number, max_shares_in_left_column,
base_dir, domain, nickname,
max_shares_in_left_column,
shared_items_federated_domains, 'shares')
if not sharesJson:
if not shares_json:
return []
linksList = []
links_list = []
ctr = 0
for published, item in sharesJson.items():
for published, item in shares_json.items():
sharedesc = item['displayName']
if '<' in sharedesc or '?' in sharedesc:
continue
shareId = item['shareId']
share_id = item['shareId']
# selecting this link calls html_show_share
shareLink = actor + '?showshare=' + shareId
share_link = actor + '?showshare=' + share_id
if item.get('category'):
shareLink += '?category=' + item['category']
share_link += '?category=' + item['category']
shareCategory = share_category_icon(item['category'])
linksList.append(shareCategory + sharedesc + ' ' + shareLink)
links_list.append(shareCategory + sharedesc + ' ' + share_link)
ctr += 1
if ctr >= maxSharesInLeftColumn:
if ctr >= max_shares_in_left_column:
break
if linksList:
linksList = ['* ' + translate['Shares']] + linksList
return linksList
if links_list:
links_list = ['* ' + translate['Shares']] + links_list
return links_list
def _get_left_column_wanted(base_dir: str,
http_prefix: str, domain: str, domain_full: str,
nickname: str,
maxSharesInLeftColumn: int,
max_shares_in_left_column: int,
translate: {},
shared_items_federated_domains: []) -> []:
"""get any wanted items and turn them into the left column links format
"""
pageNumber = 1
page_number = 1
actor = local_actor_url(http_prefix, nickname, domain_full)
# NOTE: this could potentially be slow if the number of federated
# wanted items is large
sharesJson, lastPage = \
shares_timeline_json(actor, pageNumber, maxSharesInLeftColumn,
base_dir, domain, nickname, maxSharesInLeftColumn,
shares_json, last_page = \
shares_timeline_json(actor, page_number, max_shares_in_left_column,
base_dir, domain, nickname,
max_shares_in_left_column,
shared_items_federated_domains, 'wanted')
if not sharesJson:
if not shares_json:
return []
linksList = []
links_list = []
ctr = 0
for published, item in sharesJson.items():
for published, item in shares_json.items():
sharedesc = item['displayName']
if '<' in sharedesc or ';' in sharedesc:
continue
shareId = item['shareId']
share_id = item['shareId']
# selecting this link calls html_show_share
shareLink = actor + '?showwanted=' + shareId
linksList.append(sharedesc + ' ' + shareLink)
share_link = actor + '?showwanted=' + share_id
links_list.append(sharedesc + ' ' + share_link)
ctr += 1
if ctr >= maxSharesInLeftColumn:
if ctr >= max_shares_in_left_column:
break
if linksList:
linksList = ['* ' + translate['Wanted']] + linksList
return linksList
if links_list:
links_list = ['* ' + translate['Wanted']] + links_list
return links_list
def get_left_column_content(base_dir: str, nickname: str, domain_full: str,
@ -118,13 +120,13 @@ def get_left_column_content(base_dir: str, nickname: str, domain_full: str,
showBackButton: bool, timelinePath: str,
rss_icon_at_top: bool, showHeaderImage: bool,
frontPage: bool, theme: str,
accessKeys: {},
access_keys: {},
shared_items_federated_domains: []) -> str:
"""Returns html content for the left column
"""
htmlStr = ''
html_str = ''
separatorStr = html_post_separator(base_dir, 'left')
separator_str = html_post_separator(base_dir, 'left')
domain = remove_domain_port(domain_full)
editImageClass = ''
@ -136,40 +138,40 @@ def get_left_column_content(base_dir: str, nickname: str, domain_full: str,
editImageClass = 'leftColEdit'
if os.path.isfile(leftColumnImageFilename):
editImageClass = 'leftColEditImage'
htmlStr += \
html_str += \
'\n <center>\n <img class="leftColImg" ' + \
'alt="" loading="lazy" src="/users/' + \
nickname + '/' + leftImageFile + '" />\n' + \
' </center>\n'
if showBackButton:
htmlStr += \
html_str += \
' <div> <a href="' + timelinePath + '">' + \
'<button class="cancelbtn">' + \
translate['Go Back'] + '</button></a>\n'
if (editor or rss_icon_at_top) and not showHeaderImage:
htmlStr += '<div class="columnIcons">'
html_str += '<div class="columnIcons">'
if editImageClass == 'leftColEdit':
htmlStr += '\n <center>\n'
html_str += '\n <center>\n'
htmlStr += ' <div class="leftColIcons">\n'
html_str += ' <div class="leftColIcons">\n'
if editor:
# show the edit icon
htmlStr += \
html_str += \
' <a href="/users/' + nickname + '/editlinks" ' + \
'accesskey="' + accessKeys['menuEdit'] + '">' + \
'accesskey="' + access_keys['menuEdit'] + '">' + \
'<img class="' + editImageClass + '" loading="lazy" alt="' + \
translate['Edit Links'] + ' | " title="' + \
translate['Edit Links'] + '" src="/icons/edit.png" /></a>\n'
if artist:
# show the theme designer icon
htmlStr += \
html_str += \
' <a href="/users/' + nickname + '/themedesigner" ' + \
'accesskey="' + accessKeys['menuThemeDesigner'] + '">' + \
'accesskey="' + access_keys['menuThemeDesigner'] + '">' + \
'<img class="' + editImageClass + '" loading="lazy" alt="' + \
translate['Theme Designer'] + ' | " title="' + \
translate['Theme Designer'] + '" src="/icons/theme.png" /></a>\n'
@ -191,51 +193,51 @@ def get_left_column_content(base_dir: str, nickname: str, domain_full: str,
'" loading="lazy" alt="' + rssTitle + '" title="' + rssTitle + \
'" src="/icons/logorss.png" /></a>\n'
if rss_icon_at_top:
htmlStr += rssIconStr
htmlStr += ' </div>\n'
html_str += rssIconStr
html_str += ' </div>\n'
if editImageClass == 'leftColEdit':
htmlStr += ' </center>\n'
html_str += ' </center>\n'
if (editor or rss_icon_at_top) and not showHeaderImage:
htmlStr += '</div><br>'
html_str += '</div><br>'
# if showHeaderImage:
# htmlStr += '<br>'
# html_str += '<br>'
# flag used not to show the first separator
firstSeparatorAdded = False
first_separator_added = False
linksFilename = base_dir + '/accounts/links.txt'
links_filename = base_dir + '/accounts/links.txt'
linksFileContainsEntries = False
linksList = None
if os.path.isfile(linksFilename):
with open(linksFilename, 'r') as f:
linksList = f.readlines()
links_list = None
if os.path.isfile(links_filename):
with open(links_filename, 'r') as f:
links_list = f.readlines()
if not frontPage:
# show a number of shares
maxSharesInLeftColumn = 3
max_shares_in_left_column = 3
sharesList = \
_get_left_column_shares(base_dir,
http_prefix, domain, domain_full, nickname,
maxSharesInLeftColumn, translate,
max_shares_in_left_column, translate,
shared_items_federated_domains)
if linksList and sharesList:
linksList = sharesList + linksList
if links_list and sharesList:
links_list = sharesList + links_list
wantedList = \
_get_left_column_wanted(base_dir,
http_prefix, domain, domain_full, nickname,
maxSharesInLeftColumn, translate,
max_shares_in_left_column, translate,
shared_items_federated_domains)
if linksList and wantedList:
linksList = wantedList + linksList
if links_list and wantedList:
links_list = wantedList + links_list
newTabStr = ' target="_blank" rel="nofollow noopener noreferrer"'
if linksList:
htmlStr += '<nav>\n'
for lineStr in linksList:
if links_list:
html_str += '<nav>\n'
for lineStr in links_list:
if ' ' not in lineStr:
if '#' not in lineStr:
if '*' not in lineStr:
@ -285,12 +287,12 @@ def get_left_column_content(base_dir: str, nickname: str, domain_full: str,
# add link to the returned html
if '?showshare=' not in linkStr and \
'?showwarning=' not in linkStr:
htmlStr += \
html_str += \
' <p><a href="' + linkStr + \
'"' + newTabStr + '>' + \
lineStr + '</a></p>\n'
else:
htmlStr += \
html_str += \
' <p><a href="' + linkStr + \
'">' + lineStr + '</a></p>\n'
linksFileContainsEntries = True
@ -301,51 +303,51 @@ def get_left_column_content(base_dir: str, nickname: str, domain_full: str,
# add link to the returned html
if '?showshare=' not in linkStr and \
'?showwarning=' not in linkStr:
htmlStr += \
html_str += \
' <p><a href="' + linkStr + \
'"' + newTabStr + '>' + \
lineStr.strip() + '</a></p>\n'
else:
htmlStr += \
html_str += \
' <p><a href="' + linkStr + \
'">' + lineStr.strip() + '</a></p>\n'
linksFileContainsEntries = True
else:
if lineStr.startswith('#') or lineStr.startswith('*'):
lineStr = lineStr[1:].strip()
if firstSeparatorAdded:
htmlStr += separatorStr
firstSeparatorAdded = True
htmlStr += \
if first_separator_added:
html_str += separator_str
first_separator_added = True
html_str += \
' <h3 class="linksHeader">' + \
lineStr + '</h3>\n'
else:
htmlStr += \
html_str += \
' <p>' + lineStr + '</p>\n'
linksFileContainsEntries = True
htmlStr += '</nav>\n'
html_str += '</nav>\n'
if firstSeparatorAdded:
htmlStr += separatorStr
htmlStr += \
if first_separator_added:
html_str += separator_str
html_str += \
'<p class="login-text"><a href="/users/' + nickname + \
'/catalog.csv">' + translate['Shares Catalog'] + '</a></p>'
htmlStr += \
html_str += \
'<p class="login-text"><a href="/users/' + \
nickname + '/accesskeys" accesskey="' + \
accessKeys['menuKeys'] + '">' + \
access_keys['menuKeys'] + '">' + \
translate['Key Shortcuts'] + '</a></p>'
htmlStr += \
html_str += \
'<p class="login-text"><a href="/about">' + \
translate['About this Instance'] + '</a></p>'
htmlStr += \
html_str += \
'<p class="login-text"><a href="/terms">' + \
translate['Terms of Service'] + '</a></p>'
if linksFileContainsEntries and not rss_icon_at_top:
htmlStr += '<br><div class="columnIcons">' + rssIconStr + '</div>'
html_str += '<br><div class="columnIcons">' + rssIconStr + '</div>'
return htmlStr
return html_str
def html_links_mobile(css_cache: {}, base_dir: str,
@ -355,16 +357,16 @@ def html_links_mobile(css_cache: {}, base_dir: str,
rss_icon_at_top: bool,
icons_as_buttons: bool,
defaultTimeline: str,
theme: str, accessKeys: {},
theme: str, access_keys: {},
shared_items_federated_domains: []) -> str:
"""Show the left column links within mobile view
"""
htmlStr = ''
html_str = ''
# the css filename
cssFilename = base_dir + '/epicyon-profile.css'
css_filename = base_dir + '/epicyon-profile.css'
if os.path.isfile(base_dir + '/epicyon.css'):
cssFilename = base_dir + '/epicyon.css'
css_filename = base_dir + '/epicyon.css'
# is the user a site editor?
if nickname == 'news':
@ -376,47 +378,48 @@ def html_links_mobile(css_cache: {}, base_dir: str,
domain = remove_domain_port(domain_full)
instanceTitle = \
instance_title = \
get_config_param(base_dir, 'instanceTitle')
htmlStr = html_header_with_external_style(cssFilename, instanceTitle, None)
bannerFile, bannerFilename = \
html_str = \
html_header_with_external_style(css_filename, instance_title, None)
banner_file, banner_filename = \
get_banner_file(base_dir, nickname, domain, theme)
htmlStr += \
html_str += \
'<a href="/users/' + nickname + '/' + defaultTimeline + '" ' + \
'accesskey="' + accessKeys['menuTimeline'] + '">' + \
'accesskey="' + access_keys['menuTimeline'] + '">' + \
'<img loading="lazy" class="timeline-banner" ' + \
'alt="' + translate['Switch to timeline view'] + '" ' + \
'src="/users/' + nickname + '/' + bannerFile + '" /></a>\n'
'src="/users/' + nickname + '/' + banner_file + '" /></a>\n'
htmlStr += '<div class="col-left-mobile">\n'
htmlStr += '<center>' + \
html_str += '<div class="col-left-mobile">\n'
html_str += '<center>' + \
header_buttons_front_screen(translate, nickname,
'links', authorized,
icons_as_buttons) + '</center>'
htmlStr += \
html_str += \
get_left_column_content(base_dir, nickname, domain_full,
http_prefix, translate,
editor, artist,
False, timelinePath,
rss_icon_at_top, False, False,
theme, accessKeys,
theme, access_keys,
shared_items_federated_domains)
if editor and not _links_exist(base_dir):
htmlStr += '<br><br><br>\n<center>\n '
htmlStr += translate['Select the edit icon to add web links']
htmlStr += '\n</center>\n'
html_str += '<br><br><br>\n<center>\n '
html_str += translate['Select the edit icon to add web links']
html_str += '\n</center>\n'
# end of col-left-mobile
htmlStr += '</div>\n'
html_str += '</div>\n'
htmlStr += '</div>\n' + html_footer()
return htmlStr
html_str += '</div>\n' + html_footer()
return html_str
def html_edit_links(css_cache: {}, translate: {}, base_dir: str, path: str,
domain: str, port: int, http_prefix: str,
defaultTimeline: str, theme: str,
accessKeys: {}) -> str:
access_keys: {}) -> str:
"""Shows the edit links screen
"""
if '/users/' not in path:
@ -432,109 +435,110 @@ def html_edit_links(css_cache: {}, translate: {}, base_dir: str, path: str,
if not is_editor(base_dir, nickname):
return ''
cssFilename = base_dir + '/epicyon-links.css'
css_filename = base_dir + '/epicyon-links.css'
if os.path.isfile(base_dir + '/links.css'):
cssFilename = base_dir + '/links.css'
css_filename = base_dir + '/links.css'
# filename of the banner shown at the top
bannerFile, bannerFilename = \
banner_file, _ = \
get_banner_file(base_dir, nickname, domain, theme)
instanceTitle = \
instance_title = \
get_config_param(base_dir, 'instanceTitle')
editLinksForm = \
html_header_with_external_style(cssFilename, instanceTitle, None)
edit_links_form = \
html_header_with_external_style(css_filename, instance_title, None)
# top banner
editLinksForm += \
edit_links_form += \
'<header>\n' + \
'<a href="/users/' + nickname + '/' + defaultTimeline + '" title="' + \
translate['Switch to timeline view'] + '" alt="' + \
translate['Switch to timeline view'] + '" ' + \
'accesskey="' + accessKeys['menuTimeline'] + '">\n'
editLinksForm += \
'accesskey="' + access_keys['menuTimeline'] + '">\n'
edit_links_form += \
'<img loading="lazy" class="timeline-banner" ' + \
'alt = "" src="' + \
'/users/' + nickname + '/' + bannerFile + '" /></a>\n' + \
'/users/' + nickname + '/' + banner_file + '" /></a>\n' + \
'</header>\n'
editLinksForm += \
edit_links_form += \
'<form enctype="multipart/form-data" method="POST" ' + \
'accept-charset="UTF-8" action="' + path + '/linksdata">\n'
editLinksForm += \
edit_links_form += \
' <div class="vertical-center">\n'
editLinksForm += \
edit_links_form += \
' <div class="containerSubmitNewPost">\n'
editLinksForm += \
edit_links_form += \
' <h1>' + translate['Edit Links'] + '</h1>'
editLinksForm += \
edit_links_form += \
' <input type="submit" name="submitLinks" value="' + \
translate['Submit'] + '" ' + \
'accesskey="' + accessKeys['submitButton'] + '">\n'
editLinksForm += \
'accesskey="' + access_keys['submitButton'] + '">\n'
edit_links_form += \
' </div>\n'
linksFilename = base_dir + '/accounts/links.txt'
linksStr = ''
if os.path.isfile(linksFilename):
with open(linksFilename, 'r') as fp:
linksStr = fp.read()
links_filename = base_dir + '/accounts/links.txt'
links_str = ''
if os.path.isfile(links_filename):
with open(links_filename, 'r') as fp_links:
links_str = fp_links.read()
editLinksForm += \
edit_links_form += \
'<div class="container">'
editLinksForm += \
edit_links_form += \
' ' + \
translate['One link per line. Description followed by the link.'] + \
'<br>'
newColLinkStr = translate['New link title and URL']
editLinksForm += edit_text_field(None, 'newColLink', '', newColLinkStr)
editLinksForm += \
new_col_link_str = translate['New link title and URL']
edit_links_form += \
edit_text_field(None, 'newColLink', '', new_col_link_str)
edit_links_form += \
' <textarea id="message" name="editedLinks" ' + \
'style="height:80vh" spellcheck="false">' + linksStr + '</textarea>'
editLinksForm += \
'style="height:80vh" spellcheck="false">' + links_str + '</textarea>'
edit_links_form += \
'</div>'
# the admin can edit terms of service and about text
adminNickname = get_config_param(base_dir, 'admin')
if adminNickname:
if nickname == adminNickname:
aboutFilename = base_dir + '/accounts/about.md'
aboutStr = ''
if os.path.isfile(aboutFilename):
with open(aboutFilename, 'r') as fp:
aboutStr = fp.read()
admin_nickname = get_config_param(base_dir, 'admin')
if admin_nickname:
if nickname == admin_nickname:
about_filename = base_dir + '/accounts/about.md'
about_str = ''
if os.path.isfile(about_filename):
with open(about_filename, 'r') as fp_about:
about_str = fp_about.read()
editLinksForm += \
edit_links_form += \
'<div class="container">'
editLinksForm += \
edit_links_form += \
' ' + \
translate['About this Instance'] + \
'<br>'
editLinksForm += \
edit_links_form += \
' <textarea id="message" name="editedAbout" ' + \
'style="height:100vh" spellcheck="true" autocomplete="on">' + \
aboutStr + '</textarea>'
editLinksForm += \
about_str + '</textarea>'
edit_links_form += \
'</div>'
TOSFilename = base_dir + '/accounts/tos.md'
TOSStr = ''
if os.path.isfile(TOSFilename):
with open(TOSFilename, 'r') as fp:
TOSStr = fp.read()
tos_filename = base_dir + '/accounts/tos.md'
tos_str = ''
if os.path.isfile(tos_filename):
with open(tos_filename, 'r') as fp:
tos_str = fp.read()
editLinksForm += \
edit_links_form += \
'<div class="container">'
editLinksForm += \
edit_links_form += \
' ' + \
translate['Terms of Service'] + \
'<br>'
editLinksForm += \
edit_links_form += \
' <textarea id="message" name="editedTOS" ' + \
'style="height:100vh" spellcheck="true" autocomplete="on">' + \
TOSStr + '</textarea>'
editLinksForm += \
tos_str + '</textarea>'
edit_links_form += \
'</div>'
editLinksForm += html_footer()
return editLinksForm
edit_links_form += html_footer()
return edit_links_form

View File

@ -60,7 +60,7 @@ def get_right_column_content(base_dir: str, nickname: str, domain_full: str,
showHeaderImage: bool,
theme: str,
defaultTimeline: str,
accessKeys: {}) -> str:
access_keys: {}) -> str:
"""Returns html content for the right column
"""
htmlStr = ''
@ -77,7 +77,7 @@ def get_right_column_content(base_dir: str, nickname: str, domain_full: str,
' <a href="' + \
'/users/' + nickname + '/newblog?nodropdown" ' + \
'title="' + titleStr + '" ' + \
'accesskey="' + accessKeys['menuNewPost'] + '">' + \
'accesskey="' + access_keys['menuNewPost'] + '">' + \
'<button class="publishbtn">' + \
translate['Publish'] + '</button></a>\n'
else:
@ -134,7 +134,7 @@ def get_right_column_content(base_dir: str, nickname: str, domain_full: str,
htmlStr += \
' <a href="' + \
'/users/' + nickname + '/editnewswire" ' + \
'accesskey="' + accessKeys['menuEdit'] + '">' + \
'accesskey="' + access_keys['menuEdit'] + '">' + \
'<img class="' + editImageClass + \
'" loading="lazy" alt="' + \
translate['Edit newswire'] + ' | " title="' + \
@ -145,7 +145,7 @@ def get_right_column_content(base_dir: str, nickname: str, domain_full: str,
htmlStr += \
' <a href="' + \
'/users/' + nickname + '/editnewswire" ' + \
'accesskey="' + accessKeys['menuEdit'] + '">' + \
'accesskey="' + access_keys['menuEdit'] + '">' + \
'<img class="' + editImageClass + \
'" loading="lazy" alt="' + \
translate['Edit newswire'] + ' | " title="' + \
@ -179,7 +179,7 @@ def get_right_column_content(base_dir: str, nickname: str, domain_full: str,
htmlStr += \
' <a href="' + \
'/users/' + nickname + '/newblog?nodropdown" ' + \
'accesskey="' + accessKeys['menuNewPost'] + '">' + \
'accesskey="' + access_keys['menuNewPost'] + '">' + \
'<img class="' + editImageClass + \
'" loading="lazy" alt="' + \
titleStr + '" title="' + \
@ -360,16 +360,17 @@ def html_citations(base_dir: str, nickname: str, domain: str,
citationsSelected.append(dateStr)
# the css filename
cssFilename = base_dir + '/epicyon-profile.css'
css_filename = base_dir + '/epicyon-profile.css'
if os.path.isfile(base_dir + '/epicyon.css'):
cssFilename = base_dir + '/epicyon.css'
css_filename = base_dir + '/epicyon.css'
instanceTitle = \
instance_title = \
get_config_param(base_dir, 'instanceTitle')
htmlStr = html_header_with_external_style(cssFilename, instanceTitle, None)
htmlStr = \
html_header_with_external_style(css_filename, instance_title, None)
# top banner
bannerFile, bannerFilename = \
banner_file, banner_filename = \
get_banner_file(base_dir, nickname, domain, theme)
htmlStr += \
'<a href="/users/' + nickname + '/newblog" title="' + \
@ -377,7 +378,7 @@ def html_citations(base_dir: str, nickname: str, domain: str,
translate['Go Back'] + '">\n'
htmlStr += '<img loading="lazy" class="timeline-banner" ' + \
'alt="" src="' + \
'/users/' + nickname + '/' + bannerFile + '" /></a>\n'
'/users/' + nickname + '/' + banner_file + '" /></a>\n'
htmlStr += \
'<form enctype="multipart/form-data" method="POST" ' + \
@ -457,15 +458,15 @@ def html_newswire_mobile(css_cache: {}, base_dir: str, nickname: str,
icons_as_buttons: bool,
defaultTimeline: str,
theme: str,
accessKeys: {}) -> str:
access_keys: {}) -> str:
"""Shows the mobile version of the newswire right column
"""
htmlStr = ''
# the css filename
cssFilename = base_dir + '/epicyon-profile.css'
css_filename = base_dir + '/epicyon-profile.css'
if os.path.isfile(base_dir + '/epicyon.css'):
cssFilename = base_dir + '/epicyon.css'
css_filename = base_dir + '/epicyon.css'
if nickname == 'news':
editor = False
@ -479,18 +480,19 @@ def html_newswire_mobile(css_cache: {}, base_dir: str, nickname: str,
showPublishButton = editor
instanceTitle = \
instance_title = \
get_config_param(base_dir, 'instanceTitle')
htmlStr = html_header_with_external_style(cssFilename, instanceTitle, None)
htmlStr = \
html_header_with_external_style(css_filename, instance_title, None)
bannerFile, bannerFilename = \
banner_file, banner_filename = \
get_banner_file(base_dir, nickname, domain, theme)
htmlStr += \
'<a href="/users/' + nickname + '/' + defaultTimeline + '" ' + \
'accesskey="' + accessKeys['menuTimeline'] + '">' + \
'accesskey="' + access_keys['menuTimeline'] + '">' + \
'<img loading="lazy" class="timeline-banner" ' + \
'alt="' + translate['Timeline banner image'] + '" ' + \
'src="/users/' + nickname + '/' + bannerFile + '" /></a>\n'
'src="/users/' + nickname + '/' + banner_file + '" /></a>\n'
htmlStr += '<div class="col-right-mobile">\n'
@ -506,7 +508,7 @@ def html_newswire_mobile(css_cache: {}, base_dir: str, nickname: str,
False, timelinePath, showPublishButton,
show_publish_as_icon, rss_icon_at_top, False,
authorized, False, theme,
defaultTimeline, accessKeys)
defaultTimeline, access_keys)
if editor and not newswire:
htmlStr += '<br><br><br>\n'
htmlStr += '<center>\n '
@ -522,7 +524,7 @@ def html_newswire_mobile(css_cache: {}, base_dir: str, nickname: str,
def html_edit_newswire(css_cache: {}, translate: {}, base_dir: str, path: str,
domain: str, port: int, http_prefix: str,
defaultTimeline: str, theme: str,
accessKeys: {}) -> str:
access_keys: {}) -> str:
"""Shows the edit newswire screen
"""
if '/users/' not in path:
@ -538,18 +540,18 @@ def html_edit_newswire(css_cache: {}, translate: {}, base_dir: str, path: str,
if not is_moderator(base_dir, nickname):
return ''
cssFilename = base_dir + '/epicyon-links.css'
css_filename = base_dir + '/epicyon-links.css'
if os.path.isfile(base_dir + '/links.css'):
cssFilename = base_dir + '/links.css'
css_filename = base_dir + '/links.css'
# filename of the banner shown at the top
bannerFile, bannerFilename = \
banner_file, banner_filename = \
get_banner_file(base_dir, nickname, domain, theme)
instanceTitle = \
instance_title = \
get_config_param(base_dir, 'instanceTitle')
editNewswireForm = \
html_header_with_external_style(cssFilename, instanceTitle, None)
html_header_with_external_style(css_filename, instance_title, None)
# top banner
editNewswireForm += \
@ -557,9 +559,9 @@ def html_edit_newswire(css_cache: {}, translate: {}, base_dir: str, path: str,
'<a href="/users/' + nickname + '/' + defaultTimeline + '" title="' + \
translate['Switch to timeline view'] + '" alt="' + \
translate['Switch to timeline view'] + '" ' + \
'accesskey="' + accessKeys['menuTimeline'] + '">\n'
'accesskey="' + access_keys['menuTimeline'] + '">\n'
editNewswireForm += '<img loading="lazy" class="timeline-banner" src="' + \
'/users/' + nickname + '/' + bannerFile + '" ' + \
'/users/' + nickname + '/' + banner_file + '" ' + \
'alt="" /></a>\n</header>'
editNewswireForm += \
@ -574,7 +576,7 @@ def html_edit_newswire(css_cache: {}, translate: {}, base_dir: str, path: str,
editNewswireForm += \
' <input type="submit" name="submitNewswire" value="' + \
translate['Submit'] + '" ' + \
'accesskey="' + accessKeys['submitButton'] + '">\n'
'accesskey="' + access_keys['submitButton'] + '">\n'
editNewswireForm += \
' </div>\n'
@ -668,14 +670,14 @@ def html_edit_news_post(css_cache: {}, translate: {}, base_dir: str, path: str,
if not post_json_object:
return ''
cssFilename = base_dir + '/epicyon-links.css'
css_filename = base_dir + '/epicyon-links.css'
if os.path.isfile(base_dir + '/links.css'):
cssFilename = base_dir + '/links.css'
css_filename = base_dir + '/links.css'
instanceTitle = \
instance_title = \
get_config_param(base_dir, 'instanceTitle')
editNewsPostForm = \
html_header_with_external_style(cssFilename, instanceTitle, None)
html_header_with_external_style(css_filename, instance_title, None)
editNewsPostForm += \
'<form enctype="multipart/form-data" method="POST" ' + \
'accept-charset="UTF-8" action="' + path + '/newseditdata">\n'

View File

@ -56,14 +56,14 @@ def html_confirm_delete(css_cache: {},
return None
delete_postStr = None
cssFilename = base_dir + '/epicyon-profile.css'
css_filename = base_dir + '/epicyon-profile.css'
if os.path.isfile(base_dir + '/epicyon.css'):
cssFilename = base_dir + '/epicyon.css'
css_filename = base_dir + '/epicyon.css'
instanceTitle = \
get_config_param(base_dir, 'instanceTitle')
delete_postStr = \
html_header_with_external_style(cssFilename, instanceTitle, None)
html_header_with_external_style(css_filename, instanceTitle, None)
delete_postStr += \
individual_post_as_html(signing_priv_key_pem,
True, recent_posts_cache, max_recent_posts,
@ -135,12 +135,12 @@ def html_confirm_remove_shared_item(css_cache: {}, translate: {},
set_custom_background(base_dir, 'shares-background', 'follow-background')
cssFilename = base_dir + '/epicyon-follow.css'
css_filename = base_dir + '/epicyon-follow.css'
if os.path.isfile(base_dir + '/follow.css'):
cssFilename = base_dir + '/follow.css'
css_filename = base_dir + '/follow.css'
instanceTitle = get_config_param(base_dir, 'instanceTitle')
sharesStr = html_header_with_external_style(cssFilename,
sharesStr = html_header_with_external_style(css_filename,
instanceTitle, None)
sharesStr += '<div class="follow">\n'
sharesStr += ' <div class="followAvatar">\n'
@ -189,12 +189,12 @@ def html_confirm_follow(css_cache: {}, translate: {}, base_dir: str,
copyfile(base_dir + '/accounts/follow-background-custom.jpg',
base_dir + '/accounts/follow-background.jpg')
cssFilename = base_dir + '/epicyon-follow.css'
css_filename = base_dir + '/epicyon-follow.css'
if os.path.isfile(base_dir + '/follow.css'):
cssFilename = base_dir + '/follow.css'
css_filename = base_dir + '/follow.css'
instanceTitle = get_config_param(base_dir, 'instanceTitle')
followStr = html_header_with_external_style(cssFilename,
followStr = html_header_with_external_style(css_filename,
instanceTitle, None)
followStr += '<div class="follow">\n'
followStr += ' <div class="followAvatar">\n'
@ -235,12 +235,12 @@ def html_confirm_unfollow(css_cache: {}, translate: {}, base_dir: str,
copyfile(base_dir + '/accounts/follow-background-custom.jpg',
base_dir + '/accounts/follow-background.jpg')
cssFilename = base_dir + '/epicyon-follow.css'
css_filename = base_dir + '/epicyon-follow.css'
if os.path.isfile(base_dir + '/follow.css'):
cssFilename = base_dir + '/follow.css'
css_filename = base_dir + '/follow.css'
instanceTitle = get_config_param(base_dir, 'instanceTitle')
followStr = html_header_with_external_style(cssFilename,
followStr = html_header_with_external_style(css_filename,
instanceTitle, None)
followStr += '<div class="follow">\n'
followStr += ' <div class="followAvatar">\n'
@ -279,12 +279,12 @@ def html_confirm_unblock(css_cache: {}, translate: {}, base_dir: str,
set_custom_background(base_dir, 'block-background', 'follow-background')
cssFilename = base_dir + '/epicyon-follow.css'
css_filename = base_dir + '/epicyon-follow.css'
if os.path.isfile(base_dir + '/follow.css'):
cssFilename = base_dir + '/follow.css'
css_filename = base_dir + '/follow.css'
instanceTitle = get_config_param(base_dir, 'instanceTitle')
blockStr = html_header_with_external_style(cssFilename,
blockStr = html_header_with_external_style(css_filename,
instanceTitle, None)
blockStr += '<div class="block">\n'
blockStr += ' <div class="blockAvatar">\n'

View File

@ -80,7 +80,7 @@ def _html_new_post_drop_down(scopeIcon: str, scopeDescription: str,
dropdownReminderSuffix: str,
dropdownReportSuffix: str,
noDropDown: bool,
accessKeys: {}) -> str:
access_keys: {}) -> str:
"""Returns the html for a drop down list of new post types
"""
dropDownContent = '<nav><div class="newPostDropdown">\n'
@ -100,7 +100,7 @@ def _html_new_post_drop_down(scopeIcon: str, scopeDescription: str,
if showPublicOnDropdown:
dropDownContent += \
'<li><a href="' + pathBase + dropdownNewPostSuffix + \
'" accesskey="' + accessKeys['Public'] + '">' + \
'" accesskey="' + access_keys['Public'] + '">' + \
'<img loading="lazy" alt="" title="" src="/' + \
'icons/scope_public.png"/><b>' + \
translate['Public'] + '</b><br>' + \
@ -108,7 +108,7 @@ def _html_new_post_drop_down(scopeIcon: str, scopeDescription: str,
if defaultTimeline == 'tlfeatures':
dropDownContent += \
'<li><a href="' + pathBase + dropdownNewBlogSuffix + \
'" accesskey="' + accessKeys['menuBlogs'] + '">' + \
'" accesskey="' + access_keys['menuBlogs'] + '">' + \
'<img loading="lazy" alt="" title="" src="/' + \
'icons/scope_blog.png"/><b>' + \
translate['Article'] + '</b><br>' + \
@ -116,7 +116,7 @@ def _html_new_post_drop_down(scopeIcon: str, scopeDescription: str,
else:
dropDownContent += \
'<li><a href="' + pathBase + dropdownNewBlogSuffix + \
'" accesskey="' + accessKeys['menuBlogs'] + '">' + \
'" accesskey="' + access_keys['menuBlogs'] + '">' + \
'<img loading="lazy" alt="" title="" src="/' + \
'icons/scope_blog.png"/><b>' + \
translate['Blog'] + '</b><br>' + \
@ -129,14 +129,14 @@ def _html_new_post_drop_down(scopeIcon: str, scopeDescription: str,
translate['Not on public timeline'] + '</a></li>\n'
dropDownContent += \
'<li><a href="' + pathBase + dropdownFollowersSuffix + \
'" accesskey="' + accessKeys['menuFollowers'] + '">' + \
'" accesskey="' + access_keys['menuFollowers'] + '">' + \
'<img loading="lazy" alt="" title="" src="/' + \
'icons/scope_followers.png"/><b>' + \
translate['Followers'] + '</b><br>' + \
translate['Only to followers'] + '</a></li>\n'
dropDownContent += \
'<li><a href="' + pathBase + dropdownDMSuffix + \
'" accesskey="' + accessKeys['menuDM'] + '">' + \
'" accesskey="' + access_keys['menuDM'] + '">' + \
'<img loading="lazy" alt="" title="" src="/' + \
'icons/scope_dm.png"/><b>' + \
translate['DM'] + '</b><br>' + \
@ -144,14 +144,14 @@ def _html_new_post_drop_down(scopeIcon: str, scopeDescription: str,
dropDownContent += \
'<li><a href="' + pathBase + dropdownReminderSuffix + \
'" accesskey="' + accessKeys['Reminder'] + '">' + \
'" accesskey="' + access_keys['Reminder'] + '">' + \
'<img loading="lazy" alt="" title="" src="/' + \
'icons/scope_reminder.png"/><b>' + \
translate['Reminder'] + '</b><br>' + \
translate['Scheduled note to yourself'] + '</a></li>\n'
dropDownContent += \
'<li><a href="' + pathBase + dropdownReportSuffix + \
'" accesskey="' + accessKeys['reportButton'] + '">' + \
'" accesskey="' + access_keys['reportButton'] + '">' + \
'<img loading="lazy" alt="" title="" src="/' + \
'icons/scope_report.png"/><b>' + \
translate['Report'] + '</b><br>' + \
@ -160,14 +160,14 @@ def _html_new_post_drop_down(scopeIcon: str, scopeDescription: str,
if not replyStr:
dropDownContent += \
'<li><a href="' + pathBase + \
'/newshare" accesskey="' + accessKeys['menuShares'] + '">' + \
'/newshare" accesskey="' + access_keys['menuShares'] + '">' + \
'<img loading="lazy" alt="" title="" src="/' + \
'icons/scope_share.png"/><b>' + \
translate['Shares'] + '</b><br>' + \
translate['Describe a shared item'] + '</a></li>\n'
dropDownContent += \
'<li><a href="' + pathBase + \
'/newwanted" accesskey="' + accessKeys['menuWanted'] + '">' + \
'/newwanted" accesskey="' + access_keys['menuWanted'] + '">' + \
'<img loading="lazy" alt="" title="" src="/' + \
'icons/scope_wanted.png"/><b>' + \
translate['Wanted'] + '</b><br>' + \
@ -195,7 +195,7 @@ def html_new_post(css_cache: {}, media_instance: bool, translate: {},
domain_full: str,
defaultTimeline: str, newswire: {},
theme: str, noDropDown: bool,
accessKeys: {}, customSubmitText: str,
access_keys: {}, customSubmitText: str,
conversationId: str,
recent_posts_cache: {}, max_recent_posts: int,
session, cached_webfingers: {},
@ -239,7 +239,7 @@ def html_new_post(css_cache: {}, media_instance: bool, translate: {},
messageBoxHeight = 400
# filename of the banner shown at the top
bannerFile, bannerFilename = \
banner_file, banner_filename = \
get_banner_file(base_dir, nickname, domain, theme)
if not path.endswith('/newshare') and not path.endswith('/newwanted'):
@ -345,9 +345,9 @@ def html_new_post(css_cache: {}, media_instance: bool, translate: {},
newPostText = \
'<p>' + file.read() + '</p>\n'
cssFilename = base_dir + '/epicyon-profile.css'
css_filename = base_dir + '/epicyon-profile.css'
if os.path.isfile(base_dir + '/epicyon.css'):
cssFilename = base_dir + '/epicyon.css'
css_filename = base_dir + '/epicyon.css'
if '?' in path:
path = path.split('?')[0]
@ -638,7 +638,7 @@ def html_new_post(css_cache: {}, media_instance: bool, translate: {},
dateAndLocation += '</div>\n'
instanceTitle = get_config_param(base_dir, 'instanceTitle')
newPostForm = html_header_with_external_style(cssFilename,
newPostForm = html_header_with_external_style(css_filename,
instanceTitle, None)
newPostForm += \
@ -646,9 +646,9 @@ def html_new_post(css_cache: {}, media_instance: bool, translate: {},
'<a href="/users/' + nickname + '/' + defaultTimeline + '" title="' + \
translate['Switch to timeline view'] + '" alt="' + \
translate['Switch to timeline view'] + '" ' + \
'accesskey="' + accessKeys['menuTimeline'] + '">\n'
'accesskey="' + access_keys['menuTimeline'] + '">\n'
newPostForm += '<img loading="lazy" class="timeline-banner" src="' + \
'/users/' + nickname + '/' + bannerFile + '" alt="" /></a>\n' + \
'/users/' + nickname + '/' + banner_file + '" alt="" /></a>\n' + \
'</header>\n'
mentionsStr = ''
@ -721,7 +721,7 @@ def html_new_post(css_cache: {}, media_instance: bool, translate: {},
dropdownDMSuffix,
dropdownReminderSuffix,
dropdownReportSuffix,
noDropDown, accessKeys)
noDropDown, access_keys)
else:
if not shareDescription:
# reporting a post to moderator
@ -771,7 +771,7 @@ def html_new_post(css_cache: {}, media_instance: bool, translate: {},
newPostForm += \
' <td><input type="submit" name="submitPost" value="' + \
submitText + '" ' + \
'accesskey="' + accessKeys['submitButton'] + '"></td>\n'
'accesskey="' + access_keys['submitButton'] + '"></td>\n'
newPostForm += ' </tr>\n</table>\n'
newPostForm += ' </div>\n'

View File

@ -109,7 +109,7 @@ def html_front_screen(signing_priv_key_pem: str,
newswire: {}, theme: str,
peertube_instances: [],
allow_local_network_access: bool,
accessKeys: {},
access_keys: {},
system_language: str, max_like_count: int,
shared_items_federated_domains: [],
extraJson: {},
@ -135,11 +135,11 @@ def html_front_screen(signing_priv_key_pem: str,
icons_as_buttons)
# If this is the news account then show a different banner
bannerFile, bannerFilename = \
banner_file, banner_filename = \
get_banner_file(base_dir, nickname, domain, theme)
profileHeaderStr = \
'<img loading="lazy" class="timeline-banner" ' + \
'src="/users/' + nickname + '/' + bannerFile + '" />\n'
'src="/users/' + nickname + '/' + banner_file + '" />\n'
if loginButton:
profileHeaderStr += '<center>' + loginButton + '</center>\n'
@ -158,7 +158,7 @@ def html_front_screen(signing_priv_key_pem: str,
http_prefix, translate,
False, False,
False, None, rss_icon_at_top, True,
True, theme, accessKeys,
True, theme, access_keys,
shared_items_federated_domains)
profileHeaderStr += \
' </td>\n' + \
@ -166,12 +166,12 @@ def html_front_screen(signing_priv_key_pem: str,
profileStr = profileHeaderStr
cssFilename = base_dir + '/epicyon-profile.css'
css_filename = base_dir + '/epicyon-profile.css'
if os.path.isfile(base_dir + '/epicyon.css'):
cssFilename = base_dir + '/epicyon.css'
css_filename = base_dir + '/epicyon.css'
licenseStr = ''
bannerFile, bannerFilename = \
banner_file, banner_filename = \
get_banner_file(base_dir, nickname, domain, theme)
profileStr += \
_html_front_screen_posts(recent_posts_cache, max_recent_posts,
@ -199,7 +199,7 @@ def html_front_screen(signing_priv_key_pem: str,
False, False, newswire, False,
False, None, False, False,
False, True, authorized, True, theme,
defaultTimeline, accessKeys)
defaultTimeline, access_keys)
profileFooterStr += \
' </td>\n' + \
' </tr>\n' + \
@ -209,6 +209,6 @@ def html_front_screen(signing_priv_key_pem: str,
instanceTitle = \
get_config_param(base_dir, 'instanceTitle')
profileStr = \
html_header_with_external_style(cssFilename, instanceTitle, None) + \
html_header_with_external_style(css_filename, instanceTitle, None) + \
profileStr + profileFooterStr + html_footer()
return profileStr

View File

@ -203,13 +203,14 @@ def html_search_hashtag_category(css_cache: {}, translate: {},
set_custom_background(base_dir, 'search-background', 'follow-background')
cssFilename = base_dir + '/epicyon-search.css'
css_filename = base_dir + '/epicyon-search.css'
if os.path.isfile(base_dir + '/search.css'):
cssFilename = base_dir + '/search.css'
css_filename = base_dir + '/search.css'
instanceTitle = \
get_config_param(base_dir, 'instanceTitle')
htmlStr = html_header_with_external_style(cssFilename, instanceTitle, None)
htmlStr = \
html_header_with_external_style(css_filename, instanceTitle, None)
# show a banner above the search box
searchBannerFile, searchBannerFilename = \

View File

@ -47,7 +47,7 @@ def header_buttons_timeline(defaultTimeline: str,
calendarImage: str,
followApprovals: str,
icons_as_buttons: bool,
accessKeys: {}) -> str:
access_keys: {}) -> str:
"""Returns the header at the top of the timeline, containing
buttons for inbox, outbox, search, calendar, etc
"""
@ -57,7 +57,7 @@ def header_buttons_timeline(defaultTimeline: str,
if defaultTimeline == 'tlmedia':
tlStr += \
'<a href="' + usersPath + '/tlmedia" tabindex="-1" ' + \
'accesskey="' + accessKeys['menuMedia'] + '"' + \
'accesskey="' + access_keys['menuMedia'] + '"' + \
'><button class="' + \
mediaButton + '"><span>' + translate['Media'] + \
'</span></button></a>'
@ -106,7 +106,7 @@ def header_buttons_timeline(defaultTimeline: str,
if not minimal and not featuresHeader:
tlStr += \
'<a href="' + usersPath + '/tlmedia" tabindex="-1" ' + \
'accesskey="' + accessKeys['menuMedia'] + '">' + \
'accesskey="' + access_keys['menuMedia'] + '">' + \
'<button class="' + \
mediaButton + '"><span>' + translate['Media'] + \
'</span></button></a>'
@ -234,9 +234,9 @@ def header_buttons_timeline(defaultTimeline: str,
'</span></button></a>'
# benchmark 5
timeDiff = int((time.time() - timelineStartTime) * 1000)
if timeDiff > 100:
print('TIMELINE TIMING ' + boxName + ' 5 = ' + str(timeDiff))
time_diff = int((time.time() - timelineStartTime) * 1000)
if time_diff > 100:
print('TIMELINE TIMING ' + boxName + ' 5 = ' + str(time_diff))
# the calendar button
if not featuresHeader:

View File

@ -113,9 +113,9 @@ def html_login(css_cache: {}, translate: {},
with open(base_dir + '/accounts/login.txt', 'r') as file:
loginText = '<p class="login-text">' + file.read() + '</p>'
cssFilename = base_dir + '/epicyon-login.css'
css_filename = base_dir + '/epicyon-login.css'
if os.path.isfile(base_dir + '/login.css'):
cssFilename = base_dir + '/login.css'
css_filename = base_dir + '/login.css'
# show the register button
registerButtonStr = ''
@ -151,7 +151,7 @@ def html_login(css_cache: {}, translate: {},
instanceTitle = \
get_config_param(base_dir, 'instanceTitle')
loginForm = \
html_header_with_website_markup(cssFilename, instanceTitle,
html_header_with_website_markup(css_filename, instanceTitle,
http_prefix, domain,
system_language)

View File

@ -50,7 +50,7 @@ def html_moderation(css_cache: {}, defaultTimeline: str,
theme: str, peertube_instances: [],
allow_local_network_access: bool,
text_mode_banner: str,
accessKeys: {}, system_language: str,
access_keys: {}, system_language: str,
max_like_count: int,
shared_items_federated_domains: [],
signing_priv_key_pem: str,
@ -77,7 +77,7 @@ def html_moderation(css_cache: {}, defaultTimeline: str,
publish_button_at_top,
authorized, moderationActionStr, theme,
peertube_instances, allow_local_network_access,
text_mode_banner, accessKeys, system_language,
text_mode_banner, access_keys, system_language,
max_like_count, shared_items_federated_domains,
signing_priv_key_pem, cw_lists, lists_enabled)
@ -95,14 +95,14 @@ def html_account_info(css_cache: {}, translate: {},
msgStr1 = 'This account interacts with the following instances'
infoForm = ''
cssFilename = base_dir + '/epicyon-profile.css'
css_filename = base_dir + '/epicyon-profile.css'
if os.path.isfile(base_dir + '/epicyon.css'):
cssFilename = base_dir + '/epicyon.css'
css_filename = base_dir + '/epicyon.css'
instanceTitle = \
get_config_param(base_dir, 'instanceTitle')
infoForm = \
html_header_with_external_style(cssFilename, instanceTitle, None)
html_header_with_external_style(css_filename, instanceTitle, None)
searchNickname = get_nickname_from_actor(searchHandle)
searchDomain, searchPort = get_domain_from_actor(searchHandle)
@ -284,13 +284,13 @@ def html_moderation_info(css_cache: {}, translate: {},
'Any blocks or suspensions made by moderators will be shown here.'
infoForm = ''
cssFilename = base_dir + '/epicyon-profile.css'
css_filename = base_dir + '/epicyon-profile.css'
if os.path.isfile(base_dir + '/epicyon.css'):
cssFilename = base_dir + '/epicyon.css'
css_filename = base_dir + '/epicyon.css'
instanceTitle = \
get_config_param(base_dir, 'instanceTitle')
infoForm = html_header_with_external_style(cssFilename,
infoForm = html_header_with_external_style(css_filename,
instanceTitle, None)
infoForm += \

View File

@ -61,7 +61,7 @@ def html_person_options(defaultTimeline: str,
text_mode_banner: str,
news_instance: bool,
authorized: bool,
accessKeys: {},
access_keys: {},
isGroup: bool) -> str:
"""Show options for a person: view/follow/block/report
"""
@ -111,9 +111,9 @@ def html_person_options(defaultTimeline: str,
optionsLinkStr = \
' <input type="hidden" name="postUrl" value="' + \
optionsLink + '">\n'
cssFilename = base_dir + '/epicyon-options.css'
css_filename = base_dir + '/epicyon-options.css'
if os.path.isfile(base_dir + '/options.css'):
cssFilename = base_dir + '/options.css'
css_filename = base_dir + '/options.css'
# To snooze, or not to snooze? That is the question
snoozeButtonStr = 'Snooze'
@ -131,7 +131,7 @@ def html_person_options(defaultTimeline: str,
instanceTitle = \
get_config_param(base_dir, 'instanceTitle')
optionsStr = \
html_header_with_external_style(cssFilename, instanceTitle, None)
html_header_with_external_style(css_filename, instanceTitle, None)
optionsStr += html_keyboard_navigation(text_mode_banner, {}, {})
optionsStr += '<br><br>\n'
optionsStr += '<div class="options">\n'
@ -255,7 +255,7 @@ def html_person_options(defaultTimeline: str,
' ' + translate['Petname'] + ': \n' + \
' <input type="text" name="optionpetname" value="' + \
petname + '" ' + \
'accesskey="' + accessKeys['enterPetname'] + '">\n' \
'accesskey="' + access_keys['enterPetname'] + '">\n' \
' <button type="submit" class="buttonsmall" ' + \
'name="submitPetname">' + \
translate['Submit'] + '</button><br>\n'
@ -291,8 +291,8 @@ def html_person_options(defaultTimeline: str,
# checkbox for permission to post to newswire
newswirePostsPermitted = False
if optionsDomainFull == domain_full:
adminNickname = get_config_param(base_dir, 'admin')
if (nickname == adminNickname or
admin_nickname = get_config_param(base_dir, 'admin')
if (nickname == admin_nickname or
(is_moderator(base_dir, nickname) and
not is_moderator(base_dir, optionsNickname))):
newswireBlockedFilename = \
@ -332,8 +332,8 @@ def html_person_options(defaultTimeline: str,
# checkbox for permission to post to featured articles
if news_instance and optionsDomainFull == domain_full:
adminNickname = get_config_param(base_dir, 'admin')
if (nickname == adminNickname or
admin_nickname = get_config_param(base_dir, 'admin')
if (nickname == admin_nickname or
(is_moderator(base_dir, nickname) and
not is_moderator(base_dir, optionsNickname))):
checkboxStr = \
@ -359,50 +359,51 @@ def html_person_options(defaultTimeline: str,
optionsStr += \
' <a href="' + backPath + '"><button type="button" ' + \
'class="buttonIcon" name="submitBack" ' + \
'accesskey="' + accessKeys['menuTimeline'] + '">' + \
'accesskey="' + access_keys['menuTimeline'] + '">' + \
translate['Go Back'] + '</button></a>\n'
else:
optionsStr += \
' <a href="' + originPathStr + '"><button type="button" ' + \
'class="buttonIcon" name="submitBack" accesskey="' + \
accessKeys['menuTimeline'] + '">' + translate['Go Back'] + \
access_keys['menuTimeline'] + '">' + translate['Go Back'] + \
'</button></a>\n'
if authorized:
optionsStr += \
' <button type="submit" class="button" ' + \
'name="submitView" accesskey="' + \
accessKeys['viewButton'] + '">' + \
access_keys['viewButton'] + '">' + \
translate['View'] + '</button>\n'
optionsStr += donateStr
if authorized:
optionsStr += \
' <button type="submit" class="button" name="submit' + \
followStr + '" accesskey="' + accessKeys['followButton'] + '">' + \
followStr + \
'" accesskey="' + access_keys['followButton'] + '">' + \
translate[followStr] + '</button>\n'
optionsStr += \
' <button type="submit" class="button" name="submit' + \
blockStr + '" accesskey="' + accessKeys['blockButton'] + '">' + \
blockStr + '" accesskey="' + access_keys['blockButton'] + '">' + \
translate[blockStr] + '</button>\n'
optionsStr += \
' <button type="submit" class="button" name="submitDM" ' + \
'accesskey="' + accessKeys['menuDM'] + '">' + \
'accesskey="' + access_keys['menuDM'] + '">' + \
translate['DM'] + '</button>\n'
optionsStr += \
' <button type="submit" class="button" name="submit' + \
snoozeButtonStr + '" accesskey="' + \
accessKeys['snoozeButton'] + '">' + translate[snoozeButtonStr] + \
access_keys['snoozeButton'] + '">' + translate[snoozeButtonStr] + \
'</button>\n'
optionsStr += \
' <button type="submit" class="button" ' + \
'name="submitReport" accesskey="' + \
accessKeys['reportButton'] + '">' + \
access_keys['reportButton'] + '">' + \
translate['Report'] + '</button>\n'
if is_moderator(base_dir, nickname):
optionsStr += \
' <button type="submit" class="button" ' + \
'name="submitPersonInfo" accesskey="' + \
accessKeys['infoButton'] + '">' + \
access_keys['infoButton'] + '">' + \
translate['Info'] + '</button>\n'
personNotes = ''
@ -422,7 +423,7 @@ def html_person_options(defaultTimeline: str,
optionsStr += \
' <textarea id="message" ' + \
'name="optionnotes" style="height:400px" spellcheck="true" ' + \
'accesskey="' + accessKeys['enterNotes'] + '">' + \
'accesskey="' + access_keys['enterNotes'] + '">' + \
personNotes + '</textarea>\n'
optionsStr += \

View File

@ -179,9 +179,9 @@ def _log_post_timing(enableTimingLog: bool, postStartTime,
"""
if not enableTimingLog:
return
timeDiff = int((time.time() - postStartTime) * 1000)
if timeDiff > 100:
print('TIMING INDIV ' + debugId + ' = ' + str(timeDiff))
time_diff = int((time.time() - postStartTime) * 1000)
if time_diff > 100:
print('TIMING INDIV ' + debugId + ' = ' + str(time_diff))
def prepare_html_post_nickname(nickname: str, postHtml: str) -> str:
@ -2153,14 +2153,14 @@ def html_individual_post(css_cache: {},
False, authorized,
False, False, False, False,
cw_lists, lists_enabled)
cssFilename = base_dir + '/epicyon-profile.css'
css_filename = base_dir + '/epicyon-profile.css'
if os.path.isfile(base_dir + '/epicyon.css'):
cssFilename = base_dir + '/epicyon.css'
css_filename = base_dir + '/epicyon.css'
instanceTitle = \
get_config_param(base_dir, 'instanceTitle')
metadataStr = _html_post_metadata_open_graph(domain, originalPostJson)
headerStr = html_header_with_external_style(cssFilename,
headerStr = html_header_with_external_style(css_filename,
instanceTitle, metadataStr)
return headerStr + postStr + html_footer()
@ -2206,14 +2206,14 @@ def html_post_replies(css_cache: {},
False, False,
cw_lists, lists_enabled)
cssFilename = base_dir + '/epicyon-profile.css'
css_filename = base_dir + '/epicyon-profile.css'
if os.path.isfile(base_dir + '/epicyon.css'):
cssFilename = base_dir + '/epicyon.css'
css_filename = base_dir + '/epicyon.css'
instanceTitle = get_config_param(base_dir, 'instanceTitle')
metadata = ''
headerStr = \
html_header_with_external_style(cssFilename, instanceTitle, metadata)
html_header_with_external_style(css_filename, instanceTitle, metadata)
return headerStr + repliesStr + html_footer()
@ -2280,18 +2280,18 @@ def html_emoji_reaction_picker(css_cache: {},
' <a href="' + emojiUrl + '">' + emojiLabel + '</a>\n'
emojiPicksStr += '</div>\n'
cssFilename = base_dir + '/epicyon-profile.css'
css_filename = base_dir + '/epicyon-profile.css'
if os.path.isfile(base_dir + '/epicyon.css'):
cssFilename = base_dir + '/epicyon.css'
css_filename = base_dir + '/epicyon.css'
# filename of the banner shown at the top
bannerFile, _ = \
banner_file, _ = \
get_banner_file(base_dir, nickname, domain, theme_name)
instanceTitle = get_config_param(base_dir, 'instanceTitle')
metadata = ''
headerStr = \
html_header_with_external_style(cssFilename, instanceTitle, metadata)
html_header_with_external_style(css_filename, instanceTitle, metadata)
# banner
headerStr += \
@ -2302,7 +2302,7 @@ def html_emoji_reaction_picker(css_cache: {},
translate['Switch to timeline view'] + '">\n'
headerStr += '<img loading="lazy" class="timeline-banner" ' + \
'alt="" ' + \
'src="/users/' + nickname + '/' + bannerFile + '" /></a>\n' + \
'src="/users/' + nickname + '/' + banner_file + '" /></a>\n' + \
'</header>\n'
return headerStr + reactedToPostStr + emojiPicksStr + html_footer()

View File

@ -54,9 +54,9 @@ def html_search_emoji(css_cache: {}, translate: {},
base_dir + '/emoji/emoji.json')
searchStr = searchStr.lower().replace(':', '').strip('\n').strip('\r')
cssFilename = base_dir + '/epicyon-profile.css'
css_filename = base_dir + '/epicyon-profile.css'
if os.path.isfile(base_dir + '/epicyon.css'):
cssFilename = base_dir + '/epicyon.css'
css_filename = base_dir + '/epicyon.css'
emojiLookupFilename = base_dir + '/emoji/emoji.json'
customEmojiLookupFilename = base_dir + '/emojicustom/emoji.json'
@ -65,7 +65,7 @@ def html_search_emoji(css_cache: {}, translate: {},
instanceTitle = \
get_config_param(base_dir, 'instanceTitle')
emojiForm = \
html_header_with_external_style(cssFilename, instanceTitle, None)
html_header_with_external_style(css_filename, instanceTitle, None)
emojiForm += '<center><h1>' + \
translate['Emoji Search'] + \
'</h1></center>'
@ -235,14 +235,14 @@ def html_search_shared_items(css_cache: {}, translate: {},
searchStrLower = urllib.parse.unquote(searchStr)
searchStrLower = searchStrLower.lower().strip('\n').strip('\r')
searchStrLowerList = searchStrLower.split('+')
cssFilename = base_dir + '/epicyon-profile.css'
css_filename = base_dir + '/epicyon-profile.css'
if os.path.isfile(base_dir + '/epicyon.css'):
cssFilename = base_dir + '/epicyon.css'
css_filename = base_dir + '/epicyon.css'
instanceTitle = \
get_config_param(base_dir, 'instanceTitle')
sharedItemsForm = \
html_header_with_external_style(cssFilename, instanceTitle, None)
html_header_with_external_style(css_filename, instanceTitle, None)
if sharesFileType == 'shares':
titleStr = translate['Shared Items Search']
else:
@ -342,14 +342,14 @@ def html_search_emoji_text_entry(css_cache: {}, translate: {},
set_custom_background(base_dir, 'search-background', 'follow-background')
cssFilename = base_dir + '/epicyon-follow.css'
css_filename = base_dir + '/epicyon-follow.css'
if os.path.isfile(base_dir + '/follow.css'):
cssFilename = base_dir + '/follow.css'
css_filename = base_dir + '/follow.css'
instanceTitle = \
get_config_param(base_dir, 'instanceTitle')
emojiStr = \
html_header_with_external_style(cssFilename, instanceTitle, None)
html_header_with_external_style(css_filename, instanceTitle, None)
emojiStr += '<div class="follow">\n'
emojiStr += ' <div class="followAvatar">\n'
emojiStr += ' <center>\n'
@ -375,7 +375,7 @@ def html_search_emoji_text_entry(css_cache: {}, translate: {},
def html_search(css_cache: {}, translate: {},
base_dir: str, path: str, domain: str,
defaultTimeline: str, theme: str,
text_mode_banner: str, accessKeys: {}) -> str:
text_mode_banner: str, access_keys: {}) -> str:
"""Search called from the timeline icon
"""
actor = path.replace('/search', '')
@ -383,13 +383,13 @@ def html_search(css_cache: {}, translate: {},
set_custom_background(base_dir, 'search-background', 'follow-background')
cssFilename = base_dir + '/epicyon-search.css'
css_filename = base_dir + '/epicyon-search.css'
if os.path.isfile(base_dir + '/search.css'):
cssFilename = base_dir + '/search.css'
css_filename = base_dir + '/search.css'
instanceTitle = get_config_param(base_dir, 'instanceTitle')
followStr = \
html_header_with_external_style(cssFilename, instanceTitle, None)
html_header_with_external_style(css_filename, instanceTitle, None)
# show a banner above the search box
searchBannerFile, searchBannerFilename = \
@ -400,7 +400,7 @@ def html_search(css_cache: {}, translate: {},
text_mode_bannerStr = ''
if os.path.isfile(searchBannerFilename):
timelineKey = accessKeys['menuTimeline']
timelineKey = access_keys['menuTimeline']
usersPath = '/users/' + searchNickname
followStr += \
'<header>\n' + text_mode_bannerStr + \
@ -423,7 +423,7 @@ def html_search(css_cache: {}, translate: {},
followStr += \
' <input type="hidden" name="actor" value="' + actor + '">\n'
followStr += ' <input type="text" name="searchtext" autofocus><br>\n'
submitKey = accessKeys['submitButton']
submitKey = access_keys['submitButton']
followStr += ' <button type="submit" class="button" ' + \
'name="submitSearch" accesskey="' + submitKey + '">' + \
translate['Submit'] + '</button>\n'
@ -545,14 +545,14 @@ def html_skills_search(actor: str,
results.sort(reverse=True)
cssFilename = base_dir + '/epicyon-profile.css'
css_filename = base_dir + '/epicyon-profile.css'
if os.path.isfile(base_dir + '/epicyon.css'):
cssFilename = base_dir + '/epicyon.css'
css_filename = base_dir + '/epicyon.css'
instanceTitle = \
get_config_param(base_dir, 'instanceTitle')
skillSearchForm = \
html_header_with_external_style(cssFilename, instanceTitle, None)
html_header_with_external_style(css_filename, instanceTitle, None)
skillSearchForm += \
'<center><h1><a href = "' + actor + '/search">' + \
translate['Skills search'] + ': ' + \
@ -622,14 +622,14 @@ def html_history_search(css_cache: {}, translate: {}, base_dir: str,
search_box_posts(base_dir, nickname, domain,
historysearch, postsPerPage, boxName)
cssFilename = base_dir + '/epicyon-profile.css'
css_filename = base_dir + '/epicyon-profile.css'
if os.path.isfile(base_dir + '/epicyon.css'):
cssFilename = base_dir + '/epicyon.css'
css_filename = base_dir + '/epicyon.css'
instanceTitle = \
get_config_param(base_dir, 'instanceTitle')
historySearchForm = \
html_header_with_external_style(cssFilename, instanceTitle, None)
html_header_with_external_style(css_filename, instanceTitle, None)
# add the page title
domain_full = get_full_domain(domain, port)
@ -751,9 +751,9 @@ def html_hashtag_search(css_cache: {},
lines = f.readlines()
# read the css
cssFilename = base_dir + '/epicyon-profile.css'
css_filename = base_dir + '/epicyon-profile.css'
if os.path.isfile(base_dir + '/epicyon.css'):
cssFilename = base_dir + '/epicyon.css'
css_filename = base_dir + '/epicyon.css'
# ensure that the page number is in bounds
if not pageNumber:
@ -772,7 +772,7 @@ def html_hashtag_search(css_cache: {},
instanceTitle = \
get_config_param(base_dir, 'instanceTitle')
hashtagSearchForm = \
html_header_with_external_style(cssFilename, instanceTitle, None)
html_header_with_external_style(css_filename, instanceTitle, None)
if nickname:
hashtagSearchForm += '<center>\n' + \
'<h1><a href="/users/' + nickname + '/search">#' + \

View File

@ -17,14 +17,14 @@ def html_suspended(css_cache: {}, base_dir: str) -> str:
"""Show the screen for suspended accounts
"""
suspendedForm = ''
cssFilename = base_dir + '/epicyon-suspended.css'
css_filename = base_dir + '/epicyon-suspended.css'
if os.path.isfile(base_dir + '/suspended.css'):
cssFilename = base_dir + '/suspended.css'
css_filename = base_dir + '/suspended.css'
instanceTitle = \
get_config_param(base_dir, 'instanceTitle')
suspendedForm = \
html_header_with_external_style(cssFilename, instanceTitle, None)
html_header_with_external_style(css_filename, instanceTitle, None)
suspendedForm += \
'<div><center>\n' + \
' <p class="screentitle">Account Suspended</p>\n' + \

View File

@ -169,7 +169,7 @@ color_to_hex = {
def html_theme_designer(css_cache: {}, base_dir: str,
nickname: str, domain: str,
translate: {}, defaultTimeline: str,
theme_name: str, accessKeys: {}) -> str:
theme_name: str, access_keys: {}) -> str:
"""Edit theme settings
"""
themeFilename = base_dir + '/theme/' + theme_name + '/theme.json'
@ -186,23 +186,23 @@ def html_theme_designer(css_cache: {}, base_dir: str,
themeJson[variableName] = value
themeForm = ''
cssFilename = base_dir + '/epicyon-profile.css'
css_filename = base_dir + '/epicyon-profile.css'
if os.path.isfile(base_dir + '/epicyon.css'):
cssFilename = base_dir + '/epicyon.css'
css_filename = base_dir + '/epicyon.css'
instanceTitle = \
get_config_param(base_dir, 'instanceTitle')
themeForm = \
html_header_with_external_style(cssFilename, instanceTitle, None)
bannerFile, bannerFilename = \
html_header_with_external_style(css_filename, instanceTitle, None)
banner_file, banner_filename = \
get_banner_file(base_dir, nickname, domain, theme_name)
themeForm += \
'<a href="/users/' + nickname + '/' + defaultTimeline + '" ' + \
'accesskey="' + accessKeys['menuTimeline'] + '">' + \
'accesskey="' + access_keys['menuTimeline'] + '">' + \
'<img loading="lazy" class="timeline-banner" ' + \
'title="' + translate['Switch to timeline view'] + '" ' + \
'alt="' + translate['Switch to timeline view'] + '" ' + \
'src="/users/' + nickname + '/' + bannerFile + '" /></a>\n'
'src="/users/' + nickname + '/' + banner_file + '" /></a>\n'
themeForm += '<div class="container">\n'
themeForm += \
@ -211,8 +211,8 @@ def html_theme_designer(css_cache: {}, base_dir: str,
themeForm += ' <form method="POST" action="' + \
'/users/' + nickname + '/changeThemeSettings">\n'
resetKey = accessKeys['menuLogout']
submitKey = accessKeys['submitButton']
resetKey = access_keys['menuLogout']
submitKey = access_keys['submitButton']
themeForm += \
' <center>\n' + \
' <button type="submit" class="button" ' + \

File diff suppressed because it is too large Load Diff

View File

@ -20,7 +20,7 @@ def html_terms_of_service(css_cache: {}, base_dir: str,
http_prefix: str, domain_full: str) -> str:
"""Show the terms of service screen
"""
adminNickname = get_config_param(base_dir, 'admin')
admin_nickname = get_config_param(base_dir, 'admin')
if not os.path.isfile(base_dir + '/accounts/tos.md'):
copyfile(base_dir + '/default_tos.md',
base_dir + '/accounts/tos.md')
@ -36,20 +36,21 @@ def html_terms_of_service(css_cache: {}, base_dir: str,
TOSText = markdown_to_html(file.read())
TOSForm = ''
cssFilename = base_dir + '/epicyon-profile.css'
css_filename = base_dir + '/epicyon-profile.css'
if os.path.isfile(base_dir + '/epicyon.css'):
cssFilename = base_dir + '/epicyon.css'
css_filename = base_dir + '/epicyon.css'
instanceTitle = \
get_config_param(base_dir, 'instanceTitle')
TOSForm = html_header_with_external_style(cssFilename, instanceTitle, None)
TOSForm = \
html_header_with_external_style(css_filename, instanceTitle, None)
TOSForm += '<div class="container">' + TOSText + '</div>\n'
if adminNickname:
adminActor = local_actor_url(http_prefix, adminNickname, domain_full)
if admin_nickname:
adminActor = local_actor_url(http_prefix, admin_nickname, domain_full)
TOSForm += \
'<div class="container"><center>\n' + \
'<p class="administeredby">Administered by <a href="' + \
adminActor + '">' + adminNickname + '</a></p>\n' + \
adminActor + '">' + admin_nickname + '</a></p>\n' + \
'</center></div>\n'
TOSForm += html_footer()
return TOSForm

View File

@ -49,14 +49,14 @@ def html_following_list(css_cache: {}, base_dir: str,
followingList = msg.split('\n')
followingList.sort()
if followingList:
cssFilename = base_dir + '/epicyon-profile.css'
css_filename = base_dir + '/epicyon-profile.css'
if os.path.isfile(base_dir + '/epicyon.css'):
cssFilename = base_dir + '/epicyon.css'
css_filename = base_dir + '/epicyon.css'
instanceTitle = \
get_config_param(base_dir, 'instanceTitle')
followingListHtml = \
html_header_with_external_style(cssFilename,
html_header_with_external_style(css_filename,
instanceTitle, None)
for followingAddress in followingList:
if followingAddress:
@ -72,14 +72,14 @@ def html_hashtag_blocked(css_cache: {}, base_dir: str, translate: {}) -> str:
"""Show the screen for a blocked hashtag
"""
blockedHashtagForm = ''
cssFilename = base_dir + '/epicyon-suspended.css'
css_filename = base_dir + '/epicyon-suspended.css'
if os.path.isfile(base_dir + '/suspended.css'):
cssFilename = base_dir + '/suspended.css'
css_filename = base_dir + '/suspended.css'
instanceTitle = \
get_config_param(base_dir, 'instanceTitle')
blockedHashtagForm = \
html_header_with_external_style(cssFilename, instanceTitle, None)
html_header_with_external_style(css_filename, instanceTitle, None)
blockedHashtagForm += '<div><center>\n'
blockedHashtagForm += \
' <p class="screentitle">' + \
@ -476,26 +476,26 @@ def _get_image_file(base_dir: str, name: str, directory: str,
returns the filenames for an image with the given name
"""
bannerExtensions = get_image_extensions()
bannerFile = ''
bannerFilename = ''
banner_file = ''
banner_filename = ''
for ext in bannerExtensions:
bannerFileTest = name + '.' + ext
bannerFilenameTest = directory + '/' + bannerFileTest
if os.path.isfile(bannerFilenameTest):
bannerFile = name + '_' + theme + '.' + ext
bannerFilename = bannerFilenameTest
return bannerFile, bannerFilename
banner_fileTest = name + '.' + ext
banner_filenameTest = directory + '/' + banner_fileTest
if os.path.isfile(banner_filenameTest):
banner_file = name + '_' + theme + '.' + ext
banner_filename = banner_filenameTest
return banner_file, banner_filename
# if not found then use the default image
theme = 'default'
directory = base_dir + '/theme/' + theme
for ext in bannerExtensions:
bannerFileTest = name + '.' + ext
bannerFilenameTest = directory + '/' + bannerFileTest
if os.path.isfile(bannerFilenameTest):
bannerFile = name + '_' + theme + '.' + ext
bannerFilename = bannerFilenameTest
banner_fileTest = name + '.' + ext
banner_filenameTest = directory + '/' + banner_fileTest
if os.path.isfile(banner_filenameTest):
banner_file = name + '_' + theme + '.' + ext
banner_filename = banner_filenameTest
break
return bannerFile, bannerFilename
return banner_file, banner_filename
def get_banner_file(base_dir: str,
@ -527,11 +527,11 @@ def get_right_image_file(base_dir: str,
accountDir, nickname, domain, theme)
def html_header_with_external_style(cssFilename: str, instanceTitle: str,
def html_header_with_external_style(css_filename: str, instanceTitle: str,
metadata: str, lang='en') -> str:
if metadata is None:
metadata = ''
cssFile = '/' + cssFilename.split('/')[-1]
cssFile = '/' + css_filename.split('/')[-1]
htmlStr = \
'<!DOCTYPE html>\n' + \
'<html lang="' + lang + '">\n' + \
@ -554,7 +554,7 @@ def html_header_with_external_style(cssFilename: str, instanceTitle: str,
return htmlStr
def html_header_with_person_markup(cssFilename: str, instanceTitle: str,
def html_header_with_person_markup(css_filename: str, instanceTitle: str,
actor_json: {}, city: str,
content_license_url: str,
lang='en') -> str:
@ -563,7 +563,7 @@ def html_header_with_person_markup(cssFilename: str, instanceTitle: str,
"""
if not actor_json:
htmlStr = \
html_header_with_external_style(cssFilename,
html_header_with_external_style(css_filename,
instanceTitle, None, lang)
return htmlStr
@ -735,12 +735,12 @@ def html_header_with_person_markup(cssFilename: str, instanceTitle: str,
"\" property=\"og:" + ogTag + "\" />\n"
htmlStr = \
html_header_with_external_style(cssFilename, instanceTitle,
html_header_with_external_style(css_filename, instanceTitle,
ogMetadata + profileMarkup, lang)
return htmlStr
def html_header_with_website_markup(cssFilename: str, instanceTitle: str,
def html_header_with_website_markup(css_filename: str, instanceTitle: str,
http_prefix: str, domain: str,
system_language: str) -> str:
"""html header which includes website markup
@ -792,13 +792,13 @@ def html_header_with_website_markup(cssFilename: str, instanceTitle: str,
' <meta content="summary_large_image" property="twitter:card" />\n'
htmlStr = \
html_header_with_external_style(cssFilename, instanceTitle,
html_header_with_external_style(css_filename, instanceTitle,
ogMetadata + websiteMarkup,
system_language)
return htmlStr
def html_header_with_blog_markup(cssFilename: str, instanceTitle: str,
def html_header_with_blog_markup(css_filename: str, instanceTitle: str,
http_prefix: str, domain: str, nickname: str,
system_language: str,
published: str, modified: str,
@ -851,7 +851,7 @@ def html_header_with_blog_markup(cssFilename: str, instanceTitle: str,
modified + '" />\n'
htmlStr = \
html_header_with_external_style(cssFilename, instanceTitle,
html_header_with_external_style(css_filename, instanceTitle,
ogMetadata + blogMarkup,
system_language)
return htmlStr
@ -1273,7 +1273,7 @@ def html_hide_from_screen_reader(htmlStr: str) -> str:
return '<span aria-hidden="true">' + htmlStr + '</span>'
def html_keyboard_navigation(banner: str, links: {}, accessKeys: {},
def html_keyboard_navigation(banner: str, links: {}, access_keys: {},
subHeading: str = None,
usersPath: str = None, translate: {} = None,
followApprovals: bool = False) -> str:
@ -1298,8 +1298,8 @@ def html_keyboard_navigation(banner: str, links: {}, accessKeys: {},
# show the list of links
for title, url in links.items():
accessKeyStr = ''
if accessKeys.get(title):
accessKeyStr = 'accesskey="' + accessKeys[title] + '"'
if access_keys.get(title):
accessKeyStr = 'accesskey="' + access_keys[title] + '"'
htmlStr += '<li><label class="transparent">' + \
'<a href="' + str(url) + '" ' + accessKeyStr + '>' + \
@ -1480,9 +1480,9 @@ def html_search_result_share(base_dir: str, sharedItem: {}, translate: {},
elif is_moderator(base_dir, nickname):
showRemoveButton = True
else:
adminNickname = get_config_param(base_dir, 'admin')
if adminNickname:
if actor.endswith('/users/' + adminNickname):
admin_nickname = get_config_param(base_dir, 'admin')
if admin_nickname:
if actor.endswith('/users/' + admin_nickname):
showRemoveButton = True
if showRemoveButton:
@ -1556,7 +1556,7 @@ def html_show_share(base_dir: str, domain: str, nickname: str,
actor = local_actor_url(http_prefix, nickname, domain_full)
# filename of the banner shown at the top
bannerFile, bannerFilename = \
banner_file, banner_filename = \
get_banner_file(base_dir, nickname, domain, theme)
shareStr = \
@ -1565,20 +1565,20 @@ def html_show_share(base_dir: str, domain: str, nickname: str,
defaultTimeline + '" title="" alt="">\n'
shareStr += '<img loading="lazy" class="timeline-banner" ' + \
'alt="" ' + \
'src="/users/' + nickname + '/' + bannerFile + '" /></a>\n' + \
'src="/users/' + nickname + '/' + banner_file + '" /></a>\n' + \
'</header><br>\n'
shareStr += \
html_search_result_share(base_dir, sharedItem, translate, http_prefix,
domain_full, contactNickname, itemID,
actor, sharesFileType, category)
cssFilename = base_dir + '/epicyon-profile.css'
css_filename = base_dir + '/epicyon-profile.css'
if os.path.isfile(base_dir + '/epicyon.css'):
cssFilename = base_dir + '/epicyon.css'
css_filename = base_dir + '/epicyon.css'
instanceTitle = \
get_config_param(base_dir, 'instanceTitle')
return html_header_with_external_style(cssFilename,
return html_header_with_external_style(css_filename,
instanceTitle, None) + \
shareStr + html_footer()

View File

@ -83,12 +83,12 @@ def html_welcome_screen(base_dir: str, nickname: str,
welcomeText = markdown_to_html(remove_html(welcomeText))
welcomeForm = ''
cssFilename = base_dir + '/epicyon-welcome.css'
css_filename = base_dir + '/epicyon-welcome.css'
if os.path.isfile(base_dir + '/welcome.css'):
cssFilename = base_dir + '/welcome.css'
css_filename = base_dir + '/welcome.css'
welcomeForm = \
html_header_with_external_style(cssFilename, instanceTitle, None)
html_header_with_external_style(css_filename, instanceTitle, None)
welcomeForm += \
'<form enctype="multipart/form-data" method="POST" ' + \
'accept-charset="UTF-8" ' + \

View File

@ -57,12 +57,12 @@ def html_welcome_final(base_dir: str, nickname: str, domain: str,
finalText = markdown_to_html(remove_html(finalText))
finalForm = ''
cssFilename = base_dir + '/epicyon-welcome.css'
css_filename = base_dir + '/epicyon-welcome.css'
if os.path.isfile(base_dir + '/welcome.css'):
cssFilename = base_dir + '/welcome.css'
css_filename = base_dir + '/welcome.css'
finalForm = \
html_header_with_external_style(cssFilename, instanceTitle, None)
html_header_with_external_style(css_filename, instanceTitle, None)
finalForm += \
'<div class="container">' + finalText + '</div>\n' + \

View File

@ -63,12 +63,12 @@ def html_welcome_profile(base_dir: str, nickname: str, domain: str,
profileText = markdown_to_html(remove_html(profileText))
profileForm = ''
cssFilename = base_dir + '/epicyon-welcome.css'
css_filename = base_dir + '/epicyon-welcome.css'
if os.path.isfile(base_dir + '/welcome.css'):
cssFilename = base_dir + '/welcome.css'
css_filename = base_dir + '/welcome.css'
profileForm = \
html_header_with_external_style(cssFilename, instanceTitle, None)
html_header_with_external_style(css_filename, instanceTitle, None)
# get the url of the avatar
for ext in get_image_extensions():