From ea5bcb584f01f7c36cd7608b25ffa2ea71b837e8 Mon Sep 17 00:00:00 2001 From: luah5 Date: Sat, 25 Mar 2023 05:52:09 +0000 Subject: [PATCH 01/25] Add encoding preference --- .../Text Editing/TextEditingPreferences.swift | 38 +++++++++- .../TextEditingPreferencesView.swift | 69 +++++++++++++++++++ CodeEdit/Features/CodeFile/CodeFile.swift | 48 ++++++++++++- 3 files changed, 152 insertions(+), 3 deletions(-) diff --git a/CodeEdit/Features/AppPreferences/Model/Text Editing/TextEditingPreferences.swift b/CodeEdit/Features/AppPreferences/Model/Text Editing/TextEditingPreferences.swift index 40fc38c34a..e7d1523c7f 100644 --- a/CodeEdit/Features/AppPreferences/Model/Text Editing/TextEditingPreferences.swift +++ b/CodeEdit/Features/AppPreferences/Model/Text Editing/TextEditingPreferences.swift @@ -27,6 +27,9 @@ extension AppPreferences { /// A flag indicating whether to wrap lines to editor width var wrapLinesToEditorWidth: Bool = true + /// The encoding that a file is read + var textEncoding: TextEncodingFormats = .utf8 + /// A multiplier for setting the line height. Defaults to `1.45` var lineHeightMultiple: Double = 1.45 @@ -38,8 +41,14 @@ extension AppPreferences { /// Explicit decoder init for setting default values when key is not present in `JSON` init(from decoder: Decoder) throws { let container = try decoder.container(keyedBy: CodingKeys.self) - self.defaultTabWidth = try container.decodeIfPresent(Int.self, forKey: .defaultTabWidth) ?? 4 - self.font = try container.decodeIfPresent(EditorFont.self, forKey: .font) ?? .init() + self.defaultTabWidth = try container.decodeIfPresent( + Int.self, + forKey: .defaultTabWidth + ) ?? 4 + self.font = try container.decodeIfPresent( + EditorFont.self, + forKey: .font + ) ?? .init() self.enableTypeOverCompletion = try container.decodeIfPresent( Bool.self, forKey: .enableTypeOverCompletion @@ -52,6 +61,10 @@ extension AppPreferences { Bool.self, forKey: .wrapLinesToEditorWidth ) ?? true + self.textEncoding = try container.decodeIfPresent( + TextEncodingFormats.self, + forKey: .textEncoding + ) ?? AppPreferences.TextEncodingFormats.utf8 self.lineHeightMultiple = try container.decodeIfPresent( Double.self, forKey: .lineHeightMultiple @@ -93,6 +106,27 @@ extension AppPreferences { } } + enum TextEncodingFormats: String, Codable { + case ascii + case iso2022JP + case isoLatin1 + case isoLatin2 + case japaneseEUC + case macOSRoman + case nextstep + case nonLossyASCII + case shiftJIS + case symbol + case unicode + case utf8 + case utf16 + case utf16be + case utf16le + case utf32 + case utf32be + case utf32le + } + struct EditorFont: Codable, Equatable { /// Indicates whether or not to use a custom font var customFont: Bool = false diff --git a/CodeEdit/Features/AppPreferences/Sections/TextEditingPreferences/TextEditingPreferencesView.swift b/CodeEdit/Features/AppPreferences/Sections/TextEditingPreferences/TextEditingPreferencesView.swift index 2034f6ee42..6db307ed2a 100644 --- a/CodeEdit/Features/AppPreferences/Sections/TextEditingPreferences/TextEditingPreferencesView.swift +++ b/CodeEdit/Features/AppPreferences/Sections/TextEditingPreferences/TextEditingPreferencesView.swift @@ -75,6 +75,9 @@ struct TextEditingPreferencesView: View { PreferencesSection("Line Wrapping") { wrapLinesToEditorWidth } + PreferencesSection("Default Text Encoding") { + textEncoding + } } } @@ -130,6 +133,72 @@ struct TextEditingPreferencesView: View { } } + private var textEncoding: some View { + Picker("Text encoding", selection: $prefs.preferences.textEditing.textEncoding) { + Group { + Text("ASCII") + .tag(AppPreferences.TextEncodingFormats.ascii) + Text("Non Lossy ASCII") + .tag(AppPreferences.TextEncodingFormats.nonLossyASCII) + + Divider() + + Text("ISO 2022 Japan") + .tag(AppPreferences.TextEncodingFormats.iso2022JP) + Text("Japanese EUC") + .tag(AppPreferences.TextEncodingFormats.japaneseEUC) + + Divider() + + Text("ISO Latin 1") + .tag(AppPreferences.TextEncodingFormats.isoLatin1) + Text("ISO Latin 2") + .tag(AppPreferences.TextEncodingFormats.isoLatin2) + Text("macOS Roman") + .tag(AppPreferences.TextEncodingFormats.macOSRoman) + } + + Group { + Divider() + + Text("Nextstep") + .tag(AppPreferences.TextEncodingFormats.nextstep) + Text("Shift JIS") + .tag(AppPreferences.TextEncodingFormats.shiftJIS) + Text("Symbol") + .tag(AppPreferences.TextEncodingFormats.symbol) + + Divider() + } + + Group { + Text("Unicode") + .tag(AppPreferences.TextEncodingFormats.unicode) + + Text("Unicode (UTF-8)") + .tag(AppPreferences.TextEncodingFormats.utf8) + + Divider() + + Text("Unicode (UTF-16)") + .tag(AppPreferences.TextEncodingFormats.utf16) + Text("Unicode (UTF-16) Big Endian") + .tag(AppPreferences.TextEncodingFormats.utf16be) + Text("Unicode (UTF-16) Little Endian") + .tag(AppPreferences.TextEncodingFormats.utf16le) + + Divider() + + Text("Unicode (UTF-32)") + .tag(AppPreferences.TextEncodingFormats.utf32) + Text("Unicode (UTF-32) Big Endian") + .tag(AppPreferences.TextEncodingFormats.utf32be) + Text("Unicode (UTF-32) Little Endian") + .tag(AppPreferences.TextEncodingFormats.utf32le) + } + } + } + private var lineHeight: some View { HStack(spacing: 5) { TextField("", value: $prefs.preferences.textEditing.lineHeightMultiple, formatter: lineHeightFormatter) diff --git a/CodeEdit/Features/CodeFile/CodeFile.swift b/CodeEdit/Features/CodeFile/CodeFile.swift index 31a4ea1811..46b1135a71 100644 --- a/CodeEdit/Features/CodeFile/CodeFile.swift +++ b/CodeEdit/Features/CodeFile/CodeFile.swift @@ -23,6 +23,9 @@ final class CodeFileDocument: NSDocument, ObservableObject, QLPreviewItem { @Published var content = "" + @ObservedObject + private var prefs: AppPreferencesModel = .shared + /* This is the main type of the document. For example, if the file is end with '.png', it will be an image, @@ -91,10 +94,53 @@ final class CodeFileDocument: NSDocument, ObservableObject, QLPreviewItem { return data } + // swiftlint:disable cyclomatic_complexity + // swiftlint:disable function_body_length /// This function is used for decoding files. /// It should not throw error as unsupported files can still be opened by QLPreviewView. override func read(from data: Data, ofType _: String) throws { - guard let content = String(data: data, encoding: .utf8) else { return } + var encoding: String.Encoding + + switch prefs.preferences.textEditing.textEncoding { + case .ascii: + encoding = String.Encoding.ascii + case .iso2022JP: + encoding = String.Encoding.iso2022JP + case .isoLatin1: + encoding = String.Encoding.isoLatin1 + case .isoLatin2: + encoding = String.Encoding.isoLatin2 + case .japaneseEUC: + encoding = String.Encoding.japaneseEUC + case .macOSRoman: + encoding = String.Encoding.macOSRoman + case .nextstep: + encoding = String.Encoding.nextstep + case .nonLossyASCII: + encoding = String.Encoding.nonLossyASCII + case .shiftJIS: + encoding = String.Encoding.shiftJIS + case .symbol: + encoding = String.Encoding.symbol + case .unicode: + encoding = String.Encoding.unicode + case .utf8: + encoding = String.Encoding.utf8 + case .utf16: + encoding = String.Encoding.utf16 + case .utf16be: + encoding = String.Encoding.utf16BigEndian + case .utf16le: + encoding = String.Encoding.utf16LittleEndian + case .utf32: + encoding = String.Encoding.utf32 + case .utf32be: + encoding = String.Encoding.utf32BigEndian + case .utf32le: + encoding = String.Encoding.utf32LittleEndian + } + + guard let content = String(data: data, encoding: encoding) else { return } self.content = content } } From 55f8dc602c3bd7cab330a545bf9330b3826b7f7c Mon Sep 17 00:00:00 2001 From: luah5 Date: Sat, 25 Mar 2023 06:02:18 +0000 Subject: [PATCH 02/25] (hopefully) fix swiftlint error --- CodeEdit/Features/CodeFile/CodeFile.swift | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/CodeEdit/Features/CodeFile/CodeFile.swift b/CodeEdit/Features/CodeFile/CodeFile.swift index 46b1135a71..a43f70fe3d 100644 --- a/CodeEdit/Features/CodeFile/CodeFile.swift +++ b/CodeEdit/Features/CodeFile/CodeFile.swift @@ -95,9 +95,8 @@ final class CodeFileDocument: NSDocument, ObservableObject, QLPreviewItem { } // swiftlint:disable cyclomatic_complexity - // swiftlint:disable function_body_length /// This function is used for decoding files. - /// It should not throw error as unsupported files can still be opened by QLPreviewView. + /// It should not throw error as unsupported files can still be opened by QLPreviewView override func read(from data: Data, ofType _: String) throws { var encoding: String.Encoding From ed5e88f498189c017b67ae50696072b00a5bce53 Mon Sep 17 00:00:00 2001 From: luah5 <128280019+luah5@users.noreply.github.com> Date: Sat, 25 Mar 2023 06:39:00 +0000 Subject: [PATCH 03/25] Update TextEditingPreferences.swift --- .../Model/Text Editing/TextEditingPreferences.swift | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/CodeEdit/Features/AppPreferences/Model/Text Editing/TextEditingPreferences.swift b/CodeEdit/Features/AppPreferences/Model/Text Editing/TextEditingPreferences.swift index e7d1523c7f..8a0453a45e 100644 --- a/CodeEdit/Features/AppPreferences/Model/Text Editing/TextEditingPreferences.swift +++ b/CodeEdit/Features/AppPreferences/Model/Text Editing/TextEditingPreferences.swift @@ -28,7 +28,7 @@ extension AppPreferences { var wrapLinesToEditorWidth: Bool = true /// The encoding that a file is read - var textEncoding: TextEncodingFormats = .utf8 + var textEncoding: TextDecodingFormats = .utf8 /// A multiplier for setting the line height. Defaults to `1.45` var lineHeightMultiple: Double = 1.45 @@ -61,10 +61,10 @@ extension AppPreferences { Bool.self, forKey: .wrapLinesToEditorWidth ) ?? true - self.textEncoding = try container.decodeIfPresent( - TextEncodingFormats.self, - forKey: .textEncoding - ) ?? AppPreferences.TextEncodingFormats.utf8 + self.textDecoding = try container.decodeIfPresent( + TextDecodingFormats.self, + forKey: .textDecoding + ) ?? AppPreferences.TextDecodingFormats.utf8 self.lineHeightMultiple = try container.decodeIfPresent( Double.self, forKey: .lineHeightMultiple @@ -106,7 +106,7 @@ extension AppPreferences { } } - enum TextEncodingFormats: String, Codable { + enum TextDecodingFormats: String, Codable { case ascii case iso2022JP case isoLatin1 From a070433b7245d4f57a7336016cb95a6f7cd8fa32 Mon Sep 17 00:00:00 2001 From: luah5 <128280019+luah5@users.noreply.github.com> Date: Sat, 25 Mar 2023 06:40:21 +0000 Subject: [PATCH 04/25] Update TextEditingPreferencesView.swift --- .../TextEditingPreferencesView.swift | 40 +++++++++---------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/CodeEdit/Features/AppPreferences/Sections/TextEditingPreferences/TextEditingPreferencesView.swift b/CodeEdit/Features/AppPreferences/Sections/TextEditingPreferences/TextEditingPreferencesView.swift index 6db307ed2a..eb4e42295f 100644 --- a/CodeEdit/Features/AppPreferences/Sections/TextEditingPreferences/TextEditingPreferencesView.swift +++ b/CodeEdit/Features/AppPreferences/Sections/TextEditingPreferences/TextEditingPreferencesView.swift @@ -75,7 +75,7 @@ struct TextEditingPreferencesView: View { PreferencesSection("Line Wrapping") { wrapLinesToEditorWidth } - PreferencesSection("Default Text Encoding") { + PreferencesSection("Default Text Decoding") { textEncoding } } @@ -133,68 +133,68 @@ struct TextEditingPreferencesView: View { } } - private var textEncoding: some View { - Picker("Text encoding", selection: $prefs.preferences.textEditing.textEncoding) { + private var textDecoding: some View { + Picker("Text decoding", selection: $prefs.preferences.textEditing.textDecoding) { Group { Text("ASCII") - .tag(AppPreferences.TextEncodingFormats.ascii) + .tag(AppPreferences.TextDecodingFormats.ascii) Text("Non Lossy ASCII") - .tag(AppPreferences.TextEncodingFormats.nonLossyASCII) + .tag(AppPreferences.TextDecodingFormats.nonLossyASCII) Divider() Text("ISO 2022 Japan") - .tag(AppPreferences.TextEncodingFormats.iso2022JP) + .tag(AppPreferences.TextDecodingFormats.iso2022JP) Text("Japanese EUC") .tag(AppPreferences.TextEncodingFormats.japaneseEUC) Divider() Text("ISO Latin 1") - .tag(AppPreferences.TextEncodingFormats.isoLatin1) + .tag(AppPreferences.TextDecodingFormats.isoLatin1) Text("ISO Latin 2") - .tag(AppPreferences.TextEncodingFormats.isoLatin2) + .tag(AppPreferences.TextDecodingFormats.isoLatin2) Text("macOS Roman") - .tag(AppPreferences.TextEncodingFormats.macOSRoman) + .tag(AppPreferences.TextDecodingFormats.macOSRoman) } Group { Divider() Text("Nextstep") - .tag(AppPreferences.TextEncodingFormats.nextstep) + .tag(AppPreferences.TextDecodingFormats.nextstep) Text("Shift JIS") - .tag(AppPreferences.TextEncodingFormats.shiftJIS) + .tag(AppPreferences.TextDecodingFormats.shiftJIS) Text("Symbol") - .tag(AppPreferences.TextEncodingFormats.symbol) + .tag(AppPreferences.TextDecodingFormats.symbol) Divider() } Group { Text("Unicode") - .tag(AppPreferences.TextEncodingFormats.unicode) + .tag(AppPreferences.TextDecodingFormats.unicode) Text("Unicode (UTF-8)") - .tag(AppPreferences.TextEncodingFormats.utf8) + .tag(AppPreferences.TextDecodingFormats.utf8) Divider() Text("Unicode (UTF-16)") - .tag(AppPreferences.TextEncodingFormats.utf16) + .tag(AppPreferences.TextDecodingFormats.utf16) Text("Unicode (UTF-16) Big Endian") - .tag(AppPreferences.TextEncodingFormats.utf16be) + .tag(AppPreferences.TextDecodingFormats.utf16be) Text("Unicode (UTF-16) Little Endian") - .tag(AppPreferences.TextEncodingFormats.utf16le) + .tag(AppPreferences.TextDecodingFormats.utf16le) Divider() Text("Unicode (UTF-32)") - .tag(AppPreferences.TextEncodingFormats.utf32) + .tag(AppPreferences.TextDecodingFormats.utf32) Text("Unicode (UTF-32) Big Endian") - .tag(AppPreferences.TextEncodingFormats.utf32be) + .tag(AppPreferences.TextDecodingFormats.utf32be) Text("Unicode (UTF-32) Little Endian") - .tag(AppPreferences.TextEncodingFormats.utf32le) + .tag(AppPreferences.TextDecodingFormats.utf32le) } } } From 429cfcc496be8fe03be4b3cff0d3a67010c30ed4 Mon Sep 17 00:00:00 2001 From: luah5 <128280019+luah5@users.noreply.github.com> Date: Sat, 25 Mar 2023 06:40:50 +0000 Subject: [PATCH 05/25] Update CodeFile.swift --- CodeEdit/Features/CodeFile/CodeFile.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CodeEdit/Features/CodeFile/CodeFile.swift b/CodeEdit/Features/CodeFile/CodeFile.swift index a43f70fe3d..7452f61a3b 100644 --- a/CodeEdit/Features/CodeFile/CodeFile.swift +++ b/CodeEdit/Features/CodeFile/CodeFile.swift @@ -100,7 +100,7 @@ final class CodeFileDocument: NSDocument, ObservableObject, QLPreviewItem { override func read(from data: Data, ofType _: String) throws { var encoding: String.Encoding - switch prefs.preferences.textEditing.textEncoding { + switch prefs.preferences.textEditing.textDecoding { case .ascii: encoding = String.Encoding.ascii case .iso2022JP: From 439fb1b71695e0abd7cde986021c71f5e2e9813b Mon Sep 17 00:00:00 2001 From: luah5 <128280019+luah5@users.noreply.github.com> Date: Sat, 25 Mar 2023 06:41:41 +0000 Subject: [PATCH 06/25] Update TextEditingPreferences.swift --- .../Model/Text Editing/TextEditingPreferences.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CodeEdit/Features/AppPreferences/Model/Text Editing/TextEditingPreferences.swift b/CodeEdit/Features/AppPreferences/Model/Text Editing/TextEditingPreferences.swift index 8a0453a45e..1ff1e5460e 100644 --- a/CodeEdit/Features/AppPreferences/Model/Text Editing/TextEditingPreferences.swift +++ b/CodeEdit/Features/AppPreferences/Model/Text Editing/TextEditingPreferences.swift @@ -28,7 +28,7 @@ extension AppPreferences { var wrapLinesToEditorWidth: Bool = true /// The encoding that a file is read - var textEncoding: TextDecodingFormats = .utf8 + var textDecoding: TextDecodingFormats = .utf8 /// A multiplier for setting the line height. Defaults to `1.45` var lineHeightMultiple: Double = 1.45 From 1dda0c6b5bbe0fadb12e6ffdbe8dadf7e3a8e2ab Mon Sep 17 00:00:00 2001 From: luah5 <128280019+luah5@users.noreply.github.com> Date: Sat, 25 Mar 2023 06:42:16 +0000 Subject: [PATCH 07/25] Update TextEditingPreferencesView.swift --- .../TextEditingPreferences/TextEditingPreferencesView.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CodeEdit/Features/AppPreferences/Sections/TextEditingPreferences/TextEditingPreferencesView.swift b/CodeEdit/Features/AppPreferences/Sections/TextEditingPreferences/TextEditingPreferencesView.swift index eb4e42295f..8534a82015 100644 --- a/CodeEdit/Features/AppPreferences/Sections/TextEditingPreferences/TextEditingPreferencesView.swift +++ b/CodeEdit/Features/AppPreferences/Sections/TextEditingPreferences/TextEditingPreferencesView.swift @@ -76,7 +76,7 @@ struct TextEditingPreferencesView: View { wrapLinesToEditorWidth } PreferencesSection("Default Text Decoding") { - textEncoding + textDecoding } } } From 28b54d6148c118a120cad29a1d58c1a28e2adef3 Mon Sep 17 00:00:00 2001 From: luah5 <128280019+luah5@users.noreply.github.com> Date: Sat, 25 Mar 2023 06:43:25 +0000 Subject: [PATCH 08/25] Update TextEditingPreferencesView.swift --- .../TextEditingPreferences/TextEditingPreferencesView.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CodeEdit/Features/AppPreferences/Sections/TextEditingPreferences/TextEditingPreferencesView.swift b/CodeEdit/Features/AppPreferences/Sections/TextEditingPreferences/TextEditingPreferencesView.swift index 8534a82015..3d990f1107 100644 --- a/CodeEdit/Features/AppPreferences/Sections/TextEditingPreferences/TextEditingPreferencesView.swift +++ b/CodeEdit/Features/AppPreferences/Sections/TextEditingPreferences/TextEditingPreferencesView.swift @@ -146,7 +146,7 @@ struct TextEditingPreferencesView: View { Text("ISO 2022 Japan") .tag(AppPreferences.TextDecodingFormats.iso2022JP) Text("Japanese EUC") - .tag(AppPreferences.TextEncodingFormats.japaneseEUC) + .tag(AppPreferences.TextDecodingFormats.japaneseEUC) Divider() From 897a3f558ac7e0e64e220c1cb337f8488c44863a Mon Sep 17 00:00:00 2001 From: luah5 <128280019+luah5@users.noreply.github.com> Date: Sat, 25 Mar 2023 09:09:46 +0000 Subject: [PATCH 09/25] Fix comment --- .../Model/Text Editing/TextEditingPreferences.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CodeEdit/Features/AppPreferences/Model/Text Editing/TextEditingPreferences.swift b/CodeEdit/Features/AppPreferences/Model/Text Editing/TextEditingPreferences.swift index 1ff1e5460e..886774c25e 100644 --- a/CodeEdit/Features/AppPreferences/Model/Text Editing/TextEditingPreferences.swift +++ b/CodeEdit/Features/AppPreferences/Model/Text Editing/TextEditingPreferences.swift @@ -27,7 +27,7 @@ extension AppPreferences { /// A flag indicating whether to wrap lines to editor width var wrapLinesToEditorWidth: Bool = true - /// The encoding that a file is read + /// The decoding that a file is read with var textDecoding: TextDecodingFormats = .utf8 /// A multiplier for setting the line height. Defaults to `1.45` From cee727b740505870926b6f55b35267030b27f70b Mon Sep 17 00:00:00 2001 From: luah5 <128280019+luah5@users.noreply.github.com> Date: Sat, 25 Mar 2023 14:34:00 +0000 Subject: [PATCH 10/25] Resolve most of @lukepistrol's review comments --- .../Text Editing/TextEditingPreferences.swift | 32 ++----------- .../TextEditingPreferencesView.swift | 44 +++++++++--------- CodeEdit/Features/CodeFile/CodeFile.swift | 46 +------------------ 3 files changed, 29 insertions(+), 93 deletions(-) diff --git a/CodeEdit/Features/AppPreferences/Model/Text Editing/TextEditingPreferences.swift b/CodeEdit/Features/AppPreferences/Model/Text Editing/TextEditingPreferences.swift index 886774c25e..4d45af26d8 100644 --- a/CodeEdit/Features/AppPreferences/Model/Text Editing/TextEditingPreferences.swift +++ b/CodeEdit/Features/AppPreferences/Model/Text Editing/TextEditingPreferences.swift @@ -28,7 +28,7 @@ extension AppPreferences { var wrapLinesToEditorWidth: Bool = true /// The decoding that a file is read with - var textDecoding: TextDecodingFormats = .utf8 + var defaultTextEncoding: String.Encoding = .utf8 /// A multiplier for setting the line height. Defaults to `1.45` var lineHeightMultiple: Double = 1.45 @@ -61,10 +61,10 @@ extension AppPreferences { Bool.self, forKey: .wrapLinesToEditorWidth ) ?? true - self.textDecoding = try container.decodeIfPresent( - TextDecodingFormats.self, - forKey: .textDecoding - ) ?? AppPreferences.TextDecodingFormats.utf8 + self.defaultTextEncoding = try container.decodeIfPresent( + String.Encoding.self, + forKey: .defaultTextEncoding + ) ?? String.Encoding.utf8 self.lineHeightMultiple = try container.decodeIfPresent( Double.self, forKey: .lineHeightMultiple @@ -105,28 +105,6 @@ extension AppPreferences { ) } } - - enum TextDecodingFormats: String, Codable { - case ascii - case iso2022JP - case isoLatin1 - case isoLatin2 - case japaneseEUC - case macOSRoman - case nextstep - case nonLossyASCII - case shiftJIS - case symbol - case unicode - case utf8 - case utf16 - case utf16be - case utf16le - case utf32 - case utf32be - case utf32le - } - struct EditorFont: Codable, Equatable { /// Indicates whether or not to use a custom font var customFont: Bool = false diff --git a/CodeEdit/Features/AppPreferences/Sections/TextEditingPreferences/TextEditingPreferencesView.swift b/CodeEdit/Features/AppPreferences/Sections/TextEditingPreferences/TextEditingPreferencesView.swift index 3d990f1107..bdd1d95095 100644 --- a/CodeEdit/Features/AppPreferences/Sections/TextEditingPreferences/TextEditingPreferencesView.swift +++ b/CodeEdit/Features/AppPreferences/Sections/TextEditingPreferences/TextEditingPreferencesView.swift @@ -75,8 +75,8 @@ struct TextEditingPreferencesView: View { PreferencesSection("Line Wrapping") { wrapLinesToEditorWidth } - PreferencesSection("Default Text Decoding") { - textDecoding + PreferencesSection("Default Text Encoding") { + textEncoding } } } @@ -133,68 +133,68 @@ struct TextEditingPreferencesView: View { } } - private var textDecoding: some View { - Picker("Text decoding", selection: $prefs.preferences.textEditing.textDecoding) { + private var textEncoding: some View { + Picker("Default Text Decoding", selection: $prefs.preferences.textEditing.textEncoding) { Group { Text("ASCII") - .tag(AppPreferences.TextDecodingFormats.ascii) + .tag(String.Encoding.ascii) Text("Non Lossy ASCII") - .tag(AppPreferences.TextDecodingFormats.nonLossyASCII) + .tag(String.Encoding.nonLossyASCII) Divider() Text("ISO 2022 Japan") - .tag(AppPreferences.TextDecodingFormats.iso2022JP) + .tag(String.Encoding.iso2022JP) Text("Japanese EUC") - .tag(AppPreferences.TextDecodingFormats.japaneseEUC) + .tag(String.Encoding.japaneseEUC) Divider() Text("ISO Latin 1") - .tag(AppPreferences.TextDecodingFormats.isoLatin1) + .tag(String.Encoding.isoLatin1) Text("ISO Latin 2") - .tag(AppPreferences.TextDecodingFormats.isoLatin2) + .tag(String.Encoding.isoLatin2) Text("macOS Roman") - .tag(AppPreferences.TextDecodingFormats.macOSRoman) + .tag(String.Encoding.macOSRoman) } Group { Divider() Text("Nextstep") - .tag(AppPreferences.TextDecodingFormats.nextstep) + .tag(String.Encoding.nextstep) Text("Shift JIS") - .tag(AppPreferences.TextDecodingFormats.shiftJIS) + .tag(String.Encoding.shiftJIS) Text("Symbol") - .tag(AppPreferences.TextDecodingFormats.symbol) + .tag(String.Encoding.symbol) Divider() } Group { Text("Unicode") - .tag(AppPreferences.TextDecodingFormats.unicode) + .tag(String.Encoding.unicode) Text("Unicode (UTF-8)") - .tag(AppPreferences.TextDecodingFormats.utf8) + .tag(String.Encoding.utf8) Divider() Text("Unicode (UTF-16)") - .tag(AppPreferences.TextDecodingFormats.utf16) + .tag(String.Encoding.utf16) Text("Unicode (UTF-16) Big Endian") - .tag(AppPreferences.TextDecodingFormats.utf16be) + .tag(String.Encoding.utf16be) Text("Unicode (UTF-16) Little Endian") - .tag(AppPreferences.TextDecodingFormats.utf16le) + .tag(String.Encoding.utf16le) Divider() Text("Unicode (UTF-32)") - .tag(AppPreferences.TextDecodingFormats.utf32) + .tag(String.Encoding.utf32) Text("Unicode (UTF-32) Big Endian") - .tag(AppPreferences.TextDecodingFormats.utf32be) + .tag(String.Encoding.utf32be) Text("Unicode (UTF-32) Little Endian") - .tag(AppPreferences.TextDecodingFormats.utf32le) + .tag(String.Encoding.utf32le) } } } diff --git a/CodeEdit/Features/CodeFile/CodeFile.swift b/CodeEdit/Features/CodeFile/CodeFile.swift index 7452f61a3b..52c18194cf 100644 --- a/CodeEdit/Features/CodeFile/CodeFile.swift +++ b/CodeEdit/Features/CodeFile/CodeFile.swift @@ -94,52 +94,10 @@ final class CodeFileDocument: NSDocument, ObservableObject, QLPreviewItem { return data } - // swiftlint:disable cyclomatic_complexity /// This function is used for decoding files. - /// It should not throw error as unsupported files can still be opened by QLPreviewView + /// It should not throw error as unsupported files can still be opened by QLPreviewView. override func read(from data: Data, ofType _: String) throws { - var encoding: String.Encoding - - switch prefs.preferences.textEditing.textDecoding { - case .ascii: - encoding = String.Encoding.ascii - case .iso2022JP: - encoding = String.Encoding.iso2022JP - case .isoLatin1: - encoding = String.Encoding.isoLatin1 - case .isoLatin2: - encoding = String.Encoding.isoLatin2 - case .japaneseEUC: - encoding = String.Encoding.japaneseEUC - case .macOSRoman: - encoding = String.Encoding.macOSRoman - case .nextstep: - encoding = String.Encoding.nextstep - case .nonLossyASCII: - encoding = String.Encoding.nonLossyASCII - case .shiftJIS: - encoding = String.Encoding.shiftJIS - case .symbol: - encoding = String.Encoding.symbol - case .unicode: - encoding = String.Encoding.unicode - case .utf8: - encoding = String.Encoding.utf8 - case .utf16: - encoding = String.Encoding.utf16 - case .utf16be: - encoding = String.Encoding.utf16BigEndian - case .utf16le: - encoding = String.Encoding.utf16LittleEndian - case .utf32: - encoding = String.Encoding.utf32 - case .utf32be: - encoding = String.Encoding.utf32BigEndian - case .utf32le: - encoding = String.Encoding.utf32LittleEndian - } - - guard let content = String(data: data, encoding: encoding) else { return } + guard let content = String(data: data, encoding: prefs.preferences.textEditing.defaultTextEncoding) else { return } self.content = content } } From b2380f67891dcdf03a790c7abe6cf0127771ccd3 Mon Sep 17 00:00:00 2001 From: luah5 <128280019+luah5@users.noreply.github.com> Date: Sat, 25 Mar 2023 15:27:06 +0000 Subject: [PATCH 11/25] Renaming --- .../TextEditingPreferences/TextEditingPreferencesView.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CodeEdit/Features/AppPreferences/Sections/TextEditingPreferences/TextEditingPreferencesView.swift b/CodeEdit/Features/AppPreferences/Sections/TextEditingPreferences/TextEditingPreferencesView.swift index bdd1d95095..fb3078372e 100644 --- a/CodeEdit/Features/AppPreferences/Sections/TextEditingPreferences/TextEditingPreferencesView.swift +++ b/CodeEdit/Features/AppPreferences/Sections/TextEditingPreferences/TextEditingPreferencesView.swift @@ -134,7 +134,7 @@ struct TextEditingPreferencesView: View { } private var textEncoding: some View { - Picker("Default Text Decoding", selection: $prefs.preferences.textEditing.textEncoding) { + Picker("Default Text Encoding", selection: $prefs.preferences.textEditing.textEncoding) { Group { Text("ASCII") .tag(String.Encoding.ascii) From 4f04fe90fafd9eefbd263a9aeb22feab0a820e7b Mon Sep 17 00:00:00 2001 From: luah5 Date: Sat, 25 Mar 2023 16:44:02 +0000 Subject: [PATCH 12/25] respond to @lukepistrol's comments --- .../Text Editing/TextEditingPreferences.swift | 31 +++++++- .../TextEditingPreferencesView.swift | 71 +++++++------------ CodeEdit/Features/CodeFile/CodeFile.swift | 5 +- 3 files changed, 58 insertions(+), 49 deletions(-) diff --git a/CodeEdit/Features/AppPreferences/Model/Text Editing/TextEditingPreferences.swift b/CodeEdit/Features/AppPreferences/Model/Text Editing/TextEditingPreferences.swift index 4d45af26d8..eea2dcc45d 100644 --- a/CodeEdit/Features/AppPreferences/Model/Text Editing/TextEditingPreferences.swift +++ b/CodeEdit/Features/AppPreferences/Model/Text Editing/TextEditingPreferences.swift @@ -8,6 +8,31 @@ import AppKit import Foundation +extension String.Encoding: Codable { + static var allAscii: [String.Encoding] = [String.Encoding.ascii, String.Encoding.nonLossyASCII] + static var allJapanese: [String.Encoding] = [String.Encoding.iso2022JP, String.Encoding.japaneseEUC] + static var allLatin: [String.Encoding] = [String.Encoding.isoLatin1, + String.Encoding.isoLatin2, + String.Encoding.macOSRoman + ] + static var allUnicodes: [String.Encoding] = [String.Encoding.unicode, + String.Encoding.utf8, + String.Encoding.utf16, + String.Encoding.utf16BigEndian, + String.Encoding.utf16LittleEndian, + String.Encoding.utf32, + String.Encoding.utf32BigEndian, + String.Encoding.utf32LittleEndian + ] + static var allWindows: [String.Encoding] = [String.Encoding.windowsCP1250, + String.Encoding.windowsCP1251, + String.Encoding.windowsCP1252, + String.Encoding.windowsCP1253, + String.Encoding.windowsCP1254 + ] + static var others: [String.Encoding] = [String.Encoding.nextstep, String.Encoding.shiftJIS, String.Encoding.symbol] +} + extension AppPreferences { /// The global settings for text editing @@ -27,7 +52,7 @@ extension AppPreferences { /// A flag indicating whether to wrap lines to editor width var wrapLinesToEditorWidth: Bool = true - /// The decoding that a file is read with + /// The encoding that a file is read with var defaultTextEncoding: String.Encoding = .utf8 /// A multiplier for setting the line height. Defaults to `1.45` @@ -61,10 +86,10 @@ extension AppPreferences { Bool.self, forKey: .wrapLinesToEditorWidth ) ?? true - self.defaultTextEncoding = try container.decodeIfPresent( + try container.decodeIfPresent( String.Encoding.self, forKey: .defaultTextEncoding - ) ?? String.Encoding.utf8 + ) ?? .utf8 self.lineHeightMultiple = try container.decodeIfPresent( Double.self, forKey: .lineHeightMultiple diff --git a/CodeEdit/Features/AppPreferences/Sections/TextEditingPreferences/TextEditingPreferencesView.swift b/CodeEdit/Features/AppPreferences/Sections/TextEditingPreferences/TextEditingPreferencesView.swift index fb3078372e..8a8b497af9 100644 --- a/CodeEdit/Features/AppPreferences/Sections/TextEditingPreferences/TextEditingPreferencesView.swift +++ b/CodeEdit/Features/AppPreferences/Sections/TextEditingPreferences/TextEditingPreferencesView.swift @@ -136,65 +136,46 @@ struct TextEditingPreferencesView: View { private var textEncoding: some View { Picker("Default Text Encoding", selection: $prefs.preferences.textEditing.textEncoding) { Group { - Text("ASCII") - .tag(String.Encoding.ascii) - Text("Non Lossy ASCII") - .tag(String.Encoding.nonLossyASCII) - - Divider() - - Text("ISO 2022 Japan") - .tag(String.Encoding.iso2022JP) - Text("Japanese EUC") - .tag(String.Encoding.japaneseEUC) + ForEach(String.Encoding.allAscii, id: \.id) { ascii in + Text(ascii.description) + .tag(ascii) + } Divider() - Text("ISO Latin 1") - .tag(String.Encoding.isoLatin1) - Text("ISO Latin 2") - .tag(String.Encoding.isoLatin2) - Text("macOS Roman") - .tag(String.Encoding.macOSRoman) - } + ForEach(String.Encoding.allJapanese, id: \.id) { japanese in + Text(japanese.description) + .tag(japanese) + } - Group { Divider() - Text("Nextstep") - .tag(String.Encoding.nextstep) - Text("Shift JIS") - .tag(String.Encoding.shiftJIS) - Text("Symbol") - .tag(String.Encoding.symbol) + ForEach(String.Encoding.allLatin, id: \.id) { latin in + Text(latin.description) + .tag(latin) + } Divider() - } - Group { - Text("Unicode") - .tag(String.Encoding.unicode) - - Text("Unicode (UTF-8)") - .tag(String.Encoding.utf8) + ForEach(String.Encoding.others, id: \.id) { other in + Text(other.description) + .tag(other) + } Divider() - Text("Unicode (UTF-16)") - .tag(String.Encoding.utf16) - Text("Unicode (UTF-16) Big Endian") - .tag(String.Encoding.utf16be) - Text("Unicode (UTF-16) Little Endian") - .tag(String.Encoding.utf16le) + ForEach(String.Encoding.allUnicodes, id: \.id) { unicode in + Text(unicode.description) + .tag(unicode) + } Divider() - - Text("Unicode (UTF-32)") - .tag(String.Encoding.utf32) - Text("Unicode (UTF-32) Big Endian") - .tag(String.Encoding.utf32be) - Text("Unicode (UTF-32) Little Endian") - .tag(String.Encoding.utf32le) + } + Group { + ForEach(String.Encoding.allWindows, id: \.id) { windows in + Text(windows.description) + .tag(windows) + } } } } diff --git a/CodeEdit/Features/CodeFile/CodeFile.swift b/CodeEdit/Features/CodeFile/CodeFile.swift index 52c18194cf..9498c320f4 100644 --- a/CodeEdit/Features/CodeFile/CodeFile.swift +++ b/CodeEdit/Features/CodeFile/CodeFile.swift @@ -97,7 +97,10 @@ final class CodeFileDocument: NSDocument, ObservableObject, QLPreviewItem { /// This function is used for decoding files. /// It should not throw error as unsupported files can still be opened by QLPreviewView. override func read(from data: Data, ofType _: String) throws { - guard let content = String(data: data, encoding: prefs.preferences.textEditing.defaultTextEncoding) else { return } + guard let content = String( + data: data, + encoding: prefs.preferences.textEditing.defaultTextEncoding + ) else { return } self.content = content } } From 25d020816ed334cd48eee7a9fd86fd262eca79b2 Mon Sep 17 00:00:00 2001 From: luah5 Date: Sat, 25 Mar 2023 16:48:34 +0000 Subject: [PATCH 13/25] fixes --- .../TextEditingPreferencesView.swift | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/CodeEdit/Features/AppPreferences/Sections/TextEditingPreferences/TextEditingPreferencesView.swift b/CodeEdit/Features/AppPreferences/Sections/TextEditingPreferences/TextEditingPreferencesView.swift index 8a8b497af9..07fec15dac 100644 --- a/CodeEdit/Features/AppPreferences/Sections/TextEditingPreferences/TextEditingPreferencesView.swift +++ b/CodeEdit/Features/AppPreferences/Sections/TextEditingPreferences/TextEditingPreferencesView.swift @@ -136,6 +136,13 @@ struct TextEditingPreferencesView: View { private var textEncoding: some View { Picker("Default Text Encoding", selection: $prefs.preferences.textEditing.textEncoding) { Group { + ForEach(String.Encoding.allUnicodes, id: \.id) { unicode in + Text(unicode.description) + .tag(unicode) + } + + Divider() + ForEach(String.Encoding.allAscii, id: \.id) { ascii in Text(ascii.description) .tag(ascii) @@ -163,14 +170,8 @@ struct TextEditingPreferencesView: View { } Divider() - - ForEach(String.Encoding.allUnicodes, id: \.id) { unicode in - Text(unicode.description) - .tag(unicode) - } - - Divider() } + Group { ForEach(String.Encoding.allWindows, id: \.id) { windows in Text(windows.description) From 948d46cab2d2d6b849832135e5a5bc2ef2dcbad6 Mon Sep 17 00:00:00 2001 From: luah5 <128280019+luah5@users.noreply.github.com> Date: Sat, 25 Mar 2023 17:30:48 +0000 Subject: [PATCH 14/25] Update CodeEdit/Features/AppPreferences/Model/Text Editing/TextEditingPreferences.swift Co-authored-by: Lukas Pistrol --- .../Model/Text Editing/TextEditingPreferences.swift | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/CodeEdit/Features/AppPreferences/Model/Text Editing/TextEditingPreferences.swift b/CodeEdit/Features/AppPreferences/Model/Text Editing/TextEditingPreferences.swift index eea2dcc45d..634c400e25 100644 --- a/CodeEdit/Features/AppPreferences/Model/Text Editing/TextEditingPreferences.swift +++ b/CodeEdit/Features/AppPreferences/Model/Text Editing/TextEditingPreferences.swift @@ -9,7 +9,10 @@ import AppKit import Foundation extension String.Encoding: Codable { - static var allAscii: [String.Encoding] = [String.Encoding.ascii, String.Encoding.nonLossyASCII] + static var allAscii: [String.Encoding] = [ + .ascii, + .nonLossyASCII + ] static var allJapanese: [String.Encoding] = [String.Encoding.iso2022JP, String.Encoding.japaneseEUC] static var allLatin: [String.Encoding] = [String.Encoding.isoLatin1, String.Encoding.isoLatin2, From bdb36c68b40005ec6a79c7196c1db9da0048f861 Mon Sep 17 00:00:00 2001 From: luah5 <128280019+luah5@users.noreply.github.com> Date: Sat, 25 Mar 2023 17:30:59 +0000 Subject: [PATCH 15/25] Update CodeEdit/Features/AppPreferences/Model/Text Editing/TextEditingPreferences.swift Co-authored-by: Lukas Pistrol --- .../Model/Text Editing/TextEditingPreferences.swift | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/CodeEdit/Features/AppPreferences/Model/Text Editing/TextEditingPreferences.swift b/CodeEdit/Features/AppPreferences/Model/Text Editing/TextEditingPreferences.swift index 634c400e25..2e76fec1ea 100644 --- a/CodeEdit/Features/AppPreferences/Model/Text Editing/TextEditingPreferences.swift +++ b/CodeEdit/Features/AppPreferences/Model/Text Editing/TextEditingPreferences.swift @@ -14,10 +14,11 @@ extension String.Encoding: Codable { .nonLossyASCII ] static var allJapanese: [String.Encoding] = [String.Encoding.iso2022JP, String.Encoding.japaneseEUC] - static var allLatin: [String.Encoding] = [String.Encoding.isoLatin1, - String.Encoding.isoLatin2, - String.Encoding.macOSRoman - ] + static var allLatin: [String.Encoding] = [ + .isoLatin1, + .isoLatin2, + .macOSRoman + ] static var allUnicodes: [String.Encoding] = [String.Encoding.unicode, String.Encoding.utf8, String.Encoding.utf16, From 8235cf9fcb9be70e7343004a8606ee2111fe7d2a Mon Sep 17 00:00:00 2001 From: luah5 <128280019+luah5@users.noreply.github.com> Date: Sat, 25 Mar 2023 17:31:12 +0000 Subject: [PATCH 16/25] Update CodeEdit/Features/AppPreferences/Model/Text Editing/TextEditingPreferences.swift Co-authored-by: Lukas Pistrol --- .../Model/Text Editing/TextEditingPreferences.swift | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/CodeEdit/Features/AppPreferences/Model/Text Editing/TextEditingPreferences.swift b/CodeEdit/Features/AppPreferences/Model/Text Editing/TextEditingPreferences.swift index 2e76fec1ea..3b43f1e205 100644 --- a/CodeEdit/Features/AppPreferences/Model/Text Editing/TextEditingPreferences.swift +++ b/CodeEdit/Features/AppPreferences/Model/Text Editing/TextEditingPreferences.swift @@ -13,7 +13,10 @@ extension String.Encoding: Codable { .ascii, .nonLossyASCII ] - static var allJapanese: [String.Encoding] = [String.Encoding.iso2022JP, String.Encoding.japaneseEUC] + static var allJapanese: [String.Encoding] = [ + .iso2022JP, + .japaneseEUC + ] static var allLatin: [String.Encoding] = [ .isoLatin1, .isoLatin2, From a8a70c7e9e1595a3e11eaa44eb877b8c035be365 Mon Sep 17 00:00:00 2001 From: luah5 <128280019+luah5@users.noreply.github.com> Date: Sat, 25 Mar 2023 17:31:20 +0000 Subject: [PATCH 17/25] Update CodeEdit/Features/AppPreferences/Model/Text Editing/TextEditingPreferences.swift Co-authored-by: Lukas Pistrol --- .../Model/Text Editing/TextEditingPreferences.swift | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/CodeEdit/Features/AppPreferences/Model/Text Editing/TextEditingPreferences.swift b/CodeEdit/Features/AppPreferences/Model/Text Editing/TextEditingPreferences.swift index 3b43f1e205..a145a1684b 100644 --- a/CodeEdit/Features/AppPreferences/Model/Text Editing/TextEditingPreferences.swift +++ b/CodeEdit/Features/AppPreferences/Model/Text Editing/TextEditingPreferences.swift @@ -37,7 +37,11 @@ extension String.Encoding: Codable { String.Encoding.windowsCP1253, String.Encoding.windowsCP1254 ] - static var others: [String.Encoding] = [String.Encoding.nextstep, String.Encoding.shiftJIS, String.Encoding.symbol] + static var others: [String.Encoding] = [ + .nextstep, + .shiftJIS, + .symbol + ] } extension AppPreferences { From a39a9025a3b04e411a96f43feb25609795377c61 Mon Sep 17 00:00:00 2001 From: luah5 <128280019+luah5@users.noreply.github.com> Date: Sat, 25 Mar 2023 17:31:45 +0000 Subject: [PATCH 18/25] Update CodeEdit/Features/AppPreferences/Model/Text Editing/TextEditingPreferences.swift Co-authored-by: Lukas Pistrol --- .../Model/Text Editing/TextEditingPreferences.swift | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/CodeEdit/Features/AppPreferences/Model/Text Editing/TextEditingPreferences.swift b/CodeEdit/Features/AppPreferences/Model/Text Editing/TextEditingPreferences.swift index a145a1684b..b0fc0f6a4e 100644 --- a/CodeEdit/Features/AppPreferences/Model/Text Editing/TextEditingPreferences.swift +++ b/CodeEdit/Features/AppPreferences/Model/Text Editing/TextEditingPreferences.swift @@ -31,12 +31,13 @@ extension String.Encoding: Codable { String.Encoding.utf32BigEndian, String.Encoding.utf32LittleEndian ] - static var allWindows: [String.Encoding] = [String.Encoding.windowsCP1250, - String.Encoding.windowsCP1251, - String.Encoding.windowsCP1252, - String.Encoding.windowsCP1253, - String.Encoding.windowsCP1254 - ] + static var allWindows: [String.Encoding] = [ + .windowsCP1250, + .windowsCP1251, + .windowsCP1252, + .windowsCP1253, + .windowsCP1254 + ] static var others: [String.Encoding] = [ .nextstep, .shiftJIS, From 48f8e970f8634d2acb837cd5ae223b67a0d91dba Mon Sep 17 00:00:00 2001 From: luah5 <128280019+luah5@users.noreply.github.com> Date: Sat, 25 Mar 2023 17:32:08 +0000 Subject: [PATCH 19/25] Update CodeEdit/Features/AppPreferences/Model/Text Editing/TextEditingPreferences.swift Co-authored-by: Lukas Pistrol --- .../Text Editing/TextEditingPreferences.swift | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/CodeEdit/Features/AppPreferences/Model/Text Editing/TextEditingPreferences.swift b/CodeEdit/Features/AppPreferences/Model/Text Editing/TextEditingPreferences.swift index b0fc0f6a4e..1b4c56f5ff 100644 --- a/CodeEdit/Features/AppPreferences/Model/Text Editing/TextEditingPreferences.swift +++ b/CodeEdit/Features/AppPreferences/Model/Text Editing/TextEditingPreferences.swift @@ -22,15 +22,16 @@ extension String.Encoding: Codable { .isoLatin2, .macOSRoman ] - static var allUnicodes: [String.Encoding] = [String.Encoding.unicode, - String.Encoding.utf8, - String.Encoding.utf16, - String.Encoding.utf16BigEndian, - String.Encoding.utf16LittleEndian, - String.Encoding.utf32, - String.Encoding.utf32BigEndian, - String.Encoding.utf32LittleEndian - ] + static var allUnicodes: [String.Encoding] = [ + .unicode, + .utf8, + .utf16, + .utf16BigEndian, + .utf16LittleEndian, + .utf32, + .utf32BigEndian, + .utf32LittleEndian + ] static var allWindows: [String.Encoding] = [ .windowsCP1250, .windowsCP1251, From 7494704a6f5ca384a9406ac57cd56b7c5dfca29a Mon Sep 17 00:00:00 2001 From: Lukas Pistrol Date: Sat, 25 Mar 2023 18:58:59 +0100 Subject: [PATCH 20/25] fixing remaining issues --- CodeEdit.xcodeproj/project.pbxproj | 4 + .../Text Editing/TextEditingPreferences.swift | 40 +--------- .../TextEditingPreferencesView.swift | 48 ++---------- .../Extensions/String/String+Encoding.swift | 73 +++++++++++++++++++ 4 files changed, 85 insertions(+), 80 deletions(-) create mode 100644 CodeEdit/Utils/Extensions/String/String+Encoding.swift diff --git a/CodeEdit.xcodeproj/project.pbxproj b/CodeEdit.xcodeproj/project.pbxproj index 393bec64b0..5eb009a3bb 100644 --- a/CodeEdit.xcodeproj/project.pbxproj +++ b/CodeEdit.xcodeproj/project.pbxproj @@ -45,6 +45,7 @@ 283BDCBD2972EEBD002AFF81 /* Package.resolved in Resources */ = {isa = PBXBuildFile; fileRef = 283BDCBC2972EEBD002AFF81 /* Package.resolved */; }; 283BDCC52972F236002AFF81 /* AcknowledgementsTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 283BDCC42972F236002AFF81 /* AcknowledgementsTests.swift */; }; 2847019E27FDDF7600F87B6B /* OutlineView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2847019D27FDDF7600F87B6B /* OutlineView.swift */; }; + 284D384E29CF6CC500E37E86 /* String+Encoding.swift in Sources */ = {isa = PBXBuildFile; fileRef = 284D384D29CF6CC500E37E86 /* String+Encoding.swift */; }; 284DC84F2978B7B400BF2770 /* ContributorsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 284DC84E2978B7B400BF2770 /* ContributorsView.swift */; }; 284DC8512978BA2600BF2770 /* .all-contributorsrc in Resources */ = {isa = PBXBuildFile; fileRef = 284DC8502978BA2600BF2770 /* .all-contributorsrc */; }; 285FEC7027FE4B9800E57D53 /* OutlineTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 285FEC6F27FE4B9800E57D53 /* OutlineTableViewCell.swift */; }; @@ -448,6 +449,7 @@ 283BDCBC2972EEBD002AFF81 /* Package.resolved */ = {isa = PBXFileReference; lastKnownFileType = text; name = Package.resolved; path = CodeEdit.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved; sourceTree = ""; }; 283BDCC42972F236002AFF81 /* AcknowledgementsTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AcknowledgementsTests.swift; sourceTree = ""; }; 2847019D27FDDF7600F87B6B /* OutlineView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OutlineView.swift; sourceTree = ""; }; + 284D384D29CF6CC500E37E86 /* String+Encoding.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "String+Encoding.swift"; sourceTree = ""; }; 284DC84E2978B7B400BF2770 /* ContributorsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContributorsView.swift; sourceTree = ""; }; 284DC8502978BA2600BF2770 /* .all-contributorsrc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = ".all-contributorsrc"; sourceTree = ""; }; 285FEC6D27FE4B4A00E57D53 /* OutlineViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OutlineViewController.swift; sourceTree = ""; }; @@ -1848,6 +1850,7 @@ isa = PBXGroup; children = ( 58D01C8E293167DC00C5B6B4 /* String+MD5.swift */, + 284D384D29CF6CC500E37E86 /* String+Encoding.swift */, D7E201AD27E8B3C000CB86D0 /* String+Ranges.swift */, 58D01C8D293167DC00C5B6B4 /* String+RemoveOccurrences.swift */, 58D01C8C293167DC00C5B6B4 /* String+SHA256.swift */, @@ -2598,6 +2601,7 @@ 587B9DA029300ABD00AC7927 /* PanelDivider.swift in Sources */, 58822534292C280D00E83CDE /* CursorLocation.swift in Sources */, 201169E52837B40300F92B46 /* SourceControlNavigatorRepositoriesView.swift in Sources */, + 284D384E29CF6CC500E37E86 /* String+Encoding.swift in Sources */, 587B9E6A29301D8F00AC7927 /* GitLabPermissions.swift in Sources */, D7DC4B76298FFBE900D6C83D /* OutlintViewController+OutlineTableViewCellDelegate.swift in Sources */, 587B9E9229301D8F00AC7927 /* BitBucketAccount.swift in Sources */, diff --git a/CodeEdit/Features/AppPreferences/Model/Text Editing/TextEditingPreferences.swift b/CodeEdit/Features/AppPreferences/Model/Text Editing/TextEditingPreferences.swift index 1b4c56f5ff..11d9a22615 100644 --- a/CodeEdit/Features/AppPreferences/Model/Text Editing/TextEditingPreferences.swift +++ b/CodeEdit/Features/AppPreferences/Model/Text Editing/TextEditingPreferences.swift @@ -8,44 +8,6 @@ import AppKit import Foundation -extension String.Encoding: Codable { - static var allAscii: [String.Encoding] = [ - .ascii, - .nonLossyASCII - ] - static var allJapanese: [String.Encoding] = [ - .iso2022JP, - .japaneseEUC - ] - static var allLatin: [String.Encoding] = [ - .isoLatin1, - .isoLatin2, - .macOSRoman - ] - static var allUnicodes: [String.Encoding] = [ - .unicode, - .utf8, - .utf16, - .utf16BigEndian, - .utf16LittleEndian, - .utf32, - .utf32BigEndian, - .utf32LittleEndian - ] - static var allWindows: [String.Encoding] = [ - .windowsCP1250, - .windowsCP1251, - .windowsCP1252, - .windowsCP1253, - .windowsCP1254 - ] - static var others: [String.Encoding] = [ - .nextstep, - .shiftJIS, - .symbol - ] -} - extension AppPreferences { /// The global settings for text editing @@ -99,7 +61,7 @@ extension AppPreferences { Bool.self, forKey: .wrapLinesToEditorWidth ) ?? true - try container.decodeIfPresent( + self.defaultTextEncoding = try container.decodeIfPresent( String.Encoding.self, forKey: .defaultTextEncoding ) ?? .utf8 diff --git a/CodeEdit/Features/AppPreferences/Sections/TextEditingPreferences/TextEditingPreferencesView.swift b/CodeEdit/Features/AppPreferences/Sections/TextEditingPreferences/TextEditingPreferencesView.swift index 07fec15dac..06569ccc5b 100644 --- a/CodeEdit/Features/AppPreferences/Sections/TextEditingPreferences/TextEditingPreferencesView.swift +++ b/CodeEdit/Features/AppPreferences/Sections/TextEditingPreferences/TextEditingPreferencesView.swift @@ -134,48 +134,14 @@ struct TextEditingPreferencesView: View { } private var textEncoding: some View { - Picker("Default Text Encoding", selection: $prefs.preferences.textEditing.textEncoding) { - Group { - ForEach(String.Encoding.allUnicodes, id: \.id) { unicode in - Text(unicode.description) - .tag(unicode) + Picker("Default Text Encoding", selection: $prefs.preferences.textEditing.defaultTextEncoding) { + ForEach(String.Encoding.allGroups, id: \.self) { group in + ForEach(group, id: \.rawValue) { encoding in + Text(encoding.description) + .tag(encoding) } - - Divider() - - ForEach(String.Encoding.allAscii, id: \.id) { ascii in - Text(ascii.description) - .tag(ascii) - } - - Divider() - - ForEach(String.Encoding.allJapanese, id: \.id) { japanese in - Text(japanese.description) - .tag(japanese) - } - - Divider() - - ForEach(String.Encoding.allLatin, id: \.id) { latin in - Text(latin.description) - .tag(latin) - } - - Divider() - - ForEach(String.Encoding.others, id: \.id) { other in - Text(other.description) - .tag(other) - } - - Divider() - } - - Group { - ForEach(String.Encoding.allWindows, id: \.id) { windows in - Text(windows.description) - .tag(windows) + if group != String.Encoding.allGroups.last { + Divider() } } } diff --git a/CodeEdit/Utils/Extensions/String/String+Encoding.swift b/CodeEdit/Utils/Extensions/String/String+Encoding.swift new file mode 100644 index 0000000000..48ac07a271 --- /dev/null +++ b/CodeEdit/Utils/Extensions/String/String+Encoding.swift @@ -0,0 +1,73 @@ +// +// String+Encoding.swift +// CodeEdit +// +// Created by Lukas Pistrol on 25.03.23. +// + +import Foundation + +extension String.Encoding: Codable { + static var allGroups: [[String.Encoding]] { + [ + String.Encoding.allUnicodes, + String.Encoding.allAscii, + String.Encoding.allLatin, + String.Encoding.allJapanese, + String.Encoding.allWindows, + String.Encoding.others + ] + } + + static var allAscii: [String.Encoding] { + [ + .ascii, + .nonLossyASCII + ] + } + + static var allJapanese: [String.Encoding] { + [ + .iso2022JP, + .japaneseEUC + ] + } + + static var allLatin: [String.Encoding] { + [ + .isoLatin1, + .isoLatin2, + .macOSRoman + ] + } + + static var allUnicodes: [String.Encoding] { + [ + .utf8, + .utf16, + .utf16BigEndian, + .utf16LittleEndian, + .utf32, + .utf32BigEndian, + .utf32LittleEndian + ] + } + + static var allWindows: [String.Encoding] { + [ + .windowsCP1250, + .windowsCP1251, + .windowsCP1252, + .windowsCP1253, + .windowsCP1254 + ] + } + + static var others: [String.Encoding] { + [ + .nextstep, + .shiftJIS, + .symbol + ] + } +} From 61730d3ef45fd7c0a87fbec8cb27b696f1b53dad Mon Sep 17 00:00:00 2001 From: Lukas Pistrol Date: Sat, 25 Mar 2023 19:03:09 +0100 Subject: [PATCH 21/25] fix lint error --- CodeEdit/Utils/Extensions/String/String+Encoding.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CodeEdit/Utils/Extensions/String/String+Encoding.swift b/CodeEdit/Utils/Extensions/String/String+Encoding.swift index 48ac07a271..fa0b4a429a 100644 --- a/CodeEdit/Utils/Extensions/String/String+Encoding.swift +++ b/CodeEdit/Utils/Extensions/String/String+Encoding.swift @@ -18,7 +18,7 @@ extension String.Encoding: Codable { String.Encoding.others ] } - + static var allAscii: [String.Encoding] { [ .ascii, From 7b8e04c748125c573fb624da203ab7a3898a87f6 Mon Sep 17 00:00:00 2001 From: Lukas Pistrol Date: Sat, 25 Mar 2023 19:05:48 +0100 Subject: [PATCH 22/25] cleanup String+Encoding extension --- .../Utils/Extensions/String/String+Encoding.swift | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/CodeEdit/Utils/Extensions/String/String+Encoding.swift b/CodeEdit/Utils/Extensions/String/String+Encoding.swift index fa0b4a429a..79b029770d 100644 --- a/CodeEdit/Utils/Extensions/String/String+Encoding.swift +++ b/CodeEdit/Utils/Extensions/String/String+Encoding.swift @@ -10,12 +10,12 @@ import Foundation extension String.Encoding: Codable { static var allGroups: [[String.Encoding]] { [ - String.Encoding.allUnicodes, - String.Encoding.allAscii, - String.Encoding.allLatin, - String.Encoding.allJapanese, - String.Encoding.allWindows, - String.Encoding.others + Self.allUnicodes, + Self.allAscii, + Self.allLatin, + Self.allJapanese, + Self.allWindows, + Self.others ] } From 05ec6eb29d62be038ddcbbdee414cd2fe8f20f63 Mon Sep 17 00:00:00 2001 From: luah5 <128280019+luah5@users.noreply.github.com> Date: Sun, 30 Apr 2023 06:28:28 +0000 Subject: [PATCH 23/25] reimplement UI and fix remaining problems --- CodeEdit/Features/CodeFile/CodeFile.swift | 5 ++--- .../Models/TextEditingSettings.swift | 3 +++ .../TextEditingSettingsView.swift | 12 ++++++++++++ 3 files changed, 17 insertions(+), 3 deletions(-) diff --git a/CodeEdit/Features/CodeFile/CodeFile.swift b/CodeEdit/Features/CodeFile/CodeFile.swift index 97b65a248a..eb1c2c4be1 100644 --- a/CodeEdit/Features/CodeFile/CodeFile.swift +++ b/CodeEdit/Features/CodeFile/CodeFile.swift @@ -23,8 +23,7 @@ final class CodeFileDocument: NSDocument, ObservableObject, QLPreviewItem { @Published var content = "" - @ObservedObject - private var prefs: AppPreferencesModel = .shared + @AppSettings(\.sourceControl.textEditing) var settings /* This is the main type of the document. @@ -101,7 +100,7 @@ final class CodeFileDocument: NSDocument, ObservableObject, QLPreviewItem { override func read(from data: Data, ofType _: String) throws { guard let content = String( data: data, - encoding: prefs.preferences.textEditing.defaultTextEncoding + encoding: settings.defaultTextEncoding ) else { return } self.content = content } diff --git a/CodeEdit/Features/Settings/Pages/TextEditingSettings/Models/TextEditingSettings.swift b/CodeEdit/Features/Settings/Pages/TextEditingSettings/Models/TextEditingSettings.swift index e9bbe63e0b..a80df0d172 100644 --- a/CodeEdit/Features/Settings/Pages/TextEditingSettings/Models/TextEditingSettings.swift +++ b/CodeEdit/Features/Settings/Pages/TextEditingSettings/Models/TextEditingSettings.swift @@ -30,6 +30,9 @@ extension SettingsData { /// A multiplier for setting the line height. Defaults to `1.45` var lineHeightMultiple: Double = 1.45 + /// The default text encoding used, defaults to `.utf8` + var defaultTextEncoding: String.Encoding = .utf8 + /// Default initializer init() { self.populateCommands() diff --git a/CodeEdit/Features/Settings/Pages/TextEditingSettings/TextEditingSettingsView.swift b/CodeEdit/Features/Settings/Pages/TextEditingSettings/TextEditingSettingsView.swift index 4ed39e592d..2e7e2a5b5b 100644 --- a/CodeEdit/Features/Settings/Pages/TextEditingSettings/TextEditingSettingsView.swift +++ b/CodeEdit/Features/Settings/Pages/TextEditingSettings/TextEditingSettingsView.swift @@ -25,6 +25,7 @@ struct TextEditingSettingsView: View { Section { autocompleteBraces enableTypeOverCompletion + textEncoding } } } @@ -90,4 +91,15 @@ private extension TextEditingSettingsView { .foregroundColor(.secondary) } } + + private var textEncoding: some View { + Picker("Default Text Encoding", selection: $textEditing.defaultTextEncoding) { + ForEach(String.Encoding.allGroups, id: \.self) { group in + ForEach(group, id: \.rawValue) { encoding in + Text(encoding.description) + .tag(encoding) + } + } + } + } } From 2723ee9e743a47d5cea1a351f3b7a919e11cf7ba Mon Sep 17 00:00:00 2001 From: luah5 <128280019+luah5@users.noreply.github.com> Date: Sun, 30 Apr 2023 06:30:09 +0000 Subject: [PATCH 24/25] fix tests --- CodeEdit/Features/CodeFile/CodeFile.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CodeEdit/Features/CodeFile/CodeFile.swift b/CodeEdit/Features/CodeFile/CodeFile.swift index eb1c2c4be1..b78278f975 100644 --- a/CodeEdit/Features/CodeFile/CodeFile.swift +++ b/CodeEdit/Features/CodeFile/CodeFile.swift @@ -23,7 +23,7 @@ final class CodeFileDocument: NSDocument, ObservableObject, QLPreviewItem { @Published var content = "" - @AppSettings(\.sourceControl.textEditing) var settings + @AppSettings(\.textEditing) var settings /* This is the main type of the document. From f67407c479eef76f2a1a6a14b3050c7a04f34bda Mon Sep 17 00:00:00 2001 From: luah5 <128280019+luah5@users.noreply.github.com> Date: Mon, 1 May 2023 05:21:24 +0000 Subject: [PATCH 25/25] resolve review comments --- CodeEdit/Features/CodeFile/CodeFile.swift | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CodeEdit/Features/CodeFile/CodeFile.swift b/CodeEdit/Features/CodeFile/CodeFile.swift index b78278f975..552dd09e8e 100644 --- a/CodeEdit/Features/CodeFile/CodeFile.swift +++ b/CodeEdit/Features/CodeFile/CodeFile.swift @@ -23,7 +23,7 @@ final class CodeFileDocument: NSDocument, ObservableObject, QLPreviewItem { @Published var content = "" - @AppSettings(\.textEditing) var settings + @AppSettings(\.textEditing.defaultTextEncoding) var defaultTextEncoding /* This is the main type of the document. @@ -100,7 +100,7 @@ final class CodeFileDocument: NSDocument, ObservableObject, QLPreviewItem { override func read(from data: Data, ofType _: String) throws { guard let content = String( data: data, - encoding: settings.defaultTextEncoding + encoding: defaultTextEncoding ) else { return } self.content = content }