Added importer wisemapping

This commit is contained in:
Ezequiel-Vega 2022-03-21 16:02:37 -03:00
parent 968623e4f0
commit cb9f0e7abe
6 changed files with 84 additions and 18 deletions

View File

@ -25,15 +25,17 @@ import XMLSerializerFactory from '../persistence/XMLSerializerFactory';
export default class FreemindImporter extends Importer {
private mindmap: Mindmap;
private freemindInput: string;
private freemindMap: FreemindMap;
private nodesmap: Map<string, NodeModel>;
private relationship: Array<RelationshipModel>;
constructor(map: FreemindMap) {
constructor(map: string) {
super();
this.freemindMap = map;
this.freemindInput = map;
}
import(nameMap: string, description: string): Promise<string> {
@ -42,6 +44,10 @@ export default class FreemindImporter extends Importer {
this.relationship = new Array<RelationshipModel>();
let wiseTopicId = 0;
const parser = new DOMParser();
const freemindDoc = parser.parseFromString(this.freemindInput, 'application/xml');
this.freemindMap = new FreemindMap().loadFromDom(freemindDoc);
const version: string = this.freemindMap.getVersion();
if (!version || version.startsWith('freeplane')) {

View File

@ -1,14 +1,16 @@
import WisemappingImporter from './WisemappingImporter';
import FreemindImporter from './FreemindImporter';
import FreemindMap from '../export/freemind/Map';
import Importer from './Importer';
type textType = 'mm';
type mapType = FreemindMap
type textType = 'wxml' | 'mm';
export default class TextImporterFactory {
static create(type: textType, map: mapType): Importer {
static create(type: textType, map: string): Importer {
let result: Importer;
switch (type) {
case 'wxml':
result = new WisemappingImporter(map);
return result;
case 'mm':
result = new FreemindImporter(map);
return result;

View File

@ -0,0 +1,29 @@
import Mindmap from '../model/Mindmap';
import XMLSerializerFactory from '../persistence/XMLSerializerFactory';
import Importer from './Importer';
export default class WisemappingImporter extends Importer {
private wisemappingInput: string;
private mindmap: Mindmap;
constructor(map: string) {
super();
this.wisemappingInput = map;
}
import(nameMap: string, description: string): Promise<string> {
const parser = new DOMParser();
const wiseDoc = parser.parseFromString(this.wisemappingInput, 'application/xml');
const serialize = XMLSerializerFactory.createInstanceFromDocument(wiseDoc);
this.mindmap = serialize.loadFromDom(wiseDoc, nameMap);
this.mindmap.setDescription(description);
const mindmapToXml = serialize.toXML(this.mindmap);
const xmlStr = new XMLSerializer().serializeToString(mindmapToXml);
return Promise.resolve(xmlStr);
}
}

View File

@ -26,7 +26,9 @@ import MockPersistenceManager from './components/MockPersistenceManager';
import DesignerOptionsBuilder from './components/DesignerOptionsBuilder';
import ImageExporterFactory from './components/export/ImageExporterFactory';
import TextExporterFactory from './components/export/TextExporterFactory';
import TextImporterFactory from './components/import/TextImporterFactory';
import Exporter from './components/export/Exporter';
import Importer from './components/import/Importer';
import DesignerKeyboard from './components/DesignerKeyboard';
import EditorRenderMode from './components/EditorRenderMode';
import ImageIcon from './components/ImageIcon';
@ -61,7 +63,9 @@ export {
EditorRenderMode,
TextExporterFactory,
ImageExporterFactory,
TextImporterFactory,
Exporter,
Importer,
ImageIcon,
$notify,
$msg,

View File

@ -226,7 +226,7 @@ export default class RestClient implements Client {
const errorInfo = this.parseResponseOnError(error.response);
reject(errorInfo);
});
};
};
return new Promise(handler);
}

View File

@ -1,5 +1,6 @@
import Button from '@mui/material/Button';
import FormControl from '@mui/material/FormControl';
import { Importer, TextImporterFactory } from '@wisemapping/mindplot';
import React from 'react';
import { FormattedMessage, useIntl } from 'react-intl';
@ -14,7 +15,7 @@ export type ImportModel = {
title: string;
description?: string;
contentType?: string;
content?: ArrayBuffer | null | string;
content?: null | string;
};
export type CreateProps = {
@ -29,7 +30,7 @@ const ImportDialog = ({ onClose }: CreateProps): React.ReactElement => {
const intl = useIntl();
const mutation = useMutation<number, ErrorInfo, ImportModel>(
(model: ImportModel) => {
(model: ImportModel) => {
return client.importMap(model);
},
{
@ -69,9 +70,6 @@ const ImportDialog = ({ onClose }: CreateProps): React.ReactElement => {
const file = files[0];
// Closure to capture the file information.
reader.onload = (event) => {
const fileContent = event?.target?.result;
model.content = fileContent;
// Suggest file name ...
const fileName = file.name;
if (fileName) {
@ -80,13 +78,40 @@ const ImportDialog = ({ onClose }: CreateProps): React.ReactElement => {
model.title = title;
}
}
model.contentType =
file.name.lastIndexOf('.wxml') != -1
? 'application/xml'
: 'application/freemind';
setModel({ ...model });
};
const extensionFile = file.name.split('.')[1]
const extensionAccept = ['wxml', 'mm'];
if ( extensionAccept.find(ext => ext === extensionFile) ) {
new Error('The file extension is invalid');
}
model.contentType = 'application/xml'
const fileContent = event?.target?.result;
const mapConent: string = typeof fileContent === 'string' ? fileContent : fileContent.toString();
let importer: Importer
switch(extensionFile) {
case 'wxml': {
importer = TextImporterFactory.create('wxml', mapConent);
break;
}
case 'mm': {
importer = TextImporterFactory.create('mm', mapConent);
break;
}
}
importer.import(model.title, model.description)
.then(res => {
model.content = res;
setModel({ ...model });
})
.catch(e => console.log(e));
};
// Read in the image file as a data URL.
reader.readAsText(file);
}