User:Jiangxin/Better chinese characters support

From FreeMind
< User:Jiangxin
Revision as of 18:20, 6 April 2006 by Jiangxin (talk | contribs) (→‎About)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigationJump to search
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.

About

Output .mm files of FreeMind 0.8.0 is not suitable for our Chinese. All Chinese characters are encoding as &#x...;. The feeling of our Chinese is just like your English speakers see our Chinese character like 像是看天书.

FreeMind another problem is not utf-8 aware. When open file, if the .mm file's version matches current version, FreeMind simply read them into buffer, ignore the character encoding, even if xml declare exist.

I add a member function private Reader getActualReaderXml(File file) to load .mm file. The implement is in User:Jiangxin/Patch_load_mm_file_with_mmx_file

Requirement

  • Add a .mm output character format in preference dialog.


My patch

Index: freemind/freemind/main/FreeMind.java
===================================================================
--- freemind/freemind/main/FreeMind.java	(.../tags/RELEASE-0-8-0)	(revision 2)
+++ freemind/freemind/main/FreeMind.java	(.../branches/WHFM-0-8-0)	(working copy)
@@ -86,6 +86,7 @@
     private static final String DEFAULT_LANGUAGE = "en";
     private HookFactory nodeHookFactory;
 	public static final String version = "0.8.0";
+    public static final String DEFAULT_CHARSET = "UTF-8";
     //    public static final String defaultPropsURL = "freemind.properties";
     public URL defaultPropsURL;
     //    public static Properties defaultProps;
Index: freemind/freemind/main/XMLElement.java
===================================================================
--- freemind/freemind/main/XMLElement.java	(.../tags/RELEASE-0-8-0)	(revision 2)
+++ freemind/freemind/main/XMLElement.java	(.../branches/WHFM-0-8-0)	(working copy)
@@ -2140,7 +2195,8 @@
     {
         try {
             ByteArrayOutputStream out = new ByteArrayOutputStream();
-            OutputStreamWriter writer = new OutputStreamWriter(out);
+            // TODO user can define his/her own charset.
+            OutputStreamWriter writer = new OutputStreamWriter(out, FreeMind.DEFAULT_CHARSET);
             this.write(writer);
             writer.flush();
             return new String(out.toByteArray());
@@ -2285,7 +2357,7 @@
                     break;
                 default:
                     int unicode = (int) ch;
-                    if ((unicode < 32) || (unicode > 126)) {
+                    if (unicode < 32) {
                         writer.write('&'); writer.write('#');
                         writer.write('x');
                         writer.write(Integer.toString(unicode, 16));
Index: freemind/freemind/modes/mindmapmode/MindMapMapModel.java
===================================================================
--- freemind/freemind/modes/mindmapmode/MindMapMapModel.java	(.../tags/RELEASE-0-8-0)	(revision 2)
+++ freemind/freemind/modes/mindmapmode/MindMapMapModel.java	(.../branches/WHFM-0-8-0)	(working copy)
@@ -414,7 +419,8 @@
             return false; }
         try {            
             //Generating output Stream            
+            // TODO user can define his/her own charset.
-            BufferedWriter fileout = new BufferedWriter( new OutputStreamWriter( new FileOutputStream(file) ) );
+            BufferedWriter fileout = new BufferedWriter( new OutputStreamWriter( new FileOutputStream(file), FreeMind.DEFAULT_CHARSET ) );
             getXml(fileout);
 
             if(!isInternal) {
@@ -440,6 +461,8 @@
 	 * @throws IOException
 	 */
 	public void getXml(Writer fileout) throws IOException {
+		// TODO user can define his/her own charset.
+		fileout.write("<?xml version=\"1.0\" encoding=\"" + FreeMind.DEFAULT_CHARSET + "\"?>\n");
 		fileout.write("<map version=\""+getFrame().getFreemindVersion()+"\">\n");
 		fileout.write("<!-- To view this file, download free mind mapping software FreeMind from http://freemind.sourceforge.net -->\n");
 		((MindMapNodeModel)getRoot()).save(fileout, this.getLinkRegistry());
Index: freemind/freemind/modes/mindmapmode/MindMapMapModel.java
===================================================================
--- freemind/freemind/modes/mindmapmode/MindMapMapModel.java	(.../tags/RELEASE-0-8-0)	(revision 2)
+++ freemind/freemind/modes/mindmapmode/MindMapMapModel.java	(.../branches/WHFM-0-8-0)	(working copy)
@@ -509,21 +552,37 @@
         // FIXME: fc, 27.8.2005: this is for 0.8.0 only. Remove me ASAP.
         String expectedAlternativeStartString = "<map version=\"0.7.1\"";
         int versionInfoLength = expectedStartString.length();
-        // reading the start of the file:
-        StringBuffer buffer = readFileStart(file, versionInfoLength);
-        String mapStart = "";
-        if(buffer.length() >= versionInfoLength){
-        		mapStart = buffer.substring(0, versionInfoLength);
+        // reading magic number:
+    	BufferedReader in=null;
+    	String str = null;
+        try {
+                // get the file start into the memory:
+                in = new BufferedReader(new FileReader(file));
+                while ((str = in.readLine()) != null) {
+                        if (str.substring(0,4).equals("<map"))
+                        {
+                                break;
+                        }
+                }
+                in.close();
+        } catch (Exception e) {
+                e.printStackTrace();
+                str = "";
         }
+
+        String mapStart = str;
+        if(str.length() >= versionInfoLength){
+                mapStart = str.substring(0, versionInfoLength);
+        }
         // the resulting file is accessed by the reader:
         Reader reader = null;
         if (mapStart.equals(expectedStartString)
@@ -543,32 +602,6 @@
         return (MindMapNodeModel) mapElement.getMapChild();
     }
 
-    /** Returns pMinimumLength bytes of the files content.
-     * @param file
-     * @param pMinimumLength
-     * @return
-     * @throws FileNotFoundException
-     * @throws IOException
-     */
-    private StringBuffer readFileStart(File file, int pMinimumLength) {
-    	BufferedReader in=null;
-    	StringBuffer buffer = new StringBuffer();
-        try {
-			// get the file start into the memory:
-			in = new BufferedReader(new FileReader(file));
-			String str;
-			while ((str = in.readLine()) != null) {
-				buffer.append(str);
-				if (buffer.length() >= pMinimumLength)
-					break;
-			}
-			in.close();
-		} catch (Exception e) {
-			e.printStackTrace();
-			return new StringBuffer();
-		}
-		return buffer;
-    }