Skip to content

Instantly share code, notes, and snippets.

@PetarKirov
Last active September 9, 2018 16:23
Show Gist options
  • Save PetarKirov/eaf7076a7b83a556fac0c058b0525270 to your computer and use it in GitHub Desktop.
Save PetarKirov/eaf7076a7b83a556fac0c058b0525270 to your computer and use it in GitHub Desktop.
Variable expansion in Dub
import std.array : appender;
import std.regex : regex, replaceAll;
import std.string : format, indexOf, toUpper;
import std.stdio : writeln;
string getVariable(string var)
{
return "<%s>".format(var.toUpper);
}
void main(string[] args)
{
const input = "$ $$ $$$ $$$$ $$$$$ $$$$$$ asd$$var1$var2$var3${var4}${var5}$${var6}$$var7$${var8} a$var9 b$$var10 c$$$var11 d$$$$var12 e$$$$$var13 f$$$$$$var14 g$$$$$$$var15 h$$$$$$$$var16 $$&$!$$?$$$$var18";
writeln("Input:");
input.writeln('\n');
{
writeln("Petar#1:");
auto varRE = regex(`\$([\w_]+)|\$\{([\w_]+)\}|(\$\$[\w_]+|\$\$\{[\w_]+\})`);
input.replaceAll!(m => m[3].length? m[3][1..$] : (getVariable(m[1].length ? m[1] : m[2])))(varRE)
.writeln('\n');
}
{
writeln("Petar#2:");
auto varRE = regex(`\$([\w_]+)|\$\{([\w_]+)\}|(\$\$)`);
input.replaceAll!(m => m[3].length? m[3][1..$] : (getVariable(m[1].length ? m[1] : m[2])))(varRE)
.writeln('\n');
}
{
writeln("Mathias#1:");
auto varRE = regex(`(^|[^\$])\$([\w_]+|\{[\w_]+\})`);
input.replaceAll!(m => m[1] ~ getVariable(m[2][0] == '{' ? m[2][1 .. $ - 1] : m[2]))(varRE)
.replaceAll!(m => `$`)(regex(`\$\$`))
.writeln('\n');
}
{
writeln("Martin:");
auto varRE = regex(`\$([\w_]+)|\$\{([\w_]+)\}`);
input.replaceAll!(m => getVariable(m[1].length ? m[1] : m[2]))(varRE)
.writeln('\n');
}
writeln("Original:");
input.processVars.writeln;
}
string processVars(string var)
{
auto idx = indexOf(var, '$');
if (idx >= 0)
{
auto vres = appender!string();
while (idx >= 0)
{
if (idx+1 >= var.length) break;
if (var[idx+1] == '$')
{
vres.put(var[0 .. idx+1]);
var = var[idx+2 .. $];
}
else
{
vres.put(var[0 .. idx]);
var = var[idx+1 .. $];
size_t idx2 = 0;
while( idx2 < var.length && isIdentChar(var[idx2]) ) idx2++;
auto varname = var[0 .. idx2];
var = var[idx2 .. $];
vres.put(getVariable(varname));
}
idx = indexOf(var, '$');
}
vres.put(var);
var = vres.data;
}
return var;
}
bool isIdentChar(dchar ch)
{
import std.ascii : isAlphaNum;
return isAlphaNum(ch) || ch == '_';
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment