Include mentions in new posts

master
Bob Mottram 2019-08-05 20:13:15 +01:00
parent e5803ae454
commit 19ae236665
3 changed files with 53 additions and 4 deletions

View File

@ -62,3 +62,18 @@ def addMentions(baseDir: str,httpPrefix: str, \
content=content.replace('\n','</p><p>') content=content.replace('\n','</p><p>')
return '<p>'+content+'</p>' return '<p>'+content+'</p>'
def getMentionsFromHtml(htmlText: str,matchStr="<span class=\"h-card\"><a href=\"") -> []:
"""Extracts mentioned actors from the given html content string
"""
mentions=[]
if matchStr not in htmlText:
return mentions
mentionsList=htmlStr.split(matchStr)
for mentionStr in mentionsList:
if '"' not in mentionStr:
continue
actorStr=mentionStr.split('"')[0]
if actorStr.startswith('http') or \
actorStr.startswith('dat:'):
mentions.append(actorStr)
return mentions

View File

@ -823,8 +823,15 @@ class PubServer(BaseHTTPRequestHandler):
# reply from the web interface icon # reply from the web interface icon
inReplyToUrl=None inReplyToUrl=None
replyToList=[]
if authorized and '?replyto=' in self.path: if authorized and '?replyto=' in self.path:
inReplyToUrl=self.path.split('?replyto=')[1] inReplyToUrl=self.path.split('?replyto=')[1]
if '?' in inReplyToUrl:
mentionsList=inReplyToUrl.split('?')
for m in mentionsList:
if m.startswith('mention='):
replyToList.append(m.replace('mention=',''))
inReplyToUrl=mentionsList[0]
self.path=self.path.split('?replyto=')[0]+'/newpost' self.path=self.path.split('?replyto=')[0]+'/newpost'
# edit profile in web interface # edit profile in web interface
@ -842,7 +849,7 @@ class PubServer(BaseHTTPRequestHandler):
self.path.endswith('/newdm') or \ self.path.endswith('/newdm') or \
self.path.endswith('/newshare')): self.path.endswith('/newshare')):
self._set_headers('text/html',cookie) self._set_headers('text/html',cookie)
self.wfile.write(htmlNewPost(self.server.baseDir,self.path,inReplyToUrl).encode()) self.wfile.write(htmlNewPost(self.server.baseDir,self.path,inReplyToUrl,replyToList).encode())
self.server.GETbusy=False self.server.GETbusy=False
return return

View File

@ -28,6 +28,7 @@ from auth import createPassword
from like import likedByPerson from like import likedByPerson
from announce import announcedByPerson from announce import announcedByPerson
from blocking import isBlocked from blocking import isBlocked
from content import getMentionsFromHtml
def htmlEditProfile(baseDir: str,path: str,domain: str,port: int) -> str: def htmlEditProfile(baseDir: str,path: str,domain: str,port: int) -> str:
"""Shows the edit profile screen """Shows the edit profile screen
@ -179,7 +180,7 @@ def htmlLogin(baseDir: str) -> str:
loginForm+=htmlFooter() loginForm+=htmlFooter()
return loginForm return loginForm
def htmlNewPost(baseDir: str,path: str,inReplyTo: str) -> str: def htmlNewPost(baseDir: str,path: str,inReplyTo: str,mentions: []) -> str:
replyStr='' replyStr=''
if not path.endswith('/newshare'): if not path.endswith('/newshare'):
if not inReplyTo: if not inReplyTo:
@ -237,6 +238,20 @@ def htmlNewPost(baseDir: str,path: str,inReplyTo: str) -> str:
shareOptionOnDropdown='' shareOptionOnDropdown=''
if not replyStr: if not replyStr:
shareOptionOnDropdown='<a href="'+pathBase+'/newshare"><img src="/icons/scope_share.png"/><b>Share</b><br>Describe a shared item</a>' shareOptionOnDropdown='<a href="'+pathBase+'/newshare"><img src="/icons/scope_share.png"/><b>Share</b><br>Describe a shared item</a>'
mentionsStr=''
for m in mentions:
mentionNickname=getNicknameFromActor(m)
if not mentionNickname:
continue
mentionDomain,mentionPort=getDomainFromActor(m)
if not mentionDomain:
continue
if mentionPort:
mentionsStr+='@'+mentionNickname+'@'+mentionDomain+':'+str(mentionPort)+' '
else:
mentionsStr+='@'+mentionNickname+'@'+mentionDomain+' '
newPostForm+= \ newPostForm+= \
'<form enctype="multipart/form-data" method="POST" action="'+path+'?'+endpoint+'">' \ '<form enctype="multipart/form-data" method="POST" action="'+path+'?'+endpoint+'">' \
' <div class="vertical-center">' \ ' <div class="vertical-center">' \
@ -258,7 +273,7 @@ def htmlNewPost(baseDir: str,path: str,inReplyTo: str) -> str:
replyStr+ \ replyStr+ \
' <input type="text" placeholder="'+placeholderSubject+'" name="subject">' \ ' <input type="text" placeholder="'+placeholderSubject+'" name="subject">' \
'' \ '' \
' <textarea id="message" name="message" placeholder="'+placeholderMessage+'" style="height:200px"></textarea>' \ ' <textarea id="message" name="message" placeholder="'+placeholderMessage+'" style="height:200px" autofocus>'+mentionsStr+'</textarea>' \
''+extraFields+ \ ''+extraFields+ \
' <div class="container">' \ ' <div class="container">' \
' <input type="text" placeholder="Image description" name="imageDescription">' \ ' <input type="text" placeholder="Image description" name="imageDescription">' \
@ -700,8 +715,20 @@ def individualPostAsHtml(baseDir: str, \
'<img src="/icons/delete.png"/></a>' '<img src="/icons/delete.png"/></a>'
if showIcons: if showIcons:
replyToLink=postJsonObject['object']['id']
if postJsonObject['object'].get('attributedTo'):
replyToLink+='?mention='+postJsonObject['object']['attributedTo']
if postJsonObject['object'].get('content'):
mentionedActors=getMentionsFromHtml(postJsonObject['object']['content'])
if mentionedActors:
for actorUrl in mentionedActors:
if '?mention='+actorUrl not in replyToLink:
replyToLink+='?mention='+actorUrl
if len(replyToLink)>500:
break
footerStr='<div class="'+containerClassIcons+'">' footerStr='<div class="'+containerClassIcons+'">'
footerStr+='<a href="/users/'+nickname+'?replyto='+postJsonObject['object']['id']+'" title="Reply to this post">' footerStr+='<a href="/users/'+nickname+'?replyto='+replyToLink+'" title="Reply to this post">'
footerStr+='<img src="/icons/reply.png"/></a>' footerStr+='<img src="/icons/reply.png"/></a>'
footerStr+=announceStr+likeStr+deleteStr footerStr+=announceStr+likeStr+deleteStr
footerStr+='<span class="'+timeClass+'">'+publishedStr+'</span>' footerStr+='<span class="'+timeClass+'">'+publishedStr+'</span>'