User:Jiangxin/Better chinese characters support
From FreeMind
Jump to navigationJump to search
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; - }