/* * $Id: MyGLSDImportModule.cpp,v 1.7 2006/03/05 05:00:09 ozawa Exp $ * * GLSD external sample module program. * * Copyright 2005- ONGS Inc. * * author: Masanori OZAWA (ozawa@ongs.co.jp) * version: $Revision: 1.7 $ * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY ONGS INC ``AS IS'' AND ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * IN NO EVENT SHALL ONGS INC OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * The views and conclusions contained in the software and documentation are * those of the authors and should not be interpreted as representing official * policies, either expressed or implied, of the ONGS Inc. * */ #include "xdtptypes.h" #include "MyGLSDImportModule.h" #include "Utilities.h" #include "URLTool.h" #include "XMLTool.h" //_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/ // MyGLSDImportModule MyGLSDImportModule::MyGLSDImportModule() { } MyGLSDImportModule::~MyGLSDImportModule() { } void MyGLSDImportModule::treatPostDocument(xmlDocPtr aDocument) { GLSDImportModuleAdapter::treatPostDocument(aDocument); int count; XDTP::XMLTool tool; xmlNodePtr root = xmlDocGetRootElement(aDocument); xmlNodeSetPtr nodes; xmlXPathObjectPtr obj = tool.getNodeList(root, "//import[@type=\"text/import-test\"]"); if (obj) { nodes = obj->nodesetval; for (count = 0; count < nodes->nodeNr; count++) { if (!transform(aDocument, nodes->nodeTab[count])) { THROW("MyGLSDImportModule: transform failed."); } } xmlXPathFreeObject(obj); } } bool MyGLSDImportModule::transform(xmlDocPtr aDocument, xmlNodePtr aNode) { Glib::ustring ref; Glib::ustring caption; Glib::ustring encoding; if (!getImportAttributes(aNode, ref, caption, encoding)) { return false; } if ("html" == m_OutputType) { return tohtml(aDocument, aNode, ref, caption, encoding); } // otherwise, no operation. return true; } bool MyGLSDImportModule::tohtml (xmlDocPtr aDocument, xmlNodePtr aNode, const Glib::ustring& aRef, const Glib::ustring& aCaption, const Glib::ustring& anEncoding) { // get stylesheet xmlNodePtr comment = getStyleSheet(aDocument, "text/css"); if (comment) { Glib::ustring content = (comment->content ? (const char*)comment->content : ""); Glib::ustring::size_type pos = content.find("pre.import-test"); if (Glib::ustring::npos == pos) { content += LINE_SEP; content += " pre.import-test {" LINE_SEP; content += " text-align: left;" LINE_SEP; content += " border: solid thin silver;" LINE_SEP; content += " margin: 1.0em 0 0 0;" LINE_SEP; content += " padding: 0.5em 1.0em 1.0em 0.5em;" LINE_SEP; content += " }" LINE_SEP; content += " div.import-test {" LINE_SEP; content += " text-align: center;" LINE_SEP; content += " margin: 0.5em 0 1.5em 0;" LINE_SEP; content += " overflow: auto;" LINE_SEP; content += " }" LINE_SEP; xmlNodeSetContent(comment, (const xmlChar*)content.c_str()); } } // import file xmlNodePtr pre = xmlNewNode(NULL, (const xmlChar*)"pre"); if (!pre) THROW("Out of memory!"); xmlSetProp(pre, (const xmlChar*)"class", (const xmlChar*)"import-test"); xmlAddChild(pre, xmlNewText((const xmlChar*)LINE_SEP)); bool bSuccess = false; std::string tmpfile; try { Glib::RefPtr ioc = getIOChannel(aRef, tmpfile); setEncoding(ioc, anEncoding); Glib::ustring line; while (ioc->read_line(line) == Glib::IO_STATUS_NORMAL) { xmlAddChild(pre, xmlNewText((const xmlChar*)line.c_str())); } ioc->close(); bSuccess = true; } catch (XDTP::Exception exception) { exception.print(stderr); } catch (Glib::Error error) { std::string msg = Glib::locale_from_utf8(error.what()); fprintf(stderr, "%s (%s)" LINE_SEP, msg.c_str(), aRef.c_str()); } catch (std::exception exception) { fprintf(stderr, "%s (%s)" LINE_SEP, exception.what(), aRef.c_str()); } catch (...) { fprintf(stderr, "MyGLSDImportModule: unknown error occured. (%s)" LINE_SEP, aRef.c_str()); } if (0 < tmpfile.length()) { remove(tmpfile.c_str()); } if (!bSuccess) return false; xmlNodePtr block = xmlNewNode(NULL, (const xmlChar*)"blockquote"); if (!block) { xmlFreeNode(pre); THROW("Out of memory!"); } xmlSetProp(block, (const xmlChar*)"cite", (const xmlChar*)aRef.c_str()); xmlAddChild(block, pre); xmlNodePtr title = xmlNewNode(NULL, (const xmlChar*)"div"); if (!title) { xmlFreeNode(block); THROW("Out of memory!"); } xmlSetProp(title, (const xmlChar*)"class", (const xmlChar*)"import-test"); xmlAddChild(title, xmlNewText((const xmlChar*)("XML Source " + aCaption).c_str())); xmlFreeNode(xmlReplaceNode(aNode, title)); xmlAddPrevSibling(title, block); return true; }