AutorÃa | Ultima modificación | Ver Log |
<?phpdeclare(strict_types=1);namespace OpenSpout\Writer\Common\Manager\Style;use OpenSpout\Common\Entity\Cell;use OpenSpout\Common\Entity\Style\Style;/*** @internal*/abstract class AbstractStyleManager implements StyleManagerInterface{/** @var AbstractStyleRegistry Registry for all used styles */protected AbstractStyleRegistry $styleRegistry;public function __construct(AbstractStyleRegistry $styleRegistry){$this->styleRegistry = $styleRegistry;}/*** Registers the given style as a used style.* Duplicate styles won't be registered more than once.** @param Style $style The style to be registered** @return Style the registered style, updated with an internal ID*/final public function registerStyle(Style $style): Style{return $this->styleRegistry->registerStyle($style);}/*** Apply additional styles if the given row needs it.* Typically, set "wrap text" if a cell contains a new line.** @return PossiblyUpdatedStyle The eventually updated style*/final public function applyExtraStylesIfNeeded(Cell $cell): PossiblyUpdatedStyle{return $this->applyWrapTextIfCellContainsNewLine($cell);}/*** Returns the default style.** @return Style Default style*/final protected function getDefaultStyle(): Style{// By construction, the default style has ID 0return $this->styleRegistry->getRegisteredStyles()[0];}/*** Set the "wrap text" option if a cell of the given row contains a new line.** @NOTE: There is a bug on the Mac version of Excel (2011 and below) where new lines* are ignored even when the "wrap text" option is set. This only occurs with* inline strings (shared strings do work fine).* A workaround would be to encode "\n" as "_x000D_" but it does not work* on the Windows version of Excel...** @param Cell $cell The cell the style should be applied to** @return PossiblyUpdatedStyle The eventually updated style*/private function applyWrapTextIfCellContainsNewLine(Cell $cell): PossiblyUpdatedStyle{$cellStyle = $cell->getStyle();// if the "wrap text" option is already set, no-opif (!$cellStyle->hasSetWrapText() && $cell instanceof Cell\StringCell && str_contains($cell->getValue(), "\n")) {$cellStyle->setShouldWrapText();return new PossiblyUpdatedStyle($cellStyle, true);}return new PossiblyUpdatedStyle($cellStyle, false);}}