1
0
Fork 0
mirror of https://github.com/YunoHost-Apps/webtrees_ynh.git synced 2024-09-03 18:26:37 +02:00
webtrees_ynh/sources/app/Report/ReportBase.php

475 lines
14 KiB
PHP

<?php
/**
* webtrees: online genealogy
* Copyright (C) 2016 webtrees development team
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
* This program 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 General Public License for more details.
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
namespace Fisharebest\Webtrees\Report;
use Fisharebest\Webtrees\I18N;
/**
* Class ReportBase
*/
class ReportBase {
/** User measure unit. */
const UNITS = 'pt';
/** webtrees URL */
const WT_URL = WT_WEBTREES_URL;
/** @var float Left Margin (expressed in points) Default: 17.99 mm, 0.7083 inch */
public $leftmargin = 51.0;
/** @var float Right Margin (expressed in points) Default: 9.87 mm, 0.389 inch */
public $rightmargin = 28.0;
/** @var float Top Margin (expressed in points) Default: 26.81 mm */
public $topmargin = 76.0;
/** @var float Bottom Margin (expressed in points) Default: 21.6 mm */
public $bottommargin = 60.0;
/** @var float Header Margin (expressed in points) Default: 4.93 mm */
public $headermargin = 14.0;
/** @var float Footer Margin (expressed in points) Default: 9.88 mm, 0.389 inch */
public $footermargin = 28.0;
/** @var string Page orientation (portrait, landscape) */
public $orientation = 'portrait';
/** @var string Page format name */
public $pageFormat = 'A4';
/** @var float Height of page format in points */
public $pageh = 0.0;
/** @var float Width of page format in points */
public $pagew = 0.0;
/** @var string[][] An array of the Styles elements found in the document */
public $Styles = array();
/** @var string The default Report font name */
public $defaultFont = 'dejavusans';
/** @var int The default Report font size */
public $defaultFontSize = 12;
/** @var string Header (H), Page header (PH), Body (B) or Footer (F) */
public $processing = 'H';
/** @var bool RTL Language (false=LTR, true=RTL) */
public $rtl = false;
/** @var bool Show the Generated by... (true=show the text) */
public $showGenText = true;
/** @var string Generated By... text */
public $generatedby = '';
/** @var string The report title */
public $title = '';
/** @var string Author of the report, the users full name */
public $rauthor = WT_BASE_URL;
/** @var string Keywords */
public $rkeywords = '';
/** @var string Report Description / Subject */
public $rsubject = '';
/**
* Initial Setup - ReportBase
*
* Setting up document wide defaults that will be inherited of the report modules
* As DEFAULT A4 and Portrait will be used if not set
*/
public function setup() {
// Set RTL direction
if (I18N::direction() === 'rtl') {
$this->rtl = true;
}
// Set the Keywords
$this->rkeywords = '';
// Generated By...text
// I18N: This is a report footer. %s is the name of the application.
$this->generatedby = I18N::translate('Generated by %s', WT_WEBTREES . ' ' . WT_VERSION);
// For known size pages
if ($this->pagew == 0 && $this->pageh == 0) {
/**
* The current ISO 216 standard was introduced in 1975 and is a direct follow up to the german DIN 476 standard from 1922. ISO 216 is also called EN 20216 in Europe.
* The ISO paper sizes are based on the metric system so everything else is aproxiamte
*
* The Series A is used for Standard Printing and Stationary.
* The Series B is used for Posters, Wall-Charts etc.
* The C series is used for folders, post cards and envelopes. C series envelope is suitable to insert A series sizes.
* ISO also define format series RA and SRA for untrimmed raw paper, where SRA stands for 'supplementary raw format A'.
* Japan has adopted the ISO series A sizes, but its series B sizes are slightly different. These sizes are sometimes called JIS B or JB sizes.
* sun was a unit of length used in Japan and is equal to about 3.03 cm or 1.193 inches
* The United States, Canada, and in part Mexico, are today the only industrialized nations in which the ISO standard paper sizes are not yet widely used.
*
* A0 & A1 Technical drawings, posters
* A1 & A2 Flip charts
* A2 & A3 Drawings, diagrams, large tables
* A4 Letters, magazines, forms, catalogs, laser printer and copying machine output
* A5 Note pads
* A6 Postcards
* B5, A5, B6 A6 Books
* C4, C5, C6 Envelopes for A4 letters: unfolded (C4), folded once (C5), folded twice (C6)
* B4 & A3 Newspapers, supported by most copying machines in addition to A4
* B8 & A8 Playing cards
*
* 1 inch = 72 points
* 1 mm = 2.8346457 points
* 1 inch = 25.4 mm
* 1 point = 0,35278 mm
*/
switch ($this->pageFormat) {
// ISO A series
case '4A0': // ISO 216, 1682 mm x 2378 mm
$sizes = array(4767.86, 6740.79);
break;
case '2A0': // ISO 216, 1189 mm x 1682 mm
$sizes = array(3370.39, 4767.86);
break;
case 'A0': // ISO 216, 841 mm x 1189mm
$sizes = array(2383.94, 3370.39);
break;
case 'A1': // ISO 216, 594 mm x 841 mm
$sizes = array(1683.78, 2383.94);
break;
case 'A2': // ISO 216, 420 mm x 594 mm
$sizes = array(1190.55, 1683.78);
break;
case 'A3': // ISO 216, 297 mm x 420 mm
$sizes = array(841.89, 1190.55);
break;
case 'A4': // ISO 216, 210 mm 297 mm
$sizes = array(595.28, 841.89);
break;
case 'A5': // ISO 216, 148 mm x 210 mm
$sizes = array(419.53, 595.28);
break;
case 'A6': // ISO 216, 105 mm x 148 mm
$sizes = array(297.64, 419.53);
break;
case 'A7': // ISO 216, 74 mm x 105 mm
$sizes = array(209.76, 297.64);
break;
case 'A8': // ISO 216, 52 mm x 74 mm
$sizes = array(147.40, 209.76);
break;
case 'A9': // ISO 216, 37 mm x 52 mm
$sizes = array(104.88, 147.40);
break;
case 'A10': // ISO 216, 26 mm x 37 mm
$sizes = array(73.70, 104.88);
break;
// ISO B series
case 'B0': // ISO 216, 1000 mm x 1414 mm
$sizes = array(2834.65, 4008.19);
break;
case 'B1': // ISO 216, 707 mm x 1000 mm
$sizes = array(2004.09, 2834.65);
break;
case 'B2': // ISO 216, 500 mm x 707 mm
$sizes = array(1417.32, 2004.09);
break;
case 'B3': // ISO 216, 353 mm x 500 mm
$sizes = array(1000.63, 1417.32);
break;
case 'B4': // ISO 216, 250 mm x 353 mm
$sizes = array(708.66, 1000.63);
break;
case 'B5': // ISO 216, 176 mm x 250 mm
$sizes = array(498.90, 708.66);
break;
case 'B6': // ISO 216, 125 mm x 176 mm
$sizes = array(354.33, 498.90);
break;
case 'B7': // ISO 216, 88 mm x 125 mm
$sizes = array(249.45, 354.33);
break;
case 'B8': // ISO 216, 62 mm x 88 mm
$sizes = array(175.75, 249.45);
break;
case 'B9': // ISO 216, 44 mm x 62 mm
$sizes = array(124.72, 175.75);
break;
case 'B10': // ISO 216, 31 mm x 44 mm
$sizes = array(87.87, 124.72);
break;
// ISO C series, Envelope
case 'C0': // ISO 269, 917 mm x 1297 mm, For flat A0 sheet
$sizes = array(2599.37, 3676.54);
break;
case 'C1': // ISO 269, 648 mm x 917 mm, For flat A1 sheet
$sizes = array(1836.85, 2599.37);
break;
case 'C2': // ISO 269, 458 mm x 648 mm, For flat A2 sheet, A1 folded in half
$sizes = array(1298.27, 1836.85);
break;
case 'C3': // ISO 269, 324 mm x 458 mm, For flat A3 sheet, A2 folded in half
$sizes = array(918.43, 1298.27);
break;
case 'C4': // ISO 269, 229 mm x 324 mm, For flat A4 sheet, A3 folded in half
$sizes = array(649.13, 918.43);
break;
case 'C5': // ISO 269, 162 mm x 229 mm, For flat A5 sheet, A4 folded in half
$sizes = array(459.21, 649.13);
break;
case 'C6/5': // ISO 269, 114 mm x 229 mm. A5 folded twice = 1/3 A4. Alternative for the DL envelope
$sizes = array(323.15, 649.13);
break;
case 'C6': // ISO 269, 114 mm x 162 mm, For A5 folded in half
$sizes = array(323.15, 459.21);
break;
case 'C7/6': // ISO 269, 81 mm x 162 mm, For A5 sheet folded in thirds
$sizes = array(229.61, 459.21);
break;
case 'C7': // ISO 269, 81 mm x 114 mm, For A5 folded in quarters
$sizes = array(229.61, 323.15);
break;
case 'C8': // ISO 269, 57 mm x 81 mm
$sizes = array(161.57, 229.61);
break;
case 'C9': // ISO 269, 40 mm x 57 mm
$sizes = array(113.39, 161.57);
break;
case 'C10': // ISO 269, 28 mm x 40 mm
$sizes = array(79.37, 113.39);
break;
case 'DL': // Original DIN 678 but ISO 269 now has this C6/5 , 110 mm x 220 mm, For A4 sheet folded in thirds, A5 in half
$sizes = array(311.81, 623.62);
break;
// Untrimmed stock sizes for the ISO-A Series - ISO primary range
case 'RA0': // ISO 478, 860 mm x 1220 mm
$sizes = array(2437.80, 3458.27);
break;
case 'RA1': // ISO 478, 610 mm x 860 mm
$sizes = array(1729.13, 2437.80);
break;
case 'RA2': // ISO 478, 430 mm x 610 mm
$sizes = array(1218.90, 1729.13);
break;
case 'RA3': // ISO 478, 305 mm x 430 mm
$sizes = array(864.57, 1218.90);
break;
case 'RA4': // ISO 478, 215 mm x 305 mm
$sizes = array(609.45, 864.57);
break;
// Untrimmed stock sizes for the ISO-A Series - ISO supplementary range
case 'SRA0': // ISO 593, 900 mm x 1280 mm
$sizes = array(2551.18, 3628.35);
break;
case 'SRA1': // ISO 593, 640 mm x 900 mm
$sizes = array(1814.17, 2551.18);
break;
case 'SRA2': // ISO 593, 450 mm x 640 mm
$sizes = array(1275.59, 1814.17);
break;
case 'SRA3': // ISO 593, 320 mm x 450 mm
$sizes = array(907.09, 1275.59);
break;
case 'SRA4': // ISO 593, 225 mm x 320 mm
$sizes = array(637.80, 907.09);
break;
// ISO size variations
case 'A2EXTRA': // ISO 216, 445 mm x 619 mm
$sizes = array(1261.42, 1754.65);
break;
case 'A2SUPER': // ISO 216, 305 mm x 508 mm
$sizes = array(864.57, 1440.00);
break;
case 'A3EXTRA': // ISO 216, 322 mm x 445 mm
$sizes = array(912.76, 1261.42);
break;
case 'SUPERA3': // ISO 216, 305 mm x 487 mm
$sizes = array(864.57, 1380.47);
break;
case 'A4EXTRA': // ISO 216, 235 mm x 322 mm
$sizes = array(666.14, 912.76);
break;
case 'A4LONG': // ISO 216, 210 mm x 348 mm
$sizes = array(595.28, 986.46);
break;
case 'A4SUPER': // ISO 216, 229 mm x 322 mm
$sizes = array(649.13, 912.76);
break;
case 'SUPERA4': // ISO 216, 227 mm x 356 mm
$sizes = array(643.46, 1009.13);
break;
case 'A5EXTRA': // ISO 216, 173 mm x 235 mm
$sizes = array(490.39, 666.14);
break;
case 'SOB5EXTRA': // ISO 216, 202 mm x 276 mm
$sizes = array(572.60, 782.36);
break;
// Japanese version of the ISO 216 B series
case 'JB0': // JIS P 0138-61, 1030 mm x 1456 mm
$sizes = array(2919.69, 4127.24);
break;
case 'JB1': // JIS P 0138-61, 728 mm x 1030 mm
$sizes = array(2063.62, 2919.69);
break;
case 'JB2': // JIS P 0138-61, 515 mm x 728 mm
$sizes = array(1459.84, 2063.62);
break;
case 'JB3': // JIS P 0138-61, 364 mm x 515 mm
$sizes = array(1031.81, 1459.84);
break;
case 'JB4': // JIS P 0138-61, 257 mm x 364 mm
$sizes = array(728.50, 1031.81);
break;
case 'JB5': // JIS P 0138-61, 182 mm x 257 mm
$sizes = array(515.91, 728.50);
break;
case 'JB6': // JIS P 0138-61, 128 mm x 182 mm
$sizes = array(362.83, 515.91);
break;
case 'JB7': // JIS P 0138-61, 91 mm x 128 mm
$sizes = array(257.95, 362.83);
break;
case 'JB8': // JIS P 0138-61, 64 mm x 91 mm
$sizes = array(181.42, 257.95);
break;
case 'JB9': // JIS P 0138-61, 45 mm x 64 mm
$sizes = array(127.56, 181.42);
break;
case 'JB10': // JIS P 0138-61, 32 mm x 45 mm
$sizes = array(90.71, 127.56);
break;
// US pages
case 'EXECUTIVE': // 7.25 in x 10.5 in
$sizes = array(522.00, 756.00);
break;
case 'FOLIO': // 8.5 in x 13 in
$sizes = array(612.00, 936.00);
break;
case 'FOOLSCAP': // 13.5 in x 17 in
$sizes = array(972.00, 1224.00);
break;
case 'LEDGER': // 11 in x 17 in
$sizes = array(792.00, 1224.00);
break;
case 'LEGAL': // 8.5 in x 14 in
$sizes = array(612.00, 1008.00);
break;
case 'LETTER': // 8.5 in x 11 in
$sizes = array(612.00, 792.00);
break;
case 'QUARTO': // 8.46 in x 10.8 in
$sizes = array(609.12, 777.50);
break;
case 'STATEMENT': // 5.5 in x 8.5 in
$sizes = array(396.00, 612.00);
break;
case 'USGOVT': // 8 in x 11 in
$sizes = array(576.00, 792.00);
break;
default:
$this->pageFormat = 'A4';
$sizes = array(595.28, 841.89);
break;
}
$this->pagew = $sizes[0];
$this->pageh = $sizes[1];
} else {
if ($this->pagew < 10) {
throw new \DomainException('REPORT ERROR ReportBase::setup(): For custom size pages you must set "customwidth" larger then this in the XML file');
}
if ($this->pageh < 10) {
throw new \DomainException('REPORT ERROR ReportBase::setup(): For custom size pages you must set "customheight" larger then this in the XML file');
}
}
return 0;
}
/**
* Process the Header , Page header, Body or Footer - ReportBase
*
* @param string $p Header (H), Page header (PH), Body (B) or Footer (F)
*
* @return int
*/
public function setProcessing($p) {
$this->processing = $p;
return 0;
}
/**
* Add the Title when raw character data is used in Title - ReportBase
*
* @param string $data
*
* @return int
*/
public function addTitle($data) {
$this->title .= $data;
return 0;
}
/**
* Add the Description when raw character data is used in Description - ReportBase
*
* @param string $data
*
* @return int
*/
public function addDescription($data) {
$this->rsubject .= $data;
return 0;
}
/**
* Add Style to Styles array - ReportBase
*
* @param array $style
*
* @return int
*/
public function addStyle($style) {
$this->Styles[$style['name']] = $style;
return 0;
}
/**
* Get a style from the Styles array - ReportBase
*
* @param string $s Style name
*
* @return array
*/
public function getStyle($s) {
if (!isset($this->Styles[$s])) {
return current($this->Styles);
}
return $this->Styles[$s];
}
}