26#include <hancomwordimport.h>
27#include <hancomwordimport.moc>
33#include <tqstringlist.h>
34#include <tqtextstream.h>
37#include <KoFilterChain.h>
40#include <kgenericfactory.h>
42#include <KoXmlWriter.h>
47typedef KGenericFactory<HancomWordImport, KoFilter> HancomWordImportFactory;
48K_EXPORT_COMPONENT_FACTORY( libhancomwordimport, HancomWordImportFactory(
"kofficefilters" ) )
50class HancomWordImport::Private
56 TQStringList paragraphs;
58 TQByteArray createStyles();
59 TQByteArray createContent();
60 TQByteArray createManifest();
63HancomWordImport::HancomWordImport ( TQObject*,
const char*,
const TQStringList& )
69HancomWordImport::~HancomWordImport()
77static inline unsigned long readU16(
const void* p )
79 const unsigned char* ptr = (
const unsigned char*) p;
80 return ptr[0]+(ptr[1]<<8);
85KoFilter::ConversionStatus HancomWordImport::convert(
const TQCString& from,
const TQCString& to )
87 if ( from !=
"application/x-hancomword" )
88 return KoFilter::NotImplemented;
90 if ( to !=
"application/vnd.oasis.opendocument.text" )
91 return KoFilter::NotImplemented;
93 d->inputFile = m_chain->inputFile();
94 d->outputFile = m_chain->outputFile();
95 d->paragraphs.clear();
97 POLE::Storage storage( d->inputFile.latin1() );
99 return KoFilter::WrongFormat;
101 POLE::Stream* stream;
102 stream =
new POLE::Stream( &storage,
"/PrvText" );
103 if( stream->fail() || (stream->size() == 0) )
106 return KoFilter::WrongFormat;
109 int len = stream->size() / 2;
111 plaindoc.reserve( len );
113 unsigned char* buf =
new unsigned char [stream->size()];
114 stream->read( buf, stream->size());
115 for(
int i = 0; i < len; i++ )
116 plaindoc.append( TQChar((
int)readU16(buf + i*2) ) );
121 d->paragraphs = TQStringList::split(
"\n", plaindoc,
true );
125 storeout = KoStore::createStore( d->outputFile, KoStore::Write,
126 "application/vnd.oasis.opendocument.text", KoStore::Zip );
130 kdWarning() <<
"Couldn't open the requested file." << endl;
131 return KoFilter::FileNotFound;
134 if ( !storeout->open(
"styles.xml" ) )
136 kdWarning() <<
"Couldn't open the file 'styles.xml'." << endl;
137 return KoFilter::CreationError;
139 storeout->write( d->createStyles() );
142 if ( !storeout->open(
"content.xml" ) )
144 kdWarning() <<
"Couldn't open the file 'content.xml'." << endl;
145 return KoFilter::CreationError;
147 storeout->write( d->createContent() );
151 storeout->enterDirectory(
"META-INF" );
152 if ( !storeout->open(
"manifest.xml" ) )
154 kdWarning() <<
"Couldn't open the file 'META-INF/manifest.xml'." << endl;
155 return KoFilter::CreationError;
157 storeout->write( d->createManifest() );
161 d->inputFile = TQString();
162 d->outputFile = TQString();
168TQByteArray HancomWordImport::Private::createContent()
170 KoXmlWriter* contentWriter;
171 TQByteArray contentData;
172 TQBuffer contentBuffer( contentData );
174 contentBuffer.open( IO_WriteOnly );
175 contentWriter =
new KoXmlWriter( &contentBuffer );
177 contentWriter->startDocument(
"office:document-content" );
178 contentWriter->startElement(
"office:document-content" );
180 contentWriter->addAttribute(
"xmlns:office",
"urn:oasis:names:tc:opendocument:xmlns:office:1.0" );
181 contentWriter->addAttribute(
"xmlns:style",
"urn:oasis:names:tc:opendocument:xmlns:style:1.0" );
182 contentWriter->addAttribute(
"xmlns:text",
"urn:oasis:names:tc:opendocument:xmlns:text:1.0" );
183 contentWriter->addAttribute(
"xmlns:table",
"urn:oasis:names:tc:opendocument:xmlns:table:1.0" );
184 contentWriter->addAttribute(
"xmlns:draw",
"urn:oasis:names:tc:opendocument:xmlns:drawing:1.0" );
185 contentWriter->addAttribute(
"xmlns:fo",
"urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0" );
186 contentWriter->addAttribute(
"xmlns:svg",
"urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0" );
187 contentWriter->addAttribute(
"office:version",
"1.0" );
189 contentWriter->startElement(
"office:automatic-styles" );
190 contentWriter->endElement();
193 contentWriter->startElement(
"office:body" );
195 contentWriter->startElement(
"office:text" );
197 contentWriter->startElement(
"text:sequence-decls" );
198 contentWriter->endElement();
200 for( uint i = 0; i < paragraphs.count(); i++ )
202 TQString text = paragraphs[i];
203 text.replace(
'\r',
' ' );
204 contentWriter->startElement(
"text:p" );
205 contentWriter->addTextNode( text );
206 contentWriter->endElement();
209 contentWriter->endElement();
210 contentWriter->endElement();
212 contentWriter->endElement();
213 contentWriter->endDocument();
215 delete contentWriter;
220TQByteArray HancomWordImport::Private::createStyles()
222 KoXmlWriter* stylesWriter;
223 TQByteArray stylesData;
224 TQBuffer stylesBuffer( stylesData );
226 stylesBuffer.open( IO_WriteOnly );
227 stylesWriter =
new KoXmlWriter( &stylesBuffer );
229 stylesWriter->startDocument(
"office:document-styles" );
230 stylesWriter->startElement(
"office:document-styles" );
231 stylesWriter->addAttribute(
"xmlns:office",
"urn:oasis:names:tc:opendocument:xmlns:office:1.0" );
232 stylesWriter->addAttribute(
"xmlns:style",
"urn:oasis:names:tc:opendocument:xmlns:style:1.0" );
233 stylesWriter->addAttribute(
"xmlns:text",
"urn:oasis:names:tc:opendocument:xmlns:text:1.0" );
234 stylesWriter->addAttribute(
"xmlns:table",
"urn:oasis:names:tc:opendocument:xmlns:table:1.0" );
235 stylesWriter->addAttribute(
"xmlns:draw",
"urn:oasis:names:tc:opendocument:xmlns:drawing:1.0" );
236 stylesWriter->addAttribute(
"xmlns:fo",
"urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0" );
237 stylesWriter->addAttribute(
"xmlns:svg",
"urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0" );
238 stylesWriter->addAttribute(
"office:version",
"1.0" );
239 stylesWriter->startElement(
"office:styles" );
242 stylesWriter->startElement(
"style:default-style" );
243 stylesWriter->addAttribute(
"style:family",
"paragraph" );
245 stylesWriter->startElement(
"style:paragraph-properties" );
246 stylesWriter->addAttribute(
"fo:hyphenation-ladder-count",
"no-limit" );
247 stylesWriter->addAttribute(
"style:text-autospace",
"ideograph-alpha" );
248 stylesWriter->addAttribute(
"style:punctuation-wrap",
"hanging" );
249 stylesWriter->addAttribute(
"style:line-break",
"strict" );
250 stylesWriter->addAttribute(
"tyle:tab-stop-distance",
"0.5in" );
251 stylesWriter->addAttribute(
"style:writing-mode",
"page" );
252 stylesWriter->endElement();
254 stylesWriter->startElement(
"style:text-properties" );
255 stylesWriter->addAttribute(
"style:use-window-font-color",
"true" );
256 stylesWriter->addAttribute(
"style:font-name",
"Sans Serif" );
257 stylesWriter->addAttribute(
"fo:font-size",
"12pt" );
258 stylesWriter->addAttribute(
"fo:hyphenate",
"false" );
259 stylesWriter->endElement();
261 stylesWriter->endElement();
262 stylesWriter->endElement();
265 stylesWriter->startElement(
"office:automatic-styles" );
266 stylesWriter->endElement();
268 stylesWriter->endElement();
269 stylesWriter->endDocument();
276TQByteArray HancomWordImport::Private::createManifest()
278 KoXmlWriter* manifestWriter;
279 TQByteArray manifestData;
280 TQBuffer manifestBuffer( manifestData );
282 manifestBuffer.open( IO_WriteOnly );
283 manifestWriter =
new KoXmlWriter( &manifestBuffer );
285 manifestWriter->startDocument(
"manifest:manifest" );
286 manifestWriter->startElement(
"manifest:manifest" );
287 manifestWriter->addAttribute(
"xmlns:manifest",
"urn:oasis:names:tc:openoffice:xmlns:manifest:1.0" );
288 manifestWriter->addManifestEntry(
"/",
"application/vnd.oasis.opendocument.text" );
289 manifestWriter->addManifestEntry(
"styles.xml",
"text/xml" );
290 manifestWriter->addManifestEntry(
"content.xml",
"text/xml" );
291 manifestWriter->endElement();
292 manifestWriter->endDocument();
293 delete manifestWriter;