summaryrefslogtreecommitdiff
path: root/Sora
diff options
context:
space:
mode:
Diffstat (limited to 'Sora')
-rw-r--r--Sora/Data/Moebooru/MoebooruManager.swift2
-rw-r--r--Sora/Data/Moebooru/MoebooruTag.swift2
-rw-r--r--Sora/Data/Moebooru/MoebooruTagXMLParser.swift59
-rw-r--r--Sora/Data/Settings.swift3
-rw-r--r--Sora/Views/Post/PostGridView.swift20
-rw-r--r--Sora/Views/Post/PostView.swift5
-rw-r--r--Sora/Views/Settings/SettingsThumbnailsView.swift20
7 files changed, 81 insertions, 30 deletions
diff --git a/Sora/Data/Moebooru/MoebooruManager.swift b/Sora/Data/Moebooru/MoebooruManager.swift
index 286a187..25d2489 100644
--- a/Sora/Data/Moebooru/MoebooruManager.swift
+++ b/Sora/Data/Moebooru/MoebooruManager.swift
@@ -100,7 +100,7 @@ class MoebooruManager: ObservableObject {
if Task.isCancelled { return }
DispatchQueue.main.async {
- self.allTags = (MoebooruTagXMLParser().parse(data: data)).sorted { $0.count > $1.count }
+ self.allTags = (MoebooruTagXMLParser(data: data).parse()).sorted { $0.count > $1.count }
}
} catch {
if (error as? URLError)?.code != .cancelled {
diff --git a/Sora/Data/Moebooru/MoebooruTag.swift b/Sora/Data/Moebooru/MoebooruTag.swift
index cc783f0..6aa7449 100644
--- a/Sora/Data/Moebooru/MoebooruTag.swift
+++ b/Sora/Data/Moebooru/MoebooruTag.swift
@@ -1,7 +1,7 @@
import Foundation
struct MoebooruTag: Identifiable, Hashable {
- let id: Int
+ let id: String
let name: String
let count: Int
let type: Int
diff --git a/Sora/Data/Moebooru/MoebooruTagXMLParser.swift b/Sora/Data/Moebooru/MoebooruTagXMLParser.swift
index 7ea2e8e..e8b0213 100644
--- a/Sora/Data/Moebooru/MoebooruTagXMLParser.swift
+++ b/Sora/Data/Moebooru/MoebooruTagXMLParser.swift
@@ -2,34 +2,57 @@ import Foundation
class MoebooruTagXMLParser: NSObject, XMLParserDelegate {
private var tags: [MoebooruTag] = []
+ private var currentTag: MoebooruTag?
+ private var parser: XMLParser
- func parse(data: Data) -> [MoebooruTag] {
- let parser = XMLParser(data: data)
+ init(data: Data) {
+ parser = XMLParser(data: data)
+
+ super.init()
parser.delegate = self
+ }
+
+ func parse() -> [MoebooruTag] {
parser.parse()
return tags
}
- func parser(_: XMLParser, didStartElement elementName: String,
- namespaceURI _: String?, qualifiedName _: String?,
- attributes attributeDict: [String: String])
- {
+ func parser(_: XMLParser, didStartElement elementName: String, namespaceURI _: String?, qualifiedName _: String?, attributes attributeDict: [String: String] = [:]) {
if elementName == "tag" {
- if let id = Int(attributeDict["id"] ?? ""),
- let count = Int(attributeDict["count"] ?? ""),
- let type = Int(attributeDict["type"] ?? ""),
- let ambiguous = Bool(attributeDict["ambiguous"] ?? "false")
- {
- tags.append(MoebooruTag(
- id: id,
- name: attributeDict["name"] ?? "",
- count: count,
- type: type,
- ambiguous: ambiguous
- ))
+ guard let id = attributeDict["id"],
+ let name = attributeDict["name"],
+ let countStr = attributeDict["count"],
+ let count = Int(countStr),
+ let typeStr = attributeDict["type"],
+ let type = Int(typeStr),
+ let ambiguousStr = attributeDict["ambiguous"]
+ else {
+ return
}
+
+ currentTag = MoebooruTag(
+ id: id,
+ name: name,
+ count: count,
+ type: type,
+ ambiguous: ambiguousStr == "true"
+ )
+ }
+ }
+
+ func parser(_: XMLParser, didEndElement elementName: String, namespaceURI _: String?, qualifiedName _: String?) {
+ if elementName == "tag", let tag = currentTag {
+ tags.append(tag)
+
+ currentTag = nil
}
}
+
+ #if DEBUG
+ func parser(_: XMLParser, parseErrorOccurred parseError: any Error) {
+ print(parseError)
+ }
+ #endif
}
diff --git a/Sora/Data/Settings.swift b/Sora/Data/Settings.swift
index cf90a95..4d5a030 100644
--- a/Sora/Data/Settings.swift
+++ b/Sora/Data/Settings.swift
@@ -9,5 +9,6 @@ class Settings: ObservableObject {
@AppStorage("thumbnailType") var thumbnailType: PostFileType = .preview
@AppStorage("searchSuggestions") var searchSuggestions: Bool = false
@AppStorage("columns") var columns: Int = 2
- @AppStorage("blurUnsafeThumbnails") var blurUnsafeThumbnails: Bool = false
+ @AppStorage("blurNSFWThumbnails") var blurNSFWThumbnails: Bool = false
+ @AppStorage("showNSFWPosts") var showNSFWPosts: Bool = false
}
diff --git a/Sora/Views/Post/PostGridView.swift b/Sora/Views/Post/PostGridView.swift
index 99f5013..0a1c37b 100644
--- a/Sora/Views/Post/PostGridView.swift
+++ b/Sora/Views/Post/PostGridView.swift
@@ -5,26 +5,38 @@ struct PostGridView: View {
@EnvironmentObject var settings: Settings
@ObservedObject var manager: MoebooruManager
+ var filteredPosts: [MoebooruPost] {
+ settings.showNSFWPosts ? manager.posts : manager.posts.filter { $0.rating == "s" }
+ }
+
var body: some View {
ScrollViewReader { _ in
ScrollView {
- if manager.posts.isEmpty {
+ if filteredPosts.isEmpty {
ProgressView()
.padding()
}
- WaterfallGrid(manager.posts, id: \.id) { post in
+ WaterfallGrid(filteredPosts, id: \.id) { post in
Group {
#if os(macOS)
Button {
manager.selectedPost = post
} label: {
- PostView(post: post, manager: manager)
+ PostView(
+ post: post,
+ manager: manager,
+ posts: filteredPosts
+ )
}
.buttonStyle(PlainButtonStyle())
#else
NavigationLink(value: post) {
- PostView(post: post, manager: manager)
+ PostView(
+ post: post,
+ manager: manager,
+ posts: filteredPosts
+ )
}
#endif
}
diff --git a/Sora/Views/Post/PostView.swift b/Sora/Views/Post/PostView.swift
index 335f88e..111d77e 100644
--- a/Sora/Views/Post/PostView.swift
+++ b/Sora/Views/Post/PostView.swift
@@ -4,6 +4,7 @@ struct PostView: View {
@EnvironmentObject var settings: Settings
let post: MoebooruPost
@ObservedObject var manager: MoebooruManager
+ let posts: [MoebooruPost]
private var thumbnailURL: URL? {
switch settings.thumbnailType {
case .preview:
@@ -24,13 +25,13 @@ struct PostView: View {
.resizable()
.aspectRatio(contentMode: .fit)
.onScrollVisibilityChange { visible in
- if post == manager.posts.last && !manager.endOfData && visible {
+ if post == posts.last && !manager.endOfData && visible {
Task {
manager.loadNextPage()
}
}
}
- .blur(radius: settings.blurUnsafeThumbnails ? post.rating != "s" ? 10 : 0 : 0)
+ .blur(radius: settings.blurNSFWThumbnails ? post.rating != "s" ? 10 : 0 : 0)
} placeholder: {
ProgressView()
.padding()
diff --git a/Sora/Views/Settings/SettingsThumbnailsView.swift b/Sora/Views/Settings/SettingsThumbnailsView.swift
index 04b4afb..d5fe750 100644
--- a/Sora/Views/Settings/SettingsThumbnailsView.swift
+++ b/Sora/Views/Settings/SettingsThumbnailsView.swift
@@ -49,14 +49,28 @@ struct SettingsThumbnailsView: View {
#if os(macOS)
HStack {
- Text("Blur Unsafe Thumbnails")
+ Text("Show NSFW Posts")
Spacer()
- Toggle("", isOn: $settings.blurUnsafeThumbnails)
+ Toggle("", isOn: $settings.showNSFWPosts)
}
#else
- Toggle("Blur Unsafe Thumbnails", isOn: $settings.blurUnsafeThumbnails)
+ Toggle("Show NSFW Posts", isOn: $settings.showNSFWPosts)
#endif
+
+ if settings.showNSFWPosts {
+ #if os(macOS)
+ HStack {
+ Text("Blur NSFW Thumbnails")
+
+ Spacer()
+
+ Toggle("", isOn: $settings.blurNSFWThumbnails)
+ }
+ #else
+ Toggle("Blur NSFW Thumbnails", isOn: $settings.blurUnsafeThumbnails)
+ #endif
+ }
}
}