Skip to content

Commit

Permalink
improve server side html template js api
Browse files Browse the repository at this point in the history
  • Loading branch information
ptrthomas committed May 16, 2021
1 parent 5640e1a commit 252aab7
Show file tree
Hide file tree
Showing 8 changed files with 62 additions and 12 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -988,7 +988,7 @@ public void doc(String exp) {
}
if (templateEngine == null) {
String prefixedPath = runtime.featureRuntime.rootFeature.feature.getResource().getPrefixedParentPath();
templateEngine = TemplateUtils.forResourcePath(JS, prefixedPath);
templateEngine = TemplateUtils.forResourceRoot(JS, prefixedPath);
}
String html = templateEngine.process(path);
runtime.embed(FileUtils.toBytes(html), ResourceType.HTML);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,8 +25,11 @@

import com.intuit.karate.FileUtils;
import com.intuit.karate.graal.JsArray;
import com.intuit.karate.graal.JsEngine;
import com.intuit.karate.graal.JsValue;
import com.intuit.karate.graal.Methods;
import com.intuit.karate.template.KarateTemplateEngine;
import com.intuit.karate.template.TemplateUtils;
import io.netty.handler.codec.http.cookie.Cookie;
import io.netty.handler.codec.http.cookie.ServerCookieDecoder;
import java.io.InputStream;
Expand Down Expand Up @@ -108,6 +111,43 @@ public ServerContext(ServerConfig config, Request request, Map<String, Object> v
}
return http;
};
RENDER_FUNCTION = o -> {
if (o instanceof String) {
return RequestCycle.get().getTemplateEngine().process((String) o);
}
Map<String, Object> map;
if (o instanceof Map) {
map = (Map) o;
} else {
logger.warn("invalid argument to render: {}", o);
return null;
}
Map<String, Object> templateVars = (Map) map.get("variables");
String path = (String) map.get("path");
if (path != null) {
if (templateVars == null) {
return RequestCycle.get().getTemplateEngine().process(path);
}
JsEngine je = JsEngine.local();
je.putAll(templateVars);
KarateTemplateEngine kte = TemplateUtils.forResourceResolver(je, config.getResourceResolver());
return kte.process(path);
}
String html = (String) map.get("html");
if (html == null) {
logger.warn("invalid argument to render, path or html needed: {}", map);
return null;
}
JsEngine je;
if (templateVars == null) {
je = RequestCycle.get().getEngine();
} else {
je = JsEngine.local();
je.putAll(templateVars);
}
KarateTemplateEngine kte = TemplateUtils.forStrings(je);
return kte.process(html);
};
}

private static final String DOT_JS = ".js";
Expand Down Expand Up @@ -273,7 +313,9 @@ public void afterSettle(String js) {

private static final Supplier<String> UUID_FUNCTION = () -> java.util.UUID.randomUUID().toString();
private static final Function<String, Object> FROM_JSON_FUNCTION = s -> JsValue.fromString(s, false, null);

private final Methods.FunVar HTTP_FUNCTION; // set in constructor
private final Function<Object, String> RENDER_FUNCTION; // set in constructor

private final Consumer<String> SWITCH_FUNCTION = s -> {
if (switched) {
Expand Down Expand Up @@ -307,8 +349,6 @@ public void afterSettle(String js) {
return o;
};

private final Function<String, String> RENDER_FUNCTION = s -> RequestCycle.get().getTemplateEngine().process(s);

@Override
public Object getMember(String key) {
switch (key) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ default File render() {

default File render(String reportDir) {
JsEngine je = getJsEngine();
KarateTemplateEngine engine = TemplateUtils.forResourcePath(je, getResourceRoot());
KarateTemplateEngine engine = TemplateUtils.forResourceRoot(je, getResourceRoot());
String html = engine.process(getTemplate());
if (reportDir == null) {
reportDir = getReportDir();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ private TemplateUtils() {
// only static methods
}

private static final String HTMX_SCRIPT_TAG = "<script src=\"https://unpkg.com/htmx.org@1.2.0\"></script>";
private static final String HTMX_SCRIPT_TAG = "<script src=\"https://unpkg.com/htmx.org@1.3.3\"></script>";

public static IModel generateHeadScriptTag(ITemplateContext ctx) {
IModelFactory modelFactory = ctx.getModelFactory();
Expand Down Expand Up @@ -69,11 +69,14 @@ public static KarateTemplateEngine forStrings(JsEngine je) {
return engine;
}

public static KarateTemplateEngine forResourcePath(JsEngine je, String root) {
ResourceResolver resourceResolver = new ResourceResolver(root);
public static KarateTemplateEngine forResourceResolver(JsEngine je, ResourceResolver resourceResolver) {
KarateTemplateEngine engine = new KarateTemplateEngine(je, new KarateScriptDialect(resourceResolver));
engine.setTemplateResolver(new ResourceHtmlTemplateResolver(resourceResolver));
return engine;
}

public static KarateTemplateEngine forResourceRoot(JsEngine je, String root) {
return forResourceResolver(je, new ResourceResolver(root));
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -197,15 +197,15 @@ void testClassPathToFileThatDoesNotExist() {
@Test
void testFindJsFilesFromFileSystem() {
Set<String> files = ResourceUtils.findJsFilesInDirectory(new File("src/test/java/demo").getAbsoluteFile());
assertEquals(3, files.size());
Match.that(new ArrayList(files)).contains("['api/demo.js', 'api/cats.js', 'api/payments.js']");
assertEquals(4, files.size());
Match.that(new ArrayList(files)).contains("['api/demo.js', 'api/cats.js', 'api/payments.js', 'api/render.js']");
}

@Test
void testFindJsFilesFromClassPath() {
Set<String> files = ResourceUtils.findJsFilesInClassPath("demo");
assertEquals(3, files.size());
Match.that(new ArrayList(files)).contains("['/api/demo.js', '/api/cats.js', '/api/payments.js']");
assertEquals(4, files.size());
Match.that(new ArrayList(files)).contains("['/api/demo.js', '/api/cats.js', '/api/payments.js', '/api/render.js']");
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ void testHtmlString() {
@Test
void testHtmlFile() {
JsEngine je = JsEngine.local();
KarateTemplateEngine engine = TemplateUtils.forResourcePath(je, "classpath:com/intuit/karate/template");
KarateTemplateEngine engine = TemplateUtils.forResourceRoot(je, "classpath:com/intuit/karate/template");
String rendered = engine.process("main.html");
// logger.debug("rendered: {}", rendered);
assertTrue(rendered.contains("<div id=\"before_one\"><span>js_one</span></div>"));
Expand Down
6 changes: 6 additions & 0 deletions karate-core/src/test/java/demo/api/render.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
var someName = 'John';
var msg1 = context.render('api/test');
var msg2 = context.render({path: 'api/test.html', variables: {someName: 'Smith'}});
var msg3 = context.render({html: '<div th:text="someName"></div>'});
var msg4 = context.render({html: '<div th:text="someName"></div>', variables: {someName: 'Smith'}});
response.body = {msg1: msg1, msg2: msg2, msg3: msg3, msg4: msg4};
1 change: 1 addition & 0 deletions karate-core/src/test/java/demo/api/test.html
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
<h1 th:text="someName"></h1>

0 comments on commit 252aab7

Please sign in to comment.