Render object trees.
This commit is contained in:
parent
3f0ac05513
commit
e89be0feff
@ -47,7 +47,8 @@
|
|||||||
background: #eeeeee;
|
background: #eeeeee;
|
||||||
}
|
}
|
||||||
|
|
||||||
.OrgAstProperties {
|
.OrgAstProperties,
|
||||||
|
.OrgAstObjectTree {
|
||||||
border: 1px solid #000000;
|
border: 1px solid #000000;
|
||||||
margin: 5px;
|
margin: 5px;
|
||||||
|
|
||||||
@ -77,3 +78,19 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.OrgAstObjectTree {
|
||||||
|
> tbody {
|
||||||
|
border-style: dashed;
|
||||||
|
border-color: #000000;
|
||||||
|
}
|
||||||
|
> tbody:not(:first-child, :last-child) {
|
||||||
|
border-width: 3px 0;
|
||||||
|
}
|
||||||
|
> tbody:first-child:not(:only-child) {
|
||||||
|
border-width: 0 0 3px 0;
|
||||||
|
}
|
||||||
|
> tbody:last-child:not(:only-child) {
|
||||||
|
border-width: 3px 0 0 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
1
src/OrgAst.module.css.d.ts
vendored
1
src/OrgAst.module.css.d.ts
vendored
@ -4,3 +4,4 @@ export const OrgAstNodeType: string;
|
|||||||
export const OrgAstChildren: string;
|
export const OrgAstChildren: string;
|
||||||
export const selected: string;
|
export const selected: string;
|
||||||
export const OrgAstProperties: string;
|
export const OrgAstProperties: string;
|
||||||
|
export const OrgAstObjectTree: string;
|
||||||
|
@ -172,11 +172,107 @@ const OrgPropertyValue = (props: {
|
|||||||
selectedNode: string;
|
selectedNode: string;
|
||||||
value: any;
|
value: any;
|
||||||
}): React.ReactNode => {
|
}): React.ReactNode => {
|
||||||
return JSON.stringify(props.value);
|
if (
|
||||||
|
props.value === null ||
|
||||||
|
is_primitive(props.value) ||
|
||||||
|
(is_array(props.value) && props.value.length === 0)
|
||||||
|
) {
|
||||||
|
return JSON.stringify(props.value);
|
||||||
|
} else if (is_list_of_ast_nodes(props.value)) {
|
||||||
|
return (
|
||||||
|
<div className={styles.OrgAstChildren}>
|
||||||
|
<OrgAstNodeList
|
||||||
|
selectNode={props.selectNode}
|
||||||
|
parentUniqueId={props.parentUniqueId}
|
||||||
|
selectedNode={props.selectedNode}
|
||||||
|
node_list={props.value}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
} else if (is_object_tree(props.value)) {
|
||||||
|
return (
|
||||||
|
<OrgObjectTree
|
||||||
|
selectNode={props.selectNode}
|
||||||
|
parentUniqueId={props.parentUniqueId}
|
||||||
|
selectedNode={props.selectedNode}
|
||||||
|
value={props.value}
|
||||||
|
/>
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
alert("Unhandled property value! " + JSON.stringify(props.value));
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
interface OrgObjectTreeProps {
|
||||||
|
selectNode: Function;
|
||||||
|
parentUniqueId: string;
|
||||||
|
selectedNode: string;
|
||||||
|
value: any;
|
||||||
|
}
|
||||||
|
|
||||||
|
function OrgObjectTree({
|
||||||
|
selectNode,
|
||||||
|
parentUniqueId,
|
||||||
|
selectedNode,
|
||||||
|
value,
|
||||||
|
}: OrgObjectTreeProps): React.ReactNode {
|
||||||
|
const entries = value["object-tree"].map((entry: any) => {
|
||||||
|
return (
|
||||||
|
<tbody>
|
||||||
|
<tr>
|
||||||
|
<th scope="row">Optional value:</th>
|
||||||
|
<td>
|
||||||
|
<OrgAstNodeList
|
||||||
|
selectNode={selectNode}
|
||||||
|
parentUniqueId={parentUniqueId}
|
||||||
|
selectedNode={selectedNode}
|
||||||
|
node_list={entry[0]}
|
||||||
|
/>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<th scope="row">Value:</th>
|
||||||
|
<td>
|
||||||
|
<OrgAstNodeList
|
||||||
|
selectNode={selectNode}
|
||||||
|
parentUniqueId={parentUniqueId}
|
||||||
|
selectedNode={selectedNode}
|
||||||
|
node_list={entry[1]}
|
||||||
|
/>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
);
|
||||||
|
});
|
||||||
|
return <table className={styles.OrgAstObjectTree}>{entries}</table>;
|
||||||
|
}
|
||||||
|
|
||||||
function is_object(val: any): boolean {
|
function is_object(val: any): boolean {
|
||||||
return val instanceof Object && !(val instanceof Array);
|
return val instanceof Object && !(val instanceof Array);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function is_array(val: any): boolean {
|
||||||
|
return val instanceof Array;
|
||||||
|
}
|
||||||
|
|
||||||
|
function is_primitive(val: any): boolean | null {
|
||||||
|
if (val === null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return !(val instanceof Object || val instanceof Array);
|
||||||
|
}
|
||||||
|
|
||||||
|
function is_list_of_ast_nodes(val: any): boolean {
|
||||||
|
if (!is_array(val)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return val.every((entry: any) => {
|
||||||
|
return is_object(entry) && entry.hasOwnProperty("ast-node");
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function is_object_tree(val: any): boolean {
|
||||||
|
return is_object(val) && val.hasOwnProperty("object-tree");
|
||||||
|
}
|
||||||
|
|
||||||
export default OrgAst;
|
export default OrgAst;
|
||||||
|
Loading…
Reference in New Issue
Block a user