summaryrefslogtreecommitdiffstats
path: root/filters/kword/ascii/asciiimport.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'filters/kword/ascii/asciiimport.cpp')
-rw-r--r--filters/kword/ascii/asciiimport.cpp1035
1 files changed, 1035 insertions, 0 deletions
diff --git a/filters/kword/ascii/asciiimport.cpp b/filters/kword/ascii/asciiimport.cpp
new file mode 100644
index 000000000..b7c4c0f5e
--- /dev/null
+++ b/filters/kword/ascii/asciiimport.cpp
@@ -0,0 +1,1035 @@
+/* This file is part of the KDE project
+ Copyright (C) 1998, 1999 Reginald Stadlbauer <reggie@kde.org>
+ Copyright (C) 2000 Michael Johnson <mikej@xnet.com>
+ Copyright (C) 2001, 2002, 2004 Nicolas GOUTTE <goutte@kde.org>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+*/
+
+#include <config.h>
+
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+
+#include <tqobject.h>
+#include <tqstring.h>
+// #include <tqregexp.h> // Currently not needed (due to disabled code)
+#include <tqtextcodec.h>
+#include <tqfile.h>
+#include <tqtextstream.h>
+#include <tqdom.h>
+#include <tqfontinfo.h>
+
+#include <kdebug.h>
+#include <tdeglobal.h>
+#include <kgenericfactory.h>
+
+#include <KoGlobal.h>
+#include <KoPageLayout.h>
+#include <KoStore.h>
+#include <KoFilterChain.h>
+#include <KoFilterManager.h>
+
+#include <asciiimport.h>
+#include <asciiimport.moc>
+#include "ImportDialog.h"
+
+class ASCIIImportFactory : KGenericFactory<ASCIIImport, KoFilter>
+{
+public:
+ ASCIIImportFactory(void) : KGenericFactory<ASCIIImport, KoFilter> ("kwordasciiimport")
+ {}
+protected:
+ virtual void setupTranslations( void )
+ {
+ TDEGlobal::locale()->insertCatalogue( "kofficefilters" );
+ }
+};
+
+K_EXPORT_COMPONENT_FACTORY( libasciiimport, ASCIIImportFactory() )
+
+ASCIIImport::ASCIIImport(KoFilter *, const char *, const TQStringList &) :
+ KoFilter() {
+}
+
+void ASCIIImport::prepareDocument(TQDomDocument& mainDocument, TQDomElement& mainFramesetElement)
+{
+ // TODO: other paper formats
+ KoFormat paperFormat=PG_DIN_A4; // ISO A4
+ KoOrientation paperOrientation=PG_PORTRAIT;
+
+ mainDocument.appendChild(
+ mainDocument.createProcessingInstruction(
+ "xml","version=\"1.0\" encoding=\"UTF-8\""));
+
+ TQDomElement elementDoc;
+ elementDoc=mainDocument.createElement("DOC");
+ elementDoc.setAttribute("editor","KWord's Plain Text Import Filter");
+ elementDoc.setAttribute("mime","application/x-kword");
+ // TODO: We claim to be syntax version 2, but we should verify that it is also true.
+ elementDoc.setAttribute("syntaxVersion",2);
+ mainDocument.appendChild(elementDoc);
+
+ TQDomElement element;
+ element=mainDocument.createElement("ATTRIBUTES");
+ element.setAttribute("processing",0);
+ element.setAttribute("standardpage",1);
+ element.setAttribute("hasHeader",0);
+ element.setAttribute("hasFooter",0);
+ //element.setAttribute("unit","mm"); // use KWord default instead
+ elementDoc.appendChild(element);
+
+ TQDomElement elementPaper=mainDocument.createElement("PAPER");
+ elementPaper.setAttribute("format",paperFormat);
+ elementPaper.setAttribute("width" ,KoPageFormat::width (paperFormat,paperOrientation) * 72.0 / 25.4);
+ elementPaper.setAttribute("height",KoPageFormat::height(paperFormat,paperOrientation) * 72.0 / 25.4);
+ elementPaper.setAttribute("orientation",PG_PORTRAIT);
+ elementPaper.setAttribute("columns",1);
+ elementPaper.setAttribute("columnspacing",2);
+ elementPaper.setAttribute("hType",0);
+ elementPaper.setAttribute("fType",0);
+ elementPaper.setAttribute("spHeadBody",9);
+ elementPaper.setAttribute("spFootBody",9);
+ elementPaper.setAttribute("zoom",100);
+ elementDoc.appendChild(elementPaper);
+
+ element=mainDocument.createElement("PAPERBORDERS");
+ element.setAttribute("left",28);
+ element.setAttribute("top",42);
+ element.setAttribute("right",28);
+ element.setAttribute("bottom",42);
+ elementPaper.appendChild(element);
+
+ TQDomElement framesetsPluralElementOut=mainDocument.createElement("FRAMESETS");
+ mainDocument.documentElement().appendChild(framesetsPluralElementOut);
+
+ mainFramesetElement=mainDocument.createElement("FRAMESET");
+ mainFramesetElement.setAttribute("frameType",1);
+ mainFramesetElement.setAttribute("frameInfo",0);
+ mainFramesetElement.setAttribute("autoCreateNewFrame",1);
+ mainFramesetElement.setAttribute("removable",0);
+ // TODO: "name" attribute (needs I18N)
+ framesetsPluralElementOut.appendChild(mainFramesetElement);
+
+ TQDomElement frameElementOut=mainDocument.createElement("FRAME");
+ frameElementOut.setAttribute("left",28);
+ frameElementOut.setAttribute("top",42);
+ frameElementOut.setAttribute("bottom",566);
+ frameElementOut.setAttribute("right",798);
+ frameElementOut.setAttribute("runaround",1);
+ mainFramesetElement.appendChild(frameElementOut);
+
+ TQDomElement elementStylesPlural=mainDocument.createElement("STYLES");
+ elementDoc.appendChild(elementStylesPlural);
+
+ TQDomElement elementStyleStandard=mainDocument.createElement("STYLE");
+ elementStylesPlural.appendChild(elementStyleStandard);
+
+ element=mainDocument.createElement("NAME");
+ element.setAttribute("value","Standard");
+ elementStyleStandard.appendChild(element);
+
+ element=mainDocument.createElement("FOLLOWING");
+ element.setAttribute("name","Standard");
+ elementStyleStandard.appendChild(element);
+
+ TQDomElement elementFormat=mainDocument.createElement("FORMAT");
+ elementStyleStandard.appendChild(elementFormat);
+
+ // Use TQFontInfo, as it does not give back -1 as point size.
+ TQFontInfo defaultFontInfo(KoGlobal::defaultFont());
+
+ element=mainDocument.createElement("FONT");
+ element.setAttribute("name",defaultFontInfo.family());
+ elementFormat.appendChild(element);
+
+ element=mainDocument.createElement("SIZE");
+ element.setAttribute("value",defaultFontInfo.pointSize());
+ elementFormat.appendChild(element);
+
+ element=mainDocument.createElement("ITALIC");
+ element.setAttribute("value",0);
+ elementFormat.appendChild(element);
+
+ element=mainDocument.createElement("WEIGHT");
+ element.setAttribute("value",50);
+ elementFormat.appendChild(element);
+
+ element=mainDocument.createElement("UNDERLINE");
+ element.setAttribute("value",0);
+ elementFormat.appendChild(element);
+
+ element=mainDocument.createElement("STRIKEOUT");
+ element.setAttribute("value",0);
+ elementFormat.appendChild(element);
+
+ element=mainDocument.createElement("VERTALIGN");
+ element.setAttribute("value",0);
+ elementFormat.appendChild(element);
+
+ element=mainDocument.createElement("COLOR");
+ element.setAttribute("red", -1);
+ element.setAttribute("green",1);
+ element.setAttribute("blue", -1);
+ elementFormat.appendChild(element);
+
+ element=mainDocument.createElement("TEXTBACKGROUNDCOLOR");
+ element.setAttribute("red", -1);
+ element.setAttribute("green",-1);
+ element.setAttribute("blue", -1);
+ elementFormat.appendChild(element);
+
+}
+
+KoFilter::ConversionStatus ASCIIImport::convert( const TQCString& from, const TQCString& to )
+{
+ if (to!="application/x-kword" || from!="text/plain")
+ return KoFilter::NotImplemented;
+
+ AsciiImportDialog* dialog = 0;
+ if (!m_chain->manager()->getBatchMode())
+ {
+ dialog = new AsciiImportDialog();
+ if (!dialog)
+ {
+ kdError(30502) << "Dialog has not been created! Aborting!" << endl;
+ return KoFilter::StupidError;
+ }
+ if (!dialog->exec())
+ {
+ kdDebug(30502) << "Dialog was aborted! Aborting filter!" << endl; // this isn't an error!
+ return KoFilter::UserCancelled;
+ }
+ }
+
+ TQTextCodec* codec;
+ int paragraphStrategy;
+ if (dialog)
+ {
+ codec = dialog->getCodec();
+ paragraphStrategy=dialog->getParagraphStrategy();
+ delete dialog;
+ }
+ else
+ {
+ codec = TQTextCodec::codecForName("UTF-8");
+ paragraphStrategy=0;
+ }
+
+ TQFile in(m_chain->inputFile());
+ if(!in.open(IO_ReadOnly)) {
+ kdError(30502) << "Unable to open input file!" << endl;
+ in.close();
+ return KoFilter::FileNotFound;
+ }
+
+ TQString tbl; // string for table XML
+
+ TQDomDocument mainDocument;
+ TQDomElement mainFramesetElement;
+
+ prepareDocument(mainDocument,mainFramesetElement);
+
+ TQTextStream stream(&in);
+
+ if (!codec)
+ {
+ kdError(30502) << "Could not create TQTextCodec! Aborting" << endl;
+ in.close();
+ return KoFilter::StupidError;
+ }
+
+ kdDebug(30502) << "Charset used: " << codec->name() << endl;
+
+ stream.setCodec(codec);
+
+ if (1==paragraphStrategy)
+ sentenceConvert(stream, mainDocument, mainFramesetElement);
+ else if (999==paragraphStrategy)
+ oldWayConvert(stream, mainDocument, mainFramesetElement);
+ else
+ asIsConvert(stream, mainDocument, mainFramesetElement);
+
+
+#if 0
+ kdDebug(30502) << mainDocument.toString() << endl;
+#endif
+
+ KoStoreDevice* out=m_chain->storageFile( "root", KoStore::Write );
+ if(!out) {
+ kdError(30502) << "Unable to open output file!" << endl;
+ in.close();
+ return KoFilter::StorageCreationError;
+ }
+ TQCString cstr=mainDocument.toCString();
+ // WARNING: we cannot use KoStore::write(const TQByteArray&) because it gives an extra NULL character at the end.
+ out->writeBlock(cstr,cstr.length());
+ in.close();
+ return KoFilter::OK;
+}
+
+void ASCIIImport::oldWayConvert(TQTextStream& stream, TQDomDocument& mainDocument,
+ TQDomElement& mainFramesetElement)
+{
+ kdDebug(30502) << "Entering: ASCIIImport::oldWayConvert" << endl;
+ TQStringList paragraph; // lines of the paragraph
+ int linecount = 0; // line counter used to position tables
+ //int table_no = 0; // used for table identifiers
+ int numLines; // Number of lines of the paragraph
+
+ bool lastCharWasCr=false; // Was the previous character a Carriage Return?
+ TQString strLine;
+ while(!stream.atEnd())
+ {
+ paragraph.clear();
+ // Read in paragraph
+ for(int line_no = numLines = 0; line_no < MAXLINES; line_no++, numLines++)
+ {
+ // We need to read a line
+ // NOTE: we cannot use TQStreamText::readLine,
+ // as it does not know anything about Carriage Returns
+ strLine=readLine(stream,lastCharWasCr);
+ if (strLine.isEmpty())
+ {
+ paragraph.append(TQString());
+ break;
+ }
+
+ const int length = strLine.length();
+ if (strLine.at(length-1) == '-')
+ // replace the hard hyphen - at line end by a soft hyphen
+ strLine.at(length-1)=TQChar(173);
+ else
+ strLine += ' '; // add space to end of line
+
+ paragraph.append(strLine);
+ } // for(line_no = 0;
+
+ // process tables
+#if 0
+ if ( Table( &Line[0], &linecount, numLines, table_no, tbl, str))
+ table_no++;
+ else
+#else
+ if (true)
+#endif
+ {
+ // Process bullet and dash lists
+#if 0
+ if(ListItem( &Line[0], numLines, str))
+ linecount += (numLines + 1);
+ else
+ {
+#else
+ if (true)
+ {
+#endif
+ processParagraph(mainDocument,mainFramesetElement,paragraph);
+ linecount += ( numLines + 1); // increment the line count
+ } // else
+ } // else
+ } // while(!eof)
+
+#if 0
+ // Add table info
+ if( table_no > 0) str += tbl;
+#endif
+}
+
+void ASCIIImport::asIsConvert(TQTextStream& stream, TQDomDocument& mainDocument,
+ TQDomElement& mainFramesetElement)
+// Paragraph strategy: one line, one paragraph
+{
+ kdDebug(30502) << "Entering: ASCIIImport::asIsConvert" << endl;
+ bool lastCharWasCr=false; // Was the previous character a Carriage Return?
+ TQString strLine;
+ while(!stream.atEnd())
+ {
+ // Read one line and consider it being a paragraph
+ strLine=readLine(stream,lastCharWasCr);
+ writeOutParagraph(mainDocument,mainFramesetElement, "Standard", strLine,
+ 0, 0);
+ }
+}
+
+void ASCIIImport::sentenceConvert(TQTextStream& stream, TQDomDocument& mainDocument,
+ TQDomElement& mainFramesetElement)
+// Strategy:
+// - end a paragraph when a line ends with a point or similar punctuation.
+// - search the punctuation at the end of the line, even if the sentence is quoted or in parentheses.
+// - an empty line also ends the paragraph
+// TODO/FIXME: we have a little problem with empty lines. Perhaps we should not allow empty paragraphs!
+{
+ kdDebug(30502) << "Entering: ASCIIImport::sentenceConvert" << endl;
+ TQStringList paragraph; // lines of the paragraph
+ bool lastCharWasCr=false; // Was the previous character a Carriage Return?
+ TQString strLine;
+ TQString stoppingPunctuation(".!?");
+ TQString skippingQuotes("\"')");
+ while (!stream.atEnd())
+ {
+ paragraph.clear();
+ for(;;)
+ {
+ // We need to read a line
+ // NOTE: we cannot use TQStreamText::readLine,
+ // as it does not know anything about Carriage Returns
+ strLine=readLine(stream,lastCharWasCr);
+ if (strLine.isEmpty())
+ {
+ break;
+ }
+
+ paragraph.append(strLine);
+
+ uint lastPos=strLine.length()-1;
+ TQChar lastChar;
+ // Skip a maximum of 10 quotes (or similar) at the end of the line
+ for (int i=0;i<10;i++)
+ {
+ lastChar=strLine[lastPos];
+ if (lastChar.isNull())
+ break;
+ else if (skippingQuotes.find(lastChar)==-1)
+ break;
+ else
+ lastPos--;
+ }
+
+ lastChar=strLine[lastPos];
+ if (lastChar.isNull())
+ continue;
+ else if (stoppingPunctuation.find(lastChar)!=-1)
+ break;
+ }
+#if 1
+ writeOutParagraph(mainDocument,mainFramesetElement, "Standard",
+ paragraph.join(" ").simplifyWhiteSpace(), 0, 0);
+#else
+ // FIXME/TODO: why is this not working?
+ //processParagraph(mainDocument,mainFramesetElement,paragraph);
+#endif
+ } // while(!eof)
+}
+
+void ASCIIImport::processParagraph(TQDomDocument& mainDocument,
+ TQDomElement& mainFramesetElement, const TQStringList& paragraph)
+{
+ // Paragraph with no tables or lists
+ TQString text;
+ TQStringList::ConstIterator it=paragraph.begin(); // Current line (at start, the first one)
+ TQStringList::ConstIterator previousLine=it; // The previous one (at start, also the first one)
+ int firstindent=Indent(*it);
+
+ // We work with one line in advance (therefore the two it++)
+ for( it++; it!=paragraph.end(); it++)
+ {
+ text += *previousLine; // add previous line to paragraph
+ // check for a short line - if short make it a paragraph
+ if( (*previousLine).length() <= shortline)
+ {
+ if((*it).length() > shortline)
+ // skip if short last line of normal paragraph
+ {
+ const int secondindent = Indent(*previousLine);
+ writeOutParagraph(mainDocument,mainFramesetElement,
+ "Standard", text.simplifyWhiteSpace(), firstindent, secondindent);
+
+ firstindent = Indent(*it);
+ text = TQString(); // reinitialize paragraph text
+ }
+ }
+ previousLine=it;
+ }
+ // write out paragraph begin to end
+ const int secondindent = Indent(*previousLine);
+ writeOutParagraph(mainDocument,mainFramesetElement,
+ "Standard", text.simplifyWhiteSpace(), firstindent, secondindent);
+}
+
+void ASCIIImport::writeOutParagraph(TQDomDocument& mainDocument,
+ TQDomElement& mainFramesetElement, const TQString& name,
+ const TQString& text, const int firstindent, const int secondindent)
+{
+ TQDomElement paragraphElementOut=mainDocument.createElement("PARAGRAPH");
+ mainFramesetElement.appendChild(paragraphElementOut);
+ TQDomElement textElement=mainDocument.createElement("TEXT");
+ paragraphElementOut.appendChild(textElement);
+ //TQDomElement formatsPluralElementOut=mainDocument.createElement("FORMATS");
+ //paragraphElementOut.appendChild(formatsPluralElementOut);
+ TQDomElement layoutElement=mainDocument.createElement("LAYOUT");
+ paragraphElementOut.appendChild(layoutElement);
+
+ TQDomElement element;
+ element=mainDocument.createElement("NAME");
+ element.setAttribute("value",name);
+ layoutElement.appendChild(element);
+
+ double size;
+ element=mainDocument.createElement("INDENTS");
+ size = firstindent-secondindent;
+ size *= ptsperchar; // convert indent spaces to points
+ element.setAttribute("first",TQString::number(size));
+ size = secondindent;
+ size *= ptsperchar; // convert indent spaces to points
+ element.setAttribute("left",TQString::number(size));
+ element.setAttribute("right",0);
+
+ textElement.appendChild(mainDocument.createTextNode(text));
+ textElement.normalize(); // Put text together (not sure if needed)
+
+#if 0
+ // If the paragraph is indented, write out indentation elements.
+ // TODO: why not always write identation?
+ if (firstindent > 0 || secondindent > 0) \
+ WriteOutIndents( firstindent, secondindent, str);
+
+ // If this is a bullet or a dash list, write out a COUNTER element
+ if(type.isEmpty())
+ {
+ str += "<COUNTER type=\"";
+ str += type; // "6" = bullet "7" = dash
+ str += "\" depth=\"0\" start=\"1\" numberingtype=\"0\" lefttext=\"\" righttext=\".\" />\n";
+ }
+
+ str += "<FORMAT>\n";
+ // for now we try with style (TODO: verify that KWord 1.2 works correctly)
+ //str += "<FONT name=\"times\"/>\n";
+ str += "</FORMAT>\n";
+ str += "</LAYOUT>\n";
+ str += "</PARAGRAPH>\n";
+#endif
+} // WriteOutParagraph
+
+ /* The Indent method determines the equivalent number of spaces
+ at the beginning of a line */
+
+int ASCIIImport::Indent(const TQString& line) const
+{
+
+ TQChar c; // for reading string a character at a time
+ int count=0; // amount of white space at the begining of the line
+
+ for( uint i = 0; i < line.length(); i++ )
+ {
+ c = line.at(i);
+ if( c == TQChar(' '))
+ count++;
+ else if( c == TQChar('\t'))
+ count += spacespertab;
+ else
+ break;
+ }
+
+ return count;
+
+} // Indent
+
+ /* The WriteOutTableCell method writes out a single table cell
+ in Kword XML to the output string str. The table is sized according
+ to the spacing in the ascii document.
+ Arguments
+ int table_no - used to keep the group number count
+ int row - row number
+ int col - column number
+ Position *pos - pointer to the table position
+ TQString str - the output string.
+
+ Returns - void
+ */
+
+#if 0
+ void ASCIIImport::WriteOutTableCell( int table_no, int row,
+ int col, Position *pos, TQString &str)
+ {
+
+ str += "<FRAMESET frameType=\"1\" frameInfo=\"0\" grpMgr=\"grpmgr_";
+
+ TQString buf = TQString::number(table_no); // convert int to string
+ str += buf;
+
+ str += "\" row=\"";
+ buf = TQString::number(row); // convert row to string
+ str += buf;
+
+ str += "\" col=\"";
+ buf = TQString::number(col); // convert col to string
+ str += buf;
+
+ str += "\" rows=\"1\" cols=\"1\" removable=\"0\" visible=\"1\" name=\"Cell ";
+ buf = TQString::number(row); // convert row to string
+ str += buf;
+ str += ",";
+ buf = TQString::number(col); // convert col to string
+ str += buf;
+
+ str += "\">\n";
+
+ str += "<FRAME left=\"";
+ buf = TQString::number(pos->left); // convert left coordinate to string
+ str += buf;
+
+ str += "\" top=\"";
+ buf = TQString::number(pos->top); // convert top coordinate to string
+ str += buf;
+
+ str += "\" right=\"";
+ buf = TQString::number(pos->right); // convert right coordinate to string
+ str += buf;
+
+ str += "\" bottom=\"";
+ buf = TQString::number(pos->bottom); // convert bottom coordinate to string
+ str += buf;
+
+ str += "\" runaround=\"0\" autoCreateNewFrame=\"0\" newFrameBehavior=\"1\" />\n";
+
+ return;
+
+ } // WriteOutTableCell
+
+
+
+
+bool ASCIIImport::Table( TQString *Line, int *linecount, int no_lines,
+ int table_no, TQString &tbl, TQString &str )
+{
+ return false; // this method is disabled
+
+ /* This method examines a paragraph for embedded tables.
+ If none are found, it returns. If tables are found then it
+ writes out the paragraph including the tables. It does not
+ check for embedded bullet or dash lists which is a seperate
+ method.
+ Arguments
+ TQString *Line - pointer to the array of text lines in the paragraph.
+ int *linecount - pointer to the line counter used to position tables
+ int no_lines - the number of lines in the paragraph
+ int *table_no - pointer to the table number counter
+ TQString str - the output string
+ Returns - enum value indicating wheterer a table was processed. */
+
+ enum LiType{paragraph, table} linetype[MAXLINES];
+ struct Tabs tabs[MAXLINES]; // array of structures for tables
+ struct Position pos; // struct to pass cell position
+ int width[MAXCOLUMNS]; // array of column widths
+ TQString *currentline; // pointer to the current line
+ TQString *beginline; // pointer to the beginning line
+ TQString text; // text buffer
+ TQString text1; // another text buffer
+ TQString No_indents; // Line with leading white space removed
+ int index, index1, index2, index3; // used to define column positions in a line
+
+ int no_cols; // column counter
+ int firstindent;
+ int secondindent;
+ int i; // counter
+ int j; // counter
+ int k; // counter
+ TQString *firstline;
+ firstline = Line;
+ int begin = 0; // beginning line number
+ int tabcount = 0; // counts tab characters
+
+ // check all lines for tabs
+ for(i = 0; i < no_lines; i++)
+ {
+ no_cols = 0; // inilialize the number of columns
+ index = 0; // initialize the line index
+
+ // check the line for leading tabs and indentation
+ if( (tabs[i].indent = Indent( *Line)) > 0)
+ {
+ // save and remove tabs at beginning of the line
+ text = *Line; // copy
+ Line->remove(TQRegExp("^[\\ \t]*"));
+ }
+
+ // find column positions and record text fields
+ while((index2 = Line->find( TQRegExp("\t"),index)) > index
+ || (index3 = MultSpaces( *Line, index)) > index )
+ {
+ index1 = kMax(index2, index3);
+ if( index2 > index3)
+ index1 = Line->find( TQRegExp("[^\t]"), index1);
+ tabcount++;
+ tabs[i].field[no_cols] = Line->mid(index, (index1 - index -1));
+ tabs[i].width[no_cols] = index1 - index + spacespertab - 1;
+
+ no_cols++;
+ index = index1;
+ } // while( (index1 = ...
+
+ // record last column
+ if( no_cols > 0)
+ {
+ index1 = Line->length() - (index + 1); // +1 for space at line end
+ tabs[i].field[no_cols] = Line->mid(index,index1);
+ tabs[i].width[no_cols] = index1;
+ }
+
+ if(tabs[i].indent > 0) *Line = text; // restore original line
+ Line++; // increment the line pointer
+ tabs[i].columns = no_cols;
+ } // for(i = 0; ...
+ // All lines of the paragraph have been checked for tabs
+
+ // check for a tab in at least one line
+ if( tabcount == 0) return false;
+ tabcount = 0;
+
+ Line = firstline; // reset the line pointer
+
+ for(j = 0; j < MAXCOLUMNS; j++) width[j] = 0;
+ for( i = 0; i <= no_lines; i++)
+ {
+ if(tabs[i].columns == 0 ) // indicates no tabs in line
+ {
+ text += *Line; // add line of text to the paragraph
+ linetype[i] = paragraph;
+ }
+
+ else // this means a tabulated line
+ {
+ linetype[i] = table;
+
+ // calculate the column widths
+ for(j = 0; j <= tabs[i].columns; j++)
+ width[j] = kMax(tabs[i].width[j], width[j] );
+ } // else
+
+ if(i > 0)
+ {
+ if( linetype[i] != linetype[(i - 1)] || i == no_lines) // change of type
+ {
+ if( linetype[(begin)] == paragraph ) // write out a paragraph
+ {
+ text = ""; // initialize a null string for paragraph text
+ currentline = firstline;
+ currentline += begin; //starting line
+ beginline = currentline;
+ firstindent = Indent(*currentline);
+ currentline += 1; // second line
+ if( (i - begin) > 1)
+ secondindent = Indent( *currentline );
+ else secondindent = 0;
+
+ for( j= begin; j < i; j++)
+ {
+ text += *beginline; // form text entry
+ beginline++; // increment pointer
+ }
+ // process the white space to eliminate unwanted spaces
+ TQString text1 = text.simplifyWhiteSpace();
+ WriteOutParagraph( "Standard", "", text1 , firstindent, secondindent, str);
+ *linecount += (i - begin);
+
+ } // if( linetype[(i - 1)]
+
+ else // this implies a table
+ {
+ // Write out a blank line to align text and table
+ WriteOutParagraph( "Standard", "", "" , 0, 0, str);
+ for( j = begin; j < i; j++ )
+ {
+ int row = j - begin;
+ pos.top = (double)((*linecount) + 1) * ptsperline;
+ pos.bottom = pos.top + ptsperline;
+ // initialize position of first col
+ pos.left = leftmargin + (double)tabs[i].indent * ptsperchar;
+
+ // write out a cell for each column
+ for( k = 0; k <= tabs[j].columns; k++)
+ {
+
+ text = tabs[j].field[k];
+ // process the white space to eliminate unwanted spaces
+ text1 = text.simplifyWhiteSpace();
+
+ // calculate position of table cell
+ pos.right = pos.left + (double)width[k] * ptsperchar;
+
+ WriteOutTableCell( table_no, row, k, &pos, tbl);
+ WriteOutParagraph( "Standard", "", text1 , 0, 0, tbl);
+ tbl += "</FRAMESET>\n";
+ pos.left += ptsperchar * (double)width[k];
+ } // for( k = 0; ...
+ (*linecount) += 1;
+ } // for( j = begin; ...
+
+
+ } // else...
+ begin = i;
+ } // if( linetype[i]...
+
+ } // if(i > 0)
+ Line++;
+ } // for( i = 0; ...
+
+ (*linecount) += 1;
+
+ return true;
+ } // end of Table()
+#endif
+
+ // the following method finds the location of multiple spaces in a string
+int ASCIIImport::MultSpaces(const TQString& text, const int index) const
+{
+
+ TQChar c;
+ TQChar lastchar = 'c'; // previous character - initialize non blank
+ bool found = false;
+ // kdDebug(30502) << "length = " << text.length() << endl;
+ for (uint i = index; i < text.length(); i++)
+ {
+ c = text.at(i);
+ // kdDebug(30502) << "i = " << i << " found = " << found << " c = " << c << " lastchar = " << lastchar << endl;
+ if ( (c != ' ') && found)
+ return i;
+ else if (c == ' ' && lastchar == ' ')
+ found = true;
+ lastchar = c;
+ }
+ return -1;
+} // MultSpaces
+
+#if 0
+ bool ASCIIImport::ListItem( TQString *Line, int no_lines,
+ TQString &str )
+ {
+
+ /* This method examines a paragraph for embedded lists.
+ If none are found, it returns. If lists are found then it
+ writes out the paragraph including the lists.
+ Arguments
+ TQString *Line - pointer to the array of text lines in the paragraph.
+ int *linecount - pointer to the line counter used to position tables
+ int no_lines - the number of lines in the paragraph
+ TQString &str - the output string
+ Returns - bool value indicating whether a list item was processed. */
+
+
+ TQString *currentline; // pointer to the current line
+ enum Listtype{none, bullet, dash} listtype[MAXLINES];
+ TQString type; // type of list - bullet or dash
+ TQString *firstline;
+ int i; // counter
+ int firstindent;
+ int secondindent;
+ int begin = 0; // beginning line number
+ int listcount = 0; // counts lines with list items
+ firstline = Line;
+
+ // check all lines for list item indicators - or *
+ for(i = 0; i < no_lines; i++)
+ {
+ listtype[i] = none; // initialize
+
+ // check for a bullet list item
+ if( IsListItem( *Line, TQChar('*')))
+ {
+ listtype[i] = bullet;
+ listcount++;
+ }
+ // check for a dash list item
+ if( IsListItem( *Line, TQChar('-')))
+ {
+ listtype[i] = dash;
+ listcount++;
+ }
+
+ Line++; // increment the line pointer
+ } // for(i = 0; ...
+ // All lines of the paragraph have been checked for list items
+
+ // check for at least one list
+ if( listcount == 0) return false;
+
+ TQString text = ""; // initialize a null string for paragraph text
+ Line = firstline; // reset the line pointer
+
+ for( i = 0; i < no_lines; i++)
+ {
+
+ if(i > 0)
+ {
+ if( listtype[i] != none || Line->isEmpty()) // new list item
+ {
+ if( listtype[begin] == bullet) // write out a bullet list
+ {
+ type = "6";
+ // delete * at beginning of line
+ text.remove( TQRegExp("^[ \t]*\\* ") );
+ }
+ else if( listtype[begin] == dash) // write out a dash list
+ {
+ type = "7";
+ // delete - at beginning of line
+ text.remove( TQRegExp("^[ \t]*\\- ") );
+ }
+ else if( listtype[begin] == none) // write out a paragraph
+ type = "";
+
+ currentline = firstline;
+ currentline += begin; //starting line
+ firstindent = Indent(*currentline);
+ if( (i - begin) > 1)
+ {
+ currentline += 1; // second line
+ secondindent = Indent( *currentline );
+ }
+ else secondindent = 0;
+
+ // process the white space to eliminate unwanted spaces
+ TQString text1 = text.simplifyWhiteSpace();
+ WriteOutParagraph( "Standard", type, text1 , firstindent, secondindent, str);
+
+ begin = i;
+ text = ""; // reset text
+
+
+ } // if( listtype[i] != none
+
+
+ } // if(i > 0)
+
+ text += *Line; // add text to paragraph
+ Line++;
+
+ } // for( i = 0; ...
+
+ // write out the last paragraph
+ if( listtype[begin] == bullet) // write out a bullet list
+ {
+ type = "6";
+ // delete * at beginning of line
+ text.replace( TQRegExp("^[ \t]*\\* "), "");
+ }
+ else if( listtype[begin] == dash) // write out a dash list
+ {
+ type = "7";
+ // delete - at beginning of line
+ text.replace( TQRegExp("^[ \t]*\\- "), "");
+ }
+ else if( listtype[begin] == none) // write out a paragraph
+ type = "";
+
+ currentline = firstline;
+ currentline += begin; //starting line
+ firstindent = Indent(*currentline);
+ if( (i - begin) > 1)
+ {
+ currentline += 1; // second line
+ secondindent = Indent( *currentline );
+ }
+ else secondindent = 0;
+
+ // process the white space to eliminate unwanted spaces
+ TQString text1 = text.simplifyWhiteSpace();
+ WriteOutParagraph( "Standard", type, text1 , firstindent, secondindent, str);
+
+
+
+ return true;
+ } // end of ListItem()
+#endif
+
+/* The IsListItem method checks a paragraph's first line and determines if
+ the text appears to be a list item (bullet or dash).
+
+ Arguments
+ TQString FirstLine the first line of text in a paragraph
+ TQChar mark the mark - or * that indicates a list item
+
+ Return
+ true if the line appears as a list item, false if not. */
+
+bool ASCIIImport::IsListItem( TQString FirstLine, TQChar mark )
+ {
+
+ int i; // counter
+ TQChar c; // to stream into one character at a time
+
+
+
+ int k = FirstLine.find(mark);
+
+ if( k < 0) return false; // list item mark not on line
+
+ // find first non white character on the line
+ for( i=0; IsWhiteSpace( c = FirstLine.at((uint)i) ); i++);
+
+ if(i != k ) return false; // mark is in wrong position
+
+ c = FirstLine.at((uint)++i);
+
+ return IsWhiteSpace(c); // character after the mark must be a white space
+
+ } // IsListItem
+
+
+bool ASCIIImport::IsWhiteSpace(const TQChar& c) const
+{
+ if ( c == TQChar(' ') || c == TQChar('\t') )
+ return true;
+ else
+ return false;
+} // IsWhiteSpace
+
+TQString ASCIIImport::readLine(TQTextStream& textstream, bool& lastCharWasCr)
+{
+ // We need to read a line, character by character
+ // NOTE: we cannot use TQStreamText::readLine,
+ // as it does not know anything about Carriage Returns
+ TQString strLine;
+ TQChar ch;
+ while (!textstream.atEnd())
+ {
+ textstream >> ch; // Read one character
+ if (ch=="\n")
+ {
+ if (lastCharWasCr)
+ {
+ // We have a line feed following a Carriage Return
+ // As the Carriage Return has already ended the previous line,
+ // discard this Line Feed.
+ lastCharWasCr=false;
+ }
+ else
+ {
+ // We have a normal Line Feed, therefore we end the line
+ break;
+ }
+ }
+ else if (ch=="\r")
+ {
+ // We have a Carriage Return, therefore we end the line
+ lastCharWasCr=true;
+ break;
+ }
+ else if (ch==char(12)) // Form Feed
+ {
+ // Ignore the form feed
+ continue;
+ }
+ else
+ {
+ strLine+=ch;
+ lastCharWasCr=false;
+ }
+ } // while
+ return strLine;
+}