Add regex support for "find and replace" variable action

This commit is contained in:
WarmUpTill 2024-01-07 02:08:12 +01:00 committed by WarmUpTill
parent 668bba16ea
commit 8ba246a349
4 changed files with 56 additions and 19 deletions

View File

@ -883,7 +883,7 @@ AdvSceneSwitcher.action.variable.currentSegmentValue="Current value:"
AdvSceneSwitcher.action.variable.entry="{{actions}}{{variables}}{{variables2}}{{strValue}}{{numValue}}{{segmentIndex}}{{mathExpression}}{{envVariableName}}{{scenes}}{{tempVars}}{{sceneItemIndex}}"
AdvSceneSwitcher.action.variable.entry.substringIndex="Substring start:{{subStringStart}}Substring size:{{subStringSize}}"
AdvSceneSwitcher.action.variable.entry.substringRegex="Assign value of{{regexMatchIdx}}match using regular expression:"
AdvSceneSwitcher.action.variable.entry.findAndReplace="{{findStr}}{{replaceStr}}"
AdvSceneSwitcher.action.variable.entry.findAndReplace="{{findStr}}{{findRegex}}{{replaceStr}}"
AdvSceneSwitcher.action.variable.entry.userInput.customPrompt="{{useCustomPrompt}}Use custom prompt{{inputPrompt}}"
AdvSceneSwitcher.action.variable.entry.userInput.placeholder="{{useInputPlaceholder}}Fill with placeholder{{inputPlaceholder}}"
AdvSceneSwitcher.action.projector="Projector"

View File

@ -648,7 +648,6 @@ AdvSceneSwitcher.action.variable.conditionNoVariableSupport="不支持从 %1 条
AdvSceneSwitcher.action.variable.currentSegmentValue="当前值:"
AdvSceneSwitcher.action.variable.entry.substringIndex="子字符串开始:{{subStringStart}} 子字符串大小:{{subStringSize}}"
AdvSceneSwitcher.action.variable.entry.substringRegex="使用正则表达式为 {{regexMatchIdx}} 匹配的值:"
AdvSceneSwitcher.action.variable.entry.findAndReplace="{{findStr}}{{replaceStr}}"
AdvSceneSwitcher.action.projector="投影仪"
AdvSceneSwitcher.action.projector.type.source="源"
AdvSceneSwitcher.action.projector.type.scene="场景"

View File

@ -99,7 +99,7 @@ void MacroActionVariable::HandleIndexSubString(Variable *var)
void MacroActionVariable::HandleRegexSubString(Variable *var)
{
const auto curValue = var->Value();
auto regex = _regex.GetRegularExpression(_regexPattern);
auto regex = _subStringRegex.GetRegularExpression(_regexPattern);
if (!regex.isValid()) {
return;
}
@ -123,8 +123,23 @@ void MacroActionVariable::HandleRegexSubString(Variable *var)
void MacroActionVariable::HandleFindAndReplace(Variable *var)
{
auto value = var->Value();
ReplaceAll(value, _findStr, _replaceStr);
var->SetValue(value);
if (!_findRegex.Enabled()) {
ReplaceAll(value, _findStr, _replaceStr);
var->SetValue(value);
return;
}
QString resultString = QString::fromStdString(value);
QString replacement = QString::fromStdString(_replaceStr);
auto regex = _findRegex.GetRegularExpression(_findStr);
auto matchIterator = regex.globalMatch(QString::fromStdString(value));
int offset = 0;
while (matchIterator.hasNext()) {
QRegularExpressionMatch match = matchIterator.next();
resultString.replace(match.capturedStart() + offset,
match.capturedLength(), replacement);
offset += replacement.length() - match.capturedLength();
}
var->SetValue(resultString.toStdString());
}
void MacroActionVariable::HandleMathExpression(Variable *var)
@ -253,7 +268,7 @@ bool MacroActionVariable::PerformAction()
return true;
}
case Type::SUBSTRING: {
if (_regex.Enabled()) {
if (_subStringRegex.Enabled()) {
HandleRegexSubString(var.get());
return true;
}
@ -348,9 +363,10 @@ bool MacroActionVariable::Save(obs_data_t *obj) const
obs_data_set_int(obj, "subStringSize", _subStringSize);
obs_data_set_string(obj, "regexPattern", _regexPattern.c_str());
obs_data_set_int(obj, "regexMatchIdx", _regexMatchIdx);
_findRegex.Save(obj, "findRegex");
_findStr.Save(obj, "findStr");
_replaceStr.Save(obj, "replaceStr");
_regex.Save(obj);
_subStringRegex.Save(obj);
_mathExpression.Save(obj, "mathExpression");
obs_data_set_bool(obj, "useCustomPrompt", _useCustomPrompt);
_inputPrompt.Save(obj, "inputPrompt");
@ -376,9 +392,10 @@ bool MacroActionVariable::Load(obs_data_t *obj)
_segmentIdxLoadValue = obs_data_get_int(obj, "segmentIdx");
_subStringStart = obs_data_get_int(obj, "subStringStart");
_subStringSize = obs_data_get_int(obj, "subStringSize");
_regex.Load(obj);
_subStringRegex.Load(obj);
_regexPattern = obs_data_get_string(obj, "regexPattern");
_regexMatchIdx = obs_data_get_int(obj, "regexMatchIdx");
_findRegex.Load(obj, "findRegex");
_findStr.Load(obj, "findStr");
_replaceStr.Load(obj, "replaceStr");
_mathExpression.Load(obj, "mathExpression");
@ -502,10 +519,11 @@ MacroActionVariableEdit::MacroActionVariableEdit(
_subStringRegexEntryLayout(new QHBoxLayout()),
_subStringStart(new QSpinBox()),
_subStringSize(new QSpinBox()),
_regex(new RegexConfigWidget(parent)),
_substringRegex(new RegexConfigWidget(parent)),
_regexPattern(new ResizingPlainTextEdit(this, 10, 1, 1)),
_regexMatchIdx(new QSpinBox()),
_findReplaceLayout(new QHBoxLayout()),
_findRegex(new RegexConfigWidget()),
_findStr(new VariableTextEdit(this, 10, 1, 1)),
_replaceStr(new VariableTextEdit(this, 10, 1, 1)),
_mathExpression(new VariableLineEdit(this)),
@ -561,13 +579,16 @@ MacroActionVariableEdit::MacroActionVariableEdit(
SLOT(SubStringStartChanged(int)));
QWidget::connect(_subStringSize, SIGNAL(valueChanged(int)), this,
SLOT(SubStringSizeChanged(int)));
QWidget::connect(_regex,
QWidget::connect(_substringRegex,
SIGNAL(RegexConfigChanged(const RegexConfig &)), this,
SLOT(RegexChanged(const RegexConfig &)));
SLOT(SubStringRegexChanged(const RegexConfig &)));
QWidget::connect(_regexPattern, SIGNAL(textChanged()), this,
SLOT(RegexPatternChanged()));
QWidget::connect(_regexMatchIdx, SIGNAL(valueChanged(int)), this,
SLOT(RegexMatchIdxChanged(int)));
QWidget::connect(_findRegex,
SIGNAL(RegexConfigChanged(const RegexConfig &)), this,
SLOT(FindRegexChanged(const RegexConfig &)));
QWidget::connect(_findStr, SIGNAL(textChanged()), this,
SLOT(FindStrValueChanged()));
QWidget::connect(_replaceStr, SIGNAL(textChanged()), this,
@ -604,6 +625,7 @@ MacroActionVariableEdit::MacroActionVariableEdit(
{"{{subStringStart}}", _subStringStart},
{"{{subStringSize}}", _subStringSize},
{"{{regexMatchIdx}}", _regexMatchIdx},
{"{{findRegex}}", _findRegex},
{"{{findStr}}", _findStr},
{"{{replaceStr}}", _replaceStr},
{"{{mathExpression}}", _mathExpression},
@ -644,7 +666,7 @@ MacroActionVariableEdit::MacroActionVariableEdit(
_placeholderLayout, widgetPlaceholders);
auto regexConfigLayout = new QHBoxLayout;
regexConfigLayout->addWidget(_regex);
regexConfigLayout->addWidget(_substringRegex);
regexConfigLayout->addStretch();
_substringLayout->addLayout(_subStringIndexEntryLayout);
@ -694,7 +716,8 @@ void MacroActionVariableEdit::UpdateEntryData()
: MacroSegmentSelection::Type::ACTION);
_subStringStart->setValue(_entryData->_subStringStart + 1);
_subStringSize->setValue(_entryData->_subStringSize);
_regex->SetRegexConfig(_entryData->_regex);
_substringRegex->SetRegexConfig(_entryData->_subStringRegex);
_findRegex->SetRegexConfig(_entryData->_findRegex);
_regexPattern->setPlainText(
QString::fromStdString(_entryData->_regexPattern));
_regexMatchIdx->setValue(_entryData->_regexMatchIdx + 1);
@ -903,14 +926,14 @@ void MacroActionVariableEdit::SubStringSizeChanged(int val)
_entryData->_subStringSize = val;
}
void MacroActionVariableEdit::RegexChanged(const RegexConfig &conf)
void MacroActionVariableEdit::SubStringRegexChanged(const RegexConfig &conf)
{
if (_loading || !_entryData) {
return;
}
auto lock = LockContext();
_entryData->_regex = conf;
_entryData->_subStringRegex = conf;
SetWidgetVisibility();
}
@ -949,6 +972,18 @@ void MacroActionVariableEdit::FindStrValueChanged()
updateGeometry();
}
void MacroActionVariableEdit::FindRegexChanged(const RegexConfig &conf)
{
if (_loading || !_entryData) {
return;
}
auto lock = LockContext();
_entryData->_findRegex = conf;
adjustSize();
updateGeometry();
}
void MacroActionVariableEdit::ReplaceStrValueChanged()
{
if (_loading || !_entryData) {
@ -1113,7 +1148,7 @@ void MacroActionVariableEdit::SetWidgetVisibility()
_entryData->_type ==
MacroActionVariable::Type::SUBSTRING);
if (_entryData->_type == MacroActionVariable::Type::SUBSTRING) {
bool showRegex = _entryData->_regex.Enabled();
bool showRegex = _entryData->_subStringRegex.Enabled();
SetLayoutVisible(_subStringIndexEntryLayout, !showRegex);
SetLayoutVisible(_subStringRegexEntryLayout, showRegex);
_regexPattern->setVisible(showRegex);

View File

@ -55,9 +55,10 @@ public:
double _numValue = 0;
int _subStringStart = 0;
int _subStringSize = 0;
RegexConfig _regex = RegexConfig::PartialMatchRegexConfig();
RegexConfig _subStringRegex = RegexConfig::PartialMatchRegexConfig();
std::string _regexPattern = ".*";
int _regexMatchIdx = 0;
RegexConfig _findRegex;
StringVariable _findStr = obs_module_text(
"AdvSceneSwitcher.action.variable.findAndReplace.find");
StringVariable _replaceStr = obs_module_text(
@ -120,10 +121,11 @@ private slots:
void MacroSegmentOrderChanged();
void SubStringStartChanged(int val);
void SubStringSizeChanged(int val);
void RegexChanged(const RegexConfig &conf);
void SubStringRegexChanged(const RegexConfig &conf);
void RegexPatternChanged();
void RegexMatchIdxChanged(int val);
void FindStrValueChanged();
void FindRegexChanged(const RegexConfig &conf);
void ReplaceStrValueChanged();
void MathExpressionChanged();
void UseCustomPromptChanged(int);
@ -155,10 +157,11 @@ private:
QHBoxLayout *_subStringRegexEntryLayout;
QSpinBox *_subStringStart;
QSpinBox *_subStringSize;
RegexConfigWidget *_regex;
RegexConfigWidget *_substringRegex;
ResizingPlainTextEdit *_regexPattern;
QSpinBox *_regexMatchIdx;
QHBoxLayout *_findReplaceLayout;
RegexConfigWidget *_findRegex;
VariableTextEdit *_findStr;
VariableTextEdit *_replaceStr;
VariableLineEdit *_mathExpression;