google-docs-mcp / src /tools /docs /smartChipHelpers.ts
iFightDucks's picture
Initial HF Space deploy: a-bonus/google-docs-mcp with HF metadata
7dc28be
import { docs_v1 } from 'googleapis';
import * as GDocsHelpers from '../../googleDocsApiHelpers.js';
export interface ExtractedSmartChip {
type: 'date' | 'richLink' | 'person';
startIndex: number | null;
endIndex: number | null;
text?: string | null;
properties: Record<string, unknown>;
}
function getContentSource(
doc: docs_v1.Schema$Document,
tabId?: string
): docs_v1.Schema$StructuralElement[] {
if (tabId) {
const targetTab = GDocsHelpers.findTabById(doc, tabId);
if (!targetTab?.documentTab?.body?.content) return [];
return targetTab.documentTab.body.content;
}
if (doc.body?.content) return doc.body.content;
if (doc.tabs?.[0]?.documentTab?.body?.content) return doc.tabs[0].documentTab.body.content;
return [];
}
function visitContent(
content: docs_v1.Schema$StructuralElement[],
out: ExtractedSmartChip[]
): void {
for (const element of content) {
for (const paragraphElement of element.paragraph?.elements ?? []) {
if (paragraphElement.dateElement) {
out.push({
type: 'date',
startIndex: paragraphElement.startIndex ?? null,
endIndex: paragraphElement.endIndex ?? null,
text: paragraphElement.dateElement.dateElementProperties?.displayText ?? null,
properties: {
dateId: paragraphElement.dateElement.dateId ?? null,
...paragraphElement.dateElement.dateElementProperties,
},
});
}
if (paragraphElement.richLink) {
out.push({
type: 'richLink',
startIndex: paragraphElement.startIndex ?? null,
endIndex: paragraphElement.endIndex ?? null,
text: paragraphElement.richLink.richLinkProperties?.title ?? null,
properties: {
richLinkId: paragraphElement.richLink.richLinkId ?? null,
...paragraphElement.richLink.richLinkProperties,
},
});
}
if (paragraphElement.person) {
out.push({
type: 'person',
startIndex: paragraphElement.startIndex ?? null,
endIndex: paragraphElement.endIndex ?? null,
text:
paragraphElement.person.personProperties?.name ??
paragraphElement.person.personProperties?.email ??
null,
properties: {
personId: paragraphElement.person.personId ?? null,
...paragraphElement.person.personProperties,
},
});
}
}
if (element.table?.tableRows) {
for (const row of element.table.tableRows) {
for (const cell of row.tableCells ?? []) {
visitContent(cell.content ?? [], out);
}
}
}
}
}
export function extractSmartChips(
doc: docs_v1.Schema$Document,
tabId?: string
): ExtractedSmartChip[] {
const content = getContentSource(doc, tabId);
const chips: ExtractedSmartChip[] = [];
visitContent(content, chips);
return chips;
}