update to function

This commit is contained in:
Rory Hinnen
2026-07-25 20:09:20 -05:00
parent 11969f2902
commit a342b0f98f
17 changed files with 664 additions and 40 deletions
@@ -0,0 +1,11 @@
{
"colors" : [
{
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
@@ -0,0 +1,13 @@
{
"images" : [
{
"idiom" : "universal",
"platform" : "watchos",
"size" : "1024x1024"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
@@ -0,0 +1,6 @@
{
"info" : {
"author" : "xcode",
"version" : 1
}
}
@@ -0,0 +1,26 @@
//
// ContentView.swift
// Interject! Watch Watch App
//
// Created by Rory on 7/12/26.
//
import SwiftUI
struct ContentView: View {
var body: some View {
Spacer()
VStack {
Text(Sentence().word(.first, safe: true))
Text(Sentence().word(.second, safe: true))
Text(Sentence().word(.noun, safe: true))
}
Spacer()
Text("SFW")
.padding()
}
}
#Preview {
ContentView()
}
@@ -0,0 +1,25 @@
//
// Interject__WatchApp.swift
// Interject! Watch Watch App
//
// Created by Rory on 7/12/26.
//
import SwiftUI
extension String {
var uppercaseFirst: String {
return prefix(1).uppercased() + dropFirst()
}
}
@main
struct Interject__Watch_Watch_AppApp: App {
var safeForWork = true;
var phrase = Sentence()
var body: some Scene {
WindowGroup {
ContentView()
}
}
}
@@ -0,0 +1,19 @@
//
// Interject__Watch_Watch_AppTests.swift
// Interject! Watch Watch AppTests
//
// Created by Rory on 7/12/26.
//
import Testing
@testable import Interject__Watch_Watch_App
struct Interject__Watch_Watch_AppTests {
@Test func example() async throws {
// Write your test here and use APIs like `#expect(...)` to check expected conditions.
// Swift Testing Documentation
// https://developer.apple.com/documentation/testing
}
}
@@ -0,0 +1,43 @@
//
// Interject__Watch_Watch_AppUITests.swift
// Interject! Watch Watch AppUITests
//
// Created by Rory on 7/12/26.
//
import XCTest
final class Interject__Watch_Watch_AppUITests: XCTestCase {
override func setUpWithError() throws {
// Put setup code here. This method is called before the invocation of each test method in the class.
// In UI tests it is usually best to stop immediately when a failure occurs.
continueAfterFailure = false
// 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.
}
override func tearDownWithError() throws {
// Put teardown code here. This method is called after the invocation of each test method in the class.
}
@MainActor
func testExample() throws {
// UI tests must launch the application that they test.
let app = XCUIApplication()
app.launch()
// Use XCTAssert and related functions to verify your tests produce the correct results.
// XCUIAutomation Documentation
// https://developer.apple.com/documentation/xcuiautomation
}
@MainActor
func testLaunchPerformance() throws {
// This measures how long it takes to launch your application.
measure(metrics: [XCTApplicationLaunchMetric()]) {
XCUIApplication().launch()
}
}
}
@@ -0,0 +1,35 @@
//
// Interject__Watch_Watch_AppUITestsLaunchTests.swift
// Interject! Watch Watch AppUITests
//
// Created by Rory on 7/12/26.
//
import XCTest
final class Interject__Watch_Watch_AppUITestsLaunchTests: XCTestCase {
override class var runsForEachTargetApplicationUIConfiguration: Bool {
true
}
override func setUpWithError() throws {
continueAfterFailure = false
}
@MainActor
func testLaunch() throws {
let app = XCUIApplication()
app.launch()
// Insert steps here to perform after app launch but before taking a screenshot,
// such as logging into a test account or navigating somewhere in the app
// XCUIAutomation Documentation
// https://developer.apple.com/documentation/xcuiautomation
let attachment = XCTAttachment(screenshot: app.screenshot())
attachment.name = "Launch Screen"
attachment.lifetime = .keepAlways
add(attachment)
}
}
@@ -1,8 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="32700.99.1234" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES" initialViewController="ObA-dk-sSI">
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="24765" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES" initialViewController="ObA-dk-sSI">
<device id="retina4_7" orientation="portrait" appearance="light"/>
<dependencies>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="22684"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="24743"/>
<capability name="Safe area layout guides" minToolsVersion="9.0"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
</dependencies>
@@ -28,8 +28,19 @@
<nil key="highlightedColor"/>
</label>
<toolbar opaque="NO" clearsContextBeforeDrawing="NO" contentMode="scaleToFill" barStyle="black" translucent="NO" translatesAutoresizingMaskIntoConstraints="NO" id="nbv-aT-gO3">
<rect key="frame" x="0.0" y="484" width="320" height="44"/>
<rect key="frame" x="0.0" y="480" width="320" height="48"/>
<items>
<barButtonItem style="plain" id="1fl-Ja-RYD">
<button key="customView" opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="system" lineBreakMode="middleTruncation" id="h59-CI-ayE">
<rect key="frame" x="21.000000000000007" y="7.0000000000000036" width="58.499999999999993" height="34.5"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<state key="normal" title="Button"/>
<buttonConfiguration key="configuration" style="tinted" title="New"/>
<connections>
<action selector="newPhrase:" destination="ObA-dk-sSI" eventType="touchUpInside" id="bBK-f1-Ne1"/>
</connections>
</button>
</barButtonItem>
<barButtonItem style="plain" systemItem="flexibleSpace" id="xdT-rE-EG6"/>
<barButtonItem title="SFW" id="FL3-l3-BDZ">
<color key="tintColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
@@ -38,6 +49,17 @@
</connections>
</barButtonItem>
<barButtonItem style="plain" systemItem="flexibleSpace" id="Py5-Bd-v2k"/>
<barButtonItem style="plain" id="kR0-35-prm">
<button key="customView" opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="system" lineBreakMode="middleTruncation" id="P5X-6G-9CV">
<rect key="frame" x="235.5" y="7.0000000000000036" width="63.5" height="34.5"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<state key="normal" title="Button"/>
<buttonConfiguration key="configuration" style="tinted" title="Send"/>
<connections>
<action selector="sendPhrase:" destination="ObA-dk-sSI" eventType="touchUpInside" id="gJe-Nn-CBw"/>
</connections>
</button>
</barButtonItem>
</items>
</toolbar>
</subviews>
@@ -55,10 +77,6 @@
<constraint firstItem="d1e-fi-ked" firstAttribute="leading" secondItem="LDy-ih-0nr" secondAttribute="leading" id="gph-db-bzE"/>
<constraint firstItem="nbv-aT-gO3" firstAttribute="bottom" secondItem="LDy-ih-0nr" secondAttribute="bottom" id="q5f-f4-P93"/>
</constraints>
<connections>
<outletCollection property="gestureRecognizers" destination="2ss-UY-Nkb" appends="YES" id="DBi-Nw-HIQ"/>
<outletCollection property="gestureRecognizers" destination="Bwj-n3-c5o" appends="YES" id="azY-f5-NZo"/>
</connections>
</view>
<freeformSimulatedSizeMetrics key="simulatedDestinationMetrics"/>
<size key="freeformSize" width="320" height="528"/>
@@ -68,16 +86,8 @@
</connections>
</viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="X47-rx-isc" userLabel="First Responder" sceneMemberID="firstResponder"/>
<swipeGestureRecognizer direction="down" id="2ss-UY-Nkb">
<connections>
<action selector="newPhrase:" destination="ObA-dk-sSI" id="rNu-eu-VTu"/>
</connections>
</swipeGestureRecognizer>
<swipeGestureRecognizer direction="up" id="Bwj-n3-c5o">
<connections>
<action selector="sendPhrase:" destination="ObA-dk-sSI" id="zHb-k7-oWY"/>
</connections>
</swipeGestureRecognizer>
<swipeGestureRecognizer direction="down" id="2ss-UY-Nkb"/>
<swipeGestureRecognizer direction="up" id="Bwj-n3-c5o"/>
</objects>
<point key="canvasLocation" x="72" y="-2.6986506746626691"/>
</scene>
@@ -21,6 +21,8 @@ class MessagesViewController: MSMessagesAppViewController {
// MARK: UI VARS
@IBOutlet weak var sfwLabel: UIBarButtonItem!
@IBOutlet weak var phraseLabel: UILabel!
@IBOutlet weak var newLabel: UIBarButtonItem!
@IBOutlet weak var sendLabel: UIBarButtonItem!
// MARK: Local Vars
@@ -32,7 +34,8 @@ class MessagesViewController: MSMessagesAppViewController {
// first load, Let's explain what the need to do.
override func viewDidLoad() {
super.viewDidLoad()
phraseLabel.text = "Swipe down for new words, up to send."
sentence = Sentence().new(current: sentence)
updatePhraseLabel()
}
// Toggle sfw
@@ -57,7 +60,11 @@ class MessagesViewController: MSMessagesAppViewController {
// Send a phrase to messages
@IBAction func sendPhrase(_ sender: Any) {
let conversation = self.activeConversation
conversation?.insertText(phraseLabel.text!) { error in }
conversation?.insertText(phraseLabel.text!) { [weak self] error in
DispatchQueue.main.async {
self?.requestPresentationStyle(.compact)
}
}
}
// Update the label
+428 -7
View File
@@ -12,6 +12,8 @@
761EDD593003F176006FC7FB /* Interject! iMessage.appex in Embed Foundation Extensions */ = {isa = PBXBuildFile; fileRef = 761EDD4C3003F175006FC7FB /* Interject! iMessage.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; };
761EDD6E3003F269006FC7FB /* words.json in Resources */ = {isa = PBXBuildFile; fileRef = 765F5A4B30029EC7004C2F29 /* words.json */; };
761EDD703003F5FF006FC7FB /* Words.swift in Sources */ = {isa = PBXBuildFile; fileRef = 98D0A2DE274721620084F7F9 /* Words.swift */; };
761EDD9530040902006FC7FB /* Interject! Watch Watch App.app in Embed Watch Content */ = {isa = PBXBuildFile; fileRef = 761EDD7530040900006FC7FB /* Interject! Watch Watch App.app */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; };
761EDDA030040B14006FC7FB /* Words.swift in Sources */ = {isa = PBXBuildFile; fileRef = 98D0A2DE274721620084F7F9 /* Words.swift */; };
762C51A22BC33AE5000689D9 /* Tips.swift in Sources */ = {isa = PBXBuildFile; fileRef = 762C51A12BC33AE5000689D9 /* Tips.swift */; };
762C51A42BCAD9BC000689D9 /* StoreKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 762C51A32BCAD9BC000689D9 /* StoreKit.framework */; };
762C51A62BCADA1C000689D9 /* Products.storekit in Resources */ = {isa = PBXBuildFile; fileRef = 762C51A52BCADA1C000689D9 /* Products.storekit */; };
@@ -46,6 +48,27 @@
remoteGlobalIDString = 761EDD4B3003F175006FC7FB;
remoteInfo = "Interject! iMessage";
};
761EDD8230040902006FC7FB /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 98D0A29D27471FF80084F7F9 /* Project object */;
proxyType = 1;
remoteGlobalIDString = 761EDD7430040900006FC7FB;
remoteInfo = "Interject! Watch Watch App";
};
761EDD8C30040902006FC7FB /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 98D0A29D27471FF80084F7F9 /* Project object */;
proxyType = 1;
remoteGlobalIDString = 761EDD7430040900006FC7FB;
remoteInfo = "Interject! Watch Watch App";
};
761EDD9330040902006FC7FB /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 98D0A29D27471FF80084F7F9 /* Project object */;
proxyType = 1;
remoteGlobalIDString = 761EDD7430040900006FC7FB;
remoteInfo = "Interject! Watch Watch App";
};
98D0A2B627471FF90084F7F9 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 98D0A29D27471FF80084F7F9 /* Project object */;
@@ -63,6 +86,17 @@
/* End PBXContainerItemProxy section */
/* Begin PBXCopyFilesBuildPhase section */
761EDD9930040902006FC7FB /* Embed Watch Content */ = {
isa = PBXCopyFilesBuildPhase;
buildActionMask = 2147483647;
dstPath = "$(CONTENTS_FOLDER_PATH)/Watch";
dstSubfolderSpec = 16;
files = (
761EDD9530040902006FC7FB /* Interject! Watch Watch App.app in Embed Watch Content */,
);
name = "Embed Watch Content";
runOnlyForDeploymentPostprocessing = 0;
};
98EA0F4F2863963F00B4E136 /* Embed Foundation Extensions */ = {
isa = PBXCopyFilesBuildPhase;
buildActionMask = 2147483647;
@@ -79,6 +113,9 @@
/* Begin PBXFileReference section */
761EDD463003EB67006FC7FB /* Intents.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Intents.swift; sourceTree = "<group>"; };
761EDD4C3003F175006FC7FB /* Interject! iMessage.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = "Interject! iMessage.appex"; sourceTree = BUILT_PRODUCTS_DIR; };
761EDD7530040900006FC7FB /* Interject! Watch Watch App.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "Interject! Watch Watch App.app"; sourceTree = BUILT_PRODUCTS_DIR; };
761EDD8130040902006FC7FB /* Interject! Watch Watch AppTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "Interject! Watch Watch AppTests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; };
761EDD8B30040902006FC7FB /* Interject! Watch Watch AppUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "Interject! Watch Watch AppUITests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; };
762C51A12BC33AE5000689D9 /* Tips.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Tips.swift; sourceTree = "<group>"; };
762C51A32BCAD9BC000689D9 /* StoreKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = StoreKit.framework; path = System/Library/Frameworks/StoreKit.framework; sourceTree = SDKROOT; };
762C51A52BCADA1C000689D9 /* Products.storekit */ = {isa = PBXFileReference; lastKnownFileType = text; path = Products.storekit; sourceTree = "<group>"; };
@@ -121,6 +158,9 @@
/* Begin PBXFileSystemSynchronizedRootGroup section */
761EDD4E3003F175006FC7FB /* Interject! iMessage */ = {isa = PBXFileSystemSynchronizedRootGroup; exceptions = (761EDD6F3003F317006FC7FB /* PBXFileSystemSynchronizedBuildFileExceptionSet */, ); explicitFileTypes = {}; explicitFolders = (); path = "Interject! iMessage"; sourceTree = "<group>"; };
761EDD7630040900006FC7FB /* Interject! Watch Watch App */ = {isa = PBXFileSystemSynchronizedRootGroup; explicitFileTypes = {}; explicitFolders = (); path = "Interject! Watch Watch App"; sourceTree = "<group>"; };
761EDD8430040902006FC7FB /* Interject! Watch Watch AppTests */ = {isa = PBXFileSystemSynchronizedRootGroup; explicitFileTypes = {}; explicitFolders = (); path = "Interject! Watch Watch AppTests"; sourceTree = "<group>"; };
761EDD8E30040902006FC7FB /* Interject! Watch Watch AppUITests */ = {isa = PBXFileSystemSynchronizedRootGroup; explicitFileTypes = {}; explicitFolders = (); path = "Interject! Watch Watch AppUITests"; sourceTree = "<group>"; };
/* End PBXFileSystemSynchronizedRootGroup section */
/* Begin PBXFrameworksBuildPhase section */
@@ -132,6 +172,27 @@
);
runOnlyForDeploymentPostprocessing = 0;
};
761EDD7230040900006FC7FB /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
};
761EDD7E30040902006FC7FB /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
};
761EDD8830040902006FC7FB /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
};
98D0A2A227471FF80084F7F9 /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
@@ -181,6 +242,9 @@
98D0A2B827471FF90084F7F9 /* Interject!Tests */,
98D0A2C227471FF90084F7F9 /* Interject!UITests */,
761EDD4E3003F175006FC7FB /* Interject! iMessage */,
761EDD7630040900006FC7FB /* Interject! Watch Watch App */,
761EDD8430040902006FC7FB /* Interject! Watch Watch AppTests */,
761EDD8E30040902006FC7FB /* Interject! Watch Watch AppUITests */,
9879879A2865299F00E82AF6 /* Frameworks */,
98D0A2A627471FF80084F7F9 /* Products */,
);
@@ -193,6 +257,9 @@
98D0A2B527471FF90084F7F9 /* Interject!Tests.xctest */,
98D0A2BF27471FF90084F7F9 /* Interject!UITests.xctest */,
761EDD4C3003F175006FC7FB /* Interject! iMessage.appex */,
761EDD7530040900006FC7FB /* Interject! Watch Watch App.app */,
761EDD8130040902006FC7FB /* Interject! Watch Watch AppTests.xctest */,
761EDD8B30040902006FC7FB /* Interject! Watch Watch AppUITests.xctest */,
);
name = Products;
sourceTree = "<group>";
@@ -291,6 +358,74 @@
productReference = 761EDD4C3003F175006FC7FB /* Interject! iMessage.appex */;
productType = "com.apple.product-type.app-extension.messages";
};
761EDD7430040900006FC7FB /* Interject! Watch Watch App */ = {
isa = PBXNativeTarget;
buildConfigurationList = 761EDD9630040902006FC7FB /* Build configuration list for PBXNativeTarget "Interject! Watch Watch App" */;
buildPhases = (
761EDD7130040900006FC7FB /* Sources */,
761EDD7230040900006FC7FB /* Frameworks */,
761EDD7330040900006FC7FB /* Resources */,
);
buildRules = (
);
dependencies = (
);
fileSystemSynchronizedGroups = (
761EDD7630040900006FC7FB /* Interject! Watch Watch App */,
);
name = "Interject! Watch Watch App";
packageProductDependencies = (
);
productName = "Interject! Watch Watch App";
productReference = 761EDD7530040900006FC7FB /* Interject! Watch Watch App.app */;
productType = "com.apple.product-type.application";
};
761EDD8030040902006FC7FB /* Interject! Watch Watch AppTests */ = {
isa = PBXNativeTarget;
buildConfigurationList = 761EDD9A30040902006FC7FB /* Build configuration list for PBXNativeTarget "Interject! Watch Watch AppTests" */;
buildPhases = (
761EDD7D30040902006FC7FB /* Sources */,
761EDD7E30040902006FC7FB /* Frameworks */,
761EDD7F30040902006FC7FB /* Resources */,
);
buildRules = (
);
dependencies = (
761EDD8330040902006FC7FB /* PBXTargetDependency */,
);
fileSystemSynchronizedGroups = (
761EDD8430040902006FC7FB /* Interject! Watch Watch AppTests */,
);
name = "Interject! Watch Watch AppTests";
packageProductDependencies = (
);
productName = "Interject! Watch Watch AppTests";
productReference = 761EDD8130040902006FC7FB /* Interject! Watch Watch AppTests.xctest */;
productType = "com.apple.product-type.bundle.unit-test";
};
761EDD8A30040902006FC7FB /* Interject! Watch Watch AppUITests */ = {
isa = PBXNativeTarget;
buildConfigurationList = 761EDD9D30040902006FC7FB /* Build configuration list for PBXNativeTarget "Interject! Watch Watch AppUITests" */;
buildPhases = (
761EDD8730040902006FC7FB /* Sources */,
761EDD8830040902006FC7FB /* Frameworks */,
761EDD8930040902006FC7FB /* Resources */,
);
buildRules = (
);
dependencies = (
761EDD8D30040902006FC7FB /* PBXTargetDependency */,
);
fileSystemSynchronizedGroups = (
761EDD8E30040902006FC7FB /* Interject! Watch Watch AppUITests */,
);
name = "Interject! Watch Watch AppUITests";
packageProductDependencies = (
);
productName = "Interject! Watch Watch AppUITests";
productReference = 761EDD8B30040902006FC7FB /* Interject! Watch Watch AppUITests.xctest */;
productType = "com.apple.product-type.bundle.ui-testing";
};
98D0A2A427471FF80084F7F9 /* Interject! */ = {
isa = PBXNativeTarget;
buildConfigurationList = 98D0A2C927471FF90084F7F9 /* Build configuration list for PBXNativeTarget "Interject!" */;
@@ -299,11 +434,13 @@
98D0A2A227471FF80084F7F9 /* Frameworks */,
98D0A2A327471FF80084F7F9 /* Resources */,
98EA0F4F2863963F00B4E136 /* Embed Foundation Extensions */,
761EDD9930040902006FC7FB /* Embed Watch Content */,
);
buildRules = (
);
dependencies = (
761EDD583003F176006FC7FB /* PBXTargetDependency */,
761EDD9430040902006FC7FB /* PBXTargetDependency */,
);
name = "Interject!";
productName = "Interject!";
@@ -354,12 +491,23 @@
attributes = {
BuildIndependentTargetsInParallel = 1;
LastSwiftUpdateCheck = 2650;
LastUpgradeCheck = 2650;
LastUpgradeCheck = 2700;
TargetAttributes = {
761EDD4B3003F175006FC7FB = {
CreatedOnToolsVersion = 26.5;
LastSwiftMigration = 2650;
};
761EDD7430040900006FC7FB = {
CreatedOnToolsVersion = 26.5;
};
761EDD8030040902006FC7FB = {
CreatedOnToolsVersion = 26.5;
TestTargetID = 761EDD7430040900006FC7FB;
};
761EDD8A30040902006FC7FB = {
CreatedOnToolsVersion = 26.5;
TestTargetID = 761EDD7430040900006FC7FB;
};
98D0A2A427471FF80084F7F9 = {
CreatedOnToolsVersion = 13.1;
};
@@ -390,6 +538,9 @@
98D0A2B427471FF90084F7F9 /* Interject!Tests */,
98D0A2BE27471FF90084F7F9 /* Interject!UITests */,
761EDD4B3003F175006FC7FB /* Interject! iMessage */,
761EDD7430040900006FC7FB /* Interject! Watch Watch App */,
761EDD8030040902006FC7FB /* Interject! Watch Watch AppTests */,
761EDD8A30040902006FC7FB /* Interject! Watch Watch AppUITests */,
);
};
/* End PBXProject section */
@@ -403,6 +554,27 @@
);
runOnlyForDeploymentPostprocessing = 0;
};
761EDD7330040900006FC7FB /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
};
761EDD7F30040902006FC7FB /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
};
761EDD8930040902006FC7FB /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
};
98D0A2A327471FF80084F7F9 /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
@@ -441,6 +613,28 @@
);
runOnlyForDeploymentPostprocessing = 0;
};
761EDD7130040900006FC7FB /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
761EDDA030040B14006FC7FB /* Words.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
761EDD7D30040902006FC7FB /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
};
761EDD8730040902006FC7FB /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
};
98D0A2A127471FF80084F7F9 /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
@@ -488,6 +682,21 @@
target = 761EDD4B3003F175006FC7FB /* Interject! iMessage */;
targetProxy = 761EDD573003F176006FC7FB /* PBXContainerItemProxy */;
};
761EDD8330040902006FC7FB /* PBXTargetDependency */ = {
isa = PBXTargetDependency;
target = 761EDD7430040900006FC7FB /* Interject! Watch Watch App */;
targetProxy = 761EDD8230040902006FC7FB /* PBXContainerItemProxy */;
};
761EDD8D30040902006FC7FB /* PBXTargetDependency */ = {
isa = PBXTargetDependency;
target = 761EDD7430040900006FC7FB /* Interject! Watch Watch App */;
targetProxy = 761EDD8C30040902006FC7FB /* PBXContainerItemProxy */;
};
761EDD9430040902006FC7FB /* PBXTargetDependency */ = {
isa = PBXTargetDependency;
target = 761EDD7430040900006FC7FB /* Interject! Watch Watch App */;
targetProxy = 761EDD9330040902006FC7FB /* PBXContainerItemProxy */;
};
98D0A2B727471FF90084F7F9 /* PBXTargetDependency */ = {
isa = PBXTargetDependency;
target = 98D0A2A427471FF80084F7F9 /* Interject! */;
@@ -514,7 +723,7 @@
INFOPLIST_FILE = "Interject! iMessage/Info.plist";
INFOPLIST_KEY_CFBundleDisplayName = "Interject! iMessage";
INFOPLIST_KEY_NSHumanReadableCopyright = "";
IPHONEOS_DEPLOYMENT_TARGET = 26.5;
IPHONEOS_DEPLOYMENT_TARGET = 17.6;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
@@ -549,7 +758,7 @@
INFOPLIST_FILE = "Interject! iMessage/Info.plist";
INFOPLIST_KEY_CFBundleDisplayName = "Interject! iMessage";
INFOPLIST_KEY_NSHumanReadableCopyright = "";
IPHONEOS_DEPLOYMENT_TARGET = 26.5;
IPHONEOS_DEPLOYMENT_TARGET = 17.6;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
@@ -569,6 +778,187 @@
};
name = Release;
};
761EDD9730040902006FC7FB /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 1;
ENABLE_PREVIEWS = YES;
GCC_C_LANGUAGE_STANDARD = gnu17;
GENERATE_INFOPLIST_FILE = YES;
INFOPLIST_KEY_CFBundleDisplayName = "Interject! Watch";
INFOPLIST_KEY_UISupportedInterfaceOrientations = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown";
INFOPLIST_KEY_WKCompanionAppBundleIdentifier = "us.hinnen.Interject-";
IPHONEOS_DEPLOYMENT_TARGET = "$(RECOMMENDED_IPHONEOS_DEPLOYMENT_TARGET)";
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
);
LOCALIZATION_PREFERS_STRING_CATALOGS = YES;
MARKETING_VERSION = 3.04;
PRODUCT_BUNDLE_IDENTIFIER = "us.hinnen.Interject-.watchkitapp";
PRODUCT_NAME = "$(TARGET_NAME)";
SDKROOT = watchos;
SKIP_INSTALL = YES;
STRING_CATALOG_GENERATE_SYMBOLS = YES;
SWIFT_ACTIVE_COMPILATION_CONDITIONS = "DEBUG $(inherited)";
SWIFT_APPROACHABLE_CONCURRENCY = YES;
SWIFT_DEFAULT_ACTOR_ISOLATION = MainActor;
SWIFT_EMIT_LOC_STRINGS = YES;
SWIFT_UPCOMING_FEATURE_MEMBER_IMPORT_VISIBILITY = YES;
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = 4;
WATCHOS_DEPLOYMENT_TARGET = 26.6;
};
name = Debug;
};
761EDD9830040902006FC7FB /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 1;
ENABLE_PREVIEWS = YES;
GCC_C_LANGUAGE_STANDARD = gnu17;
GENERATE_INFOPLIST_FILE = YES;
INFOPLIST_KEY_CFBundleDisplayName = "Interject! Watch";
INFOPLIST_KEY_UISupportedInterfaceOrientations = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown";
INFOPLIST_KEY_WKCompanionAppBundleIdentifier = "us.hinnen.Interject-";
IPHONEOS_DEPLOYMENT_TARGET = "$(RECOMMENDED_IPHONEOS_DEPLOYMENT_TARGET)";
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
);
LOCALIZATION_PREFERS_STRING_CATALOGS = YES;
MARKETING_VERSION = 3.04;
PRODUCT_BUNDLE_IDENTIFIER = "us.hinnen.Interject-.watchkitapp";
PRODUCT_NAME = "$(TARGET_NAME)";
SDKROOT = watchos;
SKIP_INSTALL = YES;
STRING_CATALOG_GENERATE_SYMBOLS = YES;
SWIFT_APPROACHABLE_CONCURRENCY = YES;
SWIFT_DEFAULT_ACTOR_ISOLATION = MainActor;
SWIFT_EMIT_LOC_STRINGS = YES;
SWIFT_UPCOMING_FEATURE_MEMBER_IMPORT_VISIBILITY = YES;
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = 4;
WATCHOS_DEPLOYMENT_TARGET = 26.6;
};
name = Release;
};
761EDD9B30040902006FC7FB /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
BUNDLE_LOADER = "$(TEST_HOST)";
CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 1;
DEVELOPMENT_TEAM = 5P9XB49J6K;
GCC_C_LANGUAGE_STANDARD = gnu17;
GENERATE_INFOPLIST_FILE = YES;
IPHONEOS_DEPLOYMENT_TARGET = "$(RECOMMENDED_IPHONEOS_DEPLOYMENT_TARGET)";
LOCALIZATION_PREFERS_STRING_CATALOGS = YES;
MARKETING_VERSION = 1.0;
PRODUCT_BUNDLE_IDENTIFIER = "us.hinnen.Interject-.Interject--Watch-Watch-AppTests";
PRODUCT_NAME = "$(TARGET_NAME)";
SDKROOT = watchos;
STRING_CATALOG_GENERATE_SYMBOLS = NO;
SWIFT_ACTIVE_COMPILATION_CONDITIONS = "DEBUG $(inherited)";
SWIFT_APPROACHABLE_CONCURRENCY = YES;
SWIFT_EMIT_LOC_STRINGS = NO;
SWIFT_UPCOMING_FEATURE_MEMBER_IMPORT_VISIBILITY = YES;
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = 4;
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Interject! Watch Watch App.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Interject! Watch Watch App";
WATCHOS_DEPLOYMENT_TARGET = 26.5;
};
name = Debug;
};
761EDD9C30040902006FC7FB /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
BUNDLE_LOADER = "$(TEST_HOST)";
CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 1;
DEVELOPMENT_TEAM = 5P9XB49J6K;
GCC_C_LANGUAGE_STANDARD = gnu17;
GENERATE_INFOPLIST_FILE = YES;
IPHONEOS_DEPLOYMENT_TARGET = "$(RECOMMENDED_IPHONEOS_DEPLOYMENT_TARGET)";
LOCALIZATION_PREFERS_STRING_CATALOGS = YES;
MARKETING_VERSION = 1.0;
PRODUCT_BUNDLE_IDENTIFIER = "us.hinnen.Interject-.Interject--Watch-Watch-AppTests";
PRODUCT_NAME = "$(TARGET_NAME)";
SDKROOT = watchos;
STRING_CATALOG_GENERATE_SYMBOLS = NO;
SWIFT_APPROACHABLE_CONCURRENCY = YES;
SWIFT_EMIT_LOC_STRINGS = NO;
SWIFT_UPCOMING_FEATURE_MEMBER_IMPORT_VISIBILITY = YES;
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = 4;
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Interject! Watch Watch App.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Interject! Watch Watch App";
WATCHOS_DEPLOYMENT_TARGET = 26.5;
};
name = Release;
};
761EDD9E30040902006FC7FB /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 1;
DEVELOPMENT_TEAM = 5P9XB49J6K;
GCC_C_LANGUAGE_STANDARD = gnu17;
GENERATE_INFOPLIST_FILE = YES;
IPHONEOS_DEPLOYMENT_TARGET = "$(RECOMMENDED_IPHONEOS_DEPLOYMENT_TARGET)";
LOCALIZATION_PREFERS_STRING_CATALOGS = YES;
MARKETING_VERSION = 1.0;
PRODUCT_BUNDLE_IDENTIFIER = "us.hinnen.Interject-.Interject--Watch-Watch-AppUITests";
PRODUCT_NAME = "$(TARGET_NAME)";
SDKROOT = watchos;
STRING_CATALOG_GENERATE_SYMBOLS = NO;
SWIFT_ACTIVE_COMPILATION_CONDITIONS = "DEBUG $(inherited)";
SWIFT_APPROACHABLE_CONCURRENCY = YES;
SWIFT_EMIT_LOC_STRINGS = NO;
SWIFT_UPCOMING_FEATURE_MEMBER_IMPORT_VISIBILITY = YES;
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = 4;
TEST_TARGET_NAME = "Interject! Watch Watch App";
WATCHOS_DEPLOYMENT_TARGET = 26.5;
};
name = Debug;
};
761EDD9F30040902006FC7FB /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 1;
DEVELOPMENT_TEAM = 5P9XB49J6K;
GCC_C_LANGUAGE_STANDARD = gnu17;
GENERATE_INFOPLIST_FILE = YES;
IPHONEOS_DEPLOYMENT_TARGET = "$(RECOMMENDED_IPHONEOS_DEPLOYMENT_TARGET)";
LOCALIZATION_PREFERS_STRING_CATALOGS = YES;
MARKETING_VERSION = 1.0;
PRODUCT_BUNDLE_IDENTIFIER = "us.hinnen.Interject-.Interject--Watch-Watch-AppUITests";
PRODUCT_NAME = "$(TARGET_NAME)";
SDKROOT = watchos;
STRING_CATALOG_GENERATE_SYMBOLS = NO;
SWIFT_APPROACHABLE_CONCURRENCY = YES;
SWIFT_EMIT_LOC_STRINGS = NO;
SWIFT_UPCOMING_FEATURE_MEMBER_IMPORT_VISIBILITY = YES;
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = 4;
TEST_TARGET_NAME = "Interject! Watch Watch App";
WATCHOS_DEPLOYMENT_TARGET = 26.5;
};
name = Release;
};
98D0A2C727471FF90084F7F9 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
@@ -632,6 +1022,7 @@
STRING_CATALOG_GENERATE_SYMBOLS = YES;
SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
TARGETED_DEVICE_FAMILY = 1;
};
name = Debug;
};
@@ -691,6 +1082,7 @@
STRING_CATALOG_GENERATE_SYMBOLS = YES;
SWIFT_COMPILATION_MODE = wholemodule;
SWIFT_OPTIMIZATION_LEVEL = "-O";
TARGETED_DEVICE_FAMILY = 1;
VALIDATE_PRODUCT = YES;
};
name = Release;
@@ -712,7 +1104,7 @@
INFOPLIST_KEY_UISupportedInterfaceOrientations = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight";
INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight";
INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight";
IPHONEOS_DEPLOYMENT_TARGET = 15.0;
IPHONEOS_DEPLOYMENT_TARGET = 17.6;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
@@ -743,7 +1135,7 @@
INFOPLIST_KEY_UISupportedInterfaceOrientations = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight";
INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight";
INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight";
IPHONEOS_DEPLOYMENT_TARGET = 15.0;
IPHONEOS_DEPLOYMENT_TARGET = 17.6;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
@@ -764,7 +1156,7 @@
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 1;
GENERATE_INFOPLIST_FILE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 15.0;
IPHONEOS_DEPLOYMENT_TARGET = "$(RECOMMENDED_IPHONEOS_DEPLOYMENT_TARGET)";
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
@@ -787,7 +1179,7 @@
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 1;
GENERATE_INFOPLIST_FILE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 15.0;
IPHONEOS_DEPLOYMENT_TARGET = "$(RECOMMENDED_IPHONEOS_DEPLOYMENT_TARGET)";
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
@@ -809,6 +1201,7 @@
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 1;
GENERATE_INFOPLIST_FILE = YES;
IPHONEOS_DEPLOYMENT_TARGET = "$(RECOMMENDED_IPHONEOS_DEPLOYMENT_TARGET)";
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
@@ -830,6 +1223,7 @@
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 1;
GENERATE_INFOPLIST_FILE = YES;
IPHONEOS_DEPLOYMENT_TARGET = "$(RECOMMENDED_IPHONEOS_DEPLOYMENT_TARGET)";
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
@@ -857,6 +1251,33 @@
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
761EDD9630040902006FC7FB /* Build configuration list for PBXNativeTarget "Interject! Watch Watch App" */ = {
isa = XCConfigurationList;
buildConfigurations = (
761EDD9730040902006FC7FB /* Debug */,
761EDD9830040902006FC7FB /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
761EDD9A30040902006FC7FB /* Build configuration list for PBXNativeTarget "Interject! Watch Watch AppTests" */ = {
isa = XCConfigurationList;
buildConfigurations = (
761EDD9B30040902006FC7FB /* Debug */,
761EDD9C30040902006FC7FB /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
761EDD9D30040902006FC7FB /* Build configuration list for PBXNativeTarget "Interject! Watch Watch AppUITests" */ = {
isa = XCConfigurationList;
buildConfigurations = (
761EDD9E30040902006FC7FB /* Debug */,
761EDD9F30040902006FC7FB /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
98D0A2A027471FF80084F7F9 /* Build configuration list for PBXProject "Interject!" */ = {
isa = XCConfigurationList;
buildConfigurations = (
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "2650"
LastUpgradeVersion = "2700"
version = "1.3">
<BuildAction
parallelizeBuildables = "YES"
@@ -4,6 +4,11 @@
<dict>
<key>SchemeUserState</key>
<dict>
<key>Interject! Watch Watch App.xcscheme_^#shared#^_</key>
<dict>
<key>orderHint</key>
<integer>2</integer>
</dict>
<key>Interject! iMessage MessagesExtension.xcscheme_^#shared#^_</key>
<dict>
<key>orderHint</key>
+10 -12
View File
@@ -5,35 +5,33 @@
import AppIntents
@available(iOS 16.0, *)
struct GenerateInsultIntent: AppIntent {
static var title: LocalizedStringResource = "Generate Insult"
static var description = IntentDescription("Generates a new random insult phrase.")
struct GenerateDescriptorIntent: AppIntent {
static var title: LocalizedStringResource = "Interject"
static var description = IntentDescription("Generates a new random descriptive phrase.")
func perform() async throws -> some IntentResult & ReturnsValue<String> {
// Fall back to true (safe mode) if the app hasn't set the preference yet
let isSfw = UserDefaults.standard.object(forKey: "SFW") as? Bool ?? true
let sentence = Sentence().new(current: Sentence())
let insult = [
let interjection = [
sentence.word(.first, safe: isSfw),
sentence.word(.second, safe: isSfw),
sentence.word(.noun, safe: isSfw)
].joined(separator: " ")
return .result(value: insult)
return .result(value: interjection, dialog: IntentDialog(stringLiteral: interjection))
}
}
@available(iOS 16.0, *)
struct InterjectShortcuts: AppShortcutsProvider {
static var appShortcuts: [AppShortcut] {
AppShortcut(
intent: GenerateInsultIntent(),
intent: GenerateDescriptorIntent(),
phrases: [
"Generate an insult with \(.applicationName)",
"Insult me with \(.applicationName)",
"Give me an insult from \(.applicationName)"
"Generate an interjection with \(.applicationName)",
"Describe me with \(.applicationName)",
"Give me an interjection from \(.applicationName)"
],
shortTitle: "Generate Insult",
shortTitle: "Generate Interjection",
systemImageName: "bubble.left.fill"
)
}
@@ -6,6 +6,7 @@
//
import SwiftUI
import AppIntents
@main
@@ -13,6 +14,10 @@ struct Interject_App: App {
@StateObject var settings = Settings()
@StateObject var store = Store()
init() {
InterjectShortcuts.updateAppShortcutParameters()
}
var body: some Scene {
WindowGroup {
ContentView()
+1 -1
View File
@@ -24,7 +24,7 @@
{"word": "clay-brained", "meaning": "Rock head"},
{"word": "clouted", "meaning": "Senseless, reeling from being beat"},
{"word": "cockered", "meaning": "Spoiled"},
{"word": "couch-loving", "meaning": "A less than attractive person", "nsfw": "couch-fucking", "nsfwMeaning": "J.D. Vance"},
{"word": "couch-loving", "meaning": "The amourous intention of a rural poet", "nsfw": "couch-fucking", "nsfwMeaning": "The sexual target of a rural poet"},
{"word": "common-kissing", "meaning": "Rogue, a rascal, grabs others without permission"},
{"word": "craven", "meaning": "Cowardly"},
{"word": "crook-pated", "meaning": "A thug, a thief who takes by violence"},