Lua: include script feature toolset

This commit is contained in:
rusefillc 2023-11-20 20:25:58 -05:00
parent c3fc6cfe7d
commit b7f26a3892
3 changed files with 107 additions and 0 deletions

View File

@ -0,0 +1,5 @@
package com.rusefi.ui.lua;
interface ContentSource {
String getContent(String name);
}

View File

@ -0,0 +1,51 @@
package com.rusefi.ui.lua;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class LuaIncludeSyntax {
static String getScriptName(String lua) {
Pattern p = Pattern.compile(".*--\\s*scriptname\\s*([\\S]+)", Pattern.MULTILINE);
Matcher m = p.matcher(lua);
if (m.find())
return m.group(1);
return null;
}
static String reloadScript(String lua, ContentSource source) {
int index = 0;
Pattern startPattern = Pattern.compile(".*--\\s*include\\s*([\\S]+)", Pattern.MULTILINE);
Pattern endPattern = Pattern.compile(".*--\\s*endinclude", Pattern.MULTILINE);
StringBuilder result = new StringBuilder();
Matcher startMatcher = startPattern.matcher(lua);
Matcher endMatcher = endPattern.matcher(lua);
while (true) {
if (!startMatcher.find(index)) {
break;
}
int endOfIncludeStartIndex = startMatcher.end();
result.append(lua.substring(index, endOfIncludeStartIndex));
result.append("\n");
String includeName = startMatcher.group(1);
result.append(source.getContent(includeName));
if (!endMatcher.find(endOfIncludeStartIndex))
throw new IllegalStateException("No end for " + includeName);
index = endMatcher.end();
}
result.append(lua.substring(index));
return result.toString();
}
}

View File

@ -0,0 +1,51 @@
package com.rusefi.ui.lua;
import org.junit.Test;
import static org.junit.Assert.assertEquals;
public class LuaImportsTest {
@Test
public void testScriptName() {
assertEquals(null, LuaIncludeSyntax.getScriptName(""));
assertEquals("X", LuaIncludeSyntax.getScriptName("-- scriptname X "));
assertEquals("X2", LuaIncludeSyntax.getScriptName("-- scriptname X2\n"));
assertEquals("X3", LuaIncludeSyntax.getScriptName("sdad\n -- scriptname X3\n"));
assertEquals("folder/X3", LuaIncludeSyntax.getScriptName("sdad\n -- scriptname folder/X3\n"));
}
@Test
public void testReloadTwoScripts() {
String lua = "before\n" +
"-- include functions.lua\n" +
"functionOldBody\n" +
"-- endinclude\n" +
"between\n" +
"--include constants.lua \n" +
"oldConstants\n" +
"-- endinclude\n" +
"after";
ContentSource source = name -> {
if (name.equals("functions.lua"))
return "newFunction";
if (name.equals("constants.lua"))
return "newConstant";
throw new IllegalStateException();
};
String newLua = LuaIncludeSyntax.reloadScript(lua, source);
assertEquals("before\n" +
"-- include functions.lua\n" +
"newFunction\n" +
"between\n" +
"--include constants.lua\n" +
"newConstant\n" +
"after", newLua);
}
}