@maxgraph/core
Version:
maxGraph is a fully client side JavaScript diagramming library that uses SVG and HTML for rendering.
277 lines (276 loc) • 9.19 kB
TypeScript
import Cell from '../view/cell/Cell.js';
import type ObjectCodec from './ObjectCodec.js';
/**
* XML codec for JavaScript object graphs. See {@link ObjectCodec} for a
* description of the general encoding/decoding scheme. This class uses the
* codecs registered in {@link CodecRegistry} for encoding/decoding each object.
*
* ### References
*
* In order to resolve references, especially forward references, the Codec
* constructor must be given the document that contains the referenced
* elements.
*
* ### Examples
*
* The following code is used to encode a graph model.
*
* ```javascript
* const encoder = new Codec();
* const result = encoder.encode(graph.getDataModel());
* const xml = xmlUtils.getXml(result);
* ```
*
* **WARN**: as of version 0.6.0, the codecs provided by maxGraph are no longer registered by default, they **MUST** be registered before
* performing `encode` or `decode`. For instance, you can use the {@link registerAllCodecs} function (or other related functions)
* to register the codecs.
*
* #### Example
*
* Using the code below, an XML document is decoded into an existing model. The
* document may be obtained using {@link parseXml} for parsing an XML string.
*
* ```javascript
* const doc = xmlUtils.parseXml(xmlString);
* const codec = new Codec(doc);
* codec.decode(doc.documentElement, graph.getDataModel());
* ```
*
* #### Example
*
* This example demonstrates parsing a list of isolated cells into an existing
* graph model. Note that the cells do not have a parent reference so they can
* be added anywhere in the cell hierarchy after parsing.
*
* ```javascript
* const xml = `<GraphDataModel>
* <root>
* <Cell id="2" value="Hello," vertex="1">
* <Geometry _x="20" _y="20" _width="80" _height="30" as="geometry"/>
* </Cell>
* <Cell id="3" value="World!" vertex="1">
* <Geometry _x="200" _y="150" _width="80" _height="30" as="geometry"/>
* </Cell>
* <Cell id="4" value="" edge="1" source="2" target="3">
* <Geometry relative="1" as="geometry"/>
* </Cell>
* </root>
* </GraphDataModel>
* `;
* const doc = xmlUtils.parseXml(xml);
* const codec = new Codec(doc);
* let elt = doc.documentElement.firstChild;
* const cells = [];
*
* while (elt != null) {
* cells.push(codec.decode(elt));
* elt = elt.nextSibling;
* }
* graph.addCells(cells);
* ```
*
* #### Example
*
* Using the following code, the selection cells of a graph are encoded and the
* output is displayed in a dialog box.
*
* ```javascript
* const enc = new Codec();
* const cells = graph.getSelectionCells();
* const xml = xmlUtils.getPrettyXml(enc.encode(cells));
* ```
*
* Newlines in the XML can be converted to <br>, in which case a '<br>' argument
* must be passed to {@link getXml} as the second argument.
*
* ### Debugging
*
* For debugging, I/O you can use the following code to get the sequence of
* encoded objects:
*
* ```javascript
* const oldEncode = encode;
* encode(obj)
* {
* GlobalConfig.logger.show();
* GlobalConfig.logger.debug('Codec.encode: obj=' + StringUtils.getFunctionName(obj.constructor));
*
* return oldEncode.apply(this, arguments);
* };
* ```
*
* Note that the I/O system adds object codecs for new object automatically. For
* decoding those objects, the constructor should be written as follows:
*
* ```javascript
* var MyObj(name)
* {
* // ...
* };
* ```
*
* @category Serialization with Codecs
*/
declare class Codec {
constructor(document?: XMLDocument);
/**
* The owner document of the codec.
*/
document: XMLDocument;
/**
* Maps from IDs to objects.
*/
objects: {
[key: string]: Element;
};
/**
* Lookup table for resolving IDs to elements.
*/
elements: Record<string, Element>;
/**
* Specifies if default values should be encoded.
* @default false
*/
encodeDefaults: boolean;
/**
* Associates the given object with the given ID and returns the given object.
*
* @param id ID for the object to be associated with.
* @param obj Object to be associated with the ID.
*/
putObject(id: string, obj: any): any;
/**
* Returns the decoded object for the element with the specified ID in
* {@link document}. If the object is not known then {@link lookup} is used to find an
* object. If no object is found, then the element with the respective ID
* from the document is parsed using {@link decode}.
*/
getObject(id: string): any;
/**
* Hook for subclassers to implement a custom lookup mechanism for cell IDs.
* This implementation always returns null.
*
* Example:
*
* ```javascript
* const codec = new Codec();
* codec.lookup(id)
* {
* return model.getCell(id);
* };
* ```
*
* @param id ID of the object to be returned.
*/
lookup(id: string): any;
/**
* Returns the element with the given ID from {@link document}.
*
* @param id String that contains the ID.
*/
getElementById(id: string): Element;
updateElements(): void;
/**
* Adds the given element to {@link elements} if it has an ID.
*/
addElement(node: Element): void;
/**
* Returns the ID of the specified object. This implementation
* calls {@link reference} first and if that returns null handles
* the object as an {@link Cell} by returning their IDs using
* {@link Cell.getId}. If no ID exists for the given cell, then
* an on-the-fly ID is generated using {@link CellPath.create}.
*
* @param obj Object to return the ID for.
*/
getId(obj: any): string;
/**
* Hook for subclassers to implement a custom method
* for retrieving IDs from objects. This implementation
* always returns null.
*
* Example:
*
* ```javascript
* const codec = new Codec();
* codec.reference(obj)
* {
* return obj.getCustomId();
* };
* ```
*
* @param obj Object whose ID should be returned.
*/
reference(obj: any): any;
/**
* Encodes the specified object and returns the resulting XML node.
*
* @param obj Object to be encoded.
*/
encode(obj: any): Element | null;
/**
* Decodes the given XML node. The optional "into"
* argument specifies an existing object to be
* used. If no object is given, then a new instance
* is created using the constructor from the codec.
*
* The function returns the passed in object or
* the new instance if no object was given.
*
* @param node XML node to be decoded.
* @param into Optional object to be decoded into.
*/
decode(node: Element | null, into?: object): object | null;
/**
* Encoding of cell hierarchies is built-into the core, but
* is a higher-level function that needs to be explicitly
* used by the respective object encoders (e.g. {@link ModelCodec},
* {@link ChildChangeCodec} and {@link RootChangeCodec}). This
* implementation writes the given cell and its children as a
* (flat) sequence into the given node. The children are not
* encoded if the optional includeChildren is false. The
* function is in charge of adding the result into the
* given node and has no return value.
*
* @param cell {@link Cell} to be encoded.
* @param node Parent XML node to add the encoded cell into.
* @param includeChildren Optional boolean indicating if the
* function should include all descendents. Default is true.
*/
encodeCell(cell: Cell, node: Node, includeChildren?: boolean): void;
/**
* Returns true if the given codec is a cell codec. This uses
* {@link CellCodec.isCellCodec} to check if the codec is of the
* given type.
*/
isCellCodec(codec: ObjectCodec | null): boolean;
/**
* Decodes cells that have been encoded using inversion, ie.
* where the user object is the enclosing node in the XML,
* and restores the group and graph structure in the cells.
* Returns a new {@link Cell} instance that represents the
* given node.
*
* @param node XML node that contains the cell data.
* @param restoreStructures Optional boolean indicating whether
* the graph structure should be restored by calling insert
* and insertEdge on the parent and terminals, respectively.
* Default is `true`.
*/
decodeCell(node: Element, restoreStructures?: boolean): Cell | null;
/**
* Inserts the given cell into its parent and terminal cells.
*/
insertIntoGraph(cell: Cell): void;
/**
* Sets the attribute on the specified node to value. This is a
* helper method that makes sure the attribute and value arguments
* are not null.
*
* @param node XML node to set the attribute for.
* @param attribute The name of the attribute to be set.
* @param value New value of the attribute.
*/
setAttribute(node: Element, attribute: string, value: any): void;
}
export default Codec;