aboutsummaryrefslogtreecommitdiff
path: root/src/client/documents/DocFromField.ts
diff options
context:
space:
mode:
authorbobzel <zzzman@gmail.com>2024-05-14 23:15:24 -0400
committerbobzel <zzzman@gmail.com>2024-05-14 23:15:24 -0400
commit3534aaf88a3c30a474b3b5a5b7f04adfe6f15fac (patch)
tree47fb7a8671b209bd4d76e0f755a5b035c6936607 /src/client/documents/DocFromField.ts
parent87bca251d87b5a95da06b2212400ce9427152193 (diff)
parent5cb7ad90e120123ca572e8ef5b1aa6ca41581134 (diff)
Merge branch 'restoringEslint' into sarah-ai-visualization
Diffstat (limited to 'src/client/documents/DocFromField.ts')
-rw-r--r--src/client/documents/DocFromField.ts31
1 files changed, 31 insertions, 0 deletions
diff --git a/src/client/documents/DocFromField.ts b/src/client/documents/DocFromField.ts
new file mode 100644
index 000000000..b65bbbdf5
--- /dev/null
+++ b/src/client/documents/DocFromField.ts
@@ -0,0 +1,31 @@
+import { Doc, DocListCast } from '../../fields/Doc';
+import { InkField } from '../../fields/InkField';
+import { List } from '../../fields/List';
+import { StrCast } from '../../fields/Types';
+import { AudioField, ImageField, PdfField, VideoField } from '../../fields/URLField';
+import { Docs, DocumentOptions } from './Documents';
+
+/**
+ * Changes the field key in the doc's layout string to be the specified field
+ */
+export function ResetLayoutFieldKey(doc: Doc, fieldKey: string) {
+ doc.layout = StrCast(doc.layout).replace(/={'.*'}/, `={'${fieldKey}'}`);
+ return doc;
+}
+export function DocumentFromField(target: Doc, fieldKey: string, proto?: Doc, options?: DocumentOptions): Doc | undefined {
+ const field = target[fieldKey];
+ const resolved = options ?? {};
+ const nonDocFieldToDoc = () => {
+ if (field instanceof ImageField) return Docs.Create.ImageDocument(field.url.href, resolved);
+ if (field instanceof VideoField) return Docs.Create.VideoDocument(field.url.href, resolved);
+ if (field instanceof PdfField) return Docs.Create.PdfDocument(field.url.href, resolved);
+ if (field instanceof AudioField) return Docs.Create.AudioDocument(field.url.href, resolved);
+ if (field instanceof InkField) return Docs.Create.InkDocument(field.inkData, resolved);
+ if (field instanceof List && field[0] instanceof Doc) return Docs.Create.StackingDocument(DocListCast(field), resolved);
+ return Docs.Create.TextDocument('', { ...{ _width: 200, _height: 25, _layout_autoHeight: true }, ...resolved });
+ };
+ const created = field instanceof Doc ? field : ResetLayoutFieldKey(nonDocFieldToDoc(), fieldKey);
+ created.title = fieldKey;
+ proto && created.proto && (created.proto = Doc.GetProto(proto));
+ return created;
+}