diff --git a/public/index.html b/public/index.html index 73a8680c..5a00546e 100644 --- a/public/index.html +++ b/public/index.html @@ -8,7 +8,7 @@

-
+
diff --git a/src/app/app.ts b/src/app/app.ts index 79f0703c..a5c638e6 100644 --- a/src/app/app.ts +++ b/src/app/app.ts @@ -1,43 +1,26 @@ +import { RootNode } from '../nodes/RootNode' import { EnumNode } from '../nodes/EnumNode' import { ObjectNode } from '../nodes/ObjectNode' import { StringNode } from '../nodes/StringNode' const EntityCollection = ['sheep', 'pig'] -const predicateTree = { - id: 'predicate', - fields: { - condition: new EnumNode(['foo', 'bar'], { - transform: (s: string) => (s === 'foo') ? {predicate: 'baz'} : s - }), - predicate: new ObjectNode({ - type: new EnumNode(EntityCollection, {}), - nbt: new StringNode() - }) - } -}; - -function renderTree(tree: any, data: any) { - return Object.keys(tree.fields).map(f => - tree.fields[f].render(f, data[f]) - ).join('
'); -} - -function serializeTree(tree: any, data: any) { - let res: any = {} - Object.keys(tree.fields).forEach(f => - res[f] = tree.fields[f].transform(data[f]) - ) - return JSON.stringify(res); -} +const predicateTree = new RootNode('predicate', { + condition: new EnumNode(['foo', 'bar'], { + transform: (s: string) => (s === 'foo') ? {test: 'baz'} : s + }), + predicate: new ObjectNode({ + type: new EnumNode(EntityCollection, {}), + nbt: new StringNode() + }) +}); let dummyData = { condition: 'foo', - chance: 0.4, predicate: { nbt: 'hi' } } -document!.getElementById('view')!.innerHTML = renderTree(predicateTree, dummyData) -document!.getElementById('source')!.textContent = serializeTree(predicateTree, dummyData) +document!.getElementById('view')!.innerHTML = predicateTree.render('', dummyData) +document!.getElementById('source')!.textContent = predicateTree.transform(dummyData) diff --git a/src/nodes/EnumNode.ts b/src/nodes/EnumNode.ts index 4d233f6e..d2a56152 100644 --- a/src/nodes/EnumNode.ts +++ b/src/nodes/EnumNode.ts @@ -1,7 +1,7 @@ import { AbstractNode, NodeMods } from './AbstractNode' export class EnumNode extends AbstractNode { - private options: string[] + protected options: string[] constructor(options: string[], mods?: NodeMods) { super(mods) diff --git a/src/nodes/ObjectNode.ts b/src/nodes/ObjectNode.ts index b57ef76a..d34ebd5d 100644 --- a/src/nodes/ObjectNode.ts +++ b/src/nodes/ObjectNode.ts @@ -1,9 +1,13 @@ import { AbstractNode, NodeChildren, NodeMods } from './AbstractNode' -export class ObjectNode extends AbstractNode { - private fields: NodeChildren +export interface IObject { + [name: string]: any +} - constructor(fields: NodeChildren, mods?: NodeMods) { +export class ObjectNode extends AbstractNode { + protected fields: NodeChildren + + constructor(fields: NodeChildren, mods?: NodeMods) { super(mods) this.fields = fields Object.values(fields).forEach(child => { @@ -11,11 +15,25 @@ export class ObjectNode extends AbstractNode { }) } - render(field: string, value: any) { + getFields() { + return this.fields + } + + transform(value: IObject) { + if (value === undefined) return undefined value = value || {} - return `${field}:
+ let res: any = {} + Object.keys(this.fields).forEach(f => + res[f] = this.fields[f].transform(value[f]) + ) + return res; + } + + render(field: string, value: IObject) { + if (value === undefined) return `` + return `${field}:
${Object.keys(this.fields).map(f => { - return '> ' + this.fields[f].render(f, value[f]) + return this.fields[f].render(f, value[f]) }).join('
')}
` } diff --git a/src/nodes/RootNode.ts b/src/nodes/RootNode.ts new file mode 100644 index 00000000..75758641 --- /dev/null +++ b/src/nodes/RootNode.ts @@ -0,0 +1,24 @@ +import { NodeChildren, NodeMods } from './AbstractNode' +import { ObjectNode, IObject } from './ObjectNode' + +export class RootNode extends ObjectNode { + private id: string + + constructor(id: string, fields: NodeChildren, mods?: NodeMods) { + super(fields, mods) + this.id = id + } + + transform(value: IObject) { + return JSON.stringify(super.transform(value)) + } + + render(field: string, value: IObject) { + value = value || {} + return `
+ ${Object.keys(this.fields).map(f => { + return this.fields[f].render(f, value[f]) + }).join('
')} +
` + } +}