Files
andros 2aaa8eab7b Initial commit: iOS Denote client
SwiftUI app for iPhone that connects to a WebDAV server and lists,
searches, reads and edits Denote-format notes (.org). Credentials
stored in the iOS Keychain. Server configured via a setup screen on
first launch.
2026-05-22 15:42:19 +02:00

67 lines
2.0 KiB
Swift

import Foundation
class PropfindParser: NSObject, XMLParserDelegate {
private let data: Data
private var result: [DenoteNote] = []
private var currentHref = ""
private var currentModifiedDate: Date?
private var isCollection = false
private var currentText = ""
private let dateFormatter: DateFormatter = {
let f = DateFormatter()
f.locale = Locale(identifier: "en_US_POSIX")
f.dateFormat = "EEE, dd MMM yyyy HH:mm:ss zzz"
return f
}()
init(data: Data) { self.data = data }
func parse() -> [DenoteNote] {
let parser = XMLParser(data: data)
parser.delegate = self
parser.shouldProcessNamespaces = true
parser.parse()
return result
}
func parser(_ parser: XMLParser, didStartElement elementName: String,
namespaceURI: String?, qualifiedName: String?,
attributes: [String: String] = [:]) {
currentText = ""
switch elementName {
case "response":
currentHref = ""
currentModifiedDate = nil
isCollection = false
case "collection":
isCollection = true
default:
break
}
}
func parser(_ parser: XMLParser, foundCharacters string: String) {
currentText += string
}
func parser(_ parser: XMLParser, didEndElement elementName: String,
namespaceURI: String?, qualifiedName: String?) {
let text = currentText.trimmingCharacters(in: .whitespacesAndNewlines)
switch elementName {
case "href":
currentHref = text
case "getlastmodified":
currentModifiedDate = dateFormatter.date(from: text)
case "response":
guard !isCollection else { return }
if let note = DenoteNote.parse(href: currentHref, modifiedDate: currentModifiedDate) {
result.append(note)
}
default:
break
}
}
}