mirror of https://gitlab.com/bashrc2/epicyon
				
				
				
			Separate header buttons
							parent
							
								
									1ea9aa18ac
								
							
						
					
					
						commit
						ec46767a27
					
				| 
						 | 
				
			
			@ -0,0 +1,330 @@
 | 
			
		|||
__filename__ = "webapp_headerbuttons.py"
 | 
			
		||||
__author__ = "Bob Mottram"
 | 
			
		||||
__license__ = "AGPL3+"
 | 
			
		||||
__version__ = "1.1.0"
 | 
			
		||||
__maintainer__ = "Bob Mottram"
 | 
			
		||||
__email__ = "bob@freedombone.net"
 | 
			
		||||
__status__ = "Production"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
import time
 | 
			
		||||
from datetime import datetime
 | 
			
		||||
from happening import todaysEventsCheck
 | 
			
		||||
from happening import thisWeeksEventsCheck
 | 
			
		||||
from webapp_utils import htmlHighlightLabel
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def headerButtonsTimeline(defaultTimeline: str,
 | 
			
		||||
                          boxName: str,
 | 
			
		||||
                          pageNumber: int,
 | 
			
		||||
                          translate: {},
 | 
			
		||||
                          usersPath: str,
 | 
			
		||||
                          mediaButton: str,
 | 
			
		||||
                          blogsButton: str,
 | 
			
		||||
                          newsButton: str,
 | 
			
		||||
                          inboxButton: str,
 | 
			
		||||
                          dmButton: str,
 | 
			
		||||
                          newDM: str,
 | 
			
		||||
                          repliesButton: str,
 | 
			
		||||
                          newReply: str,
 | 
			
		||||
                          minimal: bool,
 | 
			
		||||
                          sentButton: str,
 | 
			
		||||
                          sharesButtonStr: str,
 | 
			
		||||
                          bookmarksButtonStr: str,
 | 
			
		||||
                          eventsButtonStr: str,
 | 
			
		||||
                          moderationButtonStr: str,
 | 
			
		||||
                          newPostButtonStr: str,
 | 
			
		||||
                          baseDir: str,
 | 
			
		||||
                          nickname: str, domain: str,
 | 
			
		||||
                          iconsPath: str,
 | 
			
		||||
                          timelineStartTime,
 | 
			
		||||
                          newCalendarEvent: bool,
 | 
			
		||||
                          calendarPath: str,
 | 
			
		||||
                          calendarImage: str,
 | 
			
		||||
                          followApprovals: str,
 | 
			
		||||
                          iconsAsButtons: bool) -> str:
 | 
			
		||||
    """Returns the header at the top of the timeline, containing
 | 
			
		||||
    buttons for inbox, outbox, search, calendar, etc
 | 
			
		||||
    """
 | 
			
		||||
    # start of the button header with inbox, outbox, etc
 | 
			
		||||
    tlStr = '<div class="containerHeader">\n'
 | 
			
		||||
    # first button
 | 
			
		||||
    if defaultTimeline == 'tlmedia':
 | 
			
		||||
        tlStr += \
 | 
			
		||||
            '<a href="' + usersPath + \
 | 
			
		||||
            '/tlmedia"><button class="' + \
 | 
			
		||||
            mediaButton + '"><span>' + translate['Media'] + \
 | 
			
		||||
            '</span></button></a>'
 | 
			
		||||
    elif defaultTimeline == 'tlblogs':
 | 
			
		||||
        tlStr += \
 | 
			
		||||
            '<a href="' + usersPath + \
 | 
			
		||||
            '/tlblogs"><button class="' + \
 | 
			
		||||
            blogsButton + '"><span>' + translate['Blogs'] + \
 | 
			
		||||
            '</span></button></a>'
 | 
			
		||||
    elif defaultTimeline == 'tlnews':
 | 
			
		||||
        tlStr += \
 | 
			
		||||
            '<a href="' + usersPath + \
 | 
			
		||||
            '/tlnews"><button class="' + \
 | 
			
		||||
            newsButton + '"><span>' + translate['Features'] + \
 | 
			
		||||
            '</span></button></a>'
 | 
			
		||||
    else:
 | 
			
		||||
        tlStr += \
 | 
			
		||||
            '<a href="' + usersPath + \
 | 
			
		||||
            '/inbox"><button class="' + \
 | 
			
		||||
            inboxButton + '"><span>' + \
 | 
			
		||||
            translate['Inbox'] + '</span></button></a>'
 | 
			
		||||
 | 
			
		||||
    # if this is a news instance and we are viewing the news timeline
 | 
			
		||||
    newsHeader = False
 | 
			
		||||
    if defaultTimeline == 'tlnews' and boxName == 'tlnews':
 | 
			
		||||
        newsHeader = True
 | 
			
		||||
 | 
			
		||||
    if not newsHeader:
 | 
			
		||||
        tlStr += \
 | 
			
		||||
            '<a href="' + usersPath + \
 | 
			
		||||
            '/dm"><button class="' + dmButton + \
 | 
			
		||||
            '"><span>' + htmlHighlightLabel(translate['DM'], newDM) + \
 | 
			
		||||
            '</span></button></a>'
 | 
			
		||||
 | 
			
		||||
        tlStr += \
 | 
			
		||||
            '<a href="' + usersPath + '/tlreplies"><button class="' + \
 | 
			
		||||
            repliesButton + '"><span>' + \
 | 
			
		||||
            htmlHighlightLabel(translate['Replies'], newReply) + \
 | 
			
		||||
            '</span></button></a>'
 | 
			
		||||
 | 
			
		||||
    # typically the media button
 | 
			
		||||
    if defaultTimeline != 'tlmedia':
 | 
			
		||||
        if not minimal and not newsHeader:
 | 
			
		||||
            tlStr += \
 | 
			
		||||
                '<a href="' + usersPath + \
 | 
			
		||||
                '/tlmedia"><button class="' + \
 | 
			
		||||
                mediaButton + '"><span>' + translate['Media'] + \
 | 
			
		||||
                '</span></button></a>'
 | 
			
		||||
    else:
 | 
			
		||||
        if not minimal:
 | 
			
		||||
            tlStr += \
 | 
			
		||||
                '<a href="' + usersPath + \
 | 
			
		||||
                '/inbox"><button class="' + \
 | 
			
		||||
                inboxButton+'"><span>' + translate['Inbox'] + \
 | 
			
		||||
                '</span></button></a>'
 | 
			
		||||
 | 
			
		||||
    isFeaturesTimeline = \
 | 
			
		||||
        defaultTimeline == 'tlnews' and boxName == 'tlnews'
 | 
			
		||||
 | 
			
		||||
    if not isFeaturesTimeline:
 | 
			
		||||
        # typically the blogs button
 | 
			
		||||
        # but may change if this is a blogging oriented instance
 | 
			
		||||
        if defaultTimeline != 'tlblogs':
 | 
			
		||||
            if not minimal and not isFeaturesTimeline:
 | 
			
		||||
                titleStr = translate['Blogs']
 | 
			
		||||
                if defaultTimeline == 'tlnews':
 | 
			
		||||
                    titleStr = translate['Article']
 | 
			
		||||
                tlStr += \
 | 
			
		||||
                    '<a href="' + usersPath + \
 | 
			
		||||
                    '/tlblogs"><button class="' + \
 | 
			
		||||
                    blogsButton + '"><span>' + titleStr + \
 | 
			
		||||
                    '</span></button></a>'
 | 
			
		||||
        else:
 | 
			
		||||
            if not minimal:
 | 
			
		||||
                tlStr += \
 | 
			
		||||
                    '<a href="' + usersPath + \
 | 
			
		||||
                    '/inbox"><button class="' + \
 | 
			
		||||
                    inboxButton + '"><span>' + translate['Inbox'] + \
 | 
			
		||||
                    '</span></button></a>'
 | 
			
		||||
 | 
			
		||||
    # typically the news button
 | 
			
		||||
    # but may change if this is a news oriented instance
 | 
			
		||||
    if defaultTimeline != 'tlnews':
 | 
			
		||||
        tlStr += \
 | 
			
		||||
            '<a href="' + usersPath + \
 | 
			
		||||
            '/tlnews"><button class="' + \
 | 
			
		||||
            newsButton + '"><span>' + translate['News'] + \
 | 
			
		||||
            '</span></button></a>'
 | 
			
		||||
    else:
 | 
			
		||||
        if not newsHeader:
 | 
			
		||||
            tlStr += \
 | 
			
		||||
                '<a href="' + usersPath + \
 | 
			
		||||
                '/inbox"><button class="' + \
 | 
			
		||||
                inboxButton + '"><span>' + translate['Inbox'] + \
 | 
			
		||||
                '</span></button></a>'
 | 
			
		||||
 | 
			
		||||
    # show todays events buttons on the first inbox page
 | 
			
		||||
    happeningStr = ''
 | 
			
		||||
    if boxName == 'inbox' and pageNumber == 1:
 | 
			
		||||
        if todaysEventsCheck(baseDir, nickname, domain):
 | 
			
		||||
            now = datetime.now()
 | 
			
		||||
 | 
			
		||||
            # happening today button
 | 
			
		||||
            if not iconsAsButtons:
 | 
			
		||||
                happeningStr += \
 | 
			
		||||
                    '<a href="' + usersPath + '/calendar?year=' + \
 | 
			
		||||
                    str(now.year) + '?month=' + str(now.month) + \
 | 
			
		||||
                    '?day=' + str(now.day) + '">' + \
 | 
			
		||||
                    '<button class="buttonevent">' + \
 | 
			
		||||
                    translate['Happening Today'] + '</button></a>'
 | 
			
		||||
            else:
 | 
			
		||||
                happeningStr += \
 | 
			
		||||
                    '<a href="' + usersPath + '/calendar?year=' + \
 | 
			
		||||
                    str(now.year) + '?month=' + str(now.month) + \
 | 
			
		||||
                    '?day=' + str(now.day) + '">' + \
 | 
			
		||||
                    '<button class="button">' + \
 | 
			
		||||
                    translate['Happening Today'] + '</button></a>'
 | 
			
		||||
 | 
			
		||||
            # happening this week button
 | 
			
		||||
            if thisWeeksEventsCheck(baseDir, nickname, domain):
 | 
			
		||||
                if not iconsAsButtons:
 | 
			
		||||
                    happeningStr += \
 | 
			
		||||
                        '<a href="' + usersPath + \
 | 
			
		||||
                        '/calendar"><button class="buttonevent">' + \
 | 
			
		||||
                        translate['Happening This Week'] + '</button></a>'
 | 
			
		||||
                else:
 | 
			
		||||
                    happeningStr += \
 | 
			
		||||
                        '<a href="' + usersPath + \
 | 
			
		||||
                        '/calendar"><button class="button">' + \
 | 
			
		||||
                        translate['Happening This Week'] + '</button></a>'
 | 
			
		||||
        else:
 | 
			
		||||
            # happening this week button
 | 
			
		||||
            if thisWeeksEventsCheck(baseDir, nickname, domain):
 | 
			
		||||
                if not iconsAsButtons:
 | 
			
		||||
                    happeningStr += \
 | 
			
		||||
                        '<a href="' + usersPath + \
 | 
			
		||||
                        '/calendar"><button class="buttonevent">' + \
 | 
			
		||||
                        translate['Happening This Week'] + '</button></a>'
 | 
			
		||||
                else:
 | 
			
		||||
                    happeningStr += \
 | 
			
		||||
                        '<a href="' + usersPath + \
 | 
			
		||||
                        '/calendar"><button class="button">' + \
 | 
			
		||||
                        translate['Happening This Week'] + '</button></a>'
 | 
			
		||||
 | 
			
		||||
    if not newsHeader:
 | 
			
		||||
        # button for the outbox
 | 
			
		||||
        tlStr += \
 | 
			
		||||
            '<a href="' + usersPath + \
 | 
			
		||||
            '/outbox"><button class="' + \
 | 
			
		||||
            sentButton + '"><span>' + translate['Outbox'] + \
 | 
			
		||||
            '</span></button></a>'
 | 
			
		||||
 | 
			
		||||
        # add other buttons
 | 
			
		||||
        tlStr += \
 | 
			
		||||
            sharesButtonStr + bookmarksButtonStr + eventsButtonStr + \
 | 
			
		||||
            moderationButtonStr + happeningStr + newPostButtonStr
 | 
			
		||||
 | 
			
		||||
    if not newsHeader:
 | 
			
		||||
        if not iconsAsButtons:
 | 
			
		||||
            # the search icon
 | 
			
		||||
            tlStr += \
 | 
			
		||||
                '<a class="imageAnchor" href="' + usersPath + \
 | 
			
		||||
                '/search"><img loading="lazy" src="/' + \
 | 
			
		||||
                iconsPath + '/search.png" title="' + \
 | 
			
		||||
                translate['Search and follow'] + '" alt="| ' + \
 | 
			
		||||
                translate['Search and follow'] + \
 | 
			
		||||
                '" class="timelineicon"/></a>'
 | 
			
		||||
        else:
 | 
			
		||||
            # the search button
 | 
			
		||||
            tlStr += \
 | 
			
		||||
                '<a href="' + usersPath + \
 | 
			
		||||
                '/search"><button class="button">' + \
 | 
			
		||||
                '<span>' + translate['Search'] + \
 | 
			
		||||
                '</span></button></a>'
 | 
			
		||||
 | 
			
		||||
    # benchmark 5
 | 
			
		||||
    timeDiff = int((time.time() - timelineStartTime) * 1000)
 | 
			
		||||
    if timeDiff > 100:
 | 
			
		||||
        print('TIMELINE TIMING ' + boxName + ' 5 = ' + str(timeDiff))
 | 
			
		||||
 | 
			
		||||
    # the calendar button
 | 
			
		||||
    if not isFeaturesTimeline:
 | 
			
		||||
        calendarAltText = translate['Calendar']
 | 
			
		||||
        if newCalendarEvent:
 | 
			
		||||
            # indicate that the calendar icon is highlighted
 | 
			
		||||
            calendarAltText = '*' + calendarAltText + '*'
 | 
			
		||||
        if not iconsAsButtons:
 | 
			
		||||
            tlStr += \
 | 
			
		||||
                '      <a class="imageAnchor" href="' + \
 | 
			
		||||
                usersPath + calendarPath + \
 | 
			
		||||
                '"><img loading="lazy" src="/' + iconsPath + '/' + \
 | 
			
		||||
                calendarImage + '" title="' + translate['Calendar'] + \
 | 
			
		||||
                '" alt="| ' + calendarAltText + \
 | 
			
		||||
                '" class="timelineicon"/></a>\n'
 | 
			
		||||
        else:
 | 
			
		||||
            tlStr += \
 | 
			
		||||
                '<a href="' + usersPath + calendarPath + \
 | 
			
		||||
                '"><button class="button">' + \
 | 
			
		||||
                '<span>' + translate['Calendar'] + \
 | 
			
		||||
                '</span></button></a>'
 | 
			
		||||
 | 
			
		||||
    if not newsHeader:
 | 
			
		||||
        # the show/hide button, for a simpler header appearance
 | 
			
		||||
        if not iconsAsButtons:
 | 
			
		||||
            tlStr += \
 | 
			
		||||
                '      <a class="imageAnchor" href="' + \
 | 
			
		||||
                usersPath + '/minimal' + \
 | 
			
		||||
                '"><img loading="lazy" src="/' + iconsPath + \
 | 
			
		||||
                '/showhide.png" title="' + translate['Show/Hide Buttons'] + \
 | 
			
		||||
                '" alt="| ' + translate['Show/Hide Buttons'] + \
 | 
			
		||||
                '" class="timelineicon"/></a>\n'
 | 
			
		||||
        else:
 | 
			
		||||
            tlStr += \
 | 
			
		||||
                '<a href="' + usersPath + '/minimal' + \
 | 
			
		||||
                '"><button class="button">' + \
 | 
			
		||||
                '<span>' + translate['Show/Hide Buttons'] + \
 | 
			
		||||
                '</span></button></a>'
 | 
			
		||||
 | 
			
		||||
    if newsHeader:
 | 
			
		||||
        tlStr += \
 | 
			
		||||
            '<a href="' + usersPath + '/inbox">' + \
 | 
			
		||||
            '<button class="button">' + \
 | 
			
		||||
            '<span>' + translate['User'] + '</span></button></a>'
 | 
			
		||||
 | 
			
		||||
    # the newswire button to show right column links
 | 
			
		||||
    if not iconsAsButtons:
 | 
			
		||||
        tlStr += \
 | 
			
		||||
            '<a class="imageAnchorMobile" href="' + \
 | 
			
		||||
            usersPath + '/newswiremobile">' + \
 | 
			
		||||
            '<img loading="lazy" src="/' + iconsPath + \
 | 
			
		||||
            '/newswire.png" title="' + translate['News'] + \
 | 
			
		||||
            '" alt="| ' + translate['News'] + \
 | 
			
		||||
            '" class="timelineicon"/></a>'
 | 
			
		||||
    else:
 | 
			
		||||
        # NOTE: deliberately no \n at end of line
 | 
			
		||||
        tlStr += \
 | 
			
		||||
            '<a href="' + \
 | 
			
		||||
            usersPath + '/newswiremobile' + \
 | 
			
		||||
            '"><button class="buttonMobile">' + \
 | 
			
		||||
            '<span>' + translate['Newswire'] + \
 | 
			
		||||
            '</span></button></a>'
 | 
			
		||||
 | 
			
		||||
    # the links button to show left column links
 | 
			
		||||
    if not iconsAsButtons:
 | 
			
		||||
        tlStr += \
 | 
			
		||||
            '<a class="imageAnchorMobile" href="' + \
 | 
			
		||||
            usersPath + '/linksmobile">' + \
 | 
			
		||||
            '<img loading="lazy" src="/' + iconsPath + \
 | 
			
		||||
            '/links.png" title="' + translate['Edit Links'] + \
 | 
			
		||||
            '" alt="| ' + translate['Edit Links'] + \
 | 
			
		||||
            '" class="timelineicon"/></a>'
 | 
			
		||||
    else:
 | 
			
		||||
        # NOTE: deliberately no \n at end of line
 | 
			
		||||
        tlStr += \
 | 
			
		||||
            '<a href="' + \
 | 
			
		||||
            usersPath + '/linksmobile' + \
 | 
			
		||||
            '"><button class="buttonMobile">' + \
 | 
			
		||||
            '<span>' + translate['Links'] + \
 | 
			
		||||
            '</span></button></a>'
 | 
			
		||||
 | 
			
		||||
    if newsHeader:
 | 
			
		||||
        tlStr += \
 | 
			
		||||
            '<a href="' + usersPath + '/editprofile">' + \
 | 
			
		||||
            '<button class="buttonDesktop">' + \
 | 
			
		||||
            '<span>' + translate['Settings'] + '</span></button></a>'
 | 
			
		||||
 | 
			
		||||
    if not newsHeader:
 | 
			
		||||
        tlStr += followApprovals
 | 
			
		||||
 | 
			
		||||
    if not iconsAsButtons:
 | 
			
		||||
        # end of headericons div
 | 
			
		||||
        tlStr += '</div>'
 | 
			
		||||
 | 
			
		||||
    # end of the button header with inbox, outbox, etc
 | 
			
		||||
    tlStr += '    </div>\n'
 | 
			
		||||
    return tlStr
 | 
			
		||||
| 
						 | 
				
			
			@ -7,23 +7,22 @@ __email__ = "bob@freedombone.net"
 | 
			
		|||
__status__ = "Production"
 | 
			
		||||
 | 
			
		||||
import os
 | 
			
		||||
from datetime import datetime
 | 
			
		||||
import time
 | 
			
		||||
from utils import removeIdEnding
 | 
			
		||||
from follow import followerApprovalActive
 | 
			
		||||
from person import isPersonSnoozed
 | 
			
		||||
from happening import todaysEventsCheck
 | 
			
		||||
from happening import thisWeeksEventsCheck
 | 
			
		||||
from webapp_utils import getIconsWebPath
 | 
			
		||||
from webapp_utils import htmlPostSeparator
 | 
			
		||||
from webapp_utils import getBannerFile
 | 
			
		||||
from webapp_utils import htmlHeaderWithExternalStyle
 | 
			
		||||
from webapp_utils import htmlFooter
 | 
			
		||||
from webapp_utils import sharesTimelineJson
 | 
			
		||||
from webapp_utils import htmlHighlightLabel
 | 
			
		||||
from webapp_post import preparePostFromHtmlCache
 | 
			
		||||
from webapp_post import individualPostAsHtml
 | 
			
		||||
from webapp_column_left import getLeftColumnContent
 | 
			
		||||
from webapp_column_right import getRightColumnContent
 | 
			
		||||
from webapp_headerbuttons import headerButtonsTimeline
 | 
			
		||||
from posts import isModerator
 | 
			
		||||
from posts import isEditor
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -712,333 +711,6 @@ def htmlSharesTimeline(translate: {}, pageNumber: int, itemsPerPage: int,
 | 
			
		|||
    return timelineStr
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def htmlHighlightLabel(label: str, highlight: bool) -> str:
 | 
			
		||||
    """If the give text should be highlighted then return
 | 
			
		||||
    the appropriate markup.
 | 
			
		||||
    This is so that in shell browsers, like lynx, it's possible
 | 
			
		||||
    to see if the replies or DM button are highlighted.
 | 
			
		||||
    """
 | 
			
		||||
    if not highlight:
 | 
			
		||||
        return label
 | 
			
		||||
    return '*' + str(label) + '*'
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def headerButtonsTimeline(defaultTimeline: str,
 | 
			
		||||
                          boxName: str,
 | 
			
		||||
                          pageNumber: int,
 | 
			
		||||
                          translate: {},
 | 
			
		||||
                          usersPath: str,
 | 
			
		||||
                          mediaButton: str,
 | 
			
		||||
                          blogsButton: str,
 | 
			
		||||
                          newsButton: str,
 | 
			
		||||
                          inboxButton: str,
 | 
			
		||||
                          dmButton: str,
 | 
			
		||||
                          newDM: str,
 | 
			
		||||
                          repliesButton: str,
 | 
			
		||||
                          newReply: str,
 | 
			
		||||
                          minimal: bool,
 | 
			
		||||
                          sentButton: str,
 | 
			
		||||
                          sharesButtonStr: str,
 | 
			
		||||
                          bookmarksButtonStr: str,
 | 
			
		||||
                          eventsButtonStr: str,
 | 
			
		||||
                          moderationButtonStr: str,
 | 
			
		||||
                          newPostButtonStr: str,
 | 
			
		||||
                          baseDir: str,
 | 
			
		||||
                          nickname: str, domain: str,
 | 
			
		||||
                          iconsPath: str,
 | 
			
		||||
                          timelineStartTime,
 | 
			
		||||
                          newCalendarEvent: bool,
 | 
			
		||||
                          calendarPath: str,
 | 
			
		||||
                          calendarImage: str,
 | 
			
		||||
                          followApprovals: str,
 | 
			
		||||
                          iconsAsButtons: bool) -> str:
 | 
			
		||||
    """Returns the header at the top of the timeline, containing
 | 
			
		||||
    buttons for inbox, outbox, search, calendar, etc
 | 
			
		||||
    """
 | 
			
		||||
    # start of the button header with inbox, outbox, etc
 | 
			
		||||
    tlStr = '<div class="containerHeader">\n'
 | 
			
		||||
    # first button
 | 
			
		||||
    if defaultTimeline == 'tlmedia':
 | 
			
		||||
        tlStr += \
 | 
			
		||||
            '<a href="' + usersPath + \
 | 
			
		||||
            '/tlmedia"><button class="' + \
 | 
			
		||||
            mediaButton + '"><span>' + translate['Media'] + \
 | 
			
		||||
            '</span></button></a>'
 | 
			
		||||
    elif defaultTimeline == 'tlblogs':
 | 
			
		||||
        tlStr += \
 | 
			
		||||
            '<a href="' + usersPath + \
 | 
			
		||||
            '/tlblogs"><button class="' + \
 | 
			
		||||
            blogsButton + '"><span>' + translate['Blogs'] + \
 | 
			
		||||
            '</span></button></a>'
 | 
			
		||||
    elif defaultTimeline == 'tlnews':
 | 
			
		||||
        tlStr += \
 | 
			
		||||
            '<a href="' + usersPath + \
 | 
			
		||||
            '/tlnews"><button class="' + \
 | 
			
		||||
            newsButton + '"><span>' + translate['Features'] + \
 | 
			
		||||
            '</span></button></a>'
 | 
			
		||||
    else:
 | 
			
		||||
        tlStr += \
 | 
			
		||||
            '<a href="' + usersPath + \
 | 
			
		||||
            '/inbox"><button class="' + \
 | 
			
		||||
            inboxButton + '"><span>' + \
 | 
			
		||||
            translate['Inbox'] + '</span></button></a>'
 | 
			
		||||
 | 
			
		||||
    # if this is a news instance and we are viewing the news timeline
 | 
			
		||||
    newsHeader = False
 | 
			
		||||
    if defaultTimeline == 'tlnews' and boxName == 'tlnews':
 | 
			
		||||
        newsHeader = True
 | 
			
		||||
 | 
			
		||||
    if not newsHeader:
 | 
			
		||||
        tlStr += \
 | 
			
		||||
            '<a href="' + usersPath + \
 | 
			
		||||
            '/dm"><button class="' + dmButton + \
 | 
			
		||||
            '"><span>' + htmlHighlightLabel(translate['DM'], newDM) + \
 | 
			
		||||
            '</span></button></a>'
 | 
			
		||||
 | 
			
		||||
        tlStr += \
 | 
			
		||||
            '<a href="' + usersPath + '/tlreplies"><button class="' + \
 | 
			
		||||
            repliesButton + '"><span>' + \
 | 
			
		||||
            htmlHighlightLabel(translate['Replies'], newReply) + \
 | 
			
		||||
            '</span></button></a>'
 | 
			
		||||
 | 
			
		||||
    # typically the media button
 | 
			
		||||
    if defaultTimeline != 'tlmedia':
 | 
			
		||||
        if not minimal and not newsHeader:
 | 
			
		||||
            tlStr += \
 | 
			
		||||
                '<a href="' + usersPath + \
 | 
			
		||||
                '/tlmedia"><button class="' + \
 | 
			
		||||
                mediaButton + '"><span>' + translate['Media'] + \
 | 
			
		||||
                '</span></button></a>'
 | 
			
		||||
    else:
 | 
			
		||||
        if not minimal:
 | 
			
		||||
            tlStr += \
 | 
			
		||||
                '<a href="' + usersPath + \
 | 
			
		||||
                '/inbox"><button class="' + \
 | 
			
		||||
                inboxButton+'"><span>' + translate['Inbox'] + \
 | 
			
		||||
                '</span></button></a>'
 | 
			
		||||
 | 
			
		||||
    isFeaturesTimeline = \
 | 
			
		||||
        defaultTimeline == 'tlnews' and boxName == 'tlnews'
 | 
			
		||||
 | 
			
		||||
    if not isFeaturesTimeline:
 | 
			
		||||
        # typically the blogs button
 | 
			
		||||
        # but may change if this is a blogging oriented instance
 | 
			
		||||
        if defaultTimeline != 'tlblogs':
 | 
			
		||||
            if not minimal and not isFeaturesTimeline:
 | 
			
		||||
                titleStr = translate['Blogs']
 | 
			
		||||
                if defaultTimeline == 'tlnews':
 | 
			
		||||
                    titleStr = translate['Article']
 | 
			
		||||
                tlStr += \
 | 
			
		||||
                    '<a href="' + usersPath + \
 | 
			
		||||
                    '/tlblogs"><button class="' + \
 | 
			
		||||
                    blogsButton + '"><span>' + titleStr + \
 | 
			
		||||
                    '</span></button></a>'
 | 
			
		||||
        else:
 | 
			
		||||
            if not minimal:
 | 
			
		||||
                tlStr += \
 | 
			
		||||
                    '<a href="' + usersPath + \
 | 
			
		||||
                    '/inbox"><button class="' + \
 | 
			
		||||
                    inboxButton + '"><span>' + translate['Inbox'] + \
 | 
			
		||||
                    '</span></button></a>'
 | 
			
		||||
 | 
			
		||||
    # typically the news button
 | 
			
		||||
    # but may change if this is a news oriented instance
 | 
			
		||||
    if defaultTimeline != 'tlnews':
 | 
			
		||||
        tlStr += \
 | 
			
		||||
            '<a href="' + usersPath + \
 | 
			
		||||
            '/tlnews"><button class="' + \
 | 
			
		||||
            newsButton + '"><span>' + translate['News'] + \
 | 
			
		||||
            '</span></button></a>'
 | 
			
		||||
    else:
 | 
			
		||||
        if not newsHeader:
 | 
			
		||||
            tlStr += \
 | 
			
		||||
                '<a href="' + usersPath + \
 | 
			
		||||
                '/inbox"><button class="' + \
 | 
			
		||||
                inboxButton + '"><span>' + translate['Inbox'] + \
 | 
			
		||||
                '</span></button></a>'
 | 
			
		||||
 | 
			
		||||
    # show todays events buttons on the first inbox page
 | 
			
		||||
    happeningStr = ''
 | 
			
		||||
    if boxName == 'inbox' and pageNumber == 1:
 | 
			
		||||
        if todaysEventsCheck(baseDir, nickname, domain):
 | 
			
		||||
            now = datetime.now()
 | 
			
		||||
 | 
			
		||||
            # happening today button
 | 
			
		||||
            if not iconsAsButtons:
 | 
			
		||||
                happeningStr += \
 | 
			
		||||
                    '<a href="' + usersPath + '/calendar?year=' + \
 | 
			
		||||
                    str(now.year) + '?month=' + str(now.month) + \
 | 
			
		||||
                    '?day=' + str(now.day) + '">' + \
 | 
			
		||||
                    '<button class="buttonevent">' + \
 | 
			
		||||
                    translate['Happening Today'] + '</button></a>'
 | 
			
		||||
            else:
 | 
			
		||||
                happeningStr += \
 | 
			
		||||
                    '<a href="' + usersPath + '/calendar?year=' + \
 | 
			
		||||
                    str(now.year) + '?month=' + str(now.month) + \
 | 
			
		||||
                    '?day=' + str(now.day) + '">' + \
 | 
			
		||||
                    '<button class="button">' + \
 | 
			
		||||
                    translate['Happening Today'] + '</button></a>'
 | 
			
		||||
 | 
			
		||||
            # happening this week button
 | 
			
		||||
            if thisWeeksEventsCheck(baseDir, nickname, domain):
 | 
			
		||||
                if not iconsAsButtons:
 | 
			
		||||
                    happeningStr += \
 | 
			
		||||
                        '<a href="' + usersPath + \
 | 
			
		||||
                        '/calendar"><button class="buttonevent">' + \
 | 
			
		||||
                        translate['Happening This Week'] + '</button></a>'
 | 
			
		||||
                else:
 | 
			
		||||
                    happeningStr += \
 | 
			
		||||
                        '<a href="' + usersPath + \
 | 
			
		||||
                        '/calendar"><button class="button">' + \
 | 
			
		||||
                        translate['Happening This Week'] + '</button></a>'
 | 
			
		||||
        else:
 | 
			
		||||
            # happening this week button
 | 
			
		||||
            if thisWeeksEventsCheck(baseDir, nickname, domain):
 | 
			
		||||
                if not iconsAsButtons:
 | 
			
		||||
                    happeningStr += \
 | 
			
		||||
                        '<a href="' + usersPath + \
 | 
			
		||||
                        '/calendar"><button class="buttonevent">' + \
 | 
			
		||||
                        translate['Happening This Week'] + '</button></a>'
 | 
			
		||||
                else:
 | 
			
		||||
                    happeningStr += \
 | 
			
		||||
                        '<a href="' + usersPath + \
 | 
			
		||||
                        '/calendar"><button class="button">' + \
 | 
			
		||||
                        translate['Happening This Week'] + '</button></a>'
 | 
			
		||||
 | 
			
		||||
    if not newsHeader:
 | 
			
		||||
        # button for the outbox
 | 
			
		||||
        tlStr += \
 | 
			
		||||
            '<a href="' + usersPath + \
 | 
			
		||||
            '/outbox"><button class="' + \
 | 
			
		||||
            sentButton + '"><span>' + translate['Outbox'] + \
 | 
			
		||||
            '</span></button></a>'
 | 
			
		||||
 | 
			
		||||
        # add other buttons
 | 
			
		||||
        tlStr += \
 | 
			
		||||
            sharesButtonStr + bookmarksButtonStr + eventsButtonStr + \
 | 
			
		||||
            moderationButtonStr + happeningStr + newPostButtonStr
 | 
			
		||||
 | 
			
		||||
    if not newsHeader:
 | 
			
		||||
        if not iconsAsButtons:
 | 
			
		||||
            # the search icon
 | 
			
		||||
            tlStr += \
 | 
			
		||||
                '<a class="imageAnchor" href="' + usersPath + \
 | 
			
		||||
                '/search"><img loading="lazy" src="/' + \
 | 
			
		||||
                iconsPath + '/search.png" title="' + \
 | 
			
		||||
                translate['Search and follow'] + '" alt="| ' + \
 | 
			
		||||
                translate['Search and follow'] + \
 | 
			
		||||
                '" class="timelineicon"/></a>'
 | 
			
		||||
        else:
 | 
			
		||||
            # the search button
 | 
			
		||||
            tlStr += \
 | 
			
		||||
                '<a href="' + usersPath + \
 | 
			
		||||
                '/search"><button class="button">' + \
 | 
			
		||||
                '<span>' + translate['Search'] + \
 | 
			
		||||
                '</span></button></a>'
 | 
			
		||||
 | 
			
		||||
    # benchmark 5
 | 
			
		||||
    timeDiff = int((time.time() - timelineStartTime) * 1000)
 | 
			
		||||
    if timeDiff > 100:
 | 
			
		||||
        print('TIMELINE TIMING ' + boxName + ' 5 = ' + str(timeDiff))
 | 
			
		||||
 | 
			
		||||
    # the calendar button
 | 
			
		||||
    if not isFeaturesTimeline:
 | 
			
		||||
        calendarAltText = translate['Calendar']
 | 
			
		||||
        if newCalendarEvent:
 | 
			
		||||
            # indicate that the calendar icon is highlighted
 | 
			
		||||
            calendarAltText = '*' + calendarAltText + '*'
 | 
			
		||||
        if not iconsAsButtons:
 | 
			
		||||
            tlStr += \
 | 
			
		||||
                '      <a class="imageAnchor" href="' + \
 | 
			
		||||
                usersPath + calendarPath + \
 | 
			
		||||
                '"><img loading="lazy" src="/' + iconsPath + '/' + \
 | 
			
		||||
                calendarImage + '" title="' + translate['Calendar'] + \
 | 
			
		||||
                '" alt="| ' + calendarAltText + \
 | 
			
		||||
                '" class="timelineicon"/></a>\n'
 | 
			
		||||
        else:
 | 
			
		||||
            tlStr += \
 | 
			
		||||
                '<a href="' + usersPath + calendarPath + \
 | 
			
		||||
                '"><button class="button">' + \
 | 
			
		||||
                '<span>' + translate['Calendar'] + \
 | 
			
		||||
                '</span></button></a>'
 | 
			
		||||
 | 
			
		||||
    if not newsHeader:
 | 
			
		||||
        # the show/hide button, for a simpler header appearance
 | 
			
		||||
        if not iconsAsButtons:
 | 
			
		||||
            tlStr += \
 | 
			
		||||
                '      <a class="imageAnchor" href="' + \
 | 
			
		||||
                usersPath + '/minimal' + \
 | 
			
		||||
                '"><img loading="lazy" src="/' + iconsPath + \
 | 
			
		||||
                '/showhide.png" title="' + translate['Show/Hide Buttons'] + \
 | 
			
		||||
                '" alt="| ' + translate['Show/Hide Buttons'] + \
 | 
			
		||||
                '" class="timelineicon"/></a>\n'
 | 
			
		||||
        else:
 | 
			
		||||
            tlStr += \
 | 
			
		||||
                '<a href="' + usersPath + '/minimal' + \
 | 
			
		||||
                '"><button class="button">' + \
 | 
			
		||||
                '<span>' + translate['Show/Hide Buttons'] + \
 | 
			
		||||
                '</span></button></a>'
 | 
			
		||||
 | 
			
		||||
    if newsHeader:
 | 
			
		||||
        tlStr += \
 | 
			
		||||
            '<a href="' + usersPath + '/inbox">' + \
 | 
			
		||||
            '<button class="button">' + \
 | 
			
		||||
            '<span>' + translate['User'] + '</span></button></a>'
 | 
			
		||||
 | 
			
		||||
    # the newswire button to show right column links
 | 
			
		||||
    if not iconsAsButtons:
 | 
			
		||||
        tlStr += \
 | 
			
		||||
            '<a class="imageAnchorMobile" href="' + \
 | 
			
		||||
            usersPath + '/newswiremobile">' + \
 | 
			
		||||
            '<img loading="lazy" src="/' + iconsPath + \
 | 
			
		||||
            '/newswire.png" title="' + translate['News'] + \
 | 
			
		||||
            '" alt="| ' + translate['News'] + \
 | 
			
		||||
            '" class="timelineicon"/></a>'
 | 
			
		||||
    else:
 | 
			
		||||
        # NOTE: deliberately no \n at end of line
 | 
			
		||||
        tlStr += \
 | 
			
		||||
            '<a href="' + \
 | 
			
		||||
            usersPath + '/newswiremobile' + \
 | 
			
		||||
            '"><button class="buttonMobile">' + \
 | 
			
		||||
            '<span>' + translate['Newswire'] + \
 | 
			
		||||
            '</span></button></a>'
 | 
			
		||||
 | 
			
		||||
    # the links button to show left column links
 | 
			
		||||
    if not iconsAsButtons:
 | 
			
		||||
        tlStr += \
 | 
			
		||||
            '<a class="imageAnchorMobile" href="' + \
 | 
			
		||||
            usersPath + '/linksmobile">' + \
 | 
			
		||||
            '<img loading="lazy" src="/' + iconsPath + \
 | 
			
		||||
            '/links.png" title="' + translate['Edit Links'] + \
 | 
			
		||||
            '" alt="| ' + translate['Edit Links'] + \
 | 
			
		||||
            '" class="timelineicon"/></a>'
 | 
			
		||||
    else:
 | 
			
		||||
        # NOTE: deliberately no \n at end of line
 | 
			
		||||
        tlStr += \
 | 
			
		||||
            '<a href="' + \
 | 
			
		||||
            usersPath + '/linksmobile' + \
 | 
			
		||||
            '"><button class="buttonMobile">' + \
 | 
			
		||||
            '<span>' + translate['Links'] + \
 | 
			
		||||
            '</span></button></a>'
 | 
			
		||||
 | 
			
		||||
    if newsHeader:
 | 
			
		||||
        tlStr += \
 | 
			
		||||
            '<a href="' + usersPath + '/editprofile">' + \
 | 
			
		||||
            '<button class="buttonDesktop">' + \
 | 
			
		||||
            '<span>' + translate['Settings'] + '</span></button></a>'
 | 
			
		||||
 | 
			
		||||
    if not newsHeader:
 | 
			
		||||
        tlStr += followApprovals
 | 
			
		||||
 | 
			
		||||
    if not iconsAsButtons:
 | 
			
		||||
        # end of headericons div
 | 
			
		||||
        tlStr += '</div>'
 | 
			
		||||
 | 
			
		||||
    # end of the button header with inbox, outbox, etc
 | 
			
		||||
    tlStr += '    </div>\n'
 | 
			
		||||
    return tlStr
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def htmlShares(cssCache: {}, defaultTimeline: str,
 | 
			
		||||
               recentPostsCache: {}, maxRecentPosts: int,
 | 
			
		||||
               translate: {}, pageNumber: int, itemsPerPage: int,
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -808,3 +808,14 @@ def headerButtonsFrontScreen(translate: {},
 | 
			
		|||
            headerStr + \
 | 
			
		||||
            '      </div>\n'
 | 
			
		||||
    return headerStr
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def htmlHighlightLabel(label: str, highlight: bool) -> str:
 | 
			
		||||
    """If the given text should be highlighted then return
 | 
			
		||||
    the appropriate markup.
 | 
			
		||||
    This is so that in shell browsers, like lynx, it's possible
 | 
			
		||||
    to see if the replies or DM button are highlighted.
 | 
			
		||||
    """
 | 
			
		||||
    if not highlight:
 | 
			
		||||
        return label
 | 
			
		||||
    return '*' + str(label) + '*'
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue