refactor(completions): centralize content scanning
Add a browser-safe ContentRegistry owning path and inline content stores, then derive completions from it. Remove the old block-processor, directive-scanner, and link-source modules in favor of scanDoc, deriveCompletions, and injectSparkDirectives, and register an inline resolver for the frontend file index.
This commit is contained in:
@@ -16,7 +16,8 @@ import type { VarDeclaration, TagModifier } from "./declare-parser";
|
||||
|
||||
// Tagmap pattern: "#warrior:1;#druid:2". Also accepts bare "#tag" as shorthand.
|
||||
const BARE_TAG_PATTERN = /^#[a-zA-Z_][a-zA-Z0-9_]*$/;
|
||||
const TAGMAP_PATTERN = /^#[a-zA-Z_][a-zA-Z0-9_]*:\d+(?:;#[a-zA-Z_][a-zA-Z0-9_]*:\d+)*$/;
|
||||
const TAGMAP_PATTERN =
|
||||
/^#[a-zA-Z_][a-zA-Z0-9_]*:\d+(?:;#[a-zA-Z_][a-zA-Z0-9_]*:\d+)*$/;
|
||||
|
||||
function isTagMapExpr(expr: string): boolean {
|
||||
const t = expr.trim();
|
||||
@@ -33,17 +34,16 @@ function normalizeTagMap(expr: string): string {
|
||||
// Result
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
export type DispatchResult =
|
||||
| { ok: true }
|
||||
| { ok: false; error: string };
|
||||
export type DispatchResult = { ok: true } | { ok: false; error: string };
|
||||
|
||||
/**
|
||||
* Shared signal for dispatch errors from any source (typed or cmd-link clicks).
|
||||
* Components that show errors (JournalInput) read from here; callers that
|
||||
* want errors surfaced (CommandLinkManager) write to it.
|
||||
*/
|
||||
export const [dispatchError, setDispatchError] =
|
||||
createSignal<string | null>(null);
|
||||
export const [dispatchError, setDispatchError] = createSignal<string | null>(
|
||||
null,
|
||||
);
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// Main dispatch
|
||||
@@ -57,7 +57,12 @@ export interface DispatchContext {
|
||||
/** The raw text to dispatch (with or without leading `/`) */
|
||||
command: string;
|
||||
/** Spark table lookup data (from completions) */
|
||||
sparkTables: { slug: string; csvPath?: string; remix?: boolean }[];
|
||||
sparkTables: {
|
||||
slug: string;
|
||||
csvPath?: string;
|
||||
docPath?: string;
|
||||
remix?: boolean;
|
||||
}[];
|
||||
/** Current runtime variable values */
|
||||
variables: Record<string, string>;
|
||||
/** Variable declarations (from role=declare blocks) */
|
||||
@@ -94,7 +99,9 @@ export async function dispatchCommand(
|
||||
}
|
||||
|
||||
if (parsed.type === "set" || parsed.type === "rolltag") {
|
||||
return finish(dispatchSet(parsed.payload as Record<string, unknown>, ctx));
|
||||
return finish(
|
||||
dispatchSet(parsed.payload as Record<string, unknown>, ctx),
|
||||
);
|
||||
}
|
||||
|
||||
return finish({ ok: false, error: "玩家只能发送聊天消息或使用 /set 命令" });
|
||||
@@ -109,8 +116,14 @@ export async function dispatchCommand(
|
||||
if (match) {
|
||||
try {
|
||||
const csvPath = match.csvPath ?? "";
|
||||
const docPath = match.docPath;
|
||||
const remix = match.remix ?? false;
|
||||
const p = await resolveSparkPayload({ key: arg, csvPath, remix });
|
||||
const p = await resolveSparkPayload({
|
||||
key: arg,
|
||||
csvPath,
|
||||
docPath,
|
||||
remix,
|
||||
});
|
||||
const result = sendMessage("spark", p);
|
||||
return finish(unwrap(result));
|
||||
} catch (e) {
|
||||
@@ -226,7 +239,11 @@ function dispatchSet(
|
||||
try {
|
||||
const cascade = computeCascade(key, oldValue, workingVars);
|
||||
for (const change of cascade) {
|
||||
sendMessage("var", { action: "set", key: change.key, value: change.value });
|
||||
sendMessage("var", {
|
||||
action: "set",
|
||||
key: change.key,
|
||||
value: change.value,
|
||||
});
|
||||
}
|
||||
} catch (e) {
|
||||
// Cascade errors are non-fatal — the direct set already succeeded
|
||||
@@ -253,4 +270,4 @@ function unwrap<R>(
|
||||
r: { success: true; msg: R } | { success: false; error: string },
|
||||
): DispatchResult {
|
||||
return r.success ? { ok: true } : { ok: false, error: r.error };
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user