├── .gitignore
├── .gitmodules
├── Cherri
├── Assets.xcassets
│ ├── Contents.json
│ ├── Icon.iconset
│ │ ├── icon_16x16.png
│ │ ├── icon_32x32.png
│ │ ├── icon_128x128.png
│ │ ├── icon_16x16@2x.png
│ │ ├── icon_256x256.png
│ │ ├── icon_32x32@2x.png
│ │ ├── icon_512x512.png
│ │ ├── icon_128x128@2x.png
│ │ ├── icon_256x256@2x.png
│ │ └── icon_512x512@2x.png
│ └── AccentColor.colorset
│ │ └── Contents.json
├── Preview Content
│ └── Preview Assets.xcassets
│ │ └── Contents.json
├── CherriAppIcon.icon
│ ├── Assets
│ │ └── cherri 2.png
│ └── icon.json
├── Cherri.entitlements
├── CodeTheme.swift
├── ShareOption.swift
├── MessageEntry.swift
├── DocumentState.swift
├── AppDelegate.swift
├── CherriDocument.swift
├── AboutView.swift
├── CherriSettings.swift
├── Info.plist
├── CherriApp.swift
└── ContentView.swift
├── Cherri.xcodeproj
├── project.xcworkspace
│ ├── contents.xcworkspacedata
│ └── xcshareddata
│ │ ├── IDEWorkspaceChecks.plist
│ │ └── swiftpm
│ │ └── Package.resolved
├── xcuserdata
│ └── brandonjordan.xcuserdatad
│ │ └── xcschemes
│ │ └── xcschememanagement.plist
└── project.pbxproj
├── CherriUITests
├── CherriUITestsLaunchTests.swift
└── CherriUITests.swift
├── CherriTests
└── CherriTests.swift
├── README.md
└── LICENSE
/.gitignore:
--------------------------------------------------------------------------------
1 | .DS_Store
2 | /.idea/
3 | /.vscode/
4 | Cherri/cherri_binary
--------------------------------------------------------------------------------
/.gitmodules:
--------------------------------------------------------------------------------
1 | [submodule "Cherri/Compiler"]
2 | path = Cherri/Compiler
3 | url = https://github.com/electrikmilk/cherri
4 |
--------------------------------------------------------------------------------
/Cherri/Assets.xcassets/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "author" : "xcode",
4 | "version" : 1
5 | }
6 | }
7 |
--------------------------------------------------------------------------------
/Cherri/Preview Content/Preview Assets.xcassets/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "author" : "xcode",
4 | "version" : 1
5 | }
6 | }
7 |
--------------------------------------------------------------------------------
/Cherri/CherriAppIcon.icon/Assets/cherri 2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/electrikmilk/cherri-macos-app/HEAD/Cherri/CherriAppIcon.icon/Assets/cherri 2.png
--------------------------------------------------------------------------------
/Cherri/Assets.xcassets/Icon.iconset/icon_16x16.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/electrikmilk/cherri-macos-app/HEAD/Cherri/Assets.xcassets/Icon.iconset/icon_16x16.png
--------------------------------------------------------------------------------
/Cherri/Assets.xcassets/Icon.iconset/icon_32x32.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/electrikmilk/cherri-macos-app/HEAD/Cherri/Assets.xcassets/Icon.iconset/icon_32x32.png
--------------------------------------------------------------------------------
/Cherri/Assets.xcassets/Icon.iconset/icon_128x128.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/electrikmilk/cherri-macos-app/HEAD/Cherri/Assets.xcassets/Icon.iconset/icon_128x128.png
--------------------------------------------------------------------------------
/Cherri/Assets.xcassets/Icon.iconset/icon_16x16@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/electrikmilk/cherri-macos-app/HEAD/Cherri/Assets.xcassets/Icon.iconset/icon_16x16@2x.png
--------------------------------------------------------------------------------
/Cherri/Assets.xcassets/Icon.iconset/icon_256x256.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/electrikmilk/cherri-macos-app/HEAD/Cherri/Assets.xcassets/Icon.iconset/icon_256x256.png
--------------------------------------------------------------------------------
/Cherri/Assets.xcassets/Icon.iconset/icon_32x32@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/electrikmilk/cherri-macos-app/HEAD/Cherri/Assets.xcassets/Icon.iconset/icon_32x32@2x.png
--------------------------------------------------------------------------------
/Cherri/Assets.xcassets/Icon.iconset/icon_512x512.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/electrikmilk/cherri-macos-app/HEAD/Cherri/Assets.xcassets/Icon.iconset/icon_512x512.png
--------------------------------------------------------------------------------
/Cherri/Assets.xcassets/Icon.iconset/icon_128x128@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/electrikmilk/cherri-macos-app/HEAD/Cherri/Assets.xcassets/Icon.iconset/icon_128x128@2x.png
--------------------------------------------------------------------------------
/Cherri/Assets.xcassets/Icon.iconset/icon_256x256@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/electrikmilk/cherri-macos-app/HEAD/Cherri/Assets.xcassets/Icon.iconset/icon_256x256@2x.png
--------------------------------------------------------------------------------
/Cherri/Assets.xcassets/Icon.iconset/icon_512x512@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/electrikmilk/cherri-macos-app/HEAD/Cherri/Assets.xcassets/Icon.iconset/icon_512x512@2x.png
--------------------------------------------------------------------------------
/Cherri.xcodeproj/project.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/Cherri/Cherri.entitlements:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/Cherri.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | IDEDidComputeMac32BitWarning
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/Cherri/CodeTheme.swift:
--------------------------------------------------------------------------------
1 | //
2 | // CodeTheme.swift
3 | // Cherri
4 | //
5 | // Created by Brandon Jordan on 3/5/25.
6 | //
7 |
8 | import Foundation
9 |
10 | enum CodeTheme: String, CaseIterable, Identifiable {
11 | case light = "Light"
12 | case dark = "Dark"
13 |
14 | var id: CodeTheme {
15 | return self
16 | }
17 | }
18 |
--------------------------------------------------------------------------------
/Cherri/ShareOption.swift:
--------------------------------------------------------------------------------
1 | //
2 | // ShareOption.swift
3 | // Cherri
4 | //
5 | // Created by Brandon Jordan on 3/5/25.
6 | //
7 |
8 | import Foundation
9 |
10 | enum ShareOption: String, CaseIterable, Identifiable {
11 | case contacts = "Contacts"
12 | case anyone = "Anyone"
13 |
14 | var id: ShareOption {
15 | return self
16 | }
17 | }
18 |
--------------------------------------------------------------------------------
/Cherri/MessageEntry.swift:
--------------------------------------------------------------------------------
1 | //
2 | // MessageEntry.swift
3 | // Cherri
4 | //
5 | // Created by Brandon Jordan on 3/7/25.
6 | //
7 |
8 | import Foundation
9 | import LanguageSupport
10 | import SwiftUI
11 |
12 | struct MessageEntry {
13 | @Binding var messages: Set>
14 |
15 | @Environment(\.presentationMode) private var presentationMode
16 |
17 | @State private var category: Message.Category = .error
18 | @State private var summary: String = ""
19 | @State private var lineStr: String = ""
20 | @State private var columnStr: String = ""
21 | @State private var message: String = ""
22 | }
23 |
--------------------------------------------------------------------------------
/Cherri/DocumentState.swift:
--------------------------------------------------------------------------------
1 | //
2 | // AppState.swift
3 | // Cherri
4 | //
5 | // Created by Brandon Jordan on 3/5/25.
6 | //
7 |
8 | import Foundation
9 | import LanguageSupport
10 |
11 | class DocumentState : ObservableObject {
12 | @Published var fileName: String = ""
13 | @Published var fileURL: URL = URL(fileURLWithPath: "")
14 | @Published var shortcutName: String = ""
15 | @Published var shortcutURL: URL = URL(fileURLWithPath: "")
16 | @Published var path: String = ""
17 |
18 | @Published var messages: Set> = Set ()
19 | @Published var hasError: Bool = false
20 | @Published var hasWarnings: Bool = false
21 |
22 | @Published var compiling: Bool = false
23 | @Published var compiled: Bool = false
24 | }
25 |
--------------------------------------------------------------------------------
/Cherri.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved:
--------------------------------------------------------------------------------
1 | {
2 | "originHash" : "3675a8b363ad866505239c8e2c7f6a0862ed02618f2dca478b2519372fb79c0c",
3 | "pins" : [
4 | {
5 | "identity" : "codeeditorview",
6 | "kind" : "remoteSourceControl",
7 | "location" : "https://github.com/mchakravarty/CodeEditorView",
8 | "state" : {
9 | "revision" : "5375871f59888a6ea98a1632e0b2e7a6e676cd88",
10 | "version" : "0.12.0"
11 | }
12 | },
13 | {
14 | "identity" : "rearrange",
15 | "kind" : "remoteSourceControl",
16 | "location" : "https://github.com/ChimeHQ/Rearrange.git",
17 | "state" : {
18 | "revision" : "0fb658e721c68495f6340c211cc6d4719e6b52d8",
19 | "version" : "1.6.0"
20 | }
21 | }
22 | ],
23 | "version" : 3
24 | }
25 |
--------------------------------------------------------------------------------
/Cherri/AppDelegate.swift:
--------------------------------------------------------------------------------
1 | //
2 | // AppDelegate.swift
3 | // Cherri
4 | //
5 | // Created by Brandon Jordan on 1/16/24.
6 | //
7 |
8 | import Foundation
9 | import AppKit
10 | import SwiftUI
11 |
12 | class AppDelegate: NSObject, NSApplicationDelegate {
13 | private var aboutBoxWindowController: NSWindowController?
14 |
15 | func showAboutPanel() {
16 | if aboutBoxWindowController == nil {
17 | let styleMask: NSWindow.StyleMask = [.closable, .titled]
18 | let window = NSWindow()
19 | window.styleMask = styleMask
20 | window.contentView = NSHostingView(rootView: AboutView())
21 | aboutBoxWindowController = NSWindowController(window: window)
22 | }
23 |
24 | aboutBoxWindowController?.showWindow(aboutBoxWindowController?.window)
25 | }
26 | }
27 |
--------------------------------------------------------------------------------
/Cherri/Assets.xcassets/AccentColor.colorset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "colors" : [
3 | {
4 | "color" : {
5 | "color-space" : "srgb",
6 | "components" : {
7 | "alpha" : "1.000",
8 | "blue" : "0.000",
9 | "green" : "0.000",
10 | "red" : "0.874"
11 | }
12 | },
13 | "idiom" : "universal"
14 | },
15 | {
16 | "appearances" : [
17 | {
18 | "appearance" : "luminosity",
19 | "value" : "dark"
20 | }
21 | ],
22 | "color" : {
23 | "color-space" : "srgb",
24 | "components" : {
25 | "alpha" : "1.000",
26 | "blue" : "0.000",
27 | "green" : "0.000",
28 | "red" : "1.000"
29 | }
30 | },
31 | "idiom" : "universal"
32 | }
33 | ],
34 | "info" : {
35 | "author" : "xcode",
36 | "version" : 1
37 | }
38 | }
39 |
--------------------------------------------------------------------------------
/Cherri/CherriAppIcon.icon/icon.json:
--------------------------------------------------------------------------------
1 | {
2 | "fill" : {
3 | "linear-gradient" : [
4 | "extended-gray:1.00000,1.00000",
5 | "srgb:0.94510,0.92941,0.86667,1.00000"
6 | ]
7 | },
8 | "groups" : [
9 | {
10 | "layers" : [
11 | {
12 | "fill" : "none",
13 | "glass" : false,
14 | "image-name" : "cherri 2.png",
15 | "name" : "cherri 2",
16 | "position" : {
17 | "scale" : 0.5,
18 | "translation-in-points" : [
19 | 0,
20 | 0
21 | ]
22 | }
23 | }
24 | ],
25 | "shadow" : {
26 | "kind" : "neutral",
27 | "opacity" : 0.5
28 | },
29 | "translucency" : {
30 | "enabled" : true,
31 | "value" : 0.5
32 | }
33 | }
34 | ],
35 | "supported-platforms" : {
36 | "squares" : [
37 | "macOS"
38 | ]
39 | }
40 | }
--------------------------------------------------------------------------------
/CherriUITests/CherriUITestsLaunchTests.swift:
--------------------------------------------------------------------------------
1 | //
2 | // CherriUITestsLaunchTests.swift
3 | // CherriUITests
4 | //
5 | // Created by Brandon Jordan on 12/3/23.
6 | //
7 |
8 | import XCTest
9 |
10 | final class CherriUITestsLaunchTests: XCTestCase {
11 |
12 | override class var runsForEachTargetApplicationUIConfiguration: Bool {
13 | true
14 | }
15 |
16 | override func setUpWithError() throws {
17 | continueAfterFailure = false
18 | }
19 |
20 | func testLaunch() throws {
21 | let app = XCUIApplication()
22 | app.launch()
23 |
24 | // Insert steps here to perform after app launch but before taking a screenshot,
25 | // such as logging into a test account or navigating somewhere in the app
26 |
27 | let attachment = XCTAttachment(screenshot: app.screenshot())
28 | attachment.name = "Launch Screen"
29 | attachment.lifetime = .keepAlways
30 | add(attachment)
31 | }
32 | }
33 |
--------------------------------------------------------------------------------
/Cherri.xcodeproj/xcuserdata/brandonjordan.xcuserdatad/xcschemes/xcschememanagement.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | SchemeUserState
6 |
7 | Cherri.xcscheme_^#shared#^_
8 |
9 | orderHint
10 | 0
11 |
12 | CodeEditor (Playground) 1.xcscheme
13 |
14 | isShown
15 |
16 | orderHint
17 | 2
18 |
19 | CodeEditor (Playground) 2.xcscheme
20 |
21 | isShown
22 |
23 | orderHint
24 | 3
25 |
26 | CodeEditor (Playground).xcscheme
27 |
28 | isShown
29 |
30 | orderHint
31 | 1
32 |
33 |
34 |
35 |
36 |
--------------------------------------------------------------------------------
/Cherri/CherriDocument.swift:
--------------------------------------------------------------------------------
1 | //
2 | // CherriDocument.swift
3 | // Cherri
4 | //
5 | // Created by Brandon Jordan on 12/3/23.
6 | //
7 |
8 | import SwiftUI
9 | import UniformTypeIdentifiers
10 |
11 | extension UTType {
12 | static var cherriSource: UTType {
13 | UTType(importedAs: "org.cherrilang.cherri.file")
14 | }
15 | }
16 |
17 | struct CherriDocument: FileDocument {
18 | var text: String
19 |
20 | init(text: String = "alert(\"Hello, Cherri!\")") {
21 | self.text = text
22 | }
23 |
24 | static var readableContentTypes: [UTType] { [.cherriSource] }
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 |
--------------------------------------------------------------------------------
/CherriTests/CherriTests.swift:
--------------------------------------------------------------------------------
1 | //
2 | // CherriTests.swift
3 | // CherriTests
4 | //
5 | // Created by Brandon Jordan on 12/3/23.
6 | //
7 |
8 | import XCTest
9 | @testable import Cherri
10 |
11 | final class CherriTests: XCTestCase {
12 |
13 | override func setUpWithError() throws {
14 | // Put setup code here. This method is called before the invocation of each test method in the class.
15 | }
16 |
17 | override func tearDownWithError() throws {
18 | // Put teardown code here. This method is called after the invocation of each test method in the class.
19 | }
20 |
21 | func testExample() throws {
22 | // This is an example of a functional test case.
23 | // Use XCTAssert and related functions to verify your tests produce the correct results.
24 | // Any test you write for XCTest can be annotated as throws and async.
25 | // Mark your test throws to produce an unexpected failure when your test encounters an uncaught error.
26 | // Mark your test async to allow awaiting for asynchronous code to complete. Check the results with assertions afterwards.
27 | }
28 |
29 | func testPerformanceExample() throws {
30 | // This is an example of a performance test case.
31 | self.measure {
32 | // Put the code you want to measure the time of here.
33 | }
34 | }
35 |
36 | }
37 |
--------------------------------------------------------------------------------
/Cherri/AboutView.swift:
--------------------------------------------------------------------------------
1 | //
2 | // AboutView.swift
3 | // Cherri
4 | //
5 | // Created by Brandon Jordan on 1/16/24.
6 | //
7 |
8 | import Foundation
9 | import SwiftUI
10 |
11 | struct AboutView: View {
12 | var body: some View {
13 | VStack(spacing: 8) {
14 | Image(nsImage: NSImage(named: "Icon")!)
15 | .scaleEffect(x: 0.5, y: 0.5, anchor: .center)
16 | .frame(maxWidth: 64, maxHeight: 64)
17 |
18 | Text("\(Bundle.main.appName)")
19 | .font(.system(size: 15, weight: .bold))
20 | .textSelection(.enabled)
21 |
22 | Text("Version \(Bundle.main.appVersionLong) (\(Bundle.main.appBuild))")
23 | .font(.system(size: 10))
24 | .textSelection(.enabled)
25 |
26 | Divider()
27 |
28 | Link("Learn more at cherrilang.org", destination: URL(string: "https://cherrilang.org/")!)
29 | }
30 | .frame(minWidth: 280, minHeight: 170)
31 | }
32 | }
33 |
34 | extension Bundle {
35 | public var appName: String { getInfo("CFBundleName") }
36 | public var appBuild: String { getInfo("CFBundleVersion") }
37 | public var appVersionLong: String { getInfo("CFBundleShortVersionString") }
38 |
39 | fileprivate func getInfo(_ str: String) -> String { infoDictionary?[str] as? String ?? "⚠️" }
40 | }
41 |
--------------------------------------------------------------------------------
/CherriUITests/CherriUITests.swift:
--------------------------------------------------------------------------------
1 | //
2 | // CherriUITests.swift
3 | // CherriUITests
4 | //
5 | // Created by Brandon Jordan on 12/3/23.
6 | //
7 |
8 | import XCTest
9 |
10 | final class CherriUITests: 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 XCTAssert and related functions to verify your tests produce the correct results.
31 | }
32 |
33 | func testLaunchPerformance() throws {
34 | if #available(macOS 10.15, iOS 13.0, tvOS 13.0, watchOS 7.0, *) {
35 | // This measures how long it takes to launch your application.
36 | measure(metrics: [XCTApplicationLaunchMetric()]) {
37 | XCUIApplication().launch()
38 | }
39 | }
40 | }
41 | }
42 |
--------------------------------------------------------------------------------
/Cherri/CherriSettings.swift:
--------------------------------------------------------------------------------
1 | //
2 | // CherriSettings.swift
3 | // Cherri
4 | //
5 | // Created by Brandon Jordan on 12/13/23.
6 | //
7 |
8 | import SwiftUI
9 |
10 | struct CherriSettings: View {
11 | @AppStorage("Cherri.theme")
12 | private var theme: CodeTheme = .dark
13 |
14 | @AppStorage("Cherri.shareWith")
15 | private var shareWith: ShareOption = .contacts
16 |
17 | @AppStorage("Cherri.showMinimap")
18 | private var showMinimap: Bool = true
19 |
20 | @AppStorage("Cherri.wrapText")
21 | private var wrapText: Bool = true
22 |
23 | var body: some View {
24 | Form {
25 | Picker("Editor Theme:", selection: $theme) {
26 | ForEach(CodeTheme.allCases) { level in
27 | Text(level.rawValue)
28 | }
29 | }
30 | .pickerStyle(.menu)
31 | Picker("Share compiled Shortcuts with:", selection: $shareWith) {
32 | ForEach(ShareOption.allCases) { level in
33 | Text(level.rawValue)
34 | }
35 | }
36 | .pickerStyle(.menu)
37 | Toggle("Show Minimap", isOn: $showMinimap)
38 | .toggleStyle(.checkbox)
39 | .padding(2)
40 | Toggle("Wrap Text", isOn: $wrapText)
41 | .toggleStyle(.checkbox)
42 | .padding(2)
43 | }
44 | .frame(width: 300)
45 | .navigationTitle("Cherri Settings")
46 | .padding(80)
47 | }
48 | }
49 |
50 | #Preview {
51 | CherriSettings()
52 | }
53 |
--------------------------------------------------------------------------------
/Cherri/Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CFBundleDocumentTypes
6 |
7 |
8 | CFBundleTypeIconFile
9 | Icon
10 | CFBundleTypeIconSystemGenerated
11 | 1
12 | CFBundleTypeName
13 | Cherri
14 | CFBundleTypeRole
15 | Editor
16 | LSHandlerRank
17 | Default
18 | LSItemContentTypes
19 |
20 | org.cherrilang.cherri.file
21 |
22 | NSDocumentClass
23 |
24 | NSUbiquitousDocumentUserActivityType
25 | $(PRODUCT_BUNDLE_IDENTIFIER).file
26 |
27 |
28 | UTImportedTypeDeclarations
29 |
30 |
31 | UTTypeConformsTo
32 |
33 | public.plain-text
34 |
35 | UTTypeDescription
36 | Cherri
37 | UTTypeIconFile
38 |
39 | UTTypeIcons
40 |
41 | UTTypeIconBackgroundName
42 |
43 | UTTypeIconBadgeName
44 | Icon
45 | UTTypeIconText
46 | cherri
47 |
48 | UTTypeIdentifier
49 | org.cherrilang.cherri.file
50 | UTTypeTagSpecification
51 |
52 | public.filename-extension
53 |
54 | cherri
55 |
56 |
57 |
58 |
59 |
60 |
61 |
--------------------------------------------------------------------------------
/Cherri/CherriApp.swift:
--------------------------------------------------------------------------------
1 | //
2 | // CherriApp.swift
3 | // Cherri
4 | //
5 | // Created by Brandon Jordan on 12/3/23.
6 | //
7 |
8 | import SwiftUI
9 | import Combine
10 |
11 | class EditorController: ObservableObject {
12 | @Published var currentContentView: ContentView? = nil
13 | func build() {
14 | currentContentView?.compileFile(openCompiled: false)
15 | }
16 | func buildAndOpen() {
17 | currentContentView?.compileFile(openCompiled: true)
18 | }
19 | }
20 |
21 | @main
22 | struct CherriApp: App {
23 | @NSApplicationDelegateAdaptor(AppDelegate.self) var appDelegate
24 | @StateObject private var editorController = EditorController()
25 |
26 | var body: some Scene {
27 | DocumentGroup(newDocument: CherriDocument()) { file in
28 | ContentView(document: file.$document, fileURL: file.fileURL ?? URL(fileURLWithPath: ""), editorController: editorController)
29 | .onAppear {}
30 | }.commands {
31 | CommandMenu("Build") {
32 | Button("Build", systemImage: "hammer.fill") {
33 | editorController.build()
34 | }
35 | .keyboardShortcut("b", modifiers: [.command])
36 | .disabled((editorController.currentContentView == nil))
37 | Button("Build & Open", systemImage: "play.fill") {
38 | editorController.buildAndOpen()
39 | }
40 | .keyboardShortcut("r", modifiers: [.command])
41 | .disabled((editorController.currentContentView == nil))
42 | }
43 | CommandGroup(replacing: .help) {
44 | Link("Documentation Site", destination: URL(string: "https://cherrilang.org/language/")!)
45 | }
46 | CommandGroup(replacing: CommandGroupPlacement.appInfo) {
47 | Button(action: {
48 | appDelegate.showAboutPanel()
49 | }) {
50 | Text("About \(Bundle.main.appName)")
51 | }
52 | }
53 | }
54 |
55 | Settings {
56 | CherriSettings()
57 | }
58 |
59 | }
60 | }
61 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 |
2 |
3 | # Cherri IDE
4 |
5 | IDE for the [Cherri programming language](https://github.com/electrikmilk/cherri).
6 |
7 |
8 |
9 | ## Features
10 |
11 | ### Document-based macOS app
12 |
13 | Create, edit, save, open, duplicate, rename, etc. Cherri files.
14 |
15 | ### Build & Run
16 | - 🔨 **Build:** Compile the current Cherri file into a Shortcut.
17 | - ▶️ **Run:** Compile, then open the compiled Shortcut.
18 |
19 | ### Inline Errors & Warnings
20 |
21 | 
22 | 
23 |
24 | ### Tabs
25 |
26 | Enable the tab bar in the Menubar in **View -> Show Tab Bar**. Click the plus button to create a new Cherri file.
27 |
28 | If you open a file and it does not open in a new tab, go to your **System Settings** -> **Desktop & Dock** -> Set **Prefer tabs when opening documents** to _Always_.
29 |
30 | 
31 |
32 | ### Document Type
33 |
34 | This app sets up `.cherri` files as a type of plain text document.
35 |
36 |
37 |
38 | If you have previews on, it shows the contents of the file.
39 |
40 | 
41 |
42 | ### Settings
43 |
44 | 
45 |
46 | ## Dependencies
47 |
48 | - [CodeEditorView](https://github.com/mchakravarty/CodeEditorView)
49 |
50 | ## How to run
51 |
52 | ```bash
53 | git clone --recursive https://github.com/electrikmilk/cherri-macos-app.git Cherri
54 | ```
55 |
56 | ### Requirements
57 |
58 | - XCode - Download from the Mac App Store.
59 | - Go - Install from Homebrew or [go.dev](https://go.dev/dl/).
60 |
61 | ### Run
62 |
63 | 1. Open `Cherri/Cherri.xcodeproj` in XCode.
64 | 2. Click the play icon button to build the project after it has been indexed.
65 |
66 | This should "install" the project on your Mac, at least temporarily. But if it disappears due to being an unsigned app, just follow the steps above to re-install.
67 |
--------------------------------------------------------------------------------
/Cherri/ContentView.swift:
--------------------------------------------------------------------------------
1 | //
2 | // ContentView.swift
3 | // Cherri
4 | //
5 | // Created by Brandon Jordan on 12/3/23.
6 | //
7 |
8 | import SwiftUI
9 |
10 | import LanguageSupport
11 | import CodeEditorView
12 |
13 | struct ContentView: View {
14 | @AppStorage("Cherri.theme")
15 | private var theme: CodeTheme = .dark
16 |
17 | @AppStorage("Cherri.shareWith")
18 | private var shareWith: ShareOption = .contacts
19 |
20 | @Binding var document: CherriDocument
21 | @State var fileURL: URL
22 | @State var shortcutURL: URL?
23 |
24 | @State var fileName: String = ""
25 | @State var shortcutName: String = ""
26 | @State var path: String = ""
27 |
28 | @Environment(\.colorScheme) private var colorScheme: ColorScheme
29 |
30 | @SceneStorage("editPosition") private var editPosition: CodeEditor.Position = CodeEditor.Position()
31 |
32 | @State private var messages: Set> = Set ()
33 |
34 | @State private var showPopover: Bool = false
35 |
36 | @AppStorage("Cherri.showMinimap")
37 | private var showMinimap: Bool = true
38 |
39 | @AppStorage("Cherri.wrapText")
40 | private var wrapText: Bool = true
41 |
42 | @State private var hasError: Bool = false
43 | @State private var hasWarnings: Bool = false
44 | @State private var compiling: Bool = false
45 | @State private var compiled: Bool = false
46 |
47 | @FocusState private var editorIsFocused: Bool
48 |
49 | var editorController: EditorController? = nil
50 |
51 | var body: some View {
52 | VStack {
53 | NavigationStack {
54 | if hasError {
55 | HStack {
56 | Image(systemName: "exclamationmark.triangle.fill")
57 | .foregroundColor(.red)
58 | Text("Unable to compile Shortcut.")
59 | }
60 | .fontWeight(.bold)
61 | .padding(EdgeInsets(top: 12, leading: 0, bottom: 5, trailing: 0))
62 | }
63 |
64 | CodeEditor(text: $document.text,
65 | position: $editPosition,
66 | messages: $messages,
67 | language: .swift(),
68 | layout: CodeEditor.LayoutConfiguration(showMinimap: showMinimap, wrapText: wrapText))
69 | .environment(\.codeEditorTheme, theme == .dark ? Theme.defaultDark : Theme.defaultLight)
70 | .focused($editorIsFocused)
71 | }.toolbar {
72 | HStack {
73 | if compiling {
74 | ProgressView()
75 | .progressViewStyle(CircularProgressViewStyle())
76 | .scaleEffect(x: 0.5, y: 0.5, anchor: .center)
77 | .padding(EdgeInsets(top: 5, leading: 5, bottom: 5, trailing: 0))
78 | } else {
79 | Button("Build", systemImage: "hammer.fill") {
80 | Task {
81 | compileFile(openCompiled: false)
82 | }
83 | }
84 | .buttonStyle(.automatic)
85 |
86 | Button("Run", systemImage: "play.fill") {
87 | Task {
88 | compileFile(openCompiled: true)
89 | }
90 | }.buttonStyle(.automatic)
91 |
92 | if hasError || hasWarnings || compiled {
93 | Divider()
94 | }
95 |
96 | if hasError {
97 | Image(systemName: "x.circle.fill")
98 | .foregroundColor(.red)
99 | Spacer()
100 | } else if compiled {
101 | Button("Compiled", systemImage: "checkmark.circle.fill") {
102 | NSWorkspace.shared
103 | .selectFile( "\(shortcutURL!)".replacingOccurrences(of: "%20", with: " "), inFileViewerRootedAtPath: "")
104 | }.foregroundColor(.green)
105 | }
106 |
107 | if hasWarnings {
108 | Image(systemName: "exclamationmark.triangle.fill")
109 | .foregroundColor(.orange)
110 | Spacer()
111 | }
112 | }
113 | }
114 | }
115 | }
116 | .frame(minWidth: 300, minHeight: 600)
117 | .onAppear {
118 | editorController?.currentContentView = self
119 | }
120 | }
121 |
122 | func parseFilepath() {
123 | let pathParts = fileURL.relativePath
124 | .replacingOccurrences(of: "file://", with: "")
125 | .split(separator: "/")
126 |
127 | fileName = "\(pathParts.last!)"
128 | path = fileURL.relativePath.replacingOccurrences(of: "/\(pathParts.last!)", with: "")
129 |
130 | shortcutName = fileName.replacingOccurrences(of: ".cherri", with: ".shortcut")
131 |
132 | let nameDefinitionSearch = /^#define name (.*?)\n/
133 | if let result = try? nameDefinitionSearch.firstMatch(in: "\(document.text)") {
134 | shortcutName = "\(result.1.replacingOccurrences(of: "%20", with: "")).shortcut"
135 | }
136 |
137 | shortcutURL = URL(string: "\(path)/\(shortcutName.replacingOccurrences(of: "%20", with: ""))")!
138 | }
139 |
140 | func compileFile(openCompiled: Bool) {
141 | compiled = false
142 | hasError = false
143 | hasWarnings = false
144 | compiling = true
145 |
146 | parseFilepath()
147 |
148 | messages.removeAll()
149 |
150 | let process = Process()
151 |
152 | let bundle = Bundle.main
153 | process.executableURL = bundle.url(forResource: "cherri_binary", withExtension: "")
154 | process.arguments = [fileURL.relativePath, "--no-ansi"]
155 | process.currentDirectoryURL = URL(fileURLWithPath: path)
156 |
157 | if openCompiled {
158 | process.arguments?.append("--open")
159 | }
160 | if shareWith == .anyone {
161 | process.arguments?.append("--share=anyone")
162 | }
163 |
164 | let pipe = Pipe()
165 | process.standardInput = nil
166 | process.standardOutput = pipe
167 | process.standardError = pipe
168 |
169 | process.launch()
170 |
171 | let data = pipe.fileHandleForReading.readDataToEndOfFile()
172 | let output = String(data: data, encoding: .utf8)!
173 |
174 | handleCompilerOutput(output: "\(output)\n\n")
175 |
176 | compiling = false
177 | }
178 |
179 | func handleCompilerOutput(output: String) {
180 | if output.contains("Warning:") {
181 | let matches = output.matches(of: /Warning: (?(.|\n)*?)\n\n/)
182 | if matches.count != 0 {
183 | hasWarnings = true
184 | }
185 | for match in matches {
186 | createMessage(message: String(match.message), summary: "Warning", category: Message.Category.warning)
187 | }
188 | }
189 | if output.contains("Error:") || output.contains("panic:") {
190 | hasError = true
191 |
192 | let errorSearch = /Error: (?(.|\n)*?)\n\n/
193 | if let error = try? errorSearch.firstMatch(in: output) {
194 | createMessage(message: String(error.1), summary: "Error", category: Message.Category.error)
195 | }
196 | }
197 | if !hasError {
198 | compiled = true
199 | }
200 | }
201 |
202 | func createMessage(message: String, summary: String, category: Message.Category) {
203 | let lineColSearch = /(\d+):(\d+)/
204 | var messageContent = message
205 | var line = "1"
206 | var col = "1"
207 | if let result = try? lineColSearch.firstMatch(in: messageContent) {
208 | line = "\(result.1)"
209 | col = "\(result.2)"
210 |
211 | let replaceLineCol = " ("+line+":"+col+")"
212 | messageContent = messageContent.replacingOccurrences(of: replaceLineCol, with: "")
213 | }
214 |
215 | messageContent = messageContent.trimmingCharacters(in: NSCharacterSet.whitespacesAndNewlines)
216 |
217 | messages.insert(TextLocated(location: TextLocation(oneBasedLine: Int(line) ?? 1, column: Int(col) ?? 1),
218 | entity: Message(category: category,
219 | length: 1,
220 | summary: summary,
221 | description: NSAttributedString(string: messageContent))))
222 | }
223 | }
224 |
225 | struct ContentView_Previews: PreviewProvider {
226 | static var previews: some View {
227 | ContentView(document: .constant(CherriDocument(text: "")), fileURL: URL(filePath: ""))
228 | .preferredColorScheme(.dark)
229 | }
230 | }
231 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | GNU GENERAL PUBLIC LICENSE
2 | Version 2, June 1991
3 |
4 | Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
5 | 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
6 | Everyone is permitted to copy and distribute verbatim copies
7 | of this license document, but changing it is not allowed.
8 |
9 | Preamble
10 |
11 | The licenses for most software are designed to take away your
12 | freedom to share and change it. By contrast, the GNU General Public
13 | License is intended to guarantee your freedom to share and change free
14 | software--to make sure the software is free for all its users. This
15 | General Public License applies to most of the Free Software
16 | Foundation's software and to any other program whose authors commit to
17 | using it. (Some other Free Software Foundation software is covered by
18 | the GNU Lesser General Public License instead.) You can apply it to
19 | your programs, too.
20 |
21 | When we speak of free software, we are referring to freedom, not
22 | price. Our General Public Licenses are designed to make sure that you
23 | have the freedom to distribute copies of free software (and charge for
24 | this service if you wish), that you receive source code or can get it
25 | if you want it, that you can change the software or use pieces of it
26 | in new free programs; and that you know you can do these things.
27 |
28 | To protect your rights, we need to make restrictions that forbid
29 | anyone to deny you these rights or to ask you to surrender the rights.
30 | These restrictions translate to certain responsibilities for you if you
31 | distribute copies of the software, or if you modify it.
32 |
33 | For example, if you distribute copies of such a program, whether
34 | gratis or for a fee, you must give the recipients all the rights that
35 | you have. You must make sure that they, too, receive or can get the
36 | source code. And you must show them these terms so they know their
37 | rights.
38 |
39 | We protect your rights with two steps: (1) copyright the software, and
40 | (2) offer you this license which gives you legal permission to copy,
41 | distribute and/or modify the software.
42 |
43 | Also, for each author's protection and ours, we want to make certain
44 | that everyone understands that there is no warranty for this free
45 | software. If the software is modified by someone else and passed on, we
46 | want its recipients to know that what they have is not the original, so
47 | that any problems introduced by others will not reflect on the original
48 | authors' reputations.
49 |
50 | Finally, any free program is threatened constantly by software
51 | patents. We wish to avoid the danger that redistributors of a free
52 | program will individually obtain patent licenses, in effect making the
53 | program proprietary. To prevent this, we have made it clear that any
54 | patent must be licensed for everyone's free use or not licensed at all.
55 |
56 | The precise terms and conditions for copying, distribution and
57 | modification follow.
58 |
59 | GNU GENERAL PUBLIC LICENSE
60 | TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
61 |
62 | 0. This License applies to any program or other work which contains
63 | a notice placed by the copyright holder saying it may be distributed
64 | under the terms of this General Public License. The "Program", below,
65 | refers to any such program or work, and a "work based on the Program"
66 | means either the Program or any derivative work under copyright law:
67 | that is to say, a work containing the Program or a portion of it,
68 | either verbatim or with modifications and/or translated into another
69 | language. (Hereinafter, translation is included without limitation in
70 | the term "modification".) Each licensee is addressed as "you".
71 |
72 | Activities other than copying, distribution and modification are not
73 | covered by this License; they are outside its scope. The act of
74 | running the Program is not restricted, and the output from the Program
75 | is covered only if its contents constitute a work based on the
76 | Program (independent of having been made by running the Program).
77 | Whether that is true depends on what the Program does.
78 |
79 | 1. You may copy and distribute verbatim copies of the Program's
80 | source code as you receive it, in any medium, provided that you
81 | conspicuously and appropriately publish on each copy an appropriate
82 | copyright notice and disclaimer of warranty; keep intact all the
83 | notices that refer to this License and to the absence of any warranty;
84 | and give any other recipients of the Program a copy of this License
85 | along with the Program.
86 |
87 | You may charge a fee for the physical act of transferring a copy, and
88 | you may at your option offer warranty protection in exchange for a fee.
89 |
90 | 2. You may modify your copy or copies of the Program or any portion
91 | of it, thus forming a work based on the Program, and copy and
92 | distribute such modifications or work under the terms of Section 1
93 | above, provided that you also meet all of these conditions:
94 |
95 | a) You must cause the modified files to carry prominent notices
96 | stating that you changed the files and the date of any change.
97 |
98 | b) You must cause any work that you distribute or publish, that in
99 | whole or in part contains or is derived from the Program or any
100 | part thereof, to be licensed as a whole at no charge to all third
101 | parties under the terms of this License.
102 |
103 | c) If the modified program normally reads commands interactively
104 | when run, you must cause it, when started running for such
105 | interactive use in the most ordinary way, to print or display an
106 | announcement including an appropriate copyright notice and a
107 | notice that there is no warranty (or else, saying that you provide
108 | a warranty) and that users may redistribute the program under
109 | these conditions, and telling the user how to view a copy of this
110 | License. (Exception: if the Program itself is interactive but
111 | does not normally print such an announcement, your work based on
112 | the Program is not required to print an announcement.)
113 |
114 | These requirements apply to the modified work as a whole. If
115 | identifiable sections of that work are not derived from the Program,
116 | and can be reasonably considered independent and separate works in
117 | themselves, then this License, and its terms, do not apply to those
118 | sections when you distribute them as separate works. But when you
119 | distribute the same sections as part of a whole which is a work based
120 | on the Program, the distribution of the whole must be on the terms of
121 | this License, whose permissions for other licensees extend to the
122 | entire whole, and thus to each and every part regardless of who wrote it.
123 |
124 | Thus, it is not the intent of this section to claim rights or contest
125 | your rights to work written entirely by you; rather, the intent is to
126 | exercise the right to control the distribution of derivative or
127 | collective works based on the Program.
128 |
129 | In addition, mere aggregation of another work not based on the Program
130 | with the Program (or with a work based on the Program) on a volume of
131 | a storage or distribution medium does not bring the other work under
132 | the scope of this License.
133 |
134 | 3. You may copy and distribute the Program (or a work based on it,
135 | under Section 2) in object code or executable form under the terms of
136 | Sections 1 and 2 above provided that you also do one of the following:
137 |
138 | a) Accompany it with the complete corresponding machine-readable
139 | source code, which must be distributed under the terms of Sections
140 | 1 and 2 above on a medium customarily used for software interchange; or,
141 |
142 | b) Accompany it with a written offer, valid for at least three
143 | years, to give any third party, for a charge no more than your
144 | cost of physically performing source distribution, a complete
145 | machine-readable copy of the corresponding source code, to be
146 | distributed under the terms of Sections 1 and 2 above on a medium
147 | customarily used for software interchange; or,
148 |
149 | c) Accompany it with the information you received as to the offer
150 | to distribute corresponding source code. (This alternative is
151 | allowed only for noncommercial distribution and only if you
152 | received the program in object code or executable form with such
153 | an offer, in accord with Subsection b above.)
154 |
155 | The source code for a work means the preferred form of the work for
156 | making modifications to it. For an executable work, complete source
157 | code means all the source code for all modules it contains, plus any
158 | associated interface definition files, plus the scripts used to
159 | control compilation and installation of the executable. However, as a
160 | special exception, the source code distributed need not include
161 | anything that is normally distributed (in either source or binary
162 | form) with the major components (compiler, kernel, and so on) of the
163 | operating system on which the executable runs, unless that component
164 | itself accompanies the executable.
165 |
166 | If distribution of executable or object code is made by offering
167 | access to copy from a designated place, then offering equivalent
168 | access to copy the source code from the same place counts as
169 | distribution of the source code, even though third parties are not
170 | compelled to copy the source along with the object code.
171 |
172 | 4. You may not copy, modify, sublicense, or distribute the Program
173 | except as expressly provided under this License. Any attempt
174 | otherwise to copy, modify, sublicense or distribute the Program is
175 | void, and will automatically terminate your rights under this License.
176 | However, parties who have received copies, or rights, from you under
177 | this License will not have their licenses terminated so long as such
178 | parties remain in full compliance.
179 |
180 | 5. You are not required to accept this License, since you have not
181 | signed it. However, nothing else grants you permission to modify or
182 | distribute the Program or its derivative works. These actions are
183 | prohibited by law if you do not accept this License. Therefore, by
184 | modifying or distributing the Program (or any work based on the
185 | Program), you indicate your acceptance of this License to do so, and
186 | all its terms and conditions for copying, distributing or modifying
187 | the Program or works based on it.
188 |
189 | 6. Each time you redistribute the Program (or any work based on the
190 | Program), the recipient automatically receives a license from the
191 | original licensor to copy, distribute or modify the Program subject to
192 | these terms and conditions. You may not impose any further
193 | restrictions on the recipients' exercise of the rights granted herein.
194 | You are not responsible for enforcing compliance by third parties to
195 | this License.
196 |
197 | 7. If, as a consequence of a court judgment or allegation of patent
198 | infringement or for any other reason (not limited to patent issues),
199 | conditions are imposed on you (whether by court order, agreement or
200 | otherwise) that contradict the conditions of this License, they do not
201 | excuse you from the conditions of this License. If you cannot
202 | distribute so as to satisfy simultaneously your obligations under this
203 | License and any other pertinent obligations, then as a consequence you
204 | may not distribute the Program at all. For example, if a patent
205 | license would not permit royalty-free redistribution of the Program by
206 | all those who receive copies directly or indirectly through you, then
207 | the only way you could satisfy both it and this License would be to
208 | refrain entirely from distribution of the Program.
209 |
210 | If any portion of this section is held invalid or unenforceable under
211 | any particular circumstance, the balance of the section is intended to
212 | apply and the section as a whole is intended to apply in other
213 | circumstances.
214 |
215 | It is not the purpose of this section to induce you to infringe any
216 | patents or other property right claims or to contest validity of any
217 | such claims; this section has the sole purpose of protecting the
218 | integrity of the free software distribution system, which is
219 | implemented by public license practices. Many people have made
220 | generous contributions to the wide range of software distributed
221 | through that system in reliance on consistent application of that
222 | system; it is up to the author/donor to decide if he or she is willing
223 | to distribute software through any other system and a licensee cannot
224 | impose that choice.
225 |
226 | This section is intended to make thoroughly clear what is believed to
227 | be a consequence of the rest of this License.
228 |
229 | 8. If the distribution and/or use of the Program is restricted in
230 | certain countries either by patents or by copyrighted interfaces, the
231 | original copyright holder who places the Program under this License
232 | may add an explicit geographical distribution limitation excluding
233 | those countries, so that distribution is permitted only in or among
234 | countries not thus excluded. In such case, this License incorporates
235 | the limitation as if written in the body of this License.
236 |
237 | 9. The Free Software Foundation may publish revised and/or new versions
238 | of the General Public License from time to time. Such new versions will
239 | be similar in spirit to the present version, but may differ in detail to
240 | address new problems or concerns.
241 |
242 | Each version is given a distinguishing version number. If the Program
243 | specifies a version number of this License which applies to it and "any
244 | later version", you have the option of following the terms and conditions
245 | either of that version or of any later version published by the Free
246 | Software Foundation. If the Program does not specify a version number of
247 | this License, you may choose any version ever published by the Free Software
248 | Foundation.
249 |
250 | 10. If you wish to incorporate parts of the Program into other free
251 | programs whose distribution conditions are different, write to the author
252 | to ask for permission. For software which is copyrighted by the Free
253 | Software Foundation, write to the Free Software Foundation; we sometimes
254 | make exceptions for this. Our decision will be guided by the two goals
255 | of preserving the free status of all derivatives of our free software and
256 | of promoting the sharing and reuse of software generally.
257 |
258 | NO WARRANTY
259 |
260 | 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
261 | FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
262 | OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
263 | PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
264 | OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
265 | MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
266 | TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
267 | PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
268 | REPAIR OR CORRECTION.
269 |
270 | 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
271 | WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
272 | REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
273 | INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
274 | OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
275 | TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
276 | YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
277 | PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
278 | POSSIBILITY OF SUCH DAMAGES.
279 |
280 | END OF TERMS AND CONDITIONS
281 |
282 | How to Apply These Terms to Your New Programs
283 |
284 | If you develop a new program, and you want it to be of the greatest
285 | possible use to the public, the best way to achieve this is to make it
286 | free software which everyone can redistribute and change under these terms.
287 |
288 | To do so, attach the following notices to the program. It is safest
289 | to attach them to the start of each source file to most effectively
290 | convey the exclusion of warranty; and each file should have at least
291 | the "copyright" line and a pointer to where the full notice is found.
292 |
293 |
294 | Copyright (C)
295 |
296 | This program is free software; you can redistribute it and/or modify
297 | it under the terms of the GNU General Public License as published by
298 | the Free Software Foundation; either version 2 of the License, or
299 | (at your option) any later version.
300 |
301 | This program is distributed in the hope that it will be useful,
302 | but WITHOUT ANY WARRANTY; without even the implied warranty of
303 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
304 | GNU General Public License for more details.
305 |
306 | You should have received a copy of the GNU General Public License along
307 | with this program; if not, write to the Free Software Foundation, Inc.,
308 | 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
309 |
310 | Also add information on how to contact you by electronic and paper mail.
311 |
312 | If the program is interactive, make it output a short notice like this
313 | when it starts in an interactive mode:
314 |
315 | Gnomovision version 69, Copyright (C) year name of author
316 | Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
317 | This is free software, and you are welcome to redistribute it
318 | under certain conditions; type `show c' for details.
319 |
320 | The hypothetical commands `show w' and `show c' should show the appropriate
321 | parts of the General Public License. Of course, the commands you use may
322 | be called something other than `show w' and `show c'; they could even be
323 | mouse-clicks or menu items--whatever suits your program.
324 |
325 | You should also get your employer (if you work as a programmer) or your
326 | school, if any, to sign a "copyright disclaimer" for the program, if
327 | necessary. Here is a sample; alter the names:
328 |
329 | Yoyodyne, Inc., hereby disclaims all copyright interest in the program
330 | `Gnomovision' (which makes passes at compilers) written by James Hacker.
331 |
332 | , 1 April 1989
333 | Ty Coon, President of Vice
334 |
335 | This General Public License does not permit incorporating your program into
336 | proprietary programs. If your program is a subroutine library, you may
337 | consider it more useful to permit linking proprietary applications with the
338 | library. If this is what you want to do, use the GNU Lesser General
339 | Public License instead of this License.
340 |
--------------------------------------------------------------------------------
/Cherri.xcodeproj/project.pbxproj:
--------------------------------------------------------------------------------
1 | // !$*UTF8*$!
2 | {
3 | archiveVersion = 1;
4 | classes = {
5 | };
6 | objectVersion = 56;
7 | objects = {
8 |
9 | /* Begin PBXBuildFile section */
10 | 720DA3C02EDBDEC3000086D1 /* CodeTheme.swift in Sources */ = {isa = PBXBuildFile; fileRef = 720DA3BE2EDBDEC2000086D1 /* CodeTheme.swift */; };
11 | 720DA3C12EDBDEC3000086D1 /* MessageEntry.swift in Sources */ = {isa = PBXBuildFile; fileRef = 720DA3BF2EDBDEC2000086D1 /* MessageEntry.swift */; };
12 | 720DA3C42EDBDEDF000086D1 /* DocumentState.swift in Sources */ = {isa = PBXBuildFile; fileRef = 720DA3C22EDBDEDF000086D1 /* DocumentState.swift */; };
13 | 720DA3C52EDBDEDF000086D1 /* ShareOption.swift in Sources */ = {isa = PBXBuildFile; fileRef = 720DA3C32EDBDEDF000086D1 /* ShareOption.swift */; };
14 | 72213BA22B1D159C00590D99 /* CherriApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 72213BA12B1D159C00590D99 /* CherriApp.swift */; };
15 | 72213BA42B1D159C00590D99 /* CherriDocument.swift in Sources */ = {isa = PBXBuildFile; fileRef = 72213BA32B1D159C00590D99 /* CherriDocument.swift */; };
16 | 72213BA62B1D159C00590D99 /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 72213BA52B1D159C00590D99 /* ContentView.swift */; };
17 | 72213BA82B1D159E00590D99 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 72213BA72B1D159E00590D99 /* Assets.xcassets */; };
18 | 72213BAB2B1D159E00590D99 /* Preview Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 72213BAA2B1D159E00590D99 /* Preview Assets.xcassets */; };
19 | 72213BB72B1D159E00590D99 /* CherriTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 72213BB62B1D159E00590D99 /* CherriTests.swift */; };
20 | 72213BC12B1D159E00590D99 /* CherriUITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 72213BC02B1D159E00590D99 /* CherriUITests.swift */; };
21 | 72213BC32B1D159E00590D99 /* CherriUITestsLaunchTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 72213BC22B1D159E00590D99 /* CherriUITestsLaunchTests.swift */; };
22 | 72213BD12B1D17BE00590D99 /* CodeEditorView in Frameworks */ = {isa = PBXBuildFile; productRef = 72213BD02B1D17BE00590D99 /* CodeEditorView */; };
23 | 72213BD32B1D17BE00590D99 /* LanguageSupport in Frameworks */ = {isa = PBXBuildFile; productRef = 72213BD22B1D17BE00590D99 /* LanguageSupport */; };
24 | 724298CC2E89844900BF5234 /* CherriAppIcon.icon in Resources */ = {isa = PBXBuildFile; fileRef = 724298CB2E89844900BF5234 /* CherriAppIcon.icon */; };
25 | 728358452D5EB38A007F02AD /* cherri_binary in Resources */ = {isa = PBXBuildFile; fileRef = 72213BD42B1D24EB00590D99 /* cherri_binary */; };
26 | 72D4674F2B578C9A00547002 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 72D4674E2B578C9A00547002 /* AppDelegate.swift */; };
27 | 72D467512B578CB300547002 /* AboutView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 72D467502B578CB300547002 /* AboutView.swift */; };
28 | 72F863B82B2A870C00A98DE6 /* CherriSettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = 72F863B72B2A870C00A98DE6 /* CherriSettings.swift */; };
29 | /* End PBXBuildFile section */
30 |
31 | /* Begin PBXContainerItemProxy section */
32 | 72213BB32B1D159E00590D99 /* PBXContainerItemProxy */ = {
33 | isa = PBXContainerItemProxy;
34 | containerPortal = 72213B962B1D159B00590D99 /* Project object */;
35 | proxyType = 1;
36 | remoteGlobalIDString = 72213B9D2B1D159C00590D99;
37 | remoteInfo = Cherri;
38 | };
39 | 72213BBD2B1D159E00590D99 /* PBXContainerItemProxy */ = {
40 | isa = PBXContainerItemProxy;
41 | containerPortal = 72213B962B1D159B00590D99 /* Project object */;
42 | proxyType = 1;
43 | remoteGlobalIDString = 72213B9D2B1D159C00590D99;
44 | remoteInfo = Cherri;
45 | };
46 | /* End PBXContainerItemProxy section */
47 |
48 | /* Begin PBXFileReference section */
49 | 720DA3BE2EDBDEC2000086D1 /* CodeTheme.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CodeTheme.swift; sourceTree = ""; };
50 | 720DA3BF2EDBDEC2000086D1 /* MessageEntry.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MessageEntry.swift; sourceTree = ""; };
51 | 720DA3C22EDBDEDF000086D1 /* DocumentState.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DocumentState.swift; sourceTree = ""; };
52 | 720DA3C32EDBDEDF000086D1 /* ShareOption.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ShareOption.swift; sourceTree = ""; };
53 | 72213B9E2B1D159C00590D99 /* Cherri.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Cherri.app; sourceTree = BUILT_PRODUCTS_DIR; };
54 | 72213BA12B1D159C00590D99 /* CherriApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CherriApp.swift; sourceTree = ""; };
55 | 72213BA32B1D159C00590D99 /* CherriDocument.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CherriDocument.swift; sourceTree = ""; };
56 | 72213BA52B1D159C00590D99 /* ContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentView.swift; sourceTree = ""; };
57 | 72213BA72B1D159E00590D99 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; };
58 | 72213BAA2B1D159E00590D99 /* Preview Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = "Preview Assets.xcassets"; sourceTree = ""; };
59 | 72213BAC2B1D159E00590D99 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
60 | 72213BAD2B1D159E00590D99 /* Cherri.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = Cherri.entitlements; sourceTree = ""; };
61 | 72213BB22B1D159E00590D99 /* CherriTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = CherriTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
62 | 72213BB62B1D159E00590D99 /* CherriTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CherriTests.swift; sourceTree = ""; };
63 | 72213BBC2B1D159E00590D99 /* CherriUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = CherriUITests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
64 | 72213BC02B1D159E00590D99 /* CherriUITests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CherriUITests.swift; sourceTree = ""; };
65 | 72213BC22B1D159E00590D99 /* CherriUITestsLaunchTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CherriUITestsLaunchTests.swift; sourceTree = ""; };
66 | 72213BD42B1D24EB00590D99 /* cherri_binary */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.executable"; path = cherri_binary; sourceTree = ""; };
67 | 724298CB2E89844900BF5234 /* CherriAppIcon.icon */ = {isa = PBXFileReference; lastKnownFileType = folder.iconcomposer.icon; path = CherriAppIcon.icon; sourceTree = ""; };
68 | 72D4674E2B578C9A00547002 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; };
69 | 72D467502B578CB300547002 /* AboutView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AboutView.swift; sourceTree = ""; };
70 | 72F863B72B2A870C00A98DE6 /* CherriSettings.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CherriSettings.swift; sourceTree = ""; };
71 | /* End PBXFileReference section */
72 |
73 | /* Begin PBXFrameworksBuildPhase section */
74 | 72213B9B2B1D159C00590D99 /* Frameworks */ = {
75 | isa = PBXFrameworksBuildPhase;
76 | buildActionMask = 2147483647;
77 | files = (
78 | 72213BD32B1D17BE00590D99 /* LanguageSupport in Frameworks */,
79 | 72213BD12B1D17BE00590D99 /* CodeEditorView in Frameworks */,
80 | );
81 | runOnlyForDeploymentPostprocessing = 0;
82 | };
83 | 72213BAF2B1D159E00590D99 /* Frameworks */ = {
84 | isa = PBXFrameworksBuildPhase;
85 | buildActionMask = 2147483647;
86 | files = (
87 | );
88 | runOnlyForDeploymentPostprocessing = 0;
89 | };
90 | 72213BB92B1D159E00590D99 /* Frameworks */ = {
91 | isa = PBXFrameworksBuildPhase;
92 | buildActionMask = 2147483647;
93 | files = (
94 | );
95 | runOnlyForDeploymentPostprocessing = 0;
96 | };
97 | /* End PBXFrameworksBuildPhase section */
98 |
99 | /* Begin PBXGroup section */
100 | 72213B952B1D159B00590D99 = {
101 | isa = PBXGroup;
102 | children = (
103 | 72213BA02B1D159C00590D99 /* Cherri */,
104 | 72213BB52B1D159E00590D99 /* CherriTests */,
105 | 72213BBF2B1D159E00590D99 /* CherriUITests */,
106 | 72213B9F2B1D159C00590D99 /* Products */,
107 | );
108 | sourceTree = "";
109 | };
110 | 72213B9F2B1D159C00590D99 /* Products */ = {
111 | isa = PBXGroup;
112 | children = (
113 | 72213B9E2B1D159C00590D99 /* Cherri.app */,
114 | 72213BB22B1D159E00590D99 /* CherriTests.xctest */,
115 | 72213BBC2B1D159E00590D99 /* CherriUITests.xctest */,
116 | );
117 | name = Products;
118 | sourceTree = "";
119 | };
120 | 72213BA02B1D159C00590D99 /* Cherri */ = {
121 | isa = PBXGroup;
122 | children = (
123 | 72213BA12B1D159C00590D99 /* CherriApp.swift */,
124 | 72D4674E2B578C9A00547002 /* AppDelegate.swift */,
125 | 72D467502B578CB300547002 /* AboutView.swift */,
126 | 72213BA32B1D159C00590D99 /* CherriDocument.swift */,
127 | 72213BD42B1D24EB00590D99 /* cherri_binary */,
128 | 720DA3BE2EDBDEC2000086D1 /* CodeTheme.swift */,
129 | 720DA3BF2EDBDEC2000086D1 /* MessageEntry.swift */,
130 | 720DA3C22EDBDEDF000086D1 /* DocumentState.swift */,
131 | 720DA3C32EDBDEDF000086D1 /* ShareOption.swift */,
132 | 72213BA52B1D159C00590D99 /* ContentView.swift */,
133 | 72213BA72B1D159E00590D99 /* Assets.xcassets */,
134 | 72213BAC2B1D159E00590D99 /* Info.plist */,
135 | 72213BAD2B1D159E00590D99 /* Cherri.entitlements */,
136 | 72213BA92B1D159E00590D99 /* Preview Content */,
137 | 72F863B72B2A870C00A98DE6 /* CherriSettings.swift */,
138 | 724298CB2E89844900BF5234 /* CherriAppIcon.icon */,
139 | );
140 | path = Cherri;
141 | sourceTree = "";
142 | };
143 | 72213BA92B1D159E00590D99 /* Preview Content */ = {
144 | isa = PBXGroup;
145 | children = (
146 | 72213BAA2B1D159E00590D99 /* Preview Assets.xcassets */,
147 | );
148 | path = "Preview Content";
149 | sourceTree = "";
150 | };
151 | 72213BB52B1D159E00590D99 /* CherriTests */ = {
152 | isa = PBXGroup;
153 | children = (
154 | 72213BB62B1D159E00590D99 /* CherriTests.swift */,
155 | );
156 | path = CherriTests;
157 | sourceTree = "";
158 | };
159 | 72213BBF2B1D159E00590D99 /* CherriUITests */ = {
160 | isa = PBXGroup;
161 | children = (
162 | 72213BC02B1D159E00590D99 /* CherriUITests.swift */,
163 | 72213BC22B1D159E00590D99 /* CherriUITestsLaunchTests.swift */,
164 | );
165 | path = CherriUITests;
166 | sourceTree = "";
167 | };
168 | /* End PBXGroup section */
169 |
170 | /* Begin PBXNativeTarget section */
171 | 72213B9D2B1D159C00590D99 /* Cherri */ = {
172 | isa = PBXNativeTarget;
173 | buildConfigurationList = 72213BC62B1D159E00590D99 /* Build configuration list for PBXNativeTarget "Cherri" */;
174 | buildPhases = (
175 | 72213B9A2B1D159C00590D99 /* Sources */,
176 | 72213B9B2B1D159C00590D99 /* Frameworks */,
177 | 7283584A2D5EBB28007F02AD /* ShellScript */,
178 | 72213B9C2B1D159C00590D99 /* Resources */,
179 | );
180 | buildRules = (
181 | );
182 | dependencies = (
183 | );
184 | name = Cherri;
185 | packageProductDependencies = (
186 | 72213BD02B1D17BE00590D99 /* CodeEditorView */,
187 | 72213BD22B1D17BE00590D99 /* LanguageSupport */,
188 | );
189 | productName = Cherri;
190 | productReference = 72213B9E2B1D159C00590D99 /* Cherri.app */;
191 | productType = "com.apple.product-type.application";
192 | };
193 | 72213BB12B1D159E00590D99 /* CherriTests */ = {
194 | isa = PBXNativeTarget;
195 | buildConfigurationList = 72213BC92B1D159E00590D99 /* Build configuration list for PBXNativeTarget "CherriTests" */;
196 | buildPhases = (
197 | 72213BAE2B1D159E00590D99 /* Sources */,
198 | 72213BAF2B1D159E00590D99 /* Frameworks */,
199 | 72213BB02B1D159E00590D99 /* Resources */,
200 | );
201 | buildRules = (
202 | );
203 | dependencies = (
204 | 72213BB42B1D159E00590D99 /* PBXTargetDependency */,
205 | );
206 | name = CherriTests;
207 | productName = CherriTests;
208 | productReference = 72213BB22B1D159E00590D99 /* CherriTests.xctest */;
209 | productType = "com.apple.product-type.bundle.unit-test";
210 | };
211 | 72213BBB2B1D159E00590D99 /* CherriUITests */ = {
212 | isa = PBXNativeTarget;
213 | buildConfigurationList = 72213BCC2B1D159E00590D99 /* Build configuration list for PBXNativeTarget "CherriUITests" */;
214 | buildPhases = (
215 | 72213BB82B1D159E00590D99 /* Sources */,
216 | 72213BB92B1D159E00590D99 /* Frameworks */,
217 | 72213BBA2B1D159E00590D99 /* Resources */,
218 | );
219 | buildRules = (
220 | );
221 | dependencies = (
222 | 72213BBE2B1D159E00590D99 /* PBXTargetDependency */,
223 | );
224 | name = CherriUITests;
225 | productName = CherriUITests;
226 | productReference = 72213BBC2B1D159E00590D99 /* CherriUITests.xctest */;
227 | productType = "com.apple.product-type.bundle.ui-testing";
228 | };
229 | /* End PBXNativeTarget section */
230 |
231 | /* Begin PBXProject section */
232 | 72213B962B1D159B00590D99 /* Project object */ = {
233 | isa = PBXProject;
234 | attributes = {
235 | BuildIndependentTargetsInParallel = 1;
236 | LastSwiftUpdateCheck = 1500;
237 | LastUpgradeCheck = 1600;
238 | TargetAttributes = {
239 | 72213B9D2B1D159C00590D99 = {
240 | CreatedOnToolsVersion = 15.0.1;
241 | };
242 | 72213BB12B1D159E00590D99 = {
243 | CreatedOnToolsVersion = 15.0.1;
244 | TestTargetID = 72213B9D2B1D159C00590D99;
245 | };
246 | 72213BBB2B1D159E00590D99 = {
247 | CreatedOnToolsVersion = 15.0.1;
248 | TestTargetID = 72213B9D2B1D159C00590D99;
249 | };
250 | };
251 | };
252 | buildConfigurationList = 72213B992B1D159B00590D99 /* Build configuration list for PBXProject "Cherri" */;
253 | compatibilityVersion = "Xcode 14.0";
254 | developmentRegion = en;
255 | hasScannedForEncodings = 0;
256 | knownRegions = (
257 | en,
258 | Base,
259 | );
260 | mainGroup = 72213B952B1D159B00590D99;
261 | packageReferences = (
262 | 72213BCF2B1D17BE00590D99 /* XCRemoteSwiftPackageReference "CodeEditorView" */,
263 | );
264 | productRefGroup = 72213B9F2B1D159C00590D99 /* Products */;
265 | projectDirPath = "";
266 | projectRoot = "";
267 | targets = (
268 | 72213B9D2B1D159C00590D99 /* Cherri */,
269 | 72213BB12B1D159E00590D99 /* CherriTests */,
270 | 72213BBB2B1D159E00590D99 /* CherriUITests */,
271 | );
272 | };
273 | /* End PBXProject section */
274 |
275 | /* Begin PBXResourcesBuildPhase section */
276 | 72213B9C2B1D159C00590D99 /* Resources */ = {
277 | isa = PBXResourcesBuildPhase;
278 | buildActionMask = 2147483647;
279 | files = (
280 | 724298CC2E89844900BF5234 /* CherriAppIcon.icon in Resources */,
281 | 728358452D5EB38A007F02AD /* cherri_binary in Resources */,
282 | 72213BAB2B1D159E00590D99 /* Preview Assets.xcassets in Resources */,
283 | 72213BA82B1D159E00590D99 /* Assets.xcassets in Resources */,
284 | );
285 | runOnlyForDeploymentPostprocessing = 0;
286 | };
287 | 72213BB02B1D159E00590D99 /* Resources */ = {
288 | isa = PBXResourcesBuildPhase;
289 | buildActionMask = 2147483647;
290 | files = (
291 | );
292 | runOnlyForDeploymentPostprocessing = 0;
293 | };
294 | 72213BBA2B1D159E00590D99 /* Resources */ = {
295 | isa = PBXResourcesBuildPhase;
296 | buildActionMask = 2147483647;
297 | files = (
298 | );
299 | runOnlyForDeploymentPostprocessing = 0;
300 | };
301 | /* End PBXResourcesBuildPhase section */
302 |
303 | /* Begin PBXShellScriptBuildPhase section */
304 | 7283584A2D5EBB28007F02AD /* ShellScript */ = {
305 | isa = PBXShellScriptBuildPhase;
306 | alwaysOutOfDate = 1;
307 | buildActionMask = 2147483647;
308 | files = (
309 | );
310 | inputFileListPaths = (
311 | );
312 | inputPaths = (
313 | "$(SRCROOT)/Compiler",
314 | );
315 | outputFileListPaths = (
316 | );
317 | outputPaths = (
318 | );
319 | runOnlyForDeploymentPostprocessing = 0;
320 | shellPath = /bin/sh;
321 | shellScript = "\"${PROJECT_DIR}/build_complier.sh\"\n";
322 | };
323 | /* End PBXShellScriptBuildPhase section */
324 |
325 | /* Begin PBXSourcesBuildPhase section */
326 | 72213B9A2B1D159C00590D99 /* Sources */ = {
327 | isa = PBXSourcesBuildPhase;
328 | buildActionMask = 2147483647;
329 | files = (
330 | 72213BA22B1D159C00590D99 /* CherriApp.swift in Sources */,
331 | 72F863B82B2A870C00A98DE6 /* CherriSettings.swift in Sources */,
332 | 72213BA42B1D159C00590D99 /* CherriDocument.swift in Sources */,
333 | 72D4674F2B578C9A00547002 /* AppDelegate.swift in Sources */,
334 | 720DA3C02EDBDEC3000086D1 /* CodeTheme.swift in Sources */,
335 | 720DA3C12EDBDEC3000086D1 /* MessageEntry.swift in Sources */,
336 | 72D467512B578CB300547002 /* AboutView.swift in Sources */,
337 | 72213BA62B1D159C00590D99 /* ContentView.swift in Sources */,
338 | 720DA3C42EDBDEDF000086D1 /* DocumentState.swift in Sources */,
339 | 720DA3C52EDBDEDF000086D1 /* ShareOption.swift in Sources */,
340 | );
341 | runOnlyForDeploymentPostprocessing = 0;
342 | };
343 | 72213BAE2B1D159E00590D99 /* Sources */ = {
344 | isa = PBXSourcesBuildPhase;
345 | buildActionMask = 2147483647;
346 | files = (
347 | 72213BB72B1D159E00590D99 /* CherriTests.swift in Sources */,
348 | );
349 | runOnlyForDeploymentPostprocessing = 0;
350 | };
351 | 72213BB82B1D159E00590D99 /* Sources */ = {
352 | isa = PBXSourcesBuildPhase;
353 | buildActionMask = 2147483647;
354 | files = (
355 | 72213BC12B1D159E00590D99 /* CherriUITests.swift in Sources */,
356 | 72213BC32B1D159E00590D99 /* CherriUITestsLaunchTests.swift in Sources */,
357 | );
358 | runOnlyForDeploymentPostprocessing = 0;
359 | };
360 | /* End PBXSourcesBuildPhase section */
361 |
362 | /* Begin PBXTargetDependency section */
363 | 72213BB42B1D159E00590D99 /* PBXTargetDependency */ = {
364 | isa = PBXTargetDependency;
365 | target = 72213B9D2B1D159C00590D99 /* Cherri */;
366 | targetProxy = 72213BB32B1D159E00590D99 /* PBXContainerItemProxy */;
367 | };
368 | 72213BBE2B1D159E00590D99 /* PBXTargetDependency */ = {
369 | isa = PBXTargetDependency;
370 | target = 72213B9D2B1D159C00590D99 /* Cherri */;
371 | targetProxy = 72213BBD2B1D159E00590D99 /* PBXContainerItemProxy */;
372 | };
373 | /* End PBXTargetDependency section */
374 |
375 | /* Begin XCBuildConfiguration section */
376 | 72213BC42B1D159E00590D99 /* Debug */ = {
377 | isa = XCBuildConfiguration;
378 | buildSettings = {
379 | ALWAYS_SEARCH_USER_PATHS = NO;
380 | ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;
381 | ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
382 | CLANG_ANALYZER_NONNULL = YES;
383 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
384 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
385 | CLANG_ENABLE_MODULES = YES;
386 | CLANG_ENABLE_OBJC_ARC = YES;
387 | CLANG_ENABLE_OBJC_WEAK = YES;
388 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
389 | CLANG_WARN_BOOL_CONVERSION = YES;
390 | CLANG_WARN_COMMA = YES;
391 | CLANG_WARN_CONSTANT_CONVERSION = YES;
392 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
393 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
394 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
395 | CLANG_WARN_EMPTY_BODY = YES;
396 | CLANG_WARN_ENUM_CONVERSION = YES;
397 | CLANG_WARN_INFINITE_RECURSION = YES;
398 | CLANG_WARN_INT_CONVERSION = YES;
399 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
400 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
401 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
402 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
403 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
404 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
405 | CLANG_WARN_STRICT_PROTOTYPES = YES;
406 | CLANG_WARN_SUSPICIOUS_MOVE = YES;
407 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
408 | CLANG_WARN_UNREACHABLE_CODE = YES;
409 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
410 | COPY_PHASE_STRIP = NO;
411 | DEAD_CODE_STRIPPING = YES;
412 | DEBUG_INFORMATION_FORMAT = dwarf;
413 | ENABLE_STRICT_OBJC_MSGSEND = YES;
414 | ENABLE_TESTABILITY = YES;
415 | ENABLE_USER_SCRIPT_SANDBOXING = NO;
416 | GCC_C_LANGUAGE_STANDARD = gnu17;
417 | GCC_DYNAMIC_NO_PIC = NO;
418 | GCC_NO_COMMON_BLOCKS = YES;
419 | GCC_OPTIMIZATION_LEVEL = 0;
420 | GCC_PREPROCESSOR_DEFINITIONS = (
421 | "DEBUG=1",
422 | "$(inherited)",
423 | );
424 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
425 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
426 | GCC_WARN_UNDECLARED_SELECTOR = YES;
427 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
428 | GCC_WARN_UNUSED_FUNCTION = YES;
429 | GCC_WARN_UNUSED_VARIABLE = YES;
430 | LOCALIZATION_PREFERS_STRING_CATALOGS = YES;
431 | MACOSX_DEPLOYMENT_TARGET = 14.0;
432 | MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
433 | MTL_FAST_MATH = YES;
434 | ONLY_ACTIVE_ARCH = YES;
435 | SDKROOT = macosx;
436 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = "DEBUG $(inherited)";
437 | SWIFT_OPTIMIZATION_LEVEL = "-Onone";
438 | };
439 | name = Debug;
440 | };
441 | 72213BC52B1D159E00590D99 /* Release */ = {
442 | isa = XCBuildConfiguration;
443 | buildSettings = {
444 | ALWAYS_SEARCH_USER_PATHS = NO;
445 | ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;
446 | ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
447 | CLANG_ANALYZER_NONNULL = YES;
448 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
449 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
450 | CLANG_ENABLE_MODULES = YES;
451 | CLANG_ENABLE_OBJC_ARC = YES;
452 | CLANG_ENABLE_OBJC_WEAK = YES;
453 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
454 | CLANG_WARN_BOOL_CONVERSION = YES;
455 | CLANG_WARN_COMMA = YES;
456 | CLANG_WARN_CONSTANT_CONVERSION = YES;
457 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
458 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
459 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
460 | CLANG_WARN_EMPTY_BODY = YES;
461 | CLANG_WARN_ENUM_CONVERSION = YES;
462 | CLANG_WARN_INFINITE_RECURSION = YES;
463 | CLANG_WARN_INT_CONVERSION = YES;
464 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
465 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
466 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
467 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
468 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
469 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
470 | CLANG_WARN_STRICT_PROTOTYPES = YES;
471 | CLANG_WARN_SUSPICIOUS_MOVE = YES;
472 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
473 | CLANG_WARN_UNREACHABLE_CODE = YES;
474 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
475 | COPY_PHASE_STRIP = NO;
476 | DEAD_CODE_STRIPPING = YES;
477 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
478 | ENABLE_NS_ASSERTIONS = NO;
479 | ENABLE_STRICT_OBJC_MSGSEND = YES;
480 | ENABLE_USER_SCRIPT_SANDBOXING = NO;
481 | GCC_C_LANGUAGE_STANDARD = gnu17;
482 | GCC_NO_COMMON_BLOCKS = YES;
483 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
484 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
485 | GCC_WARN_UNDECLARED_SELECTOR = YES;
486 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
487 | GCC_WARN_UNUSED_FUNCTION = YES;
488 | GCC_WARN_UNUSED_VARIABLE = YES;
489 | LOCALIZATION_PREFERS_STRING_CATALOGS = YES;
490 | MACOSX_DEPLOYMENT_TARGET = 14.0;
491 | MTL_ENABLE_DEBUG_INFO = NO;
492 | MTL_FAST_MATH = YES;
493 | SDKROOT = macosx;
494 | SWIFT_COMPILATION_MODE = wholemodule;
495 | };
496 | name = Release;
497 | };
498 | 72213BC72B1D159E00590D99 /* Debug */ = {
499 | isa = XCBuildConfiguration;
500 | buildSettings = {
501 | ASSETCATALOG_COMPILER_APPICON_NAME = CherriAppIcon;
502 | ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
503 | ASSETCATALOG_COMPILER_INCLUDE_ALL_APPICON_ASSETS = YES;
504 | CODE_SIGN_ENTITLEMENTS = Cherri/Cherri.entitlements;
505 | CODE_SIGN_STYLE = Automatic;
506 | COMBINE_HIDPI_IMAGES = YES;
507 | CURRENT_PROJECT_VERSION = 1;
508 | DEAD_CODE_STRIPPING = YES;
509 | DEVELOPMENT_ASSET_PATHS = "\"Cherri/Preview Content\"";
510 | ENABLE_HARDENED_RUNTIME = YES;
511 | ENABLE_PREVIEWS = YES;
512 | ENABLE_USER_SCRIPT_SANDBOXING = NO;
513 | GENERATE_INFOPLIST_FILE = YES;
514 | INFOPLIST_FILE = Cherri/Info.plist;
515 | INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.developer-tools";
516 | INFOPLIST_KEY_NSHumanReadableCopyright = "";
517 | LD_RUNPATH_SEARCH_PATHS = (
518 | "$(inherited)",
519 | "@executable_path/../Frameworks",
520 | );
521 | MARKETING_VERSION = 1.1.0;
522 | PRODUCT_BUNDLE_IDENTIFIER = org.cherrilang.Cherri;
523 | PRODUCT_NAME = "$(TARGET_NAME)";
524 | SWIFT_EMIT_LOC_STRINGS = YES;
525 | SWIFT_VERSION = 5.0;
526 | };
527 | name = Debug;
528 | };
529 | 72213BC82B1D159E00590D99 /* Release */ = {
530 | isa = XCBuildConfiguration;
531 | buildSettings = {
532 | ASSETCATALOG_COMPILER_APPICON_NAME = CherriAppIcon;
533 | ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
534 | ASSETCATALOG_COMPILER_INCLUDE_ALL_APPICON_ASSETS = YES;
535 | CODE_SIGN_ENTITLEMENTS = Cherri/Cherri.entitlements;
536 | CODE_SIGN_STYLE = Automatic;
537 | COMBINE_HIDPI_IMAGES = YES;
538 | CURRENT_PROJECT_VERSION = 1;
539 | DEAD_CODE_STRIPPING = YES;
540 | DEVELOPMENT_ASSET_PATHS = "\"Cherri/Preview Content\"";
541 | ENABLE_HARDENED_RUNTIME = YES;
542 | ENABLE_PREVIEWS = YES;
543 | ENABLE_USER_SCRIPT_SANDBOXING = NO;
544 | GENERATE_INFOPLIST_FILE = YES;
545 | INFOPLIST_FILE = Cherri/Info.plist;
546 | INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.developer-tools";
547 | INFOPLIST_KEY_NSHumanReadableCopyright = "";
548 | LD_RUNPATH_SEARCH_PATHS = (
549 | "$(inherited)",
550 | "@executable_path/../Frameworks",
551 | );
552 | MARKETING_VERSION = 1.1.0;
553 | PRODUCT_BUNDLE_IDENTIFIER = org.cherrilang.Cherri;
554 | PRODUCT_NAME = "$(TARGET_NAME)";
555 | SWIFT_EMIT_LOC_STRINGS = YES;
556 | SWIFT_VERSION = 5.0;
557 | };
558 | name = Release;
559 | };
560 | 72213BCA2B1D159E00590D99 /* Debug */ = {
561 | isa = XCBuildConfiguration;
562 | buildSettings = {
563 | BUNDLE_LOADER = "$(TEST_HOST)";
564 | CODE_SIGN_STYLE = Automatic;
565 | CURRENT_PROJECT_VERSION = 1;
566 | DEAD_CODE_STRIPPING = YES;
567 | GENERATE_INFOPLIST_FILE = YES;
568 | MACOSX_DEPLOYMENT_TARGET = 14.0;
569 | MARKETING_VERSION = 1.0;
570 | PRODUCT_BUNDLE_IDENTIFIER = org.cherrilang.CherriTests;
571 | PRODUCT_NAME = "$(TARGET_NAME)";
572 | SWIFT_EMIT_LOC_STRINGS = NO;
573 | SWIFT_VERSION = 5.0;
574 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Cherri.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Cherri";
575 | };
576 | name = Debug;
577 | };
578 | 72213BCB2B1D159E00590D99 /* Release */ = {
579 | isa = XCBuildConfiguration;
580 | buildSettings = {
581 | BUNDLE_LOADER = "$(TEST_HOST)";
582 | CODE_SIGN_STYLE = Automatic;
583 | CURRENT_PROJECT_VERSION = 1;
584 | DEAD_CODE_STRIPPING = YES;
585 | GENERATE_INFOPLIST_FILE = YES;
586 | MACOSX_DEPLOYMENT_TARGET = 14.0;
587 | MARKETING_VERSION = 1.0;
588 | PRODUCT_BUNDLE_IDENTIFIER = org.cherrilang.CherriTests;
589 | PRODUCT_NAME = "$(TARGET_NAME)";
590 | SWIFT_EMIT_LOC_STRINGS = NO;
591 | SWIFT_VERSION = 5.0;
592 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Cherri.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Cherri";
593 | };
594 | name = Release;
595 | };
596 | 72213BCD2B1D159E00590D99 /* Debug */ = {
597 | isa = XCBuildConfiguration;
598 | buildSettings = {
599 | CODE_SIGN_STYLE = Automatic;
600 | CURRENT_PROJECT_VERSION = 1;
601 | DEAD_CODE_STRIPPING = YES;
602 | GENERATE_INFOPLIST_FILE = YES;
603 | MARKETING_VERSION = 1.0;
604 | PRODUCT_BUNDLE_IDENTIFIER = org.cherrilang.CherriUITests;
605 | PRODUCT_NAME = "$(TARGET_NAME)";
606 | SWIFT_EMIT_LOC_STRINGS = NO;
607 | SWIFT_VERSION = 5.0;
608 | TEST_TARGET_NAME = Cherri;
609 | };
610 | name = Debug;
611 | };
612 | 72213BCE2B1D159E00590D99 /* Release */ = {
613 | isa = XCBuildConfiguration;
614 | buildSettings = {
615 | CODE_SIGN_STYLE = Automatic;
616 | CURRENT_PROJECT_VERSION = 1;
617 | DEAD_CODE_STRIPPING = YES;
618 | GENERATE_INFOPLIST_FILE = YES;
619 | MARKETING_VERSION = 1.0;
620 | PRODUCT_BUNDLE_IDENTIFIER = org.cherrilang.CherriUITests;
621 | PRODUCT_NAME = "$(TARGET_NAME)";
622 | SWIFT_EMIT_LOC_STRINGS = NO;
623 | SWIFT_VERSION = 5.0;
624 | TEST_TARGET_NAME = Cherri;
625 | };
626 | name = Release;
627 | };
628 | /* End XCBuildConfiguration section */
629 |
630 | /* Begin XCConfigurationList section */
631 | 72213B992B1D159B00590D99 /* Build configuration list for PBXProject "Cherri" */ = {
632 | isa = XCConfigurationList;
633 | buildConfigurations = (
634 | 72213BC42B1D159E00590D99 /* Debug */,
635 | 72213BC52B1D159E00590D99 /* Release */,
636 | );
637 | defaultConfigurationIsVisible = 0;
638 | defaultConfigurationName = Release;
639 | };
640 | 72213BC62B1D159E00590D99 /* Build configuration list for PBXNativeTarget "Cherri" */ = {
641 | isa = XCConfigurationList;
642 | buildConfigurations = (
643 | 72213BC72B1D159E00590D99 /* Debug */,
644 | 72213BC82B1D159E00590D99 /* Release */,
645 | );
646 | defaultConfigurationIsVisible = 0;
647 | defaultConfigurationName = Release;
648 | };
649 | 72213BC92B1D159E00590D99 /* Build configuration list for PBXNativeTarget "CherriTests" */ = {
650 | isa = XCConfigurationList;
651 | buildConfigurations = (
652 | 72213BCA2B1D159E00590D99 /* Debug */,
653 | 72213BCB2B1D159E00590D99 /* Release */,
654 | );
655 | defaultConfigurationIsVisible = 0;
656 | defaultConfigurationName = Release;
657 | };
658 | 72213BCC2B1D159E00590D99 /* Build configuration list for PBXNativeTarget "CherriUITests" */ = {
659 | isa = XCConfigurationList;
660 | buildConfigurations = (
661 | 72213BCD2B1D159E00590D99 /* Debug */,
662 | 72213BCE2B1D159E00590D99 /* Release */,
663 | );
664 | defaultConfigurationIsVisible = 0;
665 | defaultConfigurationName = Release;
666 | };
667 | /* End XCConfigurationList section */
668 |
669 | /* Begin XCRemoteSwiftPackageReference section */
670 | 72213BCF2B1D17BE00590D99 /* XCRemoteSwiftPackageReference "CodeEditorView" */ = {
671 | isa = XCRemoteSwiftPackageReference;
672 | repositoryURL = "https://github.com/mchakravarty/CodeEditorView";
673 | requirement = {
674 | kind = upToNextMinorVersion;
675 | minimumVersion = 0.12.0;
676 | };
677 | };
678 | /* End XCRemoteSwiftPackageReference section */
679 |
680 | /* Begin XCSwiftPackageProductDependency section */
681 | 72213BD02B1D17BE00590D99 /* CodeEditorView */ = {
682 | isa = XCSwiftPackageProductDependency;
683 | package = 72213BCF2B1D17BE00590D99 /* XCRemoteSwiftPackageReference "CodeEditorView" */;
684 | productName = CodeEditorView;
685 | };
686 | 72213BD22B1D17BE00590D99 /* LanguageSupport */ = {
687 | isa = XCSwiftPackageProductDependency;
688 | package = 72213BCF2B1D17BE00590D99 /* XCRemoteSwiftPackageReference "CodeEditorView" */;
689 | productName = LanguageSupport;
690 | };
691 | /* End XCSwiftPackageProductDependency section */
692 | };
693 | rootObject = 72213B962B1D159B00590D99 /* Project object */;
694 | }
695 |
--------------------------------------------------------------------------------