From 66fcf0bf64fe34d555c21ee97d9a9ae356922633 Mon Sep 17 00:00:00 2001 From: Brandon Jordan Date: Wed, 17 Jan 2024 18:58:25 -0500 Subject: [PATCH 1/9] Add raw string token --- token.go | 1 + 1 file changed, 1 insertion(+) diff --git a/token.go b/token.go index bf604e5..1d33ee2 100644 --- a/token.go +++ b/token.go @@ -60,6 +60,7 @@ const ( const ( String tokenType = "text" + RawString tokenType = "rawtext" Integer tokenType = "number" Dict tokenType = "dictionary" Arr tokenType = "array" From e3bda9f47b3d66e1845d181c5a57ca35b3bbfcc3 Mon Sep 17 00:00:00 2001 From: Brandon Jordan Date: Wed, 17 Jan 2024 18:58:44 -0500 Subject: [PATCH 2/9] Collect raw string values in parser --- parser.go | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/parser.go b/parser.go index dba3441..abdad47 100644 --- a/parser.go +++ b/parser.go @@ -286,6 +286,11 @@ func collectValue(valueType *tokenType, value *any, until rune) { if strings.ContainsAny(stringValue, "{}") { checkInlineVars(&stringValue) } + case char == '\'': + advance() + *valueType = RawString + *value = collectUntil('\'') + advance() case char == '[': advance() *valueType = Arr From fc24158654d1a2149dd1e960d9df8530ae8d6aa2 Mon Sep 17 00:00:00 2001 From: Brandon Jordan Date: Wed, 17 Jan 2024 18:59:52 -0500 Subject: [PATCH 3/9] Make raw string values in plist --- plist.go | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/plist.go b/plist.go index f3f579d..6e7bcaf 100644 --- a/plist.go +++ b/plist.go @@ -181,6 +181,8 @@ func makeVariableValue(outputName *plistData, UUID *plistData, valueType tokenTy makeBoolValue(outputName, UUID, value) case String: makeStringValue(outputName, UUID, value) + case RawString: + makeRawStringValue(outputName, UUID, value) case Expression: makeExpressionValue(outputName, UUID, value) case Action: @@ -212,6 +214,18 @@ func makeStringValue(outputName *plistData, UUID *plistData, value *any) { })) } +func makeRawStringValue(outputName *plistData, UUID *plistData, value *any) { + appendPlist(makeStdAction("gettext", []plistData{ + *outputName, + *UUID, + { + key: "WFTextActionText", + dataType: Text, + value: fmt.Sprintf("%s", *value), + }, + })) +} + func makeBoolValue(outputName *plistData, UUID *plistData, value *any) { var boolValue = "0" if *value == true { From 13a4f629513ac7611c5c7527a3b703b4305ce280 Mon Sep 17 00:00:00 2001 From: Brandon Jordan Date: Wed, 17 Jan 2024 19:02:40 -0500 Subject: [PATCH 4/9] Bypass typecheck if expecting string and have raw string --- action.go | 1 + 1 file changed, 1 insertion(+) diff --git a/action.go b/action.go index bb5d86c..469905f 100644 --- a/action.go +++ b/action.go @@ -329,6 +329,7 @@ func typeCheck(param *parameterDefinition, argument *actionArgument) { } case argValueType == Question: case argValueType == Nil: + case param.validType == String && argument.valueType == RawString: case argument.valueType != param.validType: if argValueType == String { argVal = "\"" + argVal.(string) + "\"" From 4882e4ac441e9bdc2fcdc17029c03b9e3aea32a1 Mon Sep 17 00:00:00 2001 From: Brandon Jordan Date: Wed, 17 Jan 2024 19:03:18 -0500 Subject: [PATCH 5/9] Update variables example to use raw strings --- tests/variables.cherri | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/variables.cherri b/tests/variables.cherri index 75c362f..f2cf627 100644 --- a/tests/variables.cherri +++ b/tests/variables.cherri @@ -7,10 +7,11 @@ const immutable = 5 @multiString = "Multiline string var" +@rawString = 'not allowed inline variables, new lines, single quotes, etc. but i compile faster!' @arrayVar = ["item 1 {intVar}","item 2","item 3",5,{"key1":"value","key2":5,"key3":true}] @boolVarTrue = true @boolVarFalse = false -@urlVar = url("https://apple.com","https://google.com") +@urlVar = url('https://apple.com','https://google.com') @dateVar = date("October 5, 2022") @email = emailAddress("test@test.com") @phone = phoneNumber("(555) 555-5555") From 7ba1e95ca21436b1d60e0f083c50be50ac2eaa72 Mon Sep 17 00:00:00 2001 From: Brandon Jordan Date: Wed, 17 Jan 2024 19:26:26 -0500 Subject: [PATCH 6/9] Add raw strings to collect ignore strings --- parser.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/parser.go b/parser.go index abdad47..82d0d43 100644 --- a/parser.go +++ b/parser.go @@ -198,6 +198,9 @@ func collectUntilIgnoreStrings(ch rune) string { if char == '"' { insideString = insideString && prev(1) == '\\' } + if char == '\'' { + insideString = insideString && prev(1) == '\\' + } collected.WriteRune(char) advance() } From 040a13928b721ddf81e2a8bb8b85745595f5d57c Mon Sep 17 00:00:00 2001 From: Brandon Jordan Date: Wed, 17 Jan 2024 19:33:53 -0500 Subject: [PATCH 7/9] Implement collect raw strings to allow escaped single quotes Should be faster otherwise. --- parser.go | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/parser.go b/parser.go index 82d0d43..c1ae440 100644 --- a/parser.go +++ b/parser.go @@ -292,7 +292,7 @@ func collectValue(valueType *tokenType, value *any, until rune) { case char == '\'': advance() *valueType = RawString - *value = collectUntil('\'') + *value = collectRawString() advance() case char == '[': advance() @@ -1121,6 +1121,26 @@ func collectString() string { return collection.String() } +func collectRawString() string { + var collection strings.Builder + for char != -1 { + if char == '\\' && next(1) == '\'' { + collection.WriteRune('\'') + advanceTimes(2) + continue + } + if char == '\'' { + break + } + + collection.WriteRune(char) + advance() + } + advance() + + return collection.String() +} + func collectArray() (array interface{}) { var rawJSON = "{\"array\":[" + collectUntilIgnoreStrings(']') + "]}" if err := json.Unmarshal([]byte(rawJSON), &array); err != nil { From 23df5781812fc8339c6bab30fff0cc5340ace418 Mon Sep 17 00:00:00 2001 From: Brandon Jordan Date: Wed, 17 Jan 2024 19:34:22 -0500 Subject: [PATCH 8/9] Add single quote escape example to variables test raw string example --- tests/variables.cherri | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/variables.cherri b/tests/variables.cherri index f2cf627..7ca3f68 100644 --- a/tests/variables.cherri +++ b/tests/variables.cherri @@ -7,7 +7,7 @@ const immutable = 5 @multiString = "Multiline string var" -@rawString = 'not allowed inline variables, new lines, single quotes, etc. but i compile faster!' +@rawString = 'i\'m not allowed inline variables, new lines, etc. but i compile faster!' @arrayVar = ["item 1 {intVar}","item 2","item 3",5,{"key1":"value","key2":5,"key3":true}] @boolVarTrue = true @boolVarFalse = false From 0cb08d682a14c63ccb5884a482d0c6119be7e0e1 Mon Sep 17 00:00:00 2001 From: Brandon Jordan Date: Wed, 17 Jan 2024 19:54:46 -0500 Subject: [PATCH 9/9] Revert "Add raw strings to collect ignore strings" This reverts commit 7ba1e95ca21436b1d60e0f083c50be50ac2eaa72. --- parser.go | 3 --- 1 file changed, 3 deletions(-) diff --git a/parser.go b/parser.go index c1ae440..b8a7c9e 100644 --- a/parser.go +++ b/parser.go @@ -198,9 +198,6 @@ func collectUntilIgnoreStrings(ch rune) string { if char == '"' { insideString = insideString && prev(1) == '\\' } - if char == '\'' { - insideString = insideString && prev(1) == '\\' - } collected.WriteRune(char) advance() }