|
@@ -976,11 +976,11 @@ extension Home {
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
// TODO: Consolidate all mmol parsing methods (in TagCloudView, NightscoutManager and HomeRootView) to one central func
|
|
// TODO: Consolidate all mmol parsing methods (in TagCloudView, NightscoutManager and HomeRootView) to one central func
|
|
|
- private func parseReasonConclusion(_ reasonConclusion: String, isMmolL _: Bool) -> String {
|
|
|
|
|
|
|
+ private func parseReasonConclusion(_ reasonConclusion: String, isMmolL: Bool) -> String {
|
|
|
let patterns = [
|
|
let patterns = [
|
|
|
"minGuardBG\\s*-?\\d+\\.?\\d*<-?\\d+\\.?\\d*",
|
|
"minGuardBG\\s*-?\\d+\\.?\\d*<-?\\d+\\.?\\d*",
|
|
|
"Eventual BG\\s*-?\\d+\\.?\\d*\\s*>=\\s*-?\\d+\\.?\\d*",
|
|
"Eventual BG\\s*-?\\d+\\.?\\d*\\s*>=\\s*-?\\d+\\.?\\d*",
|
|
|
- "\\S+\\s+-?\\d+\\.?\\d*\\s*>\\s*\\d+%\\s+of\\s+BG\\s+-?\\d+\\.?\\d*"
|
|
|
|
|
|
|
+ "(\\S+)\\s+(-?\\d+\\.?\\d*)\\s*>\\s*(\\d+)%\\s+of\\s+BG\\s+(-?\\d+\\.?\\d*)" // "for case maxDelta 37 > 20% of BG 95"
|
|
|
]
|
|
]
|
|
|
let pattern = patterns.joined(separator: "|")
|
|
let pattern = patterns.joined(separator: "|")
|
|
|
let regex = try! NSRegularExpression(pattern: pattern)
|
|
let regex = try! NSRegularExpression(pattern: pattern)
|
|
@@ -1003,61 +1003,52 @@ extension Home {
|
|
|
guard let range = Range(match.range, in: reasonConclusion) else { continue }
|
|
guard let range = Range(match.range, in: reasonConclusion) else { continue }
|
|
|
let matchedString = String(reasonConclusion[range])
|
|
let matchedString = String(reasonConclusion[range])
|
|
|
|
|
|
|
|
- if matchedString.contains("<") {
|
|
|
|
|
|
|
+ if isMmolL {
|
|
|
// Handle "minGuardBG x<y" pattern
|
|
// Handle "minGuardBG x<y" pattern
|
|
|
- let parts = matchedString.components(separatedBy: "<")
|
|
|
|
|
- if parts.count == 2,
|
|
|
|
|
- let firstValue = Double(
|
|
|
|
|
- parts[0]
|
|
|
|
|
- .components(separatedBy: CharacterSet(charactersIn: "0123456789.-").inverted).joined()
|
|
|
|
|
- ),
|
|
|
|
|
- let secondValue = Double(
|
|
|
|
|
- parts[1]
|
|
|
|
|
- .components(separatedBy: CharacterSet(charactersIn: "0123456789.-").inverted).joined()
|
|
|
|
|
- )
|
|
|
|
|
- {
|
|
|
|
|
- let formattedFirstValue = convertToMmolL(String(firstValue))
|
|
|
|
|
- let formattedSecondValue = convertToMmolL(String(secondValue))
|
|
|
|
|
- let formattedString = "minGuardBG \(formattedFirstValue)<\(formattedSecondValue)"
|
|
|
|
|
- updatedConclusion.replaceSubrange(range, with: formattedString)
|
|
|
|
|
|
|
+ if matchedString.contains("<") {
|
|
|
|
|
+ let parts = matchedString.components(separatedBy: "<")
|
|
|
|
|
+ if parts.count == 2 {
|
|
|
|
|
+ let firstValue = parts[0].trimmingCharacters(in: .whitespaces)
|
|
|
|
|
+ let secondValue = parts[1].trimmingCharacters(in: .whitespaces)
|
|
|
|
|
+ let formattedFirstValue = convertToMmolL(firstValue)
|
|
|
|
|
+ let formattedSecondValue = convertToMmolL(secondValue)
|
|
|
|
|
+ let formattedString = "minGuardBG \(formattedFirstValue)<\(formattedSecondValue)"
|
|
|
|
|
+ updatedConclusion.replaceSubrange(range, with: formattedString)
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
- } else if matchedString.contains(">=") {
|
|
|
|
|
// Handle "Eventual BG x >= target" pattern
|
|
// Handle "Eventual BG x >= target" pattern
|
|
|
- let parts = matchedString.components(separatedBy: " >= ")
|
|
|
|
|
- if parts.count == 2,
|
|
|
|
|
- let firstValue = Double(
|
|
|
|
|
- parts[0]
|
|
|
|
|
- .components(separatedBy: CharacterSet(charactersIn: "0123456789.-").inverted).joined()
|
|
|
|
|
- ),
|
|
|
|
|
- let secondValue = Double(
|
|
|
|
|
- parts[1]
|
|
|
|
|
- .components(separatedBy: CharacterSet(charactersIn: "0123456789.-").inverted).joined()
|
|
|
|
|
- )
|
|
|
|
|
- {
|
|
|
|
|
- let formattedFirstValue = convertToMmolL(String(firstValue))
|
|
|
|
|
- let formattedSecondValue = convertToMmolL(String(secondValue))
|
|
|
|
|
- let formattedString = "Eventual BG \(formattedFirstValue) >= \(formattedSecondValue)"
|
|
|
|
|
- updatedConclusion.replaceSubrange(range, with: formattedString)
|
|
|
|
|
|
|
+ else if matchedString.contains(">=") {
|
|
|
|
|
+ let parts = matchedString.components(separatedBy: " >= ")
|
|
|
|
|
+ if parts.count == 2 {
|
|
|
|
|
+ let firstValue = parts[0].trimmingCharacters(in: .whitespaces)
|
|
|
|
|
+ let secondValue = parts[1].trimmingCharacters(in: .whitespaces)
|
|
|
|
|
+ let formattedFirstValue = convertToMmolL(firstValue)
|
|
|
|
|
+ let formattedSecondValue = convertToMmolL(secondValue)
|
|
|
|
|
+ let formattedString = "Eventual BG \(formattedFirstValue) >= \(formattedSecondValue)"
|
|
|
|
|
+ updatedConclusion.replaceSubrange(range, with: formattedString)
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
- } else if matchedString.contains(">") {
|
|
|
|
|
// Handle "maxDelta 37 > 20% of BG 95" style
|
|
// Handle "maxDelta 37 > 20% of BG 95" style
|
|
|
- let pattern = "(\\S+)\\s+(-?\\d+\\.?\\d*)\\s*>\\s*(\\d+)%\\s+of\\s+BG\\s+(-?\\d+\\.?\\d*)"
|
|
|
|
|
- let localRegex = try! NSRegularExpression(pattern: pattern)
|
|
|
|
|
- if let localMatch = localRegex.firstMatch(
|
|
|
|
|
|
|
+ else if let localMatch = regex.firstMatch(
|
|
|
in: matchedString,
|
|
in: matchedString,
|
|
|
range: NSRange(matchedString.startIndex..., in: matchedString)
|
|
range: NSRange(matchedString.startIndex..., in: matchedString)
|
|
|
) {
|
|
) {
|
|
|
- let metric = String(matchedString[Range(localMatch.range(at: 1), in: matchedString)!])
|
|
|
|
|
- let firstValue = String(matchedString[Range(localMatch.range(at: 2), in: matchedString)!])
|
|
|
|
|
- let percentage = String(matchedString[Range(localMatch.range(at: 3), in: matchedString)!])
|
|
|
|
|
- let bgValue = String(matchedString[Range(localMatch.range(at: 4), in: matchedString)!])
|
|
|
|
|
|
|
+ if match.numberOfRanges == 5 {
|
|
|
|
|
+ let metric = String(matchedString[Range(localMatch.range(at: 1), in: matchedString)!])
|
|
|
|
|
+ let firstValue = String(matchedString[Range(localMatch.range(at: 2), in: matchedString)!])
|
|
|
|
|
+ let percentage = String(matchedString[Range(localMatch.range(at: 3), in: matchedString)!])
|
|
|
|
|
+ let bgValue = String(matchedString[Range(localMatch.range(at: 4), in: matchedString)!])
|
|
|
|
|
|
|
|
- let formattedFirstValue = convertToMmolL(firstValue)
|
|
|
|
|
- let formattedBGValue = convertToMmolL(bgValue)
|
|
|
|
|
|
|
+ let formattedFirstValue = convertToMmolL(firstValue)
|
|
|
|
|
+ let formattedBGValue = convertToMmolL(bgValue)
|
|
|
|
|
|
|
|
- let formattedString = "\(metric) \(formattedFirstValue) > \(percentage)% of BG \(formattedBGValue)"
|
|
|
|
|
- updatedConclusion.replaceSubrange(range, with: formattedString)
|
|
|
|
|
|
|
+ let formattedString = "\(metric) \(formattedFirstValue) > \(percentage)% of BG \(formattedBGValue)"
|
|
|
|
|
+ updatedConclusion.replaceSubrange(range, with: formattedString)
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
|
|
+ } else {
|
|
|
|
|
+ // When isMmolL is false, ensure the original value is retained without any duplication
|
|
|
|
|
+ updatedConclusion.replaceSubrange(range, with: matchedString)
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|