Changes
This commit is contained in:
@@ -0,0 +1,6 @@
|
||||
location / {
|
||||
if (!-e $request_filename) {
|
||||
rewrite ^(.*)$ /index.php?s=$1 last;
|
||||
break;
|
||||
}
|
||||
}
|
||||
4
sql/article_main_ref_check_status.sql
Normal file
4
sql/article_main_ref_check_status.sql
Normal file
@@ -0,0 +1,4 @@
|
||||
-- 分节(t_article_main)引用校对总结果:明细仍在 t_reference_check_result(如 [70-73] 四条)
|
||||
ALTER TABLE `t_article_main`
|
||||
ADD COLUMN `ref_check_status` tinyint(1) NOT NULL DEFAULT 0
|
||||
COMMENT '引用校对总结果: 0未检测 1通过 2未通过 3检测中' AFTER `content`;
|
||||
28
sql/reference_check_result.sql
Normal file
28
sql/reference_check_result.sql
Normal file
@@ -0,0 +1,28 @@
|
||||
-- 单条引用检测结果(如 <blue>[70-73]</blue> 展开为 reference_no=70,71,72,73 共 4 行)
|
||||
-- 分节是否通过见 t_article_main.ref_check_status
|
||||
CREATE TABLE IF NOT EXISTS `t_reference_check_result` (
|
||||
`check_id` int(11) unsigned NOT NULL AUTO_INCREMENT,
|
||||
`article_id` int(11) NOT NULL DEFAULT 0 COMMENT 't_article.article_id',
|
||||
`am_id` int(11) NOT NULL DEFAULT 0 COMMENT 't_article_main.am_id',
|
||||
`p_article_id` int(11) NOT NULL DEFAULT 0,
|
||||
`p_refer_id` int(11) NOT NULL DEFAULT 0 COMMENT 't_production_article_refer.p_refer_id',
|
||||
`refer_index` int(11) NOT NULL DEFAULT 0 COMMENT 'refer.index,正文序号=index+1',
|
||||
`reference_no` int(11) NOT NULL DEFAULT 0 COMMENT 'blue 括号内序号 n,对应 index=n-1',
|
||||
`reference_raw` varchar(64) NOT NULL DEFAULT '' COMMENT '如 70-73',
|
||||
`cite_tag_start` int(11) NOT NULL DEFAULT 0 COMMENT 'blue标签起始字节偏移',
|
||||
`cite_tag_end` int(11) NOT NULL DEFAULT 0 COMMENT 'blue标签结束字节偏移',
|
||||
`text_start` int(11) NOT NULL DEFAULT 0 COMMENT '引用句起始字节偏移',
|
||||
`text_end` int(11) NOT NULL DEFAULT 0 COMMENT '引用句结束字节偏移',
|
||||
`content_a` text COMMENT '引用处上下文(正文)',
|
||||
`content_b` text COMMENT '参考文献条目文本',
|
||||
`is_match` tinyint(1) NOT NULL DEFAULT 0,
|
||||
`confidence` decimal(6,4) NOT NULL DEFAULT 0.0000,
|
||||
`reason` varchar(512) NOT NULL DEFAULT '',
|
||||
`status` tinyint(1) NOT NULL DEFAULT 0 COMMENT '0待处理 1完成 2失败',
|
||||
`error_msg` varchar(512) NOT NULL DEFAULT '',
|
||||
`created_at` datetime DEFAULT NULL,
|
||||
`updated_at` datetime DEFAULT NULL,
|
||||
PRIMARY KEY (`check_id`),
|
||||
KEY `idx_article_status` (`article_id`,`status`),
|
||||
KEY `idx_p_refer` (`p_refer_id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='引用文献 LLM 校对结果';
|
||||
7
sql/reference_check_result_alter_positions.sql
Normal file
7
sql/reference_check_result_alter_positions.sql
Normal file
@@ -0,0 +1,7 @@
|
||||
-- 为预览标记增加原文位置字段([70-73] 展开为 4 条时共用 cite_tag_* / text_*)
|
||||
ALTER TABLE `t_reference_check_result`
|
||||
ADD COLUMN `cite_tag_start` int(11) NOT NULL DEFAULT 0 COMMENT 'blue标签起始字节偏移' AFTER `reference_raw`,
|
||||
ADD COLUMN `cite_tag_end` int(11) NOT NULL DEFAULT 0 COMMENT 'blue标签结束字节偏移' AFTER `cite_tag_start`,
|
||||
ADD COLUMN `text_start` int(11) NOT NULL DEFAULT 0 COMMENT '引用句起始字节偏移' AFTER `cite_tag_end`,
|
||||
ADD COLUMN `text_end` int(11) NOT NULL DEFAULT 0 COMMENT '引用句结束字节偏移' AFTER `text_start`,
|
||||
ADD KEY `idx_am_cite` (`am_id`,`cite_tag_start`,`reference_no`);
|
||||
3
sql/reference_check_result_can_support.sql
Normal file
3
sql/reference_check_result_can_support.sql
Normal file
@@ -0,0 +1,3 @@
|
||||
-- 引用校对:是否能支撑(与 is_match 同步,便于前端单独展示)
|
||||
ALTER TABLE `t_article_reference_check_result`
|
||||
ADD COLUMN `can_support` tinyint(1) NOT NULL DEFAULT 0 COMMENT '文献能否支撑正文引用句 0否1是' AFTER `is_match`;
|
||||
@@ -25,7 +25,7 @@ class Redis extends Driver
|
||||
protected $options = [
|
||||
'host' => '127.0.0.1',
|
||||
'port' => 6379,
|
||||
'password' => 'Jgll2015',
|
||||
'password' => '',
|
||||
'select' => 0,
|
||||
'timeout' => 0,
|
||||
'expire' => 0,
|
||||
|
||||
237
vendor/aliemail/email.php
vendored
237
vendor/aliemail/email.php
vendored
@@ -1,237 +0,0 @@
|
||||
<?php
|
||||
/**
|
||||
* email smtp (support php7)
|
||||
*
|
||||
*/
|
||||
class Smtp
|
||||
{
|
||||
/* Public Variables */
|
||||
public $smtp_port;
|
||||
public $time_out;
|
||||
public $host_name;
|
||||
public $log_file;
|
||||
public $relay_host;
|
||||
public $debug;
|
||||
public $auth;
|
||||
public $user;
|
||||
public $pass;
|
||||
/* Private Variables */
|
||||
private $sock;
|
||||
/* Constractor */
|
||||
function __construct($relay_host = "", $smtp_port = 80,$auth = false,$user,$pass)
|
||||
{
|
||||
$this->debug = FALSE;
|
||||
$this->smtp_port = $smtp_port;
|
||||
$this->relay_host = $relay_host;
|
||||
$this->time_out = 30; //is used in fsockopen()
|
||||
$this->auth = $auth;//auth
|
||||
$this->user = $user;
|
||||
$this->pass = $pass;
|
||||
$this->host_name = "localhost"; //is used in HELO command
|
||||
$this->log_file = "";
|
||||
$this->sock = FALSE;
|
||||
}
|
||||
|
||||
/* Main Function */
|
||||
function sendmail($to, $from, $subject, $body, $mailtype, $cc, $bcc, $additional_headers, $fromUser, $replyToAddress)
|
||||
{
|
||||
$mail_from = $this->get_address($this->strip_comment($from));
|
||||
$body = preg_replace("/(^|(\r\n))(\.)/", "\1.\3", $body);
|
||||
$header = "MIME-Version:1.0\r\n";
|
||||
if($mailtype=="HTML"){
|
||||
$header .= "Content-Type:text/html; charset=utf-8\r\n";
|
||||
}
|
||||
$header .= "To: ".$to."\r\n";
|
||||
if ($cc != "") {
|
||||
$header .= "Cc: ".$cc."\r\n";
|
||||
}
|
||||
$header .= "From: $fromUser<".$from.">\r\n";
|
||||
$header .= "Subject: ".$subject."\r\n";
|
||||
$header .= "Reply-To: ".$replyToAddress."\r\n";
|
||||
$header .= $additional_headers;
|
||||
$header .= "Date: ".date("r")."\r\n";
|
||||
$header .= "X-Mailer:By Redhat (PHP/".phpversion().")\r\n";
|
||||
list($msec, $sec) = explode(" ", microtime());
|
||||
$header .= "Message-ID: <".date("YmdHis", $sec).".".($msec*1000000).".".$mail_from.">\r\n";
|
||||
//若需要开启邮件跟踪服务,请使用以下代码设置跟踪链接头。前置条件和约束见文档"如何开启数据跟踪功能?"
|
||||
//$header .= "Content-Transfer-Encoding: quoted-printable\r\n";
|
||||
//$header .= "X-AliDM-Trace: ". base64_encode(json_encode(['TagName'=>'用户创建的Tag','OpenTrace'=>"1"]))."\r\n";
|
||||
$TO = explode(",", $this->strip_comment($to));
|
||||
if ($cc != "") {
|
||||
$TO = array_merge($TO, explode(",", $this->strip_comment($cc)));
|
||||
}
|
||||
if ($bcc != "") {
|
||||
$TO = array_merge($TO, explode(",", $this->strip_comment($bcc)));
|
||||
}
|
||||
$sent = TRUE;
|
||||
foreach ($TO as $rcpt_to) {
|
||||
$rcpt_to = $this->get_address($rcpt_to);
|
||||
if (!$this->smtp_sockopen($rcpt_to)) {
|
||||
$this->log_write("Error: Cannot send email to ".$rcpt_to."\n");
|
||||
$sent = FALSE;
|
||||
continue;
|
||||
}
|
||||
if ($this->smtp_send($this->host_name, $mail_from, $rcpt_to, $header, $body)) {
|
||||
$this->log_write("E-mail has been sent to <".$rcpt_to.">\n");
|
||||
} else {
|
||||
$this->log_write("Error: Cannot send email to <".$rcpt_to.">\n");
|
||||
$sent = FALSE;
|
||||
}
|
||||
fclose($this->sock);
|
||||
$this->log_write("Disconnected from remote host\n");
|
||||
}
|
||||
return $sent;
|
||||
}
|
||||
/* Private Functions */
|
||||
function smtp_send($helo, $from, $to, $header, $body = "")
|
||||
{
|
||||
if (!$this->smtp_putcmd("HELO", $helo)) {
|
||||
return $this->smtp_error("sending HELO command");
|
||||
}
|
||||
//auth
|
||||
if($this->auth){
|
||||
if (!$this->smtp_putcmd("AUTH LOGIN", base64_encode($this->user))) {
|
||||
return $this->smtp_error("sending HELO command");
|
||||
}
|
||||
if (!$this->smtp_putcmd("", base64_encode($this->pass))) {
|
||||
return $this->smtp_error("sending HELO command");
|
||||
}
|
||||
}
|
||||
if (!$this->smtp_putcmd("MAIL", "FROM:<".$from.">")) {
|
||||
return $this->smtp_error("sending MAIL FROM command");
|
||||
}
|
||||
if (!$this->smtp_putcmd("RCPT", "TO:<".$to.">")) {
|
||||
return $this->smtp_error("sending RCPT TO command");
|
||||
}
|
||||
if (!$this->smtp_putcmd("DATA")) {
|
||||
return $this->smtp_error("sending DATA command");
|
||||
}
|
||||
if (!$this->smtp_message($header, $body)) {
|
||||
return $this->smtp_error("sending message");
|
||||
}
|
||||
if (!$this->smtp_eom()) {
|
||||
return $this->smtp_error("sending <CR><LF>.<CR><LF> [EOM]");
|
||||
}
|
||||
if (!$this->smtp_putcmd("QUIT")) {
|
||||
return $this->smtp_error("sending QUIT command");
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
function smtp_sockopen($address)
|
||||
{
|
||||
if ($this->relay_host == "") {
|
||||
return $this->smtp_sockopen_mx($address);
|
||||
} else {
|
||||
return $this->smtp_sockopen_relay();
|
||||
}
|
||||
}
|
||||
function smtp_sockopen_relay()
|
||||
{
|
||||
$this->log_write("Trying to ".$this->relay_host.":".$this->smtp_port."\n");
|
||||
$this->sock = @fsockopen($this->relay_host, $this->smtp_port, $errno, $errstr, $this->time_out);
|
||||
if (!($this->sock && $this->smtp_ok())) {
|
||||
$this->log_write("Error: Cannot connenct to relay host ".$this->relay_host."\n");
|
||||
$this->log_write("Error: ".$errstr." (".$errno.")\n");
|
||||
return FALSE;
|
||||
}
|
||||
$this->log_write("Connected to relay host ".$this->relay_host."\n");
|
||||
return TRUE;
|
||||
}
|
||||
function smtp_sockopen_mx($address)
|
||||
{
|
||||
$domain = preg_replace("/^.+@([^@]+)$/", "\1", $address);
|
||||
if (!@getmxrr($domain, $MXHOSTS)) {
|
||||
$this->log_write("Error: Cannot resolve MX \"".$domain."\"\n");
|
||||
return FALSE;
|
||||
}
|
||||
foreach ($MXHOSTS as $host) {
|
||||
$this->log_write("Trying to ".$host.":".$this->smtp_port."\n");
|
||||
$this->sock = @fsockopen($host, $this->smtp_port, $errno, $errstr, $this->time_out);
|
||||
if (!($this->sock && $this->smtp_ok())) {
|
||||
$this->log_write("Warning: Cannot connect to mx host ".$host."\n");
|
||||
$this->log_write("Error: ".$errstr." (".$errno.")\n");
|
||||
continue;
|
||||
}
|
||||
$this->log_write("Connected to mx host ".$host."\n");
|
||||
return TRUE;
|
||||
}
|
||||
$this->log_write("Error: Cannot connect to any mx hosts (".implode(", ", $MXHOSTS).")\n");
|
||||
return FALSE;
|
||||
}
|
||||
function smtp_message($header, $body)
|
||||
{
|
||||
fputs($this->sock, $header."\r\n".$body);
|
||||
$this->smtp_debug("> ".str_replace("\r\n", "\n"."> ", $header."\n> ".$body."\n> "));
|
||||
return TRUE;
|
||||
}
|
||||
function smtp_eom()
|
||||
{
|
||||
fputs($this->sock, "\r\n.\r\n");
|
||||
$this->smtp_debug(". [EOM]\n");
|
||||
return $this->smtp_ok();
|
||||
}
|
||||
function smtp_ok()
|
||||
{
|
||||
$response = str_replace("\r\n", "", fgets($this->sock, 512));
|
||||
$this->smtp_debug($response."\n");
|
||||
if (!preg_match("/^[23]/", $response)) {
|
||||
fputs($this->sock, "QUIT\r\n");
|
||||
fgets($this->sock, 512);
|
||||
$this->log_write("Error: Remote host returned \"".$response."\"\n");
|
||||
return FALSE;
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
function smtp_putcmd($cmd, $arg = "")
|
||||
{
|
||||
if ($arg != "") {
|
||||
if($cmd=="") $cmd = $arg;
|
||||
else $cmd = $cmd." ".$arg;
|
||||
}
|
||||
fputs($this->sock, $cmd."\r\n");
|
||||
$this->smtp_debug("> ".$cmd."\n");
|
||||
return $this->smtp_ok();
|
||||
}
|
||||
function smtp_error($string)
|
||||
{
|
||||
$this->log_write("Error: Error occurred while ".$string.".\n");
|
||||
return FALSE;
|
||||
}
|
||||
function log_write($message)
|
||||
{
|
||||
$this->smtp_debug($message);
|
||||
if ($this->log_file == "") {
|
||||
return TRUE;
|
||||
}
|
||||
$message = date("M d H:i:s ").get_current_user()."[".getmypid()."]: ".$message;
|
||||
if (!@file_exists($this->log_file) || !($fp = @fopen($this->log_file, "a"))) {
|
||||
$this->smtp_debug("Warning: Cannot open log file \"".$this->log_file."\"\n");
|
||||
return FALSE;
|
||||
}
|
||||
flock($fp, LOCK_EX);
|
||||
fputs($fp, $message);
|
||||
fclose($fp);
|
||||
return TRUE;
|
||||
}
|
||||
function strip_comment($address)
|
||||
{
|
||||
$comment = "/\([^()]*\)/";
|
||||
while (preg_match($comment, $address)) {
|
||||
$address = preg_replace($comment, "", $address);
|
||||
}
|
||||
return $address;
|
||||
}
|
||||
function get_address($address)
|
||||
{
|
||||
$address = preg_replace("/([ \t\r\n])+/", "", $address);
|
||||
$address = preg_replace("/^.*<(.+)>.*$/", "\1", $address);
|
||||
return $address;
|
||||
}
|
||||
function smtp_debug($message)
|
||||
{
|
||||
if ($this->debug) {
|
||||
echo $message;
|
||||
}
|
||||
}
|
||||
}
|
||||
?>
|
||||
7
vendor/autoload.php
vendored
7
vendor/autoload.php
vendored
@@ -14,12 +14,9 @@ if (PHP_VERSION_ID < 50600) {
|
||||
echo $err;
|
||||
}
|
||||
}
|
||||
trigger_error(
|
||||
$err,
|
||||
E_USER_ERROR
|
||||
);
|
||||
throw new RuntimeException($err);
|
||||
}
|
||||
|
||||
require_once __DIR__ . '/composer/autoload_real.php';
|
||||
|
||||
return ComposerAutoloaderInit2bc4f313dba415539e266f7ac2c87dcd::getLoader();
|
||||
return ComposerAutoloaderInit7020b987d316c2076c2a6f439a1140f9::getLoader();
|
||||
|
||||
45
vendor/composer/InstalledVersions.php
vendored
45
vendor/composer/InstalledVersions.php
vendored
@@ -26,12 +26,23 @@ use Composer\Semver\VersionParser;
|
||||
*/
|
||||
class InstalledVersions
|
||||
{
|
||||
/**
|
||||
* @var string|null if set (by reflection by Composer), this should be set to the path where this class is being copied to
|
||||
* @internal
|
||||
*/
|
||||
private static $selfDir = null;
|
||||
|
||||
/**
|
||||
* @var mixed[]|null
|
||||
* @psalm-var array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>}|array{}|null
|
||||
*/
|
||||
private static $installed;
|
||||
|
||||
/**
|
||||
* @var bool
|
||||
*/
|
||||
private static $installedIsLocalDir;
|
||||
|
||||
/**
|
||||
* @var bool|null
|
||||
*/
|
||||
@@ -309,6 +320,24 @@ class InstalledVersions
|
||||
{
|
||||
self::$installed = $data;
|
||||
self::$installedByVendor = array();
|
||||
|
||||
// when using reload, we disable the duplicate protection to ensure that self::$installed data is
|
||||
// always returned, but we cannot know whether it comes from the installed.php in __DIR__ or not,
|
||||
// so we have to assume it does not, and that may result in duplicate data being returned when listing
|
||||
// all installed packages for example
|
||||
self::$installedIsLocalDir = false;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return string
|
||||
*/
|
||||
private static function getSelfDir()
|
||||
{
|
||||
if (self::$selfDir === null) {
|
||||
self::$selfDir = strtr(__DIR__, '\\', '/');
|
||||
}
|
||||
|
||||
return self::$selfDir;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -322,19 +351,27 @@ class InstalledVersions
|
||||
}
|
||||
|
||||
$installed = array();
|
||||
$copiedLocalDir = false;
|
||||
|
||||
if (self::$canGetVendors) {
|
||||
$selfDir = self::getSelfDir();
|
||||
foreach (ClassLoader::getRegisteredLoaders() as $vendorDir => $loader) {
|
||||
$vendorDir = strtr($vendorDir, '\\', '/');
|
||||
if (isset(self::$installedByVendor[$vendorDir])) {
|
||||
$installed[] = self::$installedByVendor[$vendorDir];
|
||||
} elseif (is_file($vendorDir.'/composer/installed.php')) {
|
||||
/** @var array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>} $required */
|
||||
$required = require $vendorDir.'/composer/installed.php';
|
||||
$installed[] = self::$installedByVendor[$vendorDir] = $required;
|
||||
if (null === self::$installed && strtr($vendorDir.'/composer', '\\', '/') === strtr(__DIR__, '\\', '/')) {
|
||||
self::$installed = $installed[count($installed) - 1];
|
||||
self::$installedByVendor[$vendorDir] = $required;
|
||||
$installed[] = $required;
|
||||
if (self::$installed === null && $vendorDir.'/composer' === $selfDir) {
|
||||
self::$installed = $required;
|
||||
self::$installedIsLocalDir = true;
|
||||
}
|
||||
}
|
||||
if (self::$installedIsLocalDir && $vendorDir.'/composer' === $selfDir) {
|
||||
$copiedLocalDir = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -350,7 +387,7 @@ class InstalledVersions
|
||||
}
|
||||
}
|
||||
|
||||
if (self::$installed !== array()) {
|
||||
if (self::$installed !== array() && !$copiedLocalDir) {
|
||||
$installed[] = self::$installed;
|
||||
}
|
||||
|
||||
|
||||
4
vendor/composer/autoload_classmap.php
vendored
4
vendor/composer/autoload_classmap.php
vendored
@@ -6,6 +6,10 @@ $vendorDir = dirname(__DIR__);
|
||||
$baseDir = dirname($vendorDir);
|
||||
|
||||
return array(
|
||||
'Attribute' => $vendorDir . '/symfony/polyfill-php80/Resources/stubs/Attribute.php',
|
||||
'Composer\\InstalledVersions' => $vendorDir . '/composer/InstalledVersions.php',
|
||||
'PhpToken' => $vendorDir . '/symfony/polyfill-php80/Resources/stubs/PhpToken.php',
|
||||
'Stringable' => $vendorDir . '/myclabs/php-enum/stubs/Stringable.php',
|
||||
'UnhandledMatchError' => $vendorDir . '/symfony/polyfill-php80/Resources/stubs/UnhandledMatchError.php',
|
||||
'ValueError' => $vendorDir . '/symfony/polyfill-php80/Resources/stubs/ValueError.php',
|
||||
);
|
||||
|
||||
5
vendor/composer/autoload_files.php
vendored
5
vendor/composer/autoload_files.php
vendored
@@ -6,12 +6,13 @@ $vendorDir = dirname(__DIR__);
|
||||
$baseDir = dirname($vendorDir);
|
||||
|
||||
return array(
|
||||
'0e6d7bf4a5811bfa5cf40c5ccd6fae6a' => $vendorDir . '/symfony/polyfill-mbstring/bootstrap.php',
|
||||
'6e3fae29631ef280660b3cdad06f25a8' => $vendorDir . '/symfony/deprecation-contracts/function.php',
|
||||
'a4a119a56e50fbb293281d9a48007e0e' => $vendorDir . '/symfony/polyfill-php80/bootstrap.php',
|
||||
'9c67151ae59aff4788964ce8eb2a0f43' => $vendorDir . '/clue/stream-filter/src/functions_include.php',
|
||||
'7b11c4dc42b3b3023073cb14e519683c' => $vendorDir . '/ralouphie/getallheaders/src/getallheaders.php',
|
||||
'0e6d7bf4a5811bfa5cf40c5ccd6fae6a' => $vendorDir . '/symfony/polyfill-mbstring/bootstrap.php',
|
||||
'2cffec82183ee1cea088009cef9a6fc3' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier.composer.php',
|
||||
'8cff32064859f4559445b89279f3199c' => $vendorDir . '/php-http/message/src/filters.php',
|
||||
'6e3fae29631ef280660b3cdad06f25a8' => $vendorDir . '/symfony/deprecation-contracts/function.php',
|
||||
'9b552a3cc426e3287cc811caefa3cf53' => $vendorDir . '/topthink/think-helper/src/helper.php',
|
||||
'37a3dc5111fe8f707ab4c132ef1dbc62' => $vendorDir . '/guzzlehttp/guzzle/src/functions_include.php',
|
||||
'1cfd2761b63b0a29ed23657ea394cb2d' => $vendorDir . '/topthink/think-captcha/src/helper.php',
|
||||
|
||||
4
vendor/composer/autoload_psr4.php
vendored
4
vendor/composer/autoload_psr4.php
vendored
@@ -8,13 +8,15 @@ $baseDir = dirname($vendorDir);
|
||||
return array(
|
||||
'think\\composer\\' => array($vendorDir . '/topthink/think-installer/src'),
|
||||
'think\\captcha\\' => array($vendorDir . '/topthink/think-captcha/src'),
|
||||
'think\\' => array($baseDir . '/thinkphp/library/think', $vendorDir . '/topthink/think-helper/src', $vendorDir . '/topthink/think-image/src', $vendorDir . '/topthink/think-queue/src'),
|
||||
'think\\' => array($vendorDir . '/topthink/think-queue/src', $vendorDir . '/topthink/think-image/src', $vendorDir . '/topthink/think-helper/src', $baseDir . '/thinkphp/library/think'),
|
||||
'app\\' => array($baseDir . '/application'),
|
||||
'apimatic\\jsonmapper\\' => array($vendorDir . '/apimatic/jsonmapper/src'),
|
||||
'ZipStream\\' => array($vendorDir . '/maennchen/zipstream-php/src'),
|
||||
'Unirest\\' => array($vendorDir . '/apimatic/unirest-php/src'),
|
||||
'Tectalic\\OpenAi\\' => array($vendorDir . '/tectalic/openai/src'),
|
||||
'Symfony\\Polyfill\\Php80\\' => array($vendorDir . '/symfony/polyfill-php80'),
|
||||
'Symfony\\Polyfill\\Mbstring\\' => array($vendorDir . '/symfony/polyfill-mbstring'),
|
||||
'Symfony\\Component\\HttpFoundation\\' => array($vendorDir . '/symfony/http-foundation'),
|
||||
'Spatie\\DataTransferObject\\' => array($vendorDir . '/spatie/data-transfer-object/src'),
|
||||
'Psr\\SimpleCache\\' => array($vendorDir . '/psr/simple-cache/src'),
|
||||
'Psr\\Log\\' => array($vendorDir . '/psr/log/Psr/Log'),
|
||||
|
||||
10
vendor/composer/autoload_real.php
vendored
10
vendor/composer/autoload_real.php
vendored
@@ -2,7 +2,7 @@
|
||||
|
||||
// autoload_real.php @generated by Composer
|
||||
|
||||
class ComposerAutoloaderInit2bc4f313dba415539e266f7ac2c87dcd
|
||||
class ComposerAutoloaderInit7020b987d316c2076c2a6f439a1140f9
|
||||
{
|
||||
private static $loader;
|
||||
|
||||
@@ -24,16 +24,16 @@ class ComposerAutoloaderInit2bc4f313dba415539e266f7ac2c87dcd
|
||||
|
||||
require __DIR__ . '/platform_check.php';
|
||||
|
||||
spl_autoload_register(array('ComposerAutoloaderInit2bc4f313dba415539e266f7ac2c87dcd', 'loadClassLoader'), true, true);
|
||||
spl_autoload_register(array('ComposerAutoloaderInit7020b987d316c2076c2a6f439a1140f9', 'loadClassLoader'), true, true);
|
||||
self::$loader = $loader = new \Composer\Autoload\ClassLoader(\dirname(__DIR__));
|
||||
spl_autoload_unregister(array('ComposerAutoloaderInit2bc4f313dba415539e266f7ac2c87dcd', 'loadClassLoader'));
|
||||
spl_autoload_unregister(array('ComposerAutoloaderInit7020b987d316c2076c2a6f439a1140f9', 'loadClassLoader'));
|
||||
|
||||
require __DIR__ . '/autoload_static.php';
|
||||
call_user_func(\Composer\Autoload\ComposerStaticInit2bc4f313dba415539e266f7ac2c87dcd::getInitializer($loader));
|
||||
call_user_func(\Composer\Autoload\ComposerStaticInit7020b987d316c2076c2a6f439a1140f9::getInitializer($loader));
|
||||
|
||||
$loader->register(true);
|
||||
|
||||
$filesToLoad = \Composer\Autoload\ComposerStaticInit2bc4f313dba415539e266f7ac2c87dcd::$files;
|
||||
$filesToLoad = \Composer\Autoload\ComposerStaticInit7020b987d316c2076c2a6f439a1140f9::$files;
|
||||
$requireFile = \Closure::bind(static function ($fileIdentifier, $file) {
|
||||
if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) {
|
||||
$GLOBALS['__composer_autoload_files'][$fileIdentifier] = true;
|
||||
|
||||
37
vendor/composer/autoload_static.php
vendored
37
vendor/composer/autoload_static.php
vendored
@@ -4,15 +4,16 @@
|
||||
|
||||
namespace Composer\Autoload;
|
||||
|
||||
class ComposerStaticInit2bc4f313dba415539e266f7ac2c87dcd
|
||||
class ComposerStaticInit7020b987d316c2076c2a6f439a1140f9
|
||||
{
|
||||
public static $files = array (
|
||||
'0e6d7bf4a5811bfa5cf40c5ccd6fae6a' => __DIR__ . '/..' . '/symfony/polyfill-mbstring/bootstrap.php',
|
||||
'6e3fae29631ef280660b3cdad06f25a8' => __DIR__ . '/..' . '/symfony/deprecation-contracts/function.php',
|
||||
'a4a119a56e50fbb293281d9a48007e0e' => __DIR__ . '/..' . '/symfony/polyfill-php80/bootstrap.php',
|
||||
'9c67151ae59aff4788964ce8eb2a0f43' => __DIR__ . '/..' . '/clue/stream-filter/src/functions_include.php',
|
||||
'7b11c4dc42b3b3023073cb14e519683c' => __DIR__ . '/..' . '/ralouphie/getallheaders/src/getallheaders.php',
|
||||
'0e6d7bf4a5811bfa5cf40c5ccd6fae6a' => __DIR__ . '/..' . '/symfony/polyfill-mbstring/bootstrap.php',
|
||||
'2cffec82183ee1cea088009cef9a6fc3' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier.composer.php',
|
||||
'8cff32064859f4559445b89279f3199c' => __DIR__ . '/..' . '/php-http/message/src/filters.php',
|
||||
'6e3fae29631ef280660b3cdad06f25a8' => __DIR__ . '/..' . '/symfony/deprecation-contracts/function.php',
|
||||
'9b552a3cc426e3287cc811caefa3cf53' => __DIR__ . '/..' . '/topthink/think-helper/src/helper.php',
|
||||
'37a3dc5111fe8f707ab4c132ef1dbc62' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/functions_include.php',
|
||||
'1cfd2761b63b0a29ed23657ea394cb2d' => __DIR__ . '/..' . '/topthink/think-captcha/src/helper.php',
|
||||
@@ -45,7 +46,9 @@ class ComposerStaticInit2bc4f313dba415539e266f7ac2c87dcd
|
||||
),
|
||||
'S' =>
|
||||
array (
|
||||
'Symfony\\Polyfill\\Php80\\' => 23,
|
||||
'Symfony\\Polyfill\\Mbstring\\' => 26,
|
||||
'Symfony\\Component\\HttpFoundation\\' => 33,
|
||||
'Spatie\\DataTransferObject\\' => 26,
|
||||
),
|
||||
'P' =>
|
||||
@@ -101,10 +104,10 @@ class ComposerStaticInit2bc4f313dba415539e266f7ac2c87dcd
|
||||
),
|
||||
'think\\' =>
|
||||
array (
|
||||
0 => __DIR__ . '/../..' . '/thinkphp/library/think',
|
||||
1 => __DIR__ . '/..' . '/topthink/think-helper/src',
|
||||
2 => __DIR__ . '/..' . '/topthink/think-image/src',
|
||||
3 => __DIR__ . '/..' . '/topthink/think-queue/src',
|
||||
0 => __DIR__ . '/..' . '/topthink/think-queue/src',
|
||||
1 => __DIR__ . '/..' . '/topthink/think-image/src',
|
||||
2 => __DIR__ . '/..' . '/topthink/think-helper/src',
|
||||
3 => __DIR__ . '/../..' . '/thinkphp/library/think',
|
||||
),
|
||||
'app\\' =>
|
||||
array (
|
||||
@@ -126,10 +129,18 @@ class ComposerStaticInit2bc4f313dba415539e266f7ac2c87dcd
|
||||
array (
|
||||
0 => __DIR__ . '/..' . '/tectalic/openai/src',
|
||||
),
|
||||
'Symfony\\Polyfill\\Php80\\' =>
|
||||
array (
|
||||
0 => __DIR__ . '/..' . '/symfony/polyfill-php80',
|
||||
),
|
||||
'Symfony\\Polyfill\\Mbstring\\' =>
|
||||
array (
|
||||
0 => __DIR__ . '/..' . '/symfony/polyfill-mbstring',
|
||||
),
|
||||
'Symfony\\Component\\HttpFoundation\\' =>
|
||||
array (
|
||||
0 => __DIR__ . '/..' . '/symfony/http-foundation',
|
||||
),
|
||||
'Spatie\\DataTransferObject\\' =>
|
||||
array (
|
||||
0 => __DIR__ . '/..' . '/spatie/data-transfer-object/src',
|
||||
@@ -250,17 +261,21 @@ class ComposerStaticInit2bc4f313dba415539e266f7ac2c87dcd
|
||||
);
|
||||
|
||||
public static $classMap = array (
|
||||
'Attribute' => __DIR__ . '/..' . '/symfony/polyfill-php80/Resources/stubs/Attribute.php',
|
||||
'Composer\\InstalledVersions' => __DIR__ . '/..' . '/composer/InstalledVersions.php',
|
||||
'PhpToken' => __DIR__ . '/..' . '/symfony/polyfill-php80/Resources/stubs/PhpToken.php',
|
||||
'Stringable' => __DIR__ . '/..' . '/myclabs/php-enum/stubs/Stringable.php',
|
||||
'UnhandledMatchError' => __DIR__ . '/..' . '/symfony/polyfill-php80/Resources/stubs/UnhandledMatchError.php',
|
||||
'ValueError' => __DIR__ . '/..' . '/symfony/polyfill-php80/Resources/stubs/ValueError.php',
|
||||
);
|
||||
|
||||
public static function getInitializer(ClassLoader $loader)
|
||||
{
|
||||
return \Closure::bind(function () use ($loader) {
|
||||
$loader->prefixLengthsPsr4 = ComposerStaticInit2bc4f313dba415539e266f7ac2c87dcd::$prefixLengthsPsr4;
|
||||
$loader->prefixDirsPsr4 = ComposerStaticInit2bc4f313dba415539e266f7ac2c87dcd::$prefixDirsPsr4;
|
||||
$loader->prefixesPsr0 = ComposerStaticInit2bc4f313dba415539e266f7ac2c87dcd::$prefixesPsr0;
|
||||
$loader->classMap = ComposerStaticInit2bc4f313dba415539e266f7ac2c87dcd::$classMap;
|
||||
$loader->prefixLengthsPsr4 = ComposerStaticInit7020b987d316c2076c2a6f439a1140f9::$prefixLengthsPsr4;
|
||||
$loader->prefixDirsPsr4 = ComposerStaticInit7020b987d316c2076c2a6f439a1140f9::$prefixDirsPsr4;
|
||||
$loader->prefixesPsr0 = ComposerStaticInit7020b987d316c2076c2a6f439a1140f9::$prefixesPsr0;
|
||||
$loader->classMap = ComposerStaticInit7020b987d316c2076c2a6f439a1140f9::$classMap;
|
||||
|
||||
}, null, ClassLoader::class);
|
||||
}
|
||||
|
||||
5254
vendor/composer/installed.json
vendored
5254
vendor/composer/installed.json
vendored
File diff suppressed because it is too large
Load Diff
108
vendor/composer/installed.php
vendored
108
vendor/composer/installed.php
vendored
@@ -3,17 +3,17 @@
|
||||
'name' => 'topthink/think',
|
||||
'pretty_version' => 'dev-master',
|
||||
'version' => 'dev-master',
|
||||
'reference' => 'f3d3ae04ca0af2673209a5a3fde61c3ff53bd1ba',
|
||||
'reference' => 'fa878334cd151a29627aac8f2e01d8ce27770606',
|
||||
'type' => 'project',
|
||||
'install_path' => __DIR__ . '/../../',
|
||||
'aliases' => array(),
|
||||
'dev' => true,
|
||||
'dev' => false,
|
||||
),
|
||||
'versions' => array(
|
||||
'apimatic/core' => array(
|
||||
'pretty_version' => '0.3.13',
|
||||
'version' => '0.3.13.0',
|
||||
'reference' => '944678aa7017457daacd9750b96962fb693ea81a',
|
||||
'pretty_version' => '0.3.17',
|
||||
'version' => '0.3.17.0',
|
||||
'reference' => 'a48a583f686ee3786432b976c795a2817ec095b3',
|
||||
'type' => 'library',
|
||||
'install_path' => __DIR__ . '/../apimatic/core',
|
||||
'aliases' => array(),
|
||||
@@ -29,18 +29,18 @@
|
||||
'dev_requirement' => false,
|
||||
),
|
||||
'apimatic/jsonmapper' => array(
|
||||
'pretty_version' => '3.1.6',
|
||||
'version' => '3.1.6.0',
|
||||
'reference' => 'c6cc21bd56bfe5d5822bbd08f514be465c0b24e7',
|
||||
'pretty_version' => '3.1.7',
|
||||
'version' => '3.1.7.0',
|
||||
'reference' => '61e45f6021e4a4e07497be596b4787c3c6b39bea',
|
||||
'type' => 'library',
|
||||
'install_path' => __DIR__ . '/../apimatic/jsonmapper',
|
||||
'aliases' => array(),
|
||||
'dev_requirement' => false,
|
||||
),
|
||||
'apimatic/unirest-php' => array(
|
||||
'pretty_version' => '4.0.5',
|
||||
'version' => '4.0.5.0',
|
||||
'reference' => 'e16754010c16be5473289470f129d87a0f41b55e',
|
||||
'pretty_version' => '4.0.7',
|
||||
'version' => '4.0.7.0',
|
||||
'reference' => 'bdfd5f27c105772682c88ed671683f1bd93f4a3c',
|
||||
'type' => 'library',
|
||||
'install_path' => __DIR__ . '/../apimatic/unirest-php',
|
||||
'aliases' => array(),
|
||||
@@ -56,36 +56,36 @@
|
||||
'dev_requirement' => false,
|
||||
),
|
||||
'ezyang/htmlpurifier' => array(
|
||||
'pretty_version' => 'v4.18.0',
|
||||
'version' => '4.18.0.0',
|
||||
'reference' => 'cb56001e54359df7ae76dc522d08845dc741621b',
|
||||
'pretty_version' => 'v4.19.0',
|
||||
'version' => '4.19.0.0',
|
||||
'reference' => 'b287d2a16aceffbf6e0295559b39662612b77fcf',
|
||||
'type' => 'library',
|
||||
'install_path' => __DIR__ . '/../ezyang/htmlpurifier',
|
||||
'aliases' => array(),
|
||||
'dev_requirement' => false,
|
||||
),
|
||||
'guzzlehttp/guzzle' => array(
|
||||
'pretty_version' => '7.9.2',
|
||||
'version' => '7.9.2.0',
|
||||
'reference' => 'd281ed313b989f213357e3be1a179f02196ac99b',
|
||||
'pretty_version' => '7.10.0',
|
||||
'version' => '7.10.0.0',
|
||||
'reference' => 'b51ac707cfa420b7bfd4e4d5e510ba8008e822b4',
|
||||
'type' => 'library',
|
||||
'install_path' => __DIR__ . '/../guzzlehttp/guzzle',
|
||||
'aliases' => array(),
|
||||
'dev_requirement' => false,
|
||||
),
|
||||
'guzzlehttp/promises' => array(
|
||||
'pretty_version' => '2.0.4',
|
||||
'version' => '2.0.4.0',
|
||||
'reference' => 'f9c436286ab2892c7db7be8c8da4ef61ccf7b455',
|
||||
'pretty_version' => '2.3.0',
|
||||
'version' => '2.3.0.0',
|
||||
'reference' => '481557b130ef3790cf82b713667b43030dc9c957',
|
||||
'type' => 'library',
|
||||
'install_path' => __DIR__ . '/../guzzlehttp/promises',
|
||||
'aliases' => array(),
|
||||
'dev_requirement' => false,
|
||||
),
|
||||
'guzzlehttp/psr7' => array(
|
||||
'pretty_version' => '2.7.0',
|
||||
'version' => '2.7.0.0',
|
||||
'reference' => 'a70f5c95fb43bc83f07c9c948baa0dc1829bf201',
|
||||
'pretty_version' => '2.9.0',
|
||||
'version' => '2.9.0.0',
|
||||
'reference' => '7d0ed42f28e42d61352a7a79de682e5e67fec884',
|
||||
'type' => 'library',
|
||||
'install_path' => __DIR__ . '/../guzzlehttp/psr7',
|
||||
'aliases' => array(),
|
||||
@@ -200,18 +200,18 @@
|
||||
'dev_requirement' => false,
|
||||
),
|
||||
'phpmailer/phpmailer' => array(
|
||||
'pretty_version' => 'v6.9.3',
|
||||
'version' => '6.9.3.0',
|
||||
'reference' => '2f5c94fe7493efc213f643c23b1b1c249d40f47e',
|
||||
'pretty_version' => 'v6.12.0',
|
||||
'version' => '6.12.0.0',
|
||||
'reference' => 'd1ac35d784bf9f5e61b424901d5a014967f15b12',
|
||||
'type' => 'library',
|
||||
'install_path' => __DIR__ . '/../phpmailer/phpmailer',
|
||||
'aliases' => array(),
|
||||
'dev_requirement' => false,
|
||||
),
|
||||
'phpoffice/math' => array(
|
||||
'pretty_version' => '0.2.0',
|
||||
'version' => '0.2.0.0',
|
||||
'reference' => 'fc2eb6d1a61b058d5dac77197059db30ee3c8329',
|
||||
'pretty_version' => '0.3.0',
|
||||
'version' => '0.3.0.0',
|
||||
'reference' => 'fc31c8f57a7a81f962cbf389fd89f4d9d06fc99a',
|
||||
'type' => 'library',
|
||||
'install_path' => __DIR__ . '/../phpoffice/math',
|
||||
'aliases' => array(),
|
||||
@@ -236,9 +236,9 @@
|
||||
'dev_requirement' => false,
|
||||
),
|
||||
'phpoffice/phpword' => array(
|
||||
'pretty_version' => '1.3.0',
|
||||
'version' => '1.3.0.0',
|
||||
'reference' => '8392134ce4b5dba65130ba956231a1602b848b7f',
|
||||
'pretty_version' => '1.4.0',
|
||||
'version' => '1.4.0.0',
|
||||
'reference' => '6d75328229bc93790b37e93741adf70646cea958',
|
||||
'type' => 'library',
|
||||
'install_path' => __DIR__ . '/../phpoffice/phpword',
|
||||
'aliases' => array(),
|
||||
@@ -256,8 +256,8 @@
|
||||
'psr/http-client-implementation' => array(
|
||||
'dev_requirement' => false,
|
||||
'provided' => array(
|
||||
0 => '1.0',
|
||||
1 => '*',
|
||||
0 => '*',
|
||||
1 => '1.0',
|
||||
),
|
||||
),
|
||||
'psr/http-factory' => array(
|
||||
@@ -272,8 +272,8 @@
|
||||
'psr/http-factory-implementation' => array(
|
||||
'dev_requirement' => false,
|
||||
'provided' => array(
|
||||
0 => '1.0',
|
||||
1 => '*',
|
||||
0 => '*',
|
||||
1 => '1.0',
|
||||
),
|
||||
),
|
||||
'psr/http-message' => array(
|
||||
@@ -288,8 +288,8 @@
|
||||
'psr/http-message-implementation' => array(
|
||||
'dev_requirement' => false,
|
||||
'provided' => array(
|
||||
0 => '1.0',
|
||||
1 => '*',
|
||||
0 => '*',
|
||||
1 => '1.0',
|
||||
),
|
||||
),
|
||||
'psr/log' => array(
|
||||
@@ -337,15 +337,33 @@
|
||||
'aliases' => array(),
|
||||
'dev_requirement' => false,
|
||||
),
|
||||
'symfony/http-foundation' => array(
|
||||
'pretty_version' => 'v5.4.50',
|
||||
'version' => '5.4.50.0',
|
||||
'reference' => '1a0706e8b8041046052ea2695eb8aeee04f97609',
|
||||
'type' => 'library',
|
||||
'install_path' => __DIR__ . '/../symfony/http-foundation',
|
||||
'aliases' => array(),
|
||||
'dev_requirement' => false,
|
||||
),
|
||||
'symfony/polyfill-mbstring' => array(
|
||||
'pretty_version' => 'v1.31.0',
|
||||
'version' => '1.31.0.0',
|
||||
'reference' => '85181ba99b2345b0ef10ce42ecac37612d9fd341',
|
||||
'pretty_version' => 'v1.37.0',
|
||||
'version' => '1.37.0.0',
|
||||
'reference' => '6a21eb99c6973357967f6ce3708cd55a6bec6315',
|
||||
'type' => 'library',
|
||||
'install_path' => __DIR__ . '/../symfony/polyfill-mbstring',
|
||||
'aliases' => array(),
|
||||
'dev_requirement' => false,
|
||||
),
|
||||
'symfony/polyfill-php80' => array(
|
||||
'pretty_version' => 'v1.37.0',
|
||||
'version' => '1.37.0.0',
|
||||
'reference' => 'dfb55726c3a76ea3b6459fcfda1ec2d80a682411',
|
||||
'type' => 'library',
|
||||
'install_path' => __DIR__ . '/../symfony/polyfill-php80',
|
||||
'aliases' => array(),
|
||||
'dev_requirement' => false,
|
||||
),
|
||||
'tectalic/openai' => array(
|
||||
'pretty_version' => 'v1.6.0',
|
||||
'version' => '1.6.0.0',
|
||||
@@ -367,7 +385,7 @@
|
||||
'topthink/think' => array(
|
||||
'pretty_version' => 'dev-master',
|
||||
'version' => 'dev-master',
|
||||
'reference' => 'f3d3ae04ca0af2673209a5a3fde61c3ff53bd1ba',
|
||||
'reference' => 'fa878334cd151a29627aac8f2e01d8ce27770606',
|
||||
'type' => 'project',
|
||||
'install_path' => __DIR__ . '/../../',
|
||||
'aliases' => array(),
|
||||
@@ -383,9 +401,9 @@
|
||||
'dev_requirement' => false,
|
||||
),
|
||||
'topthink/think-helper' => array(
|
||||
'pretty_version' => 'v3.1.10',
|
||||
'version' => '3.1.10.0',
|
||||
'reference' => 'ac66cc0859a12cd5d73258f50f338aadc95e9b46',
|
||||
'pretty_version' => 'v3.1.12',
|
||||
'version' => '3.1.12.0',
|
||||
'reference' => 'fe277121112a8f1c872e169a733ca80bb11c4acb',
|
||||
'type' => 'library',
|
||||
'install_path' => __DIR__ . '/../topthink/think-helper',
|
||||
'aliases' => array(),
|
||||
|
||||
5
vendor/composer/platform_check.php
vendored
5
vendor/composer/platform_check.php
vendored
@@ -19,8 +19,7 @@ if ($issues) {
|
||||
echo 'Composer detected issues in your platform:' . PHP_EOL.PHP_EOL . str_replace('You are running '.PHP_VERSION.'.', '', implode(PHP_EOL, $issues)) . PHP_EOL.PHP_EOL;
|
||||
}
|
||||
}
|
||||
trigger_error(
|
||||
'Composer detected issues in your platform: ' . implode(' ', $issues),
|
||||
E_USER_ERROR
|
||||
throw new \RuntimeException(
|
||||
'Composer detected issues in your platform: ' . implode(' ', $issues)
|
||||
);
|
||||
}
|
||||
|
||||
19
vendor/doctrine/annotations/LICENSE
vendored
19
vendor/doctrine/annotations/LICENSE
vendored
@@ -1,19 +0,0 @@
|
||||
Copyright (c) 2006-2013 Doctrine Project
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||
this software and associated documentation files (the "Software"), to deal in
|
||||
the Software without restriction, including without limitation the rights to
|
||||
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
|
||||
of the Software, and to permit persons to whom the Software is furnished to do
|
||||
so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
18
vendor/doctrine/annotations/README.md
vendored
18
vendor/doctrine/annotations/README.md
vendored
@@ -1,18 +0,0 @@
|
||||
# Doctrine Annotations
|
||||
|
||||
[](https://github.com/doctrine/persistence/actions)
|
||||
[](https://www.versioneye.com/package/php--doctrine--annotations)
|
||||
[](https://www.versioneye.com/php/doctrine:annotations/references)
|
||||
[](https://packagist.org/packages/doctrine/annotations)
|
||||
[](https://packagist.org/packages/doctrine/annotations)
|
||||
|
||||
Docblock Annotations Parser library (extracted from [Doctrine Common](https://github.com/doctrine/common)).
|
||||
|
||||
## Documentation
|
||||
|
||||
See the [doctrine-project website](https://www.doctrine-project.org/projects/doctrine-annotations/en/latest/index.html).
|
||||
|
||||
## Contributing
|
||||
|
||||
When making a pull request, make sure your changes follow the
|
||||
[Coding Standard Guidelines](https://www.doctrine-project.org/projects/doctrine-coding-standard/en/current/reference/index.html#introduction).
|
||||
44
vendor/doctrine/annotations/composer.json
vendored
44
vendor/doctrine/annotations/composer.json
vendored
@@ -1,44 +0,0 @@
|
||||
{
|
||||
"name": "doctrine/annotations",
|
||||
"type": "library",
|
||||
"description": "Docblock Annotations Parser",
|
||||
"keywords": ["annotations", "docblock", "parser"],
|
||||
"homepage": "https://www.doctrine-project.org/projects/annotations.html",
|
||||
"license": "MIT",
|
||||
"authors": [
|
||||
{"name": "Guilherme Blanco", "email": "guilhermeblanco@gmail.com"},
|
||||
{"name": "Roman Borschel", "email": "roman@code-factory.org"},
|
||||
{"name": "Benjamin Eberlei", "email": "kontakt@beberlei.de"},
|
||||
{"name": "Jonathan Wage", "email": "jonwage@gmail.com"},
|
||||
{"name": "Johannes Schmitt", "email": "schmittjoh@gmail.com"}
|
||||
],
|
||||
"require": {
|
||||
"php": "^7.1 || ^8.0",
|
||||
"ext-tokenizer": "*",
|
||||
"doctrine/lexer": "1.*",
|
||||
"psr/cache": "^1 || ^2 || ^3"
|
||||
},
|
||||
"require-dev": {
|
||||
"doctrine/cache": "^1.11 || ^2.0",
|
||||
"doctrine/coding-standard": "^6.0 || ^8.1",
|
||||
"phpstan/phpstan": "^0.12.20",
|
||||
"phpunit/phpunit": "^7.5 || ^8.0 || ^9.1.5",
|
||||
"symfony/cache": "^4.4 || ^5.2"
|
||||
},
|
||||
"config": {
|
||||
"sort-packages": true
|
||||
},
|
||||
"autoload": {
|
||||
"psr-4": { "Doctrine\\Common\\Annotations\\": "lib/Doctrine/Common/Annotations" }
|
||||
},
|
||||
"autoload-dev": {
|
||||
"psr-4": {
|
||||
"Doctrine\\Performance\\Common\\Annotations\\": "tests/Doctrine/Performance/Common/Annotations",
|
||||
"Doctrine\\Tests\\Common\\Annotations\\": "tests/Doctrine/Tests/Common/Annotations"
|
||||
},
|
||||
"files": [
|
||||
"tests/Doctrine/Tests/Common/Annotations/Fixtures/functions.php",
|
||||
"tests/Doctrine/Tests/Common/Annotations/Fixtures/SingleClassLOC1000.php"
|
||||
]
|
||||
}
|
||||
}
|
||||
252
vendor/doctrine/annotations/docs/en/annotations.rst
vendored
252
vendor/doctrine/annotations/docs/en/annotations.rst
vendored
@@ -1,252 +0,0 @@
|
||||
Handling Annotations
|
||||
====================
|
||||
|
||||
There are several different approaches to handling annotations in PHP.
|
||||
Doctrine Annotations maps docblock annotations to PHP classes. Because
|
||||
not all docblock annotations are used for metadata purposes a filter is
|
||||
applied to ignore or skip classes that are not Doctrine annotations.
|
||||
|
||||
Take a look at the following code snippet:
|
||||
|
||||
.. code-block:: php
|
||||
|
||||
namespace MyProject\Entities;
|
||||
|
||||
use Doctrine\ORM\Mapping AS ORM;
|
||||
use Symfony\Component\Validator\Constraints AS Assert;
|
||||
|
||||
/**
|
||||
* @author Benjamin Eberlei
|
||||
* @ORM\Entity
|
||||
* @MyProject\Annotations\Foobarable
|
||||
*/
|
||||
class User
|
||||
{
|
||||
/**
|
||||
* @ORM\Id @ORM\Column @ORM\GeneratedValue
|
||||
* @dummy
|
||||
* @var int
|
||||
*/
|
||||
private $id;
|
||||
|
||||
/**
|
||||
* @ORM\Column(type="string")
|
||||
* @Assert\NotEmpty
|
||||
* @Assert\Email
|
||||
* @var string
|
||||
*/
|
||||
private $email;
|
||||
}
|
||||
|
||||
In this snippet you can see a variety of different docblock annotations:
|
||||
|
||||
- Documentation annotations such as ``@var`` and ``@author``. These
|
||||
annotations are ignored and never considered for throwing an
|
||||
exception due to wrongly used annotations.
|
||||
- Annotations imported through use statements. The statement ``use
|
||||
Doctrine\ORM\Mapping AS ORM`` makes all classes under that namespace
|
||||
available as ``@ORM\ClassName``. Same goes for the import of
|
||||
``@Assert``.
|
||||
- The ``@dummy`` annotation. It is not a documentation annotation and
|
||||
not ignored. For Doctrine Annotations it is not entirely clear how
|
||||
to handle this annotation. Depending on the configuration an exception
|
||||
(unknown annotation) will be thrown when parsing this annotation.
|
||||
- The fully qualified annotation ``@MyProject\Annotations\Foobarable``.
|
||||
This is transformed directly into the given class name.
|
||||
|
||||
How are these annotations loaded? From looking at the code you could
|
||||
guess that the ORM Mapping, Assert Validation and the fully qualified
|
||||
annotation can just be loaded using
|
||||
the defined PHP autoloaders. This is not the case however: For error
|
||||
handling reasons every check for class existence inside the
|
||||
``AnnotationReader`` sets the second parameter $autoload
|
||||
of ``class_exists($name, $autoload)`` to false. To work flawlessly the
|
||||
``AnnotationReader`` requires silent autoloaders which many autoloaders are
|
||||
not. Silent autoloading is NOT part of the `PSR-0 specification
|
||||
<https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-0.md>`_
|
||||
for autoloading.
|
||||
|
||||
This is why Doctrine Annotations uses its own autoloading mechanism
|
||||
through a global registry. If you are wondering about the annotation
|
||||
registry being global, there is no other way to solve the architectural
|
||||
problems of autoloading annotation classes in a straightforward fashion.
|
||||
Additionally if you think about PHP autoloading then you recognize it is
|
||||
a global as well.
|
||||
|
||||
To anticipate the configuration section, making the above PHP class work
|
||||
with Doctrine Annotations requires this setup:
|
||||
|
||||
.. code-block:: php
|
||||
|
||||
use Doctrine\Common\Annotations\AnnotationReader;
|
||||
use Doctrine\Common\Annotations\AnnotationRegistry;
|
||||
|
||||
AnnotationRegistry::registerFile("/path/to/doctrine/lib/Doctrine/ORM/Mapping/Driver/DoctrineAnnotations.php");
|
||||
AnnotationRegistry::registerAutoloadNamespace("Symfony\Component\Validator\Constraint", "/path/to/symfony/src");
|
||||
AnnotationRegistry::registerAutoloadNamespace("MyProject\Annotations", "/path/to/myproject/src");
|
||||
|
||||
$reader = new AnnotationReader();
|
||||
AnnotationReader::addGlobalIgnoredName('dummy');
|
||||
|
||||
The second block with the annotation registry calls registers all the
|
||||
three different annotation namespaces that are used.
|
||||
Doctrine Annotations saves all its annotations in a single file, that is
|
||||
why ``AnnotationRegistry#registerFile`` is used in contrast to
|
||||
``AnnotationRegistry#registerAutoloadNamespace`` which creates a PSR-0
|
||||
compatible loading mechanism for class to file names.
|
||||
|
||||
In the third block, we create the actual ``AnnotationReader`` instance.
|
||||
Note that we also add ``dummy`` to the global list of ignored
|
||||
annotations for which we do not throw exceptions. Setting this is
|
||||
necessary in our example case, otherwise ``@dummy`` would trigger an
|
||||
exception to be thrown during the parsing of the docblock of
|
||||
``MyProject\Entities\User#id``.
|
||||
|
||||
Setup and Configuration
|
||||
-----------------------
|
||||
|
||||
To use the annotations library is simple, you just need to create a new
|
||||
``AnnotationReader`` instance:
|
||||
|
||||
.. code-block:: php
|
||||
|
||||
$reader = new \Doctrine\Common\Annotations\AnnotationReader();
|
||||
|
||||
This creates a simple annotation reader with no caching other than in
|
||||
memory (in php arrays). Since parsing docblocks can be expensive you
|
||||
should cache this process by using a caching reader.
|
||||
|
||||
To cache annotations, you can create a ``Doctrine\Common\Annotations\PsrCachedReader``.
|
||||
This reader decorates the original reader and stores all annotations in a PSR-6
|
||||
cache:
|
||||
|
||||
.. code-block:: php
|
||||
|
||||
use Doctrine\Common\Annotations\AnnotationReader;
|
||||
use Doctrine\Common\Annotations\PsrCachedReader;
|
||||
|
||||
$cache = ... // instantiate a PSR-6 Cache pool
|
||||
|
||||
$reader = new PsrCachedReader(
|
||||
new AnnotationReader(),
|
||||
$cache,
|
||||
$debug = true
|
||||
);
|
||||
|
||||
The ``debug`` flag is used here as well to invalidate the cache files
|
||||
when the PHP class with annotations changed and should be used during
|
||||
development.
|
||||
|
||||
.. warning ::
|
||||
|
||||
The ``AnnotationReader`` works and caches under the
|
||||
assumption that all annotations of a doc-block are processed at
|
||||
once. That means that annotation classes that do not exist and
|
||||
aren't loaded and cannot be autoloaded (using the
|
||||
AnnotationRegistry) would never be visible and not accessible if a
|
||||
cache is used unless the cache is cleared and the annotations
|
||||
requested again, this time with all annotations defined.
|
||||
|
||||
By default the annotation reader returns a list of annotations with
|
||||
numeric indexes. If you want your annotations to be indexed by their
|
||||
class name you can wrap the reader in an ``IndexedReader``:
|
||||
|
||||
.. code-block:: php
|
||||
|
||||
use Doctrine\Common\Annotations\AnnotationReader;
|
||||
use Doctrine\Common\Annotations\IndexedReader;
|
||||
|
||||
$reader = new IndexedReader(new AnnotationReader());
|
||||
|
||||
.. warning::
|
||||
|
||||
You should never wrap the indexed reader inside a cached reader,
|
||||
only the other way around. This way you can re-use the cache with
|
||||
indexed or numeric keys, otherwise your code may experience failures
|
||||
due to caching in a numerical or indexed format.
|
||||
|
||||
Registering Annotations
|
||||
~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
As explained in the introduction, Doctrine Annotations uses its own
|
||||
autoloading mechanism to determine if a given annotation has a
|
||||
corresponding PHP class that can be autoloaded. For annotation
|
||||
autoloading you have to configure the
|
||||
``Doctrine\Common\Annotations\AnnotationRegistry``. There are three
|
||||
different mechanisms to configure annotation autoloading:
|
||||
|
||||
- Calling ``AnnotationRegistry#registerFile($file)`` to register a file
|
||||
that contains one or more annotation classes.
|
||||
- Calling ``AnnotationRegistry#registerNamespace($namespace, $dirs =
|
||||
null)`` to register that the given namespace contains annotations and
|
||||
that their base directory is located at the given $dirs or in the
|
||||
include path if ``NULL`` is passed. The given directories should *NOT*
|
||||
be the directory where classes of the namespace are in, but the base
|
||||
directory of the root namespace. The AnnotationRegistry uses a
|
||||
namespace to directory separator approach to resolve the correct path.
|
||||
- Calling ``AnnotationRegistry#registerLoader($callable)`` to register
|
||||
an autoloader callback. The callback accepts the class as first and
|
||||
only parameter and has to return ``true`` if the corresponding file
|
||||
was found and included.
|
||||
|
||||
.. note::
|
||||
|
||||
Loaders have to fail silently, if a class is not found even if it
|
||||
matches for example the namespace prefix of that loader. Never is a
|
||||
loader to throw a warning or exception if the loading failed
|
||||
otherwise parsing doc block annotations will become a huge pain.
|
||||
|
||||
A sample loader callback could look like:
|
||||
|
||||
.. code-block:: php
|
||||
|
||||
use Doctrine\Common\Annotations\AnnotationRegistry;
|
||||
use Symfony\Component\ClassLoader\UniversalClassLoader;
|
||||
|
||||
AnnotationRegistry::registerLoader(function($class) {
|
||||
$file = str_replace("\\", DIRECTORY_SEPARATOR, $class) . ".php";
|
||||
|
||||
if (file_exists("/my/base/path/" . $file)) {
|
||||
// file_exists() makes sure that the loader fails silently
|
||||
require "/my/base/path/" . $file;
|
||||
}
|
||||
});
|
||||
|
||||
$loader = new UniversalClassLoader();
|
||||
AnnotationRegistry::registerLoader(array($loader, "loadClass"));
|
||||
|
||||
|
||||
Ignoring missing exceptions
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
By default an exception is thrown from the ``AnnotationReader`` if an
|
||||
annotation was found that:
|
||||
|
||||
- is not part of the list of ignored "documentation annotations";
|
||||
- was not imported through a use statement;
|
||||
- is not a fully qualified class that exists.
|
||||
|
||||
You can disable this behavior for specific names if your docblocks do
|
||||
not follow strict requirements:
|
||||
|
||||
.. code-block:: php
|
||||
|
||||
$reader = new \Doctrine\Common\Annotations\AnnotationReader();
|
||||
AnnotationReader::addGlobalIgnoredName('foo');
|
||||
|
||||
PHP Imports
|
||||
~~~~~~~~~~~
|
||||
|
||||
By default the annotation reader parses the use-statement of a php file
|
||||
to gain access to the import rules and register them for the annotation
|
||||
processing. Only if you are using PHP Imports can you validate the
|
||||
correct usage of annotations and throw exceptions if you misspelled an
|
||||
annotation. This mechanism is enabled by default.
|
||||
|
||||
To ease the upgrade path, we still allow you to disable this mechanism.
|
||||
Note however that we will remove this in future versions:
|
||||
|
||||
.. code-block:: php
|
||||
|
||||
$reader = new \Doctrine\Common\Annotations\AnnotationReader();
|
||||
$reader->setEnabledPhpImports(false);
|
||||
443
vendor/doctrine/annotations/docs/en/custom.rst
vendored
443
vendor/doctrine/annotations/docs/en/custom.rst
vendored
@@ -1,443 +0,0 @@
|
||||
Custom Annotation Classes
|
||||
=========================
|
||||
|
||||
If you want to define your own annotations, you just have to group them
|
||||
in a namespace and register this namespace in the ``AnnotationRegistry``.
|
||||
Annotation classes have to contain a class-level docblock with the text
|
||||
``@Annotation``:
|
||||
|
||||
.. code-block:: php
|
||||
|
||||
namespace MyCompany\Annotations;
|
||||
|
||||
/** @Annotation */
|
||||
class Bar
|
||||
{
|
||||
// some code
|
||||
}
|
||||
|
||||
Inject annotation values
|
||||
------------------------
|
||||
|
||||
The annotation parser checks if the annotation constructor has arguments,
|
||||
if so then it will pass the value array, otherwise it will try to inject
|
||||
values into public properties directly:
|
||||
|
||||
|
||||
.. code-block:: php
|
||||
|
||||
namespace MyCompany\Annotations;
|
||||
|
||||
/**
|
||||
* @Annotation
|
||||
*
|
||||
* Some Annotation using a constructor
|
||||
*/
|
||||
class Bar
|
||||
{
|
||||
private $foo;
|
||||
|
||||
public function __construct(array $values)
|
||||
{
|
||||
$this->foo = $values['foo'];
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @Annotation
|
||||
*
|
||||
* Some Annotation without a constructor
|
||||
*/
|
||||
class Foo
|
||||
{
|
||||
public $bar;
|
||||
}
|
||||
|
||||
Optional: Constructors with Named Parameters
|
||||
--------------------------------------------
|
||||
|
||||
Starting with Annotations v1.11 a new annotation instantiation strategy
|
||||
is available that aims at compatibility of Annotation classes with the PHP 8
|
||||
attribute feature. You need to declare a constructor with regular parameter
|
||||
names that match the named arguments in the annotation syntax.
|
||||
|
||||
To enable this feature, you can tag your annotation class with
|
||||
``@NamedArgumentConstructor`` (available from v1.12) or implement the
|
||||
``Doctrine\Common\Annotations\NamedArgumentConstructorAnnotation`` interface
|
||||
(available from v1.11 and deprecated as of v1.12).
|
||||
When using the ``@NamedArgumentConstructor`` tag, the first argument of the
|
||||
constructor is considered as the default one.
|
||||
|
||||
|
||||
Usage with the ``@NamedArgumentContrustor`` tag
|
||||
|
||||
.. code-block:: php
|
||||
|
||||
namespace MyCompany\Annotations;
|
||||
|
||||
/**
|
||||
* @Annotation
|
||||
* @NamedArgumentConstructor
|
||||
*/
|
||||
class Bar implements NamedArgumentConstructorAnnotation
|
||||
{
|
||||
private $foo;
|
||||
|
||||
public function __construct(string $foo)
|
||||
{
|
||||
$this->foo = $foo;
|
||||
}
|
||||
}
|
||||
|
||||
/** Usable with @Bar(foo="baz") */
|
||||
/** Usable with @Bar("baz") */
|
||||
|
||||
In combination with PHP 8's constructor property promotion feature
|
||||
you can simplify this to:
|
||||
|
||||
.. code-block:: php
|
||||
|
||||
namespace MyCompany\Annotations;
|
||||
|
||||
/**
|
||||
* @Annotation
|
||||
* @NamedArgumentConstructor
|
||||
*/
|
||||
class Bar implements NamedArgumentConstructorAnnotation
|
||||
{
|
||||
public function __construct(private string $foo) {}
|
||||
}
|
||||
|
||||
|
||||
Usage with the
|
||||
``Doctrine\Common\Annotations\NamedArgumentConstructorAnnotation``
|
||||
interface (v1.11, deprecated as of v1.12):
|
||||
.. code-block:: php
|
||||
|
||||
namespace MyCompany\Annotations;
|
||||
|
||||
use Doctrine\Common\Annotations\NamedArgumentConstructorAnnotation;
|
||||
|
||||
/** @Annotation */
|
||||
class Bar implements NamedArgumentConstructorAnnotation
|
||||
{
|
||||
private $foo;
|
||||
|
||||
public function __construct(private string $foo) {}
|
||||
}
|
||||
|
||||
/** Usable with @Bar(foo="baz") */
|
||||
|
||||
Annotation Target
|
||||
-----------------
|
||||
|
||||
``@Target`` indicates the kinds of class elements to which an annotation
|
||||
type is applicable. Then you could define one or more targets:
|
||||
|
||||
- ``CLASS`` Allowed in class docblocks
|
||||
- ``PROPERTY`` Allowed in property docblocks
|
||||
- ``METHOD`` Allowed in the method docblocks
|
||||
- ``FUNCTION`` Allowed in function dockblocks
|
||||
- ``ALL`` Allowed in class, property, method and function docblocks
|
||||
- ``ANNOTATION`` Allowed inside other annotations
|
||||
|
||||
If the annotations is not allowed in the current context, an
|
||||
``AnnotationException`` is thrown.
|
||||
|
||||
.. code-block:: php
|
||||
|
||||
namespace MyCompany\Annotations;
|
||||
|
||||
/**
|
||||
* @Annotation
|
||||
* @Target({"METHOD","PROPERTY"})
|
||||
*/
|
||||
class Bar
|
||||
{
|
||||
// some code
|
||||
}
|
||||
|
||||
/**
|
||||
* @Annotation
|
||||
* @Target("CLASS")
|
||||
*/
|
||||
class Foo
|
||||
{
|
||||
// some code
|
||||
}
|
||||
|
||||
Attribute types
|
||||
---------------
|
||||
|
||||
The annotation parser checks the given parameters using the phpdoc
|
||||
annotation ``@var``, The data type could be validated using the ``@var``
|
||||
annotation on the annotation properties or using the ``@Attributes`` and
|
||||
``@Attribute`` annotations.
|
||||
|
||||
If the data type does not match you get an ``AnnotationException``
|
||||
|
||||
.. code-block:: php
|
||||
|
||||
namespace MyCompany\Annotations;
|
||||
|
||||
/**
|
||||
* @Annotation
|
||||
* @Target({"METHOD","PROPERTY"})
|
||||
*/
|
||||
class Bar
|
||||
{
|
||||
/** @var mixed */
|
||||
public $mixed;
|
||||
|
||||
/** @var boolean */
|
||||
public $boolean;
|
||||
|
||||
/** @var bool */
|
||||
public $bool;
|
||||
|
||||
/** @var float */
|
||||
public $float;
|
||||
|
||||
/** @var string */
|
||||
public $string;
|
||||
|
||||
/** @var integer */
|
||||
public $integer;
|
||||
|
||||
/** @var array */
|
||||
public $array;
|
||||
|
||||
/** @var SomeAnnotationClass */
|
||||
public $annotation;
|
||||
|
||||
/** @var array<integer> */
|
||||
public $arrayOfIntegers;
|
||||
|
||||
/** @var array<SomeAnnotationClass> */
|
||||
public $arrayOfAnnotations;
|
||||
}
|
||||
|
||||
/**
|
||||
* @Annotation
|
||||
* @Target({"METHOD","PROPERTY"})
|
||||
* @Attributes({
|
||||
* @Attribute("stringProperty", type = "string"),
|
||||
* @Attribute("annotProperty", type = "SomeAnnotationClass"),
|
||||
* })
|
||||
*/
|
||||
class Foo
|
||||
{
|
||||
public function __construct(array $values)
|
||||
{
|
||||
$this->stringProperty = $values['stringProperty'];
|
||||
$this->annotProperty = $values['annotProperty'];
|
||||
}
|
||||
|
||||
// some code
|
||||
}
|
||||
|
||||
Annotation Required
|
||||
-------------------
|
||||
|
||||
``@Required`` indicates that the field must be specified when the
|
||||
annotation is used. If it is not used you get an ``AnnotationException``
|
||||
stating that this value can not be null.
|
||||
|
||||
Declaring a required field:
|
||||
|
||||
.. code-block:: php
|
||||
|
||||
/**
|
||||
* @Annotation
|
||||
* @Target("ALL")
|
||||
*/
|
||||
class Foo
|
||||
{
|
||||
/** @Required */
|
||||
public $requiredField;
|
||||
}
|
||||
|
||||
Usage:
|
||||
|
||||
.. code-block:: php
|
||||
|
||||
/** @Foo(requiredField="value") */
|
||||
public $direction; // Valid
|
||||
|
||||
/** @Foo */
|
||||
public $direction; // Required field missing, throws an AnnotationException
|
||||
|
||||
|
||||
Enumerated values
|
||||
-----------------
|
||||
|
||||
- An annotation property marked with ``@Enum`` is a field that accepts a
|
||||
fixed set of scalar values.
|
||||
- You should use ``@Enum`` fields any time you need to represent fixed
|
||||
values.
|
||||
- The annotation parser checks the given value and throws an
|
||||
``AnnotationException`` if the value does not match.
|
||||
|
||||
|
||||
Declaring an enumerated property:
|
||||
|
||||
.. code-block:: php
|
||||
|
||||
/**
|
||||
* @Annotation
|
||||
* @Target("ALL")
|
||||
*/
|
||||
class Direction
|
||||
{
|
||||
/**
|
||||
* @Enum({"NORTH", "SOUTH", "EAST", "WEST"})
|
||||
*/
|
||||
public $value;
|
||||
}
|
||||
|
||||
Annotation usage:
|
||||
|
||||
.. code-block:: php
|
||||
|
||||
/** @Direction("NORTH") */
|
||||
public $direction; // Valid value
|
||||
|
||||
/** @Direction("NORTHEAST") */
|
||||
public $direction; // Invalid value, throws an AnnotationException
|
||||
|
||||
|
||||
Constants
|
||||
---------
|
||||
|
||||
The use of constants and class constants is available on the annotations
|
||||
parser.
|
||||
|
||||
The following usages are allowed:
|
||||
|
||||
.. code-block:: php
|
||||
|
||||
namespace MyCompany\Entity;
|
||||
|
||||
use MyCompany\Annotations\Foo;
|
||||
use MyCompany\Annotations\Bar;
|
||||
use MyCompany\Entity\SomeClass;
|
||||
|
||||
/**
|
||||
* @Foo(PHP_EOL)
|
||||
* @Bar(Bar::FOO)
|
||||
* @Foo({SomeClass::FOO, SomeClass::BAR})
|
||||
* @Bar({SomeClass::FOO_KEY = SomeClass::BAR_VALUE})
|
||||
*/
|
||||
class User
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
Be careful with constants and the cache !
|
||||
|
||||
.. note::
|
||||
|
||||
The cached reader will not re-evaluate each time an annotation is
|
||||
loaded from cache. When a constant is changed the cache must be
|
||||
cleaned.
|
||||
|
||||
|
||||
Usage
|
||||
-----
|
||||
|
||||
Using the library API is simple. Using the annotations described in the
|
||||
previous section, you can now annotate other classes with your
|
||||
annotations:
|
||||
|
||||
.. code-block:: php
|
||||
|
||||
namespace MyCompany\Entity;
|
||||
|
||||
use MyCompany\Annotations\Foo;
|
||||
use MyCompany\Annotations\Bar;
|
||||
|
||||
/**
|
||||
* @Foo(bar="foo")
|
||||
* @Bar(foo="bar")
|
||||
*/
|
||||
class User
|
||||
{
|
||||
}
|
||||
|
||||
Now we can write a script to get the annotations above:
|
||||
|
||||
.. code-block:: php
|
||||
|
||||
$reflClass = new ReflectionClass('MyCompany\Entity\User');
|
||||
$classAnnotations = $reader->getClassAnnotations($reflClass);
|
||||
|
||||
foreach ($classAnnotations AS $annot) {
|
||||
if ($annot instanceof \MyCompany\Annotations\Foo) {
|
||||
echo $annot->bar; // prints "foo";
|
||||
} else if ($annot instanceof \MyCompany\Annotations\Bar) {
|
||||
echo $annot->foo; // prints "bar";
|
||||
}
|
||||
}
|
||||
|
||||
You have a complete API for retrieving annotation class instances from a
|
||||
class, property or method docblock:
|
||||
|
||||
|
||||
Reader API
|
||||
~~~~~~~~~~
|
||||
|
||||
Access all annotations of a class
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
.. code-block:: php
|
||||
|
||||
public function getClassAnnotations(\ReflectionClass $class);
|
||||
|
||||
Access one annotation of a class
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
.. code-block:: php
|
||||
|
||||
public function getClassAnnotation(\ReflectionClass $class, $annotationName);
|
||||
|
||||
Access all annotations of a method
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
.. code-block:: php
|
||||
|
||||
public function getMethodAnnotations(\ReflectionMethod $method);
|
||||
|
||||
Access one annotation of a method
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
.. code-block:: php
|
||||
|
||||
public function getMethodAnnotation(\ReflectionMethod $method, $annotationName);
|
||||
|
||||
Access all annotations of a property
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
.. code-block:: php
|
||||
|
||||
public function getPropertyAnnotations(\ReflectionProperty $property);
|
||||
|
||||
Access one annotation of a property
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
.. code-block:: php
|
||||
|
||||
public function getPropertyAnnotation(\ReflectionProperty $property, $annotationName);
|
||||
|
||||
Access all annotations of a function
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
.. code-block:: php
|
||||
|
||||
public function getFunctionAnnotations(\ReflectionFunction $property);
|
||||
|
||||
Access one annotation of a function
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
.. code-block:: php
|
||||
|
||||
public function getFunctionAnnotation(\ReflectionFunction $property, $annotationName);
|
||||
101
vendor/doctrine/annotations/docs/en/index.rst
vendored
101
vendor/doctrine/annotations/docs/en/index.rst
vendored
@@ -1,101 +0,0 @@
|
||||
Introduction
|
||||
============
|
||||
|
||||
Doctrine Annotations allows to implement custom annotation
|
||||
functionality for PHP classes and functions.
|
||||
|
||||
.. code-block:: php
|
||||
|
||||
class Foo
|
||||
{
|
||||
/**
|
||||
* @MyAnnotation(myProperty="value")
|
||||
*/
|
||||
private $bar;
|
||||
}
|
||||
|
||||
Annotations aren't implemented in PHP itself which is why this component
|
||||
offers a way to use the PHP doc-blocks as a place for the well known
|
||||
annotation syntax using the ``@`` char.
|
||||
|
||||
Annotations in Doctrine are used for the ORM configuration to build the
|
||||
class mapping, but it can be used in other projects for other purposes
|
||||
too.
|
||||
|
||||
Installation
|
||||
============
|
||||
|
||||
You can install the Annotation component with composer:
|
||||
|
||||
.. code-block::
|
||||
|
||||
$ composer require doctrine/annotations
|
||||
|
||||
Create an annotation class
|
||||
==========================
|
||||
|
||||
An annotation class is a representation of the later used annotation
|
||||
configuration in classes. The annotation class of the previous example
|
||||
looks like this:
|
||||
|
||||
.. code-block:: php
|
||||
|
||||
/**
|
||||
* @Annotation
|
||||
*/
|
||||
final class MyAnnotation
|
||||
{
|
||||
public $myProperty;
|
||||
}
|
||||
|
||||
The annotation class is declared as an annotation by ``@Annotation``.
|
||||
|
||||
:ref:`Read more about custom annotations. <custom>`
|
||||
|
||||
Reading annotations
|
||||
===================
|
||||
|
||||
The access to the annotations happens by reflection of the class or function
|
||||
containing them. There are multiple reader-classes implementing the
|
||||
``Doctrine\Common\Annotations\Reader`` interface, that can access the
|
||||
annotations of a class. A common one is
|
||||
``Doctrine\Common\Annotations\AnnotationReader``:
|
||||
|
||||
.. code-block:: php
|
||||
|
||||
use Doctrine\Common\Annotations\AnnotationReader;
|
||||
use Doctrine\Common\Annotations\AnnotationRegistry;
|
||||
|
||||
// Deprecated and will be removed in 2.0 but currently needed
|
||||
AnnotationRegistry::registerLoader('class_exists');
|
||||
|
||||
$reflectionClass = new ReflectionClass(Foo::class);
|
||||
$property = $reflectionClass->getProperty('bar');
|
||||
|
||||
$reader = new AnnotationReader();
|
||||
$myAnnotation = $reader->getPropertyAnnotation(
|
||||
$property,
|
||||
MyAnnotation::class
|
||||
);
|
||||
|
||||
echo $myAnnotation->myProperty; // result: "value"
|
||||
|
||||
Note that ``AnnotationRegistry::registerLoader('class_exists')`` only works
|
||||
if you already have an autoloader configured (i.e. composer autoloader).
|
||||
Otherwise, :ref:`please take a look to the other annotation autoload mechanisms <annotations>`.
|
||||
|
||||
A reader has multiple methods to access the annotations of a class or
|
||||
function.
|
||||
|
||||
:ref:`Read more about handling annotations. <annotations>`
|
||||
|
||||
IDE Support
|
||||
-----------
|
||||
|
||||
Some IDEs already provide support for annotations:
|
||||
|
||||
- Eclipse via the `Symfony2 Plugin <https://github.com/pulse00/Symfony-2-Eclipse-Plugin>`_
|
||||
- PhpStorm via the `PHP Annotations Plugin <https://plugins.jetbrains.com/plugin/7320-php-annotations>`_ or the `Symfony Plugin <https://plugins.jetbrains.com/plugin/7219-symfony-support>`_
|
||||
|
||||
.. _Read more about handling annotations.: annotations
|
||||
.. _Read more about custom annotations.: custom
|
||||
@@ -1,6 +0,0 @@
|
||||
.. toctree::
|
||||
:depth: 3
|
||||
|
||||
index
|
||||
annotations
|
||||
custom
|
||||
@@ -1,59 +0,0 @@
|
||||
<?php
|
||||
|
||||
namespace Doctrine\Common\Annotations;
|
||||
|
||||
use BadMethodCallException;
|
||||
|
||||
use function sprintf;
|
||||
|
||||
/**
|
||||
* Annotations class.
|
||||
*/
|
||||
class Annotation
|
||||
{
|
||||
/**
|
||||
* Value property. Common among all derived classes.
|
||||
*
|
||||
* @var mixed
|
||||
*/
|
||||
public $value;
|
||||
|
||||
/**
|
||||
* @param array<string, mixed> $data Key-value for properties to be defined in this class.
|
||||
*/
|
||||
final public function __construct(array $data)
|
||||
{
|
||||
foreach ($data as $key => $value) {
|
||||
$this->$key = $value;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Error handler for unknown property accessor in Annotation class.
|
||||
*
|
||||
* @param string $name Unknown property name.
|
||||
*
|
||||
* @throws BadMethodCallException
|
||||
*/
|
||||
public function __get($name)
|
||||
{
|
||||
throw new BadMethodCallException(
|
||||
sprintf("Unknown property '%s' on annotation '%s'.", $name, static::class)
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Error handler for unknown property mutator in Annotation class.
|
||||
*
|
||||
* @param string $name Unknown property name.
|
||||
* @param mixed $value Property value.
|
||||
*
|
||||
* @throws BadMethodCallException
|
||||
*/
|
||||
public function __set($name, $value)
|
||||
{
|
||||
throw new BadMethodCallException(
|
||||
sprintf("Unknown property '%s' on annotation '%s'.", $name, static::class)
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -1,21 +0,0 @@
|
||||
<?php
|
||||
|
||||
namespace Doctrine\Common\Annotations\Annotation;
|
||||
|
||||
/**
|
||||
* Annotation that can be used to signal to the parser
|
||||
* to check the attribute type during the parsing process.
|
||||
*
|
||||
* @Annotation
|
||||
*/
|
||||
final class Attribute
|
||||
{
|
||||
/** @var string */
|
||||
public $name;
|
||||
|
||||
/** @var string */
|
||||
public $type;
|
||||
|
||||
/** @var bool */
|
||||
public $required = false;
|
||||
}
|
||||
@@ -1,15 +0,0 @@
|
||||
<?php
|
||||
|
||||
namespace Doctrine\Common\Annotations\Annotation;
|
||||
|
||||
/**
|
||||
* Annotation that can be used to signal to the parser
|
||||
* to check the types of all declared attributes during the parsing process.
|
||||
*
|
||||
* @Annotation
|
||||
*/
|
||||
final class Attributes
|
||||
{
|
||||
/** @var array<Attribute> */
|
||||
public $value;
|
||||
}
|
||||
@@ -1,69 +0,0 @@
|
||||
<?php
|
||||
|
||||
namespace Doctrine\Common\Annotations\Annotation;
|
||||
|
||||
use InvalidArgumentException;
|
||||
|
||||
use function get_class;
|
||||
use function gettype;
|
||||
use function in_array;
|
||||
use function is_object;
|
||||
use function is_scalar;
|
||||
use function sprintf;
|
||||
|
||||
/**
|
||||
* Annotation that can be used to signal to the parser
|
||||
* to check the available values during the parsing process.
|
||||
*
|
||||
* @Annotation
|
||||
* @Attributes({
|
||||
* @Attribute("value", required = true, type = "array"),
|
||||
* @Attribute("literal", required = false, type = "array")
|
||||
* })
|
||||
*/
|
||||
final class Enum
|
||||
{
|
||||
/** @phpstan-var list<scalar> */
|
||||
public $value;
|
||||
|
||||
/**
|
||||
* Literal target declaration.
|
||||
*
|
||||
* @var mixed[]
|
||||
*/
|
||||
public $literal;
|
||||
|
||||
/**
|
||||
* @throws InvalidArgumentException
|
||||
*
|
||||
* @phpstan-param array{literal?: mixed[], value: list<scalar>} $values
|
||||
*/
|
||||
public function __construct(array $values)
|
||||
{
|
||||
if (! isset($values['literal'])) {
|
||||
$values['literal'] = [];
|
||||
}
|
||||
|
||||
foreach ($values['value'] as $var) {
|
||||
if (! is_scalar($var)) {
|
||||
throw new InvalidArgumentException(sprintf(
|
||||
'@Enum supports only scalar values "%s" given.',
|
||||
is_object($var) ? get_class($var) : gettype($var)
|
||||
));
|
||||
}
|
||||
}
|
||||
|
||||
foreach ($values['literal'] as $key => $var) {
|
||||
if (! in_array($key, $values['value'])) {
|
||||
throw new InvalidArgumentException(sprintf(
|
||||
'Undefined enumerator value "%s" for literal "%s".',
|
||||
$key,
|
||||
$var
|
||||
));
|
||||
}
|
||||
}
|
||||
|
||||
$this->value = $values['value'];
|
||||
$this->literal = $values['literal'];
|
||||
}
|
||||
}
|
||||
@@ -1,43 +0,0 @@
|
||||
<?php
|
||||
|
||||
namespace Doctrine\Common\Annotations\Annotation;
|
||||
|
||||
use RuntimeException;
|
||||
|
||||
use function is_array;
|
||||
use function is_string;
|
||||
use function json_encode;
|
||||
use function sprintf;
|
||||
|
||||
/**
|
||||
* Annotation that can be used to signal to the parser to ignore specific
|
||||
* annotations during the parsing process.
|
||||
*
|
||||
* @Annotation
|
||||
*/
|
||||
final class IgnoreAnnotation
|
||||
{
|
||||
/** @phpstan-var list<string> */
|
||||
public $names;
|
||||
|
||||
/**
|
||||
* @throws RuntimeException
|
||||
*
|
||||
* @phpstan-param array{value: string|list<string>} $values
|
||||
*/
|
||||
public function __construct(array $values)
|
||||
{
|
||||
if (is_string($values['value'])) {
|
||||
$values['value'] = [$values['value']];
|
||||
}
|
||||
|
||||
if (! is_array($values['value'])) {
|
||||
throw new RuntimeException(sprintf(
|
||||
'@IgnoreAnnotation expects either a string name, or an array of strings, but got %s.',
|
||||
json_encode($values['value'])
|
||||
));
|
||||
}
|
||||
|
||||
$this->names = $values['value'];
|
||||
}
|
||||
}
|
||||
@@ -1,13 +0,0 @@
|
||||
<?php
|
||||
|
||||
namespace Doctrine\Common\Annotations\Annotation;
|
||||
|
||||
/**
|
||||
* Annotation that indicates that the annotated class should be constructed with a named argument call.
|
||||
*
|
||||
* @Annotation
|
||||
* @Target("CLASS")
|
||||
*/
|
||||
final class NamedArgumentConstructor
|
||||
{
|
||||
}
|
||||
@@ -1,13 +0,0 @@
|
||||
<?php
|
||||
|
||||
namespace Doctrine\Common\Annotations\Annotation;
|
||||
|
||||
/**
|
||||
* Annotation that can be used to signal to the parser
|
||||
* to check if that attribute is required during the parsing process.
|
||||
*
|
||||
* @Annotation
|
||||
*/
|
||||
final class Required
|
||||
{
|
||||
}
|
||||
@@ -1,101 +0,0 @@
|
||||
<?php
|
||||
|
||||
namespace Doctrine\Common\Annotations\Annotation;
|
||||
|
||||
use InvalidArgumentException;
|
||||
|
||||
use function array_keys;
|
||||
use function get_class;
|
||||
use function gettype;
|
||||
use function implode;
|
||||
use function is_array;
|
||||
use function is_object;
|
||||
use function is_string;
|
||||
use function sprintf;
|
||||
|
||||
/**
|
||||
* Annotation that can be used to signal to the parser
|
||||
* to check the annotation target during the parsing process.
|
||||
*
|
||||
* @Annotation
|
||||
*/
|
||||
final class Target
|
||||
{
|
||||
public const TARGET_CLASS = 1;
|
||||
public const TARGET_METHOD = 2;
|
||||
public const TARGET_PROPERTY = 4;
|
||||
public const TARGET_ANNOTATION = 8;
|
||||
public const TARGET_FUNCTION = 16;
|
||||
public const TARGET_ALL = 31;
|
||||
|
||||
/** @var array<string, int> */
|
||||
private static $map = [
|
||||
'ALL' => self::TARGET_ALL,
|
||||
'CLASS' => self::TARGET_CLASS,
|
||||
'METHOD' => self::TARGET_METHOD,
|
||||
'PROPERTY' => self::TARGET_PROPERTY,
|
||||
'FUNCTION' => self::TARGET_FUNCTION,
|
||||
'ANNOTATION' => self::TARGET_ANNOTATION,
|
||||
];
|
||||
|
||||
/** @phpstan-var list<string> */
|
||||
public $value;
|
||||
|
||||
/**
|
||||
* Targets as bitmask.
|
||||
*
|
||||
* @var int
|
||||
*/
|
||||
public $targets;
|
||||
|
||||
/**
|
||||
* Literal target declaration.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
public $literal;
|
||||
|
||||
/**
|
||||
* @throws InvalidArgumentException
|
||||
*
|
||||
* @phpstan-param array{value?: string|list<string>} $values
|
||||
*/
|
||||
public function __construct(array $values)
|
||||
{
|
||||
if (! isset($values['value'])) {
|
||||
$values['value'] = null;
|
||||
}
|
||||
|
||||
if (is_string($values['value'])) {
|
||||
$values['value'] = [$values['value']];
|
||||
}
|
||||
|
||||
if (! is_array($values['value'])) {
|
||||
throw new InvalidArgumentException(
|
||||
sprintf(
|
||||
'@Target expects either a string value, or an array of strings, "%s" given.',
|
||||
is_object($values['value']) ? get_class($values['value']) : gettype($values['value'])
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
$bitmask = 0;
|
||||
foreach ($values['value'] as $literal) {
|
||||
if (! isset(self::$map[$literal])) {
|
||||
throw new InvalidArgumentException(
|
||||
sprintf(
|
||||
'Invalid Target "%s". Available targets: [%s]',
|
||||
$literal,
|
||||
implode(', ', array_keys(self::$map))
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
$bitmask |= self::$map[$literal];
|
||||
}
|
||||
|
||||
$this->targets = $bitmask;
|
||||
$this->value = $values['value'];
|
||||
$this->literal = implode(', ', $this->value);
|
||||
}
|
||||
}
|
||||
@@ -1,171 +0,0 @@
|
||||
<?php
|
||||
|
||||
namespace Doctrine\Common\Annotations;
|
||||
|
||||
use Exception;
|
||||
|
||||
use function get_class;
|
||||
use function gettype;
|
||||
use function implode;
|
||||
use function is_object;
|
||||
use function sprintf;
|
||||
|
||||
/**
|
||||
* Description of AnnotationException
|
||||
*/
|
||||
class AnnotationException extends Exception
|
||||
{
|
||||
/**
|
||||
* Creates a new AnnotationException describing a Syntax error.
|
||||
*
|
||||
* @param string $message Exception message
|
||||
*
|
||||
* @return AnnotationException
|
||||
*/
|
||||
public static function syntaxError($message)
|
||||
{
|
||||
return new self('[Syntax Error] ' . $message);
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a new AnnotationException describing a Semantical error.
|
||||
*
|
||||
* @param string $message Exception message
|
||||
*
|
||||
* @return AnnotationException
|
||||
*/
|
||||
public static function semanticalError($message)
|
||||
{
|
||||
return new self('[Semantical Error] ' . $message);
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a new AnnotationException describing an error which occurred during
|
||||
* the creation of the annotation.
|
||||
*
|
||||
* @param string $message
|
||||
*
|
||||
* @return AnnotationException
|
||||
*/
|
||||
public static function creationError($message)
|
||||
{
|
||||
return new self('[Creation Error] ' . $message);
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a new AnnotationException describing a type error.
|
||||
*
|
||||
* @param string $message
|
||||
*
|
||||
* @return AnnotationException
|
||||
*/
|
||||
public static function typeError($message)
|
||||
{
|
||||
return new self('[Type Error] ' . $message);
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a new AnnotationException describing a constant semantical error.
|
||||
*
|
||||
* @param string $identifier
|
||||
* @param string $context
|
||||
*
|
||||
* @return AnnotationException
|
||||
*/
|
||||
public static function semanticalErrorConstants($identifier, $context = null)
|
||||
{
|
||||
return self::semanticalError(sprintf(
|
||||
"Couldn't find constant %s%s.",
|
||||
$identifier,
|
||||
$context ? ', ' . $context : ''
|
||||
));
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a new AnnotationException describing an type error of an attribute.
|
||||
*
|
||||
* @param string $attributeName
|
||||
* @param string $annotationName
|
||||
* @param string $context
|
||||
* @param string $expected
|
||||
* @param mixed $actual
|
||||
*
|
||||
* @return AnnotationException
|
||||
*/
|
||||
public static function attributeTypeError($attributeName, $annotationName, $context, $expected, $actual)
|
||||
{
|
||||
return self::typeError(sprintf(
|
||||
'Attribute "%s" of @%s declared on %s expects %s, but got %s.',
|
||||
$attributeName,
|
||||
$annotationName,
|
||||
$context,
|
||||
$expected,
|
||||
is_object($actual) ? 'an instance of ' . get_class($actual) : gettype($actual)
|
||||
));
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a new AnnotationException describing an required error of an attribute.
|
||||
*
|
||||
* @param string $attributeName
|
||||
* @param string $annotationName
|
||||
* @param string $context
|
||||
* @param string $expected
|
||||
*
|
||||
* @return AnnotationException
|
||||
*/
|
||||
public static function requiredError($attributeName, $annotationName, $context, $expected)
|
||||
{
|
||||
return self::typeError(sprintf(
|
||||
'Attribute "%s" of @%s declared on %s expects %s. This value should not be null.',
|
||||
$attributeName,
|
||||
$annotationName,
|
||||
$context,
|
||||
$expected
|
||||
));
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a new AnnotationException describing a invalid enummerator.
|
||||
*
|
||||
* @param string $attributeName
|
||||
* @param string $annotationName
|
||||
* @param string $context
|
||||
* @param mixed $given
|
||||
*
|
||||
* @return AnnotationException
|
||||
*
|
||||
* @phpstan-param list<string> $available
|
||||
*/
|
||||
public static function enumeratorError($attributeName, $annotationName, $context, $available, $given)
|
||||
{
|
||||
return new self(sprintf(
|
||||
'[Enum Error] Attribute "%s" of @%s declared on %s accepts only [%s], but got %s.',
|
||||
$attributeName,
|
||||
$annotationName,
|
||||
$context,
|
||||
implode(', ', $available),
|
||||
is_object($given) ? get_class($given) : $given
|
||||
));
|
||||
}
|
||||
|
||||
/**
|
||||
* @return AnnotationException
|
||||
*/
|
||||
public static function optimizerPlusSaveComments()
|
||||
{
|
||||
return new self(
|
||||
'You have to enable opcache.save_comments=1 or zend_optimizerplus.save_comments=1.'
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return AnnotationException
|
||||
*/
|
||||
public static function optimizerPlusLoadComments()
|
||||
{
|
||||
return new self(
|
||||
'You have to enable opcache.load_comments=1 or zend_optimizerplus.load_comments=1.'
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -1,389 +0,0 @@
|
||||
<?php
|
||||
|
||||
namespace Doctrine\Common\Annotations;
|
||||
|
||||
use Doctrine\Common\Annotations\Annotation\IgnoreAnnotation;
|
||||
use Doctrine\Common\Annotations\Annotation\Target;
|
||||
use ReflectionClass;
|
||||
use ReflectionFunction;
|
||||
use ReflectionMethod;
|
||||
use ReflectionProperty;
|
||||
|
||||
use function array_merge;
|
||||
use function class_exists;
|
||||
use function extension_loaded;
|
||||
use function ini_get;
|
||||
|
||||
/**
|
||||
* A reader for docblock annotations.
|
||||
*/
|
||||
class AnnotationReader implements Reader
|
||||
{
|
||||
/**
|
||||
* Global map for imports.
|
||||
*
|
||||
* @var array<string, class-string>
|
||||
*/
|
||||
private static $globalImports = [
|
||||
'ignoreannotation' => Annotation\IgnoreAnnotation::class,
|
||||
];
|
||||
|
||||
/**
|
||||
* A list with annotations that are not causing exceptions when not resolved to an annotation class.
|
||||
*
|
||||
* The names are case sensitive.
|
||||
*
|
||||
* @var array<string, true>
|
||||
*/
|
||||
private static $globalIgnoredNames = ImplicitlyIgnoredAnnotationNames::LIST;
|
||||
|
||||
/**
|
||||
* A list with annotations that are not causing exceptions when not resolved to an annotation class.
|
||||
*
|
||||
* The names are case sensitive.
|
||||
*
|
||||
* @var array<string, true>
|
||||
*/
|
||||
private static $globalIgnoredNamespaces = [];
|
||||
|
||||
/**
|
||||
* Add a new annotation to the globally ignored annotation names with regard to exception handling.
|
||||
*
|
||||
* @param string $name
|
||||
*/
|
||||
public static function addGlobalIgnoredName($name)
|
||||
{
|
||||
self::$globalIgnoredNames[$name] = true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Add a new annotation to the globally ignored annotation namespaces with regard to exception handling.
|
||||
*
|
||||
* @param string $namespace
|
||||
*/
|
||||
public static function addGlobalIgnoredNamespace($namespace)
|
||||
{
|
||||
self::$globalIgnoredNamespaces[$namespace] = true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Annotations parser.
|
||||
*
|
||||
* @var DocParser
|
||||
*/
|
||||
private $parser;
|
||||
|
||||
/**
|
||||
* Annotations parser used to collect parsing metadata.
|
||||
*
|
||||
* @var DocParser
|
||||
*/
|
||||
private $preParser;
|
||||
|
||||
/**
|
||||
* PHP parser used to collect imports.
|
||||
*
|
||||
* @var PhpParser
|
||||
*/
|
||||
private $phpParser;
|
||||
|
||||
/**
|
||||
* In-memory cache mechanism to store imported annotations per class.
|
||||
*
|
||||
* @psalm-var array<'class'|'function', array<string, array<string, class-string>>>
|
||||
*/
|
||||
private $imports = [];
|
||||
|
||||
/**
|
||||
* In-memory cache mechanism to store ignored annotations per class.
|
||||
*
|
||||
* @psalm-var array<'class'|'function', array<string, array<string, true>>>
|
||||
*/
|
||||
private $ignoredAnnotationNames = [];
|
||||
|
||||
/**
|
||||
* Initializes a new AnnotationReader.
|
||||
*
|
||||
* @throws AnnotationException
|
||||
*/
|
||||
public function __construct(?DocParser $parser = null)
|
||||
{
|
||||
if (
|
||||
extension_loaded('Zend Optimizer+') && (ini_get('zend_optimizerplus.save_comments') === '0' ||
|
||||
ini_get('opcache.save_comments') === '0')
|
||||
) {
|
||||
throw AnnotationException::optimizerPlusSaveComments();
|
||||
}
|
||||
|
||||
if (extension_loaded('Zend OPcache') && ini_get('opcache.save_comments') === 0) {
|
||||
throw AnnotationException::optimizerPlusSaveComments();
|
||||
}
|
||||
|
||||
// Make sure that the IgnoreAnnotation annotation is loaded
|
||||
class_exists(IgnoreAnnotation::class);
|
||||
|
||||
$this->parser = $parser ?: new DocParser();
|
||||
|
||||
$this->preParser = new DocParser();
|
||||
|
||||
$this->preParser->setImports(self::$globalImports);
|
||||
$this->preParser->setIgnoreNotImportedAnnotations(true);
|
||||
$this->preParser->setIgnoredAnnotationNames(self::$globalIgnoredNames);
|
||||
|
||||
$this->phpParser = new PhpParser();
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
public function getClassAnnotations(ReflectionClass $class)
|
||||
{
|
||||
$this->parser->setTarget(Target::TARGET_CLASS);
|
||||
$this->parser->setImports($this->getImports($class));
|
||||
$this->parser->setIgnoredAnnotationNames($this->getIgnoredAnnotationNames($class));
|
||||
$this->parser->setIgnoredAnnotationNamespaces(self::$globalIgnoredNamespaces);
|
||||
|
||||
return $this->parser->parse($class->getDocComment(), 'class ' . $class->getName());
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
public function getClassAnnotation(ReflectionClass $class, $annotationName)
|
||||
{
|
||||
$annotations = $this->getClassAnnotations($class);
|
||||
|
||||
foreach ($annotations as $annotation) {
|
||||
if ($annotation instanceof $annotationName) {
|
||||
return $annotation;
|
||||
}
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
public function getPropertyAnnotations(ReflectionProperty $property)
|
||||
{
|
||||
$class = $property->getDeclaringClass();
|
||||
$context = 'property ' . $class->getName() . '::$' . $property->getName();
|
||||
|
||||
$this->parser->setTarget(Target::TARGET_PROPERTY);
|
||||
$this->parser->setImports($this->getPropertyImports($property));
|
||||
$this->parser->setIgnoredAnnotationNames($this->getIgnoredAnnotationNames($class));
|
||||
$this->parser->setIgnoredAnnotationNamespaces(self::$globalIgnoredNamespaces);
|
||||
|
||||
return $this->parser->parse($property->getDocComment(), $context);
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
public function getPropertyAnnotation(ReflectionProperty $property, $annotationName)
|
||||
{
|
||||
$annotations = $this->getPropertyAnnotations($property);
|
||||
|
||||
foreach ($annotations as $annotation) {
|
||||
if ($annotation instanceof $annotationName) {
|
||||
return $annotation;
|
||||
}
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
public function getMethodAnnotations(ReflectionMethod $method)
|
||||
{
|
||||
$class = $method->getDeclaringClass();
|
||||
$context = 'method ' . $class->getName() . '::' . $method->getName() . '()';
|
||||
|
||||
$this->parser->setTarget(Target::TARGET_METHOD);
|
||||
$this->parser->setImports($this->getMethodImports($method));
|
||||
$this->parser->setIgnoredAnnotationNames($this->getIgnoredAnnotationNames($class));
|
||||
$this->parser->setIgnoredAnnotationNamespaces(self::$globalIgnoredNamespaces);
|
||||
|
||||
return $this->parser->parse($method->getDocComment(), $context);
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
public function getMethodAnnotation(ReflectionMethod $method, $annotationName)
|
||||
{
|
||||
$annotations = $this->getMethodAnnotations($method);
|
||||
|
||||
foreach ($annotations as $annotation) {
|
||||
if ($annotation instanceof $annotationName) {
|
||||
return $annotation;
|
||||
}
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the annotations applied to a function.
|
||||
*
|
||||
* @phpstan-return list<object> An array of Annotations.
|
||||
*/
|
||||
public function getFunctionAnnotations(ReflectionFunction $function): array
|
||||
{
|
||||
$context = 'function ' . $function->getName();
|
||||
|
||||
$this->parser->setTarget(Target::TARGET_FUNCTION);
|
||||
$this->parser->setImports($this->getImports($function));
|
||||
$this->parser->setIgnoredAnnotationNames($this->getIgnoredAnnotationNames($function));
|
||||
$this->parser->setIgnoredAnnotationNamespaces(self::$globalIgnoredNamespaces);
|
||||
|
||||
return $this->parser->parse($function->getDocComment(), $context);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets a function annotation.
|
||||
*
|
||||
* @return object|null The Annotation or NULL, if the requested annotation does not exist.
|
||||
*/
|
||||
public function getFunctionAnnotation(ReflectionFunction $function, string $annotationName)
|
||||
{
|
||||
$annotations = $this->getFunctionAnnotations($function);
|
||||
|
||||
foreach ($annotations as $annotation) {
|
||||
if ($annotation instanceof $annotationName) {
|
||||
return $annotation;
|
||||
}
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the ignored annotations for the given class or function.
|
||||
*
|
||||
* @param ReflectionClass|ReflectionFunction $reflection
|
||||
*
|
||||
* @return array<string, true>
|
||||
*/
|
||||
private function getIgnoredAnnotationNames($reflection): array
|
||||
{
|
||||
$type = $reflection instanceof ReflectionClass ? 'class' : 'function';
|
||||
$name = $reflection->getName();
|
||||
|
||||
if (isset($this->ignoredAnnotationNames[$type][$name])) {
|
||||
return $this->ignoredAnnotationNames[$type][$name];
|
||||
}
|
||||
|
||||
$this->collectParsingMetadata($reflection);
|
||||
|
||||
return $this->ignoredAnnotationNames[$type][$name];
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieves imports for a class or a function.
|
||||
*
|
||||
* @param ReflectionClass|ReflectionFunction $reflection
|
||||
*
|
||||
* @return array<string, class-string>
|
||||
*/
|
||||
private function getImports($reflection): array
|
||||
{
|
||||
$type = $reflection instanceof ReflectionClass ? 'class' : 'function';
|
||||
$name = $reflection->getName();
|
||||
|
||||
if (isset($this->imports[$type][$name])) {
|
||||
return $this->imports[$type][$name];
|
||||
}
|
||||
|
||||
$this->collectParsingMetadata($reflection);
|
||||
|
||||
return $this->imports[$type][$name];
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieves imports for methods.
|
||||
*
|
||||
* @return array<string, class-string>
|
||||
*/
|
||||
private function getMethodImports(ReflectionMethod $method)
|
||||
{
|
||||
$class = $method->getDeclaringClass();
|
||||
$classImports = $this->getImports($class);
|
||||
|
||||
$traitImports = [];
|
||||
|
||||
foreach ($class->getTraits() as $trait) {
|
||||
if (
|
||||
! $trait->hasMethod($method->getName())
|
||||
|| $trait->getFileName() !== $method->getFileName()
|
||||
) {
|
||||
continue;
|
||||
}
|
||||
|
||||
$traitImports = array_merge($traitImports, $this->phpParser->parseUseStatements($trait));
|
||||
}
|
||||
|
||||
return array_merge($classImports, $traitImports);
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieves imports for properties.
|
||||
*
|
||||
* @return array<string, class-string>
|
||||
*/
|
||||
private function getPropertyImports(ReflectionProperty $property)
|
||||
{
|
||||
$class = $property->getDeclaringClass();
|
||||
$classImports = $this->getImports($class);
|
||||
|
||||
$traitImports = [];
|
||||
|
||||
foreach ($class->getTraits() as $trait) {
|
||||
if (! $trait->hasProperty($property->getName())) {
|
||||
continue;
|
||||
}
|
||||
|
||||
$traitImports = array_merge($traitImports, $this->phpParser->parseUseStatements($trait));
|
||||
}
|
||||
|
||||
return array_merge($classImports, $traitImports);
|
||||
}
|
||||
|
||||
/**
|
||||
* Collects parsing metadata for a given class or function.
|
||||
*
|
||||
* @param ReflectionClass|ReflectionFunction $reflection
|
||||
*/
|
||||
private function collectParsingMetadata($reflection): void
|
||||
{
|
||||
$type = $reflection instanceof ReflectionClass ? 'class' : 'function';
|
||||
$name = $reflection->getName();
|
||||
|
||||
$ignoredAnnotationNames = self::$globalIgnoredNames;
|
||||
$annotations = $this->preParser->parse($reflection->getDocComment(), $type . ' ' . $name);
|
||||
|
||||
foreach ($annotations as $annotation) {
|
||||
if (! ($annotation instanceof IgnoreAnnotation)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
foreach ($annotation->names as $annot) {
|
||||
$ignoredAnnotationNames[$annot] = true;
|
||||
}
|
||||
}
|
||||
|
||||
$this->imports[$type][$name] = array_merge(
|
||||
self::$globalImports,
|
||||
$this->phpParser->parseUseStatements($reflection),
|
||||
[
|
||||
'__NAMESPACE__' => $reflection->getNamespaceName(),
|
||||
'self' => $name,
|
||||
]
|
||||
);
|
||||
|
||||
$this->ignoredAnnotationNames[$type][$name] = $ignoredAnnotationNames;
|
||||
}
|
||||
}
|
||||
@@ -1,190 +0,0 @@
|
||||
<?php
|
||||
|
||||
namespace Doctrine\Common\Annotations;
|
||||
|
||||
use function array_key_exists;
|
||||
use function array_merge;
|
||||
use function class_exists;
|
||||
use function in_array;
|
||||
use function is_file;
|
||||
use function str_replace;
|
||||
use function stream_resolve_include_path;
|
||||
use function strpos;
|
||||
|
||||
use const DIRECTORY_SEPARATOR;
|
||||
|
||||
final class AnnotationRegistry
|
||||
{
|
||||
/**
|
||||
* A map of namespaces to use for autoloading purposes based on a PSR-0 convention.
|
||||
*
|
||||
* Contains the namespace as key and an array of directories as value. If the value is NULL
|
||||
* the include path is used for checking for the corresponding file.
|
||||
*
|
||||
* This autoloading mechanism does not utilize the PHP autoloading but implements autoloading on its own.
|
||||
*
|
||||
* @var string[][]|string[]|null[]
|
||||
*/
|
||||
private static $autoloadNamespaces = [];
|
||||
|
||||
/**
|
||||
* A map of autoloader callables.
|
||||
*
|
||||
* @var callable[]
|
||||
*/
|
||||
private static $loaders = [];
|
||||
|
||||
/**
|
||||
* An array of classes which cannot be found
|
||||
*
|
||||
* @var null[] indexed by class name
|
||||
*/
|
||||
private static $failedToAutoload = [];
|
||||
|
||||
/**
|
||||
* Whenever registerFile() was used. Disables use of standard autoloader.
|
||||
*
|
||||
* @var bool
|
||||
*/
|
||||
private static $registerFileUsed = false;
|
||||
|
||||
public static function reset(): void
|
||||
{
|
||||
self::$autoloadNamespaces = [];
|
||||
self::$loaders = [];
|
||||
self::$failedToAutoload = [];
|
||||
self::$registerFileUsed = false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Registers file.
|
||||
*
|
||||
* @deprecated This method is deprecated and will be removed in
|
||||
* doctrine/annotations 2.0. Annotations will be autoloaded in 2.0.
|
||||
*/
|
||||
public static function registerFile(string $file): void
|
||||
{
|
||||
self::$registerFileUsed = true;
|
||||
|
||||
require_once $file;
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds a namespace with one or many directories to look for files or null for the include path.
|
||||
*
|
||||
* Loading of this namespaces will be done with a PSR-0 namespace loading algorithm.
|
||||
*
|
||||
* @deprecated This method is deprecated and will be removed in
|
||||
* doctrine/annotations 2.0. Annotations will be autoloaded in 2.0.
|
||||
*
|
||||
* @phpstan-param string|list<string>|null $dirs
|
||||
*/
|
||||
public static function registerAutoloadNamespace(string $namespace, $dirs = null): void
|
||||
{
|
||||
self::$autoloadNamespaces[$namespace] = $dirs;
|
||||
}
|
||||
|
||||
/**
|
||||
* Registers multiple namespaces.
|
||||
*
|
||||
* Loading of this namespaces will be done with a PSR-0 namespace loading algorithm.
|
||||
*
|
||||
* @deprecated This method is deprecated and will be removed in
|
||||
* doctrine/annotations 2.0. Annotations will be autoloaded in 2.0.
|
||||
*
|
||||
* @param string[][]|string[]|null[] $namespaces indexed by namespace name
|
||||
*/
|
||||
public static function registerAutoloadNamespaces(array $namespaces): void
|
||||
{
|
||||
self::$autoloadNamespaces = array_merge(self::$autoloadNamespaces, $namespaces);
|
||||
}
|
||||
|
||||
/**
|
||||
* Registers an autoloading callable for annotations, much like spl_autoload_register().
|
||||
*
|
||||
* NOTE: These class loaders HAVE to be silent when a class was not found!
|
||||
* IMPORTANT: Loaders have to return true if they loaded a class that could contain the searched annotation class.
|
||||
*
|
||||
* @deprecated This method is deprecated and will be removed in
|
||||
* doctrine/annotations 2.0. Annotations will be autoloaded in 2.0.
|
||||
*/
|
||||
public static function registerLoader(callable $callable): void
|
||||
{
|
||||
// Reset our static cache now that we have a new loader to work with
|
||||
self::$failedToAutoload = [];
|
||||
self::$loaders[] = $callable;
|
||||
}
|
||||
|
||||
/**
|
||||
* Registers an autoloading callable for annotations, if it is not already registered
|
||||
*
|
||||
* @deprecated This method is deprecated and will be removed in
|
||||
* doctrine/annotations 2.0. Annotations will be autoloaded in 2.0.
|
||||
*/
|
||||
public static function registerUniqueLoader(callable $callable): void
|
||||
{
|
||||
if (in_array($callable, self::$loaders, true)) {
|
||||
return;
|
||||
}
|
||||
|
||||
self::registerLoader($callable);
|
||||
}
|
||||
|
||||
/**
|
||||
* Autoloads an annotation class silently.
|
||||
*/
|
||||
public static function loadAnnotationClass(string $class): bool
|
||||
{
|
||||
if (class_exists($class, false)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
if (array_key_exists($class, self::$failedToAutoload)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
foreach (self::$autoloadNamespaces as $namespace => $dirs) {
|
||||
if (strpos($class, $namespace) !== 0) {
|
||||
continue;
|
||||
}
|
||||
|
||||
$file = str_replace('\\', DIRECTORY_SEPARATOR, $class) . '.php';
|
||||
|
||||
if ($dirs === null) {
|
||||
$path = stream_resolve_include_path($file);
|
||||
if ($path) {
|
||||
require $path;
|
||||
|
||||
return true;
|
||||
}
|
||||
} else {
|
||||
foreach ((array) $dirs as $dir) {
|
||||
if (is_file($dir . DIRECTORY_SEPARATOR . $file)) {
|
||||
require $dir . DIRECTORY_SEPARATOR . $file;
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
foreach (self::$loaders as $loader) {
|
||||
if ($loader($class) === true) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
if (
|
||||
self::$loaders === [] &&
|
||||
self::$autoloadNamespaces === [] &&
|
||||
self::$registerFileUsed === false &&
|
||||
class_exists($class)
|
||||
) {
|
||||
return true;
|
||||
}
|
||||
|
||||
self::$failedToAutoload[$class] = null;
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
||||
@@ -1,268 +0,0 @@
|
||||
<?php
|
||||
|
||||
namespace Doctrine\Common\Annotations;
|
||||
|
||||
use Doctrine\Common\Cache\Cache;
|
||||
use ReflectionClass;
|
||||
use ReflectionMethod;
|
||||
use ReflectionProperty;
|
||||
|
||||
use function array_map;
|
||||
use function array_merge;
|
||||
use function assert;
|
||||
use function filemtime;
|
||||
use function max;
|
||||
use function time;
|
||||
|
||||
/**
|
||||
* A cache aware annotation reader.
|
||||
*
|
||||
* @deprecated the CachedReader is deprecated and will be removed
|
||||
* in version 2.0.0 of doctrine/annotations. Please use the
|
||||
* {@see \Doctrine\Common\Annotations\PsrCachedReader} instead.
|
||||
*/
|
||||
final class CachedReader implements Reader
|
||||
{
|
||||
/** @var Reader */
|
||||
private $delegate;
|
||||
|
||||
/** @var Cache */
|
||||
private $cache;
|
||||
|
||||
/** @var bool */
|
||||
private $debug;
|
||||
|
||||
/** @var array<string, array<object>> */
|
||||
private $loadedAnnotations = [];
|
||||
|
||||
/** @var int[] */
|
||||
private $loadedFilemtimes = [];
|
||||
|
||||
/**
|
||||
* @param bool $debug
|
||||
*/
|
||||
public function __construct(Reader $reader, Cache $cache, $debug = false)
|
||||
{
|
||||
$this->delegate = $reader;
|
||||
$this->cache = $cache;
|
||||
$this->debug = (bool) $debug;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
public function getClassAnnotations(ReflectionClass $class)
|
||||
{
|
||||
$cacheKey = $class->getName();
|
||||
|
||||
if (isset($this->loadedAnnotations[$cacheKey])) {
|
||||
return $this->loadedAnnotations[$cacheKey];
|
||||
}
|
||||
|
||||
$annots = $this->fetchFromCache($cacheKey, $class);
|
||||
if ($annots === false) {
|
||||
$annots = $this->delegate->getClassAnnotations($class);
|
||||
$this->saveToCache($cacheKey, $annots);
|
||||
}
|
||||
|
||||
return $this->loadedAnnotations[$cacheKey] = $annots;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
public function getClassAnnotation(ReflectionClass $class, $annotationName)
|
||||
{
|
||||
foreach ($this->getClassAnnotations($class) as $annot) {
|
||||
if ($annot instanceof $annotationName) {
|
||||
return $annot;
|
||||
}
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
public function getPropertyAnnotations(ReflectionProperty $property)
|
||||
{
|
||||
$class = $property->getDeclaringClass();
|
||||
$cacheKey = $class->getName() . '$' . $property->getName();
|
||||
|
||||
if (isset($this->loadedAnnotations[$cacheKey])) {
|
||||
return $this->loadedAnnotations[$cacheKey];
|
||||
}
|
||||
|
||||
$annots = $this->fetchFromCache($cacheKey, $class);
|
||||
if ($annots === false) {
|
||||
$annots = $this->delegate->getPropertyAnnotations($property);
|
||||
$this->saveToCache($cacheKey, $annots);
|
||||
}
|
||||
|
||||
return $this->loadedAnnotations[$cacheKey] = $annots;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
public function getPropertyAnnotation(ReflectionProperty $property, $annotationName)
|
||||
{
|
||||
foreach ($this->getPropertyAnnotations($property) as $annot) {
|
||||
if ($annot instanceof $annotationName) {
|
||||
return $annot;
|
||||
}
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
public function getMethodAnnotations(ReflectionMethod $method)
|
||||
{
|
||||
$class = $method->getDeclaringClass();
|
||||
$cacheKey = $class->getName() . '#' . $method->getName();
|
||||
|
||||
if (isset($this->loadedAnnotations[$cacheKey])) {
|
||||
return $this->loadedAnnotations[$cacheKey];
|
||||
}
|
||||
|
||||
$annots = $this->fetchFromCache($cacheKey, $class);
|
||||
if ($annots === false) {
|
||||
$annots = $this->delegate->getMethodAnnotations($method);
|
||||
$this->saveToCache($cacheKey, $annots);
|
||||
}
|
||||
|
||||
return $this->loadedAnnotations[$cacheKey] = $annots;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
public function getMethodAnnotation(ReflectionMethod $method, $annotationName)
|
||||
{
|
||||
foreach ($this->getMethodAnnotations($method) as $annot) {
|
||||
if ($annot instanceof $annotationName) {
|
||||
return $annot;
|
||||
}
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Clears loaded annotations.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function clearLoadedAnnotations()
|
||||
{
|
||||
$this->loadedAnnotations = [];
|
||||
$this->loadedFilemtimes = [];
|
||||
}
|
||||
|
||||
/**
|
||||
* Fetches a value from the cache.
|
||||
*
|
||||
* @param string $cacheKey The cache key.
|
||||
*
|
||||
* @return mixed The cached value or false when the value is not in cache.
|
||||
*/
|
||||
private function fetchFromCache($cacheKey, ReflectionClass $class)
|
||||
{
|
||||
$data = $this->cache->fetch($cacheKey);
|
||||
if ($data !== false) {
|
||||
if (! $this->debug || $this->isCacheFresh($cacheKey, $class)) {
|
||||
return $data;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Saves a value to the cache.
|
||||
*
|
||||
* @param string $cacheKey The cache key.
|
||||
* @param mixed $value The value.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
private function saveToCache($cacheKey, $value)
|
||||
{
|
||||
$this->cache->save($cacheKey, $value);
|
||||
if (! $this->debug) {
|
||||
return;
|
||||
}
|
||||
|
||||
$this->cache->save('[C]' . $cacheKey, time());
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks if the cache is fresh.
|
||||
*
|
||||
* @param string $cacheKey
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
private function isCacheFresh($cacheKey, ReflectionClass $class)
|
||||
{
|
||||
$lastModification = $this->getLastModification($class);
|
||||
if ($lastModification === 0) {
|
||||
return true;
|
||||
}
|
||||
|
||||
return $this->cache->fetch('[C]' . $cacheKey) >= $lastModification;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the time the class was last modified, testing traits and parents
|
||||
*/
|
||||
private function getLastModification(ReflectionClass $class): int
|
||||
{
|
||||
$filename = $class->getFileName();
|
||||
|
||||
if (isset($this->loadedFilemtimes[$filename])) {
|
||||
return $this->loadedFilemtimes[$filename];
|
||||
}
|
||||
|
||||
$parent = $class->getParentClass();
|
||||
|
||||
$lastModification = max(array_merge(
|
||||
[$filename ? filemtime($filename) : 0],
|
||||
array_map(function (ReflectionClass $reflectionTrait): int {
|
||||
return $this->getTraitLastModificationTime($reflectionTrait);
|
||||
}, $class->getTraits()),
|
||||
array_map(function (ReflectionClass $class): int {
|
||||
return $this->getLastModification($class);
|
||||
}, $class->getInterfaces()),
|
||||
$parent ? [$this->getLastModification($parent)] : []
|
||||
));
|
||||
|
||||
assert($lastModification !== false);
|
||||
|
||||
return $this->loadedFilemtimes[$filename] = $lastModification;
|
||||
}
|
||||
|
||||
private function getTraitLastModificationTime(ReflectionClass $reflectionTrait): int
|
||||
{
|
||||
$fileName = $reflectionTrait->getFileName();
|
||||
|
||||
if (isset($this->loadedFilemtimes[$fileName])) {
|
||||
return $this->loadedFilemtimes[$fileName];
|
||||
}
|
||||
|
||||
$lastModificationTime = max(array_merge(
|
||||
[$fileName ? filemtime($fileName) : 0],
|
||||
array_map(function (ReflectionClass $reflectionTrait): int {
|
||||
return $this->getTraitLastModificationTime($reflectionTrait);
|
||||
}, $reflectionTrait->getTraits())
|
||||
));
|
||||
|
||||
assert($lastModificationTime !== false);
|
||||
|
||||
return $this->loadedFilemtimes[$fileName] = $lastModificationTime;
|
||||
}
|
||||
}
|
||||
@@ -1,129 +0,0 @@
|
||||
<?php
|
||||
|
||||
namespace Doctrine\Common\Annotations;
|
||||
|
||||
use Doctrine\Common\Lexer\AbstractLexer;
|
||||
|
||||
use function ctype_alpha;
|
||||
use function is_numeric;
|
||||
use function str_replace;
|
||||
use function stripos;
|
||||
use function strlen;
|
||||
use function strpos;
|
||||
use function strtolower;
|
||||
use function substr;
|
||||
|
||||
/**
|
||||
* Simple lexer for docblock annotations.
|
||||
*/
|
||||
final class DocLexer extends AbstractLexer
|
||||
{
|
||||
public const T_NONE = 1;
|
||||
public const T_INTEGER = 2;
|
||||
public const T_STRING = 3;
|
||||
public const T_FLOAT = 4;
|
||||
|
||||
// All tokens that are also identifiers should be >= 100
|
||||
public const T_IDENTIFIER = 100;
|
||||
public const T_AT = 101;
|
||||
public const T_CLOSE_CURLY_BRACES = 102;
|
||||
public const T_CLOSE_PARENTHESIS = 103;
|
||||
public const T_COMMA = 104;
|
||||
public const T_EQUALS = 105;
|
||||
public const T_FALSE = 106;
|
||||
public const T_NAMESPACE_SEPARATOR = 107;
|
||||
public const T_OPEN_CURLY_BRACES = 108;
|
||||
public const T_OPEN_PARENTHESIS = 109;
|
||||
public const T_TRUE = 110;
|
||||
public const T_NULL = 111;
|
||||
public const T_COLON = 112;
|
||||
public const T_MINUS = 113;
|
||||
|
||||
/** @var array<string, int> */
|
||||
protected $noCase = [
|
||||
'@' => self::T_AT,
|
||||
',' => self::T_COMMA,
|
||||
'(' => self::T_OPEN_PARENTHESIS,
|
||||
')' => self::T_CLOSE_PARENTHESIS,
|
||||
'{' => self::T_OPEN_CURLY_BRACES,
|
||||
'}' => self::T_CLOSE_CURLY_BRACES,
|
||||
'=' => self::T_EQUALS,
|
||||
':' => self::T_COLON,
|
||||
'-' => self::T_MINUS,
|
||||
'\\' => self::T_NAMESPACE_SEPARATOR,
|
||||
];
|
||||
|
||||
/** @var array<string, int> */
|
||||
protected $withCase = [
|
||||
'true' => self::T_TRUE,
|
||||
'false' => self::T_FALSE,
|
||||
'null' => self::T_NULL,
|
||||
];
|
||||
|
||||
/**
|
||||
* Whether the next token starts immediately, or if there were
|
||||
* non-captured symbols before that
|
||||
*/
|
||||
public function nextTokenIsAdjacent(): bool
|
||||
{
|
||||
return $this->token === null
|
||||
|| ($this->lookahead !== null
|
||||
&& ($this->lookahead['position'] - $this->token['position']) === strlen($this->token['value']));
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
protected function getCatchablePatterns()
|
||||
{
|
||||
return [
|
||||
'[a-z_\\\][a-z0-9_\:\\\]*[a-z_][a-z0-9_]*',
|
||||
'(?:[+-]?[0-9]+(?:[\.][0-9]+)*)(?:[eE][+-]?[0-9]+)?',
|
||||
'"(?:""|[^"])*+"',
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
protected function getNonCatchablePatterns()
|
||||
{
|
||||
return ['\s+', '\*+', '(.)'];
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
protected function getType(&$value)
|
||||
{
|
||||
$type = self::T_NONE;
|
||||
|
||||
if ($value[0] === '"') {
|
||||
$value = str_replace('""', '"', substr($value, 1, strlen($value) - 2));
|
||||
|
||||
return self::T_STRING;
|
||||
}
|
||||
|
||||
if (isset($this->noCase[$value])) {
|
||||
return $this->noCase[$value];
|
||||
}
|
||||
|
||||
if ($value[0] === '_' || $value[0] === '\\' || ctype_alpha($value[0])) {
|
||||
return self::T_IDENTIFIER;
|
||||
}
|
||||
|
||||
$lowerValue = strtolower($value);
|
||||
|
||||
if (isset($this->withCase[$lowerValue])) {
|
||||
return $this->withCase[$lowerValue];
|
||||
}
|
||||
|
||||
// Checking numeric value
|
||||
if (is_numeric($value)) {
|
||||
return strpos($value, '.') !== false || stripos($value, 'e') !== false
|
||||
? self::T_FLOAT : self::T_INTEGER;
|
||||
}
|
||||
|
||||
return $type;
|
||||
}
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,315 +0,0 @@
|
||||
<?php
|
||||
|
||||
namespace Doctrine\Common\Annotations;
|
||||
|
||||
use InvalidArgumentException;
|
||||
use ReflectionClass;
|
||||
use ReflectionMethod;
|
||||
use ReflectionProperty;
|
||||
use RuntimeException;
|
||||
|
||||
use function chmod;
|
||||
use function file_put_contents;
|
||||
use function filemtime;
|
||||
use function gettype;
|
||||
use function is_dir;
|
||||
use function is_file;
|
||||
use function is_int;
|
||||
use function is_writable;
|
||||
use function mkdir;
|
||||
use function rename;
|
||||
use function rtrim;
|
||||
use function serialize;
|
||||
use function sha1;
|
||||
use function sprintf;
|
||||
use function strtr;
|
||||
use function tempnam;
|
||||
use function uniqid;
|
||||
use function unlink;
|
||||
use function var_export;
|
||||
|
||||
/**
|
||||
* File cache reader for annotations.
|
||||
*
|
||||
* @deprecated the FileCacheReader is deprecated and will be removed
|
||||
* in version 2.0.0 of doctrine/annotations. Please use the
|
||||
* {@see \Doctrine\Common\Annotations\PsrCachedReader} instead.
|
||||
*/
|
||||
class FileCacheReader implements Reader
|
||||
{
|
||||
/** @var Reader */
|
||||
private $reader;
|
||||
|
||||
/** @var string */
|
||||
private $dir;
|
||||
|
||||
/** @var bool */
|
||||
private $debug;
|
||||
|
||||
/** @phpstan-var array<string, list<object>> */
|
||||
private $loadedAnnotations = [];
|
||||
|
||||
/** @var array<string, string> */
|
||||
private $classNameHashes = [];
|
||||
|
||||
/** @var int */
|
||||
private $umask;
|
||||
|
||||
/**
|
||||
* @param string $cacheDir
|
||||
* @param bool $debug
|
||||
* @param int $umask
|
||||
*
|
||||
* @throws InvalidArgumentException
|
||||
*/
|
||||
public function __construct(Reader $reader, $cacheDir, $debug = false, $umask = 0002)
|
||||
{
|
||||
if (! is_int($umask)) {
|
||||
throw new InvalidArgumentException(sprintf(
|
||||
'The parameter umask must be an integer, was: %s',
|
||||
gettype($umask)
|
||||
));
|
||||
}
|
||||
|
||||
$this->reader = $reader;
|
||||
$this->umask = $umask;
|
||||
|
||||
if (! is_dir($cacheDir) && ! @mkdir($cacheDir, 0777 & (~$this->umask), true)) {
|
||||
throw new InvalidArgumentException(sprintf(
|
||||
'The directory "%s" does not exist and could not be created.',
|
||||
$cacheDir
|
||||
));
|
||||
}
|
||||
|
||||
$this->dir = rtrim($cacheDir, '\\/');
|
||||
$this->debug = $debug;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
public function getClassAnnotations(ReflectionClass $class)
|
||||
{
|
||||
if (! isset($this->classNameHashes[$class->name])) {
|
||||
$this->classNameHashes[$class->name] = sha1($class->name);
|
||||
}
|
||||
|
||||
$key = $this->classNameHashes[$class->name];
|
||||
|
||||
if (isset($this->loadedAnnotations[$key])) {
|
||||
return $this->loadedAnnotations[$key];
|
||||
}
|
||||
|
||||
$path = $this->dir . '/' . strtr($key, '\\', '-') . '.cache.php';
|
||||
if (! is_file($path)) {
|
||||
$annot = $this->reader->getClassAnnotations($class);
|
||||
$this->saveCacheFile($path, $annot);
|
||||
|
||||
return $this->loadedAnnotations[$key] = $annot;
|
||||
}
|
||||
|
||||
$filename = $class->getFilename();
|
||||
if (
|
||||
$this->debug
|
||||
&& $filename !== false
|
||||
&& filemtime($path) < filemtime($filename)
|
||||
) {
|
||||
@unlink($path);
|
||||
|
||||
$annot = $this->reader->getClassAnnotations($class);
|
||||
$this->saveCacheFile($path, $annot);
|
||||
|
||||
return $this->loadedAnnotations[$key] = $annot;
|
||||
}
|
||||
|
||||
return $this->loadedAnnotations[$key] = include $path;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
public function getPropertyAnnotations(ReflectionProperty $property)
|
||||
{
|
||||
$class = $property->getDeclaringClass();
|
||||
if (! isset($this->classNameHashes[$class->name])) {
|
||||
$this->classNameHashes[$class->name] = sha1($class->name);
|
||||
}
|
||||
|
||||
$key = $this->classNameHashes[$class->name] . '$' . $property->getName();
|
||||
|
||||
if (isset($this->loadedAnnotations[$key])) {
|
||||
return $this->loadedAnnotations[$key];
|
||||
}
|
||||
|
||||
$path = $this->dir . '/' . strtr($key, '\\', '-') . '.cache.php';
|
||||
if (! is_file($path)) {
|
||||
$annot = $this->reader->getPropertyAnnotations($property);
|
||||
$this->saveCacheFile($path, $annot);
|
||||
|
||||
return $this->loadedAnnotations[$key] = $annot;
|
||||
}
|
||||
|
||||
$filename = $class->getFilename();
|
||||
if (
|
||||
$this->debug
|
||||
&& $filename !== false
|
||||
&& filemtime($path) < filemtime($filename)
|
||||
) {
|
||||
@unlink($path);
|
||||
|
||||
$annot = $this->reader->getPropertyAnnotations($property);
|
||||
$this->saveCacheFile($path, $annot);
|
||||
|
||||
return $this->loadedAnnotations[$key] = $annot;
|
||||
}
|
||||
|
||||
return $this->loadedAnnotations[$key] = include $path;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
public function getMethodAnnotations(ReflectionMethod $method)
|
||||
{
|
||||
$class = $method->getDeclaringClass();
|
||||
if (! isset($this->classNameHashes[$class->name])) {
|
||||
$this->classNameHashes[$class->name] = sha1($class->name);
|
||||
}
|
||||
|
||||
$key = $this->classNameHashes[$class->name] . '#' . $method->getName();
|
||||
|
||||
if (isset($this->loadedAnnotations[$key])) {
|
||||
return $this->loadedAnnotations[$key];
|
||||
}
|
||||
|
||||
$path = $this->dir . '/' . strtr($key, '\\', '-') . '.cache.php';
|
||||
if (! is_file($path)) {
|
||||
$annot = $this->reader->getMethodAnnotations($method);
|
||||
$this->saveCacheFile($path, $annot);
|
||||
|
||||
return $this->loadedAnnotations[$key] = $annot;
|
||||
}
|
||||
|
||||
$filename = $class->getFilename();
|
||||
if (
|
||||
$this->debug
|
||||
&& $filename !== false
|
||||
&& filemtime($path) < filemtime($filename)
|
||||
) {
|
||||
@unlink($path);
|
||||
|
||||
$annot = $this->reader->getMethodAnnotations($method);
|
||||
$this->saveCacheFile($path, $annot);
|
||||
|
||||
return $this->loadedAnnotations[$key] = $annot;
|
||||
}
|
||||
|
||||
return $this->loadedAnnotations[$key] = include $path;
|
||||
}
|
||||
|
||||
/**
|
||||
* Saves the cache file.
|
||||
*
|
||||
* @param string $path
|
||||
* @param mixed $data
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
private function saveCacheFile($path, $data)
|
||||
{
|
||||
if (! is_writable($this->dir)) {
|
||||
throw new InvalidArgumentException(sprintf(
|
||||
<<<'EXCEPTION'
|
||||
The directory "%s" is not writable. Both the webserver and the console user need access.
|
||||
You can manage access rights for multiple users with "chmod +a".
|
||||
If your system does not support this, check out the acl package.,
|
||||
EXCEPTION
|
||||
,
|
||||
$this->dir
|
||||
));
|
||||
}
|
||||
|
||||
$tempfile = tempnam($this->dir, uniqid('', true));
|
||||
|
||||
if ($tempfile === false) {
|
||||
throw new RuntimeException(sprintf('Unable to create tempfile in directory: %s', $this->dir));
|
||||
}
|
||||
|
||||
@chmod($tempfile, 0666 & (~$this->umask));
|
||||
|
||||
$written = file_put_contents(
|
||||
$tempfile,
|
||||
'<?php return unserialize(' . var_export(serialize($data), true) . ');'
|
||||
);
|
||||
|
||||
if ($written === false) {
|
||||
throw new RuntimeException(sprintf('Unable to write cached file to: %s', $tempfile));
|
||||
}
|
||||
|
||||
@chmod($tempfile, 0666 & (~$this->umask));
|
||||
|
||||
if (rename($tempfile, $path) === false) {
|
||||
@unlink($tempfile);
|
||||
|
||||
throw new RuntimeException(sprintf('Unable to rename %s to %s', $tempfile, $path));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
public function getClassAnnotation(ReflectionClass $class, $annotationName)
|
||||
{
|
||||
$annotations = $this->getClassAnnotations($class);
|
||||
|
||||
foreach ($annotations as $annotation) {
|
||||
if ($annotation instanceof $annotationName) {
|
||||
return $annotation;
|
||||
}
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
public function getMethodAnnotation(ReflectionMethod $method, $annotationName)
|
||||
{
|
||||
$annotations = $this->getMethodAnnotations($method);
|
||||
|
||||
foreach ($annotations as $annotation) {
|
||||
if ($annotation instanceof $annotationName) {
|
||||
return $annotation;
|
||||
}
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
public function getPropertyAnnotation(ReflectionProperty $property, $annotationName)
|
||||
{
|
||||
$annotations = $this->getPropertyAnnotations($property);
|
||||
|
||||
foreach ($annotations as $annotation) {
|
||||
if ($annotation instanceof $annotationName) {
|
||||
return $annotation;
|
||||
}
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Clears loaded annotations.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function clearLoadedAnnotations()
|
||||
{
|
||||
$this->loadedAnnotations = [];
|
||||
}
|
||||
}
|
||||
@@ -1,177 +0,0 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace Doctrine\Common\Annotations;
|
||||
|
||||
/**
|
||||
* A list of annotations that are implicitly ignored during the parsing process.
|
||||
*
|
||||
* All names are case sensitive.
|
||||
*/
|
||||
final class ImplicitlyIgnoredAnnotationNames
|
||||
{
|
||||
private const Reserved = [
|
||||
'Annotation' => true,
|
||||
'Attribute' => true,
|
||||
'Attributes' => true,
|
||||
/* Can we enable this? 'Enum' => true, */
|
||||
'Required' => true,
|
||||
'Target' => true,
|
||||
'NamedArgumentConstructor' => true,
|
||||
];
|
||||
|
||||
private const WidelyUsedNonStandard = [
|
||||
'fix' => true,
|
||||
'fixme' => true,
|
||||
'override' => true,
|
||||
];
|
||||
|
||||
private const PhpDocumentor1 = [
|
||||
'abstract' => true,
|
||||
'access' => true,
|
||||
'code' => true,
|
||||
'deprec' => true,
|
||||
'endcode' => true,
|
||||
'exception' => true,
|
||||
'final' => true,
|
||||
'ingroup' => true,
|
||||
'inheritdoc' => true,
|
||||
'inheritDoc' => true,
|
||||
'magic' => true,
|
||||
'name' => true,
|
||||
'private' => true,
|
||||
'static' => true,
|
||||
'staticvar' => true,
|
||||
'staticVar' => true,
|
||||
'toc' => true,
|
||||
'tutorial' => true,
|
||||
'throw' => true,
|
||||
];
|
||||
|
||||
private const PhpDocumentor2 = [
|
||||
'api' => true,
|
||||
'author' => true,
|
||||
'category' => true,
|
||||
'copyright' => true,
|
||||
'deprecated' => true,
|
||||
'example' => true,
|
||||
'filesource' => true,
|
||||
'global' => true,
|
||||
'ignore' => true,
|
||||
/* Can we enable this? 'index' => true, */
|
||||
'internal' => true,
|
||||
'license' => true,
|
||||
'link' => true,
|
||||
'method' => true,
|
||||
'package' => true,
|
||||
'param' => true,
|
||||
'property' => true,
|
||||
'property-read' => true,
|
||||
'property-write' => true,
|
||||
'return' => true,
|
||||
'see' => true,
|
||||
'since' => true,
|
||||
'source' => true,
|
||||
'subpackage' => true,
|
||||
'throws' => true,
|
||||
'todo' => true,
|
||||
'TODO' => true,
|
||||
'usedby' => true,
|
||||
'uses' => true,
|
||||
'var' => true,
|
||||
'version' => true,
|
||||
];
|
||||
|
||||
private const PHPUnit = [
|
||||
'author' => true,
|
||||
'after' => true,
|
||||
'afterClass' => true,
|
||||
'backupGlobals' => true,
|
||||
'backupStaticAttributes' => true,
|
||||
'before' => true,
|
||||
'beforeClass' => true,
|
||||
'codeCoverageIgnore' => true,
|
||||
'codeCoverageIgnoreStart' => true,
|
||||
'codeCoverageIgnoreEnd' => true,
|
||||
'covers' => true,
|
||||
'coversDefaultClass' => true,
|
||||
'coversNothing' => true,
|
||||
'dataProvider' => true,
|
||||
'depends' => true,
|
||||
'doesNotPerformAssertions' => true,
|
||||
'expectedException' => true,
|
||||
'expectedExceptionCode' => true,
|
||||
'expectedExceptionMessage' => true,
|
||||
'expectedExceptionMessageRegExp' => true,
|
||||
'group' => true,
|
||||
'large' => true,
|
||||
'medium' => true,
|
||||
'preserveGlobalState' => true,
|
||||
'requires' => true,
|
||||
'runTestsInSeparateProcesses' => true,
|
||||
'runInSeparateProcess' => true,
|
||||
'small' => true,
|
||||
'test' => true,
|
||||
'testdox' => true,
|
||||
'testWith' => true,
|
||||
'ticket' => true,
|
||||
'uses' => true,
|
||||
];
|
||||
|
||||
private const PhpCheckStyle = ['SuppressWarnings' => true];
|
||||
|
||||
private const PhpStorm = ['noinspection' => true];
|
||||
|
||||
private const PEAR = ['package_version' => true];
|
||||
|
||||
private const PlainUML = [
|
||||
'startuml' => true,
|
||||
'enduml' => true,
|
||||
];
|
||||
|
||||
private const Symfony = ['experimental' => true];
|
||||
|
||||
private const PhpCodeSniffer = [
|
||||
'codingStandardsIgnoreStart' => true,
|
||||
'codingStandardsIgnoreEnd' => true,
|
||||
];
|
||||
|
||||
private const SlevomatCodingStandard = ['phpcsSuppress' => true];
|
||||
|
||||
private const Phan = ['suppress' => true];
|
||||
|
||||
private const Rector = ['noRector' => true];
|
||||
|
||||
private const StaticAnalysis = [
|
||||
// PHPStan, Psalm
|
||||
'extends' => true,
|
||||
'implements' => true,
|
||||
'template' => true,
|
||||
'use' => true,
|
||||
|
||||
// Psalm
|
||||
'pure' => true,
|
||||
'immutable' => true,
|
||||
];
|
||||
|
||||
public const LIST = self::Reserved
|
||||
+ self::WidelyUsedNonStandard
|
||||
+ self::PhpDocumentor1
|
||||
+ self::PhpDocumentor2
|
||||
+ self::PHPUnit
|
||||
+ self::PhpCheckStyle
|
||||
+ self::PhpStorm
|
||||
+ self::PEAR
|
||||
+ self::PlainUML
|
||||
+ self::Symfony
|
||||
+ self::SlevomatCodingStandard
|
||||
+ self::PhpCodeSniffer
|
||||
+ self::Phan
|
||||
+ self::Rector
|
||||
+ self::StaticAnalysis;
|
||||
|
||||
private function __construct()
|
||||
{
|
||||
}
|
||||
}
|
||||
@@ -1,100 +0,0 @@
|
||||
<?php
|
||||
|
||||
namespace Doctrine\Common\Annotations;
|
||||
|
||||
use ReflectionClass;
|
||||
use ReflectionMethod;
|
||||
use ReflectionProperty;
|
||||
|
||||
use function call_user_func_array;
|
||||
use function get_class;
|
||||
|
||||
/**
|
||||
* Allows the reader to be used in-place of Doctrine's reader.
|
||||
*/
|
||||
class IndexedReader implements Reader
|
||||
{
|
||||
/** @var Reader */
|
||||
private $delegate;
|
||||
|
||||
public function __construct(Reader $reader)
|
||||
{
|
||||
$this->delegate = $reader;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
public function getClassAnnotations(ReflectionClass $class)
|
||||
{
|
||||
$annotations = [];
|
||||
foreach ($this->delegate->getClassAnnotations($class) as $annot) {
|
||||
$annotations[get_class($annot)] = $annot;
|
||||
}
|
||||
|
||||
return $annotations;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
public function getClassAnnotation(ReflectionClass $class, $annotation)
|
||||
{
|
||||
return $this->delegate->getClassAnnotation($class, $annotation);
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
public function getMethodAnnotations(ReflectionMethod $method)
|
||||
{
|
||||
$annotations = [];
|
||||
foreach ($this->delegate->getMethodAnnotations($method) as $annot) {
|
||||
$annotations[get_class($annot)] = $annot;
|
||||
}
|
||||
|
||||
return $annotations;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
public function getMethodAnnotation(ReflectionMethod $method, $annotation)
|
||||
{
|
||||
return $this->delegate->getMethodAnnotation($method, $annotation);
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
public function getPropertyAnnotations(ReflectionProperty $property)
|
||||
{
|
||||
$annotations = [];
|
||||
foreach ($this->delegate->getPropertyAnnotations($property) as $annot) {
|
||||
$annotations[get_class($annot)] = $annot;
|
||||
}
|
||||
|
||||
return $annotations;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
public function getPropertyAnnotation(ReflectionProperty $property, $annotation)
|
||||
{
|
||||
return $this->delegate->getPropertyAnnotation($property, $annotation);
|
||||
}
|
||||
|
||||
/**
|
||||
* Proxies all methods to the delegate.
|
||||
*
|
||||
* @param string $method
|
||||
* @param mixed[] $args
|
||||
*
|
||||
* @return mixed
|
||||
*/
|
||||
public function __call($method, $args)
|
||||
{
|
||||
return call_user_func_array([$this->delegate, $method], $args);
|
||||
}
|
||||
}
|
||||
@@ -1,14 +0,0 @@
|
||||
<?php
|
||||
|
||||
namespace Doctrine\Common\Annotations;
|
||||
|
||||
/**
|
||||
* Marker interface for PHP7/PHP8 compatible support
|
||||
* for named arguments (and constructor property promotion).
|
||||
*
|
||||
* @deprecated Implementing this interface is deprecated
|
||||
* Use the Annotation @NamedArgumentConstructor instead
|
||||
*/
|
||||
interface NamedArgumentConstructorAnnotation
|
||||
{
|
||||
}
|
||||
@@ -1,92 +0,0 @@
|
||||
<?php
|
||||
|
||||
namespace Doctrine\Common\Annotations;
|
||||
|
||||
use ReflectionClass;
|
||||
use ReflectionFunction;
|
||||
use SplFileObject;
|
||||
|
||||
use function is_file;
|
||||
use function method_exists;
|
||||
use function preg_quote;
|
||||
use function preg_replace;
|
||||
|
||||
/**
|
||||
* Parses a file for namespaces/use/class declarations.
|
||||
*/
|
||||
final class PhpParser
|
||||
{
|
||||
/**
|
||||
* Parses a class.
|
||||
*
|
||||
* @deprecated use parseUseStatements instead
|
||||
*
|
||||
* @param ReflectionClass $class A <code>ReflectionClass</code> object.
|
||||
*
|
||||
* @return array<string, class-string> A list with use statements in the form (Alias => FQN).
|
||||
*/
|
||||
public function parseClass(ReflectionClass $class)
|
||||
{
|
||||
return $this->parseUseStatements($class);
|
||||
}
|
||||
|
||||
/**
|
||||
* Parse a class or function for use statements.
|
||||
*
|
||||
* @param ReflectionClass|ReflectionFunction $reflection
|
||||
*
|
||||
* @psalm-return array<string, string> a list with use statements in the form (Alias => FQN).
|
||||
*/
|
||||
public function parseUseStatements($reflection): array
|
||||
{
|
||||
if (method_exists($reflection, 'getUseStatements')) {
|
||||
return $reflection->getUseStatements();
|
||||
}
|
||||
|
||||
$filename = $reflection->getFileName();
|
||||
|
||||
if ($filename === false) {
|
||||
return [];
|
||||
}
|
||||
|
||||
$content = $this->getFileContent($filename, $reflection->getStartLine());
|
||||
|
||||
if ($content === null) {
|
||||
return [];
|
||||
}
|
||||
|
||||
$namespace = preg_quote($reflection->getNamespaceName());
|
||||
$content = preg_replace('/^.*?(\bnamespace\s+' . $namespace . '\s*[;{].*)$/s', '\\1', $content);
|
||||
$tokenizer = new TokenParser('<?php ' . $content);
|
||||
|
||||
return $tokenizer->parseUseStatements($reflection->getNamespaceName());
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the content of the file right up to the given line number.
|
||||
*
|
||||
* @param string $filename The name of the file to load.
|
||||
* @param int $lineNumber The number of lines to read from file.
|
||||
*
|
||||
* @return string|null The content of the file or null if the file does not exist.
|
||||
*/
|
||||
private function getFileContent($filename, $lineNumber)
|
||||
{
|
||||
if (! is_file($filename)) {
|
||||
return null;
|
||||
}
|
||||
|
||||
$content = '';
|
||||
$lineCnt = 0;
|
||||
$file = new SplFileObject($filename);
|
||||
while (! $file->eof()) {
|
||||
if ($lineCnt++ === $lineNumber) {
|
||||
break;
|
||||
}
|
||||
|
||||
$content .= $file->fgets();
|
||||
}
|
||||
|
||||
return $content;
|
||||
}
|
||||
}
|
||||
@@ -1,232 +0,0 @@
|
||||
<?php
|
||||
|
||||
namespace Doctrine\Common\Annotations;
|
||||
|
||||
use Psr\Cache\CacheItemPoolInterface;
|
||||
use ReflectionClass;
|
||||
use ReflectionMethod;
|
||||
use ReflectionProperty;
|
||||
use Reflector;
|
||||
|
||||
use function array_map;
|
||||
use function array_merge;
|
||||
use function assert;
|
||||
use function filemtime;
|
||||
use function max;
|
||||
use function rawurlencode;
|
||||
use function time;
|
||||
|
||||
/**
|
||||
* A cache aware annotation reader.
|
||||
*/
|
||||
final class PsrCachedReader implements Reader
|
||||
{
|
||||
/** @var Reader */
|
||||
private $delegate;
|
||||
|
||||
/** @var CacheItemPoolInterface */
|
||||
private $cache;
|
||||
|
||||
/** @var bool */
|
||||
private $debug;
|
||||
|
||||
/** @var array<string, array<object>> */
|
||||
private $loadedAnnotations = [];
|
||||
|
||||
/** @var int[] */
|
||||
private $loadedFilemtimes = [];
|
||||
|
||||
public function __construct(Reader $reader, CacheItemPoolInterface $cache, bool $debug = false)
|
||||
{
|
||||
$this->delegate = $reader;
|
||||
$this->cache = $cache;
|
||||
$this->debug = (bool) $debug;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
public function getClassAnnotations(ReflectionClass $class)
|
||||
{
|
||||
$cacheKey = $class->getName();
|
||||
|
||||
if (isset($this->loadedAnnotations[$cacheKey])) {
|
||||
return $this->loadedAnnotations[$cacheKey];
|
||||
}
|
||||
|
||||
$annots = $this->fetchFromCache($cacheKey, $class, 'getClassAnnotations', $class);
|
||||
|
||||
return $this->loadedAnnotations[$cacheKey] = $annots;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
public function getClassAnnotation(ReflectionClass $class, $annotationName)
|
||||
{
|
||||
foreach ($this->getClassAnnotations($class) as $annot) {
|
||||
if ($annot instanceof $annotationName) {
|
||||
return $annot;
|
||||
}
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
public function getPropertyAnnotations(ReflectionProperty $property)
|
||||
{
|
||||
$class = $property->getDeclaringClass();
|
||||
$cacheKey = $class->getName() . '$' . $property->getName();
|
||||
|
||||
if (isset($this->loadedAnnotations[$cacheKey])) {
|
||||
return $this->loadedAnnotations[$cacheKey];
|
||||
}
|
||||
|
||||
$annots = $this->fetchFromCache($cacheKey, $class, 'getPropertyAnnotations', $property);
|
||||
|
||||
return $this->loadedAnnotations[$cacheKey] = $annots;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
public function getPropertyAnnotation(ReflectionProperty $property, $annotationName)
|
||||
{
|
||||
foreach ($this->getPropertyAnnotations($property) as $annot) {
|
||||
if ($annot instanceof $annotationName) {
|
||||
return $annot;
|
||||
}
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
public function getMethodAnnotations(ReflectionMethod $method)
|
||||
{
|
||||
$class = $method->getDeclaringClass();
|
||||
$cacheKey = $class->getName() . '#' . $method->getName();
|
||||
|
||||
if (isset($this->loadedAnnotations[$cacheKey])) {
|
||||
return $this->loadedAnnotations[$cacheKey];
|
||||
}
|
||||
|
||||
$annots = $this->fetchFromCache($cacheKey, $class, 'getMethodAnnotations', $method);
|
||||
|
||||
return $this->loadedAnnotations[$cacheKey] = $annots;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
public function getMethodAnnotation(ReflectionMethod $method, $annotationName)
|
||||
{
|
||||
foreach ($this->getMethodAnnotations($method) as $annot) {
|
||||
if ($annot instanceof $annotationName) {
|
||||
return $annot;
|
||||
}
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
public function clearLoadedAnnotations(): void
|
||||
{
|
||||
$this->loadedAnnotations = [];
|
||||
$this->loadedFilemtimes = [];
|
||||
}
|
||||
|
||||
/** @return mixed[] */
|
||||
private function fetchFromCache(
|
||||
string $cacheKey,
|
||||
ReflectionClass $class,
|
||||
string $method,
|
||||
Reflector $reflector
|
||||
): array {
|
||||
$cacheKey = rawurlencode($cacheKey);
|
||||
|
||||
$item = $this->cache->getItem($cacheKey);
|
||||
if (($this->debug && ! $this->refresh($cacheKey, $class)) || ! $item->isHit()) {
|
||||
$this->cache->save($item->set($this->delegate->{$method}($reflector)));
|
||||
}
|
||||
|
||||
return $item->get();
|
||||
}
|
||||
|
||||
/**
|
||||
* Used in debug mode to check if the cache is fresh.
|
||||
*
|
||||
* @return bool Returns true if the cache was fresh, or false if the class
|
||||
* being read was modified since writing to the cache.
|
||||
*/
|
||||
private function refresh(string $cacheKey, ReflectionClass $class): bool
|
||||
{
|
||||
$lastModification = $this->getLastModification($class);
|
||||
if ($lastModification === 0) {
|
||||
return true;
|
||||
}
|
||||
|
||||
$item = $this->cache->getItem('[C]' . $cacheKey);
|
||||
if ($item->isHit() && $item->get() >= $lastModification) {
|
||||
return true;
|
||||
}
|
||||
|
||||
$this->cache->save($item->set(time()));
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the time the class was last modified, testing traits and parents
|
||||
*/
|
||||
private function getLastModification(ReflectionClass $class): int
|
||||
{
|
||||
$filename = $class->getFileName();
|
||||
|
||||
if (isset($this->loadedFilemtimes[$filename])) {
|
||||
return $this->loadedFilemtimes[$filename];
|
||||
}
|
||||
|
||||
$parent = $class->getParentClass();
|
||||
|
||||
$lastModification = max(array_merge(
|
||||
[$filename ? filemtime($filename) : 0],
|
||||
array_map(function (ReflectionClass $reflectionTrait): int {
|
||||
return $this->getTraitLastModificationTime($reflectionTrait);
|
||||
}, $class->getTraits()),
|
||||
array_map(function (ReflectionClass $class): int {
|
||||
return $this->getLastModification($class);
|
||||
}, $class->getInterfaces()),
|
||||
$parent ? [$this->getLastModification($parent)] : []
|
||||
));
|
||||
|
||||
assert($lastModification !== false);
|
||||
|
||||
return $this->loadedFilemtimes[$filename] = $lastModification;
|
||||
}
|
||||
|
||||
private function getTraitLastModificationTime(ReflectionClass $reflectionTrait): int
|
||||
{
|
||||
$fileName = $reflectionTrait->getFileName();
|
||||
|
||||
if (isset($this->loadedFilemtimes[$fileName])) {
|
||||
return $this->loadedFilemtimes[$fileName];
|
||||
}
|
||||
|
||||
$lastModificationTime = max(array_merge(
|
||||
[$fileName ? filemtime($fileName) : 0],
|
||||
array_map(function (ReflectionClass $reflectionTrait): int {
|
||||
return $this->getTraitLastModificationTime($reflectionTrait);
|
||||
}, $reflectionTrait->getTraits())
|
||||
));
|
||||
|
||||
assert($lastModificationTime !== false);
|
||||
|
||||
return $this->loadedFilemtimes[$fileName] = $lastModificationTime;
|
||||
}
|
||||
}
|
||||
@@ -1,80 +0,0 @@
|
||||
<?php
|
||||
|
||||
namespace Doctrine\Common\Annotations;
|
||||
|
||||
use ReflectionClass;
|
||||
use ReflectionMethod;
|
||||
use ReflectionProperty;
|
||||
|
||||
/**
|
||||
* Interface for annotation readers.
|
||||
*/
|
||||
interface Reader
|
||||
{
|
||||
/**
|
||||
* Gets the annotations applied to a class.
|
||||
*
|
||||
* @param ReflectionClass $class The ReflectionClass of the class from which
|
||||
* the class annotations should be read.
|
||||
*
|
||||
* @return array<object> An array of Annotations.
|
||||
*/
|
||||
public function getClassAnnotations(ReflectionClass $class);
|
||||
|
||||
/**
|
||||
* Gets a class annotation.
|
||||
*
|
||||
* @param ReflectionClass $class The ReflectionClass of the class from which
|
||||
* the class annotations should be read.
|
||||
* @param class-string<T> $annotationName The name of the annotation.
|
||||
*
|
||||
* @return T|null The Annotation or NULL, if the requested annotation does not exist.
|
||||
*
|
||||
* @template T
|
||||
*/
|
||||
public function getClassAnnotation(ReflectionClass $class, $annotationName);
|
||||
|
||||
/**
|
||||
* Gets the annotations applied to a method.
|
||||
*
|
||||
* @param ReflectionMethod $method The ReflectionMethod of the method from which
|
||||
* the annotations should be read.
|
||||
*
|
||||
* @return array<object> An array of Annotations.
|
||||
*/
|
||||
public function getMethodAnnotations(ReflectionMethod $method);
|
||||
|
||||
/**
|
||||
* Gets a method annotation.
|
||||
*
|
||||
* @param ReflectionMethod $method The ReflectionMethod to read the annotations from.
|
||||
* @param class-string<T> $annotationName The name of the annotation.
|
||||
*
|
||||
* @return T|null The Annotation or NULL, if the requested annotation does not exist.
|
||||
*
|
||||
* @template T
|
||||
*/
|
||||
public function getMethodAnnotation(ReflectionMethod $method, $annotationName);
|
||||
|
||||
/**
|
||||
* Gets the annotations applied to a property.
|
||||
*
|
||||
* @param ReflectionProperty $property The ReflectionProperty of the property
|
||||
* from which the annotations should be read.
|
||||
*
|
||||
* @return array<object> An array of Annotations.
|
||||
*/
|
||||
public function getPropertyAnnotations(ReflectionProperty $property);
|
||||
|
||||
/**
|
||||
* Gets a property annotation.
|
||||
*
|
||||
* @param ReflectionProperty $property The ReflectionProperty to read the annotations from.
|
||||
* @param class-string<T> $annotationName The name of the annotation.
|
||||
*
|
||||
* @return T|null The Annotation or NULL, if the requested annotation does not exist.
|
||||
*
|
||||
* @template T
|
||||
*/
|
||||
public function getPropertyAnnotation(ReflectionProperty $property, $annotationName);
|
||||
}
|
||||
@@ -1,114 +0,0 @@
|
||||
<?php
|
||||
|
||||
namespace Doctrine\Common\Annotations;
|
||||
|
||||
use ReflectionClass;
|
||||
use ReflectionMethod;
|
||||
use ReflectionProperty;
|
||||
|
||||
/**
|
||||
* Simple Annotation Reader.
|
||||
*
|
||||
* This annotation reader is intended to be used in projects where you have
|
||||
* full-control over all annotations that are available.
|
||||
*
|
||||
* @deprecated Deprecated in favour of using AnnotationReader
|
||||
*/
|
||||
class SimpleAnnotationReader implements Reader
|
||||
{
|
||||
/** @var DocParser */
|
||||
private $parser;
|
||||
|
||||
/**
|
||||
* Initializes a new SimpleAnnotationReader.
|
||||
*/
|
||||
public function __construct()
|
||||
{
|
||||
$this->parser = new DocParser();
|
||||
$this->parser->setIgnoreNotImportedAnnotations(true);
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds a namespace in which we will look for annotations.
|
||||
*
|
||||
* @param string $namespace
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function addNamespace($namespace)
|
||||
{
|
||||
$this->parser->addNamespace($namespace);
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
public function getClassAnnotations(ReflectionClass $class)
|
||||
{
|
||||
return $this->parser->parse($class->getDocComment(), 'class ' . $class->getName());
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
public function getMethodAnnotations(ReflectionMethod $method)
|
||||
{
|
||||
return $this->parser->parse(
|
||||
$method->getDocComment(),
|
||||
'method ' . $method->getDeclaringClass()->name . '::' . $method->getName() . '()'
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
public function getPropertyAnnotations(ReflectionProperty $property)
|
||||
{
|
||||
return $this->parser->parse(
|
||||
$property->getDocComment(),
|
||||
'property ' . $property->getDeclaringClass()->name . '::$' . $property->getName()
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
public function getClassAnnotation(ReflectionClass $class, $annotationName)
|
||||
{
|
||||
foreach ($this->getClassAnnotations($class) as $annot) {
|
||||
if ($annot instanceof $annotationName) {
|
||||
return $annot;
|
||||
}
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
public function getMethodAnnotation(ReflectionMethod $method, $annotationName)
|
||||
{
|
||||
foreach ($this->getMethodAnnotations($method) as $annot) {
|
||||
if ($annot instanceof $annotationName) {
|
||||
return $annot;
|
||||
}
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
public function getPropertyAnnotation(ReflectionProperty $property, $annotationName)
|
||||
{
|
||||
foreach ($this->getPropertyAnnotations($property) as $annot) {
|
||||
if ($annot instanceof $annotationName) {
|
||||
return $annot;
|
||||
}
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
}
|
||||
@@ -1,208 +0,0 @@
|
||||
<?php
|
||||
|
||||
namespace Doctrine\Common\Annotations;
|
||||
|
||||
use function array_merge;
|
||||
use function count;
|
||||
use function explode;
|
||||
use function strtolower;
|
||||
use function token_get_all;
|
||||
|
||||
use const PHP_VERSION_ID;
|
||||
use const T_AS;
|
||||
use const T_COMMENT;
|
||||
use const T_DOC_COMMENT;
|
||||
use const T_NAME_FULLY_QUALIFIED;
|
||||
use const T_NAME_QUALIFIED;
|
||||
use const T_NAMESPACE;
|
||||
use const T_NS_SEPARATOR;
|
||||
use const T_STRING;
|
||||
use const T_USE;
|
||||
use const T_WHITESPACE;
|
||||
|
||||
/**
|
||||
* Parses a file for namespaces/use/class declarations.
|
||||
*/
|
||||
class TokenParser
|
||||
{
|
||||
/**
|
||||
* The token list.
|
||||
*
|
||||
* @phpstan-var list<mixed[]>
|
||||
*/
|
||||
private $tokens;
|
||||
|
||||
/**
|
||||
* The number of tokens.
|
||||
*
|
||||
* @var int
|
||||
*/
|
||||
private $numTokens;
|
||||
|
||||
/**
|
||||
* The current array pointer.
|
||||
*
|
||||
* @var int
|
||||
*/
|
||||
private $pointer = 0;
|
||||
|
||||
/**
|
||||
* @param string $contents
|
||||
*/
|
||||
public function __construct($contents)
|
||||
{
|
||||
$this->tokens = token_get_all($contents);
|
||||
|
||||
// The PHP parser sets internal compiler globals for certain things. Annoyingly, the last docblock comment it
|
||||
// saw gets stored in doc_comment. When it comes to compile the next thing to be include()d this stored
|
||||
// doc_comment becomes owned by the first thing the compiler sees in the file that it considers might have a
|
||||
// docblock. If the first thing in the file is a class without a doc block this would cause calls to
|
||||
// getDocBlock() on said class to return our long lost doc_comment. Argh.
|
||||
// To workaround, cause the parser to parse an empty docblock. Sure getDocBlock() will return this, but at least
|
||||
// it's harmless to us.
|
||||
token_get_all("<?php\n/**\n *\n */");
|
||||
|
||||
$this->numTokens = count($this->tokens);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the next non whitespace and non comment token.
|
||||
*
|
||||
* @param bool $docCommentIsComment If TRUE then a doc comment is considered a comment and skipped.
|
||||
* If FALSE then only whitespace and normal comments are skipped.
|
||||
*
|
||||
* @return mixed[]|string|null The token if exists, null otherwise.
|
||||
*/
|
||||
public function next($docCommentIsComment = true)
|
||||
{
|
||||
for ($i = $this->pointer; $i < $this->numTokens; $i++) {
|
||||
$this->pointer++;
|
||||
if (
|
||||
$this->tokens[$i][0] === T_WHITESPACE ||
|
||||
$this->tokens[$i][0] === T_COMMENT ||
|
||||
($docCommentIsComment && $this->tokens[$i][0] === T_DOC_COMMENT)
|
||||
) {
|
||||
continue;
|
||||
}
|
||||
|
||||
return $this->tokens[$i];
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Parses a single use statement.
|
||||
*
|
||||
* @return array<string, string> A list with all found class names for a use statement.
|
||||
*/
|
||||
public function parseUseStatement()
|
||||
{
|
||||
$groupRoot = '';
|
||||
$class = '';
|
||||
$alias = '';
|
||||
$statements = [];
|
||||
$explicitAlias = false;
|
||||
while (($token = $this->next())) {
|
||||
if (! $explicitAlias && $token[0] === T_STRING) {
|
||||
$class .= $token[1];
|
||||
$alias = $token[1];
|
||||
} elseif ($explicitAlias && $token[0] === T_STRING) {
|
||||
$alias = $token[1];
|
||||
} elseif (
|
||||
PHP_VERSION_ID >= 80000 &&
|
||||
($token[0] === T_NAME_QUALIFIED || $token[0] === T_NAME_FULLY_QUALIFIED)
|
||||
) {
|
||||
$class .= $token[1];
|
||||
|
||||
$classSplit = explode('\\', $token[1]);
|
||||
$alias = $classSplit[count($classSplit) - 1];
|
||||
} elseif ($token[0] === T_NS_SEPARATOR) {
|
||||
$class .= '\\';
|
||||
$alias = '';
|
||||
} elseif ($token[0] === T_AS) {
|
||||
$explicitAlias = true;
|
||||
$alias = '';
|
||||
} elseif ($token === ',') {
|
||||
$statements[strtolower($alias)] = $groupRoot . $class;
|
||||
$class = '';
|
||||
$alias = '';
|
||||
$explicitAlias = false;
|
||||
} elseif ($token === ';') {
|
||||
$statements[strtolower($alias)] = $groupRoot . $class;
|
||||
break;
|
||||
} elseif ($token === '{') {
|
||||
$groupRoot = $class;
|
||||
$class = '';
|
||||
} elseif ($token === '}') {
|
||||
continue;
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return $statements;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets all use statements.
|
||||
*
|
||||
* @param string $namespaceName The namespace name of the reflected class.
|
||||
*
|
||||
* @return array<string, string> A list with all found use statements.
|
||||
*/
|
||||
public function parseUseStatements($namespaceName)
|
||||
{
|
||||
$statements = [];
|
||||
while (($token = $this->next())) {
|
||||
if ($token[0] === T_USE) {
|
||||
$statements = array_merge($statements, $this->parseUseStatement());
|
||||
continue;
|
||||
}
|
||||
|
||||
if ($token[0] !== T_NAMESPACE || $this->parseNamespace() !== $namespaceName) {
|
||||
continue;
|
||||
}
|
||||
|
||||
// Get fresh array for new namespace. This is to prevent the parser to collect the use statements
|
||||
// for a previous namespace with the same name. This is the case if a namespace is defined twice
|
||||
// or if a namespace with the same name is commented out.
|
||||
$statements = [];
|
||||
}
|
||||
|
||||
return $statements;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the namespace.
|
||||
*
|
||||
* @return string The found namespace.
|
||||
*/
|
||||
public function parseNamespace()
|
||||
{
|
||||
$name = '';
|
||||
while (
|
||||
($token = $this->next()) && ($token[0] === T_STRING || $token[0] === T_NS_SEPARATOR || (
|
||||
PHP_VERSION_ID >= 80000 &&
|
||||
($token[0] === T_NAME_QUALIFIED || $token[0] === T_NAME_FULLY_QUALIFIED)
|
||||
))
|
||||
) {
|
||||
$name .= $token[1];
|
||||
}
|
||||
|
||||
return $name;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the class name.
|
||||
*
|
||||
* @return string The found class name.
|
||||
*/
|
||||
public function parseClass()
|
||||
{
|
||||
// Namespaces and class names are tokenized the same: T_STRINGs
|
||||
// separated by T_NS_SEPARATOR so we can use one function to provide
|
||||
// both.
|
||||
return $this->parseNamespace();
|
||||
}
|
||||
}
|
||||
19
vendor/doctrine/lexer/LICENSE
vendored
19
vendor/doctrine/lexer/LICENSE
vendored
@@ -1,19 +0,0 @@
|
||||
Copyright (c) 2006-2018 Doctrine Project
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||
this software and associated documentation files (the "Software"), to deal in
|
||||
the Software without restriction, including without limitation the rights to
|
||||
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
|
||||
of the Software, and to permit persons to whom the Software is furnished to do
|
||||
so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
9
vendor/doctrine/lexer/README.md
vendored
9
vendor/doctrine/lexer/README.md
vendored
@@ -1,9 +0,0 @@
|
||||
# Doctrine Lexer
|
||||
|
||||
Build Status: [](https://travis-ci.org/doctrine/lexer)
|
||||
|
||||
Base library for a lexer that can be used in Top-Down, Recursive Descent Parsers.
|
||||
|
||||
This lexer is used in Doctrine Annotations and in Doctrine ORM (DQL).
|
||||
|
||||
https://www.doctrine-project.org/projects/lexer.html
|
||||
41
vendor/doctrine/lexer/composer.json
vendored
41
vendor/doctrine/lexer/composer.json
vendored
@@ -1,41 +0,0 @@
|
||||
{
|
||||
"name": "doctrine/lexer",
|
||||
"type": "library",
|
||||
"description": "PHP Doctrine Lexer parser library that can be used in Top-Down, Recursive Descent Parsers.",
|
||||
"keywords": [
|
||||
"php",
|
||||
"parser",
|
||||
"lexer",
|
||||
"annotations",
|
||||
"docblock"
|
||||
],
|
||||
"homepage": "https://www.doctrine-project.org/projects/lexer.html",
|
||||
"license": "MIT",
|
||||
"authors": [
|
||||
{"name": "Guilherme Blanco", "email": "guilhermeblanco@gmail.com"},
|
||||
{"name": "Roman Borschel", "email": "roman@code-factory.org"},
|
||||
{"name": "Johannes Schmitt", "email": "schmittjoh@gmail.com"}
|
||||
],
|
||||
"require": {
|
||||
"php": "^7.2 || ^8.0"
|
||||
},
|
||||
"require-dev": {
|
||||
"doctrine/coding-standard": "^6.0",
|
||||
"phpstan/phpstan": "^0.11.8",
|
||||
"phpunit/phpunit": "^8.2"
|
||||
},
|
||||
"autoload": {
|
||||
"psr-4": { "Doctrine\\Common\\Lexer\\": "lib/Doctrine/Common/Lexer" }
|
||||
},
|
||||
"autoload-dev": {
|
||||
"psr-4": { "Doctrine\\Tests\\": "tests/Doctrine" }
|
||||
},
|
||||
"extra": {
|
||||
"branch-alias": {
|
||||
"dev-master": "1.2.x-dev"
|
||||
}
|
||||
},
|
||||
"config": {
|
||||
"sort-packages": true
|
||||
}
|
||||
}
|
||||
@@ -1,328 +0,0 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace Doctrine\Common\Lexer;
|
||||
|
||||
use ReflectionClass;
|
||||
use const PREG_SPLIT_DELIM_CAPTURE;
|
||||
use const PREG_SPLIT_NO_EMPTY;
|
||||
use const PREG_SPLIT_OFFSET_CAPTURE;
|
||||
use function implode;
|
||||
use function in_array;
|
||||
use function preg_split;
|
||||
use function sprintf;
|
||||
use function substr;
|
||||
|
||||
/**
|
||||
* Base class for writing simple lexers, i.e. for creating small DSLs.
|
||||
*/
|
||||
abstract class AbstractLexer
|
||||
{
|
||||
/**
|
||||
* Lexer original input string.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
private $input;
|
||||
|
||||
/**
|
||||
* Array of scanned tokens.
|
||||
*
|
||||
* Each token is an associative array containing three items:
|
||||
* - 'value' : the string value of the token in the input string
|
||||
* - 'type' : the type of the token (identifier, numeric, string, input
|
||||
* parameter, none)
|
||||
* - 'position' : the position of the token in the input string
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
private $tokens = [];
|
||||
|
||||
/**
|
||||
* Current lexer position in input string.
|
||||
*
|
||||
* @var int
|
||||
*/
|
||||
private $position = 0;
|
||||
|
||||
/**
|
||||
* Current peek of current lexer position.
|
||||
*
|
||||
* @var int
|
||||
*/
|
||||
private $peek = 0;
|
||||
|
||||
/**
|
||||
* The next token in the input.
|
||||
*
|
||||
* @var array|null
|
||||
*/
|
||||
public $lookahead;
|
||||
|
||||
/**
|
||||
* The last matched/seen token.
|
||||
*
|
||||
* @var array|null
|
||||
*/
|
||||
public $token;
|
||||
|
||||
/**
|
||||
* Composed regex for input parsing.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
private $regex;
|
||||
|
||||
/**
|
||||
* Sets the input data to be tokenized.
|
||||
*
|
||||
* The Lexer is immediately reset and the new input tokenized.
|
||||
* Any unprocessed tokens from any previous input are lost.
|
||||
*
|
||||
* @param string $input The input to be tokenized.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function setInput($input)
|
||||
{
|
||||
$this->input = $input;
|
||||
$this->tokens = [];
|
||||
|
||||
$this->reset();
|
||||
$this->scan($input);
|
||||
}
|
||||
|
||||
/**
|
||||
* Resets the lexer.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function reset()
|
||||
{
|
||||
$this->lookahead = null;
|
||||
$this->token = null;
|
||||
$this->peek = 0;
|
||||
$this->position = 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Resets the peek pointer to 0.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function resetPeek()
|
||||
{
|
||||
$this->peek = 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Resets the lexer position on the input to the given position.
|
||||
*
|
||||
* @param int $position Position to place the lexical scanner.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function resetPosition($position = 0)
|
||||
{
|
||||
$this->position = $position;
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieve the original lexer's input until a given position.
|
||||
*
|
||||
* @param int $position
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getInputUntilPosition($position)
|
||||
{
|
||||
return substr($this->input, 0, $position);
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks whether a given token matches the current lookahead.
|
||||
*
|
||||
* @param int|string $token
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function isNextToken($token)
|
||||
{
|
||||
return $this->lookahead !== null && $this->lookahead['type'] === $token;
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks whether any of the given tokens matches the current lookahead.
|
||||
*
|
||||
* @param array $tokens
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function isNextTokenAny(array $tokens)
|
||||
{
|
||||
return $this->lookahead !== null && in_array($this->lookahead['type'], $tokens, true);
|
||||
}
|
||||
|
||||
/**
|
||||
* Moves to the next token in the input string.
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function moveNext()
|
||||
{
|
||||
$this->peek = 0;
|
||||
$this->token = $this->lookahead;
|
||||
$this->lookahead = isset($this->tokens[$this->position])
|
||||
? $this->tokens[$this->position++] : null;
|
||||
|
||||
return $this->lookahead !== null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Tells the lexer to skip input tokens until it sees a token with the given value.
|
||||
*
|
||||
* @param string $type The token type to skip until.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function skipUntil($type)
|
||||
{
|
||||
while ($this->lookahead !== null && $this->lookahead['type'] !== $type) {
|
||||
$this->moveNext();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks if given value is identical to the given token.
|
||||
*
|
||||
* @param mixed $value
|
||||
* @param int|string $token
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function isA($value, $token)
|
||||
{
|
||||
return $this->getType($value) === $token;
|
||||
}
|
||||
|
||||
/**
|
||||
* Moves the lookahead token forward.
|
||||
*
|
||||
* @return array|null The next token or NULL if there are no more tokens ahead.
|
||||
*/
|
||||
public function peek()
|
||||
{
|
||||
if (isset($this->tokens[$this->position + $this->peek])) {
|
||||
return $this->tokens[$this->position + $this->peek++];
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Peeks at the next token, returns it and immediately resets the peek.
|
||||
*
|
||||
* @return array|null The next token or NULL if there are no more tokens ahead.
|
||||
*/
|
||||
public function glimpse()
|
||||
{
|
||||
$peek = $this->peek();
|
||||
$this->peek = 0;
|
||||
|
||||
return $peek;
|
||||
}
|
||||
|
||||
/**
|
||||
* Scans the input string for tokens.
|
||||
*
|
||||
* @param string $input A query string.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
protected function scan($input)
|
||||
{
|
||||
if (! isset($this->regex)) {
|
||||
$this->regex = sprintf(
|
||||
'/(%s)|%s/%s',
|
||||
implode(')|(', $this->getCatchablePatterns()),
|
||||
implode('|', $this->getNonCatchablePatterns()),
|
||||
$this->getModifiers()
|
||||
);
|
||||
}
|
||||
|
||||
$flags = PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_OFFSET_CAPTURE;
|
||||
$matches = preg_split($this->regex, $input, -1, $flags);
|
||||
|
||||
if ($matches === false) {
|
||||
// Work around https://bugs.php.net/78122
|
||||
$matches = [[$input, 0]];
|
||||
}
|
||||
|
||||
foreach ($matches as $match) {
|
||||
// Must remain before 'value' assignment since it can change content
|
||||
$type = $this->getType($match[0]);
|
||||
|
||||
$this->tokens[] = [
|
||||
'value' => $match[0],
|
||||
'type' => $type,
|
||||
'position' => $match[1],
|
||||
];
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the literal for a given token.
|
||||
*
|
||||
* @param int|string $token
|
||||
*
|
||||
* @return int|string
|
||||
*/
|
||||
public function getLiteral($token)
|
||||
{
|
||||
$className = static::class;
|
||||
$reflClass = new ReflectionClass($className);
|
||||
$constants = $reflClass->getConstants();
|
||||
|
||||
foreach ($constants as $name => $value) {
|
||||
if ($value === $token) {
|
||||
return $className . '::' . $name;
|
||||
}
|
||||
}
|
||||
|
||||
return $token;
|
||||
}
|
||||
|
||||
/**
|
||||
* Regex modifiers
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
protected function getModifiers()
|
||||
{
|
||||
return 'iu';
|
||||
}
|
||||
|
||||
/**
|
||||
* Lexical catchable patterns.
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
abstract protected function getCatchablePatterns();
|
||||
|
||||
/**
|
||||
* Lexical non-catchable patterns.
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
abstract protected function getNonCatchablePatterns();
|
||||
|
||||
/**
|
||||
* Retrieve token type. Also processes the token value if necessary.
|
||||
*
|
||||
* @param string $value
|
||||
*
|
||||
* @return int|string|null
|
||||
*/
|
||||
abstract protected function getType(&$value);
|
||||
}
|
||||
341
vendor/fpdf/FAQ.htm
vendored
341
vendor/fpdf/FAQ.htm
vendored
@@ -1,341 +0,0 @@
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
|
||||
<title>FAQ</title>
|
||||
<link type="text/css" rel="stylesheet" href="fpdf.css">
|
||||
<style type="text/css">
|
||||
ul {list-style-type:none; margin:0; padding:0}
|
||||
ul#answers li {margin-top:1.8em}
|
||||
.question {font-weight:bold; color:#900000}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<h1>FAQ</h1>
|
||||
<ul>
|
||||
<li><b>1.</b> <a href='#q1'>What's exactly the license of FPDF? Are there any usage restrictions?</a></li>
|
||||
<li><b>2.</b> <a href='#q2'>When I try to create a PDF, a lot of weird characters show on the screen. Why?</a></li>
|
||||
<li><b>3.</b> <a href='#q3'>I try to generate a PDF and IE displays a blank page. What happens?</a></li>
|
||||
<li><b>4.</b> <a href='#q4'>I can't make line breaks work. I put \n in the string printed by MultiCell but it doesn't work.</a></li>
|
||||
<li><b>5.</b> <a href='#q5'>I try to display a variable in the Header method but nothing prints.</a></li>
|
||||
<li><b>6.</b> <a href='#q6'>I defined the Header and Footer methods in my PDF class but nothing appears.</a></li>
|
||||
<li><b>7.</b> <a href='#q7'>Accented characters are replaced by some strange characters like é.</a></li>
|
||||
<li><b>8.</b> <a href='#q8'>I try to display the Euro symbol but it doesn't work.</a></li>
|
||||
<li><b>9.</b> <a href='#q9'>I get the following error when I try to generate a PDF: Some data has already been output, can't send PDF file</a></li>
|
||||
<li><b>10.</b> <a href='#q10'>I draw a frame with very precise dimensions, but when printed I notice some differences.</a></li>
|
||||
<li><b>11.</b> <a href='#q11'>I'd like to use the whole surface of the page, but when printed I always have some margins. How can I get rid of them?</a></li>
|
||||
<li><b>12.</b> <a href='#q12'>How can I put a background in my PDF?</a></li>
|
||||
<li><b>13.</b> <a href='#q13'>How can I set a specific header or footer on the first page?</a></li>
|
||||
<li><b>14.</b> <a href='#q14'>I'd like to use extensions provided by different scripts. How can I combine them?</a></li>
|
||||
<li><b>15.</b> <a href='#q15'>How can I send the PDF by email?</a></li>
|
||||
<li><b>16.</b> <a href='#q16'>What's the limit of the file sizes I can generate with FPDF?</a></li>
|
||||
<li><b>17.</b> <a href='#q17'>Can I modify a PDF with FPDF?</a></li>
|
||||
<li><b>18.</b> <a href='#q18'>I'd like to make a search engine in PHP and index PDF files. Can I do it with FPDF?</a></li>
|
||||
<li><b>19.</b> <a href='#q19'>Can I convert an HTML page to PDF with FPDF?</a></li>
|
||||
<li><b>20.</b> <a href='#q20'>Can I concatenate PDF files with FPDF?</a></li>
|
||||
</ul>
|
||||
|
||||
<ul id='answers'>
|
||||
<li id='q1'>
|
||||
<p><b>1.</b> <span class='question'>What's exactly the license of FPDF? Are there any usage restrictions?</span></p>
|
||||
FPDF is released under a permissive license: there is no usage restriction. You may embed it
|
||||
freely in your application (commercial or not), with or without modifications.
|
||||
</li>
|
||||
|
||||
<li id='q2'>
|
||||
<p><b>2.</b> <span class='question'>When I try to create a PDF, a lot of weird characters show on the screen. Why?</span></p>
|
||||
These "weird" characters are in fact the actual content of your PDF. This behavior is a bug of
|
||||
IE6. When it first receives an HTML page, then a PDF from the same URL, it displays it directly
|
||||
without launching Acrobat. This happens frequently during the development stage: on the least
|
||||
script error, an HTML page is sent, and after correction, the PDF arrives.
|
||||
<br>
|
||||
To solve the problem, simply quit and restart IE. You can also go to another URL and come
|
||||
back.
|
||||
<br>
|
||||
To avoid this kind of inconvenience during the development, you can generate the PDF directly
|
||||
to a file and open it through the explorer.
|
||||
</li>
|
||||
|
||||
<li id='q3'>
|
||||
<p><b>3.</b> <span class='question'>I try to generate a PDF and IE displays a blank page. What happens?</span></p>
|
||||
First of all, check that you send nothing to the browser after the PDF (not even a space or a
|
||||
carriage return). You can put an exit statement just after the call to the Output() method to
|
||||
be sure. If it still doesn't work, it means you're a victim of the "blank page syndrome". IE
|
||||
used in conjunction with the Acrobat plug-in suffers from many bugs. To avoid these problems
|
||||
in a reliable manner, two main techniques exist:
|
||||
<br>
|
||||
<br>
|
||||
- Disable the plug-in and use Acrobat as a helper application. To do this, launch Acrobat, go
|
||||
to the Edit menu, Preferences, Internet, and uncheck "Display PDF in browser". Then, the next
|
||||
time you load a PDF in IE, it displays the dialog box "Open it" or "Save it to disk". Uncheck
|
||||
the option "Always ask before opening this type of file" and choose Open. From now on, PDF files
|
||||
will open automatically in an external Acrobat window.
|
||||
<br>
|
||||
The drawback of the method is that you need to alter the client configuration, which you can do
|
||||
in an intranet environment but not for the Internet.
|
||||
<br>
|
||||
<br>
|
||||
- Use a redirection technique. It consists in generating the PDF in a temporary file on the server
|
||||
and redirect the client to it. For example, at the end of the script, you can put the following:
|
||||
<div class="doc-source">
|
||||
<pre><code>//Determine a temporary file name in the current directory
|
||||
$file = basename(tempnam('.', 'tmp'));
|
||||
rename($file, $file.'.pdf');
|
||||
$file .= '.pdf';
|
||||
//Save PDF to file
|
||||
$pdf->Output($file, 'F');
|
||||
//Redirect
|
||||
header('Location: '.$file);</code></pre>
|
||||
</div>
|
||||
This method turns the dynamic PDF into a static one and avoids all troubles. But you have to do
|
||||
some cleaning in order to delete the temporary files. For example:
|
||||
<div class="doc-source">
|
||||
<pre><code>function CleanFiles($dir)
|
||||
{
|
||||
//Delete temporary files
|
||||
$t = time();
|
||||
$h = opendir($dir);
|
||||
while($file=readdir($h))
|
||||
{
|
||||
if(substr($file,0,3)=='tmp' && substr($file,-4)=='.pdf')
|
||||
{
|
||||
$path = $dir.'/'.$file;
|
||||
if($t-filemtime($path)>3600)
|
||||
@unlink($path);
|
||||
}
|
||||
}
|
||||
closedir($h);
|
||||
}</code></pre>
|
||||
</div>
|
||||
This function deletes all files of the form tmp*.pdf older than an hour in the specified
|
||||
directory. You may call it where you want, for example in the script which generates the PDF.
|
||||
</li>
|
||||
|
||||
<li id='q4'>
|
||||
<p><b>4.</b> <span class='question'>I can't make line breaks work. I put \n in the string printed by MultiCell but it doesn't work.</span></p>
|
||||
You have to enclose your string with double quotes, not single ones.
|
||||
</li>
|
||||
|
||||
<li id='q5'>
|
||||
<p><b>5.</b> <span class='question'>I try to display a variable in the Header method but nothing prints.</span></p>
|
||||
You have to use the <code>global</code> keyword to access global variables, for example:
|
||||
<div class="doc-source">
|
||||
<pre><code>function Header()
|
||||
{
|
||||
global $title;
|
||||
|
||||
$this->SetFont('Arial', 'B', 15);
|
||||
$this->Cell(0, 10, $title, 1, 1, 'C');
|
||||
}
|
||||
|
||||
$title = 'My title';</code></pre>
|
||||
</div>
|
||||
Alternatively, you can use an object property:
|
||||
<div class="doc-source">
|
||||
<pre><code>function Header()
|
||||
{
|
||||
$this->SetFont('Arial', 'B', 15);
|
||||
$this->Cell(0, 10, $this->title, 1, 1, 'C');
|
||||
}
|
||||
|
||||
$pdf->title = 'My title';</code></pre>
|
||||
</div>
|
||||
</li>
|
||||
|
||||
<li id='q6'>
|
||||
<p><b>6.</b> <span class='question'>I defined the Header and Footer methods in my PDF class but nothing appears.</span></p>
|
||||
You have to create an object from the PDF class, not FPDF:
|
||||
<div class="doc-source">
|
||||
<pre><code>$pdf = new PDF();</code></pre>
|
||||
</div>
|
||||
</li>
|
||||
|
||||
<li id='q7'>
|
||||
<p><b>7.</b> <span class='question'>Accented characters are replaced by some strange characters like é.</span></p>
|
||||
Don't use UTF-8 encoding. Standard FPDF fonts use ISO-8859-1 or Windows-1252.
|
||||
It is possible to perform a conversion to ISO-8859-1 with utf8_decode():
|
||||
<div class="doc-source">
|
||||
<pre><code>$str = utf8_decode($str);</code></pre>
|
||||
</div>
|
||||
But some characters such as Euro won't be translated correctly. If the iconv extension is available, the
|
||||
right way to do it is the following:
|
||||
<div class="doc-source">
|
||||
<pre><code>$str = iconv('UTF-8', 'windows-1252', $str);</code></pre>
|
||||
</div>
|
||||
</li>
|
||||
|
||||
<li id='q8'>
|
||||
<p><b>8.</b> <span class='question'>I try to display the Euro symbol but it doesn't work.</span></p>
|
||||
The standard fonts have the Euro character at position 128. You can define a constant like this
|
||||
for convenience:
|
||||
<div class="doc-source">
|
||||
<pre><code>define('EURO', chr(128));</code></pre>
|
||||
</div>
|
||||
</li>
|
||||
|
||||
<li id='q9'>
|
||||
<p><b>9.</b> <span class='question'>I get the following error when I try to generate a PDF: Some data has already been output, can't send PDF file</span></p>
|
||||
You must send nothing to the browser except the PDF itself: no HTML, no space, no carriage return. A common
|
||||
case is having extra blank at the end of an included script file.<br>
|
||||
If you can't figure out where the problem comes from, this other message appearing just before can help you:<br>
|
||||
<br>
|
||||
<b>Warning:</b> Cannot modify header information - headers already sent by (output started at script.php:X)<br>
|
||||
<br>
|
||||
It means that script.php outputs something at line X. Go to this line and fix it.
|
||||
In case the message doesn't show, first check that you didn't disable warnings, then add this at the very
|
||||
beginning of your script:
|
||||
<div class="doc-source">
|
||||
<pre><code>ob_end_clean();</code></pre>
|
||||
</div>
|
||||
If you still don't see it, disable zlib.output_compression in your php.ini and it should appear.
|
||||
</li>
|
||||
|
||||
<li id='q10'>
|
||||
<p><b>10.</b> <span class='question'>I draw a frame with very precise dimensions, but when printed I notice some differences.</span></p>
|
||||
To respect dimensions, select "None" for the Page Scaling setting instead of "Shrink to Printable Area" in the print dialog box.
|
||||
</li>
|
||||
|
||||
<li id='q11'>
|
||||
<p><b>11.</b> <span class='question'>I'd like to use the whole surface of the page, but when printed I always have some margins. How can I get rid of them?</span></p>
|
||||
Printers have physical margins (different depending on the models); it is therefore impossible to remove
|
||||
them and print on the whole surface of the paper.
|
||||
</li>
|
||||
|
||||
<li id='q12'>
|
||||
<p><b>12.</b> <span class='question'>How can I put a background in my PDF?</span></p>
|
||||
For a picture, call Image() in the Header() method, before any other output. To set a background color, use Rect().
|
||||
</li>
|
||||
|
||||
<li id='q13'>
|
||||
<p><b>13.</b> <span class='question'>How can I set a specific header or footer on the first page?</span></p>
|
||||
Simply test the page number:
|
||||
<div class="doc-source">
|
||||
<pre><code>function Header()
|
||||
{
|
||||
if($this->PageNo()==1)
|
||||
{
|
||||
//First page
|
||||
...
|
||||
}
|
||||
else
|
||||
{
|
||||
//Other pages
|
||||
...
|
||||
}
|
||||
}</code></pre>
|
||||
</div>
|
||||
</li>
|
||||
|
||||
<li id='q14'>
|
||||
<p><b>14.</b> <span class='question'>I'd like to use extensions provided by different scripts. How can I combine them?</span></p>
|
||||
Use an inheritance chain. If you have two classes, say A in a.php:
|
||||
<div class="doc-source">
|
||||
<pre><code>require('fpdf.php');
|
||||
|
||||
class A extends FPDF
|
||||
{
|
||||
...
|
||||
}</code></pre>
|
||||
</div>
|
||||
and B in b.php:
|
||||
<div class="doc-source">
|
||||
<pre><code>require('fpdf.php');
|
||||
|
||||
class B extends FPDF
|
||||
{
|
||||
...
|
||||
}</code></pre>
|
||||
</div>
|
||||
then make B extend A:
|
||||
<div class="doc-source">
|
||||
<pre><code>require('a.php');
|
||||
|
||||
class B extends A
|
||||
{
|
||||
...
|
||||
}</code></pre>
|
||||
</div>
|
||||
and make your own class extend B:
|
||||
<div class="doc-source">
|
||||
<pre><code>require('b.php');
|
||||
|
||||
class PDF extends B
|
||||
{
|
||||
...
|
||||
}
|
||||
|
||||
$pdf = new PDF();</code></pre>
|
||||
</div>
|
||||
</li>
|
||||
|
||||
<li id='q15'>
|
||||
<p><b>15.</b> <span class='question'>How can I send the PDF by email?</span></p>
|
||||
As any other file, but an easy way is to use <a href="http://phpmailer.codeworxtech.com">PHPMailer</a> and
|
||||
its in-memory attachment:
|
||||
<div class="doc-source">
|
||||
<pre><code>$mail = new PHPMailer();
|
||||
...
|
||||
$doc = $pdf->Output('', 'S');
|
||||
$mail->AddStringAttachment($doc, 'doc.pdf', 'base64', 'application/pdf');
|
||||
$mail->Send();</code></pre>
|
||||
</div>
|
||||
</li>
|
||||
|
||||
<li id='q16'>
|
||||
<p><b>16.</b> <span class='question'>What's the limit of the file sizes I can generate with FPDF?</span></p>
|
||||
There is no particular limit. There are some constraints, however:
|
||||
<br>
|
||||
<br>
|
||||
- The maximum memory size allocated to PHP scripts is usually 8MB. For very big documents,
|
||||
especially with images, this limit may be reached (the file being built into memory). The
|
||||
parameter is configured in the php.ini file.
|
||||
<br>
|
||||
<br>
|
||||
- The maximum execution time allocated defaults to 30 seconds. This limit can of course be easily
|
||||
reached. It is configured in php.ini and may be altered dynamically with set_time_limit().
|
||||
<br>
|
||||
<br>
|
||||
- Browsers generally have a 5 minute time-out. If you send the PDF directly to the browser and
|
||||
reach the limit, it will be lost. It is therefore advised for very big documents to
|
||||
generate them in a file, and to send some data to the browser from time to time (with a call
|
||||
to flush() to force the output). When the document is finished, you can send a redirection to
|
||||
it or create a link.
|
||||
<br>
|
||||
Remark: even if the browser times out, the script may continue to run on the server.
|
||||
</li>
|
||||
|
||||
<li id='q17'>
|
||||
<p><b>17.</b> <span class='question'>Can I modify a PDF with FPDF?</span></p>
|
||||
It is possible to import pages from an existing PDF document thanks to the FPDI extension:<br>
|
||||
<br>
|
||||
<a href="http://www.setasign.de/products/pdf-php-solutions/fpdi/" target="_blank">http://www.setasign.de/products/pdf-php-solutions/fpdi/</a><br>
|
||||
<br>
|
||||
You can then add some content to them.
|
||||
</li>
|
||||
|
||||
<li id='q18'>
|
||||
<p><b>18.</b> <span class='question'>I'd like to make a search engine in PHP and index PDF files. Can I do it with FPDF?</span></p>
|
||||
No. But a GPL C utility does exist, pdftotext, which is able to extract the textual content from
|
||||
a PDF. It is provided with the Xpdf package:<br>
|
||||
<br>
|
||||
<a href="http://www.foolabs.com/xpdf/" target="_blank">http://www.foolabs.com/xpdf/</a>
|
||||
</li>
|
||||
|
||||
<li id='q19'>
|
||||
<p><b>19.</b> <span class='question'>Can I convert an HTML page to PDF with FPDF?</span></p>
|
||||
Not real-world pages. But a GPL C utility does exist, htmldoc, which allows to do it and gives good results:<br>
|
||||
<br>
|
||||
<a href="http://www.htmldoc.org" target="_blank">http://www.htmldoc.org</a>
|
||||
</li>
|
||||
|
||||
<li id='q20'>
|
||||
<p><b>20.</b> <span class='question'>Can I concatenate PDF files with FPDF?</span></p>
|
||||
Not directly, but it is possible to use <a href="http://www.setasign.de/products/pdf-php-solutions/fpdi/demos/concatenate-fake/" target="_blank">FPDI</a>
|
||||
to perform this task. Some free command-line tools also exist:<br>
|
||||
<br>
|
||||
<a href="http://thierry.schmit.free.fr/spip/spip.php?article15&lang=en" target="_blank">mbtPdfAsm</a><br>
|
||||
<a href="http://www.accesspdf.com/pdftk/" target="_blank">pdftk</a>
|
||||
</li>
|
||||
</ul>
|
||||
</body>
|
||||
</html>
|
||||
BIN
vendor/fpdf/bg.png
vendored
BIN
vendor/fpdf/bg.png
vendored
Binary file not shown.
|
Before Width: | Height: | Size: 159 KiB |
146
vendor/fpdf/changelog.htm
vendored
146
vendor/fpdf/changelog.htm
vendored
@@ -1,146 +0,0 @@
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
|
||||
<title>Changelog</title>
|
||||
<link type="text/css" rel="stylesheet" href="fpdf.css">
|
||||
<style type="text/css">
|
||||
dd {margin:1em 0 1em 1em}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<h1>Changelog</h1>
|
||||
<dl>
|
||||
<dt><strong>v1.7</strong> (2011-06-18)</dt>
|
||||
<dd>
|
||||
- The MakeFont utility has been completely rewritten and doesn't depend on ttf2pt1 anymore.<br>
|
||||
- Alpha channel is now supported for PNGs.<br>
|
||||
- When inserting an image, it's now possible to specify its resolution.<br>
|
||||
- Default resolution for images was increased from 72 to 96 dpi.<br>
|
||||
- When inserting a GIF image, no temporary file is used anymore if the PHP version is 5.1 or higher.<br>
|
||||
- When output buffering is enabled and the PDF is about to be sent, the buffer is now cleared if it contains only a UTF-8 BOM and/or whitespace (instead of throwing an error).<br>
|
||||
- Symbol and ZapfDingbats fonts now support underline style.<br>
|
||||
- Custom page sizes are now checked to ensure that width is smaller than height.<br>
|
||||
- Standard font files were changed to use the same format as user fonts.<br>
|
||||
- A bug in the embedding of Type1 fonts was fixed.<br>
|
||||
- A bug related to SetDisplayMode() and the current locale was fixed.<br>
|
||||
- A display issue occurring with the Adobe Reader X plug-in was fixed.<br>
|
||||
- An issue related to transparency with some versions of Adobe Reader was fixed.<br>
|
||||
- The Content-Length header was removed because it caused an issue when the HTTP server applies compression.<br>
|
||||
</dd>
|
||||
<dt><strong>v1.6</strong> (2008-08-03)</dt>
|
||||
<dd>
|
||||
- PHP 4.3.10 or higher is now required.<br>
|
||||
- GIF image support.<br>
|
||||
- Images can now trigger page breaks.<br>
|
||||
- Possibility to have different page formats in a single document.<br>
|
||||
- Document properties (author, creator, keywords, subject and title) can now be specified in UTF-8.<br>
|
||||
- Fixed a bug: when a PNG was inserted through a URL, an error sometimes occurred.<br>
|
||||
- An automatic page break in Header() doesn't cause an infinite loop any more.<br>
|
||||
- Removed some warning messages appearing with recent PHP versions.<br>
|
||||
- Added HTTP headers to reduce problems with IE.<br>
|
||||
</dd>
|
||||
<dt><strong>v1.53</strong> (2004-12-31)</dt>
|
||||
<dd>
|
||||
- When the font subdirectory is in the same directory as fpdf.php, it's no longer necessary to define the FPDF_FONTPATH constant.<br>
|
||||
- The array $HTTP_SERVER_VARS is no longer used. It could cause trouble on PHP5-based configurations with the register_long_arrays option disabled.<br>
|
||||
- Fixed a problem related to Type1 font embedding which caused trouble to some PDF processors.<br>
|
||||
- The file name sent to the browser could not contain a space character.<br>
|
||||
- The Cell() method could not print the number 0 (you had to pass the string '0').<br>
|
||||
</dd>
|
||||
<dt><strong>v1.52</strong> (2003-12-30)</dt>
|
||||
<dd>
|
||||
- Image() now displays the image at 72 dpi if no dimension is given.<br>
|
||||
- Output() takes a string as second parameter to indicate destination.<br>
|
||||
- Open() is now called automatically by AddPage().<br>
|
||||
- Inserting remote JPEG images doesn't generate an error any longer.<br>
|
||||
- Decimal separator is forced to dot in the constructor.<br>
|
||||
- Added several encodings (Turkish, Thai, Hebrew, Ukrainian and Vietnamese).<br>
|
||||
- The last line of a right-aligned MultiCell() was not correctly aligned if it was terminated by a carriage return.<br>
|
||||
- No more error message about already sent headers when outputting the PDF to the standard output from the command line.<br>
|
||||
- The underlining was going too far for text containing characters \, ( or ).<br>
|
||||
- $HTTP_ENV_VARS has been replaced by $HTTP_SERVER_VARS.<br>
|
||||
</dd>
|
||||
<dt><strong>v1.51</strong> (2002-08-03)</dt>
|
||||
<dd>
|
||||
- Type1 font support.<br>
|
||||
- Added Baltic encoding.<br>
|
||||
- The class now works internally in points with the origin at the bottom in order to avoid two bugs occurring with Acrobat 5 :<br> * The line thickness was too large when printed under Windows 98 SE and ME.<br> * TrueType fonts didn't appear immediately inside the plug-in (a substitution font was used), one had to cause a window refresh to make them show up.<br>
|
||||
- It's no longer necessary to set the decimal separator as dot to produce valid documents.<br>
|
||||
- The clickable area in a cell was always on the left independently from the text alignment.<br>
|
||||
- JPEG images in CMYK mode appeared in inverted colors.<br>
|
||||
- Transparent PNG images in grayscale or true color mode were incorrectly handled.<br>
|
||||
- Adding new fonts now works correctly even with the magic_quotes_runtime option set to on.<br>
|
||||
</dd>
|
||||
<dt><strong>v1.5</strong> (2002-05-28)</dt>
|
||||
<dd>
|
||||
- TrueType font (AddFont()) and encoding support (Western and Eastern Europe, Cyrillic and Greek).<br>
|
||||
- Added Write() method.<br>
|
||||
- Added underlined style.<br>
|
||||
- Internal and external link support (AddLink(), SetLink(), Link()).<br>
|
||||
- Added right margin management and methods SetRightMargin(), SetTopMargin().<br>
|
||||
- Modification of SetDisplayMode() to select page layout.<br>
|
||||
- The border parameter of MultiCell() now lets choose borders to draw as Cell().<br>
|
||||
- When a document contains no page, Close() now calls AddPage() instead of causing a fatal error.<br>
|
||||
</dd>
|
||||
<dt><strong>v1.41</strong> (2002-03-13)</dt>
|
||||
<dd>
|
||||
- Fixed SetDisplayMode() which no longer worked (the PDF viewer used its default display).<br>
|
||||
</dd>
|
||||
<dt><strong>v1.4</strong> (2002-03-02)</dt>
|
||||
<dd>
|
||||
- PHP3 is no longer supported.<br>
|
||||
- Page compression (SetCompression()).<br>
|
||||
- Choice of page format and possibility to change orientation inside document.<br>
|
||||
- Added AcceptPageBreak() method.<br>
|
||||
- Ability to print the total number of pages (AliasNbPages()).<br>
|
||||
- Choice of cell borders to draw.<br>
|
||||
- New mode for Cell(): the current position can now move under the cell.<br>
|
||||
- Ability to include an image by specifying height only (width is calculated automatically).<br>
|
||||
- Fixed a bug: when a justified line triggered a page break, the footer inherited the corresponding word spacing.<br>
|
||||
</dd>
|
||||
<dt><strong>v1.31</strong> (2002-01-12)</dt>
|
||||
<dd>
|
||||
- Fixed a bug in drawing frame with MultiCell(): the last line always started from the left margin.<br>
|
||||
- Removed Expires HTTP header (gives trouble in some situations).<br>
|
||||
- Added Content-disposition HTTP header (seems to help in some situations).<br>
|
||||
</dd>
|
||||
<dt><strong>v1.3</strong> (2001-12-03)</dt>
|
||||
<dd>
|
||||
- Line break and text justification support (MultiCell()).<br>
|
||||
- Color support (SetDrawColor(), SetFillColor(), SetTextColor()). Possibility to draw filled rectangles and paint cell background.<br>
|
||||
- A cell whose width is declared null extends up to the right margin of the page.<br>
|
||||
- Line width is now retained from page to page and defaults to 0.2 mm.<br>
|
||||
- Added SetXY() method.<br>
|
||||
- Fixed a passing by reference done in a deprecated manner for PHP4.<br>
|
||||
</dd>
|
||||
<dt><strong>v1.2</strong> (2001-11-11)</dt>
|
||||
<dd>
|
||||
- Added font metric files and GetStringWidth() method.<br>
|
||||
- Centering and right-aligning text in cells.<br>
|
||||
- Display mode control (SetDisplayMode()).<br>
|
||||
- Added methods to set document properties (SetAuthor(), SetCreator(), SetKeywords(), SetSubject(), SetTitle()).<br>
|
||||
- Possibility to force PDF download by browser.<br>
|
||||
- Added SetX() and GetX() methods.<br>
|
||||
- During automatic page break, current abscissa is now retained.<br>
|
||||
</dd>
|
||||
<dt><strong>v1.11</strong> (2001-10-20)</dt>
|
||||
<dd>
|
||||
- PNG support doesn't require PHP4/zlib any more. Data are now put directly into PDF without any decompression/recompression stage.<br>
|
||||
- Image insertion now works correctly even with magic_quotes_runtime option set to on.<br>
|
||||
</dd>
|
||||
<dt><strong>v1.1</strong> (2001-10-07)</dt>
|
||||
<dd>
|
||||
- JPEG and PNG image support.<br>
|
||||
</dd>
|
||||
<dt><strong>v1.01</strong> (2001-10-03)</dt>
|
||||
<dd>
|
||||
- Fixed a bug involving page break: in case when Header() doesn't specify a font, the one from previous page was not restored and produced an incorrect document.<br>
|
||||
</dd>
|
||||
<dt><strong>v1.0</strong> (2001-09-17)</dt>
|
||||
<dd>
|
||||
- First version.<br>
|
||||
</dd>
|
||||
</dl>
|
||||
</body>
|
||||
</html>
|
||||
63
vendor/fpdf/doc/acceptpagebreak.htm
vendored
63
vendor/fpdf/doc/acceptpagebreak.htm
vendored
@@ -1,63 +0,0 @@
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
|
||||
<title>AcceptPageBreak</title>
|
||||
<link type="text/css" rel="stylesheet" href="../fpdf.css">
|
||||
</head>
|
||||
<body>
|
||||
<h1>AcceptPageBreak</h1>
|
||||
<code><b>boolean</b> AcceptPageBreak()</code>
|
||||
<h2>Description</h2>
|
||||
Whenever a page break condition is met, the method is called, and the break is issued or not
|
||||
depending on the returned value. The default implementation returns a value according to the
|
||||
mode selected by SetAutoPageBreak().
|
||||
<br>
|
||||
This method is called automatically and should not be called directly by the application.
|
||||
<h2>Example</h2>
|
||||
The method is overriden in an inherited class in order to obtain a 3 column layout:
|
||||
<div class="doc-source">
|
||||
<pre><code>class PDF extends FPDF
|
||||
{
|
||||
var $col = 0;
|
||||
|
||||
function SetCol($col)
|
||||
{
|
||||
// Move position to a column
|
||||
$this->col = $col;
|
||||
$x = 10+$col*65;
|
||||
$this->SetLeftMargin($x);
|
||||
$this->SetX($x);
|
||||
}
|
||||
|
||||
function AcceptPageBreak()
|
||||
{
|
||||
if($this->col<2)
|
||||
{
|
||||
// Go to next column
|
||||
$this->SetCol($this->col+1);
|
||||
$this->SetY(10);
|
||||
return false;
|
||||
}
|
||||
else
|
||||
{
|
||||
// Go back to first column and issue page break
|
||||
$this->SetCol(0);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$pdf = new PDF();
|
||||
$pdf->AddPage();
|
||||
$pdf->SetFont('Arial','',12);
|
||||
for($i=1;$i<=300;$i++)
|
||||
$pdf->Cell(0,5,"Line $i",0,1);
|
||||
$pdf->Output();</code></pre>
|
||||
</div>
|
||||
<h2>See also</h2>
|
||||
<a href="setautopagebreak.htm">SetAutoPageBreak()</a>.
|
||||
<hr style="margin-top:1.5em">
|
||||
<div style="text-align:center"><a href="index.htm">Index</a></div>
|
||||
</body>
|
||||
</html>
|
||||
55
vendor/fpdf/doc/addfont.htm
vendored
55
vendor/fpdf/doc/addfont.htm
vendored
@@ -1,55 +0,0 @@
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
|
||||
<title>AddFont</title>
|
||||
<link type="text/css" rel="stylesheet" href="../fpdf.css">
|
||||
</head>
|
||||
<body>
|
||||
<h1>AddFont</h1>
|
||||
<code>AddFont(<b>string</b> family [, <b>string</b> style [, <b>string</b> file]])</code>
|
||||
<h2>Description</h2>
|
||||
Imports a TrueType, OpenType or Type1 font and makes it available. It is necessary to generate a font
|
||||
definition file first with the MakeFont utility.
|
||||
<br>
|
||||
The definition file (and the font file itself when embedding) must be present in the font directory.
|
||||
If it is not found, the error "Could not include font definition file" is raised.
|
||||
<h2>Parameters</h2>
|
||||
<dl class="param">
|
||||
<dt><code>family</code></dt>
|
||||
<dd>
|
||||
Font family. The name can be chosen arbitrarily. If it is a standard family name, it will
|
||||
override the corresponding font.
|
||||
</dd>
|
||||
<dt><code>style</code></dt>
|
||||
<dd>
|
||||
Font style. Possible values are (case insensitive):
|
||||
<ul>
|
||||
<li>empty string: regular</li>
|
||||
<li><code>B</code>: bold</li>
|
||||
<li><code>I</code>: italic</li>
|
||||
<li><code>BI</code> or <code>IB</code>: bold italic</li>
|
||||
</ul>
|
||||
The default value is regular.
|
||||
</dd>
|
||||
<dt><code>file</code></dt>
|
||||
<dd>
|
||||
The font definition file.
|
||||
<br>
|
||||
By default, the name is built from the family and style, in lower case with no space.
|
||||
</dd>
|
||||
</dl>
|
||||
<h2>Example</h2>
|
||||
<div class="doc-source">
|
||||
<pre><code>$pdf->AddFont('Comic','I');</code></pre>
|
||||
</div>
|
||||
is equivalent to:
|
||||
<div class="doc-source">
|
||||
<pre><code>$pdf->AddFont('Comic','I','comici.php');</code></pre>
|
||||
</div>
|
||||
<h2>See also</h2>
|
||||
<a href="setfont.htm">SetFont()</a>.
|
||||
<hr style="margin-top:1.5em">
|
||||
<div style="text-align:center"><a href="index.htm">Index</a></div>
|
||||
</body>
|
||||
</html>
|
||||
26
vendor/fpdf/doc/addlink.htm
vendored
26
vendor/fpdf/doc/addlink.htm
vendored
@@ -1,26 +0,0 @@
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
|
||||
<title>AddLink</title>
|
||||
<link type="text/css" rel="stylesheet" href="../fpdf.css">
|
||||
</head>
|
||||
<body>
|
||||
<h1>AddLink</h1>
|
||||
<code><b>int</b> AddLink()</code>
|
||||
<h2>Description</h2>
|
||||
Creates a new internal link and returns its identifier. An internal link is a clickable area
|
||||
which directs to another place within the document.
|
||||
<br>
|
||||
The identifier can then be passed to Cell(), Write(), Image() or Link(). The destination is
|
||||
defined with SetLink().
|
||||
<h2>See also</h2>
|
||||
<a href="cell.htm">Cell()</a>,
|
||||
<a href="write.htm">Write()</a>,
|
||||
<a href="image.htm">Image()</a>,
|
||||
<a href="link.htm">Link()</a>,
|
||||
<a href="setlink.htm">SetLink()</a>.
|
||||
<hr style="margin-top:1.5em">
|
||||
<div style="text-align:center"><a href="index.htm">Index</a></div>
|
||||
</body>
|
||||
</html>
|
||||
56
vendor/fpdf/doc/addpage.htm
vendored
56
vendor/fpdf/doc/addpage.htm
vendored
@@ -1,56 +0,0 @@
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
|
||||
<title>AddPage</title>
|
||||
<link type="text/css" rel="stylesheet" href="../fpdf.css">
|
||||
</head>
|
||||
<body>
|
||||
<h1>AddPage</h1>
|
||||
<code>AddPage([<b>string</b> orientation [, <b>mixed</b> size]])</code>
|
||||
<h2>Description</h2>
|
||||
Adds a new page to the document. If a page is already present, the Footer() method is called
|
||||
first to output the footer. Then the page is added, the current position set to the top-left
|
||||
corner according to the left and top margins, and Header() is called to display the header.
|
||||
<br>
|
||||
The font which was set before calling is automatically restored. There is no need to call
|
||||
SetFont() again if you want to continue with the same font. The same is true for colors and
|
||||
line width.
|
||||
<br>
|
||||
The origin of the coordinate system is at the top-left corner and increasing ordinates go
|
||||
downwards.
|
||||
<h2>Parameters</h2>
|
||||
<dl class="param">
|
||||
<dt><code>orientation</code></dt>
|
||||
<dd>
|
||||
Page orientation. Possible values are (case insensitive):
|
||||
<ul>
|
||||
<li><code>P</code> or <code>Portrait</code></li>
|
||||
<li><code>L</code> or <code>Landscape</code></li>
|
||||
</ul>
|
||||
The default value is the one passed to the constructor.
|
||||
</dd>
|
||||
<dt><code>size</code></dt>
|
||||
<dd>
|
||||
Page size. It can be either one of the following values (case insensitive):
|
||||
<ul>
|
||||
<li><code>A3</code></li>
|
||||
<li><code>A4</code></li>
|
||||
<li><code>A5</code></li>
|
||||
<li><code>Letter</code></li>
|
||||
<li><code>Legal</code></li>
|
||||
</ul>
|
||||
or an array containing the width and the height (expressed in user unit).<br>
|
||||
<br>
|
||||
The default value is the one passed to the constructor.
|
||||
</dd>
|
||||
</dl>
|
||||
<h2>See also</h2>
|
||||
<a href="fpdf.htm">FPDF()</a>,
|
||||
<a href="header.htm">Header()</a>,
|
||||
<a href="footer.htm">Footer()</a>,
|
||||
<a href="setmargins.htm">SetMargins()</a>.
|
||||
<hr style="margin-top:1.5em">
|
||||
<div style="text-align:center"><a href="index.htm">Index</a></div>
|
||||
</body>
|
||||
</html>
|
||||
45
vendor/fpdf/doc/aliasnbpages.htm
vendored
45
vendor/fpdf/doc/aliasnbpages.htm
vendored
@@ -1,45 +0,0 @@
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
|
||||
<title>AliasNbPages</title>
|
||||
<link type="text/css" rel="stylesheet" href="../fpdf.css">
|
||||
</head>
|
||||
<body>
|
||||
<h1>AliasNbPages</h1>
|
||||
<code>AliasNbPages([<b>string</b> alias])</code>
|
||||
<h2>Description</h2>
|
||||
Defines an alias for the total number of pages. It will be substituted as the document is
|
||||
closed.
|
||||
<h2>Parameters</h2>
|
||||
<dl class="param">
|
||||
<dt><code>alias</code></dt>
|
||||
<dd>
|
||||
The alias. Default value: <code>{nb}</code>.
|
||||
</dd>
|
||||
</dl>
|
||||
<h2>Example</h2>
|
||||
<div class="doc-source">
|
||||
<pre><code>class PDF extends FPDF
|
||||
{
|
||||
function Footer()
|
||||
{
|
||||
// Go to 1.5 cm from bottom
|
||||
$this->SetY(-15);
|
||||
// Select Arial italic 8
|
||||
$this->SetFont('Arial','I',8);
|
||||
// Print current and total page numbers
|
||||
$this->Cell(0,10,'Page '.$this->PageNo().'/{nb}',0,0,'C');
|
||||
}
|
||||
}
|
||||
|
||||
$pdf = new PDF();
|
||||
$pdf->AliasNbPages();</code></pre>
|
||||
</div>
|
||||
<h2>See also</h2>
|
||||
<a href="pageno.htm">PageNo()</a>,
|
||||
<a href="footer.htm">Footer()</a>.
|
||||
<hr style="margin-top:1.5em">
|
||||
<div style="text-align:center"><a href="index.htm">Index</a></div>
|
||||
</body>
|
||||
</html>
|
||||
104
vendor/fpdf/doc/cell.htm
vendored
104
vendor/fpdf/doc/cell.htm
vendored
@@ -1,104 +0,0 @@
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
|
||||
<title>Cell</title>
|
||||
<link type="text/css" rel="stylesheet" href="../fpdf.css">
|
||||
</head>
|
||||
<body>
|
||||
<h1>Cell</h1>
|
||||
<code>Cell(<b>float</b> w [, <b>float</b> h [, <b>string</b> txt [, <b>mixed</b> border [, <b>int</b> ln [, <b>string</b> align [, <b>boolean</b> fill [, <b>mixed</b> link]]]]]]])</code>
|
||||
<h2>Description</h2>
|
||||
Prints a cell (rectangular area) with optional borders, background color and character string.
|
||||
The upper-left corner of the cell corresponds to the current position. The text can be aligned
|
||||
or centered. After the call, the current position moves to the right or to the next line. It is
|
||||
possible to put a link on the text.
|
||||
<br>
|
||||
If automatic page breaking is enabled and the cell goes beyond the limit, a page break is
|
||||
done before outputting.
|
||||
<h2>Parameters</h2>
|
||||
<dl class="param">
|
||||
<dt><code>w</code></dt>
|
||||
<dd>
|
||||
Cell width. If <code>0</code>, the cell extends up to the right margin.
|
||||
</dd>
|
||||
<dt><code>h</code></dt>
|
||||
<dd>
|
||||
Cell height.
|
||||
Default value: <code>0</code>.
|
||||
</dd>
|
||||
<dt><code>txt</code></dt>
|
||||
<dd>
|
||||
String to print.
|
||||
Default value: empty string.
|
||||
</dd>
|
||||
<dt><code>border</code></dt>
|
||||
<dd>
|
||||
Indicates if borders must be drawn around the cell. The value can be either a number:
|
||||
<ul>
|
||||
<li><code>0</code>: no border</li>
|
||||
<li><code>1</code>: frame</li>
|
||||
</ul>
|
||||
or a string containing some or all of the following characters (in any order):
|
||||
<ul>
|
||||
<li><code>L</code>: left</li>
|
||||
<li><code>T</code>: top</li>
|
||||
<li><code>R</code>: right</li>
|
||||
<li><code>B</code>: bottom</li>
|
||||
</ul>
|
||||
Default value: <code>0</code>.
|
||||
</dd>
|
||||
<dt><code>ln</code></dt>
|
||||
<dd>
|
||||
Indicates where the current position should go after the call. Possible values are:
|
||||
<ul>
|
||||
<li><code>0</code>: to the right</li>
|
||||
<li><code>1</code>: to the beginning of the next line</li>
|
||||
<li><code>2</code>: below</li>
|
||||
</ul>
|
||||
Putting <code>1</code> is equivalent to putting <code>0</code> and calling Ln() just after.
|
||||
Default value: <code>0</code>.
|
||||
</dd>
|
||||
<dt><code>align</code></dt>
|
||||
<dd>
|
||||
Allows to center or align the text. Possible values are:
|
||||
<ul>
|
||||
<li><code>L</code> or empty string: left align (default value)</li>
|
||||
<li><code>C</code>: center</li>
|
||||
<li><code>R</code>: right align</li>
|
||||
</ul>
|
||||
</dd>
|
||||
<dt><code>fill</code></dt>
|
||||
<dd>
|
||||
Indicates if the cell background must be painted (<code>true</code>) or transparent (<code>false</code>).
|
||||
Default value: <code>false</code>.
|
||||
</dd>
|
||||
<dt><code>link</code></dt>
|
||||
<dd>
|
||||
URL or identifier returned by AddLink().
|
||||
</dd>
|
||||
</dl>
|
||||
<h2>Example</h2>
|
||||
<div class="doc-source">
|
||||
<pre><code>// Set font
|
||||
$pdf->SetFont('Arial','B',16);
|
||||
// Move to 8 cm to the right
|
||||
$pdf->Cell(80);
|
||||
// Centered text in a framed 20*10 mm cell and line break
|
||||
$pdf->Cell(20,10,'Title',1,1,'C');</code></pre>
|
||||
</div>
|
||||
<h2>See also</h2>
|
||||
<a href="setfont.htm">SetFont()</a>,
|
||||
<a href="setdrawcolor.htm">SetDrawColor()</a>,
|
||||
<a href="setfillcolor.htm">SetFillColor()</a>,
|
||||
<a href="settextcolor.htm">SetTextColor()</a>,
|
||||
<a href="setlinewidth.htm">SetLineWidth()</a>,
|
||||
<a href="addlink.htm">AddLink()</a>,
|
||||
<a href="ln.htm">Ln()</a>,
|
||||
<a href="multicell.htm">MultiCell()</a>,
|
||||
<a href="write.htm">Write()</a>,
|
||||
<a href="setautopagebreak.htm">SetAutoPageBreak()</a>.
|
||||
<hr style="margin-top:1.5em">
|
||||
<div style="text-align:center"><a href="index.htm">Index</a></div>
|
||||
</body>
|
||||
</html>
|
||||
21
vendor/fpdf/doc/close.htm
vendored
21
vendor/fpdf/doc/close.htm
vendored
@@ -1,21 +0,0 @@
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
|
||||
<title>Close</title>
|
||||
<link type="text/css" rel="stylesheet" href="../fpdf.css">
|
||||
</head>
|
||||
<body>
|
||||
<h1>Close</h1>
|
||||
<code>Close()</code>
|
||||
<h2>Description</h2>
|
||||
Terminates the PDF document. It is not necessary to call this method explicitly because Output()
|
||||
does it automatically.
|
||||
<br>
|
||||
If the document contains no page, AddPage() is called to prevent from getting an invalid document.
|
||||
<h2>See also</h2>
|
||||
<a href="output.htm">Output()</a>.
|
||||
<hr style="margin-top:1.5em">
|
||||
<div style="text-align:center"><a href="index.htm">Index</a></div>
|
||||
</body>
|
||||
</html>
|
||||
25
vendor/fpdf/doc/error.htm
vendored
25
vendor/fpdf/doc/error.htm
vendored
@@ -1,25 +0,0 @@
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
|
||||
<title>Error</title>
|
||||
<link type="text/css" rel="stylesheet" href="../fpdf.css">
|
||||
</head>
|
||||
<body>
|
||||
<h1>Error</h1>
|
||||
<code>Error(<b>string</b> msg)</code>
|
||||
<h2>Description</h2>
|
||||
This method is automatically called in case of fatal error; it simply outputs the message
|
||||
and halts the execution. An inherited class may override it to customize the error handling
|
||||
but should always halt the script, or the resulting document would probably be invalid.
|
||||
<h2>Parameters</h2>
|
||||
<dl class="param">
|
||||
<dt><code>msg</code></dt>
|
||||
<dd>
|
||||
The error message.
|
||||
</dd>
|
||||
</dl>
|
||||
<hr style="margin-top:1.5em">
|
||||
<div style="text-align:center"><a href="index.htm">Index</a></div>
|
||||
</body>
|
||||
</html>
|
||||
35
vendor/fpdf/doc/footer.htm
vendored
35
vendor/fpdf/doc/footer.htm
vendored
@@ -1,35 +0,0 @@
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
|
||||
<title>Footer</title>
|
||||
<link type="text/css" rel="stylesheet" href="../fpdf.css">
|
||||
</head>
|
||||
<body>
|
||||
<h1>Footer</h1>
|
||||
<code>Footer()</code>
|
||||
<h2>Description</h2>
|
||||
This method is used to render the page footer. It is automatically called by AddPage() and
|
||||
Close() and should not be called directly by the application. The implementation in FPDF is
|
||||
empty, so you have to subclass it and override the method if you want a specific processing.
|
||||
<h2>Example</h2>
|
||||
<div class="doc-source">
|
||||
<pre><code>class PDF extends FPDF
|
||||
{
|
||||
function Footer()
|
||||
{
|
||||
// Go to 1.5 cm from bottom
|
||||
$this->SetY(-15);
|
||||
// Select Arial italic 8
|
||||
$this->SetFont('Arial','I',8);
|
||||
// Print centered page number
|
||||
$this->Cell(0,10,'Page '.$this->PageNo(),0,0,'C');
|
||||
}
|
||||
}</code></pre>
|
||||
</div>
|
||||
<h2>See also</h2>
|
||||
<a href="header.htm">Header()</a>.
|
||||
<hr style="margin-top:1.5em">
|
||||
<div style="text-align:center"><a href="index.htm">Index</a></div>
|
||||
</body>
|
||||
</html>
|
||||
63
vendor/fpdf/doc/fpdf.htm
vendored
63
vendor/fpdf/doc/fpdf.htm
vendored
@@ -1,63 +0,0 @@
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
|
||||
<title>FPDF</title>
|
||||
<link type="text/css" rel="stylesheet" href="../fpdf.css">
|
||||
</head>
|
||||
<body>
|
||||
<h1>FPDF</h1>
|
||||
<code>FPDF([<b>string</b> orientation [, <b>string</b> unit [, <b>mixed</b> size]]])</code>
|
||||
<h2>Description</h2>
|
||||
This is the class constructor. It allows to set up the page size, the orientation and the
|
||||
unit of measure used in all methods (except for font sizes).
|
||||
<h2>Parameters</h2>
|
||||
<dl class="param">
|
||||
<dt><code>orientation</code></dt>
|
||||
<dd>
|
||||
Default page orientation. Possible values are (case insensitive):
|
||||
<ul>
|
||||
<li><code>P</code> or <code>Portrait</code></li>
|
||||
<li><code>L</code> or <code>Landscape</code></li>
|
||||
</ul>
|
||||
Default value is <code>P</code>.
|
||||
</dd>
|
||||
<dt><code>unit</code></dt>
|
||||
<dd>
|
||||
User unit. Possible values are:
|
||||
<ul>
|
||||
<li><code>pt</code>: point</li>
|
||||
<li><code>mm</code>: millimeter</li>
|
||||
<li><code>cm</code>: centimeter</li>
|
||||
<li><code>in</code>: inch</li>
|
||||
</ul>
|
||||
A point equals 1/72 of inch, that is to say about 0.35 mm (an inch being 2.54 cm). This
|
||||
is a very common unit in typography; font sizes are expressed in that unit.
|
||||
<br>
|
||||
<br>
|
||||
Default value is <code>mm</code>.
|
||||
</dd>
|
||||
<dt><code>size</code></dt>
|
||||
<dd>
|
||||
The size used for pages. It can be either one of the following values (case insensitive):
|
||||
<ul>
|
||||
<li><code>A3</code></li>
|
||||
<li><code>A4</code></li>
|
||||
<li><code>A5</code></li>
|
||||
<li><code>Letter</code></li>
|
||||
<li><code>Legal</code></li>
|
||||
</ul>
|
||||
or an array containing the width and the height (expressed in the unit given by <code>unit</code>).<br>
|
||||
<br>
|
||||
Default value is <code>A4</code>.
|
||||
</dd>
|
||||
</dl>
|
||||
<h2>Example</h2>
|
||||
Example with a custom 100x150 mm page size:
|
||||
<div class="doc-source">
|
||||
<pre><code>$pdf = new FPDF('P','mm',array(100,150));</code></pre>
|
||||
</div>
|
||||
<hr style="margin-top:1.5em">
|
||||
<div style="text-align:center"><a href="index.htm">Index</a></div>
|
||||
</body>
|
||||
</html>
|
||||
23
vendor/fpdf/doc/getstringwidth.htm
vendored
23
vendor/fpdf/doc/getstringwidth.htm
vendored
@@ -1,23 +0,0 @@
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
|
||||
<title>GetStringWidth</title>
|
||||
<link type="text/css" rel="stylesheet" href="../fpdf.css">
|
||||
</head>
|
||||
<body>
|
||||
<h1>GetStringWidth</h1>
|
||||
<code><b>float</b> GetStringWidth(<b>string</b> s)</code>
|
||||
<h2>Description</h2>
|
||||
Returns the length of a string in user unit. A font must be selected.
|
||||
<h2>Parameters</h2>
|
||||
<dl class="param">
|
||||
<dt><code>s</code></dt>
|
||||
<dd>
|
||||
The string whose length is to be computed.
|
||||
</dd>
|
||||
</dl>
|
||||
<hr style="margin-top:1.5em">
|
||||
<div style="text-align:center"><a href="index.htm">Index</a></div>
|
||||
</body>
|
||||
</html>
|
||||
20
vendor/fpdf/doc/getx.htm
vendored
20
vendor/fpdf/doc/getx.htm
vendored
@@ -1,20 +0,0 @@
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
|
||||
<title>GetX</title>
|
||||
<link type="text/css" rel="stylesheet" href="../fpdf.css">
|
||||
</head>
|
||||
<body>
|
||||
<h1>GetX</h1>
|
||||
<code><b>float</b> GetX()</code>
|
||||
<h2>Description</h2>
|
||||
Returns the abscissa of the current position.
|
||||
<h2>See also</h2>
|
||||
<a href="setx.htm">SetX()</a>,
|
||||
<a href="gety.htm">GetY()</a>,
|
||||
<a href="sety.htm">SetY()</a>.
|
||||
<hr style="margin-top:1.5em">
|
||||
<div style="text-align:center"><a href="index.htm">Index</a></div>
|
||||
</body>
|
||||
</html>
|
||||
20
vendor/fpdf/doc/gety.htm
vendored
20
vendor/fpdf/doc/gety.htm
vendored
@@ -1,20 +0,0 @@
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
|
||||
<title>GetY</title>
|
||||
<link type="text/css" rel="stylesheet" href="../fpdf.css">
|
||||
</head>
|
||||
<body>
|
||||
<h1>GetY</h1>
|
||||
<code><b>float</b> GetY()</code>
|
||||
<h2>Description</h2>
|
||||
Returns the ordinate of the current position.
|
||||
<h2>See also</h2>
|
||||
<a href="sety.htm">SetY()</a>,
|
||||
<a href="getx.htm">GetX()</a>,
|
||||
<a href="setx.htm">SetX()</a>.
|
||||
<hr style="margin-top:1.5em">
|
||||
<div style="text-align:center"><a href="index.htm">Index</a></div>
|
||||
</body>
|
||||
</html>
|
||||
37
vendor/fpdf/doc/header.htm
vendored
37
vendor/fpdf/doc/header.htm
vendored
@@ -1,37 +0,0 @@
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
|
||||
<title>Header</title>
|
||||
<link type="text/css" rel="stylesheet" href="../fpdf.css">
|
||||
</head>
|
||||
<body>
|
||||
<h1>Header</h1>
|
||||
<code>Header()</code>
|
||||
<h2>Description</h2>
|
||||
This method is used to render the page header. It is automatically called by AddPage() and
|
||||
should not be called directly by the application. The implementation in FPDF is empty, so
|
||||
you have to subclass it and override the method if you want a specific processing.
|
||||
<h2>Example</h2>
|
||||
<div class="doc-source">
|
||||
<pre><code>class PDF extends FPDF
|
||||
{
|
||||
function Header()
|
||||
{
|
||||
// Select Arial bold 15
|
||||
$this->SetFont('Arial','B',15);
|
||||
// Move to the right
|
||||
$this->Cell(80);
|
||||
// Framed title
|
||||
$this->Cell(30,10,'Title',1,0,'C');
|
||||
// Line break
|
||||
$this->Ln(20);
|
||||
}
|
||||
}</code></pre>
|
||||
</div>
|
||||
<h2>See also</h2>
|
||||
<a href="footer.htm">Footer()</a>.
|
||||
<hr style="margin-top:1.5em">
|
||||
<div style="text-align:center"><a href="index.htm">Index</a></div>
|
||||
</body>
|
||||
</html>
|
||||
99
vendor/fpdf/doc/image.htm
vendored
99
vendor/fpdf/doc/image.htm
vendored
@@ -1,99 +0,0 @@
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
|
||||
<title>Image</title>
|
||||
<link type="text/css" rel="stylesheet" href="../fpdf.css">
|
||||
</head>
|
||||
<body>
|
||||
<h1>Image</h1>
|
||||
<code>Image(<b>string</b> file [, <b>float</b> x [, <b>float</b> y [, <b>float</b> w [, <b>float</b> h [, <b>string</b> type [, <b>mixed</b> link]]]]]])</code>
|
||||
<h2>Description</h2>
|
||||
Puts an image. The size it will take on the page can be specified in different ways:
|
||||
<ul>
|
||||
<li>explicit width and height (expressed in user unit or dpi)</li>
|
||||
<li>one explicit dimension, the other being calculated automatically in order to keep the original proportions</li>
|
||||
<li>no explicit dimension, in which case the image is put at 96 dpi</li>
|
||||
</ul>
|
||||
Supported formats are JPEG, PNG and GIF. The GD extension is required for GIF.
|
||||
<br>
|
||||
<br>
|
||||
For JPEGs, all flavors are allowed:
|
||||
<ul>
|
||||
<li>gray scales</li>
|
||||
<li>true colors (24 bits)</li>
|
||||
<li>CMYK (32 bits)</li>
|
||||
</ul>
|
||||
For PNGs, are allowed:
|
||||
<ul>
|
||||
<li>gray scales on at most 8 bits (256 levels)</li>
|
||||
<li>indexed colors</li>
|
||||
<li>true colors (24 bits)</li>
|
||||
</ul>
|
||||
For GIFs: in case of an animated GIF, only the first frame is displayed.<br>
|
||||
<br>
|
||||
Transparency is supported.<br>
|
||||
<br>
|
||||
The format can be specified explicitly or inferred from the file extension.<br>
|
||||
<br>
|
||||
It is possible to put a link on the image.<br>
|
||||
<br>
|
||||
Remark: if an image is used several times, only one copy is embedded in the file.
|
||||
<h2>Parameters</h2>
|
||||
<dl class="param">
|
||||
<dt><code>file</code></dt>
|
||||
<dd>
|
||||
Path or URL of the image.
|
||||
</dd>
|
||||
<dt><code>x</code></dt>
|
||||
<dd>
|
||||
Abscissa of the upper-left corner. If not specified or equal to <code>null</code>, the current abscissa
|
||||
is used.
|
||||
</dd>
|
||||
<dt><code>y</code></dt>
|
||||
<dd>
|
||||
Ordinate of the upper-left corner. If not specified or equal to <code>null</code>, the current ordinate
|
||||
is used; moreover, a page break is triggered first if necessary (in case automatic page breaking is enabled)
|
||||
and, after the call, the current ordinate is moved to the bottom of the image.
|
||||
</dd>
|
||||
<dt><code>w</code></dt>
|
||||
<dd>
|
||||
Width of the image in the page. There are three cases:
|
||||
<ul>
|
||||
<li>If the value is positive, it represents the width in user unit</li>
|
||||
<li>If the value is negative, the absolute value represents the horizontal resolution in dpi</li>
|
||||
<li>If the value is not specified or equal to zero, it is automatically calculated</li>
|
||||
</ul>
|
||||
</dd>
|
||||
<dt><code>h</code></dt>
|
||||
<dd>
|
||||
Height of the image in the page. There are three cases:
|
||||
<ul>
|
||||
<li>If the value is positive, it represents the height in user unit</li>
|
||||
<li>If the value is negative, the absolute value represents the vertical resolution in dpi</li>
|
||||
<li>If the value is not specified or equal to zero, it is automatically calculated</li>
|
||||
</ul>
|
||||
</dd>
|
||||
<dt><code>type</code></dt>
|
||||
<dd>
|
||||
Image format. Possible values are (case insensitive): <code>JPG</code>, <code>JPEG</code>, <code>PNG</code> and <code>GIF</code>.
|
||||
If not specified, the type is inferred from the file extension.
|
||||
</dd>
|
||||
<dt><code>link</code></dt>
|
||||
<dd>
|
||||
URL or identifier returned by AddLink().
|
||||
</dd>
|
||||
</dl>
|
||||
<h2>Example</h2>
|
||||
<div class="doc-source">
|
||||
<pre><code>// Insert a logo in the top-left corner at 300 dpi
|
||||
$pdf->Image('logo.png',10,10,-300);
|
||||
// Insert a dynamic image from a URL
|
||||
$pdf->Image('http://chart.googleapis.com/chart?cht=p3&chd=t:60,40&chs=250x100&chl=Hello|World',60,30,90,0,'PNG');</code></pre>
|
||||
</div>
|
||||
<h2>See also</h2>
|
||||
<a href="addlink.htm">AddLink()</a>.
|
||||
<hr style="margin-top:1.5em">
|
||||
<div style="text-align:center"><a href="index.htm">Index</a></div>
|
||||
</body>
|
||||
</html>
|
||||
57
vendor/fpdf/doc/index.htm
vendored
57
vendor/fpdf/doc/index.htm
vendored
@@ -1,57 +0,0 @@
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
|
||||
<title>FPDF 1.7 Reference Manual</title>
|
||||
<link type="text/css" rel="stylesheet" href="../fpdf.css">
|
||||
</head>
|
||||
<body>
|
||||
<h1>FPDF 1.7 Reference Manual</h1>
|
||||
<a href="acceptpagebreak.htm">AcceptPageBreak</a> - accept or not automatic page break<br>
|
||||
<a href="addfont.htm">AddFont</a> - add a new font<br>
|
||||
<a href="addlink.htm">AddLink</a> - create an internal link<br>
|
||||
<a href="addpage.htm">AddPage</a> - add a new page<br>
|
||||
<a href="aliasnbpages.htm">AliasNbPages</a> - define an alias for number of pages<br>
|
||||
<a href="cell.htm">Cell</a> - print a cell<br>
|
||||
<a href="close.htm">Close</a> - terminate the document<br>
|
||||
<a href="error.htm">Error</a> - fatal error<br>
|
||||
<a href="footer.htm">Footer</a> - page footer<br>
|
||||
<a href="fpdf.htm">FPDF</a> - constructor<br>
|
||||
<a href="getstringwidth.htm">GetStringWidth</a> - compute string length<br>
|
||||
<a href="getx.htm">GetX</a> - get current x position<br>
|
||||
<a href="gety.htm">GetY</a> - get current y position<br>
|
||||
<a href="header.htm">Header</a> - page header<br>
|
||||
<a href="image.htm">Image</a> - output an image<br>
|
||||
<a href="line.htm">Line</a> - draw a line<br>
|
||||
<a href="link.htm">Link</a> - put a link<br>
|
||||
<a href="ln.htm">Ln</a> - line break<br>
|
||||
<a href="multicell.htm">MultiCell</a> - print text with line breaks<br>
|
||||
<a href="output.htm">Output</a> - save or send the document<br>
|
||||
<a href="pageno.htm">PageNo</a> - page number<br>
|
||||
<a href="rect.htm">Rect</a> - draw a rectangle<br>
|
||||
<a href="setauthor.htm">SetAuthor</a> - set the document author<br>
|
||||
<a href="setautopagebreak.htm">SetAutoPageBreak</a> - set the automatic page breaking mode<br>
|
||||
<a href="setcompression.htm">SetCompression</a> - turn compression on or off<br>
|
||||
<a href="setcreator.htm">SetCreator</a> - set document creator<br>
|
||||
<a href="setdisplaymode.htm">SetDisplayMode</a> - set display mode<br>
|
||||
<a href="setdrawcolor.htm">SetDrawColor</a> - set drawing color<br>
|
||||
<a href="setfillcolor.htm">SetFillColor</a> - set filling color<br>
|
||||
<a href="setfont.htm">SetFont</a> - set font<br>
|
||||
<a href="setfontsize.htm">SetFontSize</a> - set font size<br>
|
||||
<a href="setkeywords.htm">SetKeywords</a> - associate keywords with document<br>
|
||||
<a href="setleftmargin.htm">SetLeftMargin</a> - set left margin<br>
|
||||
<a href="setlinewidth.htm">SetLineWidth</a> - set line width<br>
|
||||
<a href="setlink.htm">SetLink</a> - set internal link destination<br>
|
||||
<a href="setmargins.htm">SetMargins</a> - set margins<br>
|
||||
<a href="setrightmargin.htm">SetRightMargin</a> - set right margin<br>
|
||||
<a href="setsubject.htm">SetSubject</a> - set document subject<br>
|
||||
<a href="settextcolor.htm">SetTextColor</a> - set text color<br>
|
||||
<a href="settitle.htm">SetTitle</a> - set document title<br>
|
||||
<a href="settopmargin.htm">SetTopMargin</a> - set top margin<br>
|
||||
<a href="setx.htm">SetX</a> - set current x position<br>
|
||||
<a href="setxy.htm">SetXY</a> - set current x and y positions<br>
|
||||
<a href="sety.htm">SetY</a> - set current y position<br>
|
||||
<a href="text.htm">Text</a> - print a string<br>
|
||||
<a href="write.htm">Write</a> - print flowing text<br>
|
||||
</body>
|
||||
</html>
|
||||
38
vendor/fpdf/doc/line.htm
vendored
38
vendor/fpdf/doc/line.htm
vendored
@@ -1,38 +0,0 @@
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
|
||||
<title>Line</title>
|
||||
<link type="text/css" rel="stylesheet" href="../fpdf.css">
|
||||
</head>
|
||||
<body>
|
||||
<h1>Line</h1>
|
||||
<code>Line(<b>float</b> x1, <b>float</b> y1, <b>float</b> x2, <b>float</b> y2)</code>
|
||||
<h2>Description</h2>
|
||||
Draws a line between two points.
|
||||
<h2>Parameters</h2>
|
||||
<dl class="param">
|
||||
<dt><code>x1</code></dt>
|
||||
<dd>
|
||||
Abscissa of first point.
|
||||
</dd>
|
||||
<dt><code>y1</code></dt>
|
||||
<dd>
|
||||
Ordinate of first point.
|
||||
</dd>
|
||||
<dt><code>x2</code></dt>
|
||||
<dd>
|
||||
Abscissa of second point.
|
||||
</dd>
|
||||
<dt><code>y2</code></dt>
|
||||
<dd>
|
||||
Ordinate of second point.
|
||||
</dd>
|
||||
</dl>
|
||||
<h2>See also</h2>
|
||||
<a href="setlinewidth.htm">SetLineWidth()</a>,
|
||||
<a href="setdrawcolor.htm">SetDrawColor()</a>.
|
||||
<hr style="margin-top:1.5em">
|
||||
<div style="text-align:center"><a href="index.htm">Index</a></div>
|
||||
</body>
|
||||
</html>
|
||||
46
vendor/fpdf/doc/link.htm
vendored
46
vendor/fpdf/doc/link.htm
vendored
@@ -1,46 +0,0 @@
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
|
||||
<title>Link</title>
|
||||
<link type="text/css" rel="stylesheet" href="../fpdf.css">
|
||||
</head>
|
||||
<body>
|
||||
<h1>Link</h1>
|
||||
<code>Link(<b>float</b> x, <b>float</b> y, <b>float</b> w, <b>float</b> h, <b>mixed</b> link)</code>
|
||||
<h2>Description</h2>
|
||||
Puts a link on a rectangular area of the page. Text or image links are generally put via Cell(),
|
||||
Write() or Image(), but this method can be useful for instance to define a clickable area inside
|
||||
an image.
|
||||
<h2>Parameters</h2>
|
||||
<dl class="param">
|
||||
<dt><code>x</code></dt>
|
||||
<dd>
|
||||
Abscissa of the upper-left corner of the rectangle.
|
||||
</dd>
|
||||
<dt><code>y</code></dt>
|
||||
<dd>
|
||||
Ordinate of the upper-left corner of the rectangle.
|
||||
</dd>
|
||||
<dt><code>w</code></dt>
|
||||
<dd>
|
||||
Width of the rectangle.
|
||||
</dd>
|
||||
<dt><code>h</code></dt>
|
||||
<dd>
|
||||
Height of the rectangle.
|
||||
</dd>
|
||||
<dt><code>link</code></dt>
|
||||
<dd>
|
||||
URL or identifier returned by AddLink().
|
||||
</dd>
|
||||
</dl>
|
||||
<h2>See also</h2>
|
||||
<a href="addlink.htm">AddLink()</a>,
|
||||
<a href="cell.htm">Cell()</a>,
|
||||
<a href="write.htm">Write()</a>,
|
||||
<a href="image.htm">Image()</a>.
|
||||
<hr style="margin-top:1.5em">
|
||||
<div style="text-align:center"><a href="index.htm">Index</a></div>
|
||||
</body>
|
||||
</html>
|
||||
28
vendor/fpdf/doc/ln.htm
vendored
28
vendor/fpdf/doc/ln.htm
vendored
@@ -1,28 +0,0 @@
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
|
||||
<title>Ln</title>
|
||||
<link type="text/css" rel="stylesheet" href="../fpdf.css">
|
||||
</head>
|
||||
<body>
|
||||
<h1>Ln</h1>
|
||||
<code>Ln([<b>float</b> h])</code>
|
||||
<h2>Description</h2>
|
||||
Performs a line break. The current abscissa goes back to the left margin and the ordinate
|
||||
increases by the amount passed in parameter.
|
||||
<h2>Parameters</h2>
|
||||
<dl class="param">
|
||||
<dt><code>h</code></dt>
|
||||
<dd>
|
||||
The height of the break.
|
||||
<br>
|
||||
By default, the value equals the height of the last printed cell.
|
||||
</dd>
|
||||
</dl>
|
||||
<h2>See also</h2>
|
||||
<a href="cell.htm">Cell()</a>.
|
||||
<hr style="margin-top:1.5em">
|
||||
<div style="text-align:center"><a href="index.htm">Index</a></div>
|
||||
</body>
|
||||
</html>
|
||||
76
vendor/fpdf/doc/multicell.htm
vendored
76
vendor/fpdf/doc/multicell.htm
vendored
@@ -1,76 +0,0 @@
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
|
||||
<title>MultiCell</title>
|
||||
<link type="text/css" rel="stylesheet" href="../fpdf.css">
|
||||
</head>
|
||||
<body>
|
||||
<h1>MultiCell</h1>
|
||||
<code>MultiCell(<b>float</b> w, <b>float</b> h, <b>string</b> txt [, <b>mixed</b> border [, <b>string</b> align [, <b>boolean</b> fill]]])</code>
|
||||
<h2>Description</h2>
|
||||
This method allows printing text with line breaks. They can be automatic (as soon as the
|
||||
text reaches the right border of the cell) or explicit (via the \n character). As many cells
|
||||
as necessary are output, one below the other.
|
||||
<br>
|
||||
Text can be aligned, centered or justified. The cell block can be framed and the background
|
||||
painted.
|
||||
<h2>Parameters</h2>
|
||||
<dl class="param">
|
||||
<dt><code>w</code></dt>
|
||||
<dd>
|
||||
Width of cells. If <code>0</code>, they extend up to the right margin of the page.
|
||||
</dd>
|
||||
<dt><code>h</code></dt>
|
||||
<dd>
|
||||
Height of cells.
|
||||
</dd>
|
||||
<dt><code>txt</code></dt>
|
||||
<dd>
|
||||
String to print.
|
||||
</dd>
|
||||
<dt><code>border</code></dt>
|
||||
<dd>
|
||||
Indicates if borders must be drawn around the cell block. The value can be either a number:
|
||||
<ul>
|
||||
<li><code>0</code>: no border</li>
|
||||
<li><code>1</code>: frame</li>
|
||||
</ul>
|
||||
or a string containing some or all of the following characters (in any order):
|
||||
<ul>
|
||||
<li><code>L</code>: left</li>
|
||||
<li><code>T</code>: top</li>
|
||||
<li><code>R</code>: right</li>
|
||||
<li><code>B</code>: bottom</li>
|
||||
</ul>
|
||||
Default value: <code>0</code>.
|
||||
</dd>
|
||||
<dt><code>align</code></dt>
|
||||
<dd>
|
||||
Sets the text alignment. Possible values are:
|
||||
<ul>
|
||||
<li><code>L</code>: left alignment</li>
|
||||
<li><code>C</code>: center</li>
|
||||
<li><code>R</code>: right alignment</li>
|
||||
<li><code>J</code>: justification (default value)</li>
|
||||
</ul>
|
||||
</dd>
|
||||
<dt><code>fill</code></dt>
|
||||
<dd>
|
||||
Indicates if the cell background must be painted (<code>true</code>) or transparent (<code>false</code>).
|
||||
Default value: <code>false</code>.
|
||||
</dd>
|
||||
</dl>
|
||||
<h2>See also</h2>
|
||||
<a href="setfont.htm">SetFont()</a>,
|
||||
<a href="setdrawcolor.htm">SetDrawColor()</a>,
|
||||
<a href="setfillcolor.htm">SetFillColor()</a>,
|
||||
<a href="settextcolor.htm">SetTextColor()</a>,
|
||||
<a href="setlinewidth.htm">SetLineWidth()</a>,
|
||||
<a href="cell.htm">Cell()</a>,
|
||||
<a href="write.htm">Write()</a>,
|
||||
<a href="setautopagebreak.htm">SetAutoPageBreak()</a>.
|
||||
<hr style="margin-top:1.5em">
|
||||
<div style="text-align:center"><a href="index.htm">Index</a></div>
|
||||
</body>
|
||||
</html>
|
||||
42
vendor/fpdf/doc/output.htm
vendored
42
vendor/fpdf/doc/output.htm
vendored
@@ -1,42 +0,0 @@
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
|
||||
<title>Output</title>
|
||||
<link type="text/css" rel="stylesheet" href="../fpdf.css">
|
||||
</head>
|
||||
<body>
|
||||
<h1>Output</h1>
|
||||
<code><b>string</b> Output([<b>string</b> name, <b>string</b> dest])</code>
|
||||
<h2>Description</h2>
|
||||
Send the document to a given destination: browser, file or string. In the case of browser, the
|
||||
plug-in may be used (if present) or a download ("Save as" dialog box) may be forced.
|
||||
<br>
|
||||
The method first calls Close() if necessary to terminate the document.
|
||||
<h2>Parameters</h2>
|
||||
<dl class="param">
|
||||
<dt><code>name</code></dt>
|
||||
<dd>
|
||||
The name of the file. If not specified, the document will be sent to the browser
|
||||
(destination <code>I</code>) with the name <code>doc.pdf</code>.
|
||||
</dd>
|
||||
<dt><code>dest</code></dt>
|
||||
<dd>
|
||||
Destination where to send the document. It can take one of the following values:
|
||||
<ul>
|
||||
<li><code>I</code>: send the file inline to the browser. The plug-in is used if available.
|
||||
The name given by <code>name</code> is used when one selects the "Save as" option on the
|
||||
link generating the PDF.</li>
|
||||
<li><code>D</code>: send to the browser and force a file download with the name given by
|
||||
<code>name</code>.</li>
|
||||
<li><code>F</code>: save to a local file with the name given by <code>name</code> (may include a path).</li>
|
||||
<li><code>S</code>: return the document as a string. <code>name</code> is ignored.</li>
|
||||
</ul>
|
||||
</dd>
|
||||
</dl>
|
||||
<h2>See also</h2>
|
||||
<a href="close.htm">Close()</a>.
|
||||
<hr style="margin-top:1.5em">
|
||||
<div style="text-align:center"><a href="index.htm">Index</a></div>
|
||||
</body>
|
||||
</html>
|
||||
18
vendor/fpdf/doc/pageno.htm
vendored
18
vendor/fpdf/doc/pageno.htm
vendored
@@ -1,18 +0,0 @@
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
|
||||
<title>PageNo</title>
|
||||
<link type="text/css" rel="stylesheet" href="../fpdf.css">
|
||||
</head>
|
||||
<body>
|
||||
<h1>PageNo</h1>
|
||||
<code><b>int</b> PageNo()</code>
|
||||
<h2>Description</h2>
|
||||
Returns the current page number.
|
||||
<h2>See also</h2>
|
||||
<a href="aliasnbpages.htm">AliasNbPages()</a>.
|
||||
<hr style="margin-top:1.5em">
|
||||
<div style="text-align:center"><a href="index.htm">Index</a></div>
|
||||
</body>
|
||||
</html>
|
||||
48
vendor/fpdf/doc/rect.htm
vendored
48
vendor/fpdf/doc/rect.htm
vendored
@@ -1,48 +0,0 @@
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
|
||||
<title>Rect</title>
|
||||
<link type="text/css" rel="stylesheet" href="../fpdf.css">
|
||||
</head>
|
||||
<body>
|
||||
<h1>Rect</h1>
|
||||
<code>Rect(<b>float</b> x, <b>float</b> y, <b>float</b> w, <b>float</b> h [, <b>string</b> style])</code>
|
||||
<h2>Description</h2>
|
||||
Outputs a rectangle. It can be drawn (border only), filled (with no border) or both.
|
||||
<h2>Parameters</h2>
|
||||
<dl class="param">
|
||||
<dt><code>x</code></dt>
|
||||
<dd>
|
||||
Abscissa of upper-left corner.
|
||||
</dd>
|
||||
<dt><code>y</code></dt>
|
||||
<dd>
|
||||
Ordinate of upper-left corner.
|
||||
</dd>
|
||||
<dt><code>w</code></dt>
|
||||
<dd>
|
||||
Width.
|
||||
</dd>
|
||||
<dt><code>h</code></dt>
|
||||
<dd>
|
||||
Height.
|
||||
</dd>
|
||||
<dt><code>style</code></dt>
|
||||
<dd>
|
||||
Style of rendering. Possible values are:
|
||||
<ul>
|
||||
<li><code>D</code> or empty string: draw. This is the default value.</li>
|
||||
<li><code>F</code>: fill</li>
|
||||
<li><code>DF</code> or <code>FD</code>: draw and fill</li>
|
||||
</ul>
|
||||
</dd>
|
||||
</dl>
|
||||
<h2>See also</h2>
|
||||
<a href="setlinewidth.htm">SetLineWidth()</a>,
|
||||
<a href="setdrawcolor.htm">SetDrawColor()</a>,
|
||||
<a href="setfillcolor.htm">SetFillColor()</a>.
|
||||
<hr style="margin-top:1.5em">
|
||||
<div style="text-align:center"><a href="index.htm">Index</a></div>
|
||||
</body>
|
||||
</html>
|
||||
33
vendor/fpdf/doc/setauthor.htm
vendored
33
vendor/fpdf/doc/setauthor.htm
vendored
@@ -1,33 +0,0 @@
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
|
||||
<title>SetAuthor</title>
|
||||
<link type="text/css" rel="stylesheet" href="../fpdf.css">
|
||||
</head>
|
||||
<body>
|
||||
<h1>SetAuthor</h1>
|
||||
<code>SetAuthor(<b>string</b> author [, <b>boolean</b> isUTF8])</code>
|
||||
<h2>Description</h2>
|
||||
Defines the author of the document.
|
||||
<h2>Parameters</h2>
|
||||
<dl class="param">
|
||||
<dt><code>author</code></dt>
|
||||
<dd>
|
||||
The name of the author.
|
||||
</dd>
|
||||
<dt><code>isUTF8</code></dt>
|
||||
<dd>
|
||||
Indicates if the string is encoded in ISO-8859-1 (<code>false</code>) or UTF-8 (<code>true</code>).<br>
|
||||
Default value: <code>false</code>.
|
||||
</dd>
|
||||
</dl>
|
||||
<h2>See also</h2>
|
||||
<a href="setcreator.htm">SetCreator()</a>,
|
||||
<a href="setkeywords.htm">SetKeywords()</a>,
|
||||
<a href="setsubject.htm">SetSubject()</a>,
|
||||
<a href="settitle.htm">SetTitle()</a>.
|
||||
<hr style="margin-top:1.5em">
|
||||
<div style="text-align:center"><a href="index.htm">Index</a></div>
|
||||
</body>
|
||||
</html>
|
||||
33
vendor/fpdf/doc/setautopagebreak.htm
vendored
33
vendor/fpdf/doc/setautopagebreak.htm
vendored
@@ -1,33 +0,0 @@
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
|
||||
<title>SetAutoPageBreak</title>
|
||||
<link type="text/css" rel="stylesheet" href="../fpdf.css">
|
||||
</head>
|
||||
<body>
|
||||
<h1>SetAutoPageBreak</h1>
|
||||
<code>SetAutoPageBreak(<b>boolean</b> auto [, <b>float</b> margin])</code>
|
||||
<h2>Description</h2>
|
||||
Enables or disables the automatic page breaking mode. When enabling, the second parameter is
|
||||
the distance from the bottom of the page that defines the triggering limit. By default, the
|
||||
mode is on and the margin is 2 cm.
|
||||
<h2>Parameters</h2>
|
||||
<dl class="param">
|
||||
<dt><code>auto</code></dt>
|
||||
<dd>
|
||||
Boolean indicating if mode should be on or off.
|
||||
</dd>
|
||||
<dt><code>margin</code></dt>
|
||||
<dd>
|
||||
Distance from the bottom of the page.
|
||||
</dd>
|
||||
</dl>
|
||||
<h2>See also</h2>
|
||||
<a href="cell.htm">Cell()</a>,
|
||||
<a href="multicell.htm">MultiCell()</a>,
|
||||
<a href="acceptpagebreak.htm">AcceptPageBreak()</a>.
|
||||
<hr style="margin-top:1.5em">
|
||||
<div style="text-align:center"><a href="index.htm">Index</a></div>
|
||||
</body>
|
||||
</html>
|
||||
31
vendor/fpdf/doc/setcompression.htm
vendored
31
vendor/fpdf/doc/setcompression.htm
vendored
@@ -1,31 +0,0 @@
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
|
||||
<title>SetCompression</title>
|
||||
<link type="text/css" rel="stylesheet" href="../fpdf.css">
|
||||
</head>
|
||||
<body>
|
||||
<h1>SetCompression</h1>
|
||||
<code>SetCompression(<b>boolean</b> compress)</code>
|
||||
<h2>Description</h2>
|
||||
Activates or deactivates page compression. When activated, the internal representation of
|
||||
each page is compressed, which leads to a compression ratio of about 2 for the resulting
|
||||
document.
|
||||
<br>
|
||||
Compression is on by default.
|
||||
<br>
|
||||
<br>
|
||||
<strong>Note:</strong> the Zlib extension is required for this feature. If not present, compression
|
||||
will be turned off.
|
||||
<h2>Parameters</h2>
|
||||
<dl class="param">
|
||||
<dt><code>compress</code></dt>
|
||||
<dd>
|
||||
Boolean indicating if compression must be enabled.
|
||||
</dd>
|
||||
</dl>
|
||||
<hr style="margin-top:1.5em">
|
||||
<div style="text-align:center"><a href="index.htm">Index</a></div>
|
||||
</body>
|
||||
</html>
|
||||
34
vendor/fpdf/doc/setcreator.htm
vendored
34
vendor/fpdf/doc/setcreator.htm
vendored
@@ -1,34 +0,0 @@
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
|
||||
<title>SetCreator</title>
|
||||
<link type="text/css" rel="stylesheet" href="../fpdf.css">
|
||||
</head>
|
||||
<body>
|
||||
<h1>SetCreator</h1>
|
||||
<code>SetCreator(<b>string</b> creator [, <b>boolean</b> isUTF8])</code>
|
||||
<h2>Description</h2>
|
||||
Defines the creator of the document. This is typically the name of the application that
|
||||
generates the PDF.
|
||||
<h2>Parameters</h2>
|
||||
<dl class="param">
|
||||
<dt><code>creator</code></dt>
|
||||
<dd>
|
||||
The name of the creator.
|
||||
</dd>
|
||||
<dt><code>isUTF8</code></dt>
|
||||
<dd>
|
||||
Indicates if the string is encoded in ISO-8859-1 (<code>false</code>) or UTF-8 (<code>true</code>).<br>
|
||||
Default value: <code>false</code>.
|
||||
</dd>
|
||||
</dl>
|
||||
<h2>See also</h2>
|
||||
<a href="setauthor.htm">SetAuthor()</a>,
|
||||
<a href="setkeywords.htm">SetKeywords()</a>,
|
||||
<a href="setsubject.htm">SetSubject()</a>,
|
||||
<a href="settitle.htm">SetTitle()</a>.
|
||||
<hr style="margin-top:1.5em">
|
||||
<div style="text-align:center"><a href="index.htm">Index</a></div>
|
||||
</body>
|
||||
</html>
|
||||
45
vendor/fpdf/doc/setdisplaymode.htm
vendored
45
vendor/fpdf/doc/setdisplaymode.htm
vendored
@@ -1,45 +0,0 @@
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
|
||||
<title>SetDisplayMode</title>
|
||||
<link type="text/css" rel="stylesheet" href="../fpdf.css">
|
||||
</head>
|
||||
<body>
|
||||
<h1>SetDisplayMode</h1>
|
||||
<code>SetDisplayMode(<b>mixed</b> zoom [, <b>string</b> layout])</code>
|
||||
<h2>Description</h2>
|
||||
Defines the way the document is to be displayed by the viewer. The zoom level can be set: pages can be
|
||||
displayed entirely on screen, occupy the full width of the window, use real size, be scaled by a
|
||||
specific zooming factor or use viewer default (configured in the Preferences menu of Adobe Reader).
|
||||
The page layout can be specified too: single at once, continuous display, two columns or viewer
|
||||
default.
|
||||
<h2>Parameters</h2>
|
||||
<dl class="param">
|
||||
<dt><code>zoom</code></dt>
|
||||
<dd>
|
||||
The zoom to use. It can be one of the following string values:
|
||||
<ul>
|
||||
<li><code>fullpage</code>: displays the entire page on screen</li>
|
||||
<li><code>fullwidth</code>: uses maximum width of window</li>
|
||||
<li><code>real</code>: uses real size (equivalent to 100% zoom)</li>
|
||||
<li><code>default</code>: uses viewer default mode</li>
|
||||
</ul>
|
||||
or a number indicating the zooming factor to use.
|
||||
</dd>
|
||||
<dt><code>layout</code></dt>
|
||||
<dd>
|
||||
The page layout. Possible values are:
|
||||
<ul>
|
||||
<li><code>single</code>: displays one page at once</li>
|
||||
<li><code>continuous</code>: displays pages continuously</li>
|
||||
<li><code>two</code>: displays two pages on two columns</li>
|
||||
<li><code>default</code>: uses viewer default mode</li>
|
||||
</ul>
|
||||
Default value is <code>default</code>.
|
||||
</dd>
|
||||
</dl>
|
||||
<hr style="margin-top:1.5em">
|
||||
<div style="text-align:center"><a href="index.htm">Index</a></div>
|
||||
</body>
|
||||
</html>
|
||||
41
vendor/fpdf/doc/setdrawcolor.htm
vendored
41
vendor/fpdf/doc/setdrawcolor.htm
vendored
@@ -1,41 +0,0 @@
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
|
||||
<title>SetDrawColor</title>
|
||||
<link type="text/css" rel="stylesheet" href="../fpdf.css">
|
||||
</head>
|
||||
<body>
|
||||
<h1>SetDrawColor</h1>
|
||||
<code>SetDrawColor(<b>int</b> r [, <b>int</b> g, <b>int</b> b])</code>
|
||||
<h2>Description</h2>
|
||||
Defines the color used for all drawing operations (lines, rectangles and cell borders). It
|
||||
can be expressed in RGB components or gray scale. The method can be called before the first
|
||||
page is created and the value is retained from page to page.
|
||||
<h2>Parameters</h2>
|
||||
<dl class="param">
|
||||
<dt><code>r</code></dt>
|
||||
<dd>
|
||||
If <code>g</code> et <code>b</code> are given, red component; if not, indicates the gray level.
|
||||
Value between 0 and 255.
|
||||
</dd>
|
||||
<dt><code>g</code></dt>
|
||||
<dd>
|
||||
Green component (between 0 and 255).
|
||||
</dd>
|
||||
<dt><code>b</code></dt>
|
||||
<dd>
|
||||
Blue component (between 0 and 255).
|
||||
</dd>
|
||||
</dl>
|
||||
<h2>See also</h2>
|
||||
<a href="setfillcolor.htm">SetFillColor()</a>,
|
||||
<a href="settextcolor.htm">SetTextColor()</a>,
|
||||
<a href="line.htm">Line()</a>,
|
||||
<a href="rect.htm">Rect()</a>,
|
||||
<a href="cell.htm">Cell()</a>,
|
||||
<a href="multicell.htm">MultiCell()</a>.
|
||||
<hr style="margin-top:1.5em">
|
||||
<div style="text-align:center"><a href="index.htm">Index</a></div>
|
||||
</body>
|
||||
</html>
|
||||
40
vendor/fpdf/doc/setfillcolor.htm
vendored
40
vendor/fpdf/doc/setfillcolor.htm
vendored
@@ -1,40 +0,0 @@
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
|
||||
<title>SetFillColor</title>
|
||||
<link type="text/css" rel="stylesheet" href="../fpdf.css">
|
||||
</head>
|
||||
<body>
|
||||
<h1>SetFillColor</h1>
|
||||
<code>SetFillColor(<b>int</b> r [, <b>int</b> g, <b>int</b> b])</code>
|
||||
<h2>Description</h2>
|
||||
Defines the color used for all filling operations (filled rectangles and cell backgrounds).
|
||||
It can be expressed in RGB components or gray scale. The method can be called before the first
|
||||
page is created and the value is retained from page to page.
|
||||
<h2>Parameters</h2>
|
||||
<dl class="param">
|
||||
<dt><code>r</code></dt>
|
||||
<dd>
|
||||
If <code>g</code> and <code>b</code> are given, red component; if not, indicates the gray level.
|
||||
Value between 0 and 255.
|
||||
</dd>
|
||||
<dt><code>g</code></dt>
|
||||
<dd>
|
||||
Green component (between 0 and 255).
|
||||
</dd>
|
||||
<dt><code>b</code></dt>
|
||||
<dd>
|
||||
Blue component (between 0 and 255).
|
||||
</dd>
|
||||
</dl>
|
||||
<h2>See also</h2>
|
||||
<a href="setdrawcolor.htm">SetDrawColor()</a>,
|
||||
<a href="settextcolor.htm">SetTextColor()</a>,
|
||||
<a href="rect.htm">Rect()</a>,
|
||||
<a href="cell.htm">Cell()</a>,
|
||||
<a href="multicell.htm">MultiCell()</a>.
|
||||
<hr style="margin-top:1.5em">
|
||||
<div style="text-align:center"><a href="index.htm">Index</a></div>
|
||||
</body>
|
||||
</html>
|
||||
92
vendor/fpdf/doc/setfont.htm
vendored
92
vendor/fpdf/doc/setfont.htm
vendored
@@ -1,92 +0,0 @@
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
|
||||
<title>SetFont</title>
|
||||
<link type="text/css" rel="stylesheet" href="../fpdf.css">
|
||||
</head>
|
||||
<body>
|
||||
<h1>SetFont</h1>
|
||||
<code>SetFont(<b>string</b> family [, <b>string</b> style [, <b>float</b> size]])</code>
|
||||
<h2>Description</h2>
|
||||
Sets the font used to print character strings. It is mandatory to call this method
|
||||
at least once before printing text or the resulting document would not be valid.
|
||||
<br>
|
||||
The font can be either a standard one or a font added via the AddFont() method. Standard fonts
|
||||
use the Windows encoding cp1252 (Western Europe).
|
||||
<br>
|
||||
The method can be called before the first page is created and the font is kept from page
|
||||
to page.
|
||||
<br>
|
||||
If you just wish to change the current font size, it is simpler to call SetFontSize().
|
||||
<br>
|
||||
<br>
|
||||
<strong>Note:</strong> the font definition files must be accessible. They are searched successively in:
|
||||
<ul>
|
||||
<li>The directory defined by the <code>FPDF_FONTPATH</code> constant (if this constant is defined)</li>
|
||||
<li>The <code>font</code> directory located in the same directory as <code>fpdf.php</code> (if it exists)</li>
|
||||
<li>The directories accessible through <code>include()</code></li>
|
||||
</ul>
|
||||
Example using <code>FPDF_FONTPATH</code>:
|
||||
<div class="doc-source">
|
||||
<pre><code>define('FPDF_FONTPATH','/home/www/font');
|
||||
require('fpdf.php');</code></pre>
|
||||
</div>
|
||||
If the file corresponding to the requested font is not found, the error "Could not include font
|
||||
definition file" is raised.
|
||||
<h2>Parameters</h2>
|
||||
<dl class="param">
|
||||
<dt><code>family</code></dt>
|
||||
<dd>
|
||||
Family font. It can be either a name defined by AddFont() or one of the standard families (case
|
||||
insensitive):
|
||||
<ul>
|
||||
<li><code>Courier</code> (fixed-width)</li>
|
||||
<li><code>Helvetica</code> or <code>Arial</code> (synonymous; sans serif)</li>
|
||||
<li><code>Times</code> (serif)</li>
|
||||
<li><code>Symbol</code> (symbolic)</li>
|
||||
<li><code>ZapfDingbats</code> (symbolic)</li>
|
||||
</ul>
|
||||
It is also possible to pass an empty string. In that case, the current family is kept.
|
||||
</dd>
|
||||
<dt><code>style</code></dt>
|
||||
<dd>
|
||||
Font style. Possible values are (case insensitive):
|
||||
<ul>
|
||||
<li>empty string: regular</li>
|
||||
<li><code>B</code>: bold</li>
|
||||
<li><code>I</code>: italic</li>
|
||||
<li><code>U</code>: underline</li>
|
||||
</ul>
|
||||
or any combination. The default value is regular.
|
||||
Bold and italic styles do not apply to <code>Symbol</code> and <code>ZapfDingbats</code>.
|
||||
</dd>
|
||||
<dt><code>size</code></dt>
|
||||
<dd>
|
||||
Font size in points.
|
||||
<br>
|
||||
The default value is the current size. If no size has been specified since the beginning of
|
||||
the document, the value taken is 12.
|
||||
</dd>
|
||||
</dl>
|
||||
<h2>Example</h2>
|
||||
<div class="doc-source">
|
||||
<pre><code>// Times regular 12
|
||||
$pdf->SetFont('Times');
|
||||
// Arial bold 14
|
||||
$pdf->SetFont('Arial','B',14);
|
||||
// Removes bold
|
||||
$pdf->SetFont('');
|
||||
// Times bold, italic and underlined 14
|
||||
$pdf->SetFont('Times','BIU');</code></pre>
|
||||
</div>
|
||||
<h2>See also</h2>
|
||||
<a href="addfont.htm">AddFont()</a>,
|
||||
<a href="setfontsize.htm">SetFontSize()</a>,
|
||||
<a href="cell.htm">Cell()</a>,
|
||||
<a href="multicell.htm">MultiCell()</a>,
|
||||
<a href="write.htm">Write()</a>.
|
||||
<hr style="margin-top:1.5em">
|
||||
<div style="text-align:center"><a href="index.htm">Index</a></div>
|
||||
</body>
|
||||
</html>
|
||||
25
vendor/fpdf/doc/setfontsize.htm
vendored
25
vendor/fpdf/doc/setfontsize.htm
vendored
@@ -1,25 +0,0 @@
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
|
||||
<title>SetFontSize</title>
|
||||
<link type="text/css" rel="stylesheet" href="../fpdf.css">
|
||||
</head>
|
||||
<body>
|
||||
<h1>SetFontSize</h1>
|
||||
<code>SetFontSize(<b>float</b> size)</code>
|
||||
<h2>Description</h2>
|
||||
Defines the size of the current font.
|
||||
<h2>Parameters</h2>
|
||||
<dl class="param">
|
||||
<dt><code>size</code></dt>
|
||||
<dd>
|
||||
The size (in points).
|
||||
</dd>
|
||||
</dl>
|
||||
<h2>See also</h2>
|
||||
<a href="setfont.htm">SetFont()</a>.
|
||||
<hr style="margin-top:1.5em">
|
||||
<div style="text-align:center"><a href="index.htm">Index</a></div>
|
||||
</body>
|
||||
</html>
|
||||
33
vendor/fpdf/doc/setkeywords.htm
vendored
33
vendor/fpdf/doc/setkeywords.htm
vendored
@@ -1,33 +0,0 @@
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
|
||||
<title>SetKeywords</title>
|
||||
<link type="text/css" rel="stylesheet" href="../fpdf.css">
|
||||
</head>
|
||||
<body>
|
||||
<h1>SetKeywords</h1>
|
||||
<code>SetKeywords(<b>string</b> keywords [, <b>boolean</b> isUTF8])</code>
|
||||
<h2>Description</h2>
|
||||
Associates keywords with the document, generally in the form 'keyword1 keyword2 ...'.
|
||||
<h2>Parameters</h2>
|
||||
<dl class="param">
|
||||
<dt><code>keywords</code></dt>
|
||||
<dd>
|
||||
The list of keywords.
|
||||
</dd>
|
||||
<dt><code>isUTF8</code></dt>
|
||||
<dd>
|
||||
Indicates if the string is encoded in ISO-8859-1 (<code>false</code>) or UTF-8 (<code>true</code>).<br>
|
||||
Default value: <code>false</code>.
|
||||
</dd>
|
||||
</dl>
|
||||
<h2>See also</h2>
|
||||
<a href="setauthor.htm">SetAuthor()</a>,
|
||||
<a href="setcreator.htm">SetCreator()</a>,
|
||||
<a href="setsubject.htm">SetSubject()</a>,
|
||||
<a href="settitle.htm">SetTitle()</a>.
|
||||
<hr style="margin-top:1.5em">
|
||||
<div style="text-align:center"><a href="index.htm">Index</a></div>
|
||||
</body>
|
||||
</html>
|
||||
30
vendor/fpdf/doc/setleftmargin.htm
vendored
30
vendor/fpdf/doc/setleftmargin.htm
vendored
@@ -1,30 +0,0 @@
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
|
||||
<title>SetLeftMargin</title>
|
||||
<link type="text/css" rel="stylesheet" href="../fpdf.css">
|
||||
</head>
|
||||
<body>
|
||||
<h1>SetLeftMargin</h1>
|
||||
<code>SetLeftMargin(<b>float</b> margin)</code>
|
||||
<h2>Description</h2>
|
||||
Defines the left margin. The method can be called before creating the first page.
|
||||
<br>
|
||||
If the current abscissa gets out of page, it is brought back to the margin.
|
||||
<h2>Parameters</h2>
|
||||
<dl class="param">
|
||||
<dt><code>margin</code></dt>
|
||||
<dd>
|
||||
The margin.
|
||||
</dd>
|
||||
</dl>
|
||||
<h2>See also</h2>
|
||||
<a href="settopmargin.htm">SetTopMargin()</a>,
|
||||
<a href="setrightmargin.htm">SetRightMargin()</a>,
|
||||
<a href="setautopagebreak.htm">SetAutoPageBreak()</a>,
|
||||
<a href="setmargins.htm">SetMargins()</a>.
|
||||
<hr style="margin-top:1.5em">
|
||||
<div style="text-align:center"><a href="index.htm">Index</a></div>
|
||||
</body>
|
||||
</html>
|
||||
29
vendor/fpdf/doc/setlinewidth.htm
vendored
29
vendor/fpdf/doc/setlinewidth.htm
vendored
@@ -1,29 +0,0 @@
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
|
||||
<title>SetLineWidth</title>
|
||||
<link type="text/css" rel="stylesheet" href="../fpdf.css">
|
||||
</head>
|
||||
<body>
|
||||
<h1>SetLineWidth</h1>
|
||||
<code>SetLineWidth(<b>float</b> width)</code>
|
||||
<h2>Description</h2>
|
||||
Defines the line width. By default, the value equals 0.2 mm. The method can be called before
|
||||
the first page is created and the value is retained from page to page.
|
||||
<h2>Parameters</h2>
|
||||
<dl class="param">
|
||||
<dt><code>width</code></dt>
|
||||
<dd>
|
||||
The width.
|
||||
</dd>
|
||||
</dl>
|
||||
<h2>See also</h2>
|
||||
<a href="line.htm">Line()</a>,
|
||||
<a href="rect.htm">Rect()</a>,
|
||||
<a href="cell.htm">Cell()</a>,
|
||||
<a href="multicell.htm">MultiCell()</a>.
|
||||
<hr style="margin-top:1.5em">
|
||||
<div style="text-align:center"><a href="index.htm">Index</a></div>
|
||||
</body>
|
||||
</html>
|
||||
34
vendor/fpdf/doc/setlink.htm
vendored
34
vendor/fpdf/doc/setlink.htm
vendored
@@ -1,34 +0,0 @@
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
|
||||
<title>SetLink</title>
|
||||
<link type="text/css" rel="stylesheet" href="../fpdf.css">
|
||||
</head>
|
||||
<body>
|
||||
<h1>SetLink</h1>
|
||||
<code>SetLink(<b>int</b> link [, <b>float</b> y [, <b>int</b> page]])</code>
|
||||
<h2>Description</h2>
|
||||
Defines the page and position a link points to.
|
||||
<h2>Parameters</h2>
|
||||
<dl class="param">
|
||||
<dt><code>link</code></dt>
|
||||
<dd>
|
||||
The link identifier returned by AddLink().
|
||||
</dd>
|
||||
<dt><code>y</code></dt>
|
||||
<dd>
|
||||
Ordinate of target position; <code>-1</code> indicates the current position.
|
||||
The default value is <code>0</code> (top of page).
|
||||
</dd>
|
||||
<dt><code>page</code></dt>
|
||||
<dd>
|
||||
Number of target page; <code>-1</code> indicates the current page. This is the default value.
|
||||
</dd>
|
||||
</dl>
|
||||
<h2>See also</h2>
|
||||
<a href="addlink.htm">AddLink()</a>.
|
||||
<hr style="margin-top:1.5em">
|
||||
<div style="text-align:center"><a href="index.htm">Index</a></div>
|
||||
</body>
|
||||
</html>
|
||||
37
vendor/fpdf/doc/setmargins.htm
vendored
37
vendor/fpdf/doc/setmargins.htm
vendored
@@ -1,37 +0,0 @@
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
|
||||
<title>SetMargins</title>
|
||||
<link type="text/css" rel="stylesheet" href="../fpdf.css">
|
||||
</head>
|
||||
<body>
|
||||
<h1>SetMargins</h1>
|
||||
<code>SetMargins(<b>float</b> left, <b>float</b> top [, <b>float</b> right])</code>
|
||||
<h2>Description</h2>
|
||||
Defines the left, top and right margins. By default, they equal 1 cm. Call this method to change
|
||||
them.
|
||||
<h2>Parameters</h2>
|
||||
<dl class="param">
|
||||
<dt><code>left</code></dt>
|
||||
<dd>
|
||||
Left margin.
|
||||
</dd>
|
||||
<dt><code>top</code></dt>
|
||||
<dd>
|
||||
Top margin.
|
||||
</dd>
|
||||
<dt><code>right</code></dt>
|
||||
<dd>
|
||||
Right margin. Default value is the left one.
|
||||
</dd>
|
||||
</dl>
|
||||
<h2>See also</h2>
|
||||
<a href="setleftmargin.htm">SetLeftMargin()</a>,
|
||||
<a href="settopmargin.htm">SetTopMargin()</a>,
|
||||
<a href="setrightmargin.htm">SetRightMargin()</a>,
|
||||
<a href="setautopagebreak.htm">SetAutoPageBreak()</a>.
|
||||
<hr style="margin-top:1.5em">
|
||||
<div style="text-align:center"><a href="index.htm">Index</a></div>
|
||||
</body>
|
||||
</html>
|
||||
28
vendor/fpdf/doc/setrightmargin.htm
vendored
28
vendor/fpdf/doc/setrightmargin.htm
vendored
@@ -1,28 +0,0 @@
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
|
||||
<title>SetRightMargin</title>
|
||||
<link type="text/css" rel="stylesheet" href="../fpdf.css">
|
||||
</head>
|
||||
<body>
|
||||
<h1>SetRightMargin</h1>
|
||||
<code>SetRightMargin(<b>float</b> margin)</code>
|
||||
<h2>Description</h2>
|
||||
Defines the right margin. The method can be called before creating the first page.
|
||||
<h2>Parameters</h2>
|
||||
<dl class="param">
|
||||
<dt><code>margin</code></dt>
|
||||
<dd>
|
||||
The margin.
|
||||
</dd>
|
||||
</dl>
|
||||
<h2>See also</h2>
|
||||
<a href="setleftmargin.htm">SetLeftMargin()</a>,
|
||||
<a href="settopmargin.htm">SetTopMargin()</a>,
|
||||
<a href="setautopagebreak.htm">SetAutoPageBreak()</a>,
|
||||
<a href="setmargins.htm">SetMargins()</a>.
|
||||
<hr style="margin-top:1.5em">
|
||||
<div style="text-align:center"><a href="index.htm">Index</a></div>
|
||||
</body>
|
||||
</html>
|
||||
33
vendor/fpdf/doc/setsubject.htm
vendored
33
vendor/fpdf/doc/setsubject.htm
vendored
@@ -1,33 +0,0 @@
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
|
||||
<title>SetSubject</title>
|
||||
<link type="text/css" rel="stylesheet" href="../fpdf.css">
|
||||
</head>
|
||||
<body>
|
||||
<h1>SetSubject</h1>
|
||||
<code>SetSubject(<b>string</b> subject [, <b>boolean</b> isUTF8])</code>
|
||||
<h2>Description</h2>
|
||||
Defines the subject of the document.
|
||||
<h2>Parameters</h2>
|
||||
<dl class="param">
|
||||
<dt><code>subject</code></dt>
|
||||
<dd>
|
||||
The subject.
|
||||
</dd>
|
||||
<dt><code>isUTF8</code></dt>
|
||||
<dd>
|
||||
Indicates if the string is encoded in ISO-8859-1 (<code>false</code>) or UTF-8 (<code>true</code>).<br>
|
||||
Default value: <code>false</code>.
|
||||
</dd>
|
||||
</dl>
|
||||
<h2>See also</h2>
|
||||
<a href="setauthor.htm">SetAuthor()</a>,
|
||||
<a href="setcreator.htm">SetCreator()</a>,
|
||||
<a href="setkeywords.htm">SetKeywords()</a>,
|
||||
<a href="settitle.htm">SetTitle()</a>.
|
||||
<hr style="margin-top:1.5em">
|
||||
<div style="text-align:center"><a href="index.htm">Index</a></div>
|
||||
</body>
|
||||
</html>
|
||||
40
vendor/fpdf/doc/settextcolor.htm
vendored
40
vendor/fpdf/doc/settextcolor.htm
vendored
@@ -1,40 +0,0 @@
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
|
||||
<title>SetTextColor</title>
|
||||
<link type="text/css" rel="stylesheet" href="../fpdf.css">
|
||||
</head>
|
||||
<body>
|
||||
<h1>SetTextColor</h1>
|
||||
<code>SetTextColor(<b>int</b> r [, <b>int</b> g, <b>int</b> b])</code>
|
||||
<h2>Description</h2>
|
||||
Defines the color used for text. It can be expressed in RGB components or gray scale. The
|
||||
method can be called before the first page is created and the value is retained from page to
|
||||
page.
|
||||
<h2>Parameters</h2>
|
||||
<dl class="param">
|
||||
<dt><code>r</code></dt>
|
||||
<dd>
|
||||
If <code>g</code> et <code>b</code> are given, red component; if not, indicates the gray level.
|
||||
Value between 0 and 255.
|
||||
</dd>
|
||||
<dt><code>g</code></dt>
|
||||
<dd>
|
||||
Green component (between 0 and 255).
|
||||
</dd>
|
||||
<dt><code>b</code></dt>
|
||||
<dd>
|
||||
Blue component (between 0 and 255).
|
||||
</dd>
|
||||
</dl>
|
||||
<h2>See also</h2>
|
||||
<a href="setdrawcolor.htm">SetDrawColor()</a>,
|
||||
<a href="setfillcolor.htm">SetFillColor()</a>,
|
||||
<a href="text.htm">Text()</a>,
|
||||
<a href="cell.htm">Cell()</a>,
|
||||
<a href="multicell.htm">MultiCell()</a>.
|
||||
<hr style="margin-top:1.5em">
|
||||
<div style="text-align:center"><a href="index.htm">Index</a></div>
|
||||
</body>
|
||||
</html>
|
||||
33
vendor/fpdf/doc/settitle.htm
vendored
33
vendor/fpdf/doc/settitle.htm
vendored
@@ -1,33 +0,0 @@
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
|
||||
<title>SetTitle</title>
|
||||
<link type="text/css" rel="stylesheet" href="../fpdf.css">
|
||||
</head>
|
||||
<body>
|
||||
<h1>SetTitle</h1>
|
||||
<code>SetTitle(<b>string</b> title [, <b>boolean</b> isUTF8])</code>
|
||||
<h2>Description</h2>
|
||||
Defines the title of the document.
|
||||
<h2>Parameters</h2>
|
||||
<dl class="param">
|
||||
<dt><code>title</code></dt>
|
||||
<dd>
|
||||
The title.
|
||||
</dd>
|
||||
<dt><code>isUTF8</code></dt>
|
||||
<dd>
|
||||
Indicates if the string is encoded in ISO-8859-1 (<code>false</code>) or UTF-8 (<code>true</code>).<br>
|
||||
Default value: <code>false</code>.
|
||||
</dd>
|
||||
</dl>
|
||||
<h2>See also</h2>
|
||||
<a href="setauthor.htm">SetAuthor()</a>,
|
||||
<a href="setcreator.htm">SetCreator()</a>,
|
||||
<a href="setkeywords.htm">SetKeywords()</a>,
|
||||
<a href="setsubject.htm">SetSubject()</a>.
|
||||
<hr style="margin-top:1.5em">
|
||||
<div style="text-align:center"><a href="index.htm">Index</a></div>
|
||||
</body>
|
||||
</html>
|
||||
28
vendor/fpdf/doc/settopmargin.htm
vendored
28
vendor/fpdf/doc/settopmargin.htm
vendored
@@ -1,28 +0,0 @@
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
|
||||
<title>SetTopMargin</title>
|
||||
<link type="text/css" rel="stylesheet" href="../fpdf.css">
|
||||
</head>
|
||||
<body>
|
||||
<h1>SetTopMargin</h1>
|
||||
<code>SetTopMargin(<b>float</b> margin)</code>
|
||||
<h2>Description</h2>
|
||||
Defines the top margin. The method can be called before creating the first page.
|
||||
<h2>Parameters</h2>
|
||||
<dl class="param">
|
||||
<dt><code>margin</code></dt>
|
||||
<dd>
|
||||
The margin.
|
||||
</dd>
|
||||
</dl>
|
||||
<h2>See also</h2>
|
||||
<a href="setleftmargin.htm">SetLeftMargin()</a>,
|
||||
<a href="setrightmargin.htm">SetRightMargin()</a>,
|
||||
<a href="setautopagebreak.htm">SetAutoPageBreak()</a>,
|
||||
<a href="setmargins.htm">SetMargins()</a>.
|
||||
<hr style="margin-top:1.5em">
|
||||
<div style="text-align:center"><a href="index.htm">Index</a></div>
|
||||
</body>
|
||||
</html>
|
||||
29
vendor/fpdf/doc/setx.htm
vendored
29
vendor/fpdf/doc/setx.htm
vendored
@@ -1,29 +0,0 @@
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
|
||||
<title>SetX</title>
|
||||
<link type="text/css" rel="stylesheet" href="../fpdf.css">
|
||||
</head>
|
||||
<body>
|
||||
<h1>SetX</h1>
|
||||
<code>SetX(<b>float</b> x)</code>
|
||||
<h2>Description</h2>
|
||||
Defines the abscissa of the current position. If the passed value is negative, it is relative
|
||||
to the right of the page.
|
||||
<h2>Parameters</h2>
|
||||
<dl class="param">
|
||||
<dt><code>x</code></dt>
|
||||
<dd>
|
||||
The value of the abscissa.
|
||||
</dd>
|
||||
</dl>
|
||||
<h2>See also</h2>
|
||||
<a href="getx.htm">GetX()</a>,
|
||||
<a href="gety.htm">GetY()</a>,
|
||||
<a href="sety.htm">SetY()</a>,
|
||||
<a href="setxy.htm">SetXY()</a>.
|
||||
<hr style="margin-top:1.5em">
|
||||
<div style="text-align:center"><a href="index.htm">Index</a></div>
|
||||
</body>
|
||||
</html>
|
||||
31
vendor/fpdf/doc/setxy.htm
vendored
31
vendor/fpdf/doc/setxy.htm
vendored
@@ -1,31 +0,0 @@
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
|
||||
<title>SetXY</title>
|
||||
<link type="text/css" rel="stylesheet" href="../fpdf.css">
|
||||
</head>
|
||||
<body>
|
||||
<h1>SetXY</h1>
|
||||
<code>SetXY(<b>float</b> x, <b>float</b> y)</code>
|
||||
<h2>Description</h2>
|
||||
Defines the abscissa and ordinate of the current position. If the passed values are negative,
|
||||
they are relative respectively to the right and bottom of the page.
|
||||
<h2>Parameters</h2>
|
||||
<dl class="param">
|
||||
<dt><code>x</code></dt>
|
||||
<dd>
|
||||
The value of the abscissa.
|
||||
</dd>
|
||||
<dt><code>y</code></dt>
|
||||
<dd>
|
||||
The value of the ordinate.
|
||||
</dd>
|
||||
</dl>
|
||||
<h2>See also</h2>
|
||||
<a href="setx.htm">SetX()</a>,
|
||||
<a href="sety.htm">SetY()</a>.
|
||||
<hr style="margin-top:1.5em">
|
||||
<div style="text-align:center"><a href="index.htm">Index</a></div>
|
||||
</body>
|
||||
</html>
|
||||
29
vendor/fpdf/doc/sety.htm
vendored
29
vendor/fpdf/doc/sety.htm
vendored
@@ -1,29 +0,0 @@
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
|
||||
<title>SetY</title>
|
||||
<link type="text/css" rel="stylesheet" href="../fpdf.css">
|
||||
</head>
|
||||
<body>
|
||||
<h1>SetY</h1>
|
||||
<code>SetY(<b>float</b> y)</code>
|
||||
<h2>Description</h2>
|
||||
Moves the current abscissa back to the left margin and sets the ordinate. If the passed value
|
||||
is negative, it is relative to the bottom of the page.
|
||||
<h2>Parameters</h2>
|
||||
<dl class="param">
|
||||
<dt><code>y</code></dt>
|
||||
<dd>
|
||||
The value of the ordinate.
|
||||
</dd>
|
||||
</dl>
|
||||
<h2>See also</h2>
|
||||
<a href="getx.htm">GetX()</a>,
|
||||
<a href="gety.htm">GetY()</a>,
|
||||
<a href="setx.htm">SetX()</a>,
|
||||
<a href="setxy.htm">SetXY()</a>.
|
||||
<hr style="margin-top:1.5em">
|
||||
<div style="text-align:center"><a href="index.htm">Index</a></div>
|
||||
</body>
|
||||
</html>
|
||||
39
vendor/fpdf/doc/text.htm
vendored
39
vendor/fpdf/doc/text.htm
vendored
@@ -1,39 +0,0 @@
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
|
||||
<title>Text</title>
|
||||
<link type="text/css" rel="stylesheet" href="../fpdf.css">
|
||||
</head>
|
||||
<body>
|
||||
<h1>Text</h1>
|
||||
<code>Text(<b>float</b> x, <b>float</b> y, <b>string</b> txt)</code>
|
||||
<h2>Description</h2>
|
||||
Prints a character string. The origin is on the left of the first character, on the baseline.
|
||||
This method allows to place a string precisely on the page, but it is usually easier to use
|
||||
Cell(), MultiCell() or Write() which are the standard methods to print text.
|
||||
<h2>Parameters</h2>
|
||||
<dl class="param">
|
||||
<dt><code>x</code></dt>
|
||||
<dd>
|
||||
Abscissa of the origin.
|
||||
</dd>
|
||||
<dt><code>y</code></dt>
|
||||
<dd>
|
||||
Ordinate of the origin.
|
||||
</dd>
|
||||
<dt><code>txt</code></dt>
|
||||
<dd>
|
||||
String to print.
|
||||
</dd>
|
||||
</dl>
|
||||
<h2>See also</h2>
|
||||
<a href="setfont.htm">SetFont()</a>,
|
||||
<a href="settextcolor.htm">SetTextColor()</a>,
|
||||
<a href="cell.htm">Cell()</a>,
|
||||
<a href="multicell.htm">MultiCell()</a>,
|
||||
<a href="write.htm">Write()</a>.
|
||||
<hr style="margin-top:1.5em">
|
||||
<div style="text-align:center"><a href="index.htm">Index</a></div>
|
||||
</body>
|
||||
</html>
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user