PHPWord/src/PhpWord/Writer/RTF/Part/Document.php

143 lines
4.1 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.
*
* @link https://github.com/PHPOffice/PHPWord
* @copyright 2010-2014 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\Writer\RTF\Element\Container;
/**
* RTF document part writer
*
* @since 0.11.0
*/
class Document extends AbstractPart
{
/**
* Write part
*
* @return string
*/
public function write()
{
$content = '';
$content .= $this->writeInfo();
$content .= $this->writeFormatting();
$content .= $this->writeSections();
return $content;
}
/**
* Write document information
*
* @return string
*/
private function writeInfo()
{
$docProps = $this->getParentWriter()->getPhpWord()->getDocumentProperties();
$properties = array('title', 'subject', 'category', 'keywords', 'comment',
'author', 'operator', 'creatim', 'revtim', 'company', 'manager');
$mapping = array('comment' => 'description', 'author' => 'creator', 'operator' => 'lastModifiedBy',
'creatim' => 'created', 'revtim' => 'modified');
$dateFields = array('creatim', 'revtim');
$content = '';
$content .= '{';
$content .= '\info';
foreach ($properties as $property) {
$method = 'get' . (array_key_exists($property, $mapping) ? $mapping[$property] : $property);
$value = $docProps->$method();
$value = in_array($property, $dateFields) ? $this->getDateValue($value) : $value;
$content .= "{\\{$property} {$value}}";
}
$content .= '}';
$content .= PHP_EOL;
return $content;
}
/**
* Write document formatting properties
*
* @return string
*/
private function writeFormatting()
{
$content = '';
$content .= '\deftab720'; // Set the default tab size (720 twips)
$content .= '\viewkind1'; // Set the view mode of the document
$content .= '\uc1'; // Set the numberof bytes that follows a unicode character
$content .= '\pard'; // Resets to default paragraph properties.
$content .= '\nowidctlpar'; // No widow/orphan control
$content .= '\lang1036'; // Applies a language to a text run (1036 : French (France))
$content .= '\kerning1'; // Point size (in half-points) above which to kern character pairs
$content .= '\fs' . (Settings::getDefaultFontSize() * 2); // Set the font size in half-points
$content .= PHP_EOL;
return $content;
}
/**
* Write sections
*
* @return string
*/
private function writeSections()
{
$content = '';
$sections = $this->getParentWriter()->getPhpWord()->getSections();
foreach ($sections as $section) {
$writer = new Container($this->getParentWriter(), $section);
$content .= $writer->write();
}
return $content;
}
/**
* Get date value
*
* The format of date value is `\yr?\mo?\dy?\hr?\min?\sec?`
*
* @param int $value
* @return string
*/
private function getDateValue($value)
{
$dateParts = array(
'Y' => 'yr',
'm' => 'mo',
'd' => 'dy',
'H' => 'hr',
'i' => 'min',
's' => 'sec',
);
$result = '';
foreach ($dateParts as $dateFormat => $controlWord) {
$result .= '\\' . $controlWord . date($dateFormat, $value);
}
return $result;
}
}