├── Shared ├── Assets.xcassets │ ├── Contents.json │ ├── AccentColor.colorset │ │ └── Contents.json │ └── AppIcon.appiconset │ │ └── Contents.json ├── SwiftUIMarkdownEditorApp.swift ├── ContentView.swift └── SwiftUIMarkdownEditorDocument.swift ├── SwiftUIMarkdownEditor.xcodeproj ├── project.xcworkspace │ ├── contents.xcworkspacedata │ └── xcshareddata │ │ └── IDEWorkspaceChecks.plist └── project.pbxproj ├── macOS ├── macOS.entitlements ├── WebView.swift └── Info.plist ├── iOS ├── WebView.swift └── Info.plist ├── Tests iOS ├── Info.plist └── Tests_iOS.swift ├── Tests macOS ├── Info.plist └── Tests_macOS.swift ├── LICENSE └── README.md /Shared/Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /Shared/Assets.xcassets/AccentColor.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "idiom" : "universal" 5 | } 6 | ], 7 | "info" : { 8 | "author" : "xcode", 9 | "version" : 1 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /SwiftUIMarkdownEditor.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /SwiftUIMarkdownEditor.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /Shared/SwiftUIMarkdownEditorApp.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SwiftUIMarkdownEditorApp.swift 3 | // Shared 4 | // 5 | // Created by mark on 11/16/20. 6 | // 7 | 8 | import SwiftUI 9 | 10 | @main 11 | struct SwiftUIMarkdownEditorApp: App { 12 | var body: some Scene { 13 | DocumentGroup(newDocument: SwiftUIMarkdownEditorDocument()) { file in 14 | ContentView(document: file.$document) 15 | } 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /macOS/macOS.entitlements: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | com.apple.security.app-sandbox 6 | 7 | com.apple.security.files.user-selected.read-write 8 | 9 | com.apple.security.network.client 10 | 11 | com.apple.security.network.server 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /iOS/WebView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // WebView.swift 3 | // SwiftUIMarkdownEditor 4 | // 5 | // Created by mark on 11/16/20. 6 | // 7 | 8 | import SwiftUI 9 | import WebKit 10 | 11 | struct WebView: UIViewRepresentable { 12 | var html: String 13 | 14 | init(html: String) { 15 | self.html = html 16 | } 17 | 18 | func makeUIView(context: Context) -> WKWebView { 19 | let webView = WKWebView() 20 | return webView 21 | } 22 | 23 | func updateUIView(_ uiView: WKWebView, context: Context) { 24 | uiView.loadHTMLString(html, baseURL: nil) 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /macOS/WebView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // WebView.swift 3 | // SwiftUIMarkdownEditor 4 | // 5 | // Created by mark on 11/19/20. 6 | // 7 | 8 | import SwiftUI 9 | import WebKit 10 | 11 | struct WebView: NSViewRepresentable { 12 | var html: String 13 | 14 | init(html: String) { 15 | self.html = html 16 | } 17 | 18 | func makeNSView(context: Context) -> WKWebView { 19 | let webView = WKWebView() 20 | return webView 21 | } 22 | 23 | func updateNSView(_ nsView: WKWebView, context: Context) { 24 | nsView.loadHTMLString(html, baseURL: nil) 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /Shared/ContentView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ContentView.swift 3 | // Shared 4 | // 5 | // Created by mark on 11/16/20. 6 | // 7 | 8 | import SwiftUI 9 | import Ink 10 | 11 | struct ContentView: View { 12 | @Binding var document: SwiftUIMarkdownEditorDocument 13 | 14 | var body: some View { 15 | HStack { 16 | TextEditor(text: $document.text) 17 | WebView(html: html) 18 | } 19 | } 20 | 21 | var html: String { 22 | let parser = MarkdownParser() 23 | return parser.html(from: document.text) 24 | } 25 | } 26 | 27 | struct ContentView_Previews: PreviewProvider { 28 | static var previews: some View { 29 | ContentView(document: .constant(SwiftUIMarkdownEditorDocument())) 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /Tests iOS/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | $(PRODUCT_BUNDLE_PACKAGE_TYPE) 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleVersion 20 | 1 21 | 22 | 23 | -------------------------------------------------------------------------------- /Tests macOS/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | $(PRODUCT_BUNDLE_PACKAGE_TYPE) 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleVersion 20 | 1 21 | 22 | 23 | -------------------------------------------------------------------------------- /Shared/SwiftUIMarkdownEditorDocument.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SwiftUIMarkdownEditorDocument.swift 3 | // Shared 4 | // 5 | // Created by mark on 11/16/20. 6 | // 7 | 8 | import SwiftUI 9 | import UniformTypeIdentifiers 10 | 11 | extension UTType { 12 | static var exampleText: UTType { 13 | UTType(importedAs: "com.example.plain-text") 14 | } 15 | } 16 | 17 | struct SwiftUIMarkdownEditorDocument: FileDocument { 18 | var text: String 19 | 20 | init(text: String = "Type here") { 21 | self.text = text 22 | } 23 | 24 | static var readableContentTypes: [UTType] { [.exampleText] } 25 | 26 | init(configuration: ReadConfiguration) throws { 27 | guard let data = configuration.file.regularFileContents, 28 | let string = String(data: data, encoding: .utf8) 29 | else { 30 | throw CocoaError(.fileReadCorruptFile) 31 | } 32 | text = string 33 | } 34 | 35 | func fileWrapper(configuration: WriteConfiguration) throws -> FileWrapper { 36 | let data = text.data(using: .utf8)! 37 | return .init(regularFileWithContents: data) 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2021 SwiftDevJournal 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /Tests iOS/Tests_iOS.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Tests_iOS.swift 3 | // Tests iOS 4 | // 5 | // Created by mark on 11/16/20. 6 | // 7 | 8 | import XCTest 9 | 10 | class Tests_iOS: XCTestCase { 11 | 12 | override func setUpWithError() throws { 13 | // Put setup code here. This method is called before the invocation of each test method in the class. 14 | 15 | // In UI tests it is usually best to stop immediately when a failure occurs. 16 | continueAfterFailure = false 17 | 18 | // In UI tests it’s important to set the initial state - such as interface orientation - required for your tests before they run. The setUp method is a good place to do this. 19 | } 20 | 21 | override func tearDownWithError() throws { 22 | // Put teardown code here. This method is called after the invocation of each test method in the class. 23 | } 24 | 25 | func testExample() throws { 26 | // UI tests must launch the application that they test. 27 | let app = XCUIApplication() 28 | app.launch() 29 | 30 | // Use recording to get started writing UI tests. 31 | // Use XCTAssert and related functions to verify your tests produce the correct results. 32 | } 33 | 34 | func testLaunchPerformance() throws { 35 | if #available(macOS 10.15, iOS 13.0, tvOS 13.0, *) { 36 | // This measures how long it takes to launch your application. 37 | measure(metrics: [XCTApplicationLaunchMetric()]) { 38 | XCUIApplication().launch() 39 | } 40 | } 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /Tests macOS/Tests_macOS.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Tests_macOS.swift 3 | // Tests macOS 4 | // 5 | // Created by mark on 11/16/20. 6 | // 7 | 8 | import XCTest 9 | 10 | class Tests_macOS: XCTestCase { 11 | 12 | override func setUpWithError() throws { 13 | // Put setup code here. This method is called before the invocation of each test method in the class. 14 | 15 | // In UI tests it is usually best to stop immediately when a failure occurs. 16 | continueAfterFailure = false 17 | 18 | // In UI tests it’s important to set the initial state - such as interface orientation - required for your tests before they run. The setUp method is a good place to do this. 19 | } 20 | 21 | override func tearDownWithError() throws { 22 | // Put teardown code here. This method is called after the invocation of each test method in the class. 23 | } 24 | 25 | func testExample() throws { 26 | // UI tests must launch the application that they test. 27 | let app = XCUIApplication() 28 | app.launch() 29 | 30 | // Use recording to get started writing UI tests. 31 | // Use XCTAssert and related functions to verify your tests produce the correct results. 32 | } 33 | 34 | func testLaunchPerformance() throws { 35 | if #available(macOS 10.15, iOS 13.0, tvOS 13.0, *) { 36 | // This measures how long it takes to launch your application. 37 | measure(metrics: [XCTApplicationLaunchMetric()]) { 38 | XCUIApplication().launch() 39 | } 40 | } 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # SwiftUIMarkdownEditor 2 | 3 | A Markdown editor with live preview written with SwiftUI that runs on both iOS and Mac. This project accompanies the article [Make a Markdown Editor in SwiftUI](https://www.swiftdevjournal.com/make-a-markdown-editor-in-swiftui/) and demonstrates the following aspects of SwiftUI development: 4 | 5 | * Creating a document-based SwiftUI project 6 | * Creating a SwiftUI project that runs on both iOS and Mac 7 | * Working with `WKWebView` in a SwiftUI app 8 | 9 | This project requires Xcode 12.2+. The iOS app runs on iOS 14+. The Mac app runs on macOS 11+. 10 | 11 | The project uses the [Ink Markdown parser](https://github.com/JohnSundell/Ink) written by John Sundell to translate the Markdown to the HTML that appears in the web view. The Ink parser does not currently support creating code blocks through indentation. You must add three or more backticks on the line above and below the code to create a code block. 12 | 13 | ## Syntax Highlighting 14 | 15 | The `syntax-highlighting` branch adds Markdown syntax highlighting using the [CodeEditor](https://github.com/ZeeZide/CodeEditor) SwiftUI text view. 16 | 17 | The CodeEditor package uses the [Highlightr](https://github.com/raspu/Highlightr) package to perform the syntax highlighting. Highlightr has dozens of themes, but CodeEditor includes variables for only 6 of the themes. I created the `CodeThemeNames.swift` extension file for you to add variables for any Highlightr themes you want to use. 18 | 19 | ## Ways to Improve the Editor 20 | 21 | This project currently provides a starting point towards creating a full Markdown editor. Improvements you could make include the following: 22 | 23 | * Providing user interface elements to add Markdown without having to know Markdown syntax. 24 | * Adding CSS styling to the web view. 25 | 26 | ## Credits 27 | 28 | This project uses the [Ink Markdown parser](https://github.com/JohnSundell/Ink) by John Sundell. 29 | -------------------------------------------------------------------------------- /macOS/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleDocumentTypes 8 | 9 | 10 | CFBundleTypeName 11 | Markdown 12 | CFBundleTypeRole 13 | Editor 14 | LSHandlerRank 15 | Default 16 | LSItemContentTypes 17 | 18 | com.example.plain-text 19 | 20 | NSUbiquitousDocumentUserActivityType 21 | $(PRODUCT_BUNDLE_IDENTIFIER).example-document 22 | 23 | 24 | CFBundleExecutable 25 | $(EXECUTABLE_NAME) 26 | CFBundleIconFile 27 | 28 | CFBundleIdentifier 29 | $(PRODUCT_BUNDLE_IDENTIFIER) 30 | CFBundleInfoDictionaryVersion 31 | 6.0 32 | CFBundleName 33 | $(PRODUCT_NAME) 34 | CFBundlePackageType 35 | $(PRODUCT_BUNDLE_PACKAGE_TYPE) 36 | CFBundleShortVersionString 37 | 1.0 38 | CFBundleVersion 39 | 1 40 | LSMinimumSystemVersion 41 | $(MACOSX_DEPLOYMENT_TARGET) 42 | UTImportedTypeDeclarations 43 | 44 | 45 | UTTypeConformsTo 46 | 47 | public.plain-text 48 | 49 | UTTypeDescription 50 | Markdown 51 | UTTypeIcons 52 | 53 | UTTypeIdentifier 54 | com.example.plain-text 55 | UTTypeTagSpecification 56 | 57 | public.filename-extension 58 | 59 | md 60 | 61 | 62 | 63 | 64 | 65 | 66 | -------------------------------------------------------------------------------- /iOS/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleDocumentTypes 8 | 9 | 10 | CFBundleTypeName 11 | Markdown 12 | LSHandlerRank 13 | Default 14 | LSItemContentTypes 15 | 16 | com.example.plain-text 17 | 18 | NSUbiquitousDocumentUserActivityType 19 | $(PRODUCT_BUNDLE_IDENTIFIER).example-document 20 | 21 | 22 | CFBundleExecutable 23 | $(EXECUTABLE_NAME) 24 | CFBundleIdentifier 25 | $(PRODUCT_BUNDLE_IDENTIFIER) 26 | CFBundleInfoDictionaryVersion 27 | 6.0 28 | CFBundleName 29 | $(PRODUCT_NAME) 30 | CFBundlePackageType 31 | $(PRODUCT_BUNDLE_PACKAGE_TYPE) 32 | CFBundleShortVersionString 33 | 1.0 34 | CFBundleVersion 35 | 1 36 | LSRequiresIPhoneOS 37 | 38 | LSSupportsOpeningDocumentsInPlace 39 | 40 | UIApplicationSceneManifest 41 | 42 | UIApplicationSupportsMultipleScenes 43 | 44 | 45 | UIApplicationSupportsIndirectInputEvents 46 | 47 | UILaunchScreen 48 | 49 | UIRequiredDeviceCapabilities 50 | 51 | armv7 52 | 53 | UISupportedInterfaceOrientations 54 | 55 | UIInterfaceOrientationPortrait 56 | UIInterfaceOrientationLandscapeLeft 57 | UIInterfaceOrientationLandscapeRight 58 | 59 | UISupportedInterfaceOrientations~ipad 60 | 61 | UIInterfaceOrientationPortrait 62 | UIInterfaceOrientationPortraitUpsideDown 63 | UIInterfaceOrientationLandscapeLeft 64 | UIInterfaceOrientationLandscapeRight 65 | 66 | UISupportsDocumentBrowser 67 | 68 | UTImportedTypeDeclarations 69 | 70 | 71 | UTTypeConformsTo 72 | 73 | public.plain-text 74 | 75 | UTTypeDescription 76 | Markdown 77 | UTTypeIconFiles 78 | 79 | UTTypeIdentifier 80 | com.example.plain-text 81 | UTTypeTagSpecification 82 | 83 | public.filename-extension 84 | 85 | md 86 | 87 | 88 | 89 | 90 | 91 | 92 | -------------------------------------------------------------------------------- /Shared/Assets.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "iphone", 5 | "scale" : "2x", 6 | "size" : "20x20" 7 | }, 8 | { 9 | "idiom" : "iphone", 10 | "scale" : "3x", 11 | "size" : "20x20" 12 | }, 13 | { 14 | "idiom" : "iphone", 15 | "scale" : "2x", 16 | "size" : "29x29" 17 | }, 18 | { 19 | "idiom" : "iphone", 20 | "scale" : "3x", 21 | "size" : "29x29" 22 | }, 23 | { 24 | "idiom" : "iphone", 25 | "scale" : "2x", 26 | "size" : "40x40" 27 | }, 28 | { 29 | "idiom" : "iphone", 30 | "scale" : "3x", 31 | "size" : "40x40" 32 | }, 33 | { 34 | "idiom" : "iphone", 35 | "scale" : "2x", 36 | "size" : "60x60" 37 | }, 38 | { 39 | "idiom" : "iphone", 40 | "scale" : "3x", 41 | "size" : "60x60" 42 | }, 43 | { 44 | "idiom" : "ipad", 45 | "scale" : "1x", 46 | "size" : "20x20" 47 | }, 48 | { 49 | "idiom" : "ipad", 50 | "scale" : "2x", 51 | "size" : "20x20" 52 | }, 53 | { 54 | "idiom" : "ipad", 55 | "scale" : "1x", 56 | "size" : "29x29" 57 | }, 58 | { 59 | "idiom" : "ipad", 60 | "scale" : "2x", 61 | "size" : "29x29" 62 | }, 63 | { 64 | "idiom" : "ipad", 65 | "scale" : "1x", 66 | "size" : "40x40" 67 | }, 68 | { 69 | "idiom" : "ipad", 70 | "scale" : "2x", 71 | "size" : "40x40" 72 | }, 73 | { 74 | "idiom" : "ipad", 75 | "scale" : "1x", 76 | "size" : "76x76" 77 | }, 78 | { 79 | "idiom" : "ipad", 80 | "scale" : "2x", 81 | "size" : "76x76" 82 | }, 83 | { 84 | "idiom" : "ipad", 85 | "scale" : "2x", 86 | "size" : "83.5x83.5" 87 | }, 88 | { 89 | "idiom" : "ios-marketing", 90 | "scale" : "1x", 91 | "size" : "1024x1024" 92 | }, 93 | { 94 | "idiom" : "mac", 95 | "scale" : "1x", 96 | "size" : "16x16" 97 | }, 98 | { 99 | "idiom" : "mac", 100 | "scale" : "2x", 101 | "size" : "16x16" 102 | }, 103 | { 104 | "idiom" : "mac", 105 | "scale" : "1x", 106 | "size" : "32x32" 107 | }, 108 | { 109 | "idiom" : "mac", 110 | "scale" : "2x", 111 | "size" : "32x32" 112 | }, 113 | { 114 | "idiom" : "mac", 115 | "scale" : "1x", 116 | "size" : "128x128" 117 | }, 118 | { 119 | "idiom" : "mac", 120 | "scale" : "2x", 121 | "size" : "128x128" 122 | }, 123 | { 124 | "idiom" : "mac", 125 | "scale" : "1x", 126 | "size" : "256x256" 127 | }, 128 | { 129 | "idiom" : "mac", 130 | "scale" : "2x", 131 | "size" : "256x256" 132 | }, 133 | { 134 | "idiom" : "mac", 135 | "scale" : "1x", 136 | "size" : "512x512" 137 | }, 138 | { 139 | "idiom" : "mac", 140 | "scale" : "2x", 141 | "size" : "512x512" 142 | } 143 | ], 144 | "info" : { 145 | "author" : "xcode", 146 | "version" : 1 147 | } 148 | } 149 | -------------------------------------------------------------------------------- /SwiftUIMarkdownEditor.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 52; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 4D23F8A92563324200B71502 /* Tests_iOS.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4D23F8A82563324200B71502 /* Tests_iOS.swift */; }; 11 | 4D23F8B42563324200B71502 /* Tests_macOS.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4D23F8B32563324200B71502 /* Tests_macOS.swift */; }; 12 | 4D23F8B62563324200B71502 /* SwiftUIMarkdownEditorApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4D23F88C2563324000B71502 /* SwiftUIMarkdownEditorApp.swift */; }; 13 | 4D23F8B72563324200B71502 /* SwiftUIMarkdownEditorApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4D23F88C2563324000B71502 /* SwiftUIMarkdownEditorApp.swift */; }; 14 | 4D23F8B82563324200B71502 /* SwiftUIMarkdownEditorDocument.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4D23F88D2563324000B71502 /* SwiftUIMarkdownEditorDocument.swift */; }; 15 | 4D23F8B92563324200B71502 /* SwiftUIMarkdownEditorDocument.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4D23F88D2563324000B71502 /* SwiftUIMarkdownEditorDocument.swift */; }; 16 | 4D23F8BA2563324200B71502 /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4D23F88E2563324000B71502 /* ContentView.swift */; }; 17 | 4D23F8BB2563324200B71502 /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4D23F88E2563324000B71502 /* ContentView.swift */; }; 18 | 4D23F8BC2563324200B71502 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 4D23F88F2563324200B71502 /* Assets.xcassets */; }; 19 | 4D23F8BD2563324200B71502 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 4D23F88F2563324200B71502 /* Assets.xcassets */; }; 20 | 4D23F8D62563335F00B71502 /* Ink in Frameworks */ = {isa = PBXBuildFile; productRef = 4D23F8D52563335F00B71502 /* Ink */; }; 21 | 4D23F8DD2563336B00B71502 /* Ink in Frameworks */ = {isa = PBXBuildFile; productRef = 4D23F8DC2563336B00B71502 /* Ink */; }; 22 | 4D23F8E3256334FB00B71502 /* WebView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4D23F8E22563347800B71502 /* WebView.swift */; }; 23 | 4DE3B71C25676B7600A01423 /* WebView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4DE3B717256754D100A01423 /* WebView.swift */; }; 24 | /* End PBXBuildFile section */ 25 | 26 | /* Begin PBXContainerItemProxy section */ 27 | 4D23F8A52563324200B71502 /* PBXContainerItemProxy */ = { 28 | isa = PBXContainerItemProxy; 29 | containerPortal = 4D23F8872563324000B71502 /* Project object */; 30 | proxyType = 1; 31 | remoteGlobalIDString = 4D23F8932563324200B71502; 32 | remoteInfo = "SwiftUIMarkdownEditor (iOS)"; 33 | }; 34 | 4D23F8B02563324200B71502 /* PBXContainerItemProxy */ = { 35 | isa = PBXContainerItemProxy; 36 | containerPortal = 4D23F8872563324000B71502 /* Project object */; 37 | proxyType = 1; 38 | remoteGlobalIDString = 4D23F89B2563324200B71502; 39 | remoteInfo = "SwiftUIMarkdownEditor (macOS)"; 40 | }; 41 | /* End PBXContainerItemProxy section */ 42 | 43 | /* Begin PBXFileReference section */ 44 | 4D23F88C2563324000B71502 /* SwiftUIMarkdownEditorApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SwiftUIMarkdownEditorApp.swift; sourceTree = ""; }; 45 | 4D23F88D2563324000B71502 /* SwiftUIMarkdownEditorDocument.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SwiftUIMarkdownEditorDocument.swift; sourceTree = ""; }; 46 | 4D23F88E2563324000B71502 /* ContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentView.swift; sourceTree = ""; }; 47 | 4D23F88F2563324200B71502 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 48 | 4D23F8942563324200B71502 /* SwiftUIMarkdownEditor.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = SwiftUIMarkdownEditor.app; sourceTree = BUILT_PRODUCTS_DIR; }; 49 | 4D23F8972563324200B71502 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 50 | 4D23F89C2563324200B71502 /* SwiftUIMarkdownEditor.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = SwiftUIMarkdownEditor.app; sourceTree = BUILT_PRODUCTS_DIR; }; 51 | 4D23F89E2563324200B71502 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 52 | 4D23F89F2563324200B71502 /* macOS.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = macOS.entitlements; sourceTree = ""; }; 53 | 4D23F8A42563324200B71502 /* Tests iOS.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "Tests iOS.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; 54 | 4D23F8A82563324200B71502 /* Tests_iOS.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Tests_iOS.swift; sourceTree = ""; }; 55 | 4D23F8AA2563324200B71502 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 56 | 4D23F8AF2563324200B71502 /* Tests macOS.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "Tests macOS.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; 57 | 4D23F8B32563324200B71502 /* Tests_macOS.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Tests_macOS.swift; sourceTree = ""; }; 58 | 4D23F8B52563324200B71502 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 59 | 4D23F8E22563347800B71502 /* WebView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WebView.swift; sourceTree = ""; }; 60 | 4DE3B717256754D100A01423 /* WebView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WebView.swift; sourceTree = ""; }; 61 | 4DE3B78B256863A200A01423 /* README.md */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = ""; }; 62 | /* End PBXFileReference section */ 63 | 64 | /* Begin PBXFrameworksBuildPhase section */ 65 | 4D23F8912563324200B71502 /* Frameworks */ = { 66 | isa = PBXFrameworksBuildPhase; 67 | buildActionMask = 2147483647; 68 | files = ( 69 | 4D23F8D62563335F00B71502 /* Ink in Frameworks */, 70 | ); 71 | runOnlyForDeploymentPostprocessing = 0; 72 | }; 73 | 4D23F8992563324200B71502 /* Frameworks */ = { 74 | isa = PBXFrameworksBuildPhase; 75 | buildActionMask = 2147483647; 76 | files = ( 77 | 4D23F8DD2563336B00B71502 /* Ink in Frameworks */, 78 | ); 79 | runOnlyForDeploymentPostprocessing = 0; 80 | }; 81 | 4D23F8A12563324200B71502 /* Frameworks */ = { 82 | isa = PBXFrameworksBuildPhase; 83 | buildActionMask = 2147483647; 84 | files = ( 85 | ); 86 | runOnlyForDeploymentPostprocessing = 0; 87 | }; 88 | 4D23F8AC2563324200B71502 /* Frameworks */ = { 89 | isa = PBXFrameworksBuildPhase; 90 | buildActionMask = 2147483647; 91 | files = ( 92 | ); 93 | runOnlyForDeploymentPostprocessing = 0; 94 | }; 95 | /* End PBXFrameworksBuildPhase section */ 96 | 97 | /* Begin PBXGroup section */ 98 | 4D23F8862563324000B71502 = { 99 | isa = PBXGroup; 100 | children = ( 101 | 4DE3B78B256863A200A01423 /* README.md */, 102 | 4D23F88B2563324000B71502 /* Shared */, 103 | 4D23F8962563324200B71502 /* iOS */, 104 | 4D23F89D2563324200B71502 /* macOS */, 105 | 4D23F8A72563324200B71502 /* Tests iOS */, 106 | 4D23F8B22563324200B71502 /* Tests macOS */, 107 | 4D23F8952563324200B71502 /* Products */, 108 | 4D23F8DB2563336B00B71502 /* Frameworks */, 109 | ); 110 | sourceTree = ""; 111 | }; 112 | 4D23F88B2563324000B71502 /* Shared */ = { 113 | isa = PBXGroup; 114 | children = ( 115 | 4D23F88C2563324000B71502 /* SwiftUIMarkdownEditorApp.swift */, 116 | 4D23F88D2563324000B71502 /* SwiftUIMarkdownEditorDocument.swift */, 117 | 4D23F88E2563324000B71502 /* ContentView.swift */, 118 | 4D23F88F2563324200B71502 /* Assets.xcassets */, 119 | ); 120 | path = Shared; 121 | sourceTree = ""; 122 | }; 123 | 4D23F8952563324200B71502 /* Products */ = { 124 | isa = PBXGroup; 125 | children = ( 126 | 4D23F8942563324200B71502 /* SwiftUIMarkdownEditor.app */, 127 | 4D23F89C2563324200B71502 /* SwiftUIMarkdownEditor.app */, 128 | 4D23F8A42563324200B71502 /* Tests iOS.xctest */, 129 | 4D23F8AF2563324200B71502 /* Tests macOS.xctest */, 130 | ); 131 | name = Products; 132 | sourceTree = ""; 133 | }; 134 | 4D23F8962563324200B71502 /* iOS */ = { 135 | isa = PBXGroup; 136 | children = ( 137 | 4D23F8972563324200B71502 /* Info.plist */, 138 | 4D23F8E22563347800B71502 /* WebView.swift */, 139 | ); 140 | path = iOS; 141 | sourceTree = ""; 142 | }; 143 | 4D23F89D2563324200B71502 /* macOS */ = { 144 | isa = PBXGroup; 145 | children = ( 146 | 4D23F89E2563324200B71502 /* Info.plist */, 147 | 4D23F89F2563324200B71502 /* macOS.entitlements */, 148 | 4DE3B717256754D100A01423 /* WebView.swift */, 149 | ); 150 | path = macOS; 151 | sourceTree = ""; 152 | }; 153 | 4D23F8A72563324200B71502 /* Tests iOS */ = { 154 | isa = PBXGroup; 155 | children = ( 156 | 4D23F8A82563324200B71502 /* Tests_iOS.swift */, 157 | 4D23F8AA2563324200B71502 /* Info.plist */, 158 | ); 159 | path = "Tests iOS"; 160 | sourceTree = ""; 161 | }; 162 | 4D23F8B22563324200B71502 /* Tests macOS */ = { 163 | isa = PBXGroup; 164 | children = ( 165 | 4D23F8B32563324200B71502 /* Tests_macOS.swift */, 166 | 4D23F8B52563324200B71502 /* Info.plist */, 167 | ); 168 | path = "Tests macOS"; 169 | sourceTree = ""; 170 | }; 171 | 4D23F8DB2563336B00B71502 /* Frameworks */ = { 172 | isa = PBXGroup; 173 | children = ( 174 | ); 175 | name = Frameworks; 176 | sourceTree = ""; 177 | }; 178 | /* End PBXGroup section */ 179 | 180 | /* Begin PBXNativeTarget section */ 181 | 4D23F8932563324200B71502 /* SwiftUIMarkdownEditor (iOS) */ = { 182 | isa = PBXNativeTarget; 183 | buildConfigurationList = 4D23F8C02563324200B71502 /* Build configuration list for PBXNativeTarget "SwiftUIMarkdownEditor (iOS)" */; 184 | buildPhases = ( 185 | 4D23F8902563324200B71502 /* Sources */, 186 | 4D23F8912563324200B71502 /* Frameworks */, 187 | 4D23F8922563324200B71502 /* Resources */, 188 | ); 189 | buildRules = ( 190 | ); 191 | dependencies = ( 192 | ); 193 | name = "SwiftUIMarkdownEditor (iOS)"; 194 | packageProductDependencies = ( 195 | 4D23F8D52563335F00B71502 /* Ink */, 196 | ); 197 | productName = "SwiftUIMarkdownEditor (iOS)"; 198 | productReference = 4D23F8942563324200B71502 /* SwiftUIMarkdownEditor.app */; 199 | productType = "com.apple.product-type.application"; 200 | }; 201 | 4D23F89B2563324200B71502 /* SwiftUIMarkdownEditor (macOS) */ = { 202 | isa = PBXNativeTarget; 203 | buildConfigurationList = 4D23F8C32563324200B71502 /* Build configuration list for PBXNativeTarget "SwiftUIMarkdownEditor (macOS)" */; 204 | buildPhases = ( 205 | 4D23F8982563324200B71502 /* Sources */, 206 | 4D23F8992563324200B71502 /* Frameworks */, 207 | 4D23F89A2563324200B71502 /* Resources */, 208 | ); 209 | buildRules = ( 210 | ); 211 | dependencies = ( 212 | ); 213 | name = "SwiftUIMarkdownEditor (macOS)"; 214 | packageProductDependencies = ( 215 | 4D23F8DC2563336B00B71502 /* Ink */, 216 | ); 217 | productName = "SwiftUIMarkdownEditor (macOS)"; 218 | productReference = 4D23F89C2563324200B71502 /* SwiftUIMarkdownEditor.app */; 219 | productType = "com.apple.product-type.application"; 220 | }; 221 | 4D23F8A32563324200B71502 /* Tests iOS */ = { 222 | isa = PBXNativeTarget; 223 | buildConfigurationList = 4D23F8C62563324200B71502 /* Build configuration list for PBXNativeTarget "Tests iOS" */; 224 | buildPhases = ( 225 | 4D23F8A02563324200B71502 /* Sources */, 226 | 4D23F8A12563324200B71502 /* Frameworks */, 227 | 4D23F8A22563324200B71502 /* Resources */, 228 | ); 229 | buildRules = ( 230 | ); 231 | dependencies = ( 232 | 4D23F8A62563324200B71502 /* PBXTargetDependency */, 233 | ); 234 | name = "Tests iOS"; 235 | productName = "Tests iOS"; 236 | productReference = 4D23F8A42563324200B71502 /* Tests iOS.xctest */; 237 | productType = "com.apple.product-type.bundle.ui-testing"; 238 | }; 239 | 4D23F8AE2563324200B71502 /* Tests macOS */ = { 240 | isa = PBXNativeTarget; 241 | buildConfigurationList = 4D23F8C92563324200B71502 /* Build configuration list for PBXNativeTarget "Tests macOS" */; 242 | buildPhases = ( 243 | 4D23F8AB2563324200B71502 /* Sources */, 244 | 4D23F8AC2563324200B71502 /* Frameworks */, 245 | 4D23F8AD2563324200B71502 /* Resources */, 246 | ); 247 | buildRules = ( 248 | ); 249 | dependencies = ( 250 | 4D23F8B12563324200B71502 /* PBXTargetDependency */, 251 | ); 252 | name = "Tests macOS"; 253 | productName = "Tests macOS"; 254 | productReference = 4D23F8AF2563324200B71502 /* Tests macOS.xctest */; 255 | productType = "com.apple.product-type.bundle.ui-testing"; 256 | }; 257 | /* End PBXNativeTarget section */ 258 | 259 | /* Begin PBXProject section */ 260 | 4D23F8872563324000B71502 /* Project object */ = { 261 | isa = PBXProject; 262 | attributes = { 263 | LastSwiftUpdateCheck = 1220; 264 | LastUpgradeCheck = 1220; 265 | TargetAttributes = { 266 | 4D23F8932563324200B71502 = { 267 | CreatedOnToolsVersion = 12.2; 268 | }; 269 | 4D23F89B2563324200B71502 = { 270 | CreatedOnToolsVersion = 12.2; 271 | }; 272 | 4D23F8A32563324200B71502 = { 273 | CreatedOnToolsVersion = 12.2; 274 | TestTargetID = 4D23F8932563324200B71502; 275 | }; 276 | 4D23F8AE2563324200B71502 = { 277 | CreatedOnToolsVersion = 12.2; 278 | TestTargetID = 4D23F89B2563324200B71502; 279 | }; 280 | }; 281 | }; 282 | buildConfigurationList = 4D23F88A2563324000B71502 /* Build configuration list for PBXProject "SwiftUIMarkdownEditor" */; 283 | compatibilityVersion = "Xcode 9.3"; 284 | developmentRegion = en; 285 | hasScannedForEncodings = 0; 286 | knownRegions = ( 287 | en, 288 | Base, 289 | ); 290 | mainGroup = 4D23F8862563324000B71502; 291 | packageReferences = ( 292 | 4D23F8D42563335F00B71502 /* XCRemoteSwiftPackageReference "Ink" */, 293 | ); 294 | productRefGroup = 4D23F8952563324200B71502 /* Products */; 295 | projectDirPath = ""; 296 | projectRoot = ""; 297 | targets = ( 298 | 4D23F8932563324200B71502 /* SwiftUIMarkdownEditor (iOS) */, 299 | 4D23F89B2563324200B71502 /* SwiftUIMarkdownEditor (macOS) */, 300 | 4D23F8A32563324200B71502 /* Tests iOS */, 301 | 4D23F8AE2563324200B71502 /* Tests macOS */, 302 | ); 303 | }; 304 | /* End PBXProject section */ 305 | 306 | /* Begin PBXResourcesBuildPhase section */ 307 | 4D23F8922563324200B71502 /* Resources */ = { 308 | isa = PBXResourcesBuildPhase; 309 | buildActionMask = 2147483647; 310 | files = ( 311 | 4D23F8BC2563324200B71502 /* Assets.xcassets in Resources */, 312 | ); 313 | runOnlyForDeploymentPostprocessing = 0; 314 | }; 315 | 4D23F89A2563324200B71502 /* Resources */ = { 316 | isa = PBXResourcesBuildPhase; 317 | buildActionMask = 2147483647; 318 | files = ( 319 | 4D23F8BD2563324200B71502 /* Assets.xcassets in Resources */, 320 | ); 321 | runOnlyForDeploymentPostprocessing = 0; 322 | }; 323 | 4D23F8A22563324200B71502 /* Resources */ = { 324 | isa = PBXResourcesBuildPhase; 325 | buildActionMask = 2147483647; 326 | files = ( 327 | ); 328 | runOnlyForDeploymentPostprocessing = 0; 329 | }; 330 | 4D23F8AD2563324200B71502 /* Resources */ = { 331 | isa = PBXResourcesBuildPhase; 332 | buildActionMask = 2147483647; 333 | files = ( 334 | ); 335 | runOnlyForDeploymentPostprocessing = 0; 336 | }; 337 | /* End PBXResourcesBuildPhase section */ 338 | 339 | /* Begin PBXSourcesBuildPhase section */ 340 | 4D23F8902563324200B71502 /* Sources */ = { 341 | isa = PBXSourcesBuildPhase; 342 | buildActionMask = 2147483647; 343 | files = ( 344 | 4D23F8B82563324200B71502 /* SwiftUIMarkdownEditorDocument.swift in Sources */, 345 | 4D23F8E3256334FB00B71502 /* WebView.swift in Sources */, 346 | 4D23F8B62563324200B71502 /* SwiftUIMarkdownEditorApp.swift in Sources */, 347 | 4D23F8BA2563324200B71502 /* ContentView.swift in Sources */, 348 | ); 349 | runOnlyForDeploymentPostprocessing = 0; 350 | }; 351 | 4D23F8982563324200B71502 /* Sources */ = { 352 | isa = PBXSourcesBuildPhase; 353 | buildActionMask = 2147483647; 354 | files = ( 355 | 4D23F8B92563324200B71502 /* SwiftUIMarkdownEditorDocument.swift in Sources */, 356 | 4DE3B71C25676B7600A01423 /* WebView.swift in Sources */, 357 | 4D23F8B72563324200B71502 /* SwiftUIMarkdownEditorApp.swift in Sources */, 358 | 4D23F8BB2563324200B71502 /* ContentView.swift in Sources */, 359 | ); 360 | runOnlyForDeploymentPostprocessing = 0; 361 | }; 362 | 4D23F8A02563324200B71502 /* Sources */ = { 363 | isa = PBXSourcesBuildPhase; 364 | buildActionMask = 2147483647; 365 | files = ( 366 | 4D23F8A92563324200B71502 /* Tests_iOS.swift in Sources */, 367 | ); 368 | runOnlyForDeploymentPostprocessing = 0; 369 | }; 370 | 4D23F8AB2563324200B71502 /* Sources */ = { 371 | isa = PBXSourcesBuildPhase; 372 | buildActionMask = 2147483647; 373 | files = ( 374 | 4D23F8B42563324200B71502 /* Tests_macOS.swift in Sources */, 375 | ); 376 | runOnlyForDeploymentPostprocessing = 0; 377 | }; 378 | /* End PBXSourcesBuildPhase section */ 379 | 380 | /* Begin PBXTargetDependency section */ 381 | 4D23F8A62563324200B71502 /* PBXTargetDependency */ = { 382 | isa = PBXTargetDependency; 383 | target = 4D23F8932563324200B71502 /* SwiftUIMarkdownEditor (iOS) */; 384 | targetProxy = 4D23F8A52563324200B71502 /* PBXContainerItemProxy */; 385 | }; 386 | 4D23F8B12563324200B71502 /* PBXTargetDependency */ = { 387 | isa = PBXTargetDependency; 388 | target = 4D23F89B2563324200B71502 /* SwiftUIMarkdownEditor (macOS) */; 389 | targetProxy = 4D23F8B02563324200B71502 /* PBXContainerItemProxy */; 390 | }; 391 | /* End PBXTargetDependency section */ 392 | 393 | /* Begin XCBuildConfiguration section */ 394 | 4D23F8BE2563324200B71502 /* Debug */ = { 395 | isa = XCBuildConfiguration; 396 | buildSettings = { 397 | ALWAYS_SEARCH_USER_PATHS = NO; 398 | CLANG_ANALYZER_NONNULL = YES; 399 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 400 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 401 | CLANG_CXX_LIBRARY = "libc++"; 402 | CLANG_ENABLE_MODULES = YES; 403 | CLANG_ENABLE_OBJC_ARC = YES; 404 | CLANG_ENABLE_OBJC_WEAK = YES; 405 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 406 | CLANG_WARN_BOOL_CONVERSION = YES; 407 | CLANG_WARN_COMMA = YES; 408 | CLANG_WARN_CONSTANT_CONVERSION = YES; 409 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 410 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 411 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 412 | CLANG_WARN_EMPTY_BODY = YES; 413 | CLANG_WARN_ENUM_CONVERSION = YES; 414 | CLANG_WARN_INFINITE_RECURSION = YES; 415 | CLANG_WARN_INT_CONVERSION = YES; 416 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 417 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 418 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 419 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 420 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; 421 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 422 | CLANG_WARN_STRICT_PROTOTYPES = YES; 423 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 424 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 425 | CLANG_WARN_UNREACHABLE_CODE = YES; 426 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 427 | COPY_PHASE_STRIP = NO; 428 | DEBUG_INFORMATION_FORMAT = dwarf; 429 | ENABLE_STRICT_OBJC_MSGSEND = YES; 430 | ENABLE_TESTABILITY = YES; 431 | GCC_C_LANGUAGE_STANDARD = gnu11; 432 | GCC_DYNAMIC_NO_PIC = NO; 433 | GCC_NO_COMMON_BLOCKS = YES; 434 | GCC_OPTIMIZATION_LEVEL = 0; 435 | GCC_PREPROCESSOR_DEFINITIONS = ( 436 | "DEBUG=1", 437 | "$(inherited)", 438 | ); 439 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 440 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 441 | GCC_WARN_UNDECLARED_SELECTOR = YES; 442 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 443 | GCC_WARN_UNUSED_FUNCTION = YES; 444 | GCC_WARN_UNUSED_VARIABLE = YES; 445 | MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; 446 | MTL_FAST_MATH = YES; 447 | ONLY_ACTIVE_ARCH = YES; 448 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; 449 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 450 | }; 451 | name = Debug; 452 | }; 453 | 4D23F8BF2563324200B71502 /* Release */ = { 454 | isa = XCBuildConfiguration; 455 | buildSettings = { 456 | ALWAYS_SEARCH_USER_PATHS = NO; 457 | CLANG_ANALYZER_NONNULL = YES; 458 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 459 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 460 | CLANG_CXX_LIBRARY = "libc++"; 461 | CLANG_ENABLE_MODULES = YES; 462 | CLANG_ENABLE_OBJC_ARC = YES; 463 | CLANG_ENABLE_OBJC_WEAK = YES; 464 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 465 | CLANG_WARN_BOOL_CONVERSION = YES; 466 | CLANG_WARN_COMMA = YES; 467 | CLANG_WARN_CONSTANT_CONVERSION = YES; 468 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 469 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 470 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 471 | CLANG_WARN_EMPTY_BODY = YES; 472 | CLANG_WARN_ENUM_CONVERSION = YES; 473 | CLANG_WARN_INFINITE_RECURSION = YES; 474 | CLANG_WARN_INT_CONVERSION = YES; 475 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 476 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 477 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 478 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 479 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; 480 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 481 | CLANG_WARN_STRICT_PROTOTYPES = YES; 482 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 483 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 484 | CLANG_WARN_UNREACHABLE_CODE = YES; 485 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 486 | COPY_PHASE_STRIP = NO; 487 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 488 | ENABLE_NS_ASSERTIONS = NO; 489 | ENABLE_STRICT_OBJC_MSGSEND = YES; 490 | GCC_C_LANGUAGE_STANDARD = gnu11; 491 | GCC_NO_COMMON_BLOCKS = YES; 492 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 493 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 494 | GCC_WARN_UNDECLARED_SELECTOR = YES; 495 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 496 | GCC_WARN_UNUSED_FUNCTION = YES; 497 | GCC_WARN_UNUSED_VARIABLE = YES; 498 | MTL_ENABLE_DEBUG_INFO = NO; 499 | MTL_FAST_MATH = YES; 500 | SWIFT_COMPILATION_MODE = wholemodule; 501 | SWIFT_OPTIMIZATION_LEVEL = "-O"; 502 | }; 503 | name = Release; 504 | }; 505 | 4D23F8C12563324200B71502 /* Debug */ = { 506 | isa = XCBuildConfiguration; 507 | buildSettings = { 508 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 509 | ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; 510 | CODE_SIGN_STYLE = Automatic; 511 | DEVELOPMENT_TEAM = SJHNKGG86R; 512 | ENABLE_PREVIEWS = YES; 513 | INFOPLIST_FILE = iOS/Info.plist; 514 | IPHONEOS_DEPLOYMENT_TARGET = 14.0; 515 | LD_RUNPATH_SEARCH_PATHS = ( 516 | "$(inherited)", 517 | "@executable_path/Frameworks", 518 | ); 519 | PRODUCT_BUNDLE_IDENTIFIER = com.SwiftDevJournal.SwiftUIMarkdownEditor; 520 | PRODUCT_NAME = SwiftUIMarkdownEditor; 521 | SDKROOT = iphoneos; 522 | SWIFT_VERSION = 5.0; 523 | TARGETED_DEVICE_FAMILY = "1,2"; 524 | }; 525 | name = Debug; 526 | }; 527 | 4D23F8C22563324200B71502 /* Release */ = { 528 | isa = XCBuildConfiguration; 529 | buildSettings = { 530 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 531 | ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; 532 | CODE_SIGN_STYLE = Automatic; 533 | DEVELOPMENT_TEAM = SJHNKGG86R; 534 | ENABLE_PREVIEWS = YES; 535 | INFOPLIST_FILE = iOS/Info.plist; 536 | IPHONEOS_DEPLOYMENT_TARGET = 14.0; 537 | LD_RUNPATH_SEARCH_PATHS = ( 538 | "$(inherited)", 539 | "@executable_path/Frameworks", 540 | ); 541 | PRODUCT_BUNDLE_IDENTIFIER = com.SwiftDevJournal.SwiftUIMarkdownEditor; 542 | PRODUCT_NAME = SwiftUIMarkdownEditor; 543 | SDKROOT = iphoneos; 544 | SWIFT_VERSION = 5.0; 545 | TARGETED_DEVICE_FAMILY = "1,2"; 546 | VALIDATE_PRODUCT = YES; 547 | }; 548 | name = Release; 549 | }; 550 | 4D23F8C42563324200B71502 /* Debug */ = { 551 | isa = XCBuildConfiguration; 552 | buildSettings = { 553 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 554 | ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; 555 | CODE_SIGN_ENTITLEMENTS = macOS/macOS.entitlements; 556 | CODE_SIGN_STYLE = Automatic; 557 | COMBINE_HIDPI_IMAGES = YES; 558 | DEVELOPMENT_TEAM = SJHNKGG86R; 559 | ENABLE_HARDENED_RUNTIME = YES; 560 | ENABLE_PREVIEWS = YES; 561 | INFOPLIST_FILE = macOS/Info.plist; 562 | LD_RUNPATH_SEARCH_PATHS = ( 563 | "$(inherited)", 564 | "@executable_path/../Frameworks", 565 | ); 566 | MACOSX_DEPLOYMENT_TARGET = 11.0; 567 | PRODUCT_BUNDLE_IDENTIFIER = com.SwiftDevJournal.SwiftUIMarkdownEditor; 568 | PRODUCT_NAME = SwiftUIMarkdownEditor; 569 | SDKROOT = macosx; 570 | SWIFT_VERSION = 5.0; 571 | }; 572 | name = Debug; 573 | }; 574 | 4D23F8C52563324200B71502 /* Release */ = { 575 | isa = XCBuildConfiguration; 576 | buildSettings = { 577 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 578 | ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; 579 | CODE_SIGN_ENTITLEMENTS = macOS/macOS.entitlements; 580 | CODE_SIGN_STYLE = Automatic; 581 | COMBINE_HIDPI_IMAGES = YES; 582 | DEVELOPMENT_TEAM = SJHNKGG86R; 583 | ENABLE_HARDENED_RUNTIME = YES; 584 | ENABLE_PREVIEWS = YES; 585 | INFOPLIST_FILE = macOS/Info.plist; 586 | LD_RUNPATH_SEARCH_PATHS = ( 587 | "$(inherited)", 588 | "@executable_path/../Frameworks", 589 | ); 590 | MACOSX_DEPLOYMENT_TARGET = 11.0; 591 | PRODUCT_BUNDLE_IDENTIFIER = com.SwiftDevJournal.SwiftUIMarkdownEditor; 592 | PRODUCT_NAME = SwiftUIMarkdownEditor; 593 | SDKROOT = macosx; 594 | SWIFT_VERSION = 5.0; 595 | }; 596 | name = Release; 597 | }; 598 | 4D23F8C72563324200B71502 /* Debug */ = { 599 | isa = XCBuildConfiguration; 600 | buildSettings = { 601 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; 602 | CODE_SIGN_STYLE = Automatic; 603 | DEVELOPMENT_TEAM = SJHNKGG86R; 604 | INFOPLIST_FILE = "Tests iOS/Info.plist"; 605 | IPHONEOS_DEPLOYMENT_TARGET = 14.2; 606 | LD_RUNPATH_SEARCH_PATHS = ( 607 | "$(inherited)", 608 | "@executable_path/Frameworks", 609 | "@loader_path/Frameworks", 610 | ); 611 | PRODUCT_BUNDLE_IDENTIFIER = "com.SwiftDevJournal.Tests-iOS"; 612 | PRODUCT_NAME = "$(TARGET_NAME)"; 613 | SDKROOT = iphoneos; 614 | SWIFT_VERSION = 5.0; 615 | TARGETED_DEVICE_FAMILY = "1,2"; 616 | TEST_TARGET_NAME = "SwiftUIMarkdownEditor (iOS)"; 617 | }; 618 | name = Debug; 619 | }; 620 | 4D23F8C82563324200B71502 /* Release */ = { 621 | isa = XCBuildConfiguration; 622 | buildSettings = { 623 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; 624 | CODE_SIGN_STYLE = Automatic; 625 | DEVELOPMENT_TEAM = SJHNKGG86R; 626 | INFOPLIST_FILE = "Tests iOS/Info.plist"; 627 | IPHONEOS_DEPLOYMENT_TARGET = 14.2; 628 | LD_RUNPATH_SEARCH_PATHS = ( 629 | "$(inherited)", 630 | "@executable_path/Frameworks", 631 | "@loader_path/Frameworks", 632 | ); 633 | PRODUCT_BUNDLE_IDENTIFIER = "com.SwiftDevJournal.Tests-iOS"; 634 | PRODUCT_NAME = "$(TARGET_NAME)"; 635 | SDKROOT = iphoneos; 636 | SWIFT_VERSION = 5.0; 637 | TARGETED_DEVICE_FAMILY = "1,2"; 638 | TEST_TARGET_NAME = "SwiftUIMarkdownEditor (iOS)"; 639 | VALIDATE_PRODUCT = YES; 640 | }; 641 | name = Release; 642 | }; 643 | 4D23F8CA2563324200B71502 /* Debug */ = { 644 | isa = XCBuildConfiguration; 645 | buildSettings = { 646 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; 647 | CODE_SIGN_STYLE = Automatic; 648 | COMBINE_HIDPI_IMAGES = YES; 649 | DEVELOPMENT_TEAM = SJHNKGG86R; 650 | INFOPLIST_FILE = "Tests macOS/Info.plist"; 651 | LD_RUNPATH_SEARCH_PATHS = ( 652 | "$(inherited)", 653 | "@executable_path/../Frameworks", 654 | "@loader_path/../Frameworks", 655 | ); 656 | MACOSX_DEPLOYMENT_TARGET = 10.15; 657 | PRODUCT_BUNDLE_IDENTIFIER = "com.SwiftDevJournal.Tests-macOS"; 658 | PRODUCT_NAME = "$(TARGET_NAME)"; 659 | SDKROOT = macosx; 660 | SWIFT_VERSION = 5.0; 661 | TEST_TARGET_NAME = "SwiftUIMarkdownEditor (macOS)"; 662 | }; 663 | name = Debug; 664 | }; 665 | 4D23F8CB2563324200B71502 /* Release */ = { 666 | isa = XCBuildConfiguration; 667 | buildSettings = { 668 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; 669 | CODE_SIGN_STYLE = Automatic; 670 | COMBINE_HIDPI_IMAGES = YES; 671 | DEVELOPMENT_TEAM = SJHNKGG86R; 672 | INFOPLIST_FILE = "Tests macOS/Info.plist"; 673 | LD_RUNPATH_SEARCH_PATHS = ( 674 | "$(inherited)", 675 | "@executable_path/../Frameworks", 676 | "@loader_path/../Frameworks", 677 | ); 678 | MACOSX_DEPLOYMENT_TARGET = 10.15; 679 | PRODUCT_BUNDLE_IDENTIFIER = "com.SwiftDevJournal.Tests-macOS"; 680 | PRODUCT_NAME = "$(TARGET_NAME)"; 681 | SDKROOT = macosx; 682 | SWIFT_VERSION = 5.0; 683 | TEST_TARGET_NAME = "SwiftUIMarkdownEditor (macOS)"; 684 | }; 685 | name = Release; 686 | }; 687 | /* End XCBuildConfiguration section */ 688 | 689 | /* Begin XCConfigurationList section */ 690 | 4D23F88A2563324000B71502 /* Build configuration list for PBXProject "SwiftUIMarkdownEditor" */ = { 691 | isa = XCConfigurationList; 692 | buildConfigurations = ( 693 | 4D23F8BE2563324200B71502 /* Debug */, 694 | 4D23F8BF2563324200B71502 /* Release */, 695 | ); 696 | defaultConfigurationIsVisible = 0; 697 | defaultConfigurationName = Release; 698 | }; 699 | 4D23F8C02563324200B71502 /* Build configuration list for PBXNativeTarget "SwiftUIMarkdownEditor (iOS)" */ = { 700 | isa = XCConfigurationList; 701 | buildConfigurations = ( 702 | 4D23F8C12563324200B71502 /* Debug */, 703 | 4D23F8C22563324200B71502 /* Release */, 704 | ); 705 | defaultConfigurationIsVisible = 0; 706 | defaultConfigurationName = Release; 707 | }; 708 | 4D23F8C32563324200B71502 /* Build configuration list for PBXNativeTarget "SwiftUIMarkdownEditor (macOS)" */ = { 709 | isa = XCConfigurationList; 710 | buildConfigurations = ( 711 | 4D23F8C42563324200B71502 /* Debug */, 712 | 4D23F8C52563324200B71502 /* Release */, 713 | ); 714 | defaultConfigurationIsVisible = 0; 715 | defaultConfigurationName = Release; 716 | }; 717 | 4D23F8C62563324200B71502 /* Build configuration list for PBXNativeTarget "Tests iOS" */ = { 718 | isa = XCConfigurationList; 719 | buildConfigurations = ( 720 | 4D23F8C72563324200B71502 /* Debug */, 721 | 4D23F8C82563324200B71502 /* Release */, 722 | ); 723 | defaultConfigurationIsVisible = 0; 724 | defaultConfigurationName = Release; 725 | }; 726 | 4D23F8C92563324200B71502 /* Build configuration list for PBXNativeTarget "Tests macOS" */ = { 727 | isa = XCConfigurationList; 728 | buildConfigurations = ( 729 | 4D23F8CA2563324200B71502 /* Debug */, 730 | 4D23F8CB2563324200B71502 /* Release */, 731 | ); 732 | defaultConfigurationIsVisible = 0; 733 | defaultConfigurationName = Release; 734 | }; 735 | /* End XCConfigurationList section */ 736 | 737 | /* Begin XCRemoteSwiftPackageReference section */ 738 | 4D23F8D42563335F00B71502 /* XCRemoteSwiftPackageReference "Ink" */ = { 739 | isa = XCRemoteSwiftPackageReference; 740 | repositoryURL = "https://github.com/JohnSundell/Ink.git"; 741 | requirement = { 742 | branch = master; 743 | kind = branch; 744 | }; 745 | }; 746 | /* End XCRemoteSwiftPackageReference section */ 747 | 748 | /* Begin XCSwiftPackageProductDependency section */ 749 | 4D23F8D52563335F00B71502 /* Ink */ = { 750 | isa = XCSwiftPackageProductDependency; 751 | package = 4D23F8D42563335F00B71502 /* XCRemoteSwiftPackageReference "Ink" */; 752 | productName = Ink; 753 | }; 754 | 4D23F8DC2563336B00B71502 /* Ink */ = { 755 | isa = XCSwiftPackageProductDependency; 756 | package = 4D23F8D42563335F00B71502 /* XCRemoteSwiftPackageReference "Ink" */; 757 | productName = Ink; 758 | }; 759 | /* End XCSwiftPackageProductDependency section */ 760 | }; 761 | rootObject = 4D23F8872563324000B71502 /* Project object */; 762 | } 763 | --------------------------------------------------------------------------------