OSDN Git Service

Update merge with local branch. Changes:
[neighbornote/NeighborNote.git] / src / cx / fbn / nevernote / evernote / EnmlConverter.java
index ab224de..f4570be 100644 (file)
@@ -32,6 +32,7 @@ import com.trolltech.qt.core.QTextCodec;
 \r
 import cx.fbn.nevernote.Global;\r
 import cx.fbn.nevernote.utilities.ApplicationLogger;\r
+import cx.fbn.nevernote.utilities.Pair;\r
 import cx.fbn.nevernote.xml.XMLCleanup;\r
 import cx.fbn.nevernote.xml.XMLNoteRepair;\r
 \r
@@ -125,6 +126,9 @@ public class EnmlConverter {
 //             newContent = repair.parse(newContent, false);\r
 //             logger.log(logger.HIGH, "Check complete");\r
        \r
+        logger.log(logger.HIGH, "Fixing encryption tags");\r
+        newContent = fixEncryptionTags(newContent);\r
+               \r
                Tidy tidy = new Tidy();\r
                TidyListener tidyListener = new TidyListener(logger);\r
                tidy.setMessageListener(tidyListener);\r
@@ -137,40 +141,42 @@ public class EnmlConverter {
         \r
 //             byte html[] = newContent.getBytes();\r
 //             ByteArrayInputStream is = new ByteArrayInputStream(html);\r
-\r
+        logger.log(logger.HIGH, "Starting JTidy check");\r
+        logger.log(logger.EXTREME, "Start of JTidy Input");\r
+        logger.log(logger.EXTREME, newContent);\r
+        logger.log(logger.EXTREME, "End Of JTidy Input");\r
                ByteArrayInputStream is = new ByteArrayInputStream(unicode.toByteArray());\r
         ByteArrayOutputStream os = new ByteArrayOutputStream();\r
         tidy.setInputEncoding("UTF-8");\r
-//        tidy.setOutputEncoding("UTF-8");\r
                tidy.parse(is, os);\r
-               newContent = os.toString();\r
-//             newContent = new QByteArray(codec.fromUnicode(os.toString())).toString();\r
+               String tidyContent = os.toString();\r
                if (tidyListener.errorFound) {\r
                        logger.log(logger.LOW, "Note Contents Begin");\r
                        logger.log(logger.LOW, content);\r
                        logger.log(logger.LOW, "Note Contents End");\r
-                       newContent = null;\r
+                       tidyContent = null;\r
                } else {\r
                        if (newContent.trim().equals(""))\r
-                               newContent = null;\r
+                               tidyContent = null;\r
                }\r
 \r
                // If the repair above returned null, then the XML is foobar.\r
                // We are done here.\r
-               if (newContent == null) {\r
-                       // Houston, we've had a problem.\r
-                       logger.log(logger.LOW, "Parse error when converting to ENML");\r
-                       logger.log(logger.LOW, "Start of unmodified note HTML");\r
-                       logger.log(logger.LOW, content);\r
-                       logger.log(logger.LOW, "End of unmodified note HTML");\r
-                       logger.log(logger.LOW, "Start of modified note HTML");\r
-                       logger.log(logger.LOW, newContent);\r
-                       logger.log(logger.LOW, "End of modified note HTML");\r
-//                             logger.log(logger.LOW, result.errorMessage);\r
-//                             logger.log(logger.LOW, "Error Line:Column "+result.errorLine+":" +result.errorColumn);\r
-                       return null;\r
-\r
-\r
+               if (tidyContent != null) {\r
+                       newContent = tidyContent;\r
+               } else {\r
+                       // Houston, we've had a problem.  Fall back to old method\r
+                       logger.log(logger.HIGH, "Error converting to JTidy.  Falling back to old method");\r
+                       String repairedContent = repair.parse(newContent, false);\r
+                       if (repairedContent == null) {\r
+                               logger.log(logger.EXTREME, "Null returned from repair.parse()");\r
+                               logger.log(logger.LOW, "Parse error when converting to ENML. Aborting save");\r
+                               return null;\r
+                       }\r
+                       newContent = repairedContent;\r
+                       logger.log(logger.EXTREME, "Start of repaired content");\r
+                       logger.log(logger.EXTREME, repairedContent);\r
+                       logger.log(logger.EXTREME, "End of repaired content");\r
                }\r
                \r
                // Second pass through the data.  The goal of this pass is to \r
@@ -204,7 +210,11 @@ public class EnmlConverter {
                                "<!DOCTYPE en-note SYSTEM \"" +dtd +"\">");\r
                \r
                logger.log(logger.HIGH, "Validating ENML");\r
-               newContent = repair.parse(newContent, true);\r
+               String repairedContent = repair.parse(newContent, true);\r
+               if (repairedContent == null)\r
+                       logger.log(logger.EXTREME, "Null returned from repair.parse()");\r
+               else\r
+                       newContent = repairedContent;\r
                logger.log(logger.HIGH, "Validation complete");\r
                saveInvalidXML = repair.saveInvalidXML;\r
                \r
@@ -213,10 +223,49 @@ public class EnmlConverter {
                                "<!DOCTYPE en-note SYSTEM 'http://xml.evernote.com/pub/enml2.dtd'>");\r
                \r
                \r
-               \r
+               logger.log(logger.EXTREME, "Leaving ENMLConverter.convert()");\r
                return newContent;\r
        }\r
+\r
        \r
+       private String fixEncryptionTags(String content) {\r
+               // Fix the problem that the document body isn't properly closed\r
+               String newContent = new String(content);\r
+               logger.log(logger.MEDIUM, "Inside EnmlConverter.fixEncryptionTags");\r
+               logger.log(logger.EXTREME, content);\r
+               \r
+               // Fix the problem that the img tag isn't properly closed\r
+               int endPos, startPos, endData,slotStart, slotEnd;\r
+               logger.log(logger.MEDIUM, "Checking table encryption tags");\r
+               String eTag = "<table class=\"en-crypt-temp\"";\r
+               for (int i=newContent.indexOf(eTag); i>0; i = newContent.indexOf(eTag,i+1)) {\r
+                       slotStart = newContent.indexOf("slot", i+1)+6;\r
+                       slotEnd = newContent.indexOf("\"",slotStart);\r
+                       String slot = newContent.substring(slotStart, slotEnd);\r
+                       startPos = newContent.indexOf("<td>", i+1)+4;\r
+                       endData = newContent.indexOf("</td>",startPos);\r
+                       String text = newContent.substring(startPos,endData);\r
+                       endPos = newContent.indexOf("</table>",i+1)+8;\r
+                       // Encrypt the text\r
+                       Pair<String,String> pair;\r
+                       Pair pair2 = Global.passwordSafe.get(slot);\r
+                       pair = pair2;\r
+                       String password = pair.getFirst();\r
+                       String hint = pair.getSecond();\r
+                       EnCrypt crypt = new EnCrypt(); \r
+                       String encrypted = crypt.encrypt(text, password, 64); \r
+\r
+                       // replace the table with an en-crypt tag.\r
+                       newContent = newContent.substring(0,i-1) + \r
+                               "<en-crypt-temp cipher=\"RC2\" length=\"64\" hint=\""+\r
+                               hint +"\" value=\""+\r
+                               encrypted +\r
+                               "\" />" +\r
+                               newContent.substring(endPos);\r
+               }\r
+               \r
+               return newContent;\r
+       }\r
        \r
        // Fix XML problems that Qt can't deal with\r
        public String fixStupidXMLProblems(String content) {\r
@@ -225,7 +274,7 @@ public class EnmlConverter {
                // Fix the problem that the document body isn't properly closed\r
                String newContent = new String(content);\r
                logger.log(logger.MEDIUM, "Inside fixStupidXMLProblems.  Old content:");\r
-               logger.log(logger.MEDIUM, content);\r
+               logger.log(logger.EXTREME, content);\r
                \r
                // Fix the problem that the img tag isn't properly closed\r
                int endPos;\r
@@ -269,12 +318,14 @@ public class EnmlConverter {
 \r
        // Fix XML that Evernote thinks is invalid\r
        public String fixEnXMLCrap(String note) {\r
+               logger.log(logger.EXTREME, "Entering EnmlConverter.fixEnXMLCrap");\r
                if (note == null)\r
                        return null;\r
                \r
                int pos;\r
                StringBuffer buffer = new StringBuffer(note);\r
                \r
+               logger.log(logger.EXTREME, "Converting <b/>");\r
                // change all <b/> to <b></b> because Evernote hates them if they happen in <span>\r
                pos = buffer.indexOf("<b/>");\r
                for (; pos>-1; ) {\r
@@ -282,6 +333,7 @@ public class EnmlConverter {
                        pos = buffer.indexOf("<b/>",pos);\r
                }\r
                // change all <br/> to <br></br> because Evernote hates them if they happen in <span>\r
+               logger.log(logger.EXTREME, "converting <br/>");\r
                pos = buffer.indexOf("<br/>");\r
                for (; pos>-1; ) {\r
                        buffer.replace(pos, pos+5, "<br></br>");\r
@@ -293,17 +345,6 @@ public class EnmlConverter {
                int spanPos;\r
                pos = buffer.indexOf("<li>");\r
                spanPos = buffer.indexOf("<span>");\r
-/*             for (; pos>-1 && spanPos >-1;) {\r
-                       endPos = buffer.indexOf("</li>",pos);\r
-                       if (spanPos > pos && spanPos < endPos) {\r
-                               buffer.replace(spanPos,spanPos+6,"");\r
-                               spanPos = buffer.indexOf("</span>");                            \r
-                               buffer.replace(spanPos,spanPos+7,"");\r
-                       }\r
-                       pos=buffer.indexOf("<li>",pos+1);\r
-                       spanPos = buffer.indexOf("<span>",spanPos);\r
-               }\r
-*/             \r
                // Get rid of empty spans in <li> elements\r
                pos = buffer.indexOf("<li>");\r
                spanPos = buffer.indexOf("<span/>");\r
@@ -316,6 +357,7 @@ public class EnmlConverter {
                        spanPos = buffer.indexOf("<span/>",spanPos);\r
                }\r
                \r
+               logger.log(logger.EXTREME, "Leaving EnmlConverter.fixEnXMLCrap");\r
                return buffer.toString();\r
        }\r
        \r