static IResourceLoader resourceLoaderFromDir(File dir) { ret new IResourceLoader { public S loadSnippet(S snippetID) { ret loadTextFile(newFile(dir, psI(snippetID) + ".text")); } public S getTranspiled(S snippetID) { S src = loadTextFile(newFile(dir, psI(snippetID) + ".transpiled")); if (empty(src)) print("Warning: Transpilation for " + snippetID + " not found"); ret src; } public int getSnippetType(S snippetID) { ret parseInt(loadTextFileTrim(newFile(dir, snippetID + ".type"))); } public S getSnippetTitle(S snippetID) { ret loadTextFileTrim(newFile(dir, snippetID + ".title")); } public File loadLibrary(S snippetID) { long id = psI(snippetID); if (isImageServerSnippet(id)) ret assertIsFile(oneOfTheFilesInDir(dir, id + ".png", id + ".gif")); else ret assertIsFile(newFile(dir, id + ".bin")); } }; }