7#include "CoreMinimal.h"
8#include "Dom/JsonValue.h"
9#include "ArticyTextExtension.generated.h"
11using FArticyUserMethodCallback = TFunction<FString(
const TArray<FString>&)>;
17enum class EArticyObjectType : uint8
33 template<
typename... Types>
41 template<
typename ... Types>
45 TMap<FString, TFunction<FString(Types...)>> CallbackMap,
49 void AddUserMethod(
const FString& MethodName, FArticyUserMethodCallback Callback);
52 FString GetSource(UObject* Outer,
const FString &SourceName)
const;
53 FString FormatNumber(
const FString &SourceValue,
const FString &NumberFormat)
const;
54 void GetGlobalVariable(UObject* Outer,
const FString& SourceName,
const FArticyGvName GvName, FString& OutString,
bool& OutSuccess)
const;
55 void GetObjectProperty(UObject* Outer,
const FString& SourceName,
const FString& NameOrId,
const FString& PropertyName,
const bool bRequestType, FString& OutString,
bool& OutSuccess)
const;
56 static void GetTypeProperty(
const FString& TypeName,
const FString& PropertyName, FString& OutString,
bool& OutSuccess);
57 FString ExecuteMethod(UObject* Outer,
const FText& Method,
const TArray<FString>& Args)
const;
59 FString ResolveBoolean(UObject* Outer,
const FString &SourceName,
const bool Value)
const;
60 FString LocalizeString(UObject* Outer,
const FString &Input)
const;
61 static void SplitInstance(
const FString& InString, FString& OutName, FString& OutInstanceNumber);
63 TMap<FString, FArticyUserMethodCallback> UserMethodMap;
66template<
typename ... Types>
67FText UArticyTextExtension::Resolve(UObject* Outer,
const FText* Format, Types... Args)
const
70 if (Format ==
nullptr)
72 return FText::GetEmpty();
75 TArray<FString> ArgumentValues = {FString::Printf(TEXT(
"%s"), Args)...};
77 FString FormattedString = Format->ToString();
80 for (int32 ArgIndex = 0; ArgIndex < ArgumentValues.Num(); ++ArgIndex)
82 const FString Placeholder = FString::Printf(TEXT(
"{%d}"), ArgIndex);
83 FormattedString = FormattedString.Replace(*Placeholder, *ArgumentValues[ArgIndex]);
89 const int32 TokenStartIndex = FormattedString.Find(TEXT(
"["), ESearchCase::CaseSensitive);
90 if (TokenStartIndex == INDEX_NONE)
93 const int32 TokenEndIndex = FormattedString.Find(TEXT(
"]"), ESearchCase::CaseSensitive, ESearchDir::FromStart, TokenStartIndex);
94 if (TokenEndIndex == INDEX_NONE)
97 FString Token = FormattedString.Mid(TokenStartIndex + 1, TokenEndIndex - TokenStartIndex - 1);
98 FString FullToken = FormattedString.Mid(TokenStartIndex, TokenEndIndex - TokenStartIndex + 1);
99 FString SourceName, Formatting;
101 Token.Split(TEXT(
":"), &SourceName, &Formatting);
102 if (SourceName.IsEmpty())
107 if (!SourceName.IsEmpty())
110 FString SourceValue = GetSource(Outer, SourceName);
112 if (!Formatting.IsEmpty())
115 FString FormattedValue = FormatNumber(SourceValue, Formatting);
116 FormattedString = FormattedString.Replace(*FullToken, *FormattedValue);
120 FormattedString = FormattedString.Replace(*FullToken, *SourceValue);
126 FormattedString = FormattedString.Replace(*FullToken, TEXT(
""));
130 return FText::FromString(FormattedString);
133template<
typename ... Types>
134FText UArticyTextExtension::ResolveAdvance(
const FText& Format, TMap<FString, TFunction<FString(Types...)>> CallbackMap, Types... Args)
const
136 TArray<FString> ArgumentValues = {FString::Printf(TEXT(
"%s"), Args)...};
138 FString FormattedString = Format.ToString();
141 for (int32 ArgIndex = 0; ArgIndex < ArgumentValues.Num(); ++ArgIndex)
143 const FString Placeholder = FString::Printf(TEXT(
"{%d}"), ArgIndex);
144 FormattedString = FormattedString.Replace(*Placeholder, *ArgumentValues[ArgIndex]);
150 const int32 TokenStartIndex = FormattedString.Find(TEXT(
"["), ESearchCase::CaseSensitive);
151 if (TokenStartIndex == INDEX_NONE)
154 const int32 TokenEndIndex = FormattedString.Find(TEXT(
"]"), ESearchCase::CaseSensitive, ESearchDir::FromStart, TokenStartIndex);
155 if (TokenEndIndex == INDEX_NONE)
158 FString Token = FormattedString.Mid(TokenStartIndex + 1, TokenEndIndex - TokenStartIndex - 1);
159 FString FullToken = FormattedString.Mid(TokenStartIndex, TokenEndIndex - TokenStartIndex + 1);
160 FString SourceName, Formatting;
162 Token.Split(TEXT(
":"), &SourceName, &Formatting);
163 if (SourceName.IsEmpty())
168 if (!SourceName.IsEmpty())
170 TFunction<FString(Types...)> Callback;
171 if (CallbackMap.Contains(SourceName))
173 Callback = CallbackMap[SourceName];
174 FString ReplacementValue = Callback(Args...);
175 FormattedString = FormattedString.Replace(*FullToken, *ReplacementValue);
179 FormattedString = FormattedString.Replace(*FullToken, TEXT(
""));
184 FormattedString = FormattedString.Replace(*FullToken, TEXT(
""));
188 return FText::FromString(FormattedString);
Definition ArticyGlobalVariables.h:320
Definition ArticyGlobalVariables.h:168
Definition ArticyGlobalVariables.h:359
Definition ArticyTextExtension.h:27
Definition ArticyGlobalVariables.h:89
Definition ArticyGlobalVariables.h:64