[web-php] master: Enhancement: Enable `indentation_type` fixer
| From: | Andreas Möller via GitHub | Date: | Mon, 11 Jul 2022 18:40:47 +0000 |
| Subject: | [web-php] master: Enhancement: Enable `indentation_type` fixer | ||
| Groups: | php.webmaster | ||
| Request: | Send a blank email to php-webmaster+get-30353@lists.php.net to get a copy of this message | ||
Author: Andreas Möller (localheinz)
Committer: GitHub (web-flow)
Pusher: cmb69
Date: 2022-07-11T20:34:20+02:00
Commit: https://github.com/php/web-php/commit/f3585d9bdfe12c57d052889e7c425e956ad9b917
Raw diff: https://github.com/php/web-php/commit/f3585d9bdfe12c57d052889e7c425e956ad9b917.diff
Enhancement: Enable
indentation_type fixer
Closes GH-622.
Changed paths:
M .php-cs-fixer.php
M archive/index.php
M docs.php
M eol.php
M git-php.php
M images/logo.php
M images/supported-versions.php
M index.php
M manual-lookup.php
M manual/spam_challenge.php
M mirror-info.php
M releases/5_3_3.php
M releases/8.1/languages/zh.php
M releases/index.php
M src/News/Entry.php
M submit-event.php
M supported-versions.php
M urlhowto.php
Diff:
diff --git a/.php-cs-fixer.php b/.php-cs-fixer.php
index 113bfaa433..f9d0db2599 100644
--- a/.php-cs-fixer.php
+++ b/.php-cs-fixer.php
@@ -10,6 +10,7 @@
->name(__FILE__);
$config->setRules([
+ 'indentation_type' => true,
'no_trailing_whitespace' => true,
'visibility_required' => true,
'whitespace_after_comma_in_array' => true,
diff --git a/archive/index.php b/archive/index.php
index 95d28ea765..7b5aab024b 100644
--- a/archive/index.php
+++ b/archive/index.php
@@ -2,11 +2,11 @@
include_once __DIR__ . '/../include/prepend.inc';
$i = 0;
do {
- $y = date("Y")-$i;
- if (file_exists("./$y.php")) {
- mirror_redirect("/archive/$y.php");
- break;
- }
+ $y = date("Y")-$i;
+ if (file_exists("./$y.php")) {
+ mirror_redirect("/archive/$y.php");
+ break;
+ }
} while(++$i<3);
include_once __DIR__ . '/../include/errors.inc';
diff --git a/docs.php b/docs.php
index f48e7f342e..6b9adcbde0 100644
--- a/docs.php
+++ b/docs.php
@@ -29,9 +29,9 @@
// List all manual languages viewable online
$lastlang = end($ACTIVE_ONLINE_LANGUAGES);
foreach ($ACTIVE_ONLINE_LANGUAGES as $langcode => $langname) {
- if (!file_exists($_SERVER["DOCUMENT_ROOT"] . "/manual/{$langcode}/index.php"))
{
- continue;
- }
+ if (!file_exists($_SERVER["DOCUMENT_ROOT"] .
"/manual/{$langcode}/index.php")) {
+ continue;
+ }
// Make preferred language bold
if ($langcode == $LANG) { echo "<strong>"; }
diff --git a/eol.php b/eol.php
index af505916f7..5d6b0b130c 100644
--- a/eol.php
+++ b/eol.php
@@ -7,17 +7,17 @@
// Notes for specific branches can be added here, and will appear in the table.
$BRANCH_NOTES = array(
'7.3' => '<a href="/migration74">A guide is available for
migrating from PHP 7.3 to 7.4.</a>',
- '7.2' => '<a href="/migration73">A guide is available for
migrating from PHP 7.2 to 7.3.</a>',
- '7.1' => '<a href="/migration72">A guide is available for
migrating from PHP 7.1 to 7.2.</a>',
- '7.0' => '<a href="/migration71">A guide is available for
migrating from PHP 7.0 to 7.1.</a>',
- '5.6' => '<a href="/migration70">A guide is available for
migrating from PHP 5.6 to 7.0.</a>',
- '5.5' => '<a href="/migration56">A guide is available for
migrating from PHP 5.5 to 5.6.</a>',
- '5.4' => '<a href="/migration55">A guide is available for
migrating from PHP 5.4 to 5.5.</a>',
- '5.3' => '<a href="/migration54">A guide is available for
migrating from PHP 5.3 to 5.4.</a>',
- '5.2' => '<a href="/migration53">A guide is available for
migrating from PHP 5.2 to 5.3.</a>',
- '5.1' => '<a href="/migration52">A guide is available for
migrating from PHP 5.1 to 5.2.</a>',
- '5.0' => '<a href="/migration51">A guide is available for
migrating from PHP 5.0 to 5.1.</a>',
- '4.4' => '<a href="/migration5">A guide is available for
migrating from PHP 4 to PHP 5.0.</a>',
+ '7.2' => '<a href="/migration73">A guide is available for
migrating from PHP 7.2 to 7.3.</a>',
+ '7.1' => '<a href="/migration72">A guide is available for
migrating from PHP 7.1 to 7.2.</a>',
+ '7.0' => '<a href="/migration71">A guide is available for
migrating from PHP 7.0 to 7.1.</a>',
+ '5.6' => '<a href="/migration70">A guide is available for
migrating from PHP 5.6 to 7.0.</a>',
+ '5.5' => '<a href="/migration56">A guide is available for
migrating from PHP 5.5 to 5.6.</a>',
+ '5.4' => '<a href="/migration55">A guide is available for
migrating from PHP 5.4 to 5.5.</a>',
+ '5.3' => '<a href="/migration54">A guide is available for
migrating from PHP 5.3 to 5.4.</a>',
+ '5.2' => '<a href="/migration53">A guide is available for
migrating from PHP 5.2 to 5.3.</a>',
+ '5.1' => '<a href="/migration52">A guide is available for
migrating from PHP 5.1 to 5.2.</a>',
+ '5.0' => '<a href="/migration51">A guide is available for
migrating from PHP 5.0 to 5.1.</a>',
+ '4.4' => '<a href="/migration5">A guide is available for
migrating from PHP 4 to PHP 5.0.</a>',
);
site_header('Unsupported Branches');
diff --git a/git-php.php b/git-php.php
index 2451831d85..2da36b0b99 100644
--- a/git-php.php
+++ b/git-php.php
@@ -158,7 +158,7 @@
} // endif: no data or checkread not checked
else {
- if (count($_POST)) {
+ if (count($_POST)) {
print <<<EOT
<div class="warning">
<p>
@@ -361,9 +361,9 @@ class="max" value="<?php if (isset($_POST['email']))
echo clean($_POST['email'])
<td>
<?php
$purposes = array("Learning PHP", "Coding in PHP", "Reading the PHP
source",
- "Using PHP extensions", "Creating experimental PHP extensions",
- "Submitting a patch to PHP", "Adding notes to the documentation",
- "Writing web pages with PHP");
+ "Using PHP extensions", "Creating experimental PHP extensions",
+ "Submitting a patch to PHP", "Adding notes to the documentation",
+ "Writing web pages with PHP");
foreach ($purposes as $i => $p) { ?>
<input type="checkbox" name="purpose[<?php echo $i?>]"
value="1"
diff --git a/images/logo.php b/images/logo.php
index 70b433710b..394e4e9737 100644
--- a/images/logo.php
+++ b/images/logo.php
@@ -72,12 +72,12 @@ function serve_compressed_if_available($logo): void {
$logo = './logos/php-logo.svg';
if (isset($_SERVER['QUERY_STRING'])) {
- switch ($_SERVER['QUERY_STRING']) {
- case 'QA':
- case 'qa':
- $logo = './logos/qa.jpg';
- break;
- }
+ switch ($_SERVER['QUERY_STRING']) {
+ case 'QA':
+ case 'qa':
+ $logo = './logos/qa.jpg';
+ break;
+ }
}
// xmas season, december and the first week of January
diff --git a/images/supported-versions.php b/images/supported-versions.php
index dc15d43b74..9fbe87ad6c 100644
--- a/images/supported-versions.php
+++ b/images/supported-versions.php
@@ -11,49 +11,49 @@
$footer_height = 24;
function branches_to_show() {
- // Basically: show all 5.3+ branches with EOL dates > min_date().
- $branches = array();
-
- // Flatten out the majors.
- foreach (get_all_branches() as $major_branches) {
- foreach ($major_branches as $branch => $version) {
- if (version_compare($branch, '5.3', 'ge') &&
get_branch_security_eol_date($branch) > min_date()) {
- $branches[$branch] = $version;
- }
- }
- }
-
- ksort($branches);
- return $branches;
+ // Basically: show all 5.3+ branches with EOL dates > min_date().
+ $branches = array();
+
+ // Flatten out the majors.
+ foreach (get_all_branches() as $major_branches) {
+ foreach ($major_branches as $branch => $version) {
+ if (version_compare($branch, '5.3', 'ge') &&
get_branch_security_eol_date($branch) > min_date()) {
+ $branches[$branch] = $version;
+ }
+ }
+ }
+
+ ksort($branches);
+ return $branches;
}
function min_date() {
- $now = new DateTime('January 1');
- return $now->sub(new DateInterval('P3Y'));
+ $now = new DateTime('January 1');
+ return $now->sub(new DateInterval('P3Y'));
}
function max_date() {
- $now = new DateTime('January 1');
- return $now->add(new DateInterval('P5Y'));
+ $now = new DateTime('January 1');
+ return $now->add(new DateInterval('P5Y'));
}
function date_horiz_coord(DateTime $date) {
- $diff = $date->diff(min_date());
- if (!$diff->invert) {
- return $GLOBALS['margin_left'];
- }
- return $GLOBALS['margin_left'] + ($diff->days / (365.24 /
$GLOBALS['year_width']));
+ $diff = $date->diff(min_date());
+ if (!$diff->invert) {
+ return $GLOBALS['margin_left'];
+ }
+ return $GLOBALS['margin_left'] + ($diff->days / (365.24 /
$GLOBALS['year_width']));
}
$branches = branches_to_show();
$i = 0;
foreach ($branches as $branch => $version) {
- $branches[$branch]['top'] = $header_height + ($branch_height * $i++);
+ $branches[$branch]['top'] = $header_height + ($branch_height * $i++);
}
if (!isset($non_standalone)) {
- header('Content-Type: image/svg+xml');
- echo '<?xml version="1.0"?>';
+ header('Content-Type: image/svg+xml');
+ echo '<?xml version="1.0"?>';
}
$years = iterator_to_array(new DatePeriod(min_date(), new DateInterval('P1Y'),
max_date()));
@@ -132,10 +132,10 @@ function date_horiz_coord(DateTime $date) {
<g class="branches">
<?php foreach ($branches as $branch => $version): ?>
<?php
- $x_release = date_horiz_coord(get_branch_release_date($branch));
- $x_bug = date_horiz_coord(get_branch_bug_eol_date($branch));
- $x_eol = date_horiz_coord(get_branch_security_eol_date($branch));
- ?>
+ $x_release = date_horiz_coord(get_branch_release_date($branch));
+ $x_bug = date_horiz_coord(get_branch_bug_eol_date($branch));
+ $x_eol = date_horiz_coord(get_branch_security_eol_date($branch));
+ ?>
<rect class="stable" x="<?php echo $x_release ?>" y="<?php
echo $version['top'] ?>" width="<?php echo $x_bug - $x_release ?>"
height="<?php echo $branch_height ?>" />
<rect class="security" x="<?php echo $x_bug ?>" y="<?php
echo $version['top'] ?>" width="<?php echo $x_eol - $x_bug ?>"
height="<?php echo $branch_height ?>" />
<?php endforeach ?>
@@ -154,9 +154,9 @@ function date_horiz_coord(DateTime $date) {
<!-- Today -->
<g class="today">
<?php
- $now = new DateTime;
- $x = date_horiz_coord($now);
- ?>
+ $now = new DateTime;
+ $x = date_horiz_coord($now);
+ ?>
<line x1="<?php echo $x ?>" y1="<?php echo $header_height ?>"
x2="<?php echo $x ?>" y2="<?php echo $header_height + (count($branches) *
$branch_height) ?>" />
<text x="<?php echo $x ?>" y="<?php echo $header_height +
(count($branches) * $branch_height) + (0.8 * $footer_height) ?>">
<?php echo 'Today: '.$now->format('j M Y') ?>
diff --git a/index.php b/index.php
index fdc460c86a..5e4abfc5ca 100644
--- a/index.php
+++ b/index.php
@@ -180,7 +180,7 @@
);
$announcements = "";
foreach($CONF_TEASER as $category => $entries) {
- if ($entries) {
+ if ($entries) {
$announcements .= '<div class="panel">';
$announcements .= ' <a href="/conferences"
class="headline" title="' . $conftype[$category] . '">' .
$conftype[$category] .'</a>';
$announcements .= '<div class="body"><ul>';
diff --git a/manual-lookup.php b/manual-lookup.php
index 3715fef43e..446df1fa2d 100644
--- a/manual-lookup.php
+++ b/manual-lookup.php
@@ -13,9 +13,9 @@
}
if(!empty($_GET['scope']) && is_string($_GET['scope'])) {
- $scope = htmlspecialchars($_GET['scope'], ENT_QUOTES, 'UTF-8');
+ $scope = htmlspecialchars($_GET['scope'], ENT_QUOTES, 'UTF-8');
} else {
- $scope = '';
+ $scope = '';
}
// Prepare data for search
diff --git a/manual/spam_challenge.php b/manual/spam_challenge.php
index 2bba1b0562..7466d8d84f 100644
--- a/manual/spam_challenge.php
+++ b/manual/spam_challenge.php
@@ -4,63 +4,63 @@
const NUMS = array('zero', 'one', 'two', 'three',
'four', 'five', 'six', 'seven', 'eight',
'nine');
function plus($a, $b) {
- return $a + $b;
+ return $a + $b;
}
function gen_plus($a) {
- return rand(0, 9 - $a);
+ return rand(0, 9 - $a);
}
function minus($a, $b) {
- return $a - $b;
+ return $a - $b;
}
function gen_minus($a) {
- return rand(0, $a);
+ return rand(0, $a);
}
function print_infix($name, $a, $b) {
- return "$a $name $b";
+ return "$a $name $b";
}
function print_prefix($name, $a, $b) {
- return "$name($a, $b)";
+ return "$name($a, $b)";
}
const CHALLENGES = array(
- // name, print, generator
- array('max', 'print_prefix'),
- array('min', 'print_prefix'),
- array('minus', 'print_infix', 'gen_minus'),
- array('plus', 'print_infix', 'gen_plus'),
+ // name, print, generator
+ array('max', 'print_prefix'),
+ array('min', 'print_prefix'),
+ array('minus', 'print_infix', 'gen_minus'),
+ array('plus', 'print_infix', 'gen_plus'),
);
// generate a challenge
function gen_challenge() {
- $c = CHALLENGES[rand(0, count(CHALLENGES)-1)];
+ $c = CHALLENGES[rand(0, count(CHALLENGES)-1)];
- $a = rand(0, 9);
- $an = NUMS[$a];
- $b = isset($c[2]) ? $c[2]($a) : rand(0, 9);
- $bn = NUMS[$b];
+ $a = rand(0, 9);
+ $an = NUMS[$a];
+ $b = isset($c[2]) ? $c[2]($a) : rand(0, 9);
+ $bn = NUMS[$b];
- return array($c[0], $an, $bn, $c[1]($c[0], $an, $bn));
+ return array($c[0], $an, $bn, $c[1]($c[0], $an, $bn));
}
// test an answer for validity
function test_answer($name, $an, $bn, $answer) {
- foreach (CHALLENGES as $x) {
- if ($x[0] === $name) {
- $c = $x;
- break;
- }
- }
+ foreach (CHALLENGES as $x) {
+ if ($x[0] === $name) {
+ $c = $x;
+ break;
+ }
+ }
- $a = array_search($an, NUMS);
- $b = array_search($bn, NUMS);
+ $a = array_search($an, NUMS);
+ $b = array_search($bn, NUMS);
- if (empty($c) || $a === false || $b === false) return false;
+ if (empty($c) || $a === false || $b === false) return false;
- return (NUMS[$c[0]($a, $b)] === $answer);
+ return (NUMS[$c[0]($a, $b)] === $answer);
}
diff --git a/mirror-info.php b/mirror-info.php
index f687f5fca6..4148dc0797 100644
--- a/mirror-info.php
+++ b/mirror-info.php
@@ -16,13 +16,13 @@
$dist = $latest['source'][0];
$filename = __DIR__ . "/distributions/{$dist['filename']}";
if (!file_exists($filename)) {
- $hash_ok = 0;
+ $hash_ok = 0;
} elseif (isset($dist['sha256']) &&
- function_exists('hash_file') &&
- in_array('sha256', hash_algos(), true)) {
- $hash_ok = (int)(hash_file('sha256', $filename) === $dist['sha256']);
+ function_exists('hash_file') &&
+ in_array('sha256', hash_algos(), true)) {
+ $hash_ok = (int)(hash_file('sha256', $filename) === $dist['sha256']);
} else {
- $hash_ok = 0;
+ $hash_ok = 0;
}
// Does this mirror have sqlite?
diff --git a/releases/5_3_3.php b/releases/5_3_3.php
index bd9c9ea56a..516ddd3762 100644
--- a/releases/5_3_3.php
+++ b/releases/5_3_3.php
@@ -22,7 +22,7 @@
non-namespaced classes.
<p><?php
- highlight_string('<?php
+ highlight_string('<?php
namespace Foo;
class Bar {
public function Bar() {
@@ -31,7 +31,7 @@ public function Bar() {
}
}
?>');
- ?></p>
+ ?></p>
<p>There is no impact on migration from 5.2.x because namespaces were only introduced in PHP
5.3.</p></li>
</ul>
<p>
diff --git a/releases/8.1/languages/zh.php b/releases/8.1/languages/zh.php
index cd62e01cd9..676b949545 100644
--- a/releases/8.1/languages/zh.php
+++ b/releases/8.1/languages/zh.php
@@ -5,85 +5,85 @@
*/
return [
- 'common_header' => 'PHP 8.1 是 PHP
语言的一个主版本更新。它包含了许多新功能,包括枚举、只读属性、First-class
可调用语法、纤程、交集类型和性能改进等。',
- 'main_title' => '已发布!',
- 'main_subtitle' => 'PHP 8.1 是 PHP 语言的一个主版本更新。<br
class="display-none-md">
它包含了许多新功能,包括枚举、只读属性、First-class
可调用语法、纤程、交集类型和性能改进等。',
- 'upgrade_now' => '更新到 PHP 8.1 !',
- 'documentation' => '文档',
+ 'common_header' => 'PHP 8.1 是 PHP
语言的一个主版本更新。它包含了许多新功能,包括枚举、只读属性、First-class
可调用语法、纤程、交集类型和性能改进等。',
+ 'main_title' => '已发布!',
+ 'main_subtitle' => 'PHP 8.1 是 PHP 语言的一个主版本更新。<br
class="display-none-md">
它包含了许多新功能,包括枚举、只读属性、First-class
可调用语法、纤程、交集类型和性能改进等。',
+ 'upgrade_now' => '更新到 PHP 8.1 !',
+ 'documentation' => '文档',
- 'enumerations_title' => '枚举',
- 'enumerations_content' =>
'使用枚举而不是一组常量并立即进行验证。',
+ 'enumerations_title' => '枚举',
+ 'enumerations_content' =>
'使用枚举而不是一组常量并立即进行验证。',
- 'readonly_properties_title' => '只读属性',
- 'readonly_properties_content' =>
'<p>只读属性不能在初始化后更改,即在为它们分配值后。它们可以用于对值对象和数据传输对象建模。</p>',
+ 'readonly_properties_title' => '只读属性',
+ 'readonly_properties_content' =>
'<p>只读属性不能在初始化后更改,即在为它们分配值后。它们可以用于对值对象和数据传输对象建模。</p>',
- 'first_class_callable_syntax_title' => 'First-class 可调用语法',
- 'first_class_callable_syntax_content' =>
'<p>现在可以获得对任何函数的引用。这统称为 First-class
可调用语法。</p>',
+ 'first_class_callable_syntax_title' => 'First-class 可调用语法',
+ 'first_class_callable_syntax_content' =>
'<p>现在可以获得对任何函数的引用。这统称为 First-class
可调用语法。</p>',
- 'new_in_initializers_title' => '新的初始化器',
- 'new_in_initializers_content' =>
'<p>对象现在可以用作默认参数值、静态变量和全局常量,以及属性参数。</p>
+ 'new_in_initializers_title' => '新的初始化器',
+ 'new_in_initializers_content' =>
'<p>对象现在可以用作默认参数值、静态变量和全局常量,以及属性参数。</p>
<p>这有效地使使用 <strong>嵌套属性</strong>
成为可能。</p>',
- 'pure_intersection_types_title' => '纯交集类型',
- 'pure_intersection_types_content' =>
'<p>当一个值需要同时满足多个类型约束时,使用交集类型。</p>
+ 'pure_intersection_types_title' => '纯交集类型',
+ 'pure_intersection_types_content' =>
'<p>当一个值需要同时满足多个类型约束时,使用交集类型。</p>
<p>注意,目前无法将交集和联合类型混合在一起,例如
<code>A&B|C</code>。</p>',
- 'never_return_type_title' => 'Never 返回类型',
- 'never_return_type_content' => '<p>使用 <code>never</code>
类型声明的函数或方法表示它不会返回值,并且会抛出异常或通过调用
<code>die()</code>、<code>exit()</code>、<code>trigger_error()</code>
或类似的东西来结束脚本的执行。</p>',
+ 'never_return_type_title' => 'Never 返回类型',
+ 'never_return_type_content' => '<p>使用
<code>never</code>
类型声明的函数或方法表示它不会返回值,并且会抛出异常或通过调用
<code>die()</code>、<code>exit()</code>、<code>trigger_error()</code>
或类似的东西来结束脚本的执行。</p>',
- 'final_class_constants_title' => 'Final 类常量',
- 'final_class_constants_content' => '<p>可以声明 final
类常量,以禁止它们在子类中被重写。</p>',
+ 'final_class_constants_title' => 'Final 类常量',
+ 'final_class_constants_content' => '<p>可以声明 final
类常量,以禁止它们在子类中被重写。</p>',
- 'octal_numeral_notation_title' => '显式八进制数字表示法',
- 'octal_numeral_notation_content' => '<p>现在可以使用显式
<code>0o</code> 前缀表示八进制数。</p>',
+ 'octal_numeral_notation_title' => '显式八进制数字表示法',
+ 'octal_numeral_notation_content' => '<p>现在可以使用显式
<code>0o</code> 前缀表示八进制数。</p>',
- 'fibers_title' => '纤程',
- 'fibers_content' => '<p>Fibers
是用于实现轻量级协作并发的基础类型。它们是一种创建可以像生成器一样暂停和恢复的代码块的方法,但可以从堆栈中的任何位置进行。Fibers
本身并没有提供并发性,仍然需要一个事件循环。但是,它们允许通过阻塞和非阻塞实现共享相同的
API。</p><p>Fibers 允许摆脱以前在 <code>Promise::then()</code>
或基于生成器的协程中看到的样板代码。库通常会围绕 Fiber
构建进一步的抽象,因此无需直接与它们交互。</p>',
+ 'fibers_title' => '纤程',
+ 'fibers_content' => '<p>Fibers
是用于实现轻量级协作并发的基础类型。它们是一种创建可以像生成器一样暂停和恢复的代码块的方法,但可以从堆栈中的任何位置进行。Fibers
本身并没有提供并发性,仍然需要一个事件循环。但是,它们允许通过阻塞和非阻塞实现共享相同的
API。</p><p>Fibers 允许摆脱以前在 <code>Promise::then()</code>
或基于生成器的协程中看到的样板代码。库通常会围绕 Fiber
构建进一步的抽象,因此无需直接与它们交互。</p>',
- 'array_unpacking_title' => '对字符串键控数组的数组解包支持',
- 'array_unpacking_content' => '<p>PHP
以前支持通过扩展运算符在数组内部解包,但前提是数组具有整数键。现在也可以使用字符串键解包数组。</p>',
+ 'array_unpacking_title' =>
'对字符串键控数组的数组解包支持',
+ 'array_unpacking_content' => '<p>PHP
以前支持通过扩展运算符在数组内部解包,但前提是数组具有整数键。现在也可以使用字符串键解包数组。</p>',
- 'performance_title' => '性能改进',
- 'performance_chart' => '<strong>Symfony Demo App
请求时间</strong><br>
+ 'performance_title' => '性能改进',
+ 'performance_chart' => '<strong>Symfony Demo App
请求时间</strong><br>
25 次连续运行,250 次请求(秒)<br>
(越少越好)<br>',
- 'performance_results_title' => '结果(相对于 PHP 8.0):',
- 'performance_results_symfony' => 'Symfony Demo 有 23.0% 的提升',
- 'performance_results_wordpress' => 'WordPress 有 3.5% 的提升',
- 'performance_related_functions_title' => 'PHP 8.1
中与性能相关的特性:',
- 'performance_jit_arm64' => 'ARM64 的 JIT 后端 (AArch64)',
- 'performance_inheritance_cache' =>
'继承缓存(避免在每个请求中重新链接类)',
- 'performance_fast_class_name_resolution' =>
'快速解析类名(避免小写和哈希查找)',
- 'performance_timelib_date_improvements' => 'timelib 和 ext/date
性能改进',
- 'performance_spl' => 'SPL 文件系统迭代器改进',
- 'performance_serialize_unserialize' => 'serialize/unserialize 优化',
- 'performance_internal_functions' =>
'一些内部函数优化(get_declared_classes()、explode()、strtr()、strnatcmp() 和
dechex())',
- 'performance_jit' => 'JIT 的改进和修复',
-
- 'other_new_title' => '新的类、接口和函数',
- 'other_new_returntypewillchange' =>
'<code>#[ReturnTypeWillChange]</code> 属性。',
- 'other_new_fsync_fdatasync' => '<code>fsync</code> 和
<code>fdatasync</code> 函数。',
- 'other_new_array_is_list' => '<code>array_is_list</code>
函数。',
- 'other_new_sodium_xchacha20' => 'Sodium XChaCha20 函数。',
-
- 'bc_title' => '弃用和向后不兼容',
- 'bc_null_to_not_nullable' =>
'向非空值的内部函数参数传递空值的做法已被弃用。',
- 'bc_return_types' => 'PHP 内置类方法中的暂定返回类型',
- 'bc_serializable_deprecated' => '<code>Serializable</code>
接口已弃用。',
- 'bc_html_entity_encode_decode' => 'html_entity_encode/html_entity_decode
函数默认处理单引号和用 Unicode 替换字符来替换无效字符。',
- 'bc_globals_restrictions' => '<code>$GLOBALS</code>
变量限制。',
- 'bc_mysqli_exceptions' => 'MySQLi:默认错误模式设置为异常。',
- 'bc_float_to_int_conversion' => '隐式不兼容的 float 到 int
转换已被弃用。',
- 'bc_finfo_objects' => 'finfo 扩展:<code>file_info</code>
资源迁移到现有的 finfo 对象。',
- 'bc_imap_objects' => 'IMAP:imap 资源迁移到
<code>IMAP\Connection</code> 类对象。',
- 'bc_ftp_objects' => 'FTP 扩展:连接资源迁移到
<code>FTP\Connection</code> 类对象。',
- 'bc_gd_objects' => 'GD 扩展:字体标识符迁移到
<code>GdFont</code> 类对象。',
- 'bc_ldap_objects' => 'LDAP:资源类型迁移到
<code>LDAP\Connection</code>、<code>LDAP\Result</code> 和
<code>LDAP\ResultEntry</code> 对象。',
- 'bc_postgresql_objects' => 'PostgreSQL:资源类型迁移到
<code>PgSql\Connection</code>、<code>PgSql\Result</code> 和
<code>PgSql\Lob</code> 对象。',
- 'bc_pspell_objects' => 'Pspell:pspell 和 pspell config 资源类型迁移到
<code>PSpell\Dictionary</code>、<code>PSpell\Config</code>
类对象。',
-
- 'footer_title' =>
'更好的性能、更好的语法、改进类型安全。',
- 'footer_content' => '<p>
+ 'performance_results_title' => '结果(相对于 PHP 8.0):',
+ 'performance_results_symfony' => 'Symfony Demo 有 23.0% 的提升',
+ 'performance_results_wordpress' => 'WordPress 有 3.5% 的提升',
+ 'performance_related_functions_title' => 'PHP 8.1
中与性能相关的特性:',
+ 'performance_jit_arm64' => 'ARM64 的 JIT 后端 (AArch64)',
+ 'performance_inheritance_cache' =>
'继承缓存(避免在每个请求中重新链接类)',
+ 'performance_fast_class_name_resolution' =>
'快速解析类名(避免小写和哈希查找)',
+ 'performance_timelib_date_improvements' => 'timelib 和 ext/date
性能改进',
+ 'performance_spl' => 'SPL 文件系统迭代器改进',
+ 'performance_serialize_unserialize' => 'serialize/unserialize 优化',
+ 'performance_internal_functions' =>
'一些内部函数优化(get_declared_classes()、explode()、strtr()、strnatcmp() 和
dechex())',
+ 'performance_jit' => 'JIT 的改进和修复',
+
+ 'other_new_title' => '新的类、接口和函数',
+ 'other_new_returntypewillchange' =>
'<code>#[ReturnTypeWillChange]</code> 属性。',
+ 'other_new_fsync_fdatasync' => '<code>fsync</code> 和
<code>fdatasync</code> 函数。',
+ 'other_new_array_is_list' => '<code>array_is_list</code>
函数。',
+ 'other_new_sodium_xchacha20' => 'Sodium XChaCha20 函数。',
+
+ 'bc_title' => '弃用和向后不兼容',
+ 'bc_null_to_not_nullable' =>
'向非空值的内部函数参数传递空值的做法已被弃用。',
+ 'bc_return_types' => 'PHP 内置类方法中的暂定返回类型',
+ 'bc_serializable_deprecated' => '<code>Serializable</code>
接口已弃用。',
+ 'bc_html_entity_encode_decode' => 'html_entity_encode/html_entity_decode
函数默认处理单引号和用 Unicode 替换字符来替换无效字符。',
+ 'bc_globals_restrictions' => '<code>$GLOBALS</code>
变量限制。',
+ 'bc_mysqli_exceptions' =>
'MySQLi:默认错误模式设置为异常。',
+ 'bc_float_to_int_conversion' => '隐式不兼容的 float 到 int
转换已被弃用。',
+ 'bc_finfo_objects' => 'finfo 扩展:<code>file_info</code>
资源迁移到现有的 finfo 对象。',
+ 'bc_imap_objects' => 'IMAP:imap 资源迁移到
<code>IMAP\Connection</code> 类对象。',
+ 'bc_ftp_objects' => 'FTP 扩展:连接资源迁移到
<code>FTP\Connection</code> 类对象。',
+ 'bc_gd_objects' => 'GD 扩展:字体标识符迁移到
<code>GdFont</code> 类对象。',
+ 'bc_ldap_objects' => 'LDAP:资源类型迁移到
<code>LDAP\Connection</code>、<code>LDAP\Result</code> 和
<code>LDAP\ResultEntry</code> 对象。',
+ 'bc_postgresql_objects' => 'PostgreSQL:资源类型迁移到
<code>PgSql\Connection</code>、<code>PgSql\Result</code> 和
<code>PgSql\Lob</code> 对象。',
+ 'bc_pspell_objects' => 'Pspell:pspell 和 pspell config
资源类型迁移到
<code>PSpell\Dictionary</code>、<code>PSpell\Config</code>
类对象。',
+
+ 'footer_title' =>
'更好的性能、更好的语法、改进类型安全。',
+ 'footer_content' => '<p>
请访问 <a href="http://www.php.net/downloads">下载</a>
页面下载 PHP 8.1 源代码。
在 <a href="http://windows.php.net/download">PHP for
Windows</a> 站点中可找到 Windows 二进制文件。
<a href="https://www.php.net/ChangeLog-8.php#PHP_8_1">ChangeLog</a>
中有变更历史记录清单。
diff --git a/releases/index.php b/releases/index.php
index e60e36eabe..ce2526e0ed 100644
--- a/releases/index.php
+++ b/releases/index.php
@@ -4,70 +4,70 @@
include_once __DIR__ . "/../include/branches.inc";
if (isset($_GET["serialize"]) || isset($_GET["json"])) {
- $RELEASES = $RELEASES + $OLDRELEASES;
-
- $machineReadable = [];
-
- $supportedVersions = [];
- foreach (get_active_branches(false) as $major => $releases) {
- $supportedVersions[$major] = array_keys($releases);
- }
-
- if (isset($_GET["version"])) {
- $versionArray = version_array($_GET["version"]);
- $ver = $versionArray[0];
-
- if (isset($RELEASES[$ver])) {
- $combinedReleases = array_replace_recursive($RELEASES, $OLDRELEASES);
-
- $max = (int) ($_GET['max'] ?? 1);
- if ($max == -1) {
- $max = PHP_INT_MAX;
- }
-
- $count = 0;
- foreach ($combinedReleases[$ver] as $version => $release) {
- if ($max <= $count) {
- break;
- }
-
- if (compare_version($versionArray, $version) == 0) {
- if (!isset($_GET['max'])) {
- $release['supported_versions'] = $supportedVersions[$ver] ?? [];
- }
- $machineReadable[$version] = $release;
- $count++;
- }
- }
-
- if (!isset($_GET['max']) && !empty($machineReadable)) {
- $version = key($machineReadable);
- $machineReadable = current($machineReadable);
- $machineReadable["version"] = $version;
- }
- }
-
- if (empty($machineReadable)) {
- $machineReadable = array("error" => "Unknown version");
- }
- } else {
- foreach($RELEASES as $major => $release) {
- $version = key($release);
- $r = current($release);
- $r["version"] = $version;
- $r['supported_versions'] = $supportedVersions[$major] ?? [];
- $machineReadable[$major] = $r;
- }
- }
-
- if (isset($_GET["serialize"])) {
- header('Content-type: text/plain');
- echo serialize($machineReadable);
- } elseif (isset($_GET["json"])) {
- header('Content-Type: application/json');
- echo json_encode($machineReadable);
- }
- return;
+ $RELEASES = $RELEASES + $OLDRELEASES;
+
+ $machineReadable = [];
+
+ $supportedVersions = [];
+ foreach (get_active_branches(false) as $major => $releases) {
+ $supportedVersions[$major] = array_keys($releases);
+ }
+
+ if (isset($_GET["version"])) {
+ $versionArray = version_array($_GET["version"]);
+ $ver = $versionArray[0];
+
+ if (isset($RELEASES[$ver])) {
+ $combinedReleases = array_replace_recursive($RELEASES, $OLDRELEASES);
+
+ $max = (int) ($_GET['max'] ?? 1);
+ if ($max == -1) {
+ $max = PHP_INT_MAX;
+ }
+
+ $count = 0;
+ foreach ($combinedReleases[$ver] as $version => $release) {
+ if ($max <= $count) {
+ break;
+ }
+
+ if (compare_version($versionArray, $version) == 0) {
+ if (!isset($_GET['max'])) {
+ $release['supported_versions'] = $supportedVersions[$ver] ?? [];
+ }
+ $machineReadable[$version] = $release;
+ $count++;
+ }
+ }
+
+ if (!isset($_GET['max']) && !empty($machineReadable)) {
+ $version = key($machineReadable);
+ $machineReadable = current($machineReadable);
+ $machineReadable["version"] = $version;
+ }
+ }
+
+ if (empty($machineReadable)) {
+ $machineReadable = array("error" => "Unknown version");
+ }
+ } else {
+ foreach($RELEASES as $major => $release) {
+ $version = key($release);
+ $r = current($release);
+ $r["version"] = $version;
+ $r['supported_versions'] = $supportedVersions[$major] ?? [];
+ $machineReadable[$major] = $r;
+ }
+ }
+
+ if (isset($_GET["serialize"])) {
+ header('Content-type: text/plain');
+ echo serialize($machineReadable);
+ } elseif (isset($_GET["json"])) {
+ header('Content-Type: application/json');
+ echo json_encode($machineReadable);
+ }
+ return;
}
@@ -90,27 +90,27 @@
$active_majors = array_keys($RELEASES);
$latest = max($active_majors);
foreach($OLDRELEASES as $major => $a) {
- echo '<a id="v' .$major. '"></a>';
- if (!in_array($major, $active_majors)) {
- echo "\n<br>\n";
- echo "<p>Support for PHP $major has been <b style=\"color:
red;\">discontinued</b> ";
- echo "since <b>" . current($a)['date'] . '</b>.';
- echo "Please consider upgrading to $latest.</p>\n";
- }
-
- $i = 0;
- foreach($a as $ver => $release) {
- $i++;
- mk_rel(
- $major,
- $ver,
- $release["date"],
- $release["announcement"] ?? false,
- $release["source"] ?? [],
- $release["windows"] ?? [],
- $release["museum"] ?? ($i >= 3)
- );
- }
+ echo '<a id="v' .$major. '"></a>';
+ if (!in_array($major, $active_majors)) {
+ echo "\n<br>\n";
+ echo "<p>Support for PHP $major has been <b style=\"color:
red;\">discontinued</b> ";
+ echo "since <b>" . current($a)['date'] . '</b>.';
+ echo "Please consider upgrading to $latest.</p>\n";
+ }
+
+ $i = 0;
+ foreach($a as $ver => $release) {
+ $i++;
+ mk_rel(
+ $major,
+ $ver,
+ $release["date"],
+ $release["announcement"] ?? false,
+ $release["source"] ?? [],
+ $release["windows"] ?? [],
+ $release["museum"] ?? ($i >= 3)
+ );
+ }
}
site_footer(['sidebar' =>
@@ -168,83 +168,83 @@
']);
function recentEOLBranchesHTML(): string {
- $eol = array();
- foreach (get_eol_branches() as $branches) {
- foreach ($branches as $branch => $detail) {
- $detail_date = $detail['date'];
- while (isset($eol[$detail_date])) $detail_date++;
- $eol[$detail_date] = sprintf('<li>%s: %s</li>', $branch, date('j M
Y', $detail_date));
- }
- }
- krsort($eol);
- return implode('', array_slice($eol, 0, 2));
+ $eol = array();
+ foreach (get_eol_branches() as $branches) {
+ foreach ($branches as $branch => $detail) {
+ $detail_date = $detail['date'];
+ while (isset($eol[$detail_date])) $detail_date++;
+ $eol[$detail_date] = sprintf('<li>%s: %s</li>', $branch,
date('j M Y', $detail_date));
+ }
+ }
+ krsort($eol);
+ return implode('', array_slice($eol, 0, 2));
}
function mk_rel(int $major,
- string $ver,
- string $date,
- /* bool | array */ $announcement,
- array $source,
- array $windows,
- bool $museum): void {
- printf("<a id=\"%s\"></a>\n<h2>%1\$s</h2>\n<ul>\n
<li>Released: %s</li>\n <li>Announcement: ",
- ($pos = strpos($ver, " ")) ? substr($ver, 0, $pos) : $ver,
- $date);
-
- if ($announcement) {
- if (is_array($announcement)) {
- foreach($announcement as $ann => $url) {
- echo "<a href=\"$url\">$ann</a> ";
- }
- } else {
- $url = str_replace(".", "_", $ver);
- echo "<a href=\"/releases/{$url}.php\">English</a>";
- }
- } else {
- echo "None";
- }
- echo "</li>\n";
-
- if ($major > 3) {
- echo " <li><a
href=\"/ChangeLog-{$major}.php#{$ver}\">ChangeLog</a></li>";
- }
- echo "\n <li>\n Download:\n";
- echo "<ul>\n";
-
- if (!$museum) {
- foreach(array_merge($source, $windows) as $src) {
- echo " <li>\n";
- if (isset($src['filename'])) {
- download_link($src["filename"], $src["name"]); echo
"<br>\n";
- $linebreak = '';
- foreach (['md5', 'sha256'] as $cs) {
- if (isset($src[$cs])) {
- echo $linebreak;
- echo "<span class=\"{$cs}sum\">{$cs}: {$src[$cs]}</span>\n";
- $linebreak = "<br/>";
- }
- }
- } else {
- echo "<a
href=\"{$src['link']}\">{$src['name']}</a>";
- }
- echo " </li>\n";
- }
-
- } else { /* $museum */
- foreach($source as $src) {
- if (!isset($src["filename"])) {
- continue;
- }
- printf('<li><a href="http://museum.php.net/php%d/%s">%s</a></li>',
- $major, $src["filename"], $src["name"]);
- }
- foreach($windows as $src) {
- printf('<li><a href="http://museum.php.net/%s/%s">%s</a></li>',
- ($major == 5 ? "php5" : "win32"), $src["filename"],
$src["name"]);
- }
- }
-
- echo "</ul>\n";
- echo "</li>\n";
- echo "</ul>\n";
+ string $ver,
+ string $date,
+ /* bool | array */ $announcement,
+ array $source,
+ array $windows,
+ bool $museum): void {
+ printf("<a id=\"%s\"></a>\n<h2>%1\$s</h2>\n<ul>\n
<li>Released: %s</li>\n <li>Announcement: ",
+ ($pos = strpos($ver, " ")) ? substr($ver, 0, $pos) : $ver,
+ $date);
+
+ if ($announcement) {
+ if (is_array($announcement)) {
+ foreach($announcement as $ann => $url) {
+ echo "<a href=\"$url\">$ann</a> ";
+ }
+ } else {
+ $url = str_replace(".", "_", $ver);
+ echo "<a href=\"/releases/{$url}.php\">English</a>";
+ }
+ } else {
+ echo "None";
+ }
+ echo "</li>\n";
+
+ if ($major > 3) {
+ echo " <li><a
href=\"/ChangeLog-{$major}.php#{$ver}\">ChangeLog</a></li>";
+ }
+ echo "\n <li>\n Download:\n";
+ echo "<ul>\n";
+
+ if (!$museum) {
+ foreach(array_merge($source, $windows) as $src) {
+ echo " <li>\n";
+ if (isset($src['filename'])) {
+ download_link($src["filename"], $src["name"]); echo
"<br>\n";
+ $linebreak = '';
+ foreach (['md5', 'sha256'] as $cs) {
+ if (isset($src[$cs])) {
+ echo $linebreak;
+ echo "<span class=\"{$cs}sum\">{$cs}:
{$src[$cs]}</span>\n";
+ $linebreak = "<br/>";
+ }
+ }
+ } else {
+ echo "<a
href=\"{$src['link']}\">{$src['name']}</a>";
+ }
+ echo " </li>\n";
+ }
+
+ } else { /* $museum */
+ foreach($source as $src) {
+ if (!isset($src["filename"])) {
+ continue;
+ }
+ printf('<li><a href="http://museum.php.net/php%d/%s">%s</a></li>',
+ $major, $src["filename"], $src["name"]);
+ }
+ foreach($windows as $src) {
+ printf('<li><a href="http://museum.php.net/%s/%s">%s</a></li>',
+ ($major == 5 ? "php5" : "win32"),
$src["filename"], $src["name"]);
+ }
+ }
+
+ echo "</ul>\n";
+ echo "</li>\n";
+ echo "</ul>\n";
}
diff --git a/src/News/Entry.php b/src/News/Entry.php
index c650125dd1..a106278c3d 100755
--- a/src/News/Entry.php
+++ b/src/News/Entry.php
@@ -3,194 +3,194 @@
namespace phpweb\News;
class Entry {
- public const CATEGORIES = [
- 'frontpage' => 'PHP.net frontpage news',
- 'releases' => 'New PHP release',
- 'conferences' => 'Conference announcement',
- 'cfp' => 'Call for Papers',
- ];
-
- public const WEBROOT = "https://www.php.net";
- public const PHPWEB = __DIR__ . '/../../';
- public const ARCHIVE_FILE_REL = 'archive/archive.xml';
- public const ARCHIVE_FILE_ABS = self::PHPWEB . self::ARCHIVE_FILE_REL;
- public const ARCHIVE_ENTRIES_REL = 'archive/entries/';
- public const ARCHIVE_ENTRIES_ABS = self::PHPWEB . self::ARCHIVE_ENTRIES_REL;
- public const IMAGE_PATH_REL = 'images/news/';
- public const IMAGE_PATH_ABS = self::PHPWEB . self::IMAGE_PATH_REL;
-
-
- protected $title = '';
-
- public function setTitle(string $title): self {
- $this->title = $title;
- return $this;
- }
-
- protected $categories = [];
- public function setCategories(array $cats): self {
- foreach ($cats as $cat) {
- if (!isset(self::CATEGORIES[$cat])) {
- throw new \Exception("Unknown category: $cat");
- }
- }
- $this->categories = $cats;
- return $this;
- }
- public function addCategory(string $cat): self {
- if (!isset(self::CATEGORIES[$cat])) {
- throw new \Exception("Unknown category: $cat");
- }
- if (!in_array($cat, $this->categories)) {
- $this->categories[] = $cat;
- }
- return $this;
- }
-
- public function isConference(): bool {
- return (bool)array_intersect($this->categories, ['cfp', 'conferences']);
- }
-
- protected $conf_time = 0;
- public function setConfTime(int $time): self {
- $this->conf_time = $time;
- return $this;
- }
-
- protected $image = [];
- public function setImage(string $path, string $title, ?string $link): self {
- if (basename($path) !== $path) {
- throw new \Exception('path must be a simple file name under ' . self::IMAGE_PATH_REL);
- }
- if (!file_exists(self::IMAGE_PATH_ABS . $path)) {
- throw new \Exception('Image not found at web-php/' . self::IMAGE_PATH_REL . $path);
- }
- $this->image = [
- 'path' => $path,
- 'title' => $title,
- 'link' => $link,
- ];
- return $this;
- }
-
- protected $content = '';
- public function setContent(string $content): self {
- if (empty($content)) {
- throw new \Exception('Content must not be empty');
- }
- $this->content = $content;
- return $this;
- }
-
- protected $id = '';
- private static function selectNextId(): string {
- $filename = date("Y-m-d", $_SERVER["REQUEST_TIME"]);
- $count = 0;
- do {
- ++$count;
- $id = $filename . "-" . $count;
- $basename = "{$id}.xml";
- } while (file_exists(self::ARCHIVE_ENTRIES_ABS . $basename));
-
- return $id;
- }
- public function getId(): string {
- return $this->id;
- }
-
- public function save(): self {
- if (empty($this->id)) {
- $this->id = self::selectNextId();
- }
-
- // Create the XML document.
- $dom = new \DOMDocument("1.0", "utf-8");
- $dom->formatOutput = true;
- $dom->preserveWhiteSpace = false;
- $item = $dom->createElementNs("http://www.w3.org/2005/Atom", "entry");
-
- $href = self::WEBROOT . ($this->isConference() ? '/conferences/index.php' :
'/index.php');
- $archive = self::WEBROOT . "/archive/" . date('Y',
$_SERVER['REQUEST_TIME']) . ".php#{$this->id}";
- $link = ($this->image['link'] ?? null) ?: $archive;
-
- self::ce($dom, "title", $this->title, [], $item);
- self::ce($dom, "id", $archive, [], $item);
- self::ce($dom, "published", date(DATE_ATOM), [], $item);
- self::ce($dom, "updated", date(DATE_ATOM), [], $item);
- self::ce($dom, "link", null, ['href' =>
"{$href}#{$this->id}", "rel" => "alternate", "type"
=> "text/html"], $item);
- self::ce($dom, "link", null, ['href' => $link, 'rel' =>
'via', 'type' => 'text/html'], $item);
-
- if (!empty($this->conf_time)) {
- $item->appendChild($dom->createElementNs("http://php.net/ns/news", "finalTeaserDate",
date("Y-m-d", $this->conf_time)));
- }
-
- foreach ($this->categories as $cat) {
- self::ce($dom, "category", null, ['term' => $cat, "label" =>
self::CATEGORIES[$cat]], $item);
- }
-
- if ($this->image['path'] ?? '') {
- $image = $item->appendChild($dom->createElementNs("http://php.net/ns/news", "newsImage",
$this->image['path']));
- $image->setAttribute("link", $this->image['link']);
- $image->setAttribute("title", $this->image['title']);
- }
-
- $content = self::ce($dom, "content", null, [], $item);
-
- // Slurp content into our DOM.
- $tdoc = new \DOMDocument("1.0", "utf-8");
- $tdoc->formatOutput = true;
- if ($tdoc->loadXML("<div>{$this->content} </div>")) {
- $content->setAttribute("type", "xhtml");
- $div = $content->appendChild($dom->createElement("div"));
- $div->setAttribute("xmlns", "http://www.w3.org/1999/xhtml");
- foreach($tdoc->firstChild->childNodes as $node) {
- $div->appendChild($dom->importNode($node, true));
- }
- } else {
- fwrite(STDERR, "There is something wrong with your xhtml, falling back to html");
- $content->setAttribute("type", "html");
- $content->nodeValue = $this->content;
- }
-
- $dom->appendChild($item);
- $dom->save(self::ARCHIVE_ENTRIES_ABS . $this->id . ".xml");
-
- return $this;
- }
-
- public function updateArchiveXML(): self {
- if (empty($this->id)) {
- throw new \Exception('Entry must be saved before updating archive XML');
- }
-
- $arch = new \DOMDocument("1.0", "utf-8");
- $arch->formatOutput = true;
- $arch->preserveWhiteSpace = false;
- $arch->load(self::ARCHIVE_FILE_ABS);
-
- $first = $arch->createElementNs("http://www.w3.org/2001/XInclude",
"xi:include");
- $first->setAttribute("href", "entries/{$this->id}.xml");
-
- $second = $arch->getElementsByTagNameNs("http://www.w3.org/2001/XInclude",
"include")->item(0);
- $arch->documentElement->insertBefore($first, $second);
- $arch->save(self::ARCHIVE_FILE_ABS);
-
- return $this;
- }
-
- private static function ce(\DOMDocument $d, string $name, $value, array $attrs = [], ?\DOMNode $to
= null) {
- if ($value) {
- $n = $d->createElement($name, $value);
- } else {
- $n = $d->createElement($name);
- }
- foreach($attrs as $k => $v) {
- $n->setAttribute($k, $v);
- }
- if ($to) {
- return $to->appendChild($n);
- }
- return $n;
- }
+ public const CATEGORIES = [
+ 'frontpage' => 'PHP.net frontpage news',
+ 'releases' => 'New PHP release',
+ 'conferences' => 'Conference announcement',
+ 'cfp' => 'Call for Papers',
+ ];
+
+ public const WEBROOT = "https://www.php.net";
+ public const PHPWEB = __DIR__ . '/../../';
+ public const ARCHIVE_FILE_REL = 'archive/archive.xml';
+ public const ARCHIVE_FILE_ABS = self::PHPWEB . self::ARCHIVE_FILE_REL;
+ public const ARCHIVE_ENTRIES_REL = 'archive/entries/';
+ public const ARCHIVE_ENTRIES_ABS = self::PHPWEB . self::ARCHIVE_ENTRIES_REL;
+ public const IMAGE_PATH_REL = 'images/news/';
+ public const IMAGE_PATH_ABS = self::PHPWEB . self::IMAGE_PATH_REL;
+
+
+ protected $title = '';
+
+ public function setTitle(string $title): self {
+ $this->title = $title;
+ return $this;
+ }
+
+ protected $categories = [];
+ public function setCategories(array $cats): self {
+ foreach ($cats as $cat) {
+ if (!isset(self::CATEGORIES[$cat])) {
+ throw new \Exception("Unknown category: $cat");
+ }
+ }
+ $this->categories = $cats;
+ return $this;
+ }
+ public function addCategory(string $cat): self {
+ if (!isset(self::CATEGORIES[$cat])) {
+ throw new \Exception("Unknown category: $cat");
+ }
+ if (!in_array($cat, $this->categories)) {
+ $this->categories[] = $cat;
+ }
+ return $this;
+ }
+
+ public function isConference(): bool {
+ return (bool)array_intersect($this->categories, ['cfp',
'conferences']);
+ }
+
+ protected $conf_time = 0;
+ public function setConfTime(int $time): self {
+ $this->conf_time = $time;
+ return $this;
+ }
+
+ protected $image = [];
+ public function setImage(string $path, string $title, ?string $link): self {
+ if (basename($path) !== $path) {
+ throw new \Exception('path must be a simple file name under ' .
self::IMAGE_PATH_REL);
+ }
+ if (!file_exists(self::IMAGE_PATH_ABS . $path)) {
+ throw new \Exception('Image not found at web-php/' . self::IMAGE_PATH_REL .
$path);
+ }
+ $this->image = [
+ 'path' => $path,
+ 'title' => $title,
+ 'link' => $link,
+ ];
+ return $this;
+ }
+
+ protected $content = '';
+ public function setContent(string $content): self {
+ if (empty($content)) {
+ throw new \Exception('Content must not be empty');
+ }
+ $this->content = $content;
+ return $this;
+ }
+
+ protected $id = '';
+ private static function selectNextId(): string {
+ $filename = date("Y-m-d", $_SERVER["REQUEST_TIME"]);
+ $count = 0;
+ do {
+ ++$count;
+ $id = $filename . "-" . $count;
+ $basename = "{$id}.xml";
+ } while (file_exists(self::ARCHIVE_ENTRIES_ABS . $basename));
+
+ return $id;
+ }
+ public function getId(): string {
+ return $this->id;
+ }
+
+ public function save(): self {
+ if (empty($this->id)) {
+ $this->id = self::selectNextId();
+ }
+
+ // Create the XML document.
+ $dom = new \DOMDocument("1.0", "utf-8");
+ $dom->formatOutput = true;
+ $dom->preserveWhiteSpace = false;
+ $item = $dom->createElementNs("http://www.w3.org/2005/Atom", "entry");
+
+ $href = self::WEBROOT . ($this->isConference() ? '/conferences/index.php' :
'/index.php');
+ $archive = self::WEBROOT . "/archive/" . date('Y',
$_SERVER['REQUEST_TIME']) . ".php#{$this->id}";
+ $link = ($this->image['link'] ?? null) ?: $archive;
+
+ self::ce($dom, "title", $this->title, [], $item);
+ self::ce($dom, "id", $archive, [], $item);
+ self::ce($dom, "published", date(DATE_ATOM), [], $item);
+ self::ce($dom, "updated", date(DATE_ATOM), [], $item);
+ self::ce($dom, "link", null, ['href' =>
"{$href}#{$this->id}", "rel" => "alternate", "type"
=> "text/html"], $item);
+ self::ce($dom, "link", null, ['href' => $link, 'rel'
=> 'via', 'type' => 'text/html'], $item);
+
+ if (!empty($this->conf_time)) {
+ $item->appendChild($dom->createElementNs("http://php.net/ns/news", "finalTeaserDate",
date("Y-m-d", $this->conf_time)));
+ }
+
+ foreach ($this->categories as $cat) {
+ self::ce($dom, "category", null, ['term' => $cat,
"label" => self::CATEGORIES[$cat]], $item);
+ }
+
+ if ($this->image['path'] ?? '') {
+ $image = $item->appendChild($dom->createElementNs("http://php.net/ns/news", "newsImage",
$this->image['path']));
+ $image->setAttribute("link", $this->image['link']);
+ $image->setAttribute("title", $this->image['title']);
+ }
+
+ $content = self::ce($dom, "content", null, [], $item);
+
+ // Slurp content into our DOM.
+ $tdoc = new \DOMDocument("1.0", "utf-8");
+ $tdoc->formatOutput = true;
+ if ($tdoc->loadXML("<div>{$this->content} </div>")) {
+ $content->setAttribute("type", "xhtml");
+ $div = $content->appendChild($dom->createElement("div"));
+ $div->setAttribute("xmlns", "http://www.w3.org/1999/xhtml");
+ foreach($tdoc->firstChild->childNodes as $node) {
+ $div->appendChild($dom->importNode($node, true));
+ }
+ } else {
+ fwrite(STDERR, "There is something wrong with your xhtml, falling back to
html");
+ $content->setAttribute("type", "html");
+ $content->nodeValue = $this->content;
+ }
+
+ $dom->appendChild($item);
+ $dom->save(self::ARCHIVE_ENTRIES_ABS . $this->id . ".xml");
+
+ return $this;
+ }
+
+ public function updateArchiveXML(): self {
+ if (empty($this->id)) {
+ throw new \Exception('Entry must be saved before updating archive XML');
+ }
+
+ $arch = new \DOMDocument("1.0", "utf-8");
+ $arch->formatOutput = true;
+ $arch->preserveWhiteSpace = false;
+ $arch->load(self::ARCHIVE_FILE_ABS);
+
+ $first = $arch->createElementNs("http://www.w3.org/2001/XInclude",
"xi:include");
+ $first->setAttribute("href", "entries/{$this->id}.xml");
+
+ $second = $arch->getElementsByTagNameNs("http://www.w3.org/2001/XInclude",
"include")->item(0);
+ $arch->documentElement->insertBefore($first, $second);
+ $arch->save(self::ARCHIVE_FILE_ABS);
+
+ return $this;
+ }
+
+ private static function ce(\DOMDocument $d, string $name, $value, array $attrs = [], ?\DOMNode
$to = null) {
+ if ($value) {
+ $n = $d->createElement($name, $value);
+ } else {
+ $n = $d->createElement($name);
+ }
+ foreach($attrs as $k => $v) {
+ $n->setAttribute($k, $v);
+ }
+ if ($to) {
+ return $to->appendChild($n);
+ }
+ return $n;
+ }
}
diff --git a/submit-event.php b/submit-event.php
index 18d1f56305..4937c027bf 100644
--- a/submit-event.php
+++ b/submit-event.php
@@ -20,12 +20,12 @@
}
}
$vars = array(
- 'type', 'country', 'category', 'email', 'url',
'ldesc', 'sdesc'
+ 'type', 'country', 'category', 'email',
'url', 'ldesc', 'sdesc'
);
foreach($vars as $varname) {
- if (!isset($_POST[$varname])) {
- $_POST[$varname] = "";
- }
+ if (!isset($_POST[$varname])) {
+ $_POST[$varname] = "";
+ }
}
// We need to process some form data
diff --git a/supported-versions.php b/supported-versions.php
index 8608886d2d..d0df826e45 100644
--- a/supported-versions.php
+++ b/supported-versions.php
@@ -50,11 +50,11 @@
<?php ksort($releases) ?>
<?php foreach ($releases as $branch => $release): ?>
<?php
- $state = get_branch_support_state($branch);
- $initial = get_branch_release_date($branch);
- $until = get_branch_bug_eol_date($branch);
- $eol = get_branch_security_eol_date($branch);
- ?>
+ $state = get_branch_support_state($branch);
+ $initial = get_branch_release_date($branch);
+ $until = get_branch_bug_eol_date($branch);
+ $eol = get_branch_security_eol_date($branch);
+ ?>
<tr class="<?php echo $state ?>">
<td>
<a href="/downloads.php#v<?php echo
htmlspecialchars($release['version']) ?>"><?php echo
htmlspecialchars($branch) ?></a>
diff --git a/urlhowto.php b/urlhowto.php
index 0ea3c03291..6cc075c0a3 100644
--- a/urlhowto.php
+++ b/urlhowto.php
@@ -27,7 +27,7 @@
site_header("URL Howto", array("current" => "help"));
function a($href): void {
global $MYSITE;
- echo '<a href="' . $MYSITE . $href . '">' . $MYSITE . $href .
'</a>';
+ echo '<a href="' . $MYSITE . $href . '">' . $MYSITE . $href
. '</a>';
}
?>