aboutsummaryrefslogtreecommitdiff
path: root/src/fields/Doc.ts
diff options
context:
space:
mode:
Diffstat (limited to 'src/fields/Doc.ts')
-rw-r--r--src/fields/Doc.ts39
1 files changed, 27 insertions, 12 deletions
diff --git a/src/fields/Doc.ts b/src/fields/Doc.ts
index ff416bbe7..f4141cf46 100644
--- a/src/fields/Doc.ts
+++ b/src/fields/Doc.ts
@@ -18,7 +18,7 @@ import {
DocAcl, DocCss, DocData, DocFields, DocLayout, DocViews, FieldKeys, FieldTuples, ForceServerWrite, Height, Highlight,
Initializing, Self, SelfProxy, UpdatingFromServer, Width
} from './DocSymbols'; // prettier-ignore
-import { Copy, FieldChanged, HandleUpdate, Id, Parent, ToScriptString, ToString } from './FieldSymbols';
+import { Copy, FieldChanged, HandleUpdate, Id, Parent, ToJavascriptString, ToScriptString, ToString } from './FieldSymbols';
import { InkField, InkTool } from './InkField';
import { List, ListFieldName } from './List';
import { ObjectField } from './ObjectField';
@@ -52,6 +52,23 @@ export namespace Field {
default: return field?.[ToScriptString]?.() ?? 'null';
} // prettier-ignore
}
+ export function toJavascriptString(field: Field) {
+ var rawjava = '';
+
+ switch (typeof field) {
+ case 'string':
+ case 'number':
+ case 'boolean':rawjava = String(field);
+ break;
+ default: rawjava = field?.[ToJavascriptString]?.() ?? 'null';
+ } // prettier-ignore
+ var script = rawjava;
+ Doc.MyPublishedDocs.forEach(doc => {
+ const regex = new RegExp(`^\\^${doc.title}\\s`, 'm');
+ script = script.replace(regex, Cast(doc.text, RichTextField, null)?.Text ?? '');
+ });
+ return script;
+ }
export function toString(field: Field) {
if (typeof field === 'string' || typeof field === 'number' || typeof field === 'boolean') return String(field);
return field?.[ToString]?.() || '';
@@ -287,6 +304,7 @@ export class Doc extends RefField {
public [DocFields] = () => this[Self][FieldTuples]; // Object.keys(this).reduce((fields, key) => { fields[key] = this[key]; return fields; }, {} as any);
public [Width] = () => NumCast(this[SelfProxy]._width);
public [Height] = () => NumCast(this[SelfProxy]._height);
+ public [ToJavascriptString] = () => `idToDoc("${this[Self][Id]}")`; // what should go here?
public [ToScriptString] = () => `idToDoc("${this[Self][Id]}")`;
public [ToString] = () => `Doc(${GetEffectiveAcl(this[SelfProxy]) === AclPrivate ? '-inaccessible-' : this[SelfProxy].title})`;
public get [DocLayout]() { return this[SelfProxy].__LAYOUT__; } // prettier-ignore
@@ -508,12 +526,9 @@ export namespace Doc {
* Removes doc from the list of Docs at listDoc[fieldKey]
* @returns true if successful, false otherwise.
*/
- export function RemoveDocFromList(listDoc: Doc, fieldKey: string | undefined, doc: Doc) {
+ export function RemoveDocFromList(listDoc: Doc, fieldKey: string | undefined, doc: Doc, ignoreProto = false) {
const key = fieldKey ? fieldKey : Doc.LayoutFieldKey(listDoc);
- if (listDoc[key] === undefined) {
- listDoc[DocData][key] = new List<Doc>();
- }
- const list = Cast(listDoc[key], listSpec(Doc));
+ const list = Doc.Get(listDoc, key, ignoreProto) === undefined ? (listDoc[DocData][key] = new List<Doc>()) : Cast(listDoc[key], listSpec(Doc));
if (list) {
const ind = list.indexOf(doc);
if (ind !== -1) {
@@ -528,12 +543,9 @@ export namespace Doc {
* Adds doc to the list of Docs stored at listDoc[fieldKey].
* @returns true if successful, false otherwise.
*/
- export function AddDocToList(listDoc: Doc, fieldKey: string | undefined, doc: Doc, relativeTo?: Doc, before?: boolean, first?: boolean, allowDuplicates?: boolean, reversed?: boolean) {
+ export function AddDocToList(listDoc: Doc, fieldKey: string | undefined, doc: Doc, relativeTo?: Doc, before?: boolean, first?: boolean, allowDuplicates?: boolean, reversed?: boolean, ignoreProto?: boolean) {
const key = fieldKey ? fieldKey : Doc.LayoutFieldKey(listDoc);
- if (listDoc[key] === undefined) {
- listDoc[DocData][key] = new List<Doc>();
- }
- const list = Cast(listDoc[key], listSpec(Doc));
+ const list = Doc.Get(listDoc, key, ignoreProto) === undefined ? (listDoc[DocData][key] = new List<Doc>()) : Cast(listDoc[key], listSpec(Doc));
if (list) {
if (!allowDuplicates) {
const pind = list.findIndex(d => d instanceof Doc && d[Id] === doc[Id]);
@@ -1020,7 +1032,7 @@ export namespace Doc {
//
export function MakeMetadataFieldTemplate(templateField: Doc, templateDoc: Opt<Doc>): boolean {
// find the metadata field key that this template field doc will display (indicated by its title)
- const metadataFieldKey = StrCast(templateField.isTemplateForField) || StrCast(templateField.title).replace(/^-/, '');
+ const metadataFieldKey = StrCast(templateField.isTemplateForField) || StrCast(templateField.title).replace(/^-/, '') || Doc.LayoutFieldKey(templateField);
// update the original template to mark it as a template
templateField.isTemplateForField = metadataFieldKey;
@@ -1640,3 +1652,6 @@ ScriptingGlobals.add(function setDocFilter(container: Doc, key: string, value: a
ScriptingGlobals.add(function setDocRangeFilter(container: Doc, key: string, range: number[]) {
Doc.setDocRangeFilter(container, key, range);
});
+ScriptingGlobals.add(function toJavascriptString(str: string) {
+ return Field.toJavascriptString(str as Field);
+});