2023-05-16 10:47:08 +08:00

256 lines
5.9 KiB
PHP

<?php
/**
* 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.
*
* @see https://github.com/PHPOffice/PHPWord
* @copyright 2010-2018 PHPWord contributors
* @license http://www.gnu.org/licenses/lgpl.txt LGPL version 3
*/
namespace PhpOffice\PhpWord\Writer\RTF\Part;
use PhpOffice\PhpWord\Settings;
use PhpOffice\PhpWord\Shared\Converter;
use PhpOffice\PhpWord\Style;
use PhpOffice\PhpWord\Style\Font;
/**
* RTF header part writer
*
* - Character set
* - Font table
* - File table (not supported yet)
* - Color table
* - Style sheet (not supported yet)
* - List table (not supported yet)
*
* @since 0.11.0
* @see http://www.biblioscape.com/rtf15_spec.htm#Heading6
*/
class Header extends AbstractPart
{
/**
* Font table
*
* @var array
*/
private $fontTable = array();
/**
* Color table
*
* @var array
*/
private $colorTable = array();
/**
* Get font table.
*
* @return array
*/
public function getFontTable()
{
return $this->fontTable;
}
/**
* Get color table.
*
* @return array
*/
public function getColorTable()
{
return $this->colorTable;
}
/**
* Write part
*
* @return string
*/
public function write()
{
$this->registerFont();
$content = '';
$content .= $this->writeCharset();
$content .= $this->writeDefaults();
$content .= $this->writeFontTable();
$content .= $this->writeColorTable();
$content .= $this->writeGenerator();
$content .= PHP_EOL;
return $content;
}
/**
* Write character set
*
* @return string
*/
private function writeCharset()
{
$content = '';
$content .= '\ansi';
$content .= '\ansicpg1252';
$content .= PHP_EOL;
return $content;
}
/**
* Write header defaults
*
* @return string
*/
private function writeDefaults()
{
$content = '';
$content .= '\deff0';
$content .= PHP_EOL;
return $content;
}
/**
* Write font table
*
* @return string
*/
private function writeFontTable()
{
$content = '';
$content .= '{';
$content .= '\fonttbl';
foreach ($this->fontTable as $index => $font) {
$content .= "{\\f{$index}\\fnil\\fcharset0 {$font};}";
}
$content .= '}';
$content .= PHP_EOL;
return $content;
}
/**
* Write color table
*
* @return string
*/
private function writeColorTable()
{
$content = '';
$content .= '{';
$content .= '\colortbl;';
foreach ($this->colorTable as $color) {
list($red, $green, $blue) = Converter::htmlToRgb($color);
$content .= "\\red{$red}\\green{$green}\\blue{$blue};";
}
$content .= '}';
$content .= PHP_EOL;
return $content;
}
/**
* Write
*
* @return string
*/
private function writeGenerator()
{
$content = '';
$content .= '{\*\generator PHPWord;}'; // Set the generator
$content .= PHP_EOL;
return $content;
}
/**
* Register all fonts and colors in both named and inline styles to appropriate header table.
*/
private function registerFont()
{
$phpWord = $this->getParentWriter()->getPhpWord();
$this->fontTable[] = Settings::getDefaultFontName();
// Search named styles
$styles = Style::getStyles();
foreach ($styles as $style) {
$this->registerFontItems($style);
}
// Search inline styles
$sections = $phpWord->getSections();
foreach ($sections as $section) {
$elements = $section->getElements();
$this->registerBorderColor($section->getStyle());
foreach ($elements as $element) {
if (method_exists($element, 'getFontStyle')) {
$style = $element->getFontStyle();
$this->registerFontItems($style);
}
}
}
}
/**
* Register border colors.
*
* @param \PhpOffice\PhpWord\Style\Border $style
*/
private function registerBorderColor($style)
{
$colors = $style->getBorderColor();
foreach ($colors as $color) {
if ($color !== null) {
$this->registerTableItem($this->colorTable, $color);
}
}
}
/**
* Register fonts and colors.
*
* @param \PhpOffice\PhpWord\Style\AbstractStyle $style
*/
private function registerFontItems($style)
{
$defaultFont = Settings::getDefaultFontName();
$defaultColor = Settings::DEFAULT_FONT_COLOR;
if ($style instanceof Font) {
$this->registerTableItem($this->fontTable, $style->getName(), $defaultFont);
$this->registerTableItem($this->colorTable, $style->getColor(), $defaultColor);
$this->registerTableItem($this->colorTable, $style->getFgColor(), $defaultColor);
}
}
/**
* Register individual font and color.
*
* @param array &$table
* @param string $value
* @param string $default
*/
private function registerTableItem(&$table, $value, $default = null)
{
if (in_array($value, $table) === false && $value !== null && $value != $default) {
$table[] = $value;
}
}
}