ComponentTextKit/CKLabelComponent.mm (122 lines of code) (raw):
/*
* Copyright (c) 2014-present, Facebook, Inc.
* All rights reserved.
*
* This source code is licensed under the BSD-style license found in the
* LICENSE file in the root directory of this source tree. An additional grant
* of patent rights can be found in the PATENTS file in the same directory.
*
*/
#import "CKLabelComponent.h"
#import <ComponentTextKit/CKTextComponent.h>
#import <ComponentKit/CKComponentViewConfiguration_SwiftBridge+Internal.h>
#import <ComponentKit/CKComponentViewAttribute_SwiftBridge+Internal.h>
#import <ComponentKit/RCComponentSize_SwiftBridge+Internal.h>
@implementation CKLabelComponent
- (instancetype)initWithText:(NSString *)text
truncationString:(NSString *)truncationString
font:(UIFont *)font
color:(UIColor *)color
lineBreakMode:(NSLineBreakMode )lineBreakMode
maximumNumberOfLines:(NSUInteger )maximumNumberOfLines
shadowOffset:(CGSize )shadowOffset
shadowColor:(UIColor *)shadowColor
shadowOpacity:(CGFloat )shadowOpacity
shadowRadius:(CGFloat )shadowRadius
alignment:(NSTextAlignment )alignment
firstLineHeadIndent:(CGFloat )firstLineHeadIndent
headIndent:(CGFloat )headIndent
tailIndent:(CGFloat )tailIndent
lineHeightMultiple:(CGFloat )lineHeightMultiple
maximumLineHeight:(CGFloat )maximumLineHeight
minimumLineHeight:(CGFloat )minimumLineHeight
lineSpacing:(CGFloat )lineSpacing
paragraphSpacing:(CGFloat )paragraphSpacing
paragraphSpacingBefore:(CGFloat )paragraphSpacingBefore
swiftSize:(RCComponentSize_SwiftBridge *)swiftSize
swiftAttributes:(NSArray<CKComponentViewAttribute_SwiftBridge *> *)swiftAttributes
{
const auto labelAttributes = CKLabelAttributes{
.string = text,
.font = font,
.color = color,
.lineBreakMode = lineBreakMode,
.maximumNumberOfLines = maximumNumberOfLines,
.shadowOffset = shadowOffset,
.shadowColor = shadowColor,
.shadowOpacity = shadowOpacity,
.shadowRadius = shadowRadius,
.alignment = alignment,
.firstLineHeadIndent = firstLineHeadIndent,
.headIndent = headIndent,
.tailIndent = tailIndent,
.lineHeightMultiple = lineHeightMultiple,
.maximumLineHeight = maximumLineHeight,
.minimumLineHeight = minimumLineHeight,
.lineSpacing = lineSpacing,
.paragraphSpacing = paragraphSpacing,
.paragraphSpacingBefore = paragraphSpacingBefore,
};
const auto size = swiftSize != nil ? swiftSize.componentSize : RCComponentSize{};
return [self initWithLabelAttributes:labelAttributes
viewAttributes:CKComponentViewAttribute_SwiftBridgeToMap(swiftAttributes)
size:size];
}
- (instancetype)initWithLabelAttributes:(const CKLabelAttributes &)attributes
viewAttributes:(const CKViewComponentAttributeValueMap &)viewAttributes
size:(const RCComponentSize &)size
{
CKViewComponentAttributeValueMap copiedMap = viewAttributes;
return [super initWithView:{} component:
[CKTextComponent
newWithTextAttributes:textKitAttributes(attributes)
viewAttributes:std::move(copiedMap)
options:{.accessibilityContext = {.isAccessibilityElement = @(YES)}}
size:size]];
}
+ (instancetype)newWithLabelAttributes:(const CKLabelAttributes &)attributes
viewAttributes:(const CKViewComponentAttributeValueMap &)viewAttributes
size:(const RCComponentSize &)size
{
return [[self alloc] initWithLabelAttributes:attributes viewAttributes:viewAttributes size:size];;
}
static const CKTextKitAttributes textKitAttributes(const CKLabelAttributes &labelAttributes)
{
return {
.attributedString = formattedAttributedString(labelAttributes.string, labelAttributes),
.truncationAttributedString = formattedAttributedString(labelAttributes.truncationString, labelAttributes),
.lineBreakMode = labelAttributes.lineBreakMode,
.maximumNumberOfLines = labelAttributes.maximumNumberOfLines,
.shadowOffset = labelAttributes.shadowOffset,
.shadowColor = labelAttributes.shadowColor,
.shadowOpacity = labelAttributes.shadowOpacity,
.shadowRadius = labelAttributes.shadowRadius,
};
}
static NSAttributedString *formattedAttributedString(NSString *string, const CKLabelAttributes &labelAttributes)
{
if (!string) {
return nil;
}
return [[NSAttributedString alloc] initWithString:string
attributes:stringAttributes(labelAttributes)];
}
static NSDictionary *stringAttributes(const CKLabelAttributes &labelAttributes)
{
NSMutableDictionary *attributes = [NSMutableDictionary dictionary];
if (labelAttributes.font) {
attributes[NSFontAttributeName] = labelAttributes.font;
}
if (labelAttributes.color) {
attributes[NSForegroundColorAttributeName] = labelAttributes.color;
}
attributes[NSParagraphStyleAttributeName] = paragraphStyle(labelAttributes);
return attributes;
}
static NSParagraphStyle *paragraphStyle(const CKLabelAttributes &labelAttributes)
{
NSMutableParagraphStyle *ps = [[NSMutableParagraphStyle alloc] init];
ps.alignment = labelAttributes.alignment;
ps.firstLineHeadIndent = labelAttributes.firstLineHeadIndent;
ps.headIndent = labelAttributes.headIndent;
ps.tailIndent = labelAttributes.tailIndent;
ps.lineHeightMultiple = labelAttributes.lineHeightMultiple;
ps.maximumLineHeight = labelAttributes.maximumLineHeight;
ps.minimumLineHeight = labelAttributes.minimumLineHeight;
ps.lineSpacing = labelAttributes.lineSpacing;
ps.paragraphSpacing = labelAttributes.paragraphSpacing;
ps.paragraphSpacingBefore = labelAttributes.paragraphSpacingBefore;
return ps;
}
@end