~ubuntu-branches/ubuntu/raring/koffice/raring

« back to all changes in this revision

Viewing changes to filters/kword/msword-odf/texthandler.cpp

  • Committer: Bazaar Package Importer
  • Author(s): Jonathan Riddell
  • Date: 2010-12-06 15:30:09 UTC
  • mfrom: (0.13.1 upstream)
  • Revision ID: james.westby@ubuntu.com-20101206153009-yf0dqbp9l7fzwxi8
Tags: 1:2.2.91-0ubuntu1
New upstream RC release

Show diffs side-by-side

added added

removed removed

Lines of Context:
145
145
    m_sep = sep; //store sep for section end
146
146
 
147
147
    //type of the section break
148
 
    kDebug(30513) << "sep->bkc = " << sep->bkc;
 
148
    kDebug(30513) << "section" << m_sectionNumber << "| sep->bkc:" << sep->bkc;
149
149
 
150
150
    //page layout could change
151
151
    if (sep->bkc != 1) {
289
289
{
290
290
    kDebug(30513);
291
291
 
292
 
    if (m_document->omittMasterPage()) {
293
 
        kDebug(30513) << "Omitting headers/footers because master-page was omitted!";
 
292
    if (m_document->omittMasterPage() || m_document->useLastMasterPage()) {
 
293
        kDebug(30513) << "Processing of headers/footers cancelled, master-page creation omitted.";
294
294
        return;
295
295
    }
296
296
    //NOTE: only parse headers if we're in a section that can have new headers
797
797
            outlineLevel = paragraphProperties->pap().ilvl + 1;
798
798
        } else {
799
799
            // List processing
800
 
            // This takes car of all the cases:
 
800
            // This takes care of all the cases:
801
801
            //  - A new list
802
802
            //  - A list with higher level than before
803
803
            //  - A list with lower level than before
861
861
 
862
862
    //add nested field snippets to this paragraph
863
863
    if (m_fldStates.empty()) {
864
 
        QList<QString>* list = &fld_snippets;
865
 
        while (!list->isEmpty()) {
 
864
        QList<QString>* flds = &fld_snippets;
 
865
        while (!flds->isEmpty()) {
866
866
            //add writer content to m_paragraph as a runOfText with no text style
867
 
            m_paragraph->addRunOfText(list->takeFirst(), 0, QString(""), m_parser->styleSheet());
 
867
            m_paragraph->addRunOfText(flds->takeFirst(), 0, QString(""), m_parser->styleSheet());
868
868
        }
869
869
    }
870
870
 
925
925
{
926
926
    //NOTE: The content between fieldStart and fieldSeparator represents field
927
927
    //instructions and the content between fieldSeparator and fieldEnd
928
 
    //represents the field result.
929
 
    kDebug(30513) << "fld->flt = " << hex << fld->flt;
 
928
    //represents the field RESULT [optional].  In most cases the field RESULT
 
929
    //stores the complete information (instruction are applied by msword).
 
930
    kDebug(30513) << "fld->flt:" << fld->flt << "(" << hex << fld->flt << ")";
930
931
 
931
932
    //nested field
932
933
    if (m_insideField) {
943
944
 
944
945
    //check to see if we can process this field type or not
945
946
    switch (m_fieldType) {
 
947
    case EQ:
 
948
        kDebug(30513) << "processing field... EQ (Combined Characters)";
 
949
        break;
 
950
    case HYPERLINK:
 
951
        kDebug(30513) << "processing field... HYPERLINK";
 
952
        break;
 
953
    case MACROBUTTON:
 
954
        kDebug(30513) << "processing field... MACROBUTTON";
 
955
        break;
 
956
    case NUMPAGES:
 
957
    case PAGE:
 
958
        m_paragraph->setContainsPageNumberField(true);
 
959
        break;
 
960
    case PAGEREF:
 
961
        kDebug(30513) << "processing field... PAGEREF";
 
962
        break;
946
963
    case REF:
947
 
        kWarning(30513) << "Warning: REF (Not supported yet)";
 
964
        kWarning(30513) << "Warning: unsupported field (REF)";
948
965
        m_fieldType = UNSUPPORTED;
949
966
        break;
950
967
    case TOC:
951
 
        kWarning(30513) << "Warning: TOC (Not supported yet)";
 
968
        kWarning(30513) << "Warning: unsupported field (TOC)";
952
969
        m_fieldType = UNSUPPORTED;
953
970
        break;
954
 
    case NUMPAGES:
955
 
    case PAGE:
956
 
        m_paragraph->setContainsPageNumberField(true);
957
 
        break;
958
 
    case PAGEREF:
959
 
        kDebug(30513) << "processing field... PAGEREF";
960
 
        break;
961
 
    case EQ:
962
 
        kDebug(30513) << "processing field... EQ (Combined Characters)";
963
 
        break;
964
 
    case HYPERLINK:
965
 
        kDebug(30513) << "processing field... HYPERLINK";
966
 
        break;
 
971
    case AUTHOR:
 
972
    case EDITTIME:
 
973
    case FILENAME:
967
974
    case MERGEFIELD:
968
975
    case SHAPE:
969
 
        kWarning(30513) << "Warning: unsupported field, just outputting text into document...";
 
976
    case TITLE:
 
977
        kWarning(30513) << "Warning: field instructions not supported, storing field result!";
 
978
        break;
 
979
    case SYMBOL:
 
980
        kWarning(30513) << "Warning: processing only a subset of field instructions!";
970
981
        break;
971
982
    default:
972
983
        kWarning(30513) << "Warning: unrecognized field type, ignoring!";
1006
1017
void KWordTextHandler::fieldEnd(const wvWare::FLD* /*fld*/, wvWare::SharedPtr<const wvWare::Word97::CHP> chp)
1007
1018
{
1008
1019
//    Q_UNUSED(chp);
1009
 
 
1010
1020
    kDebug(30513);
1011
 
    //process different fields
1012
 
    //we could be writing to content.xml or styles.xml (in a header)
 
1021
    //process different fields, we could be writing to content.xml or
 
1022
    //styles.xml (header/footer)
1013
1023
 
1014
1024
    QBuffer buf;
1015
1025
    buf.open(QIODevice::WriteOnly);
1018
1028
    QString tmp;
1019
1029
 
1020
1030
    switch (m_fieldType) {
1021
 
    case NUMPAGES:
1022
 
        writer.startElement("text:page-count");
1023
 
        writer.endElement();
1024
 
        break;
1025
 
    case PAGE:
1026
 
        writer.startElement("text:page-number");
1027
 
        writer.addAttribute("text:select-page", "current");
1028
 
        writer.endElement();
1029
 
        break;
1030
 
    case PAGEREF:
1031
 
        //NOTE: reference-format can be: chapter, direction, page, text
1032
 
        if (str->contains("PAGEREF")) {
1033
 
            str->remove("PAGEREF");
1034
 
        }
1035
 
        //we should create a hyperlink to the bookmarked paragraph
1036
 
        if (str->contains("\\h")) {
1037
 
            str->remove("\\h");
1038
 
            tmp = "text";
1039
 
        } else {
1040
 
            tmp = "page";
1041
 
        }
1042
 
        *str = str->trimmed();
1043
 
        writer.startElement("text:bookmark-ref");
1044
 
        writer.addAttribute("text:reference-format", tmp);
1045
 
        writer.addAttribute("text:ref-name", *str);
1046
 
        writer.addTextNode(m_fldResult);
1047
 
        writer.endElement();
1048
 
        break;
1049
 
    case EQ: // combined characters stored as 'equation'
 
1031
    case EQ:
 
1032
        //TODO: nested fields support required
 
1033
        //NOTE: actually combined characters stored as 'equation'
1050
1034
        {
1051
1035
            QRegExp rx("eq \\\\o\\(\\\\s\\\\up 36\\(([^\\)]*)\\),\\\\s\\\\do 12\\(([^\\)]*)\\)\\)");
1052
1036
            int where = rx.indexIn(*str);
1081
1065
        }
1082
1066
        //else a frame or drawing shape acting as a hyperlink already processed
1083
1067
        break;
 
1068
    case MACROBUTTON:
 
1069
        //TODO: nested fields support required
 
1070
        {
 
1071
            QRegExp rx("MACROBUTTON\\s\\s?\\w+\\s\\s?(.+)$");
 
1072
            *str = str->trimmed();
 
1073
            if (rx.indexIn(*str) >= 0) {
 
1074
                m_paragraph->addRunOfText(rx.cap(1), chp, QString(""), m_parser->styleSheet());
 
1075
            }
 
1076
        }
 
1077
        break;
 
1078
    case NUMPAGES:
 
1079
        writer.startElement("text:page-count");
 
1080
        writer.endElement();
 
1081
        break;
 
1082
    case PAGE:
 
1083
        writer.startElement("text:page-number");
 
1084
        writer.addAttribute("text:select-page", "current");
 
1085
        writer.endElement();
 
1086
        break;
 
1087
    case PAGEREF:
 
1088
        //NOTE: reference-format can be: chapter, direction, page, text
 
1089
        if (str->contains("PAGEREF")) {
 
1090
            str->remove("PAGEREF");
 
1091
        }
 
1092
        //we should create a hyperlink to the bookmarked paragraph
 
1093
        if (str->contains("\\h")) {
 
1094
            str->remove("\\h");
 
1095
            tmp = "text";
 
1096
        } else {
 
1097
            tmp = "page";
 
1098
        }
 
1099
        *str = str->trimmed();
 
1100
        writer.startElement("text:bookmark-ref");
 
1101
        writer.addAttribute("text:reference-format", tmp);
 
1102
        writer.addAttribute("text:ref-name", *str);
 
1103
        writer.addTextNode(m_fldResult);
 
1104
        writer.endElement();
 
1105
        break;
 
1106
    case SYMBOL:
 
1107
        //TODO: nested fields support required
 
1108
        {
 
1109
            QRegExp rx_txt("SYMBOL\\s{2}(\\S+)\\s+.+$");
 
1110
            QString txt;
 
1111
            *str = str->trimmed();
 
1112
 
 
1113
            //check for text in field instructions
 
1114
            if (rx_txt.indexIn(*str) >= 0) {
 
1115
                txt = rx_txt.cap(1);
 
1116
 
 
1117
                //ascii code
 
1118
                if (str->contains("\\a")) {
 
1119
                    QRegExp rx16("0\\D.+");
 
1120
                    bool ok = false;
 
1121
                    int n;
 
1122
 
 
1123
                    if (rx16.indexIn(txt) >= 0) {
 
1124
                        n = txt.toInt(&ok, 16);
 
1125
                    }
 
1126
                    else { 
 
1127
                        n = txt.toInt(&ok, 10);
 
1128
                    }
 
1129
                    if (ok) {
 
1130
                        tmp.append((char) n);
 
1131
                    }
 
1132
                }
 
1133
                //unicode
 
1134
                if (str->contains("\\u")) {
 
1135
                    qDebug() << "Warning: unicode symbols not supported!";
 
1136
                }
 
1137
            }
 
1138
            //default value (check the corresponding test)
 
1139
            if (tmp.isEmpty()) {
 
1140
                tmp = "###";
 
1141
            }
 
1142
            m_paragraph->addRunOfText(tmp, chp, QString(""), m_parser->styleSheet());
 
1143
        }
 
1144
        break;
1084
1145
    default:
1085
1146
        break;
1086
1147
    }
1142
1203
        //processing field instructions
1143
1204
        if (!m_fieldAfterSeparator) {
1144
1205
            switch (m_fieldType) {
 
1206
            case EQ:
 
1207
            case HYPERLINK:
 
1208
            case MACROBUTTON:
1145
1209
            case PAGEREF:
1146
 
            case EQ:
1147
 
            case HYPERLINK:
 
1210
            case SYMBOL:
1148
1211
                m_fldInst.append(newText);
1149
1212
                break;
1150
1213
            default:
1151
 
                kDebug(30513) << "Ignoring field instructions.";
 
1214
                kDebug(30513) << "Ignoring field instructions!";
1152
1215
                break;
1153
1216
            }
1154
1217
        }
1157
1220
            KoXmlWriter* writer = m_fldWriter;
1158
1221
            switch (m_fieldType) {
1159
1222
            case PAGEREF:
1160
 
                //bookmark support not required
 
1223
                //no bookmark support
1161
1224
                m_fldResult.append(newText);
1162
1225
                break;
1163
1226
            case HYPERLINK:
1168
1231
                    writer->addTextNode(newText);
1169
1232
                }
1170
1233
                break;
 
1234
            case AUTHOR:
 
1235
            case EDITTIME:
 
1236
            case FILENAME:
1171
1237
            case MERGEFIELD:
1172
1238
            case SHAPE:
 
1239
            case TITLE:
1173
1240
                //Ignoring any nested fields around the result!
1174
1241
                kDebug(30513) << "Processing field result as common text string.";
1175
1242
                common_flag = true;