2014-03-22 10:06:08 +04:00
|
|
|
<?php
|
|
|
|
|
/**
|
2014-05-05 13:06:53 +04:00
|
|
|
* This file is part of PHPWord - A pure PHP library for reading and writing
|
|
|
|
|
* word processing documents.
|
|
|
|
|
*
|
|
|
|
|
* PHPWord is free software distributed under the terms of the GNU Lesser
|
|
|
|
|
* General Public License version 3 as published by the Free Software Foundation.
|
|
|
|
|
*
|
|
|
|
|
* For the full copyright and license information, please read the LICENSE
|
|
|
|
|
* file that was distributed with this source code. For the full list of
|
|
|
|
|
* contributors, visit https://github.com/PHPOffice/PHPWord/contributors.
|
2014-03-22 10:06:08 +04:00
|
|
|
*
|
2014-03-27 23:55:06 +07:00
|
|
|
* @link https://github.com/PHPOffice/PHPWord
|
2015-12-05 21:25:59 +04:00
|
|
|
* @copyright 2010-2015 PHPWord contributors
|
2014-05-04 21:03:28 +04:00
|
|
|
* @license http://www.gnu.org/licenses/lgpl.txt LGPL version 3
|
2014-03-22 10:06:08 +04:00
|
|
|
*/
|
|
|
|
|
|
2014-04-30 08:54:38 +07:00
|
|
|
namespace PhpOffice\PhpWord\Writer\Word2007\Part;
|
2014-03-22 10:06:08 +04:00
|
|
|
|
2016-01-23 19:16:34 +04:00
|
|
|
use PhpOffice\Common\XMLWriter;
|
2014-05-16 01:22:34 +07:00
|
|
|
use PhpOffice\PhpWord\Settings as PhpWordSettings;
|
2014-10-10 21:10:29 +04:00
|
|
|
use PhpOffice\PhpWord\Style;
|
2014-05-25 22:51:14 +07:00
|
|
|
use PhpOffice\PhpWord\Style\Font as FontStyle;
|
|
|
|
|
use PhpOffice\PhpWord\Style\Paragraph as ParagraphStyle;
|
|
|
|
|
use PhpOffice\PhpWord\Style\Table as TableStyle;
|
2014-04-26 11:14:27 +07:00
|
|
|
use PhpOffice\PhpWord\Writer\Word2007\Style\Font as FontStyleWriter;
|
|
|
|
|
use PhpOffice\PhpWord\Writer\Word2007\Style\Paragraph as ParagraphStyleWriter;
|
|
|
|
|
use PhpOffice\PhpWord\Writer\Word2007\Style\Table as TableStyleWriter;
|
2014-03-22 10:06:08 +04:00
|
|
|
|
2014-03-24 00:26:10 +07:00
|
|
|
/**
|
2014-05-06 08:50:55 +07:00
|
|
|
* Word2007 styles part writer: word/styles.xml
|
2014-04-11 16:16:22 +07:00
|
|
|
*
|
2014-04-11 19:04:53 +07:00
|
|
|
* @todo Do something with the numbering style introduced in 0.10.0
|
2014-05-25 22:51:14 +07:00
|
|
|
* @SuppressWarnings(PHPMD.UnusedPrivateMethod) For writeFontStyle, writeParagraphStyle, and writeTableStyle
|
2014-03-24 00:26:10 +07:00
|
|
|
*/
|
2014-04-30 08:54:38 +07:00
|
|
|
class Styles extends AbstractPart
|
2014-03-22 10:06:08 +04:00
|
|
|
{
|
2014-03-24 00:26:10 +07:00
|
|
|
/**
|
2014-05-06 08:50:55 +07:00
|
|
|
* Write part
|
2014-03-24 00:26:10 +07:00
|
|
|
*
|
2014-05-06 01:45:13 +07:00
|
|
|
* @return string
|
2014-03-24 00:26:10 +07:00
|
|
|
*/
|
2014-05-06 01:45:13 +07:00
|
|
|
public function write()
|
2014-03-22 10:06:08 +04:00
|
|
|
{
|
2014-03-30 16:31:01 +07:00
|
|
|
$xmlWriter = $this->getXmlWriter();
|
|
|
|
|
|
2014-03-22 10:06:08 +04:00
|
|
|
$xmlWriter->startDocument('1.0', 'UTF-8', 'yes');
|
|
|
|
|
$xmlWriter->startElement('w:styles');
|
2014-04-11 16:16:22 +07:00
|
|
|
$xmlWriter->writeAttribute('xmlns:r', 'http://schemas.openxmlformats.org/officeDocument/2006/relationships');
|
|
|
|
|
$xmlWriter->writeAttribute('xmlns:w', 'http://schemas.openxmlformats.org/wordprocessingml/2006/main');
|
|
|
|
|
|
2014-03-29 00:57:23 +07:00
|
|
|
// Write default styles
|
2014-03-22 10:06:08 +04:00
|
|
|
$styles = Style::getStyles();
|
2014-05-15 22:13:03 +07:00
|
|
|
$this->writeDefaultStyles($xmlWriter, $styles);
|
2014-04-11 16:16:22 +07:00
|
|
|
|
|
|
|
|
// Write styles
|
2014-03-22 10:06:08 +04:00
|
|
|
if (count($styles) > 0) {
|
|
|
|
|
foreach ($styles as $styleName => $style) {
|
|
|
|
|
if ($styleName == 'Normal') {
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
|
2014-05-25 22:51:14 +07:00
|
|
|
// Get style class and execute if the private method exists
|
|
|
|
|
$styleClass = substr(get_class($style), strrpos(get_class($style), '\\') + 1);
|
|
|
|
|
$method = "write{$styleClass}Style";
|
|
|
|
|
if (method_exists($this, $method)) {
|
|
|
|
|
$this->$method($xmlWriter, $styleName, $style);
|
2014-03-22 10:06:08 +04:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
$xmlWriter->endElement(); // w:styles
|
|
|
|
|
|
|
|
|
|
return $xmlWriter->getData();
|
|
|
|
|
}
|
|
|
|
|
|
2014-03-24 00:26:10 +07:00
|
|
|
/**
|
2014-07-03 15:40:24 +04:00
|
|
|
* Write default font and other default styles.
|
2014-03-24 00:26:10 +07:00
|
|
|
*
|
2016-01-23 19:16:34 +04:00
|
|
|
* @param \PhpOffice\Common\XMLWriter $xmlWriter
|
2014-05-18 16:48:15 +07:00
|
|
|
* @param \PhpOffice\PhpWord\Style\AbstractStyle[] $styles
|
2014-07-03 15:40:24 +04:00
|
|
|
* @return void
|
2014-03-24 00:26:10 +07:00
|
|
|
*/
|
2014-05-15 22:13:03 +07:00
|
|
|
private function writeDefaultStyles(XMLWriter $xmlWriter, $styles)
|
2014-03-22 10:06:08 +04:00
|
|
|
{
|
2014-05-16 01:22:34 +07:00
|
|
|
$fontName = PhpWordSettings::getDefaultFontName();
|
|
|
|
|
$fontSize = PhpWordSettings::getDefaultFontSize();
|
2014-03-22 10:06:08 +04:00
|
|
|
|
2014-03-29 00:57:23 +07:00
|
|
|
// Default font
|
2014-03-22 10:06:08 +04:00
|
|
|
$xmlWriter->startElement('w:docDefaults');
|
|
|
|
|
$xmlWriter->startElement('w:rPrDefault');
|
|
|
|
|
$xmlWriter->startElement('w:rPr');
|
|
|
|
|
$xmlWriter->startElement('w:rFonts');
|
|
|
|
|
$xmlWriter->writeAttribute('w:ascii', $fontName);
|
|
|
|
|
$xmlWriter->writeAttribute('w:hAnsi', $fontName);
|
|
|
|
|
$xmlWriter->writeAttribute('w:eastAsia', $fontName);
|
|
|
|
|
$xmlWriter->writeAttribute('w:cs', $fontName);
|
2014-03-29 00:57:23 +07:00
|
|
|
$xmlWriter->endElement(); // w:rFonts
|
2014-03-22 10:06:08 +04:00
|
|
|
$xmlWriter->startElement('w:sz');
|
|
|
|
|
$xmlWriter->writeAttribute('w:val', $fontSize * 2);
|
2014-03-29 00:57:23 +07:00
|
|
|
$xmlWriter->endElement(); // w:sz
|
2014-03-22 10:06:08 +04:00
|
|
|
$xmlWriter->startElement('w:szCs');
|
|
|
|
|
$xmlWriter->writeAttribute('w:val', $fontSize * 2);
|
2014-03-29 00:57:23 +07:00
|
|
|
$xmlWriter->endElement(); // w:szCs
|
|
|
|
|
$xmlWriter->endElement(); // w:rPr
|
|
|
|
|
$xmlWriter->endElement(); // w:rPrDefault
|
|
|
|
|
$xmlWriter->endElement(); // w:docDefaults
|
2014-03-22 10:06:08 +04:00
|
|
|
|
2014-03-29 00:57:23 +07:00
|
|
|
// Normal style
|
|
|
|
|
$xmlWriter->startElement('w:style');
|
|
|
|
|
$xmlWriter->writeAttribute('w:type', 'paragraph');
|
|
|
|
|
$xmlWriter->writeAttribute('w:default', '1');
|
|
|
|
|
$xmlWriter->writeAttribute('w:styleId', 'Normal');
|
|
|
|
|
$xmlWriter->startElement('w:name');
|
|
|
|
|
$xmlWriter->writeAttribute('w:val', 'Normal');
|
|
|
|
|
$xmlWriter->endElement(); // w:name
|
2014-10-10 21:10:29 +04:00
|
|
|
if (isset($styles['Normal'])) {
|
2014-04-26 11:14:27 +07:00
|
|
|
$styleWriter = new ParagraphStyleWriter($xmlWriter, $styles['Normal']);
|
|
|
|
|
$styleWriter->write();
|
2014-03-29 00:57:23 +07:00
|
|
|
}
|
|
|
|
|
$xmlWriter->endElement(); // w:style
|
|
|
|
|
|
|
|
|
|
// FootnoteReference style
|
2014-10-10 21:10:29 +04:00
|
|
|
if (!isset($styles['FootnoteReference'])) {
|
2014-03-29 00:57:23 +07:00
|
|
|
$xmlWriter->startElement('w:style');
|
|
|
|
|
$xmlWriter->writeAttribute('w:type', 'character');
|
|
|
|
|
$xmlWriter->writeAttribute('w:styleId', 'FootnoteReference');
|
|
|
|
|
$xmlWriter->startElement('w:name');
|
|
|
|
|
$xmlWriter->writeAttribute('w:val', 'Footnote Reference');
|
|
|
|
|
$xmlWriter->endElement(); // w:name
|
|
|
|
|
$xmlWriter->writeElement('w:semiHidden');
|
|
|
|
|
$xmlWriter->writeElement('w:unhideWhenUsed');
|
|
|
|
|
$xmlWriter->startElement('w:rPr');
|
|
|
|
|
$xmlWriter->startElement('w:vertAlign');
|
|
|
|
|
$xmlWriter->writeAttribute('w:val', 'superscript');
|
|
|
|
|
$xmlWriter->endElement(); // w:vertAlign
|
|
|
|
|
$xmlWriter->endElement(); // w:rPr
|
|
|
|
|
$xmlWriter->endElement(); // w:style
|
|
|
|
|
}
|
2014-03-22 10:06:08 +04:00
|
|
|
}
|
2014-05-25 22:51:14 +07:00
|
|
|
|
|
|
|
|
/**
|
2014-07-03 15:40:24 +04:00
|
|
|
* Write font style.
|
2014-05-25 22:51:14 +07:00
|
|
|
*
|
2016-01-23 19:16:34 +04:00
|
|
|
* @param \PhpOffice\Common\XMLWriter $xmlWriter
|
2014-05-25 22:51:14 +07:00
|
|
|
* @param string $styleName
|
|
|
|
|
* @param \PhpOffice\PhpWord\Style\Font $style
|
2014-07-03 15:40:24 +04:00
|
|
|
* @return void
|
2014-05-25 22:51:14 +07:00
|
|
|
*/
|
|
|
|
|
private function writeFontStyle(XMLWriter $xmlWriter, $styleName, FontStyle $style)
|
|
|
|
|
{
|
|
|
|
|
$paragraphStyle = $style->getParagraph();
|
|
|
|
|
$styleType = $style->getStyleType();
|
|
|
|
|
$type = ($styleType == 'title') ? 'paragraph' : 'character';
|
|
|
|
|
if (!is_null($paragraphStyle)) {
|
|
|
|
|
$type = 'paragraph';
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
$xmlWriter->startElement('w:style');
|
|
|
|
|
$xmlWriter->writeAttribute('w:type', $type);
|
|
|
|
|
|
|
|
|
|
// Heading style
|
|
|
|
|
if ($styleType == 'title') {
|
|
|
|
|
$arrStyle = explode('_', $styleName);
|
|
|
|
|
$styleId = 'Heading' . $arrStyle[1];
|
|
|
|
|
$styleName = 'heading ' . $arrStyle[1];
|
|
|
|
|
$styleLink = 'Heading' . $arrStyle[1] . 'Char';
|
|
|
|
|
$xmlWriter->writeAttribute('w:styleId', $styleId);
|
|
|
|
|
|
|
|
|
|
$xmlWriter->startElement('w:link');
|
|
|
|
|
$xmlWriter->writeAttribute('w:val', $styleLink);
|
|
|
|
|
$xmlWriter->endElement();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Style name
|
|
|
|
|
$xmlWriter->startElement('w:name');
|
|
|
|
|
$xmlWriter->writeAttribute('w:val', $styleName);
|
|
|
|
|
$xmlWriter->endElement();
|
|
|
|
|
|
|
|
|
|
// Parent style
|
|
|
|
|
$xmlWriter->writeElementIf(!is_null($paragraphStyle), 'w:basedOn', 'w:val', 'Normal');
|
|
|
|
|
|
|
|
|
|
// w:pPr
|
|
|
|
|
if (!is_null($paragraphStyle)) {
|
|
|
|
|
$styleWriter = new ParagraphStyleWriter($xmlWriter, $paragraphStyle);
|
|
|
|
|
$styleWriter->write();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// w:rPr
|
|
|
|
|
$styleWriter = new FontStyleWriter($xmlWriter, $style);
|
|
|
|
|
$styleWriter->write();
|
|
|
|
|
|
|
|
|
|
$xmlWriter->endElement();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
2014-07-03 15:40:24 +04:00
|
|
|
* Write paragraph style.
|
2014-05-25 22:51:14 +07:00
|
|
|
*
|
2016-01-23 19:16:34 +04:00
|
|
|
* @param \PhpOffice\Common\XMLWriter $xmlWriter
|
2014-05-25 22:51:14 +07:00
|
|
|
* @param string $styleName
|
|
|
|
|
* @param \PhpOffice\PhpWord\Style\Paragraph $style
|
2014-07-03 15:40:24 +04:00
|
|
|
* @return void
|
2014-05-25 22:51:14 +07:00
|
|
|
*/
|
|
|
|
|
private function writeParagraphStyle(XMLWriter $xmlWriter, $styleName, ParagraphStyle $style)
|
|
|
|
|
{
|
|
|
|
|
$xmlWriter->startElement('w:style');
|
|
|
|
|
$xmlWriter->writeAttribute('w:type', 'paragraph');
|
|
|
|
|
$xmlWriter->writeAttribute('w:customStyle', '1');
|
|
|
|
|
$xmlWriter->writeAttribute('w:styleId', $styleName);
|
|
|
|
|
$xmlWriter->startElement('w:name');
|
|
|
|
|
$xmlWriter->writeAttribute('w:val', $styleName);
|
|
|
|
|
$xmlWriter->endElement();
|
|
|
|
|
|
|
|
|
|
// Parent style
|
|
|
|
|
$basedOn = $style->getBasedOn();
|
|
|
|
|
$xmlWriter->writeElementIf(!is_null($basedOn), 'w:basedOn', 'w:val', $basedOn);
|
|
|
|
|
|
|
|
|
|
// Next paragraph style
|
|
|
|
|
$next = $style->getNext();
|
|
|
|
|
$xmlWriter->writeElementIf(!is_null($next), 'w:next', 'w:val', $next);
|
|
|
|
|
|
|
|
|
|
// w:pPr
|
|
|
|
|
$styleWriter = new ParagraphStyleWriter($xmlWriter, $style);
|
|
|
|
|
$styleWriter->write();
|
|
|
|
|
|
|
|
|
|
$xmlWriter->endElement();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
2014-07-03 15:40:24 +04:00
|
|
|
* Write table style.
|
2014-05-25 22:51:14 +07:00
|
|
|
*
|
2016-01-23 19:16:34 +04:00
|
|
|
* @param \PhpOffice\Common\XMLWriter $xmlWriter
|
2014-05-25 22:51:14 +07:00
|
|
|
* @param string $styleName
|
|
|
|
|
* @param \PhpOffice\PhpWord\Style\Table $style
|
2014-07-03 15:40:24 +04:00
|
|
|
* @return void
|
2014-05-25 22:51:14 +07:00
|
|
|
*/
|
|
|
|
|
private function writeTableStyle(XMLWriter $xmlWriter, $styleName, TableStyle $style)
|
|
|
|
|
{
|
|
|
|
|
$xmlWriter->startElement('w:style');
|
|
|
|
|
$xmlWriter->writeAttribute('w:type', 'table');
|
|
|
|
|
$xmlWriter->writeAttribute('w:customStyle', '1');
|
|
|
|
|
$xmlWriter->writeAttribute('w:styleId', $styleName);
|
|
|
|
|
$xmlWriter->startElement('w:name');
|
|
|
|
|
$xmlWriter->writeAttribute('w:val', $styleName);
|
|
|
|
|
$xmlWriter->endElement();
|
|
|
|
|
$xmlWriter->startElement('w:uiPriority');
|
|
|
|
|
$xmlWriter->writeAttribute('w:val', '99');
|
|
|
|
|
$xmlWriter->endElement();
|
|
|
|
|
|
|
|
|
|
$styleWriter = new TableStyleWriter($xmlWriter, $style);
|
|
|
|
|
$styleWriter->write();
|
|
|
|
|
|
|
|
|
|
$xmlWriter->endElement(); // w:style
|
|
|
|
|
}
|
2014-03-23 17:37:26 +07:00
|
|
|
}
|