semaphore/src/routes/_a11y/getAccessibleLabelForStatus.js

69 lines
2.5 KiB
JavaScript

import { getAccountAccessibleName } from './getAccountAccessibleName.js'
import { POST_PRIVACY_OPTIONS } from '../_static/statuses.js'
import { formatIntl } from '../_utils/formatIntl.js'
function getNotificationText (notification, omitEmojiInDisplayNames) {
if (!notification) {
return
}
const notificationAccountDisplayName = getAccountAccessibleName(notification.account, omitEmojiInDisplayNames)
if (notification.type === 'reblog') {
return formatIntl('intl.accountRebloggedYou', { account: notificationAccountDisplayName })
} else if (notification.type === 'favourite') {
return formatIntl('intl.accountFavoritedYou', { account: notificationAccountDisplayName })
}
}
function getPrivacyText (visibility) {
for (const option of POST_PRIVACY_OPTIONS) {
if (option.key === visibility) {
return option.label
}
}
}
function getReblogText (reblog, account, omitEmojiInDisplayNames) {
if (!reblog) {
return
}
const accountDisplayName = getAccountAccessibleName(account, omitEmojiInDisplayNames)
return formatIntl('intl.rebloggedByAccount', { account: accountDisplayName })
}
function cleanupText (text) {
return text.replace(/\s+/g, ' ').trim()
}
export function getAccessibleLabelForStatus (originalAccount, account, plainTextContent,
shortInlineFormattedDate, spoilerText, showContent,
reblog, notification, visibility, omitEmojiInDisplayNames,
disableLongAriaLabels, showMedia, showPoll) {
const originalAccountDisplayName = getAccountAccessibleName(originalAccount, omitEmojiInDisplayNames)
const contentTextToShow = (showContent || !spoilerText)
? cleanupText(plainTextContent)
: formatIntl('intl.contentWarningContent', { spoiler: cleanupText(spoilerText) })
const mediaTextToShow = showMedia && 'intl.hasMedia'
const pollTextToShow = showPoll && 'intl.hasPoll'
const privacyText = getPrivacyText(visibility)
if (disableLongAriaLabels) {
// Long text can crash NVDA; allow users to shorten it like we had it before.
// https://github.com/nolanlawson/pinafore/issues/694
return formatIntl('intl.shortStatusLabel', { privacy: privacyText, account: originalAccountDisplayName })
}
const values = [
getNotificationText(notification, omitEmojiInDisplayNames),
originalAccountDisplayName,
contentTextToShow,
mediaTextToShow,
pollTextToShow,
shortInlineFormattedDate,
`@${originalAccount.acct}`,
privacyText,
getReblogText(reblog, account, omitEmojiInDisplayNames)
].filter(Boolean)
return values.join(', ')
}