mirror of https://gitlab.com/bashrc2/epicyon
Merge branch 'main' of ssh://code.freedombone.net:2222/bashrc/epicyon
commit
ae00b2355f
29
blog.py
29
blog.py
|
|
@ -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,
|
||||||
|
|
|
||||||
25
daemon.py
25
daemon.py
|
|
@ -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)
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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'
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue