├── 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 |
--------------------------------------------------------------------------------