import Foundation #if os(macOS) import AppKit #else import UIKit #endif extension NSAttributedString.Key { static let docsCodeStart = NSAttributedString.Key("OficinaDocsCodeStart") } /// Inline decoration uses glyph advances, never extra characters: CRDT and /// clipboard offsets continue to refer to the authored text. @MainActor enum DocumentInlineCode { static func apply(to output: NSMutableAttributedString) { var spans: [NSRange] = [] output.enumerateAttribute(.docsMarks, in: NSRange(location: 0, length: output.length)) { value, range, _ in guard let data = value as? Data, let marks = try? JSONDecoder().decode([String: JSONValue].self, from: data), marks["code"] != nil else { return } if let last = spans.last, NSMaxRange(last) == range.location { spans[spans.count - 1] = NSUnionRange(last, range) } else { spans.append(range) } } for range in spans where range.length > 0 { guard let font = output.attribute(.font, at: range.location, effectiveRange: nil) as? DocsPlatformFont else { continue } let padding = font.pointSize * 0.35 let paragraph = (output.string as NSString).paragraphRange(for: NSRange(location: range.location, length: 0)) output.addAttribute(.docsCodeStart, value: padding, range: (output.string as NSString).rangeOfComposedCharacterSequence(at: range.location)) if paragraph.location != range.location && range.location > 0 { output.addAttribute(.kern, value: padding, range: (output.string as NSString).rangeOfComposedCharacterSequence(at: range.location - 1)) } output.addAttribute(.kern, value: padding, range: (output.string as NSString).rangeOfComposedCharacterSequence(at: NSMaxRange(range) - 1)) #if os(macOS) output.addAttribute(.backgroundColor, value: NSColor(white: 240.0 / 255, alpha: 1), range: range) #else output.addAttribute(.backgroundColor, value: UIColor(white: 240.0 / 255, alpha: 1), range: range) #endif } } }