Files
divkit/client/ios/DivKit/Extensions/DivContainer/DivContainer+Accessibility.swift
T
burstein c99cee1305 Added div-switch in scheme
commit_hash:8603f98382fbe5cefd0cb43e8949940dbb572894
2024-10-25 16:12:45 +03:00

74 lines
2.1 KiB
Swift

import Foundation
extension DivContainer {
func resolveAccessibilityDescription(_ context: DivBlockModelingContext) -> String? {
guard let accessibility else {
return nil
}
let expressionResolver = context.expressionResolver
switch accessibility.resolveMode(expressionResolver) {
case .default:
return accessibility.resolveDescription(expressionResolver)
case .merge:
if let description = accessibility.resolveDescription(expressionResolver) {
return description
}
return nonNilItems.resolveMergedDescription(context)
case .exclude:
return nil
}
}
}
extension [Div] {
fileprivate func resolveMergedDescription(_ context: DivBlockModelingContext) -> String? {
var result = ""
func traverse(div: Div) {
if let descritpion = div.resolveDescription(context), !descritpion.isEmpty {
result = result.isEmpty ? descritpion : result + " " + descritpion
}
div.children.forEach(traverse)
}
forEach(traverse)
return result.isEmpty ? nil : result
}
}
extension Div {
fileprivate func resolveDescription(_ context: DivBlockModelingContext) -> String? {
let expressionResolver = context.expressionResolver
let accessibility = value.accessibility
guard accessibility?.resolveMode(expressionResolver) != .exclude else {
return nil
}
switch self {
case .divContainer,
.divCustom,
.divGallery,
.divGifImage,
.divGrid,
.divImage,
.divIndicator,
.divInput,
.divPager,
.divSelect,
.divSeparator,
.divSlider,
.divState,
.divSwitch,
.divTabs,
.divVideo:
return accessibility?.resolveDescription(expressionResolver)
case let .divText(divText):
let extensionDescription = context
.getExtensionHandlers(for: divText)
.compactMap { $0.accessibilityElement?.strings.label }
.reduce(nil) { $0?.appending(" " + $1) ?? $1 }
return extensionDescription ??
accessibility?.resolveDescription(expressionResolver) ??
divText.resolveText(expressionResolver)
}
}
}