Last active
September 9, 2018 16:23
-
-
Save PetarKirov/eaf7076a7b83a556fac0c058b0525270 to your computer and use it in GitHub Desktop.
Variable expansion in Dub
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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