From 121f625dd44a6222b22035087f23399ec594cdf4 Mon Sep 17 00:00:00 2001
From: Bob Mottram
Date: Sat, 15 May 2021 15:25:51 +0100
Subject: [PATCH 1/7] rdf license link
---
webapp_utils.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/webapp_utils.py b/webapp_utils.py
index 00fc3cace..b99f2317e 100644
--- a/webapp_utils.py
+++ b/webapp_utils.py
@@ -757,7 +757,7 @@ def htmlHeaderWithWebsiteMarkup(cssFilename: str, instanceTitle: str,
htmlStr = htmlHeaderWithExternalStyle(cssFilename, instanceTitle,
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
genreUrl = 'http://vocab.getty.edu/aat/300312270'
From 818a9203659b0750bd3b42dfbb5cab1b4e0dbcd1 Mon Sep 17 00:00:00 2001
From: Bob Mottram
Date: Sat, 15 May 2021 20:39:34 +0100
Subject: [PATCH 2/7] Semantic markup for blog posts
---
blog.py | 29 +++++++++++++++++++++++++++--
daemon.py | 3 ++-
webapp_utils.py | 36 ++++++++++++++++++++++++++++++++++++
3 files changed, 65 insertions(+), 3 deletions(-)
diff --git a/blog.py b/blog.py
index f2651b8db..2320412a3 100644
--- a/blog.py
+++ b/blog.py
@@ -11,9 +11,11 @@ from datetime import datetime
from content import replaceEmojiFromTags
from webapp_utils import htmlHeaderWithExternalStyle
+from webapp_utils import htmlHeaderWithBlogMarkup
from webapp_utils import htmlFooter
from webapp_utils import getPostAttachmentsAsHtml
from webapp_media import addEmbeddedElements
+from utils import removeHtml
from utils import getConfigParam
from utils import getFullDomain
from utils import getMediaFormats
@@ -375,11 +377,28 @@ def _htmlBlogRemoveCwButton(blogStr: str, translate: {}) -> str:
return blogStr
+def _getSnippetFromBlogContent(postJsonObject: {}) -> str:
+ """Returns a snippet of text from the blog post as a preview
+ """
+ content = postJsonObject['object']['content']
+ if len(content) < 256:
+ return removeHtml(content)
+ if '' in content:
+ content = content.split('
', 1)[1]
+ if '
' in content:
+ content = content.split('
', 1)[0]
+ content = removeHtml(content)
+ if len(content) >= 256:
+ content = content[:252] + '...'
+ return content
+
+
def htmlBlogPost(authorized: bool,
baseDir: str, httpPrefix: str, translate: {},
nickname: str, domain: str, domainFull: str,
postJsonObject: {},
- peertubeInstances: []) -> str:
+ peertubeInstances: [],
+ systemLanguage: str) -> str:
"""Returns a html blog post
"""
blogStr = ''
@@ -389,7 +408,13 @@ def htmlBlogPost(authorized: bool,
cssFilename = baseDir + '/blog.css'
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)
blogStr += _htmlBlogPostContent(authorized, baseDir,
diff --git a/daemon.py b/daemon.py
index 68b8c8acf..c1fc8bc24 100644
--- a/daemon.py
+++ b/daemon.py
@@ -11094,7 +11094,8 @@ class PubServer(BaseHTTPRequestHandler):
nickname, self.server.domain,
self.server.domainFull,
postJsonObject,
- self.server.peertubeInstances)
+ self.server.peertubeInstances,
+ self.server.systemLanguage)
if msg is not None:
msg = msg.encode('utf-8')
msglen = len(msg)
diff --git a/webapp_utils.py b/webapp_utils.py
index b99f2317e..c4676e64f 100644
--- a/webapp_utils.py
+++ b/webapp_utils.py
@@ -791,6 +791,42 @@ def htmlHeaderWithWebsiteMarkup(cssFilename: str, instanceTitle: str,
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 = \
+ ' \n'
+ htmlStr = htmlStr.replace('\n', '\n' + blogMarkup)
+ return htmlStr
+
+
def htmlFooter() -> str:
htmlStr = ' \n'
htmlStr += '\n'
From dbd9acbc9dca75586360f4c5cdabf71052dd6ba8 Mon Sep 17 00:00:00 2001
From: Bob Mottram
Date: Sat, 15 May 2021 20:43:42 +0100
Subject: [PATCH 3/7] Get the first line
---
blog.py | 2 ++
1 file changed, 2 insertions(+)
diff --git a/blog.py b/blog.py
index 2320412a3..29b8106f5 100644
--- a/blog.py
+++ b/blog.py
@@ -388,6 +388,8 @@ def _getSnippetFromBlogContent(postJsonObject: {}) -> str:
if '' in content:
content = content.split('', 1)[0]
content = removeHtml(content)
+ if '\n' in content:
+ content = content.split('\n')[0]
if len(content) >= 256:
content = content[:252] + '...'
return content
From 7b1a1e858556ac875bea0686c1e95a565d0d75f4 Mon Sep 17 00:00:00 2001
From: Bob Mottram
Date: Sat, 15 May 2021 20:45:55 +0100
Subject: [PATCH 4/7] Don't use raw blog content
---
blog.py | 2 --
1 file changed, 2 deletions(-)
diff --git a/blog.py b/blog.py
index 29b8106f5..0866842d7 100644
--- a/blog.py
+++ b/blog.py
@@ -381,8 +381,6 @@ def _getSnippetFromBlogContent(postJsonObject: {}) -> str:
"""Returns a snippet of text from the blog post as a preview
"""
content = postJsonObject['object']['content']
- if len(content) < 256:
- return removeHtml(content)
if '' in content:
content = content.split('
', 1)[1]
if '
' in content:
From 648666d741a41eb63f799a988fcad8396d3f51cb Mon Sep 17 00:00:00 2001
From: Bob Mottram
Date: Sun, 16 May 2021 10:20:24 +0100
Subject: [PATCH 5/7] Include spoofed city within person metadata
---
daemon.py | 22 ++++++++++++++++------
webapp_profile.py | 5 +++--
webapp_utils.py | 23 ++++++++++++++++++++---
3 files changed, 39 insertions(+), 11 deletions(-)
diff --git a/daemon.py b/daemon.py
index c1fc8bc24..b54fd2b07 100644
--- a/daemon.py
+++ b/daemon.py
@@ -7399,6 +7399,7 @@ class PubServer(BaseHTTPRequestHandler):
if isinstance(actorJson['affiliation']['roleName'],
list):
rolesList = actorJson['affiliation']['roleName']
+ city = self._getSpoofedCity(baseDir, nickname, domain)
msg = \
htmlProfile(self.server.rssIconAtTop,
self.server.cssCache,
@@ -7422,7 +7423,7 @@ class PubServer(BaseHTTPRequestHandler):
self.server.allowLocalNetworkAccess,
self.server.textModeBanner,
self.server.debug,
- accessKeys, rolesList,
+ accessKeys, city, rolesList,
None, None)
msg = msg.encode('utf-8')
msglen = len(msg)
@@ -7501,6 +7502,8 @@ class PubServer(BaseHTTPRequestHandler):
actorSkillsList = \
actorJson['hasOccupation']['skills']
skills = getSkillsFromList(actorSkillsList)
+ city = self._getSpoofedCity(baseDir,
+ nickname, domain)
msg = \
htmlProfile(self.server.rssIconAtTop,
self.server.cssCache,
@@ -7524,7 +7527,7 @@ class PubServer(BaseHTTPRequestHandler):
allowLocalNetworkAccess,
self.server.textModeBanner,
self.server.debug,
- accessKeys, skills,
+ accessKeys, city, skills,
None, None)
msg = msg.encode('utf-8')
msglen = len(msg)
@@ -9398,6 +9401,7 @@ class PubServer(BaseHTTPRequestHandler):
accessKeys = \
self.server.keyShortcuts[nickname]
+ city = self._getSpoofedCity(baseDir, nickname, domain)
msg = \
htmlProfile(self.server.rssIconAtTop,
self.server.cssCache,
@@ -9422,7 +9426,7 @@ class PubServer(BaseHTTPRequestHandler):
self.server.allowLocalNetworkAccess,
self.server.textModeBanner,
self.server.debug,
- accessKeys,
+ accessKeys, city,
shares,
pageNumber, sharesPerPage)
msg = msg.encode('utf-8')
@@ -9500,6 +9504,7 @@ class PubServer(BaseHTTPRequestHandler):
return True
accessKeys = self.server.accessKeys
+ city = None
if '/users/' in path:
nickname = path.split('/users/')[1]
if '/' in nickname:
@@ -9508,6 +9513,7 @@ class PubServer(BaseHTTPRequestHandler):
accessKeys = \
self.server.keyShortcuts[nickname]
+ city = self._getSpoofedCity(baseDir, nickname, domain)
msg = \
htmlProfile(self.server.rssIconAtTop,
self.server.cssCache,
@@ -9532,7 +9538,7 @@ class PubServer(BaseHTTPRequestHandler):
self.server.allowLocalNetworkAccess,
self.server.textModeBanner,
self.server.debug,
- accessKeys,
+ accessKeys, city,
following,
pageNumber,
followsPerPage).encode('utf-8')
@@ -9609,6 +9615,7 @@ class PubServer(BaseHTTPRequestHandler):
return True
accessKeys = self.server.accessKeys
+ city = None
if '/users/' in path:
nickname = path.split('/users/')[1]
if '/' in nickname:
@@ -9617,6 +9624,7 @@ class PubServer(BaseHTTPRequestHandler):
accessKeys = \
self.server.keyShortcuts[nickname]
+ city = self._getSpoofedCity(baseDir, nickname, domain)
msg = \
htmlProfile(self.server.rssIconAtTop,
self.server.cssCache,
@@ -9642,7 +9650,7 @@ class PubServer(BaseHTTPRequestHandler):
self.server.allowLocalNetworkAccess,
self.server.textModeBanner,
self.server.debug,
- accessKeys,
+ accessKeys, city,
followers,
pageNumber,
followsPerPage).encode('utf-8')
@@ -9742,6 +9750,7 @@ class PubServer(BaseHTTPRequestHandler):
return True
accessKeys = self.server.accessKeys
+ city = None
if '/users/' in path:
nickname = path.split('/users/')[1]
if '/' in nickname:
@@ -9750,6 +9759,7 @@ class PubServer(BaseHTTPRequestHandler):
accessKeys = \
self.server.keyShortcuts[nickname]
+ city = self._getSpoofedCity(baseDir, nickname, domain)
msg = \
htmlProfile(self.server.rssIconAtTop,
self.server.cssCache,
@@ -9775,7 +9785,7 @@ class PubServer(BaseHTTPRequestHandler):
self.server.allowLocalNetworkAccess,
self.server.textModeBanner,
self.server.debug,
- accessKeys,
+ accessKeys, city,
None, None).encode('utf-8')
msglen = len(msg)
self._set_headers('text/html', msglen,
diff --git a/webapp_profile.py b/webapp_profile.py
index 8b91ba5d6..5a8baffa4 100644
--- a/webapp_profile.py
+++ b/webapp_profile.py
@@ -520,7 +520,7 @@ def htmlProfile(rssIconAtTop: bool,
peertubeInstances: [],
allowLocalNetworkAccess: bool,
textModeBanner: str,
- debug: bool, accessKeys: {},
+ debug: bool, accessKeys: {}, city: str,
extraJson=None, pageNumber=None,
maxItemsPerPage=None) -> str:
"""Show the profile page as html
@@ -901,7 +901,8 @@ def htmlProfile(rssIconAtTop: bool,
instanceTitle = \
getConfigParam(baseDir, 'instanceTitle')
profileStr = \
- htmlHeaderWithPersonMarkup(cssFilename, instanceTitle, profileJson) + \
+ htmlHeaderWithPersonMarkup(cssFilename, instanceTitle,
+ profileJson, city) + \
profileStr + htmlFooter()
return profileStr
diff --git a/webapp_utils.py b/webapp_utils.py
index c4676e64f..68143c004 100644
--- a/webapp_utils.py
+++ b/webapp_utils.py
@@ -711,7 +711,8 @@ def htmlHeaderWithExternalStyle(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
https://schema.org/Person
"""
@@ -731,7 +732,23 @@ def htmlHeaderWithPersonMarkup(cssFilename: str, instanceTitle: str,
occupationStr + \
' "skills": ' + str(skillsList) + '\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 + '"'
+ addComma = ','
+ cityMarkup = \
+ ' "address": {\n' + \
+ ' "@type": "PostalAddress",\n' + \
+ ' "addressLocality": "' + city + '"' + addComma + '\n' + \
+ countryMarkup + \
+ ' },'
personMarkup = \
' \n'
From bd7bfd780ebf3d09d782749d67f9e9f89b637a26 Mon Sep 17 00:00:00 2001
From: Bob Mottram
Date: Sun, 16 May 2021 10:23:34 +0100
Subject: [PATCH 6/7] Newline
---
webapp_utils.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/webapp_utils.py b/webapp_utils.py
index 68143c004..39e59ab68 100644
--- a/webapp_utils.py
+++ b/webapp_utils.py
@@ -741,7 +741,7 @@ def htmlHeaderWithPersonMarkup(cssFilename: str, instanceTitle: str,
country = city.split(',', 1)[1].strip().title()
city = city.split(',', 1)[0]
countryMarkup = \
- ' "addressCountry": "' + country + '"'
+ ' "addressCountry": "' + country + '"\n'
addComma = ','
cityMarkup = \
' "address": {\n' + \
From 18aba190a9ea8a273b4b4d278e039818d5d6dad8 Mon Sep 17 00:00:00 2001
From: Bob Mottram
Date: Sun, 16 May 2021 10:26:07 +0100
Subject: [PATCH 7/7] Newline
---
webapp_utils.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/webapp_utils.py b/webapp_utils.py
index 39e59ab68..2b9e43269 100644
--- a/webapp_utils.py
+++ b/webapp_utils.py
@@ -748,7 +748,7 @@ def htmlHeaderWithPersonMarkup(cssFilename: str, instanceTitle: str,
' "@type": "PostalAddress",\n' + \
' "addressLocality": "' + city + '"' + addComma + '\n' + \
countryMarkup + \
- ' },'
+ ' },\n'
personMarkup = \
'