package cx.fbn.nevernote.xml;\r
\r
+import java.io.ByteArrayInputStream;\r
+import java.io.ByteArrayOutputStream;\r
import java.io.File;\r
import java.util.ArrayList;\r
import java.util.List;\r
\r
+import org.w3c.tidy.Tidy;\r
+import org.w3c.tidy.TidyMessage;\r
+\r
import com.evernote.edam.type.Note;\r
import com.evernote.edam.type.Resource;\r
import com.trolltech.qt.core.QByteArray;\r
import com.trolltech.qt.core.QIODevice;\r
import com.trolltech.qt.core.QIODevice.OpenModeFlag;\r
import com.trolltech.qt.core.QTemporaryFile;\r
+import com.trolltech.qt.core.QTextCodec;\r
import com.trolltech.qt.core.QUrl;\r
import com.trolltech.qt.core.Qt.BGMode;\r
import com.trolltech.qt.gui.QColor;\r
ArrayList<QTemporaryFile> tempFiles;\r
private EnSearch enSearch;\r
private boolean noteHistory;\r
+ public boolean formatError;\r
\r
public NoteFormatter(ApplicationLogger logger, DatabaseConnection conn, List<QTemporaryFile> tempFiles2) {\r
this.logger = logger;\r
}\r
\r
\r
+ private class TidyListener implements org.w3c.tidy.TidyMessageListener {\r
+ \r
+ ApplicationLogger logger;\r
+ public boolean errorFound; \r
+ \r
+ public TidyListener(ApplicationLogger logger) {\r
+ this.logger = logger;\r
+ errorFound = false;\r
+ }\r
+ @Override\r
+ public void messageReceived(TidyMessage msg) {\r
+ if (msg.getLevel() == TidyMessage.Level.ERROR) {\r
+ logger.log(logger.LOW, "******* JTIDY ERORR *******");\r
+ logger.log(logger.LOW, "Error Code: " +msg.getErrorCode());\r
+ logger.log(logger.LOW, "Column: " +msg.getColumn());\r
+ logger.log(logger.LOW, "Column: " +msg.getColumn());\r
+ logger.log(logger.LOW, "Line: " +msg.getLine());\r
+ logger.log(logger.LOW, "Message: " +msg.getMessage());\r
+ logger.log(logger.LOW, "***************************");\r
+ errorFound = true;\r
+ } else \r
+ logger.log(logger.EXTREME, "JTidy Results: "+msg.getMessage());\r
+ }\r
+ \r
+ }\r
+\r
+ \r
+ \r
public void setNote(Note note, boolean pdfPreview) {\r
currentNote = note;\r
this.pdfPreview = pdfPreview;\r
\r
// Rebuild the note HTML to something usable\r
public String rebuildNoteHTML() {\r
+ formatError = false;\r
if (currentNote == null)\r
return null;\r
logger.log(logger.HIGH, "Entering NeverNote.rebuildNoteHTML");\r
logger.log(logger.EXTREME, "Note guid: " +currentNoteGuid);\r
logger.log(logger.EXTREME, "Note Text:" +currentNote);\r
QDomDocument doc = new QDomDocument();\r
- QDomDocument.Result result = doc.setContent(currentNote.getContent());\r
+// QDomDocument.Result result = doc.setContent(currentNote.getContent());\r
+ QDomDocument.Result result = doc.setContent(conn.getNoteTable().getNoteContentNoUTFConversion(currentNote.getGuid()));\r
+ \r
+ // Handle any errors\r
+ if (!result.success) {\r
+ logger.log(logger.LOW, "Error parsing document. Attempting to restructure");\r
+ Tidy tidy = new Tidy();\r
+ TidyListener tidyListener = new TidyListener(logger);\r
+ tidy.setMessageListener(tidyListener);\r
+ tidy.getStderr().close(); // the listener will capture messages\r
+ tidy.setXmlTags(true);\r
+ \r
+ QTextCodec codec;\r
+ codec = QTextCodec.codecForName("UTF-8");\r
+ QByteArray unicode = codec.fromUnicode(currentNote.getContent());\r
+ \r
+ logger.log(logger.MEDIUM, "Starting JTidy check");\r
+ logger.log(logger.MEDIUM, "Start of JTidy Input");\r
+ logger.log(logger.MEDIUM, currentNote.getContent());\r
+ logger.log(logger.MEDIUM, "End Of JTidy Input");\r
+ ByteArrayInputStream is = new ByteArrayInputStream(unicode.toByteArray());\r
+ ByteArrayOutputStream os = new ByteArrayOutputStream();\r
+ tidy.setInputEncoding("UTF-8");\r
+ tidy.parse(is, os);\r
+ String tidyContent = os.toString();\r
+ if (tidyListener.errorFound) {\r
+ logger.log(logger.LOW, "Restructure failed!!!");\r
+ } else {\r
+ doc = null;\r
+ doc = new QDomDocument();\r
+ result = doc.setContent(tidyContent);\r
+ }\r
+ }\r
if (!result.success) {\r
- logger.log(logger.MEDIUM, "Parse error when rebuilding HTML");\r
+ logger.log(logger.MEDIUM, "Parse error when rebuilding XML to HTML");\r
logger.log(logger.MEDIUM, "Note guid: " +currentNoteGuid);\r
- logger.log(logger.EXTREME, "Start of unmodified note HTML");\r
+ logger.log(logger.MEDIUM, "Error: "+result.errorMessage);\r
+ logger.log(logger.MEDIUM, "Line: " +result.errorLine + " Column: " +result.errorColumn);\r
+ System.out.println("Error: "+result.errorMessage);\r
+ System.out.println("Line: " +result.errorLine + " Column: " +result.errorColumn);\r
+ logger.log(logger.EXTREME, "**** Start of unmodified note HTML");\r
logger.log(logger.EXTREME, currentNote.getContent());\r
- logger.log(logger.EXTREME, "End of unmodified note HTML");\r
+ logger.log(logger.EXTREME, "**** End of unmodified note HTML");\r
+ formatError = true;\r
+ readOnly = true;\r
return currentNote.getContent();\r
}\r
\r
for (int j=z-1; j>i+1; j--) \r
html.deleteCharAt(j);\r
} \r
- return html.toString();\r
+ \r
+ QTextCodec codec;\r
+ codec = QTextCodec.codecForName("UTF-8");\r
+ String value = codec.fromUnicode(html.toString()).toString();\r
+ return value;\r
+\r
+// return html.toString(); //.replace("<Body", "<Body dir=\"rtl\"");\r
} \r
\r
private void addImageHilight(String resGuid, QFile f) {\r
}\r
\r
// Modify the en-media tag into an image tag so it can be displayed.\r
- private void modifyImageTags(QDomElement docElem, QDomElement enmedia, QDomAttr hash) {\r
+ private void modifyImageTags(QDomDocument doc, QDomElement docElem, QDomElement enmedia, QDomAttr hash) {\r
logger.log(logger.HIGH, "Entering NeverNote.modifyImageTags");\r
String type = enmedia.attribute("type");\r
if (type.startsWith("image/"))\r
// enmedia.setAttribute("src", QUrl.fromLocalFile(tfile.fileName()).toString());\r
enmedia.setAttribute("src", tfile.fileName().toString());\r
enmedia.setAttribute("en-tag", "en-media");\r
- enmedia.setAttribute("onContextMenu", "window.jambi.imageContextMenu('" +tfile.fileName() +"');");\r
+ enmedia.setTagName("img");\r
+ if (r != null && r.getAttributes() != null && \r
+ (r.getAttributes().getSourceURL() == null || !r.getAttributes().getSourceURL().toLowerCase().startsWith("http://latex.codecogs.com/gif.latex?")))\r
+ enmedia.setAttribute("onContextMenu", "window.jambi.imageContextMenu('" +tfile.fileName() +"');");\r
+ else {\r
+ QDomElement newText = doc.createElement("a");\r
+ enmedia.setAttribute("src", tfile.fileName().toString());\r
+ enmedia.setAttribute("en-tag", "en-latex");\r
+ newText.setAttribute("onMouseOver", "style.cursor='hand'");\r
+ if (r!= null && r.getAttributes() != null && r.getAttributes().getSourceURL() != null)\r
+ newText.setAttribute("title", r.getAttributes().getSourceURL());\r
+ newText.setAttribute("href", "latex://"+tfile.fileName().toString());\r
+ enmedia.parentNode().replaceChild(newText, enmedia);\r
+ newText.appendChild(enmedia);\r
+\r
+ }\r
enmedia.setNodeValue("");\r
enmedia.setAttribute("guid", resGuid);\r
- enmedia.setTagName("img");\r
+\r
\r
logger.log(logger.HIGH, "Leaving NeverNote.modifyImageTags");\r
}\r
// Modify en-media tags\r
QDomNodeList anchors = docElem.elementsByTagName("en-media");\r
int enMediaCount = anchors.length();\r
- for (int i=enMediaCount-1; i>=0; i--) {\r
+ for (int i=enMediaCount-1; i>=0; --i) {\r
QDomElement enmedia = anchors.at(i).toElement();\r
if (enmedia.hasAttribute("type")) {\r
QDomAttr attr = enmedia.attributeNode("type");\r
\r
if (type[0] != null) {\r
if (type[0].equals("image")) {\r
- modifyImageTags(docElem, enmedia, hash);\r
+ modifyImageTags(doc, docElem, enmedia, hash);\r
}\r
if (!type[0].equals("image")) {\r
modifyApplicationTags(doc, docElem, enmedia, hash, appl);\r
enCryptLen = anchors.length();\r
for (int i=0; i<anchors.length(); i++) {\r
QDomElement element = anchors.at(i).toElement();\r
- element.setAttribute("title", element.attribute("href"));\r
+ if (!element.attribute("href").toLowerCase().startsWith("latex://"))\r
+ element.setAttribute("title", element.attribute("href"));\r
+ else {\r
+ element.setAttribute("title", element.attribute("title").toLowerCase().replace("http://latex.codecogs.com/gif.latex?",""));\r
+ }\r
}\r
\r
logger.log(logger.HIGH, "Leaving NeverNote.modifyTags");\r
newText.setAttribute("src", Global.getFileManager().getImageDirPath(icon));\r
if (goodPreview) {\r
// NFC TODO: should this be a 'file://' URL?\r
- newText.setAttribute("src", fileManager.getResDirPath(filePath));\r
+ newText.setAttribute("src", fileManager.getResDirPathSpecialChar(filePath));\r
newText.setAttribute("style", "border-style:solid; border-color:green; padding:0.5mm 0.5mm 0.5mm 0.5mm;");\r
}\r
newText.setAttribute("title", fileDetails);\r