static IResourceLoader resourceLoaderFromJar(File mainJar, File unpackDir) { print("Unpacking to: " + unpackDir); SS titles = cast safeUnstructure(loadTextFileFromZip(mainJar, "snippet-titles.struct")); assertNempty("Snippet titles", titles); Map types = cast safeUnstructure(loadTextFileFromZip(mainJar, "snippet-types.struct")); ret new IResourceLoader { public S loadSnippet(S snippetID) { ret loadTextFileFromZip(mainJar, psI(snippetID) + ".text"); } public S getTranspiled(S snippetID) { S src = loadTextFileFromZip(mainJar, psI(snippetID) + ".transpiled"); if (empty(src)) print("Warning: Transpilation for " + snippetID + " not found"); ret src; } public int getSnippetType(S snippetID) { ret or0(types.get(fsI(snippetID))); } public S getSnippetTitle(S snippetID) { ret titles.get(fsI(snippetID)); } public File loadLibrary(S snippetID) { long id = psI(snippetID); if (isImageServerSnippet(id)) ret optExtractFileFromZipToDir_tryMultipleNames(mainJar, unpackDir, id + ".png", id + ".gif"); else ret optExtractFileFromZipToDir(mainJar, unpackDir, id + ".bin"); } public File pathToJavaXJar() { ret mainJar; } }; }