36 lines
1.3 KiB
Swift
36 lines
1.3 KiB
Swift
|
//
|
||
|
// CharacterCounter.swift
|
||
|
// Pachyderm
|
||
|
//
|
||
|
// Created by Shadowfacts on 9/29/18.
|
||
|
// Copyright © 2018 Shadowfacts. All rights reserved.
|
||
|
//
|
||
|
|
||
|
import Foundation
|
||
|
|
||
|
public struct CharacterCounter {
|
||
|
|
||
|
static let linkDetector = try! NSDataDetector(types: NSTextCheckingResult.CheckingType.link.rawValue)
|
||
|
static let mention = try! NSRegularExpression(pattern: "(@[a-z0-9_]+)(?:@[a-z0-9\\-\\.]+[a-z0-9]+)?", options: .caseInsensitive)
|
||
|
|
||
|
public static func count(text: String) -> Int {
|
||
|
let mentionsRemoved = removeMentions(in: text)
|
||
|
var count = mentionsRemoved.count
|
||
|
for match in linkDetector.matches(in: mentionsRemoved, options: [], range: NSRange(location: 0, length: mentionsRemoved.utf16.count)) {
|
||
|
count -= match.range.length
|
||
|
count += 23 // Mastodon link length
|
||
|
}
|
||
|
return count
|
||
|
}
|
||
|
|
||
|
private static func removeMentions(in text: String) -> String {
|
||
|
var mut = text
|
||
|
for match in mention.matches(in: mut, options: [], range: NSRange(location: 0, length: mut.utf16.count)).reversed() {
|
||
|
let replacement = mut[Range(match.range(at: 1), in: mut)!]
|
||
|
mut.replaceSubrange(Range(match.range, in: mut)!, with: replacement)
|
||
|
}
|
||
|
return mut
|
||
|
}
|
||
|
|
||
|
}
|