+1








766fb96ff2
* Adding support for hosting with URL prefix to make reverse-proxy setup on sub-path possible
* Adjusting recent changes to auth.html (changing to relative URLs) after rebasing from upstream
* Adjusting service_worker and application manifest to support URL-prefix
* Add notes on Space Lua Pattern Matching (#1366)
* Remove common/space_lua/stdlib/math.md (#1371)
* Escape pipe symbol in string.gsub (#1370)
* feat: configure vim in CONFIG (#1369)
* Fix week calculation (#1368)
* Add more tests for week calculation
* Fix week calculation
* Add more tests
* Implement Lua built-in function os.difftime (#1367)
* Implement Lua built-in function os.difftime
* Test os.difftime
---------
Co-authored-by: Zef Hemel <zef@zef.me>
* Fix index page naming during server initialization (#1365)
* Allow non-zero shell exit codes (#1377)
* Generate version from git describe at build time (#1374)
* Generate version from git describe at build time
* Add 2.0-beta prefix
* Use Deno.Command instead of Deno.run
* Add missing case to math.random and check arguments (#1372)
* Fix paragraphs for the tag page (#1376)
* Render a predefined string for empty markdown table instead of pipe characters (#1387)
* Fix string.find (#1390)
* Fetch tags and history for proper version string generation (#1388)
* Fix support for disabling shortcuts (#1393)
* Add GitHub Actions Cache to reduce build times (#1394)
* Order strings in queries using collation algorithm (#1391)
Configurable with queryCollation, default value maintains old behaviour.
Added tests, schema, example settings, and documentation to query page.
Close: #614
Close: #1316
* Utility function to handle empty query results and templates (#1386)
* Add global Lua function 'some'
Moved documentation for 'each' function to non-standard section.
* Revert "Add optional argument to template.each for empty collection output (#1359)"
This reverts commit b73dadec67.
* Reimplement #1359 using 'some' function
* Update Lua to event.listEvents to match plugos syscall (#1397)
The documentation, example, and other function names use
`event.listEvents`, but `event.list` is being registered with the
client.
* Update widget header to not overflow container (#1410)
Also add a 10px margin below the header to maintain consistent spacing
around the widget contents.
* fix: case insensitive admonitions by default (#1409)
* fix: closing bracket is missing (#1408)
* Add optional priority attribute to PageCreatingContent (#1392)
* Add optional priority attribute to PageCreatingContent
* Minor simplification
* Fix comments
* Revert changes
* Add pageEventHandlers
* Use UTC year, month, and date for strings lacking time components (#1403)
* feat: allow CONFIG.md in any directory (#1398)
* fix: bundle external dependencies (#1379)
* Deno bump
* Copy-edit splash screen text (#1413)
* Fixes #1401 by implementing Lua's select
* Fixes offline capability of PWA (I hope).
Now storing config in localStorage.
* fix lint
* Reduce blast radius of Lua errors
* Fixes #1411: adds 'priority' setting for space style
* Refactor: Merging common/ into web/
* Fixes #1400
* Improves #1312 by rendering Lua expressions (but not widgets)
* Fix minor typos, add configuration to the docs
---------
Co-authored-by: wbhouston <wmbhouston@gmail.com>
Co-authored-by: Lennart Ochel <lennart.ochel@outlook.com>
Co-authored-by: Matthias Benaets <89214559+MatthiasBenaets@users.noreply.github.com>
Co-authored-by: Zef Hemel <zef@zef.me>
Co-authored-by: Marek S. Łukasiewicz <marek@lukasiewicz.tech>
Co-authored-by: Ivan Alejandro <ivanalejandro0@gmail.com>
Co-authored-by: Albert-Jan de Vries <aj+github@albert-jandevries.nl>
Co-authored-by: Cole Stowell <121599022+costowell@users.noreply.github.com>
Co-authored-by: Jim Tittsler <jimt@onjapan.net>
155 lines
4.3 KiB
TypeScript
155 lines
4.3 KiB
TypeScript
import { parseExpressionString } from "../parse.ts";
|
|
import type { LuaExpression } from "../ast.ts";
|
|
import { evalExpression } from "../eval.ts";
|
|
import {
|
|
LuaBuiltinFunction,
|
|
LuaEnv,
|
|
LuaRuntimeError,
|
|
type LuaStackFrame,
|
|
LuaTable,
|
|
luaToString,
|
|
luaValueToJS,
|
|
singleResult,
|
|
} from "../runtime.ts";
|
|
|
|
/**
|
|
* These are Space Lua specific functions that are available to all scripts, but are not part of the standard Lua language.
|
|
*/
|
|
|
|
/**
|
|
* Helper function to create an augmented environment
|
|
*/
|
|
function createAugmentedEnv(
|
|
sf: LuaStackFrame,
|
|
envAugmentation?: LuaTable,
|
|
): LuaEnv {
|
|
const globalEnv = sf.threadLocal.get("_GLOBAL");
|
|
if (!globalEnv) {
|
|
throw new Error("_GLOBAL not defined");
|
|
}
|
|
const env = new LuaEnv(globalEnv);
|
|
if (envAugmentation) {
|
|
env.setLocal("_", envAugmentation);
|
|
for (const key of envAugmentation.keys()) {
|
|
env.setLocal(key, envAugmentation.rawGet(key));
|
|
}
|
|
}
|
|
return env;
|
|
}
|
|
|
|
/**
|
|
* Interpolates a string with lua expressions and returns the result.
|
|
*
|
|
* @param sf - The current space_lua state.
|
|
* @param template - The template string to interpolate.
|
|
* @param envAugmentation - An optional environment to augment the global environment with.
|
|
* @returns The interpolated string.
|
|
*/
|
|
export async function interpolateLuaString(
|
|
sf: LuaStackFrame,
|
|
template: string,
|
|
envAugmentation?: LuaTable,
|
|
): Promise<string> {
|
|
let result = "";
|
|
let currentIndex = 0;
|
|
|
|
while (true) {
|
|
const startIndex = template.indexOf("${", currentIndex);
|
|
if (startIndex === -1) {
|
|
result += template.slice(currentIndex);
|
|
break;
|
|
}
|
|
|
|
result += template.slice(currentIndex, startIndex);
|
|
|
|
// Find matching closing brace by counting nesting
|
|
let nestLevel = 1;
|
|
let endIndex = startIndex + 2;
|
|
while (nestLevel > 0 && endIndex < template.length) {
|
|
if (template[endIndex] === "{") {
|
|
nestLevel++;
|
|
} else if (template[endIndex] === "}") {
|
|
nestLevel--;
|
|
}
|
|
if (nestLevel > 0) {
|
|
endIndex++;
|
|
}
|
|
}
|
|
|
|
if (nestLevel > 0) {
|
|
throw new LuaRuntimeError("Unclosed interpolation expression", sf);
|
|
}
|
|
|
|
const expr = template.slice(startIndex + 2, endIndex);
|
|
try {
|
|
const parsedExpr = parseExpressionString(expr);
|
|
const env = createAugmentedEnv(sf, envAugmentation);
|
|
const luaResult = await luaValueToJS(
|
|
singleResult(await evalExpression(parsedExpr, env, sf)),
|
|
sf,
|
|
);
|
|
result += await luaToString(luaResult);
|
|
} catch (e: any) {
|
|
throw new LuaRuntimeError(
|
|
`Error evaluating "${expr}": ${e.message}`,
|
|
sf,
|
|
);
|
|
}
|
|
|
|
currentIndex = endIndex + 1;
|
|
}
|
|
|
|
return result;
|
|
}
|
|
|
|
export const spaceluaApi = new LuaTable({
|
|
/**
|
|
* Parses a lua expression and returns the parsed expression.
|
|
*
|
|
* @param sf - The current space_lua state.
|
|
* @param luaExpression - The lua expression to parse.
|
|
* @returns The parsed expression.
|
|
*/
|
|
parseExpression: new LuaBuiltinFunction(
|
|
(_sf, luaExpression: string) => {
|
|
return parseExpressionString(luaExpression);
|
|
},
|
|
),
|
|
/**
|
|
* Evaluates a parsed lua expression and returns the result.
|
|
*
|
|
* @param sf - The current space_lua state.
|
|
* @param parsedExpr - The parsed lua expression to evaluate.
|
|
* @param envAugmentation - An optional environment to augment the global environment with.
|
|
* @returns The result of the evaluated expression.
|
|
*/
|
|
evalExpression: new LuaBuiltinFunction(
|
|
async (sf, parsedExpr: LuaExpression, envAugmentation?: LuaTable) => {
|
|
const env = createAugmentedEnv(sf, envAugmentation);
|
|
return luaValueToJS(await evalExpression(parsedExpr, env, sf), sf);
|
|
},
|
|
),
|
|
/**
|
|
* Interpolates a string with lua expressions and returns the result.
|
|
*/
|
|
interpolate: new LuaBuiltinFunction(
|
|
(sf, template: string, envAugmentation?: LuaTable) => {
|
|
return interpolateLuaString(sf, template, envAugmentation);
|
|
},
|
|
),
|
|
/**
|
|
* Returns your SilverBullet instance's base URL, or `undefined` when run on the server
|
|
*/
|
|
baseUrl: new LuaBuiltinFunction(
|
|
() => {
|
|
// Deal with Deno
|
|
if (typeof location === "undefined") {
|
|
return null;
|
|
} else {
|
|
//NOTE: Removing trailing slash to stay compatible with original code: `location.protocol + "//" + location.host;`
|
|
return document.baseURI.replace(/\/*$/, "");
|
|
}
|
|
},
|
|
),
|
|
});
|