import Foundation /// String escaping for values interpolated into AppleScript source. Every /// module that sends via AppleScript (iMessage, iMail, future iNote / /// iReminder fallbacks) previously re-implemented the same backslash + quote /// replacement. Extracted once so a missed escape can be fixed in one place. public enum AppleScriptEscape { /// Escape a value for embedding inside a double-quoted AppleScript /// literal: `"…\(escaped)…"`. Handles backslashes and double quotes. /// Newlines in the source are preserved as the literal characters /// `\\n` because AppleScript treats raw newlines inside `"…"` literals /// as a syntax error when they originate from interpolation. public static func quote(_ value: String) -> String { value .replacingOccurrences(of: "\\", with: "\\\\") .replacingOccurrences(of: "\"", with: "\\\"") .replacingOccurrences(of: "\n", with: "\\n") .replacingOccurrences(of: "\r", with: "\\r") } }