mirror of
https://github.com/danog/Telegram.git
synced 2024-12-02 09:27:55 +01:00
191 lines
5.7 KiB
Objective-C
191 lines
5.7 KiB
Objective-C
#import "TGSharedMediaLinkItem.h"
|
|
|
|
#import "TGMessage.h"
|
|
|
|
#import "TGSharedMediaDirectionFilter.h"
|
|
#import "TGWebPageMediaAttachment.h"
|
|
|
|
#import "TGFont.h"
|
|
#import "TGModernTextViewModel.h"
|
|
#import "TGReusableLabel.h"
|
|
|
|
#import "TGSharedPhotoSignals.h"
|
|
#import "TGSharedMediaUtils.h"
|
|
#import "TGSharedMediaSignals.h"
|
|
|
|
@interface TGSharedMediaLinkItem ()
|
|
{
|
|
int32_t _messageId;
|
|
NSTimeInterval _date;
|
|
bool _incoming;
|
|
|
|
TGModernTextViewModel *_textModel;
|
|
TGWebPageMediaAttachment *_webPage;
|
|
NSArray *_links;
|
|
}
|
|
|
|
@end
|
|
|
|
@implementation TGSharedMediaLinkItem
|
|
|
|
- (instancetype)initWithMessage:(TGMessage *)message messageId:(int32_t)messageId date:(NSTimeInterval)date incoming:(bool)incoming
|
|
{
|
|
self = [super init];
|
|
if (self != nil)
|
|
{
|
|
_message = message;
|
|
_messageId = messageId;
|
|
_date = date;
|
|
_incoming = incoming;
|
|
|
|
for (id attachment in message.mediaAttachments)
|
|
{
|
|
if ([attachment isKindOfClass:[TGWebPageMediaAttachment class]])
|
|
{
|
|
_webPage = attachment;
|
|
break;
|
|
}
|
|
}
|
|
|
|
NSMutableArray *links = [[NSMutableArray alloc] init];
|
|
NSString *title = nil;
|
|
for (id result in [TGMessage textCheckingResultsForText:message.text highlightMentionsAndTags:false highlightCommands:false])
|
|
{
|
|
if ([result isKindOfClass:[NSTextCheckingResult class]])
|
|
{
|
|
NSURL *url = ((NSTextCheckingResult *)result).URL;
|
|
if (url != nil)
|
|
{
|
|
if (title == nil)
|
|
{
|
|
NSString *host = url.host;
|
|
NSRange dotRange = [host rangeOfString:@"." options:NSBackwardsSearch];
|
|
if (dotRange.location != NSNotFound)
|
|
host = [host substringToIndex:dotRange.location];
|
|
|
|
if (host.length == 1)
|
|
title = [host capitalizedString];
|
|
else if (host.length != 0)
|
|
{
|
|
title = [[[host substringToIndex:1] capitalizedString] stringByAppendingString:[host substringFromIndex:1]];
|
|
}
|
|
}
|
|
[links addObject:[url absoluteString]];
|
|
}
|
|
}
|
|
}
|
|
_links = links;
|
|
|
|
NSMutableString *linksText = [[NSMutableString alloc] init];
|
|
for (NSString *link in links)
|
|
{
|
|
if (linksText.length != 0)
|
|
[linksText appendString:@"\n"];
|
|
[linksText appendString:link];
|
|
}
|
|
|
|
NSString *rawText = message.text;
|
|
if ([rawText isEqual:linksText])
|
|
{
|
|
if (_webPage != nil && _webPage.pageDescription.length != 0)
|
|
rawText = _webPage.pageDescription;
|
|
else
|
|
rawText = @"";
|
|
}
|
|
if (rawText == nil)
|
|
rawText = @"";
|
|
NSMutableString *text = [[NSMutableString alloc] initWithString:rawText];
|
|
[text replaceOccurrencesOfString:@"\n\n" withString:@"\n" options:0 range:NSMakeRange(0, text.length)];
|
|
[text replaceOccurrencesOfString:@"\t" withString:@"" options:0 range:NSMakeRange(0, text.length)];
|
|
_textModel = [[TGModernTextViewModel alloc] initWithText:text font:TGCoreTextSystemFontOfSize(14.0f)];
|
|
_textModel.additionalLineSpacing = 4.0f;
|
|
_textModel.layoutFlags = TGReusableLabelLayoutMultiline;
|
|
_textModel.maxNumberOfLines = 3;
|
|
}
|
|
return self;
|
|
}
|
|
|
|
- (TGModernTextViewModel *)textModel
|
|
{
|
|
return _textModel;
|
|
}
|
|
|
|
- (SSignal *)imageSignal
|
|
{
|
|
if (_webPage.photo != nil)
|
|
{
|
|
NSString *key = [[NSString alloc] initWithFormat:@"webpage-image-%" PRId64 "", _webPage.photo.imageId];
|
|
return [TGSharedPhotoSignals sharedPhotoImage:_webPage.photo size:CGSizeMake(80.0f, 80.0f) threadPool:[TGSharedMediaUtils sharedMediaImageProcessingThreadPool] memoryCache:[TGSharedMediaUtils sharedMediaMemoryImageCache] pixelProcessingBlock:[TGSharedMediaSignals pixelProcessingBlockForRoundCornersOfRadius:8.0f] cacheKey:key];
|
|
}
|
|
else
|
|
return nil;
|
|
}
|
|
|
|
- (TGWebPageMediaAttachment *)webPage
|
|
{
|
|
return _webPage;
|
|
}
|
|
|
|
- (NSArray *)links
|
|
{
|
|
return _links;
|
|
}
|
|
|
|
- (CGFloat)heightForWidth:(CGFloat)width
|
|
{
|
|
if (_textModel.text.length == 0 || [_textModel.text isEqualToString:@" "])
|
|
{
|
|
_textModel.frame = CGRectMake(0.0f, 0.0f, 0.0f, 0.0f);
|
|
return MAX(_textModel.frame.size.height + 35.0f + _links.count * 20.0f, 64.0f);
|
|
}
|
|
else
|
|
{
|
|
[_textModel layoutForContainerSize:CGSizeMake(width - 80.0f, CGFLOAT_MAX)];
|
|
return _textModel.frame.size.height + 35.0f + _links.count * 20.0f;
|
|
}
|
|
}
|
|
|
|
- (instancetype)copyWithZone:(NSZone *)__unused zone
|
|
{
|
|
return [[TGSharedMediaLinkItem alloc] initWithMessage:_message messageId:_messageId date:_date incoming:_incoming];
|
|
}
|
|
|
|
- (BOOL)isEqual:(id)object
|
|
{
|
|
return [object isKindOfClass:[TGSharedMediaLinkItem class]] && ((TGSharedMediaLinkItem *)object)->_messageId == _messageId;
|
|
}
|
|
|
|
- (NSUInteger)hash
|
|
{
|
|
return _messageId;
|
|
}
|
|
|
|
- (int32_t)messageId
|
|
{
|
|
return _messageId;
|
|
}
|
|
|
|
- (NSTimeInterval)date
|
|
{
|
|
return _date;
|
|
}
|
|
|
|
- (bool)passesFilter:(id<TGSharedMediaFilter>)filter
|
|
{
|
|
if ([filter isKindOfClass:[TGSharedMediaDirectionFilter class]])
|
|
{
|
|
switch (((TGSharedMediaDirectionFilter *)filter).direction)
|
|
{
|
|
case TGSharedMediaDirectionBoth:
|
|
return true;
|
|
case TGSharedMediaDirectionIncoming:
|
|
return _incoming;
|
|
case TGSharedMediaDirectionOutgoing:
|
|
return !_incoming;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
|
|
@end
|