Merge branch 'main' of ssh://code.freedombone.net:2222/bashrc/epicyon

main
Bob Mottram 2021-05-16 10:50:39 +01:00
commit ae00b2355f
4 changed files with 105 additions and 15 deletions

29
blog.py
View File

@ -11,9 +11,11 @@ from datetime import datetime
from content import replaceEmojiFromTags from content import replaceEmojiFromTags
from webapp_utils import htmlHeaderWithExternalStyle from webapp_utils import htmlHeaderWithExternalStyle
from webapp_utils import htmlHeaderWithBlogMarkup
from webapp_utils import htmlFooter from webapp_utils import htmlFooter
from webapp_utils import getPostAttachmentsAsHtml from webapp_utils import getPostAttachmentsAsHtml
from webapp_media import addEmbeddedElements from webapp_media import addEmbeddedElements
from utils import removeHtml
from utils import getConfigParam from utils import getConfigParam
from utils import getFullDomain from utils import getFullDomain
from utils import getMediaFormats from utils import getMediaFormats
@ -375,11 +377,28 @@ def _htmlBlogRemoveCwButton(blogStr: str, translate: {}) -> str:
return blogStr return blogStr
def _getSnippetFromBlogContent(postJsonObject: {}) -> str:
"""Returns a snippet of text from the blog post as a preview
"""
content = postJsonObject['object']['content']
if '<p>' in content:
content = content.split('<p>', 1)[1]
if '</p>' in content:
content = content.split('</p>', 1)[0]
content = removeHtml(content)
if '\n' in content:
content = content.split('\n')[0]
if len(content) >= 256:
content = content[:252] + '...'
return content
def htmlBlogPost(authorized: bool, def htmlBlogPost(authorized: bool,
baseDir: str, httpPrefix: str, translate: {}, baseDir: str, httpPrefix: str, translate: {},
nickname: str, domain: str, domainFull: str, nickname: str, domain: str, domainFull: str,
postJsonObject: {}, postJsonObject: {},
peertubeInstances: []) -> str: peertubeInstances: [],
systemLanguage: str) -> str:
"""Returns a html blog post """Returns a html blog post
""" """
blogStr = '' blogStr = ''
@ -389,7 +408,13 @@ def htmlBlogPost(authorized: bool,
cssFilename = baseDir + '/blog.css' cssFilename = baseDir + '/blog.css'
instanceTitle = \ instanceTitle = \
getConfigParam(baseDir, 'instanceTitle') getConfigParam(baseDir, 'instanceTitle')
blogStr = htmlHeaderWithExternalStyle(cssFilename, instanceTitle) published = postJsonObject['object']['published']
title = postJsonObject['object']['summary']
snippet = _getSnippetFromBlogContent(postJsonObject)
blogStr = htmlHeaderWithBlogMarkup(cssFilename, instanceTitle,
httpPrefix, domainFull, nickname,
systemLanguage, published,
title, snippet)
_htmlBlogRemoveCwButton(blogStr, translate) _htmlBlogRemoveCwButton(blogStr, translate)
blogStr += _htmlBlogPostContent(authorized, baseDir, blogStr += _htmlBlogPostContent(authorized, baseDir,

View File

@ -7399,6 +7399,7 @@ class PubServer(BaseHTTPRequestHandler):
if isinstance(actorJson['affiliation']['roleName'], if isinstance(actorJson['affiliation']['roleName'],
list): list):
rolesList = actorJson['affiliation']['roleName'] rolesList = actorJson['affiliation']['roleName']
city = self._getSpoofedCity(baseDir, nickname, domain)
msg = \ msg = \
htmlProfile(self.server.rssIconAtTop, htmlProfile(self.server.rssIconAtTop,
self.server.cssCache, self.server.cssCache,
@ -7422,7 +7423,7 @@ class PubServer(BaseHTTPRequestHandler):
self.server.allowLocalNetworkAccess, self.server.allowLocalNetworkAccess,
self.server.textModeBanner, self.server.textModeBanner,
self.server.debug, self.server.debug,
accessKeys, rolesList, accessKeys, city, rolesList,
None, None) None, None)
msg = msg.encode('utf-8') msg = msg.encode('utf-8')
msglen = len(msg) msglen = len(msg)
@ -7501,6 +7502,8 @@ class PubServer(BaseHTTPRequestHandler):
actorSkillsList = \ actorSkillsList = \
actorJson['hasOccupation']['skills'] actorJson['hasOccupation']['skills']
skills = getSkillsFromList(actorSkillsList) skills = getSkillsFromList(actorSkillsList)
city = self._getSpoofedCity(baseDir,
nickname, domain)
msg = \ msg = \
htmlProfile(self.server.rssIconAtTop, htmlProfile(self.server.rssIconAtTop,
self.server.cssCache, self.server.cssCache,
@ -7524,7 +7527,7 @@ class PubServer(BaseHTTPRequestHandler):
allowLocalNetworkAccess, allowLocalNetworkAccess,
self.server.textModeBanner, self.server.textModeBanner,
self.server.debug, self.server.debug,
accessKeys, skills, accessKeys, city, skills,
None, None) None, None)
msg = msg.encode('utf-8') msg = msg.encode('utf-8')
msglen = len(msg) msglen = len(msg)
@ -9398,6 +9401,7 @@ class PubServer(BaseHTTPRequestHandler):
accessKeys = \ accessKeys = \
self.server.keyShortcuts[nickname] self.server.keyShortcuts[nickname]
city = self._getSpoofedCity(baseDir, nickname, domain)
msg = \ msg = \
htmlProfile(self.server.rssIconAtTop, htmlProfile(self.server.rssIconAtTop,
self.server.cssCache, self.server.cssCache,
@ -9422,7 +9426,7 @@ class PubServer(BaseHTTPRequestHandler):
self.server.allowLocalNetworkAccess, self.server.allowLocalNetworkAccess,
self.server.textModeBanner, self.server.textModeBanner,
self.server.debug, self.server.debug,
accessKeys, accessKeys, city,
shares, shares,
pageNumber, sharesPerPage) pageNumber, sharesPerPage)
msg = msg.encode('utf-8') msg = msg.encode('utf-8')
@ -9500,6 +9504,7 @@ class PubServer(BaseHTTPRequestHandler):
return True return True
accessKeys = self.server.accessKeys accessKeys = self.server.accessKeys
city = None
if '/users/' in path: if '/users/' in path:
nickname = path.split('/users/')[1] nickname = path.split('/users/')[1]
if '/' in nickname: if '/' in nickname:
@ -9508,6 +9513,7 @@ class PubServer(BaseHTTPRequestHandler):
accessKeys = \ accessKeys = \
self.server.keyShortcuts[nickname] self.server.keyShortcuts[nickname]
city = self._getSpoofedCity(baseDir, nickname, domain)
msg = \ msg = \
htmlProfile(self.server.rssIconAtTop, htmlProfile(self.server.rssIconAtTop,
self.server.cssCache, self.server.cssCache,
@ -9532,7 +9538,7 @@ class PubServer(BaseHTTPRequestHandler):
self.server.allowLocalNetworkAccess, self.server.allowLocalNetworkAccess,
self.server.textModeBanner, self.server.textModeBanner,
self.server.debug, self.server.debug,
accessKeys, accessKeys, city,
following, following,
pageNumber, pageNumber,
followsPerPage).encode('utf-8') followsPerPage).encode('utf-8')
@ -9609,6 +9615,7 @@ class PubServer(BaseHTTPRequestHandler):
return True return True
accessKeys = self.server.accessKeys accessKeys = self.server.accessKeys
city = None
if '/users/' in path: if '/users/' in path:
nickname = path.split('/users/')[1] nickname = path.split('/users/')[1]
if '/' in nickname: if '/' in nickname:
@ -9617,6 +9624,7 @@ class PubServer(BaseHTTPRequestHandler):
accessKeys = \ accessKeys = \
self.server.keyShortcuts[nickname] self.server.keyShortcuts[nickname]
city = self._getSpoofedCity(baseDir, nickname, domain)
msg = \ msg = \
htmlProfile(self.server.rssIconAtTop, htmlProfile(self.server.rssIconAtTop,
self.server.cssCache, self.server.cssCache,
@ -9642,7 +9650,7 @@ class PubServer(BaseHTTPRequestHandler):
self.server.allowLocalNetworkAccess, self.server.allowLocalNetworkAccess,
self.server.textModeBanner, self.server.textModeBanner,
self.server.debug, self.server.debug,
accessKeys, accessKeys, city,
followers, followers,
pageNumber, pageNumber,
followsPerPage).encode('utf-8') followsPerPage).encode('utf-8')
@ -9742,6 +9750,7 @@ class PubServer(BaseHTTPRequestHandler):
return True return True
accessKeys = self.server.accessKeys accessKeys = self.server.accessKeys
city = None
if '/users/' in path: if '/users/' in path:
nickname = path.split('/users/')[1] nickname = path.split('/users/')[1]
if '/' in nickname: if '/' in nickname:
@ -9750,6 +9759,7 @@ class PubServer(BaseHTTPRequestHandler):
accessKeys = \ accessKeys = \
self.server.keyShortcuts[nickname] self.server.keyShortcuts[nickname]
city = self._getSpoofedCity(baseDir, nickname, domain)
msg = \ msg = \
htmlProfile(self.server.rssIconAtTop, htmlProfile(self.server.rssIconAtTop,
self.server.cssCache, self.server.cssCache,
@ -9775,7 +9785,7 @@ class PubServer(BaseHTTPRequestHandler):
self.server.allowLocalNetworkAccess, self.server.allowLocalNetworkAccess,
self.server.textModeBanner, self.server.textModeBanner,
self.server.debug, self.server.debug,
accessKeys, accessKeys, city,
None, None).encode('utf-8') None, None).encode('utf-8')
msglen = len(msg) msglen = len(msg)
self._set_headers('text/html', msglen, self._set_headers('text/html', msglen,
@ -11094,7 +11104,8 @@ class PubServer(BaseHTTPRequestHandler):
nickname, self.server.domain, nickname, self.server.domain,
self.server.domainFull, self.server.domainFull,
postJsonObject, postJsonObject,
self.server.peertubeInstances) self.server.peertubeInstances,
self.server.systemLanguage)
if msg is not None: if msg is not None:
msg = msg.encode('utf-8') msg = msg.encode('utf-8')
msglen = len(msg) msglen = len(msg)

View File

@ -520,7 +520,7 @@ def htmlProfile(rssIconAtTop: bool,
peertubeInstances: [], peertubeInstances: [],
allowLocalNetworkAccess: bool, allowLocalNetworkAccess: bool,
textModeBanner: str, textModeBanner: str,
debug: bool, accessKeys: {}, debug: bool, accessKeys: {}, city: str,
extraJson=None, pageNumber=None, extraJson=None, pageNumber=None,
maxItemsPerPage=None) -> str: maxItemsPerPage=None) -> str:
"""Show the profile page as html """Show the profile page as html
@ -901,7 +901,8 @@ def htmlProfile(rssIconAtTop: bool,
instanceTitle = \ instanceTitle = \
getConfigParam(baseDir, 'instanceTitle') getConfigParam(baseDir, 'instanceTitle')
profileStr = \ profileStr = \
htmlHeaderWithPersonMarkup(cssFilename, instanceTitle, profileJson) + \ htmlHeaderWithPersonMarkup(cssFilename, instanceTitle,
profileJson, city) + \
profileStr + htmlFooter() profileStr + htmlFooter()
return profileStr return profileStr

View File

@ -711,7 +711,8 @@ def htmlHeaderWithExternalStyle(cssFilename: str, instanceTitle: str,
def htmlHeaderWithPersonMarkup(cssFilename: str, instanceTitle: str, def htmlHeaderWithPersonMarkup(cssFilename: str, instanceTitle: str,
actorJson: {}, lang='en') -> str: actorJson: {}, city: str,
lang='en') -> str:
"""html header which includes person markup """html header which includes person markup
https://schema.org/Person https://schema.org/Person
""" """
@ -731,7 +732,23 @@ def htmlHeaderWithPersonMarkup(cssFilename: str, instanceTitle: str,
occupationStr + \ occupationStr + \
' "skills": ' + str(skillsList) + '\n' + \ ' "skills": ' + str(skillsList) + '\n' + \
' "},\n' ' "},\n'
cityMarkup = ''
if city:
city = city.lower().title()
addComma = ''
countryMarkup = ''
if ',' in city:
country = city.split(',', 1)[1].strip().title()
city = city.split(',', 1)[0]
countryMarkup = \
' "addressCountry": "' + country + '"\n'
addComma = ','
cityMarkup = \
' "address": {\n' + \
' "@type": "PostalAddress",\n' + \
' "addressLocality": "' + city + '"' + addComma + '\n' + \
countryMarkup + \
' },\n'
personMarkup = \ personMarkup = \
' <script type="application/ld+json">\n' + \ ' <script type="application/ld+json">\n' + \
' {\n' + \ ' {\n' + \
@ -740,7 +757,7 @@ def htmlHeaderWithPersonMarkup(cssFilename: str, instanceTitle: str,
' "name": "' + actorJson['name'] + '",\n' + \ ' "name": "' + actorJson['name'] + '",\n' + \
' "image": "' + actorJson['icon']['url'] + '",\n' + \ ' "image": "' + actorJson['icon']['url'] + '",\n' + \
' "description": "' + actorJson['summary'] + '",\n' + \ ' "description": "' + actorJson['summary'] + '",\n' + \
skillsMarkup + \ cityMarkup + skillsMarkup + \
' "url": "' + actorJson['id'] + '"\n' + \ ' "url": "' + actorJson['id'] + '"\n' + \
' }\n' + \ ' }\n' + \
' </script>\n' ' </script>\n'
@ -757,7 +774,7 @@ def htmlHeaderWithWebsiteMarkup(cssFilename: str, instanceTitle: str,
htmlStr = htmlHeaderWithExternalStyle(cssFilename, instanceTitle, htmlStr = htmlHeaderWithExternalStyle(cssFilename, instanceTitle,
systemLanguage) systemLanguage)
licenseUrl = 'https://www.gnu.org/licenses/agpl-3.0.en.html' licenseUrl = 'https://www.gnu.org/licenses/agpl-3.0.rdf'
# social networking category # social networking category
genreUrl = 'http://vocab.getty.edu/aat/300312270' genreUrl = 'http://vocab.getty.edu/aat/300312270'
@ -791,6 +808,42 @@ def htmlHeaderWithWebsiteMarkup(cssFilename: str, instanceTitle: str,
return htmlStr return htmlStr
def htmlHeaderWithBlogMarkup(cssFilename: str, instanceTitle: str,
httpPrefix: str, domain: str, nickname: str,
systemLanguage: str, published: str,
title: str, snippet: str) -> str:
"""html header which includes blog post markup
https://schema.org/BlogPosting
"""
htmlStr = htmlHeaderWithExternalStyle(cssFilename, instanceTitle,
systemLanguage)
authorUrl = httpPrefix + '://' + domain + '/users/' + nickname
blogMarkup = \
' <script type="application/ld+json">\n' + \
' {\n' + \
' "@context" : "http://schema.org",\n' + \
' "@type" : "BlogPosting",\n' + \
' "headline": "' + title + '",\n' + \
' "datePublished": "' + published + '",\n' + \
' "dateModified": "' + published + '",\n' + \
' "author": {\n' + \
' "@type": "Person",\n' + \
' "name": "' + nickname + '",\n' + \
' "url": "' + authorUrl + '"\n' + \
' },\n' + \
' "publisher": {\n' + \
' "@type": "WebSite",\n' + \
' "name": "' + instanceTitle + '",\n' + \
' "url": "' + httpPrefix + '://' + domain + '/about.html"\n' + \
' },\n' + \
' "description": "' + snippet + '"\n' + \
' }\n' + \
' </script>\n'
htmlStr = htmlStr.replace('<head>\n', '<head>\n' + blogMarkup)
return htmlStr
def htmlFooter() -> str: def htmlFooter() -> str:
htmlStr = ' </body>\n' htmlStr = ' </body>\n'
htmlStr += '</html>\n' htmlStr += '</html>\n'