\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
// 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
\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
"<!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
"<!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
// 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
\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
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
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
spanPos = buffer.indexOf("<span/>",spanPos);\r
}\r
\r
+ logger.log(logger.EXTREME, "Leaving EnmlConverter.fixEnXMLCrap");\r
return buffer.toString();\r
}\r
\r