| 
									
										
										
										
											2019-07-15 14:11:31 +00:00
										 |  |  | __filename__ = "content.py" | 
					
						
							|  |  |  | __author__ = "Bob Mottram" | 
					
						
							|  |  |  | __license__ = "AGPL3+" | 
					
						
							| 
									
										
										
										
											2019-08-29 13:35:29 +00:00
										 |  |  | __version__ = "1.0.0" | 
					
						
							| 
									
										
										
										
											2019-07-15 14:11:31 +00:00
										 |  |  | __maintainer__ = "Bob Mottram" | 
					
						
							|  |  |  | __email__ = "bob@freedombone.net" | 
					
						
							|  |  |  | __status__ = "Production" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import os | 
					
						
							| 
									
										
										
										
											2019-09-29 14:48:17 +00:00
										 |  |  | import time | 
					
						
							| 
									
										
										
										
											2019-07-15 14:11:31 +00:00
										 |  |  | import commentjson | 
					
						
							| 
									
										
										
										
											2019-08-11 16:55:22 +00:00
										 |  |  | from shutil import copyfile | 
					
						
							| 
									
										
										
										
											2019-07-15 14:11:31 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-09-29 17:20:10 +00:00
										 |  |  | def replaceEmojiFromTags(content: str,tag: [],messageType: str) -> str: | 
					
						
							| 
									
										
										
										
											2019-09-29 16:28:02 +00:00
										 |  |  |     """Uses the tags to replace :emoji: with html image markup
 | 
					
						
							|  |  |  |     """
 | 
					
						
							| 
									
										
										
										
											2019-09-29 17:20:10 +00:00
										 |  |  |     for tagItem in tag: | 
					
						
							|  |  |  |         if not tagItem.get('type'): | 
					
						
							|  |  |  |             continue | 
					
						
							|  |  |  |         if tagItem['type']!='Emoji': | 
					
						
							|  |  |  |             continue | 
					
						
							|  |  |  |         if not tagItem.get('name'): | 
					
						
							| 
									
										
										
										
											2019-09-29 16:28:02 +00:00
										 |  |  |             continue | 
					
						
							|  |  |  |         if not tagItem.get('icon'): | 
					
						
							|  |  |  |             continue | 
					
						
							|  |  |  |         if not tagItem['icon'].get('url'): | 
					
						
							|  |  |  |             continue | 
					
						
							|  |  |  |         if tagItem['name'] not in content: | 
					
						
							|  |  |  |             continue | 
					
						
							|  |  |  |         htmlClass='emoji' | 
					
						
							|  |  |  |         if messageType=='post header': | 
					
						
							|  |  |  |             htmlClass='emojiheader'             | 
					
						
							|  |  |  |         if messageType=='profile': | 
					
						
							|  |  |  |             htmlClass='emojiprofile' | 
					
						
							|  |  |  |         emojiHtml="<img src=\""+tagItem['icon']['url']+"\" alt=\""+tagItem['name'].replace(':','')+"\" align=\"middle\" class=\""+htmlClass+"\"/>" | 
					
						
							|  |  |  |         content=content.replace(tagItem['name'],emojiHtml) | 
					
						
							|  |  |  |     return content | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-09-05 09:54:27 +00:00
										 |  |  | def addMusicTag(content: str,tag: str) -> str: | 
					
						
							|  |  |  |     """If a music link is found then ensure that the post is tagged appropriately
 | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  |     if '#' not in tag: | 
					
						
							|  |  |  |         tag='#'+tag | 
					
						
							|  |  |  |     if tag in content: | 
					
						
							|  |  |  |         return content | 
					
						
							|  |  |  |     musicSites=['soundcloud.com','bandcamp.com'] | 
					
						
							|  |  |  |     musicSiteFound=False | 
					
						
							|  |  |  |     for site in musicSites: | 
					
						
							|  |  |  |         if site+'/' in content: | 
					
						
							|  |  |  |             musicSiteFound=True | 
					
						
							|  |  |  |             break | 
					
						
							|  |  |  |     if not musicSiteFound: | 
					
						
							|  |  |  |         return content | 
					
						
							| 
									
										
										
										
											2019-09-24 09:27:34 +00:00
										 |  |  |     return ':music: '+content+' '+tag+' ' | 
					
						
							| 
									
										
										
										
											2019-09-05 09:54:27 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-08-21 12:07:30 +00:00
										 |  |  | def addWebLinks(content: str) -> str: | 
					
						
							|  |  |  |     """Adds markup for web links
 | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  |     if not ('https://' in content or 'http://' in content): | 
					
						
							|  |  |  |         return content | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-09-01 08:55:05 +00:00
										 |  |  |     words=content.replace('\n',' --linebreak--').split(' ') | 
					
						
							| 
									
										
										
										
											2019-08-21 12:07:30 +00:00
										 |  |  |     replaceDict={} | 
					
						
							|  |  |  |     for w in words: | 
					
						
							| 
									
										
										
										
											2019-08-21 12:29:30 +00:00
										 |  |  |         if w.startswith('https://') or w.startswith('http://'): | 
					
						
							| 
									
										
										
										
											2019-08-21 12:07:30 +00:00
										 |  |  |             if w.endswith('.') or w.endswith(';'): | 
					
						
							|  |  |  |                 w=w[:-1] | 
					
						
							|  |  |  |             markup='<a href="'+w+'" rel="nofollow noopener" target="_blank">' | 
					
						
							|  |  |  |             if w.startswith('https://'): | 
					
						
							|  |  |  |                 markup+='<span class="invisible">https://</span>' | 
					
						
							|  |  |  |             elif w.startswith('http://'): | 
					
						
							|  |  |  |                 markup+='<span class="invisible">http://</span>' | 
					
						
							| 
									
										
										
										
											2019-09-18 08:37:42 +00:00
										 |  |  |             linkText=w.replace('https://','').replace('http://','') | 
					
						
							|  |  |  |             # prevent links from becoming too long | 
					
						
							|  |  |  |             if len(linkText)>50: | 
					
						
							|  |  |  |                 linkText=linkText[:50] | 
					
						
							|  |  |  |             markup+='<span class="ellipsis">'+linkText+'</span></a>' | 
					
						
							| 
									
										
										
										
											2019-08-21 12:07:30 +00:00
										 |  |  |             replaceDict[w]=markup | 
					
						
							|  |  |  |     for url,markup in replaceDict.items(): | 
					
						
							|  |  |  |         content=content.replace(url,markup) | 
					
						
							| 
									
										
										
										
											2019-09-01 08:55:05 +00:00
										 |  |  |     content=content.replace(' --linebreak--','<br>') | 
					
						
							| 
									
										
										
										
											2019-08-21 12:07:30 +00:00
										 |  |  |     return content | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-08-09 11:12:08 +00:00
										 |  |  | def validHashTag(hashtag: str) -> bool: | 
					
						
							|  |  |  |     """Returns true if the give hashtag contains valid characters
 | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  |     validChars = set('0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ') | 
					
						
							|  |  |  |     if set(hashtag).issubset(validChars): | 
					
						
							|  |  |  |         return True | 
					
						
							|  |  |  |     return False | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def addHashTags(wordStr: str,httpPrefix: str,domain: str,replaceHashTags: {},postHashtags: {}) -> bool: | 
					
						
							|  |  |  |     """Detects hashtags and adds them to the replacements dict
 | 
					
						
							|  |  |  |     Also updates the hashtags list to be added to the post | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  |     if not wordStr.startswith('#'): | 
					
						
							|  |  |  |         return False | 
					
						
							|  |  |  |     if len(wordStr)<2: | 
					
						
							|  |  |  |         return False | 
					
						
							|  |  |  |     if replaceHashTags.get(wordStr): | 
					
						
							|  |  |  |        return True | 
					
						
							|  |  |  |     hashtag=wordStr[1:] | 
					
						
							|  |  |  |     if not validHashTag(hashtag): | 
					
						
							|  |  |  |         return False | 
					
						
							|  |  |  |     hashtagUrl=httpPrefix+"://"+domain+"/tags/"+hashtag | 
					
						
							|  |  |  |     postHashtags[hashtag]= { | 
					
						
							|  |  |  |         'href': hashtagUrl, | 
					
						
							|  |  |  |         'name': '#'+hashtag, | 
					
						
							|  |  |  |         'type': 'Hashtag' | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     replaceHashTags[wordStr]= \ | 
					
						
							|  |  |  |         "<a href=\""+hashtagUrl+"\" class=\"mention hashtag\" rel=\"tag\">#<span>"+hashtag+"</span></a>" | 
					
						
							|  |  |  |     return True | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-08-09 16:18:00 +00:00
										 |  |  | def loadEmojiDict(emojiDataFilename: str,emojiDict: {}) -> None: | 
					
						
							|  |  |  |     """Creates an emoji dictionary based on emoji/emoji-data.txt
 | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  |     if not os.path.isfile(emojiDataFilename): | 
					
						
							|  |  |  |         return | 
					
						
							|  |  |  |     with open (emojiDataFilename, "r") as fileHandler: | 
					
						
							|  |  |  |         for line in fileHandler: | 
					
						
							|  |  |  |             if len(line)<5: | 
					
						
							|  |  |  |                 continue | 
					
						
							|  |  |  |             if line.startswith('#'): | 
					
						
							|  |  |  |                 continue | 
					
						
							|  |  |  |             if '; Emoji' not in line: | 
					
						
							|  |  |  |                 continue | 
					
						
							|  |  |  |             if ')' not in line: | 
					
						
							|  |  |  |                 continue | 
					
						
							|  |  |  |             emojiUnicode=line.split(' ')[0] | 
					
						
							|  |  |  |             if len(emojiUnicode)<4: | 
					
						
							|  |  |  |                 continue | 
					
						
							|  |  |  |             if '..' in emojiUnicode: | 
					
						
							|  |  |  |                 emojiUnicode=emojiUnicode.split('..')[0] | 
					
						
							| 
									
										
										
										
											2019-08-09 18:48:40 +00:00
										 |  |  |             emojiName=line.split(')',1)[1].strip().replace('\n','').replace(' ','').replace('-','') | 
					
						
							| 
									
										
										
										
											2019-08-09 16:18:00 +00:00
										 |  |  |             if '..' in emojiName: | 
					
						
							|  |  |  |                 emojiName=emojiName.split('..')[0] | 
					
						
							|  |  |  |             emojiDict[emojiName.lower()]=emojiUnicode | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-09-23 11:36:54 +00:00
										 |  |  | def addEmoji(baseDir: str,wordStr: str,httpPrefix: str,domain: str,replaceEmoji: {},postTags: {},emojiDict: {}) -> bool: | 
					
						
							| 
									
										
										
										
											2019-08-09 16:18:00 +00:00
										 |  |  |     """Detects Emoji and adds them to the replacements dict
 | 
					
						
							|  |  |  |     Also updates the tags list to be added to the post | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  |     if not wordStr.startswith(':'): | 
					
						
							|  |  |  |         return False | 
					
						
							|  |  |  |     if not wordStr.endswith(':'): | 
					
						
							|  |  |  |         return False | 
					
						
							|  |  |  |     if len(wordStr)<3: | 
					
						
							|  |  |  |         return False | 
					
						
							|  |  |  |     if replaceEmoji.get(wordStr): | 
					
						
							|  |  |  |        return True | 
					
						
							| 
									
										
										
										
											2019-09-23 11:11:13 +00:00
										 |  |  |     # remove leading and trailing : characters | 
					
						
							| 
									
										
										
										
											2019-08-09 16:18:00 +00:00
										 |  |  |     emoji=wordStr[1:] | 
					
						
							|  |  |  |     emoji=emoji[:-1] | 
					
						
							| 
									
										
										
										
											2019-09-23 11:11:13 +00:00
										 |  |  |     # is the text of the emoji valid? | 
					
						
							| 
									
										
										
										
											2019-08-09 16:18:00 +00:00
										 |  |  |     if not validHashTag(emoji): | 
					
						
							|  |  |  |         return False | 
					
						
							|  |  |  |     if not emojiDict.get(emoji): | 
					
						
							|  |  |  |         return False | 
					
						
							|  |  |  |     emojiFilename=baseDir+'/emoji/'+emojiDict[emoji]+'.png' | 
					
						
							|  |  |  |     if not os.path.isfile(emojiFilename): | 
					
						
							|  |  |  |         return False | 
					
						
							|  |  |  |     emojiUrl=httpPrefix+"://"+domain+"/emoji/"+emojiDict[emoji]+'.png' | 
					
						
							|  |  |  |     postTags[emoji]= { | 
					
						
							| 
									
										
										
										
											2019-08-19 13:35:55 +00:00
										 |  |  |         'icon': { | 
					
						
							|  |  |  |             'mediaType': 'image/png', | 
					
						
							|  |  |  |             'type': 'Image', | 
					
						
							|  |  |  |             'url': emojiUrl | 
					
						
							|  |  |  |         }, | 
					
						
							| 
									
										
										
										
											2019-08-09 16:18:00 +00:00
										 |  |  |         'name': ':'+emoji+':', | 
					
						
							|  |  |  |         'type': 'Emoji' | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     return True | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-08-19 12:13:18 +00:00
										 |  |  | def addMention(wordStr: str,httpPrefix: str,following: str,replaceMentions: {},recipients: [],tags: {}) -> bool: | 
					
						
							| 
									
										
										
										
											2019-08-09 09:09:21 +00:00
										 |  |  |     """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:] | 
					
						
							| 
									
										
										
										
											2019-08-19 10:05:50 +00:00
										 |  |  |     # @nick | 
					
						
							| 
									
										
										
										
											2019-08-19 11:41:15 +00:00
										 |  |  |     if following and '@' not in possibleHandle: | 
					
						
							| 
									
										
										
										
											2019-08-09 09:48:51 +00:00
										 |  |  |         # fall back to a best effort match against the following list | 
					
						
							|  |  |  |         # if no domain was specified. eg. @nick | 
					
						
							|  |  |  |         possibleNickname=possibleHandle | 
					
						
							|  |  |  |         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) | 
					
						
							| 
									
										
										
										
											2019-08-19 12:13:18 +00:00
										 |  |  |                 tags[wordStr]={ | 
					
						
							|  |  |  |                     'href': recipientActor, | 
					
						
							|  |  |  |                     'name': wordStr, | 
					
						
							|  |  |  |                     'type': 'Mention' | 
					
						
							|  |  |  |                 } | 
					
						
							| 
									
										
										
										
											2019-08-09 09:48:51 +00:00
										 |  |  |                 replaceMentions[wordStr]="<span class=\"h-card\"><a href=\""+httpPrefix+"://"+replaceDomain+"/@"+possibleNickname+"\" class=\"u-url mention\">@<span>"+possibleNickname+"</span></a></span>" | 
					
						
							|  |  |  |                 return True | 
					
						
							|  |  |  |         return False | 
					
						
							| 
									
										
										
										
											2019-08-09 09:09:21 +00:00
										 |  |  |     possibleNickname=possibleHandle.split('@')[0] | 
					
						
							| 
									
										
										
										
											2019-08-19 10:43:52 +00:00
										 |  |  |     possibleDomain=possibleHandle.split('@')[1].strip('\n') | 
					
						
							| 
									
										
										
										
											2019-08-19 11:41:15 +00:00
										 |  |  |     if following: | 
					
						
							|  |  |  |         for follow in following: | 
					
						
							|  |  |  |             if follow.replace('\n','')!=possibleHandle: | 
					
						
							|  |  |  |                 continue | 
					
						
							|  |  |  |             recipientActor=httpPrefix+"://"+possibleDomain+"/users/"+possibleNickname | 
					
						
							|  |  |  |             if recipientActor not in recipients: | 
					
						
							|  |  |  |                 recipients.append(recipientActor) | 
					
						
							| 
									
										
										
										
											2019-08-19 12:13:18 +00:00
										 |  |  |             tags[wordStr]={ | 
					
						
							|  |  |  |                 'href': recipientActor, | 
					
						
							|  |  |  |                 'name': wordStr, | 
					
						
							|  |  |  |                 'type': 'Mention' | 
					
						
							|  |  |  |             } | 
					
						
							| 
									
										
										
										
											2019-08-19 11:41:15 +00:00
										 |  |  |             replaceMentions[wordStr]="<span class=\"h-card\"><a href=\""+httpPrefix+"://"+possibleDomain+"/@"+possibleNickname+"\" class=\"u-url mention\">@<span>"+possibleNickname+"</span></a></span>" | 
					
						
							|  |  |  |             return True | 
					
						
							| 
									
										
										
										
											2019-08-19 10:05:50 +00:00
										 |  |  |     # @nick@domain | 
					
						
							|  |  |  |     if '@' in possibleHandle: | 
					
						
							| 
									
										
										
										
											2019-08-19 10:43:52 +00:00
										 |  |  |         if not (possibleDomain=='localhost' or '.' in possibleDomain): | 
					
						
							|  |  |  |             return False         | 
					
						
							|  |  |  |         recipientActor=httpPrefix+"://"+possibleDomain+"/users/"+possibleNickname | 
					
						
							| 
									
										
										
										
											2019-08-19 10:05:50 +00:00
										 |  |  |         if recipientActor not in recipients: | 
					
						
							|  |  |  |             recipients.append(recipientActor) | 
					
						
							| 
									
										
										
										
											2019-08-19 12:13:18 +00:00
										 |  |  |         tags[wordStr]={ | 
					
						
							|  |  |  |             'href': recipientActor, | 
					
						
							|  |  |  |             'name': wordStr, | 
					
						
							|  |  |  |             'type': 'Mention' | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2019-08-19 10:46:23 +00:00
										 |  |  |         replaceMentions[wordStr]="<span class=\"h-card\"><a href=\""+httpPrefix+"://"+possibleDomain+"/@"+possibleNickname+"\" class=\"u-url mention\">@<span>"+possibleNickname+"</span></a></span>" | 
					
						
							|  |  |  |         return True | 
					
						
							| 
									
										
										
										
											2019-08-09 09:46:33 +00:00
										 |  |  |     return False | 
					
						
							| 
									
										
										
										
											2019-08-09 09:09:21 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | def addHtmlTags(baseDir: str,httpPrefix: str, \ | 
					
						
							| 
									
										
										
										
											2019-08-05 16:56:32 +00:00
										 |  |  |                 nickname: str,domain: str,content: str, \ | 
					
						
							| 
									
										
										
										
											2019-08-09 11:12:08 +00:00
										 |  |  |                 recipients: [],hashtags: {}) -> str: | 
					
						
							| 
									
										
										
										
											2019-07-15 14:11:31 +00:00
										 |  |  |     """ Replaces plaintext mentions such as @nick@domain into html
 | 
					
						
							|  |  |  |     by matching against known following accounts | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  |     if content.startswith('<p>'): | 
					
						
							|  |  |  |         return content | 
					
						
							| 
									
										
										
										
											2019-09-05 10:26:08 +00:00
										 |  |  |     content=content.replace('\n',' --linebreak-- ') | 
					
						
							| 
									
										
										
										
											2019-09-05 10:29:09 +00:00
										 |  |  |     content=addMusicTag(content,'nowplaying') | 
					
						
							| 
									
										
										
										
											2019-09-05 10:26:08 +00:00
										 |  |  |     words=content.replace(',',' ').replace(';',' ').split(' ') | 
					
						
							| 
									
										
										
										
											2019-09-05 09:54:27 +00:00
										 |  |  |      | 
					
						
							| 
									
										
										
										
											2019-08-19 11:07:04 +00:00
										 |  |  |     # remove . for words which are not mentions | 
					
						
							|  |  |  |     wordCtr=0 | 
					
						
							| 
									
										
										
										
											2019-08-19 11:14:38 +00:00
										 |  |  |     newWords=[] | 
					
						
							| 
									
										
										
										
											2019-08-19 11:22:05 +00:00
										 |  |  |     for wordIndex in range(0,len(words)): | 
					
						
							| 
									
										
										
										
											2019-08-19 11:07:04 +00:00
										 |  |  |         wordStr=words[wordIndex] | 
					
						
							|  |  |  |         if wordStr.endswith('.'): | 
					
						
							|  |  |  |             if not wordStr.startswith('@'): | 
					
						
							| 
									
										
										
										
											2019-08-19 11:14:38 +00:00
										 |  |  |                 wordStr=wordStr[:-1] | 
					
						
							| 
									
										
										
										
											2019-08-19 11:08:47 +00:00
										 |  |  |         if wordStr.startswith('.'): | 
					
						
							| 
									
										
										
										
											2019-08-19 11:14:38 +00:00
										 |  |  |             wordStr=wordStr[1:] | 
					
						
							|  |  |  |         newWords.append(wordStr) | 
					
						
							|  |  |  |     words=newWords | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-07-15 14:11:31 +00:00
										 |  |  |     replaceMentions={} | 
					
						
							| 
									
										
										
										
											2019-08-09 11:12:08 +00:00
										 |  |  |     replaceHashTags={} | 
					
						
							| 
									
										
										
										
											2019-08-09 16:18:00 +00:00
										 |  |  |     replaceEmoji={} | 
					
						
							|  |  |  |     emojiDict={} | 
					
						
							|  |  |  |     originalDomain=domain | 
					
						
							| 
									
										
										
										
											2019-07-15 14:24:33 +00:00
										 |  |  |     if ':' in domain: | 
					
						
							|  |  |  |         domain=domain.split(':')[0] | 
					
						
							| 
									
										
										
										
											2019-07-15 14:11:31 +00:00
										 |  |  |     followingFilename=baseDir+'/accounts/'+nickname+'@'+domain+'/following.txt' | 
					
						
							| 
									
										
										
										
											2019-08-09 09:09:21 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     # read the following list so that we can detect just @nick | 
					
						
							|  |  |  |     # in addition to @nick@domain | 
					
						
							| 
									
										
										
										
											2019-08-10 16:55:17 +00:00
										 |  |  |     following=None | 
					
						
							|  |  |  |     if os.path.isfile(followingFilename): | 
					
						
							|  |  |  |         with open(followingFilename, "r") as f: | 
					
						
							|  |  |  |             following = f.readlines() | 
					
						
							| 
									
										
										
										
											2019-08-09 09:09:21 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     # extract mentions and tags from words | 
					
						
							| 
									
										
										
										
											2019-07-15 14:11:31 +00:00
										 |  |  |     for wordStr in words: | 
					
						
							| 
									
										
										
										
											2019-08-19 12:13:18 +00:00
										 |  |  |         if addMention(wordStr,httpPrefix,following,replaceMentions,recipients,hashtags): | 
					
						
							| 
									
										
										
										
											2019-08-19 11:41:15 +00:00
										 |  |  |             continue | 
					
						
							| 
									
										
										
										
											2019-08-09 16:18:00 +00:00
										 |  |  |         if addHashTags(wordStr,httpPrefix,originalDomain,replaceHashTags,hashtags): | 
					
						
							|  |  |  |             continue | 
					
						
							| 
									
										
										
										
											2019-09-29 15:57:54 +00:00
										 |  |  |         if len(wordStr)>2: | 
					
						
							|  |  |  |             if wordStr.startswith(':'): | 
					
						
							|  |  |  |                 if wordStr.endswith(':'): | 
					
						
							|  |  |  |                     if not emojiDict: | 
					
						
							| 
									
										
										
										
											2019-09-23 11:07:01 +00:00
										 |  |  |                         print('Loading emoji lookup') | 
					
						
							|  |  |  |                         if not os.path.isfile(baseDir+'/emoji/emoji.json'): | 
					
						
							|  |  |  |                             copyfile(baseDir+'/emoji/default_emoji.json',baseDir+'/emoji/emoji.json') | 
					
						
							| 
									
										
										
										
											2019-09-29 19:45:19 +00:00
										 |  |  |                     emojiDictCtr=0 | 
					
						
							|  |  |  |                     while not emojiDict and emojiDictCtr<4: | 
					
						
							|  |  |  |                         if emojiDictCtr>0: | 
					
						
							|  |  |  |                             print('Retry emoji load '+baseDir+'/emoji/emoji.json') | 
					
						
							|  |  |  |                         try: | 
					
						
							|  |  |  |                             with open(baseDir+'/emoji/emoji.json', 'r') as fp: | 
					
						
							|  |  |  |                                 emojiDict=commentjson.load(fp) | 
					
						
							|  |  |  |                             break | 
					
						
							|  |  |  |                         except Exception as e: | 
					
						
							| 
									
										
										
										
											2019-09-29 19:51:12 +00:00
										 |  |  |                             print('Failed to load emoji: '+baseDir+'/emoji/emoji.json '+str(e)) | 
					
						
							| 
									
										
										
										
											2019-09-29 19:45:19 +00:00
										 |  |  |                             time.sleep(1) | 
					
						
							|  |  |  |                             emojiDictCtr+=1 | 
					
						
							| 
									
										
										
										
											2019-08-11 17:16:42 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-09-29 15:57:54 +00:00
										 |  |  |                     addEmoji(baseDir,wordStr,httpPrefix,originalDomain,replaceEmoji,hashtags,emojiDict) | 
					
						
							| 
									
										
										
										
											2019-08-09 09:09:21 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     # replace words with their html versions | 
					
						
							| 
									
										
										
										
											2019-07-15 14:11:31 +00:00
										 |  |  |     for wordStr,replaceStr in replaceMentions.items(): | 
					
						
							|  |  |  |         content=content.replace(wordStr,replaceStr) | 
					
						
							| 
									
										
										
										
											2019-08-09 11:12:08 +00:00
										 |  |  |     for wordStr,replaceStr in replaceHashTags.items(): | 
					
						
							|  |  |  |         content=content.replace(wordStr,replaceStr) | 
					
						
							| 
									
										
										
										
											2019-08-09 16:18:00 +00:00
										 |  |  |     for wordStr,replaceStr in replaceEmoji.items(): | 
					
						
							|  |  |  |         content=content.replace(wordStr,replaceStr) | 
					
						
							| 
									
										
										
										
											2019-08-09 11:12:08 +00:00
										 |  |  |          | 
					
						
							| 
									
										
										
										
											2019-08-21 12:07:30 +00:00
										 |  |  |     content=addWebLinks(content) | 
					
						
							| 
									
										
										
										
											2019-09-05 10:23:22 +00:00
										 |  |  |     content=content.replace(' --linebreak-- ','</p><p>') | 
					
						
							| 
									
										
										
										
											2019-07-15 14:11:31 +00:00
										 |  |  |     return '<p>'+content+'</p>' | 
					
						
							|  |  |  |                  | 
					
						
							| 
									
										
										
										
											2019-08-05 19:13:15 +00:00
										 |  |  | 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 | 
					
						
							| 
									
										
										
										
											2019-08-05 19:20:13 +00:00
										 |  |  |     mentionsList=htmlText.split(matchStr) | 
					
						
							| 
									
										
										
										
											2019-08-05 19:13:15 +00:00
										 |  |  |     for mentionStr in mentionsList: | 
					
						
							|  |  |  |         if '"' not in mentionStr: | 
					
						
							|  |  |  |             continue | 
					
						
							|  |  |  |         actorStr=mentionStr.split('"')[0] | 
					
						
							|  |  |  |         if actorStr.startswith('http') or \ | 
					
						
							|  |  |  |            actorStr.startswith('dat:'): | 
					
						
							| 
									
										
										
										
											2019-09-22 17:54:33 +00:00
										 |  |  |             if actorStr not in mentions: | 
					
						
							|  |  |  |                 mentions.append(actorStr) | 
					
						
							| 
									
										
										
										
											2019-08-05 19:13:15 +00:00
										 |  |  |     return mentions |