Merge branch 'main' of gitlab.com:bashrc2/epicyon

merge-requests/30/head
Bob Mottram 2021-11-12 21:33:31 +00:00
commit 3af1ddedbd
6 changed files with 143 additions and 18 deletions

View File

@ -2550,7 +2550,26 @@ class PubServer(BaseHTTPRequestHandler):
self.server.themeName, self.server.themeName,
True, accessKeys, True, accessKeys,
customSubmitText, customSubmitText,
conversationId).encode('utf-8') conversationId,
self.server.recentPostsCache,
self.server.maxRecentPosts,
self.server.session,
self.server.cachedWebfingers,
self.server.personCache,
self.server.port,
None,
self.server.projectVersion,
self.server.YTReplacementDomain,
self.server.twitterReplacementDomain,
self.server.showPublishedDateOnly,
self.server.peertubeInstances,
self.server.allowLocalNetworkAccess,
self.server.systemLanguage,
self.server.maxLikeCount,
self.server.signingPrivateKeyPem,
self.server.CWlists,
self.server.listsEnabled,
self.server.defaultTimeline).encode('utf-8')
msglen = len(msg) msglen = len(msg)
self._set_headers('text/html', msglen, self._set_headers('text/html', msglen,
cookie, callingDomain, False) cookie, callingDomain, False)
@ -2665,7 +2684,26 @@ class PubServer(BaseHTTPRequestHandler):
self.server.themeName, self.server.themeName,
True, accessKeys, True, accessKeys,
customSubmitText, customSubmitText,
conversationId).encode('utf-8') conversationId,
self.server.recentPostsCache,
self.server.maxRecentPosts,
self.server.session,
self.server.cachedWebfingers,
self.server.personCache,
self.server.port,
None,
self.server.projectVersion,
self.server.YTReplacementDomain,
self.server.twitterReplacementDomain,
self.server.showPublishedDateOnly,
self.server.peertubeInstances,
self.server.allowLocalNetworkAccess,
self.server.systemLanguage,
self.server.maxLikeCount,
self.server.signingPrivateKeyPem,
self.server.CWlists,
self.server.listsEnabled,
self.server.defaultTimeline).encode('utf-8')
msglen = len(msg) msglen = len(msg)
self._set_headers('text/html', msglen, self._set_headers('text/html', msglen,
cookie, callingDomain, False) cookie, callingDomain, False)
@ -8186,7 +8224,7 @@ class PubServer(BaseHTTPRequestHandler):
'actor': undoActor, 'actor': undoActor,
'to': [actorReaction], 'to': [actorReaction],
'object': { 'object': {
'type': 'EmojiReaction', 'type': 'EmojiReact',
'actor': undoActor, 'actor': undoActor,
'to': [actorReaction], 'to': [actorReaction],
'object': reactionUrl2 'object': reactionUrl2
@ -8217,8 +8255,8 @@ class PubServer(BaseHTTPRequestHandler):
undoReactionCollectionEntry(recentPostsCache, undoReactionCollectionEntry(recentPostsCache,
baseDir, baseDir,
reactionPostFilename, reactionUrl, reactionPostFilename, reactionUrl,
undoActor, domain, debug, None, undoActor, domain, debug,
emojiContent) reactionPostJson, emojiContent)
if debug: if debug:
print('Regenerating html post for changed ' + print('Regenerating html post for changed ' +
'emoji reaction collection') 'emoji reaction collection')
@ -8259,6 +8297,7 @@ class PubServer(BaseHTTPRequestHandler):
else: else:
print('WARN: Unreaction post not found: ' + print('WARN: Unreaction post not found: ' +
reactionPostFilename) reactionPostFilename)
self.server.GETbusy = False self.server.GETbusy = False
actorAbsolute = self._getInstanceUrl(callingDomain) + actor actorAbsolute = self._getInstanceUrl(callingDomain) + actor
actorPathStr = \ actorPathStr = \
@ -8353,7 +8392,7 @@ class PubServer(BaseHTTPRequestHandler):
self.server.signingPrivateKeyPem, self.server.signingPrivateKeyPem,
self.server.CWlists, self.server.CWlists,
self.server.listsEnabled, self.server.listsEnabled,
self.server.defaultTimeline) timelineStr, pageNumber)
msg = msg.encode('utf-8') msg = msg.encode('utf-8')
msglen = len(msg) msglen = len(msg)
self._set_headers('text/html', msglen, self._set_headers('text/html', msglen,
@ -12518,6 +12557,13 @@ class PubServer(BaseHTTPRequestHandler):
customSubmitText = getConfigParam(baseDir, 'customSubmitText') customSubmitText = getConfigParam(baseDir, 'customSubmitText')
postJsonObject = None
if inReplyToUrl:
replyPostFilename = \
locatePost(baseDir, nickname, domain, inReplyToUrl)
if replyPostFilename:
postJsonObject = loadJson(replyPostFilename)
msg = htmlNewPost(self.server.cssCache, msg = htmlNewPost(self.server.cssCache,
mediaInstance, mediaInstance,
translate, translate,
@ -12535,7 +12581,26 @@ class PubServer(BaseHTTPRequestHandler):
self.server.themeName, self.server.themeName,
noDropDown, accessKeys, noDropDown, accessKeys,
customSubmitText, customSubmitText,
conversationId).encode('utf-8') conversationId,
self.server.recentPostsCache,
self.server.maxRecentPosts,
self.server.session,
self.server.cachedWebfingers,
self.server.personCache,
self.server.port,
postJsonObject,
self.server.projectVersion,
self.server.YTReplacementDomain,
self.server.twitterReplacementDomain,
self.server.showPublishedDateOnly,
self.server.peertubeInstances,
self.server.allowLocalNetworkAccess,
self.server.systemLanguage,
self.server.maxLikeCount,
self.server.signingPrivateKeyPem,
self.server.CWlists,
self.server.listsEnabled,
self.server.defaultTimeline).encode('utf-8')
if not msg: if not msg:
print('Error replying to ' + inReplyToUrl) print('Error replying to ' + inReplyToUrl)
self._404() self._404()
@ -14903,7 +14968,9 @@ class PubServer(BaseHTTPRequestHandler):
self.server.debug) self.server.debug)
# emoji reaction from the web interface icon # emoji reaction from the web interface icon
if authorized and htmlGET and '?react=' in self.path: if authorized and htmlGET and \
'?react=' in self.path and \
'?actor=' in self.path:
self._reactionButton(callingDomain, self.path, self._reactionButton(callingDomain, self.path,
self.server.baseDir, self.server.baseDir,
self.server.httpPrefix, self.server.httpPrefix,
@ -14922,7 +14989,9 @@ class PubServer(BaseHTTPRequestHandler):
self.server.debug) self.server.debug)
# undo an emoji reaction from the web interface icon # undo an emoji reaction from the web interface icon
if authorized and htmlGET and '?unreact=' in self.path: if authorized and htmlGET and \
'?unreact=' in self.path and \
'?actor=' in self.path:
self._undoReactionButton(callingDomain, self.path, self._undoReactionButton(callingDomain, self.path,
self.server.baseDir, self.server.baseDir,
self.server.httpPrefix, self.server.httpPrefix,

View File

@ -345,6 +345,10 @@ a:visited:hover {
filter: brightness(var(--icon-brightness-change)); filter: brightness(var(--icon-brightness-change));
} }
.rlab:hover {
text-decoration: underline;
}
a:focus { a:focus {
border: 2px solid var(--focus-color); border: 2px solid var(--focus-color);
} }

View File

@ -51,7 +51,7 @@ def validEmojiContent(emojiContent: str) -> bool:
""" """
if not emojiContent: if not emojiContent:
return False return False
if len(emojiContent) > 1: if len(emojiContent) > 2:
return False return False
if len(emojiRegex.findall(emojiContent)) == 0: if len(emojiRegex.findall(emojiContent)) == 0:
return False return False
@ -514,11 +514,14 @@ def updateReactionCollection(recentPostsCache: {},
def htmlEmojiReactions(postJsonObject: {}, interactive: bool, def htmlEmojiReactions(postJsonObject: {}, interactive: bool,
actor: str, maxReactionTypes: int) -> str: actor: str, maxReactionTypes: int,
boxName: str, pageNumber: int) -> str:
"""html containing row of emoji reactions """html containing row of emoji reactions
""" """
if not hasObjectDict(postJsonObject): if not hasObjectDict(postJsonObject):
return '' return ''
if not postJsonObject.get('actor'):
return ''
if not postJsonObject['object'].get('reactions'): if not postJsonObject['object'].get('reactions'):
return '' return ''
if not postJsonObject['object']['reactions'].get('items'): if not postJsonObject['object']['reactions'].get('items'):
@ -542,9 +545,13 @@ def htmlEmojiReactions(postJsonObject: {}, interactive: bool,
htmlStr = '<div class="emojiReactionBar">\n' htmlStr = '<div class="emojiReactionBar">\n'
for emojiContent, count in reactions.items(): for emojiContent, count in reactions.items():
if emojiContent not in reactedToByThisActor: if emojiContent not in reactedToByThisActor:
baseUrl = actor + '?react=' + reactBy + '?emojreact=' baseUrl = actor + '?react=' + reactBy
else: else:
baseUrl = actor + '?unreact=' + reactBy + '?emojreact=' baseUrl = actor + '?unreact=' + reactBy
baseUrl += '?actor=' + postJsonObject['actor']
baseUrl += '?tl=' + boxName
baseUrl += '?page=' + str(pageNumber)
baseUrl += '?emojreact='
htmlStr += ' <div class="emojiReactionButton">\n' htmlStr += ' <div class="emojiReactionButton">\n'
if count < 100: if count < 100:

View File

@ -5914,7 +5914,7 @@ def _testValidEmojiContent() -> None:
assert not validEmojiContent(None) assert not validEmojiContent(None)
assert not validEmojiContent(' ') assert not validEmojiContent(' ')
assert not validEmojiContent('j') assert not validEmojiContent('j')
assert not validEmojiContent('😀😀') assert not validEmojiContent('😀😀😀')
assert validEmojiContent('😀') assert validEmojiContent('😀')
assert validEmojiContent('😄') assert validEmojiContent('😄')

View File

@ -23,6 +23,7 @@ from webapp_utils import htmlFooter
from webapp_utils import editTextField from webapp_utils import editTextField
from webapp_utils import editNumberField from webapp_utils import editNumberField
from webapp_utils import editCurrencyField from webapp_utils import editCurrencyField
from webapp_post import individualPostAsHtml
def _htmlFollowingDataList(baseDir: str, nickname: str, def _htmlFollowingDataList(baseDir: str, nickname: str,
@ -195,7 +196,21 @@ def htmlNewPost(cssCache: {}, mediaInstance: bool, translate: {},
defaultTimeline: str, newswire: {}, defaultTimeline: str, newswire: {},
theme: str, noDropDown: bool, theme: str, noDropDown: bool,
accessKeys: {}, customSubmitText: str, accessKeys: {}, customSubmitText: str,
conversationId: str) -> str: conversationId: str,
recentPostsCache: {}, maxRecentPosts: int,
session, cachedWebfingers: {},
personCache: {}, port: int,
postJsonObject: {},
projectVersion: str,
YTReplacementDomain: str,
twitterReplacementDomain: str,
showPublishedDateOnly: bool,
peertubeInstances: [],
allowLocalNetworkAccess: bool,
systemLanguage: str,
maxLikeCount: int, signingPrivateKeyPem: str,
CWlists: {}, listsEnabled: str,
boxName: str) -> str:
"""New post screen """New post screen
""" """
replyStr = '' replyStr = ''
@ -242,6 +257,31 @@ def htmlNewPost(cssCache: {}, mediaInstance: bool, translate: {},
'" rel="nofollow noopener noreferrer" ' + \ '" rel="nofollow noopener noreferrer" ' + \
'target="_blank">' + \ 'target="_blank">' + \
translate['this post'] + '</a></p>\n' translate['this post'] + '</a></p>\n'
if postJsonObject:
newPostText += \
individualPostAsHtml(signingPrivateKeyPem,
True, recentPostsCache,
maxRecentPosts,
translate, None,
baseDir, session,
cachedWebfingers,
personCache,
nickname, domain, port,
postJsonObject,
None, True, False,
httpPrefix, projectVersion,
boxName,
YTReplacementDomain,
twitterReplacementDomain,
showPublishedDateOnly,
peertubeInstances,
allowLocalNetworkAccess,
theme, systemLanguage,
maxLikeCount,
False, False, False,
False, False, False,
CWlists, listsEnabled)
replyStr = '<input type="hidden" ' + \ replyStr = '<input type="hidden" ' + \
'name="replyTo" value="' + inReplyTo + '">\n' 'name="replyTo" value="' + inReplyTo + '">\n'

View File

@ -1937,7 +1937,8 @@ def individualPostAsHtml(signingPrivateKeyPem: str,
if showIcons: if showIcons:
reactionStr = \ reactionStr = \
htmlEmojiReactions(postJsonObject, True, personUrl, htmlEmojiReactions(postJsonObject, True, personUrl,
maxReactionTypes) maxReactionTypes,
boxName, pageNumber)
if postIsSensitive and reactionStr: if postIsSensitive and reactionStr:
reactionStr = '<br>' + reactionStr reactionStr = '<br>' + reactionStr
postHtml = ' <div id="' + timelinePostBookmark + \ postHtml = ' <div id="' + timelinePostBookmark + \
@ -2196,7 +2197,7 @@ def htmlEmojiReactionPicker(cssCache: {},
themeName: str, systemLanguage: str, themeName: str, systemLanguage: str,
maxLikeCount: int, signingPrivateKeyPem: str, maxLikeCount: int, signingPrivateKeyPem: str,
CWlists: {}, listsEnabled: str, CWlists: {}, listsEnabled: str,
defaultTimeline: str) -> str: boxName: str, pageNumber: int) -> str:
"""Returns the emoji picker screen """Returns the emoji picker screen
""" """
reactedToPostStr = \ reactedToPostStr = \
@ -2234,6 +2235,9 @@ def htmlEmojiReactionPicker(cssCache: {},
emojiContentEncoded = urllib.parse.quote_plus(emojiContent) emojiContentEncoded = urllib.parse.quote_plus(emojiContent)
emojiUrl = \ emojiUrl = \
baseUrl + '?react=' + postId + \ baseUrl + '?react=' + postId + \
'?actor=' + postJsonObject['actor'] + \
'?tl=' + boxName + \
'?page=' + str(pageNumber) + \
'?emojreact=' + emojiContentEncoded '?emojreact=' + emojiContentEncoded
emojiLabel = '<label class="rlab">' + emojiContent + '</label>' emojiLabel = '<label class="rlab">' + emojiContent + '</label>'
emojiPicksStr += \ emojiPicksStr += \
@ -2256,7 +2260,8 @@ def htmlEmojiReactionPicker(cssCache: {},
# banner # banner
headerStr += \ headerStr += \
'<header>\n' + \ '<header>\n' + \
'<a href="/users/' + nickname + '/' + defaultTimeline + '" title="' + \ '<a href="/users/' + nickname + '/' + boxName + \
'?page=' + str(pageNumber) + '" title="' + \
translate['Switch to timeline view'] + '" alt="' + \ translate['Switch to timeline view'] + '" alt="' + \
translate['Switch to timeline view'] + '">\n' translate['Switch to timeline view'] + '">\n'
headerStr += '<img loading="lazy" class="timeline-banner" ' + \ headerStr += '<img loading="lazy" class="timeline-banner" ' + \