/* * $Id: ImportImage.cpp,v 1.14 2006/03/05 05:00:09 ozawa Exp $ * * Copyright 2005- ONGS Inc. All rights reserved. * * author: Masanori OZAWA (ozawa@ongs.co.jp) * version: $Revision: 1.14 $ * * 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 "xdtp.h" #include "modules/imports/ImportImage.h" #include "URI.h" #include "Utilities.h" #include "URLTool.h" #include "XMLTool.h" using namespace XDTP; ImportImage::ImportImage() { } ImportImage::~ImportImage() { } /** * XSL変換後のXML文章を保存する直前に呼び出されます。 * * @param aDocument XML文章 */ void ImportImage::treatPostDocument(xmlDocPtr aDocument) { GLSDImportModuleAdapter::treatPostDocument(aDocument); int count; XMLTool tool; xmlNodePtr node; xmlNodePtr root = xmlDocGetRootElement(aDocument); xmlNodeSetPtr nodes; xmlXPathObjectPtr obj = tool.getNodeList(root, "//import"); const char *pTmp; Glib::ustring type; if (obj) { nodes = obj->nodesetval; for (count = 0; count < nodes->nodeNr; count++) { node = nodes->nodeTab[count]; pTmp = (const char*)xmlGetProp(node, (const xmlChar*)"type"); type = (pTmp ? pTmp : ""); if (pTmp) xmlFree((xmlChar*)pTmp); type = type.lowercase(); if (6 < type.length() && "image/" == type.substr(0, 6)) { if (!transform(aDocument, node)) { THROW("ImportImage: transform failed."); } } } xmlXPathFreeObject(obj); } } bool ImportImage::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 imageToHTML(aDocument, aNode, ref, caption, encoding); } else if ("xhtml" == m_OutputType) { return imageToXHTML(aDocument, aNode, ref, caption, encoding); } else if ("text" == m_OutputType) { return preserveImport(aDocument, aNode, ref, caption, encoding); } // otherwise, do not operation. return true; } bool ImportImage::imageToHTML(xmlDocPtr aDocument, xmlNodePtr aNode, const Glib::ustring& aRef, const Glib::ustring& aCaption, const Glib::ustring& anEncoding) { // スタイルシートを取得 xmlNodePtr comment = getStyleSheet(aDocument, "text/css"); if (comment) { // スタイルシートにイメージのスタイルの指定があるか確認 Glib::ustring content = (comment->content ? (const char*)comment->content : ""); Glib::ustring::size_type pos = content.find("img.image"); if (Glib::ustring::npos == pos) { // スタイルシートにイメージのスタイルを追加 content += LINE_SEP; content += " img.image {" LINE_SEP; content += " border: solid thin black;" LINE_SEP; content += " }" LINE_SEP; content += " div.image {" LINE_SEP; content += " margin-top: 1.0mm;" LINE_SEP; content += " margin-bottom: 1.5em;" LINE_SEP; content += " text-align: center;" LINE_SEP; content += " }" LINE_SEP; xmlNodeSetContent(comment, (const xmlChar*)content.c_str()); } } // img エレメントを構築 xmlNodePtr title; xmlNodePtr img; xmlNodePtr div; title = xmlNewNode(NULL, (const xmlChar*)"div"); if (!title) THROW("Out of memory!"); xmlSetProp(title, (const xmlChar*)"class", (const xmlChar*)"image"); xmlAddChild(title, xmlNewText((const xmlChar*)aCaption.c_str())); img = xmlNewNode(NULL, (const xmlChar*)"img"); if (!img) { xmlFreeNode(title); THROW("Out of memory!"); } xmlSetProp(img, (const xmlChar*)"class", (const xmlChar*)"image"); xmlSetProp(img, (const xmlChar*)"alt", (const xmlChar*)aCaption.c_str()); xmlSetProp(img, (const xmlChar*)"src", (const xmlChar*)aRef.c_str()); // イメージのサイズを調べ,ブラウザ表示(A4サイズを想定)の幅 // を越えるようであれば,最大値まで縮小して表示するようにし, // 画像に元画像へのリンクを持たせるようにする。 IMAGE_INFO info; URLTool::getImageInfo(normalizeURL(aRef), info); if (556 < info.width) { char buf[16] = {0}; int newWidth = 556; int newHeight = (int) ((double)info.height * (double)newWidth / (double)info.width); memset(buf, 0, sizeof(buf)); snprintf(buf, sizeof(buf) -1, "%d", newWidth); xmlSetProp(img, (const xmlChar*)"width", (const xmlChar*)buf); snprintf(buf, sizeof(buf) -1, "%d", newHeight); xmlSetProp(img, (const xmlChar*)"height", (const xmlChar*)buf); xmlNodePtr link = xmlNewNode(NULL, (const xmlChar*)"a"); if (!link) { xmlFreeNode(img); xmlFreeNode(title); THROW("Out of memory!"); } xmlSetProp(link, (const xmlChar*)"href", (const xmlChar*)aRef.c_str()); xmlAddChild(link, img); div = xmlNewNode(NULL, (const xmlChar*)"div"); if (!div) { xmlFreeNode(link); xmlFreeNode(title); THROW("Out of memory!"); } xmlSetProp(div, (const xmlChar*)"align", (const xmlChar*)"center"); xmlAddChild(div, link); } else { div = xmlNewNode(NULL, (const xmlChar*)"div"); if (!div) { xmlFreeNode(title); THROW("Out of memory!"); } xmlSetProp(div, (const xmlChar*)"align", (const xmlChar*)"center"); xmlAddChild(div, img); } // イメージサイズ調整、ここまで↑ xmlFreeNode(xmlReplaceNode(aNode, div)); xmlAddNextSibling(div, title); return true; } bool ImportImage::imageToXHTML(xmlDocPtr aDocument, xmlNodePtr aNode, const Glib::ustring& aRef, const Glib::ustring& aCaption, const Glib::ustring& anEncoding) { return imageToHTML(aDocument, aNode, aRef, aCaption, anEncoding); }