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 = \ '