<?php
/**
 * PHPWord
 *
 * Copyright (c) 2011 PHPWord
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 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
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
 *
 * @category   PHPWord
 * @package    PHPWord
 * @copyright  Copyright (c) 010 PHPWord
 * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt    LGPL
 * @version    Beta 0.6.3, 08.07.2011
 */

class PHPWord_Writer_Word2007_Base extends PHPWord_Writer_Word2007_WriterPart
{

    protected function _writeText(PHPWord_Shared_XMLWriter $objWriter = null, PHPWord_Section_Text $text, $withoutP = false)
    {
        $styleFont  = $text->getFontStyle();
        $SfIsObject = ($styleFont instanceof PHPWord_Style_Font) ? true : false;
        //@blog<www.phpddt.com>
        $strText = htmlspecialchars($text->getText());
        // 将文本用\n分割成数组
        $str_tmp = explode("\n", $strText);

        // 循环输出数组文本
        for ($i = 0; $i < count($str_tmp); $i++) {
            if (!$withoutP) {
                $objWriter->startElement('w:p');
                $styleParagraph = $text->getParagraphStyle();
                $SpIsObject     = ($styleParagraph instanceof PHPWord_Style_Paragraph) ? true : false;
                if ($SpIsObject) {
                    $this->_writeParagraphStyle($objWriter, $styleParagraph);
                } elseif (!$SpIsObject && !is_null($styleParagraph)) {
                    $objWriter->startElement('w:pPr');
                    $objWriter->startElement('w:pStyle');
                    $objWriter->writeAttribute('w:val', $styleParagraph);
                    $objWriter->endElement();
                    $objWriter->endElement();
                }
            }

            $strText = htmlspecialchars($text->getText());
            $strText = PHPWord_Shared_String::ControlCharacterPHP2OOXML($strText);
            $strText = $str_tmp[$i];
            $strText = PHPWord_Shared_String::ControlCharacterPHP2OOXML($strText);
            $objWriter->startElement('w:r');

            if ($SfIsObject) {
                $this->_writeTextStyle($objWriter, $styleFont);
            } elseif (!$SfIsObject && !is_null($styleFont)) {
                $objWriter->startElement('w:rPr');
                $objWriter->startElement('w:rStyle');
                $objWriter->writeAttribute('w:val', $styleFont);
                $objWriter->endElement();
                $objWriter->endElement();
            }

            $objWriter->startElement('w:t');
            $objWriter->writeAttribute('xml:space', 'preserve'); // needed because of drawing spaces before and after text
            $objWriter->writeRaw($strText);
            $objWriter->endElement();
            $objWriter->endElement(); // w:r

            if (!$withoutP) {
                $objWriter->endElement(); // w:p
            }
        }
    }

    protected function _writeTextRun(PHPWord_Shared_XMLWriter $objWriter = null, PHPWord_Section_TextRun $textrun)
    {
        $elements       = $textrun->getElements();
        $styleParagraph = $textrun->getParagraphStyle();

        $SpIsObject = ($styleParagraph instanceof PHPWord_Style_Paragraph) ? true : false;

        $objWriter->startElement('w:p');

        if ($SpIsObject) {
            $this->_writeParagraphStyle($objWriter, $styleParagraph);
        } elseif (!$SpIsObject && !is_null($styleParagraph)) {
            $objWriter->startElement('w:pPr');
            $objWriter->startElement('w:pStyle');
            $objWriter->writeAttribute('w:val', $styleParagraph);
            $objWriter->endElement();
            $objWriter->endElement();
        }

        if (count($elements) > 0) {
            foreach ($elements as $element) {
                if ($element instanceof PHPWord_Section_Text) {
                    $this->_writeText($objWriter, $element, true);
                } elseif ($element instanceof PHPWord_Section_Link) {
                    $this->_writeLink($objWriter, $element, true);
                }
            }
        }

        $objWriter->endElement();
    }

    protected function _writeParagraphStyle(PHPWord_Shared_XMLWriter $objWriter = null, PHPWord_Style_Paragraph $style, $withoutPPR = false)
    {
        $align       = $style->getAlign();
        $spaceBefore = $style->getSpaceBefore();
        $spaceAfter  = $style->getSpaceAfter();
        $spacing     = $style->getSpacing();

        $indentLeft           = $style->getIndentLeft();
        $indentRight          = $style->getIndentRight();
        $indentFirstLine      = $style->getIndentFirstLine();
        $indentFirstLineChars = $style->getIndentFirstLineChars();

        if (!is_null($align) || !is_null($spacing) || !is_null($spaceBefore) || !is_null($spaceAfter) || !is_null($indentLeft) || !is_null($indentRight) || !is_null($indentFirstLine) || !is_null($indentFirstLineChars)) {

            if (!$withoutPPR) {
                $objWriter->startElement('w:pPr');
            }

            if (!is_null($align)) {
                $objWriter->startElement('w:jc');
                $objWriter->writeAttribute('w:val', $align);
                $objWriter->endElement();
            }

            if (!is_null($spaceBefore) || !is_null($spaceAfter) || !is_null($spacing)) {

                $objWriter->startElement('w:spacing');

                if (!is_null($spaceBefore)) {
                    $objWriter->writeAttribute('w:before', $spaceBefore);
                }
                if (!is_null($spaceAfter)) {
                    $objWriter->writeAttribute('w:after', $spaceAfter);
                }
                if (!is_null($spacing)) {
                    $objWriter->writeAttribute('w:line', $spacing);
                    $objWriter->writeAttribute('w:lineRule', 'auto');
                }

                $objWriter->endElement();
            }

            if (!is_null($indentLeft) || !is_null($indentRight) || !is_null($indentFirstLine) || !is_null($indentFirstLineChars)) {

                $objWriter->startElement('w:ind');

                if (!is_null($indentLeft)) {
                    $objWriter->writeAttribute('w:left', $indentLeft);
                }

                if (!is_null($indentRight)) {
                    $objWriter->writeAttribute('w:right', $indentRight);
                }

                if (!is_null($indentFirstLine)) {
                    $objWriter->writeAttribute('w:firstLine', $indentFirstLine);
                }

                if (!is_null($indentFirstLineChars)) {
                    $objWriter->writeAttribute('w:firstLineChars', $indentFirstLineChars);
                }

                $objWriter->endElement();
            }

            if (!$withoutPPR) {
                $objWriter->endElement(); // w:pPr
            }
        }

    }

    protected function _writeLink(PHPWord_Shared_XMLWriter $objWriter = null, PHPWord_Section_Link $link, $withoutP = false)
    {
        $rID      = $link->getRelationId();
        $linkName = $link->getLinkName();
        if (is_null($linkName)) {
            $linkName = $link->getLinkSrc();
        }

        $styleFont  = $link->getFontStyle();
        $SfIsObject = ($styleFont instanceof PHPWord_Style_Font) ? true : false;

        if (!$withoutP) {
            $objWriter->startElement('w:p');

            $styleParagraph = $link->getParagraphStyle();
            $SpIsObject     = ($styleParagraph instanceof PHPWord_Style_Paragraph) ? true : false;

            if ($SpIsObject) {
                $this->_writeParagraphStyle($objWriter, $styleParagraph);
            } elseif (!$SpIsObject && !is_null($styleParagraph)) {
                $objWriter->startElement('w:pPr');
                $objWriter->startElement('w:pStyle');
                $objWriter->writeAttribute('w:val', $styleParagraph);
                $objWriter->endElement();
                $objWriter->endElement();
            }
        }

        $objWriter->startElement('w:hyperlink');
        $objWriter->writeAttribute('r:id', 'rId' . $rID);
        $objWriter->writeAttribute('w:history', '1');

        $objWriter->startElement('w:r');
        if ($SfIsObject) {
            $this->_writeTextStyle($objWriter, $styleFont);
        } elseif (!$SfIsObject && !is_null($styleFont)) {
            $objWriter->startElement('w:rPr');
            $objWriter->startElement('w:rStyle');
            $objWriter->writeAttribute('w:val', $styleFont);
            $objWriter->endElement();
            $objWriter->endElement();
        }

        $objWriter->startElement('w:t');
        $objWriter->writeAttribute('xml:space', 'preserve'); // needed because of drawing spaces before and after text
        $objWriter->writeRaw($linkName);
        $objWriter->endElement();
        $objWriter->endElement();

        $objWriter->endElement();

        if (!$withoutP) {
            $objWriter->endElement(); // w:p
        }
    }

    protected function _writePreserveText(PHPWord_Shared_XMLWriter $objWriter = null, PHPWord_Section_Footer_PreserveText $textrun)
    {
        $styleFont      = $textrun->getFontStyle();
        $styleParagraph = $textrun->getParagraphStyle();

        $SfIsObject = ($styleFont instanceof PHPWord_Style_Font) ? true : false;
        $SpIsObject = ($styleParagraph instanceof PHPWord_Style_Paragraph) ? true : false;

        $arrText = $textrun->getText();

        $objWriter->startElement('w:p');

        if ($SpIsObject) {
            $this->_writeParagraphStyle($objWriter, $styleParagraph);
        } elseif (!$SpIsObject && !is_null($styleParagraph)) {
            $objWriter->startElement('w:pPr');
            $objWriter->startElement('w:pStyle');
            $objWriter->writeAttribute('w:val', $styleParagraph);
            $objWriter->endElement();
            $objWriter->endElement();
        }

        foreach ($arrText as $text) {

            if (substr($text, 0, 1) == '{') {
                $text = substr($text, 1, -1);

                $objWriter->startElement('w:r');
                $objWriter->startElement('w:fldChar');
                $objWriter->writeAttribute('w:fldCharType', 'begin');
                $objWriter->endElement();
                $objWriter->endElement();

                $objWriter->startElement('w:r');

                if ($SfIsObject) {
                    $this->_writeTextStyle($objWriter, $styleFont);
                } elseif (!$SfIsObject && !is_null($styleFont)) {
                    $objWriter->startElement('w:rPr');
                    $objWriter->startElement('w:rStyle');
                    $objWriter->writeAttribute('w:val', $styleFont);
                    $objWriter->endElement();
                    $objWriter->endElement();
                }

                $objWriter->startElement('w:instrText');
                $objWriter->writeAttribute('xml:space', 'preserve');
                $objWriter->writeRaw($text);
                $objWriter->endElement();
                $objWriter->endElement();

                $objWriter->startElement('w:r');
                $objWriter->startElement('w:fldChar');
                $objWriter->writeAttribute('w:fldCharType', 'separate');
                $objWriter->endElement();
                $objWriter->endElement();

                $objWriter->startElement('w:r');
                $objWriter->startElement('w:fldChar');
                $objWriter->writeAttribute('w:fldCharType', 'end');
                $objWriter->endElement();
                $objWriter->endElement();
            } else {
                $text = htmlspecialchars($text);
                $text = PHPWord_Shared_String::ControlCharacterPHP2OOXML($text);

                $objWriter->startElement('w:r');

                if ($SfIsObject) {
                    $this->_writeTextStyle($objWriter, $styleFont);
                } elseif (!$SfIsObject && !is_null($styleFont)) {
                    $objWriter->startElement('w:rPr');
                    $objWriter->startElement('w:rStyle');
                    $objWriter->writeAttribute('w:val', $styleFont);
                    $objWriter->endElement();
                    $objWriter->endElement();
                }

                $objWriter->startElement('w:t');
                $objWriter->writeAttribute('xml:space', 'preserve');
                $objWriter->writeRaw($text);
                $objWriter->endElement();
                $objWriter->endElement();
            }
        }

        $objWriter->endElement(); // p
    }

    protected function _writeTextStyle(PHPWord_Shared_XMLWriter $objWriter = null, PHPWord_Style_Font $style)
    {
        $font         = $style->getName();
        $bold         = $style->getBold();
        $italic       = $style->getItalic();
        $color        = $style->getColor();
        $size         = $style->getSize();
        $fgColor      = $style->getFgColor();
        $striketrough = $style->getStrikethrough();
        $underline    = $style->getUnderline();

        $objWriter->startElement('w:rPr');

        // Font
        if ($font != 'Arial') {
            $objWriter->writeAttribute('w:eastAsia', $font);
            $objWriter->startElement('w:rFonts');
            $objWriter->writeAttribute('w:ascii', $font);
            $objWriter->writeAttribute('w:hAnsi', $font);
            $objWriter->writeAttribute('w:cs', $font);
            $objWriter->endElement();
        }

        // Color
        if ($color != '000000') {
            $objWriter->startElement('w:color');
            $objWriter->writeAttribute('w:val', $color);
            $objWriter->endElement();
        }

        // Size
        if ($size != 20) {
            $objWriter->startElement('w:sz');
            $objWriter->writeAttribute('w:val', $size);
            $objWriter->endElement();
            $objWriter->startElement('w:szCs');
            $objWriter->writeAttribute('w:val', $size);
            $objWriter->endElement();
        }

        // Bold
        if ($bold) {
            $objWriter->writeElement('w:b', null);
        }

        // Italic
        if ($italic) {
            $objWriter->writeElement('w:i', null);
            $objWriter->writeElement('w:iCs', null);
        }

        // Underline
        if (!is_null($underline) && $underline != 'none') {
            $objWriter->startElement('w:u');
            $objWriter->writeAttribute('w:val', $underline);
            $objWriter->endElement();
        }

        // Striketrough
        if ($striketrough) {
            $objWriter->writeElement('w:strike', null);
        }

        // Foreground-Color
        if (!is_null($fgColor)) {
            $objWriter->startElement('w:highlight');
            $objWriter->writeAttribute('w:val', $fgColor);
            $objWriter->endElement();
        }

        $objWriter->endElement();
    }

    protected function _writeTextBreak(PHPWord_Shared_XMLWriter $objWriter = null)
    {
        $objWriter->writeElement('w:p', null);
    }

    protected function _writeTable(PHPWord_Shared_XMLWriter $objWriter = null, PHPWord_Section_Table $table)
    {
        $_rows  = $table->getRows();
        $_cRows = count($_rows);

        if ($_cRows > 0) {
            $objWriter->startElement('w:tbl');
            $tblStyle = $table->getStyle();
            if ($tblStyle instanceof PHPWord_Style_Table) {
                $this->_writeTableStyle($objWriter, $tblStyle);
            } else {
                if (!empty($tblStyle)) {
                    $objWriter->startElement('w:tblPr');
                    $objWriter->startElement('w:tblStyle');
                    $objWriter->writeAttribute('w:val', $tblStyle);
                    $objWriter->endElement();
                    $objWriter->endElement();
                }
            }

            $_heights = $table->getRowHeights();
            for ($i = 0; $i < $_cRows; $i++) {
                $row    = $_rows[$i];
                $height = $_heights[$i];

                $objWriter->startElement('w:tr');

                if (!is_null($height)) {
                    $objWriter->startElement('w:trPr');
                    $objWriter->startElement('w:trHeight');
                    $objWriter->writeAttribute('w:val', $height);
                    $objWriter->endElement();
                    $objWriter->endElement();
                }

                foreach ($row as $cell) {
                    $objWriter->startElement('w:tc');

                    $cellStyle = $cell->getStyle();
                    $width     = $cell->getWidth();

                    $objWriter->startElement('w:tcPr');
                    $objWriter->startElement('w:tcW');
                    $objWriter->writeAttribute('w:w', $width);
                    $objWriter->writeAttribute('w:type', 'dxa');
                    $objWriter->endElement();

                    if ($cellStyle instanceof PHPWord_Style_Cell) {
                        $this->_writeCellStyle($objWriter, $cellStyle);
                    }

                    $objWriter->endElement();

                    $_elements = $cell->getElements();
                    if (count($_elements) > 0) {
                        foreach ($_elements as $element) {
                            if ($element instanceof PHPWord_Section_Text) {
                                $this->_writeText($objWriter, $element);
                            } elseif ($element instanceof PHPWord_Section_TextRun) {
                                $this->_writeTextRun($objWriter, $element);
                            } elseif ($element instanceof PHPWord_Section_Link) {
                                $this->_writeLink($objWriter, $element);
                            } elseif ($element instanceof PHPWord_Section_TextBreak) {
                                $this->_writeTextBreak($objWriter);
                            } elseif ($element instanceof PHPWord_Section_ListItem) {
                                $this->_writeListItem($objWriter, $element);
                            } elseif ($element instanceof PHPWord_Section_Image ||
                                $element instanceof PHPWord_Section_MemoryImage) {
                                $this->_writeImage($objWriter, $element);
                            } elseif ($element instanceof PHPWord_Section_Object) {
                                $this->_writeObject($objWriter, $element);
                            } elseif ($element instanceof PHPWord_Section_Footer_PreserveText) {
                                $this->_writePreserveText($objWriter, $element);
                            }
                        }
                    } else {
                        $this->_writeTextBreak($objWriter);
                    }

                    $objWriter->endElement();
                }
                $objWriter->endElement();
            }
            $objWriter->endElement();
        }
    }

    protected function _writeTableStyle(PHPWord_Shared_XMLWriter $objWriter = null, PHPWord_Style_Table $style = null)
    {
        $margins = $style->getCellMargin();
        $mTop    = (!is_null($margins[0])) ? true : false;
        $mLeft   = (!is_null($margins[1])) ? true : false;
        $mRight  = (!is_null($margins[2])) ? true : false;
        $mBottom = (!is_null($margins[3])) ? true : false;

        if ($mTop || $mLeft || $mRight || $mBottom) {
            $objWriter->startElement('w:tblPr');
            $objWriter->startElement('w:tblCellMar');

            if ($mTop) {
                $objWriter->startElement('w:top');
                $objWriter->writeAttribute('w:w', $margins[0]);
                $objWriter->writeAttribute('w:type', 'dxa');
                $objWriter->endElement();
            }

            if ($mLeft) {
                $objWriter->startElement('w:left');
                $objWriter->writeAttribute('w:w', $margins[1]);
                $objWriter->writeAttribute('w:type', 'dxa');
                $objWriter->endElement();
            }

            if ($mRight) {
                $objWriter->startElement('w:right');
                $objWriter->writeAttribute('w:w', $margins[2]);
                $objWriter->writeAttribute('w:type', 'dxa');
                $objWriter->endElement();
            }

            if ($mBottom) {
                $objWriter->startElement('w:bottom');
                $objWriter->writeAttribute('w:w', $margins[3]);
                $objWriter->writeAttribute('w:type', 'dxa');
                $objWriter->endElement();
            }

            $objWriter->endElement();
            $objWriter->endElement();
        }
    }

    protected function _writeCellStyle(PHPWord_Shared_XMLWriter $objWriter = null, PHPWord_Style_Cell $style = null)
    {

        $gridSpan = $style->getGridSpan();

        if (!is_null($gridSpan)) {
            $objWriter->startElement('w:gridSpan');
            $objWriter->writeAttribute('w:val', $gridSpan);
            $objWriter->endElement();
        }
        /** edited by www.phpddt.com */
        $vMerge = $style->getVMerge();
        if (!is_null($vMerge)) {
            $objWriter->startElement('w:vMerge');
            $objWriter->writeAttribute('w:val', $vMerge);
            $objWriter->endElement();
        }

        $bgColor = $style->getBgColor();
        $valign  = $style->getVAlign();
        $textDir = $style->getTextDirection();
        $brdSz   = $style->getBorderSize();
        $brdCol  = $style->getBorderColor();

        $bTop    = (!is_null($brdSz[0])) ? true : false;
        $bLeft   = (!is_null($brdSz[1])) ? true : false;
        $bRight  = (!is_null($brdSz[2])) ? true : false;
        $bBottom = (!is_null($brdSz[3])) ? true : false;
        $borders = ($bTop || $bLeft || $bRight || $bBottom) ? true : false;

        $styles = (!is_null($bgColor) || !is_null($valign) || !is_null($textDir) || $borders) ? true : false;

        if ($styles) {

            if (!is_null($textDir)) {
                $objWriter->startElement('w:textDirection');
                $objWriter->writeAttribute('w:val', $textDir);
                $objWriter->endElement();
            }

            if (!is_null($bgColor)) {
                $objWriter->startElement('w:shd');
                $objWriter->writeAttribute('w:val', 'clear');
                $objWriter->writeAttribute('w:color', 'auto');
                $objWriter->writeAttribute('w:fill', $bgColor);
                $objWriter->endElement();
            }

            if (!is_null($valign)) {
                $objWriter->startElement('w:vAlign');
                $objWriter->writeAttribute('w:val', $valign);
                $objWriter->endElement();
            }

            if ($borders) {
                $_defaultColor = $style->getDefaultBorderColor();

                $objWriter->startElement('w:tcBorders');
                if ($bTop) {
                    if (is_null($brdCol[0])) {$brdCol[0] = $_defaultColor;}
                    $objWriter->startElement('w:top');
                    $objWriter->writeAttribute('w:val', 'single');
                    $objWriter->writeAttribute('w:sz', $brdSz[0]);
                    $objWriter->writeAttribute('w:color', $brdCol[0]);
                    $objWriter->endElement();
                }

                if ($bLeft) {
                    if (is_null($brdCol[1])) {$brdCol[1] = $_defaultColor;}
                    $objWriter->startElement('w:left');
                    $objWriter->writeAttribute('w:val', 'single');
                    $objWriter->writeAttribute('w:sz', $brdSz[1]);
                    $objWriter->writeAttribute('w:color', $brdCol[1]);
                    $objWriter->endElement();
                }

                if ($bRight) {
                    if (is_null($brdCol[2])) {$brdCol[2] = $_defaultColor;}
                    $objWriter->startElement('w:right');
                    $objWriter->writeAttribute('w:val', 'single');
                    $objWriter->writeAttribute('w:sz', $brdSz[2]);
                    $objWriter->writeAttribute('w:color', $brdCol[2]);
                    $objWriter->endElement();
                }

                if ($bBottom) {
                    if (is_null($brdCol[3])) {$brdCol[3] = $_defaultColor;}
                    $objWriter->startElement('w:bottom');
                    $objWriter->writeAttribute('w:val', 'single');
                    $objWriter->writeAttribute('w:sz', $brdSz[3]);
                    $objWriter->writeAttribute('w:color', $brdCol[3]);
                    $objWriter->endElement();
                }

                $objWriter->endElement();
            }
        }
    }

    protected function _writeImage(PHPWord_Shared_XMLWriter $objWriter = null, $image)
    {
        $rId = $image->getRelationId();

        $style  = $image->getStyle();
        $width  = $style->getWidth();
        $height = $style->getHeight();
        $align  = $style->getAlign();

        $objWriter->startElement('w:p');

        if (!is_null($align)) {
            $objWriter->startElement('w:pPr');
            $objWriter->startElement('w:jc');
            $objWriter->writeAttribute('w:val', $align);
            $objWriter->endElement();
            $objWriter->endElement();
        }

        $objWriter->startElement('w:r');

        $objWriter->startElement('w:pict');

        $objWriter->startElement('v:shape');
        $objWriter->writeAttribute('type', '#_x0000_t75');
        $objWriter->writeAttribute('style', 'width:' . $width . 'px;height:' . $height . 'px');

        $objWriter->startElement('v:imagedata');
        $objWriter->writeAttribute('r:id', 'rId' . $rId);
        $objWriter->writeAttribute('o:title', '');
        $objWriter->endElement();
        $objWriter->endElement();

        $objWriter->endElement();

        $objWriter->endElement();

        $objWriter->endElement();
    }

    protected function _writeWatermark(PHPWord_Shared_XMLWriter $objWriter = null, $image)
    {
        $rId = $image->getRelationId();

        $style      = $image->getStyle();
        $width      = $style->getWidth();
        $height     = $style->getHeight();
        $marginLeft = $style->getMarginLeft();
        $marginTop  = $style->getMarginTop();

        $objWriter->startElement('w:p');

        $objWriter->startElement('w:r');

        $objWriter->startElement('w:pict');

        $objWriter->startElement('v:shape');
        $objWriter->writeAttribute('type', '#_x0000_t75');

        $strStyle = 'position:absolute;';
        $strStyle .= ' width:' . $width . 'px;';
        $strStyle .= ' height:' . $height . 'px;';
        if (!is_null($marginTop)) {
            $strStyle .= ' margin-top:' . $marginTop . 'px;';
        }
        if (!is_null($marginLeft)) {
            $strStyle .= ' margin-left:' . $marginLeft . 'px;';
        }

        $objWriter->writeAttribute('style', $strStyle);

        $objWriter->startElement('v:imagedata');
        $objWriter->writeAttribute('r:id', 'rId' . $rId);
        $objWriter->writeAttribute('o:title', '');
        $objWriter->endElement();
        $objWriter->endElement();

        $objWriter->endElement();

        $objWriter->endElement();

        $objWriter->endElement();
    }

    protected function _writeTitle(PHPWord_Shared_XMLWriter $objWriter = null, PHPWord_Section_Title $title)
    {
        $text       = htmlspecialchars($title->getText());
        $text       = PHPWord_Shared_String::ControlCharacterPHP2OOXML($text);
        $anchor     = $title->getAnchor();
        $bookmarkId = $title->getBookmarkId();
        $style      = $title->getStyle();

        $objWriter->startElement('w:p');

        if (!empty($style)) {
            $objWriter->startElement('w:pPr');
            $objWriter->startElement('w:pStyle');
            $objWriter->writeAttribute('w:val', $style);
            $objWriter->endElement();
            $objWriter->endElement();
        }

        $objWriter->startElement('w:r');
        $objWriter->startElement('w:fldChar');
        $objWriter->writeAttribute('w:fldCharType', 'end');
        $objWriter->endElement();
        $objWriter->endElement();

        $objWriter->startElement('w:bookmarkStart');
        $objWriter->writeAttribute('w:id', $bookmarkId);
        $objWriter->writeAttribute('w:name', $anchor);
        $objWriter->endElement();

        $objWriter->startElement('w:r');
        $objWriter->startElement('w:t');
        $objWriter->writeRaw($text);
        $objWriter->endElement();
        $objWriter->endElement();

        $objWriter->startElement('w:bookmarkEnd');
        $objWriter->writeAttribute('w:id', $bookmarkId);
        $objWriter->endElement();

        $objWriter->endElement();
    }
}
