Commit d90f302b authored by techird's avatar techird

导入导出功能

parent d91df167
...@@ -22,6 +22,6 @@ ...@@ -22,6 +22,6 @@
</div> </div>
</body> </body>
<script> <script>
KM.getKityMinder('kityminder'); window.m = KM.getKityMinder('kityminder');
</script> </script>
</html> </html>
\ No newline at end of file
...@@ -51,7 +51,8 @@ $dependency = Array( ...@@ -51,7 +51,8 @@ $dependency = Array(
,'src/adapter/adapter.js' ,'src/adapter/adapter.js'
,'src/adapter/button.js' ,'src/adapter/button.js'
,'src/adapter/combobox.js' ,'src/adapter/combobox.js'
,'src/protocal/plain.js'
,'src/protocal/json.js'
); );
$content = ""; $content = "";
......
utils.extend(KityMinder,function(){ utils.extend( KityMinder, function () {
var _kityminderUI = {}, var _kityminderUI = {},
_activeWidget = null, _activeWidget = null,
_widgetData = {}, _widgetData = {},
_widgetCallBack = {}; _widgetCallBack = {};
return { return {
registerUI:function(uiname,fn){ registerUI: function ( uiname, fn ) {
utils.each(uiname.split(/\s+/), function (i,name) { utils.each( uiname.split( /\s+/ ), function ( i, name ) {
_kityminderUI[name] = fn; _kityminderUI[ name ] = fn;
}) } )
}, },
_createUI:function(id){ _createUI: function ( id ) {
var $cont = $('<div class="kmui-container"></div>'), var $cont = $( '<div class="kmui-container"></div>' ),
$toolbar = $.kmuitoolbar(), $toolbar = $.kmuitoolbar(),
$kmbody = $('<div class="kmui-editor-body"></div>'), $kmbody = $( '<div class="kmui-editor-body"></div>' ),
$statusbar = $('<div class="kmui-statusbar"></div>'); $statusbar = $( '<div class="kmui-statusbar"></div>' );
$cont.append($toolbar).append($kmbody).append($statusbar); $cont.append( $toolbar ).append( $kmbody ).append( $statusbar );
$(utils.isString(id) ? '#' + id : id).append($cont); $( utils.isString( id ) ? '#' + id : id ).append( $cont );
return { return {
'$container':$cont, '$container': $cont,
'$toolbar':$toolbar, '$toolbar': $toolbar,
'$body':$kmbody, '$body': $kmbody,
'$statusbar':$statusbar '$statusbar': $statusbar
}; };
}, },
_createToolbar:function($toolbar,km){ _createToolbar: function ( $toolbar, km ) {
var toolbars = km.getOptions('toolbars'); var toolbars = km.getOptions( 'toolbars' );
if (toolbars && toolbars.length) { if ( toolbars && toolbars.length ) {
var btns = []; var btns = [];
$.each(toolbars,function(i,uiNames){ $.each( toolbars, function ( i, uiNames ) {
$.each(uiNames.split(/\s+/),function(index,name){ $.each( uiNames.split( /\s+/ ), function ( index, name ) {
if(name == '|'){ if ( name == '|' ) {
$.kmuiseparator && btns.push($.kmuiseparator()); $.kmuiseparator && btns.push( $.kmuiseparator() );
}else{ } else {
if(_kityminderUI[name]){ if ( _kityminderUI[ name ] ) {
var ui = _kityminderUI[name].call(km,name); var ui = _kityminderUI[ name ].call( km, name );
ui && btns.push(ui); ui && btns.push( ui );
} }
} }
}); } );
btns.length && $toolbar.kmui().appendToBtnmenu(btns); btns.length && $toolbar.kmui().appendToBtnmenu( btns );
}); } );
} }
$toolbar.append($('<div class="kmui-dialog-container"></div>')); $toolbar.append( $( '<div class="kmui-dialog-container"></div>' ) );
}, },
_createStatusbar:function($statusbar,km){ _createStatusbar: function ( $statusbar, km ) {
}, },
getKityMinder:function(id,options){ getKityMinder: function ( id, options ) {
var containers = this._createUI(id); var containers = this._createUI( id );
var km = this.getMinder(containers.$body.get(0),options); var km = this.getMinder( containers.$body.get( 0 ), options );
this._createToolbar(containers.$toolbar,km); this._createToolbar( containers.$toolbar, km );
this._createStatusbar(containers.$statusbar,km); this._createStatusbar( containers.$statusbar, km );
km.$container = containers.$container; km.$container = containers.$container;
return km;
}, },
registerWidget : function(name,pro,cb){ registerWidget: function ( name, pro, cb ) {
_widgetData[name] = $.extend2(pro,{ _widgetData[ name ] = $.extend2( pro, {
$root : '', $root: '',
_preventDefault:false, _preventDefault: false,
root:function($el){ root: function ( $el ) {
return this.$root || (this.$root = $el); return this.$root || ( this.$root = $el );
}, },
preventDefault:function(){ preventDefault: function () {
this._preventDefault = true; this._preventDefault = true;
}, },
clear:false clear: false
}); } );
if(cb){ if ( cb ) {
_widgetCallBack[name] = cb; _widgetCallBack[ name ] = cb;
} }
}, },
getWidgetData : function(name){ getWidgetData: function ( name ) {
return _widgetData[name] return _widgetData[ name ]
}, },
setWidgetBody : function(name,$widget,km){ setWidgetBody: function ( name, $widget, km ) {
if(!km._widgetData){ if ( !km._widgetData ) {
utils.extend(km,{ utils.extend( km, {
_widgetData : {}, _widgetData: {},
getWidgetData : function(name){ getWidgetData: function ( name ) {
return this._widgetData[name]; return this._widgetData[ name ];
}, },
getWidgetCallback : function(widgetName){ getWidgetCallback: function ( widgetName ) {
var me = this; var me = this;
return function(){ return function () {
return _widgetCallBack[widgetName].apply(me,[me,$widget].concat(utils.argsToArray(arguments,0))) return _widgetCallBack[ widgetName ].apply( me, [ me, $widget ].concat( utils.argsToArray( arguments, 0 ) ) )
} }
} }
}) } )
} }
var pro = _widgetData[name]; var pro = _widgetData[ name ];
if(!pro){ if ( !pro ) {
return null; return null;
} }
pro = km._widgetData[name]; pro = km._widgetData[ name ];
if(!pro){ if ( !pro ) {
pro = _widgetData[name]; pro = _widgetData[ name ];
pro = km._widgetData[name] = $.type(pro) == 'function' ? pro : utils.clone(pro); pro = km._widgetData[ name ] = $.type( pro ) == 'function' ? pro : utils.clone( pro );
} }
pro.root($widget.kmui().getBodyContainer()); pro.root( $widget.kmui().getBodyContainer() );
pro.initContent(km,$widget); pro.initContent( km, $widget );
if(!pro._preventDefault){ if ( !pro._preventDefault ) {
pro.initEvent(km,$widget); pro.initEvent( km, $widget );
} }
pro.width && $widget.width(pro.width); pro.width && $widget.width( pro.width );
}, },
setActiveWidget : function($widget){ setActiveWidget: function ( $widget ) {
_activeWidget = $widget; _activeWidget = $widget;
} }
} }
}()); }() );
\ No newline at end of file
Utils.extend( KityMinder, {
_protocals: {},
registerProtocal: function ( name, protocalDeal ) {
KityMinder._protocals[ name ] = protocalDeal();
},
findProtocal: function ( name ) {
return KityMinder._protocals[ name ] || null;
},
getSupportedProtocals: function () {
return Utils.keys( KityMinder._protocals );
}
} );
// 这里的 Json 是一个对象
function exportNode( node ) {
var exported = {};
exported.data = node.getData();
var childNodes = node.getChildren();
if ( childNodes.length ) {
exported.children = [];
for ( var i = 0; i < childNodes.length; i++ ) {
exported.children.push( exportNode( childNodes[ i ] ) );
}
}
return exported;
}
function importNode( node, json ) {
var data = json.data;
for ( var field in data ) {
node.setData( field, data[ field ] );
}
var childrenTreeData = json.children;
if ( !childrenTreeData ) return;
for ( var i = 0; i < childrenTreeData.length; i++ ) {
var childNode = new MinderNode();
importNode( childNode, childrenTreeData[ i ] );
node.appendChild( childNode );
}
return node;
}
// 导入导出 // 导入导出
kity.extendClass( Minder, { kity.extendClass( Minder, {
exportData: function ( node ) { exportData: function ( protocalName ) {
var exported = {}; var json, protocal;
node = node || this.getRoot();
exported.data = node.getData(); json = exportNode( this.getRoot() );
var childNodes = node.getChildren(); protocal = KityMinder.findProtocal( protocalName );
if ( childNodes.length ) { if ( protocal ) {
exported.children = []; return protocal.encode( json );
for ( var i = 0; i < childNodes.length; i++ ) { } else {
exported.children.push( this.exportData( childNodes[ i ] ) ); return json;
}
} }
return exported;
}, },
importData: function ( treeData ) { importData: function ( local, protocalName ) {
function importToNode( treeData, node ) { var json, protocal;
var data = treeData.data;
for ( var field in data ) { if ( protocalName ) {
node.setData( field, data[ field ] ); protocal = KityMinder.findProtocal( protocalName );
} } else {
KityMinder.getSupportedProtocals().every( function ( name ) {
var childrenTreeData = treeData.children; var test = KityMinder.findProtocal( name );
if ( !childrenTreeData ) return; if ( test.recognize && test.recognize( local ) ) {
for ( var i = 0; i < childrenTreeData.length; i++ ) { protocal = test;
var childNode = new MinderNode(); }
importToNode( childrenTreeData[ i ], childNode ); return !test;
node.appendChild( childNode ); } );
} }
if ( !protocal ) {
throw new Error( "Unsupported protocal: " + protocalName );
} }
var params = { var params = {
importData: treeData local: local,
protocalName: protocalName,
protocal: protocal
}; };
// 是否需要阻止导入
var stoped = this._fire( new MinderEvent( 'beforeimport', params, true ) ); var stoped = this._fire( new MinderEvent( 'beforeimport', params, true ) );
if ( stoped ) return this; if ( stoped ) return this;
json = params.json || ( params.json = protocal.decode( local ) );
this._fire( new MinderEvent( 'preimport', params, false ) ); this._fire( new MinderEvent( 'preimport', params, false ) );
// 删除当前所有节点
while ( this._root.getChildren().length ) { while ( this._root.getChildren().length ) {
this._root.removeChild( 0 ); this._root.removeChild( 0 );
} }
importToNode( treeData, this._root );
importNode( this._root, json );
this._fire( new MinderEvent( 'import', params, false ) ); this._fire( new MinderEvent( 'import', params, false ) );
this._firePharse( { this._firePharse( {
...@@ -52,6 +103,7 @@ kity.extendClass( Minder, { ...@@ -52,6 +103,7 @@ kity.extendClass( Minder, {
this._firePharse( { this._firePharse( {
type: 'interactchange' type: 'interactchange'
} ); } );
return this; return this;
} }
} ); } );
\ No newline at end of file
KityMinder.registerProtocal( 'json', function () {
function filter( key, value ) {
if ( key == 'layout' || key == 'shicon' ) {
return undefined;
}
return value;
}
return {
encode: function ( json ) {
return JSON.stringify( json, filter );
},
decode: function ( local ) {
return JSON.parse( local );
},
recognize: function ( local ) {
return Utils.isString( local ) && local.charAt( 0 ) == '{' && local.charAt( local.length - 1 ) == '}';
}
};
} );
\ No newline at end of file
KityMinder.registerProtocal( "plain", function () {
var LINE_ENDING = '\n',
TAB_CHAR = '\t';
function repeat( s, n ) {
var result = "";
while ( n-- ) result += s;
return result;
}
function encode( json, level ) {
var local = "";
level = level || 0;
local += repeat( TAB_CHAR, level );
local += json.data.text + LINE_ENDING;
if ( json.children ) {
json.children.forEach( function ( child ) {
local += encode( child, level + 1 );
} );
}
return local;
}
function isEmpty( line ) {
return !/\S/.test( line );
}
function getLevel( line ) {
var level = 0;
while ( line.charAt( level ) === TAB_CHAR ) level++;
return level;
}
function getNode( line ) {
return {
data: {
text: line.replace( new RegExp( '^' + TAB_CHAR + '*' ), '' )
}
};
}
function decode( local ) {
var json,
parentMap = {},
lines = local.split( LINE_ENDING ),
line, level, node;
function addChild( parent, child ) {
var children = parent.children || ( parent.children = [] );
children.push( child );
}
for ( var i = 0; i < lines.length; i++ ) {
line = lines[ i ];
if ( isEmpty( line ) ) continue;
level = getLevel( line );
node = getNode( line );
if ( level === 0 ) {
if ( json ) {
throw new Error( 'Invalid local format' );
}
json = node;
} else {
if ( !parentMap[ level - 1 ] ) {
throw new Error( 'Invalid local format' );
}
addChild( parentMap[ level - 1 ], node );
}
parentMap[ level ] = node;
}
return json;
}
var lastTry, lastResult;
function recognize( local ) {
if ( !Utils.isString( local ) ) return false;
lastTry = local;
try {
lastResult = decode( local );
} catch ( e ) {
lastResult = null;
}
return !!lastResult;
}
return {
encode: function ( json ) {
return encode( json, 0 );
},
decode: function ( local ) {
if ( lastTry == local && lastResult ) {
return lastResult;
}
return decode( local );
},
recognize: recognize
};
} );
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment