diff --git a/apps/obsidian/src/utils/conceptConversion.ts b/apps/obsidian/src/utils/conceptConversion.ts index 339311234..0d72c6e62 100644 --- a/apps/obsidian/src/utils/conceptConversion.ts +++ b/apps/obsidian/src/utils/conceptConversion.ts @@ -10,6 +10,7 @@ import type { DiscourseNodeInVault } from "./getDiscourseNodes"; import type { LocalConceptDataInput } from "@repo/database/inputTypes"; import type { ObsidianDiscourseNodeData } from "./syncDgNodesToSupabase"; import type { Json } from "@repo/database/dbTypes"; +import { extractContentFromTitle } from "./extractContentFromTitle"; /** * Get extra data (author, timestamps) from file metadata @@ -157,15 +158,24 @@ export const discourseRelationTripleSchemaToLocalConcept = ({ /** * Convert discourse node instance (file) to LocalConceptDataInput */ -export const discourseNodeInstanceToLocalConcept = ( - context: SupabaseContext, - nodeData: ObsidianDiscourseNodeData, -): LocalConceptDataInput => { +export const discourseNodeInstanceToLocalConcept = ({ + context, + nodeData, + nodeTypesById, +}: { + context: SupabaseContext; + nodeData: ObsidianDiscourseNodeData; + nodeTypesById: Record; +}): LocalConceptDataInput => { const extraData = getNodeExtraData(nodeData.file, context.userId); const { nodeInstanceId, nodeTypeId, importedFromRid, ...otherData } = nodeData.frontmatter; const literal_content: Record = { label: nodeData.file.basename, + core_title: extractContentFromTitle( + nodeTypesById[nodeData.nodeTypeId]?.format ?? "", + nodeData.file.basename, + ), source_data: otherData as unknown as Json, }; if (importedFromRid && typeof importedFromRid === "string") diff --git a/apps/obsidian/src/utils/extractContentFromTitle.ts b/apps/obsidian/src/utils/extractContentFromTitle.ts index 1d5153d7d..4a4bd0042 100644 --- a/apps/obsidian/src/utils/extractContentFromTitle.ts +++ b/apps/obsidian/src/utils/extractContentFromTitle.ts @@ -1,10 +1,24 @@ import { getDiscourseNodeFormatExpression } from "./getDiscourseNodeFormatExpression"; -export const extractContentFromTitle = (format: string, title: string): string => { +export const extractContentFromTitle = ( + format: string, + title: string, +): string => { if (!format) return title; + const placeholderRegex = /{([a-zA-Z]+)}/g; + const placeholders: string[] = []; + let placeholderMatch: RegExpExecArray | null; + while ((placeholderMatch = placeholderRegex.exec(format))) { + placeholders.push(placeholderMatch[1] ?? ""); + } const regex = getDiscourseNodeFormatExpression(format); - const match = title.match(regex); + const match = regex.exec(title); + if (!match) return title; - return match?.[1]?.trim() || title; + const contentIndex = placeholders.findIndex( + (name) => name.toLowerCase() === "content", + ); + const capture = contentIndex >= 0 ? match[contentIndex + 1] : match[1]; + return capture === undefined ? title : capture.trim(); }; diff --git a/apps/obsidian/src/utils/syncDgNodesToSupabase.ts b/apps/obsidian/src/utils/syncDgNodesToSupabase.ts index e8021f346..72d22410e 100644 --- a/apps/obsidian/src/utils/syncDgNodesToSupabase.ts +++ b/apps/obsidian/src/utils/syncDgNodesToSupabase.ts @@ -452,7 +452,6 @@ export const syncAllNodesAndRelations = async ( nodesSince: changedNodeInstances, supabaseClient, context, - accountLocalId, plugin, allNodes, fullSync: true, @@ -470,7 +469,6 @@ const convertDgToSupabaseConcepts = async ({ nodesSince, supabaseClient, context, - accountLocalId, plugin, allNodes, fullSync, @@ -478,7 +476,6 @@ const convertDgToSupabaseConcepts = async ({ nodesSince: ObsidianDiscourseNodeData[]; supabaseClient: DGSupabaseClient; context: SupabaseContext; - accountLocalId: string; plugin: DiscourseGraphPlugin; allNodes?: DiscourseNodeInVault[]; fullSync?: boolean; @@ -594,7 +591,11 @@ const convertDgToSupabaseConcepts = async ({ .filter((n) => !!n); const nodeInstanceToLocalConcepts = nodesSince.map((node) => { - return discourseNodeInstanceToLocalConcept(context, node); + return discourseNodeInstanceToLocalConcept({ + context, + nodeData: node, + nodeTypesById, + }); }); const relationInstancesData = await loadRelations(plugin); @@ -817,7 +818,6 @@ const syncChangedNodesToSupabase = async ({ nodesSince: nodesNeedingConceptUpsert, supabaseClient, context, - accountLocalId, plugin, });