FreeMind 0.9.0βの「分割ノード」とは?
前に書いたFreeMindのマップ分割の記事で、FreeMind 0.9.0βのツールメニューにある分割ノードとは何ぞや?という話が少し出ていたました。先日書きましたようにFreeMind0.9.0β20のソースを入手しましたので、これが何をするものか、という調査にチャレンジしてみました。
といってもプログラムの構造がよくわからないので、Eclipseの力を借りてのごり押しです。FreeMindを英語表記にしてみると、該当メニューのラベルは「Split Node」なので、このあたりの単語でソースの全文検索をかけて関係のありそうな箇所を探します。
その結果、accessories.plugins.SplitNodeというクラスがこのメニューの処理をやっていそうです。具体的には、以下のメソッドが処理の中核になります。
private String[] splitNode(String text) { if(text.startsWith("<html>")){ String[] parts = null; HTMLEditorKit kit = new HTMLEditorKit(); HTMLDocument doc = new HTMLDocument(); StringReader buf = new StringReader(text); try { kit.read(buf, doc, 0); Element parent = getParentElement(doc); if(parent == null){ return null; } final int elementCount = parent.getElementCount(); int notEmptyElementCount = 0; parts = new String[elementCount]; for(int i = 0; i < elementCount; i++){ Element current = parent.getElement(i); final int start = current.getStartOffset(); final int end = current.getEndOffset(); final String paragraphText = doc.getText(start, end - start).trim(); if(paragraphText.length() > 0){ StringWriter out = new StringWriter(); new FixedHTMLWriter(out, doc, start, end - start).write(); final String string = out.toString(); if(! string.equals("")){ parts[i] = string; notEmptyElementCount ++; } else{ parts[i] = null; } } } if(notEmptyElementCount <= 1){ return null; } } catch (IOException e) { freemind.main.Resources.getInstance().logException(e); } catch (BadLocationException e) { freemind.main.Resources.getInstance().logException(e); } return parts; } return text.split("\n"); }
このメソッドの引数は分割対象のノードの内容の文字列です。中の処理を見ると、""で始まっていればhtmlとみなして要素毎に分割し、そうでなければ単純に行単位に分割しているようです。
という予想が立ちましたので、試しにhtmlのtableを埋め込んだノードと、複数行のテキストを入力したノードでこのメニューの動作を試してみたところ、以下のようになりました。
どうやら、予想通りの動きをしています。結局マップ分割とは関係なくて、ノードの内容をhtml構造あるいは行で分割するためのコマンドだったようです。