~carla-sella/reminders-app/new-reminders-app-tests

« back to all changes in this revision

Viewing changes to src/plugin/Evernote/utils/html2enmlconverter.cpp

  • Committer: Tarmac
  • Author(s): Michael Zanetti
  • Date: 2013-11-26 13:20:39 UTC
  • mfrom: (7.1.6 reminders-app-html2evml)
  • Revision ID: tarmac-20131126132039-3zmyobkekgqi3ckm
"properly" convert html back to enml. Loses images and tables but works quite well for all the rest.

Approved by David Planella, Ubuntu Phone Apps Jenkins Bot.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
#include "html2enmlconverter.h"
 
2
 
 
3
#include <QXmlStreamReader>
 
4
#include <QXmlStreamWriter>
 
5
#include <QStringList>
 
6
 
 
7
// Taken from http://xml.evernote.com/pub/enml2.dtd
 
8
QStringList supportedTags = QStringList() << "a" << "abbr" << "acronym" << "address" << "area" << "b" << "bdo" << "big" <<
 
9
                                             "blockquote" << "br" << "caption" << "center" << "cite" << "code" << "col" <<
 
10
                                             "colgroup" << "dd" << "del" << "dfn" << "div" << "dl" << "dt" << "em" <<
 
11
                                             "en-crypt" << "en-media" << "en-todo" << "font" << "h1" << "h2" << "h3" <<
 
12
                                             "h4" << "h5" << "h6" << "hr" << "i" << "img" << "ins" << "kbd" << "li" <<
 
13
                                             "map" << "ol" << "p" << "pre" << "q" << "s" << "samp" << "small" << "span" <<
 
14
                                             "strike" << "strong" << "sub" << "sup" << "table" << "tbody" << "td" <<
 
15
                                             "tfoot" << "th" << "thead" << "tr" << "tt" << "u" << "ul" << "var";
 
16
 
 
17
 
 
18
Html2EnmlConverter::Html2EnmlConverter()
 
19
{
 
20
}
 
21
 
 
22
QString Html2EnmlConverter::html2enml(const QString &html)
 
23
{
 
24
    // output
 
25
    QString evml;
 
26
    QXmlStreamWriter writer(&evml);
 
27
    writer.writeStartDocument();
 
28
    writer.writeDTD("<!DOCTYPE en-note SYSTEM \"http://xml.evernote.com/pub/enml2.dtd\">");
 
29
 
 
30
    // input
 
31
    QXmlStreamReader reader(html);
 
32
 
 
33
    // state
 
34
    bool isBody = false;
 
35
 
 
36
    while (!reader.atEnd() && !reader.hasError()) {
 
37
        QXmlStreamReader::TokenType token = reader.readNext();
 
38
        if(token == QXmlStreamReader::StartDocument) {
 
39
            continue;
 
40
        }
 
41
 
 
42
        // Handle start elements
 
43
        if(token == QXmlStreamReader::StartElement) {
 
44
            // skip everything if body hasn't started yet
 
45
            if (!isBody) {
 
46
                if (reader.name() == "body") {
 
47
                    writer.writeStartElement("en-note");
 
48
                    isBody = true;
 
49
                }
 
50
                continue;
 
51
            }
 
52
            // Write supported start elements to output (including attributes)
 
53
            if (supportedTags.contains(reader.name().toString())) {
 
54
                writer.writeStartElement(reader.name().toString());
 
55
                writer.writeAttributes(reader.attributes());
 
56
            }
 
57
        }
 
58
 
 
59
        // Write *all* normal text inside <body> </body> to output
 
60
        if (isBody && token == QXmlStreamReader::Characters) {
 
61
            writer.writeCharacters(reader.text().toString());
 
62
        }
 
63
 
 
64
        // handle end elements
 
65
        if (token == QXmlStreamReader::EndElement) {
 
66
 
 
67
            // skip everything after body
 
68
            if (reader.name() == "body") {
 
69
                writer.writeEndElement();
 
70
                isBody = false;
 
71
                break;
 
72
            }
 
73
 
 
74
            // Write closing tags for supported elements
 
75
            if (supportedTags.contains(reader.name().toString())) {
 
76
                writer.writeEndElement();
 
77
            }
 
78
        }
 
79
    }
 
80
 
 
81
    writer.writeEndDocument();
 
82
 
 
83
    return evml;
 
84
}