34#include <tqiodevice.h>
35#include <tqtextstream.h>
40#include <kfilterdev.h>
41#include <kgenericfactory.h>
44#include <KoPageLayout.h>
45#include <KoFilterChain.h>
46#include <KoPictureKey.h>
48#include <KWEFStructures.h>
50#include <KWEFBaseWorker.h>
51#include <KWEFKWordLeader.h>
53#include <abiwordexport.h>
54#include <abiwordexport.moc>
56class ABIWORDExportFactory : KGenericFactory<ABIWORDExport, KoFilter>
59 ABIWORDExportFactory(
void) : KGenericFactory<ABIWORDExport, KoFilter> (
"kwordabiwordexport")
62 virtual void setupTranslations(
void )
64 TDEGlobal::locale()->insertCatalogue(
"kofficefilters" );
68K_EXPORT_COMPONENT_FACTORY( libabiwordexport, ABIWORDExportFactory() )
70class StyleMap : public TQMap<TQString,
LayoutData>
81 virtual ~AbiWordWorker(
void) {
delete m_streamOut;
delete m_ioDevice; }
83 virtual bool doOpenFile(
const TQString& filenameOut,
const TQString& to);
84 virtual bool doCloseFile(
void);
85 virtual bool doOpenDocument(
void);
86 virtual bool doCloseDocument(
void);
87 virtual bool doFullParagraph(
const TQString& paraText,
const LayoutData& layout,
88 const ValueListFormatData& paraFormatDataList);
89 virtual bool doOpenTextFrameSet(
void);
90 virtual bool doCloseTextFrameSet(
void);
92 const double width,
const double height,
const int orientation);
94 const double bottom,
const double right);
102 virtual bool doFullDocumentInfo(
const KWEFDocumentInfo& docInfo);
104 void processParagraphData (
const TQString& paraText,
106 const ValueListFormatData& paraFormatDataList);
107 void processNormalText (
const TQString& paraText,
109 const FormatData& formatData);
110 void processVariable (
const TQString& paraText,
112 const FormatData& formatData);
113 void processAnchor (
const TQString& paraText,
115 const FormatData& formatData);
118 TQString layoutToCss(
const LayoutData& layoutOrigin,
119 const LayoutData& layout,
const bool force)
const;
120 TQString escapeAbiWordText(
const TQString& strText)
const;
124 void writePictureData(
const TQString& koStoreName,
const TQString& keyName);
125 TQString transformToTextDate(
const TQDateTime& dt);
127 TQIODevice* m_ioDevice;
128 TQTextStream* m_streamOut;
130 TQMap<TQString,KoPictureKey> m_mapPictureData;
132 double m_paperBorderTop,m_paperBorderLeft,m_paperBorderBottom,m_paperBorderRight;
133 bool m_inIgnoreWords;
134 KWEFDocumentInfo m_docInfo;
137AbiWordWorker::AbiWordWorker(
void) : m_ioDevice(NULL), m_streamOut(NULL),
138 m_paperBorderTop(0.0),m_paperBorderLeft(0.0),
139 m_paperBorderBottom(0.0),m_paperBorderRight(0.0)
143TQString AbiWordWorker::escapeAbiWordText(
const TQString& strText)
const
147 return KWEFUtil::EscapeSgmlText(NULL,strText,
true,
true);
150bool AbiWordWorker::doOpenFile(
const TQString& filenameOut,
const TQString& )
152 kdDebug(30506) <<
"Opening file: " << filenameOut
153 <<
" (in AbiWordWorker::doOpenFile)" << endl;
156 const int result=filenameOut.findRev(
'.');
159 strExt=filenameOut.mid(result);
162 TQString strMimeType;
164 if ((strExt==
".gz")||(strExt==
".GZ")
165 ||(strExt==
".zabw")||(strExt==
".ZABW"))
168 strMimeType=
"application/x-gzip";
170 else if ((strExt==
".bz2")||(strExt==
".BZ2")
171 ||(strExt==
".bzabw")||(strExt==
".BZABW"))
174 strMimeType=
"application/x-bzip2";
179 strMimeType=
"text/plain";
182 kdDebug(30506) <<
"Compression: " << strMimeType << endl;
184 m_ioDevice = KFilterDev::deviceForFile(filenameOut,strMimeType);
188 kdError(30506) <<
"No output file! Aborting!" << endl;
192 if ( !m_ioDevice->open (IO_WriteOnly) )
194 kdError(30506) <<
"Unable to open output file! Aborting!" << endl;
198 m_streamOut=
new TQTextStream(m_ioDevice);
201 m_streamOut->setEncoding( TQTextStream::UnicodeUTF8 );
205bool AbiWordWorker::doCloseFile(
void)
214bool AbiWordWorker::doOpenDocument(
void)
216 kdDebug(30506)<<
"AbiWordWorker::doOpenDocument" << endl;
221 *m_streamOut <<
"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
224 *m_streamOut <<
"<!DOCTYPE abiword PUBLIC \"-//ABISOURCE//DTD AWML 1.0 Strict//EN\"";
225 *m_streamOut <<
" \"http://www.abisource.com/awml.dtd\">\n";
228 *m_streamOut <<
"<abiword";
230 *m_streamOut <<
" xmlns=\"http://www.abisource.com/awml.dtd\"";
233 *m_streamOut <<
" xmlns:xlink=\"http://www.w3.org/1999/xlink\"";
237 *m_streamOut <<
" xml:space=\"preserve\" version=\"1.1.2\" template=\"false\" styles=\"unlocked\">\n";
240 *m_streamOut <<
"<!-- This file is an AbiWord document. -->\n";
243 *m_streamOut <<
"\n";
249void AbiWordWorker::writePictureData(
const TQString& koStoreName,
const TQString& keyName)
251 kdDebug(30506) <<
"AbiWordWorker::writeImageData" << endl;
255 TQString strExtension(koStoreName.lower());
256 const int result=koStoreName.findRev(
".");
259 strExtension=koStoreName.mid(result+1);
262 bool isImageLoaded=
false;
264 if (strExtension==
"png")
266 isImageLoaded=loadSubFile(koStoreName,image);
272 isImageLoaded=loadAndConvertToImage(koStoreName,strExtension,
"PNG",image);
277 *m_streamOut <<
"<d name=\"" << keyName <<
"\""
279 <<
" mime=\"image/png\">\n";
281 TQCString base64=KCodecs::base64Encode(image,
true);
283 *m_streamOut << base64 <<
"\n";
285 *m_streamOut <<
"</d>\n";
289 kdWarning(30506) <<
"Unable to load picture: " << koStoreName << endl;
293bool AbiWordWorker::doCloseDocument(
void)
298 if (m_kwordLeader && !m_mapPictureData.isEmpty())
300 *m_streamOut <<
"<data>\n";
302 TQMap<TQString,KoPictureKey>::ConstIterator it;
303 TQMap<TQString,KoPictureKey>::ConstIterator end(m_mapPictureData.end());
305 for (it=m_mapPictureData.begin(); it!=end; ++it)
308 writePictureData(it.key(),it.data().filename());
311 *m_streamOut <<
"</data>\n";
314 *m_streamOut <<
"</abiword>\n";
318bool AbiWordWorker::doOpenTextFrameSet(
void)
320 *m_streamOut <<
"<section props=\"";
321 *m_streamOut <<
"page-margin-top: ";
322 *m_streamOut << m_paperBorderTop;
323 *m_streamOut <<
"pt; ";
324 *m_streamOut <<
"page-margin-left: ";
325 *m_streamOut << m_paperBorderLeft;
326 *m_streamOut <<
"pt; ";
327 *m_streamOut <<
"page-margin-bottom: ";
328 *m_streamOut << m_paperBorderBottom;
329 *m_streamOut <<
"pt; ";
330 *m_streamOut <<
"page-margin-right: ";
331 *m_streamOut << m_paperBorderRight;
332 *m_streamOut <<
"pt";
333 *m_streamOut <<
"\">\n";
337bool AbiWordWorker::doCloseTextFrameSet(
void)
339 *m_streamOut <<
"</section>\n";
343bool AbiWordWorker::doOpenStyles(
void)
345 *m_streamOut <<
"<styles>\n";
349bool AbiWordWorker::doCloseStyles(
void)
351 *m_streamOut <<
"</styles>\n";
355TQString AbiWordWorker::textFormatToAbiProps(
const TextFormatting& formatOrigin,
362 TQString fontName = formatData.fontName;
363 if ( !fontName.isEmpty()
364 && (force || (formatOrigin.fontName!=formatData.fontName)))
366 strElement+=
"font-family: ";
367 strElement+= escapeAbiWordText(fontName);
371 if (force || (formatOrigin.italic!=formatData.italic))
374 strElement+=
"font-style: ";
375 if ( formatData.italic )
377 strElement+=
"italic";
381 strElement+=
"normal";
386 if (force || ((formatOrigin.weight>=75)!=(formatData.weight>=75)))
388 strElement+=
"font-weight: ";
389 if ( formatData.weight >= 75 )
395 strElement+=
"normal";
400 if (force || (formatOrigin.fontSize!=formatData.fontSize))
402 const int size=formatData.fontSize;
406 strElement+=
"font-size: ";
407 strElement+=TQString::number(size,10);
412 if (force || (formatOrigin.fgColor!=formatData.fgColor))
414 if ( formatData.fgColor.isValid() )
417 strElement+=
"color: ";
421 const int red=formatData.fgColor.red();
422 strElement += TQString::number((red&0xf0)>>4,16);
423 strElement += TQString::number(red&0x0f,16);
425 const int green=formatData.fgColor.green();
426 strElement += TQString::number((green&0xf0)>>4,16);
427 strElement += TQString::number(green&0x0f,16);
429 const int blue=formatData.fgColor.blue();
430 strElement += TQString::number((blue&0xf0)>>4,16);
431 strElement += TQString::number(blue&0x0f,16);
437 if (force || (formatOrigin.bgColor!=formatData.bgColor))
439 if ( formatData.bgColor.isValid() )
442 strElement+=
"bgcolor: ";
446 const int red=formatData.bgColor.red();
447 strElement += TQString::number((red&0xf0)>>4,16);
448 strElement += TQString::number(red&0x0f,16);
450 const int green=formatData.bgColor.green();
451 strElement += TQString::number((green&0xf0)>>4,16);
452 strElement += TQString::number(green&0x0f,16);
454 const int blue=formatData.bgColor.blue();
455 strElement += TQString::number((blue&0xf0)>>4,16);
456 strElement += TQString::number(blue&0x0f,16);
465 strElement+=
"text-decoration: ";
468 strElement+=
"underline";
472 strElement+=
"line-through";
484bool AbiWordWorker::makeTable(
const FrameAnchor& anchor)
487 *m_streamOut <<
"</p>\n";
488 *m_streamOut <<
"<table>\n";
491 TQValueList<TableCell>::ConstIterator itCell;
492 for (itCell=anchor.table.cellList.begin();
493 itCell!=anchor.table.cellList.end(); itCell++)
499 *m_streamOut <<
"<cell props=\"";
500 *m_streamOut <<
"left-attach:" << (*itCell).col <<
"; ";
501 *m_streamOut <<
"right-attach:" << (*itCell).col + 1 <<
"; ";
502 *m_streamOut <<
"top-attach:" << (*itCell).row <<
"; ";
503 *m_streamOut <<
"bot-attach:" << (*itCell).row + 1;
504 *m_streamOut <<
"\">\n";
506 if (!doFullAllParagraphs(*(*itCell).paraList))
511 *m_streamOut <<
"</cell>\n";
515 *m_streamOut <<
"</table>\n";
516 *m_streamOut <<
"<p>\n";
521bool AbiWordWorker::makePicture(
const FrameAnchor& anchor)
523 kdDebug(30506) <<
"New image/clipart: " << anchor.picture.koStoreName
524 <<
" , " << anchor.picture.key.toString() << endl;
526 const double height=anchor.frame.bottom - anchor.frame.top;
527 const double width =anchor.frame.right - anchor.frame.left;
531 *m_streamOut <<
"<image dataid=\"" << anchor.picture.key.filename() <<
"\"";
532 *m_streamOut <<
" props= \"height:" << height <<
"pt;width:" << width <<
"pt\"";
533 *m_streamOut <<
"/>";
536 m_mapPictureData[anchor.picture.koStoreName]=anchor.picture.key;
543 TQString abiprops=textFormatToAbiProps(formatLayout,format,
false);
546 const int result=abiprops.findRev(
";");
551 abiprops.remove(result,2);
554 if (!abiprops.isEmpty())
556 *m_streamOut <<
" props=\"" << abiprops <<
"\"";
560void AbiWordWorker::processNormalText (
const TQString ¶Text,
562 const FormatData& formatData)
565 TQString partialText=escapeAbiWordText(paraText.mid(formatData.pos,formatData.len));
569 while ((pos=partialText.find(TQChar(10)))>-1)
571 partialText.replace(pos,1,
"<br/>");
574 if (formatData.text.missing)
577 *m_streamOut << partialText;
581 *m_streamOut <<
"<c";
582 writeAbiProps(formatLayout,formatData.text);
583 *m_streamOut <<
">" << partialText <<
"</c>";
587void AbiWordWorker::processVariable (
const TQString&,
589 const FormatData& formatData)
591 if (0==formatData.variable.m_type)
594 *m_streamOut <<
"<field type=\"date_ntdfl\"";
595 writeAbiProps(formatLayout,formatData.text);
596 *m_streamOut <<
"/>";
598 else if (2==formatData.variable.m_type)
601 *m_streamOut <<
"<field type=\"time\"";
602 writeAbiProps(formatLayout,formatData.text);
603 *m_streamOut <<
"/>";
605 else if (4==formatData.variable.m_type)
608 TQString strFieldType;
609 if (formatData.variable.isPageNumber())
611 strFieldType=
"page_number";
613 else if (formatData.variable.isPageCount())
615 strFieldType=
"page_count";
617 if (strFieldType.isEmpty())
620 *m_streamOut << formatData.variable.m_text;
624 *m_streamOut <<
"<field type=\"" << strFieldType <<
"\"";
625 writeAbiProps(formatLayout,formatData.text);
626 *m_streamOut <<
"/>";
629 else if (9==formatData.variable.m_type)
632 *m_streamOut <<
"<a xlink:href=\""
633 << escapeAbiWordText(formatData.variable.getHrefName())
635 writeAbiProps(formatLayout,formatData.text);
637 << escapeAbiWordText(formatData.variable.getLinkName())
641 else if (11==(*paraFormatDataIt).variable.m_type)
644 TQString value = (*paraFormatDataIt).variable.getFootnoteValue();
645 bool automatic = (*paraFormatDataIt).variable.getFootnoteAuto();
646 TQValueList<ParaData> *paraList = (*paraFormatDataIt).variable.getFootnotePara();
650 TQValueList<ParaData>::ConstIterator it;
651 for (it=paraList->begin();it!=paraList->end();it++)
652 fstr += ProcessParagraphData( (*it).text, (*it).layout,(*it).formattingList);
654 str += automatic ?
"\\chftn " : value;
655 str +=
"{\\footnote ";
657 str += automatic ?
"\\chftn " : value;
668 *m_streamOut << formatData.variable.m_text;
672void AbiWordWorker::processAnchor (
const TQString&,
674 const FormatData& formatData)
677 if ( (2==formatData.frameAnchor.type)
678 || (5==formatData.frameAnchor.type) )
680 makePicture(formatData.frameAnchor);
682 else if (6==formatData.frameAnchor.type)
684 makeTable(formatData.frameAnchor);
688 kdWarning(30506) <<
"Unsupported anchor type: "
689 << formatData.frameAnchor.type << endl;
693void AbiWordWorker::processParagraphData (
const TQString ¶Text,
695 const ValueListFormatData ¶FormatDataList)
697 if ( paraText.length () > 0 )
699 ValueListFormatData::ConstIterator paraFormatDataIt;
701 for ( paraFormatDataIt = paraFormatDataList.begin ();
702 paraFormatDataIt != paraFormatDataList.end ();
705 if (1==(*paraFormatDataIt).id)
707 processNormalText(paraText, formatLayout, (*paraFormatDataIt));
709 else if (4==(*paraFormatDataIt).id)
711 processVariable(paraText, formatLayout, (*paraFormatDataIt));
713 else if (6==(*paraFormatDataIt).id)
715 processAnchor(paraText, formatLayout, (*paraFormatDataIt));
721TQString AbiWordWorker::layoutToCss(
const LayoutData& layoutOrigin,
722 const LayoutData& layout,
const bool force)
const
732 props +=
"text-align:";
739 props +=
"text-align:left; ";
743 kdWarning(30506) <<
"Unknown alignment: " << layout.
alignment << endl;
750 if (!layout.tabulator.isEmpty()
751 && (force || (layoutOrigin.tabulator!=layout.tabulator)))
753 props +=
"tabstops:";
754 props += layout.tabulator;
761 props +=
"tabstops:";
763 TabulatorList::ConstIterator it;
764 TabulatorList::ConstIterator end(layout.
tabulatorList.end());
775 props += TQString::number((*it).m_ptpos);
778 switch ((*it).m_type)
780 case 0: props +=
"/L";
break;
781 case 1: props +=
"/C";
break;
782 case 2: props +=
"/R";
break;
783 case 3: props +=
"/D";
break;
784 default: props +=
"/L";
795 props += TQString(
"margin-left:%1pt; ").arg(layout.
indentLeft);
801 props += TQString(
"margin-right:%1pt; ").arg(layout.
indentRight);
806 props +=
"text-indent: ";
814 props += TQString(
"margin-bottom:%1pt; ").arg(layout.
marginBottom);
820 props += TQString(
"margin-top:%1pt; ").arg(layout.
marginTop);
829 case LayoutData::LS_CUSTOM:
832 props +=
"line-height=:";
837 case LayoutData::LS_SINGLE:
839 props +=
"line-height:1.0; ";
842 case LayoutData::LS_ONEANDHALF:
844 props +=
"line-height:1.5; ";
847 case LayoutData::LS_DOUBLE:
849 props +=
"line-height:2.0; ";
852 case LayoutData::LS_MULTIPLE:
854 props +=
"line-height:";
859 case LayoutData::LS_FIXED:
862 props +=
"line-height:";
867 case LayoutData::LS_ATLEAST:
870 props +=
"line-height=:";
877 kdWarning(30506) <<
"Unsupported lineSpacingType: " << layout.
lineSpacingType <<
" (Ignoring!)" << endl;
884 props += textFormatToAbiProps(layoutOrigin.formatData.text,layout.formatData.text,force);
889bool AbiWordWorker::doFullParagraph(
const TQString& paraText,
const LayoutData& layout,
890 const ValueListFormatData& paraFormatDataList)
892 TQString style=layout.styleName;
894 const LayoutData& styleLayout=m_styleMap[style];
896 TQString props=layoutToCss(styleLayout,layout,
false);
898 *m_streamOut <<
"<p";
899 if (!style.isEmpty())
901 *m_streamOut <<
" style=\"" << EscapeXmlText(style,
true,
true) <<
"\"";
903 if (!props.isEmpty())
907 const int result=props.findRev(
";");
911 props.remove(result,2);
914 *m_streamOut <<
" props=\"" << props <<
"\"";
919 if (layout.pageBreakBefore)
922 *m_streamOut <<
"<pbr/>";
925 processParagraphData(paraText, layout.formatData.text, paraFormatDataList);
928 if (layout.pageBreakAfter)
931 *m_streamOut <<
"<pbr/>";
934 *m_streamOut <<
"</p>\n";
938bool AbiWordWorker::doFullDefineStyle(
LayoutData& layout)
941 m_styleMap[layout.styleName]=layout;
943 *m_streamOut <<
"<s";
946 *m_streamOut <<
" name=\"" << EscapeXmlText(layout.styleName,
true,
true) <<
"\"";
947 *m_streamOut <<
" followedby=\"" << EscapeXmlText(layout.styleFollowing,
true,
true) <<
"\"";
950 && (layout.counter.depth<10) )
952 *m_streamOut <<
" level=\"";
953 *m_streamOut << TQString::number(layout.counter.depth+1,10);
954 *m_streamOut <<
"\"";
957 TQString abiprops=layoutToCss(layout,layout,
true);
959 const int result=abiprops.findRev(
";");
963 abiprops.remove(result,2);
966 *m_streamOut <<
" props=\"" << abiprops <<
"\"";
968 *m_streamOut <<
"/>\n";
973bool AbiWordWorker::doFullPaperFormat(
const int format,
974 const double width,
const double height,
const int orientation)
976 TQString outputText =
"<pagesize ";
1000 TQString pagetype=KoPageFormat::formatString(KoFormat(format));
1001 outputText+=
"pagetype=\"";
1002 outputText+=pagetype;
1004 TQString strWidth, strHeight, strUnits;
1005 KWEFUtil::GetNativePaperFormat(format, strWidth, strHeight, strUnits);
1006 outputText+=
"\" width=\"";
1007 outputText+=strWidth;
1008 outputText+=
"\" height=\"";
1009 outputText+=strHeight;
1010 outputText+=
"\" units=\"";
1011 outputText+=strUnits;
1015 case PG_US_EXECUTIVE:
1019 outputText +=
"pagetype=\"Custom\" width=\"7.5\" height=\"10.0\" units=\"inch\" ";
1022 outputText +=
"pagetype=\"Letter\" width=\"8.5\" height=\"11.0\" units=\"inch\" ";
1037 if ((width<=1.0) || (height<=1.0) ||
true)
1040 outputText +=
"pagetype=\"A4\" width=\"21.0\" height=\"29.7\" units=\"cm\" ";
1044 outputText += TQString(
"pagetype=\"Custom\" width=\"%1\" height=\"%2\" units=\"inch\" ").arg(width/72.0).arg(height/72.0);
1050 outputText +=
"orientation=\"";
1053 outputText +=
"landscape";
1057 outputText +=
"portrait";
1059 outputText +=
"\" ";
1061 outputText +=
"page-scale=\"1.0\"/>\n";
1063 m_pagesize=outputText;
1067bool AbiWordWorker::doFullPaperBorders (
const double top,
const double left,
1068 const double bottom,
const double right)
1070 m_paperBorderTop=top;
1071 m_paperBorderLeft=left;
1072 m_paperBorderBottom=bottom;
1073 m_paperBorderRight=right;
1077bool AbiWordWorker::doCloseHead(
void)
1079 if (!m_pagesize.isEmpty())
1081 *m_streamOut << m_pagesize;
1086bool AbiWordWorker::doOpenSpellCheckIgnoreList (
void)
1088 kdDebug(30506) <<
"AbiWordWorker::doOpenSpellCheckIgnoreList" << endl;
1089 m_inIgnoreWords=
false;
1093bool AbiWordWorker::doCloseSpellCheckIgnoreList (
void)
1095 kdDebug(30506) <<
"AbiWordWorker::doCloseSpellCheckIgnoreList" << endl;
1096 if (m_inIgnoreWords)
1097 *m_streamOut <<
"</ignorewords>\n";
1101bool AbiWordWorker::doFullSpellCheckIgnoreWord (
const TQString& ignoreword)
1103 kdDebug(30506) <<
"AbiWordWorker::doFullSpellCheckIgnoreWord: " << ignoreword << endl;
1104 if (!m_inIgnoreWords)
1106 *m_streamOut <<
"<ignorewords>\n";
1107 m_inIgnoreWords=
true;
1109 *m_streamOut <<
" <iw>" << ignoreword <<
"</iw>\n";
1114TQString AbiWordWorker::transformToTextDate(
const TQDateTime& dt)
1120 const TQDate date(dt.date());
1122 const char* dayName[7] = {
"Mon",
"Tue",
"Wed",
"Thu",
"Fri",
"Sat",
"Sun" };
1123 const int dow = date.dayOfWeek() - 1;
1124 if ((dow<0) || (dow>6))
1127 result += dayName[dow];
1130 const char* monthName[12] = {
"Jan",
"Feb",
"Mar",
"Apr",
"May",
"Jun",
"Jul",
"Aug",
"Sep",
"Oct",
"Nov",
"Dec" };
1131 const int month = date.month() - 1;
1132 if ((month<0) || (month>11))
1135 result += monthName[month];
1141 temp += TQString::number(date.day(), 10);
1142 result += temp.right(2);
1145 const TQTime time(dt.time());
1148 temp += TQString::number(time.hour(), 10);
1149 result += temp.right(2);
1153 temp += TQString::number(time.minute(), 10);
1154 result += temp.right(2);
1158 temp += TQString::number(time.second(), 10);
1159 result += temp.right(2);
1163 temp += TQString::number(date.year(), 10);
1164 result += temp.right(4);
1171 return "Thu Jan 01 00:00:00 1970";
1175bool AbiWordWorker::doFullDocumentInfo(
const KWEFDocumentInfo& docInfo)
1179 *m_streamOut <<
"<metadata>\n";
1182 *m_streamOut <<
"<m key=\"dc.format\">application/x-abiword</m>\n";
1183 if (!m_docInfo.title.isEmpty())
1185 *m_streamOut <<
"<m key=\"dc.title\">" << escapeAbiWordText(m_docInfo.title) <<
"</m>\n";
1187 if (!m_docInfo.abstract.isEmpty())
1189 *m_streamOut <<
"<m key=\"dc.description\">" << escapeAbiWordText(m_docInfo.abstract) <<
"</m>\n";
1192 if ( !m_docInfo.keywords.isEmpty() )
1194 *m_streamOut <<
"<m key=\"abiword.keywords\">" << escapeAbiWordText(m_docInfo.keywords) <<
"</m>\n";
1196 if ( !m_docInfo.subject.isEmpty() )
1198 *m_streamOut <<
"<m key=\"dc.subject\">" << escapeAbiWordText(m_docInfo.subject) <<
"</m>\n";
1202 *m_streamOut <<
"<m key=\"abiword.generator\">KWord Export Filter";
1204 TQString strVersion(
"$Revision: 508787 $");
1207 *m_streamOut << strVersion.mid(10).remove(
'$');
1209 *m_streamOut <<
"</m>\n";
1211 TQDateTime now (TQDateTime::currentDateTime(TQt::UTC));
1212 *m_streamOut <<
"<m key=\"abiword.date_last_changed\">"
1213 << escapeAbiWordText(transformToTextDate(now))
1216 *m_streamOut <<
"</metadata>\n";
1224ABIWORDExport::ABIWORDExport(KoFilter *,
const char *,
const TQStringList &) :
1228KoFilter::ConversionStatus ABIWORDExport::convert(
const TQCString& from,
const TQCString& to )
1230 if ( to !=
"application/x-abiword" || from !=
"application/x-kword" )
1232 return KoFilter::NotImplemented;
1236 KImageIO::registerFormats();
1238 AbiWordWorker* worker=
new AbiWordWorker();
1242 kdError(30506) <<
"Cannot create Worker! Aborting!" << endl;
1243 return KoFilter::StupidError;
1246 KWEFKWordLeader* leader=
new KWEFKWordLeader(worker);
1250 kdError(30506) <<
"Cannot create Worker! Aborting!" << endl;
1252 return KoFilter::StupidError;
1255 KoFilter::ConversionStatus result=leader->convert(m_chain,from,to);
@ NUM_CHAPTER
Numbered as a heading.
This is basically <FRAMESET> tag.
Base worker of the libexport system.
virtual bool doCloseSpellCheckIgnoreList(void)
like AbiWord's </ignorewords> and Kwords </SPELLCHECKIGNORELIST>
virtual bool doFullPaperBorders(const double top, const double left, const double bottom, const double right)
Like KWord's <PAPERBORDERS>
virtual bool doOpenSpellCheckIgnoreList(void)
like AbiWord's <ignorewords> and KWord's <SPELLCHECKIGNORELIST>
virtual bool doFullPaperFormat(const int format, const double width, const double height, const int orientation)
Like AbiWord's <papersize>
virtual bool doFullDefineStyle(LayoutData &layout)
Defines a single style.
virtual bool doCloseHead(void)
Like HTML's </HEAD>
virtual bool doOpenStyles(void)
Like HTML's <style>
virtual bool doFullSpellCheckIgnoreWord(const TQString &ignoreword)
like AbiWord's <iw> and Kwords </SPELLCHECKIGNOREWORD>
virtual bool doCloseStyles(void)
Like HTML's </style>
double lineSpacing
Space between lines in pt, if lineSpacingType==0.
TabulatorList tabulatorList
List of tabulators.
double indentFirst
indentation correction of first line (can be negative!)
double indentRight
right indentation (a negative value means invalid)
double indentLeft
left indentation (a negative value means invalid)
TQString alignment
left, right, center, justify
int lineSpacingType
0=custom, 10=one line, 15=one and half lines, 20= 2 lines
double marginTop
space before the paragraph (a negative value means invalid)
double marginBottom
space after the paragraph (a negative value means invalid)
TextFormatting is a container for data retrieved from the <FORMAT> tag and its subtags to be used in ...
bool underline
Any underline? (If true, we do not know if simple or double or what else)
bool strikeout
true if strikeout