
ããã¯ãã¡ã¢ãªã«ãŒããšãã£ã¿ã®å°ããªæè²çãªäŸã§ã ã éåžžã«è©³çŽ°ãªã³ã¡ã³ããšç°¡åãªã³ãŒãã®ããããããç解ããããšã¯åé¡ã«ãªããŸããã ãã®èšäºã¯ãJavascriptãç¥ã£ãŠåŠã¶äººã察象ãšããŠããŸãã
ãã©ãŠã¶ããŒã¿ããŒã¹ã䜿çšããã¡ã¢ãªã«ãŒããšãã£ã¿ãäœæããæ©èœã«ã€ããŠèª¬æããŸãã ããã«ãLocalStorageã§ã¯ãªãã5ã¡ã¬ãã€ããè¶ ããããšã¯ã§ããŸããã ç¹å®ã®ãã©ãŠã¶ã§å©çšå¯èœãªãã®ã«å¿ããŠIndexedDBãŸãã¯webSQLã䜿çšãããããããŒã¿éã¯100ã200ã¡ã¬ãã€ããè¶ ããããšããããŸãã
ãœãŒã¹ã¯Githubã§å ¬éãããŠããŸãã
520è¡ã®ã³ãŒãã«å¯Ÿå¿ããŸããããããã§ã¯ãããŒããäžç·ã«ãã©ãã°ããããåé€ããããååãå€æŽããããæ°ããããŒããäœæãããã§ããŸãã ãŸããã³ã³ããã¹ãã¡ãã¥ãŒãã120åã®ã¢ã€ã³ã³ã®ãããããå²ãåœãŠãããšãã§ããŸãã
ããããªãºã ã®ç§å¯ã¯ã æŠéã§ãã¹ãããããã©ã°ã€ã³ã䜿çšããããšã§ãïŒ
- Ydn.db-æé©ãªã¡ãœãããšåäžã®APIãèªåçã«éžæããŠããã©ãŠã¶ãŒããŒã¿ããŒã¹ã«æ å ±ãä¿åãã
- jQueryã³ã³ããã¹ãã¡ãã¥ãŒ-Javascriptã䜿çšããŠåçã«å ¥åã§ããã³ã³ããã¹ãã¡ãã¥ãŒ
- jsPlumb -HTMLèŠçŽ éã«ç·ãæç»ããããã®æ¡åŒµæ©èœ
- jQuery UI-ãã©ãã°ã¢ã³ããããã-ã¢ã€ãã éã§ã¢ã€ãã ããã©ãã°ã¢ã³ããããããã
PSïŒãŸãããã·ã³ã°ã«ãã³ãã®äœææ¹æ³ãjQueryãšçµã¿èŸŒã¿ã®$ .DeferredïŒïŒãªããžã§ã¯ãã LiveReloadãã©ã°ã€ã³ã䜿çšããéåæããã°ã©ãã³ã°ã容æã«ããæ¹æ³ãåŠç¿ããŸãã
æ¥ãã§ãã人ã®ããã®ã³ã¡ã³ãä»ãããã°ã©ã ã³ãŒã
å€ãã¯ãã以äžèªãããšã¯ã§ããŸããããåã«ã³ãŒãã«æ £ããã ãã§ãã
éåžžã«è©³çŽ°ãªã³ã¡ã³ãä»ãã®ã¡ã€ã³JavaScriptã³ãŒã
var API_4_MINDMAP = function(){ //singleton - if ( (typeof arguments.callee.instance=='undefined') ) { // arguments.callee.instance = new function() { var this_api = this; // , var my_all_data = {}; // var my_all_data_template = { // , "n1":{ id:1, parent_id:0, title:" <br> <br>"+ " <br> .<br>Javascript" }, "n2":{ id:2, parent_id:1, title:"", icon:"icon-gift" }, "n3":{ id:3, parent_id:2, title:" ", icon:"icon-flow-line" }, "n5":{ id:5, parent_id:3, title:" jsPlumb", icon: "icon-link" }, "n4":{ id:4, parent_id:3, title:" - SVG" }, "n7":{ id:7, parent_id:6, title:" jQuery ContextMenu", icon: "icon-link" }, "n8":{ id:8, parent_id:1, title:" ", icon: "icon-lamp" }, "n9":{ id:9, parent_id:8, title:"Javascript + jQuery â 520 " }, "n10":{ id:10, parent_id:2, title:" ", icon: "icon-floppy-1" }, "n11":{ id:11, parent_id:17, title:"IndexedDB" }, "n12":{ id:12, parent_id:17, title:"webSQL" }, "n13":{ id:13, parent_id:17, title:"LocalStorage" }, "n14":{ id:14, parent_id:10, title:" Ydn.db", icon: "icon-link" }, "n15":{ id:15, parent_id:10, title:" " }, "n16":{ id:16, parent_id:2, title:" Javascript", icon: "icon-cd" }, "n17":{ id:17, parent_id:10, title:"" }, "n18":{ id:18, parent_id:6, title:" " }, "n20":{ id:20, parent_id:8, title:"CSS â 220 " }, "n19":{ id:19, parent_id:8, title:"HTML â 50 " }, "n22":{ id:22, parent_id:16, title:" " }, "n23":{ id:23, parent_id:16, title:" " }, "n24":{ id:24, parent_id:2, title:" ", icon: "icon-emo-wink" }, "n6":{ id:6, parent_id:2, title:" ", icon: "icon-list" }, "n25":{ id:25, parent_id:24, title:" Fontello", icon: "icon-link" }, "n27":{ id:27, parent_id:2, title:"Drag&Drop jQuery UI", icon: "icon-link" }, "n26":{ id:26, parent_id:24, title:" " } }; this.jsSaveAllToDB = function() { // $.each(my_all_data, function(i, el){ db.put("mindmap_db", el ).done(function(){ }); }); } this.jsLoadAllFromDB = function() { // var d=new $.Deferred(); // my_all_data = {}; // db.values("mindmap_db",null,99999999).done(function(records) { if(records.length && false) { $.each(records, function(i, el){ my_all_data["n"+el.id] = {}; my_all_data["n"+el.id] = el; }); } else { // , my_all_data = my_all_data_template; this_api.jsSaveAllToDB(); } d.resolve(); // , done }); return d.promise(); //, , } this.jsFind = function(id, changes) { // id // , n id var answer = my_all_data["n"+id]; if(!answer) return false; // if(changes) { // , $.each(changes, function(name_field, new_field_value){ answer[name_field] = new_field_value; }); db.put("mindmap_db", answer ).done(function(){ // console.info(" "); // }); } return answer; } this.jsFindByParent = function(parent_id) { // parent_id var answer = []; $.each(my_all_data, function(i,el){ // = parent_id if((el.parent_id == parent_id) && (!el.del)) answer.push(el); }); return answer; } this.jsAddNew = function(parent_id, title) { // parent_id var max_id = 0; $.each(my_all_data, function(i,el){ // id if(el.id>max_id) max_id = el.id; }); var new_id = (parseInt(max_id)+1); // id my_all_data["n"+new_id] = {}; // my_all_data["n"+new_id] = {id:new_id, parent_id: parent_id, title: title}; // return new_id; } // , this.jsRecursiveByParent = function(id, recursive_array) { if(!recursive_array) recursive_array = []; var answer = this_api.jsFindByParent(id); $.each(answer,function(i,el) { // , recursive_array.push(el); recursive_array = this_api.jsRecursiveByParent(el.id, recursive_array); }); return recursive_array; } this.jsDeleteById = function(id) { // if(confirm(" â"+id+" ?")) { var childs = this_api.jsRecursiveByParent(id); $.each(childs, function(i, el){ api4mindmap.jsFind(el.id, {del:1}); //"" - }); if(id!=1) api4mindmap.jsFind(id, {del:1}); // , â1 } } this.jsRenderAllMap = function(focus_id) { // if(!focus_id) focus_id = 1; var html = "<ul myid='"+focus_id+"'>"; html = this_api.jsRenderOneParent(focus_id, html); // html += "</ul>"; $("#mindmap").html(html); jsMakeDroppable(); // } this.jsRenderOneParent = function(parent_id, html) { // html += "<li id='node_"+parent_id+"' myid='"+parent_id+"'>"; html += "<div class='big_n_title'>"; html += this_api.jsRenderOneElement(parent_id); // html += "</div>"; var childs = this_api.jsFindByParent(parent_id); // if(childs.length) { html += "<ul class='childs' myid='"+parent_id+"'>"; } $.each(childs, function(i,el){ html = this_api.jsRenderOneParent(el.id,html); // , }); if(childs.length) { html += "</ul>"; } html += "</li>"; return html; } this.jsRenderOneElement = function(id) { // var element = this_api.jsFind(id); // var childs_count = this_api.jsFindByParent(id).length; //- var icon_type = ''; if(element.icon) icon_type = element.icon; // , if(childs_count>0) { // var collapser_html = "<div class='collapse'></div>"; // , var icon = "<div class='type_icon'><i class='icon-folder-1 folder'><div class='count'>"+ childs_count+"</div></i><i class='"+icon_type+"'></i>"+"</div>"; } else { var collapser_html = ""; var icon = "<div class='type_icon'><i class='"+icon_type+"'></i></div>"; } var answer = icon+"<div class='n_title' contenteditable='true'>"+element.title+ "</div><div class='contextmenu'></div>"+collapser_html; return answer; } this.jsDrawMindmap = function(focus_id) { // var line_cache = []; $("#mindmap ul:visible").each(function(){ // ul var ul_id = $(this).attr("myid"); var childs = this_api.jsFindByParent(ul_id); $.each(childs, function(i,el){ // , var target = el.id; if(!$("li[myid='"+target+"']"+" .big_n_title:first").hasClass("_jsPlumb_endpoint_anchor_")) { var parent_id = el.parent_id; line_cache.push( {source: parent_id, target: target} ); } }); }); if(line_cache.length) { // , if(!myjsPlumb.isSuspendDrawing()) { myjsPlumb.setSuspendDrawing(true, true); console.info("set_suspend"); } } $.each(line_cache, function(i, el){ if(el.source == 1) { // anchor1 = [ 1, 0.5, 1, 0, -1, -1 ]; } else { anchor1 = [ 1, 1, 1, 0, -1, -1 ]; // } // : var p1 = myjsPlumb.addEndpoint("node_"+el.source+" .big_n_title:first", { anchor: anchor1 }); // : var p2 = myjsPlumb.addEndpoint("node_"+el.target+" .big_n_title:first", { anchor: [ 0, 1, -1, 0, 1, -1 ]}); // : var count = this_api.jsFindByParent(el.source).length; if(count>10) { // , var LineType = "Straight"; } else { var LineType = "Bezier"; // } // , myjsPlumb.connect({source: p1, target: p2, scope:"someScope", deleteEndpointsOnDetach:true, connector:[ LineType, { curviness: 30, cornerRadius: 20 } ]}); }); } //jsDrawMindmap this.jsRefreshMindmap = function() { // myjsPlumb.reset(); // var save_scroll_top = $("#mindmap").scrollTop(); // , var save_scroll_left = $("#mindmap").scrollLeft();// var hidden_elements = []; // $(".hide").each(function(){ hidden_elements.push($(this).attr("myid")); }); api4mindmap.jsRenderAllMap(1); // $.each(hidden_elements, function(i, el){ // , . $("#node_"+el).addClass("hide"); }); api4mindmap.jsDrawMindmap(1); // , onResize(); // $("#mindmap").scrollTop(save_scroll_top); // , $("#mindmap").scrollLeft(save_scroll_left);// } this.jsRegAllKeys = function() { // $("#mindmap").on("keydown", ".n_title", function(e){ // Enter if(e.keyCode==13) { e.preventDefault(); $(this).blur(); // , } }); $("#mindmap").on("keyup", ".n_title", function(e){ e.preventDefault(); if(e.keyCode==13) $(this).blur(); onResize(); // , , , }); $("#mindmap").on("blur", ".n_title", function(){ // , var n_title_text = $(this).html(); var id = $(this).parents("li:first").attr("myid"); if(n_title_text.length==0) n_title_text = " "; // , . $(this).html( strip_tags(n_title_text) ); // this_api.jsFind(id, {title:n_title_text}); // onResize(); // }); $("#mindmap").on("click", ".n_title", function(){ // , $(this).focus(); }); $("#mindmap").on("focus", ".n_title", function(){ // , var ntitle = $(this); setTimeout(function(){ if(ntitle.is(":focus")) document.execCommand('selectAll',false,null); },3); // Firefox }); $("#mindmap").on("click", ".collapse", function(){ // $(this).parents("li:first").toggleClass("hide"); // api4mindmap.jsDrawMindmap(1); // , onResize(); return false; }); var font_size = 14; // $("#zoom_in").on("click", function(){ // font_size += 1; $("#mindmap").css("font-size", font_size+"px"); onResize(); return false; }); $("#zoom_out").on("click", function(){ // font_size -= 1; $("#mindmap").css("font-size", font_size+"px"); onResize(); return false; }); $("#collapse_all").on("click", function(){ // " " $("#node_1 ul li").addClass("hide"); onResize(); return false; }); $("#expand_all").on("click", function(){ // " " $("#node_1 ul li").removeClass("hide"); onResize(); return false; }); } //jsRegAllKeys } } return arguments.callee.instance; // } function onResize() { myjsPlumb.setSuspendDrawing(false, true); // } function jsGetIcons(n) { // var icons = {}; icons[0] = ["progress-0","progress-1","progress-2","progress-3","dot","dot-2","dot-3","star-empty","star","record"]; icons[1] = ["check","heart-empty","heart","bookmark-empty","bookmark","ok-2","help","wallet","mail-2","cloud"]; icons[2] = ["tree","chat-2","article-alt","volume","flash","aperture-alt","layers","steering-wheel","skiing","flight"]; icons[3] = ["lock-open","lock","umbrella","camera","book-open","clock-1","plus","minus","trash","music"]; icons[4] = ["calculator","address","pin","vcard","basket-1","swimming","youtube","leaf","mic","target"]; icons[5] = ["monitor","phone","download","bell","at","pause","play","stop-1","flag","key"]; icons[6] = ["users-1","eye","inbox","brush","moon","college","fast-food","coffee","top-list","bag"]; icons[7] = ["chart-area","info","home-1","hourglass","attention","scissors","tint","guidedog","archive","flow-line"]; icons[8] = ["emo-grin","emo-happy","emo-wink","emo-sunglasses","emo-thumbsup","emo-sleep","emo-unhappy","emo-devil","emo-surprised","emo-tongue"]; icons[9] = ["plus","minus","keyboard","fast-fw","to-end","to-start","cancel-circle","check","flash","feather"]; icons[10] = ["plus-circle","pencil-alt","target-1","chart-pie","adjust","user-add","volume","install","flow-cascade","sitemap"]; icons[11] = ["minus-circle","clock-1","light-down","light-up","lamp","upload","picture-2","dollar","gift","link-1"]; answer = {}; $.each(icons, function(j, icon_group){ sub_icons = {}; $.each(icons[j], function(i, icon){ sub_icons["icon-"+icon] = {}; sub_icons["icon-"+icon] = {name:icon, icon: "icon-"+icon}; }); answer["icon-group"+icon_group] = {}; answer["icon-group"+icon_group] = {name:" â"+(parseInt(j)+1), icon: "icon-"+icons[j][0], items: sub_icons}; }); return answer; // } function jsMakeDroppable() { // $(".n_title").not("ui-draggable").draggable({ zIndex: 999, delay:50, revert: false, // will cause the event to go back to its helper:"clone", appendTo: "body", refreshPositions:true }); $( ".n_title" ).not("ui-droppable").droppable({ accept: ".n_title", activeClass: "ui-can-recieve", tolerance: "pointer", hoverClass: "ui-can-hover", over: function (event, ui) { //$(this).click(); }, drop: function( event, ui ) { //console.info("drop-all",usedOverlays,ui,ui.draggable[0] ); var my_draggable = $(ui.draggable[0]); var my_droppable = $(event.target); my_draggable_id = my_draggable.parents("li:first").attr("myid"); my_droppable_id = my_droppable.parents("li:first").attr("myid"); if( jsCanDrop(my_draggable_id, my_droppable_id) ) { //, api4mindmap.jsFind(my_draggable_id, {parent_id:my_droppable_id}); api4mindmap.jsRefreshMindmap(); $(".ui-draggable-dragging").remove(); // , } else { alert(" "); } } }); } function jsCanDrop(draggable_id, droppable_id) { // , var can_drop = true; var all_childs = api4mindmap.jsRecursiveByParent(my_draggable_id); $.each(all_childs, function(i,el){ console.info(el.id, droppable_id); if(el.id == droppable_id) can_drop = false; }); if(draggable_id == droppable_id) var can_drop = false; return can_drop; } // function strip_tags( str ){ if(!str) return ""; answer = str.replace(/<\/?[^>]+>/gi, ''); answer = answer.replace(/\n/gi, ''); return answer; } var myjsPlumb; // /////////////////////// html //////////////////////// function jsDoFirst() { api4mindmap = new API_4_MINDMAP(); // api "" jsPlumb.Defaults.Container = $("#mindmap"); // "" myjsPlumb = jsPlumb.getInstance({ DragOptions: { cursor: 'pointer', zIndex: 2000 }, PaintStyle:{ lineWidth:1, strokeStyle:"#888" }, Connector:[ "Bezier", { curviness: 30 } ], Endpoint:[ "Blank", { radius:5 } ], EndpointStyle : { fillStyle: "#567567" }, Anchors : [[ 1, 1, 1, 0, -1, -1 ],[ 0, 1, -1, 0, 1, -1 ]] }); var icons_html = jsGetIcons(0); // $.contextMenu({ // .contextmenu selector: '.contextmenu', trigger: 'left', callback: function(key, options) { var id = $(this).parents("li:first").attr("myid"); if( /icon-/ig.test(key) ) { // api4mindmap.jsFind(id, {icon:key}); api4mindmap.jsRefreshMindmap(); } else if(key == "delete") { // api4mindmap.jsDeleteById(id); api4mindmap.jsRefreshMindmap(id); } else if(key == "add_down") { // var parent_id = api4mindmap.jsFind(id).parent_id; var new_id = api4mindmap.jsAddNew(parent_id, " "); api4mindmap.jsRefreshMindmap(); $("#node_"+new_id+" .n_title").focus(); } else if(key == "add_right") { // var new_id = api4mindmap.jsAddNew(id, " "); $(this).parents("li").removeClass("hide"); api4mindmap.jsRefreshMindmap(); $("#node_"+new_id+" .n_title").focus(); } }, delay:0, items: { "add_down": {"name":" ", "icon": "icon-down-1"}, "add_right": {"name":" ", "icon": "icon-right-1"}, "sep1": "--------", "delete": {"name":"", "icon": "icon-trash"}, "context_make_did1011": {"name": "", "icon": "icon-emo-wink", "items": icons_html // } } }); // var mindmap_store_schema = { // name: "mindmap_db", // keyPath: 'id', // , autoIncrement: false }; var schema = { // stores: [mindmap_store_schema] }; if( navigator.userAgent.toLowerCase().indexOf("android") !=-1 ) { var options = {mechanisms: ['websql', 'indexeddb']}; // websql } else { var options = {}; // indexeddb ), } db = new ydn.db.Storage('_all_mindmap', schema, options); // api4mindmap.jsLoadAllFromDB().done(function(){ // api4mindmap.jsRegAllKeys(); // api4mindmap.jsRenderAllMap(1); // â1 api4mindmap.jsDrawMindmap(1); // , onResize(); // }); // }
ããã°ã©ãã³ã°æã«äœ¿çšããããŒã«
ä»ã®ãšãããã³ãŒãã®ç 究ã延æããŸãã æåã«ã䜿çšããããŒã«ã«ã€ããŠç°¡åã«èª¬æããŸãã å€ãã®æ°åè ã¯ãããã«ã€ããŠç¥ãããããã«æéã倱ããŸãã
ç§ã¯Codaã§ãæã«ã¯Sublime Textã§ããã°ã©ã ããŠããŸãã Codaã¯ãã銎æã¿ããããŸãããã³ãŒããè²ä»ãããããšã§å°ãé ããªãïŒMacå°çšïŒãSublime Textã¯éåžžã«é«éã§ãã©ã®ãã©ãããã©ãŒã ã§ãåäœããŸããããŸãããŸã æ £ããŠããŸããã次ã«ããµãŒããŒäžã®Codaã«çŽæ¥ã¢ã¯ã»ã¹ããã®ã奜ãã§ããè€æ°ã®ãã¡ã€ã«ããã°ããä¿®æ£ããŸãã ãããŠãç§ã¯ç«¯æ«ã䜿çšããŠCodaçµç±ã§Debianãšéä¿¡ããŸãã
ç§ã«ãšã£ãŠäœæ¥é床ã®çã®çªç Žå£ã¯ã GITã®çºèŠã§ããã ããã¯ããŒãžã§ã³ç®¡çã·ã¹ãã ã§ãã å ¬åŒã®GitHubããã°ã©ã ã§äœ¿çšããŠããŸã ã

Githubãã³ãŒãã®ã¯ã©ãŠãã¹ãã¬ãŒãžãšããŠäœ¿çšããããã䜿çšããŠãªãªãŒã¹ãå ¬éããŸãã ãµã€ãã®ããŒãžã§ã³ãããªãªãŒã¹ãããã«ã¯ã次ã®ããã«ããŸãã
- ããŒã«ã«ãã·ã³ã§ãµã€ãã®åäœã確èªãããã³ãããããå®è¡ããŸãã å€æŽã確èªããŸãïŒäžã®å³ã®[ã³ããã]ãã¿ã³ãåç §ïŒ
- ãã¿ã³ã1ã€æŒãã ãã§ãµãŒããŒã«ãããã·ã¥ããå€æŽãããŸãïŒäžéšã®åããŠã£ã³ããŠã«[åæ]ãã¿ã³ããããŸãïŒ
- ç§ã¯ãã€ãã®ãµãŒããŒã® SSHçµç±ã§ã¿ãŒããã«ã«è¡ããã³ãã³ããå®è¡ããŸãïŒ
git pull httpsïŒ// myuser_nameïŒmysslpassword@github.com/Imater/tree.git master - ãã¹ãŠã®JSããã³CSSãã¡ã€ã«ãå§çž®ãããããããã³ã¡ã³ããã¹ããŒãããããã1ã€ã®jsãã¡ã€ã«ãš1ã€ã®cssãã¡ã€ã«ã«å§çž®ããã¹ã¯ãªãããå®è¡ããŸãã HTMLããŒãžã«æ¿å ¥ãããã¡ã€ã«ãå°ãªãã»ã©ããµã€ãã®èªã¿èŸŒã¿ãéããªããŸã
ã³ãŒããæäœããŠããéãç§ã¯åžžã«Chromeãšãã®ã³ã³ãœãŒã«ãéããŠããŸãã ã³ã³ãœãŒã«ã§ã¯ãäœæãããé¢æ°ãè©ŠããŠãããŒã¿ãæäœããçµã¿èŸŒã¿ãããã¬ãŒã䜿çšããŠã³ãŒãããããã°ã§ããŸãã

ã³ã³ãœãŒã«ãšéçºè ããŒã«ã®äœ¿çšæ¹æ³ãåŠã³ãå€ãã®æéãç¯çŽããŠãã ããã
次ã«ãF5ããŒã®ãã€ã³ãã«ã€ããŠèª¬æããŸãïŒMacOSã®å Žå-cmd + rïŒã æè¿çºèŠãããLiveReload ã WinãšMacã®äž¡æ¹ã®ããŒãžã§ã³ããããŸãã
ããã°ã©ã ãã€ã³ã¹ããŒã«ããŠããããã©ã°ã€ã³ãChromeãŸãã¯å¥ã®ãã©ãŠã¶ãŒã®äžã«çœ®ãããã¡ã€ã³HTMLãã¡ã€ã«ã®bodyã¿ã°ã®çŽåŸã«ã³ãŒãã貌ãä»ããŸãã
<script>document.write('<script src=\"http://' + (location.host || 'localhost').split(':')[0] + ':35729/livereload.js?snipver=1\"></' + 'script>')</script>
ãããŠãã®åŸãããªãã¯å€ãã®åã³ãåŸãŸãã ã·ããªãªã¯æ¬¡ã®ãšããã§ããããã°ã©ã ããWebãµã€ããéããCSSãŸãã¯Javascriptã§ã³ãŒããèšè¿°ãããããlivereloadããç£èŠãããã©ã«ããŒå ã®ç»åã眮ãæããŸããä¿åãããšããã«ãµã€ããæŽæ°ãããŸãã CSSã眮ãæãããšãããŒãžããªããŒãããã«å€æŽãå³åº§ã«é©çšãããŸãã
æåŸã«ãããŒã«ã®èª¬æã§ã¯ãããªã¥ãŒã ã®æ倧70ïŒ ãç¯çŽãããµã€ãã®èªã¿èŸŒã¿ãé«éåããPNGã€ã¡ãŒãžã¬ãã¥ãŒãµãŒããå§ãããŸãã
ã¡ã¢ãªã«ãŒããäœæããããã®ããã°ã©ã ã³ãŒãã®èª¬æ
ãã¹ãŠã®ã³ãŒãã¯Githubã«æçš¿ãããŠããŸãã ããŠã³ããŒãããŠãä»»æã®ãã©ã«ããŒã«å±éã§ããŸãã å¿ èŠãªãã®ã¯ãã§ã«ãªããžããªã«ãããŸãã ãã©ã«ããŒå ã®ãã¹ãŠã®ãã©ã°ã€ã³ã ã³ãŒãå ã®ã³ã¡ã³ãã¯éåžžã«è©³çŽ°ã§ãã
åºæ¬ããå§ããŸãããã ç§ã¯ãã¹ãŠã®å€ãã®æ©èœãã·ã³ã°ã«ãã³ã§ã©ããããã®ã倧奜ãã§ãã ç§ã¯æ¬¡ã®ããã«ããŸãïŒ
var API_4_MINDMAP = function(){ //singleton - if ( (typeof arguments.callee.instance=='undefined') ) { // arguments.callee.instance = new function() { var my_all_data = {}; var this_api = this; // , this.jsAlert = function( name ) { if( prompt("Hello "+name+", are you ok?") ) { var is_ok = true; } else { var is_ok = false; } my_all_data[name] = {}; my_all_data[name] = {name: name, hi_is_ok: is_ok}; return my_all_data; } } return arguments.callee.instance; // } api4mindmap = new API_4_MINDMAP(); // api "" console.info( api4mindmap.jsAlert("Habrahabr") );
ãã®ã¢ãããŒãã®å©ç¹ã¯ããã®ãããªãã·ã³ã°ã«ãã³ãå ã«å€§éã®ããŒã¿ãä¿åã§ãããŠãŒã¶ãŒããã©ã°ã€ã³ãããŒã¿ãå€æŽããããšãæããªãããšã§ãã é¢æ°ãšå€æ°ãåé¢ããŸãã ãããŠãç·Žç¿ãããã³ã³ãœãŒã«ã«ãapi4mindmap.js ...ããšå ¥åããŠãäœæãããã¹ãŠã®é¢æ°ã®ãããã¢ãããªã¹ããåŸ ã¡ãŸãã éããŠäŸ¿å©ã
ãã€ãŠãäžèšã®äŸã§ã¯ãmy_all_dataé åã®ããŒã¿ãé¢æ°åŒã³åºãéã§ä¿åãããããšãçºèŠãããŸããã
次ã«ã䜿çšãããã©ã°ã€ã³ã«ã€ããŠèª¬æããŸãã
Ydn.db-ãã©ãŠã¶ãŒããŒã¿ããŒã¹
ããã¯ãåäžã®APIã䜿çšããŠããŒã«ã«ãã©ãŠã¶ãŒããŒã¿ããŒã¹ã®ããŒã¿ãä¿åããã³èªã¿åãããšãã§ããjQueryãã©ã°ã€ã³ã§ãã ã¢ãã€ã«ãå«ããããããã©ãããã©ãŒã ã§åäœããŸãã Phonegapã§ãã
ã»ãšãã©ã®æ©èœã¯äœ¿çšããŸããããäž»ã«æ¬¡ã®å Žåã«äœ¿çšããŸãã
this.jsLoadAllFromDB = function() { // var d=new $.Deferred(); // my_all_data = {}; // db.values("mindmap_db",null,99999999).done(function(records) { if(records.length) { $.each(records, function(i, el){ my_all_data["n"+el.id] = {}; my_all_data["n"+el.id] = el; }); } else { // , my_all_data = my_all_data_template; this_api.jsSaveAllToDB(); } d.resolve(); // , done }); return d.promise(); //, , } this.jsFind = function(id, changes) { // id // , n id var answer = my_all_data["n"+id]; if(!answer) return false; // if(changes) { // , $.each(changes, function(name_field, new_field_value){ answer[name_field] = new_field_value; }); db.put("mindmap_db", answer ).done(function(){ // console.info(" "); // }); } return answer; }
ããã¯ãã¡ã¢ãªã«ãŒããšãã£ã¿ã®ã³ãŒãã®äŸã§ãã éåžžã«ç°¡åãªã³ãã³ãããããŸãïŒdb.valuesïŒ "mindmap_db"ãnullã99999999ïŒ-IndexedDbããŒãã«ïŒChromeã®å ŽåïŒãããã¹ãŠã®èŠçŽ ãèªã¿åãããã°ããããŠãã.doneïŒïŒãã©ã¡ãŒã¿ãŒã«ããé¢æ°ã«æ»ããŸãã ãããã£ãŠãããŒã¿ããŒã¹ããã¢ã€ãã ãèªã¿åãããšãã§ããŸãã 次ã®ã³ãã³ãã䜿çšããŠ1ã€ã®èŠçŽ ãèªã¿åãããšãã§ããŸãïŒdb.getïŒ "mindmap_db"ã5ïŒ-ããã¯ãid = 5ã®èŠçŽ ãèæ ®ããæ¹æ³ã§ãã
ããŒã¿ããŒã¹ã«æžã蟌ãã«ã¯ãã³ãã³ãdb.putïŒ "mindmap_db"ãanswerïŒã䜿çšããŸãã ãã®ã³ãã³ãã¯éåæã§ããããã©ãŠã¶ãŒã¯å®è¡ãåŸ æ©ããªããããäœæ¥ã®é床ãäœäžããããšã¯ãããŸããã ãã®ããããã®ããã°ã©ã ã¯Chromeã§ããé«éã«å®è¡ãããŸãã
éåæã³ãã³ãã䜿çšããã«ã¯ãjQueryã«çµã¿èŸŒãŸãã$ .DeferredïŒïŒãªããžã§ã¯ãã䜿çšããŸãã äžèšã®äŸã瀺ããŸãã 次ã®ã³ãã³ãã䜿çšããŠãããã«çµæãè¿ãããšãé¢æ°ã®æåŸã§åã«çŽæããŸããreturn d.promiseïŒxïŒ; ãããŠãé¢æ°ã®ãã¹ãŠãå®äºããããããšãã°ããŒã¿ããµãŒããŒã«éä¿¡ãããããd.resolveïŒ200ïŒãå®è¡ããŸãã 次ã«ã.doneïŒïŒé¢æ°ãå®è¡ããããã©ã¡ãŒã¿ãŒxãæž¡ãããŸãã
ããã¯ãçžäºã«é¢æ°ãèšè¿°ã§ããªãããã«ãããããéåžžã«äŸ¿å©ã§ãã ãŸãã$ whenã®ããŒã ãå匷ããããšããå§ãããŸãã åæã«èµ·åããå€ãã®éåæé¢æ°ãããããã¹ãŠã®éåæé¢æ°ãå®äºããçŽåŸã«äœããå®è¡ãããå Žåã«äœ¿çšããŸãã 以äžã«äŸã瀺ããŸãã
function jsDo() { var dfdArray = []; for(var i=0; i<1000; i++) { dfdArray.push( jsAsync() ); } $.when.apply(null, dfdArray).then( function(){ alert(" ") } ); } function jsAcync() { var d = new $.Deferred(); setTimeout(function(){ d.resolve(); }, Math.random()*5000 ); return d.promise(); }
å®éãããã§ã¯ãã¹ãŠã®ãçŽæããé åã«å ¥åããã$ .whenã³ãã³ãã«æž¡ãããŸãããã®ã³ãã³ãã¯ãæåŸã®çŽæãæºããããç¬éã«ã.doneãæ©èœãå®è¡ããŸãã
Ydn.dbã䜿çšãããšããã©ãŠã¶ã§ã®ã¹ãã¬ãŒãžã®æ¹æ³ãèæ ®ããããšãªãããŒã¿ãæäœã§ããŸããããã¯ããã®å€æ§æ§ã1ã€ã®APIã«ã©ããããŠããããã§ãã ç¹ã«ãã€ã³ããã¯ã¹ã®æäœãéžæããã£ã«ã¿ã®é©çšãããŒãã«ã®åèšã®èšç®ãªã©ãè¡ãããšãã§ããŸãã ãããããã®äŸã§ã¯ãããŒã¿ã®ä¿åãšèªã¿åãã«ã®ã¿äœ¿çšããã€ã³ããã¯ã¹myããŒã«ã¯my_all_dataé åã«ãã£ãŠåçãããŸããããã¯éåžžã«é«éã§ãã åæã«ãapi4mindmap.jsFindïŒidã{titleïŒ "new_title"}ïŒé¢æ°ããã®é åãããã«æŽæ°ããããŒã¿ãéåæã§ããŒã¿ããŒã¹ã«éä¿¡ããããšã«ãããããŒã¿ã®å®å šæ§ã確ä¿ãããŸãã ãã ããããã«ãããããããã¡ã¢ãªã«ãŒãå ã®ããŒãã®ã¿ã€ãã«ãå€æŽãããã©ãŠã¶ãããã«æŽæ°ãããšããã¹ãŠã®ããŒã¿ãä¿åãããŸãã ãã©ãŠã¶ãŒã®ããŒã¿ããŒã¹ã¯é«éã§ä¿¡é Œæ§ãé«ãã100ã¡ã¬ãã€ããè¶ ããæ å ±ãä¿åã§ããŸãã
Ydn.dbã調ã¹ãåŸãçŽ5ã¡ã¬ãã€ãã®LocalStorageã®å¶éãå¿ããããšãã§ããŸãã ãŠãŒã¶ãŒã5ã¡ã¬ãã€ãããšã«ããŒã¿ãä¿åããèš±å¯ãæ±ããã®ã¯ãChromeãèŠæ±ããªãã ãã§ãã
ãã®ãã©ã°ã€ã³ã¯ãAndroidããã³iOSã§ããŸãæ©èœããŸãã ãã ãããšã©ãŒãåé¿ããããã«ãAndroidã§IndexedDBã®éžæããªãã«ããå¿ èŠãããå Žåãããããšã«æ³šæããŠãã ããã 泚ç®ãã¹ãã¯ãInternet Explorerã®ææ°ããŒãžã§ã³ã¯IndexedDBã䜿çšããŠãããããéåæã®ããã«ãã®ãããªã¢ããªã±ãŒã·ã§ã³ã®äœæ¥ãé«éåãããããšã§ãã äžåºŠã«1000åã®èŠçŽ ãä¿åãããšããããã¯äžŠè¡ããŠå®è¡ãããŸãããé床ã¯ç°ãªããŸããããã¯ãé 次èšé²ãããé«éã§ãã
jsPlumb-ä»»æã®ãã©ãŠã¶ãŒã§SVGã©ã€ã³ãæç»ãã
Canvasã䜿çšããŠãhtmlããŒãžã®ããŸããŸãªèŠçŽ éã«ç·ãæç»ã§ããŸãããå€ãã®æ¬ ç¹ããããŸãã ããšãã°ã4000 x 4000 pxãªã©ãããªãã®ãµã€ãºã®Canvasãäœæããå¿ èŠããããŸãããããã¯äžå®å®ãªãã©ãŠã¶ãŒæäœã«ã€ãªãããŸãã ã©ã€ã³ã¯ã©ã¹ã¿ãŒã«ãªããææ°ã®Retinaã¹ã¯ãªãŒã³ã§ã¯ããã¯ã¿ãŒã©ã€ã³ãããèŠãç®ãæªããªããŸãã ãããŠææªãªã®ã¯ãã¡ã¢ãªãŒã«ãŒãã«æåãå ¥åãããã³ã«ããããã®1600äžãã¯ã»ã«ãã¹ãŠãåæç»ãå¿ èŠãšããããšã§ãã
jsPlumbã¯ãSVGã«åç·ãæç»ããŠé©åãªå Žæã«é 眮ãã絶察CSSããããã£ãšèšç®ããã座æšãé 眮ããŸãã 1ã€ã®ã³ãã³ãã§ãã¹ãŠã®è¡ãå³åº§ã«åæç»ããããšãã§ããŸãã å®éãéå§ç¹ãšçµäºç¹ãäžåºŠæå®ããã ãã§ãããããç·ã§ã€ãªãã ãã§ãã©ã°ã€ã³ãå¿ããããšãã§ããŸãã ã»ãŒ3ããŒã ã§ãåç·ã®åŠçæ¹æ³ãç¥ã£ãŠããŸãã
ãµã€ãã«ã¯åèŠçŽ ãããŠã¹ã§ç§»åã§ããäŸããããŸãããè¡ã¯èŠçŽ ã®åŸã«é床ãèœãšããã«ç§»åããŸãã

éå±€æ§é ãåçŽãªã°ã©ãããã¬ãŒãã³ã°ïŒèª¬æããŠããèŠçŽ ã«ç¢å°ã®ä»ããç·ã§è¡šç€ºïŒãäŒæ¥ã®çµç¹æ§é ãå³ãªã©ãæç»ã«äŸ¿å©ã§ãã iOSããã³Androidãå«ãã»ãŒãã¹ãŠã®ãã©ãŠã¶ãŒã§åäœããŸãã
jQueryã³ã³ããã¹ãã¡ãã¥ãŒ -ã³ã³ããã¹ãã¡ãã¥ãŒ
ç§ãèŠããã¹ãŠã®ã¡ãã¥ãŒãã©ã°ã€ã³ã¯ãç¬èªã®htmléå±€ãäœæããããã«äœ¿çšããŸãã ãŸãããã®ãã©ã°ã€ã³ã§ã¯ããªããžã§ã¯ãã®é åã䜿çšããŠãã·ã³ãã«ã§ã»ãŒJSON圢åŒã®æ§é ãäœæã§ããŸãã

次ã®ã³ãŒãã䜿çšããŠãã¡ãã¥ãŒã§äžé£ã®ã³ãã³ããæå®ã§ããŸãã
$.contextMenu({ // .contextmenu selector: '.contextmenu', trigger: 'left', callback: function(key, options) { var id = $(this).parents("li:first").attr("myid"); if( /icon-/ig.test(key) ) { // api4mindmap.jsFind(id, {icon:key}); api4mindmap.jsRefreshMindmap(); } else if(key == "delete") { // api4mindmap.jsDeleteById(id); api4mindmap.jsRefreshMindmap(id); } else if(key == "add_down") { // var parent_id = api4mindmap.jsFind(id).parent_id; var new_id = api4mindmap.jsAddNew(parent_id, " "); api4mindmap.jsRefreshMindmap(); $("#node_"+new_id+" .n_title").focus(); } else if(key == "add_right") { // var new_id = api4mindmap.jsAddNew(id, " "); $(this).parents("li").removeClass("hide"); api4mindmap.jsRefreshMindmap(); $("#node_"+new_id+" .n_title").focus(); } }, delay:0, items: { "add_down": {"name":" ", "icon": "icon-down-1"}, "add_right": {"name":" ", "icon": "icon-right-1"}, "sep1": "--------", "delete": {"name":"", "icon": "icon-trash"}, "context_make_did1011": {"name": "", "icon": "icon-emo-wink", "items": icons_html // } } });
ã¢ã€ãã ã®ã¢ã€ãã ã«æ³šæããŠãã ããããã¹ãŠãéåžžã«æ確ã§çŸããã§ãã ããã«ãã³ãŒã«ããã¯é¢æ°ã«ã³ã³ããã¹ãã¡ãã¥ãŒã«ãã£ãŠåŒã³åºããããã¹ãŠã®é¢æ°ãäžç·ã«æ ŒçŽãããšãæ··ä¹±ãå°ãªããªããŸãã
ç§ãããªããã°ãªããªãã£ãå¯äžã®ããšã¯ãã©ã¹ã¿ãŒã¢ã€ã³ã³ã§ã¯ãªãFontelloãã©ã³ãã®ã¢ã€ã³ã³ãæç»ããªãããã«ãã©ã°ã€ã³ã¹ã¯ãªããã埮調æŽããããšã§ããã
ãã®ã³ã³ããã¹ãã¡ãã¥ãŒã®äž»ãªå©ç¹ã¯ãããŒãå¶åŸ¡ããŠé ç®ãéžæãããããããããŒãç¹å®ã®ã³ãã³ãã«å²ãåœãŠããã§ããããšã§ãã å ¬åŒãŠã§ããµã€ãã§ãã¢ã³ã¹ãã¬ãŒã·ã§ã³ãåŠç¿ãããšããã¹ãŠã®å©ç¹ãæããã«ãªããŸã ã
Fontello-ãã¯ãã«ã®ã¢ã€ã³ã³ã®ãã©ã³ã
ããã§ãã¹ãŒããŒããŒã±ããã®ããã«ããµã€ãã«è¡ãã䜿çšã§ããã¢ã€ã³ã³ãå ¥åããŸãã

ãã®åŸãã¢ãŒã«ã€ããããŠã³ããŒãããCSSãã¡ã€ã«ãžã®ãªã³ã¯ãã¡ã€ã³ã®htmlãã¡ã€ã«ã«è²Œãä»ããŸãã ãã以æ¥ããã©ãŠã¶ã«é¢ä¿ãªãããããã®ã¢ã€ã³ã³ã次ã®ããã«äœ¿çšããŸãã-ãã®ãããªHTMLã³ãŒãã¯ã¢ã€ã³ã³ã«å€ãããŸãã
ã³ã³ããã¹ãã¡ãã¥ãŒã«ç§»åããŠãã¡ã¢ãªã«ãŒãã®ãã¢ã³ã¹ãã¬ãŒã·ã§ã³ã§ã¢ã€ã³ã³èªäœãè©äŸ¡ã§ããŸãã èªç¶ã®çæ¯å°ã«ã¯120ã®ã¢ã€ã³ã³ããããŸãã
jQuery UI-ãŠãŒã¶ãŒã€ã³ã¿ã©ã¯ã·ã§ã³çšã®ãã©ã°ã€ã³ã©ã€ãã©ãª
ããã¯éåžžã«æåãªã©ã€ãã©ãªã§ãã«ã¬ã³ããŒããæ¥ä»ãéžæãããèŠçŽ ã®ãµã€ãºãå€æŽããããã©ãã°ããããããã¯ããŒã¯ããªã¹ãå ã®ã¢ã€ãã ãããŠã¹ã§äžŠã¹æ¿ãããªã©ã®èŠçŽ ããããŸãã åŸæããªãã§ãã ããã

ãã®ã¡ã¢ãªã«ãŒãã®äŸã§ã¯ããã©ãã°ã¢ã³ãããããã䜿çšããŠãä»ã®ããŒãéã§ãããããŒãããã©ãã°ã¢ã³ãããããããŸãã ããã§ã¯ãã¹ãŠãç°¡åã§ãããããªãã¯ãããå¿ èŠãããã®ã¯ãã«ãŒãããªãŒã«ã€ãªããããã芪ãåå«ã«ãã©ãã°ããŠããªãããšã確èªããããšã ãã§ãã
CSS-ã¡ã¢ãªã«ãŒãã®æç»
æã£ãŠããåããŒãã¯æ¬¡ã®ããã«ãªããŸãã
<div id="mindmap"> <ul class='childs'> <li> <div class='big_n_title'><div class='n_title'></div></div> <ul class='childs'> ...... </ul> </li> </ul> </div>
CSSããããã£ãulãliã.big_n_titleãããã³.n_titleã®åèŠçŽ ã«æ£ããå²ãåœãŠããšã衚瀺ãããŠããçš®é¡ã®ã¡ã¢ãªã«ãŒããæ£ç¢ºã«ååŸã§ããŸãã ãœãŒã¹ã³ãŒãã§ãã¹ãŠã®CSSããããã£ãèŠãããšãã§ããŸãã
å®éãç§å¯ã¯ãããè¡ãããšã§ãã
#mindmap { background-image: url(cross.png); background-attachment: scroll; white-space: nowrap; } #mindmap ul { display: inline-block; white-space: nowrap; vertical-align: middle; list-style: none; } #mindmap .big_n_title { display: inline-block; vertical-align: baseline; margin-right: 40px; position: relative; } #mindmap .n_title { display: inline-block; white-space: normal; }
ã€ãŸã ãªã¹ããèŠçŽ ãæ°ããè¡ã«è»¢éããããšãçŠæ¢ããŸãããªã¹ãèŠçŽ ã¯ã€ã³ã©ã€ã³ãããã¯ã衚瀺ãããããããã¹ãè¡ã®æåã«äŒŒããã®ã«ãªããŸãã ãŸããåçŽæ¹åã®ã»ã³ã¿ãªã³ã°ãè¿œå ããåããŒãã§åå¥ã«æ©èœããããã«ãããŒããdiv.big_n_titleã§ã©ããããŸãã
é©åœçã§éåžžã«è€éãªãã®ã¯ãããŸããã ãããŠããã¯åäœããŸãã
ãã®ææ³ãšæ¹åïŒrtlãçµã¿åããããšãããããä»ã®æ¹åïŒå³ããå·ŠïŒã«æç»ã§ããããšã確èªãããŠããŸãã ã«ãŒãã®å·ŠåŽãäžæ¹ã«ãå³åŽãããäžæ¹ã«ç§»åã§ããŸãã ããããç§ã¯çé¢ã«ãŒãã奜ãã§ã-èªã¿ãããã§ãã
ã©ãŠã³ããå§ããŸãããã githubã®ã³ãŒããªã¹ãã§è©³çŽ°ãªã³ã¡ã³ããèªã¿ãã人ã¯èª°ã§ããé¢æ°èªäœã®ååãé¢æ°ã®é·ãååã§åŒã³åºãããšã奜ã¿ãŸãã ç§ã®ã³ãŒããæ¹åããããšã¯ããªãå¯èœã§ãããããã§ãç§ã¯ãã£ãšè€éãªãããžã§ã¯ãã§äœ¿çšãããããã€ãã®ãã©ã°ã€ã³ã®åäœãå®èšŒããã¿ã¹ã¯ã«çŽé¢ããŸããã
æ¢è£œã®äŸãæ€èšããŠãã ããããã¹ãŠã®ãœãŒã¹ã³ãŒããå ¬éãããŠããŸãã
PSïŒãã®äŸãå°ããæŽç·Žã ãããš ã ãã€ã³ããã¹ã¿ãŒãåŸããããŠãŒã¶ãŒããæã«5ãã«ãã15ãã«ãåãåãããšãã§ããŸãïŒ åè«ã§ã ïŒã
ãéèŽããããšãããããŸãããjQueryãšãã©ã°ã€ã³ã®äœæè ãæéãç¯çŽããŠãããŸããã