think migration is almost done, at least for set tag.

This commit is contained in:
barant 2025-01-08 17:04:36 -08:00
parent 5c27df59da
commit b3693e8017
3 changed files with 39 additions and 36 deletions

71
Tag.cpp
View File

@ -112,15 +112,16 @@ namespace jet {
coreutils::MString Tag::resolveKeyword(coreutils::ZString keyword) {
coreutils::MString resolved;
keyword.reset();
while(!keyword.eod()) {
if(keyword.startsWith("$[") || keyword.startsWith("#[")) {
resolved.write(getVariable(keyword));
keywords[keyword].reset();
while(!keywords[keyword].eod()) {
if(keywords[keyword].startsWith("$[") || keywords[keyword].startsWith("#[")) {
resolved.write(getVariable(keywords[keyword]));
} else {
resolved.write(keyword.charAt(0));
keyword.nextChar();
resolved.write(keywords[keyword].charAt(0));
keywords[keyword].nextChar();
}
}
keywords[keyword].reset();
return resolved;
}
@ -216,7 +217,7 @@ namespace jet {
}
} else if(in.startsWith("$[") || in.startsWith("#[")) {
global.errorCursor = in.getCursor();
out.write(getVariable(in));
out.write(getVariable(in, true));
} else {
out.write(in.nextChar());
}
@ -377,7 +378,7 @@ namespace jet {
return false;
}
coreutils::MString Tag::getVariable(coreutils::ZString &variable) {
coreutils::MString Tag::getVariable(coreutils::ZString &variable, bool inContainer) {
if(variable.ifNext("$[")) {
coreutils::MString name;
coreutils::MString modifier;
@ -386,7 +387,10 @@ namespace jet {
return global.variables[name];
} else if(variable.ifNext("%")) {
renderVariableName(variable, name, modifier);
return keywords[name];
if(inContainer)
return keywords[name];
else
return parent->keywords[name];
} else if(variable.ifNext(":")) {
renderVariableName(variable, name, modifier);
if(name.find(":") == -1) {
@ -440,37 +444,36 @@ namespace jet {
void Tag::storeVariable(coreutils::ZString variable) {
if(keywordDefined("expr")) {
if(!keywordDefined("scope") || (keywords["scope"] == "global"))
global.variables[keywords[variable]] = Operand(keywords["expr"], *this).string;
else if(keywords["scope"] == "local")
local->variables[keywords[variable]] = Operand(keywords["expr"], *this).string;
else if(keywords["scope"] == "parent")
local->parent->variables[keywords[variable]] = Operand(keywords["expr"], *this).string;
if(!keywordDefined("scope") || (resolveKeyword("scope") == "global"))
global.variables[variable] = Operand(keywords["expr"], *this).string;
else if(resolveKeyword("scope") == "local")
local->variables[variable] = Operand(keywords["expr"], *this).string;
else if(resolveKeyword("scope") == "parent")
local->parent->variables[variable] = Operand(keywords["expr"], *this).string;
} else if(hasContainer) {
processContainer(container);
if(evaluate) {
if(!keywordDefined("scope") || (keywords["scope"] == "global"))
global.variables[keywords[variable]] = out;
else if(keywords["scope"] == "local")
local->variables[keywords[variable]] = out;
else if(keywords["scope"] == "parent")
local->parent->variables[keywords[variable]] = out;
if(!keywordDefined("scope") || (resolveKeyword("scope") == "global"))
global.variables[variable] = out;
else if(resolveKeyword("scope") == "local")
local->variables[variable] = out;
else if(resolveKeyword("scope") == "parent")
local->parent->variables[variable] = out;
} else {
if(!keywordDefined("scope") || (keywords["scope"] == "global"))
global.variables[keywords[variable]] = container;
else if(keywords["scope"] == "local")
local->variables[keywords[variable]] = container;
else if(keywords["scope"] == "parent")
local->parent->variables[keywords[variable]] = container;
if(!keywordDefined("scope") || (resolveKeyword("scope") == "global"))
global.variables[variable] = container;
else if(resolveKeyword("scope") == "local")
local->variables[variable] = container;
else if(resolveKeyword("scope") == "parent")
local->parent->variables[variable] = container;
}
} else {
resolveKeyword("value");
if(!keywordDefined("scope") || (keywords["scope"] == "global"))
global.variables[keywords[variable]] = keywords["value"];
else if(keywords["scope"] == "local")
local->variables[keywords[variable]] = keywords["value"];
else if(keywords["scope"] == "parent")
local->parent->variables[keywords[variable]] = keywords["value"];
if(!keywordDefined("scope") || (resolveKeyword("scope") == "global"))
global.variables[variable] = resolveKeyword("value");
else if(resolveKeyword("scope") == "local")
local->variables[variable] = resolveKeyword("value");
else if(resolveKeyword("scope") == "parent")
local->parent->variables[variable] = resolveKeyword("value");
}
}

2
Tag.h
View File

@ -14,7 +14,7 @@ namespace jet {
Tag(coreutils::ZString &in, coreutils::MString &parentOut, Global &global, Tag *parent = NULL, Tag *local = NULL, coreutils::ZString splitTagName = "");
virtual ~Tag();
coreutils::MString getVariable(coreutils::ZString &variable);
coreutils::MString getVariable(coreutils::ZString &variable, bool inContainer = false);
coreutils::MString resolveKeyword(coreutils::ZString keyword);
std::map<coreutils::MString, coreutils::MString> variables;

View File

@ -19,7 +19,7 @@ namespace jet {
if(keywordDefined("expr") && keywordDefined("eval"))
throw coreutils::Exception("Cannot use eval with expr.");
storeVariable(keywords[resolveKeyword("name")]);
storeVariable(resolveKeyword("name"));
}