Refactor mentions replacements

master
Bob Mottram 2019-08-09 10:09:21 +01:00
parent 8fdcb93546
commit af32aa08d6
3 changed files with 48 additions and 32 deletions

View File

@ -9,7 +9,41 @@ __status__ = "Production"
import os import os
import commentjson import commentjson
def addMentions(baseDir: str,httpPrefix: str, \ def addMention(wordStr: str,httpPrefix: str,following: str,replaceMentions: {},recipients: []) -> bool:
"""Detects mentions and adds them to the replacements dict and recipients list
"""
if not wordStr.startswith('@'):
return False
if len(wordStr)<2:
return False
possibleHandle=wordStr[1:]
if '@' not in possibleHandle:
return False
replaceFound=False
possibleNickname=possibleHandle.split('@')[0]
possibleDomain=possibleHandle.split('@')[1]
for follow in following:
if follow.replace('\n','')==possibleHandle:
recipientActor=httpPrefix+"://"+possibleDomain+"/users/"+possibleNickname
if recipientActor not in recipients:
recipients.append(recipientActor)
replaceMentions[wordStr]="<span class=\"h-card\"><a href=\""+httpPrefix+"://"+possibleDomain+"/@"+possibleNickname+"\" class=\"u-url mention\">@<span>"+possibleNickname+"</span></a></span>"
replaceFound=True
break
if not replaceFound:
# fall back to a best effort match if an exact one is not found
for follow in following:
if follow.startswith(possibleNickname+'@'):
replaceDomain=follow.replace('\n','').split('@')[1]
recipientActor=httpPrefix+"://"+replaceDomain+"/users/"+possibleNickname
if recipientActor not in recipients:
recipients.append(recipientActor)
replaceMentions[wordStr]="<span class=\"h-card\"><a href=\""+httpPrefix+"://"+replaceDomain+"/@"+possibleNickname+"\" class=\"u-url mention\">@<span>"+possibleNickname+"</span></a></span>"
replaceFound=True
break
return replaceFound
def addHtmlTags(baseDir: str,httpPrefix: str, \
nickname: str,domain: str,content: str, \ nickname: str,domain: str,content: str, \
recipients: []) -> str: recipients: []) -> str:
""" Replaces plaintext mentions such as @nick@domain into html """ Replaces plaintext mentions such as @nick@domain into html
@ -27,36 +61,18 @@ def addMentions(baseDir: str,httpPrefix: str, \
content=content.replace('\n','</p><p>') content=content.replace('\n','</p><p>')
content='<p>'+content+'</p>' content='<p>'+content+'</p>'
return content.replace('<p></p>','') return content.replace('<p></p>','')
# read the following list so that we can detect just @nick
# in addition to @nick@domain
with open(followingFilename, "r") as f: with open(followingFilename, "r") as f:
following = f.readlines() following = f.readlines()
# extract mentions and tags from words
for wordStr in words: for wordStr in words:
if wordStr.startswith('@'): if addMention(wordStr,httpPrefix,following,replaceMentions,recipients):
if len(wordStr)>1: continue
possibleHandle=wordStr[1:]
if '@' in possibleHandle: # replace words with their html versions
possibleNickname=possibleHandle.split('@')[0]
possibleDomain=possibleHandle.split('@')[1]
replaceFound=False
for follow in following:
if follow.replace('\n','')==possibleHandle:
recipientActor=httpPrefix+"://"+possibleDomain+"/users/"+possibleNickname
if recipientActor not in recipients:
recipients.append(recipientActor)
replaceMentions[wordStr]="<span class=\"h-card\"><a href=\""+httpPrefix+"://"+possibleDomain+"/@"+possibleNickname+"\" class=\"u-url mention\">@<span>"+possibleNickname+"</span></a></span>"
replaceFound=True
break
if not replaceFound:
# fall back to a best effort match if an exact one is not found
for follow in following:
if follow.startswith(possibleNickname+'@'):
replaceDomain=follow.replace('\n','').split('@')[1]
recipientActor=httpPrefix+"://"+replaceDomain+"/users/"+possibleNickname
if recipientActor not in recipients:
recipients.append(recipientActor)
replaceMentions[wordStr]="<span class=\"h-card\"><a href=\""+httpPrefix+"://"+replaceDomain+"/@"+possibleNickname+"\" class=\"u-url mention\">@<span>"+possibleNickname+"</span></a></span>"
replaceFound=True
break
# do the mention replacements
for wordStr,replaceStr in replaceMentions.items(): for wordStr,replaceStr in replaceMentions.items():
content=content.replace(wordStr,replaceStr) content=content.replace(wordStr,replaceStr)
content=content.replace('\n','</p><p>') content=content.replace('\n','</p><p>')

View File

@ -86,7 +86,7 @@ from manualapprove import manualDenyFollowRequest
from manualapprove import manualApproveFollowRequest from manualapprove import manualApproveFollowRequest
from announce import createAnnounce from announce import createAnnounce
from announce import outboxAnnounce from announce import outboxAnnounce
from content import addMentions from content import addHtmlTags
from media import removeMetaData from media import removeMetaData
import os import os
import sys import sys
@ -1835,7 +1835,7 @@ class PubServer(BaseHTTPRequestHandler):
if fields.get('bio'): if fields.get('bio'):
if fields['bio']!=actorJson['summary']: if fields['bio']!=actorJson['summary']:
actorJson['summary']= \ actorJson['summary']= \
addMentions(self.server.baseDir, \ addHtmlTags(self.server.baseDir, \
self.server.httpPrefix, \ self.server.httpPrefix, \
nickname, \ nickname, \
self.server.domain,fields['bio'],[]) self.server.domain,fields['bio'],[])

View File

@ -39,7 +39,7 @@ from utils import validNickname
from capabilities import getOcapFilename from capabilities import getOcapFilename
from capabilities import capabilitiesUpdate from capabilities import capabilitiesUpdate
from media import attachImage from media import attachImage
from content import addMentions from content import addHtmlTags
from auth import createBasicAuthHeader from auth import createBasicAuthHeader
try: try:
from BeautifulSoup import BeautifulSoup from BeautifulSoup import BeautifulSoup
@ -381,7 +381,7 @@ def createPostBase(baseDir: str,nickname: str, domain: str, port: int, \
mentionedRecipients=[] mentionedRecipients=[]
if not clientToServer: if not clientToServer:
# convert content to html # convert content to html
content=addMentions(baseDir,httpPrefix, \ content=addHtmlTags(baseDir,httpPrefix, \
nickname,domain,content, \ nickname,domain,content, \
mentionedRecipients) mentionedRecipients)