chromium/ios/web/common/annotations_utils.mm

// Copyright 2023 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#import "ios/web/common/annotations_utils.h"

#import "base/apple/foundation_util.h"
#import "base/strings/sys_string_conversions.h"

namespace web {

// Annotation keys for annotation.
static const char kAnnotationsTextKey[] = "text";
static const char kAnnotationsStartKey[] = "start";
static const char kAnnotationsEndKey[] = "end";
static const char kAnnotationsTypeKey[] = "type";
NSString* const kMailtoPrefixUrl = @"mailto:";

web::TextAnnotation ConvertMatchToAnnotation(NSString* source,
                                             NSRange range,
                                             NSTextCheckingResult* data,
                                             NSString* type) {
  base::Value::Dict dict;
  NSString* start = [source substringWithRange:range];
  dict.Set(kAnnotationsStartKey, base::Value(static_cast<int>(range.location)));
  dict.Set(kAnnotationsEndKey,
           base::Value(static_cast<int>(range.location + range.length)));
  dict.Set(kAnnotationsTextKey, base::Value(base::SysNSStringToUTF8(start)));
  dict.Set(kAnnotationsTypeKey, base::Value(base::SysNSStringToUTF8(type)));
  return std::make_pair(std::move(dict), data);
}

bool IsNSTextCheckingResultEmail(NSTextCheckingResult* result) {
  return result.resultType == NSTextCheckingTypeLink &&
         [result.URL.scheme isEqualToString:@"mailto"];
}

NSTextCheckingResult* MakeNSTextCheckingResultEmail(NSString* email,
                                                    NSRange range) {
  NSString* mailto_email = [kMailtoPrefixUrl stringByAppendingString:email];
  NSURL* email_url = [[NSURL alloc] initWithString:mailto_email];
  return [NSTextCheckingResult linkCheckingResultWithRange:range URL:email_url];
}

}  // namespace web