diff --git a/Pique.xcodeproj/project.pbxproj b/Pique.xcodeproj/project.pbxproj index 4f98bfe..cc9dae0 100644 --- a/Pique.xcodeproj/project.pbxproj +++ b/Pique.xcodeproj/project.pbxproj @@ -22,6 +22,9 @@ A400000000000004 /* FormattingTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D300000000000004 /* FormattingTests.swift */; }; A400000000000005 /* HTMLTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D300000000000005 /* HTMLTests.swift */; }; A400000000000006 /* HighlightIntegrationTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D300000000000006 /* HighlightIntegrationTests.swift */; }; + A10000000000000B /* AppearanceSettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = D10000000000000A /* AppearanceSettings.swift */; }; + A20000000000000B /* AppearanceSettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = D10000000000000A /* AppearanceSettings.swift */; }; + A10000000000000C /* SettingsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D10000000000000B /* SettingsView.swift */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -74,6 +77,8 @@ D300000000000004 /* FormattingTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FormattingTests.swift; sourceTree = ""; }; D300000000000005 /* HTMLTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HTMLTests.swift; sourceTree = ""; }; D300000000000006 /* HighlightIntegrationTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HighlightIntegrationTests.swift; sourceTree = ""; }; + D10000000000000A /* AppearanceSettings.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppearanceSettings.swift; sourceTree = ""; }; + D10000000000000B /* SettingsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsView.swift; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -117,6 +122,7 @@ children = ( D100000000000001 /* PiqueApp.swift */, D100000000000002 /* ContentView.swift */, + D10000000000000B /* SettingsView.swift */, D100000000000003 /* Assets.xcassets */, D100000000000004 /* Pique.entitlements */, ); @@ -138,6 +144,7 @@ children = ( D100000000000008 /* SyntaxHighlighter.swift */, D100000000000009 /* FileReader.swift */, + D10000000000000A /* AppearanceSettings.swift */, ); path = Shared; sourceTree = ""; @@ -296,8 +303,10 @@ files = ( A100000000000001 /* PiqueApp.swift in Sources */, A100000000000002 /* ContentView.swift in Sources */, + A10000000000000C /* SettingsView.swift in Sources */, A100000000000005 /* SyntaxHighlighter.swift in Sources */, A100000000000007 /* FileReader.swift in Sources */, + A10000000000000B /* AppearanceSettings.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -308,6 +317,7 @@ A200000000000004 /* PreviewProvider.swift in Sources */, A200000000000006 /* SyntaxHighlighter.swift in Sources */, A200000000000008 /* FileReader.swift in Sources */, + A20000000000000B /* AppearanceSettings.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/PiquePreview/Info.plist b/PiquePreview/Info.plist index 12a260b..41fb62c 100644 --- a/PiquePreview/Info.plist +++ b/PiquePreview/Info.plist @@ -96,6 +96,24 @@ + + UTTypeIdentifier + io.macadmins.pique.ndjson + UTTypeDescription + Newline Delimited JSON + UTTypeConformsTo + + public.plain-text + + UTTypeTagSpecification + + public.filename-extension + + ndjson + jsonl + + + NSExtension @@ -106,6 +124,7 @@ QLSupportedContentTypes public.json + io.macadmins.pique.ndjson public.yaml public.xml io.toml @@ -131,6 +150,8 @@ QLFileExtensions json + ndjson + jsonl yaml yml toml diff --git a/PiquePreview/PreviewProvider.swift b/PiquePreview/PreviewProvider.swift index 31ff4ec..bd6744f 100644 --- a/PiquePreview/PreviewProvider.swift +++ b/PiquePreview/PreviewProvider.swift @@ -92,7 +92,7 @@ class PreviewProvider: NSViewController, QLPreviewingController { /// Maps a file extension to a format group name matching AppearanceSettings keys. private static func formatName(for ext: String) -> String { switch ext.lowercased() { - case "json": return "JSON" + case "json", "ndjson", "jsonl": return "JSON" case "yaml", "yml": return "YAML" case "toml", "lock": return "TOML" case "xml", "recipe": return "XML" diff --git a/PiqueTests/FileFormatTests.swift b/PiqueTests/FileFormatTests.swift index 67d2acf..144746f 100644 --- a/PiqueTests/FileFormatTests.swift +++ b/PiqueTests/FileFormatTests.swift @@ -7,6 +7,8 @@ final class FileFormatTests: XCTestCase { func testJSON() { XCTAssertEqual(FileFormat(pathExtension: "json"), .json) + XCTAssertEqual(FileFormat(pathExtension: "ndjson"), .json) + XCTAssertEqual(FileFormat(pathExtension: "jsonl"), .json) } func testYAML() { diff --git a/Shared/SyntaxHighlighter.swift b/Shared/SyntaxHighlighter.swift index 352f184..84839d9 100644 --- a/Shared/SyntaxHighlighter.swift +++ b/Shared/SyntaxHighlighter.swift @@ -11,7 +11,7 @@ enum FileFormat { init?(pathExtension: String) { switch pathExtension.lowercased() { - case "json": self = .json + case "json", "ndjson", "jsonl": self = .json case "yaml", "yml": self = .yaml case "toml", "lock": self = .toml case "xml", "recipe": self = .xml